xfs: fix xfs_rmap_has_other_keys usage of ECANCELED
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 1 May 2020 21:37:08 +0000 (17:37 -0400)
committerEric Sandeen <sandeen@redhat.com>
Fri, 1 May 2020 21:37:08 +0000 (17:37 -0400)
Source kernel commit: a71e4228e6f2a4fe6519d8ed081d0a164967fa31

In e7ee96dfb8c26, we converted all ITER_ABORT users to use ECANCELED
instead, but we forgot to teach xfs_rmap_has_other_keys not to return
that magic value to callers.  Fix it now by using ECANCELED both to
abort the iteration and to signal that we found another reverse mapping.
This enables us to drop the separate boolean flag.

Fixes: e7ee96dfb8c26 ("xfs: remove all *_ITER_ABORT values")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_rmap.c

index 10a17e41443a78041e67e2913e5cce5eef29ab98..c485c29dace0a9e219666293f43279a00d683b77 100644 (file)
@@ -2693,7 +2693,6 @@ struct xfs_rmap_key_state {
        uint64_t                        owner;
        uint64_t                        offset;
        unsigned int                    flags;
-       bool                            has_rmap;
 };
 
 /* For each rmap given, figure out if it doesn't match the key we want. */
@@ -2708,7 +2707,6 @@ xfs_rmap_has_other_keys_helper(
        if (rks->owner == rec->rm_owner && rks->offset == rec->rm_offset &&
            ((rks->flags & rec->rm_flags) & XFS_RMAP_KEY_FLAGS) == rks->flags)
                return 0;
-       rks->has_rmap = true;
        return -ECANCELED;
 }
 
@@ -2730,7 +2728,7 @@ xfs_rmap_has_other_keys(
        int                             error;
 
        xfs_owner_info_unpack(oinfo, &rks.owner, &rks.offset, &rks.flags);
-       rks.has_rmap = false;
+       *has_rmap = false;
 
        low.rm_startblock = bno;
        memset(&high, 0xFF, sizeof(high));
@@ -2738,11 +2736,12 @@ xfs_rmap_has_other_keys(
 
        error = xfs_rmap_query_range(cur, &low, &high,
                        xfs_rmap_has_other_keys_helper, &rks);
-       if (error < 0)
-               return error;
+       if (error == -ECANCELED) {
+               *has_rmap = true;
+               return 0;
+       }
 
-       *has_rmap = rks.has_rmap;
-       return 0;
+       return error;
 }
 
 const struct xfs_owner_info XFS_RMAP_OINFO_SKIP_UPDATE = {