If the lock passed to getdirtybuf() is the softdep lock then the background
write completed wakeup could be missed. Close the race by grabbing the lock normally used for protection of bp->b_xflags. Reviewed by: truckman
This commit is contained in:
parent
c8c7711d66
commit
6c62b2acd0
@ -5901,6 +5901,19 @@ getdirtybuf(bp, mtx, waitfor)
|
||||
return (NULL);
|
||||
}
|
||||
if ((bp->b_vflags & BV_BKGRDINPROG) != 0) {
|
||||
if (mtx == &lk && waitfor == MNT_WAIT) {
|
||||
mtx_unlock(mtx);
|
||||
BO_LOCK(bp->b_bufobj);
|
||||
BUF_UNLOCK(bp);
|
||||
if ((bp->b_vflags & BV_BKGRDINPROG) != 0) {
|
||||
bp->b_vflags |= BV_BKGRDWAIT;
|
||||
msleep(&bp->b_xflags, BO_MTX(bp->b_bufobj),
|
||||
PRIBIO | PDROP, "getbuf", 0);
|
||||
} else
|
||||
BO_UNLOCK(bp->b_bufobj);
|
||||
mtx_lock(mtx);
|
||||
return (NULL);
|
||||
}
|
||||
BUF_UNLOCK(bp);
|
||||
if (waitfor != MNT_WAIT)
|
||||
return (NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user