summaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2017-01-13 21:53:08 -0500
committerMike Snitzer <snitzer@redhat.com>2017-01-25 06:49:06 -0500
commit50c4feb9a3e3df9574d952a4ed2f009f8135e4c7 (patch)
treeed2c28382adcf71e3969f2f1ac256112e7e519c5 /drivers/md
parentc63ede3b4211e1e2489eda6a2efb0eb6fa26483a (diff)
dm raid: be prepared to accept arbitrary '- -' tuples
During raid set resize checks and setting up the recovery offset in case a raid set grows, calculated rd->md.dev_sectors is compared to rs->dev[0].rdev.sectors. Device 0 may not be defined in case userspace passes in '- -' for it (lvm2 doesn't do that so far), thus it's device sectors can't be taken authoritatively in this comparison and another valid device must be used to retrieve the device size. Use mddev->dev_sectors in checking for ongoing recovery for the same reason. Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm-raid.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index b40a088a2d92..d7e652a22a66 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -370,7 +370,7 @@ static bool rs_is_reshapable(struct raid_set *rs)
370/* Return true, if raid set in @rs is recovering */ 370/* Return true, if raid set in @rs is recovering */
371static bool rs_is_recovering(struct raid_set *rs) 371static bool rs_is_recovering(struct raid_set *rs)
372{ 372{
373 return rs->md.recovery_cp < rs->dev[0].rdev.sectors; 373 return rs->md.recovery_cp < rs->md.dev_sectors;
374} 374}
375 375
376/* Return true, if raid set in @rs is reshaping */ 376/* Return true, if raid set in @rs is reshaping */
@@ -1425,6 +1425,24 @@ static unsigned int rs_data_stripes(struct raid_set *rs)
1425 return rs->raid_disks - rs->raid_type->parity_devs; 1425 return rs->raid_disks - rs->raid_type->parity_devs;
1426} 1426}
1427 1427
1428/*
1429 * Retrieve rdev->sectors from any valid raid device of @rs
1430 * to allow userpace to pass in arbitray "- -" device tupples.
1431 */
1432static sector_t __rdev_sectors(struct raid_set *rs)
1433{
1434 int i;
1435
1436 for (i = 0; i < rs->md.raid_disks; i++) {
1437 struct md_rdev *rdev = &rs->dev[i].rdev;
1438
1439 if (rdev->bdev && rdev->sectors)
1440 return rdev->sectors;
1441 }
1442
1443 BUG(); /* Constructor ensures we got some. */
1444}
1445
1428/* Calculate the sectors per device and per array used for @rs */ 1446/* Calculate the sectors per device and per array used for @rs */
1429static int rs_set_dev_and_array_sectors(struct raid_set *rs, bool use_mddev) 1447static int rs_set_dev_and_array_sectors(struct raid_set *rs, bool use_mddev)
1430{ 1448{
@@ -1510,9 +1528,9 @@ static void rs_setup_recovery(struct raid_set *rs, sector_t dev_sectors)
1510 else if (dev_sectors == MaxSector) 1528 else if (dev_sectors == MaxSector)
1511 /* Prevent recovery */ 1529 /* Prevent recovery */
1512 __rs_setup_recovery(rs, MaxSector); 1530 __rs_setup_recovery(rs, MaxSector);
1513 else if (rs->dev[0].rdev.sectors < dev_sectors) 1531 else if (__rdev_sectors(rs) < dev_sectors)
1514 /* Grown raid set */ 1532 /* Grown raid set */
1515 __rs_setup_recovery(rs, rs->dev[0].rdev.sectors); 1533 __rs_setup_recovery(rs, __rdev_sectors(rs));
1516 else 1534 else
1517 __rs_setup_recovery(rs, MaxSector); 1535 __rs_setup_recovery(rs, MaxSector);
1518} 1536}
@@ -2828,7 +2846,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
2828 if (r) 2846 if (r)
2829 goto bad; 2847 goto bad;
2830 2848
2831 calculated_dev_sectors = rs->dev[0].rdev.sectors; 2849 calculated_dev_sectors = rs->md.dev_sectors;
2832 2850
2833 /* 2851 /*
2834 * Backup any new raid set level, layout, ... 2852 * Backup any new raid set level, layout, ...
@@ -2841,7 +2859,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
2841 if (r) 2859 if (r)
2842 goto bad; 2860 goto bad;
2843 2861
2844 resize = calculated_dev_sectors != rs->dev[0].rdev.sectors; 2862 resize = calculated_dev_sectors != __rdev_sectors(rs);
2845 2863
2846 INIT_WORK(&rs->md.event_work, do_table_event); 2864 INIT_WORK(&rs->md.event_work, do_table_event);
2847 ti->private = rs; 2865 ti->private = rs;