diff options
Diffstat (limited to 'drivers/scsi/hpsa.c')
-rw-r--r-- | drivers/scsi/hpsa.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index c6c0434d8034..6bba23a26303 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c | |||
@@ -1037,6 +1037,7 @@ static void complete_scsi_command(struct CommandList *cp) | |||
1037 | unsigned char sense_key; | 1037 | unsigned char sense_key; |
1038 | unsigned char asc; /* additional sense code */ | 1038 | unsigned char asc; /* additional sense code */ |
1039 | unsigned char ascq; /* additional sense code qualifier */ | 1039 | unsigned char ascq; /* additional sense code qualifier */ |
1040 | unsigned long sense_data_size; | ||
1040 | 1041 | ||
1041 | ei = cp->err_info; | 1042 | ei = cp->err_info; |
1042 | cmd = (struct scsi_cmnd *) cp->scsi_cmd; | 1043 | cmd = (struct scsi_cmnd *) cp->scsi_cmd; |
@@ -1051,10 +1052,14 @@ static void complete_scsi_command(struct CommandList *cp) | |||
1051 | cmd->result |= ei->ScsiStatus; | 1052 | cmd->result |= ei->ScsiStatus; |
1052 | 1053 | ||
1053 | /* copy the sense data whether we need to or not. */ | 1054 | /* copy the sense data whether we need to or not. */ |
1054 | memcpy(cmd->sense_buffer, ei->SenseInfo, | 1055 | if (SCSI_SENSE_BUFFERSIZE < sizeof(ei->SenseInfo)) |
1055 | ei->SenseLen > SCSI_SENSE_BUFFERSIZE ? | 1056 | sense_data_size = SCSI_SENSE_BUFFERSIZE; |
1056 | SCSI_SENSE_BUFFERSIZE : | 1057 | else |
1057 | ei->SenseLen); | 1058 | sense_data_size = sizeof(ei->SenseInfo); |
1059 | if (ei->SenseLen < sense_data_size) | ||
1060 | sense_data_size = ei->SenseLen; | ||
1061 | |||
1062 | memcpy(cmd->sense_buffer, ei->SenseInfo, sense_data_size); | ||
1058 | scsi_set_resid(cmd, ei->ResidualCnt); | 1063 | scsi_set_resid(cmd, ei->ResidualCnt); |
1059 | 1064 | ||
1060 | if (ei->CommandStatus == 0) { | 1065 | if (ei->CommandStatus == 0) { |
@@ -2580,7 +2585,8 @@ static int hpsa_passthru_ioctl(struct ctlr_info *h, void __user *argp) | |||
2580 | c->SG[0].Ext = 0; /* we are not chaining*/ | 2585 | c->SG[0].Ext = 0; /* we are not chaining*/ |
2581 | } | 2586 | } |
2582 | hpsa_scsi_do_simple_cmd_core(h, c); | 2587 | hpsa_scsi_do_simple_cmd_core(h, c); |
2583 | hpsa_pci_unmap(h->pdev, c, 1, PCI_DMA_BIDIRECTIONAL); | 2588 | if (iocommand.buf_size > 0) |
2589 | hpsa_pci_unmap(h->pdev, c, 1, PCI_DMA_BIDIRECTIONAL); | ||
2584 | check_ioctl_unit_attention(h, c); | 2590 | check_ioctl_unit_attention(h, c); |
2585 | 2591 | ||
2586 | /* Copy the error information out */ | 2592 | /* Copy the error information out */ |