[SCSI] fix up request buffer reference in various scsi drivers
Various scsi drivers use scsi_cmnd.buffer and scsi_cmnd.bufflen in their queuecommand functions. Those fields are internal storage for the midlayer only and are used to restore the original payload after request_buffer and request_bufflen have been overwritten for EH. Using the buffer and bufflen fields means they do very broken things in error handling. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
committed by
James Bottomley
parent
e4a082c7c1
commit
5d5ff44fe6
@@ -513,7 +513,7 @@ static void mts_do_sg (struct urb* transfer, struct pt_regs *regs)
|
||||
mts_transfer_cleanup(transfer);
|
||||
}
|
||||
|
||||
sg = context->srb->buffer;
|
||||
sg = context->srb->request_buffer;
|
||||
context->fragment++;
|
||||
mts_int_submit_urb(transfer,
|
||||
context->data_pipe,
|
||||
@@ -549,19 +549,19 @@ mts_build_transfer_context( Scsi_Cmnd *srb, struct mts_desc* desc )
|
||||
desc->context.fragment = 0;
|
||||
|
||||
if (!srb->use_sg) {
|
||||
if ( !srb->bufflen ){
|
||||
if ( !srb->request_bufflen ){
|
||||
desc->context.data = NULL;
|
||||
desc->context.data_length = 0;
|
||||
return;
|
||||
} else {
|
||||
desc->context.data = srb->buffer;
|
||||
desc->context.data_length = srb->bufflen;
|
||||
desc->context.data = srb->request_buffer;
|
||||
desc->context.data_length = srb->request_bufflen;
|
||||
MTS_DEBUG("length = %d or %d\n",
|
||||
srb->request_bufflen, srb->bufflen);
|
||||
}
|
||||
} else {
|
||||
MTS_DEBUG("Using scatter/gather\n");
|
||||
sg = srb->buffer;
|
||||
sg = srb->request_buffer;
|
||||
desc->context.data = page_address(sg[0].page) + sg[0].offset;
|
||||
desc->context.data_length = sg[0].length;
|
||||
}
|
||||
|
Reference in New Issue
Block a user