aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuoqing Jiang <gqjiang@suse.com>2016-08-12 01:42:34 -0400
committerShaohua Li <shli@fb.com>2016-09-21 12:09:44 -0400
commite566aef12a166732b7fd85897f8736ccf4fc7814 (patch)
treec935ed99cd0f684f5fe62a450d4c10fc1e30d63c
parent7d1e042314619115153a0f6f06e4552c09a50e13 (diff)
md-cluster: call md_kick_rdev_from_array once ack failed
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>
-rw-r--r--drivers/md/md.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 915e84d631a2..7eaf5496c8d9 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -6101,9 +6101,14 @@ static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info)
6101 export_rdev(rdev); 6101 export_rdev(rdev);
6102 6102
6103 if (mddev_is_clustered(mddev)) { 6103 if (mddev_is_clustered(mddev)) {
6104 if (info->state & (1 << MD_DISK_CANDIDATE)) 6104 if (info->state & (1 << MD_DISK_CANDIDATE)) {
6105 md_cluster_ops->new_disk_ack(mddev, (err == 0)); 6105 if (!err) {
6106 else { 6106 err = md_cluster_ops->new_disk_ack(mddev,
6107 err == 0);
6108 if (err)
6109 md_kick_rdev_from_array(rdev);
6110 }
6111 } else {
6107 if (err) 6112 if (err)
6108 md_cluster_ops->add_new_disk_cancel(mddev); 6113 md_cluster_ops->add_new_disk_cancel(mddev);
6109 else 6114 else