summaryrefslogtreecommitdiff
path: root/ide.c
diff options
context:
space:
mode:
authorrsc <rsc>2007-08-14 18:46:29 +0000
committerrsc <rsc>2007-08-14 18:46:29 +0000
commit8d0a83565a2b8e0ee2b7e6cab93c6ba7b5a58224 (patch)
treed057b08ef571029c593ac24fb1e7758b5a2cfc58 /ide.c
parentf1f8dd91bc4e8b58972f17416b664f3a950092cd (diff)
downloadxv6-labs-8d0a83565a2b8e0ee2b7e6cab93c6ba7b5a58224.tar.gz
xv6-labs-8d0a83565a2b8e0ee2b7e6cab93c6ba7b5a58224.tar.bz2
xv6-labs-8d0a83565a2b8e0ee2b7e6cab93c6ba7b5a58224.zip
formatting, sleep bug fix
Diffstat (limited to 'ide.c')
-rw-r--r--ide.c8
1 files changed, 7 insertions, 1 deletions
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){