From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from userp1040.oracle.com ([156.151.31.81]:20691 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752078AbdK2SuN (ORCPT ); Wed, 29 Nov 2017 13:50:13 -0500 From: Allison Henderson Subject: Re: [PATCH v3 05/17] xfs: get directory offset when adding directory name References: <1510942905-12897-1-git-send-email-allison.henderson@oracle.com> <1510942905-12897-6-git-send-email-allison.henderson@oracle.com> <20171128190732.GU21412@magnolia> Message-ID: Date: Wed, 29 Nov 2017 11:50:05 -0700 MIME-Version: 1.0 In-Reply-To: <20171128190732.GU21412@magnolia> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-xfs-owner@vger.kernel.org List-ID: List-Id: xfs To: "Darrick J. Wong" Cc: linux-xfs@vger.kernel.org, Mark Tinguely , Dave Chinner On 11/28/2017 12:07 PM, Darrick J. Wong wrote: > On Fri, Nov 17, 2017 at 11:21:33AM -0700, Allison Henderson wrote: >> From: Mark Tinguely >> >> 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. >> >> [dchinner: forward ported and cleaned up] >> [dchinner: no s-o-b from Mark] >> [bfoster: rebased, use args->geo in dir code] >> [achender: rebased, chaged __uint32_t to xfs_dir2_dataptr_t] >> >> Signed-off-by: Dave Chinner >> Signed-off-by: Allison Henderson >> --- >> fs/xfs/libxfs/xfs_da_btree.h | 1 + >> fs/xfs/libxfs/xfs_dir2.c | 8 ++++++-- >> fs/xfs/libxfs/xfs_dir2.h | 3 ++- >> 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 | 9 +++++---- >> fs/xfs/xfs_symlink.c | 2 +- >> 9 files changed, 22 insertions(+), 8 deletions(-) >> >> diff --git a/fs/xfs/libxfs/xfs_da_btree.h b/fs/xfs/libxfs/xfs_da_btree.h >> index ae6de17..bce96d6 100644 >> --- a/fs/xfs/libxfs/xfs_da_btree.h >> +++ b/fs/xfs/libxfs/xfs_da_btree.h >> @@ -86,6 +86,7 @@ typedef struct xfs_da_args { >> int rmtvaluelen2; /* remote attr value length in bytes */ >> int 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 ccf9783..a1ca460 100644 >> --- a/fs/xfs/libxfs/xfs_dir2.c >> +++ b/fs/xfs/libxfs/xfs_dir2.c >> @@ -268,7 +268,8 @@ xfs_dir_createname( >> xfs_ino_t inum, /* new entry inode number */ >> xfs_fsblock_t *first, /* bmap's firstblock */ >> struct xfs_defer_ops *dfops, /* bmap's freeblock list */ >> - 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; >> @@ -323,6 +324,9 @@ xfs_dir_createname( >> else >> rval = xfs_dir2_node_addname(args); >> >> + /* return the location that this entry was place in the parent inode */ >> + if (offset) >> + *offset = args->offset; >> out_free: > FWIW I think I complain later about this label moving in a subsequent > patch.... and you'll see this same comment two more times. Downside of > reviewing in backwards order, I guess. > > --D > No worries, I'll get it moved where it needs to be >> kmem_free(args); >> return rval; >> @@ -570,7 +574,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, NULL, NULL, 0); >> + return xfs_dir_createname(tp, dp, name, 0, NULL, NULL, 0, NULL); >> } >> >> /* >> diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h >> index 21c8f8b..e349900 100644 >> --- a/fs/xfs/libxfs/xfs_dir2.h >> +++ b/fs/xfs/libxfs/xfs_dir2.h >> @@ -131,7 +131,8 @@ extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, >> extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp, >> struct xfs_name *name, xfs_ino_t inum, >> xfs_fsblock_t *first, >> - struct xfs_defer_ops *dfops, xfs_extlen_t tot); >> + struct xfs_defer_ops *dfops, xfs_extlen_t tot, >> + xfs_dir2_dataptr_t *offset); >> extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp, >> 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 43c902f..79684d5 100644 >> --- a/fs/xfs/libxfs/xfs_dir2_block.c >> +++ b/fs/xfs/libxfs/xfs_dir2_block.c >> @@ -552,6 +552,7 @@ xfs_dir2_block_addname( >> dp->d_ops->data_put_ftype(dep, args->filetype); >> tagp = dp->d_ops->data_entry_tag_p(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 27297a6..2ac7a7e 100644 >> --- a/fs/xfs/libxfs/xfs_dir2_leaf.c >> +++ b/fs/xfs/libxfs/xfs_dir2_leaf.c >> @@ -863,6 +863,8 @@ xfs_dir2_leaf_addname( >> dp->d_ops->data_put_ftype(dep, args->filetype); >> tagp = dp->d_ops->data_entry_tag_p(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 682e2bf..8bc91f8 100644 >> --- a/fs/xfs/libxfs/xfs_dir2_node.c >> +++ b/fs/xfs/libxfs/xfs_dir2_node.c >> @@ -2022,6 +2022,8 @@ xfs_dir2_node_addname_int( >> dp->d_ops->data_put_ftype(dep, args->filetype); >> tagp = dp->d_ops->data_entry_tag_p(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 block for bestfree if needed. >> diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c >> index be8b975..489bdef 100644 >> --- a/fs/xfs/libxfs/xfs_dir2_sf.c >> +++ b/fs/xfs/libxfs/xfs_dir2_sf.c >> @@ -407,6 +407,7 @@ xfs_dir2_sf_addname_easy( >> memcpy(sfep->name, args->name, sfep->namelen); >> dp->d_ops->sf_put_ino(sfp, sfep, args->inumber); >> dp->d_ops->sf_put_ftype(sfep, args->filetype); >> + args->offset = xfs_dir2_byte_to_dataptr(offset); >> >> /* >> * Update the header and inode. >> @@ -498,6 +499,7 @@ xfs_dir2_sf_addname_hard( >> memcpy(sfep->name, args->name, sfep->namelen); >> dp->d_ops->sf_put_ino(sfp, sfep, args->inumber); >> dp->d_ops->sf_put_ftype(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 4ec5b7f..3abcb17 100644 >> --- a/fs/xfs/xfs_inode.c >> +++ b/fs/xfs/xfs_inode.c >> @@ -1252,7 +1252,8 @@ xfs_create( >> >> error = xfs_dir_createname(tp, dp, name, ip->i_ino, >> &first_block, &dfops, resblks ? >> - resblks - XFS_IALLOC_SPACE_RES(mp) : 0); >> + resblks - XFS_IALLOC_SPACE_RES(mp) : 0, >> + NULL); >> if (error) { >> ASSERT(error != -ENOSPC); >> goto out_trans_cancel; >> @@ -1495,7 +1496,7 @@ xfs_link( >> } >> >> error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino, >> - &first_block, &dfops, resblks); >> + &first_block, &dfops, resblks, NULL); >> if (error) >> goto error_return; >> xfs_trans_ichgtime(tp, tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); >> @@ -3031,8 +3032,8 @@ xfs_rename( >> * to account for the ".." reference from the new entry. >> */ >> error = xfs_dir_createname(tp, target_dp, target_name, >> - src_ip->i_ino, &first_block, >> - &dfops, spaceres); >> + src_ip->i_ino, &first_block, &dfops, >> + spaceres, NULL); >> if (error) >> goto out_bmap_cancel; >> >> diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c >> index 68d3ca2..fc803ae 100644 >> --- a/fs/xfs/xfs_symlink.c >> +++ b/fs/xfs/xfs_symlink.c >> @@ -363,7 +363,7 @@ xfs_symlink( >> * Create the directory entry for the symlink. >> */ >> error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, >> - &first_block, &dfops, resblks); >> + &first_block, &dfops, resblks, NULL); >> if (error) >> goto out_bmap_cancel; >> xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); >> -- >> 2.7.4 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in >> the body of a message tomajordomo@vger.kernel.org >> More majordomo info athttps://urldefense.proofpoint.com/v2/url?u=http-3A__vger.kernel.org_majordomo-2Dinfo.html&d=DwIBAg&c=RoP1YumCXCgaWHvlZYR8PZh8Bv7qIrMUB65eapI_JnE&r=LHZQ8fHvy6wDKXGTWcm97burZH5sQKHRDMaY1UthQxc&m=02ISa0rUacsoxueLmIUl9nJiJs3waUhjDqpEUPdTp9Y&s=uo_t9jIDLCSlKBgSmk2KhaRvYIkwpDH2sJeqhWGcSz8&e= > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message tomajordomo@vger.kernel.org > More majordomo info athttps://urldefense.proofpoint.com/v2/url?u=http-3A__vger.kernel.org_majordomo-2Dinfo.html&d=DwIBAg&c=RoP1YumCXCgaWHvlZYR8PZh8Bv7qIrMUB65eapI_JnE&r=LHZQ8fHvy6wDKXGTWcm97burZH5sQKHRDMaY1UthQxc&m=02ISa0rUacsoxueLmIUl9nJiJs3waUhjDqpEUPdTp9Y&s=uo_t9jIDLCSlKBgSmk2KhaRvYIkwpDH2sJeqhWGcSz8&e=