diff --git a/ide.c b/ide.c index 0ff5719..5bbf0f5 100644 --- a/ide.c +++ b/ide.c @@ -29,6 +29,7 @@ struct ide_request { void *addr; uint nsecs; uint read; + int done; }; static struct ide_request request[NREQUEST]; @@ -40,6 +41,7 @@ static int disk_queue; static int ide_probe_disk1(void); +//PAGEBREAK: 10 // Wait for IDE disk to become ready. static int ide_wait_ready(int check_error) @@ -91,6 +93,7 @@ void ide_intr(void) { acquire(&ide_lock); + request[tail].done = 1; wakeup(&request[tail]); release(&ide_lock); } @@ -119,6 +122,7 @@ ide_start_request (void) } } +//PAGEBREAK: 30 // Run an entire disk operation. void ide_rw(int diskno, uint secno, void *addr, uint nsecs, int read) @@ -140,13 +144,15 @@ ide_rw(int diskno, uint secno, void *addr, uint nsecs, int read) r->nsecs = nsecs; r->diskno = diskno; r->read = read; + r->done = 0; head = (head + 1) % NREQUEST; // Start request if necessary. ide_start_request(); // Wait for request to finish. - sleep(r, &ide_lock); + while(!r->done) + sleep(r, &ide_lock); // Finish request. if(read){