FreeBSD: unregister mountroot eventhandler on unload
Otherwise if zfs is unloaded and reroot is being used it trips over a stale pointer. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: Rubicon Communications, LLC ("Netgate") Signed-off-by: Mateusz Guzik <mjguzik@gmail.com> Closes #16242
This commit is contained in:
parent
20c8bdd85e
commit
121a2d3354
|
@ -111,6 +111,7 @@ static int zfs__fini(void);
|
||||||
static void zfs_shutdown(void *, int);
|
static void zfs_shutdown(void *, int);
|
||||||
|
|
||||||
static eventhandler_tag zfs_shutdown_event_tag;
|
static eventhandler_tag zfs_shutdown_event_tag;
|
||||||
|
static eventhandler_tag zfs_mountroot_event_tag;
|
||||||
|
|
||||||
#define ZFS_MIN_KSTACK_PAGES 4
|
#define ZFS_MIN_KSTACK_PAGES 4
|
||||||
|
|
||||||
|
@ -305,16 +306,25 @@ zfs_modevent(module_t mod, int type, void *unused __unused)
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MOD_LOAD:
|
case MOD_LOAD:
|
||||||
err = zfs__init();
|
err = zfs__init();
|
||||||
if (err == 0)
|
if (err == 0) {
|
||||||
zfs_shutdown_event_tag = EVENTHANDLER_REGISTER(
|
zfs_shutdown_event_tag = EVENTHANDLER_REGISTER(
|
||||||
shutdown_post_sync, zfs_shutdown, NULL,
|
shutdown_post_sync, zfs_shutdown, NULL,
|
||||||
SHUTDOWN_PRI_FIRST);
|
SHUTDOWN_PRI_FIRST);
|
||||||
|
zfs_mountroot_event_tag = EVENTHANDLER_REGISTER(
|
||||||
|
mountroot, spa_boot_init, NULL,
|
||||||
|
SI_ORDER_ANY);
|
||||||
|
}
|
||||||
return (err);
|
return (err);
|
||||||
case MOD_UNLOAD:
|
case MOD_UNLOAD:
|
||||||
err = zfs__fini();
|
err = zfs__fini();
|
||||||
if (err == 0 && zfs_shutdown_event_tag != NULL)
|
if (err == 0) {
|
||||||
EVENTHANDLER_DEREGISTER(shutdown_post_sync,
|
if (zfs_shutdown_event_tag != NULL)
|
||||||
zfs_shutdown_event_tag);
|
EVENTHANDLER_DEREGISTER(shutdown_post_sync,
|
||||||
|
zfs_shutdown_event_tag);
|
||||||
|
if (zfs_mountroot_event_tag != NULL)
|
||||||
|
EVENTHANDLER_DEREGISTER(mountroot,
|
||||||
|
zfs_mountroot_event_tag);
|
||||||
|
}
|
||||||
return (err);
|
return (err);
|
||||||
case MOD_SHUTDOWN:
|
case MOD_SHUTDOWN:
|
||||||
return (0);
|
return (0);
|
||||||
|
@ -330,9 +340,6 @@ static moduledata_t zfs_mod = {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _KERNEL
|
|
||||||
EVENTHANDLER_DEFINE(mountroot, spa_boot_init, NULL, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FEATURE(zfs, "OpenZFS support");
|
FEATURE(zfs, "OpenZFS support");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue