diff mbox series

xfs: revert "xfs: fix rmap key and record comparison functions"

Message ID 20201119233943.GG9695@magnolia (mailing list archive)
State Accepted, archived
Headers show
Series xfs: revert "xfs: fix rmap key and record comparison functions" | expand

Commit Message

Darrick J. Wong Nov. 19, 2020, 11:39 p.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

This reverts commit 6ff646b2ceb0eec916101877f38da0b73e3a5b7f.

Your maintainer committed a major braino in the rmap code by adding the
attr fork, bmbt, and unwritten extent usage bits into rmap record key
comparisons.  While XFS uses the usage bits *in the rmap records* for
cross-referencing metadata in xfs_scrub and xfs_repair, it only needs
the owner and offset information to distinguish between reverse mappings
of the same physical extent into the data fork of a file at multiple
offsets.  The other bits are not important for key comparisons for index
lookups, and never have been.

Eric Sandeen reports that this causes regressions in generic/299, so
undo this patch before it does more damage.

Reported-by: Eric Sandeen <sandeen@sandeen.net>
Fixes: 6ff646b2ceb0 ("xfs: fix rmap key and record comparison functions")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/libxfs/xfs_rmap_btree.c |   16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Eric Sandeen Nov. 19, 2020, 11:44 p.m. UTC | #1
On 11/19/20 5:39 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> This reverts commit 6ff646b2ceb0eec916101877f38da0b73e3a5b7f.
> 
> Your maintainer committed a major braino in the rmap code by adding the
> attr fork, bmbt, and unwritten extent usage bits into rmap record key
> comparisons.  While XFS uses the usage bits *in the rmap records* for
> cross-referencing metadata in xfs_scrub and xfs_repair, it only needs
> the owner and offset information to distinguish between reverse mappings
> of the same physical extent into the data fork of a file at multiple
> offsets.  The other bits are not important for key comparisons for index
> lookups, and never have been.
> 
> Eric Sandeen reports that this causes regressions in generic/299, so
> undo this patch before it does more damage.
> 
> Reported-by: Eric Sandeen <sandeen@sandeen.net>
> Fixes: 6ff646b2ceb0 ("xfs: fix rmap key and record comparison functions")
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Reviewed-by: Eric Sandeen <sandeen@redhat.com>

> ---
>  fs/xfs/libxfs/xfs_rmap_btree.c |   16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c
> index 577a66381327..beb81c84a937 100644
> --- a/fs/xfs/libxfs/xfs_rmap_btree.c
> +++ b/fs/xfs/libxfs/xfs_rmap_btree.c
> @@ -243,8 +243,8 @@ xfs_rmapbt_key_diff(
>  	else if (y > x)
>  		return -1;
>  
> -	x = be64_to_cpu(kp->rm_offset);
> -	y = xfs_rmap_irec_offset_pack(rec);
> +	x = XFS_RMAP_OFF(be64_to_cpu(kp->rm_offset));
> +	y = rec->rm_offset;
>  	if (x > y)
>  		return 1;
>  	else if (y > x)
> @@ -275,8 +275,8 @@ xfs_rmapbt_diff_two_keys(
>  	else if (y > x)
>  		return -1;
>  
> -	x = be64_to_cpu(kp1->rm_offset);
> -	y = be64_to_cpu(kp2->rm_offset);
> +	x = XFS_RMAP_OFF(be64_to_cpu(kp1->rm_offset));
> +	y = XFS_RMAP_OFF(be64_to_cpu(kp2->rm_offset));
>  	if (x > y)
>  		return 1;
>  	else if (y > x)
> @@ -390,8 +390,8 @@ xfs_rmapbt_keys_inorder(
>  		return 1;
>  	else if (a > b)
>  		return 0;
> -	a = be64_to_cpu(k1->rmap.rm_offset);
> -	b = be64_to_cpu(k2->rmap.rm_offset);
> +	a = XFS_RMAP_OFF(be64_to_cpu(k1->rmap.rm_offset));
> +	b = XFS_RMAP_OFF(be64_to_cpu(k2->rmap.rm_offset));
>  	if (a <= b)
>  		return 1;
>  	return 0;
> @@ -420,8 +420,8 @@ xfs_rmapbt_recs_inorder(
>  		return 1;
>  	else if (a > b)
>  		return 0;
> -	a = be64_to_cpu(r1->rmap.rm_offset);
> -	b = be64_to_cpu(r2->rmap.rm_offset);
> +	a = XFS_RMAP_OFF(be64_to_cpu(r1->rmap.rm_offset));
> +	b = XFS_RMAP_OFF(be64_to_cpu(r2->rmap.rm_offset));
>  	if (a <= b)
>  		return 1;
>  	return 0;
>
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c
index 577a66381327..beb81c84a937 100644
--- a/fs/xfs/libxfs/xfs_rmap_btree.c
+++ b/fs/xfs/libxfs/xfs_rmap_btree.c
@@ -243,8 +243,8 @@  xfs_rmapbt_key_diff(
 	else if (y > x)
 		return -1;
 
-	x = be64_to_cpu(kp->rm_offset);
-	y = xfs_rmap_irec_offset_pack(rec);
+	x = XFS_RMAP_OFF(be64_to_cpu(kp->rm_offset));
+	y = rec->rm_offset;
 	if (x > y)
 		return 1;
 	else if (y > x)
@@ -275,8 +275,8 @@  xfs_rmapbt_diff_two_keys(
 	else if (y > x)
 		return -1;
 
-	x = be64_to_cpu(kp1->rm_offset);
-	y = be64_to_cpu(kp2->rm_offset);
+	x = XFS_RMAP_OFF(be64_to_cpu(kp1->rm_offset));
+	y = XFS_RMAP_OFF(be64_to_cpu(kp2->rm_offset));
 	if (x > y)
 		return 1;
 	else if (y > x)
@@ -390,8 +390,8 @@  xfs_rmapbt_keys_inorder(
 		return 1;
 	else if (a > b)
 		return 0;
-	a = be64_to_cpu(k1->rmap.rm_offset);
-	b = be64_to_cpu(k2->rmap.rm_offset);
+	a = XFS_RMAP_OFF(be64_to_cpu(k1->rmap.rm_offset));
+	b = XFS_RMAP_OFF(be64_to_cpu(k2->rmap.rm_offset));
 	if (a <= b)
 		return 1;
 	return 0;
@@ -420,8 +420,8 @@  xfs_rmapbt_recs_inorder(
 		return 1;
 	else if (a > b)
 		return 0;
-	a = be64_to_cpu(r1->rmap.rm_offset);
-	b = be64_to_cpu(r2->rmap.rm_offset);
+	a = XFS_RMAP_OFF(be64_to_cpu(r1->rmap.rm_offset));
+	b = XFS_RMAP_OFF(be64_to_cpu(r2->rmap.rm_offset));
 	if (a <= b)
 		return 1;
 	return 0;