Rename specfs_lock as device_lock and move it from specfs to devsw.

Relaxes kernel dependency on vfs.
This commit is contained in:
pooka 2008-12-29 17:41:18 +00:00
parent 4266eb20ef
commit 8583cae233
8 changed files with 92 additions and 95 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: init_sysctl.c,v 1.151 2008/11/28 18:58:59 elad Exp $ */
/* $NetBSD: init_sysctl.c,v 1.152 2008/12/29 17:41:18 pooka Exp $ */
/*-
* Copyright (c) 2003, 2007, 2008 The NetBSD Foundation, Inc.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.151 2008/11/28 18:58:59 elad Exp $");
__KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.152 2008/12/29 17:41:18 pooka Exp $");
#include "opt_sysv.h"
#include "opt_compat_netbsd32.h"
@ -69,8 +69,6 @@ __KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.151 2008/11/28 18:58:59 elad Exp $
#include <sys/ktrace.h>
#include <sys/ksem.h>
#include <miscfs/specfs/specdev.h>
#ifdef COMPAT_NETBSD32
#include <compat/netbsd32/netbsd32.h>
#endif
@ -1914,7 +1912,7 @@ sysctl_kern_drivers(SYSCTLFN_ARGS)
*/
error = 0;
sysctl_unlock();
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (i = 0; i < max_devsw_convs; i++) {
dname = devsw_conv[i].d_name;
if (dname == NULL)
@ -1927,15 +1925,15 @@ sysctl_kern_drivers(SYSCTLFN_ARGS)
kd.d_bmajor = devsw_conv[i].d_bmajor;
kd.d_cmajor = devsw_conv[i].d_cmajor;
strlcpy(kd.d_name, dname, sizeof kd.d_name);
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
error = dcopyout(l, &kd, where, sizeof kd);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
if (error != 0)
break;
buflen -= sizeof kd;
where += sizeof kd;
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
sysctl_relock();
*oldlenp = where - start;
return error;

View File

@ -1,4 +1,4 @@
/* $NetBSD: subr_devsw.c,v 1.22 2008/06/08 12:23:18 ad Exp $ */
/* $NetBSD: subr_devsw.c,v 1.23 2008/12/29 17:41:18 pooka Exp $ */
/*-
* Copyright (c) 2001, 2002, 2007, 2008 The NetBSD Foundation, Inc.
@ -69,7 +69,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.22 2008/06/08 12:23:18 ad Exp $");
__KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.23 2008/12/29 17:41:18 pooka Exp $");
#include <sys/param.h>
#include <sys/conf.h>
@ -80,8 +80,6 @@ __KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.22 2008/06/08 12:23:18 ad Exp $");
#include <sys/cpu.h>
#include <sys/buf.h>
#include <miscfs/specfs/specdev.h>
#ifdef DEVSW_DEBUG
#define DPRINTF(x) printf x
#else /* DEVSW_DEBUG */
@ -103,12 +101,15 @@ static int bdevsw_attach(const struct bdevsw *, int *);
static int cdevsw_attach(const struct cdevsw *, int *);
static void devsw_detach_locked(const struct bdevsw *, const struct cdevsw *);
kmutex_t device_lock;
void
devsw_init(void)
{
KASSERT(sys_bdevsws < MAXDEVSW - 1);
KASSERT(sys_cdevsws < MAXDEVSW - 1);
mutex_init(&device_lock, MUTEX_DEFAULT, IPL_NONE);
}
int
@ -122,7 +123,7 @@ devsw_attach(const char *devname, const struct bdevsw *bdev, int *bmajor,
if (devname == NULL || cdev == NULL)
return (EINVAL);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (i = 0 ; i < max_devsw_convs ; i++) {
conv = &devsw_conv[i];
@ -153,7 +154,7 @@ devsw_attach(const char *devname, const struct bdevsw *bdev, int *bmajor,
bdevsw[*bmajor] = bdev;
cdevsw[*cmajor] = cdev;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (0);
}
@ -205,10 +206,10 @@ devsw_attach(const char *devname, const struct bdevsw *bdev, int *bmajor,
devsw_conv[i].d_bmajor = *bmajor;
devsw_conv[i].d_cmajor = *cmajor;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (0);
fail:
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (error);
}
@ -218,7 +219,7 @@ bdevsw_attach(const struct bdevsw *devsw, int *devmajor)
const struct bdevsw **newptr;
int bmajor, i;
KASSERT(mutex_owned(&specfs_lock));
KASSERT(mutex_owned(&device_lock));
if (devsw == NULL)
return (0);
@ -267,7 +268,7 @@ cdevsw_attach(const struct cdevsw *devsw, int *devmajor)
const struct cdevsw **newptr;
int cmajor, i;
KASSERT(mutex_owned(&specfs_lock));
KASSERT(mutex_owned(&device_lock));
if (*devmajor < 0) {
for (cmajor = sys_cdevsws ; cmajor < max_cdevsws ; cmajor++) {
@ -312,7 +313,7 @@ devsw_detach_locked(const struct bdevsw *bdev, const struct cdevsw *cdev)
{
int i;
KASSERT(mutex_owned(&specfs_lock));
KASSERT(mutex_owned(&device_lock));
if (bdev != NULL) {
for (i = 0 ; i < max_bdevsws ; i++) {
@ -336,9 +337,9 @@ int
devsw_detach(const struct bdevsw *bdev, const struct cdevsw *cdev)
{
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
devsw_detach_locked(bdev, cdev);
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return 0;
}
@ -433,9 +434,9 @@ devsw_blk2name(int bmajor)
name = NULL;
cmajor = -1;
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
if (bmajor < 0 || bmajor >= max_bdevsws || bdevsw[bmajor] == NULL) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (NULL);
}
for (i = 0 ; i < max_devsw_convs; i++) {
@ -446,7 +447,7 @@ devsw_blk2name(int bmajor)
}
if (cmajor >= 0 && cmajor < max_cdevsws && cdevsw[cmajor] != NULL)
name = devsw_conv[i].d_name;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (name);
}
@ -466,7 +467,7 @@ devsw_name2blk(const char *name, char *devname, size_t devnamelen)
if (name == NULL)
return (-1);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (i = 0 ; i < max_devsw_convs ; i++) {
size_t len;
@ -490,11 +491,11 @@ devsw_name2blk(const char *name, char *devname, size_t devnamelen)
strncpy(devname, conv->d_name, devnamelen);
devname[devnamelen - 1] = '\0';
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (bmajor);
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (-1);
}
@ -513,7 +514,7 @@ devsw_name2chr(const char *name, char *devname, size_t devnamelen)
if (name == NULL)
return (-1);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (i = 0 ; i < max_devsw_convs ; i++) {
size_t len;
@ -537,11 +538,11 @@ devsw_name2chr(const char *name, char *devname, size_t devnamelen)
strncpy(devname, conv->d_name, devnamelen);
devname[devnamelen - 1] = '\0';
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (cmajor);
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (-1);
}
@ -561,9 +562,9 @@ devsw_chr2blk(dev_t cdev)
bmajor = -1;
rv = NODEV;
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
if (cmajor < 0 || cmajor >= max_cdevsws || cdevsw[cmajor] == NULL) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (NODEV);
}
for (i = 0 ; i < max_devsw_convs ; i++) {
@ -574,7 +575,7 @@ devsw_chr2blk(dev_t cdev)
}
if (bmajor >= 0 && bmajor < max_bdevsws && bdevsw[bmajor] != NULL)
rv = makedev(bmajor, minor(cdev));
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (rv);
}
@ -595,9 +596,9 @@ devsw_blk2chr(dev_t bdev)
cmajor = -1;
rv = NODEV;
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
if (bmajor < 0 || bmajor >= max_bdevsws || bdevsw[bmajor] == NULL) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (NODEV);
}
for (i = 0 ; i < max_devsw_convs ; i++) {
@ -608,7 +609,7 @@ devsw_blk2chr(dev_t bdev)
}
if (cmajor >= 0 && cmajor < max_cdevsws && cdevsw[cmajor] != NULL)
rv = makedev(cmajor, minor(bdev));
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (rv);
}
@ -637,9 +638,9 @@ bdev_open(dev_t dev, int flag, int devtype, lwp_t *l)
* For open we need to lock, in order to synchronize
* with attach/detach.
*/
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
d = bdevsw_lookup(dev);
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
if (d == NULL)
return ENXIO;
@ -737,9 +738,9 @@ cdev_open(dev_t dev, int flag, int devtype, lwp_t *l)
* For open we need to lock, in order to synchronize
* with attach/detach.
*/
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
d = cdevsw_lookup(dev);
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
if (d == NULL)
return ENXIO;

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_subr.c,v 1.362 2008/12/19 17:11:57 pgoyette Exp $ */
/* $NetBSD: vfs_subr.c,v 1.363 2008/12/29 17:41:18 pooka Exp $ */
/*-
* Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc.
@ -81,7 +81,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.362 2008/12/19 17:11:57 pgoyette Exp $");
__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.363 2008/12/29 17:41:18 pooka Exp $");
#include "opt_ddb.h"
#include "opt_compat_netbsd.h"
@ -89,6 +89,7 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.362 2008/12/19 17:11:57 pgoyette Exp
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/proc.h>
#include <sys/kernel.h>
#include <sys/mount.h>
@ -223,7 +224,6 @@ vntblinit(void)
mutex_init(&mntid_lock, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&mntvnode_lock, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&vnode_free_list_lock, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&specfs_lock, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&vfs_list_lock, MUTEX_DEFAULT, IPL_NONE);
mount_specificdata_domain = specificdata_domain_create();
@ -1902,7 +1902,7 @@ vfinddev(dev_t dev, enum vtype type, vnode_t **vpp)
vnode_t *vp;
int rc = 0;
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (vp = specfs_hash[SPECHASH(dev)]; vp; vp = vp->v_specnext) {
if (dev != vp->v_rdev || type != vp->v_type)
continue;
@ -1910,7 +1910,7 @@ vfinddev(dev_t dev, enum vtype type, vnode_t **vpp)
rc = 1;
break;
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (rc);
}
@ -1927,7 +1927,7 @@ vdevgone(int maj, int minl, int minh, enum vtype type)
vp = NULL; /* XXX gcc */
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (mn = minl; mn <= minh; mn++) {
dev = makedev(maj, mn);
vpp = &specfs_hash[SPECHASH(dev)];
@ -1939,16 +1939,16 @@ vdevgone(int maj, int minl, int minh, enum vtype type)
vp = vp->v_specnext;
continue;
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
if (vget(vp, LK_INTERLOCK) == 0) {
VOP_REVOKE(vp, REVOKEALL);
vrele(vp);
}
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
vp = *vpp;
}
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
}
/*
@ -1959,17 +1959,17 @@ vcount(vnode_t *vp)
{
int count;
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
mutex_enter(&vp->v_interlock);
if (vp->v_specnode == NULL) {
count = vp->v_usecount - ((vp->v_iflag & VI_INACTPEND) != 0);
mutex_exit(&vp->v_interlock);
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (count);
}
mutex_exit(&vp->v_interlock);
count = vp->v_specnode->sn_dev->sd_opencnt;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (count);
}
@ -1997,7 +1997,7 @@ vrevoke(vnode_t *vp)
}
vpp = &specfs_hash[SPECHASH(dev)];
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (vq = *vpp; vq != NULL;) {
/* If clean or being cleaned, then ignore it. */
mutex_enter(&vq->v_interlock);
@ -2007,7 +2007,7 @@ vrevoke(vnode_t *vp)
vq = vq->v_specnext;
continue;
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
if (vq->v_usecount == 0) {
vremfree(vq);
vq->v_usecount = 1;
@ -2016,10 +2016,10 @@ vrevoke(vnode_t *vp)
}
vclean(vq, DOCLOSE);
vrelel(vq, 0);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
vq = *vpp;
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
}
/*
@ -2209,7 +2209,7 @@ vfs_mountedon(vnode_t *vp)
return ENOTBLK;
if (vp->v_specmountpoint != NULL)
return (EBUSY);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (vq = specfs_hash[SPECHASH(vp->v_rdev)]; vq != NULL;
vq = vq->v_specnext) {
if (vq->v_rdev != vp->v_rdev || vq->v_type != vp->v_type)
@ -2219,7 +2219,7 @@ vfs_mountedon(vnode_t *vp)
break;
}
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (error);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: procfs_linux.c,v 1.54 2008/05/31 21:34:42 ad Exp $ */
/* $NetBSD: procfs_linux.c,v 1.55 2008/12/29 17:41:18 pooka Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.54 2008/05/31 21:34:42 ad Exp $");
__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.55 2008/12/29 17:41:18 pooka Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -55,7 +55,6 @@ __KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.54 2008/05/31 21:34:42 ad Exp $")
#include <sys/conf.h>
#include <miscfs/procfs/procfs.h>
#include <miscfs/specfs/specdev.h>
#include <compat/linux/common/linux_exec.h>
@ -198,7 +197,7 @@ procfs_dodevices(struct lwp *curl, struct proc *p,
if (offset >= LBFSZ)
goto out;
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
for (i = 0; i < max_devsw_convs; i++) {
if ((devsw_conv[i].d_name == NULL) ||
(devsw_conv[i].d_cmajor == -1))
@ -207,14 +206,14 @@ procfs_dodevices(struct lwp *curl, struct proc *p,
offset += snprintf(&bf[offset], LBFSZ - offset,
"%3d %s\n", devsw_conv[i].d_cmajor, devsw_conv[i].d_name);
if (offset >= LBFSZ) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
goto out;
}
}
offset += snprintf(&bf[offset], LBFSZ - offset, "\nBlock devices:\n");
if (offset >= LBFSZ) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
goto out;
}
@ -226,11 +225,11 @@ procfs_dodevices(struct lwp *curl, struct proc *p,
offset += snprintf(&bf[offset], LBFSZ - offset,
"%3d %s\n", devsw_conv[i].d_bmajor, devsw_conv[i].d_name);
if (offset >= LBFSZ) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
goto out;
}
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
error = uiomove_frombuf(bf, offset, uio);
out:

View File

@ -1,4 +1,4 @@
/* $NetBSD: spec_vnops.c,v 1.119 2008/05/16 09:22:00 hannken Exp $ */
/* $NetBSD: spec_vnops.c,v 1.120 2008/12/29 17:41:19 pooka 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.119 2008/05/16 09:22:00 hannken Exp $");
__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.120 2008/12/29 17:41:19 pooka Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@ -93,7 +93,6 @@ const char devioc[] = "devioc";
const char devcls[] = "devcls";
vnode_t *specfs_hash[SPECHSZ];
kmutex_t specfs_lock;
/*
* This vnode operations vector is used for special device nodes
@ -194,7 +193,7 @@ spec_node_init(vnode_t *vp, dev_t rdev)
/* XXX */
panic("spec_node_init: unable to allocate memory");
}
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
vpp = &specfs_hash[SPECHASH(rdev)];
for (vp2 = *vpp; vp2 != NULL; vp2 = vp2->v_specnext) {
KASSERT(vp2->v_specnode != NULL);
@ -224,7 +223,7 @@ spec_node_init(vnode_t *vp, dev_t rdev)
vp->v_specnode = sn;
vp->v_specnext = *vpp;
*vpp = vp;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
/* Free the record we allocated if unused. */
if (sd != NULL) {
@ -250,20 +249,20 @@ spec_node_revoke(vnode_t *vp)
KASSERT((vp->v_iflag & VI_XLOCK) != 0);
KASSERT(sn->sn_gone == false);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
KASSERT(sn->sn_opencnt <= sd->sd_opencnt);
if (sn->sn_opencnt != 0) {
sd->sd_opencnt -= (sn->sn_opencnt - 1);
sn->sn_opencnt = 1;
sn->sn_gone = true;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
VOP_CLOSE(vp, FNONBLOCK, NOCRED);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
KASSERT(sn->sn_opencnt == 0);
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
}
/*
@ -285,7 +284,7 @@ spec_node_destroy(vnode_t *vp)
KASSERT(vp->v_specnode != NULL);
KASSERT(sn->sn_opencnt == 0);
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
/* Remove from the hash and destroy the node. */
vpp = &specfs_hash[SPECHASH(vp->v_rdev)];
for (vp2 = *vpp;; vp2 = vp2->v_specnext) {
@ -306,7 +305,7 @@ spec_node_destroy(vnode_t *vp)
vp->v_specnode = NULL;
refcnt = sd->sd_refcnt--;
KASSERT(refcnt > 0);
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
/* If the device is no longer in use, destroy our record. */
if (refcnt == 1) {
@ -388,14 +387,14 @@ spec_open(void *v)
* Character devices can accept opens from multiple
* vnodes.
*/
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
if (sn->sn_gone) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (EBADF);
}
sd->sd_opencnt++;
sn->sn_opencnt++;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
if (cdev_type(dev) == D_TTY)
vp->v_vflag |= VV_ISTTY;
VOP_UNLOCK(vp, 0);
@ -413,19 +412,19 @@ spec_open(void *v)
* cache cannot remain self-consistent with multiple
* vnodes holding a block device open.
*/
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
if (sn->sn_gone) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return (EBADF);
}
if (sd->sd_opencnt != 0) {
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
return EBUSY;
}
sn->sn_opencnt = 1;
sd->sd_opencnt = 1;
sd->sd_bdevvp = vp;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
error = bdev_open(dev, ap->a_mode, S_IFBLK, l);
break;
@ -441,7 +440,7 @@ spec_open(void *v)
return 0;
}
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
if (sn->sn_gone) {
if (error == 0)
error = EBADF;
@ -452,7 +451,7 @@ spec_open(void *v)
sd->sd_bdevvp = NULL;
}
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
if (cdev_type(dev) != D_DISK || error != 0)
return error;
@ -951,12 +950,12 @@ spec_close(void *v)
panic("spec_close: not special");
}
mutex_enter(&specfs_lock);
mutex_enter(&device_lock);
sn->sn_opencnt--;
count = --sd->sd_opencnt;
if (vp->v_type == VBLK)
sd->sd_bdevvp = NULL;
mutex_exit(&specfs_lock);
mutex_exit(&device_lock);
if (count != 0)
return 0;

View File

@ -1,4 +1,4 @@
/* $NetBSD: specdev.h,v 1.36 2008/04/28 20:24:08 martin Exp $ */
/* $NetBSD: specdev.h,v 1.37 2008/12/29 17:41:19 pooka Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@ -99,7 +99,6 @@ typedef struct specdev {
#endif
extern vnode_t *specfs_hash[SPECHSZ];
extern kmutex_t specfs_lock;
void spec_node_init(vnode_t *, dev_t);
void spec_node_destroy(vnode_t *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: specfs.c,v 1.2 2008/12/18 00:24:13 pooka Exp $ */
/* $NetBSD: specfs.c,v 1.3 2008/12/29 17:41:19 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: specfs.c,v 1.2 2008/12/18 00:24:13 pooka Exp $");
__KERNEL_RCSID(0, "$NetBSD: specfs.c,v 1.3 2008/12/29 17:41:19 pooka Exp $");
#include <sys/param.h>
#include <sys/buf.h>
@ -56,8 +56,6 @@ static int rump_specputpages(void *);
static int rump_specstrategy(void *);
static int rump_specsimpleul(void *);
kmutex_t specfs_lock;
int (**spec_vnodeop_p)(void *);
const struct vnodeopv_entry_desc rumpspec_vnodeop_entries[] = {
{ &vop_default_desc, vn_default_error },

View File

@ -1,4 +1,4 @@
/* $NetBSD: conf.h,v 1.131 2008/05/19 17:15:00 ad Exp $ */
/* $NetBSD: conf.h,v 1.132 2008/12/29 17:41:19 pooka Exp $ */
/*-
* Copyright (c) 1990, 1993
@ -94,6 +94,9 @@ struct cdevsw {
#ifdef _KERNEL
#include <sys/mutex.h>
extern kmutex_t device_lock;
int devsw_attach(const char *, const struct bdevsw *, int *,
const struct cdevsw *, int *);
int devsw_detach(const struct bdevsw *, const struct cdevsw *);