summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
authorjlemon <jlemon@FreeBSD.org>2001-02-15 16:34:11 +0000
committerjlemon <jlemon@FreeBSD.org>2001-02-15 16:34:11 +0000
commit11781a7431fab609cd00058a63ac09ccddb16854 (patch)
treeee46dbf40488c941cf17b05e69bfe21e4f2d7128 /sys/kern/vfs_vnops.c
parent5655168b87e22a331c5fc3b603901647ff90b2e4 (diff)
downloadFreeBSD-src-11781a7431fab609cd00058a63ac09ccddb16854.zip
FreeBSD-src-11781a7431fab609cd00058a63ac09ccddb16854.tar.gz
Extend kqueue down to the device layer.
Backwards compatible approach suggested by: peter
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r--sys/kern/vfs_vnops.c87
1 files changed, 6 insertions, 81 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 0175123..760df67 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -55,9 +55,6 @@
#include <sys/ttycom.h>
#include <sys/conf.h>
-#include <ufs/ufs/quota.h>
-#include <ufs/ufs/inode.h>
-
static int vn_closefile __P((struct file *fp, struct proc *p));
static int vn_ioctl __P((struct file *fp, u_long com, caddr_t data,
struct proc *p));
@@ -65,30 +62,14 @@ static int vn_read __P((struct file *fp, struct uio *uio,
struct ucred *cred, int flags, struct proc *p));
static int vn_poll __P((struct file *fp, int events, struct ucred *cred,
struct proc *p));
+static int vn_kqfilter __P((struct file *fp, struct knote *kn));
static int vn_statfile __P((struct file *fp, struct stat *sb, struct proc *p));
static int vn_write __P((struct file *fp, struct uio *uio,
struct ucred *cred, int flags, struct proc *p));
-struct fileops vnops =
- { vn_read, vn_write, vn_ioctl, vn_poll, vn_statfile, vn_closefile };
-
-static int filt_nullattach(struct knote *kn);
-static int filt_vnattach(struct knote *kn);
-static void filt_vndetach(struct knote *kn);
-static int filt_vnode(struct knote *kn, long hint);
-static int filt_vnread(struct knote *kn, long hint);
-
-struct filterops vn_filtops =
- { 1, filt_vnattach, filt_vndetach, filt_vnode };
-
-/*
- * XXX
- * filt_vnread is ufs-specific, so the attach routine should really
- * switch out to different filterops based on the vn filetype
- */
-struct filterops vn_rwfiltops[] = {
- { 1, filt_vnattach, filt_vndetach, filt_vnread },
- { 1, filt_nullattach, NULL, NULL },
+struct fileops vnops = {
+ vn_read, vn_write, vn_ioctl, vn_poll, vn_kqfilter,
+ vn_statfile, vn_closefile
};
/*
@@ -815,66 +796,10 @@ vfs_write_resume(mp)
}
static int
-filt_vnattach(struct knote *kn)
-{
- struct vnode *vp;
-
- if (kn->kn_fp->f_type != DTYPE_VNODE &&
- kn->kn_fp->f_type != DTYPE_FIFO)
- return (EBADF);
-
- vp = (struct vnode *)kn->kn_fp->f_data;
-
- /*
- * XXX
- * this is a hack simply to cause the filter attach to fail
- * for non-ufs filesystems, until the support for them is done.
- */
- if ((vp)->v_tag != VT_UFS)
- return (EOPNOTSUPP);
-
- mtx_lock(&vp->v_pollinfo.vpi_lock);
- SLIST_INSERT_HEAD(&vp->v_pollinfo.vpi_selinfo.si_note, kn, kn_selnext);
- mtx_unlock(&vp->v_pollinfo.vpi_lock);
-
- return (0);
-}
-
-static void
-filt_vndetach(struct knote *kn)
-{
- struct vnode *vp = (struct vnode *)kn->kn_fp->f_data;
-
- mtx_lock(&vp->v_pollinfo.vpi_lock);
- SLIST_REMOVE(&vp->v_pollinfo.vpi_selinfo.si_note,
- kn, knote, kn_selnext);
- mtx_unlock(&vp->v_pollinfo.vpi_lock);
-}
-
-static int
-filt_vnode(struct knote *kn, long hint)
-{
-
- if (kn->kn_sfflags & hint)
- kn->kn_fflags |= hint;
- return (kn->kn_fflags != 0);
-}
-
-static int
-filt_nullattach(struct knote *kn)
-{
- return (ENXIO);
-}
-
-/*ARGSUSED*/
-static int
-filt_vnread(struct knote *kn, long hint)
+vn_kqfilter(struct file *fp, struct knote *kn)
{
- struct vnode *vp = (struct vnode *)kn->kn_fp->f_data;
- struct inode *ip = VTOI(vp);
- kn->kn_data = ip->i_size - kn->kn_fp->f_offset;
- return (kn->kn_data != 0);
+ return (VOP_KQFILTER(((struct vnode *)fp->f_data), kn));
}
/*
OpenPOWER on IntegriCloud