version 1.119.6.1, 2009/01/19 13:20:07 |
version 1.119.6.2, 2009/03/03 18:33:36 |
Line 79 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 79 __KERNEL_RCSID(0, "$NetBSD$"); |
|
#include <sys/tty.h> |
#include <sys/tty.h> |
#include <sys/kauth.h> |
#include <sys/kauth.h> |
#include <sys/fstrans.h> |
#include <sys/fstrans.h> |
|
#include <sys/module.h> |
|
|
#include <miscfs/genfs/genfs.h> |
#include <miscfs/genfs/genfs.h> |
#include <miscfs/specfs/specdev.h> |
#include <miscfs/specfs/specdev.h> |
Line 353 spec_open(void *v) |
|
Line 354 spec_open(void *v) |
|
specnode_t *sn; |
specnode_t *sn; |
specdev_t *sd; |
specdev_t *sd; |
|
|
|
u_int gen; |
|
const char *name; |
|
|
l = curlwp; |
l = curlwp; |
vp = ap->a_vp; |
vp = ap->a_vp; |
dev = vp->v_rdev; |
dev = vp->v_rdev; |
sn = vp->v_specnode; |
sn = vp->v_specnode; |
sd = sn->sn_dev; |
sd = sn->sn_dev; |
|
name = NULL; |
|
gen = 0; |
|
|
/* |
/* |
* Don't allow open if fs is mounted -nodev. |
* Don't allow open if fs is mounted -nodev. |
*/ |
*/ |
Line 398 spec_open(void *v) |
|
Line 404 spec_open(void *v) |
|
if (cdev_type(dev) == D_TTY) |
if (cdev_type(dev) == D_TTY) |
vp->v_vflag |= VV_ISTTY; |
vp->v_vflag |= VV_ISTTY; |
VOP_UNLOCK(vp, 0); |
VOP_UNLOCK(vp, 0); |
error = cdev_open(dev, ap->a_mode, S_IFCHR, l); |
do { |
|
gen = module_gen; |
|
error = cdev_open(dev, ap->a_mode, S_IFCHR, l); |
|
if (error != ENXIO) |
|
break; |
|
|
|
/* Get device name from devsw_conv array */ |
|
if ((name = cdevsw_getname(major(dev))) == NULL) |
|
break; |
|
|
|
/* Try to autoload device module */ |
|
mutex_enter(&module_lock); |
|
(void) module_autoload(name, MODULE_CLASS_DRIVER); |
|
mutex_exit(&module_lock); |
|
} while (gen != module_gen); |
|
|
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); |
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); |
break; |
break; |
|
|
Line 425 spec_open(void *v) |
|
Line 446 spec_open(void *v) |
|
sd->sd_opencnt = 1; |
sd->sd_opencnt = 1; |
sd->sd_bdevvp = vp; |
sd->sd_bdevvp = vp; |
mutex_exit(&device_lock); |
mutex_exit(&device_lock); |
|
do { |
|
gen = module_gen; |
|
error = bdev_open(dev, ap->a_mode, S_IFBLK, l); |
|
if (error != ENXIO) |
|
break; |
|
|
|
/* Get device name from devsw_conv array */ |
|
if ((name = bdevsw_getname(major(dev))) == NULL) |
|
break; |
|
|
|
VOP_UNLOCK(vp, 0); |
|
|
|
/* Try to autoload device module */ |
|
mutex_enter(&module_lock); |
|
(void) module_autoload(name, MODULE_CLASS_DRIVER); |
|
mutex_exit(&module_lock); |
|
|
|
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); |
|
} while (gen != module_gen); |
|
|
error = bdev_open(dev, ap->a_mode, S_IFBLK, l); |
|
break; |
break; |
|
|
case VNON: |
case VNON: |
Line 804 spec_strategy(void *v) |
|
Line 843 spec_strategy(void *v) |
|
|
|
error = 0; |
error = 0; |
bp->b_dev = vp->v_rdev; |
bp->b_dev = vp->v_rdev; |
if (!(bp->b_flags & B_READ) && |
|
(LIST_FIRST(&bp->b_dep)) != NULL && bioopsp) |
|
bioopsp->io_start(bp); |
|
|
|
if (!(bp->b_flags & B_READ)) |
if (!(bp->b_flags & B_READ)) |
error = fscow_run(bp, false); |
error = fscow_run(bp, false); |