xfs: use the xfs_da_args owner field to set new dir/attr block owner
authorDarrick J. Wong <djwong@kernel.org>
Mon, 15 Apr 2024 21:54:34 +0000 (14:54 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 15 Apr 2024 21:58:50 +0000 (14:58 -0700)
When we're creating leaf, data, freespace, or dabtree blocks for
directories and xattrs, use the explicit owner field (instead of the
xfs_inode) to set the owner field.  This will enable online repair to
construct replacement data structures in a temporary file without having
to change the owner fields prior to swapping the new and old structures.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_attr_leaf.c
fs/xfs/libxfs/xfs_attr_remote.c
fs/xfs/libxfs/xfs_da_btree.c
fs/xfs/libxfs/xfs_dir2_block.c
fs/xfs/libxfs/xfs_dir2_data.c
fs/xfs/libxfs/xfs_dir2_leaf.c
fs/xfs/libxfs/xfs_dir2_node.c

index e606eae8d3770dff6a79fda004e81a985cb6e2f7..8937c034b3309bb599e874a3f9d107e78f7c6928 100644 (file)
@@ -1239,7 +1239,7 @@ xfs_attr3_leaf_create(
                ichdr.magic = XFS_ATTR3_LEAF_MAGIC;
 
                hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp));
-               hdr3->owner = cpu_to_be64(dp->i_ino);
+               hdr3->owner = cpu_to_be64(args->owner);
                uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
 
                ichdr.freemap[0].base = sizeof(struct xfs_attr3_leaf_hdr);
index ff04128287720ad061890faf0cf5a98f3ede470e..024895cc702995763476f62e80c279b42038f7e8 100644 (file)
@@ -522,8 +522,8 @@ xfs_attr_rmtval_set_value(
                        return error;
                bp->b_ops = &xfs_attr3_rmt_buf_ops;
 
-               xfs_attr_rmtval_copyin(mp, bp, args->dp->i_ino, &offset,
-                                      &valuelen, &src);
+               xfs_attr_rmtval_copyin(mp, bp, args->owner, &offset, &valuelen,
+                               &src);
 
                error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */
                xfs_buf_relse(bp);
index 718d071bb21ae326a9c639c3f0c37bf47aa013f1..743f6421cc04f9b3ce9fab7106089e206ae913a4 100644 (file)
@@ -486,7 +486,7 @@ xfs_da3_node_create(
                memset(hdr3, 0, sizeof(struct xfs_da3_node_hdr));
                ichdr.magic = XFS_DA3_NODE_MAGIC;
                hdr3->info.blkno = cpu_to_be64(xfs_buf_daddr(bp));
-               hdr3->info.owner = cpu_to_be64(args->dp->i_ino);
+               hdr3->info.owner = cpu_to_be64(args->owner);
                uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_meta_uuid);
        } else {
                ichdr.magic = XFS_DA_NODE_MAGIC;
index a2da007adb462f8cb3678bfe2f09aec4921a5278..61cbc668f228a590a9de4881db6387c0d589b517 100644 (file)
@@ -163,12 +163,13 @@ xfs_dir3_block_read(
 
 static void
 xfs_dir3_block_init(
-       struct xfs_mount        *mp,
-       struct xfs_trans        *tp,
-       struct xfs_buf          *bp,
-       struct xfs_inode        *dp)
+       struct xfs_da_args      *args,
+       struct xfs_buf          *bp)
 {
-       struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
+       struct xfs_trans        *tp = args->trans;
+       struct xfs_inode        *dp = args->dp;
+       struct xfs_mount        *mp = dp->i_mount;
+       struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
 
        bp->b_ops = &xfs_dir3_block_buf_ops;
        xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF);
@@ -177,7 +178,7 @@ xfs_dir3_block_init(
                memset(hdr3, 0, sizeof(*hdr3));
                hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC);
                hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp));
-               hdr3->owner = cpu_to_be64(dp->i_ino);
+               hdr3->owner = cpu_to_be64(args->owner);
                uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
                return;
 
@@ -1009,7 +1010,7 @@ xfs_dir2_leaf_to_block(
        /*
         * Start converting it to block form.
         */
-       xfs_dir3_block_init(mp, tp, dbp, dp);
+       xfs_dir3_block_init(args, dbp);
 
        needlog = 1;
        needscan = 0;
@@ -1129,7 +1130,7 @@ xfs_dir2_sf_to_block(
        error = xfs_dir3_data_init(args, blkno, &bp);
        if (error)
                goto out_free;
-       xfs_dir3_block_init(mp, tp, bp, dp);
+       xfs_dir3_block_init(args, bp);
        hdr = bp->b_addr;
 
        /*
@@ -1169,7 +1170,7 @@ xfs_dir2_sf_to_block(
         * Create entry for .
         */
        dep = bp->b_addr + offset;
-       dep->inumber = cpu_to_be64(dp->i_ino);
+       dep->inumber = cpu_to_be64(args->owner);
        dep->namelen = 1;
        dep->name[0] = '.';
        xfs_dir2_data_put_ftype(mp, dep, XFS_DIR3_FT_DIR);
index 7a6d965bea71bf6104b1f3e1b4bdeb7391d46a4c..c3ef720b5ff6e83cc552e220afc745bc21022035 100644 (file)
@@ -725,7 +725,7 @@ xfs_dir3_data_init(
                memset(hdr3, 0, sizeof(*hdr3));
                hdr3->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC);
                hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp));
-               hdr3->owner = cpu_to_be64(dp->i_ino);
+               hdr3->owner = cpu_to_be64(args->owner);
                uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
 
        } else
index 08dda5ce9d91c4f0c14f7e333c5978fa12216456..20ce057d12e828c286597fbacec67acf727f3bbe 100644 (file)
@@ -304,12 +304,12 @@ xfs_dir3_leafn_read(
  */
 static void
 xfs_dir3_leaf_init(
-       struct xfs_mount        *mp,
-       struct xfs_trans        *tp,
+       struct xfs_da_args      *args,
        struct xfs_buf          *bp,
-       xfs_ino_t               owner,
        uint16_t                type)
 {
+       struct xfs_mount        *mp = args->dp->i_mount;
+       struct xfs_trans        *tp = args->trans;
        struct xfs_dir2_leaf    *leaf = bp->b_addr;
 
        ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC);
@@ -323,7 +323,7 @@ xfs_dir3_leaf_init(
                                         ? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)
                                         : cpu_to_be16(XFS_DIR3_LEAFN_MAGIC);
                leaf3->info.blkno = cpu_to_be64(xfs_buf_daddr(bp));
-               leaf3->info.owner = cpu_to_be64(owner);
+               leaf3->info.owner = cpu_to_be64(args->owner);
                uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_meta_uuid);
        } else {
                memset(leaf, 0, sizeof(*leaf));
@@ -356,7 +356,6 @@ xfs_dir3_leaf_get_buf(
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_trans        *tp = args->trans;
-       struct xfs_mount        *mp = dp->i_mount;
        struct xfs_buf          *bp;
        int                     error;
 
@@ -369,7 +368,7 @@ xfs_dir3_leaf_get_buf(
        if (error)
                return error;
 
-       xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic);
+       xfs_dir3_leaf_init(args, bp, magic);
        xfs_dir3_leaf_log_header(args, bp);
        if (magic == XFS_DIR2_LEAF1_MAGIC)
                xfs_dir3_leaf_log_tail(args, bp);
index be0b8834028c009a9ae29d91948260252143679f..1ad7405f9c389e2e298544be35aa190fa30dd8a3 100644 (file)
@@ -349,7 +349,7 @@ xfs_dir3_free_get_buf(
                hdr.magic = XFS_DIR3_FREE_MAGIC;
 
                hdr3->hdr.blkno = cpu_to_be64(xfs_buf_daddr(bp));
-               hdr3->hdr.owner = cpu_to_be64(dp->i_ino);
+               hdr3->hdr.owner = cpu_to_be64(args->owner);
                uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_meta_uuid);
        } else
                hdr.magic = XFS_DIR2_FREE_MAGIC;