On Sat, Dec 15 2007 at 2:27 +0200, James Bottomley <James.Bottomley@xxxxxxxxxxxx> wrote: > On Tue, 2007-09-18 at 17:04 +0200, Boaz Harrosh wrote: >> On Wed, Sep 12 2007 at 10:42 +0300, Russell King <rmk@xxxxxxxxxxxxxxxx> wrote: >>> On Wed, Sep 12, 2007 at 02:55:19AM +0300, Boaz Harrosh wrote: >>>> - if (SCpnt->request_bufflen != len) >>>> + if (scsi_bufflen(SCpnt) != len) { >>>> + WARN_ON(1); >>> NAK. The call trace generally doesn't provide any additional information >>> on the cause of the error. >>> >> In my opinion this can not happen any more. If it does, I want to see that >> it is not through the regular scsi-ml .queuecommand mechanism. >> But if you insist than sure I will remove it. >> >>>> printk(KERN_WARNING "scsi%d.%c: bad request buffer " >>>> "length %d, should be %ld\n", SCpnt->device->host->host_no, >>>> - '0' + SCpnt->device->id, SCpnt->request_bufflen, len); >>>> - SCpnt->request_bufflen = len; >>>> + '0' + SCpnt->device->id, scsi_bufflen(SCpnt), len); >>>> + } >>>> #endif >>>> } else { >>>> - SCpnt->SCp.ptr = (unsigned char *)SCpnt->request_buffer; >>>> - SCpnt->SCp.this_residual = SCpnt->request_bufflen; >>>> - SCpnt->SCp.phase = SCpnt->request_bufflen; >>>> - } >>>> - >>>> - /* >>>> - * If the upper SCSI layers pass a buffer, but zero length, >>>> - * we aren't interested in the buffer pointer. >>>> - */ >>>> - if (SCpnt->SCp.this_residual == 0 && SCpnt->SCp.ptr) { >>>> -#if 0 //def BELT_AND_BRACES >>>> - printk(KERN_WARNING "scsi%d.%c: zero length buffer passed for " >>>> - "command ", SCpnt->host->host_no, '0' + SCpnt->target); >>>> - __scsi_print_command(SCpnt->cmnd); >>>> -#endif >>>> SCpnt->SCp.ptr = NULL; >>>> + SCpnt->SCp.this_residual = 0; >>>> + SCpnt->SCp.phase = 0; >>>> } >>>> } >>> Also NAK. This was added due to bad behaviour of the SCSI layer and >>> was found to be necessary. >>> >> No! This check is no longer Relevant. The master if() is on bufflen() now, >> and only than do we ever set SCp.ptr. The else will always set both to Zero. >> (Which is what you want) >> >> In any way this check is done in scsi-ml, and since 2.6.18 only scsi-ml >> can allocate and issue commands. All other sources of commands where removed. >> All upper layers issue requests now. > > Russell, could you respond to this, please? Boaz's points seem valid to > me and this conversion must be done soon otherwise these drivers will > break. > > James > > Reinspecting this code in view of the overall arm-scsi, I conclude that arm is CURRENTLY BROKEN in 2.6.24-rcx tree. With or without this patch. Resubmitted in this mail is the sg-safe version of this patch. Maybe with the bug fixes it will finally be acknowledged by the arm people. The reason it is currently broken is because of copy_SCp_to_sg() which I did not previously touched. It is broken both on the account of the wrong assumption about the sg-list coming from scsi at SCp.buffer, and because inspecting the code, the sg-list pointed to by destination sg is later passed to a DMA mapper and it is not initialized properly. These and more are fixed in the new patch. After the new patch, arm drivers are not yet safe for chaining. But the arm-scsi-mid-layer is. Meaning, good behaving arm drivers will no longer suffer from bugs at the mid-level. Russell or any other arm person. Please first see if this compiles at all, as I do not have a cross compiler set up, and please check that this code works. (Should apply on top of Linus latest) ------