Эх сурвалжийг харах

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>
Amit Gud 16 жил өмнө
parent
commit
b5555f7711

+ 5 - 1
fs/btrfs/async-thread.c

@@ -195,6 +195,9 @@ again_locked:
 				if (!list_empty(&worker->pending))
 				if (!list_empty(&worker->pending))
 					continue;
 					continue;
 
 
+				if (kthread_should_stop())
+					break;
+
 				/* still no more work?, sleep for real */
 				/* still no more work?, sleep for real */
 				spin_lock_irq(&worker->lock);
 				spin_lock_irq(&worker->lock);
 				set_current_state(TASK_INTERRUPTIBLE);
 				set_current_state(TASK_INTERRUPTIBLE);
@@ -208,7 +211,8 @@ again_locked:
 				worker->working = 0;
 				worker->working = 0;
 				spin_unlock_irq(&worker->lock);
 				spin_unlock_irq(&worker->lock);
 
 
-				schedule();
+				if (!kthread_should_stop())
+					schedule();
 			}
 			}
 			__set_current_state(TASK_RUNNING);
 			__set_current_state(TASK_RUNNING);
 		}
 		}