Messages in this thread Patch in this message | | | Subject | Re: [PATCH] scsi_error fix | From | James Bottomley <> | Date | 07 Mar 2003 16:20:58 -0600 |
| |
On Fri, 2003-03-07 at 15:17, Mike Anderson wrote: > I believe James is still pursuing a solution also.
The attached is the fix that works for me (plus fixing a few other problems I noticed along the way).
This is against vanilla 2.5.64 (you have to take Andries work around out to see the fix in the BK version).
James
===== drivers/scsi/scsi_error.c 1.38 vs edited ===== --- 1.38/drivers/scsi/scsi_error.c Sat Feb 22 10:17:01 2003 +++ edited/drivers/scsi/scsi_error.c Fri Mar 7 15:39:51 2003 @@ -515,7 +515,7 @@ * actually did complete normally. */ if (rtn == SUCCESS) { - int rtn = scsi_eh_completed_normally(scmd); + rtn = scsi_eh_completed_normally(scmd); SCSI_LOG_ERROR_RECOVERY(3, printk("%s: scsi_eh_completed_normally %x\n", __FUNCTION__, rtn)); @@ -545,20 +545,20 @@ static int scsi_request_sense(struct scsi_cmnd *scmd) { static unsigned char generic_sense[6] = - {REQUEST_SENSE, 0, 0, 0, 255, 0}; - unsigned char scsi_result0[256], *scsi_result = &scsi_result0[0]; + {REQUEST_SENSE, 0, 0, 0, 254, 0}; + unsigned char *scsi_result; int saved_result; int rtn; memcpy(scmd->cmnd, generic_sense, sizeof(generic_sense)); - if (scmd->device->host->hostt->unchecked_isa_dma) { - scsi_result = kmalloc(512, GFP_ATOMIC | __GFP_DMA); - if (unlikely(!scsi_result)) { - printk(KERN_ERR "%s: cannot allocate scsi_result.\n", - __FUNCTION__); - return FAILED; - } + scsi_result = kmalloc(254, GFP_ATOMIC | (scmd->device->host->hostt->unchecked_isa_dma) ? __GFP_DMA : 0); + + + if (unlikely(!scsi_result)) { + printk(KERN_ERR "%s: cannot allocate scsi_result.\n", + __FUNCTION__); + return FAILED; } /* @@ -568,11 +568,11 @@ * address (db). 0 is not a valid sense code. */ memset(scmd->sense_buffer, 0, sizeof(scmd->sense_buffer)); - memset(scsi_result, 0, 256); + memset(scsi_result, 0, 254); saved_result = scmd->result; scmd->request_buffer = scsi_result; - scmd->request_bufflen = 256; + scmd->request_bufflen = 254; scmd->use_sg = 0; scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]); scmd->sc_data_direction = SCSI_DATA_READ; @@ -581,13 +581,12 @@ rtn = scsi_send_eh_cmnd(scmd, SENSE_TIMEOUT); /* last chance to have valid sense data */ - if (!SCSI_SENSE_VALID(scmd)) { + if(!SCSI_SENSE_VALID(scmd)) { memcpy(scmd->sense_buffer, scmd->request_buffer, - sizeof(scmd->sense_buffer)); + sizeof(scmd->sense_buffer)); } - if (scsi_result != &scsi_result0[0]) - kfree(scsi_result); + kfree(scsi_result); /* * when we eventually call scsi_finish, we really wish to complete @@ -702,8 +701,14 @@ * if the result was normal, then just pass it along to the * upper level. */ - if (rtn == SUCCESS) + if (rtn == SUCCESS) { + /* we don't want this command reissued, just + * finished with the sense data, so set + * retries to the max allowed to ensure it + * won't get reissued */ + scmd->retries = scmd->allowed; scsi_eh_finish_cmd(scmd, done_q); + } if (rtn != NEEDS_RETRY) continue; ===== drivers/scsi/scsi_lib.c 1.73 vs edited ===== --- 1.73/drivers/scsi/scsi_lib.c Sat Feb 22 14:35:33 2003 +++ edited/drivers/scsi/scsi_lib.c Fri Mar 7 15:19:46 2003 @@ -265,7 +265,6 @@ cmd->serial_number = 0; cmd->serial_number_at_timeout = 0; cmd->flags = 0; - cmd->retries = 0; cmd->abort_reason = 0; memset(cmd->sense_buffer, 0, sizeof cmd->sense_buffer); | |