Re: [PATCH v4 08/27] xfs: get directory offset when removing directory name

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> On Oct 21, 2022, at 3:29 PM, allison.henderson@xxxxxxxxxx wrote:
> 
> From: Allison Henderson <allison.henderson@xxxxxxxxxx>
> 
> Return the directory offset information when removing an entry to the
> directory.
> 
> This offset will be used as the parent pointer offset in xfs_remove.
> 
> Signed-off-by: Mark Tinguely <tinguely@xxxxxxx>
> 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_dir2.c       | 6 +++++-
> fs/xfs/libxfs/xfs_dir2.h       | 3 ++-
> fs/xfs/libxfs/xfs_dir2_block.c | 4 ++--
> fs/xfs/libxfs/xfs_dir2_leaf.c  | 5 +++--
> fs/xfs/libxfs/xfs_dir2_node.c  | 5 +++--
> fs/xfs/libxfs/xfs_dir2_sf.c    | 2 ++
> fs/xfs/xfs_inode.c             | 4 ++--
> 7 files changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
> index 69a6561c22cc..891c1f701f53 100644
> --- a/fs/xfs/libxfs/xfs_dir2.c
> +++ b/fs/xfs/libxfs/xfs_dir2.c
> @@ -436,7 +436,8 @@ xfs_dir_removename(
> 	struct xfs_inode	*dp,
> 	struct xfs_name		*name,
> 	xfs_ino_t		ino,
> -	xfs_extlen_t		total)		/* bmap's total block count */
> +	xfs_extlen_t		total,		/* bmap's total block count */
> +	xfs_dir2_dataptr_t	*offset)	/* OUT: offset in directory */
> {
> 	struct xfs_da_args	*args;
> 	int			rval;
> @@ -481,6 +482,9 @@ xfs_dir_removename(
> 	else
> 		rval = xfs_dir2_node_removename(args);
> out_free:
> +	if (offset)
> +		*offset = args->offset;
> +
> 	kmem_free(args);
> 	return rval;
> }
> diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h
> index d96954478696..0c2d7c0af78f 100644
> --- a/fs/xfs/libxfs/xfs_dir2.h
> +++ b/fs/xfs/libxfs/xfs_dir2.h
> @@ -46,7 +46,8 @@ extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp,
> 				struct xfs_name *ci_name);
> extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode *dp,
> 				struct xfs_name *name, xfs_ino_t ino,
> -				xfs_extlen_t tot);
> +				xfs_extlen_t tot,
> +				xfs_dir2_dataptr_t *offset);
> extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
> 				const struct xfs_name *name, xfs_ino_t inum,
> 				xfs_extlen_t tot);
> diff --git a/fs/xfs/libxfs/xfs_dir2_block.c b/fs/xfs/libxfs/xfs_dir2_block.c
> index 70aeab9d2a12..d36f3f1491da 100644
> --- a/fs/xfs/libxfs/xfs_dir2_block.c
> +++ b/fs/xfs/libxfs/xfs_dir2_block.c
> @@ -810,9 +810,9 @@ xfs_dir2_block_removename(
> 	/*
> 	 * Point to the data entry using the leaf entry.
> 	 */
> +	args->offset = be32_to_cpu(blp[ent].address);
> 	dep = (xfs_dir2_data_entry_t *)((char *)hdr +
> -			xfs_dir2_dataptr_to_off(args->geo,
> -						be32_to_cpu(blp[ent].address)));
> +			xfs_dir2_dataptr_to_off(args->geo, args->offset));
> 	/*
> 	 * Mark the data entry's space free.
> 	 */
> diff --git a/fs/xfs/libxfs/xfs_dir2_leaf.c b/fs/xfs/libxfs/xfs_dir2_leaf.c
> index 9ab520b66547..b4a066259d97 100644
> --- a/fs/xfs/libxfs/xfs_dir2_leaf.c
> +++ b/fs/xfs/libxfs/xfs_dir2_leaf.c
> @@ -1386,9 +1386,10 @@ xfs_dir2_leaf_removename(
> 	 * Point to the leaf entry, use that to point to the data entry.
> 	 */
> 	lep = &leafhdr.ents[index];
> -	db = xfs_dir2_dataptr_to_db(geo, be32_to_cpu(lep->address));
> +	args->offset = be32_to_cpu(lep->address);
> +	db = xfs_dir2_dataptr_to_db(args->geo, args->offset);
> 	dep = (xfs_dir2_data_entry_t *)((char *)hdr +
> -		xfs_dir2_dataptr_to_off(geo, be32_to_cpu(lep->address)));
> +		xfs_dir2_dataptr_to_off(args->geo, args->offset));
> 	needscan = needlog = 0;
> 	oldbest = be16_to_cpu(bf[0].length);
> 	ltp = xfs_dir2_leaf_tail_p(geo, leaf);
> diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c
> index 5a9513c036b8..39cbdeafa0f6 100644
> --- a/fs/xfs/libxfs/xfs_dir2_node.c
> +++ b/fs/xfs/libxfs/xfs_dir2_node.c
> @@ -1296,9 +1296,10 @@ xfs_dir2_leafn_remove(
> 	/*
> 	 * Extract the data block and offset from the entry.
> 	 */
> -	db = xfs_dir2_dataptr_to_db(geo, be32_to_cpu(lep->address));
> +	args->offset = be32_to_cpu(lep->address);
> +	db = xfs_dir2_dataptr_to_db(args->geo, args->offset);
> 	ASSERT(dblk->blkno == db);
> -	off = xfs_dir2_dataptr_to_off(geo, be32_to_cpu(lep->address));
> +	off = xfs_dir2_dataptr_to_off(args->geo, args->offset);
> 	ASSERT(dblk->index == off);
> 
> 	/*
> diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c
> index 44bc4ba3da8a..b49578a547b3 100644
> --- a/fs/xfs/libxfs/xfs_dir2_sf.c
> +++ b/fs/xfs/libxfs/xfs_dir2_sf.c
> @@ -969,6 +969,8 @@ xfs_dir2_sf_removename(
> 								XFS_CMP_EXACT) {
> 			ASSERT(xfs_dir2_sf_get_ino(mp, sfp, sfep) ==
> 			       args->inumber);
> +			args->offset = xfs_dir2_byte_to_dataptr(
> +						xfs_dir2_sf_get_offset(sfep));
> 			break;
> 		}
> 	}
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index 229bc126b7c8..a0d5761e1fee 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -2506,7 +2506,7 @@ xfs_remove(
> 	if (error)
> 		goto out_trans_cancel;
> 
> -	error = xfs_dir_removename(tp, dp, name, ip->i_ino, resblks);
> +	error = xfs_dir_removename(tp, dp, name, ip->i_ino, resblks, NULL);
> 	if (error) {
> 		ASSERT(error != -ENOENT);
> 		goto out_trans_cancel;
> @@ -3095,7 +3095,7 @@ xfs_rename(
> 					spaceres);
> 	else
> 		error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
> -					   spaceres);
> +					   spaceres, NULL);
> 
> 	if (error)
> 		goto out_trans_cancel;
> -- 
> 2.25.1
> 





[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux