diff options
| author | Mark Johnston <markj@FreeBSD.org> | 2026-04-09 01:08:45 +0000 |
|---|---|---|
| committer | Mark Johnston <markj@FreeBSD.org> | 2026-04-09 01:10:13 +0000 |
| commit | 36d971464ac21f6531cb9eaa377f4e1dd915a2ad (patch) | |
| tree | 00c0f888df765ac48b3ebb04be0ea26020724aa3 | |
| parent | c0d9a07101a1e72769ee0619a583f63a078fb391 (diff) | |
geom: Make g_waitidle() wait for orphaned providers
This is motivated by the following race in the ZFS zvol code.
When a zvol is created, we create a GEOM-backed zvol, which results in a
/dev/zvol/<zvol path> device file, created by GEOM::dev. If volmode=dev
is specified, zvol_set_volmode_impl() will wither the GEOM, then create
a device file with the same name. This sometimes fails because
g_wither_geom() is asynchronous, so we end up trying to create a device
file while the old one still exists. I want to fix this by adding a
g_waitidle() call to zvol_os_remove_minor().
g_waitidle() is not sufficient: GEOM::dev does not destroy the device
until g_dev_orphan() is called. (In fact the device destruction is
asynchronous too, but the delist_dev() call is sufficient to address
this race.) So, I propose modifying g_waitidle() to block until
orphaned providers are processed.
PR: 258766
Reviewed by: mav, imp, kib
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D55049
| -rw-r--r-- | sys/geom/geom_event.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/geom/geom_event.c b/sys/geom/geom_event.c index ffd46db55416..34649cea5a71 100644 --- a/sys/geom/geom_event.c +++ b/sys/geom/geom_event.c @@ -84,7 +84,7 @@ g_waitidle(struct thread *td) mtx_lock(&g_eventlock); TSWAIT("GEOM events"); - while (!TAILQ_EMPTY(&g_events)) + while (!TAILQ_EMPTY(&g_events) || !TAILQ_EMPTY(&g_doorstep)) msleep(&g_pending_events, &g_eventlock, PPAUSE, "g_waitidle", 0); TSUNWAIT("GEOM events"); |
