HomeFreeBSD

zio: lock parent zios when updating wait counts on reexecute

Description

zio: lock parent zios when updating wait counts on reexecute

As zios are reexecuted after resume from suspension, their ready and
wait states need to be propagated to wait counts on all their parents.

It's possible for those parents to have active children passing through
READY or DONE, which then end up in zio_notify_parent(), take their
parent's lock, and decrement the wait count. Without also taking a lock
here, it's possible for an increment race to occur, which leads to
either there being no references left (tripping the assert in
zio_notify_parent()), or a parent waiting forever for a nonexistent
child to complete.

To protect against this, we simply take the appropriate zio locks in
zio_reexecute() before updating the wait counts.

Sponsored-by: Klara, Inc.
Sponsored-by: Wasabi Technology, Inc.

Reviewed-by: Allan Jude <allan@klarasystems.com>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Closes #17016

Details

Provenance
rob.norris_klarasystems.comAuthored on Feb 4 2025, 1:47 PM
GitHub <noreply@github.com>Committed on Feb 4 2025, 1:47 PM
Parents
rG21205f6488ad: Avoid ARC buffer transfrom operations in prefetch
Branches
Unknown
Tags
Unknown