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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user