aboutsummaryrefslogtreecommitdiff
path: root/drivers/s390/scsi/zfcp_erp.c
diff options
context:
space:
mode:
authorAndreas Herrmann <aherrman@de.ibm.com>2006-05-22 18:25:56 +0200
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-05-28 12:50:17 -0400
commit338151e066084d92d89f44311e5521ef847a50b9 (patch)
tree5783d26710203f2c5b309530334f3dd39ca68dfc /drivers/s390/scsi/zfcp_erp.c
parent75bfc2837bbcc329193d51e8b7115184b78beae0 (diff)
[SCSI] zfcp: make use of fc_remote_port_delete when target port is unavailable
If zfcp's port erp fails we now call fc_remote_port_delete. This helps to avoid offlined scsi devices if scsi commands time out due to path failures. When an adapter erp fails we call fc_remote_port_delete for all ports on that adapter. Signed-off-by: Andreas Herrmann <aherrman@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/s390/scsi/zfcp_erp.c')
-rw-r--r--drivers/s390/scsi/zfcp_erp.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c
index 05c47f6ca92..4682c8b8bd2 100644
--- a/drivers/s390/scsi/zfcp_erp.c
+++ b/drivers/s390/scsi/zfcp_erp.c
@@ -3241,9 +3241,13 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter,
break;
case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
case ZFCP_ERP_ACTION_REOPEN_PORT:
+ if (atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN,
+ &port->status)) {
+ zfcp_port_put(port);
+ break;
+ }
+
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;
@@ -3264,9 +3268,23 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter,
port->supported_classes;
}
}
+ if ((result != ZFCP_ERP_SUCCEEDED) && port->rport) {
+ fc_remote_port_delete(port->rport);
+ port->rport = NULL;
+ }
zfcp_port_put(port);
break;
case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
+ if (result != ZFCP_ERP_SUCCEEDED) {
+ struct zfcp_port *port;
+ list_for_each_entry(port, &adapter->port_list_head, list)
+ if (port->rport &&
+ !atomic_test_mask(ZFCP_STATUS_PORT_WKA,
+ &port->status)) {
+ fc_remote_port_delete(port->rport);
+ port->rport = NULL;
+ }
+ }
zfcp_adapter_put(adapter);
break;
default: