Fix bio race that results in deadlock

上级 b1445295
...@@ -94,7 +94,10 @@ bread(u32 dev, u64 sector, int writer) ...@@ -94,7 +94,10 @@ bread(u32 dev, u64 sector, int writer)
if(!(b->flags & B_VALID)) if(!(b->flags & B_VALID))
iderw(b); iderw(b);
if (writer && !origwriter) { if (writer && !origwriter) {
// Lock to seriaize check-and-sleep in bget with clearing B_BUSY
acquire(&b->lock);
b->flags &= ~B_BUSY; b->flags &= ~B_BUSY;
release(&b->lock);
cv_wakeup(&b->cv); cv_wakeup(&b->cv);
} }
return b; return b;
...@@ -118,7 +121,10 @@ brelse(struct buf *b, int writer) ...@@ -118,7 +121,10 @@ brelse(struct buf *b, int writer)
if (writer) { if (writer) {
if((b->flags & B_BUSY) == 0) if((b->flags & B_BUSY) == 0)
panic("brelse"); panic("brelse");
// Lock to seriaize check-and-sleep in bget with clearing B_BUSY
acquire(&b->lock);
b->flags &= ~B_BUSY; b->flags &= ~B_BUSY;
release(&b->lock);
cv_wakeup(&b->cv); cv_wakeup(&b->cv);
} }
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论