• John Garry's avatar
    scsi: scsi_debug: Get command abort feature working again · f037b5cb
    John Garry authored
    The command abort feature allows us to test aborting a command which has
    timed-out.
    
    The idea is that for specific commands we just don't call scsi_done() and
    allow the request to timeout, which ensures SCSI EH kicks-in we try to
    abort the command.
    
    Since commit 4a0c6f43 ("scsi: scsi_debug: Add new defer type for
    mq_poll") this does not seem to work. The issue is that we clear the
    sd_dp->aborted flag in schedule_resp() before the completion callback has
    run. When the completion callback actually runs, it calls scsi_done() as
    normal as sd_dp->aborted unset. This is all very racy.
    
    Fix by not clearing sd_dp->aborted in schedule_resp(). Also move the call
    to blk_abort_request() from schedule_resp() to sdebug_q_cmd_complete(),
    which makes the code have a more logical sequence.
    
    I also note that this feature only works for commands which are classed as
    "SDEG_RES_IMMED_MASK", but only practically triggered with prior RW
    commands. So for my experiment I need to run fio to trigger the error on
    the "nth" command (see inject_on_this_cmd()), and then run something like
    sg_sync to queue a command to actually trigger the abort.
    Signed-off-by: default avatarJohn Garry <john.g.garry@oracle.com>
    Acked-by: default avatarDouglas Gilbert <dgilbert@interlog.com>
    Link: https://lore.kernel.org/r/20230313093114.1498305-11-john.g.garry@oracle.comSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    f037b5cb
scsi_debug.c 228 KB