This patch implements the function scsi_configure_device(). This function
elevates an sdev into SDEV_RUNNING and configures it properly so that
I/O is possible on the device.

Signed-off-by: Hannes Reinecke <[EMAIL PROTECTED]>
---
 drivers/scsi/scsi_scan.c |   62 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 44 insertions(+), 18 deletions(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index e967705..82fad00 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -692,6 +692,37 @@ static int scsi_probe_lun(struct scsi_de
 }
 
 /**
+ * scsi_configure_device - configure a scsi_device
+ * @sdev:      The scsi_device to configure
+ *
+ * Description:
+ *    Configure an existing scsi_device. This function
+ *    elevates a scsi_device from state SDEV_CREATED or
+ *    SDEV_DEL into SDEV_RUNNING.
+ *
+ * Return:
+ *    0  On Success
+ *    <0 On failure.
+ *
+ **/
+int scsi_configure_device(struct scsi_device *sdev)
+{
+       int ret = 0;
+
+       /* set the device running here so that slave configure
+        * may do I/O */
+       if (scsi_device_set_state(sdev, SDEV_RUNNING) != 0)
+               return -ENXIO;
+
+       transport_configure_device(&sdev->sdev_gendev);
+
+       if (sdev->host->hostt->slave_configure)
+               ret = sdev->host->hostt->slave_configure(sdev);
+
+       return ret;
+}
+
+/**
  * scsi_add_lun - allocate and fully initialze a scsi_device
  * @sdevscan:  holds information to be stored in the new scsi_device
  * @sdevnew:   store the address of the newly allocated scsi_device
@@ -711,6 +742,8 @@ static int scsi_probe_lun(struct scsi_de
 static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
                int *bflags, int async)
 {
+       int ret;
+
        /*
         * XXX do not save the inquiry, since it can change underneath us,
         * save just vendor/model/rev.
@@ -874,10 +907,6 @@ static int scsi_add_lun(struct scsi_devi
        if (*bflags & BLIST_USE_10_BYTE_MS)
                sdev->use_10_for_ms = 1;
 
-       /* set the device running here so that slave configure
-        * may do I/O */
-       scsi_device_set_state(sdev, SDEV_RUNNING);
-
        if (*bflags & BLIST_MS_192_BYTES_FOR_3F)
                sdev->use_192_bytes_for_3f = 1;
 
@@ -887,21 +916,18 @@ static int scsi_add_lun(struct scsi_devi
        if (*bflags & BLIST_RETRY_HWERROR)
                sdev->retry_hwerror = 1;
 
-       transport_configure_device(&sdev->sdev_gendev);
-
-       if (sdev->host->hostt->slave_configure) {
-               int ret = sdev->host->hostt->slave_configure(sdev);
-               if (ret) {
-                       /*
-                        * if LLDD reports slave not present, don't clutter
-                        * console with alloc failure messages
-                        */
-                       if (ret != -ENXIO) {
-                               sdev_printk(KERN_ERR, sdev,
-                                       "failed to configure device\n");
-                       }
-                       return SCSI_SCAN_NO_RESPONSE;
+       ret = scsi_configure_device(sdev);
+       if (ret) {
+               /*
+                * if LLDD reports slave not present, don't clutter
+                * console with alloc failure messages
+                */
+               if (ret != -ENXIO) {
+                       sdev_printk(KERN_ERR, sdev,
+                                   "failed to configure device\n");
                }
+               scsi_destroy_device(sdev);
+               return SCSI_SCAN_NO_RESPONSE;
        }
 
        /*
-- 
1.4.3.4

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to