btrfs: Fix a regression which we can't convert to SINGLE profile
diff mbox series

Message ID 20190925021327.90095-1-wqu@suse.com
State New
Headers show
Series
  • btrfs: Fix a regression which we can't convert to SINGLE profile
Related show

Commit Message

Qu WenRuo Sept. 25, 2019, 2:13 a.m. UTC
[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(-)

Comments

Anand Jain Sept. 25, 2019, 4:51 a.m. UTC | #1
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
David Sterba Sept. 25, 2019, 2 p.m. UTC | #2
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.

Patch
diff mbox series

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;