Re: [PATCH 37/46] xfs: replace xfs_dir3_data_endp with xfs_dir3_data_end_offset

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

 



On Thu, Nov 07, 2019 at 07:24:01PM +0100, Christoph Hellwig wrote:
> All the callers really want an offset into the buffer, so adopt
> the helper to return that instead.
> 
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>

/me feels like he's been walked down the dirent^Wgarden path...

Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>

--D

> ---
>  fs/xfs/libxfs/xfs_dir2.h      |  2 +-
>  fs/xfs/libxfs/xfs_dir2_data.c | 29 +++++++++++++++--------------
>  fs/xfs/libxfs/xfs_dir2_sf.c   |  2 +-
>  fs/xfs/scrub/dir.c            | 10 +++++-----
>  fs/xfs/xfs_dir2_readdir.c     |  2 +-
>  5 files changed, 23 insertions(+), 22 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h
> index a160f2d4ff37..3a4b98d4973d 100644
> --- a/fs/xfs/libxfs/xfs_dir2.h
> +++ b/fs/xfs/libxfs/xfs_dir2.h
> @@ -266,7 +266,7 @@ xfs_dir2_leaf_tail_p(struct xfs_da_geometry *geo, struct xfs_dir2_leaf *lp)
>  #define XFS_READDIR_BUFSIZE	(32768)
>  
>  unsigned char xfs_dir3_get_dtype(struct xfs_mount *mp, uint8_t filetype);
> -void *xfs_dir3_data_endp(struct xfs_da_geometry *geo,
> +unsigned int xfs_dir3_data_end_offset(struct xfs_da_geometry *geo,
>  		struct xfs_dir2_data_hdr *hdr);
>  bool xfs_dir2_namecheck(const void *name, size_t length);
>  
> diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c
> index 8c729270f9f1..f5fa8b9187b0 100644
> --- a/fs/xfs/libxfs/xfs_dir2_data.c
> +++ b/fs/xfs/libxfs/xfs_dir2_data.c
> @@ -55,7 +55,6 @@ __xfs_dir3_data_check(
>  	int			count;		/* count of entries found */
>  	xfs_dir2_data_hdr_t	*hdr;		/* data block header */
>  	xfs_dir2_data_free_t	*dfp;		/* bestfree entry */
> -	void			*endp;		/* end of useful data */
>  	int			freeseen;	/* mask of bestfrees seen */
>  	xfs_dahash_t		hash;		/* hash of current name */
>  	int			i;		/* leaf index */
> @@ -102,10 +101,9 @@ __xfs_dir3_data_check(
>  	default:
>  		return __this_address;
>  	}
> -	endp = xfs_dir3_data_endp(geo, hdr);
> -	if (!endp)
> +	end = xfs_dir3_data_end_offset(geo, hdr);
> +	if (!end)
>  		return __this_address;
> -	end = endp - bp->b_addr;
>  
>  	/*
>  	 * Account for zero bestfree entries.
> @@ -590,7 +588,7 @@ xfs_dir2_data_freescan_int(
>  	memset(bf, 0, sizeof(*bf) * XFS_DIR2_DATA_FD_COUNT);
>  	*loghead = 1;
>  
> -	end = xfs_dir3_data_endp(geo, addr) - addr;
> +	end = xfs_dir3_data_end_offset(geo, addr);
>  	while (offset < end) {
>  		struct xfs_dir2_data_unused	*dup = addr + offset;
>  		struct xfs_dir2_data_entry	*dep = addr + offset;
> @@ -784,11 +782,11 @@ xfs_dir2_data_make_free(
>  {
>  	xfs_dir2_data_hdr_t	*hdr;		/* data block pointer */
>  	xfs_dir2_data_free_t	*dfp;		/* bestfree pointer */
> -	char			*endptr;	/* end of data area */
>  	int			needscan;	/* need to regen bestfree */
>  	xfs_dir2_data_unused_t	*newdup;	/* new unused entry */
>  	xfs_dir2_data_unused_t	*postdup;	/* unused entry after us */
>  	xfs_dir2_data_unused_t	*prevdup;	/* unused entry before us */
> +	unsigned int		end;
>  	struct xfs_dir2_data_free *bf;
>  
>  	hdr = bp->b_addr;
> @@ -796,8 +794,8 @@ xfs_dir2_data_make_free(
>  	/*
>  	 * Figure out where the end of the data area is.
>  	 */
> -	endptr = xfs_dir3_data_endp(args->geo, hdr);
> -	ASSERT(endptr != NULL);
> +	end = xfs_dir3_data_end_offset(args->geo, hdr);
> +	ASSERT(end != 0);
>  
>  	/*
>  	 * If this isn't the start of the block, then back up to
> @@ -816,7 +814,7 @@ xfs_dir2_data_make_free(
>  	 * If this isn't the end of the block, see if the entry after
>  	 * us is free.
>  	 */
> -	if ((char *)hdr + offset + len < endptr) {
> +	if (offset + len < end) {
>  		postdup =
>  			(xfs_dir2_data_unused_t *)((char *)hdr + offset + len);
>  		if (be16_to_cpu(postdup->freetag) != XFS_DIR2_DATA_FREE_TAG)
> @@ -1144,19 +1142,22 @@ xfs_dir2_data_use_free(
>  }
>  
>  /* Find the end of the entry data in a data/block format dir block. */
> -void *
> -xfs_dir3_data_endp(
> +unsigned int
> +xfs_dir3_data_end_offset(
>  	struct xfs_da_geometry		*geo,
>  	struct xfs_dir2_data_hdr	*hdr)
>  {
> +	void				*p;
> +
>  	switch (hdr->magic) {
>  	case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
>  	case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC):
> -		return xfs_dir2_block_leaf_p(xfs_dir2_block_tail_p(geo, hdr));
> +		p = xfs_dir2_block_leaf_p(xfs_dir2_block_tail_p(geo, hdr));
> +		return p - (void *)hdr;
>  	case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
>  	case cpu_to_be32(XFS_DIR2_DATA_MAGIC):
> -		return (char *)hdr + geo->blksize;
> +		return geo->blksize;
>  	default:
> -		return NULL;
> +		return 0;
>  	}
>  }
> diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c
> index a1aed589dc8c..bb6491a3c473 100644
> --- a/fs/xfs/libxfs/xfs_dir2_sf.c
> +++ b/fs/xfs/libxfs/xfs_dir2_sf.c
> @@ -283,7 +283,7 @@ xfs_dir2_block_to_sf(
>  	 * Loop over the active and unused entries.  Stop when we reach the
>  	 * leaf/tail portion of the block.
>  	 */
> -	end = xfs_dir3_data_endp(args->geo, bp->b_addr) - bp->b_addr;
> +	end = xfs_dir3_data_end_offset(args->geo, bp->b_addr);
>  	sfep = xfs_dir2_sf_firstentry(sfp);
>  	while (offset < end) {
>  		struct xfs_dir2_data_unused	*dup = bp->b_addr + offset;
> diff --git a/fs/xfs/scrub/dir.c b/fs/xfs/scrub/dir.c
> index 4cef21b9d336..7f03f0fb178a 100644
> --- a/fs/xfs/scrub/dir.c
> +++ b/fs/xfs/scrub/dir.c
> @@ -187,7 +187,7 @@ xchk_dir_rec(
>  	struct xfs_dir2_data_entry	*dent;
>  	struct xfs_buf			*bp;
>  	struct xfs_dir2_leaf_entry	*ent;
> -	void				*endp;
> +	unsigned int			end;
>  	unsigned int			offset;
>  	xfs_ino_t			ino;
>  	xfs_dablk_t			rec_bno;
> @@ -242,8 +242,8 @@ xchk_dir_rec(
>  
>  	/* Make sure we got a real directory entry. */
>  	offset = mp->m_dir_inode_ops->data_entry_offset;
> -	endp = xfs_dir3_data_endp(mp->m_dir_geo, bp->b_addr);
> -	if (!endp) {
> +	end = xfs_dir3_data_end_offset(mp->m_dir_geo, bp->b_addr);
> +	if (!end) {
>  		xchk_fblock_set_corrupt(ds->sc, XFS_DATA_FORK, rec_bno);
>  		goto out_relse;
>  	}
> @@ -251,7 +251,7 @@ xchk_dir_rec(
>  		struct xfs_dir2_data_entry	*dep = bp->b_addr + offset;
>  		struct xfs_dir2_data_unused	*dup = bp->b_addr + offset;
>  	
> -		if (offset >= endp - bp->b_addr) {
> +		if (offset >= end) {
>  			xchk_fblock_set_corrupt(ds->sc, XFS_DATA_FORK, rec_bno);
>  			goto out_relse;
>  		}
> @@ -390,7 +390,7 @@ xchk_directory_data_bestfree(
>  
>  	/* Make sure the bestfrees are actually the best free spaces. */
>  	offset = d_ops->data_entry_offset;
> -	end = xfs_dir3_data_endp(mp->m_dir_geo, bp->b_addr) - bp->b_addr;
> +	end = xfs_dir3_data_end_offset(mp->m_dir_geo, bp->b_addr);
>  
>  	/* Iterate the entries, stopping when we hit or go past the end. */
>  	while (offset < end) {
> diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c
> index c4314e9e3dd8..6d229aa93d01 100644
> --- a/fs/xfs/xfs_dir2_readdir.c
> +++ b/fs/xfs/xfs_dir2_readdir.c
> @@ -175,7 +175,7 @@ xfs_dir2_block_getdents(
>  	 * Each object is a real entry (dep) or an unused one (dup).
>  	 */
>  	offset = dp->d_ops->data_entry_offset;
> -	end = xfs_dir3_data_endp(geo, bp->b_addr) - bp->b_addr;
> +	end = xfs_dir3_data_end_offset(geo, bp->b_addr);
>  	while (offset < end) {
>  		struct xfs_dir2_data_unused	*dup = bp->b_addr + offset;
>  		struct xfs_dir2_data_entry	*dep = bp->b_addr + offset;
> -- 
> 2.20.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