aboutsummaryrefslogtreecommitdiff
path: root/sys/ufs
diff options
context:
space:
mode:
authorJonathan Lemon <jlemon@FreeBSD.org>2001-06-05 13:52:37 +0000
committerJonathan Lemon <jlemon@FreeBSD.org>2001-06-05 13:52:37 +0000
commit4e92ec9dd0f3ac71e83d4790860f280281fef3cd (patch)
tree983bc90656a58265a46f395f857a5a97eb3faf42 /sys/ufs
parent1cdc13928007b1bed491e36df3d19fd7d87b900c (diff)
downloadsrc-4e92ec9dd0f3ac71e83d4790860f280281fef3cd.tar.gz
src-4e92ec9dd0f3ac71e83d4790860f280281fef3cd.zip
Add a kqueue filter for writing to ufs filesystems which always returns
true. This permits better interoperability with programs which register filters on their stdin/stdout handles. Submitted by: Niels Provos <provos@citi.umich.edu>
Notes
Notes: svn path=/head/; revision=77762
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ufs/ufs_vnops.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 7afeca453d95..cb6fcfc0c3d3 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -108,6 +108,7 @@ static int ufsspec_close __P((struct vop_close_args *));
static int ufsspec_read __P((struct vop_read_args *));
static int ufsspec_write __P((struct vop_write_args *));
static int filt_ufsread __P((struct knote *kn, long hint));
+static int filt_ufswrite __P((struct knote *kn, long hint));
static int filt_ufsvnode __P((struct knote *kn, long hint));
static void filt_ufsdetach __P((struct knote *kn));
static int ufs_kqfilter __P((struct vop_kqfilter_args *ap));
@@ -2396,6 +2397,8 @@ ufs_missingop(ap)
static struct filterops ufsread_filtops =
{ 1, NULL, filt_ufsdetach, filt_ufsread };
+static struct filterops ufswrite_filtops =
+ { 1, NULL, filt_ufsdetach, filt_ufswrite };
static struct filterops ufsvnode_filtops =
{ 1, NULL, filt_ufsdetach, filt_ufsvnode };
@@ -2413,6 +2416,9 @@ ufs_kqfilter(ap)
case EVFILT_READ:
kn->kn_fop = &ufsread_filtops;
break;
+ case EVFILT_WRITE:
+ kn->kn_fop = &ufswrite_filtops;
+ break;
case EVFILT_VNODE:
kn->kn_fop = &ufsvnode_filtops;
break;
@@ -2460,6 +2466,22 @@ filt_ufsread(struct knote *kn, long hint)
return (kn->kn_data != 0);
}
+/*ARGSUSED*/
+static int
+filt_ufswrite(struct knote *kn, long hint)
+{
+
+ /*
+ * filesystem is gone, so set the EOF flag and schedule
+ * the knote for deletion.
+ */
+ if (hint == NOTE_REVOKE)
+ kn->kn_flags |= (EV_EOF | EV_ONESHOT);
+
+ kn->kn_data = 0;
+ return (1);
+}
+
static int
filt_ufsvnode(struct knote *kn, long hint)
{