From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>
Subject: [Qemu-devel] [PATCH 16/30] scsi-disk: restruct emulation: core + TEST_UNIT_READY.
Date: Thu, 26 Nov 2009 15:34:02 +0100 [thread overview]
Message-ID: <1259246056-5389-17-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1259246056-5389-1-git-send-email-kraxel@redhat.com>
Add new scsi_disk_emulate_command() function, which will -- when
finished -- handle all scsi disk command emulation except actual I/O
(READ+WRITE commands) which goes to the block layer. The function
builds on top of the new SCSIRequest struct.
SCSI command emulation code is moved over from scsi_send_command() in
steps to ease review and make it easier to pin down regressions (if any)
using bisect. This patch moves over TEST_UNIT_READY only.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/scsi-disk.c | 47 ++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 42 insertions(+), 5 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index bc8270c..f851694 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -306,6 +306,31 @@ static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
return (uint8_t *)r->iov.iov_base;
}
+static int scsi_disk_emulate_command(SCSIRequest *req, uint8_t *outbuf)
+{
+ BlockDriverState *bdrv = req->dev->dinfo->bdrv;
+ int buflen = 0;
+
+ switch (req->cmd.buf[0]) {
+ case TEST_UNIT_READY:
+ if (!bdrv_is_inserted(bdrv))
+ goto not_ready;
+ break;
+ default:
+ goto illegal_request;
+ }
+ scsi_req_set_status(req, GOOD, NO_SENSE);
+ return buflen;
+
+not_ready:
+ scsi_req_set_status(req, CHECK_CONDITION, NOT_READY);
+ return 0;
+
+illegal_request:
+ scsi_req_set_status(req, CHECK_CONDITION, ILLEGAL_REQUEST);
+ return 0;
+}
+
/* Execute a scsi command. Returns the length of the data expected by the
command. This will be Positive for data transfers from the device
(eg. disk reads), negative for transfers to the device (eg. disk writes),
@@ -323,6 +348,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
uint8_t command;
uint8_t *outbuf;
SCSIDiskReq *r;
+ int rc;
command = buf[0];
r = scsi_find_request(s, tag);
@@ -377,6 +403,14 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
printf("\n");
}
#endif
+
+ if (scsi_req_parse(&r->req, buf) != 0) {
+ BADF("Unsupported command length, command %x\n", command);
+ goto fail;
+ }
+ assert(r->req.cmd.len == cmdlen);
+ assert(r->req.cmd.lba == lba);
+
if (lun || buf[1] >> 5) {
/* Only LUN 0 supported. */
DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
@@ -385,10 +419,14 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
}
switch (command) {
case TEST_UNIT_READY:
- DPRINTF("Test Unit Ready\n");
- if (!bdrv_is_inserted(s->qdev.dinfo->bdrv))
- goto notready;
- break;
+ rc = scsi_disk_emulate_command(&r->req, outbuf);
+ if (rc > 0) {
+ r->iov.iov_len = rc;
+ } else {
+ scsi_req_complete(&r->req);
+ scsi_remove_request(r);
+ }
+ return rc;
case REQUEST_SENSE:
DPRINTF("Request Sense (len %d)\n", len);
if (len < 4)
@@ -761,7 +799,6 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
outbuf[7] = 0;
r->iov.iov_len = 8;
} else {
- notready:
scsi_command_complete(r, CHECK_CONDITION, NOT_READY);
return 0;
}
--
1.6.2.5
next prev parent reply other threads:[~2009-11-26 14:35 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-26 14:33 [Qemu-devel] [PATCH 00/30] scsi: data structures and cleanups Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 01/30] scsi: add/fix header protection Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 02/30] scsi: create common SCSIRequest structure Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 03/30] scsi: move request lists to QTAILQ Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 04/30] scsi: move SCSIRequest management to common code Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 05/30] scsi: move scsi command buffer from SCSIGenericReq to SCSIRequest Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 06/30] scsi: move blocksize from SCSIGenericState to SCSIDevice Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 07/30] scsi: add scsi-defs.h Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 08/30] scsi: move type from SCSIGenericState to SCSIDevice Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 09/30] scsi: add request parsing helpers to common code Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 10/30] scsi: use command defines in scsi-disk.c Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 11/30] scsi: add xfer mode Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 12/30] scsi: move sense to SCSIDevice, create SCSISense struct Gerd Hoffmann
2009-11-26 14:33 ` [Qemu-devel] [PATCH 13/30] scsi: move dinfo to SCSIDevice Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 14/30] scsi: move status to SCSIRequest Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 15/30] scsi: add scsi_req_print() Gerd Hoffmann
2009-11-26 14:34 ` Gerd Hoffmann [this message]
2009-11-26 14:34 ` [Qemu-devel] [PATCH 17/30] scsi-disk: restruct emulation: REQUEST_SENSE Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 18/30] scsi-disk: restruct emulation: INQUIRY Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 19/30] scsi-disk: restruct emulation: RESERVE+RELEASE Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 20/30] scsi-disk: restruct emulation: MODE_SENSE Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 21/30] scsi-disk: restruct emulation: START_STOP Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 22/30] scsi-disk: restruct emulation: ALLOW_MEDIUM_REMOVAL Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 23/30] scsi-disk: restruct emulation: READ_CAPACITY Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 24/30] scsi-disk: restruct emulation: SYNCHRONIZE_CACHE Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 25/30] scsi-disk: restruct emulation: READ_TOC Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 26/30] scsi-disk: restruct emulation: GET_CONFIGURATION Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 27/30] scsi-disk: restruct emulation: SERVICE_ACTION_IN Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 28/30] scsi-disk: restruct emulation: REPORT_LUNS Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 29/30] scsi-disk: restruct emulation: VERIFY Gerd Hoffmann
2009-11-26 14:34 ` [Qemu-devel] [PATCH 30/30] scsi: add read/write 16 commands Gerd Hoffmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1259246056-5389-17-git-send-email-kraxel@redhat.com \
--to=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).