aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid10.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2013-07-02 01:58:05 -0400
committerNeilBrown <neilb@suse.de>2013-07-02 19:43:28 -0400
commit78eaa0d4cbcdb345992fa3dd22b3bcbb473cc064 (patch)
treeaf855b75f643950b6468ca1bb03daaeb5523286b /drivers/md/raid10.c
parent0baac4db56b1895743391a348ee9ce4ae5076f9f (diff)
md/raid10: fix two bugs affecting RAID10 reshape.
1/ If a RAID10 is being reshaped to a fewer number of devices and is stopped while this is ongoing, then when the array is reassembled the 'mirrors' array will be allocated too small. This will lead to an access error or memory corruption. 2/ A sanity test for a reshaping RAID10 array is restarted is slightly incorrect. Due to the first bug, this is suitable for any -stable kernel since 3.5 where this code was introduced. Cc: stable@vger.kernel.org (v3.5+) Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/raid10.c')
-rw-r--r--drivers/md/raid10.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index aa8ba0760cac..3480bf7c20d4 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -3554,7 +3554,7 @@ static struct r10conf *setup_conf(struct mddev *mddev)
3554 3554
3555 /* FIXME calc properly */ 3555 /* FIXME calc properly */
3556 conf->mirrors = kzalloc(sizeof(struct raid10_info)*(mddev->raid_disks + 3556 conf->mirrors = kzalloc(sizeof(struct raid10_info)*(mddev->raid_disks +
3557 max(0,mddev->delta_disks)), 3557 max(0,-mddev->delta_disks)),
3558 GFP_KERNEL); 3558 GFP_KERNEL);
3559 if (!conf->mirrors) 3559 if (!conf->mirrors)
3560 goto out; 3560 goto out;
@@ -3713,7 +3713,7 @@ static int run(struct mddev *mddev)
3713 conf->geo.far_offset == 0) 3713 conf->geo.far_offset == 0)
3714 goto out_free_conf; 3714 goto out_free_conf;
3715 if (conf->prev.far_copies != 1 && 3715 if (conf->prev.far_copies != 1 &&
3716 conf->geo.far_offset == 0) 3716 conf->prev.far_offset == 0)
3717 goto out_free_conf; 3717 goto out_free_conf;
3718 } 3718 }
3719 3719