diff options
author | rsc <rsc> | 2009-05-31 00:23:00 +0000 |
---|---|---|
committer | rsc <rsc> | 2009-05-31 00:23:00 +0000 |
commit | 0ca9ca0c55922f72dbf324c4ac1aecf8069d1dbe (patch) | |
tree | d1795309704cde0b2936653f8fee83acaac43341 /bio.c | |
parent | d827c8f3c82208c1df5c13b191880824f864fa91 (diff) | |
download | xv6-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.c | 16 |
1 files changed, 8 insertions, 8 deletions
@@ -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); } |