From 848d1906e81992c78bee9e9ce5a5d38e107265cc Mon Sep 17 00:00:00 2001
From: Frans Kaashoek <kaashoek@mit.edu>
Date: Tue, 30 Jul 2019 12:53:19 -0400
Subject: Track in buf if disk "owns" buffer

---
 kernel/buf.h         | 1 +
 kernel/virtio_disk.c | 7 ++++---
 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;
-- 
cgit v1.2.3