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 <bharrosh@xxxxxxxxxxx> --- 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 <support@xxxxxxxxxxxx>"); @@ -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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html