aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi/zfcp_erp.c
diff options
context:
space:
mode:
authorSwen Schillig <swen@vnet.ibm.com>2008-05-19 12:17:37 +0200
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-06-05 09:27:13 -0500
commitd26ab06ede83287f99067fee3034c5455a75faf9 (patch)
tree6070ae50cded8086ceab61092348790b39876146 /drivers/s390/scsi/zfcp_erp.c
parent[SCSI] mpt fusion: make struct mpt_proc_root_dir static (diff)
downloadlinux-dev-d26ab06ede83287f99067fee3034c5455a75faf9.tar.xz
linux-dev-d26ab06ede83287f99067fee3034c5455a75faf9.zip
[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 805484658dd9..55a4fdc42626 100644
--- a/drivers/s390/scsi/zfcp_erp.c
+++ b/drivers/s390/scsi/zfcp_erp.c
@@ -2139,25 +2139,10 @@ static int
zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action
*erp_action)
{
- int retval = ZFCP_ERP_SUCCEEDED;
- int temp_ret;
struct zfcp_adapter *adapter = erp_action->adapter;
- int i;
- adapter->status_read_failed = 0;
- for (i = 0; i < ZFCP_STATUS_READS_RECOM; i++) {
- temp_ret = zfcp_fsf_status_read(adapter, ZFCP_WAIT_FOR_SBAL);
- if (temp_ret < 0) {
- ZFCP_LOG_INFO("error: set-up of unsolicited status "
- "notification failed on adapter %s\n",
- zfcp_get_busid_by_adapter(adapter));
- retval = ZFCP_ERP_FAILED;
- i--;
- break;
- }
- }
-
- return retval;
+ atomic_set(&adapter->stat_miss, 16);
+ return zfcp_status_read_refill(adapter);
}
/*