Module Name: src Committed By: thorpej Date: Sun Oct 10 23:46:23 UTC 2021
Modified Files: src/sys/miscfs/genfs: genfs_vnops.c src/sys/nfs: nfs_kq.c Log Message: Must hold kn->kn_kq->kq_lock to modify kn->kn_flags. To generate a diff of this commit: cvs rdiff -u -r1.212 -r1.213 src/sys/miscfs/genfs/genfs_vnops.c cvs rdiff -u -r1.28 -r1.29 src/sys/nfs/nfs_kq.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/miscfs/genfs/genfs_vnops.c diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.212 src/sys/miscfs/genfs/genfs_vnops.c:1.213 --- src/sys/miscfs/genfs/genfs_vnops.c:1.212 Sun Sep 26 01:16:10 2021 +++ src/sys/miscfs/genfs/genfs_vnops.c Sun Oct 10 23:46:23 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: genfs_vnops.c,v 1.212 2021/09/26 01:16:10 thorpej Exp $ */ +/* $NetBSD: genfs_vnops.c,v 1.213 2021/10/10 23:46:23 thorpej Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.212 2021/09/26 01:16:10 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.213 2021/10/10 23:46:23 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -68,6 +68,7 @@ __KERNEL_RCSID(0, "$NetBSD: genfs_vnops. #include <sys/namei.h> #include <sys/vnode_impl.h> #include <sys/fcntl.h> +#include <sys/eventvar.h> /* XXX for kq->kq_lock */ #include <sys/kmem.h> #include <sys/poll.h> #include <sys/mman.h> @@ -525,7 +526,9 @@ filt_genfsread(struct knote *kn, long hi switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); + mutex_spin_enter(&kn->kn_kq->kq_lock); kn->kn_flags |= (EV_EOF | EV_ONESHOT); + mutex_spin_exit(&kn->kn_kq->kq_lock); return (1); case 0: mutex_enter(vp->v_interlock); @@ -552,7 +555,9 @@ filt_genfswrite(struct knote *kn, long h switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); + mutex_spin_enter(&kn->kn_kq->kq_lock); kn->kn_flags |= (EV_EOF | EV_ONESHOT); + mutex_spin_exit(&kn->kn_kq->kq_lock); return (1); case 0: mutex_enter(vp->v_interlock); @@ -575,7 +580,9 @@ filt_genfsvnode(struct knote *kn, long h switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); + mutex_spin_enter(&kn->kn_kq->kq_lock); kn->kn_flags |= EV_EOF; + mutex_spin_exit(&kn->kn_kq->kq_lock); if ((kn->kn_sfflags & hint) != 0) kn->kn_fflags |= hint; return (1); Index: src/sys/nfs/nfs_kq.c diff -u src/sys/nfs/nfs_kq.c:1.28 src/sys/nfs/nfs_kq.c:1.29 --- src/sys/nfs/nfs_kq.c:1.28 Sun Sep 26 01:16:10 2021 +++ src/sys/nfs/nfs_kq.c Sun Oct 10 23:46:22 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_kq.c,v 1.28 2021/09/26 01:16:10 thorpej Exp $ */ +/* $NetBSD: nfs_kq.c,v 1.29 2021/10/10 23:46:22 thorpej Exp $ */ /*- * Copyright (c) 2002, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_kq.c,v 1.28 2021/09/26 01:16:10 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_kq.c,v 1.29 2021/10/10 23:46:22 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: nfs_kq.c,v 1 #include <sys/vnode.h> #include <sys/unistd.h> #include <sys/file.h> +#include <sys/eventvar.h> /* XXX for kq->kq_lock */ #include <sys/kthread.h> #include <nfs/rpcv2.h> @@ -231,7 +232,9 @@ filt_nfsread(struct knote *kn, long hint switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); + mutex_spin_enter(&kn->kn_kq->kq_lock); kn->kn_flags |= (EV_EOF | EV_ONESHOT); + mutex_spin_exit(&kn->kn_kq->kq_lock); return (1); case 0: mutex_enter(vp->v_interlock); @@ -255,7 +258,9 @@ filt_nfsvnode(struct knote *kn, long hin switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); + mutex_spin_enter(&kn->kn_kq->kq_lock); kn->kn_flags |= EV_EOF; + mutex_spin_exit(&kn->kn_kq->kq_lock); if ((kn->kn_sfflags & hint) != 0) kn->kn_fflags |= hint; return (1);