Rename specfs_lock as device_lock and move it from specfs to devsw.
Relaxes kernel dependency on vfs.
This commit is contained in:
parent
4266eb20ef
commit
8583cae233
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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 *);
|
||||
|
@ -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 },
|
||||
|
@ -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 *);
|
||||
|
Loading…
x
Reference in New Issue
Block a user