From f6175b417625899f3da295a91fe74b6c70d82f70 Mon Sep 17 00:00:00 2001 From: Li Nan Date: Sat, 3 Jun 2023 14:50:38 +0800 Subject: [PATCH] md: fix io loss when remove rdev fail hulk inclusion category: bugfix, https://gitee.com/openeuler/kernel/issues/I71EKW bugzilla: 188628 CVE: NA -------------------------------- We first set rdev to WantRemove, and check if there is any io pending, if so, we will clear flag and return busy in raid10_remove_disk(). io will loss as below: raid10_remove_disk set WantRemove write rdev if WantRemove do not submit io if rdev->nr_pending clear WantRemove return BUSY read rdev get error data Fix it by md_error the rdev which io pending while removing. When the code reaches this point, it means this rdev will be removed later, so setting it as faulty has little impact. Signed-off-by: Li Nan Reviewed-by: Yu Kuai Reviewed-by: Hou Tao (cherry picked from commit 894f89faa888615a5d5fd5e9be987a8cae39e00e) --- drivers/md/raid10.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index e298903aa72f..190e6f18d0e2 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -1872,7 +1872,7 @@ static int raid10_remove_disk(struct mddev *mddev, struct md_rdev *rdev) if (atomic_read(&rdev->nr_pending)) { /* lost the race, try later */ err = -EBUSY; - clear_bit(WantRemove, &rdev->flags); + md_error(rdev->mddev, rdev); goto abort; } } -- GitLab