]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: add comment about list_is_singular() use at btrfs_delete_unused_bgs()
authorFilipe Manana <fdmanana@suse.com>
Thu, 25 Jan 2024 09:53:26 +0000 (09:53 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 4 Mar 2024 15:24:46 +0000 (16:24 +0100)
At btrfs_delete_unused_bgs(), the use of the list_is_singular() check on
a block group may not be immediately obvious. It is there to prevent
losing raid profile information for a block group type (data, metadata or
system), as that information is removed from
fs_info->avail_[data|metadata|system]_alloc_bits when the last block group
of a given type is deleted. So deleting the block group would later result
in creating block groups of that type with a single profile (because
fs_info->avail_*_alloc_bits would have a value of 0).

This check was added in commit aefbe9a633b5 ("btrfs: Fix lost-data-profile
caused by auto removing bg").

So add a comment mentioning the need for the check.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
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>
fs/btrfs/block-group.c

index e9e455fd528a1fed669f49040ac036facb703c77..78cae9f9deca912932b59523d94c6f93e3dd3ffa 100644 (file)
@@ -1522,6 +1522,13 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info)
                         * outstanding allocations in this block group.  We do
                         * the ro check in case balance is currently acting on
                         * this block group.
+                        *
+                        * Also bail out if this is the only block group for its
+                        * type, because otherwise we would lose profile
+                        * information from fs_info->avail_*_alloc_bits and the
+                        * next block group of this type would be created with a
+                        * "single" profile (even if we're in a raid fs) because
+                        * fs_info->avail_*_alloc_bits would be 0.
                         */
                        trace_btrfs_skip_unused_block_group(block_group);
                        spin_unlock(&block_group->lock);