]> git.itanic.dy.fi Git - linux-stable/commitdiff
xfs: revert "xfs: fix rmap key and record comparison functions"
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 19 Nov 2020 23:17:50 +0000 (15:17 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Nov 2020 12:05:50 +0000 (13:05 +0100)
[ 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

index cd689d21d3af8e60446f7721957ff30b1371ca84..9d9c9192584c97dba7733f74e6892adb33f8b163 100644 (file)
@@ -262,8 +262,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)
@@ -294,8 +294,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)
@@ -400,8 +400,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;
@@ -430,8 +430,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;