summaryrefslogtreecommitdiff
path: root/kernel/virtio_disk.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2019-07-29 17:33:16 -0400
committerFrans Kaashoek <[email protected]>2019-07-29 17:33:16 -0400
commit530431045237d7ccbbc0bb65ed83309845c19893 (patch)
tree6617b13b8e63bb0fd19ff04ac21b8d5e5d9da6b0 /kernel/virtio_disk.c
parent34980381bd75ce28ffea2113559aefa1b02c64f0 (diff)
downloadxv6-labs-530431045237d7ccbbc0bb65ed83309845c19893.tar.gz
xv6-labs-530431045237d7ccbbc0bb65ed83309845c19893.tar.bz2
xv6-labs-530431045237d7ccbbc0bb65ed83309845c19893.zip
Remove B_DIRTY
Use refcnt to pin blocks into the cache Replace flags/B_VALID with a boolean field valid Use info[id].status to signal completion of disk interrupt Pass a read/write flag to virtio_disk_rw
Diffstat (limited to 'kernel/virtio_disk.c')
-rw-r--r--kernel/virtio_disk.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/kernel/virtio_disk.c b/kernel/virtio_disk.c
index 3ace5ef..df4473d 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
@@ -235,7 +235,7 @@ 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(info[idx[0]].status == 0) {
sleep(b, &vdisk_lock);
}
@@ -253,9 +253,7 @@ 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].status = 1;
wakeup(info[id].b);
info[id].b = 0;