diff options
author | kaashoek <kaashoek> | 2006-08-07 01:38:46 +0000 |
---|---|---|
committer | kaashoek <kaashoek> | 2006-08-07 01:38:46 +0000 |
commit | 104207726be721843e44b8616faa87222aa5f0c2 (patch) | |
tree | c3110f6482c692df461023a3d40ed420cc288475 | |
parent | 8ec6530feea5153e00dced60d33fbfdd9d5c3184 (diff) | |
download | xv6-labs-104207726be721843e44b8616faa87222aa5f0c2.tar.gz xv6-labs-104207726be721843e44b8616faa87222aa5f0c2.tar.bz2 xv6-labs-104207726be721843e44b8616faa87222aa5f0c2.zip |
bwrite
-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, |