aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi/zfcp_erp.c
diff options
context:
space:
mode:
authorSwen Schillig <swen@vnet.ibm.com>2008-05-19 06:17:37 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-06-05 10:27:13 -0400
commitd26ab06ede83287f99067fee3034c5455a75faf9 (patch)
tree6070ae50cded8086ceab61092348790b39876146 /drivers/s390/scsi/zfcp_erp.c
parent15424921222f2bed0aa92ef1e8bc94f753d2c6ea (diff)
[SCSI] zfcp: receiving an unsolicted status can lead to I/O stall
Processing of an unsolicted status request can lead to a locking race of the request_queue's queue_lock during the recreation of the used up status read request while still in interrupt context of the response handler. Detaching the 'refill' of the long running status read requests from the handler to a scheduled work is solving this issue. In addition, each refill-run is trying to re-establish the full amount of status read requests, which might have failed in earlier runs. 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>
Diffstat (limited to 'drivers/s390/scsi/zfcp_erp.c')
-rw-r--r--drivers/s390/scsi/zfcp_erp.c19
1 files changed, 2 insertions, 17 deletions
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c
index 805484658dd..55a4fdc4262 100644
--- a/drivers/s390/scsi/zfcp_erp.c
+++ b/drivers/s390/scsi/zfcp_erp.c
@@ -2139,25 +2139,10 @@ static int
2139zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action 2139zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action
2140 *erp_action) 2140 *erp_action)
2141{ 2141{
2142 int retval = ZFCP_ERP_SUCCEEDED;
2143 int temp_ret;
2144 struct zfcp_adapter *adapter = erp_action->adapter; 2142 struct zfcp_adapter *adapter = erp_action->adapter;
2145 int i;
2146 2143
2147 adapter->status_read_failed = 0; 2144 atomic_set(&adapter->stat_miss, 16);
2148 for (i = 0; i < ZFCP_STATUS_READS_RECOM; i++) { 2145 return zfcp_status_read_refill(adapter);
2149 temp_ret = zfcp_fsf_status_read(adapter, ZFCP_WAIT_FOR_SBAL);
2150 if (temp_ret < 0) {
2151 ZFCP_LOG_INFO("error: set-up of unsolicited status "
2152 "notification failed on adapter %s\n",
2153 zfcp_get_busid_by_adapter(adapter));
2154 retval = ZFCP_ERP_FAILED;
2155 i--;
2156 break;
2157 }
2158 }
2159
2160 return retval;
2161} 2146}
2162 2147
2163/* 2148/*