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>
This commit is contained in:
		
							parent
							
								
									6791875e2e
								
							
						
					
					
						commit
						dfe15ac1c6
					
				| @ -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 */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user