]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - libxfs/xfs_da_btree.c
xfs: factor xfs_da3_blkinfo verification into common helper
[thirdparty/xfsprogs-dev.git] / libxfs / xfs_da_btree.c
index 4fceab8844cd421580e0bdb370eccb79834fb967..eb45b774b00cb85a41b0395bfca924e0aa2a2ea5 100644 (file)
@@ -111,6 +111,34 @@ xfs_da_state_free(xfs_da_state_t *state)
        kmem_zone_free(xfs_da_state_zone, state);
 }
 
+/*
+ * Verify an xfs_da3_blkinfo structure. Note that the da3 fields are only
+ * accessible on v5 filesystems. This header format is common across da node,
+ * attr leaf and dir leaf blocks.
+ */
+xfs_failaddr_t
+xfs_da3_blkinfo_verify(
+       struct xfs_buf          *bp,
+       struct xfs_da3_blkinfo  *hdr3)
+{
+       struct xfs_mount        *mp = bp->b_target->bt_mount;
+       struct xfs_da_blkinfo   *hdr = &hdr3->hdr;
+
+       if (!xfs_verify_magic(bp, hdr->magic))
+               return __this_address;
+
+       if (xfs_sb_version_hascrc(&mp->m_sb)) {
+               if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
+                       return __this_address;
+               if (be64_to_cpu(hdr3->blkno) != bp->b_bn)
+                       return __this_address;
+               if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
+                       return __this_address;
+       }
+
+       return 0;
+}
+
 static xfs_failaddr_t
 xfs_da3_node_verify(
        struct xfs_buf          *bp)
@@ -119,27 +147,16 @@ xfs_da3_node_verify(
        struct xfs_da_intnode   *hdr = bp->b_addr;
        struct xfs_da3_icnode_hdr ichdr;
        const struct xfs_dir_ops *ops;
+       xfs_failaddr_t          fa;
 
        ops = xfs_dir_get_ops(mp, NULL);
 
        ops->node_hdr_from_disk(&ichdr, hdr);
 
-       if (xfs_sb_version_hascrc(&mp->m_sb)) {
-               struct xfs_da3_node_hdr *hdr3 = bp->b_addr;
-
-               if (ichdr.magic != XFS_DA3_NODE_MAGIC)
-                       return __this_address;
+       fa = xfs_da3_blkinfo_verify(bp, bp->b_addr);
+       if (fa)
+               return fa;
 
-               if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_meta_uuid))
-                       return __this_address;
-               if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn)
-                       return __this_address;
-               if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->info.lsn)))
-                       return __this_address;
-       } else {
-               if (ichdr.magic != XFS_DA_NODE_MAGIC)
-                       return __this_address;
-       }
        if (ichdr.level == 0)
                return __this_address;
        if (ichdr.level > XFS_DA_NODE_MAXDEPTH)
@@ -252,6 +269,8 @@ xfs_da3_node_verify_struct(
 
 const struct xfs_buf_ops xfs_da3_node_buf_ops = {
        .name = "xfs_da3_node",
+       .magic = { cpu_to_be16(XFS_DA_NODE_MAGIC),
+                  cpu_to_be16(XFS_DA3_NODE_MAGIC) },
        .verify_read = xfs_da3_node_read_verify,
        .verify_write = xfs_da3_node_write_verify,
        .verify_struct = xfs_da3_node_verify_struct,