summaryrefslogtreecommitdiff
path: root/bio.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-07-21 13:18:04 +0000
committerrtm <rtm>2006-07-21 13:18:04 +0000
commit11a9947f1a68e23001690955d8d0975ad4d6cf0c (patch)
treeceb2f6bde6a8c88e3e9e4d022a23185d8cb6d37e /bio.c
parent29270816285978e44b317c6e5c7bfa7a89ec24dd (diff)
downloadxv6-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.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/bio.c b/bio.c
new file mode 100644
index 0000000..9be11df
--- /dev/null
+++ b/bio.c
@@ -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);
+}
+