summaryrefslogtreecommitdiff
path: root/sys/fs
diff options
context:
space:
mode:
authorthorpej <thorpej@NetBSD.org>2022-07-18 04:30:30 +0000
committerthorpej <thorpej@NetBSD.org>2022-07-18 04:30:30 +0000
commit939afc6be598616bc96b8c94b9d95767c289681b (patch)
tree207ef261a421efdd4cb0440260959293a1894d16 /sys/fs
parented3b29c39d4ed2da27473fd3ab170f3df9589821 (diff)
Make kqueue event status for vnodes shareable, and for stacked file systems
like nullfs, make the upper vnode share that status with the lower vnode. And, lo, NetBSD 9.99.99. Fixes PR kern/56713.
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/union/union_subr.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/fs/union/union_subr.c b/sys/fs/union/union_subr.c
index cd948dca201..19ddd01517a 100644
--- a/sys/fs/union/union_subr.c
+++ b/sys/fs/union/union_subr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: union_subr.c,v 1.81 2022/03/19 13:53:32 hannken Exp $ */
+/* $NetBSD: union_subr.c,v 1.82 2022/07/18 04:30:30 thorpej Exp $ */
/*
* Copyright (c) 1994
@@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: union_subr.c,v 1.81 2022/03/19 13:53:32 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: union_subr.c,v 1.82 2022/07/18 04:30:30 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -232,10 +232,11 @@ union_newupper(struct union_node *un, struct vnode *uppervp)
unlock_ap.a_desc = VDESC(vop_unlock);
unlock_ap.a_vp = UNIONTOV(un);
genfs_unlock(&unlock_ap);
- /* Update union vnode interlock & vmobjlock. */
+ /* Update union vnode interlock, vmobjlock, & klist. */
vshareilock(UNIONTOV(un), uppervp);
rw_obj_hold(uppervp->v_uobj.vmobjlock);
uvm_obj_setlock(&UNIONTOV(un)->v_uobj, uppervp->v_uobj.vmobjlock);
+ vshareklist(UNIONTOV(un), uppervp);
mutex_exit(&un->un_lock);
if (ohash != nhash) {
LIST_INSERT_HEAD(&uhashtbl[nhash], un, un_cache);
@@ -577,6 +578,7 @@ union_loadvnode(struct mount *mp, struct vnode *vp,
vshareilock(vp, svp);
rw_obj_hold(svp->v_uobj.vmobjlock);
uvm_obj_setlock(&vp->v_uobj, svp->v_uobj.vmobjlock);
+ vshareklist(vp, svp);
/* detect the root vnode (and aliases) */
if ((un->un_uppervp == um->um_uppervp) &&