Patchwork [RFC,v2,05/13] scsi: let the bus pick a LUN for the child device

login
register
mail settings
Submitter Paolo Bonzini
Date June 6, 2011, 4:04 p.m.
Message ID <1307376262-1255-6-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/98956/
State New
Headers show

Comments

Paolo Bonzini - June 6, 2011, 4:04 p.m.
The scsi-id may be a LUN value or a target id.  The bus knows,
so add a callback to that end.  The default value in case there is
no implementation is to always returns zero.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 hw/scsi-bus.c  |    3 +++
 hw/scsi-disk.c |    6 +++---
 hw/scsi.h      |    2 ++
 3 files changed, 8 insertions(+), 3 deletions(-)

Patch

diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index b44f308..b64ed68 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -54,6 +54,9 @@  static int scsi_qdev_init(DeviceState *qdev, DeviceInfo *base)
     }
     bus->devs[dev->id] = dev;
 
+    if (bus->ops->get_child_lun) {
+        dev->lun = bus->ops->get_child_lun(dev);
+    }
     dev->info = info;
     QTAILQ_INIT(&dev->requests);
     rc = dev->info->init(dev);
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 87e5ac8..b2c8d6e 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -518,7 +518,7 @@  static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
 
     memset(outbuf, 0, buflen);
 
-    if (req->lun) {
+    if (req->lun != s->qdev.lun) {
         outbuf[0] = 0x7f;	/* LUN not supported */
         return buflen;
     }
@@ -1024,8 +1024,8 @@  static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
     }
 #endif
 
-    if (req->lun) {
-        /* Only LUN 0 supported.  */
+    if (req->lun != s->qdev.lun) {
+        /* Only one LUN supported.  */
         DPRINTF("Unimplemented LUN %d\n", req->lun);
         if (command != REQUEST_SENSE && command != INQUIRY) {
             scsi_command_complete(r, CHECK_CONDITION,
diff --git a/hw/scsi.h b/hw/scsi.h
index 8d5737b..67d18cc 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -57,6 +57,7 @@  struct SCSIDevice
 {
     DeviceState qdev;
     uint32_t id;
+    uint32_t lun;
     BlockConf conf;
     SCSIDeviceInfo *info;
     SCSIBus *children;
@@ -90,6 +91,7 @@  struct SCSIBusOps {
     void (*transfer_data)(SCSIRequest *req, uint32_t arg);
     void (*complete)(SCSIRequest *req, uint32_t arg);
     void (*cancel)(SCSIRequest *req);
+    int (*get_child_lun)(SCSIDevice *dev);
 };
 
 struct SCSIBus {