summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid.c
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2017-06-30 09:45:58 -0400
committerMike Snitzer <snitzer@redhat.com>2017-06-30 10:15:52 -0400
commit4d49f1b4a1fcab16b6dd1c79ef14f2b6531d50a6 (patch)
treef754d4b98f1f9db0814290f64a5c0e41a2cd1638 /drivers/md/dm-raid.c
parent3b1a94c88b798d4f3bd1a5b61f5c8fb9d987c242 (diff)
dm raid: stop using BUG() in __rdev_sectors()
Return 0 rather than BUG() if __rdev_sectors() fails and catch invalid rdev size in the constructor. Reported-by: Hannes Reinecke <hare@suse.de> Cc: stable@vger.kernel.org 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.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index 7d893228c40f..67b3eb23e771 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -1571,7 +1571,7 @@ static sector_t __rdev_sectors(struct raid_set *rs)
1571 return rdev->sectors; 1571 return rdev->sectors;
1572 } 1572 }
1573 1573
1574 BUG(); /* Constructor ensures we got some. */ 1574 return 0;
1575} 1575}
1576 1576
1577/* Calculate the sectors per device and per array used for @rs */ 1577/* Calculate the sectors per device and per array used for @rs */
@@ -2930,7 +2930,7 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
2930 bool resize; 2930 bool resize;
2931 struct raid_type *rt; 2931 struct raid_type *rt;
2932 unsigned int num_raid_params, num_raid_devs; 2932 unsigned int num_raid_params, num_raid_devs;
2933 sector_t calculated_dev_sectors; 2933 sector_t calculated_dev_sectors, rdev_sectors;
2934 struct raid_set *rs = NULL; 2934 struct raid_set *rs = NULL;
2935 const char *arg; 2935 const char *arg;
2936 struct rs_layout rs_layout; 2936 struct rs_layout rs_layout;
@@ -3006,7 +3006,14 @@ static int raid_ctr(struct dm_target *ti, unsigned int argc, char **argv)
3006 if (r) 3006 if (r)
3007 goto bad; 3007 goto bad;
3008 3008
3009 resize = calculated_dev_sectors != __rdev_sectors(rs); 3009 rdev_sectors = __rdev_sectors(rs);
3010 if (!rdev_sectors) {
3011 ti->error = "Invalid rdev size";
3012 r = -EINVAL;
3013 goto bad;
3014 }
3015
3016 resize = calculated_dev_sectors != rdev_sectors;
3010 3017
3011 INIT_WORK(&rs->md.event_work, do_table_event); 3018 INIT_WORK(&rs->md.event_work, do_table_event);
3012 ti->private = rs; 3019 ti->private = rs;