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