mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-27 11:55:06 +00:00
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
16b0ad07ab
commit
d1f8ca485d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=255797
@ -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…
Reference in New Issue
Block a user