> On Oct 21, 2022, at 3:29 PM, allison.henderson@xxxxxxxxxx wrote: > > From: Allison Henderson <allison.henderson@xxxxxxxxxx> > > Return the directory offset information when adding an entry to the > directory. > > This offset will be used as the parent pointer offset in xfs_create, > xfs_symlink, xfs_link and xfs_rename. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> > Signed-off-by: Allison Henderson <allison.henderson@xxxxxxxxxx> > Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> Looks good Reviewed-by: Catherine Hoang <catherine.hoang@xxxxxxxxxx> > --- > fs/xfs/libxfs/xfs_da_btree.h | 1 + > fs/xfs/libxfs/xfs_dir2.c | 9 +++++++-- > fs/xfs/libxfs/xfs_dir2.h | 2 +- > fs/xfs/libxfs/xfs_dir2_block.c | 1 + > fs/xfs/libxfs/xfs_dir2_leaf.c | 2 ++ > fs/xfs/libxfs/xfs_dir2_node.c | 2 ++ > fs/xfs/libxfs/xfs_dir2_sf.c | 2 ++ > fs/xfs/xfs_inode.c | 6 +++--- > fs/xfs/xfs_symlink.c | 3 ++- > 9 files changed, 21 insertions(+), 7 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_da_btree.h b/fs/xfs/libxfs/xfs_da_btree.h > index a4b29827603f..90b86d00258f 100644 > --- a/fs/xfs/libxfs/xfs_da_btree.h > +++ b/fs/xfs/libxfs/xfs_da_btree.h > @@ -81,6 +81,7 @@ typedef struct xfs_da_args { > int rmtvaluelen2; /* remote attr value length in bytes */ > uint32_t op_flags; /* operation flags */ > enum xfs_dacmp cmpresult; /* name compare result for lookups */ > + xfs_dir2_dataptr_t offset; /* OUT: offset in directory */ > } xfs_da_args_t; > > /* > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > index 92bac3373f1f..69a6561c22cc 100644 > --- a/fs/xfs/libxfs/xfs_dir2.c > +++ b/fs/xfs/libxfs/xfs_dir2.c > @@ -257,7 +257,8 @@ xfs_dir_createname( > struct xfs_inode *dp, > const struct xfs_name *name, > xfs_ino_t inum, /* new entry inode number */ > - xfs_extlen_t total) /* bmap's total block count */ > + xfs_extlen_t total, /* bmap's total block count */ > + xfs_dir2_dataptr_t *offset) /* OUT entry's dir offset */ > { > struct xfs_da_args *args; > int rval; > @@ -312,6 +313,10 @@ xfs_dir_createname( > rval = xfs_dir2_node_addname(args); > > out_free: > + /* return the location that this entry was place in the parent inode */ > + if (offset) > + *offset = args->offset; > + > kmem_free(args); > return rval; > } > @@ -550,7 +555,7 @@ xfs_dir_canenter( > xfs_inode_t *dp, > struct xfs_name *name) /* name of entry to add */ > { > - return xfs_dir_createname(tp, dp, name, 0, 0); > + return xfs_dir_createname(tp, dp, name, 0, 0, NULL); > } > > /* > diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h > index dd39f17dd9a9..d96954478696 100644 > --- a/fs/xfs/libxfs/xfs_dir2.h > +++ b/fs/xfs/libxfs/xfs_dir2.h > @@ -40,7 +40,7 @@ extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, > struct xfs_inode *pdp); > extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp, > const struct xfs_name *name, xfs_ino_t inum, > - xfs_extlen_t tot); > + xfs_extlen_t tot, xfs_dir2_dataptr_t *offset); > extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp, > const struct xfs_name *name, xfs_ino_t *inum, > struct xfs_name *ci_name); > diff --git a/fs/xfs/libxfs/xfs_dir2_block.c b/fs/xfs/libxfs/xfs_dir2_block.c > index 00f960a703b2..70aeab9d2a12 100644 > --- a/fs/xfs/libxfs/xfs_dir2_block.c > +++ b/fs/xfs/libxfs/xfs_dir2_block.c > @@ -573,6 +573,7 @@ xfs_dir2_block_addname( > xfs_dir2_data_put_ftype(dp->i_mount, dep, args->filetype); > tagp = xfs_dir2_data_entry_tag_p(dp->i_mount, dep); > *tagp = cpu_to_be16((char *)dep - (char *)hdr); > + args->offset = xfs_dir2_byte_to_dataptr((char *)dep - (char *)hdr); > /* > * Clean up the bestfree array and log the header, tail, and entry. > */ > diff --git a/fs/xfs/libxfs/xfs_dir2_leaf.c b/fs/xfs/libxfs/xfs_dir2_leaf.c > index cb9e950a911d..9ab520b66547 100644 > --- a/fs/xfs/libxfs/xfs_dir2_leaf.c > +++ b/fs/xfs/libxfs/xfs_dir2_leaf.c > @@ -870,6 +870,8 @@ xfs_dir2_leaf_addname( > xfs_dir2_data_put_ftype(dp->i_mount, dep, args->filetype); > tagp = xfs_dir2_data_entry_tag_p(dp->i_mount, dep); > *tagp = cpu_to_be16((char *)dep - (char *)hdr); > + args->offset = xfs_dir2_db_off_to_dataptr(args->geo, use_block, > + (char *)dep - (char *)hdr); > /* > * Need to scan fix up the bestfree table. > */ > diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c > index 7a03aeb9f4c9..5a9513c036b8 100644 > --- a/fs/xfs/libxfs/xfs_dir2_node.c > +++ b/fs/xfs/libxfs/xfs_dir2_node.c > @@ -1974,6 +1974,8 @@ xfs_dir2_node_addname_int( > xfs_dir2_data_put_ftype(dp->i_mount, dep, args->filetype); > tagp = xfs_dir2_data_entry_tag_p(dp->i_mount, dep); > *tagp = cpu_to_be16((char *)dep - (char *)hdr); > + args->offset = xfs_dir2_db_off_to_dataptr(args->geo, dbno, > + (char *)dep - (char *)hdr); > xfs_dir2_data_log_entry(args, dbp, dep); > > /* Rescan the freespace and log the data block if needed. */ > diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c > index 8cd37e6e9d38..44bc4ba3da8a 100644 > --- a/fs/xfs/libxfs/xfs_dir2_sf.c > +++ b/fs/xfs/libxfs/xfs_dir2_sf.c > @@ -485,6 +485,7 @@ xfs_dir2_sf_addname_easy( > memcpy(sfep->name, args->name, sfep->namelen); > xfs_dir2_sf_put_ino(mp, sfp, sfep, args->inumber); > xfs_dir2_sf_put_ftype(mp, sfep, args->filetype); > + args->offset = xfs_dir2_byte_to_dataptr(offset); > > /* > * Update the header and inode. > @@ -575,6 +576,7 @@ xfs_dir2_sf_addname_hard( > memcpy(sfep->name, args->name, sfep->namelen); > xfs_dir2_sf_put_ino(mp, sfp, sfep, args->inumber); > xfs_dir2_sf_put_ftype(mp, sfep, args->filetype); > + args->offset = xfs_dir2_byte_to_dataptr(offset); > sfp->count++; > if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange) > sfp->i8count++; > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 8b3aefd146a2..229bc126b7c8 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1038,7 +1038,7 @@ xfs_create( > unlock_dp_on_error = false; > > error = xfs_dir_createname(tp, dp, name, ip->i_ino, > - resblks - XFS_IALLOC_SPACE_RES(mp)); > + resblks - XFS_IALLOC_SPACE_RES(mp), NULL); > if (error) { > ASSERT(error != -ENOSPC); > goto out_trans_cancel; > @@ -1262,7 +1262,7 @@ xfs_link( > } > > error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino, > - resblks); > + resblks, NULL); > if (error) > goto error_return; > xfs_trans_ichgtime(tp, tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > @@ -2998,7 +2998,7 @@ xfs_rename( > * to account for the ".." reference from the new entry. > */ > error = xfs_dir_createname(tp, target_dp, target_name, > - src_ip->i_ino, spaceres); > + src_ip->i_ino, spaceres, NULL); > if (error) > goto out_trans_cancel; > > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index d8e120913036..27a7d7c57015 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -314,7 +314,8 @@ xfs_symlink( > /* > * Create the directory entry for the symlink. > */ > - error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, resblks); > + error = xfs_dir_createname(tp, dp, link_name, > + ip->i_ino, resblks, NULL); > if (error) > goto out_trans_cancel; > xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > -- > 2.25.1 >