xfs_failaddr_t xfs_dir3_leaf_header_check(struct xfs_buf *bp, xfs_ino_t owner);
 xfs_failaddr_t xfs_dir3_data_header_check(struct xfs_buf *bp, xfs_ino_t owner);
+xfs_failaddr_t xfs_dir3_block_header_check(struct xfs_buf *bp, xfs_ino_t owner);
 
 extern const struct xfs_buf_ops xfs_dir3_block_buf_ops;
 extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops;
 
        .verify_struct = xfs_dir3_block_verify,
 };
 
-static xfs_failaddr_t
+xfs_failaddr_t
 xfs_dir3_block_header_check(
-       struct xfs_inode        *dp,
-       struct xfs_buf          *bp)
+       struct xfs_buf          *bp,
+       xfs_ino_t               owner)
 {
-       struct xfs_mount        *mp = dp->i_mount;
+       struct xfs_mount        *mp = bp->b_mount;
 
        if (xfs_has_crc(mp)) {
                struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
 
-               if (be64_to_cpu(hdr3->owner) != dp->i_ino)
+               if (hdr3->magic != cpu_to_be32(XFS_DIR3_BLOCK_MAGIC))
+                       return __this_address;
+
+               if (be64_to_cpu(hdr3->owner) != owner)
                        return __this_address;
        }
 
 xfs_dir3_block_read(
        struct xfs_trans        *tp,
        struct xfs_inode        *dp,
+       xfs_ino_t               owner,
        struct xfs_buf          **bpp)
 {
        struct xfs_mount        *mp = dp->i_mount;
                return err;
 
        /* Check things that we can't do in the verifier. */
-       fa = xfs_dir3_block_header_check(dp, *bpp);
+       fa = xfs_dir3_block_header_check(*bpp, owner);
        if (fa) {
                __xfs_buf_mark_corrupt(*bpp, fa);
                xfs_trans_brelse(tp, *bpp);
        tp = args->trans;
 
        /* Read the (one and only) directory block into bp. */
-       error = xfs_dir3_block_read(tp, dp, &bp);
+       error = xfs_dir3_block_read(tp, dp, args->owner, &bp);
        if (error)
                return error;
 
        dp = args->dp;
        tp = args->trans;
 
-       error = xfs_dir3_block_read(tp, dp, &bp);
+       error = xfs_dir3_block_read(tp, dp, args->owner, &bp);
        if (error)
                return error;
 
 
 
 
 /* xfs_dir2_block.c */
-extern int xfs_dir3_block_read(struct xfs_trans *tp, struct xfs_inode *dp,
-                              struct xfs_buf **bpp);
+int xfs_dir3_block_read(struct xfs_trans *tp, struct xfs_inode *dp,
+               xfs_ino_t owner, struct xfs_buf **bpp);
 extern int xfs_dir2_block_addname(struct xfs_da_args *args);
 extern int xfs_dir2_block_lookup(struct xfs_da_args *args);
 extern int xfs_dir2_block_removename(struct xfs_da_args *args);
 
        if (!isblock)
                return 0;
 
-       error = xfs_dir3_block_read(tp, xmi->xmi_ip2, &bp);
+       error = xfs_dir3_block_read(tp, xmi->xmi_ip2, xmi->xmi_ip2->i_ino, &bp);
        if (error)
                return error;
 
 
                /* dir block format */
                if (lblk != XFS_B_TO_FSBT(mp, XFS_DIR2_DATA_OFFSET))
                        xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, lblk);
-               error = xfs_dir3_block_read(sc->tp, sc->ip, &bp);
+               error = xfs_dir3_block_read(sc->tp, sc->ip, sc->ip->i_ino, &bp);
        } else {
                /* dir data format */
                error = xfs_dir3_data_read(sc->tp, sc->ip, sc->ip->i_ino, lblk,
 
        unsigned int            off, next_off, end;
        int                     error;
 
-       error = xfs_dir3_block_read(sc->tp, dp, &bp);
+       error = xfs_dir3_block_read(sc->tp, dp, dp->i_ino, &bp);
        if (error)
                return error;
 
 
        if (xfs_dir2_dataptr_to_db(geo, ctx->pos) > geo->datablk)
                return 0;
 
-       error = xfs_dir3_block_read(args->trans, dp, &bp);
+       error = xfs_dir3_block_read(args->trans, dp, args->owner, &bp);
        if (error)
                return error;