Module Name: src
Committed By: pgoyette
Date: Mon Jul 25 22:06:09 UTC 2016
Modified Files:
src/sys/dev [pgoyette-localcount]: vnd.c
Log Message:
Update vnd for using localcount(9)
To generate a diff of this commit:
cvs rdiff -u -r1.256.2.3 -r1.256.2.4 src/sys/dev/vnd.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/vnd.c
diff -u src/sys/dev/vnd.c:1.256.2.3 src/sys/dev/vnd.c:1.256.2.4
--- src/sys/dev/vnd.c:1.256.2.3 Tue Jul 19 06:26:58 2016
+++ src/sys/dev/vnd.c Mon Jul 25 22:06:09 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: vnd.c,v 1.256.2.3 2016/07/19 06:26:58 pgoyette Exp $ */
+/* $NetBSD: vnd.c,v 1.256.2.4 2016/07/25 22:06:09 pgoyette Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.256.2.3 2016/07/19 06:26:58 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.256.2.4 2016/07/25 22:06:09 pgoyette Exp $");
#if defined(_KERNEL_OPT)
#include "opt_vnd.h"
@@ -324,6 +324,7 @@ vnd_destroy(device_t dev)
static int
vndopen(dev_t dev, int flags, int mode, struct lwp *l)
{
+ device_t self;
int unit = vndunit(dev);
struct vnd_softc *sc;
int error = 0, part, pmask;
@@ -333,7 +334,7 @@ vndopen(dev_t dev, int flags, int mode,
if (vnddebug & VDB_FOLLOW)
printf("vndopen(0x%"PRIx64", 0x%x, 0x%x, %p)\n", dev, flags, mode, l);
#endif
- sc = device_lookup_private(&vnd_cd, unit);
+ sc = device_lookup_private_acquire(&vnd_cd, unit, &self);
if (sc == NULL) {
sc = vnd_spawn(unit);
if (sc == NULL)
@@ -410,12 +411,14 @@ vndopen(dev_t dev, int flags, int mode,
done:
mutex_exit(&sc->sc_dkdev.dk_openlock);
vndunlock(sc);
+ device_release(self);
return error;
}
static int
vndclose(dev_t dev, int flags, int mode, struct lwp *l)
{
+ device_t self;
int unit = vndunit(dev);
struct vnd_softc *sc;
int error = 0, part;
@@ -424,12 +427,17 @@ vndclose(dev_t dev, int flags, int mode,
if (vnddebug & VDB_FOLLOW)
printf("vndclose(0x%"PRIx64", 0x%x, 0x%x, %p)\n", dev, flags, mode, l);
#endif
- sc = device_lookup_private(&vnd_cd, unit);
- if (sc == NULL)
+ sc = device_lookup_private_acquire(&vnd_cd, unit, &self);
+ if (sc == NULL) {
+ if (self != NULL)
+ device_release(self);
return ENXIO;
+ }
- if ((error = vndlock(sc)) != 0)
+ if ((error = vndlock(sc)) != 0) {
+ device_release(self);
return error;
+ }
mutex_enter(&sc->sc_dkdev.dk_openlock);
@@ -462,10 +470,12 @@ vndclose(dev_t dev, int flags, int mode,
if ((error = vnd_destroy(sc->sc_dev)) != 0) {
aprint_error_dev(sc->sc_dev,
"unable to detach instance\n");
+ device_release(self);
return error;
}
}
+ device_release(self);
return 0;
}
@@ -475,9 +485,10 @@ vndclose(dev_t dev, int flags, int mode,
static void
vndstrategy(struct buf *bp)
{
+ device_t self;
int unit = vndunit(bp->b_dev);
struct vnd_softc *vnd =
- device_lookup_private(&vnd_cd, unit);
+ device_lookup_private_acquire(&vnd_cd, unit, &self);
struct disklabel *lp;
daddr_t blkno;
int s = splbio();
@@ -561,12 +572,15 @@ vndstrategy(struct buf *bp)
bufq_put(vnd->sc_tab, bp);
wakeup(&vnd->sc_tab);
splx(s);
+ device_release(self);
return;
done:
bp->b_resid = bp->b_bcount;
biodone(bp);
splx(s);
+ if (self != NULL)
+ device_release(self);
}
static bool
@@ -981,6 +995,8 @@ vndiodone(struct buf *bp)
static int
vndread(dev_t dev, struct uio *uio, int flags)
{
+ device_t self;
+ int error;
int unit = vndunit(dev);
struct vnd_softc *sc;
@@ -989,20 +1005,29 @@ vndread(dev_t dev, struct uio *uio, int
printf("vndread(0x%"PRIx64", %p)\n", dev, uio);
#endif
- sc = device_lookup_private(&vnd_cd, unit);
- if (sc == NULL)
+ sc = device_lookup_private_acquire(&vnd_cd, unit, &self);
+ if (sc == NULL) {
+ if (self != NULL)
+ device_release(self);
return ENXIO;
+ }
- if ((sc->sc_flags & VNF_INITED) == 0)
+ if ((sc->sc_flags & VNF_INITED) == 0) {
+ device_release(self);
return ENXIO;
+ }
- return physio(vndstrategy, NULL, dev, B_READ, minphys, uio);
+ error = physio(vndstrategy, NULL, dev, B_READ, minphys, uio);
+ device_release(self);
+ return error;
}
/* ARGSUSED */
static int
vndwrite(dev_t dev, struct uio *uio, int flags)
{
+ device_t self;
+ int error;
int unit = vndunit(dev);
struct vnd_softc *sc;
@@ -1011,19 +1036,27 @@ vndwrite(dev_t dev, struct uio *uio, int
printf("vndwrite(0x%"PRIx64", %p)\n", dev, uio);
#endif
- sc = device_lookup_private(&vnd_cd, unit);
- if (sc == NULL)
+ sc = device_lookup_private_acquire(&vnd_cd, unit, &self);
+ if (sc == NULL) {
+ if (self != NULL)
+ device_release(self);
return ENXIO;
+ }
- if ((sc->sc_flags & VNF_INITED) == 0)
+ if ((sc->sc_flags & VNF_INITED) == 0) {
+ device_release(self);
return ENXIO;
+ }
- return physio(vndstrategy, NULL, dev, B_WRITE, minphys, uio);
+ error = physio(vndstrategy, NULL, dev, B_WRITE, minphys, uio);
+ device_release(self);
+ return error;
}
static int
vnd_cget(struct lwp *l, int unit, int *un, struct vattr *va)
{
+ device_t self;
int error;
struct vnd_softc *vnd;
@@ -1032,16 +1065,22 @@ vnd_cget(struct lwp *l, int unit, int *u
if (*un < 0)
return EINVAL;
- vnd = device_lookup_private(&vnd_cd, *un);
- if (vnd == NULL)
+ vnd = device_lookup_private_acquire(&vnd_cd, *un, &self);
+ if (vnd == NULL) {
+ if (self != NULL)
+ device_release(self);
return -1;
+ }
- if ((vnd->sc_flags & VNF_INITED) == 0)
+ if ((vnd->sc_flags & VNF_INITED) == 0) {
+ device_release(self);
return -1;
+ }
vn_lock(vnd->sc_vp, LK_SHARED | LK_RETRY);
error = VOP_GETATTR(vnd->sc_vp, va, l->l_cred);
VOP_UNLOCK(vnd->sc_vp);
+ device_release(self);
return error;
}
@@ -1117,6 +1156,7 @@ vndioctl_get(struct lwp *l, void *data,
static int
vndioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
{
+ device_t self;
bool force;
int unit = vndunit(dev);
struct vnd_softc *vnd;
@@ -1175,8 +1215,11 @@ vndioctl(dev_t dev, u_long cmd, void *da
}
vnd = device_lookup_private(&vnd_cd, unit);
- if (vnd == NULL)
+ if (vnd == NULL) {
+ if (self != NULL)
+ device_release(self);
return ENXIO;
+ }
vio = (struct vnd_ioctl *)data;
/* Must be open for writes for these commands... */
@@ -1195,8 +1238,10 @@ vndioctl(dev_t dev, u_long cmd, void *da
#endif
case DIOCKLABEL:
case DIOCWLABEL:
- if ((flag & FWRITE) == 0)
+ if ((flag & FWRITE) == 0) {
+ device_release(self);
return EBADF;
+ }
}
/* Must be initialized for these... */
@@ -1219,25 +1264,31 @@ vndioctl(dev_t dev, u_long cmd, void *da
case ODIOCWDINFO:
case ODIOCGDEFLABEL:
#endif
- if ((vnd->sc_flags & VNF_INITED) == 0)
+ if ((vnd->sc_flags & VNF_INITED) == 0) {
+ device_release(self);
return ENXIO;
+ }
}
error = disk_ioctl(&vnd->sc_dkdev, dev, cmd, data, flag, l);
- if (error != EPASSTHROUGH)
+ if (error != EPASSTHROUGH) {
+ device_release(self);
return error;
-
+ }
switch (cmd) {
#ifdef VNDIOCSET50
case VNDIOCSET50:
#endif
case VNDIOCSET:
- if (vnd->sc_flags & VNF_INITED)
+ if (vnd->sc_flags & VNF_INITED) {
+ device_release(self);
return EBUSY;
-
- if ((error = vndlock(vnd)) != 0)
+ }
+ if ((error = vndlock(vnd)) != 0) {
+ device_release(self);
return error;
+ }
fflags = FREAD;
if ((vio->vnd_flags & VNDIOF_READONLY) == 0)
@@ -1499,6 +1550,7 @@ unlock_and_exit:
}
#endif /* VND_COMPRESSION */
vndunlock(vnd);
+ device_release(self);
return error;
#ifdef VNDIOCCLR50
@@ -1509,8 +1561,10 @@ unlock_and_exit:
pmask = (1 << part);
force = (vio->vnd_flags & VNDIOF_FORCE) != 0;
- if ((error = vnddoclear(vnd, pmask, minor(dev), force)) != 0)
+ if ((error = vnddoclear(vnd, pmask, minor(dev), force)) != 0) {
+ device_release(self);
return error;
+ }
break;
@@ -1524,8 +1578,10 @@ unlock_and_exit:
{
struct disklabel *lp;
- if ((error = vndlock(vnd)) != 0)
+ if ((error = vndlock(vnd)) != 0) {
+ device_release(self);
return error;
+ }
vnd->sc_flags |= VNF_LABELLING;
@@ -1555,8 +1611,10 @@ unlock_and_exit:
vndunlock(vnd);
- if (error)
+ if (error) {
+ device_release(self);
return error;
+ }
break;
}
@@ -1581,8 +1639,10 @@ unlock_and_exit:
#ifdef __HAVE_OLD_DISKLABEL
case ODIOCGDEFLABEL:
vndgetdefaultlabel(vnd, &newlabel);
- if (newlabel.d_npartitions > OLDMAXPARTITIONS)
+ if (newlabel.d_npartitions > OLDMAXPARTITIONS) {
+ device_release(self);
return ENOTTY;
+ }
memcpy(data, &newlabel, sizeof (struct olddisklabel));
break;
#endif
@@ -1591,13 +1651,17 @@ unlock_and_exit:
vn_lock(vnd->sc_vp, LK_EXCLUSIVE | LK_RETRY);
error = VOP_FSYNC(vnd->sc_vp, vnd->sc_cred,
FSYNC_WAIT | FSYNC_DATAONLY | FSYNC_CACHE, 0, 0);
- VOP_UNLOCK(vnd->sc_vp);
+ VOP_UNLOCK(vnd->sc_vp); {
+ device_release(self);
return error;
+ }
default:
+ device_release(self);
return ENOTTY;
}
+ device_release(self);
return 0;
}
@@ -1742,25 +1806,33 @@ vndclear(struct vnd_softc *vnd, int mymi
static int
vndsize(dev_t dev)
{
+ device_t self;
struct vnd_softc *sc;
struct disklabel *lp;
int part, unit, omask;
int size;
unit = vndunit(dev);
- sc = device_lookup_private(&vnd_cd, unit);
- if (sc == NULL)
+ sc = device_lookup_private_acquire(&vnd_cd, unit, &self);
+ if (sc == NULL) {
+ if (self != NULL)
+ device_release(self);
return -1;
+ }
- if ((sc->sc_flags & VNF_INITED) == 0)
+ if ((sc->sc_flags & VNF_INITED) == 0) {
+ device_release(self);
return -1;
+ }
part = DISKPART(dev);
omask = sc->sc_dkdev.dk_openmask & (1 << part);
lp = sc->sc_dkdev.dk_label;
- if (omask == 0 && vndopen(dev, 0, S_IFBLK, curlwp)) /* XXX */
+ if (omask == 0 && vndopen(dev, 0, S_IFBLK, curlwp)) { /* XXX */
+ device_release(self);
return -1;
+ }
if (lp->d_partitions[part].p_fstype != FS_SWAP)
size = -1;
@@ -1768,9 +1840,12 @@ vndsize(dev_t dev)
size = lp->d_partitions[part].p_size *
(lp->d_secsize / DEV_BSIZE);
- if (omask == 0 && vndclose(dev, 0, S_IFBLK, curlwp)) /* XXX */
+ if (omask == 0 && vndclose(dev, 0, S_IFBLK, curlwp)) { /* XXX */
+ device_release(self);
return -1;
+ }
+ device_release(self);
return size;
}
@@ -1912,10 +1987,11 @@ vndunlock(struct vnd_softc *sc)
static void
compstrategy(struct buf *bp, off_t bn)
{
+ device_t self;
int error;
int unit = vndunit(bp->b_dev);
struct vnd_softc *vnd =
- device_lookup_private(&vnd_cd, unit);
+ device_lookup_private_acquire(&vnd_cd, unit, &self);
u_int32_t comp_block;
struct uio auio;
char *addr;
@@ -1942,6 +2018,7 @@ compstrategy(struct buf *bp, off_t bn)
if (comp_block >= vnd->sc_comp_numoffs) {
bp->b_error = EINVAL;
splx(s);
+ device_release(self);
return;
}
@@ -1958,6 +2035,7 @@ compstrategy(struct buf *bp, off_t bn)
bp->b_error = error;
VOP_UNLOCK(vnd->sc_vp);
splx(s);
+ device_release(self);
return;
}
/* uncompress the buffer */
@@ -1975,6 +2053,7 @@ compstrategy(struct buf *bp, off_t bn)
bp->b_error = EBADMSG;
VOP_UNLOCK(vnd->sc_vp);
splx(s);
+ device_release(self);
return;
}
vnd->sc_comp_buffblk = comp_block;
@@ -1997,6 +2076,7 @@ compstrategy(struct buf *bp, off_t bn)
if (error) {
bp->b_error = error;
splx(s);
+ device_release(self);
return;
}
@@ -2004,6 +2084,7 @@ compstrategy(struct buf *bp, off_t bn)
addr += length_in_buffer;
bp->b_resid -= length_in_buffer;
}
+ device_release(self);
splx(s);
}