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