svn commit: r236825 - head/sys/kern
Kirk McKusick
mckusick at FreeBSD.org
Sat Jun 9 22:26:53 UTC 2012
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",
More information about the svn-src-all
mailing list