Don't access task structure once we call task function.
The task structure might be no longer available. This also allows to eliminates the need for two tasks in the zio structure. Submitted by: anonymous MFC after: 2 weeks
This commit is contained in:
parent
5b41f90fd1
commit
541c60d988
@ -147,9 +147,7 @@ taskq_run_safe(void *arg, int pending __unused)
|
|||||||
{
|
{
|
||||||
struct ostask *task = arg;
|
struct ostask *task = arg;
|
||||||
|
|
||||||
ASSERT(task->ost_magic == TASKQ_MAGIC);
|
|
||||||
task->ost_func(task->ost_arg);
|
task->ost_func(task->ost_arg);
|
||||||
task->ost_magic = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
taskqid_t
|
taskqid_t
|
||||||
@ -158,15 +156,12 @@ taskq_dispatch_safe(taskq_t *tq, task_func_t func, void *arg, u_int flags,
|
|||||||
{
|
{
|
||||||
int prio;
|
int prio;
|
||||||
|
|
||||||
ASSERT(task->ost_magic != TASKQ_MAGIC);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If TQ_FRONT is given, we want higher priority for this task, so it
|
* If TQ_FRONT is given, we want higher priority for this task, so it
|
||||||
* can go at the front of the queue.
|
* can go at the front of the queue.
|
||||||
*/
|
*/
|
||||||
prio = !!(flags & TQ_FRONT);
|
prio = !!(flags & TQ_FRONT);
|
||||||
|
|
||||||
task->ost_magic = TASKQ_MAGIC;
|
|
||||||
task->ost_func = func;
|
task->ost_func = func;
|
||||||
task->ost_arg = arg;
|
task->ost_arg = arg;
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@ struct ostask {
|
|||||||
struct task ost_task;
|
struct task ost_task;
|
||||||
task_func_t *ost_func;
|
task_func_t *ost_func;
|
||||||
void *ost_arg;
|
void *ost_arg;
|
||||||
int ost_magic;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
taskqid_t taskq_dispatch_safe(taskq_t *tq, task_func_t func, void *arg,
|
taskqid_t taskq_dispatch_safe(taskq_t *tq, task_func_t func, void *arg,
|
||||||
|
@ -421,8 +421,7 @@ struct zio {
|
|||||||
|
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
/* FreeBSD only. */
|
/* FreeBSD only. */
|
||||||
struct ostask io_task_issue;
|
struct ostask io_task;
|
||||||
struct ostask io_task_interrupt;
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1068,19 +1068,9 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q, boolean_t cutinline)
|
|||||||
spa_t *spa = zio->io_spa;
|
spa_t *spa = zio->io_spa;
|
||||||
zio_type_t t = zio->io_type;
|
zio_type_t t = zio->io_type;
|
||||||
int flags = TQ_SLEEP | (cutinline ? TQ_FRONT : 0);
|
int flags = TQ_SLEEP | (cutinline ? TQ_FRONT : 0);
|
||||||
#ifdef _KERNEL
|
|
||||||
struct ostask *task;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ASSERT(q == ZIO_TASKQ_ISSUE || q == ZIO_TASKQ_INTERRUPT);
|
ASSERT(q == ZIO_TASKQ_ISSUE || q == ZIO_TASKQ_INTERRUPT);
|
||||||
|
|
||||||
#ifdef _KERNEL
|
|
||||||
if (q == ZIO_TASKQ_ISSUE)
|
|
||||||
task = &zio->io_task_issue;
|
|
||||||
else /* if (q == ZIO_TASKQ_INTERRUPT) */
|
|
||||||
task = &zio->io_task_interrupt;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we're a config writer or a probe, the normal issue and
|
* If we're a config writer or a probe, the normal issue and
|
||||||
* interrupt threads may all be blocked waiting for the config lock.
|
* interrupt threads may all be blocked waiting for the config lock.
|
||||||
@ -1105,7 +1095,7 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q, boolean_t cutinline)
|
|||||||
ASSERT3U(q, <, ZIO_TASKQ_TYPES);
|
ASSERT3U(q, <, ZIO_TASKQ_TYPES);
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
(void) taskq_dispatch_safe(spa->spa_zio_taskq[t][q],
|
(void) taskq_dispatch_safe(spa->spa_zio_taskq[t][q],
|
||||||
(task_func_t *)zio_execute, zio, flags, task);
|
(task_func_t *)zio_execute, zio, flags, &zio->io_task);
|
||||||
#else
|
#else
|
||||||
(void) taskq_dispatch(spa->spa_zio_taskq[t][q],
|
(void) taskq_dispatch(spa->spa_zio_taskq[t][q],
|
||||||
(task_func_t *)zio_execute, zio, flags);
|
(task_func_t *)zio_execute, zio, flags);
|
||||||
@ -2904,7 +2894,7 @@ zio_done(zio_t *zio)
|
|||||||
(void) taskq_dispatch_safe(
|
(void) taskq_dispatch_safe(
|
||||||
spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE],
|
spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE],
|
||||||
(task_func_t *)zio_reexecute, zio, TQ_SLEEP,
|
(task_func_t *)zio_reexecute, zio, TQ_SLEEP,
|
||||||
&zio->io_task_issue);
|
&zio->io_task);
|
||||||
#else
|
#else
|
||||||
(void) taskq_dispatch(
|
(void) taskq_dispatch(
|
||||||
spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE],
|
spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user