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:
Amit Gud 2009-04-02 17:01:27 -04:00 committed by Chris Mason
parent dccae99995
commit b5555f7711

View file

@ -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);
}