This repository has been archived by the owner. It is now read-only.
Browse files

Do not flush buffers when the v_object of the passed vnode does not

really belong to it. Such vnodes, with the pointers to other vnodes
v_objects, are typically instantiated by the bypass filesystems.
Invalidating mappings of other vnode pages and the pages is wrong,
since reclamation of the upper vnode does not imply that lower vnode
is reclaimed too.

One of the consequences of the improper reclamation was destruction of
the wired mappings of the lower vnode pages, triggering miscellaneous
assertions in the VM system.

Reported by:    John Marshall <>
Tested by:      John Marshall <>, pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Approved by:	re (gjb)
  • Loading branch information...
kostikbel committed Oct 9, 2013
1 parent 7ff487b commit d973ab2c238486eba90659984a91cc2843190d7f
Showing with 2 additions and 0 deletions.
  1. +2 −0 sys/kern/vfs_subr.c
@@ -1315,6 +1315,8 @@ vinvalbuf(struct vnode *vp, int flags, int slpflag, int slptimeo)
CTR3(KTR_VFS, "%s: vp %p with flags %d", __func__, vp, flags);
ASSERT_VOP_LOCKED(vp, "vinvalbuf");
+ if (vp->v_object != NULL && vp->v_object->handle != vp)
+ return (0);
return (bufobj_invalbuf(&vp->v_bufobj, flags, slpflag, slptimeo));

0 comments on commit d973ab2

Please sign in to comment.