lkml.org 
[lkml]   [2023]   [Sep]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 04/10] scsi: scsi_debug: timeout command if the error is injected
    Date
    If a timeout error is injected, return 0 from scsi_debug_queuecommand to
    make the command timeout.

    Timeout SCSI command format:
    +--------+------+-------------------------------------------------------+
    | Column | Type | Description |
    +--------+------+-------------------------------------------------------+
    | 1 | u8 | Error type, fixed to 0x0 |
    +--------+------+-------------------------------------------------------+
    | 2 | s32 | Error count |
    | | | 0: this rule will be ignored |
    | | | positive: the rule will always take effect |
    | | | negative: the rule takes effect n times where -n is |
    | | | the value given. Ignored after n times |
    +--------+------+-------------------------------------------------------+
    | 3 | x8 | SCSI command opcode, 0xff for all commands |
    +--------+------+-------------------------------------------------------+
    Examples:
    error=/sys/kernel/debug/scsi_debug/0:0:0:1/error
    echo "0 -10 0x12" > ${error}
    will make the device's inquiry command timeout 10 times.
    echo "0 1 0x12" > ${error}
    will make the device's inquiry timeout each time it is invoked on this
    device.

    Acked-by: Douglas Gilbert <dgilbert@interlog.com>
    Signed-off-by: Wenchao Hao <haowenchao2@huawei.com>
    ---
    drivers/scsi/scsi_debug.c | 34 ++++++++++++++++++++++++++++++++++
    1 file changed, 34 insertions(+)

    diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
    index 6235e828c430..785ad5e5b4a4 100644
    --- a/drivers/scsi/scsi_debug.c
    +++ b/drivers/scsi/scsi_debug.c
    @@ -7731,6 +7731,34 @@ static int sdebug_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
    return num_entries;
    }

    +static int sdebug_timeout_cmd(struct scsi_cmnd *cmnd)
    +{
    + struct scsi_device *sdp = cmnd->device;
    + struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
    + struct sdebug_err_inject *err;
    + unsigned char *cmd = cmnd->cmnd;
    + int ret = 0;
    +
    + if (devip == NULL)
    + return 0;
    +
    + rcu_read_lock();
    + list_for_each_entry_rcu(err, &devip->inject_err_list, list) {
    + if (err->type == ERR_TMOUT_CMD &&
    + (err->cmd == cmd[0] || err->cmd == 0xff)) {
    + ret = !!err->cnt;
    + if (err->cnt < 0)
    + err->cnt++;
    +
    + rcu_read_unlock();
    + return ret;
    + }
    + }
    + rcu_read_unlock();
    +
    + return 0;
    +}
    +
    static int scsi_debug_queuecommand(struct Scsi_Host *shost,
    struct scsi_cmnd *scp)
    {
    @@ -7789,6 +7817,12 @@ static int scsi_debug_queuecommand(struct Scsi_Host *shost,
    if (NULL == devip)
    goto err_out;
    }
    +
    + if (sdebug_timeout_cmd(scp)) {
    + scmd_printk(KERN_INFO, scp, "timeout command 0x%x\n", opcode);
    + return 0;
    + }
    +
    if (unlikely(inject_now && !atomic_read(&sdeb_inject_pending)))
    atomic_set(&sdeb_inject_pending, 1);

    --
    2.32.0
    \
     
     \ /
      Last update: 2023-09-22 16:27    [W:7.095 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site