summaryrefslogtreecommitdiff
path: root/ide.c
diff options
context:
space:
mode:
authorrsc <rsc>2006-07-17 05:00:25 +0000
committerrsc <rsc>2006-07-17 05:00:25 +0000
commit0dd4253747eef56d0f1539fac7d62234f6af5f51 (patch)
tree1c28a6d0ce4cef90f85fd5f8b0106d431bfeffda /ide.c
parentb5f17007f41770fee97fa850635976ceb7aa7492 (diff)
downloadxv6-labs-0dd4253747eef56d0f1539fac7d62234f6af5f51.tar.gz
xv6-labs-0dd4253747eef56d0f1539fac7d62234f6af5f51.tar.bz2
xv6-labs-0dd4253747eef56d0f1539fac7d62234f6af5f51.zip
add ide_lock for sleep
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 3228f7f..2ea2253 100644
--- a/ide.c
+++ b/ide.c
@@ -10,6 +10,7 @@
#include "proc.h"
#include "defs.h"
#include "x86.h"
+#include "spinlock.h"
#define IDE_BSY 0x80
#define IDE_DRDY 0x40
@@ -23,6 +24,7 @@ struct ide_request {
};
struct ide_request request[NREQUEST];
int head, tail;
+struct spinlock ide_lock;
static int diskno = 0;
int disk_channel;
@@ -107,12 +109,14 @@ void *
ide_start_read(uint32_t secno, void *dst, uint nsecs)
{
struct ide_request *r;
+ if(!holding(&ide_lock))
+ panic("ide_start_read: not holding ide_lock");
if(nsecs > 256)
panic("ide_start_read: nsecs too large");
while ((head + 1) % NREQUEST == tail)
- sleep (&disk_channel, 0);
+ sleep (&disk_channel, &ide_lock);
r = &request[head];
r->secno = secno;
@@ -132,6 +136,8 @@ ide_finish_read(void *c)
int r = 0;
struct ide_request *req = (struct ide_request *) c;
+ if(!holding(&ide_lock))
+ panic("ide_start_read: not holding ide_lock");
for (; req->nsecs > 0; req->nsecs--, req->dst += 512) {
if ((r = ide_wait_ready(1)) < 0)
break;