diff options
author | Brian Behlendorf <[email protected]> | 2010-08-26 10:32:23 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2010-08-31 08:38:46 -0700 |
commit | 5cc556b447380bf5fed181d3aa5f138618cd69c8 (patch) | |
tree | 3af4f4d688c0ff2cb4579f46cdfb4277b2ec2db7 | |
parent | 2a442d1629e5405efe82b832d06f69e8d1360cc7 (diff) |
Fix zio_taskq_dispatch to use TQ_NOSLEEP
The zio_taskq_dispatch() function may be called at interrupt time
and it is critical that we never sleep.
Additionally, wrap taskq_dispatch() in a while loop because it may
fail. This is non optimal but is OK for now.
Signed-off-by: Brian Behlendorf <[email protected]>
-rw-r--r-- | module/zfs/zio.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/module/zfs/zio.c b/module/zfs/zio.c index 2d8c7e9bd..e434cf01a 100644 --- a/module/zfs/zio.c +++ b/module/zfs/zio.c @@ -1049,7 +1049,7 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q, boolean_t cutinline) { spa_t *spa = zio->io_spa; zio_type_t t = zio->io_type; - int flags = TQ_SLEEP | (cutinline ? TQ_FRONT : 0); + int flags = TQ_NOSLEEP | (cutinline ? TQ_FRONT : 0); /* * If we're a config writer or a probe, the normal issue and @@ -1073,8 +1073,9 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q, boolean_t cutinline) q++; ASSERT3U(q, <, ZIO_TASKQ_TYPES); - (void) taskq_dispatch(spa->spa_zio_taskq[t][q], - (task_func_t *)zio_execute, zio, flags); + + while (taskq_dispatch(spa->spa_zio_taskq[t][q], + (task_func_t *)zio_execute, zio, flags) == 0); /* do nothing */ } static boolean_t |