|
@@ -626,7 +626,7 @@ static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd)
|
|
|
* @scmd: SCSI command structure to hijack
|
|
|
* @ses: structure to save restore information
|
|
|
* @cmnd: CDB to send. Can be NULL if no new cmnd is needed
|
|
|
- * @cmnd_size: size in bytes of @cmnd
|
|
|
+ * @cmnd_size: size in bytes of @cmnd (must be <= BLK_MAX_CDB)
|
|
|
* @sense_bytes: size of sense data to copy. or 0 (if != 0 @cmnd is ignored)
|
|
|
*
|
|
|
* This function is used to save a scsi command information before re-execution
|
|
@@ -648,12 +648,14 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
|
|
|
* command.
|
|
|
*/
|
|
|
ses->cmd_len = scmd->cmd_len;
|
|
|
- memcpy(ses->cmnd, scmd->cmnd, sizeof(scmd->cmnd));
|
|
|
+ ses->cmnd = scmd->cmnd;
|
|
|
ses->data_direction = scmd->sc_data_direction;
|
|
|
ses->sdb = scmd->sdb;
|
|
|
ses->next_rq = scmd->request->next_rq;
|
|
|
ses->result = scmd->result;
|
|
|
|
|
|
+ scmd->cmnd = ses->eh_cmnd;
|
|
|
+ memset(scmd->cmnd, 0, BLK_MAX_CDB);
|
|
|
memset(&scmd->sdb, 0, sizeof(scmd->sdb));
|
|
|
scmd->request->next_rq = NULL;
|
|
|
|
|
@@ -665,14 +667,13 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
|
|
|
scmd->sdb.table.sgl = &ses->sense_sgl;
|
|
|
scmd->sc_data_direction = DMA_FROM_DEVICE;
|
|
|
scmd->sdb.table.nents = 1;
|
|
|
- memset(scmd->cmnd, 0, sizeof(scmd->cmnd));
|
|
|
scmd->cmnd[0] = REQUEST_SENSE;
|
|
|
scmd->cmnd[4] = scmd->sdb.length;
|
|
|
scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]);
|
|
|
} else {
|
|
|
scmd->sc_data_direction = DMA_NONE;
|
|
|
if (cmnd) {
|
|
|
- memset(scmd->cmnd, 0, sizeof(scmd->cmnd));
|
|
|
+ BUG_ON(cmnd_size > BLK_MAX_CDB);
|
|
|
memcpy(scmd->cmnd, cmnd, cmnd_size);
|
|
|
scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]);
|
|
|
}
|
|
@@ -705,7 +706,7 @@ void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, struct scsi_eh_save *ses)
|
|
|
* Restore original data
|
|
|
*/
|
|
|
scmd->cmd_len = ses->cmd_len;
|
|
|
- memcpy(scmd->cmnd, ses->cmnd, sizeof(scmd->cmnd));
|
|
|
+ scmd->cmnd = ses->cmnd;
|
|
|
scmd->sc_data_direction = ses->data_direction;
|
|
|
scmd->sdb = ses->sdb;
|
|
|
scmd->request->next_rq = ses->next_rq;
|
|
@@ -1774,8 +1775,8 @@ scsi_reset_provider(struct scsi_device *dev, int flag)
|
|
|
scmd->request = &req;
|
|
|
memset(&scmd->eh_timeout, 0, sizeof(scmd->eh_timeout));
|
|
|
|
|
|
- memset(&scmd->cmnd, '\0', sizeof(scmd->cmnd));
|
|
|
-
|
|
|
+ scmd->cmnd = req.cmd;
|
|
|
+
|
|
|
scmd->scsi_done = scsi_reset_provider_done_command;
|
|
|
memset(&scmd->sdb, 0, sizeof(scmd->sdb));
|
|
|
|