Patchwork [12/15] scsi: move sense to SCSIDevice, create SCSISense struct.

login
register
mail settings
Submitter Gerd Hoffmann
Date Nov. 17, 2009, 10:17 a.m.
Message ID <1258453071-3496-13-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/38613/
State New
Headers show

Comments

Gerd Hoffmann - Nov. 17, 2009, 10:17 a.m.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/scsi-bus.c  |   10 ++++++++++
 hw/scsi-disk.c |    8 ++++----
 hw/scsi.h      |    8 ++++++++
 3 files changed, 22 insertions(+), 4 deletions(-)
Christoph Hellwig - Nov. 17, 2009, 11:54 a.m.
Looks good.  Long term we might want to make this a pointer to be able
to deal with block format sense descriptors more nicely.
Gerd Hoffmann - Nov. 17, 2009, 12:54 p.m.
On 11/17/09 12:54, Christoph Hellwig wrote:
> Looks good.  Long term we might want to make this a pointer to be able
> to deal with block format sense descriptors more nicely.

Did already happen ;)

I just can't move up that patch easily without causing massive churn in 
the patch series ...

cheers,
   Gerd

Patch

diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 77409de..493e220 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -113,6 +113,16 @@  void scsi_bus_legacy_handle_cmdline(SCSIBus *bus)
     }
 }
 
+void scsi_dev_clear_sense(SCSIDevice *dev)
+{
+    memset(&dev->sense, 0, sizeof(dev->sense));
+}
+
+void scsi_dev_set_sense(SCSIDevice *dev, uint8_t key)
+{
+    dev->sense.key = key;
+}
+
 void scsi_req_init(SCSIRequest *req, SCSIDevice *d, uint32_t tag, uint32_t lun)
 {
     req->bus = scsi_bus_from_device(d);
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 2068187..c0c407b 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -59,7 +59,6 @@  struct SCSIDiskState
        This is the number of 512 byte blocks in a single scsi sector.  */
     int cluster_size;
     uint64_t max_lba;
-    int sense;
     char drive_serial_str[21];
     QEMUBH *bh;
 };
@@ -112,7 +111,7 @@  static void scsi_command_complete(SCSIDiskReq *r, int status, int sense)
     uint32_t tag;
     DPRINTF("Command complete tag=0x%x status=%d sense=%d\n",
             r->req.tag, status, sense);
-    s->sense = sense;
+    scsi_dev_set_sense(&s->qdev, sense);
     tag = r->req.tag;
     scsi_remove_request(r);
     r->req.bus->complete(r->req.bus, SCSI_REASON_DONE, tag, status);
@@ -413,7 +412,7 @@  static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
             goto fail;
         memset(outbuf, 0, 4);
         r->iov.iov_len = 4;
-        if (s->sense == NOT_READY && len >= 18) {
+        if (s->qdev.sense.key == NOT_READY && len >= 18) {
             memset(outbuf, 0, 18);
             r->iov.iov_len = 18;
             outbuf[7] = 10;
@@ -423,7 +422,8 @@  static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
         }
         outbuf[0] = 0xf0;
         outbuf[1] = 0;
-        outbuf[2] = s->sense;
+        outbuf[2] = s->qdev.sense.key;
+        scsi_dev_clear_sense(&s->qdev);
         break;
     case INQUIRY:
         DPRINTF("Inquiry (len %d)\n", len);
diff --git a/hw/scsi.h b/hw/scsi.h
index f2d033f..bdba1db 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -24,6 +24,10 @@  enum SCSIXferMode {
     SCSI_XFER_TO_DEV,    /*  WRITE, MODE_SELECT, ...         */
 };
 
+typedef struct SCSISense {
+    uint8_t key;
+} SCSISense;
+
 typedef struct SCSIRequest {
     SCSIBus           *bus;
     SCSIDevice        *dev;
@@ -48,6 +52,7 @@  struct SCSIDevice
     QTAILQ_HEAD(, SCSIRequest) requests;
     int blocksize;
     int type;
+    struct SCSISense sense;
 };
 
 /* cdrom.c */
@@ -92,6 +97,9 @@  static inline SCSIBus *scsi_bus_from_device(SCSIDevice *d)
 SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, DriveInfo *dinfo, int unit);
 void scsi_bus_legacy_handle_cmdline(SCSIBus *bus);
 
+void scsi_dev_clear_sense(SCSIDevice *dev);
+void scsi_dev_set_sense(SCSIDevice *dev, uint8_t key);
+
 void scsi_req_init(SCSIRequest *req, SCSIDevice *d, uint32_t tag, uint32_t lun);
 int scsi_req_parse(SCSIRequest *req, uint8_t *buf);