Btrfs: fix race in worker_loop
authorAmit Gud <amitgud@gmail.com>
Thu, 2 Apr 2009 21:01:27 +0000 (17:01 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 2 Apr 2009 21:01:27 +0000 (17:01 -0400)
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>
fs/btrfs/async-thread.c

index c84ca1f5259a5408f538d8254f939677567924a4..cba701dba35057d2233f5052b3079f69f7e65909 100644 (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);
                }