{ NULL }
};
+/* Set the CRC. */
+void
+xfs_dir3_set_crc(
+ struct xfs_buf *bp)
+{
+ __be32 magic32;
+ __be16 magic16;
+
+ magic32 = *(__be32 *)bp->b_addr;
+ magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic;
+
+ switch (magic32) {
+ case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
+ case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
+ xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF);
+ return;
+ case cpu_to_be32(XFS_DIR3_FREE_MAGIC):
+ xfs_buf_update_cksum(bp, XFS_DIR3_FREE_CRC_OFF);
+ return;
+ default:
+ break;
+ }
+
+ switch (magic16) {
+ case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC):
+ case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC):
+ xfs_buf_update_cksum(bp, XFS_DIR3_LEAF_CRC_OFF);
+ return;
+ case cpu_to_be16(XFS_DA3_NODE_MAGIC):
+ xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF);
+ return;
+ default:
+ dbprintf(_("Unknown directory buffer type! %x %x\n"), magic32, magic16);
+ break;
+ }
+}
+
/*
* Special read verifier for directory buffers. Detect the magic number
* appropriately and set the correct verifier and call it.
{ TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agi_buf_ops,
XFS_AGI_CRC_OFF },
{ TYP_ATTR, "attr3", handle_struct, attr3_hfld,
- &xfs_attr3_db_buf_ops, TYP_F_NO_CRC_OFF },
+ &xfs_attr3_db_buf_ops, TYP_F_CRC_FUNC, xfs_attr3_set_crc },
{ TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld,
&xfs_bmbt_buf_ops, XFS_BTREE_LBLOCK_CRC_OFF },
{ TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld,
&xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
{ TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF },
{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
- &xfs_dir3_db_buf_ops, TYP_F_NO_CRC_OFF },
+ &xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
{ TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld,
{ TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agi_buf_ops ,
XFS_AGI_CRC_OFF },
{ TYP_ATTR, "attr3", handle_struct, attr3_hfld,
- &xfs_attr3_db_buf_ops, TYP_F_NO_CRC_OFF },
+ &xfs_attr3_db_buf_ops, TYP_F_CRC_FUNC, xfs_attr3_set_crc },
{ TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld,
&xfs_bmbt_buf_ops, XFS_BTREE_LBLOCK_CRC_OFF },
{ TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld,
&xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF },
{ TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF },
{ TYP_DIR2, "dir3", handle_struct, dir3_hfld,
- &xfs_dir3_db_buf_ops, TYP_F_NO_CRC_OFF },
+ &xfs_dir3_db_buf_ops, TYP_F_CRC_FUNC, xfs_dir3_set_crc },
{ TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld,
&xfs_dquot_buf_ops, TYP_F_NO_CRC_OFF },
{ TYP_INOBT, "inobt", handle_struct, inobt_spcrc_hfld,