diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 14 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 2 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 4 |
3 files changed, 20 insertions, 0 deletions
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index c0b2348d7ce6..e8fc28dba8df 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
| @@ -624,6 +624,20 @@ static void zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action) | |||
| 624 | add_timer(&erp_action->timer); | 624 | add_timer(&erp_action->timer); |
| 625 | } | 625 | } |
| 626 | 626 | ||
| 627 | void zfcp_erp_port_forced_reopen_all(struct zfcp_adapter *adapter, | ||
| 628 | int clear, char *dbftag) | ||
| 629 | { | ||
| 630 | unsigned long flags; | ||
| 631 | struct zfcp_port *port; | ||
| 632 | |||
| 633 | write_lock_irqsave(&adapter->erp_lock, flags); | ||
| 634 | read_lock(&adapter->port_list_lock); | ||
| 635 | list_for_each_entry(port, &adapter->port_list, list) | ||
| 636 | _zfcp_erp_port_forced_reopen(port, clear, dbftag); | ||
| 637 | read_unlock(&adapter->port_list_lock); | ||
| 638 | write_unlock_irqrestore(&adapter->erp_lock, flags); | ||
| 639 | } | ||
| 640 | |||
| 627 | static void _zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, | 641 | static void _zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, |
| 628 | int clear, char *dbftag) | 642 | int clear, char *dbftag) |
| 629 | { | 643 | { |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 3fce47b0b21b..c6acca521ffe 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
| @@ -70,6 +70,8 @@ extern void zfcp_erp_port_reopen(struct zfcp_port *port, int clear, | |||
| 70 | char *dbftag); | 70 | char *dbftag); |
| 71 | extern void zfcp_erp_port_shutdown(struct zfcp_port *, int, char *); | 71 | extern void zfcp_erp_port_shutdown(struct zfcp_port *, int, char *); |
| 72 | extern void zfcp_erp_port_forced_reopen(struct zfcp_port *, int, char *); | 72 | extern void zfcp_erp_port_forced_reopen(struct zfcp_port *, int, char *); |
| 73 | extern void zfcp_erp_port_forced_reopen_all(struct zfcp_adapter *adapter, | ||
| 74 | int clear, char *dbftag); | ||
| 73 | extern void zfcp_erp_set_lun_status(struct scsi_device *, u32); | 75 | extern void zfcp_erp_set_lun_status(struct scsi_device *, u32); |
| 74 | extern void zfcp_erp_clear_lun_status(struct scsi_device *, u32); | 76 | extern void zfcp_erp_clear_lun_status(struct scsi_device *, u32); |
| 75 | extern void zfcp_erp_lun_reopen(struct scsi_device *, int, char *); | 77 | extern void zfcp_erp_lun_reopen(struct scsi_device *, int, char *); |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index f4f6a07c5222..221d0dfb8493 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
| @@ -368,6 +368,10 @@ static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt) | |||
| 368 | struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; | 368 | struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; |
| 369 | int ret = SUCCESS, fc_ret; | 369 | int ret = SUCCESS, fc_ret; |
| 370 | 370 | ||
| 371 | if (!(adapter->connection_features & FSF_FEATURE_NPIV_MODE)) { | ||
| 372 | zfcp_erp_port_forced_reopen_all(adapter, 0, "schrh_p"); | ||
| 373 | zfcp_erp_wait(adapter); | ||
| 374 | } | ||
| 371 | zfcp_erp_adapter_reopen(adapter, 0, "schrh_1"); | 375 | zfcp_erp_adapter_reopen(adapter, 0, "schrh_1"); |
| 372 | zfcp_erp_wait(adapter); | 376 | zfcp_erp_wait(adapter); |
| 373 | fc_ret = fc_block_scsi_eh(scpnt); | 377 | fc_ret = fc_block_scsi_eh(scpnt); |
