I think this also need to remove the abort_work field from struct scsi_cmnd. > } > > #ifdef CONFIG_SCSI_LOGGING > diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c > index 53e3343..2355100 100644 > --- a/drivers/scsi/scsi_error.c > +++ b/drivers/scsi/scsi_error.c > @@ -115,11 +115,9 @@ static int scsi_host_eh_past_deadline(struct Scsi_Host *shost) > * scmd_eh_abort_handler - Handle command aborts > * @work: command to be aborted. > */ > -void > -scmd_eh_abort_handler(struct work_struct *work) > +int > +scmd_eh_abort_handler(struct scsi_cmnd *scmd) > { > - struct scsi_cmnd *scmd = > - container_of(work, struct scsi_cmnd, abort_work.work); > struct scsi_device *sdev = scmd->device; > int rtn; > > @@ -127,42 +125,40 @@ static int scsi_host_eh_past_deadline(struct Scsi_Host *shost) > SCSI_LOG_ERROR_RECOVERY(3, > scmd_printk(KERN_INFO, scmd, > "eh timeout, not aborting\n")); > - } else { > - SCSI_LOG_ERROR_RECOVERY(3, > - scmd_printk(KERN_INFO, scmd, > - "aborting command\n")); > - rtn = scsi_try_to_abort_cmd(sdev->host->hostt, scmd); > - if (rtn == SUCCESS) { > - set_host_byte(scmd, DID_TIME_OUT); > - if (scsi_host_eh_past_deadline(sdev->host)) { > - SCSI_LOG_ERROR_RECOVERY(3, > - scmd_printk(KERN_INFO, scmd, > - "eh timeout, not retrying " > - "aborted command\n")); > - } else if (!scsi_noretry_cmd(scmd) && > - (++scmd->retries <= scmd->allowed)) { > - SCSI_LOG_ERROR_RECOVERY(3, > - scmd_printk(KERN_WARNING, scmd, > - "retry aborted command\n")); > - scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY); > - return; > - } else { > - SCSI_LOG_ERROR_RECOVERY(3, > - scmd_printk(KERN_WARNING, scmd, > - "finish aborted command\n")); > - scsi_finish_command(scmd); > - return; > - } > - } else { > + return FAILED; > + } > + SCSI_LOG_ERROR_RECOVERY(3, > + scmd_printk(KERN_INFO, scmd, > + "aborting command\n")); > + rtn = scsi_try_to_abort_cmd(sdev->host->hostt, scmd); > + if (rtn == SUCCESS) { If you restructure the function anywat this could become an early return / goto out.