svn commit: r322721 - in head/sys: kern sys
Konstantin Belousov
kib at FreeBSD.org
Sun Aug 20 10:07:47 UTC 2017
Author: kib
Date: Sun Aug 20 10:07:45 2017
New Revision: 322721
URL: https://svnweb.freebsd.org/changeset/base/322721
Log:
Allow vinvalbuf() to operate with the shared vnode lock.
This mode allows other clean buffers to arrive while we flush the buf
lists for the vnode, which is fine for the targeted use. We only need
that all buffers existed at the time of the function start were
flushed. In fact, only one assert has to be relaxed.
In collaboration with: pho
Reviewed by: rmacklem
Sponsored by: The FreeBSD Foundation
MFC after: 2 weeks
X-Differential revision: https://reviews.freebsd.org/D12083
Modified:
head/sys/kern/vfs_subr.c
head/sys/sys/vnode.h
Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c Sun Aug 20 09:52:25 2017 (r322720)
+++ head/sys/kern/vfs_subr.c Sun Aug 20 10:07:45 2017 (r322721)
@@ -1698,9 +1698,13 @@ bufobj_invalbuf(struct bufobj *bo, int flags, int slpf
#ifdef INVARIANTS
BO_LOCK(bo);
- if ((flags & (V_ALT | V_NORMAL | V_CLEANONLY | V_VMIO)) == 0 &&
- (bo->bo_dirty.bv_cnt > 0 || bo->bo_clean.bv_cnt > 0))
+ if ((flags & (V_ALT | V_NORMAL | V_CLEANONLY | V_VMIO |
+ V_ALLOWCLEAN)) == 0 && (bo->bo_dirty.bv_cnt > 0 ||
+ bo->bo_clean.bv_cnt > 0))
panic("vinvalbuf: flush failed");
+ if ((flags & (V_ALT | V_NORMAL | V_CLEANONLY | V_VMIO)) == 0 &&
+ bo->bo_dirty.bv_cnt > 0)
+ panic("vinvalbuf: flush dirty failed");
BO_UNLOCK(bo);
#endif
return (0);
Modified: head/sys/sys/vnode.h
==============================================================================
--- head/sys/sys/vnode.h Sun Aug 20 09:52:25 2017 (r322720)
+++ head/sys/sys/vnode.h Sun Aug 20 10:07:45 2017 (r322721)
@@ -399,6 +399,7 @@ extern int vttoif_tab[];
#define V_NORMAL 0x0004 /* vinvalbuf: invalidate only regular bufs */
#define V_CLEANONLY 0x0008 /* vinvalbuf: invalidate only clean bufs */
#define V_VMIO 0x0010 /* vinvalbuf: called during pageout */
+#define V_ALLOWCLEAN 0x0020 /* vinvalbuf: allow clean buffers after flush */
#define REVOKEALL 0x0001 /* vop_revoke: revoke all aliases */
#define V_WAIT 0x0001 /* vn_start_write: sleep for suspend */
#define V_NOWAIT 0x0002 /* vn_start_write: don't sleep for suspend */
More information about the svn-src-all
mailing list