Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a11034b4 authored by Dan Williams's avatar Dan Williams
Browse files

md/raid6: release spare page at ->stop()



Add missing call to safe_put_page from stop() by unifying open coded
raid5_conf_t de-allocation under free_conf().

Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 04ce9ab3
Loading
Loading
Loading
Loading
+12 −14
Original line number Original line Diff line number Diff line
@@ -4309,6 +4309,15 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)
	return sectors * (raid_disks - conf->max_degraded);
	return sectors * (raid_disks - conf->max_degraded);
}
}


static void free_conf(raid5_conf_t *conf)
{
	shrink_stripes(conf);
	safe_put_page(conf->spare_page);
	kfree(conf->disks);
	kfree(conf->stripe_hashtbl);
	kfree(conf);
}

static raid5_conf_t *setup_conf(mddev_t *mddev)
static raid5_conf_t *setup_conf(mddev_t *mddev)
{
{
	raid5_conf_t *conf;
	raid5_conf_t *conf;
@@ -4438,11 +4447,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev)


 abort:
 abort:
	if (conf) {
	if (conf) {
		shrink_stripes(conf);
		free_conf(conf);
		safe_put_page(conf->spare_page);
		kfree(conf->disks);
		kfree(conf->stripe_hashtbl);
		kfree(conf);
		return ERR_PTR(-EIO);
		return ERR_PTR(-EIO);
	} else
	} else
		return ERR_PTR(-ENOMEM);
		return ERR_PTR(-ENOMEM);
@@ -4608,12 +4613,8 @@ abort:
	md_unregister_thread(mddev->thread);
	md_unregister_thread(mddev->thread);
	mddev->thread = NULL;
	mddev->thread = NULL;
	if (conf) {
	if (conf) {
		shrink_stripes(conf);
		print_raid5_conf(conf);
		print_raid5_conf(conf);
		safe_put_page(conf->spare_page);
		free_conf(conf);
		kfree(conf->disks);
		kfree(conf->stripe_hashtbl);
		kfree(conf);
	}
	}
	mddev->private = NULL;
	mddev->private = NULL;
	printk(KERN_ALERT "raid5: failed to run raid set %s\n", mdname(mddev));
	printk(KERN_ALERT "raid5: failed to run raid set %s\n", mdname(mddev));
@@ -4628,13 +4629,10 @@ static int stop(mddev_t *mddev)


	md_unregister_thread(mddev->thread);
	md_unregister_thread(mddev->thread);
	mddev->thread = NULL;
	mddev->thread = NULL;
	shrink_stripes(conf);
	kfree(conf->stripe_hashtbl);
	mddev->queue->backing_dev_info.congested_fn = NULL;
	mddev->queue->backing_dev_info.congested_fn = NULL;
	blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
	blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
	sysfs_remove_group(&mddev->kobj, &raid5_attrs_group);
	sysfs_remove_group(&mddev->kobj, &raid5_attrs_group);
	kfree(conf->disks);
	free_conf(conf);
	kfree(conf);
	mddev->private = NULL;
	mddev->private = NULL;
	return 0;
	return 0;
}
}