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>

authored by

Heinz Mauelshagen and committed by
Mike Snitzer
9e7d9367 a3c06a38

+12
+12
drivers/md/dm-raid.c
··· 860 { 861 unsigned long min_region_size = rs->ti->len / (1 << 21); 862 863 if (!region_size) { 864 /* 865 * Choose a reasonable default. All figures in sectors. ··· 932 rebuild_cnt++; 933 934 switch (rs->raid_type->level) { 935 case 1: 936 if (rebuild_cnt >= rs->md.raid_disks) 937 goto too_many; ··· 2339 case 0: 2340 break; 2341 default: 2342 dev = container_of(rdev, struct raid_dev, rdev); 2343 if (dev->meta_dev) 2344 dm_put_device(ti, dev->meta_dev);
··· 860 { 861 unsigned long min_region_size = rs->ti->len / (1 << 21); 862 863 + if (rs_is_raid0(rs)) 864 + return 0; 865 + 866 if (!region_size) { 867 /* 868 * Choose a reasonable default. All figures in sectors. ··· 929 rebuild_cnt++; 930 931 switch (rs->raid_type->level) { 932 + case 0: 933 + break; 934 case 1: 935 if (rebuild_cnt >= rs->md.raid_disks) 936 goto too_many; ··· 2334 case 0: 2335 break; 2336 default: 2337 + /* 2338 + * We have to keep any raid0 data/metadata device pairs or 2339 + * the MD raid0 personality will fail to start the array. 2340 + */ 2341 + if (rs_is_raid0(rs)) 2342 + continue; 2343 + 2344 dev = container_of(rdev, struct raid_dev, rdev); 2345 if (dev->meta_dev) 2346 dm_put_device(ti, dev->meta_dev);