md/raid1: If md_integrity_register() failed,run() must free the mem
authormajianpeng <majianpeng@gmail.com>
Sun, 1 Apr 2012 23:48:38 +0000 (09:48 +1000)
committerNeilBrown <neilb@suse.de>
Sun, 1 Apr 2012 23:48:38 +0000 (09:48 +1000)
Signed-off-by: majianpeng <majianpeng@gmail.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/raid1.c

index 4a40a200d7696319c59cafacfffbf9044d12743c..242440831b23aa8e80e8097c59c7558ab30b8d97 100644 (file)
@@ -2636,11 +2636,13 @@ static struct r1conf *setup_conf(struct mddev *mddev)
        return ERR_PTR(err);
 }
 
+static int stop(struct mddev *mddev);
 static int run(struct mddev *mddev)
 {
        struct r1conf *conf;
        int i;
        struct md_rdev *rdev;
+       int ret;
 
        if (mddev->level != 1) {
                printk(KERN_ERR "md/raid1:%s: raid level not set to mirroring (%d)\n",
@@ -2705,7 +2707,11 @@ static int run(struct mddev *mddev)
                mddev->queue->backing_dev_info.congested_data = mddev;
                blk_queue_merge_bvec(mddev->queue, raid1_mergeable_bvec);
        }
-       return md_integrity_register(mddev);
+
+       ret =  md_integrity_register(mddev);
+       if (ret)
+               stop(mddev);
+       return ret;
 }
 
 static int stop(struct mddev *mddev)