Am Freitag, 29. August 2008 schrieb Hannes Reinecke:
> > ([<0000000000435e66>] schedule+0x32e/0x7ec)
> > [<000000000043659e>] schedule_timeout+0xba/0x10c
> > [<00000000004358da>] wait_for_common+0xbe/0x1a8
> > [<000000000027ec3e>] blk_execute_rq+0x86/0xc4
> > [<0000000000282768>] sg_io+0x1a4/0x360
> > [<0000000000282f8c>] scsi_cmd_ioctl+0x2bc/0x3f0
> > [<00000000002c3108>] virtblk_ioctl+0x44/0x58
> > [<000000000027ff18>] blkdev_driver_ioctl+0x98/0xa4
> > [<000000000027ffd8>] blkdev_ioctl+0xb4/0x7f8
> > [<00000000001e1572>] block_ioctl+0x3a/0x48
> > [<00000000001bca0a>] vfs_ioctl+0x52/0xdc
> > [<00000000001bcb0a>] do_vfs_ioctl+0x76/0x350
> > [<00000000001bce6e>] sys_ioctl+0x8a/0xa0
> > [<000000000011282c>] sysc_tracego+0xe/0x14
> > [<0000020000114286>] 0x20000114286
>
> I'm tempted to say 'not my fault'; the submitted SCSI request on
> the _host_ hangs and doesn't come back.
> Looks more like a SCSI problem on the host ...
It is a guest process trace.
Anyway, after you suggested to look at the len field it appeared to me, that
the new code sets the data_len, sense_len and changes the number of reported
bytes to random values even if the host returns VIRTIO_BLK_S_UNSUPP.
Moving these assignments to the VIRTIO_BLK_S_OK case seems to fix it.
Can you test if SG_IO still works for you after applying this patch:
Signed-off-by: Christian Borntraeger <[EMAIL PROTECTED]>
---
drivers/block/virtio_blk.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
Index: kvm/drivers/block/virtio_blk.c
===================================================================
--- kvm.orig/drivers/block/virtio_blk.c
+++ kvm/drivers/block/virtio_blk.c
@@ -50,9 +50,17 @@ static void blk_done(struct virtqueue *v
while ((vbr = vblk->vq->vq_ops->get_buf(vblk->vq, &len)) != NULL) {
int error;
unsigned int bytes;
+
+ bytes = blk_rq_bytes(vbr->req);
switch (vbr->status) {
case VIRTIO_BLK_S_OK:
error = 0;
+ if (blk_pc_request(vbr->req)) {
+ vbr->req->data_len = vbr->in_hdr.residual;
+ bytes = vbr->in_hdr.data_len;
+ vbr->req->sense_len = vbr->in_hdr.sense_len;
+ vbr->req->errors = vbr->in_hdr.status;
+ }
break;
case VIRTIO_BLK_S_UNSUPP:
error = -ENOTTY;
@@ -61,15 +69,6 @@ static void blk_done(struct virtqueue *v
error = -EIO;
break;
}
-
- if (blk_pc_request(vbr->req)) {
- vbr->req->data_len = vbr->in_hdr.residual;
- bytes = vbr->in_hdr.data_len;
- vbr->req->sense_len = vbr->in_hdr.sense_len;
- vbr->req->errors = vbr->in_hdr.status;
- } else
- bytes = blk_rq_bytes(vbr->req);
-
__blk_end_request(vbr->req, error, bytes);
list_del(&vbr->list);
mempool_free(vbr, vblk->pool);
_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/virtualization