diff --git a/module/zfs/zio.c b/module/zfs/zio.c index a6047c4f7153..84e38f3e242c 100644 --- a/module/zfs/zio.c +++ b/module/zfs/zio.c @@ -1377,7 +1377,9 @@ __attribute__((always_inline)) static inline void __zio_execute(zio_t *zio) { + mutex_enter(&zio->io_lock); zio->io_executor = curthread; + mutex_exit(&zio->io_lock); while (zio->io_stage < ZIO_STAGE_DONE) { enum zio_stage pipeline = zio->io_pipeline; @@ -1455,7 +1457,9 @@ zio_wait(zio_t *zio) ASSERT(zio->io_stage == ZIO_STAGE_OPEN); ASSERT(zio->io_executor == NULL); + mutex_enter(&zio->io_lock); zio->io_waiter = curthread; + mutex_exit(&zio->io_lock); __zio_execute(zio); @@ -3316,12 +3320,13 @@ zio_done(zio_t *zio) zio_notify_parent(pio, zio, ZIO_WAIT_DONE); } + mutex_enter(&zio->io_lock); if (zio->io_waiter != NULL) { - mutex_enter(&zio->io_lock); zio->io_executor = NULL; cv_broadcast(&zio->io_cv); mutex_exit(&zio->io_lock); } else { + mutex_exit(&zio->io_lock); zio_destroy(zio); }