diff options
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/raid5.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 37835538b58e..39374230a463 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -4316,6 +4316,15 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks) | |||
4316 | return sectors * (raid_disks - conf->max_degraded); | 4316 | return sectors * (raid_disks - conf->max_degraded); |
4317 | } | 4317 | } |
4318 | 4318 | ||
4319 | static void free_conf(raid5_conf_t *conf) | ||
4320 | { | ||
4321 | shrink_stripes(conf); | ||
4322 | safe_put_page(conf->spare_page); | ||
4323 | kfree(conf->disks); | ||
4324 | kfree(conf->stripe_hashtbl); | ||
4325 | kfree(conf); | ||
4326 | } | ||
4327 | |||
4319 | static raid5_conf_t *setup_conf(mddev_t *mddev) | 4328 | static raid5_conf_t *setup_conf(mddev_t *mddev) |
4320 | { | 4329 | { |
4321 | raid5_conf_t *conf; | 4330 | raid5_conf_t *conf; |
@@ -4447,11 +4456,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev) | |||
4447 | 4456 | ||
4448 | abort: | 4457 | abort: |
4449 | if (conf) { | 4458 | if (conf) { |
4450 | shrink_stripes(conf); | 4459 | free_conf(conf); |
4451 | safe_put_page(conf->spare_page); | ||
4452 | kfree(conf->disks); | ||
4453 | kfree(conf->stripe_hashtbl); | ||
4454 | kfree(conf); | ||
4455 | return ERR_PTR(-EIO); | 4460 | return ERR_PTR(-EIO); |
4456 | } else | 4461 | } else |
4457 | return ERR_PTR(-ENOMEM); | 4462 | return ERR_PTR(-ENOMEM); |
@@ -4629,12 +4634,8 @@ abort: | |||
4629 | md_unregister_thread(mddev->thread); | 4634 | md_unregister_thread(mddev->thread); |
4630 | mddev->thread = NULL; | 4635 | mddev->thread = NULL; |
4631 | if (conf) { | 4636 | if (conf) { |
4632 | shrink_stripes(conf); | ||
4633 | print_raid5_conf(conf); | 4637 | print_raid5_conf(conf); |
4634 | safe_put_page(conf->spare_page); | 4638 | free_conf(conf); |
4635 | kfree(conf->disks); | ||
4636 | kfree(conf->stripe_hashtbl); | ||
4637 | kfree(conf); | ||
4638 | } | 4639 | } |
4639 | mddev->private = NULL; | 4640 | mddev->private = NULL; |
4640 | printk(KERN_ALERT "raid5: failed to run raid set %s\n", mdname(mddev)); | 4641 | printk(KERN_ALERT "raid5: failed to run raid set %s\n", mdname(mddev)); |
@@ -4649,13 +4650,10 @@ static int stop(mddev_t *mddev) | |||
4649 | 4650 | ||
4650 | md_unregister_thread(mddev->thread); | 4651 | md_unregister_thread(mddev->thread); |
4651 | mddev->thread = NULL; | 4652 | mddev->thread = NULL; |
4652 | shrink_stripes(conf); | ||
4653 | kfree(conf->stripe_hashtbl); | ||
4654 | mddev->queue->backing_dev_info.congested_fn = NULL; | 4653 | mddev->queue->backing_dev_info.congested_fn = NULL; |
4655 | blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ | 4654 | blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ |
4656 | sysfs_remove_group(&mddev->kobj, &raid5_attrs_group); | 4655 | sysfs_remove_group(&mddev->kobj, &raid5_attrs_group); |
4657 | kfree(conf->disks); | 4656 | free_conf(conf); |
4658 | kfree(conf); | ||
4659 | mddev->private = NULL; | 4657 | mddev->private = NULL; |
4660 | return 0; | 4658 | return 0; |
4661 | } | 4659 | } |