From: Brian Behlendorf Date: Wed, 9 Dec 2015 01:04:31 +0000 (-0800) Subject: Revert "Make taskq_member() use ->journal_info" X-Git-Tag: spl-0.7.12~147 X-Git-Url: https://git.proxmox.com/?p=mirror_spl.git;a=commitdiff_plain;h=c5a8b1e163179cadcf2c5f81b000bf7f86f41369 Revert "Make taskq_member() use ->journal_info" 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 Issue #500 --- diff --git a/include/sys/taskq.h b/include/sys/taskq.h index 65f9112..a43a86d 100644 --- a/include/sys/taskq.h +++ b/include/sys/taskq.h @@ -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) diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c index 0c5b230..2c2e3ad 100644 --- a/module/spl/spl-taskq.c +++ b/module/spl/spl-taskq.c @@ -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);