md: wakeup thread upon rdev_dec_pending()
authorHannes Reinecke <hare@suse.de>
Thu, 26 Jul 2012 09:12:18 +0000 (11:12 +0200)
committerNeilBrown <neilb@suse.de>
Thu, 5 Feb 2015 22:32:57 +0000 (09:32 +1100)
After each call to rdev_dec_pending() we should wakeup the
md thread if the device is found to be faulty.
Otherwise we'll incur heavy delays on failing devices.

Signed-off-by: Neil Brown <nfbrown@suse.de>
Signed-off-by: Hannes Reinecke <hare@suse.de>
drivers/md/md.h

index 14367d9..318ca8f 100644 (file)
@@ -474,13 +474,6 @@ static inline int mddev_trylock(struct mddev *mddev)
 }
 extern void mddev_unlock(struct mddev *mddev);
 
-static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
-{
-       int faulty = test_bit(Faulty, &rdev->flags);
-       if (atomic_dec_and_test(&rdev->nr_pending) && faulty)
-               set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
-}
-
 static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors)
 {
        atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
@@ -666,4 +659,14 @@ static inline int mddev_check_plugged(struct mddev *mddev)
        return !!blk_check_plugged(md_unplug, mddev,
                                   sizeof(struct blk_plug_cb));
 }
+
+static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
+{
+       int faulty = test_bit(Faulty, &rdev->flags);
+       if (atomic_dec_and_test(&rdev->nr_pending) && faulty) {
+               set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
+               md_wakeup_thread(mddev->thread);
+       }
+}
+
 #endif /* _MD_MD_H */