| From d38daaf7c3c941cac66ad3661603c25789afad6d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 19 Nov 2020 15:17:50 -0800 |
| Subject: xfs: revert "xfs: fix rmap key and record comparison functions" |
| |
| From: Darrick J. Wong <darrick.wong@oracle.com> |
| |
| [ Upstream commit eb8409071a1d47e3593cfe077107ac46853182ab ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| 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 77528f413286b..f79cf040d7450 100644 |
| --- a/fs/xfs/libxfs/xfs_rmap_btree.c |
| +++ b/fs/xfs/libxfs/xfs_rmap_btree.c |
| @@ -247,8 +247,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) |
| @@ -279,8 +279,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) |
| @@ -393,8 +393,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; |
| @@ -423,8 +423,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; |
| -- |
| 2.27.0 |
| |