On Tue, Sep 18 2007 at 11:14 +0200, Christoph Hellwig <[EMAIL PROTECTED]> wrote:
> On Tue, Sep 18, 2007 at 11:03:21AM +0200, Boaz Harrosh wrote:
>>  - Convert ide-scsi to the new data accessors and cleanup
>>    the !use_sg code paths.
>>
>>   In old code the MODE_SENSE or MODE_SELECT code paths still
>>   assumed scsi_cmnd->request_buffer is a linear char pointer.
>>   This means that this driver was broken since 2.6.17. Though
>>   I admit this assumption is hidden behind a flag:
>>   test_bit(PC_TRANSFORM, &pc->flags).
>>
>>   I have hacked these code paths to properly handle an sg_count==1,
>>   which is true in todays implementation of MODE_SENSE or
>>   MODE_SELECT.
>>
>> Signed-off-by: Boaz Harrosh <[EMAIL PROTECTED]>
>> ---
>>  drivers/scsi/ide-scsi.c |   85 
>> +++++++++++++++++++++++++++--------------------
>>  1 files changed, 49 insertions(+), 36 deletions(-)
>>
>> diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
>> index 1cc01ac..5c9a444 100644
>> --- a/drivers/scsi/ide-scsi.c
>> +++ b/drivers/scsi/ide-scsi.c
>> @@ -63,7 +63,7 @@
>>  
>>  typedef struct idescsi_pc_s {
>>      u8 c[12];                               /* Actual packet bytes */
>> -    int request_transfer;                   /* Bytes to transfer */
>> +    unsigned int request_transfer;          /* Bytes to transfer */
>>      int actually_transferred;               /* Bytes actually transferred */
>>      int buffer_size;                        /* Size of our data buffer */
>>      struct request *rq;                     /* The corresponding request */
>> @@ -175,7 +175,8 @@ static void idescsi_input_buffers (ide_drive_t *drive, 
>> idescsi_pc_t *pc, unsigne
>>      char *buf;
>>  
>>      while (bcount) {
>> -            if (pc->sg - (struct scatterlist *) 
>> pc->scsi_cmd->request_buffer > pc->scsi_cmd->use_sg) {
>> +            if (pc->sg - scsi_sglist(pc->scsi_cmd) >
>> +                                             scsi_sg_count(pc->scsi_cmd)) {
>>                      printk (KERN_ERR "ide-scsi: scatter gather table too 
>> small, discarding data\n");
>>                      idescsi_discard_data (drive, bcount);
>>                      return;
>>  static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t 
>> *pc)
>>  {
>> -    u8 *c = pc->c, *scsi_buf = pc->buffer, *sc = pc->scsi_cmd->cmnd;
>> -    char *atapi_buf;
>> -
>>      if (!test_bit(PC_TRANSFORM, &pc->flags))
>>              return;
>>      if (drive->media == ide_cdrom || drive->media == ide_optical) {
>> +            u8 *c = pc->c;
>> +
>>              if (c[0] == READ_6 || c[0] == WRITE_6) {
>>                      c[8] = c[4];            c[5] = c[3];            c[4] = 
>> c[2];
>>                      c[3] = c[1] & 0x1f;     c[2] = 0;               c[1] &= 
>> 0xe0;
>>                      c[0] += (READ_10 - READ_6);
>>              }
>>              if (c[0] == MODE_SENSE || c[0] == MODE_SELECT) {
>> +                    u8 *sc = pc->scsi_cmd->cmnd;
>> +                    char *atapi_buf;
>>                      unsigned short new_len;
>> -                    if (!scsi_buf)
>> -                            return;
> 
> Please just kill the translations.  Once we set use_10_for_rw and
> use_10_for_ms in the host template the upper layers won't send it anymore,
> and we should just reject these when coming from SG_IO.
> 

Thank you Christoph This is what I needed. I have set these 2 bits
and killed the translation. I will let the Device deal with SG_IO.
So I will not do any filtering of these commands. If SG_IO sends
the wrong commands to the wrong Devices it can deal with the
errors, right?

I will post a new ver3 patch.

Thanks
Boaz

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to