diff options
author | Brian Behlendorf <[email protected]> | 2014-10-07 13:20:49 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2014-10-07 16:40:29 -0700 |
commit | 8878261fc9447592844db5f7eb3df9ed3b088871 (patch) | |
tree | b39a6afd0071a9042e7380c4be955505b05636ad /module/zfs/zio.c | |
parent | a215ee16c06b3adbd00e9e69931ddcb71c2fb680 (diff) |
Fix CPU_SEQID use in preemptible context
Commit e022864 introduced a regression for kernels which are built
with CONFIG_DEBUG_PREEMPT. The use of CPU_SEQID in a preemptible
context causes zio_nowait() to trigger the BUG. Since CPU_SEQID
is simply being used as a random index the usage here is safe. To
resolve the issue preempt is disable while calling CPU_SEQID.
Signed-off-by: Brian Behlendorf <[email protected]>
Signed-off-by: Ned Bass <[email protected]>
Closes #2769
Diffstat (limited to 'module/zfs/zio.c')
-rw-r--r-- | module/zfs/zio.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/module/zfs/zio.c b/module/zfs/zio.c index 844b909fb..0ba167c62 100644 --- a/module/zfs/zio.c +++ b/module/zfs/zio.c @@ -1467,14 +1467,19 @@ zio_nowait(zio_t *zio) if (zio->io_child_type == ZIO_CHILD_LOGICAL && zio_unique_parent(zio) == NULL) { + zio_t *pio; + /* * This is a logical async I/O with no parent to wait for it. * We add it to the spa_async_root_zio "Godfather" I/O which * will ensure they complete prior to unloading the pool. */ spa_t *spa = zio->io_spa; + kpreempt_disable(); + pio = spa->spa_async_zio_root[CPU_SEQID]; + kpreempt_enable(); - zio_add_child(spa->spa_async_zio_root[CPU_SEQID], zio); + zio_add_child(pio, zio); } __zio_execute(zio); |