mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 11:19:32 +03:00
Fix suspend Godfather I/Os io_reexecute bits
After resuming a pool the godfather zio could have both the ZIO_REEXECUTE_NOW and ZIO_REEXECUTE_SUSPEND bits set. This can occur if some child zios set ZIO_REEXECUTE_NOW while other set ZIO_REEXECUTE_SUSPEND. The godfather zio can inherit both flags in zio_notify_parent(). The child zios which assigned the ZIO_REEXECUTE_SUSPEND flag will be removed from the godfather's child list and added to the spa->spa_suspend_zio_root child list. While child zios with the ZIO_REEXECUTE_NOW bit set remain being monitored by the godfather zio. When the godfather zio executes zio_done() the presence of the ZIO_REEXECUTE_SUSPEND bit results in all io_reexecute being cleared. These child zios will then not be re-executed and instead will be destroyed and lost. The most straight forward way to address this situation is to only clear the ZIO_REEXECUTE_SUSPEND bit and leave the ZIO_REEXECUTE_NOW bit set. Reviewed-by: George Melikov <mail@gmelikov.ru> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: yuxiang <guo.yong33@zte.com.cn>
This commit is contained in:
parent
3130b84e94
commit
a32494d22a
@ -3885,7 +3885,7 @@ zio_done(zio_t *zio)
|
|||||||
*/
|
*/
|
||||||
if ((zio->io_flags & ZIO_FLAG_GODFATHER) &&
|
if ((zio->io_flags & ZIO_FLAG_GODFATHER) &&
|
||||||
(zio->io_reexecute & ZIO_REEXECUTE_SUSPEND))
|
(zio->io_reexecute & ZIO_REEXECUTE_SUSPEND))
|
||||||
zio->io_reexecute = 0;
|
zio->io_reexecute &= ~ZIO_REEXECUTE_SUSPEND;
|
||||||
|
|
||||||
if (zio->io_reexecute) {
|
if (zio->io_reexecute) {
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user