diff options
author | ru <ru@FreeBSD.org> | 2005-02-05 08:28:36 +0000 |
---|---|---|
committer | ru <ru@FreeBSD.org> | 2005-02-05 08:28:36 +0000 |
commit | 690fdeacb33ba6e423217f4f5304034ef686e14f (patch) | |
tree | bfef15bd02ae3fbb3862287846c919bc7439e24a /sys/netgraph/ng_eiface.c | |
parent | 7fde123e3aaa0702eb5ae71dc1a8b48e04f7e654 (diff) | |
download | FreeBSD-src-690fdeacb33ba6e423217f4f5304034ef686e14f.zip FreeBSD-src-690fdeacb33ba6e423217f4f5304034ef686e14f.tar.gz |
Create a per-module mutex on MOD_LOAD, and destroy it on MOD_UNLOAD.
(This fixes witness_destroy() panic after module unload.)
OK'ed by: rwatson, julian
Diffstat (limited to 'sys/netgraph/ng_eiface.c')
-rw-r--r-- | sys/netgraph/ng_eiface.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/sys/netgraph/ng_eiface.c b/sys/netgraph/ng_eiface.c index 6a711ca..e4f2198 100644 --- a/sys/netgraph/ng_eiface.c +++ b/sys/netgraph/ng_eiface.c @@ -92,6 +92,7 @@ static void ng_eiface_print_ioctl(struct ifnet *ifp, int cmd, caddr_t data); #endif /* Netgraph methods */ +static int ng_eiface_mod_event(module_t, int, void *); static ng_constructor_t ng_eiface_constructor; static ng_rcvmsg_t ng_eiface_rcvmsg; static ng_shutdown_t ng_eiface_rmnode; @@ -104,6 +105,7 @@ static ng_disconnect_t ng_eiface_disconnect; static struct ng_type typestruct = { .version = NG_ABI_VERSION, .name = NG_EIFACE_NODE_TYPE, + .mod_event = ng_eiface_mod_event, .constructor = ng_eiface_constructor, .rcvmsg = ng_eiface_rcvmsg, .shutdown = ng_eiface_rmnode, @@ -124,7 +126,6 @@ static int ng_units_in_use = 0; #define UNITS_BITSPERWORD (sizeof(*ng_eiface_units) * NBBY) static struct mtx ng_eiface_mtx; -MTX_SYSINIT(ng_eiface, &ng_eiface_mtx, "ng_eiface", MTX_DEF); /************************************************************************ HELPER STUFF @@ -665,3 +666,25 @@ ng_eiface_disconnect(hook_p hook) priv->ether = NULL; return (0); } + +/* + * Handle loading and unloading for this node type. + */ +static int +ng_eiface_mod_event(module_t mod, int event, void *data) +{ + int error = 0; + + switch (event) { + case MOD_LOAD: + mtx_init(&ng_eiface_mtx, "ng_eiface", NULL, MTX_DEF); + break; + case MOD_UNLOAD: + mtx_destroy(&ng_eiface_mtx); + break; + default: + error = EOPNOTSUPP; + break; + } + return (error); +} |