]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/s390/scsi/zfcp_scsi.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / s390 / scsi / zfcp_scsi.c
index 63529ed801eb3e4a37c768f1b55851863b60e9cb..ddb5800823a92895e63b4a6a4ee7942a5239317e 100644 (file)
@@ -30,6 +30,10 @@ module_param_named(dif, enable_dif, bool, 0600);
 MODULE_PARM_DESC(dif, "Enable DIF/DIX data integrity support");
 #endif
 
+static bool allow_lun_scan = 1;
+module_param(allow_lun_scan, bool, 0600);
+MODULE_PARM_DESC(allow_lun_scan, "For NPIV, scan and attach all storage LUNs");
+
 static int zfcp_scsi_change_queue_depth(struct scsi_device *sdev, int depth,
                                        int reason)
 {
@@ -68,11 +72,8 @@ static int zfcp_scsi_slave_configure(struct scsi_device *sdp)
 
 static void zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result)
 {
-       struct zfcp_adapter *adapter =
-               (struct zfcp_adapter *) scpnt->device->host->hostdata[0];
-
        set_host_byte(scpnt, result);
-       zfcp_dbf_scsi_fail_send(adapter->dbf, scpnt);
+       zfcp_dbf_scsi_fail_send(scpnt);
        scpnt->scsi_done(scpnt);
 }
 
@@ -80,7 +81,6 @@ static
 int zfcp_scsi_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scpnt)
 {
        struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device);
-       struct zfcp_adapter *adapter = zfcp_sdev->port->adapter;
        struct fc_rport *rport = starget_to_rport(scsi_target(scpnt->device));
        int    status, scsi_result, ret;
 
@@ -91,7 +91,7 @@ int zfcp_scsi_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scpnt)
        scsi_result = fc_remote_port_chkready(rport);
        if (unlikely(scsi_result)) {
                scpnt->result = scsi_result;
-               zfcp_dbf_scsi_fail_send(adapter->dbf, scpnt);
+               zfcp_dbf_scsi_fail_send(scpnt);
                scpnt->scsi_done(scpnt);
                return 0;
        }
@@ -134,6 +134,7 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdev)
        struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
        struct zfcp_port *port;
        struct zfcp_unit *unit;
+       int npiv = adapter->connection_features & FSF_FEATURE_NPIV_MODE;
 
        port = zfcp_get_port_by_wwpn(adapter, rport->port_name);
        if (!port)
@@ -143,7 +144,7 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdev)
        if (unit)
                put_device(&unit->dev);
 
-       if (!unit && !(adapter->connection_features & FSF_FEATURE_NPIV_MODE)) {
+       if (!unit && !(allow_lun_scan && npiv)) {
                put_device(&port->dev);
                return -ENXIO;
        }
@@ -158,7 +159,7 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdev)
        spin_lock_init(&zfcp_sdev->latencies.lock);
 
        zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_RUNNING);
-       zfcp_erp_lun_reopen(sdev, 0, "scsla_1", NULL);
+       zfcp_erp_lun_reopen(sdev, 0, "scsla_1");
        zfcp_erp_wait(port->adapter);
 
        return 0;
@@ -182,8 +183,7 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
        old_req = zfcp_reqlist_find(adapter->req_list, old_reqid);
        if (!old_req) {
                write_unlock_irqrestore(&adapter->abort_lock, flags);
-               zfcp_dbf_scsi_abort("lte1", adapter->dbf, scpnt, NULL,
-                                   old_reqid);
+               zfcp_dbf_scsi_abort("abrt_or", scpnt, NULL);
                return FAILED; /* completion could be in progress */
        }
        old_req->data = NULL;
@@ -198,29 +198,32 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
 
                zfcp_erp_wait(adapter);
                ret = fc_block_scsi_eh(scpnt);
-               if (ret)
+               if (ret) {
+                       zfcp_dbf_scsi_abort("abrt_bl", scpnt, NULL);
                        return ret;
+               }
                if (!(atomic_read(&adapter->status) &
                      ZFCP_STATUS_COMMON_RUNNING)) {
-                       zfcp_dbf_scsi_abort("nres", adapter->dbf, scpnt, NULL,
-                                           old_reqid);
+                       zfcp_dbf_scsi_abort("abrt_ru", scpnt, NULL);
                        return SUCCESS;
                }
        }
-       if (!abrt_req)
+       if (!abrt_req) {
+               zfcp_dbf_scsi_abort("abrt_ar", scpnt, NULL);
                return FAILED;
+       }
 
        wait_for_completion(&abrt_req->completion);
 
        if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED)
-               dbf_tag = "okay";
+               dbf_tag = "abrt_ok";
        else if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED)
-               dbf_tag = "lte2";
+               dbf_tag = "abrt_nn";
        else {
-               dbf_tag = "fail";
+               dbf_tag = "abrt_fa";
                retval = FAILED;
        }
-       zfcp_dbf_scsi_abort(dbf_tag, adapter->dbf, scpnt, abrt_req, old_reqid);
+       zfcp_dbf_scsi_abort(dbf_tag, scpnt, abrt_req);
        zfcp_fsf_req_free(abrt_req);
        return retval;
 }
@@ -280,7 +283,7 @@ static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt)
        struct zfcp_adapter *adapter = zfcp_sdev->port->adapter;
        int ret;
 
-       zfcp_erp_adapter_reopen(adapter, 0, "schrh_1", scpnt);
+       zfcp_erp_adapter_reopen(adapter, 0, "schrh_1");
        zfcp_erp_wait(adapter);
        ret = fc_block_scsi_eh(scpnt);
        if (ret)
@@ -518,7 +521,7 @@ static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport)
        port = zfcp_get_port_by_wwpn(adapter, rport->port_name);
 
        if (port) {
-               zfcp_erp_port_forced_reopen(port, 0, "sctrpi1", NULL);
+               zfcp_erp_port_forced_reopen(port, 0, "sctrpi1");
                put_device(&port->dev);
        }
 }