It doesn't free memory when register integrity failed. And move free conf codes into a single function. Signed-off-by: Xiao Ni <xni@xxxxxxxxxx> --- drivers/md/raid0.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 62c8b6adac70..3fa47df1c60e 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -356,6 +356,7 @@ static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks return array_sectors; } +static void free_conf(struct r0conf *conf); static void raid0_free(struct mddev *mddev, void *priv); static int raid0_run(struct mddev *mddev) @@ -413,19 +414,30 @@ static int raid0_run(struct mddev *mddev) dump_zones(mddev); ret = md_integrity_register(mddev); + if (ret) + goto free; return ret; + +free: + free_conf(conf); + return ret; } -static void raid0_free(struct mddev *mddev, void *priv) +static void free_conf(struct r0conf *conf) { - struct r0conf *conf = priv; - kfree(conf->strip_zone); kfree(conf->devlist); kfree(conf); } +static void raid0_free(struct mddev *mddev, void *priv) +{ + struct r0conf *conf = priv; + + free_conf(conf); +} + static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) { struct r0conf *conf = mddev->private; -- 2.31.1