[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 13/32] scsi-disk: support emulated TO_DEV requests
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 13/32] scsi-disk: support emulated TO_DEV requests |
Date: |
Fri, 27 Jul 2012 17:02:40 +0200 |
This adds the implementation of write_data for the emulated
command case. The first time through it asks for more data,
the second time it finishes the processing of the command.
MODE SELECT and MODE SELECT(10) can now be re-enabled, but they
will not do much.
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi-disk.c | 36 ++++++++++++++++++++++++++++--------
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 1633177..b8d6086 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -1274,7 +1274,26 @@ static void scsi_disk_emulate_read_data(SCSIRequest *req)
static void scsi_disk_emulate_write_data(SCSIRequest *req)
{
- abort();
+ SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
+
+ if (r->iov.iov_len) {
+ int buflen = r->iov.iov_len;
+ DPRINTF("Write buf_len=%zd\n", buflen);
+ r->iov.iov_len = 0;
+ scsi_req_data(&r->req, buflen);
+ return;
+ }
+
+ switch (req->cmd.buf[0]) {
+ case MODE_SELECT:
+ case MODE_SELECT_10:
+ /* This also clears the sense buffer for REQUEST SENSE. */
+ scsi_req_complete(&r->req, GOOD);
+ break;
+
+ default:
+ abort();
+ }
}
static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
@@ -1283,7 +1302,7 @@ static int32_t scsi_disk_emulate_command(SCSIRequest
*req, uint8_t *buf)
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
uint64_t nb_sectors;
uint8_t *outbuf;
- int buflen = 0;
+ int buflen;
switch (req->cmd.buf[0]) {
case INQUIRY:
@@ -1309,7 +1328,6 @@ static int32_t scsi_disk_emulate_command(SCSIRequest
*req, uint8_t *buf)
break;
}
- assert(req->cmd.mode != SCSI_XFER_TO_DEV);
if (!r->iov.iov_base) {
/*
* FIXME: we shouldn't return anything bigger than 4k, but the code
@@ -1326,6 +1344,7 @@ static int32_t scsi_disk_emulate_command(SCSIRequest
*req, uint8_t *buf)
r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
}
+ buflen = req->cmd.xfer;
outbuf = r->iov.iov_base;
switch (req->cmd.buf[0]) {
case TEST_UNIT_READY:
@@ -1500,7 +1519,6 @@ static int32_t scsi_disk_emulate_command(SCSIRequest
*req, uint8_t *buf)
goto illegal_lba;
}
break;
-#if 0
case MODE_SELECT:
DPRINTF("Mode Select(6) (len %lu)\n", (long)r->req.cmd.xfer);
/* We don't support mode parameter changes.
@@ -1517,7 +1535,6 @@ static int32_t scsi_disk_emulate_command(SCSIRequest
*req, uint8_t *buf)
goto illegal_request;
}
break;
-#endif
case WRITE_SAME_10:
nb_sectors = lduw_be_p(&req->cmd.buf[7]);
goto write_same;
@@ -1552,7 +1569,12 @@ static int32_t scsi_disk_emulate_command(SCSIRequest
*req, uint8_t *buf)
if (r->iov.iov_len == 0) {
scsi_req_complete(&r->req, GOOD);
}
- return r->iov.iov_len;
+ if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
+ assert(r->iov.iov_len == req->cmd.xfer);
+ return -r->iov.iov_len;
+ } else {
+ return r->iov.iov_len;
+ }
illegal_request:
if (r->req.status == -1) {
@@ -1834,10 +1856,8 @@ static const SCSIReqOps *const
scsi_disk_reqops_dispatch[256] = {
[REQUEST_SENSE] = &scsi_disk_emulate_reqops,
[SYNCHRONIZE_CACHE] = &scsi_disk_emulate_reqops,
[SEEK_10] = &scsi_disk_emulate_reqops,
-#if 0
[MODE_SELECT] = &scsi_disk_emulate_reqops,
[MODE_SELECT_10] = &scsi_disk_emulate_reqops,
-#endif
[WRITE_SAME_10] = &scsi_disk_emulate_reqops,
[WRITE_SAME_16] = &scsi_disk_emulate_reqops,
--
1.7.10.4
- [Qemu-devel] [PATCH 03/32] lsi: use qdev_reset_all, (continued)
- [Qemu-devel] [PATCH 03/32] lsi: use qdev_reset_all, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 02/32] megasas: fix misuse of scsi_req_abort, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 01/32] megasas: Replace trace_megasas_dcmd_dump_frame(), Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 05/32] lsi: avoid redundant tests of s->current != NULL, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 06/32] scsi-block: remove properties that are not relevant for passthrough, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 04/32] lsi: introduce lsi_request_free, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 09/32] scsi-disk: make discard asynchronous, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 07/32] cutils: add strpadcpy(), Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 10/32] scsi-disk: move all non-DMA commands to scsi_disk_emulate_command, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 11/32] scsi-disk: split scsi-disk reqops, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 13/32] scsi-disk: support emulated TO_DEV requests,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 08/32] scsi-disk: let the user customize vendor and product name, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 14/32] scsi-disk: adjust offsets in MODE SENSE by 2, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 17/32] scsi-disk: support toggling the write cache, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 23/32] scsi: introduce hotplug() and hot_unplug() interfaces for SCSI bus, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 24/32] scsi: establish precedence levels for unit attention, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 25/32] scsi-disk: report resized disk via sense codes, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 30/32] virtio-scsi: report parameter change events, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 29/32] virtio-scsi: do not report dropped events after reset, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 31/32] virtio-scsi: add ioeventfd support, Paolo Bonzini, 2012/07/27
- [Qemu-devel] [PATCH 32/32] virtio-scsi: enable MSI-X support, Paolo Bonzini, 2012/07/27