diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/sys/event.h | 4 | ||||
-rw-r--r-- | sys/ufs/ufs/ufs_vnops.c | 19 |
2 files changed, 15 insertions, 8 deletions
diff --git a/sys/sys/event.h b/sys/sys/event.h index 85886bd470f..826332fd639 100644 --- a/sys/sys/event.h +++ b/sys/sys/event.h @@ -1,4 +1,4 @@ -/* $OpenBSD: event.h,v 1.7 2003/07/22 01:05:07 tedu Exp $ */ +/* $OpenBSD: event.h,v 1.8 2003/12/17 02:43:25 tedu Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> @@ -79,6 +79,7 @@ struct kevent { * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace */ #define NOTE_LOWAT 0x0001 /* low water mark */ +#define NOTE_EOF 0x0002 /* return on EOF */ /* * data/hint flags for EVFILT_VNODE, shared with userspace @@ -90,6 +91,7 @@ struct kevent { #define NOTE_LINK 0x0010 /* link count changed */ #define NOTE_RENAME 0x0020 /* vnode was renamed */ #define NOTE_REVOKE 0x0040 /* vnode access was revoked */ +#define NOTE_TRUNCATE 0x0080 /* vnode was truncated */ /* * data/hint flags for EVFILT_PROC, shared with userspace diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index 65d1b713fd4..4169076450e 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ufs_vnops.c,v 1.52 2003/11/19 03:29:31 mickey Exp $ */ +/* $OpenBSD: ufs_vnops.c,v 1.53 2003/12/17 02:43:25 tedu Exp $ */ /* $NetBSD: ufs_vnops.c,v 1.18 1996/05/11 18:28:04 mycroft Exp $ */ /* @@ -350,6 +350,8 @@ ufs_setattr(v) struct ucred *cred = ap->a_cred; struct proc *p = ap->a_p; int error; + long hint = NOTE_ATTRIB; + u_quad_t oldsize; /* * Check for unsettable attributes. @@ -395,6 +397,7 @@ ufs_setattr(v) return (error); } if (vap->va_size != VNOVAL) { + oldsize = ip->i_ffs_size; /* * Disallow write attempts on read-only file systems; * unless the file is a socket, fifo, or a block or @@ -413,6 +416,8 @@ ufs_setattr(v) } if ((error = UFS_TRUNCATE(ip, vap->va_size, 0, cred)) != 0) return (error); + if (vap->va_size < oldsize) + hint |= NOTE_TRUNCATE; } if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) { if (vp->v_mount->mnt_flag & MNT_RDONLY) @@ -436,7 +441,7 @@ ufs_setattr(v) return (EROFS); error = ufs_chmod(vp, (int)vap->va_mode, cred, p); } - VN_KNOTE(vp, NOTE_ATTRIB); + VN_KNOTE(vp, hint); return (error); } @@ -2215,10 +2220,14 @@ filt_ufsread(struct knote *kn, long hint) } kn->kn_data = ip->i_ffs_size - kn->kn_fp->f_offset; + if (kn->kn_data == 0 && kn->kn_sfflags & NOTE_EOF) { + kn->kn_fflags |= NOTE_EOF; + return (1); + } + return (kn->kn_data != 0); } - int filt_ufswrite(struct knote *kn, long hint) { @@ -2238,7 +2247,6 @@ filt_ufswrite(struct knote *kn, long hint) int filt_ufsvnode(struct knote *kn, long hint) { - if (kn->kn_sfflags & hint) kn->kn_fflags |= hint; if (hint == NOTE_REVOKE) { @@ -2247,6 +2255,3 @@ filt_ufsvnode(struct knote *kn, long hint) } return (kn->kn_fflags != 0); } - - - |