• Bart Van Assche's avatar
    scsi: remove two cancel_delayed_work() calls from the mid-layer · fcc95a76
    Bart Van Assche authored
    scsi_put_command() is either invoked before blk_start_request() or
    after block layer processing has completed.  scsi_cmnd.abort_work
    is scheduled from inside the SCSI timeout handler.  The block layer
    guarantees that either the regular completion handler
    (softirq_done_fn()) or the timeout handler (rq_timed_out_fn()) is
    invoked but not both. This means that scsi_put_command() is never
    invoked while abort_work is scheduled.  Hence remove the
    cancel_delayed_work() call from scsi_put_command().
    
    Similarly, scsi_abort_command() is only invoked from the SCSI
    timeout handler. If scsi_abort_command() is invoked for a SCSI
    command with the SCSI_EH_ABORT_SCHEDULED flag set this means that
    scmd_eh_abort_handler() has already invoked scsi_queue_insert() and
    hence that scsi_cmnd.abort_work is no longer pending. Hence also
    remove the cancel_delayed_work() call from scsi_abort_command().
    Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    fcc95a76
scsi_error.c 69.7 KB