svn commit: r217049 - in
stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys
Martin Matuska
mm at FreeBSD.org
Thu Jan 6 09:40:38 UTC 2011
My mistake: s/pav/pjd/g
Dňa 06.01.2011 10:34, Martin Matuska wrote / napísal(a):
> Author: mm
> Date: Thu Jan 6 09:34:22 2011
> New Revision: 217049
> URL: http://svn.freebsd.org/changeset/base/217049
>
> Log:
> 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: pav
> Approved by: pav
>
> Modified:
> stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
> stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
> Directory Properties:
> stable/8/sys/ (props changed)
> stable/8/sys/amd64/include/xen/ (props changed)
> stable/8/sys/cddl/contrib/opensolaris/ (props changed)
> stable/8/sys/contrib/dev/acpica/ (props changed)
> stable/8/sys/contrib/pf/ (props changed)
>
> Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
> ==============================================================================
> --- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h Thu Jan 6 08:33:48 2011 (r217048)
> +++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h Thu Jan 6 09:34:22 2011 (r217049)
> @@ -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
> };
>
>
> Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
> ==============================================================================
> --- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Thu Jan 6 08:33:48 2011 (r217048)
> +++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Thu Jan 6 09:34:22 2011 (r217049)
> @@ -947,6 +947,18 @@ zio_taskq_dispatch(zio_t *zio, enum zio_
> {
> 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_
> 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);
> }
More information about the svn-src-all
mailing list