On Fri, Sep 27, 2019 at 07:08:43AM +0900, Damien Le Moal wrote: > When a command is terminated with CHECK CONDITION and request sense > executed by hijacking the command descriptor, the original command resid > is lost and replaced with the resid from the execution of request sense. > If based on the obtained sense data the command is aborted and not > retried, the resid that will be seen by drivers such as sd will be the > resid of the request sense execution and not the value from the original > command failure. Make sure this does not happen by adding resid as part > of the command information saved using struct scsi_eh_save. > > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxx> > --- > drivers/scsi/scsi_error.c | 2 ++ > include/scsi/scsi_eh.h | 1 + > 2 files changed, 3 insertions(+) > > diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c > index 1c470e31ae81..d4ac13979189 100644 > --- a/drivers/scsi/scsi_error.c > +++ b/drivers/scsi/scsi_error.c > @@ -967,6 +967,7 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses, > ses->data_direction = scmd->sc_data_direction; > ses->sdb = scmd->sdb; > ses->result = scmd->result; > + ses->resid = scsi_get_resid(scmd); Don't we also need to reset the resid to 0 here as we do in the queuecommand path? That would take care of what you are trying to do for usb-storage in the next patch in generic code.