Message ID | 1342624074-24650-24-git-send-email-stefanha@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jul 18, 2012 at 04:07:50PM +0100, Stefan Hajnoczi wrote: > Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Why? > --- > hw/virtio-blk.c | 25 +++++++++++++++++-------- > 1 file changed, 17 insertions(+), 8 deletions(-) > > diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c > index 51807b5..8734029 100644 > --- a/hw/virtio-blk.c > +++ b/hw/virtio-blk.c > @@ -215,14 +215,8 @@ static void process_request(IOQueue *ioq, struct iovec iov[], unsigned int out_n > > /* TODO Linux sets the barrier bit even when not advertised! */ > uint32_t type = outhdr->type & ~VIRTIO_BLK_T_BARRIER; > - > - if (unlikely(type & ~(VIRTIO_BLK_T_OUT | VIRTIO_BLK_T_FLUSH))) { > - fprintf(stderr, "virtio-blk unsupported request type %#x\n", outhdr->type); > - exit(1); > - } > - > struct iocb *iocb; > - switch (type & (VIRTIO_BLK_T_OUT | VIRTIO_BLK_T_FLUSH)) { > + switch (type & (VIRTIO_BLK_T_OUT | VIRTIO_BLK_T_SCSI_CMD | VIRTIO_BLK_T_FLUSH)) { > case VIRTIO_BLK_T_IN: > if (unlikely(out_num != 1)) { > fprintf(stderr, "virtio-blk invalid read request\n"); > @@ -239,6 +233,21 @@ static void process_request(IOQueue *ioq, struct iovec iov[], unsigned int out_n > iocb = ioq_rdwr(ioq, false, &iov[1], out_num - 1, outhdr->sector * 512UL); /* TODO is it always 512? */ > break; > > + case VIRTIO_BLK_T_SCSI_CMD: > + if (unlikely(in_num == 0)) { > + fprintf(stderr, "virtio-blk invalid SCSI command request\n"); > + exit(1); > + } > + > + /* TODO support SCSI commands */ > + { > + VirtIOBlock *s = container_of(ioq, VirtIOBlock, ioqueue); > + inhdr->status = VIRTIO_BLK_S_UNSUPP; > + vring_push(&s->vring, head, sizeof *inhdr); > + virtio_blk_notify_guest(s); > + } > + return; > + > case VIRTIO_BLK_T_FLUSH: > if (unlikely(in_num != 1 || out_num != 1)) { > fprintf(stderr, "virtio-blk invalid flush request\n"); > @@ -256,7 +265,7 @@ static void process_request(IOQueue *ioq, struct iovec iov[], unsigned int out_n > return; > > default: > - fprintf(stderr, "virtio-blk multiple request type bits set\n"); > + fprintf(stderr, "virtio-blk unsupported request type %#x\n", outhdr->type); > exit(1); > } > > -- > 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index 51807b5..8734029 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -215,14 +215,8 @@ static void process_request(IOQueue *ioq, struct iovec iov[], unsigned int out_n /* TODO Linux sets the barrier bit even when not advertised! */ uint32_t type = outhdr->type & ~VIRTIO_BLK_T_BARRIER; - - if (unlikely(type & ~(VIRTIO_BLK_T_OUT | VIRTIO_BLK_T_FLUSH))) { - fprintf(stderr, "virtio-blk unsupported request type %#x\n", outhdr->type); - exit(1); - } - struct iocb *iocb; - switch (type & (VIRTIO_BLK_T_OUT | VIRTIO_BLK_T_FLUSH)) { + switch (type & (VIRTIO_BLK_T_OUT | VIRTIO_BLK_T_SCSI_CMD | VIRTIO_BLK_T_FLUSH)) { case VIRTIO_BLK_T_IN: if (unlikely(out_num != 1)) { fprintf(stderr, "virtio-blk invalid read request\n"); @@ -239,6 +233,21 @@ static void process_request(IOQueue *ioq, struct iovec iov[], unsigned int out_n iocb = ioq_rdwr(ioq, false, &iov[1], out_num - 1, outhdr->sector * 512UL); /* TODO is it always 512? */ break; + case VIRTIO_BLK_T_SCSI_CMD: + if (unlikely(in_num == 0)) { + fprintf(stderr, "virtio-blk invalid SCSI command request\n"); + exit(1); + } + + /* TODO support SCSI commands */ + { + VirtIOBlock *s = container_of(ioq, VirtIOBlock, ioqueue); + inhdr->status = VIRTIO_BLK_S_UNSUPP; + vring_push(&s->vring, head, sizeof *inhdr); + virtio_blk_notify_guest(s); + } + return; + case VIRTIO_BLK_T_FLUSH: if (unlikely(in_num != 1 || out_num != 1)) { fprintf(stderr, "virtio-blk invalid flush request\n"); @@ -256,7 +265,7 @@ static void process_request(IOQueue *ioq, struct iovec iov[], unsigned int out_n return; default: - fprintf(stderr, "virtio-blk multiple request type bits set\n"); + fprintf(stderr, "virtio-blk unsupported request type %#x\n", outhdr->type); exit(1); }
Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> --- hw/virtio-blk.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)