diff options
author | Swen Schillig <swen@vnet.ibm.com> | 2008-07-02 04:56:33 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-07-12 09:22:34 -0400 |
commit | 7afe29f7dd6dccbe454d7fd6cd6a5a7f7bcbc530 (patch) | |
tree | daf51c1875d1080d1dedc9094159ad44cc557a10 | |
parent | 3968ce800f45d8795ceb6f186c1efe420c98e1b0 (diff) |
[SCSI] zfcp: Adapter reopen for large number of unsolicited status
When zfcp receives 16 unsolicited status messages, this could trigger
an adapter reopen. In this case, first try to send a new status read,
and only if this fails, go through the recovery.
Signed-off-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 15 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 3 |
2 files changed, 8 insertions, 10 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 2bd80fdcceff..bfcd1ba28ae1 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -550,15 +550,14 @@ static void zfcp_dummy_release(struct device *dev) | |||
550 | int zfcp_status_read_refill(struct zfcp_adapter *adapter) | 550 | int zfcp_status_read_refill(struct zfcp_adapter *adapter) |
551 | { | 551 | { |
552 | while (atomic_read(&adapter->stat_miss) > 0) | 552 | while (atomic_read(&adapter->stat_miss) > 0) |
553 | if (zfcp_fsf_status_read(adapter, ZFCP_WAIT_FOR_SBAL)) | 553 | if (zfcp_fsf_status_read(adapter, ZFCP_WAIT_FOR_SBAL)) { |
554 | if (atomic_read(&adapter->stat_miss) >= 16) { | ||
555 | zfcp_erp_adapter_reopen(adapter, 0, 103, NULL); | ||
556 | return 1; | ||
557 | } | ||
554 | break; | 558 | break; |
555 | else | 559 | } else |
556 | atomic_dec(&adapter->stat_miss); | 560 | atomic_dec(&adapter->stat_miss); |
557 | |||
558 | if (ZFCP_STATUS_READS_RECOM <= atomic_read(&adapter->stat_miss)) { | ||
559 | zfcp_erp_adapter_reopen(adapter, 0, 103, NULL); | ||
560 | return 1; | ||
561 | } | ||
562 | return 0; | 561 | return 0; |
563 | } | 562 | } |
564 | 563 | ||
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 1e837d46ea74..202f7e66c446 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -108,7 +108,6 @@ zfcp_address_to_sg(void *address, struct scatterlist *list, unsigned int size) | |||
108 | #define ZFCP_QTCB_VERSION FSF_QTCB_CURRENT_VERSION | 108 | #define ZFCP_QTCB_VERSION FSF_QTCB_CURRENT_VERSION |
109 | /* ATTENTION: value must not be used by hardware */ | 109 | /* ATTENTION: value must not be used by hardware */ |
110 | #define FSF_QTCB_UNSOLICITED_STATUS 0x6305 | 110 | #define FSF_QTCB_UNSOLICITED_STATUS 0x6305 |
111 | #define ZFCP_STATUS_READS_RECOM FSF_STATUS_READS_RECOM | ||
112 | 111 | ||
113 | /* Do 1st retry in 1 second, then double the timeout for each following retry */ | 112 | /* Do 1st retry in 1 second, then double the timeout for each following retry */ |
114 | #define ZFCP_EXCHANGE_CONFIG_DATA_FIRST_SLEEP 1 | 113 | #define ZFCP_EXCHANGE_CONFIG_DATA_FIRST_SLEEP 1 |
@@ -743,7 +742,7 @@ struct zfcp_data { | |||
743 | #define ZFCP_POOL_FSF_REQ_ERP_NR 1 | 742 | #define ZFCP_POOL_FSF_REQ_ERP_NR 1 |
744 | #define ZFCP_POOL_FSF_REQ_SCSI_NR 1 | 743 | #define ZFCP_POOL_FSF_REQ_SCSI_NR 1 |
745 | #define ZFCP_POOL_FSF_REQ_ABORT_NR 1 | 744 | #define ZFCP_POOL_FSF_REQ_ABORT_NR 1 |
746 | #define ZFCP_POOL_STATUS_READ_NR ZFCP_STATUS_READS_RECOM | 745 | #define ZFCP_POOL_STATUS_READ_NR FSF_STATUS_READS_RECOM |
747 | #define ZFCP_POOL_DATA_GID_PN_NR 1 | 746 | #define ZFCP_POOL_DATA_GID_PN_NR 1 |
748 | 747 | ||
749 | /* struct used by memory pools for fsf_requests */ | 748 | /* struct used by memory pools for fsf_requests */ |