summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2019-07-30 12:53:19 -0400
committerFrans Kaashoek <[email protected]>2019-07-30 12:53:19 -0400
commit848d1906e81992c78bee9e9ce5a5d38e107265cc (patch)
treeac4d67a267c0f14ee894eeecfaec0a6b6c5ee223
parent87183da13d80555fde253823108be12667246079 (diff)
downloadxv6-labs-848d1906e81992c78bee9e9ce5a5d38e107265cc.tar.gz
xv6-labs-848d1906e81992c78bee9e9ce5a5d38e107265cc.tar.bz2
xv6-labs-848d1906e81992c78bee9e9ce5a5d38e107265cc.zip
Track in buf if disk "owns" buffer
-rw-r--r--kernel/buf.h1
-rw-r--r--kernel/virtio_disk.c7
2 files changed, 5 insertions, 3 deletions
diff --git a/kernel/buf.h b/kernel/buf.h
index ae9d264..4a3a39d 100644
--- a/kernel/buf.h
+++ b/kernel/buf.h
@@ -1,5 +1,6 @@
struct buf {
int valid; // has data been read from disk?
+ int disk; // does disk "own" buf?
uint dev;
uint blockno;
struct sleeplock lock;
diff --git a/kernel/virtio_disk.c b/kernel/virtio_disk.c
index 9ebe695..14c718d 100644
--- a/kernel/virtio_disk.c
+++ b/kernel/virtio_disk.c
@@ -222,6 +222,7 @@ virtio_disk_rw(struct buf *b, int write)
desc[idx[2]].next = 0;
// record struct buf for virtio_disk_intr().
+ b->disk = 1;
info[idx[0]].b = b;
// avail[0] is flags
@@ -235,7 +236,7 @@ virtio_disk_rw(struct buf *b, int write)
*R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number
// Wait for virtio_disk_intr() to say request has finished.
- while(info[idx[0]].status == 0) {
+ while(b->disk == 1) {
sleep(b, &vdisk_lock);
}
@@ -255,8 +256,8 @@ virtio_disk_intr()
if(info[id].status != 0)
panic("virtio_disk_intr status");
-
- info[id].status = 1;
+
+ info[id].b->disk = 0; // disk is done with buf
wakeup(info[id].b);
used_idx = (used_idx + 1) % NUM;