]> granicus.if.org Git - spl/commitdiff
Revert "Make taskq_member() use ->journal_info"
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 9 Dec 2015 01:04:31 +0000 (17:04 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 9 Dec 2015 01:12:36 +0000 (17:12 -0800)
This reverts commit a430c11f0b1ef16ca5edf3059e4082709277376c.  Using
journal_info like this can cause a BUG at kernel fs/jbd2/transaction.c:425!

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #500

include/sys/taskq.h
module/spl/spl-taskq.c

index 65f911245c31756e9efd47957d9764d11a7c75e0..a43a86da651470d42ffc7858164a620e7d516146 100644 (file)
@@ -124,7 +124,7 @@ extern void taskq_wait_id(taskq_t *, taskqid_t);
 extern void taskq_wait_outstanding(taskq_t *, taskqid_t);
 extern void taskq_wait(taskq_t *);
 extern int taskq_cancel_id(taskq_t *, taskqid_t);
-#define        taskq_member(taskq, thread)     ((taskq) == ((thread)->journal_info))
+extern int taskq_member(taskq_t *, void *);
 
 #define taskq_create_proc(name, nthreads, pri, min, max, proc, flags) \
     taskq_create(name, nthreads, pri, min, max, flags)
index 0c5b230aa6420ae2026c661495e51668f9e97c51..2c2e3ad465abc2fad764816edb53723892595db6 100644 (file)
@@ -448,6 +448,40 @@ taskq_wait(taskq_t *tq)
 }
 EXPORT_SYMBOL(taskq_wait);
 
+static int
+taskq_member_impl(taskq_t *tq, void *t)
+{
+       struct list_head *l;
+       taskq_thread_t *tqt;
+       int found = 0;
+
+       ASSERT(tq);
+       ASSERT(t);
+       ASSERT(spin_is_locked(&tq->tq_lock));
+
+       list_for_each(l, &tq->tq_thread_list) {
+               tqt = list_entry(l, taskq_thread_t, tqt_thread_list);
+               if (tqt->tqt_thread == (struct task_struct *)t) {
+                       found = 1;
+                       break;
+               }
+       }
+       return (found);
+}
+
+int
+taskq_member(taskq_t *tq, void *t)
+{
+       int found;
+
+       spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
+       found = taskq_member_impl(tq, t);
+       spin_unlock_irqrestore(&tq->tq_lock, tq->tq_lock_flags);
+
+       return (found);
+}
+EXPORT_SYMBOL(taskq_member);
+
 /*
  * Cancel an already dispatched task given the task id.  Still pending tasks
  * will be immediately canceled, and if the task is active the function will
@@ -778,7 +812,6 @@ taskq_thread(void *args)
        ASSERT(tqt);
        tq = tqt->tqt_tq;
        current->flags |= PF_NOFREEZE;
-       current->journal_info = tq;
 
        #if defined(PF_MEMALLOC_NOIO)
        (void) memalloc_noio_save();
@@ -844,8 +877,6 @@ taskq_thread(void *args)
                        /* Perform the requested task */
                        t->tqent_func(t->tqent_arg);
 
-                       ASSERT3P(tq, ==, current->journal_info);
-
                        spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
                        tq->tq_nactive--;
                        list_del_init(&tqt->tqt_active_list);