Btrfs: fix race in worker_loop
Need to check kthread_should_stop after schedule_timeout() before calling schedule(). This causes threads to sleep with potentially no one to wake them up causing mount(2) to hang in btrfs_stop_workers waiting for threads to stop. Signed-off-by: Amit Gud <gud@ksu.edu> Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
		
							parent
							
								
									dccae99995
								
							
						
					
					
						commit
						b5555f7711
					
				| @ -195,6 +195,9 @@ again_locked: | ||||
| 				if (!list_empty(&worker->pending)) | ||||
| 					continue; | ||||
| 
 | ||||
| 				if (kthread_should_stop()) | ||||
| 					break; | ||||
| 
 | ||||
| 				/* still no more work?, sleep for real */ | ||||
| 				spin_lock_irq(&worker->lock); | ||||
| 				set_current_state(TASK_INTERRUPTIBLE); | ||||
| @ -208,7 +211,8 @@ again_locked: | ||||
| 				worker->working = 0; | ||||
| 				spin_unlock_irq(&worker->lock); | ||||
| 
 | ||||
| 				schedule(); | ||||
| 				if (!kthread_should_stop()) | ||||
| 					schedule(); | ||||
| 			} | ||||
| 			__set_current_state(TASK_RUNNING); | ||||
| 		} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user