]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: reorganize logic at free_extent_buffer() for better readability
authorFilipe Manana <fdmanana@suse.com>
Tue, 19 Aug 2025 01:15:28 +0000 (21:15 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:34:33 +0000 (16:34 +0200)
[ Upstream commit 71c086b30d4373a01bd5627f54516a72891a026a ]

It's hard to read the logic to break out of the while loop since it's a
very long expression consisting of a logical or of two composite
expressions, each one composed by a logical and. Further each one is also
testing for the EXTENT_BUFFER_UNMAPPED bit, making it more verbose than
necessary.

So change from this:

    if ((!test_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags) && refs <= 3)
        || (test_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags) &&
            refs == 1))
       break;

To this:

    if (test_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags)) {
        if (refs == 1)
            break;
    } else if (refs <= 3) {
            break;
    }

At least on x86_64 using gcc 9.3.0, this doesn't change the object size.

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Stable-dep-of: ad580dfa388f ("btrfs: fix subpage deadlock in try_release_subpage_extent_buffer()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/extent_io.c

index 1dc931c4937fc01707a13b20110ff946a87a6025..8590f8a4a1393f31b37feeb39dc4d3e70a72757b 100644 (file)
@@ -3486,10 +3486,13 @@ void free_extent_buffer(struct extent_buffer *eb)
 
        refs = atomic_read(&eb->refs);
        while (1) {
-               if ((!test_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags) && refs <= 3)
-                   || (test_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags) &&
-                       refs == 1))
+               if (test_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags)) {
+                       if (refs == 1)
+                               break;
+               } else if (refs <= 3) {
                        break;
+               }
+
                if (atomic_try_cmpxchg(&eb->refs, &refs, refs - 1))
                        return;
        }