summaryrefslogtreecommitdiff
path: root/bio.c
diff options
context:
space:
mode:
authorrsc <rsc>2009-05-31 00:23:00 +0000
committerrsc <rsc>2009-05-31 00:23:00 +0000
commit0ca9ca0c55922f72dbf324c4ac1aecf8069d1dbe (patch)
treed1795309704cde0b2936653f8fee83acaac43341 /bio.c
parentd827c8f3c82208c1df5c13b191880824f864fa91 (diff)
downloadxv6-labs-0ca9ca0c55922f72dbf324c4ac1aecf8069d1dbe.tar.gz
xv6-labs-0ca9ca0c55922f72dbf324c4ac1aecf8069d1dbe.tar.bz2
xv6-labs-0ca9ca0c55922f72dbf324c4ac1aecf8069d1dbe.zip
slight rearrangement; sleep on b not buf.
Diffstat (limited to 'bio.c')
-rw-r--r--bio.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/bio.c b/bio.c
index b761c3b..aea7835 100644
--- a/bio.c
+++ b/bio.c
@@ -69,22 +69,22 @@ bget(uint dev, uint sector)
for(b = bufhead.next; b != &bufhead; b = b->next){
if((b->flags & (B_BUSY|B_VALID)) &&
b->dev == dev && b->sector == sector){
- if(b->flags & B_BUSY){
- sleep(buf, &buf_table_lock);
- goto loop;
+ if(!(b->flags & B_BUSY)){
+ b->flags |= B_BUSY;
+ release(&buf_table_lock);
+ return b;
}
- b->flags |= B_BUSY;
- release(&buf_table_lock);
- return b;
+ sleep(b, &buf_table_lock);
+ goto loop;
}
}
// Allocate fresh block.
for(b = bufhead.prev; b != &bufhead; b = b->prev){
if((b->flags & B_BUSY) == 0){
- b->flags = B_BUSY;
b->dev = dev;
b->sector = sector;
+ b->flags = B_BUSY;
release(&buf_table_lock);
return b;
}
@@ -131,7 +131,7 @@ brelse(struct buf *b)
bufhead.next = b;
b->flags &= ~B_BUSY;
- wakeup(buf);
+ wakeup(b);
release(&buf_table_lock);
}