]> Pileus Git - ~andy/linux/blobdiff - fs/btrfs/async-thread.c
Btrfs: selinux support
[~andy/linux] / fs / btrfs / async-thread.c
index e1e49715459ee9d45617bf67879afe5317257050..f2e80f3768ec76266d3c4424946d7e4e000da427 100644 (file)
@@ -16,7 +16,6 @@
  * Boston, MA 021110-1307, USA.
  */
 
-#include <linux/version.h>
 #include <linux/kthread.h>
 #include <linux/list.h>
 #include <linux/spinlock.h>
@@ -104,7 +103,7 @@ static noinline int run_ordered_completions(struct btrfs_workers *workers,
 
        spin_lock_irqsave(&workers->lock, flags);
 
-       while(!list_empty(&workers->order_list)) {
+       while (!list_empty(&workers->order_list)) {
                work = list_entry(workers->order_list.next,
                                  struct btrfs_work, order_list);
 
@@ -143,7 +142,7 @@ static int worker_loop(void *arg)
        struct btrfs_work *work;
        do {
                spin_lock_irq(&worker->lock);
-               while(!list_empty(&worker->pending)) {
+               while (!list_empty(&worker->pending)) {
                        cur = worker->pending.next;
                        work = list_entry(cur, struct btrfs_work, list);
                        list_del(&work->list);
@@ -171,7 +170,8 @@ static int worker_loop(void *arg)
                } else {
                        set_current_state(TASK_INTERRUPTIBLE);
                        spin_unlock_irq(&worker->lock);
-                       schedule();
+                       if (!kthread_should_stop())
+                               schedule();
                        __set_current_state(TASK_RUNNING);
                }
        } while (!kthread_should_stop());
@@ -187,7 +187,7 @@ int btrfs_stop_workers(struct btrfs_workers *workers)
        struct btrfs_worker_thread *worker;
 
        list_splice_init(&workers->idle_list, &workers->worker_list);
-       while(!list_empty(&workers->worker_list)) {
+       while (!list_empty(&workers->worker_list)) {
                cur = workers->worker_list.next;
                worker = list_entry(cur, struct btrfs_worker_thread,
                                    worker_list);
@@ -349,6 +349,7 @@ int btrfs_requeue_work(struct btrfs_work *work)
 {
        struct btrfs_worker_thread *worker = work->worker;
        unsigned long flags;
+       int wake = 0;
 
        if (test_and_set_bit(WORK_QUEUED_BIT, &work->flags))
                goto out;
@@ -367,10 +368,16 @@ int btrfs_requeue_work(struct btrfs_work *work)
                               &worker->workers->worker_list);
                spin_unlock_irqrestore(&worker->workers->lock, flags);
        }
+       if (!worker->working) {
+               wake = 1;
+               worker->working = 1;
+       }
 
        spin_unlock_irqrestore(&worker->lock, flags);
-
+       if (wake)
+               wake_up_process(worker->task);
 out:
+
        return 0;
 }
 
@@ -397,6 +404,7 @@ int btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work)
        }
 
        spin_lock_irqsave(&worker->lock, flags);
+
        atomic_inc(&worker->num_pending);
        check_busy_worker(worker);
        list_add_tail(&work->list, &worker->pending);