diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/buf.h | 1 | ||||
| -rw-r--r-- | 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; | 
