diff options
-rw-r--r-- | bio.c | 13 | ||||
-rw-r--r-- | defs.h | 2 | ||||
-rw-r--r-- | ide.c | 18 | ||||
-rw-r--r-- | syscall.c | 8 |
4 files changed, 33 insertions, 8 deletions
@@ -51,6 +51,19 @@ bread(uint dev, uint sector) } void +bwrite(uint dev, struct buf *b, uint sector) +{ + void *c; + extern struct spinlock ide_lock; + + acquire(&ide_lock); + c = ide_start_rw(dev & 0xff, sector, b->data, 1, 0); + sleep (c, &ide_lock); + ide_finish(c); + release(&ide_lock); +} + +void brelse(struct buf *b) { if((b->flags & B_BUSY) == 0) @@ -96,7 +96,9 @@ int ide_finish(void *); // bio.c struct buf; +struct buf *getblk(void); struct buf *bread(uint, uint); +void bwrite(uint, struct buf *, uint); void brelse(struct buf *); // fs.c @@ -101,7 +101,10 @@ ide_start_request (void) outb(0x1F5, (r->secno >> 16) & 0xFF); outb(0x1F6, 0xE0 | ((r->diskno&1)<<4) | ((r->secno>>24)&0x0F)); if (r->read) outb(0x1F7, 0x20); // read - else outb(0x1F7, 0x30); // write + else { + outb(0x1F7, 0x30); // write + outsl(0x1F0, r->addr, 512/4); + } } } @@ -113,7 +116,7 @@ ide_start_rw(int diskno, uint secno, void *addr, uint nsecs, int read) if(!holding(&ide_lock)) panic("ide_start_read: not holding ide_lock"); - if(nsecs > 256) + if(nsecs > 1) panic("ide_start_read: nsecs too large"); while ((head + 1) % NREQUEST == tail) @@ -136,7 +139,7 @@ ide_start_rw(int diskno, uint secno, void *addr, uint nsecs, int read) int ide_finish(void *c) { - int r = 0; + int r; struct ide_request *req = (struct ide_request *) c; if(c != &request[tail]) @@ -144,11 +147,10 @@ ide_finish(void *c) if(!holding(&ide_lock)) panic("ide_start_read: not holding ide_lock"); - for (; req->nsecs > 0; req->nsecs--, req->addr += 512) { - if ((r = ide_wait_ready(1)) < 0) - break; - if (req->read) insl(0x1F0, req->addr, 512/4); - else outsl(0x1F0, req->addr, 512/4); + + if (req->read) { + if ((r = ide_wait_ready(1)) >= 0) + insl(0x1F0, req->addr, 512/4); } if ((head + 1) % NREQUEST == tail) { @@ -426,6 +426,14 @@ sys_block(void) brelse(b); } +#if 0 + cprintf("overwrite fs.img!\n"); + b = getblk(); + memset (b->data, 'f', 10); + bwrite(1, b, 0); + cprintf("write is done\n"); +#endif + ip = iget(1, 1); cprintf("iget 1: %d %d %d %d %d %d %d %d\n", ip->dev, ip->inum, ip->count, ip->busy, |