aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid.c
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2016-08-17 09:36:44 -0400
committerMike Snitzer <snitzer@redhat.com>2016-08-17 10:42:39 -0400
commit9e7d9367e6a29e4cac85aa6df199f760dfa39c8a (patch)
treea48199ad035ece17f02a7c81c791f1329eede3e7 /drivers/md/dm-raid.c
parenta3c06a389751192fdcbcdd8bba57bdb856eafe68 (diff)
dm raid: support raid0 with missing metadata devices
The raid0 MD personality does not start a raid0 array with any of its data devices missing. dm-raid was removing data/metadata device pairs unconditionally if it failed to read a superblock off the respective metadata device of such pair, resulting in failure to start arrays with the raid0 personality. Avoid removing any data/metadata device pairs in case of raid0 (e.g. lvm2 segment type 'raid0_meta') thus allowing MD to start the array. Also, avoid region size validation for raid0. Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm-raid.c')
-rw-r--r--drivers/md/dm-raid.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index b1c251872800..8abde6b8cedc 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -860,6 +860,9 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size)
860{ 860{
861 unsigned long min_region_size = rs->ti->len / (1 << 21); 861 unsigned long min_region_size = rs->ti->len / (1 << 21);
862 862
863 if (rs_is_raid0(rs))
864 return 0;
865
863 if (!region_size) { 866 if (!region_size) {
864 /* 867 /*
865 * Choose a reasonable default. All figures in sectors. 868 * Choose a reasonable default. All figures in sectors.
@@ -929,6 +932,8 @@ static int validate_raid_redundancy(struct raid_set *rs)
929 rebuild_cnt++; 932 rebuild_cnt++;
930 933
931 switch (rs->raid_type->level) { 934 switch (rs->raid_type->level) {
935 case 0:
936 break;
932 case 1: 937 case 1:
933 if (rebuild_cnt >= rs->md.raid_disks) 938 if (rebuild_cnt >= rs->md.raid_disks)
934 goto too_many; 939 goto too_many;
@@ -2334,6 +2339,13 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
2334 case 0: 2339 case 0:
2335 break; 2340 break;
2336 default: 2341 default:
2342 /*
2343 * We have to keep any raid0 data/metadata device pairs or
2344 * the MD raid0 personality will fail to start the array.
2345 */
2346 if (rs_is_raid0(rs))
2347 continue;
2348
2337 dev = container_of(rdev, struct raid_dev, rdev); 2349 dev = container_of(rdev, struct raid_dev, rdev);
2338 if (dev->meta_dev) 2350 if (dev->meta_dev)
2339 dm_put_device(ti, dev->meta_dev); 2351 dm_put_device(ti, dev->meta_dev);