From 8878261fc9447592844db5f7eb3df9ed3b088871 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 7 Oct 2014 13:20:49 -0700 Subject: [PATCH] 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 Signed-off-by: Ned Bass Closes #2769 --- module/zfs/zio.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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);