md-cluster: call md_kick_rdev_from_array once ack failed
authorGuoqing Jiang <gqjiang@suse.com>
Fri, 12 Aug 2016 05:42:34 +0000 (13:42 +0800)
committerShaohua Li <shli@fb.com>
Wed, 21 Sep 2016 16:09:44 +0000 (09:09 -0700)
The new_disk_ack could return failure if WAITING_FOR_NEWDISK
is not set, so we need to kick the dev from array in case
failure happened.

And we missed to check err before call new_disk_ack othwise
we could kick a rdev which isn't in array, thanks for the
reminder from Shaohua.

Reviewed-by: NeilBrown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/md.c

index 915e84d631a22111c2256ab2f4676875a2cc61b1..7eaf5496c8d935b8832883dd3e497c49b2ae67fe 100644 (file)
@@ -6101,9 +6101,14 @@ static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info)
                        export_rdev(rdev);
 
                if (mddev_is_clustered(mddev)) {
-                       if (info->state & (1 << MD_DISK_CANDIDATE))
-                               md_cluster_ops->new_disk_ack(mddev, (err == 0));
-                       else {
+                       if (info->state & (1 << MD_DISK_CANDIDATE)) {
+                               if (!err) {
+                                       err = md_cluster_ops->new_disk_ack(mddev,
+                                               err == 0);
+                                       if (err)
+                                               md_kick_rdev_from_array(rdev);
+                               }
+                       } else {
                                if (err)
                                        md_cluster_ops->add_new_disk_cancel(mddev);
                                else