summaryrefslogtreecommitdiff
path: root/fs.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 /fs.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 'fs.c')
-rw-r--r--fs.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/fs.c b/fs.c
new file mode 100644
index 0000000..48c943a
--- /dev/null
+++ b/fs.c
@@ -0,0 +1,73 @@
+#include "types.h"
+#include "param.h"
+#include "x86.h"
+#include "mmu.h"
+#include "proc.h"
+#include "defs.h"
+#include "spinlock.h"
+#include "buf.h"
+#include "fs.h"
+#include "fsvar.h"
+
+// these are inodes currently in use
+// an entry is free if count == 0
+struct inode inode[NINODE];
+struct spinlock inode_table_lock;
+
+struct inode *
+iget(uint dev, uint inum)
+{
+ struct inode *ip, *nip = 0;
+ struct dinode *dip;
+ struct buf *bp;
+
+ acquire(&inode_table_lock);
+
+ loop:
+ for(ip = &inode[0]; ip < &inode[NINODE]; ip++){
+ if(ip->count > 0 && ip->dev == dev && ip->inum == inum){
+ if(ip->busy){
+ sleep(ip, &inode_table_lock);
+ goto loop;
+ }
+ ip->count++;
+ release(&inode_table_lock);
+ return ip;
+ }
+ if(nip == 0 && ip->count == 0)
+ nip = ip;
+ }
+
+ if(nip == 0)
+ panic("out of inodes");
+
+ nip->dev = dev;
+ nip->inum = inum;
+ nip->count = 1;
+ nip->busy = 1;
+
+ release(&inode_table_lock);
+
+ bp = bread(dev, inum / IPB + 2);
+ dip = &((struct dinode *)(bp->data))[inum % IPB];
+ nip->type = dip->type;
+ nip->nlink = dip->nlink;
+ nip->size = dip->size;
+ memmove(nip->addrs, dip->addrs, sizeof(nip->addrs));
+ cprintf("bn %d off %d\n", inum / IPB + 2, (unsigned)dip - (unsigned)bp->data);
+ brelse(bp);
+
+ return nip;
+}
+
+void
+iput(struct inode *ip)
+{
+ acquire(&inode_table_lock);
+
+ ip->count -= 1;
+ ip->busy = 0;
+ wakeup(ip);
+
+ release(&inode_table_lock);
+}