diff --git a/sys/net/if_ovpn.c b/sys/net/if_ovpn.c --- a/sys/net/if_ovpn.c +++ b/sys/net/if_ovpn.c @@ -2855,16 +2855,21 @@ ovpn_osd_jail_slot = osd_jail_register(NULL, methods); break; } - case MOD_UNLOAD: + case MOD_UNLOAD: { + VNET_ITERATOR_DECL(vnet_iter); + VNET_LIST_RLOCK(); + VNET_FOREACH(vnet_iter) { + struct if_clone *clone = VNET_VNET(vnet_iter, ovpn_cloner); + if (clone) { + ifc_detach_cloner(clone); + VNET_VNET(vnet_iter, ovpn_cloner) = NULL; + } + } + VNET_LIST_RUNLOCK(); if (ovpn_osd_jail_slot != 0) osd_jail_deregister(ovpn_osd_jail_slot); - CURVNET_SET(vnet0); - if (V_ovpn_cloner != NULL) { - ifc_detach_cloner(V_ovpn_cloner); - V_ovpn_cloner = NULL; - } - CURVNET_RESTORE(); break; + } default: return (EOPNOTSUPP); }