Skip to content

Commit

Permalink
btrfs: raid56: clear incompat block group flags after removing the la…
Browse files Browse the repository at this point in the history
…st one

The incompat bit for RAID56 is set either at mount time or automatically
when the profile is used by balance. The part where the bit is removed
is missing and can be unexpected or undesired when an older kernel is
needed.

This patch will drop the incompat bit after this command, assuming
that RAID5 profile is not used by system or metadata:

 $ btrfs balance start -dconvert=raid5 /mnt
 $ btrfs balance start -dconvert=raid1 /mnt

This will print "clearing 128 feature flag" to the system log.

The patch is safe for backporting to older kernels.

Reported-by: Hugo Mills <hugo@carfax.org.uk>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
kdave committed Jun 20, 2019
1 parent 0ecb83d commit 93a0b7b
Showing 1 changed file with 30 additions and 0 deletions.
30 changes: 30 additions & 0 deletions fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -10606,6 +10606,35 @@ static void clear_avail_alloc_bits(struct btrfs_fs_info *fs_info, u64 flags)
write_sequnlock(&fs_info->profiles_lock);
}

/*
* Clear incompat bits for the following feature(s):
*
* - RAID56 - in case there's neither RAID5 nor RAID6 profile block group
* in the whole filesystem
*/
static void clear_incompat_bg_bits(struct btrfs_fs_info *fs_info, u64 flags)
{
if (flags & BTRFS_BLOCK_GROUP_RAID56_MASK) {
struct list_head *head = &fs_info->space_info;
struct btrfs_space_info *sinfo;

list_for_each_entry_rcu(sinfo, head, list) {
bool found = false;

down_read(&sinfo->groups_sem);
if (!list_empty(&sinfo->block_groups[BTRFS_RAID_RAID5]))
found = true;
if (!list_empty(&sinfo->block_groups[BTRFS_RAID_RAID6]))
found = true;
up_read(&sinfo->groups_sem);

if (found)
return;
}
btrfs_clear_fs_incompat(fs_info, RAID56);
}
}

int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
u64 group_start, struct extent_map *em)
{
Expand Down Expand Up @@ -10752,6 +10781,7 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans,
clear_avail_alloc_bits(fs_info, block_group->flags);
}
up_write(&block_group->space_info->groups_sem);
clear_incompat_bg_bits(fs_info, block_group->flags);
if (kobj) {
kobject_del(kobj);
kobject_put(kobj);
Expand Down

0 comments on commit 93a0b7b

Please sign in to comment.