summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/vn/vn.c98
1 files changed, 53 insertions, 45 deletions
diff --git a/sys/dev/vn/vn.c b/sys/dev/vn/vn.c
index fe832a030bbd..b3ea3eb5e13a 100644
--- a/sys/dev/vn/vn.c
+++ b/sys/dev/vn/vn.c
@@ -38,7 +38,7 @@
* from: Utah Hdr: vn.c 1.13 94/04/02
*
* from: @(#)vn.c 8.6 (Berkeley) 4/1/94
- * $Id: vn.c,v 1.70 1998/09/12 18:46:06 sos Exp $
+ * $Id: vn.c,v 1.71 1998/09/14 19:56:38 sos Exp $
*/
/*
@@ -84,6 +84,7 @@
#include <sys/diskslice.h>
#include <sys/stat.h>
#include <sys/conf.h>
+#include <sys/module.h>
#ifdef DEVFS
#include <sys/devfsext.h>
#endif /*DEVFS*/
@@ -144,8 +145,8 @@ static u_long vn_options;
static void vniodone (struct buf *bp);
static int vnsetcred (struct vn_softc *vn, struct ucred *cred);
-static void vnshutdown (int, void *);
static void vnclear (struct vn_softc *vn);
+static int vn_modevent (module_t, int, void *);
static int
vnclose(dev_t dev, int flags, int mode, struct proc *p)
@@ -594,16 +595,6 @@ vnsetcred(struct vn_softc *vn, struct ucred *cred)
}
void
-vnshutdown(int howto, void *ignored)
-{
- int i;
-
- for (i = 0; i < NVN; i++)
- if (vn_softc[i] && vn_softc[i]->sc_flags & VNF_INITED)
- vnclear(vn_softc[i]);
-}
-
-void
vnclear(struct vn_softc *vn)
{
register struct vnode *vp = vn->sc_vp;
@@ -640,45 +631,62 @@ vndump(dev_t dev)
return (ENODEV);
}
-static vn_devsw_installed = 0;
-
-static void
-vn_drvinit(void *unused)
+static int
+vn_modevent(module_t mod, int type, void *data)
{
-#ifdef DEVFS
int unit;
-#endif
- if(!vn_devsw_installed ) {
- if (at_shutdown(&vnshutdown, NULL, SHUTDOWN_POST_SYNC)) {
- printf("vn: could not install shutdown hook\n");
- return;
- }
- cdevsw_add_generic(BDEV_MAJOR, CDEV_MAJOR, &vn_cdevsw);
- vn_devsw_installed = 1;
- }
+ struct vn_softc *vn;
+
+ switch (type) {
+ case MOD_LOAD:
#ifdef DEVFS
- for (unit = 0; unit < NVN; unit++) {
- struct vn_softc *vn;
+ for (unit = 0; unit < NVN; unit++) {
+ vn = malloc(sizeof *vn, M_DEVBUF, M_WAITOK);
+ if (!vn)
+ continue; /* "oops" */
+ bzero(vn, sizeof *vn);
+ vn_softc[unit] = vn;
+ vn->r_devfs_token = devfs_add_devswf(&vn_cdevsw,
+ dkmakeminor(unit, 0, 0),
+ DV_CHR, UID_ROOT,
+ GID_OPERATOR, 0640,
+ "rvn%d", unit);
+ vn->devfs_token = devfs_add_devswf(&vn_cdevsw,
+ dkmakeminor(unit, 0, 0),
+ DV_BLK, UID_ROOT,
+ GID_OPERATOR, 0640,
+ "vn%d", unit);
+ }
+#endif
+ break;
- vn = malloc(sizeof *vn, M_DEVBUF, M_NOWAIT);
- if (!vn)
- return;
- bzero(vn, sizeof *vn);
- vn_softc[unit] = vn;
- vn->r_devfs_token = devfs_add_devswf(&vn_cdevsw,
- dkmakeminor(unit, 0, 0),
- DV_CHR, UID_ROOT,
- GID_OPERATOR, 0640,
- "rvn%d", unit);
- vn->devfs_token = devfs_add_devswf(&vn_cdevsw,
- dkmakeminor(unit, 0, 0),
- DV_BLK, UID_ROOT,
- GID_OPERATOR, 0640,
- "vn%d", unit);
- }
+ case MOD_UNLOAD:
+#ifdef DEVFS
+ for (unit = 0; unit < NVN; unit++) {
+ vn = vn_softc[unit];
+ if (vn->r_devfs_token) {
+ devfs_remove_dev(vn->r_devfs_token);
+ vn->r_devfs_token = 0;
+ }
+ if (vn->devfs_token) {
+ devfs_remove_dev(vn->devfs_token);
+ vn->devfs_token = 0;
+ }
+ }
#endif
+ /* fall through */
+ case MOD_SHUTDOWN:
+ for (unit = 0; unit < NVN; unit++)
+ if (vn_softc[unit] &&
+ vn_softc[unit]->sc_flags & VNF_INITED)
+ vnclear(vn_softc[unit]);
+ break;
+ default:
+ break;
+ }
+ return 0;
}
-SYSINIT(vndev, SI_SUB_DRIVERS, SI_ORDER_ANY, vn_drvinit, NULL)
+BDEV_MODULE(vn, BDEV_MAJOR, CDEV_MAJOR, vn_cdevsw, vn_modevent, 0);
#endif