Skip to content

Commit 338151e

Browse files
Andreas HerrmannJames Bottomley
Andreas Herrmann
authored and
James Bottomley
committed
[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>
1 parent 75bfc28 commit 338151e

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

drivers/s390/scsi/zfcp_erp.c

+20-2
Original file line numberDiff line numberDiff line change
@@ -3241,9 +3241,13 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter,
32413241
break;
32423242
case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
32433243
case ZFCP_ERP_ACTION_REOPEN_PORT:
3244+
if (atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN,
3245+
&port->status)) {
3246+
zfcp_port_put(port);
3247+
break;
3248+
}
3249+
32443250
if ((result == ZFCP_ERP_SUCCEEDED)
3245-
&& !atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN,
3246-
&port->status)
32473251
&& !port->rport) {
32483252
struct fc_rport_identifiers ids;
32493253
ids.node_name = port->wwnn;
@@ -3264,9 +3268,23 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter,
32643268
port->supported_classes;
32653269
}
32663270
}
3271+
if ((result != ZFCP_ERP_SUCCEEDED) && port->rport) {
3272+
fc_remote_port_delete(port->rport);
3273+
port->rport = NULL;
3274+
}
32673275
zfcp_port_put(port);
32683276
break;
32693277
case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
3278+
if (result != ZFCP_ERP_SUCCEEDED) {
3279+
struct zfcp_port *port;
3280+
list_for_each_entry(port, &adapter->port_list_head, list)
3281+
if (port->rport &&
3282+
!atomic_test_mask(ZFCP_STATUS_PORT_WKA,
3283+
&port->status)) {
3284+
fc_remote_port_delete(port->rport);
3285+
port->rport = NULL;
3286+
}
3287+
}
32703288
zfcp_adapter_put(adapter);
32713289
break;
32723290
default:

drivers/s390/scsi/zfcp_ext.h

-2
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,6 @@ extern int zfcp_scsi_command_async(struct zfcp_adapter *,struct zfcp_unit *,
132132
struct scsi_cmnd *, struct timer_list *);
133133
extern int zfcp_scsi_command_sync(struct zfcp_unit *, struct scsi_cmnd *,
134134
struct timer_list *);
135-
extern void zfcp_set_fc_host_attrs(struct zfcp_adapter *);
136-
extern void zfcp_set_fc_rport_attrs(struct zfcp_port *);
137135
extern struct scsi_transport_template *zfcp_transport_template;
138136
extern struct fc_function_template zfcp_transport_functions;
139137

drivers/s390/scsi/zfcp_scsi.c

+7
Original file line numberDiff line numberDiff line change
@@ -800,12 +800,18 @@ zfcp_reset_fc_host_stats(struct Scsi_Host *shost)
800800
}
801801
}
802802

803+
static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
804+
{
805+
rport->dev_loss_tmo = timeout;
806+
}
807+
803808
struct fc_function_template zfcp_transport_functions = {
804809
.show_starget_port_id = 1,
805810
.show_starget_port_name = 1,
806811
.show_starget_node_name = 1,
807812
.show_rport_supported_classes = 1,
808813
.show_rport_maxframe_size = 1,
814+
.show_rport_dev_loss_tmo = 1,
809815
.show_host_node_name = 1,
810816
.show_host_port_name = 1,
811817
.show_host_permanent_port_name = 1,
@@ -815,6 +821,7 @@ struct fc_function_template zfcp_transport_functions = {
815821
.show_host_serial_number = 1,
816822
.get_fc_host_stats = zfcp_get_fc_host_stats,
817823
.reset_fc_host_stats = zfcp_reset_fc_host_stats,
824+
.set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo,
818825
/* no functions registered for following dynamic attributes but
819826
directly set by LLDD */
820827
.show_host_port_type = 1,

0 commit comments

Comments
 (0)