On Wed, Feb 22, 2012 at 03:33:52PM +0100, Paolo Bonzini wrote:
Reviewed-by: Stefan Hajnoczi stefa...@linux.vnet.ibm.com
Signed-off-by: Paolo Bonzini pbonz...@redhat.com
---
hw/virtio-scsi.c | 134 ++---
1 files changed, 126 insertions(+), 8 deletions(-)
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
index f4eb8c7..380073a 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -134,6 +134,7 @@ typedef struct {
VirtQueue *cmd_vq;
uint32_t sense_size;
uint32_t cdb_size;
+int resetting;
} VirtIOSCSI;
typedef struct VirtIOSCSIReq {
@@ -236,15 +237,104 @@ static VirtIOSCSIReq *virtio_scsi_pop_req(VirtIOSCSI
*s, VirtQueue *vq)
return req;
}
-static void virtio_scsi_fail_ctrl_req(VirtIOSCSIReq *req)
+static void virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
{
-if (req-req.tmf-type == VIRTIO_SCSI_T_TMF) {
-req-resp.tmf-response = VIRTIO_SCSI_S_FAILURE;
-} else {
-req-resp.an-response = VIRTIO_SCSI_S_FAILURE;
+SCSIDevice *d = virtio_scsi_device_find(s, req-req.cmd-lun);
should be req-req.tmf-lun here and elsewhere in this function?
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
index 380073a..1f3b851 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -239,7 +239,7 @@ static VirtIOSCSIReq *virtio_scsi_pop_req(VirtIOSCSI *s,
VirtQueue *vq)
static void virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
{
-SCSIDevice *d = virtio_scsi_device_find(s, req-req.cmd-lun);
+SCSIDevice *d = virtio_scsi_device_find(s, req-req.tmf-lun);
SCSIRequest *r, *next;
DeviceState *qdev;
int target;
@@ -253,11 +253,11 @@ static void virtio_scsi_do_tmf(VirtIOSCSI *s,
VirtIOSCSIReq *req)
if (!d) {
goto fail;
}
-if (d-lun != virtio_scsi_get_lun(req-req.cmd-lun)) {
+if (d-lun != virtio_scsi_get_lun(req-req.tmf-lun)) {
goto incorrect_lun;
}
QTAILQ_FOREACH_SAFE(r, d-requests, next, next) {
-if (r-tag == req-req.cmd-tag) {
+if (r-tag == req-req.tmf-tag) {
break;
}
}
@@ -277,7 +277,7 @@ static void virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq
*req)
if (!d) {
goto fail;
}
-if (d-lun != virtio_scsi_get_lun(req-req.cmd-lun)) {
+if (d-lun != virtio_scsi_get_lun(req-req.tmf-lun)) {
goto incorrect_lun;
}
s-resetting++;
@@ -291,7 +291,7 @@ static void virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq
*req)
if (!d) {
goto fail;
}
-if (d-lun != virtio_scsi_get_lun(req-req.cmd-lun)) {
+if (d-lun != virtio_scsi_get_lun(req-req.tmf-lun)) {
goto incorrect_lun;
}
QTAILQ_FOREACH_SAFE(r, d-requests, next, next) {
@@ -310,7 +310,7 @@ static void virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq
*req)
break;
case VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET:
-target = req-req.cmd-lun[1];
+target = req-req.tmf-lun[1];
s-resetting++;
QTAILQ_FOREACH(qdev, s-bus.qbus.children, sibling) {
d = DO_UPCAST(SCSIDevice, qdev, qdev);
--
Thanks,
Hu Tao