[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 4/7] virtio-scsi: do not compare 32-bit QEMU tags ag
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 4/7] virtio-scsi: do not compare 32-bit QEMU tags against 64-bit virtio-scsi tags |
Date: |
Thu, 9 Aug 2012 15:38:28 +0200 |
This patch fixes a problem in handling task management functions
in virtio-scsi. The cause of the problem is a mismatch between
the size of the tag in QEMU (32-bit) and virtio-scsi (64-bit).
Changing the QEMU size is hard because the migration format
uses 32 bits to store the tag; so just don't use the QEMU tag
(virtio-scsi only uses the tag for task management functions
anyway) and look up the full 64-bit tag in the hba_private field.
The reproducer is a bit obscure. If you cause an I/O timeout
(for example with rerror=stop and doing 'cont' on the monitor
continuously without fixing the error), sooner or later the
guest will try to abort the command and reissue it. At this
point, QEMU will report _two_ errors instead of one when you
hit 'c', because the first error has not been canceled correctly.
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/virtio-scsi.c | 10 ++++++++--
1 file modificato, 8 inserzioni(+), 2 rimozioni(-)
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
index c4a5b22..5f737ac 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -305,11 +305,17 @@ static void virtio_scsi_do_tmf(VirtIOSCSI *s,
VirtIOSCSIReq *req)
goto incorrect_lun;
}
QTAILQ_FOREACH_SAFE(r, &d->requests, next, next) {
- if (r->tag == req->req.tmf->tag) {
+ VirtIOSCSIReq *cmd_req = r->hba_private;
+ if (cmd_req && cmd_req->req.cmd->tag == req->req.tmf->tag) {
break;
}
}
- if (r && r->hba_private) {
+ if (r) {
+ /*
+ * Assert that the request has not been completed yet, we
+ * check for it in the loop above.
+ */
+ assert(r->hba_private);
if (req->req.tmf->subtype == VIRTIO_SCSI_T_TMF_QUERY_TASK) {
/* "If the specified command is present in the task set, then
* return a service response set to FUNCTION SUCCEEDED".
--
1.7.11.2
- [Qemu-devel] [PULL 0/7] last SCSI changes for 1.2, Paolo Bonzini, 2012/08/09
- [Qemu-devel] [PATCH 2/7] iscsi: reorganize code for parse_initiator_name, Paolo Bonzini, 2012/08/09
- [Qemu-devel] [PATCH 3/7] iscsi: Pick default initiator-name based on the name of the VM, Paolo Bonzini, 2012/08/09
- [Qemu-devel] [PATCH 1/7] iscsi: do not leak initiator_name, Paolo Bonzini, 2012/08/09
- [Qemu-devel] [PATCH 4/7] virtio-scsi: do not compare 32-bit QEMU tags against 64-bit virtio-scsi tags,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 6/7] scsi-disk: improve out-of-range LBA detection for WRITE SAME, Paolo Bonzini, 2012/08/09
- [Qemu-devel] [PATCH 5/7] scsi-disk: more assertions and resets for aiocb, Paolo Bonzini, 2012/08/09
- [Qemu-devel] [PATCH 7/7] scsi-disk: add support for the UNMAP command, Paolo Bonzini, 2012/08/09
- Re: [Qemu-devel] [PULL 0/7] last SCSI changes for 1.2, Anthony Liguori, 2012/08/11