btrfs-progs: mkfs: check metadata redundancy
Currently BTRFS allows you to make bad choices of data and metadata levels. For example -d raid1 -m raid0 means you can only use half your total disk space, but will lose everything if 1 disk fails. It should give a warning in these cases. When making a filesystem, check that metadata mode is at least as redundant as the data mode. For example give warning when: -d raid1 -m raid0 Signed-off-by: Sam Tygier <samtygier@yahoo.co.uk> [make the check more visible in mkfs output] Signed-off-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
parent
1e9a6b6984
commit
fbb356632c
3 changed files with 25 additions and 0 deletions
6
mkfs.c
6
mkfs.c
|
@ -1429,6 +1429,12 @@ int main(int ac, char **av)
|
|||
nodesize * i;
|
||||
}
|
||||
|
||||
if (group_profile_max_safe_loss(metadata_profile) <
|
||||
group_profile_max_safe_loss(data_profile)){
|
||||
fprintf(stderr,
|
||||
"WARNING: metatdata has lower redundancy than data!\n\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* FS features that can be set by other means than -O
|
||||
* just set the bit here
|
||||
|
|
18
utils.c
18
utils.c
|
@ -2354,6 +2354,24 @@ int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int group_profile_max_safe_loss(u64 flags)
|
||||
{
|
||||
switch (flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
|
||||
case 0: /* single */
|
||||
case BTRFS_BLOCK_GROUP_DUP:
|
||||
case BTRFS_BLOCK_GROUP_RAID0:
|
||||
return 0;
|
||||
case BTRFS_BLOCK_GROUP_RAID1:
|
||||
case BTRFS_BLOCK_GROUP_RAID5:
|
||||
case BTRFS_BLOCK_GROUP_RAID10:
|
||||
return 1;
|
||||
case BTRFS_BLOCK_GROUP_RAID6:
|
||||
return 2;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if disk is suitable for btrfs
|
||||
* returns:
|
||||
* 1: something is wrong, estr provides the error
|
||||
|
|
1
utils.h
1
utils.h
|
@ -144,6 +144,7 @@ int test_dev_for_mkfs(char *file, int force_overwrite, char *estr);
|
|||
int get_label_mounted(const char *mount_path, char *labelp);
|
||||
int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
|
||||
u64 dev_cnt, int mixed, char *estr);
|
||||
int group_profile_max_safe_loss(u64 flags);
|
||||
int is_vol_small(char *file);
|
||||
int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf,
|
||||
int verify);
|
||||
|
|
Loading…
Reference in a new issue