diff options
author | phk <phk@FreeBSD.org> | 1995-03-01 05:05:21 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1995-03-01 05:05:21 +0000 |
commit | bfcb419e68efbbb96953c29a9b4c15c948b1e11c (patch) | |
tree | fb41ccd717384e3e7cb9d529d3f6cdd6917ca01a | |
parent | e9d6feff91f1559865ec282f9152b680d7d962a3 (diff) | |
download | FreeBSD-src-bfcb419e68efbbb96953c29a9b4c15c948b1e11c.zip FreeBSD-src-bfcb419e68efbbb96953c29a9b4c15c948b1e11c.tar.gz |
Less bogus allocation of softc to avoid races.
Thanks for the hint David!
-rw-r--r-- | sys/dev/vn/vn.c | 47 |
1 files changed, 17 insertions, 30 deletions
diff --git a/sys/dev/vn/vn.c b/sys/dev/vn/vn.c index fa4c114..04f217b 100644 --- a/sys/dev/vn/vn.c +++ b/sys/dev/vn/vn.c @@ -1,4 +1,3 @@ -#define DEBUG 1 /* * Copyright (c) 1988 University of Utah. * Copyright (c) 1990, 1993 @@ -62,6 +61,12 @@ #include "vn.h" #if NVN > 0 +/* default is to have 8 VN's */ +#if NVN < 8 +#undef NVN +#define NVN 8 +#endif + #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -120,8 +125,7 @@ struct vn_softc { /* sc_flags */ #define VNF_INITED 0x01 -struct vn_softc **vn_softc; -int numvnd; +struct vn_softc *vn_softc[NVN]; /* * XXX these decls should be static (without __P(())) or elsewhere. @@ -142,13 +146,15 @@ int vndump __P((dev_t dev)); int vnclose(dev_t dev, int flags, int mode, struct proc *p) { -#ifdef TEST_LABELLING struct vn_softc *vn; vn = vn_softc[vnunit(dev)]; +#ifdef TEST_LABELLING if (vn->sc_slices != NULL) dsclose(dev, mode, vn->sc_slices); #endif + vn_softc[vnunit(dev)] = 0; + free(vn, M_DEVBUF); return (0); } @@ -156,30 +162,15 @@ int vnopen(dev_t dev, int flags, int mode, struct proc *p) { int unit = vnunit(dev),size; - struct vn_softc **vscp, **old, *vn; + struct vn_softc *vn; #ifdef DEBUG if (vndebug & VDB_FOLLOW) printf("vnopen(0x%lx, 0x%x, 0x%x, %p)\n", dev, flags, mode, p); #endif - if (unit >= numvnd) { - /* - * We need to get more space for our config. If you say - * this is overkill, you're absolutely right. - */ - size = (unit+1) * (sizeof *vn_softc); - vscp = (struct vn_softc **) malloc(size, M_DEVBUF, M_WAITOK); - if (!vscp) - return(ENOMEM); - bzero(vscp,size); - if (numvnd) - bcopy(vn_softc, vscp, numvnd * (sizeof *vn_softc)); - numvnd = unit + 1; - old = vn_softc; - vn_softc = vscp; - if (old) - free(old, M_DEVBUF); - } + if (unit >= NVN) + return(ENOENT); + vn = vn_softc[unit]; if (!vn) { vn = malloc(sizeof *vn, M_DEVBUF, M_WAITOK); @@ -449,10 +440,7 @@ vnioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) error = suser(p->p_ucred, &p->p_acflag); if (error) return (error); - /* - * XXX test is unnecessary? - */ - if (unit >= numvnd) + if (unit >= NVN) return (ENXIO); vn = vn_softc[unit]; @@ -588,7 +576,7 @@ vnshutdown() { int i; - for (i = 0; i < numvnd; i++) + for (i = 0; i < NVN; i++) if (vn_softc[i] && vn_softc[i]->sc_flags & VNF_INITED) vnclear(vn_softc[i]); } @@ -624,8 +612,7 @@ vnsize(dev_t dev) { int unit = vnunit(dev); - if (!vn_softc || - unit >= numvnd || + if (unit >= NVN || (!vn_softc[unit]) || (vn_softc[unit]->sc_flags & VNF_INITED) == 0) return(-1); return(vn_softc[unit]->sc_size); |