History

md: add feature flag MD_FEATURE_RAID0_LAYOUT

Due to a bug introduced in Linux 3.14 we cannot determine the correctly layout for a multi-zone RAID0 array - there are two possibilities. It is possible to tell the kernel which to chose using a module parameter, but this can be clumsy to use. It would be best if the choice were recorded in the metadata. So add a feature flag for this purpose. If it is set, then the 'layout' field of the superblock is used to determine which layout to use. If this flag is not set, then mddev->layout gets set to -1, which causes the module parameter to be required.

NeilBrown committed 7 years ago

Commit 33f2c351 parent c84a1373 files · +18 −0Browse files

Unified · Split

3 files
  1. drivers/md/md.c +13 −0
  2. drivers/md/raid0.c +3 −0
  3. include/uapi/linux/raid/md_p.h +2 −0
drivers/md/md.c+13−0
@@ -1237,6 +1237,8 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) · 1236 unmodified lines
12371237 mddev->new_layout = mddev->layout;
12381238 mddev->new_chunk_sectors = mddev->chunk_sectors;
12391239 }
1240+ if (mddev->level == 0)
1241+ mddev->layout = -1;
12401242
12411243 if (sb->state & (1<<MD_SB_CLEAN))
12421244 mddev->recovery_cp = MaxSector;
@@ -1652,6 +1654,10 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ · 409 unmodified lines
16521654 rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset;
16531655 }
16541656
1657+ if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT) &&
1658+ sb->level != 0)
1659+ return -EINVAL;
1660+
16551661 if (!refdev) {
16561662 ret = 1;
16571663 } else {
@@ -1762,6 +1768,10 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) · 104 unmodified lines
17621768 mddev->new_chunk_sectors = mddev->chunk_sectors;
17631769 }
17641770
1771+ if (mddev->level == 0 &&
1772+ !(le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT))
1773+ mddev->layout = -1;
1774+
17651775 if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)
17661776 set_bit(MD_HAS_JOURNAL, &mddev->flags);
17671777
@@ -6898,6 +6908,9 @@ static int set_array_info(struct mddev *mddev, mdu_array_info_t *info) · 5130 unmodified lines
68986908 mddev->external = 0;
68996909
69006910 mddev->layout = info->layout;
6911+ if (mddev->level == 0)
6912+ /* Cannot trust RAID0 layout info here */
6913+ mddev->layout = -1;
69016914 mddev->chunk_sectors = info->chunk_size >> 9;
69026915
69036916 if (mddev->persistent) {
drivers/md/raid0.c+3−0
@@ -145,6 +145,9 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf) · 144 unmodified lines
145145
146146 if (conf->nr_strip_zones == 1) {
147147 conf->layout = RAID0_ORIG_LAYOUT;
148+ } else if (mddev->layout == RAID0_ORIG_LAYOUT ||
149+ mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) {
150+ conf->layout = mddev->layout;
148151 } else if (default_layout == RAID0_ORIG_LAYOUT ||
149152 default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
150153 conf->layout = default_layout;
include/uapi/linux/raid/md_p.h+2−0
@@ -329,6 +329,7 @@ struct mdp_superblock_1 { · 328 unmodified lines
329329 #define MD_FEATURE_JOURNAL 512 /* support write cache */
330330 #define MD_FEATURE_PPL 1024 /* support PPL */
331331 #define MD_FEATURE_MULTIPLE_PPLS 2048 /* support for multiple PPLs */
332+#define MD_FEATURE_RAID0_LAYOUT 4096 /* layout is meaningful for RAID0 */
332333 #define MD_FEATURE_ALL (MD_FEATURE_BITMAP_OFFSET \
333334 |MD_FEATURE_RECOVERY_OFFSET \
334335 |MD_FEATURE_RESHAPE_ACTIVE \
@@ -341,6 +342,7 @@ struct mdp_superblock_1 { · 6 unmodified lines
341342 |MD_FEATURE_JOURNAL \
342343 |MD_FEATURE_PPL \
343344 |MD_FEATURE_MULTIPLE_PPLS \
345+ |MD_FEATURE_RAID0_LAYOUT \
344346 )
345347
346348 struct r5l_payload_header {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t