Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 9 Jun 2012 22:26:53 +0000 (UTC)
From:      Kirk McKusick <mckusick@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r236825 - head/sys/kern
Message-ID:  <201206092226.q59MQrO1057506@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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",



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206092226.q59MQrO1057506>