27 Jul, 2008

2 commits

  • This patch (as1116) fixes a bug in scsi_eh_prep_cmnd() and
    scsi_eh_restore_cmnd(). These routines are supposed to save any
    values they change and restore them later, but someone forgot to
    save & restore scmd->underflow.

    This fixes part of the problem reported in Bugzilla #9638.

    [jejb: fix up rejections around DIF/DIX]
    Signed-off-by: Alan Stern
    Signed-off-by: James Bottomley

    Alan Stern
     
  • Controllers that support DMA of protection information must be told
    explicitly how to handle the I/O. The controller has no knowledge of
    the protection capabilities of the target device so this information
    must be passed in the scsi_cmnd.

    - The protection operation tells the HBA whether to generate, strip or
    verify protection information.

    - The protection type tells the HBA which layout the target is
    formatted with. This is necessary because the controller must be
    able to correctly interpret the included protection information in
    order to verify it.

    - When a scsi_cmnd is reused for error handling the protection
    operation must be cleared and saved while error handling is in
    progress.

    - prot_op and prot_type are placed in an existing hole in scsi_cmnd
    and don't cause the structure to grow.

    Signed-off-by: Martin K. Petersen
    Signed-off-by: James Bottomley

    Martin K. Petersen
     

02 May, 2008

1 commit

  • - struct scsi_cmnd had a 16 bytes command buffer of its own.
    This is an unnecessary duplication and copy of request's
    cmd. It is probably left overs from the time that scsi_cmnd
    could function without a request attached. So clean that up.

    - Once above is done, few places, apart from scsi-ml, needed
    adjustments due to changing the data type of scsi_cmnd->cmnd.

    - Lots of drivers still use MAX_COMMAND_SIZE. So I have left
    that #define but equate it to BLK_MAX_CDB. The way I see it
    and is reflected in the patch below is.
    MAX_COMMAND_SIZE - means: The longest fixed-length (*) SCSI CDB
    as per the SCSI standard and is not related
    to the implementation.
    BLK_MAX_CDB. - The allocated space at the request level

    - I have audit all ISA drivers and made sure none use ->cmnd in a DMA
    Operation. Same audit was done by Andi Kleen.

    (*)fixed-length here means commands that their size can be determined
    by their opcode and the CDB does not carry a length specifier, (unlike
    the VARIABLE_LENGTH_CMD(0x7f) command). This is actually not exactly
    true and the SCSI standard also defines extended commands and
    vendor specific commands that can be bigger than 16 bytes. The kernel
    will support these using the same infrastructure used for VARLEN CDB's.
    So in effect MAX_COMMAND_SIZE means the maximum size command
    scsi-ml supports without specifying a cmd_len by ULD's

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     

08 Apr, 2008

2 commits

  • This adds scsi_build_sense_buffer, a simple helper function to build
    sense data in a buffer.

    Signed-off-by: FUJITA Tomonori
    Signed-off-by: James Bottomley

    FUJITA Tomonori
     
  • The problem is that serveral drivers are sending a target reset from the
    device reset handler, and if we have multiple devices a target reset gets
    sent for each device when only one would be sufficient. And if we do a target
    reset it affects all the commands on the target so the device reset handler
    code only cleaning up one devices's commands makes programming the driver a
    little more difficult than it should be.

    This patch adds a target reset handler, which drivers can use to send
    a target reset. If successful it cleans up the commands for a devices
    accessed through that starget.

    Signed-off-by: Mike Christie
    Signed-off-by: James Bottomley

    Mike Christie
     

31 Jan, 2008

2 commits

  • At the block level bidi request uses req->next_rq pointer for a second
    bidi_read request.
    At Scsi-midlayer a second scsi_data_buffer structure is used for the
    bidi_read part. This bidi scsi_data_buffer is put on
    request->next_rq->special. Struct scsi_cmnd is not changed.

    - Define scsi_bidi_cmnd() to return true if it is a bidi request and a
    second sgtable was allocated.

    - Define scsi_in()/scsi_out() to return the in or out scsi_data_buffer
    from this command This API is to isolate users from the mechanics of
    bidi.

    - Define scsi_end_bidi_request() to do what scsi_end_request() does but
    for a bidi request. This is necessary because bidi commands are a bit
    tricky here. (See comments in body)

    - scsi_release_buffers() will also release the bidi_read scsi_data_buffer

    - scsi_io_completion() on bidi commands will now call
    scsi_end_bidi_request() and return.

    - The previous work done in scsi_init_io() is now done in a new
    scsi_init_sgtable() (which is 99% identical to old scsi_init_io())
    The new scsi_init_io() will call the above twice if needed also for
    the bidi_read command. Only at this point is a command bidi.

    - In scsi_error.c at scsi_eh_prep/restore_cmnd() make sure bidi-lld is not
    confused by a get-sense command that looks like bidi. This is done
    by puting NULL at request->next_rq, and restoring.

    [jejb: update to sg_table and resolve conflicts
    also update to blk-end-request and resolve conflicts]

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • In preparation for bidi we abstract all IO members of scsi_cmnd,
    that will need to duplicate, into a substructure.

    - Group all IO members of scsi_cmnd into a scsi_data_buffer
    structure.
    - Adjust accessors to new members.
    - scsi_{alloc,free}_sgtable receive a scsi_data_buffer instead of
    scsi_cmnd. And work on it.
    - Adjust scsi_init_io() and scsi_release_buffers() for above
    change.
    - Fix other parts of scsi_lib/scsi.c to members migration. Use
    accessors where appropriate.

    - fix Documentation about scsi_cmnd in scsi_host.h

    - scsi_error.c
    * Changed needed members of struct scsi_eh_save.
    * Careful considerations in scsi_eh_prep/restore_cmnd.

    - sd.c and sr.c
    * sd and sr would adjust IO size to align on device's block
    size so code needs to change once we move to scsi_data_buff
    implementation.
    * Convert code to use scsi_for_each_sg
    * Use data accessors where appropriate.

    - tgt: convert libsrp to use scsi_data_buffer

    - isd200: This driver still bangs on scsi_cmnd IO members,
    so need changing

    [jejb: rebased on top of sg_table patches fixed up conflicts
    and used the synergy to eliminate use_sg and sg_count]

    Signed-off-by: Boaz Harrosh
    Signed-off-by: FUJITA Tomonori
    Signed-off-by: James Bottomley

    Boaz Harrosh
     

18 Oct, 2007

1 commit

  • Spotted by Paul Jackson

    The error handler rework moved the scatterlist into a globally exposed
    structure in scsi_eh.h; unfortunately, the scatterlist include needs
    to move from scsi_error.c to scsi_eh.h to allow this to compile
    universally.

    Acked-by: Paul Jackson
    Signed-off-by: James Bottomley

    James Bottomley
     

13 Oct, 2007

1 commit

  • - Drivers/transports that want to send a synchronous REQUEST_SENSE command
    as part of their .queuecommand sequence, have 2 new API's that facilitate
    in doing so and abstract them from scsi-ml internals.

    void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd,
    struct scsi_eh_save *sesci, unsigned char *cmnd,
    int cmnd_size, int sense_bytes)

    Will hijack a command and prepare it for request sense if needed.
    And will save any later needed info into a scsi_eh_save structure.

    void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd,
    struct scsi_eh_save *sesci);

    Will undo any changes done to a command by above function. Making
    it ready for completion.

    - Re-factor scsi_send_eh_cmnd() to use above APIs

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     

11 Jun, 2006

1 commit


27 Jan, 2006

1 commit


07 Sep, 2005

2 commits


29 Aug, 2005

1 commit

  • This one's slightly more difficult. The transport class uses
    REQ_FAILFAST, so another interface (scsi_execute) had to be invented to
    take the extra flag. Also, the sense functions are shifted around to
    allow spi_execute to place data directly into a struct scsi_sense_hdr.
    With this change, there's probably a lot of unnecessary sense buffer
    allocation going on which we can fix later.

    Signed-off-by: James Bottomley

    James Bottomley
     

17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds