Delay injection can cause indefinitely hung zios

If we hit the (NSEC_TO_TICK(diff) == 0) condition in
zio_delay_interrupt, zio_interrupt is never called and the
zio does not progress.

Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Signed-off-by: sara hartse <sara.hartse@delphix.com>
Closes #8404
This commit is contained in:
Sara Hartse 2019-02-15 14:44:56 -08:00 committed by Brian Behlendorf
parent a28c1a58fe
commit f545b6ae00

View File

@ -1834,6 +1834,7 @@ zio_delay_interrupt(zio_t *zio)
if (NSEC_TO_TICK(diff) == 0) {
/* Our delay is less than a jiffy - just spin */
zfs_sleep_until(zio->io_target_timestamp);
zio_interrupt(zio);
} else {
/*
* Use taskq_dispatch_delay() in the place of