diff options
Diffstat (limited to 'drivers/s390/scsi/zfcp_erp.c')
| -rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 73d366ba31e5..f73e2180f333 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
| @@ -858,10 +858,7 @@ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act) | |||
| 858 | if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP) | 858 | if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP) |
| 859 | return zfcp_erp_open_ptp_port(act); | 859 | return zfcp_erp_open_ptp_port(act); |
| 860 | if (!port->d_id) { | 860 | if (!port->d_id) { |
| 861 | zfcp_port_get(port); | 861 | zfcp_fc_trigger_did_lookup(port); |
| 862 | if (!queue_work(adapter->work_queue, | ||
| 863 | &port->gid_pn_work)) | ||
| 864 | zfcp_port_put(port); | ||
| 865 | return ZFCP_ERP_EXIT; | 862 | return ZFCP_ERP_EXIT; |
| 866 | } | 863 | } |
| 867 | return zfcp_erp_port_strategy_open_port(act); | 864 | return zfcp_erp_port_strategy_open_port(act); |
| @@ -869,12 +866,11 @@ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act) | |||
| 869 | case ZFCP_ERP_STEP_PORT_OPENING: | 866 | case ZFCP_ERP_STEP_PORT_OPENING: |
| 870 | /* D_ID might have changed during open */ | 867 | /* D_ID might have changed during open */ |
| 871 | if (p_status & ZFCP_STATUS_COMMON_OPEN) { | 868 | if (p_status & ZFCP_STATUS_COMMON_OPEN) { |
| 872 | if (port->d_id) | 869 | if (!port->d_id) { |
| 873 | return ZFCP_ERP_SUCCEEDED; | 870 | zfcp_fc_trigger_did_lookup(port); |
| 874 | else { | 871 | return ZFCP_ERP_EXIT; |
| 875 | act->step = ZFCP_ERP_STEP_PORT_CLOSING; | ||
| 876 | return ZFCP_ERP_CONTINUES; | ||
| 877 | } | 872 | } |
| 873 | return ZFCP_ERP_SUCCEEDED; | ||
| 878 | } | 874 | } |
| 879 | if (port->d_id && !(p_status & ZFCP_STATUS_COMMON_NOESC)) { | 875 | if (port->d_id && !(p_status & ZFCP_STATUS_COMMON_NOESC)) { |
| 880 | port->d_id = 0; | 876 | port->d_id = 0; |
| @@ -889,19 +885,21 @@ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act) | |||
| 889 | static int zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action) | 885 | static int zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action) |
| 890 | { | 886 | { |
| 891 | struct zfcp_port *port = erp_action->port; | 887 | struct zfcp_port *port = erp_action->port; |
| 888 | int p_status = atomic_read(&port->status); | ||
| 892 | 889 | ||
| 893 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC) | 890 | if ((p_status & ZFCP_STATUS_COMMON_NOESC) && |
| 891 | !(p_status & ZFCP_STATUS_COMMON_OPEN)) | ||
| 894 | goto close_init_done; | 892 | goto close_init_done; |
| 895 | 893 | ||
| 896 | switch (erp_action->step) { | 894 | switch (erp_action->step) { |
| 897 | case ZFCP_ERP_STEP_UNINITIALIZED: | 895 | case ZFCP_ERP_STEP_UNINITIALIZED: |
| 898 | zfcp_erp_port_strategy_clearstati(port); | 896 | zfcp_erp_port_strategy_clearstati(port); |
| 899 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN) | 897 | if (p_status & ZFCP_STATUS_COMMON_OPEN) |
| 900 | return zfcp_erp_port_strategy_close(erp_action); | 898 | return zfcp_erp_port_strategy_close(erp_action); |
| 901 | break; | 899 | break; |
| 902 | 900 | ||
| 903 | case ZFCP_ERP_STEP_PORT_CLOSING: | 901 | case ZFCP_ERP_STEP_PORT_CLOSING: |
| 904 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN) | 902 | if (p_status & ZFCP_STATUS_COMMON_OPEN) |
| 905 | return ZFCP_ERP_FAILED; | 903 | return ZFCP_ERP_FAILED; |
| 906 | break; | 904 | break; |
| 907 | } | 905 | } |
