summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-10-22 09:09:41 +0000
committerkib <kib@FreeBSD.org>2014-10-22 09:09:41 +0000
commitdc7923c136856a47bfdddeb30ce3412dc3f4c11e (patch)
tree31104b2c1d431cb1fe60d6fbc7b4e1ef40ab6948 /sys/fs
parent6809e3fc35d8e7dc281d790d54803f904703fec1 (diff)
downloadFreeBSD-src-dc7923c136856a47bfdddeb30ce3412dc3f4c11e.zip
FreeBSD-src-dc7923c136856a47bfdddeb30ce3412dc3f4c11e.tar.gz
MFC r273131:
When vnode bypass cannot be performed on the cdev file descriptor for read/write/poll/ioctl, call standard vnode filedescriptor fop.
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/deadfs/dead_vnops.c9
-rw-r--r--sys/fs/devfs/devfs_vnops.c23
2 files changed, 19 insertions, 13 deletions
diff --git a/sys/fs/deadfs/dead_vnops.c b/sys/fs/deadfs/dead_vnops.c
index 8c0ebcb..35eded0 100644
--- a/sys/fs/deadfs/dead_vnops.c
+++ b/sys/fs/deadfs/dead_vnops.c
@@ -43,9 +43,6 @@
*/
static vop_lookup_t dead_lookup;
static vop_open_t dead_open;
-static vop_poll_t dead_poll;
-static vop_read_t dead_read;
-static vop_write_t dead_write;
static vop_getwritemount_t dead_getwritemount;
static vop_rename_t dead_rename;
@@ -130,7 +127,7 @@ dead_open(ap)
* Vnode op for read
*/
/* ARGSUSED */
-static int
+int
dead_read(ap)
struct vop_read_args /* {
struct vnode *a_vp;
@@ -151,7 +148,7 @@ dead_read(ap)
* Vnode op for write
*/
/* ARGSUSED */
-static int
+int
dead_write(ap)
struct vop_write_args /* {
struct vnode *a_vp;
@@ -163,7 +160,7 @@ dead_write(ap)
return (EIO);
}
-static int
+int
dead_poll(ap)
struct vop_poll_args *ap;
{
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index 1e3f5e8..99ad355 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -734,8 +734,10 @@ devfs_ioctl_f(struct file *fp, u_long com, void *data, struct ucred *cred, struc
fpop = td->td_fpop;
error = devfs_fp_check(fp, &dev, &dsw, &ref);
- if (error)
+ if (error != 0) {
+ error = vnops.fo_ioctl(fp, com, data, cred, td);
return (error);
+ }
if (com == FIODTYPE) {
*(int *)data = dsw->d_flags & D_TYPEMASK;
@@ -1149,8 +1151,10 @@ devfs_poll_f(struct file *fp, int events, struct ucred *cred, struct thread *td)
fpop = td->td_fpop;
error = devfs_fp_check(fp, &dev, &dsw, &ref);
- if (error)
- return (poll_no_poll(events));
+ if (error != 0) {
+ error = vnops.fo_poll(fp, events, cred, td);
+ return (error);
+ }
error = dsw->d_poll(dev, events, td);
td->td_fpop = fpop;
dev_relthread(dev, ref);
@@ -1182,8 +1186,10 @@ devfs_read_f(struct file *fp, struct uio *uio, struct ucred *cred,
return (EINVAL);
fpop = td->td_fpop;
error = devfs_fp_check(fp, &dev, &dsw, &ref);
- if (error)
+ if (error != 0) {
+ error = vnops.fo_read(fp, uio, cred, flags, td);
return (error);
+ }
resid = uio->uio_resid;
ioflag = fp->f_flag & (O_NONBLOCK | O_DIRECT);
if (ioflag & O_DIRECT)
@@ -1657,8 +1663,10 @@ devfs_write_f(struct file *fp, struct uio *uio, struct ucred *cred,
return (EINVAL);
fpop = td->td_fpop;
error = devfs_fp_check(fp, &dev, &dsw, &ref);
- if (error)
+ if (error != 0) {
+ error = vnops.fo_write(fp, uio, cred, flags, td);
return (error);
+ }
KASSERT(uio->uio_td == td, ("uio_td %p is not td %p", uio->uio_td, td));
ioflag = fp->f_flag & (O_NONBLOCK | O_DIRECT | O_FSYNC);
if (ioflag & O_DIRECT)
@@ -1740,8 +1748,9 @@ static struct vop_vector devfs_specops = {
.vop_mknod = VOP_PANIC,
.vop_open = devfs_open,
.vop_pathconf = devfs_pathconf,
+ .vop_poll = dead_poll,
.vop_print = devfs_print,
- .vop_read = VOP_PANIC,
+ .vop_read = dead_read,
.vop_readdir = VOP_PANIC,
.vop_readlink = VOP_PANIC,
.vop_reallocblks = VOP_PANIC,
@@ -1757,7 +1766,7 @@ static struct vop_vector devfs_specops = {
.vop_strategy = VOP_PANIC,
.vop_symlink = VOP_PANIC,
.vop_vptocnp = devfs_vptocnp,
- .vop_write = VOP_PANIC,
+ .vop_write = dead_write,
};
/*
OpenPOWER on IntegriCloud