diff options
author | Guoqing Jiang <gqjiang@suse.com> | 2016-08-12 05:42:34 (GMT) |
---|---|---|
committer | Shaohua Li <shli@fb.com> | 2016-09-21 16:09:44 (GMT) |
commit | e566aef12a166732b7fd85897f8736ccf4fc7814 (patch) | |
tree | c935ed99cd0f684f5fe62a450d4c10fc1e30d63c /drivers/md | |
parent | 7d1e042314619115153a0f6f06e4552c09a50e13 (diff) | |
download | linux-e566aef12a166732b7fd85897f8736ccf4fc7814.tar.xz |
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>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/md.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 915e84d..7eaf549 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) 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 |