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 */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to