diff options
author | rtm <rtm> | 2006-07-21 13:18:04 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-07-21 13:18:04 +0000 |
commit | 11a9947f1a68e23001690955d8d0975ad4d6cf0c (patch) | |
tree | ceb2f6bde6a8c88e3e9e4d022a23185d8cb6d37e /bio.c | |
parent | 29270816285978e44b317c6e5c7bfa7a89ec24dd (diff) | |
download | xv6-labs-11a9947f1a68e23001690955d8d0975ad4d6cf0c.tar.gz xv6-labs-11a9947f1a68e23001690955d8d0975ad4d6cf0c.tar.bz2 xv6-labs-11a9947f1a68e23001690955d8d0975ad4d6cf0c.zip |
bread
iget
mkfs makes a file system image
put this in your .bochsrc:
ata0-slave: type=disk, mode=flat, path="fs.img", cylinders=1024, heads=1, spt=1
Diffstat (limited to 'bio.c')
-rw-r--r-- | bio.c | 66 |
1 files changed, 66 insertions, 0 deletions
@@ -0,0 +1,66 @@ +#include "types.h" +#include "param.h" +#include "x86.h" +#include "mmu.h" +#include "proc.h" +#include "defs.h" +#include "spinlock.h" +#include "buf.h" + +struct buf buf[NBUF]; +struct spinlock buf_table_lock; + +struct buf * +getblk() +{ + int i; + + acquire(&buf_table_lock); + + // XXX need to lock the block even if not caching, to + // avoid read modify write problems. + + while(1){ + for(i = 0; i < NBUF; i++){ + if((buf[i].flags & B_BUSY) == 0){ + buf[i].flags |= B_BUSY; + release(&buf_table_lock); + return buf + i; + } + } + sleep(buf, &buf_table_lock); + } +} + +struct buf * +bread(uint dev, uint sector) +{ + void *c; + struct buf *b; + extern struct spinlock ide_lock; + + b = getblk(); + + acquire(&ide_lock); + c = ide_start_read(dev & 0xff, sector, b->data, 1); + // sleep (c, &ide_lock); + ide_finish_read(c); + release(&ide_lock); + + return b; +} + +void +brelse(struct buf *b) +{ + if((b->flags & B_BUSY) == 0) + panic("brelse"); + + acquire(&buf_table_lock); + + b->flags &= ~B_BUSY; + wakeup(buf); + + release(&buf_table_lock); +} + |