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)