aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.h
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2012-07-26 05:12:18 -0400
committerNeilBrown <neilb@suse.de>2015-02-05 17:32:57 -0500
commitdfe15ac1c6ad301b092ed295f0cfdb16cfaf5cfa (patch)
tree2b3fcf506f4956a34f709eef4c9bc9260e5ae788 /drivers/md/md.h
parent6791875e2e5393845b9c781d2998481089735134 (diff)
md: wakeup thread upon rdev_dec_pending()
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>
Diffstat (limited to 'drivers/md/md.h')
-rw-r--r--drivers/md/md.h17
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 14367d919351..318ca8fd430f 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -474,13 +474,6 @@ static inline int mddev_trylock(struct mddev *mddev)
474} 474}
475extern void mddev_unlock(struct mddev *mddev); 475extern void mddev_unlock(struct mddev *mddev);
476 476
477static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
478{
479 int faulty = test_bit(Faulty, &rdev->flags);
480 if (atomic_dec_and_test(&rdev->nr_pending) && faulty)
481 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
482}
483
484static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors) 477static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors)
485{ 478{
486 atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io); 479 atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
@@ -666,4 +659,14 @@ static inline int mddev_check_plugged(struct mddev *mddev)
666 return !!blk_check_plugged(md_unplug, mddev, 659 return !!blk_check_plugged(md_unplug, mddev,
667 sizeof(struct blk_plug_cb)); 660 sizeof(struct blk_plug_cb));
668} 661}
662
663static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
664{
665 int faulty = test_bit(Faulty, &rdev->flags);
666 if (atomic_dec_and_test(&rdev->nr_pending) && faulty) {
667 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
668 md_wakeup_thread(mddev->thread);
669 }
670}
671
669#endif /* _MD_MD_H */ 672#endif /* _MD_MD_H */