btrfs-progs: tune: reject csum change if the fs is already using the target csum type

Currently "btrfstune --csum" allows us to change the csum to the same
one, this is good for testing but not good for end users, as if the end
user interrupts it, they have to resume the change (even it's to the
same csum type) until it finished, or kernel would reject such fs.

Furthermore, we never change the super block csum type until we
completely changed the csum type, thus for resume cases, the fs would
still show up as using the old csum type thus won't cause any problem
resuming.

So here we just reject the csum conversion if the target csum type is
the same as the existing csum type.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Qu Wenruo 2023-05-24 15:41:30 +08:00 committed by David Sterba
parent 03b4952971
commit 4d5711f4dd
1 changed files with 8 additions and 2 deletions

View File

@ -29,7 +29,7 @@
#include "common/utils.h"
#include "tune/tune.h"
static int check_csum_change_requreiment(struct btrfs_fs_info *fs_info)
static int check_csum_change_requreiment(struct btrfs_fs_info *fs_info, u16 new_csum_type)
{
struct btrfs_root *tree_root = fs_info->tree_root;
struct btrfs_root *dev_root = fs_info->dev_root;
@ -75,6 +75,12 @@ static int check_csum_change_requreiment(struct btrfs_fs_info *fs_info)
error("running dev-replace detected, please finish or cancel it.");
return -EINVAL;
}
if (fs_info->csum_type == new_csum_type) {
error("the fs is already using csum type %s (%u)",
btrfs_super_csum_name(new_csum_type), new_csum_type);
return -EINVAL;
}
return 0;
}
@ -1002,7 +1008,7 @@ int btrfs_change_csum_type(struct btrfs_fs_info *fs_info, u16 new_csum_type)
int ret;
/* Phase 0, check conflicting features. */
ret = check_csum_change_requreiment(fs_info);
ret = check_csum_change_requreiment(fs_info, new_csum_type);
if (ret < 0)
return ret;