]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: reduce block group critical section in btrfs_free_reserved_bytes()
authorFilipe Manana <fdmanana@suse.com>
Mon, 20 Oct 2025 11:47:26 +0000 (12:47 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 24 Nov 2025 21:14:06 +0000 (22:14 +0100)
There's no need to update the space_info fields (bytes_reserved,
max_extent_size, bytes_readonly, bytes_zone_unusable) while holding the
block group's spinlock. So move those updates to happen after we unlock
the block group (and while holding the space_info locked of course), so
that all we do under the block group's critical section is to update the
block group itself.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/block-group.c

index ebd4c514c2c85ffa0293e56af3e3625d79d186cb..856bda9c99d95ce4ca6f410cd07d3b5478c2ffce 100644 (file)
@@ -3858,21 +3858,24 @@ void btrfs_free_reserved_bytes(struct btrfs_block_group *cache, u64 num_bytes,
                               bool is_delalloc)
 {
        struct btrfs_space_info *space_info = cache->space_info;
+       bool bg_ro;
 
        spin_lock(&space_info->lock);
        spin_lock(&cache->lock);
-       if (cache->ro)
+       bg_ro = cache->ro;
+       cache->reserved -= num_bytes;
+       if (is_delalloc)
+               cache->delalloc_bytes -= num_bytes;
+       spin_unlock(&cache->lock);
+
+       if (bg_ro)
                space_info->bytes_readonly += num_bytes;
        else if (btrfs_is_zoned(cache->fs_info))
                space_info->bytes_zone_unusable += num_bytes;
-       cache->reserved -= num_bytes;
+
        space_info->bytes_reserved -= num_bytes;
        space_info->max_extent_size = 0;
 
-       if (is_delalloc)
-               cache->delalloc_bytes -= num_bytes;
-       spin_unlock(&cache->lock);
-
        btrfs_try_granting_tickets(space_info);
        spin_unlock(&space_info->lock);
 }