aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2015-12-04 03:54:18 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2015-12-04 03:54:18 +0000
commitd9ea698c7526b52018c54283a2236b5a237c89c9 (patch)
treeaddba6b6224d7f76958864ebd4b21a0b16df8edf /sys/kern/vfs_subr.c
parent985108aeb13d77c8833a7a9e06a32f90f27de443 (diff)
downloadsrc-d9ea698c7526b52018c54283a2236b5a237c89c9.tar.gz
src-d9ea698c7526b52018c54283a2236b5a237c89c9.zip
We need to zero out the clustering variables in a freed vnode structure.
For completeness add a VNASSERT that there are no threads waiting on a range lock (this was previously checked on every vnode free). Reported by; Rick Macklem Fix from: Mateusz Guzik PR: 204949
Notes
Notes: svn path=/head/; revision=291743
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index ff37de832118..2ec5bc119689 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -2770,6 +2770,8 @@ _vdrop(struct vnode *vp, bool locked)
VNASSERT(TAILQ_EMPTY(&vp->v_cache_dst), vp, ("vp has namecache dst"));
VNASSERT(LIST_EMPTY(&vp->v_cache_src), vp, ("vp has namecache src"));
VNASSERT(vp->v_cache_dd == NULL, vp, ("vp has namecache for .."));
+ VNASSERT(TAILQ_EMPTY(&vp->v_rl.rl_waiters), vp,
+ ("Dangling rangelock waiters"));
VI_UNLOCK(vp);
#ifdef MAC
mac_vnode_destroy(vp);
@@ -2783,6 +2785,7 @@ _vdrop(struct vnode *vp, bool locked)
vp->v_op = NULL;
#endif
bzero(&vp->v_un, sizeof(vp->v_un));
+ vp->v_lasta = vp->v_clen = vp->v_cstart = vp->v_lastw = 0;
vp->v_iflag = 0;
vp->v_vflag = 0;
bo->bo_flag = 0;