btrfs: don't clear CTL bits when trying to release extent state
authorJosef Bacik <josef@toxicpanda.com>
Fri, 9 Sep 2022 21:53:46 +0000 (17:53 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 26 Sep 2022 10:28:05 +0000 (12:28 +0200)
When trying to release the extent states due to memory pressure we'll
set all the bits except LOCKED, NODATASUM, and DELALLOC_NEW.  This
includes some of the CTL bits, which isn't really a problem but isn't
correct either.  Exclude the CTL bits from this clearing.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index ebab583..42a8d4a 100644 (file)
@@ -3388,15 +3388,17 @@ static int try_release_extent_state(struct extent_io_tree *tree,
        if (test_range_bit(tree, start, end, EXTENT_LOCKED, 0, NULL)) {
                ret = 0;
        } else {
+               u32 clear_bits = ~(EXTENT_LOCKED | EXTENT_NODATASUM |
+                                  EXTENT_DELALLOC_NEW | EXTENT_CTLBITS);
+
                /*
                 * At this point we can safely clear everything except the
                 * locked bit, the nodatasum bit and the delalloc new bit.
                 * The delalloc new bit will be cleared by ordered extent
                 * completion.
                 */
-               ret = __clear_extent_bit(tree, start, end,
-                        ~(EXTENT_LOCKED | EXTENT_NODATASUM | EXTENT_DELALLOC_NEW),
-                        0, NULL, mask, NULL);
+               ret = __clear_extent_bit(tree, start, end, clear_bits, 0, NULL,
+                                        mask, NULL);
 
                /* if clear_extent_bit failed for enomem reasons,
                 * we can't allow the release to continue.