Commit dfe15ac1 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by NeilBrown

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: default avatarNeil Brown <nfbrown@suse.de>
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
parent 6791875e
...@@ -474,13 +474,6 @@ static inline int mddev_trylock(struct mddev *mddev) ...@@ -474,13 +474,6 @@ static inline int mddev_trylock(struct mddev *mddev)
} }
extern void mddev_unlock(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) 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); 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,4 +659,14 @@ static inline int mddev_check_plugged(struct mddev *mddev)
return !!blk_check_plugged(md_unplug, mddev, return !!blk_check_plugged(md_unplug, mddev,
sizeof(struct blk_plug_cb)); 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 */ #endif /* _MD_MD_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment