summaryrefslogtreecommitdiffstats
path: root/module/zfs/zio.c
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2014-10-07 13:20:49 -0700
committerBrian Behlendorf <[email protected]>2014-10-07 16:40:29 -0700
commit8878261fc9447592844db5f7eb3df9ed3b088871 (patch)
treeb39a6afd0071a9042e7380c4be955505b05636ad /module/zfs/zio.c
parenta215ee16c06b3adbd00e9e69931ddcb71c2fb680 (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.c7
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);