This patch depends on patch 02. The Faulty flag is required for the if statement to be true. A rdev in Faulty state does not issue I/O commands. So, nr_pending is also not increased. Therefore, decrement and zero check of nr_pending can be separated and still be consistent. Signed-off-by: Keisuke TADA <keisuke1.tada@xxxxxxxxxx> Signed-off-by: Toshifumi OHTAKE <toshifumi.ootake@xxxxxxxxxx> --- drivers/md/md.h | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/md/md.h b/drivers/md/md.h index f57a894b924b..2eaf8606af9e 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -236,11 +236,6 @@ static inline unsigned int nr_pending_read(struct md_rdev *rdev) return atomic_read(&rdev->nr_pending); } -static inline bool nr_pending_dec_and_test(struct md_rdev *rdev) -{ - return atomic_dec_and_test(&rdev->nr_pending); -} - static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors, sector_t *first_bad, int *bad_sectors) { @@ -876,9 +871,12 @@ static inline bool is_rdev_broken(struct md_rdev *rdev) static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev) { int faulty = test_bit(Faulty, &rdev->flags); - if (nr_pending_dec_and_test(rdev) && faulty) { - set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); - md_wakeup_thread(mddev->thread); + nr_pending_dec(rdev); + if (faulty) { + if (nr_pending_is_zero(rdev)) { + set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); + md_wakeup_thread(mddev->thread); + } } } -- 2.34.1