Message ID | 20190925021327.90095-1-wqu@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: Fix a regression which we can't convert to SINGLE profile | expand |
On 9/25/19 10:13 AM, Qu Wenruo wrote: > [BUG] > With v5.3 kernel, we just can't convert to SINGLE profile by all means: > # btrfs balance start -f -dconvert=single $mnt > ERROR: error during balancing '/mnt/btrfs': Invalid argument > # dmesg -t | tail > validate_convert_profile: data profile=0x1000000000000 allowed=0x20 is_valid=1 final=0x1000000000000 ret=1 > BTRFS error (device dm-3): balance: invalid convert data profile single > > [CAUSE] > With the extra debug output added, it shows that the @allowed bit is > lacking the special in-memory only SINGLE profile bit. > > Thus we fail at that (profile & ~allowed) check. > > This regression is caused by commit 081db89b13cb ("btrfs: use raid_attr > to get allowed profiles for balance conversion") and the fact that we > don't use any bit to indicate SINGLE profile on-disk, but uses special > in-memory only bit to help distinguish different profiles. > > [FIX] > Add that BTRFS_AVAIL_ALLOC_BIT_SINGLE to @allowed, so the code should be > the same as it was and fix the regression. > > Reported-by: Chris Murphy <lists@colorremedies.com> > Fixes: 081db89b13cb ("btrfs: use raid_attr to get allowed profiles for balance conversion") > Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Anand Jain <anand.jain@oracle.com> Thanks, Anand
On Wed, Sep 25, 2019 at 10:13:27AM +0800, Qu Wenruo wrote: > [BUG] > With v5.3 kernel, we just can't convert to SINGLE profile by all means: > # btrfs balance start -f -dconvert=single $mnt > ERROR: error during balancing '/mnt/btrfs': Invalid argument > # dmesg -t | tail > validate_convert_profile: data profile=0x1000000000000 allowed=0x20 is_valid=1 final=0x1000000000000 ret=1 > BTRFS error (device dm-3): balance: invalid convert data profile single > > [CAUSE] > With the extra debug output added, it shows that the @allowed bit is > lacking the special in-memory only SINGLE profile bit. > > Thus we fail at that (profile & ~allowed) check. > > This regression is caused by commit 081db89b13cb ("btrfs: use raid_attr > to get allowed profiles for balance conversion") and the fact that we > don't use any bit to indicate SINGLE profile on-disk, but uses special > in-memory only bit to help distinguish different profiles. > > [FIX] > Add that BTRFS_AVAIL_ALLOC_BIT_SINGLE to @allowed, so the code should be > the same as it was and fix the regression. > > Reported-by: Chris Murphy <lists@colorremedies.com> > Fixes: 081db89b13cb ("btrfs: use raid_attr to get allowed profiles for balance conversion") > Signed-off-by: Qu Wenruo <wqu@suse.com> Added to misc-next, thanks.
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 05d328ce229f..1d9c856ea099 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -4072,7 +4072,14 @@ int btrfs_balance(struct btrfs_fs_info *fs_info, } num_devices = btrfs_num_devices(fs_info); - allowed = 0; + + /* + * SINGLE profile on-disk has no profile bit, but in-memory we have a + * special bit for it, to make it easier to distinguish. + * Thuss we need to manual set that bit, or kernel will refuse single + * profile. + */ + allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE; for (i = 0; i < ARRAY_SIZE(btrfs_raid_array); i++) if (num_devices >= btrfs_raid_array[i].devs_min) allowed |= btrfs_raid_array[i].bg_flag;
[BUG] With v5.3 kernel, we just can't convert to SINGLE profile by all means: # btrfs balance start -f -dconvert=single $mnt ERROR: error during balancing '/mnt/btrfs': Invalid argument # dmesg -t | tail validate_convert_profile: data profile=0x1000000000000 allowed=0x20 is_valid=1 final=0x1000000000000 ret=1 BTRFS error (device dm-3): balance: invalid convert data profile single [CAUSE] With the extra debug output added, it shows that the @allowed bit is lacking the special in-memory only SINGLE profile bit. Thus we fail at that (profile & ~allowed) check. This regression is caused by commit 081db89b13cb ("btrfs: use raid_attr to get allowed profiles for balance conversion") and the fact that we don't use any bit to indicate SINGLE profile on-disk, but uses special in-memory only bit to help distinguish different profiles. [FIX] Add that BTRFS_AVAIL_ALLOC_BIT_SINGLE to @allowed, so the code should be the same as it was and fix the regression. Reported-by: Chris Murphy <lists@colorremedies.com> Fixes: 081db89b13cb ("btrfs: use raid_attr to get allowed profiles for balance conversion") Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/volumes.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)