Author: mckusick
Date: Sat Jun  9 22:26:53 2012
New Revision: 236825
URL: http://svn.freebsd.org/changeset/base/236825

Log:
  When synchronously syncing a device (MNT_WAIT), wait for buffers
  to become available. Otherwise we may excessively spin and fail
  with ``fsync: giving up on dirty''.
  
  Reviewed by: kib
  Tested by:   Peter Holm
  MFC after:   1 week

Modified:
  head/sys/kern/vfs_default.c

Modified: head/sys/kern/vfs_default.c
==============================================================================
--- head/sys/kern/vfs_default.c Sat Jun  9 20:47:58 2012        (r236824)
+++ head/sys/kern/vfs_default.c Sat Jun  9 22:26:53 2012        (r236825)
@@ -646,8 +646,17 @@ loop2:
                if ((bp->b_vflags & BV_SCANNED) != 0)
                        continue;
                bp->b_vflags |= BV_SCANNED;
-               if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL))
-                       continue;
+               if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) {
+                       if (ap->a_waitfor != MNT_WAIT)
+                               continue;
+                       if (BUF_LOCK(bp,
+                           LK_EXCLUSIVE | LK_INTERLOCK | LK_SLEEPFAIL,
+                           BO_MTX(bo)) != 0) {
+                               BO_LOCK(bo);
+                               goto loop1;
+                       }
+                       BO_LOCK(bo);
+               }
                BO_UNLOCK(bo);
                KASSERT(bp->b_bufobj == bo,
                    ("bp %p wrong b_bufobj %p should be %p",
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to