summaryrefslogtreecommitdiff
path: root/kernel/virtio_disk.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2019-08-01 15:46:50 -0400
committerFrans Kaashoek <[email protected]>2019-08-01 15:46:50 -0400
commit62ece4b09e6a568ede0e3b524af959194e0cb792 (patch)
tree72553e7a6c57a3298193b288db07eb1a4eab17d0 /kernel/virtio_disk.c
parentfb8a0099d48643775d0bca626af1a73a3ab618a4 (diff)
parent9c4f62e8e3e7f114c6f82a75579a815e6329d767 (diff)
downloadxv6-labs-62ece4b09e6a568ede0e3b524af959194e0cb792.tar.gz
xv6-labs-62ece4b09e6a568ede0e3b524af959194e0cb792.tar.bz2
xv6-labs-62ece4b09e6a568ede0e3b524af959194e0cb792.zip
Merge branch 'riscv-bcache' into riscv
Diffstat (limited to 'kernel/virtio_disk.c')
-rw-r--r--kernel/virtio_disk.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/kernel/virtio_disk.c b/kernel/virtio_disk.c
index 3ace5ef..14c718d 100644
--- a/kernel/virtio_disk.c
+++ b/kernel/virtio_disk.c
@@ -164,7 +164,7 @@ alloc3_desc(int *idx)
}
void
-virtio_disk_rw(struct buf *b)
+virtio_disk_rw(struct buf *b, int write)
{
uint64 sector = b->blockno * (BSIZE / 512);
@@ -192,7 +192,7 @@ virtio_disk_rw(struct buf *b)
uint64 sector;
} buf0;
- if(b->flags & B_DIRTY)
+ if(write)
buf0.type = VIRTIO_BLK_T_OUT; // write the disk
else
buf0.type = VIRTIO_BLK_T_IN; // read the disk
@@ -208,7 +208,7 @@ virtio_disk_rw(struct buf *b)
desc[idx[1]].addr = (uint64) b->data;
desc[idx[1]].len = BSIZE;
- if(b->flags & B_DIRTY)
+ if(write)
desc[idx[1]].flags = 0; // device reads b->data
else
desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data
@@ -222,6 +222,7 @@ virtio_disk_rw(struct buf *b)
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,10 +236,13 @@ virtio_disk_rw(struct buf *b)
*R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number
// Wait for virtio_disk_intr() to say request has finished.
- while((b->flags & (B_VALID|B_DIRTY)) != B_VALID){
+ while(b->disk == 1) {
sleep(b, &vdisk_lock);
}
+ info[idx[0]].b = 0;
+ free_chain(idx[0]);
+
release(&vdisk_lock);
}
@@ -252,15 +256,10 @@ virtio_disk_intr()
if(info[id].status != 0)
panic("virtio_disk_intr status");
-
- info[id].b->flags |= B_VALID;
- info[id].b->flags &= ~B_DIRTY;
-
+
+ info[id].b->disk = 0; // disk is done with buf
wakeup(info[id].b);
- info[id].b = 0;
- free_chain(id);
-
used_idx = (used_idx + 1) % NUM;
}