diff --git a/console.c b/console.c
index 919b3a2..b41262d 100644
--- a/console.c
+++ b/console.c
@@ -164,14 +164,16 @@ cprintf(char *fmt, ...)
 }
 
 int
-console_write(int minor, char *buf, int n)
+console_write(struct inode *ip, char *buf, int n)
 {
   int i;
 
+  iunlock(ip);
   acquire(&console_lock);
   for(i = 0; i < n; i++)
     cons_putc(buf[i] & 0xff);
   release(&console_lock);
+  ilock(ip);
 
   return n;
 }
@@ -230,17 +232,19 @@ console_intr(int (*getc)(void))
 }
 
 int
-console_read(int minor, char *dst, int n)
+console_read(struct inode *ip, char *dst, int n)
 {
   uint target;
   int c;
 
+  iunlock(ip);
   target = n;
   acquire(&input.lock);
   while(n > 0){
     while(input.r == input.w){
       if(cp->killed){
         release(&input.lock);
+        ilock(ip);
         return -1;
       }
       sleep(&input.r, &input.lock);
@@ -262,6 +266,7 @@ console_read(int minor, char *dst, int n)
       input.r = 0;
   }
   release(&input.lock);
+  ilock(ip);
 
   return target - n;
 }
@@ -274,7 +279,7 @@ console_init(void)
 
   devsw[CONSOLE].write = console_write;
   devsw[CONSOLE].read = console_read;
-  use_console_lock = 1;
+  //use_console_lock = 1;
 
   irq_enable(IRQ_KBD);
   ioapic_enable(IRQ_KBD, 0);
diff --git a/dev.h b/dev.h
index cff0036..48d31d3 100644
--- a/dev.h
+++ b/dev.h
@@ -1,6 +1,6 @@
 struct devsw {
-  int (*read)(int, char*, int);
-  int (*write)(int, char*, int);
+  int (*read)(struct inode*, char*, int);
+  int (*write)(struct inode*, char*, int);
 };
 
 extern struct devsw devsw[];
diff --git a/fs.c b/fs.c
index 45ccdb2..732b721 100644
--- a/fs.c
+++ b/fs.c
@@ -411,7 +411,7 @@ readi(struct inode *ip, char *dst, uint off, uint n)
   if(ip->type == T_DEV) {
     if(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].read)
       return -1;
-    return devsw[ip->major].read(ip->minor, dst, n);
+    return devsw[ip->major].read(ip, dst, n);
   }
 
   if(off > ip->size || off + n < off)
@@ -439,7 +439,7 @@ writei(struct inode *ip, char *src, uint off, uint n)
   if(ip->type == T_DEV) {
     if(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].write)
       return -1;
-    return devsw[ip->major].write(ip->minor, src, n);
+    return devsw[ip->major].write(ip, src, n);
   }
 
   if(off + n < off)