diff options
Diffstat (limited to 'drivers/md/raid0.c')
| -rw-r--r-- | drivers/md/raid0.c | 38 | 
1 files changed, 28 insertions, 10 deletions
| diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 62c8b6adac70..b59a77b31b90 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -356,7 +356,21 @@ static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks  	return array_sectors;  } -static void raid0_free(struct mddev *mddev, void *priv); +static void free_conf(struct mddev *mddev, struct r0conf *conf) +{ +	kfree(conf->strip_zone); +	kfree(conf->devlist); +	kfree(conf); +	mddev->private = NULL; +} + +static void raid0_free(struct mddev *mddev, void *priv) +{ +	struct r0conf *conf = priv; + +	free_conf(mddev, conf); +	acct_bioset_exit(mddev); +}  static int raid0_run(struct mddev *mddev)  { @@ -370,11 +384,16 @@ static int raid0_run(struct mddev *mddev)  	if (md_check_no_bitmap(mddev))  		return -EINVAL; +	if (acct_bioset_init(mddev)) { +		pr_err("md/raid0:%s: alloc acct bioset failed.\n", mdname(mddev)); +		return -ENOMEM; +	} +  	/* if private is not null, we are here after takeover */  	if (mddev->private == NULL) {  		ret = create_strip_zones(mddev, &conf);  		if (ret < 0) -			return ret; +			goto exit_acct_set;  		mddev->private = conf;  	}  	conf = mddev->private; @@ -413,17 +432,16 @@ static int raid0_run(struct mddev *mddev)  	dump_zones(mddev);  	ret = md_integrity_register(mddev); +	if (ret) +		goto free;  	return ret; -} -static void raid0_free(struct mddev *mddev, void *priv) -{ -	struct r0conf *conf = priv; - -	kfree(conf->strip_zone); -	kfree(conf->devlist); -	kfree(conf); +free: +	free_conf(mddev, conf); +exit_acct_set: +	acct_bioset_exit(mddev); +	return ret;  }  static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) |