diff options
author | Brian King <brking@linux.vnet.ibm.com> | 2010-06-17 14:56:03 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-07-27 13:03:47 -0400 |
commit | f3a9c4d76a955e331e88992cd3b1e1498c231d52 (patch) | |
tree | 36b62ed69d733199b2a9aa5e864a58ada7a37aff /drivers/scsi/ibmvscsi | |
parent | 1117ef8aed95521f46dae3052c7120baae48c2bb (diff) |
[SCSI] ibmvscsi: Fix possible request_limit issue
If we encounter an error when sending a management datagram (i.e. non
SCSI command, such as virtual adapter initialization command), we
end up incrementing the request_limit, even though we don't decrement
it for these commands. Fix this up by doing this increment in
the error path for SRP commands only.
Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/ibmvscsi')
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvscsi.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 83b5a174164c..4f906efb1519 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
@@ -548,6 +548,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, | |||
548 | u64 *crq_as_u64 = (u64 *) &evt_struct->crq; | 548 | u64 *crq_as_u64 = (u64 *) &evt_struct->crq; |
549 | int request_status = 0; | 549 | int request_status = 0; |
550 | int rc; | 550 | int rc; |
551 | int srp_req = 0; | ||
551 | 552 | ||
552 | /* If we have exhausted our request limit, just fail this request, | 553 | /* If we have exhausted our request limit, just fail this request, |
553 | * unless it is for a reset or abort. | 554 | * unless it is for a reset or abort. |
@@ -556,6 +557,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, | |||
556 | * can handle more requests (can_queue) when we actually can't | 557 | * can handle more requests (can_queue) when we actually can't |
557 | */ | 558 | */ |
558 | if (evt_struct->crq.format == VIOSRP_SRP_FORMAT) { | 559 | if (evt_struct->crq.format == VIOSRP_SRP_FORMAT) { |
560 | srp_req = 1; | ||
559 | request_status = | 561 | request_status = |
560 | atomic_dec_if_positive(&hostdata->request_limit); | 562 | atomic_dec_if_positive(&hostdata->request_limit); |
561 | /* If request limit was -1 when we started, it is now even | 563 | /* If request limit was -1 when we started, it is now even |
@@ -630,7 +632,8 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, | |||
630 | goto send_busy; | 632 | goto send_busy; |
631 | } | 633 | } |
632 | dev_err(hostdata->dev, "send error %d\n", rc); | 634 | dev_err(hostdata->dev, "send error %d\n", rc); |
633 | atomic_inc(&hostdata->request_limit); | 635 | if (srp_req) |
636 | atomic_inc(&hostdata->request_limit); | ||
634 | goto send_error; | 637 | goto send_error; |
635 | } | 638 | } |
636 | 639 | ||
@@ -640,7 +643,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, | |||
640 | unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); | 643 | unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); |
641 | 644 | ||
642 | free_event_struct(&hostdata->pool, evt_struct); | 645 | free_event_struct(&hostdata->pool, evt_struct); |
643 | if (request_status != -1) | 646 | if (srp_req && request_status != -1) |
644 | atomic_inc(&hostdata->request_limit); | 647 | atomic_inc(&hostdata->request_limit); |
645 | return SCSI_MLQUEUE_HOST_BUSY; | 648 | return SCSI_MLQUEUE_HOST_BUSY; |
646 | 649 | ||