diff mbox

[11/18] xfs: iterate over extents in xfs_bmap_extents_to_btree

Message ID 20171031142230.11755-12-hch@lst.de (mailing list archive)
State Accepted
Headers show

Commit Message

Christoph Hellwig Oct. 31, 2017, 2:22 p.m. UTC
This actually makes the function very slightly less efficient for now as we
detour through the expanded irect format between the in-core extent format
and the on-disk one instead of just endian swapping them.  But with the
incore extent btree the in-core one will use a different format and the
representation will be entirely hidden.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/libxfs/xfs_bmap.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

Comments

Darrick J. Wong Oct. 31, 2017, 9:41 p.m. UTC | #1
On Tue, Oct 31, 2017 at 04:22:23PM +0200, Christoph Hellwig wrote:
> This actually makes the function very slightly less efficient for now as we
> detour through the expanded irect format between the in-core extent format
> and the on-disk one instead of just endian swapping them.  But with the
> incore extent btree the in-core one will use a different format and the
> representation will be entirely hidden.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Looks good enough to test,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

> ---
>  fs/xfs/libxfs/xfs_bmap.c | 20 ++++++++------------
>  1 file changed, 8 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index 14428d72cf33..56482bf6280d 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -666,14 +666,13 @@ xfs_bmap_extents_to_btree(
>  	xfs_bmbt_rec_t		*arp;		/* child record pointer */
>  	struct xfs_btree_block	*block;		/* btree root block */
>  	xfs_btree_cur_t		*cur;		/* bmap btree cursor */
> -	xfs_bmbt_rec_host_t	*ep;		/* extent record pointer */
>  	int			error;		/* error return value */
> -	xfs_extnum_t		i, cnt;		/* extent record index */
>  	xfs_ifork_t		*ifp;		/* inode fork pointer */
>  	xfs_bmbt_key_t		*kp;		/* root block key pointer */
>  	xfs_mount_t		*mp;		/* mount structure */
> -	xfs_extnum_t		nextents;	/* number of file extents */
>  	xfs_bmbt_ptr_t		*pp;		/* root block address pointer */
> +	struct xfs_bmbt_irec	rec;
> +	xfs_extnum_t		i = 0, cnt = 0;
>  
>  	mp = ip->i_mount;
>  	ASSERT(whichfork != XFS_COW_FORK);
> @@ -752,15 +751,12 @@ xfs_bmap_extents_to_btree(
>  				XFS_BTNUM_BMAP, 0, 0, ip->i_ino,
>  				XFS_BTREE_LONG_PTRS);
>  
> -	arp = XFS_BMBT_REC_ADDR(mp, ablock, 1);
> -	nextents =  xfs_iext_count(ifp);
> -	for (cnt = i = 0; i < nextents; i++) {
> -		ep = xfs_iext_get_ext(ifp, i);
> -		if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) {
> -			arp->l0 = cpu_to_be64(ep->l0);
> -			arp->l1 = cpu_to_be64(ep->l1);
> -			arp++; cnt++;
> -		}
> +	while (xfs_iext_get_extent(ifp, i++, &rec)) {
> +		if (isnullstartblock(rec.br_startblock))
> +			continue;
> +		arp = XFS_BMBT_REC_ADDR(mp, ablock, 1 + cnt);
> +		xfs_bmbt_disk_set_all(arp, &rec);
> +		cnt++;
>  	}
>  	ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork));
>  	xfs_btree_set_numrecs(ablock, cnt);
> -- 
> 2.14.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Brian Foster Nov. 2, 2017, 1:54 p.m. UTC | #2
On Tue, Oct 31, 2017 at 04:22:23PM +0200, Christoph Hellwig wrote:
> This actually makes the function very slightly less efficient for now as we
> detour through the expanded irect format between the in-core extent format
> and the on-disk one instead of just endian swapping them.  But with the
> incore extent btree the in-core one will use a different format and the
> representation will be entirely hidden.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---

Reviewed-by: Brian Foster <bfoster@redhat.com>

>  fs/xfs/libxfs/xfs_bmap.c | 20 ++++++++------------
>  1 file changed, 8 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index 14428d72cf33..56482bf6280d 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -666,14 +666,13 @@ xfs_bmap_extents_to_btree(
>  	xfs_bmbt_rec_t		*arp;		/* child record pointer */
>  	struct xfs_btree_block	*block;		/* btree root block */
>  	xfs_btree_cur_t		*cur;		/* bmap btree cursor */
> -	xfs_bmbt_rec_host_t	*ep;		/* extent record pointer */
>  	int			error;		/* error return value */
> -	xfs_extnum_t		i, cnt;		/* extent record index */
>  	xfs_ifork_t		*ifp;		/* inode fork pointer */
>  	xfs_bmbt_key_t		*kp;		/* root block key pointer */
>  	xfs_mount_t		*mp;		/* mount structure */
> -	xfs_extnum_t		nextents;	/* number of file extents */
>  	xfs_bmbt_ptr_t		*pp;		/* root block address pointer */
> +	struct xfs_bmbt_irec	rec;
> +	xfs_extnum_t		i = 0, cnt = 0;
>  
>  	mp = ip->i_mount;
>  	ASSERT(whichfork != XFS_COW_FORK);
> @@ -752,15 +751,12 @@ xfs_bmap_extents_to_btree(
>  				XFS_BTNUM_BMAP, 0, 0, ip->i_ino,
>  				XFS_BTREE_LONG_PTRS);
>  
> -	arp = XFS_BMBT_REC_ADDR(mp, ablock, 1);
> -	nextents =  xfs_iext_count(ifp);
> -	for (cnt = i = 0; i < nextents; i++) {
> -		ep = xfs_iext_get_ext(ifp, i);
> -		if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) {
> -			arp->l0 = cpu_to_be64(ep->l0);
> -			arp->l1 = cpu_to_be64(ep->l1);
> -			arp++; cnt++;
> -		}
> +	while (xfs_iext_get_extent(ifp, i++, &rec)) {
> +		if (isnullstartblock(rec.br_startblock))
> +			continue;
> +		arp = XFS_BMBT_REC_ADDR(mp, ablock, 1 + cnt);
> +		xfs_bmbt_disk_set_all(arp, &rec);
> +		cnt++;
>  	}
>  	ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork));
>  	xfs_btree_set_numrecs(ablock, cnt);
> -- 
> 2.14.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
index 14428d72cf33..56482bf6280d 100644
--- a/fs/xfs/libxfs/xfs_bmap.c
+++ b/fs/xfs/libxfs/xfs_bmap.c
@@ -666,14 +666,13 @@  xfs_bmap_extents_to_btree(
 	xfs_bmbt_rec_t		*arp;		/* child record pointer */
 	struct xfs_btree_block	*block;		/* btree root block */
 	xfs_btree_cur_t		*cur;		/* bmap btree cursor */
-	xfs_bmbt_rec_host_t	*ep;		/* extent record pointer */
 	int			error;		/* error return value */
-	xfs_extnum_t		i, cnt;		/* extent record index */
 	xfs_ifork_t		*ifp;		/* inode fork pointer */
 	xfs_bmbt_key_t		*kp;		/* root block key pointer */
 	xfs_mount_t		*mp;		/* mount structure */
-	xfs_extnum_t		nextents;	/* number of file extents */
 	xfs_bmbt_ptr_t		*pp;		/* root block address pointer */
+	struct xfs_bmbt_irec	rec;
+	xfs_extnum_t		i = 0, cnt = 0;
 
 	mp = ip->i_mount;
 	ASSERT(whichfork != XFS_COW_FORK);
@@ -752,15 +751,12 @@  xfs_bmap_extents_to_btree(
 				XFS_BTNUM_BMAP, 0, 0, ip->i_ino,
 				XFS_BTREE_LONG_PTRS);
 
-	arp = XFS_BMBT_REC_ADDR(mp, ablock, 1);
-	nextents =  xfs_iext_count(ifp);
-	for (cnt = i = 0; i < nextents; i++) {
-		ep = xfs_iext_get_ext(ifp, i);
-		if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) {
-			arp->l0 = cpu_to_be64(ep->l0);
-			arp->l1 = cpu_to_be64(ep->l1);
-			arp++; cnt++;
-		}
+	while (xfs_iext_get_extent(ifp, i++, &rec)) {
+		if (isnullstartblock(rec.br_startblock))
+			continue;
+		arp = XFS_BMBT_REC_ADDR(mp, ablock, 1 + cnt);
+		xfs_bmbt_disk_set_all(arp, &rec);
+		cnt++;
 	}
 	ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork));
 	xfs_btree_set_numrecs(ablock, cnt);