Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart
[powerpc.git] / drivers / s390 / scsi / zfcp_erp.c
index 6d73891..cb4f612 100644 (file)
@@ -3360,13 +3360,32 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter,
                if ((result == ZFCP_ERP_SUCCEEDED)
                    && (!atomic_test_mask(ZFCP_STATUS_UNIT_TEMPORARY,
                                          &unit->status))
-                   && (!unit->device))
-                       scsi_add_device(unit->port->adapter->scsi_host, 0,
-                                       unit->port->scsi_id, unit->scsi_lun);
+                   && !unit->device
+                   && port->rport)
+                       scsi_add_device(port->adapter->scsi_host, 0,
+                                       port->rport->scsi_target_id,
+                                       unit->scsi_lun);
                zfcp_unit_put(unit);
                break;
        case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
        case ZFCP_ERP_ACTION_REOPEN_PORT:
+               if ((result == ZFCP_ERP_SUCCEEDED)
+                   && !atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN,
+                                        &port->status)
+                   && !port->rport) {
+                       struct fc_rport_identifiers ids;
+                       ids.node_name = port->wwnn;
+                       ids.port_name = port->wwpn;
+                       ids.port_id = port->d_id;
+                       ids.roles = FC_RPORT_ROLE_FCP_TARGET;
+                       port->rport =
+                               fc_remote_port_add(adapter->scsi_host, 0, &ids);
+                       if (!port->rport)
+                               ZFCP_LOG_NORMAL("failed registration of rport"
+                                               "(adapter %s, wwpn=0x%016Lx)\n",
+                                               zfcp_get_busid_by_port(port),
+                                               port->wwpn);
+               }
                zfcp_port_put(port);
                break;
        case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
@@ -3481,6 +3500,45 @@ zfcp_erp_action_to_ready(struct zfcp_erp_action *erp_action)
        list_move(&erp_action->list, &erp_action->adapter->erp_ready_head);
 }
 
+/*
+ * function:   zfcp_erp_port_boxed
+ *
+ * purpose:
+ */
+void
+zfcp_erp_port_boxed(struct zfcp_port *port)
+{
+       struct zfcp_adapter *adapter = port->adapter;
+       unsigned long flags;
+
+       debug_text_event(adapter->erp_dbf, 3, "p_access_boxed");
+       debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
+       read_lock_irqsave(&zfcp_data.config_lock, flags);
+       zfcp_erp_modify_port_status(port,
+                       ZFCP_STATUS_COMMON_ACCESS_BOXED,
+                       ZFCP_SET);
+       read_unlock_irqrestore(&zfcp_data.config_lock, flags);
+       zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED);
+}
+
+/*
+ * function:   zfcp_erp_unit_boxed
+ *
+ * purpose:
+ */
+void
+zfcp_erp_unit_boxed(struct zfcp_unit *unit)
+{
+       struct zfcp_adapter *adapter = unit->port->adapter;
+
+       debug_text_event(adapter->erp_dbf, 3, "u_access_boxed");
+       debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
+       zfcp_erp_modify_unit_status(unit,
+                       ZFCP_STATUS_COMMON_ACCESS_BOXED,
+                       ZFCP_SET);
+       zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED);
+}
+
 /*
  * function:   zfcp_erp_port_access_denied
  *
@@ -3492,11 +3550,13 @@ zfcp_erp_port_access_denied(struct zfcp_port *port)
        struct zfcp_adapter *adapter = port->adapter;
        unsigned long flags;
 
-       debug_text_event(adapter->erp_dbf, 3, "p_access_block");
+       debug_text_event(adapter->erp_dbf, 3, "p_access_denied");
        debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
        read_lock_irqsave(&zfcp_data.config_lock, flags);
-       zfcp_erp_modify_port_status(port, ZFCP_STATUS_COMMON_ERP_FAILED |
-                                   ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET);
+       zfcp_erp_modify_port_status(port,
+                       ZFCP_STATUS_COMMON_ERP_FAILED |
+                       ZFCP_STATUS_COMMON_ACCESS_DENIED,
+                       ZFCP_SET);
        read_unlock_irqrestore(&zfcp_data.config_lock, flags);
 }
 
@@ -3510,10 +3570,12 @@ zfcp_erp_unit_access_denied(struct zfcp_unit *unit)
 {
        struct zfcp_adapter *adapter = unit->port->adapter;
 
-       debug_text_event(adapter->erp_dbf, 3, "u_access_block");
+       debug_text_event(adapter->erp_dbf, 3, "u_access_denied");
        debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
-       zfcp_erp_modify_unit_status(unit, ZFCP_STATUS_COMMON_ERP_FAILED |
-                                   ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET);
+       zfcp_erp_modify_unit_status(unit,
+                       ZFCP_STATUS_COMMON_ERP_FAILED |
+                       ZFCP_STATUS_COMMON_ACCESS_DENIED,
+                       ZFCP_SET);
 }
 
 /*
@@ -3527,7 +3589,7 @@ zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter)
        struct zfcp_port *port;
        unsigned long flags;
 
-       debug_text_event(adapter->erp_dbf, 3, "a_access_unblock");
+       debug_text_event(adapter->erp_dbf, 3, "a_access_recover");
        debug_event(adapter->erp_dbf, 3, &adapter->name, 8);
 
        read_lock_irqsave(&zfcp_data.config_lock, flags);
@@ -3550,10 +3612,12 @@ zfcp_erp_port_access_changed(struct zfcp_port *port)
        struct zfcp_adapter *adapter = port->adapter;
        struct zfcp_unit *unit;
 
-       debug_text_event(adapter->erp_dbf, 3, "p_access_unblock");
+       debug_text_event(adapter->erp_dbf, 3, "p_access_recover");
        debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
 
        if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED,
+                             &port->status) &&
+           !atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_BOXED,
                              &port->status)) {
                if (!atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status))
                        list_for_each_entry(unit, &port->unit_list_head, list)
@@ -3580,10 +3644,13 @@ zfcp_erp_unit_access_changed(struct zfcp_unit *unit)
 {
        struct zfcp_adapter *adapter = unit->port->adapter;
 
-       debug_text_event(adapter->erp_dbf, 3, "u_access_unblock");
+       debug_text_event(adapter->erp_dbf, 3, "u_access_recover");
        debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
 
-       if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED, &unit->status))
+       if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED,
+                             &unit->status) &&
+           !atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_BOXED,
+                             &unit->status))
                return;
 
        ZFCP_LOG_NORMAL("reopen of unit 0x%016Lx on port 0x%016Lx "