summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2016-05-16 02:35:33 +0000
committerkib <kib@FreeBSD.org>2016-05-16 02:35:33 +0000
commit1dad0c227ac26ad77961f062129537b9bceefc2f (patch)
tree594a6a37165d44b80893f985e8c799e9f5a55520 /sys/kern/vfs_subr.c
parentee7dae36d2e61b409a02a5ac1c35d4061b447438 (diff)
downloadFreeBSD-src-1dad0c227ac26ad77961f062129537b9bceefc2f.zip
FreeBSD-src-1dad0c227ac26ad77961f062129537b9bceefc2f.tar.gz
MFC r287831 (by cem):
Note DOOMED vnodes with NOTE_REVOKE.
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 699ff7d..63574d8 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -4351,6 +4351,15 @@ vop_mknod_post(void *ap, int rc)
}
void
+vop_reclaim_post(void *ap, int rc)
+{
+ struct vop_reclaim_args *a = ap;
+
+ if (!rc)
+ VFS_KNOTE_LOCKED(a->a_vp, NOTE_REVOKE);
+}
+
+void
vop_remove_post(void *ap, int rc)
{
struct vop_remove_args *a = ap;
@@ -4647,7 +4656,7 @@ filt_vfsread(struct knote *kn, long hint)
* filesystem is gone, so set the EOF flag and schedule
* the knote for deletion.
*/
- if (hint == NOTE_REVOKE) {
+ if (hint == NOTE_REVOKE || (hint == 0 && vp->v_type == VBAD)) {
VI_LOCK(vp);
kn->kn_flags |= (EV_EOF | EV_ONESHOT);
VI_UNLOCK(vp);
@@ -4676,7 +4685,7 @@ filt_vfswrite(struct knote *kn, long hint)
* filesystem is gone, so set the EOF flag and schedule
* the knote for deletion.
*/
- if (hint == NOTE_REVOKE)
+ if (hint == NOTE_REVOKE || (hint == 0 && vp->v_type == VBAD))
kn->kn_flags |= (EV_EOF | EV_ONESHOT);
kn->kn_data = 0;
@@ -4693,7 +4702,7 @@ filt_vfsvnode(struct knote *kn, long hint)
VI_LOCK(vp);
if (kn->kn_sfflags & hint)
kn->kn_fflags |= hint;
- if (hint == NOTE_REVOKE) {
+ if (hint == NOTE_REVOKE || (hint == 0 && vp->v_type == VBAD)) {
kn->kn_flags |= EV_EOF;
VI_UNLOCK(vp);
return (1);
OpenPOWER on IntegriCloud