Commit 17a85dc6 authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: use the xfs_da_args owner field to set new dir/attr block owner

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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 9eef772f
...@@ -1239,7 +1239,7 @@ xfs_attr3_leaf_create( ...@@ -1239,7 +1239,7 @@ xfs_attr3_leaf_create(
ichdr.magic = XFS_ATTR3_LEAF_MAGIC; ichdr.magic = XFS_ATTR3_LEAF_MAGIC;
hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp)); 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); uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
ichdr.freemap[0].base = sizeof(struct xfs_attr3_leaf_hdr); ichdr.freemap[0].base = sizeof(struct xfs_attr3_leaf_hdr);
......
...@@ -522,8 +522,8 @@ xfs_attr_rmtval_set_value( ...@@ -522,8 +522,8 @@ xfs_attr_rmtval_set_value(
return error; return error;
bp->b_ops = &xfs_attr3_rmt_buf_ops; bp->b_ops = &xfs_attr3_rmt_buf_ops;
xfs_attr_rmtval_copyin(mp, bp, args->dp->i_ino, &offset, xfs_attr_rmtval_copyin(mp, bp, args->owner, &offset, &valuelen,
&valuelen, &src); &src);
error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */ error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */
xfs_buf_relse(bp); xfs_buf_relse(bp);
......
...@@ -486,7 +486,7 @@ xfs_da3_node_create( ...@@ -486,7 +486,7 @@ xfs_da3_node_create(
memset(hdr3, 0, sizeof(struct xfs_da3_node_hdr)); memset(hdr3, 0, sizeof(struct xfs_da3_node_hdr));
ichdr.magic = XFS_DA3_NODE_MAGIC; ichdr.magic = XFS_DA3_NODE_MAGIC;
hdr3->info.blkno = cpu_to_be64(xfs_buf_daddr(bp)); 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); uuid_copy(&hdr3->info.uuid, &mp->m_sb.sb_meta_uuid);
} else { } else {
ichdr.magic = XFS_DA_NODE_MAGIC; ichdr.magic = XFS_DA_NODE_MAGIC;
......
...@@ -163,12 +163,13 @@ xfs_dir3_block_read( ...@@ -163,12 +163,13 @@ xfs_dir3_block_read(
static void static void
xfs_dir3_block_init( xfs_dir3_block_init(
struct xfs_mount *mp, struct xfs_da_args *args,
struct xfs_trans *tp, struct xfs_buf *bp)
struct xfs_buf *bp,
struct xfs_inode *dp)
{ {
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; bp->b_ops = &xfs_dir3_block_buf_ops;
xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF);
...@@ -177,7 +178,7 @@ xfs_dir3_block_init( ...@@ -177,7 +178,7 @@ xfs_dir3_block_init(
memset(hdr3, 0, sizeof(*hdr3)); memset(hdr3, 0, sizeof(*hdr3));
hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC);
hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp)); 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); uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
return; return;
...@@ -1009,7 +1010,7 @@ xfs_dir2_leaf_to_block( ...@@ -1009,7 +1010,7 @@ xfs_dir2_leaf_to_block(
/* /*
* Start converting it to block form. * Start converting it to block form.
*/ */
xfs_dir3_block_init(mp, tp, dbp, dp); xfs_dir3_block_init(args, dbp);
needlog = 1; needlog = 1;
needscan = 0; needscan = 0;
...@@ -1129,7 +1130,7 @@ xfs_dir2_sf_to_block( ...@@ -1129,7 +1130,7 @@ xfs_dir2_sf_to_block(
error = xfs_dir3_data_init(args, blkno, &bp); error = xfs_dir3_data_init(args, blkno, &bp);
if (error) if (error)
goto out_free; goto out_free;
xfs_dir3_block_init(mp, tp, bp, dp); xfs_dir3_block_init(args, bp);
hdr = bp->b_addr; hdr = bp->b_addr;
/* /*
...@@ -1169,7 +1170,7 @@ xfs_dir2_sf_to_block( ...@@ -1169,7 +1170,7 @@ xfs_dir2_sf_to_block(
* Create entry for . * Create entry for .
*/ */
dep = bp->b_addr + offset; dep = bp->b_addr + offset;
dep->inumber = cpu_to_be64(dp->i_ino); dep->inumber = cpu_to_be64(args->owner);
dep->namelen = 1; dep->namelen = 1;
dep->name[0] = '.'; dep->name[0] = '.';
xfs_dir2_data_put_ftype(mp, dep, XFS_DIR3_FT_DIR); xfs_dir2_data_put_ftype(mp, dep, XFS_DIR3_FT_DIR);
......
...@@ -725,7 +725,7 @@ xfs_dir3_data_init( ...@@ -725,7 +725,7 @@ xfs_dir3_data_init(
memset(hdr3, 0, sizeof(*hdr3)); memset(hdr3, 0, sizeof(*hdr3));
hdr3->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC); hdr3->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC);
hdr3->blkno = cpu_to_be64(xfs_buf_daddr(bp)); 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); uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid);
} else } else
......
...@@ -304,12 +304,12 @@ xfs_dir3_leafn_read( ...@@ -304,12 +304,12 @@ xfs_dir3_leafn_read(
*/ */
static void static void
xfs_dir3_leaf_init( xfs_dir3_leaf_init(
struct xfs_mount *mp, struct xfs_da_args *args,
struct xfs_trans *tp,
struct xfs_buf *bp, struct xfs_buf *bp,
xfs_ino_t owner,
uint16_t type) 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; struct xfs_dir2_leaf *leaf = bp->b_addr;
ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC); ASSERT(type == XFS_DIR2_LEAF1_MAGIC || type == XFS_DIR2_LEAFN_MAGIC);
...@@ -323,7 +323,7 @@ xfs_dir3_leaf_init( ...@@ -323,7 +323,7 @@ xfs_dir3_leaf_init(
? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) ? cpu_to_be16(XFS_DIR3_LEAF1_MAGIC)
: cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); : cpu_to_be16(XFS_DIR3_LEAFN_MAGIC);
leaf3->info.blkno = cpu_to_be64(xfs_buf_daddr(bp)); 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); uuid_copy(&leaf3->info.uuid, &mp->m_sb.sb_meta_uuid);
} else { } else {
memset(leaf, 0, sizeof(*leaf)); memset(leaf, 0, sizeof(*leaf));
...@@ -356,7 +356,6 @@ xfs_dir3_leaf_get_buf( ...@@ -356,7 +356,6 @@ xfs_dir3_leaf_get_buf(
{ {
struct xfs_inode *dp = args->dp; struct xfs_inode *dp = args->dp;
struct xfs_trans *tp = args->trans; struct xfs_trans *tp = args->trans;
struct xfs_mount *mp = dp->i_mount;
struct xfs_buf *bp; struct xfs_buf *bp;
int error; int error;
...@@ -369,7 +368,7 @@ xfs_dir3_leaf_get_buf( ...@@ -369,7 +368,7 @@ xfs_dir3_leaf_get_buf(
if (error) if (error)
return 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); xfs_dir3_leaf_log_header(args, bp);
if (magic == XFS_DIR2_LEAF1_MAGIC) if (magic == XFS_DIR2_LEAF1_MAGIC)
xfs_dir3_leaf_log_tail(args, bp); xfs_dir3_leaf_log_tail(args, bp);
......
...@@ -349,7 +349,7 @@ xfs_dir3_free_get_buf( ...@@ -349,7 +349,7 @@ xfs_dir3_free_get_buf(
hdr.magic = XFS_DIR3_FREE_MAGIC; hdr.magic = XFS_DIR3_FREE_MAGIC;
hdr3->hdr.blkno = cpu_to_be64(xfs_buf_daddr(bp)); 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); uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_meta_uuid);
} else } else
hdr.magic = XFS_DIR2_FREE_MAGIC; hdr.magic = XFS_DIR2_FREE_MAGIC;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment