db07609875
segfaults from bnc#710486 due to unchecked usage of return value of open_ctree() [fixed compilation warnings] - pull upstream, replace existing patches, spec update - update 'restore' utility - lzo support - tools may now take earlies superblock when opening the fs - other fixes - pull integration-20111030 branch - mkfs: force mkfs if desired - other fixes - add btrfs-dump-super to mkinitrd - other fixes - skip non-existent devices or without media - documentation updates - scrubbing single device - graceful error handling when opening fs fails - updated mkinitrd script to scan devices before mount (bnc#727383) OBS-URL: https://build.opensuse.org/package/show/filesystems/btrfsprogs?expand=0&rev=115
131 lines
4.0 KiB
Diff
131 lines
4.0 KiB
Diff
From 6b74bd1ecd84d86cad6aaa1fd643de6f3f3c40b8 Mon Sep 17 00:00:00 2001
|
|
From: Ilya Dryomov <idryomov@gmail.com>
|
|
Date: Tue, 1 Nov 2011 23:27:39 +0200
|
|
Subject: [PATCH 136/138] Btrfs-progs: change the way mkfs picks raid profiles
|
|
|
|
Currently mkfs in response to
|
|
|
|
mkfs.btrfs -d raid10 dev1 dev2
|
|
|
|
instead of telling "you can't do that" creates a SINGLE on two devices,
|
|
and only rebalance can transform it to raid0. Generally, it never warns
|
|
users about decisions it makes and it's not at all obvious which profile
|
|
it picks when.
|
|
|
|
Fix this by checking the number of effective devices and reporting back
|
|
if the specified profile is impossible to create. Do not create FS in
|
|
case invalid profile was given.
|
|
|
|
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
|
|
---
|
|
mkfs.c | 46 +++++++++++++++++++++++++++++++++++-----------
|
|
1 files changed, 35 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/mkfs.c b/mkfs.c
|
|
index be236d0..d39c5a7 100644
|
|
--- a/mkfs.c
|
|
+++ b/mkfs.c
|
|
@@ -228,12 +228,26 @@ static int create_one_raid_group(struct btrfs_trans_handle *trans,
|
|
|
|
static int create_raid_groups(struct btrfs_trans_handle *trans,
|
|
struct btrfs_root *root, u64 data_profile,
|
|
- u64 metadata_profile, int mixed)
|
|
+ int data_profile_opt, u64 metadata_profile,
|
|
+ int metadata_profile_opt, int mixed)
|
|
{
|
|
u64 num_devices = btrfs_super_num_devices(&root->fs_info->super_copy);
|
|
u64 allowed;
|
|
int ret;
|
|
|
|
+ /*
|
|
+ * Set default profiles according to number of added devices.
|
|
+ * For mixed groups defaults are single/single.
|
|
+ */
|
|
+ if (!metadata_profile_opt && !mixed) {
|
|
+ metadata_profile = (num_devices > 1) ?
|
|
+ BTRFS_BLOCK_GROUP_RAID1 : BTRFS_BLOCK_GROUP_DUP;
|
|
+ }
|
|
+ if (!data_profile_opt && !mixed) {
|
|
+ data_profile = (num_devices > 1) ?
|
|
+ BTRFS_BLOCK_GROUP_RAID0 : 0; /* raid0 or single */
|
|
+ }
|
|
+
|
|
if (num_devices == 1)
|
|
allowed = BTRFS_BLOCK_GROUP_DUP;
|
|
else if (num_devices >= 4) {
|
|
@@ -242,6 +256,19 @@ static int create_raid_groups(struct btrfs_trans_handle *trans,
|
|
} else
|
|
allowed = BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1;
|
|
|
|
+ if (metadata_profile & ~allowed) {
|
|
+ fprintf(stderr, "unable to create FS with metadata "
|
|
+ "profile %llu (%llu devices)\n", metadata_profile,
|
|
+ num_devices);
|
|
+ exit(1);
|
|
+ }
|
|
+ if (data_profile & ~allowed) {
|
|
+ fprintf(stderr, "unable to create FS with data "
|
|
+ "profile %llu (%llu devices)\n", data_profile,
|
|
+ num_devices);
|
|
+ exit(1);
|
|
+ }
|
|
+
|
|
if (allowed & metadata_profile) {
|
|
u64 meta_flags = BTRFS_BLOCK_GROUP_METADATA;
|
|
|
|
@@ -326,15 +353,16 @@ static u64 parse_profile(char *s)
|
|
if (strcmp(s, "raid0") == 0) {
|
|
return BTRFS_BLOCK_GROUP_RAID0;
|
|
} else if (strcmp(s, "raid1") == 0) {
|
|
- return BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_DUP;
|
|
+ return BTRFS_BLOCK_GROUP_RAID1;
|
|
} else if (strcmp(s, "raid10") == 0) {
|
|
- return BTRFS_BLOCK_GROUP_RAID10 | BTRFS_BLOCK_GROUP_DUP;
|
|
+ return BTRFS_BLOCK_GROUP_RAID10;
|
|
} else if (strcmp(s, "single") == 0) {
|
|
return 0;
|
|
} else {
|
|
fprintf(stderr, "Unknown option %s\n", s);
|
|
print_usage();
|
|
}
|
|
+ /* not reached */
|
|
return 0;
|
|
}
|
|
|
|
@@ -1172,8 +1200,8 @@ int main(int ac, char **av)
|
|
u64 dev_block_count = 0;
|
|
u64 blocks[7];
|
|
u64 alloc_start = 0;
|
|
- u64 metadata_profile = BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_DUP;
|
|
- u64 data_profile = BTRFS_BLOCK_GROUP_RAID0;
|
|
+ u64 metadata_profile = 0;
|
|
+ u64 data_profile = 0;
|
|
u32 leafsize = getpagesize();
|
|
u32 sectorsize = 4096;
|
|
u32 nodesize = leafsize;
|
|
@@ -1311,11 +1339,6 @@ int main(int ac, char **av)
|
|
}
|
|
}
|
|
if (mixed) {
|
|
- if (!metadata_profile_opt)
|
|
- metadata_profile = 0;
|
|
- if (!data_profile_opt)
|
|
- data_profile = 0;
|
|
-
|
|
if (metadata_profile != data_profile) {
|
|
fprintf(stderr, "With mixed block groups data and metadata "
|
|
"profiles must be the same\n");
|
|
@@ -1400,7 +1423,8 @@ int main(int ac, char **av)
|
|
raid_groups:
|
|
if (!source_dir_set) {
|
|
ret = create_raid_groups(trans, root, data_profile,
|
|
- metadata_profile, mixed);
|
|
+ data_profile_opt, metadata_profile,
|
|
+ metadata_profile_opt, mixed);
|
|
BUG_ON(ret);
|
|
}
|
|
|
|
--
|
|
1.7.6.233.gd79bc
|
|
|