aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ibmvscsi/rpa_vscsi.c
diff options
context:
space:
mode:
authorDave C Boutcher <boutcher@cs.umn.edu>2006-06-12 22:22:51 -0400
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-06-26 10:15:41 -0400
commitcefbda2d6cd9bf78a93768130729a6d142588d67 (patch)
tree73c2b6e956d4959c292e550ae230534a2214d23c /drivers/scsi/ibmvscsi/rpa_vscsi.c
parentc65b1445d153a66ca91b00c1f10187e495c17918 (diff)
[SCSI] ibmvscsi: treat busy and error conditions separately
This patch fixes a condition where ibmvscsi treats a transport error as a "busy" condition, so no errors were returned to the scsi mid-layer. In a RAID environment this means that I/O hung rather than failing over. Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/ibmvscsi/rpa_vscsi.c')
-rw-r--r--drivers/scsi/ibmvscsi/rpa_vscsi.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/scsi/ibmvscsi/rpa_vscsi.c b/drivers/scsi/ibmvscsi/rpa_vscsi.c
index 1a9992bdfef8..242b8873b333 100644
--- a/drivers/scsi/ibmvscsi/rpa_vscsi.c
+++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c
@@ -208,6 +208,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
208 int max_requests) 208 int max_requests)
209{ 209{
210 int rc; 210 int rc;
211 int retrc;
211 struct vio_dev *vdev = to_vio_dev(hostdata->dev); 212 struct vio_dev *vdev = to_vio_dev(hostdata->dev);
212 213
213 queue->msgs = (struct viosrp_crq *)get_zeroed_page(GFP_KERNEL); 214 queue->msgs = (struct viosrp_crq *)get_zeroed_page(GFP_KERNEL);
@@ -226,7 +227,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
226 gather_partition_info(); 227 gather_partition_info();
227 set_adapter_info(hostdata); 228 set_adapter_info(hostdata);
228 229
229 rc = plpar_hcall_norets(H_REG_CRQ, 230 retrc = rc = plpar_hcall_norets(H_REG_CRQ,
230 vdev->unit_address, 231 vdev->unit_address,
231 queue->msg_token, PAGE_SIZE); 232 queue->msg_token, PAGE_SIZE);
232 if (rc == H_RESOURCE) 233 if (rc == H_RESOURCE)
@@ -263,7 +264,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
263 tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task, 264 tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task,
264 (unsigned long)hostdata); 265 (unsigned long)hostdata);
265 266
266 return 0; 267 return retrc;
267 268
268 req_irq_failed: 269 req_irq_failed:
269 do { 270 do {