From 7df3495669fa545678c9edf6826a7ab5f8bfea1b Mon Sep 17 00:00:00 2001 From: mm Date: Fri, 7 Jan 2011 14:17:29 +0000 Subject: [PATCH] MFC r216919: MFp4 186485, 186859: Fix a race by defining two tasks in the zio structure as we can still be returning from issue task when interrupt task is used. Reviewed by: pjd Approved by: re (kib), pjd git-svn-id: svn://svn.freebsd.org/base/releng/8.2@217096 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- .../opensolaris/uts/common/fs/zfs/sys/zio.h | 3 +- .../opensolaris/uts/common/fs/zfs/zio.c | 28 +++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h index 4a4d2865..049c1220 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h @@ -340,7 +340,8 @@ struct zio { #ifdef _KERNEL /* FreeBSD only. */ - struct ostask io_task; + struct ostask io_task_issue; + struct ostask io_task_interrupt; #endif }; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c index b4775636..32f15e90 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c @@ -947,6 +947,18 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q) { spa_t *spa = zio->io_spa; zio_type_t t = zio->io_type; +#ifdef _KERNEL + struct ostask *task; +#endif + + 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 @@ -970,8 +982,13 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q) q++; ASSERT3U(q, <, ZIO_TASKQ_TYPES); +#ifdef _KERNEL (void) taskq_dispatch_safe(spa->spa_zio_taskq[t][q], - (task_func_t *)zio_execute, zio, &zio->io_task); + (task_func_t *)zio_execute, zio, task); +#else + (void) taskq_dispatch(spa->spa_zio_taskq[t][q], + (task_func_t *)zio_execute, zio, TQ_SLEEP); +#endif } static boolean_t @@ -2300,9 +2317,16 @@ zio_done(zio_t *zio) * Reexecution is potentially a huge amount of work. * Hand it off to the otherwise-unused claim taskq. */ +#ifdef _KERNEL (void) taskq_dispatch_safe( spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE], - (task_func_t *)zio_reexecute, zio, &zio->io_task); + (task_func_t *)zio_reexecute, zio, + &zio->io_task_issue); +#else + (void) taskq_dispatch( + spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE], + (task_func_t *)zio_reexecute, zio, TQ_SLEEP); +#endif } return (ZIO_PIPELINE_STOP); } -- 2.45.0