Commit f3a9c4d7 authored by Brian King's avatar Brian King Committed by James Bottomley

[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: default avatarBrian King <brking@linux.vnet.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 1117ef8a
...@@ -548,6 +548,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, ...@@ -548,6 +548,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
u64 *crq_as_u64 = (u64 *) &evt_struct->crq; u64 *crq_as_u64 = (u64 *) &evt_struct->crq;
int request_status = 0; int request_status = 0;
int rc; int rc;
int srp_req = 0;
/* If we have exhausted our request limit, just fail this request, /* If we have exhausted our request limit, just fail this request,
* unless it is for a reset or abort. * 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,6 +557,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
* can handle more requests (can_queue) when we actually can't * can handle more requests (can_queue) when we actually can't
*/ */
if (evt_struct->crq.format == VIOSRP_SRP_FORMAT) { if (evt_struct->crq.format == VIOSRP_SRP_FORMAT) {
srp_req = 1;
request_status = request_status =
atomic_dec_if_positive(&hostdata->request_limit); atomic_dec_if_positive(&hostdata->request_limit);
/* If request limit was -1 when we started, it is now even /* If request limit was -1 when we started, it is now even
...@@ -630,6 +632,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, ...@@ -630,6 +632,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
goto send_busy; goto send_busy;
} }
dev_err(hostdata->dev, "send error %d\n", rc); dev_err(hostdata->dev, "send error %d\n", rc);
if (srp_req)
atomic_inc(&hostdata->request_limit); atomic_inc(&hostdata->request_limit);
goto send_error; goto send_error;
} }
...@@ -640,7 +643,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, ...@@ -640,7 +643,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);
free_event_struct(&hostdata->pool, evt_struct); free_event_struct(&hostdata->pool, evt_struct);
if (request_status != -1) if (srp_req && request_status != -1)
atomic_inc(&hostdata->request_limit); atomic_inc(&hostdata->request_limit);
return SCSI_MLQUEUE_HOST_BUSY; return SCSI_MLQUEUE_HOST_BUSY;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment