[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>
This commit is contained in:
parent
75bfc2837b
commit
338151e066
|
@ -3241,9 +3241,13 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter,
|
||||||
break;
|
break;
|
||||||
case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
|
case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
|
||||||
case ZFCP_ERP_ACTION_REOPEN_PORT:
|
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)
|
if ((result == ZFCP_ERP_SUCCEEDED)
|
||||||
&& !atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN,
|
|
||||||
&port->status)
|
|
||||||
&& !port->rport) {
|
&& !port->rport) {
|
||||||
struct fc_rport_identifiers ids;
|
struct fc_rport_identifiers ids;
|
||||||
ids.node_name = port->wwnn;
|
ids.node_name = port->wwnn;
|
||||||
|
@ -3264,9 +3268,23 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter,
|
||||||
port->supported_classes;
|
port->supported_classes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((result != ZFCP_ERP_SUCCEEDED) && port->rport) {
|
||||||
|
fc_remote_port_delete(port->rport);
|
||||||
|
port->rport = NULL;
|
||||||
|
}
|
||||||
zfcp_port_put(port);
|
zfcp_port_put(port);
|
||||||
break;
|
break;
|
||||||
case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
|
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);
|
zfcp_adapter_put(adapter);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -132,8 +132,6 @@ extern int zfcp_scsi_command_async(struct zfcp_adapter *,struct zfcp_unit *,
|
||||||
struct scsi_cmnd *, struct timer_list *);
|
struct scsi_cmnd *, struct timer_list *);
|
||||||
extern int zfcp_scsi_command_sync(struct zfcp_unit *, struct scsi_cmnd *,
|
extern int zfcp_scsi_command_sync(struct zfcp_unit *, struct scsi_cmnd *,
|
||||||
struct timer_list *);
|
struct timer_list *);
|
||||||
extern void zfcp_set_fc_host_attrs(struct zfcp_adapter *);
|
|
||||||
extern void zfcp_set_fc_rport_attrs(struct zfcp_port *);
|
|
||||||
extern struct scsi_transport_template *zfcp_transport_template;
|
extern struct scsi_transport_template *zfcp_transport_template;
|
||||||
extern struct fc_function_template zfcp_transport_functions;
|
extern struct fc_function_template zfcp_transport_functions;
|
||||||
|
|
||||||
|
|
|
@ -800,12 +800,18 @@ zfcp_reset_fc_host_stats(struct Scsi_Host *shost)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
|
||||||
|
{
|
||||||
|
rport->dev_loss_tmo = timeout;
|
||||||
|
}
|
||||||
|
|
||||||
struct fc_function_template zfcp_transport_functions = {
|
struct fc_function_template zfcp_transport_functions = {
|
||||||
.show_starget_port_id = 1,
|
.show_starget_port_id = 1,
|
||||||
.show_starget_port_name = 1,
|
.show_starget_port_name = 1,
|
||||||
.show_starget_node_name = 1,
|
.show_starget_node_name = 1,
|
||||||
.show_rport_supported_classes = 1,
|
.show_rport_supported_classes = 1,
|
||||||
.show_rport_maxframe_size = 1,
|
.show_rport_maxframe_size = 1,
|
||||||
|
.show_rport_dev_loss_tmo = 1,
|
||||||
.show_host_node_name = 1,
|
.show_host_node_name = 1,
|
||||||
.show_host_port_name = 1,
|
.show_host_port_name = 1,
|
||||||
.show_host_permanent_port_name = 1,
|
.show_host_permanent_port_name = 1,
|
||||||
|
@ -815,6 +821,7 @@ struct fc_function_template zfcp_transport_functions = {
|
||||||
.show_host_serial_number = 1,
|
.show_host_serial_number = 1,
|
||||||
.get_fc_host_stats = zfcp_get_fc_host_stats,
|
.get_fc_host_stats = zfcp_get_fc_host_stats,
|
||||||
.reset_fc_host_stats = zfcp_reset_fc_host_stats,
|
.reset_fc_host_stats = zfcp_reset_fc_host_stats,
|
||||||
|
.set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo,
|
||||||
/* no functions registered for following dynamic attributes but
|
/* no functions registered for following dynamic attributes but
|
||||||
directly set by LLDD */
|
directly set by LLDD */
|
||||||
.show_host_port_type = 1,
|
.show_host_port_type = 1,
|
||||||
|
|
Loading…
Reference in New Issue