ref: 1e737b71dc040ee644717f4c4c4079c492afa52b
parent: aaff6a1b223fcbb9fc70cdac92421db40ab04d3c
author: mischief <mischief@offblast.org>
date: Sat Sep 19 21:56:56 EDT 2015
pc, pc64: fix sdvirtio descriptor count when sending flush
--- a/sys/src/9/pc/sdvirtio.c
+++ b/sys/src/9/pc/sdvirtio.c
@@ -326,7 +326,7 @@
static int
vioblkreq(Vdev *vd, int typ, void *a, long count, long secsize, uvlong lba)
{- int free, head;
+ int need, free, head;
Vqueue *q;
Vdesc *d;
@@ -337,7 +337,11 @@
u64int lba;
} req;
- status = 0;
+ need = 2;
+ if(a != nil)
+ need = 3;
+
+ status = -1;
req.typ = typ;
req.prio = 0;
req.lba = lba;
@@ -344,7 +348,7 @@
q = vd->queue[0];
ilock(q);
- while(q->nfree < 3){+ while(q->nfree < need){iunlock(q);
if(!waserror())
@@ -361,10 +365,12 @@
d->len = sizeof(req);
d->flags = Next;
- d = &q->desc[free]; free = d->next;
- d->addr = PADDR(a);
- d->len = secsize*count;
- d->flags = typ ? Next : (Write|Next);
+ if(a != nil){+ d = &q->desc[free]; free = d->next;
+ d->addr = PADDR(a);
+ d->len = secsize*count;
+ d->flags = typ ? Next : (Write|Next);
+ }
d = &q->desc[free]; free = d->next;
d->addr = PADDR(&status);
@@ -372,7 +378,7 @@
d->flags = Write;
q->free = free;
- q->nfree -= 3;
+ q->nfree -= need;
/* queue io, unlock and wait for completion */
vqio(q, head);
--
⑨