Increase the chance of the buffer write from the bufdaemon helper
context to succeed. If the locked vnode which owns the buffer to be written is shared locked, try the non-blocking upgrade of the lock to exclusive. PR: kern/178997 Reported and tested by: Klaus Weber <fbsd-bugs-2013-1@unix-admin.de> Sponsored by: The FreeBSD Foundation MFC after: 1 week Approved by: re (marius)
This commit is contained in:
parent
c4b7751552
commit
46dd93739b
@ -2624,6 +2624,8 @@ flushbufqueues(struct vnode *lvp, int target, int flushdeps)
|
||||
int hasdeps;
|
||||
int flushed;
|
||||
int queue;
|
||||
int error;
|
||||
bool unlock;
|
||||
|
||||
flushed = 0;
|
||||
queue = QUEUE_DIRTY;
|
||||
@ -2699,7 +2701,16 @@ flushbufqueues(struct vnode *lvp, int target, int flushdeps)
|
||||
BUF_UNLOCK(bp);
|
||||
continue;
|
||||
}
|
||||
if (vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_CANRECURSE) == 0) {
|
||||
if (lvp == NULL) {
|
||||
unlock = true;
|
||||
error = vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT);
|
||||
} else {
|
||||
ASSERT_VOP_LOCKED(vp, "getbuf");
|
||||
unlock = false;
|
||||
error = VOP_ISLOCKED(vp) == LK_EXCLUSIVE ? 0 :
|
||||
vn_lock(vp, LK_UPGRADE | LK_NOWAIT);
|
||||
}
|
||||
if (error == 0) {
|
||||
mtx_unlock(&bqdirty);
|
||||
CTR3(KTR_BUF, "flushbufqueue(%p) vp %p flags %X",
|
||||
bp, bp->b_vp, bp->b_flags);
|
||||
@ -2711,7 +2722,8 @@ flushbufqueues(struct vnode *lvp, int target, int flushdeps)
|
||||
notbufdflushes++;
|
||||
}
|
||||
vn_finished_write(mp);
|
||||
VOP_UNLOCK(vp, 0);
|
||||
if (unlock)
|
||||
VOP_UNLOCK(vp, 0);
|
||||
flushwithdeps += hasdeps;
|
||||
flushed++;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user