diff -ur orig/drivers/scsi/scsi.c linux-rpc/drivers/scsi/scsi.c --- orig/drivers/scsi/scsi.c Mon Aug 5 13:31:23 2002 +++ linux-rpc/drivers/scsi/scsi.c Tue Sep 24 13:03:32 2002 @@ -1330,14 +1330,10 @@ */ int scsi_retry_command(Scsi_Cmnd * SCpnt) { - memcpy((void *) SCpnt->cmnd, (void *) SCpnt->data_cmnd, - sizeof(SCpnt->data_cmnd)); - SCpnt->request_buffer = SCpnt->buffer; - SCpnt->request_bufflen = SCpnt->bufflen; - SCpnt->use_sg = SCpnt->old_use_sg; - SCpnt->cmd_len = SCpnt->old_cmd_len; - SCpnt->sc_data_direction = SCpnt->sc_old_data_direction; - SCpnt->underflow = SCpnt->old_underflow; + /* + * Restore the SCSI command state. + */ + scsi_setup_cmd_retry(SCpnt); /* * Zero the sense information from the last time we tried diff -ur orig/drivers/scsi/scsi.h linux-rpc/drivers/scsi/scsi.h --- orig/drivers/scsi/scsi.h Mon Aug 5 13:31:23 2002 +++ linux-rpc/drivers/scsi/scsi.h Tue Sep 24 15:57:54 2002 @@ -474,6 +474,7 @@ int sectors); extern struct Scsi_Device_Template *scsi_get_request_dev(struct request *); extern int scsi_init_cmd_errh(Scsi_Cmnd * SCpnt); +extern void scsi_setup_cmd_retry(Scsi_Cmnd *SCpnt); extern int scsi_insert_special_cmd(Scsi_Cmnd * SCpnt, int); extern void scsi_io_completion(Scsi_Cmnd * SCpnt, int good_sectors, int block_sectors); diff -ur orig/drivers/scsi/scsi_error.c linux-rpc/drivers/scsi/scsi_error.c --- orig/drivers/scsi/scsi_error.c Mon Aug 5 13:31:24 2002 +++ linux-rpc/drivers/scsi/scsi_error.c Wed Sep 25 13:52:26 2002 @@ -385,15 +385,7 @@ */ STATIC int scsi_eh_retry_command(Scsi_Cmnd * SCpnt) { - memcpy((void *) SCpnt->cmnd, (void *) SCpnt->data_cmnd, - sizeof(SCpnt->data_cmnd)); - SCpnt->request_buffer = SCpnt->buffer; - SCpnt->request_bufflen = SCpnt->bufflen; - SCpnt->use_sg = SCpnt->old_use_sg; - SCpnt->cmd_len = SCpnt->old_cmd_len; - SCpnt->sc_data_direction = SCpnt->sc_old_data_direction; - SCpnt->underflow = SCpnt->old_underflow; - + scsi_setup_cmd_retry(SCpnt); scsi_send_eh_cmnd(SCpnt, SCpnt->timeout_per_command); /* @@ -470,15 +462,8 @@ * When we eventually call scsi_finish, we really wish to complete * the original request, so let's restore the original data. (DB) */ - memcpy((void *) SCpnt->cmnd, (void *) SCpnt->data_cmnd, - sizeof(SCpnt->data_cmnd)); SCpnt->result = saved_result; - SCpnt->request_buffer = SCpnt->buffer; - SCpnt->request_bufflen = SCpnt->bufflen; - SCpnt->use_sg = SCpnt->old_use_sg; - SCpnt->cmd_len = SCpnt->old_cmd_len; - SCpnt->sc_data_direction = SCpnt->sc_old_data_direction; - SCpnt->underflow = SCpnt->old_underflow; + scsi_setup_cmd_retry(SCpnt); /* * Hey, we are done. Let's look to see what happened. @@ -522,14 +507,7 @@ * When we eventually call scsi_finish, we really wish to complete * the original request, so let's restore the original data. (DB) */ - memcpy((void *) SCpnt->cmnd, (void *) SCpnt->data_cmnd, - sizeof(SCpnt->data_cmnd)); - SCpnt->request_buffer = SCpnt->buffer; - SCpnt->request_bufflen = SCpnt->bufflen; - SCpnt->use_sg = SCpnt->old_use_sg; - SCpnt->cmd_len = SCpnt->old_cmd_len; - SCpnt->sc_data_direction = SCpnt->sc_old_data_direction; - SCpnt->underflow = SCpnt->old_underflow; + scsi_setup_cmd_retry(SCpnt); /* * Hey, we are done. Let's look to see what happened. diff -ur orig/drivers/scsi/scsi_lib.c linux-rpc/drivers/scsi/scsi_lib.c --- orig/drivers/scsi/scsi_lib.c Mon Aug 5 13:31:24 2002 +++ linux-rpc/drivers/scsi/scsi_lib.c Tue Sep 24 17:27:00 2002 @@ -208,6 +208,30 @@ } /* + * Function: scsi_setup_cmd_retry() + * + * Purpose: Restore the command state for a retry + * + * Arguments: SCpnt - command to be restored + * + * Returns: Nothing + * + * Notes: Immediately prior to retrying a command, we need + * to restore certain fields that we saved above. + */ +void scsi_setup_cmd_retry(Scsi_Cmnd *SCpnt) +{ + memcpy((void *) SCpnt->cmnd, (void *) SCpnt->data_cmnd, + sizeof(SCpnt->data_cmnd)); + SCpnt->request_buffer = SCpnt->buffer; + SCpnt->request_bufflen = SCpnt->bufflen; + SCpnt->use_sg = SCpnt->old_use_sg; + SCpnt->cmd_len = SCpnt->old_cmd_len; + SCpnt->sc_data_direction = SCpnt->sc_old_data_direction; + SCpnt->underflow = SCpnt->old_underflow; +} + +/* * Function: scsi_queue_next_request() * * Purpose: Handle post-processing of completed commands.