[SCSI] 3w-xxxx: fix oops caused by incorrect REQUEST_SENSE handling
3w-xxxx emulates a REQUEST_SENSE response by simply returning nothing. Unfortunately, it's assuming that the REQUEST_SENSE command is implemented with use_sg == 0, which is no longer the case. The oops occurs because it's clearing the scatterlist in request_buffer instead of the memory region. This is fixed by using tw_transfer_internal() to transfer correctly to the scatterlist. Acked-by: adam radford <aradford@gmail.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
8a065975c1
commit
6e3b2bbb19
|
@ -1864,10 +1864,17 @@ static int tw_scsiop_read_write(TW_Device_Extension *tw_dev, int request_id)
|
||||||
/* This function will handle the request sense scsi command */
|
/* This function will handle the request sense scsi command */
|
||||||
static int tw_scsiop_request_sense(TW_Device_Extension *tw_dev, int request_id)
|
static int tw_scsiop_request_sense(TW_Device_Extension *tw_dev, int request_id)
|
||||||
{
|
{
|
||||||
|
char request_buffer[18];
|
||||||
|
|
||||||
dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_request_sense()\n");
|
dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_request_sense()\n");
|
||||||
|
|
||||||
/* For now we just zero the request buffer */
|
memset(request_buffer, 0, sizeof(request_buffer));
|
||||||
memset(tw_dev->srb[request_id]->request_buffer, 0, tw_dev->srb[request_id]->request_bufflen);
|
request_buffer[0] = 0x70; /* Immediate fixed format */
|
||||||
|
request_buffer[7] = 10; /* minimum size per SPC: 18 bytes */
|
||||||
|
/* leave all other fields zero, giving effectively NO_SENSE return */
|
||||||
|
tw_transfer_internal(tw_dev, request_id, request_buffer,
|
||||||
|
sizeof(request_buffer));
|
||||||
|
|
||||||
tw_dev->state[request_id] = TW_S_COMPLETED;
|
tw_dev->state[request_id] = TW_S_COMPLETED;
|
||||||
tw_state_request_finish(tw_dev, request_id);
|
tw_state_request_finish(tw_dev, request_id);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue