From: Guoqing Jiang Date: Wed, 24 Jul 2019 09:09:21 +0000 (+0200) Subject: md: don't call spare_active in md_reap_sync_thread if all member devices can't work X-Git-Tag: v5.2.19~237 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=274971880ff9d05959595d6408c43f1fa7f56e52;p=thirdparty%2Fkernel%2Fstable.git md: don't call spare_active in md_reap_sync_thread if all member devices can't work [ Upstream commit 0d8ed0e9bf9643f27f4816dca61081784dedb38d ] When add one disk to array, the md_reap_sync_thread is responsible to activate the spare and set In_sync flag for the new member in spare_active(). But if raid1 has one member disk A, and disk B is added to the array. Then we offline A before all the datas are synchronized from A to B, obviously B doesn't have the latest data as A, but B is still marked with In_sync flag. So let's not call spare_active under the condition, otherwise B is still showed with 'U' state which is not correct. Signed-off-by: Guoqing Jiang Signed-off-by: Song Liu Signed-off-by: Sasha Levin --- diff --git a/drivers/md/md.c b/drivers/md/md.c index 9801d540fea1c..5e885b6c4240d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8944,7 +8944,8 @@ void md_reap_sync_thread(struct mddev *mddev) /* resync has finished, collect result */ md_unregister_thread(&mddev->sync_thread); if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && - !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { + !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) && + mddev->degraded != mddev->raid_disks) { /* success...*/ /* activate any spares */ if (mddev->pers->spare_active(mddev)) {