Thanks for the analysis and the fix.
I guess highbit64() is not cheap, so likely the fix can be simplified.
How about this:
static boolean_t
zio_wait_for_children(zio_t *zio, uint32_t children_bits, enum zio_wait_type
wait)
{
boolean_t waiting = B_FALSE;
mutex_enter(&zio
You can view, comment on, or merge this pull request online at:
https://github.com/openzfs/openzfs/pull/506
-- Commit Summary --
* 8814 nxge: variable 'ether_class' set but not used
* 8838 libxcurses: variable 'code' set but not used
* 8850 libresolv2: variable 'tvp' set but not used
PROBLEM
It's possible for a parent zio to complete even though it has children
which have not completed. This can result in the following panic:
> $C
ff01809128c0 vpanic()
ff01809128e0 mutex_panic+0x58(fb94c904, ff597dde7f80)
ff0180912950 mutex_vector_enter+0x347(ff597
ikozhukhov commented on this pull request.
> @@ -6653,6 +6566,9 @@ spa_sync(spa_t *spa, uint64_t txg)
ddt_sync(spa, txg);
dsl_scan_sync(dp, tx);
+ if (spa->spa_vdev_removal != NULL)
+ svr_sync(spa, tx);
+
while