ACK for aacraid and ips with condition that community accepts the RFC's premise.

The code changes appear trivial and make sense.

I had some upstream changes in the set_sense code in aacraid related to a 
recent discussion regarding error propagation that is overlapped directly by 
the changes in this RFC. However, it looks like the changes in the SCSI layer 
to deal with the error propagation will mask the problem in set_sense reducing 
the pressure on me submitting the set_sense code changes; so I can hold on to 
them for a while until this RFC is settled and submit them as a janitor-style 
changes later.

Sincerely -- Mark Salyzyn

> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of Boaz Harrosh
> Sent: Monday, February 04, 2008 10:48 AM
> To: James Bottomley; FUJITA Tomonori; Christoph Hellwig; Jens
> Axboe; Jeff Garzik; linux-scsi
> Cc: Andrew Morton
> Subject: [PATCH 3/24][RFC] scsi-drivers: more drivers use new
> scsi_eh_cpy_sense()
>
>   All below drivers had the sense information stored in some
>   driver internal structure, which was copied or manipulated
>   and set into sense_buffer. So use scsi_eh_cpy_sense() in it's
>   place. In case of manipulation of sense data. a temporary buffer
>   is used, then copied.
>
>   Some places that inspect the sense buffer are converted to use
>   scsi_sense() accessor.
>
>   driver files changed:
>     drivers/s390/scsi/zfcp_fsf.c
>     drivers/scsi/3w-xxxx.c
>     drivers/scsi/aacraid/aachba.c
>     drivers/scsi/aic7xxx/aic79xx_osm.c
>     drivers/scsi/aic7xxx/aic7xxx_osm.c
>     drivers/scsi/arcmsr/arcmsr_hba.c
>     drivers/scsi/ipr.c
>     drivers/scsi/ips.c
>     drivers/scsi/megaraid/megaraid_mbox.c
>     drivers/scsi/ps3rom.c
>     drivers/scsi/qla4xxx/ql4_isr.c
>     drivers/scsi/stex.c
>
> Signed-off-by: Boaz Harrosh <[EMAIL PROTECTED]>
> ---
>  drivers/s390/scsi/zfcp_fsf.c          |   11 ++----
>  drivers/scsi/3w-xxxx.c                |   20 +++++++++----
>  drivers/scsi/aacraid/aachba.c         |   52
> ++++++++++----------------------
>  drivers/scsi/aic7xxx/aic79xx_osm.c    |   34 +++++++--------------
>  drivers/scsi/aic7xxx/aic7xxx_osm.c    |   22 ++++----------
>  drivers/scsi/arcmsr/arcmsr_hba.c      |   32 ++++++++++++--------
>  drivers/scsi/arm/fas216.c             |    2 +-
>  drivers/scsi/ipr.c                    |   17 ++++++-----
>  drivers/scsi/ips.c                    |   13 ++++----
>  drivers/scsi/megaraid/megaraid_mbox.c |   24 ++++++++++-----
>  drivers/scsi/ps3rom.c                 |   31 +++++++++++--------
>  drivers/scsi/qla1280.c                |   26 ++++------------
>  drivers/scsi/qla4xxx/ql4_isr.c        |   12 ++-----
>  drivers/scsi/stex.c                   |   31 +++++++++----------
>  14 files changed, 147 insertions(+), 180 deletions(-)
>
> diff --git a/drivers/s390/scsi/zfcp_fsf.c
> b/drivers/s390/scsi/zfcp_fsf.c
> index 1abbac5..388d218 100644
> --- a/drivers/s390/scsi/zfcp_fsf.c
> +++ b/drivers/s390/scsi/zfcp_fsf.c
> @@ -4209,13 +4209,11 @@
> zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req)
>
>         /* check for sense data */
>         if (unlikely(fcp_rsp_iu->validity.bits.fcp_sns_len_valid)) {
> +               u8 *sense;
>                 sns_len = FSF_FCP_RSP_SIZE -
>                     sizeof (struct fcp_rsp_iu) +
> fcp_rsp_iu->fcp_rsp_len;
>                 ZFCP_LOG_TRACE("room for %i bytes sense data
> in QTCB\n",
>                                sns_len);
> -               sns_len = min(sns_len, (u32) SCSI_SENSE_BUFFERSIZE);
> -               ZFCP_LOG_TRACE("room for %i bytes sense data
> in SCSI command\n",
> -                              SCSI_SENSE_BUFFERSIZE);
>                 sns_len = min(sns_len, fcp_rsp_iu->fcp_sns_len);
>                 ZFCP_LOG_TRACE("scpnt->result =0x%x, command was:\n",
>                                scpnt->result);
> @@ -4224,10 +4222,9 @@
> zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req)
>
>                 ZFCP_LOG_TRACE("%i bytes sense data provided
> by FCP\n",
>                                fcp_rsp_iu->fcp_sns_len);
> -               memcpy(scpnt->sense_buffer,
> -                      zfcp_get_fcp_sns_info_ptr(fcp_rsp_iu),
> sns_len);
> -               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE,
> -                             (void *)scpnt->sense_buffer, sns_len);
> +               sense = zfcp_get_fcp_sns_info_ptr(fcp_rsp_iu);
> +               scsi_eh_cpy_sense(scpnt, sense, sns_len);
> +               ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, sense, sns_len);
>         }
>
>         /* check for overrun */
> diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
> index d095321..f5dde3d 100644
> --- a/drivers/scsi/3w-xxxx.c
> +++ b/drivers/scsi/3w-xxxx.c
> @@ -214,6 +214,7 @@
>  #include <scsi/scsi_host.h>
>  #include <scsi/scsi_tcq.h>
>  #include <scsi/scsi_cmnd.h>
> +#include <scsi/scsi_eh.h>
>  #include "3w-xxxx.h"
>
>  /* Globals */
> @@ -410,23 +411,30 @@ static int
> tw_decode_sense(TW_Device_Extension *tw_dev, int request_id, int fill
>                 if ((command->status == 0xc7) ||
> (command->status == 0xcb)) {
>                         for (i = 0; i <
> ARRAY_SIZE(tw_sense_table); i++) {
>                                 if (command->flags ==
> tw_sense_table[i][0]) {
> +                                       u8 sense[14];
> +                                       struct scsi_cmnd *srb =
> +
> tw_dev->srb[request_id];
>
> +                                       memset(sense, 0,
> sizeof(sense));
>                                         /* Valid bit and
> 'current errors' */
> -
> tw_dev->srb[request_id]->sense_buffer[0] = (0x1 << 7 | 0x70);
> +                                       sense[0] = (0x1 << 7 | 0x70);
>
>                                         /* Sense key */
> -
> tw_dev->srb[request_id]->sense_buffer[2] = tw_sense_table[i][1];
> +                                       sense[2] =
> tw_sense_table[i][1];
>
>                                         /* Additional sense length */
> -
> tw_dev->srb[request_id]->sense_buffer[7] = 0xa; /* 10 bytes */
> +                                       sense[7] = 0xa; /* 10 bytes */
>
>                                         /* Additional sense code */
> -
> tw_dev->srb[request_id]->sense_buffer[12] = tw_sense_table[i][2];
> +                                       sense[12] =
> tw_sense_table[i][2];
>
>                                         /* Additional sense
> code qualifier */
> -
> tw_dev->srb[request_id]->sense_buffer[13] = tw_sense_table[i][3];
> +                                       sense[13] =
> tw_sense_table[i][3];
>
> -
> tw_dev->srb[request_id]->result = (DID_OK << 16) |
> (CHECK_CONDITION << 1);
> +                                       scsi_eh_cpy_sense(srb, sense,
> +
>   sizeof(sense));
> +                                       srb->result = (DID_OK << 16) |
> +
> (CHECK_CONDITION << 1);
>                                         return
> TW_ISR_DONT_RESULT; /* Special case for isr to not over-write
> result */
>                                 }
>                         }
> diff --git a/drivers/scsi/aacraid/aachba.c
> b/drivers/scsi/aacraid/aachba.c
> index d7235f4..0e5577c 100644
> --- a/drivers/scsi/aacraid/aachba.c
> +++ b/drivers/scsi/aacraid/aachba.c
> @@ -39,6 +39,7 @@
>  #include <scsi/scsi_cmnd.h>
>  #include <scsi/scsi_device.h>
>  #include <scsi/scsi_host.h>
> +#include <scsi/scsi_eh.h>
>
>  #include "aacraid.h"
>
> @@ -862,7 +863,7 @@ static int setinqserial(struct aac_dev
> *dev, void *data, int cid)
>  static void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
>                       u8 a_sense_code, u8 incorrect_length,
>                       u8 bit_pointer, u16 field_pointer,
> -                     u32 residue)
> +                     u32 residue, struct scsi_cmnd *cmd)
>  {
>         sense_buf[0] = 0xF0;    /* Sense data valid, err code
> 70h (current error) */
>         sense_buf[1] = 0;       /* Segment number, always zero */
> @@ -897,6 +898,8 @@ static void set_sense(u8 *sense_buf, u8
> sense_key, u8 sense_code,
>                 sense_buf[16] = field_pointer >> 8;     /* MSB */
>                 sense_buf[17] = field_pointer;          /* LSB */
>         }
> +
> +       scsi_eh_cpy_sense(cmd, sense_buf, sizeof(struct sense_data));
>  }
>
>  static int aac_bounds_32(struct aac_dev * dev, struct
> scsi_cmnd * cmd, u64 lba)
> @@ -910,10 +913,7 @@ static int aac_bounds_32(struct aac_dev
> * dev, struct scsi_cmnd * cmd, u64 lba)
>                             HARDWARE_ERROR,
>                             SENCODE_INTERNAL_TARGET_FAILURE,
>                             ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
> -                           0, 0);
> -               memcpy(cmd->sense_buffer,
> &dev->fsa_dev[cid].sense_data,
> -                      min_t(size_t,
> sizeof(dev->fsa_dev[cid].sense_data),
> -                            SCSI_SENSE_BUFFERSIZE));
> +                           0, 0, cmd);
>                 cmd->scsi_done(cmd);
>                 return 1;
>         }
> @@ -1524,10 +1524,7 @@ static void io_callback(void *context,
> struct fib * fibptr)
>                                     HARDWARE_ERROR,
>                                     SENCODE_INTERNAL_TARGET_FAILURE,
>
> ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
> -                                   0, 0);
> -               memcpy(scsicmd->sense_buffer,
> &dev->fsa_dev[cid].sense_data,
> -                      min_t(size_t,
> sizeof(dev->fsa_dev[cid].sense_data),
> -                            SCSI_SENSE_BUFFERSIZE));
> +                                   0, 0, scsicmd);
>         }
>         aac_fib_complete(fibptr);
>         aac_fib_free(fibptr);
> @@ -1737,10 +1734,7 @@ static void synchronize_callback(void
> *context, struct fib *fibptr)
>                                     HARDWARE_ERROR,
>                                     SENCODE_INTERNAL_TARGET_FAILURE,
>
> ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
> -                                   0, 0);
> -               memcpy(cmd->sense_buffer,
> &dev->fsa_dev[cid].sense_data,
> -                      min_t(size_t,
> sizeof(dev->fsa_dev[cid].sense_data),
> -                            SCSI_SENSE_BUFFERSIZE));
> +                                   0, 0, cmd);
>         }
>
>         aac_fib_complete(fibptr);
> @@ -1948,10 +1942,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
>                 set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
>                             ILLEGAL_REQUEST,
>                             SENCODE_INVALID_COMMAND,
> -                           ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
> -               memcpy(scsicmd->sense_buffer,
> &dev->fsa_dev[cid].sense_data,
> -                      min_t(size_t,
> sizeof(dev->fsa_dev[cid].sense_data),
> -                            SCSI_SENSE_BUFFERSIZE));
> +                           ASENCODE_INVALID_COMMAND, 0, 0,
> 0, 0, scsicmd);
>                 scsicmd->scsi_done(scsicmd);
>                 return 0;
>         }
> @@ -1998,12 +1989,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
>                                 set_sense((u8 *)
> &dev->fsa_dev[cid].sense_data,
>                                   ILLEGAL_REQUEST,
>                                   SENCODE_INVALID_CDB_FIELD,
> -                                 ASENCODE_NO_SENSE, 0, 7, 2, 0);
> -                               memcpy(scsicmd->sense_buffer,
> -                                 &dev->fsa_dev[cid].sense_data,
> -                                 min_t(size_t,
> -
> sizeof(dev->fsa_dev[cid].sense_data),
> -                                       SCSI_SENSE_BUFFERSIZE));
> +                                 ASENCODE_NO_SENSE, 0, 7, 2,
> 0, scsicmd);
>                         }
>                         scsicmd->scsi_done(scsicmd);
>                         return 0;
> @@ -2176,7 +2162,8 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
>         }
>         case REQUEST_SENSE:
>                 dprintk((KERN_DEBUG "REQUEST SENSE command.\n"));
> -               memcpy(scsicmd->sense_buffer,
> &dev->fsa_dev[cid].sense_data, sizeof (struct sense_data));
> +               scsi_eh_cpy_sense(scsicmd,
> &dev->fsa_dev[cid].sense_data,
> +                                       sizeof(struct sense_data));
>                 memset(&dev->fsa_dev[cid].sense_data, 0,
> sizeof (struct sense_data));
>                 scsicmd->result = DID_OK << 16 |
> COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
>                 scsicmd->scsi_done(scsicmd);
> @@ -2256,11 +2243,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
>                         scsicmd->result = DID_OK << 16 |
> COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
>                         set_sense((u8 *)
> &dev->fsa_dev[cid].sense_data,
>                                 ILLEGAL_REQUEST,
> SENCODE_INVALID_COMMAND,
> -                               ASENCODE_INVALID_COMMAND, 0, 0, 0, 0);
> -                       memcpy(scsicmd->sense_buffer,
> &dev->fsa_dev[cid].sense_data,
> -                               min_t(size_t,
> -
> sizeof(dev->fsa_dev[cid].sense_data),
> -                                     SCSI_SENSE_BUFFERSIZE));
> +                               ASENCODE_INVALID_COMMAND, 0,
> 0, 0, 0, scsicmd);
>                         scsicmd->scsi_done(scsicmd);
>                         return 0;
>         }
> @@ -2403,7 +2386,6 @@ static void aac_srb_callback(void
> *context, struct fib * fibptr)
>
>         srbreply = (struct aac_srb_reply *) fib_data(fibptr);
>
> -       scsicmd->sense_buffer[0] = '\0';  /* Initialize sense
> valid flag to false */
>         /*
>          *      Calculate resid for sg
>          */
> @@ -2420,10 +2402,9 @@ static void aac_srb_callback(void
> *context, struct fib * fibptr)
>         if (le32_to_cpu(srbreply->status) != ST_OK){
>                 int len;
>                 printk(KERN_WARNING "aac_srb_callback: srb
> failed, status = %d\n", le32_to_cpu(srbreply->status));
> -               len = min_t(u32,
> le32_to_cpu(srbreply->sense_data_size),
> -                           SCSI_SENSE_BUFFERSIZE);
> +               len = le32_to_cpu(srbreply->sense_data_size);
>                 scsicmd->result = DID_ERROR << 16 |
> COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
> -               memcpy(scsicmd->sense_buffer,
> srbreply->sense_data, len);
> +               scsi_eh_cpy_sense(scsicmd, srbreply->sense_data, len);
>         }
>
>         /*
> @@ -2524,13 +2505,12 @@ static void aac_srb_callback(void
> *context, struct fib * fibptr)
>         if (le32_to_cpu(srbreply->scsi_status) ==
> SAM_STAT_CHECK_CONDITION) {
>                 int len;
>                 scsicmd->result |= SAM_STAT_CHECK_CONDITION;
> -               len = min_t(u32,
> le32_to_cpu(srbreply->sense_data_size),
> -                           SCSI_SENSE_BUFFERSIZE);
> +               len = le32_to_cpu(srbreply->sense_data_size);
>  #ifdef AAC_DETAILED_STATUS_INFO
>                 printk(KERN_WARNING "aac_srb_callback: check
> condition, status = %d len=%d\n",
>
> le32_to_cpu(srbreply->status), len);
>  #endif
> -               memcpy(scsicmd->sense_buffer,
> srbreply->sense_data, len);
> +               scsi_eh_cpy_sense(scsicmd, srbreply->sense_data, len);
>         }
>         /*
>          * OR in the scsi status (already shifted up a bit)
> diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c
> b/drivers/scsi/aic7xxx/aic79xx_osm.c
> index 0146547..4bd5aa7 100644
> --- a/drivers/scsi/aic7xxx/aic79xx_osm.c
> +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c
> @@ -1654,13 +1654,6 @@ ahd_done(struct ahd_softc *ahd, struct
> scb *scb)
>         }
>         ahd_linux_unmap_scb(ahd, scb);
>
> -       /*
> -        * Guard against stale sense data.
> -        * The Linux mid-layer assumes that sense
> -        * was retrieved anytime the first byte of
> -        * the sense buffer looks "sane".
> -        */
> -       cmd->sense_buffer[0] = 0;
>         if (ahd_get_transaction_status(scb) == CAM_REQ_INPROG) {
>                 uint32_t amount_xferred;
>
> @@ -1779,11 +1772,11 @@ ahd_linux_handle_scsi_status(struct
> ahd_softc *ahd,
>                         struct scsi_status_iu_header *siu;
>                         u_int sense_size;
>                         u_int sense_offset;
> +                       u8 *sense_buffer;
>
>                         if (scb->flags & SCB_SENSE) {
> -                               sense_size =
> min(sizeof(struct scsi_sense_data)
> -                                              -
> ahd_get_sense_residual(scb),
> -
> (u_long)SCSI_SENSE_BUFFERSIZE);
> +                               sense_size = sizeof(struct
> scsi_sense_data) -
> +
> ahd_get_sense_residual(scb);
>                                 sense_offset = 0;
>                         } else {
>                                 /*
> @@ -1792,16 +1785,12 @@ ahd_linux_handle_scsi_status(struct
> ahd_softc *ahd,
>                                  */
>                                 siu = (struct scsi_status_iu_header *)
>                                     scb->sense_data;
> -                               sense_size = min_t(size_t,
> -
> scsi_4btoul(siu->sense_length),
> -
> SCSI_SENSE_BUFFERSIZE);
> +                               sense_size =
> scsi_4btoul(siu->sense_length);
>                                 sense_offset = SIU_SENSE_OFFSET(siu);
>                         }
> -
> -                       memset(cmd->sense_buffer, 0,
> SCSI_SENSE_BUFFERSIZE);
> -                       memcpy(cmd->sense_buffer,
> -                              ahd_get_sense_buf(ahd, scb)
> -                              + sense_offset, sense_size);
> +                       sense_buffer = ahd_get_sense_buf(ahd, scb) +
> +
>   sense_offset;
> +                       scsi_eh_cpy_sense(cmd, sense_buffer,
> sense_size);
>                         cmd->result |= (DRIVER_SENSE << 24);
>
>  #ifdef AHD_DEBUG
> @@ -1813,7 +1802,7 @@ ahd_linux_handle_scsi_status(struct
> ahd_softc *ahd,
>                                 for (i = 0; i < sense_size; i++) {
>                                         if ((i & 0xF) == 0)
>                                                 printf("\n");
> -                                       printf("0x%x ",
> cmd->sense_buffer[i]);
> +                                       printf("0x%x ",
> sense_buffer[i]);
>                                 }
>                                 printf("\n");
>                         }
> @@ -1918,10 +1907,9 @@ ahd_linux_queue_cmd_complete(struct
> ahd_softc *ahd, struct scsi_cmnd *cmd)
>                         if ((cmd->result >> 24) != DRIVER_SENSE) {
>                                 do_fallback = 1;
>                         } else {
> -                               struct scsi_sense_data *sense;
> -
> -                               sense = (struct scsi_sense_data *)
> -                                       cmd->sense_buffer;
> +                               struct scsi_sense_data *sense =
> +                                     (struct scsi_sense_data
> *)scsi_sense(cmd);
> +
>                                 if (sense->extra_len >= 5 &&
>                                     (sense->add_sense_code == 0x47
>                                      || sense->add_sense_code
> == 0x48))
> diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c
> b/drivers/scsi/aic7xxx/aic7xxx_osm.c
> index 99a3b33..4521370 100644
> --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c
> +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c
> @@ -1677,13 +1677,6 @@ ahc_done(struct ahc_softc *ahc, struct
> scb *scb)
>         }
>         ahc_linux_unmap_scb(ahc, scb);
>
> -       /*
> -        * Guard against stale sense data.
> -        * The Linux mid-layer assumes that sense
> -        * was retrieved anytime the first byte of
> -        * the sense buffer looks "sane".
> -        */
> -       cmd->sense_buffer[0] = 0;
>         if (ahc_get_transaction_status(scb) == CAM_REQ_INPROG) {
>                 uint32_t amount_xferred;
>
> @@ -1800,15 +1793,12 @@ ahc_linux_handle_scsi_status(struct
> ahc_softc *ahc,
>                 cmd = scb->io_ctx;
>                 if (scb->flags & SCB_SENSE) {
>                         u_int sense_size;
> +                       u8 *sense_buffer;
>
> -                       sense_size = min(sizeof(struct
> scsi_sense_data)
> -                                      - ahc_get_sense_residual(scb),
> -
> (u_long)SCSI_SENSE_BUFFERSIZE);
> -                       memcpy(cmd->sense_buffer,
> -                              ahc_get_sense_buf(ahc, scb),
> sense_size);
> -                       if (sense_size < SCSI_SENSE_BUFFERSIZE)
> -
> memset(&cmd->sense_buffer[sense_size], 0,
> -                                      SCSI_SENSE_BUFFERSIZE
> - sense_size);
> +                       sense_size = sizeof(struct scsi_sense_data)
> +                                      - ahc_get_sense_residual(scb);
> +                       sense_buffer = (u8
> *)ahc_get_sense_buf(ahc, scb);
> +                       scsi_eh_cpy_sense(cmd, sense_buffer,
> sense_size);
>                         cmd->result |= (DRIVER_SENSE << 24);
>  #ifdef AHC_DEBUG
>                         if (ahc_debug & AHC_SHOW_SENSE) {
> @@ -1819,7 +1809,7 @@ ahc_linux_handle_scsi_status(struct
> ahc_softc *ahc,
>                                 for (i = 0; i < sense_size; i++) {
>                                         if ((i & 0xF) == 0)
>                                                 printf("\n");
> -                                       printf("0x%x ",
> cmd->sense_buffer[i]);
> +                                       printf("0x%x ",
> sense_buffer[i]);
>                                 }
>                                 printf("\n");
>                         }
> diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c
> b/drivers/scsi/arcmsr/arcmsr_hba.c
> index f4a202e..2a318ec 100644
> --- a/drivers/scsi/arcmsr/arcmsr_hba.c
> +++ b/drivers/scsi/arcmsr/arcmsr_hba.c
> @@ -69,6 +69,7 @@
>  #include <scsi/scsi_device.h>
>  #include <scsi/scsi_transport.h>
>  #include <scsi/scsicam.h>
> +#include <scsi/scsi_eh.h>
>  #include "arcmsr.h"
>
>  MODULE_AUTHOR("Erich Chen <[EMAIL PROTECTED]>");
> @@ -628,18 +629,15 @@ static void
> arcmsr_report_sense_info(struct CommandControlBlock *ccb)
>  {
>
>         struct scsi_cmnd *pcmd = ccb->pcmd;
> -       struct SENSE_DATA *sensebuffer = (struct SENSE_DATA
> *)pcmd->sense_buffer;
> +       struct SENSE_DATA *sensebuffer =
> +               (struct SENSE_DATA *)ccb->arcmsr_cdb.SenseData;
>
>         pcmd->result = DID_OK << 16;
> -       if (sensebuffer) {
> -               int sense_data_length =
> -                       sizeof(struct SENSE_DATA) <
> SCSI_SENSE_BUFFERSIZE
> -                       ? sizeof(struct SENSE_DATA) :
> SCSI_SENSE_BUFFERSIZE;
> -               memset(sensebuffer, 0, SCSI_SENSE_BUFFERSIZE);
> -               memcpy(sensebuffer,
> ccb->arcmsr_cdb.SenseData, sense_data_length);
> -               sensebuffer->ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
> -               sensebuffer->Valid = 1;
> -       }
> +
> +       sensebuffer->ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
> +       sensebuffer->Valid = 1;
> +
> +       scsi_eh_cpy_sense(pcmd, sensebuffer, sizeof(sensebuffer));
>  }
>
>  static u32 arcmsr_disable_outbound_ints(struct
> AdapterControlBlock *acb)
> @@ -1442,8 +1440,10 @@ static int
> arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, \
>                 wqbuf_lastindex = acb->wqbuf_lastindex;
>                 wqbuf_firstindex = acb->wqbuf_firstindex;
>                 if (wqbuf_lastindex != wqbuf_firstindex) {
> +                       u8 sb[16];
>                         struct SENSE_DATA *sensebuffer =
> -                               (struct SENSE_DATA
> *)cmd->sense_buffer;
> +
> (struct SENSE_DATA *)sb;
> +                       memset(sensebuffer, 0, sizeof(sensebuffer));
>                         arcmsr_post_ioctldata2iop(acb);
>                         /* has error report sensedata */
>                         sensebuffer->ErrorCode = 0x70;
> @@ -1451,6 +1451,8 @@ static int
> arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, \
>                         sensebuffer->AdditionalSenseLength = 0x0A;
>                         sensebuffer->AdditionalSenseCode = 0x20;
>                         sensebuffer->Valid = 1;
> +                       scsi_eh_cpy_sense(cmd, sensebuffer,
> +
> sizeof(*sensebuffer));
>                         retvalue = ARCMSR_MESSAGE_FAIL;
>                 } else {
>                         my_empty_len =
> (wqbuf_firstindex-wqbuf_lastindex - 1)
> @@ -1471,14 +1473,18 @@ static int
> arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, \
>
> arcmsr_post_ioctldata2iop(acb);
>                                 }
>                         } else {
> -                               /* has error report sensedata */
> +                               u8 sb[16];
>                                 struct SENSE_DATA *sensebuffer =
> -                                       (struct SENSE_DATA
> *)cmd->sense_buffer;
> +
> (struct SENSE_DATA *)sb;
> +                               memset(sensebuffer, 0,
> sizeof(sensebuffer));
> +                               /* has error report sensedata */
>                                 sensebuffer->ErrorCode = 0x70;
>                                 sensebuffer->SenseKey =
> ILLEGAL_REQUEST;
>
> sensebuffer->AdditionalSenseLength = 0x0A;
>
> sensebuffer->AdditionalSenseCode = 0x20;
>                                 sensebuffer->Valid = 1;
> +                               scsi_eh_cpy_sense(cmd, sensebuffer,
> +
> sizeof(sensebuffer));
>                                 retvalue = ARCMSR_MESSAGE_FAIL;
>                         }
>                         }
> diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c
> index fb5f202..6c200ac 100644
> --- a/drivers/scsi/arm/fas216.c
> +++ b/drivers/scsi/arm/fas216.c
> @@ -2009,7 +2009,7 @@ static void
> fas216_rq_sns_done(FAS216_Info *info, struct scsi_cmnd *SCpnt,
>                  * have valid data in the sense buffer that could
>                  * confuse the higher levels.
>                  */
> -               memset(SCpnt->sense_buffer, 0,
> sizeof(SCpnt->sense_buffer));
> +               scsi_eh_reset_sense(SCpnt);
>  //printk("scsi%d.%c: sense buffer: ", info->host->host_no,
> '0' + SCpnt->device->id);
>  //{ int i; for (i = 0; i < 32; i++) printk("%02x ",
> SCpnt->sense_buffer[i]); printk("\n"); }
>         /*
> diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
> index 73270ff..46893f2 100644
> --- a/drivers/scsi/ipr.c
> +++ b/drivers/scsi/ipr.c
> @@ -4379,8 +4379,8 @@ static void ipr_erp_done(struct
> ipr_cmnd *ipr_cmd)
>                 scmd_printk(KERN_ERR, scsi_cmd,
>                             "Request Sense failed with IOASC:
> 0x%08X\n", ioasc);
>         } else {
> -               memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer,
> -                      SCSI_SENSE_BUFFERSIZE);
> +               scsi_eh_cpy_sense(scsi_cmd, ipr_cmd->sense_buffer,
> +                      sizeof(ipr_cmd->sense_buffer));
>         }
>
>         if (res) {
> @@ -4574,12 +4574,12 @@ static void ipr_dump_ioasa(struct
> ipr_ioa_cfg *ioa_cfg,
>  static void ipr_gen_sense(struct ipr_cmnd *ipr_cmd)
>  {
>         u32 failing_lba;
> -       u8 *sense_buf = ipr_cmd->scsi_cmd->sense_buffer;
> +       u8 sense_buf[24];
>         struct ipr_resource_entry *res =
> ipr_cmd->scsi_cmd->device->hostdata;
>         struct ipr_ioasa *ioasa = &ipr_cmd->ioasa;
>         u32 ioasc = be32_to_cpu(ioasa->ioasc);
>
> -       memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE);
> +       memset(sense_buf, 0, sizeof(sense_buf));
>
>         if (ioasc >= IPR_FIRST_DRIVER_IOASC)
>                 return;
> @@ -4652,6 +4652,8 @@ static void ipr_gen_sense(struct
> ipr_cmnd *ipr_cmd)
>                         sense_buf[7] = 6;       /* additional
> length */
>                 }
>         }
> +       scsi_eh_cpy_sense(ipr_cmd->scsi_cmd, sense_buf,
> sizeof(sense_buf));
> +
>  }
>
>  /**
> @@ -4671,9 +4673,8 @@ static int ipr_get_autosense(struct
> ipr_cmnd *ipr_cmd)
>         if ((be32_to_cpu(ioasa->ioasc_specific) &
> IPR_AUTOSENSE_VALID) == 0)
>                 return 0;
>
> -       memcpy(ipr_cmd->scsi_cmd->sense_buffer,
> ioasa->auto_sense.data,
> -              min_t(u16,
> be16_to_cpu(ioasa->auto_sense.auto_sense_len),
> -                  SCSI_SENSE_BUFFERSIZE));
> +       scsi_eh_cpy_sense(ipr_cmd->scsi_cmd, ioasa->auto_sense.data,
> +
> be16_to_cpu(ioasa->auto_sense.auto_sense_len));
>         return 1;
>  }
>
> @@ -4836,7 +4837,7 @@ static int ipr_queuecommand(struct
> scsi_cmnd *scsi_cmd,
>          *  and the ioa_is_dead check can be removed
>          */
>         if (unlikely(ioa_cfg->ioa_is_dead || !res)) {
> -               memset(scsi_cmd->sense_buffer, 0,
> SCSI_SENSE_BUFFERSIZE);
> +               scsi_eh_reset_sense(scsi_cmd);
>                 scsi_cmd->result = (DID_NO_CONNECT << 16);
>                 scsi_cmd->scsi_done(scsi_cmd);
>                 return 0;
> diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c
> index 7505cca..4760ed6 100644
> --- a/drivers/scsi/ips.c
> +++ b/drivers/scsi/ips.c
> @@ -3431,13 +3431,13 @@ ips_map_status(ips_ha_t * ha,
> ips_scb_t * scb, ips_stat_t * sp)
>                                         IPS_CMD_EXTENDED_DCDB_SG)) {
>                                         tapeDCDB =
>
> (IPS_DCDB_TABLE_TAPE *) & scb->dcdb;
> -
> memcpy(scb->scsi_cmd->sense_buffer,
> +
> scsi_eh_cpy_sense(scb->scsi_cmd,
>                                                tapeDCDB->sense_info,
> -                                              SCSI_SENSE_BUFFERSIZE);
> +
> sizeof(tapeDCDB->sense_info));
>                                 } else {
> -
> memcpy(scb->scsi_cmd->sense_buffer,
> +
> scsi_eh_cpy_sense(scb->scsi_cmd,
>                                                scb->dcdb.sense_info,
> -                                              SCSI_SENSE_BUFFERSIZE);
> +
> sizeof(scb->dcdb.sense_info));
>                                 }
>                                 device_error = 2;       /*
> check condition */
>                         }
> @@ -3571,7 +3571,7 @@ static int
>  ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb)
>  {
>         int ret;
> -       char *sp;
> +       u8 sp[16];
>         int device_error;
>         IPS_DCDB_TABLE_TAPE *tapeDCDB;
>         int TimeOut;
> @@ -3816,13 +3816,14 @@ ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb)
>                         /* Set the Return Info to appear like
> the Command was */
>                         /* attempted, a Check Condition
> occurred, and Sense   */
>                         /* Data indicating an Invalid CDB
> OpCode is returned. */
> -                       sp = (char *) scb->scsi_cmd->sense_buffer;
> +                       memset(sp, 0, sizeof(sp));
>
>                         sp[0] = 0x70;   /* Error Code               */
>                         sp[2] = ILLEGAL_REQUEST;        /*
> Sense Key 5 Illegal Req. */
>                         sp[7] = 0x0A;   /* Additional Sense Length  */
>                         sp[12] = 0x20;  /* ASC = Invalid OpCode     */
>                         sp[13] = 0x00;  /* ASCQ                     */
> +                       scsi_eh_cpy_sense(scb->scsi_cmd, sp,
> sizeof(sp));
>
>                         device_error = 2;       /* Indicate
> Check Condition */
>                         scb->scsi_cmd->result = device_error
> | (DID_OK << 16);
> diff --git a/drivers/scsi/megaraid/megaraid_mbox.c
> b/drivers/scsi/megaraid/megaraid_mbox.c
> index 6db77c0..17718d6 100644
> --- a/drivers/scsi/megaraid/megaraid_mbox.c
> +++ b/drivers/scsi/megaraid/megaraid_mbox.c
> @@ -70,6 +70,7 @@
>   * For history of changes, see Documentation/ChangeLog.megaraid
>   */
>
> +#include <scsi/scsi_eh.h>
>  #include "megaraid_mbox.h"
>
>  static int megaraid_init(void);
> @@ -1616,9 +1617,13 @@ megaraid_mbox_build_cmd(adapter_t
> *adapter, struct scsi_cmnd *scp, int *busy)
>                         }
>
>                         if (scp->cmnd[1] & MEGA_SCSI_INQ_EVPD) {
> -                               scp->sense_buffer[0] = 0x70;
> -                               scp->sense_buffer[2] =
> ILLEGAL_REQUEST;
> -                               scp->sense_buffer[12] =
> MEGA_INVALID_FIELD_IN_CDB;
> +                               u8 sense[14];
> +
> +                               memset(sense, 0, sizeof(sense));
> +                               sense[0] = 0x70;
> +                               sense[2] = ILLEGAL_REQUEST;
> +                               sense[12] = MEGA_INVALID_FIELD_IN_CDB;
> +                               scsi_eh_cpy_sense(scp, sense,
> sizeof(sense));
>                                 scp->result = CHECK_CONDITION << 1;
>                                 return NULL;
>                         }
> @@ -2365,8 +2370,7 @@ megaraid_mbox_dpc(unsigned long devp)
>                         if (mbox->cmd == MBOXCMD_PASSTHRU ||
>                                 mbox->cmd == MBOXCMD_PASSTHRU64) {
>
> -                               memcpy(scp->sense_buffer,
> pthru->reqsensearea,
> -                                               14);
> +                               scsi_eh_cpy_sense(scp,
> pthru->reqsensearea, 14);
>
>                                 scp->result = DRIVER_SENSE << 24 |
>                                         DID_OK << 16 |
> CHECK_CONDITION << 1;
> @@ -2374,15 +2378,19 @@ megaraid_mbox_dpc(unsigned long devp)
>                         else {
>                                 if (mbox->cmd == MBOXCMD_EXTPTHRU) {
>
> -                                       memcpy(scp->sense_buffer,
> +                                       scsi_eh_cpy_sense(scp,
>
> epthru->reqsensearea, 14);
>
>                                         scp->result =
> DRIVER_SENSE << 24 |
>                                                 DID_OK << 16 |
>                                                 CHECK_CONDITION << 1;
>                                 } else {
> -                                       scp->sense_buffer[0] = 0x70;
> -                                       scp->sense_buffer[2]
> = ABORTED_COMMAND;
> +                                       u8 sn[4];
> +
> +                                       memset(sn, 0, sizeof(sn));
> +                                       sn[0] = 0x70;
> +                                       sn[2] = ABORTED_COMMAND;
> +
> scsi_eh_cpy_sense(scp, sn, sizeof(sn));
>                                         scp->result =
> CHECK_CONDITION << 1;
>                                 }
>                         }
> diff --git a/drivers/scsi/ps3rom.c b/drivers/scsi/ps3rom.c
> index 0cd614a..0a58033 100644
> --- a/drivers/scsi/ps3rom.c
> +++ b/drivers/scsi/ps3rom.c
> @@ -323,10 +323,13 @@ static int ps3rom_queuecommand(struct
> scsi_cmnd *cmd,
>         }
>
>         if (res) {
> -               memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
> +               u8 sense[4];
> +
> +               memset(sense, 0, sizeof(sense));
>                 cmd->result = res;
> -               cmd->sense_buffer[0] = 0x70;
> -               cmd->sense_buffer[2] = ILLEGAL_REQUEST;
> +               sense[0] = 0x70;
> +               sense[2] = ILLEGAL_REQUEST;
> +               scsi_eh_cpy_sense(cmd, sense, sizeof(sense);
>                 priv->curr_cmd = NULL;
>                 cmd->scsi_done(cmd);
>         }
> @@ -399,17 +402,19 @@ static irqreturn_t ps3rom_interrupt(int
> irq, void *data)
>                 goto done;
>         }
>
> -       if (decode_lv1_status(status, &sense_key, &asc, &ascq)) {
> +       if (!decode_lv1_status(status, &sense_key, &asc, &ascq)) {
> +               u8 sense[14];
> +
> +               memset(sense, 0, sizeof(sense));
> +               sense[0]  = 0x70;
> +               sense[2]  = sense_key;
> +               sense[7]  = 16 - 6;
> +               sense[12] = asc;
> +               sense[13] = ascq;
> +               scsi_eh_cpy_sense(cmd, sense, sizeof(sense));
> +               cmd->result = SAM_STAT_CHECK_CONDITION;
> +       } else
>                 cmd->result = DID_ERROR << 16;
> -               goto done;
> -       }
> -
> -       cmd->sense_buffer[0]  = 0x70;
> -       cmd->sense_buffer[2]  = sense_key;
> -       cmd->sense_buffer[7]  = 16 - 6;
> -       cmd->sense_buffer[12] = asc;
> -       cmd->sense_buffer[13] = ascq;
> -       cmd->result = SAM_STAT_CHECK_CONDITION;
>
>  done:
>         priv->curr_cmd = NULL;
> diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
> index 68c0d09..2164858 100644
> --- a/drivers/scsi/qla1280.c
> +++ b/drivers/scsi/qla1280.c
> @@ -362,6 +362,7 @@
>  #include <scsi/scsi_device.h>
>  #include <scsi/scsi_host.h>
>  #include <scsi/scsi_tcq.h>
> +#include <scsi/scsi_eh.h>
>
>  #if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2)
>  #include <asm/sn/io.h>
> @@ -527,8 +528,6 @@ __setup("qla1280=", qla1280_setup);
>  #define        CMD_SP(Cmnd)            &Cmnd->SCp
>  #define        CMD_CDBLEN(Cmnd)        Cmnd->cmd_len
>  #define        CMD_CDBP(Cmnd)          Cmnd->cmnd
> -#define        CMD_SNSP(Cmnd)          Cmnd->sense_buffer
> -#define        CMD_SNSLEN(Cmnd)        SCSI_SENSE_BUFFERSIZE
>  #define        CMD_RESULT(Cmnd)        Cmnd->result
>  #define        CMD_HANDLE(Cmnd)        Cmnd->host_scribble
>  #define CMD_REQUEST(Cmnd)      Cmnd->request->cmd
> @@ -3698,32 +3697,21 @@ qla1280_status_entry(struct
> scsi_qla_host *ha, struct response *pkt,
>
>                 if (scsi_status & SAM_STAT_CHECK_CONDITION) {
>                         if (comp_status != CS_ARS_FAILED) {
> -                               uint16_t req_sense_length =
> -
> le16_to_cpu(pkt->req_sense_length);
> -                               if (req_sense_length <
> CMD_SNSLEN(cmd))
> -                                       sense_sz = req_sense_length;
> -                               else
> -                                       /*
> -                                        * scsi_cmnd->sense_buffer is
> -                                        * 64 bytes, why only copy 63?
> -                                        * This looks wrong! /Jes
> -                                        */
> -                                       sense_sz =
> CMD_SNSLEN(cmd) - 1;
> +                               sense_sz = min_t(size_t,
> +                                       sizeof(pkt->req_sense_data),
> +
> le16_to_cpu(pkt->req_sense_length));
>
> -                               memcpy(cmd->sense_buffer,
> -                                      &pkt->req_sense_data,
> sense_sz);
> +                               scsi_eh_cpy_sense(cmd,
> pkt->req_sense_data,
> +
>        sense_sz);
>                         } else
>                                 sense_sz = 0;
> -                       memset(cmd->sense_buffer + sense_sz, 0,
> -                              SCSI_SENSE_BUFFERSIZE - sense_sz);
>
>                         dprintk(2, "qla1280_status_entry: Check "
>                                 "condition Sense data, b %i, t %i, "
>                                 "l %i\n", bus, target, lun);
>                         if (sense_sz)
>                                 qla1280_dump_buffer(2,
> -                                                   (char
> *)cmd->sense_buffer,
> -                                                   sense_sz);
> +                                       (char
> *)pkt->req_sense_data, sense_sz);
>                 }
>         }
>
> diff --git a/drivers/scsi/qla4xxx/ql4_isr.c
> b/drivers/scsi/qla4xxx/ql4_isr.c
> index 0f029d0..6daf119 100644
> --- a/drivers/scsi/qla4xxx/ql4_isr.c
> +++ b/drivers/scsi/qla4xxx/ql4_isr.c
> @@ -10,6 +10,7 @@
>  #include "ql4_dbg.h"
>  #include "ql4_inline.h"
>
> +#include <scsi/scsi_eh.h>
>  /**
>   * qla2x00_process_completed_request() - Process a Fast Post
> response.
>   * @ha: SCSI driver HA context
> @@ -123,14 +124,11 @@ static void qla4xxx_status_entry(struct
> scsi_qla_host *ha,
>                         break;
>
>                 /* Copy Sense Data into sense buffer. */
> -               memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
> -
>                 sensebytecnt =
> le16_to_cpu(sts_entry->senseDataByteCnt);
>                 if (sensebytecnt == 0)
>                         break;
>
> -               memcpy(cmd->sense_buffer, sts_entry->senseData,
> -                      min_t(uint16_t, sensebytecnt,
> SCSI_SENSE_BUFFERSIZE));
> +               scsi_eh_cpy_sense(cmd, sts_entry->senseData,
> sensebytecnt);
>
>                 DEBUG2(printk("scsi%ld:%d:%d:%d: %s: sense key = %x, "
>                               "ASC/ASCQ = %02x/%02x\n", ha->host_no,
> @@ -207,15 +205,13 @@ static void qla4xxx_status_entry(struct
> scsi_qla_host *ha,
>                                 break;
>
>                         /* Copy Sense Data into sense buffer. */
> -                       memset(cmd->sense_buffer, 0,
> SCSI_SENSE_BUFFERSIZE);
> -
>                         sensebytecnt =
>
> le16_to_cpu(sts_entry->senseDataByteCnt);
>                         if (sensebytecnt == 0)
>                                 break;
>
> -                       memcpy(cmd->sense_buffer,
> sts_entry->senseData,
> -                              min_t(uint16_t, sensebytecnt,
> SCSI_SENSE_BUFFERSIZE));
> +                       scsi_eh_cpy_sense(cmd, sts_entry->senseData,
> +
>   sensebytecnt);
>
>                         DEBUG2(printk("scsi%ld:%d:%d:%d: %s:
> sense key = %x, "
>                                       "ASC/ASCQ =
> %02x/%02x\n", ha->host_no,
> diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c
> index 72f6d80..f26b980 100644
> --- a/drivers/scsi/stex.c
> +++ b/drivers/scsi/stex.c
> @@ -33,6 +33,7 @@
>  #include <scsi/scsi_host.h>
>  #include <scsi/scsi_tcq.h>
>  #include <scsi/scsi_dbg.h>
> +#include <scsi/scsi_eh.h>
>
>  #define DRV_NAME "stex"
>  #define ST_DRIVER_VERSION "3.6.0000.1"
> @@ -290,8 +291,6 @@ struct st_ccb {
>         struct req_msg *req;
>         struct scsi_cmnd *cmd;
>
> -       void *sense_buffer;
> -       unsigned int sense_bufflen;
>         int sg_count;
>
>         u32 req_type;
> @@ -364,13 +363,18 @@ static struct status_msg
> *stex_get_status(struct st_hba *hba)
>
>  static void stex_set_sense(struct scsi_cmnd *cmd, u8 sk, u8
> asc, u8 ascq)
>  {
> +       u8 sense_buffer[14];
> +
> +       memset(sense_buffer, 0, sizeof(sense_buffer));
>         cmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
>
> -       cmd->sense_buffer[0] = 0x70;    /* fixed format, current */
> -       cmd->sense_buffer[2] = sk;
> -       cmd->sense_buffer[7] = 18 - 8;  /* additional sense length */
> -       cmd->sense_buffer[12] = asc;
> -       cmd->sense_buffer[13] = ascq;
> +       sense_buffer[0] = 0x70;    /* fixed format, current */
> +       sense_buffer[2] = sk;
> +       sense_buffer[7] = 18 - 8;  /* additional sense length */
> +       sense_buffer[12] = asc;
> +       sense_buffer[13] = ascq;
> +
> +       scsi_eh_cpy_sense(cmd, sense_buffer, sizeof(sense_buffer));
>  }
>
>  static void stex_invalid_field(struct scsi_cmnd *cmd,
> @@ -642,8 +646,6 @@ stex_queuecommand(struct scsi_cmnd *cmd,
> void (* done)(struct scsi_cmnd *))
>         memcpy(req->cdb, cmd->cmnd, STEX_CDB_LENGTH);
>
>         hba->ccb[tag].cmd = cmd;
> -       hba->ccb[tag].sense_bufflen = SCSI_SENSE_BUFFERSIZE;
> -       hba->ccb[tag].sense_buffer = cmd->sense_buffer;
>         hba->ccb[tag].req_type = 0;
>
>         if (cmd->sc_data_direction != DMA_NONE)
> @@ -699,15 +701,14 @@ static void stex_copy_data(struct st_ccb *ccb,
>         struct status_msg *resp, unsigned int variable)
>  {
>         size_t count = variable;
> +
> +       if (ccb->cmd == NULL)
> +               return;
>         if (resp->scsi_status != SAM_STAT_GOOD) {
> -               if (ccb->sense_buffer != NULL)
> -                       memcpy(ccb->sense_buffer, resp->variable,
> -                               min(variable, ccb->sense_bufflen));
> +               scsi_eh_cpy_sense(ccb->cmd, resp->variable, variable);
>                 return;
>         }
>
> -       if (ccb->cmd == NULL)
> -               return;
>         stex_internal_copy(ccb->cmd,
>                 resp->variable, &count, ccb->sg_count, ST_TO_CMD);
>  }
> @@ -1295,8 +1296,6 @@ static void stex_hba_stop(struct st_hba *hba)
>
>         hba->ccb[tag].cmd = NULL;
>         hba->ccb[tag].sg_count = 0;
> -       hba->ccb[tag].sense_bufflen = 0;
> -       hba->ccb[tag].sense_buffer = NULL;
>         hba->ccb[tag].req_type |= PASSTHRU_REQ_TYPE;
>
>         stex_send_cmd(hba, req, tag);
> --
> 1.5.3.3
>
> -
> 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
>
-
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