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 c6c0434d803..6bba23a2630 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -1037,6 +1037,7 @@ static void complete_scsi_command(struct CommandList *cp)  	unsigned char sense_key;  	unsigned char asc;      /* additional sense code */  	unsigned char ascq;     /* additional sense code qualifier */ +	unsigned long sense_data_size;  	ei = cp->err_info;  	cmd = (struct scsi_cmnd *) cp->scsi_cmd; @@ -1051,10 +1052,14 @@ static void complete_scsi_command(struct CommandList *cp)  	cmd->result |= ei->ScsiStatus;  	/* copy the sense data whether we need to or not. */ -	memcpy(cmd->sense_buffer, ei->SenseInfo, -		ei->SenseLen > SCSI_SENSE_BUFFERSIZE ? -			SCSI_SENSE_BUFFERSIZE : -			ei->SenseLen); +	if (SCSI_SENSE_BUFFERSIZE < sizeof(ei->SenseInfo)) +		sense_data_size = SCSI_SENSE_BUFFERSIZE; +	else +		sense_data_size = sizeof(ei->SenseInfo); +	if (ei->SenseLen < sense_data_size) +		sense_data_size = ei->SenseLen; + +	memcpy(cmd->sense_buffer, ei->SenseInfo, sense_data_size);  	scsi_set_resid(cmd, ei->ResidualCnt);  	if (ei->CommandStatus == 0) { @@ -2580,7 +2585,8 @@ static int hpsa_passthru_ioctl(struct ctlr_info *h, void __user *argp)  		c->SG[0].Ext = 0; /* we are not chaining*/  	}  	hpsa_scsi_do_simple_cmd_core(h, c); -	hpsa_pci_unmap(h->pdev, c, 1, PCI_DMA_BIDIRECTIONAL); +	if (iocommand.buf_size > 0) +		hpsa_pci_unmap(h->pdev, c, 1, PCI_DMA_BIDIRECTIONAL);  	check_ioctl_unit_attention(h, c);  	/* Copy the error information out */  |