From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Hannes Reinecke <hare@suse.de>
Subject: [Qemu-devel] [PATCH v2 17/21] scsi: Implement 'get_sense' callback
Date: Mon, 16 May 2011 14:16:33 +0200 [thread overview]
Message-ID: <1305548197-16196-18-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1305548197-16196-1-git-send-email-pbonzini@redhat.com>
From: Hannes Reinecke <hare@suse.de>
The get_sense callback copies existing sense information into
the provided buffer. This is required if sense information
should be transferred together with the command response.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/scsi-bus.c | 9 +++++++++
hw/scsi-disk.c | 9 +++++++++
hw/scsi-generic.c | 18 ++++++++++++++++++
hw/scsi.h | 2 ++
hw/spapr_vscsi.c | 10 +++++++++-
5 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 417dc77..e3ab5ca 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -156,6 +156,15 @@ uint8_t *scsi_req_get_buf(SCSIRequest *req)
return req->dev->info->get_buf(req);
}
+int scsi_req_get_sense(SCSIRequest *req, uint8_t *buf, int len)
+{
+ if (req->dev->info->get_sense) {
+ return req->dev->info->get_sense(req, buf, len);
+ } else {
+ return 0;
+ }
+}
+
int32_t scsi_req_enqueue(SCSIRequest *req, uint8_t *buf)
{
assert(!req->enqueued);
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index efb953b..4241fad 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -338,6 +338,14 @@ static uint8_t *scsi_get_buf(SCSIRequest *req)
return (uint8_t *)r->iov.iov_base;
}
+/* Copy sense information into the provided buffer */
+static int scsi_get_sense(SCSIRequest *req, uint8_t *outbuf, int len)
+{
+ SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
+
+ return scsi_build_sense(s->sense, outbuf, len, len > 14);
+}
+
static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
@@ -1225,6 +1233,7 @@ static SCSIDeviceInfo scsi_disk_info = {
.write_data = scsi_write_data,
.cancel_io = scsi_cancel_io,
.get_buf = scsi_get_buf,
+ .get_sense = scsi_get_sense,
.qdev.props = (Property[]) {
DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
DEFINE_PROP_STRING("ver", SCSIDiskState, version),
diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c
index 036ab9f..a4de39d 100644
--- a/hw/scsi-generic.c
+++ b/hw/scsi-generic.c
@@ -79,6 +79,23 @@ static void scsi_clear_sense(SCSIGenericState *s)
s->driver_status = 0;
}
+static int scsi_get_sense(SCSIRequest *req, uint8_t *outbuf, int len)
+{
+ SCSIGenericState *s = DO_UPCAST(SCSIGenericState, qdev, req->dev);
+ int size = SCSI_SENSE_BUF_SIZE;
+
+ if (!(s->driver_status & SG_ERR_DRIVER_SENSE)) {
+ size = scsi_build_sense(SENSE_CODE(NO_SENSE), s->sensebuf,
+ SCSI_SENSE_BUF_SIZE, 0);
+ }
+ if (size > len) {
+ size = len;
+ }
+ memcpy(outbuf, s->sensebuf, size);
+
+ return size;
+}
+
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun)
{
SCSIRequest *req;
@@ -533,6 +550,7 @@ static SCSIDeviceInfo scsi_generic_info = {
.write_data = scsi_write_data,
.cancel_io = scsi_cancel_io,
.get_buf = scsi_get_buf,
+ .get_sense = scsi_get_sense,
.qdev.props = (Property[]) {
DEFINE_BLOCK_PROPERTIES(SCSIGenericState, qdev.conf),
DEFINE_PROP_END_OF_LIST(),
diff --git a/hw/scsi.h b/hw/scsi.h
index 3af6295..dbb69ef 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -80,6 +80,7 @@ struct SCSIDeviceInfo {
int (*write_data)(SCSIRequest *req);
void (*cancel_io)(SCSIRequest *req);
uint8_t *(*get_buf)(SCSIRequest *req);
+ int (*get_sense)(SCSIRequest *req, uint8_t *buf, int len);
};
struct SCSIBusOps {
@@ -155,6 +156,7 @@ void scsi_req_kick(SCSIRequest *req);
void scsi_req_data(SCSIRequest *req, int len);
void scsi_req_complete(SCSIRequest *req);
uint8_t *scsi_req_get_buf(SCSIRequest *req);
+int scsi_req_get_sense(SCSIRequest *req, uint8_t *buf, int len);
void scsi_req_abort(SCSIRequest *req, int status);
void scsi_req_cancel(SCSIRequest *req);
void scsi_device_purge_requests(SCSIDevice *sdev);
diff --git a/hw/spapr_vscsi.c b/hw/spapr_vscsi.c
index 46cd1d7..8a47de0 100644
--- a/hw/spapr_vscsi.c
+++ b/hw/spapr_vscsi.c
@@ -450,6 +450,15 @@ static void vscsi_send_request_sense(VSCSIState *s, vscsi_req *req)
uint8_t *cdb = req->iu.srp.cmd.cdb;
int n;
+ n = scsi_req_get_sense(req->sreq, req->sense, sizeof(req->sense));
+ if (n) {
+ req->senselen = n;
+ vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0);
+ vscsi_put_req(s, req);
+ return;
+ }
+
+ dprintf("VSCSI: Got CHECK_CONDITION, requesting sense...\n");
cdb[0] = 3;
cdb[1] = 0;
cdb[2] = 0;
@@ -522,7 +531,6 @@ static void vscsi_command_complete(SCSIRequest *sreq, int reason, uint32_t arg)
}
vscsi_send_rsp(s, req, 0, res_in, res_out);
} else if (arg == CHECK_CONDITION) {
- dprintf("VSCSI: Got CHECK_CONDITION, requesting sense...\n");
vscsi_send_request_sense(s, req);
return;
} else {
--
1.7.4.4
next prev parent reply other threads:[~2011-05-16 12:17 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-16 12:16 [Qemu-devel] [PATCH v2 00/21] SCSI subsystem improvements Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 01/21] scsi: add tracing of scsi requests Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 02/21] scsi-generic: Remove bogus double complete Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 03/21] scsi: introduce scsi_req_data Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 04/21] scsi: introduce SCSIBusOps Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 05/21] scsi: reference-count requests Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 06/21] lsi: extract lsi_find_by_tag Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 07/21] scsi: Use 'SCSIRequest' directly Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 08/21] scsi: commonize purging requests Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 09/21] scsi: introduce scsi_req_abort Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 10/21] scsi: introduce scsi_req_cancel Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 11/21] scsi: use scsi_req_complete Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 12/21] scsi: Update sense code handling Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 13/21] scsi: do not call send_command directly Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 14/21] scsi: introduce scsi_req_new Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 15/21] scsi: introduce scsi_req_kick Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 16/21] scsi: introduce scsi_req_get_buf Paolo Bonzini
2011-05-16 12:16 ` Paolo Bonzini [this message]
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 18/21] scsi-disk: add data direction checking Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 19/21] scsi: make write_data return void Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 20/21] scsi-generic: Handle queue full Paolo Bonzini
2011-05-16 12:16 ` [Qemu-devel] [PATCH v2 21/21] scsi: split command_complete callback in two Paolo Bonzini
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=1305548197-16196-18-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=hare@suse.de \
--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).