btrfs-progs: mkfs: Warn user for minimal RAID5/6 devices setup
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Tue, 6 Sep 2016 15:35:06 +0000 (17:35 +0200)
committerDavid Sterba <dsterba@suse.com>
Wed, 21 Sep 2016 09:47:31 +0000 (11:47 +0200)
For RAID5, 2 devices setup is just RAID1 with more overhead.
For RAID6, 3 devices setup is RAID1 with 3 copies, not what most user
want.

So warn user at mkfs time for such case, and add explain in man pages.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Documentation/mkfs.btrfs.asciidoc
utils.c

index 98fe694..7d19a14 100644 (file)
@@ -263,18 +263,26 @@ There are the following block group types available:
 .2+^.<h| Profile   3+^.^h| Redundancy           .2+^.<h| Min/max devices
       ^.^h| Copies   ^.^h| Parity     ^.<h| Striping
 | single  | 1            |                |            | 1/any
-| DUP     | 2 / 1 device |                |            | 1/any ^(see note)^
+| DUP     | 2 / 1 device |                |            | 1/any ^(see note 1)^
 | RAID0   |              |                | 1 to N     | 2/any
 | RAID1   | 2            |                |            | 2/any
 | RAID10  | 2            |                | 1 to N     | 4/any
-| RAID5   | 1            | 1              | 2 to N - 1 | 2/any
-| RAID6   | 1            | 2              | 3 to N - 2 | 3/any
+| RAID5   | 1            | 1              | 2 to N - 1 | 2/any ^(see note 2)^
+| RAID6   | 1            | 2              | 3 to N - 2 | 3/any ^(see note 3)^
 |=============================================================
 
-'Note:' DUP may exist on more than 1 device if it starts on a single device and
+'Note 1:' DUP may exist on more than 1 device if it starts on a single device and
 another one is added. Since version 4.5.1, *mkfs.btrfs* will let you create DUP
 on multiple devices.
 
+'Note 2:' It's not recommended to use 2 devices with RAID5. In that case,
+parity stripe will contain the same data as the data stripe, making RAID5
+degraded to RAID1 with more overhead.
+
+'Note 3:' It's also not recommended to use 3 devices with RAID6, unless you
+want to get effectively 3 copies in a RAID1-like manner (but not exactly that).
+N-copies RAID1 is not implemented.
+
 DUP PROFILES ON A SINGLE DEVICE
 -------------------------------
 
diff --git a/utils.c b/utils.c
index cec7c73..a31840e 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -3280,6 +3280,7 @@ int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
        u64 dev_cnt, int mixed, int ssd)
 {
        u64 allowed = 0;
+       u64 profile = metadata_profile | data_profile;
 
        switch (dev_cnt) {
        default:
@@ -3294,8 +3295,7 @@ int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
                allowed |= BTRFS_BLOCK_GROUP_DUP;
        }
 
-       if (dev_cnt > 1 &&
-           ((metadata_profile | data_profile) & BTRFS_BLOCK_GROUP_DUP)) {
+       if (dev_cnt > 1 && profile & BTRFS_BLOCK_GROUP_DUP) {
                warning("DUP is not recommended on filesystem with multiple devices");
        }
        if (metadata_profile & ~allowed) {
@@ -3315,6 +3315,12 @@ int test_num_disk_vs_raid(u64 metadata_profile, u64 data_profile,
                return 1;
        }
 
+       if (dev_cnt == 3 && profile & BTRFS_BLOCK_GROUP_RAID6) {
+               warning("RAID6 is not recommended on filesystem with 3 devices only");
+       }
+       if (dev_cnt == 2 && profile & BTRFS_BLOCK_GROUP_RAID5) {
+               warning("RAID5 is not recommended on filesystem with 2 devices only");
+       }
        warning_on(!mixed && (data_profile & BTRFS_BLOCK_GROUP_DUP) && ssd,
                   "DUP may not actually lead to 2 copies on the device, see manual page");