]> Devi Nivas Git - cs3210-lab1.git/commitdiff
Replace I_BUSY with sleep locks
authorFrans Kaashoek <kaashoek@mit.edu>
Mon, 12 Sep 2016 00:59:57 +0000 (20:59 -0400)
committerFrans Kaashoek <kaashoek@mit.edu>
Mon, 12 Sep 2016 00:59:57 +0000 (20:59 -0400)
console.c
file.c
file.h
fs.c
pipe.c
sysfile.c
uart.c

index fa611efa82e5f8bc2657041003ef36a01cce67e5..4d678b0b5a43f578b2d6a328fd7b3a9dcaef5e6c 100644 (file)
--- a/console.c
+++ b/console.c
@@ -7,6 +7,7 @@
 #include "param.h"
 #include "traps.h"
 #include "spinlock.h"
+#include "sleeplock.h"
 #include "fs.h"
 #include "file.h"
 #include "memlayout.h"
diff --git a/file.c b/file.c
index 85bb4034a50b593f4f8dfddd6af288ee918b535e..95cadb374aa71664bc409406440e08b12bb41350 100644 (file)
--- a/file.c
+++ b/file.c
@@ -6,8 +6,9 @@
 #include "defs.h"
 #include "param.h"
 #include "fs.h"
-#include "file.h"
 #include "spinlock.h"
+#include "sleeplock.h"
+#include "file.h"
 
 struct devsw devsw[NDEV];
 struct {
diff --git a/file.h b/file.h
index 5a4a463223a0a8fa9e89ba501334f9202d08a757..22a6803d40e8a2ebe9f3b8293ebfab9cbf0255ff 100644 (file)
--- a/file.h
+++ b/file.h
@@ -14,7 +14,8 @@ struct inode {
   uint dev;           // Device number
   uint inum;          // Inode number
   int ref;            // Reference count
-  int flags;          // I_BUSY, I_VALID
+  struct sleeplock lock;
+  int flags;          // I_VALID
 
   short type;         // copy of disk inode
   short major;
@@ -23,7 +24,6 @@ struct inode {
   uint size;
   uint addrs[NDIRECT+1];
 };
-#define I_BUSY 0x1
 #define I_VALID 0x2
 
 // table mapping major device number to
diff --git a/fs.c b/fs.c
index 26a0b3e5791a14229ad822a4aa7191036ee773cf..be8c5c53fadf012131c4d061d41167ebdf55e7c4 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -135,9 +135,7 @@ bfree(int dev, uint b)
 //
 // * Locked: file system code may only examine and modify
 //   the information in an inode and its content if it
-//   has first locked the inode. The I_BUSY flag indicates
-//   that the inode is locked. ilock() sets I_BUSY,
-//   while iunlock clears it.
+//   has first locked the inode.
 //
 // Thus a typical sequence is:
 //   ip = iget(dev, inum)
@@ -165,7 +163,13 @@ struct {
 void
 iinit(int dev)
 {
+  int i = 0;
+  
   initlock(&icache.lock, "icache");
+  for(i = 0; i < NINODE; i++) {
+    initsleeplock(&icache.inode[i].lock, "inode");
+  }
+  
   readsb(dev, &sb);
   cprintf("sb: size %d nblocks %d ninodes %d nlog %d logstart %d\
  inodestart %d bmap start %d\n", sb.size, sb.nblocks,
@@ -277,11 +281,7 @@ ilock(struct inode *ip)
   if(ip == 0 || ip->ref < 1)
     panic("ilock");
 
-  acquire(&icache.lock);
-  while(ip->flags & I_BUSY)
-    sleep(ip, &icache.lock);
-  ip->flags |= I_BUSY;
-  release(&icache.lock);
+  acquiresleep(&ip->lock);
 
   if(!(ip->flags & I_VALID)){
     bp = bread(ip->dev, IBLOCK(ip->inum, sb));
@@ -303,13 +303,10 @@ ilock(struct inode *ip)
 void
 iunlock(struct inode *ip)
 {
-  if(ip == 0 || !(ip->flags & I_BUSY) || ip->ref < 1)
+  if(ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1)
     panic("iunlock");
 
-  acquire(&icache.lock);
-  ip->flags &= ~I_BUSY;
-  wakeup(ip);
-  release(&icache.lock);
+  releasesleep(&ip->lock);
 }
 
 // Drop a reference to an in-memory inode.
@@ -325,16 +322,12 @@ iput(struct inode *ip)
   acquire(&icache.lock);
   if(ip->ref == 1 && (ip->flags & I_VALID) && ip->nlink == 0){
     // inode has no links and no other references: truncate and free.
-    if(ip->flags & I_BUSY)
-      panic("iput busy");
-    ip->flags |= I_BUSY;
     release(&icache.lock);
     itrunc(ip);
     ip->type = 0;
     iupdate(ip);
     acquire(&icache.lock);
     ip->flags = 0;
-    wakeup(ip);
   }
   ip->ref--;
   release(&icache.lock);
diff --git a/pipe.c b/pipe.c
index f76ed5c557301bfb83cb9d34299955359560a2cc..a9f471e57f06fc3a32c9cc358dc3131e13afb519 100644 (file)
--- a/pipe.c
+++ b/pipe.c
@@ -4,8 +4,9 @@
 #include "mmu.h"
 #include "proc.h"
 #include "fs.h"
-#include "file.h"
 #include "spinlock.h"
+#include "sleeplock.h"
+#include "file.h"
 
 #define PIPESIZE 512
 
index aaeccc5fc6fa7485ed8a6137f2a025f31739af9e..98e8c433d4f9db53d508ff0dbd0ce247cc3bb401 100644 (file)
--- a/sysfile.c
+++ b/sysfile.c
@@ -11,6 +11,8 @@
 #include "mmu.h"
 #include "proc.h"
 #include "fs.h"
+#include "spinlock.h"
+#include "sleeplock.h"
 #include "file.h"
 #include "fcntl.h"
 
diff --git a/uart.c b/uart.c
index 257384ac0d91c7c8c68ea8c76da7c1c81a920f1f..84da397b73df6bfcbe5c074f36a2c1515e6abb63 100644 (file)
--- a/uart.c
+++ b/uart.c
@@ -5,6 +5,7 @@
 #include "param.h"
 #include "traps.h"
 #include "spinlock.h"
+#include "sleeplock.h"
 #include "fs.h"
 #include "file.h"
 #include "mmu.h"