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
This commit is contained in:
parent
2bd61de08c
commit
75c898f2a4
@ -646,8 +646,17 @@ vop_stdfsync(ap)
|
||||
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",
|
||||
|
Loading…
Reference in New Issue
Block a user