Module Name:    src
Committed By:   pgoyette
Date:           Wed Jul 20 23:47:58 UTC 2016

Modified Files:
        src/sys/coda [pgoyette-localcount]: coda_vfsops.c
        src/sys/compat/common [pgoyette-localcount]: tty_60.c
        src/sys/compat/linux/arch/amd64 [pgoyette-localcount]: linux_machdep.c
        src/sys/compat/linux/arch/i386 [pgoyette-localcount]: linux_machdep.c
        src/sys/compat/linux/common [pgoyette-localcount]: linux_ioctl.c
        src/sys/dev [pgoyette-localcount]: clockctl.c
        src/sys/dev/dkwedge [pgoyette-localcount]: dk.c
        src/sys/dev/ir [pgoyette-localcount]: irframe_tty.c
        src/sys/dev/raidframe [pgoyette-localcount]: rf_netbsdkintf.c
        src/sys/fs/adosfs [pgoyette-localcount]: advfsops.c
        src/sys/fs/cd9660 [pgoyette-localcount]: cd9660_vfsops.c
        src/sys/fs/filecorefs [pgoyette-localcount]: filecore_vfsops.c
        src/sys/fs/hfs [pgoyette-localcount]: hfs_vfsops.c
        src/sys/fs/msdosfs [pgoyette-localcount]: msdosfs_vfsops.c
        src/sys/fs/nilfs [pgoyette-localcount]: nilfs_vfsops.c
        src/sys/fs/ntfs [pgoyette-localcount]: ntfs_vfsops.c
        src/sys/fs/sysvbfs [pgoyette-localcount]: sysvbfs_vfsops.c
        src/sys/fs/udf [pgoyette-localcount]: udf_vfsops.c
        src/sys/fs/v7fs [pgoyette-localcount]: v7fs_vfsops.c
        src/sys/kern [pgoyette-localcount]: tty.c tty_pty.c vfs_mount.c
        src/sys/miscfs/specfs [pgoyette-localcount]: spec_vnops.c
        src/sys/net [pgoyette-localcount]: ppp_tty.c
        src/sys/ufs/chfs [pgoyette-localcount]: chfs_vfsops.c
        src/sys/ufs/ext2fs [pgoyette-localcount]: ext2fs_vfsops.c
        src/sys/ufs/ffs [pgoyette-localcount]: ffs_vfsops.c
        src/sys/ufs/lfs [pgoyette-localcount]: lfs_vfsops.c
        src/sys/uvm [pgoyette-localcount]: uvm_device.c uvm_swap.c

Log Message:
Adapt machine-independant code to the new {b,c}devsw reference-counting
(using localcount(9)).  All callers of {b,c}devsw_lookup() now call
{b,c}devsw_lookup_acquire() which retains a reference on the 'struct
{b,c}devsw'.  This reference must be released by the caller once it is
finished with the structure's content (or other data that would disappear
if the 'struct {b,c}devsw' were to disappear).


To generate a diff of this commit:
cvs rdiff -u -r1.84 -r1.84.2.1 src/sys/coda/coda_vfsops.c
cvs rdiff -u -r1.4 -r1.4.2.1 src/sys/compat/common/tty_60.c
cvs rdiff -u -r1.48 -r1.48.10.1 \
    src/sys/compat/linux/arch/amd64/linux_machdep.c
cvs rdiff -u -r1.162 -r1.162.2.1 \
    src/sys/compat/linux/arch/i386/linux_machdep.c
cvs rdiff -u -r1.58 -r1.58.10.1 src/sys/compat/linux/common/linux_ioctl.c
cvs rdiff -u -r1.34 -r1.34.2.1 src/sys/dev/clockctl.c
cvs rdiff -u -r1.91 -r1.91.2.1 src/sys/dev/dkwedge/dk.c
cvs rdiff -u -r1.61 -r1.61.2.1 src/sys/dev/ir/irframe_tty.c
cvs rdiff -u -r1.345.2.4 -r1.345.2.5 src/sys/dev/raidframe/rf_netbsdkintf.c
cvs rdiff -u -r1.75 -r1.75.2.1 src/sys/fs/adosfs/advfsops.c
cvs rdiff -u -r1.90 -r1.90.2.1 src/sys/fs/cd9660/cd9660_vfsops.c
cvs rdiff -u -r1.78 -r1.78.2.1 src/sys/fs/filecorefs/filecore_vfsops.c
cvs rdiff -u -r1.33 -r1.33.2.1 src/sys/fs/hfs/hfs_vfsops.c
cvs rdiff -u -r1.118 -r1.118.2.1 src/sys/fs/msdosfs/msdosfs_vfsops.c
cvs rdiff -u -r1.22 -r1.22.2.1 src/sys/fs/nilfs/nilfs_vfsops.c
cvs rdiff -u -r1.104 -r1.104.2.1 src/sys/fs/ntfs/ntfs_vfsops.c
cvs rdiff -u -r1.46 -r1.46.2.1 src/sys/fs/sysvbfs/sysvbfs_vfsops.c
cvs rdiff -u -r1.73 -r1.73.2.1 src/sys/fs/udf/udf_vfsops.c
cvs rdiff -u -r1.12 -r1.12.2.1 src/sys/fs/v7fs/v7fs_vfsops.c
cvs rdiff -u -r1.271 -r1.271.2.1 src/sys/kern/tty.c
cvs rdiff -u -r1.142.2.2 -r1.142.2.3 src/sys/kern/tty_pty.c
cvs rdiff -u -r1.40 -r1.40.2.1 src/sys/kern/vfs_mount.c
cvs rdiff -u -r1.162 -r1.162.2.1 src/sys/miscfs/specfs/spec_vnops.c
cvs rdiff -u -r1.61 -r1.61.2.1 src/sys/net/ppp_tty.c
cvs rdiff -u -r1.15 -r1.15.2.1 src/sys/ufs/chfs/chfs_vfsops.c
cvs rdiff -u -r1.193 -r1.193.2.1 src/sys/ufs/ext2fs/ext2fs_vfsops.c
cvs rdiff -u -r1.339 -r1.339.2.1 src/sys/ufs/ffs/ffs_vfsops.c
cvs rdiff -u -r1.351 -r1.351.2.1 src/sys/ufs/lfs/lfs_vfsops.c
cvs rdiff -u -r1.64 -r1.64.2.1 src/sys/uvm/uvm_device.c
cvs rdiff -u -r1.174 -r1.174.2.1 src/sys/uvm/uvm_swap.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/coda/coda_vfsops.c
diff -u src/sys/coda/coda_vfsops.c:1.84 src/sys/coda/coda_vfsops.c:1.84.2.1
--- src/sys/coda/coda_vfsops.c:1.84	Sat Dec 13 15:59:30 2014
+++ src/sys/coda/coda_vfsops.c	Wed Jul 20 23:47:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: coda_vfsops.c,v 1.84 2014/12/13 15:59:30 hannken Exp $	*/
+/*	$NetBSD: coda_vfsops.c,v 1.84.2.1 2016/07/20 23:47:55 pgoyette Exp $	*/
 
 /*
  *
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: coda_vfsops.c,v 1.84 2014/12/13 15:59:30 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: coda_vfsops.c,v 1.84.2.1 2016/07/20 23:47:55 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -212,7 +212,7 @@ coda_mount(struct mount *vfsp,	/* Alloca
     }
     dev = dvp->v_rdev;
     vrele(dvp);
-    cdev = cdevsw_lookup(dev);
+    cdev = cdevsw_lookup_acquire(dev);
     if (cdev == NULL) {
 	MARK_INT_FAIL(CODA_MOUNT_STATS);
 	return(ENXIO);
@@ -224,11 +224,13 @@ coda_mount(struct mount *vfsp,	/* Alloca
     if (cdev != &vcoda_cdevsw)
     {
 	MARK_INT_FAIL(CODA_MOUNT_STATS);
+	cdevsw_release(cdev);
 	return(ENXIO);
     }
 
     if (minor(dev) >= NVCODA) {
 	MARK_INT_FAIL(CODA_MOUNT_STATS);
+	cdevsw_release(cdev);
 	return(ENXIO);
     }
 
@@ -239,6 +241,7 @@ coda_mount(struct mount *vfsp,	/* Alloca
 
     if (!VC_OPEN(&mi->mi_vcomm)) {
 	MARK_INT_FAIL(CODA_MOUNT_STATS);
+	cdevsw_release(cdev);
 	return(ENODEV);
     }
 
@@ -280,8 +283,10 @@ coda_mount(struct mount *vfsp,	/* Alloca
     else
 	MARK_INT_SAT(CODA_MOUNT_STATS);
 
-    return set_statvfs_info("/coda", UIO_SYSSPACE, "CODA", UIO_SYSSPACE,
+    error = set_statvfs_info("/coda", UIO_SYSSPACE, "CODA", UIO_SYSSPACE,
 	vfsp->mnt_op->vfs_name, vfsp, l);
+    cdevsw_release(cdev);
+    return error;
 }
 
 int

Index: src/sys/compat/common/tty_60.c
diff -u src/sys/compat/common/tty_60.c:1.4 src/sys/compat/common/tty_60.c:1.4.2.1
--- src/sys/compat/common/tty_60.c:1.4	Thu Oct 22 15:18:25 2015
+++ src/sys/compat/common/tty_60.c	Wed Jul 20 23:47:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty_60.c,v 1.4 2015/10/22 15:18:25 christos Exp $	*/
+/*	$NetBSD: tty_60.c,v 1.4.2.1 2016/07/20 23:47:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tty_60.c,v 1.4 2015/10/22 15:18:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tty_60.c,v 1.4.2.1 2016/07/20 23:47:55 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -67,24 +67,28 @@ static int
 compat_60_ptmget_ioctl(dev_t dev, u_long cmd, void *data, int flag,
 	struct lwp *l)
 {
-	int ret;
+	int ret = 0;
 	u_long newcmd;
 	struct ptmget pg;
-	const struct cdevsw *cd = cdevsw_lookup(dev);
+	const struct cdevsw *cd = cdevsw_lookup_acquire(dev);
 
-	if (cd == NULL || cd->d_ioctl == NULL)
+	if (cd == NULL)
 		return ENXIO;
+	if (cd->d_ioctl == NULL) {
+		cdevsw_release(cd);
+		return ENXIO;
+	}
 
 	switch (cmd) {
 	case COMPAT_60_TIOCPTMGET:  newcmd = TIOCPTMGET; break;
 	case COMPAT_60_TIOCPTSNAME: newcmd = TIOCPTSNAME; break;
-	default: return ENOTTY;
+	default: ret = ENOTTY;
 	}
-
-	ret = (cd->d_ioctl)(dev, newcmd, &pg, flag, l);
-	if (ret != 0)
-		return ret;
-	ret = ptmget_to_ptmget60(&pg, data);
+	if (ret == 0)
+		ret = (cd->d_ioctl)(dev, newcmd, &pg, flag, l);
+	if (ret == 0)
+		ret = ptmget_to_ptmget60(&pg, data);
+	cdevsw_release(cd);
 	return ret;
 }
 

Index: src/sys/compat/linux/arch/amd64/linux_machdep.c
diff -u src/sys/compat/linux/arch/amd64/linux_machdep.c:1.48 src/sys/compat/linux/arch/amd64/linux_machdep.c:1.48.10.1
--- src/sys/compat/linux/arch/amd64/linux_machdep.c:1.48	Wed Feb 19 20:50:56 2014
+++ src/sys/compat/linux/arch/amd64/linux_machdep.c	Wed Jul 20 23:47:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_machdep.c,v 1.48 2014/02/19 20:50:56 dsl Exp $ */
+/*	$NetBSD: linux_machdep.c,v 1.48.10.1 2016/07/20 23:47:55 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.48 2014/02/19 20:50:56 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.48.10.1 2016/07/20 23:47:55 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -268,26 +268,30 @@ linux_sys_ioperm(struct lwp *l, const st
 dev_t
 linux_fakedev(dev_t dev, int raw)
 {
+	dev_t ret;
+	extern const struct cdevsw ptc_cdevsw, pts_cdevsw;
+	const struct cdevsw *cd = cdevsw_lookup_acquire(dev);
 
-       extern const struct cdevsw ptc_cdevsw, pts_cdevsw;
-       const struct cdevsw *cd = cdevsw_lookup(dev);
-
-       if (raw) {
+	if (raw) {
 #if (NWSDISPLAY > 0)
-	       extern const struct cdevsw wsdisplay_cdevsw;
-	       if (cd == &wsdisplay_cdevsw)
-		       return makedev(LINUX_CONS_MAJOR, (minor(dev) + 1));
+		extern const struct cdevsw wsdisplay_cdevsw;
+		if (cd == &wsdisplay_cdevsw) {
+			cdevsw_release(cd);
+			return makedev(LINUX_CONS_MAJOR, (minor(dev) + 1));
+		}
 #endif
-       }
-
-       if (cd == &ptc_cdevsw)
-	       return makedev(LINUX_PTC_MAJOR, minor(dev));
-       if (cd == &pts_cdevsw)
-	       return makedev(LINUX_PTS_MAJOR, minor(dev));
+	}
 
-	return ((minor(dev) & 0xff) | ((major(dev) & 0xfff) << 8)
+	if (cd == &ptc_cdevsw)
+		ret = makedev(LINUX_PTC_MAJOR, minor(dev));
+	else if (cd == &pts_cdevsw)
+		ret = makedev(LINUX_PTS_MAJOR, minor(dev));
+	else ret = ((minor(dev) & 0xff) | ((major(dev) & 0xfff) << 8)
 	    | (((unsigned long long int) (minor(dev) & ~0xff)) << 12)
 	    | (((unsigned long long int) (major(dev) & ~0xfff)) << 32));
+
+	cdevsw_release(cd);
+	return ret;
 }
 
 int

Index: src/sys/compat/linux/arch/i386/linux_machdep.c
diff -u src/sys/compat/linux/arch/i386/linux_machdep.c:1.162 src/sys/compat/linux/arch/i386/linux_machdep.c:1.162.2.1
--- src/sys/compat/linux/arch/i386/linux_machdep.c:1.162	Wed Jul 13 15:59:54 2016
+++ src/sys/compat/linux/arch/i386/linux_machdep.c	Wed Jul 20 23:47:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_machdep.c,v 1.162 2016/07/13 15:59:54 maxv Exp $	*/
+/*	$NetBSD: linux_machdep.c,v 1.162.2.1 2016/07/20 23:47:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1995, 2000, 2008, 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.162 2016/07/13 15:59:54 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.162.2.1 2016/07/20 23:47:55 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_vm86.h"
@@ -653,23 +653,28 @@ linux_sys_modify_ldt(struct lwp *l, cons
 dev_t
 linux_fakedev(dev_t dev, int raw)
 {
+	dev_t ret;
 	extern const struct cdevsw ptc_cdevsw, pts_cdevsw;
-	const struct cdevsw *cd = cdevsw_lookup(dev);
+	const struct cdevsw *cd = cdevsw_lookup_acquire(dev);
 
 	if (raw) {
 #if (NWSDISPLAY > 0)
 		extern const struct cdevsw wsdisplay_cdevsw;
-		if (cd == &wsdisplay_cdevsw)
+		if (cd == &wsdisplay_cdevsw) {
+			cdevsw_release(cd);
 			return makedev(LINUX_CONS_MAJOR, (minor(dev) + 1));
+		}
 #endif
 	}
 
 	if (cd == &ptc_cdevsw)
-		return makedev(LINUX_PTC_MAJOR, minor(dev));
-	if (cd == &pts_cdevsw)
-		return makedev(LINUX_PTS_MAJOR, minor(dev));
-
-	return dev;
+		ret = makedev(LINUX_PTC_MAJOR, minor(dev));
+	else if (cd == &pts_cdevsw)
+		ret makedev(LINUX_PTS_MAJOR, minor(dev));
+	else
+		ret = dev;
+	cdevsw_release(cd);
+	return ret;
 }
 
 #if (NWSDISPLAY > 0)

Index: src/sys/compat/linux/common/linux_ioctl.c
diff -u src/sys/compat/linux/common/linux_ioctl.c:1.58 src/sys/compat/linux/common/linux_ioctl.c:1.58.10.1
--- src/sys/compat/linux/common/linux_ioctl.c:1.58	Sun Mar 23 06:03:38 2014
+++ src/sys/compat/linux/common/linux_ioctl.c	Wed Jul 20 23:47:55 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_ioctl.c,v 1.58 2014/03/23 06:03:38 dholland Exp $	*/
+/*	$NetBSD: linux_ioctl.c,v 1.58.10.1 2016/07/20 23:47:55 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_ioctl.c,v 1.58 2014/03/23 06:03:38 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_ioctl.c,v 1.58.10.1 2016/07/20 23:47:55 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "sequencer.h"
@@ -158,6 +158,7 @@ linux_sys_ioctl(struct lwp *l, const str
 		struct vnode *vp;
 		struct vattr va;
 		extern const struct cdevsw sequencer_cdevsw;
+		const struct cdevsw *cdev = NULL;
 
 		if ((fp = fd_getfile(SCARG(uap, fd))) == NULL)
 			return EBADF;
@@ -168,17 +169,21 @@ linux_sys_ioctl(struct lwp *l, const str
 			error = VOP_GETATTR(vp, &va, l->l_cred);
 			VOP_UNLOCK(vp);
 			if (error == 0 &&
-			    cdevsw_lookup(va.va_rdev) == &sequencer_cdevsw)
+			    (cdev = cdevsw_lookup_acquire(va.va_rdev)) ==
+					&sequencer_cdevsw)
 				is_sequencer = true;
 		}
 		if (is_sequencer) {
-			error = oss_ioctl_sequencer(l, (const void *)LINUX_TO_OSS(uap),
-						   retval);
+			error = oss_ioctl_sequencer(l,
+					(const void *)LINUX_TO_OSS(uap),
+					retval);
 		}
 		else {
 			error = linux_ioctl_termios(l, uap, retval);
 		}
 		fd_putfile(SCARG(uap, fd));
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 #else
 		error = linux_ioctl_termios(l, uap, retval);
 #endif

Index: src/sys/dev/clockctl.c
diff -u src/sys/dev/clockctl.c:1.34 src/sys/dev/clockctl.c:1.34.2.1
--- src/sys/dev/clockctl.c:1.34	Wed Jan  6 18:06:38 2016
+++ src/sys/dev/clockctl.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*      $NetBSD: clockctl.c,v 1.34 2016/01/06 18:06:38 christos Exp $ */
+/*      $NetBSD: clockctl.c,v 1.34.2.1 2016/07/20 23:47:56 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clockctl.c,v 1.34 2016/01/06 18:06:38 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clockctl.c,v 1.34.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ntp.h"
@@ -279,10 +279,13 @@ compat50_clockctlioctl(dev_t dev, u_long
     struct lwp *l)
 {
 	int error = 0;
-	const struct cdevsw *cd = cdevsw_lookup(dev);
+	const struct cdevsw *cd = cdevsw_lookup_acquire(dev);
 
-	if (cd == NULL || cd->d_ioctl == NULL)
+	if (cd == NULL || cd->d_ioctl == NULL) {
+		if (cd != NULL)
+			cdevsw_release(cd);
 		return ENXIO;
+	}
 
 	switch (cmd) {
 	case CLOCKCTL_OSETTIMEOFDAY: {
@@ -292,7 +295,7 @@ compat50_clockctlioctl(dev_t dev, u_long
 
 		error = copyin(args->tv, &tv50, sizeof(tv50));
 		if (error)
-			return (error);
+			break;
 		timeval50_to_timeval(&tv50, &tv);
 		error = settimeofday1(&tv, false, args->tzp, l, false);
 		break;
@@ -305,7 +308,7 @@ compat50_clockctlioctl(dev_t dev, u_long
 		if (args->delta) {
 			error = copyin(args->delta, &atv50, sizeof(atv50));
 			if (error)
-				return (error);
+				break;
 			timeval50_to_timeval(&atv50, &atv);
 		}
 		adjtime1(args->delta ? &atv : NULL,
@@ -323,7 +326,7 @@ compat50_clockctlioctl(dev_t dev, u_long
 
 		error = copyin(args->tp, &tp50, sizeof(tp50));
 		if (error)
-			return (error);
+			break;
 		timespec50_to_timespec(&tp50, &tp);
 		error = clock_settime1(l->l_proc, args->clock_id, &tp, true);
 		break;
@@ -337,6 +340,7 @@ compat50_clockctlioctl(dev_t dev, u_long
 		error = EINVAL;
 	}
 
+	cdevsw_release(cd);
 	return (error);
 }
 #endif

Index: src/sys/dev/dkwedge/dk.c
diff -u src/sys/dev/dkwedge/dk.c:1.91 src/sys/dev/dkwedge/dk.c:1.91.2.1
--- src/sys/dev/dkwedge/dk.c:1.91	Sun May 29 13:11:21 2016
+++ src/sys/dev/dkwedge/dk.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: dk.c,v 1.91 2016/05/29 13:11:21 mlelstv Exp $	*/
+/*	$NetBSD: dk.c,v 1.91.2.1 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.91 2016/05/29 13:11:21 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.91.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_dkwedge.h"
@@ -1590,8 +1590,9 @@ dkdump(dev_t dev, daddr_t blkno, void *v
 		goto out;
 	}
 
-	bdev = bdevsw_lookup(sc->sc_pdev);
+	bdev = bdevsw_lookup_acquire(sc->sc_pdev);
 	rv = (*bdev->d_dump)(sc->sc_pdev, blkno + sc->sc_offset, va, size);
+	bdevsw_release(bdev);
 
 out:
 	mutex_exit(&sc->sc_parent->dk_rawlock);

Index: src/sys/dev/ir/irframe_tty.c
diff -u src/sys/dev/ir/irframe_tty.c:1.61 src/sys/dev/ir/irframe_tty.c:1.61.2.1
--- src/sys/dev/ir/irframe_tty.c:1.61	Thu Aug 20 14:40:18 2015
+++ src/sys/dev/ir/irframe_tty.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: irframe_tty.c,v 1.61 2015/08/20 14:40:18 christos Exp $	*/
+/*	$NetBSD: irframe_tty.c,v 1.61.2.1 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*
  * TODO
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irframe_tty.c,v 1.61 2015/08/20 14:40:18 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irframe_tty.c,v 1.61.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -918,7 +918,7 @@ irt_ioctl(struct tty *tp, u_long cmd, vo
 	dev_t dev;
 
 	dev = tp->t_dev;
-	cdev = cdevsw_lookup(dev);
+	cdev = cdevsw_lookup_acquire(dev);
 	if (cdev != NULL)
 		error = (*cdev->d_ioctl)(dev, cmd, arg, 0, curlwp);
 	else
@@ -927,6 +927,8 @@ irt_ioctl(struct tty *tp, u_long cmd, vo
 	if (error)
 		printf("irt_ioctl: cmd=0x%08lx error=%d\n", cmd, error);
 #endif
+	if (cdev != NULL)
+		cdevsw_release(cdev);
 }
 
 void

Index: src/sys/dev/raidframe/rf_netbsdkintf.c
diff -u src/sys/dev/raidframe/rf_netbsdkintf.c:1.345.2.4 src/sys/dev/raidframe/rf_netbsdkintf.c:1.345.2.5
--- src/sys/dev/raidframe/rf_netbsdkintf.c:1.345.2.4	Tue Jul 19 06:26:59 2016
+++ src/sys/dev/raidframe/rf_netbsdkintf.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_netbsdkintf.c,v 1.345.2.4 2016/07/19 06:26:59 pgoyette Exp $	*/
+/*	$NetBSD: rf_netbsdkintf.c,v 1.345.2.5 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
  ***********************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.345.2.4 2016/07/19 06:26:59 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.345.2.5 2016/07/20 23:47:56 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -753,7 +753,7 @@ raid_dumpblocks(device_t dev, void *va, 
 		goto out;
 	}
 
-	bdev = bdevsw_lookup(raidPtr->Disks[dumpto].dev);
+	bdev = bdevsw_lookup_acquire(raidPtr->Disks[dumpto].dev);
 	if (bdev == NULL) {
 		error = ENXIO;
 		goto out;
@@ -761,7 +761,7 @@ raid_dumpblocks(device_t dev, void *va, 
 
 	error = (*bdev->d_dump)(raidPtr->Disks[dumpto].dev, 
 				blkno, va, nblk * raidPtr->bytesPerSector);
-	
+	bdevsw_release(bdev);
 out:
 	raidunlock(rs);
 		

Index: src/sys/fs/adosfs/advfsops.c
diff -u src/sys/fs/adosfs/advfsops.c:1.75 src/sys/fs/adosfs/advfsops.c:1.75.2.1
--- src/sys/fs/adosfs/advfsops.c:1.75	Wed Nov 18 22:06:25 2015
+++ src/sys/fs/adosfs/advfsops.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: advfsops.c,v 1.75 2015/11/18 22:06:25 phx Exp $	*/
+/*	$NetBSD: advfsops.c,v 1.75.2.1 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1994 Christian E. Hopps
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: advfsops.c,v 1.75 2015/11/18 22:06:25 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: advfsops.c,v 1.75.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -89,6 +89,7 @@ adosfs_mount(struct mount *mp, const cha
 	struct adosfsmount *amp;
 	int error;
 	mode_t accessmode;
+	const struct bdevsw *bdev;
 
 	if (args == NULL)
 		return EINVAL;
@@ -126,7 +127,7 @@ adosfs_mount(struct mount *mp, const cha
 		vrele(devvp);
 		return (ENOTBLK);
 	}
-	if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+	if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev)) == NULL) {
 		vrele(devvp);
 		return (ENXIO);
 	}
@@ -142,11 +143,13 @@ adosfs_mount(struct mount *mp, const cha
 	    KAUTH_REQ_SYSTEM_MOUNT_DEVICE, mp, devvp, KAUTH_ARG(accessmode));
 	VOP_UNLOCK(devvp);
 	if (error) {
+		bdevsw_release(bdev);
 		vrele(devvp);
 		return (error);
 	}
 /* MNT_UPDATE? */
 	if ((error = adosfs_mountfs(devvp, mp, l)) != 0) {
+		bdevsw_release(bdev);
 		vrele(devvp);
 		return (error);
 	}

Index: src/sys/fs/cd9660/cd9660_vfsops.c
diff -u src/sys/fs/cd9660/cd9660_vfsops.c:1.90 src/sys/fs/cd9660/cd9660_vfsops.c:1.90.2.1
--- src/sys/fs/cd9660/cd9660_vfsops.c:1.90	Sat Mar 28 19:24:05 2015
+++ src/sys/fs/cd9660/cd9660_vfsops.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: cd9660_vfsops.c,v 1.90 2015/03/28 19:24:05 maxv Exp $	*/
+/*	$NetBSD: cd9660_vfsops.c,v 1.90.2.1 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1994
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cd9660_vfsops.c,v 1.90 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cd9660_vfsops.c,v 1.90.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -214,6 +214,7 @@ cd9660_mount(struct mount *mp, const cha
 	struct iso_args *args = data;
 	int error;
 	struct iso_mnt *imp = VFSTOISOFS(mp);
+	const struct bdevsw *bdev;
 
 	if (args == NULL)
 		return EINVAL;
@@ -248,7 +249,7 @@ cd9660_mount(struct mount *mp, const cha
 		vrele(devvp);
 		return ENOTBLK;
 	}
-	if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+	if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev)) == NULL) {
 		vrele(devvp);
 		return ENXIO;
 	}
@@ -284,11 +285,14 @@ cd9660_mount(struct mount *mp, const cha
 		VOP_UNLOCK(devvp);
 		vrele(devvp);
 	}
-	return set_statvfs_info(path, UIO_USERSPACE, args->fspec, UIO_USERSPACE,
-	    mp->mnt_op->vfs_name, mp, l);
+	error = set_statvfs_info(path, UIO_USERSPACE, args->fspec,
+	    UIO_USERSPACE, mp->mnt_op->vfs_name, mp, l);
+	bdevsw_release(bdev);
+	return error;
 
 fail:
 	VOP_UNLOCK(devvp);
+	bdevsw_release(bdev);
 	vrele(devvp);
 	return (error);
 }

Index: src/sys/fs/filecorefs/filecore_vfsops.c
diff -u src/sys/fs/filecorefs/filecore_vfsops.c:1.78 src/sys/fs/filecorefs/filecore_vfsops.c:1.78.2.1
--- src/sys/fs/filecorefs/filecore_vfsops.c:1.78	Sat Mar 28 19:24:05 2015
+++ src/sys/fs/filecorefs/filecore_vfsops.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: filecore_vfsops.c,v 1.78 2015/03/28 19:24:05 maxv Exp $	*/
+/*	$NetBSD: filecore_vfsops.c,v 1.78.2.1 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1994 The Regents of the University of California.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: filecore_vfsops.c,v 1.78 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: filecore_vfsops.c,v 1.78.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -225,6 +225,7 @@ filecore_mount(struct mount *mp, const c
 	struct filecore_args *args = data;
 	int error;
 	struct filecore_mnt *fcmp = NULL;
+	const struct bdevsw *bdev;
 
 	if (args == NULL)
 		return EINVAL;
@@ -262,7 +263,7 @@ filecore_mount(struct mount *mp, const c
 		vrele(devvp);
 		return ENOTBLK;
 	}
-	if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+	if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev)) == NULL) {
 		vrele(devvp);
 		return ENXIO;
 	}
@@ -275,6 +276,7 @@ filecore_mount(struct mount *mp, const c
 	    KAUTH_REQ_SYSTEM_MOUNT_DEVICE, mp, devvp, KAUTH_ARG(VREAD));
 	VOP_UNLOCK(devvp);
 	if (error) {
+		bdevsw_release(bdev);
 		vrele(devvp);
 		return (error);
 	}
@@ -288,12 +290,15 @@ filecore_mount(struct mount *mp, const c
 			vrele(devvp);
 	}
 	if (error) {
+		bdevsw_release(bdev);
 		vrele(devvp);
 		return error;
 	}
 	fcmp = VFSTOFILECORE(mp);
-	return set_statvfs_info(path, UIO_USERSPACE, args->fspec, UIO_USERSPACE,
-	    mp->mnt_op->vfs_name, mp, l);
+	error = set_statvfs_info(path, UIO_USERSPACE, args->fspec,
+	    UIO_USERSPACE, mp->mnt_op->vfs_name, mp, l);
+	bdevsw_release(bdev);
+	return error;
 }
 
 /*

Index: src/sys/fs/hfs/hfs_vfsops.c
diff -u src/sys/fs/hfs/hfs_vfsops.c:1.33 src/sys/fs/hfs/hfs_vfsops.c:1.33.2.1
--- src/sys/fs/hfs/hfs_vfsops.c:1.33	Mon Dec 29 17:17:54 2014
+++ src/sys/fs/hfs/hfs_vfsops.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: hfs_vfsops.c,v 1.33 2014/12/29 17:17:54 maxv Exp $	*/
+/*	$NetBSD: hfs_vfsops.c,v 1.33.2.1 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2005, 2007 The NetBSD Foundation, Inc.
@@ -99,7 +99,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hfs_vfsops.c,v 1.33 2014/12/29 17:17:54 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hfs_vfsops.c,v 1.33.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -200,6 +200,7 @@ hfs_mount(struct mount *mp, const char *
 	int error = 0;
 	int update;
 	mode_t accessmode;
+	const struct bdevsw *bdev;
 
 	if (args == NULL)
 		return EINVAL;
@@ -227,6 +228,7 @@ hfs_mount(struct mount *mp, const char *
 #endif
 
 	/* Check arguments */
+	bdev = NULL;
 	if (args->fspec != NULL) {
 		/*
 		 * Look up the name and verify that it's sane.
@@ -242,7 +244,8 @@ hfs_mount(struct mount *mp, const char *
 			 */
 			if (devvp->v_type != VBLK)
 				error = ENOTBLK;
-			else if (bdevsw_lookup(devvp->v_rdev) == NULL)
+			else if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev))
+					== NULL)
 				error = ENXIO;
 		} else {
 			/*
@@ -320,9 +323,13 @@ hfs_mount(struct mount *mp, const char *
 	}
 #endif /* HFS_DEBUG */
 
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	return error;
 
 error:
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	vrele(devvp);
 	return error;
 }

Index: src/sys/fs/msdosfs/msdosfs_vfsops.c
diff -u src/sys/fs/msdosfs/msdosfs_vfsops.c:1.118 src/sys/fs/msdosfs/msdosfs_vfsops.c:1.118.2.1
--- src/sys/fs/msdosfs/msdosfs_vfsops.c:1.118	Sat Mar 28 19:24:05 2015
+++ src/sys/fs/msdosfs/msdosfs_vfsops.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: msdosfs_vfsops.c,v 1.118 2015/03/28 19:24:05 maxv Exp $	*/
+/*	$NetBSD: msdosfs_vfsops.c,v 1.118.2.1 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*-
  * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.118 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.118.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -282,6 +282,7 @@ msdosfs_mount(struct mount *mp, const ch
 	struct msdosfsmount *pmp = NULL;
 	int error, flags;
 	mode_t accessmode;
+	const struct bdevsw *bdev;
 
 	if (args == NULL)
 		return EINVAL;
@@ -384,7 +385,7 @@ msdosfs_mount(struct mount *mp, const ch
 		vrele(devvp);
 		return (ENOTBLK);
 	}
-	if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+	if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev)) == NULL) {
 		DPRINTF("no block switch");
 		vrele(devvp);
 		return (ENXIO);
@@ -402,6 +403,7 @@ msdosfs_mount(struct mount *mp, const ch
 	VOP_UNLOCK(devvp);
 	if (error) {
 		DPRINTF("KAUTH_REQ_SYSTEM_MOUNT_DEVICE %d", error);
+		bdevsw_release(bdev);
 		vrele(devvp);
 		return (error);
 	}
@@ -434,22 +436,27 @@ msdosfs_mount(struct mount *mp, const ch
 		vrele(devvp);
 		if (devvp != pmp->pm_devvp) {
 			DPRINTF("devvp %p pmp %p", devvp, pmp->pm_devvp);
+			bdevsw_release(bdev);
 			return (EINVAL);	/* needs translation */
 		}
 	}
 	if ((error = update_mp(mp, args)) != 0) {
 		msdosfs_unmount(mp, MNT_FORCE);
 		DPRINTF("update_mp %d", error);
+		bdevsw_release(bdev);
 		return error;
 	}
 
 #ifdef MSDOSFS_DEBUG
 	printf("msdosfs_mount(): mp %p, pmp %p, inusemap %p\n", mp, pmp, pmp->pm_inusemap);
 #endif
-	return set_statvfs_info(path, UIO_USERSPACE, args->fspec, UIO_USERSPACE,
-	    mp->mnt_op->vfs_name, mp, l);
-
+	error = set_statvfs_info(path, UIO_USERSPACE, args->fspec,
+	    UIO_USERSPACE, mp->mnt_op->vfs_name, mp, l);
+	bdevsw_release(bdev);
+	return error;
+	
 fail:
+	bdevsw_release(bdev);
 	vrele(devvp);
 	return (error);
 }

Index: src/sys/fs/nilfs/nilfs_vfsops.c
diff -u src/sys/fs/nilfs/nilfs_vfsops.c:1.22 src/sys/fs/nilfs/nilfs_vfsops.c:1.22.2.1
--- src/sys/fs/nilfs/nilfs_vfsops.c:1.22	Thu Jul  7 06:55:42 2016
+++ src/sys/fs/nilfs/nilfs_vfsops.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: nilfs_vfsops.c,v 1.22 2016/07/07 06:55:42 msaitoh Exp $ */
+/* $NetBSD: nilfs_vfsops.c,v 1.22.2.1 2016/07/20 23:47:56 pgoyette Exp $ */
 
 /*
  * Copyright (c) 2008, 2009 Reinoud Zandijk
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: nilfs_vfsops.c,v 1.22 2016/07/07 06:55:42 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nilfs_vfsops.c,v 1.22.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 #endif /* not lint */
 
 
@@ -602,6 +602,7 @@ nilfs_mount_device(struct vnode *devvp, 
 	struct nilfs_device *nilfsdev;
 	struct lwp *l = curlwp;
 	int openflags, accessmode, error;
+	const struct bdevsw *bdev;
 
 	DPRINTF(VOLUMES, ("Mounting NILFS device\n"));
 
@@ -628,7 +629,7 @@ nilfs_mount_device(struct vnode *devvp, 
 		vrele(devvp);
 		return ENOTBLK;
 	}
-	if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+	if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev)) == NULL) {
 		vrele(devvp);
 		return ENXIO;
 	}
@@ -646,6 +647,7 @@ nilfs_mount_device(struct vnode *devvp, 
 	VOP_UNLOCK(devvp);
 	if (error) {
 		vrele(devvp);
+		bdevsw_release(bdev);
 		return error;
 	}
 
@@ -658,6 +660,7 @@ nilfs_mount_device(struct vnode *devvp, 
 	VOP_UNLOCK(devvp);
 	if (error) {
 		vrele(devvp);
+		bdevsw_release(bdev);
 		return error;
 	}
 
@@ -679,6 +682,7 @@ nilfs_mount_device(struct vnode *devvp, 
 	if (error) {
 		/* remove all our information */
 		nilfs_unmount_device(nilfsdev);
+		bdevsw_release(bdev);
 		return EINVAL;
 	}
 
@@ -689,12 +693,14 @@ nilfs_mount_device(struct vnode *devvp, 
 	if (error) {
 		/* remove all our information */
 		nilfs_unmount_device(nilfsdev);
+		bdevsw_release(bdev);
 		return EINVAL;
 	}
 
 	*nilfsdev_p = nilfsdev;
 	DPRINTF(VOLUMES, ("NILFS device mounted ok\n"));
 
+	bdevsw_release(bdev);
 	return 0;
 }
 

Index: src/sys/fs/ntfs/ntfs_vfsops.c
diff -u src/sys/fs/ntfs/ntfs_vfsops.c:1.104 src/sys/fs/ntfs/ntfs_vfsops.c:1.104.2.1
--- src/sys/fs/ntfs/ntfs_vfsops.c:1.104	Sat Mar 28 19:24:05 2015
+++ src/sys/fs/ntfs/ntfs_vfsops.c	Wed Jul 20 23:47:56 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ntfs_vfsops.c,v 1.104 2015/03/28 19:24:05 maxv Exp $	*/
+/*	$NetBSD: ntfs_vfsops.c,v 1.104.2.1 2016/07/20 23:47:56 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1998, 1999 Semen Ustimenko
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ntfs_vfsops.c,v 1.104 2015/03/28 19:24:05 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ntfs_vfsops.c,v 1.104.2.1 2016/07/20 23:47:56 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -167,6 +167,7 @@ ntfs_mount(struct mount *mp, const char 
 	int		err = 0, flags;
 	struct vnode	*devvp;
 	struct ntfs_args *args = data;
+	const struct bdevsw *bdev = NULL;
 
 	if (args == NULL)
 		return EINVAL;
@@ -213,7 +214,7 @@ ntfs_mount(struct mount *mp, const char 
 		err = ENOTBLK;
 		goto fail;
 	}
-	if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+	if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev)) == NULL) {
 		err = ENXIO;
 		goto fail;
 	}
@@ -285,10 +286,14 @@ ntfs_mount(struct mount *mp, const char 
 	 * This code is common to root and non-root mounts
 	 */
 	(void)VFS_STATVFS(mp, &mp->mnt_stat);
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	return (err);
 
 fail:
 	vrele(devvp);
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	return (err);
 }
 

Index: src/sys/fs/sysvbfs/sysvbfs_vfsops.c
diff -u src/sys/fs/sysvbfs/sysvbfs_vfsops.c:1.46 src/sys/fs/sysvbfs/sysvbfs_vfsops.c:1.46.2.1
--- src/sys/fs/sysvbfs/sysvbfs_vfsops.c:1.46	Fri Jan  2 16:51:02 2015
+++ src/sys/fs/sysvbfs/sysvbfs_vfsops.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysvbfs_vfsops.c,v 1.46 2015/01/02 16:51:02 hannken Exp $	*/
+/*	$NetBSD: sysvbfs_vfsops.c,v 1.46.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vfsops.c,v 1.46 2015/01/02 16:51:02 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vfsops.c,v 1.46.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -74,6 +74,7 @@ sysvbfs_mount(struct mount *mp, const ch
 	struct vnode *devvp = NULL;
 	int error = 0;
 	bool update;
+	const struct bdevsw *bdev = NULL;
 
 	DPRINTF("%s: mnt_flag=%x\n", __func__, mp->mnt_flag);
 
@@ -111,7 +112,8 @@ sysvbfs_mount(struct mount *mp, const ch
 			 */
 			if (devvp->v_type != VBLK)
 				error = ENOTBLK;
-			else if (bdevsw_lookup(devvp->v_rdev) == NULL)
+			else if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev))
+						== NULL)
 				error = ENXIO;
 		} else {
 			/*
@@ -146,20 +148,26 @@ sysvbfs_mount(struct mount *mp, const ch
 
 	if (error) {
 		vrele(devvp);
+		bdevsw_release(bdev);
 		return error;
 	}
 
 	if (!update) {
 		if ((error = sysvbfs_mountfs(devvp, mp, l)) != 0) {
 			vrele(devvp);
+			bdevsw_release(bdev);
 			return error;
 		}
 	} else 	if (mp->mnt_flag & MNT_RDONLY) {
 		/* XXX: r/w -> read only */
 	}
 
-	return set_statvfs_info(path, UIO_USERSPACE, args->fspec, UIO_USERSPACE,
-	    mp->mnt_op->vfs_name, mp, l);
+	error = set_statvfs_info(path, UIO_USERSPACE, args->fspec,
+	    UIO_USERSPACE, mp->mnt_op->vfs_name, mp, l);
+
+	if (bdev != NULL)
+		bdevsw_release(bdev);
+	return error;
 }
 
 int

Index: src/sys/fs/udf/udf_vfsops.c
diff -u src/sys/fs/udf/udf_vfsops.c:1.73 src/sys/fs/udf/udf_vfsops.c:1.73.2.1
--- src/sys/fs/udf/udf_vfsops.c:1.73	Thu Jul  7 06:55:43 2016
+++ src/sys/fs/udf/udf_vfsops.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vfsops.c,v 1.73 2016/07/07 06:55:43 msaitoh Exp $ */
+/* $NetBSD: udf_vfsops.c,v 1.73.2.1 2016/07/20 23:47:57 pgoyette Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_vfsops.c,v 1.73 2016/07/07 06:55:43 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vfsops.c,v 1.73.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 #endif /* not lint */
 
 
@@ -310,6 +310,7 @@ udf_mount(struct mount *mp, const char *
 	struct udf_mount *ump;
 	struct vnode *devvp;
 	int openflags, accessmode, error;
+	const struct bdevsw *bdev;
 
 	DPRINTF(CALL, ("udf_mount called\n"));
 
@@ -359,7 +360,7 @@ udf_mount(struct mount *mp, const char *
 		vrele(devvp);
 		return ENOTBLK;
 	}
-	if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+	if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev)) == NULL) {
 		vrele(devvp);
 		return ENXIO;
 	}
@@ -377,6 +378,7 @@ udf_mount(struct mount *mp, const char *
 	VOP_UNLOCK(devvp);
 	if (error) {
 		vrele(devvp);
+		bdevsw_release(bdev);
 		return error;
 	}
 
@@ -407,6 +409,7 @@ udf_mount(struct mount *mp, const char *
 	if (error) {
 		/* devvp is still locked */
 		vrele(devvp);
+		bdevsw_release(bdev);
 		return error;
 	}
 
@@ -418,8 +421,10 @@ udf_mount(struct mount *mp, const char *
 
 	error = set_statvfs_info(path, UIO_USERSPACE, args->fspec, UIO_USERSPACE,
 			mp->mnt_op->vfs_name, mp, l);
-	if (error)
+	if (error) {
+		bdevsw_release(bdev);
 		return error;
+	}
 
 	/* If we're not opened read-only, open its logical volume */
 	if ((mp->mnt_flag & MNT_RDONLY) == 0) {
@@ -428,10 +433,12 @@ udf_mount(struct mount *mp, const char *
 				"writing, downgrading access to read-only\n");
 			mp->mnt_flag |= MNT_RDONLY;
 			/* FIXME we can't return error now on open failure */
+			bdevsw_release(bdev);
 			return 0;
 		}
 	}
 
+	bdevsw_release(bdev);
 	return 0;
 }
 

Index: src/sys/fs/v7fs/v7fs_vfsops.c
diff -u src/sys/fs/v7fs/v7fs_vfsops.c:1.12 src/sys/fs/v7fs/v7fs_vfsops.c:1.12.2.1
--- src/sys/fs/v7fs/v7fs_vfsops.c:1.12	Mon Dec 29 15:29:38 2014
+++ src/sys/fs/v7fs/v7fs_vfsops.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: v7fs_vfsops.c,v 1.12 2014/12/29 15:29:38 hannken Exp $	*/
+/*	$NetBSD: v7fs_vfsops.c,v 1.12.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2004, 2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: v7fs_vfsops.c,v 1.12 2014/12/29 15:29:38 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: v7fs_vfsops.c,v 1.12.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 #if defined _KERNEL_OPT
 #include "opt_v7fs.h"
 #endif
@@ -84,6 +84,7 @@ v7fs_mount(struct mount *mp, const char 
 	struct vnode *devvp = NULL;
 	int error = 0;
 	bool update = mp->mnt_flag & MNT_UPDATE;
+	const struct bdevsw *bdev;
 
 	DPRINTF("mnt_flag=%x %s\n", mp->mnt_flag, update ? "update" : "");
 
@@ -107,6 +108,7 @@ v7fs_mount(struct mount *mp, const char 
 		return EINVAL;
 	}
 
+	bdev = NULL;
 	if (args->fspec != NULL) {
 		/* Look up the name and verify that it's sane. */
 		error = namei_simple_user(args->fspec,
@@ -121,7 +123,8 @@ v7fs_mount(struct mount *mp, const char 
 			 */
 			if (devvp->v_type != VBLK)
 				error = ENOTBLK;
-			else if (bdevsw_lookup(devvp->v_rdev) == NULL)
+			else if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev))
+						== NULL)
 				error = ENXIO;
 		} else {
 			KDASSERT(v7fsmount);
@@ -164,12 +167,16 @@ v7fs_mount(struct mount *mp, const char 
 
 	if (error) {
 		vrele(devvp);
+		if (bdev != NULL)
+			bdevsw_release(bdev);
 		return error;
 	}
 
 	if (!update) {
 		if ((error = v7fs_openfs(devvp, mp, l))) {
 			vrele(devvp);
+			if (bdev != NULL)
+				bdevsw_release(bdev);
 			return error;
 		}
 
@@ -177,6 +184,8 @@ v7fs_mount(struct mount *mp, const char 
 			v7fs_closefs(devvp, mp);
 			VOP_UNLOCK(devvp);
 			vrele(devvp);
+			if (bdev != NULL)
+				bdevsw_release(bdev);
 			return error;
 		}
 		VOP_UNLOCK(devvp);
@@ -184,8 +193,11 @@ v7fs_mount(struct mount *mp, const char 
 		/* XXX: r/w -> read only */
 	}
 
-	return set_statvfs_info(path, UIO_USERSPACE, args->fspec, UIO_USERSPACE,
-	    mp->mnt_op->vfs_name, mp, l);
+	error =  set_statvfs_info(path, UIO_USERSPACE, args->fspec,
+	    UIO_USERSPACE, mp->mnt_op->vfs_name, mp, l);
+	if (bdev != NULL)
+		bdevsw_release(bdev);
+	return error;
 }
 
 static int

Index: src/sys/kern/tty.c
diff -u src/sys/kern/tty.c:1.271 src/sys/kern/tty.c:1.271.2.1
--- src/sys/kern/tty.c:1.271	Thu Jul  7 06:55:43 2016
+++ src/sys/kern/tty.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty.c,v 1.271 2016/07/07 06:55:43 msaitoh Exp $	*/
+/*	$NetBSD: tty.c,v 1.271.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.271 2016/07/07 06:55:43 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.271.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -3040,9 +3040,10 @@ tty_try_xonxoff(struct tty *tp, unsigned
 	if (c == tp->t_cc[VSTOP] && tp->t_cc[VSTOP] != _POSIX_VDISABLE) {
 	    if ((tp->t_state & TS_TTSTOP) == 0) {
 		tp->t_state |= TS_TTSTOP;
-		cdev = cdevsw_lookup(tp->t_dev);
+		cdev = cdevsw_lookup_acquire(tp->t_dev);
 		if (cdev != NULL)
 			(*cdev->d_stop)(tp, 0);
+		cdevsw_release(cdev);
 	    }
 	    return 0;
 	}

Index: src/sys/kern/tty_pty.c
diff -u src/sys/kern/tty_pty.c:1.142.2.2 src/sys/kern/tty_pty.c:1.142.2.3
--- src/sys/kern/tty_pty.c:1.142.2.2	Tue Jul 19 06:27:00 2016
+++ src/sys/kern/tty_pty.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: tty_pty.c,v 1.142.2.2 2016/07/19 06:27:00 pgoyette Exp $	*/
+/*	$NetBSD: tty_pty.c,v 1.142.2.3 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tty_pty.c,v 1.142.2.2 2016/07/19 06:27:00 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tty_pty.c,v 1.142.2.3 2016/07/20 23:47:57 pgoyette Exp $");
 
 #include "opt_ptm.h"
 
@@ -1091,14 +1091,15 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 	}
 #endif
 
-	cdev = cdevsw_lookup(dev);
-	if (cdev != NULL && cdev->d_open == ptcopen)
+	cdev = cdevsw_lookup_acquire(dev);
+	if (cdev != NULL && cdev->d_open == ptcopen) {
+		error = 0;
 		switch (cmd) {
 #ifndef NO_DEV_PTM
 		case TIOCGRANTPT:
-			if ((error = pty_getmp(l, &mp)) != 0)
-				return error;
-			return pty_grant_slave(l, dev, mp);
+			if ((error = pty_getmp(l, &mp)) == 0)
+				error = pty_grant_slave(l, dev, mp);
+			break;
 #endif
 
 		case TIOCGPGRP:
@@ -1107,7 +1108,7 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 			 * in that case, tp must be the controlling terminal.
 			 */
 			*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : 0;
-			return 0;
+			break;
 
 		case TIOCPKT:
 			if (*(int *)data) {
@@ -1116,7 +1117,7 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 				pti->pt_flags |= PF_PKT;
 			} else
 				pti->pt_flags &= ~PF_PKT;
-			return 0;
+			break;
 
 		case TIOCUCNTL:
 			if (*(int *)data) {
@@ -1125,7 +1126,7 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 				pti->pt_flags |= PF_UCNTL;
 			} else
 				pti->pt_flags &= ~PF_UCNTL;
-			return 0;
+			break;
 
 		case TIOCREMOTE:
 			if (*(int *)data)
@@ -1135,7 +1136,7 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 			mutex_spin_enter(&tty_lock);
 			ttyflush(tp, FREAD|FWRITE);
 			mutex_spin_exit(&tty_lock);
-			return 0;
+			break;
 
 		case TIOCSETP:
 		case TIOCSETN:
@@ -1146,6 +1147,7 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 			mutex_spin_enter(&tty_lock);
 			ndflush(&tp->t_outq, tp->t_outq.c_cc);
 			mutex_spin_exit(&tty_lock);
+			error = -1;
 			break;
 
 		case TIOCSIG:
@@ -1158,15 +1160,19 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 			tp->t_state |= TS_SIGINFO;
 			ttysig(tp, TTYSIG_PG1, sig);
 			mutex_spin_exit(&tty_lock);
-			return 0;
+			break;
 
 		case FIONREAD:
 			mutex_spin_enter(&tty_lock);
 			*(int *)data = tp->t_outq.c_cc;
 			mutex_spin_exit(&tty_lock);
-			return 0;
+			break;
 		}
-
+		if (error >= 0 ) {
+			cdevsw_release(cdev);
+			return error;
+		}
+	}
 	error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, l);
 	if (error == EPASSTHROUGH)
 		 error = ttioctl(tp, cmd, data, flag, l);
@@ -1177,6 +1183,7 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 				pti->pt_ucntl = (u_char)cmd;
 				ptcwakeup(tp, FREAD);
 			}
+			cdevsw_release(cdev);
 			return 0;
 		}
 	}
@@ -1218,5 +1225,6 @@ ptyioctl(dev_t dev, u_long cmd, void *da
 			ptcwakeup(tp, FREAD);
 		}
 	}
+	cdevsw_release(cdev);
 	return error;
 }

Index: src/sys/kern/vfs_mount.c
diff -u src/sys/kern/vfs_mount.c:1.40 src/sys/kern/vfs_mount.c:1.40.2.1
--- src/sys/kern/vfs_mount.c:1.40	Thu Jul  7 06:55:43 2016
+++ src/sys/kern/vfs_mount.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_mount.c,v 1.40 2016/07/07 06:55:43 msaitoh Exp $	*/
+/*	$NetBSD: vfs_mount.c,v 1.40.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.40 2016/07/07 06:55:43 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.40.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #define _VFS_VNODE_PRIVATE
 
@@ -1316,7 +1316,9 @@ rawdev_mounted(vnode_t *vp, vnode_t **bv
 {
 	vnode_t *bvp;
 	dev_t dev;
-	int d_type;
+	int d_type, busy;
+	const struct cdevsw *cdev = NULL;
+	const struct bdevsw *bdev = NULL;
 
 	bvp = NULL;
 	d_type = D_OTHER;
@@ -1326,10 +1328,8 @@ rawdev_mounted(vnode_t *vp, vnode_t **bv
 
 	switch (vp->v_type) {
 	case VCHR: {
-		const struct cdevsw *cdev;
-
 		dev = vp->v_rdev;
-		cdev = cdevsw_lookup(dev);
+		cdev = cdevsw_lookup_acquire(dev);
 		if (cdev != NULL) {
 			dev_t blkdev;
 
@@ -1342,18 +1342,14 @@ rawdev_mounted(vnode_t *vp, vnode_t **bv
 				}
 			}
 		}
-
 		break;
 		}
 
 	case VBLK: {
-		const struct bdevsw *bdev;
-
 		dev = vp->v_rdev;
-		bdev = bdevsw_lookup(dev);
+		bdev = bdevsw_lookup_acquire(dev);
 		if (bdev != NULL)
 			d_type = (bdev->d_flag & D_TYPEMASK);
-
 		bvp = vp;
 
 		break;
@@ -1374,9 +1370,15 @@ rawdev_mounted(vnode_t *vp, vnode_t **bv
 	 * XXX: not only if this specific slice is mounted, but
 	 * XXX: if it's on a disk with any other mounted slice.
 	 */
-	if (vfs_mountedon(bvp))
-		return EBUSY;
+	busy =vfs_mountedon(bvp);
+
+	if (bdev != NULL)
+		bdevsw_release(bdev);
+	if (cdev != NULL)
+		cdevsw_release(cdev);
 
+	if (busy)
+		return EBUSY;
 	return 0;
 }
 

Index: src/sys/miscfs/specfs/spec_vnops.c
diff -u src/sys/miscfs/specfs/spec_vnops.c:1.162 src/sys/miscfs/specfs/spec_vnops.c:1.162.2.1
--- src/sys/miscfs/specfs/spec_vnops.c:1.162	Mon Apr  4 08:03:53 2016
+++ src/sys/miscfs/specfs/spec_vnops.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: spec_vnops.c,v 1.162 2016/04/04 08:03:53 hannken Exp $	*/
+/*	$NetBSD: spec_vnops.c,v 1.162.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.162 2016/04/04 08:03:53 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.162.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -505,6 +505,8 @@ spec_open(void *v)
 	u_int gen;
 	const char *name;
 	struct partinfo pi;
+	const struct bdevsw *bdev = NULL;
+	const struct cdevsw *cdev = NULL;
 	
 	l = curlwp;
 	vp = ap->a_vp;
@@ -554,8 +556,6 @@ spec_open(void *v)
 			vp->v_vflag |= VV_ISTTY;
 		VOP_UNLOCK(vp);
 		do {
-			const struct cdevsw *cdev;
-
 			gen = module_gen;
 			error = cdev_open(dev, ap->a_mode, S_IFCHR, l);
 			if (error != ENXIO)
@@ -563,7 +563,7 @@ spec_open(void *v)
 			
 			/* Check if we already have a valid driver */
 			mutex_enter(&device_lock);
-			cdev = cdevsw_lookup(dev);
+			cdev = cdevsw_lookup_acquire(dev);
 			mutex_exit(&device_lock);
 			if (cdev != NULL)
 				break;
@@ -603,8 +603,6 @@ spec_open(void *v)
 		sd->sd_bdevvp = vp;
 		mutex_exit(&device_lock);
 		do {
-			const struct bdevsw *bdev;
-
 			gen = module_gen;
 			error = bdev_open(dev, ap->a_mode, S_IFBLK, l);
 			if (error != ENXIO)
@@ -612,7 +610,7 @@ spec_open(void *v)
 
 			/* Check if we already have a valid driver */
 			mutex_enter(&device_lock);
-			bdev = bdevsw_lookup(dev);
+			bdev = bdevsw_lookup_acquire(dev);
 			mutex_exit(&device_lock);
 			if (bdev != NULL)
 				break;
@@ -664,6 +662,11 @@ spec_open(void *v)
 	if (error == 0)
 		uvm_vnp_setsize(vp, (voff_t)pi.pi_secsize * pi.pi_size);
 
+	if (cdev != NULL)
+		cdevsw_release(cdev);
+	if (bdev != NULL)
+		bdevsw_release(bdev);
+
 	return 0;
 }
 

Index: src/sys/net/ppp_tty.c
diff -u src/sys/net/ppp_tty.c:1.61 src/sys/net/ppp_tty.c:1.61.2.1
--- src/sys/net/ppp_tty.c:1.61	Mon Jun 20 06:46:37 2016
+++ src/sys/net/ppp_tty.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ppp_tty.c,v 1.61 2016/06/20 06:46:37 knakahara Exp $	*/
+/*	$NetBSD: ppp_tty.c,v 1.61.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 /*	Id: ppp_tty.c,v 1.3 1996/07/01 01:04:11 paulus Exp 	*/
 
 /*
@@ -93,7 +93,7 @@
 /* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ppp_tty.c,v 1.61 2016/06/20 06:46:37 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ppp_tty.c,v 1.61.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #include "ppp.h"
 
@@ -675,7 +675,7 @@ pppsyncstart(struct ppp_softc *sc)
 			len += n->m_len;
 
 		/* call device driver IOCTL to transmit a frame */
-		cdev = cdevsw_lookup(tp->t_dev);
+		cdev = cdevsw_lookup_acquire(tp->t_dev);
 		if (cdev == NULL ||
 		    (*cdev->d_ioctl)(tp->t_dev, TIOCXMTFRAME, (void *)&m,
 				     0, 0)) {
@@ -685,6 +685,8 @@ pppsyncstart(struct ppp_softc *sc)
 		}
 		sc->sc_outm = m = NULL;
 		sc->sc_stats.ppp_obytes += len;
+		if (cdev != NULL)
+			cdevsw_release(cdev);
 	}
 }
 

Index: src/sys/ufs/chfs/chfs_vfsops.c
diff -u src/sys/ufs/chfs/chfs_vfsops.c:1.15 src/sys/ufs/chfs/chfs_vfsops.c:1.15.2.1
--- src/sys/ufs/chfs/chfs_vfsops.c:1.15	Sun Jan 11 17:29:57 2015
+++ src/sys/ufs/chfs/chfs_vfsops.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: chfs_vfsops.c,v 1.15 2015/01/11 17:29:57 hannken Exp $	*/
+/*	$NetBSD: chfs_vfsops.c,v 1.15.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2010 Department of Software Engineering,
@@ -121,6 +121,7 @@ chfs_mount(struct mount *mp,
 	struct chfs_mount *chmp;
 	int err = 0;
 	int xflags;
+	const struct bdevsw *bdev = NULL;
 
 	dbg("mount()\n");
 
@@ -162,7 +163,7 @@ chfs_mount(struct mount *mp,
 		/* Be sure this is a valid block device */
 		if (devvp->v_type != VBLK)
 			err = ENOTBLK;
-		else if (bdevsw_lookup(devvp->v_rdev) == NULL)
+		else if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev)) == NULL)
 			err = ENXIO;
 	}
 
@@ -195,12 +196,17 @@ chfs_mount(struct mount *mp,
 	vfs_getnewfsid(mp);
 	chmp->chm_fsmp = mp;
 
-	return set_statvfs_info(path,
+	err = set_statvfs_info(path,
 	    UIO_USERSPACE, args->fspec,
 	    UIO_USERSPACE, mp->mnt_op->vfs_name, mp, l);
+	if (bdev != NULL)
+		bdevsw_release(bdev);
+	return (err);
 
 fail:
 	vrele(devvp);
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	return (err);
 }
 
@@ -216,6 +222,7 @@ chfs_mountfs(struct vnode *devvp, struct
 	struct chfs_mount* chmp;
 	struct vnode *vp;
 	int err = 0;
+	const struct bdevsw *bdev;
 
 	dbg("mountfs()\n");
 
@@ -234,11 +241,12 @@ chfs_mountfs(struct vnode *devvp, struct
 
 	if (devvp->v_type != VBLK)
 		err = ENOTBLK;
-	else if (bdevsw_lookup(dev) == NULL)
+	else if ((bdev = bdevsw_lookup_acquire(dev)) == NULL)
 		err = ENXIO;
 	else if (major(dev) != flash_major) {
 		dbg("major(dev): %d, flash_major: %d\n",
 		    major(dev), flash_major);
+		bdevsw_release(bdev);
 		err = ENODEV;
 	}
 	if (err) {
@@ -346,6 +354,7 @@ chfs_mountfs(struct vnode *devvp, struct
 	err = VFS_VGET(mp, CHFS_ROOTINO, &vp);
 	if (err) {
 		dbg("error: %d while allocating root node\n", err);
+		bdevsw_release(bdev);
 		return err;
 	}
 	vput(vp);
@@ -357,12 +366,14 @@ chfs_mountfs(struct vnode *devvp, struct
 	mutex_exit(&chmp->chm_lock_mountfields);
 
 	spec_node_setmountedfs(devvp, mp);
+	bdevsw_release(bdev);
 	return 0;
 
 fail:
 	kmem_free(chmp->chm_ebh, sizeof(struct chfs_ebh));
 	kmem_free(chmp, sizeof(struct chfs_mount));
 	kmem_free(ump, sizeof(struct ufsmount));
+	bdevsw_release(bdev);
 	return err;
 }
 

Index: src/sys/ufs/ext2fs/ext2fs_vfsops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.193 src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.193.2.1
--- src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.193	Sat Mar 28 19:24:04 2015
+++ src/sys/ufs/ext2fs/ext2fs_vfsops.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_vfsops.c,v 1.193 2015/03/28 19:24:04 maxv Exp $	*/
+/*	$NetBSD: ext2fs_vfsops.c,v 1.193.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1989, 1991, 1993, 1994
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.193 2015/03/28 19:24:04 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.193.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -304,6 +304,7 @@ ext2fs_mount(struct mount *mp, const cha
 	size_t size;
 	int error = 0, flags, update;
 	mode_t accessmode;
+	const struct bdevsw *bdev = NULL;
 
 	if (args == NULL)
 		return EINVAL;
@@ -338,7 +339,8 @@ ext2fs_mount(struct mount *mp, const cha
 			 */
 			if (devvp->v_type != VBLK)
 				error = ENOTBLK;
-			else if (bdevsw_lookup(devvp->v_rdev) == NULL)
+			else if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev))
+						== NULL)
 				error = ENXIO;
 		} else {
 		        /*
@@ -388,10 +390,8 @@ ext2fs_mount(struct mount *mp, const cha
 		VOP_UNLOCK(devvp);
 	}
 
-	if (error) {
-		vrele(devvp);
-		return (error);
-	}
+	if (error)
+		goto fail;
 
 	if (!update) {
 		int xflags;
@@ -489,9 +489,13 @@ ext2fs_mount(struct mount *mp, const cha
 				mp->mnt_stat.f_mntfromname);
 		(void) ext2fs_cgupdate(ump, MNT_WAIT);
 	}
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	return (error);
 
 fail:
+	if (args->fspec != NULL && !update)
+		bdevsw_release(bdev);
 	vrele(devvp);
 	return (error);
 }

Index: src/sys/ufs/ffs/ffs_vfsops.c
diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.339 src/sys/ufs/ffs/ffs_vfsops.c:1.339.2.1
--- src/sys/ufs/ffs/ffs_vfsops.c:1.339	Sun Jun 19 22:41:31 2016
+++ src/sys/ufs/ffs/ffs_vfsops.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_vfsops.c,v 1.339 2016/06/19 22:41:31 christos Exp $	*/
+/*	$NetBSD: ffs_vfsops.c,v 1.339.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.339 2016/06/19 22:41:31 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.339.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -409,6 +409,7 @@ ffs_mount(struct mount *mp, const char *
 	struct fs *fs;
 	int error = 0, flags, update;
 	mode_t accessmode;
+	const struct bdevsw *bdev = NULL;
 
 	if (args == NULL) {
 		DPRINTF("NULL args");
@@ -451,7 +452,7 @@ ffs_mount(struct mount *mp, const char *
 			if (devvp->v_type != VBLK) {
 				DPRINTF("non block device %d", devvp->v_type);
 				error = ENOTBLK;
-			} else if (bdevsw_lookup(devvp->v_rdev) == NULL) {
+			} else if (bdevsw_lookup_acquire(devvp->v_rdev) == NULL) {
 				DPRINTF("can't find block device 0x%jx",
 				    devvp->v_rdev);
 				error = ENXIO;
@@ -512,10 +513,8 @@ ffs_mount(struct mount *mp, const char *
 		VOP_UNLOCK(devvp);
 	}
 
-	if (error) {
-		vrele(devvp);
-		return (error);
-	}
+	if (error)
+		goto fail;
 
 #ifdef WAPBL
 	/* WAPBL can only be enabled on a r/w mount. */
@@ -718,9 +717,13 @@ ffs_mount(struct mount *mp, const char *
 		mp->mnt_flag &= ~MNT_SOFTDEP;
 	}
 
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	return (error);
 
 fail:
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	vrele(devvp);
 	return (error);
 }

Index: src/sys/ufs/lfs/lfs_vfsops.c
diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.351 src/sys/ufs/lfs/lfs_vfsops.c:1.351.2.1
--- src/sys/ufs/lfs/lfs_vfsops.c:1.351	Thu Jul  7 06:55:44 2016
+++ src/sys/ufs/lfs/lfs_vfsops.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vfsops.c,v 1.351 2016/07/07 06:55:44 msaitoh Exp $	*/
+/*	$NetBSD: lfs_vfsops.c,v 1.351.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.351 2016/07/07 06:55:44 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.351.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_lfs.h"
@@ -633,6 +633,7 @@ lfs_mount(struct mount *mp, const char *
 	struct lfs *fs = NULL;				/* LFS */
 	int error = 0, update;
 	mode_t accessmode;
+	const struct bdevsw *bdev = NULL;
 
 	if (args == NULL)
 		return EINVAL;
@@ -666,7 +667,8 @@ lfs_mount(struct mount *mp, const char *
 			 */
 			if (devvp->v_type != VBLK)
 				error = ENOTBLK;
-			else if (bdevsw_lookup(devvp->v_rdev) == NULL)
+			else if ((bdev = bdevsw_lookup_acquire(devvp->v_rdev))
+						== NULL)
 				error = ENXIO;
 		} else {
 			/*
@@ -722,10 +724,8 @@ lfs_mount(struct mount *mp, const char *
 		VOP_UNLOCK(devvp);
 	}
 
-	if (error) {
-		vrele(devvp);
-		return (error);
-	}
+	if (error)
+		goto fail;
 
 	if (!update) {
 		int flags;
@@ -822,9 +822,13 @@ lfs_mount(struct mount *mp, const char *
 	    UIO_USERSPACE, mp->mnt_op->vfs_name, mp, l);
 	if (error == 0)
 		lfs_sb_setfsmnt(fs, mp->mnt_stat.f_mntonname);
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	return error;
 
 fail:
+	if (bdev != NULL)
+		bdevsw_release(bdev);
 	vrele(devvp);
 	return (error);
 }

Index: src/sys/uvm/uvm_device.c
diff -u src/sys/uvm/uvm_device.c:1.64 src/sys/uvm/uvm_device.c:1.64.2.1
--- src/sys/uvm/uvm_device.c:1.64	Sun Dec 14 23:48:58 2014
+++ src/sys/uvm/uvm_device.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_device.c,v 1.64 2014/12/14 23:48:58 chs Exp $	*/
+/*	$NetBSD: uvm_device.c,v 1.64.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_device.c,v 1.64 2014/12/14 23:48:58 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_device.c,v 1.64.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -122,12 +122,13 @@ udv_attach(dev_t device, vm_prot_t acces
 	 * before we do anything, ensure this device supports mmap
 	 */
 
-	cdev = cdevsw_lookup(device);
+	cdev = cdevsw_lookup_acquire(device);
 	if (cdev == NULL) {
 		return (NULL);
 	}
 	mapfn = cdev->d_mmap;
 	if (mapfn == NULL || mapfn == nommap || mapfn == nullmmap) {
+		cdevsw_release(cdev);
 		return(NULL);
 	}
 
@@ -136,8 +137,10 @@ udv_attach(dev_t device, vm_prot_t acces
 	 */
 
 	if ((cdev->d_flag & D_NEGOFFSAFE) == 0 &&
-	    off != UVM_UNKNOWN_OFFSET && off < 0)
+	    off != UVM_UNKNOWN_OFFSET && off < 0) {
+		cdevsw_release(cdev);
 		return(NULL);
+	}
 
 	/*
 	 * Check that the specified range of the device allows the
@@ -149,6 +152,7 @@ udv_attach(dev_t device, vm_prot_t acces
 
 	while (size != 0) {
 		if (cdev_mmap(device, off, accessprot) == -1) {
+			cdevsw_release(cdev);
 			return (NULL);
 		}
 		off += PAGE_SIZE; size -= PAGE_SIZE;
@@ -205,6 +209,7 @@ udv_attach(dev_t device, vm_prot_t acces
 				wakeup(lcv);
 			lcv->u_flags &= ~(UVM_DEVICE_WANTED|UVM_DEVICE_HOLD);
 			mutex_exit(&udv_lock);
+			cdevsw_release(cdev);
 			return(&lcv->u_obj);
 		}
 
@@ -251,6 +256,7 @@ udv_attach(dev_t device, vm_prot_t acces
 		udv->u_device = device;
 		LIST_INSERT_HEAD(&udv_list, udv, u_list);
 		mutex_exit(&udv_lock);
+		cdevsw_release(cdev);
 		return(&udv->u_obj);
 	}
 	/*NOTREACHED*/
@@ -365,6 +371,7 @@ udv_fault(struct uvm_faultinfo *ufi, vad
 	vm_prot_t mapprot;
 	UVMHIST_FUNC("udv_fault"); UVMHIST_CALLED(maphist);
 	UVMHIST_LOG(maphist,"  flags=%d", flags,0,0,0);
+	const struct cdevsw *cdev;
 
 	/*
 	 * we do not allow device mappings to be mapped copy-on-write
@@ -383,7 +390,7 @@ udv_fault(struct uvm_faultinfo *ufi, vad
 	 */
 
 	device = udv->u_device;
-	if (cdevsw_lookup(device) == NULL) {
+	if ((cdev = cdevsw_lookup_acquire(device)) == NULL) {
 		/* XXX This should not happen */
 		uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj);
 		return (EIO);
@@ -441,11 +448,13 @@ udv_fault(struct uvm_faultinfo *ufi, vad
 			uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap,
 			    uobj);
 			uvm_wait("udv_fault");
+			cdevsw_release(cdev);
 			return (ERESTART);
 		}
 	}
 
 	pmap_update(ufi->orig_map->pmap);
 	uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj);
+	cdevsw_release(cdev);
 	return (retval);
 }

Index: src/sys/uvm/uvm_swap.c
diff -u src/sys/uvm/uvm_swap.c:1.174 src/sys/uvm/uvm_swap.c:1.174.2.1
--- src/sys/uvm/uvm_swap.c:1.174	Fri Jul  8 06:45:34 2016
+++ src/sys/uvm/uvm_swap.c	Wed Jul 20 23:47:57 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_swap.c,v 1.174 2016/07/08 06:45:34 skrll Exp $	*/
+/*	$NetBSD: uvm_swap.c,v 1.174.2.1 2016/07/20 23:47:57 pgoyette Exp $	*/
 
 /*
  * Copyright (c) 1995, 1996, 1997, 2009 Matthew R. Green
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.174 2016/07/08 06:45:34 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.174.2.1 2016/07/20 23:47:57 pgoyette Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_compat_netbsd.h"
@@ -608,19 +608,23 @@ sys_swapctl(struct lwp *l, const struct 
 	error = 0;		/* assume no error */
 	switch(SCARG(uap, cmd)) {
 
-	case SWAP_DUMPDEV:
+	case SWAP_DUMPDEV: {
+		const struct bdevsw *bdev;
+
 		if (vp->v_type != VBLK) {
 			error = ENOTBLK;
 			break;
 		}
-		if (bdevsw_lookup(vp->v_rdev)) {
+		if ((bdev = bdevsw_lookup_acquire(vp->v_rdev))) {
 			dumpdev = vp->v_rdev;
 			dumpcdev = devsw_blk2chr(dumpdev);
 		} else
 			dumpdev = NODEV;
 		cpu_dumpconf();
+		if (dumpdev != NODEV)
+			bdevsw_release(bdev);
 		break;
-
+		}
 	case SWAP_CTL:
 		/*
 		 * get new priority, remove old entry (if any) and then

Reply via email to