• Wenchao Hao's avatar
    scsi: scsi_debug: Add interface to manage error injection for a single device · a9996d72
    Wenchao Hao authored
    This new facility uses the debugfs pseudo file system which is typically
    mounted under the /sys/kernel/debug directory and requires root permissions
    to access.
    
    The interface file is found at /sys/kernel/debug/scsi_debug/<h:c:t:l>/error
    where <h:c:t:l> identifies the device (logical unit (LU)) to inject errors
    on.
    
    For the following description the ${error} environment variable is assumed
    to be set to/sys/kernel/debug/scsi_debug/1:0:0:0/error where 1:0:0:0 is a
    pseudo device (LU) owned by the scsi_debug driver. Rules are written to
    ${error} in the normal sysfs fashion (e.g. 'echo "0 -2 0x12" > ${error}').
    
    More than one rule can be active on a device at a time and inactive rules
    (i.e. those whose error count is 0) remain in the rule listing. The
    existing rules can be read with 'cat ${error}' with oneline output for each
    rule.
    
    The interface format is line-by-line, each line is an error injection rule.
    Each rule contains integers separated by spaces, the first three columns
    correspond to "Error code", "Error count" and "SCSI command", other
    columns depend on Error code.
    
    General rule format:
      +--------+------+-------------------------------------------------------+
      | Column | Type | Description                                           |
      +--------+------+-------------------------------------------------------+
      |   1    |  u8  | Error code                                            |
      |        |      |  0: timeout SCSI command                              |
      |        |      |  1: fail queuecommand, make queuecommand return       |
      |        |      |     given value                                       |
      |        |      |  2: fail command, finish command with SCSI status,    |
      |        |      |     sense key and ASC/ASCQ values                     |
      |        |      |  3: make abort commands for specific command fail     |
      |        |      |  4: make reset lun for specific command fail          |
      +--------+------+-------------------------------------------------------+
      |   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            |
      +--------+------+-------------------------------------------------------+
      |  ...   |  xxx | Error type specific fields                            |
      +--------+------+-------------------------------------------------------+
    
    Notes:
    
     - When multiple error inject rules are added for the same SCSI command,
       the one with smaller error code will take effect (and the others will be
       ignored).
    
     - If the same error (i.e. same Error code and SCSI command) is added, the
       older one will be overwritten..
    
     - Currently, the basic types are (u8/u16/u32/u64/s8/s16/s32/s64) and the
       hexadecimal types (x8/x16/x32/x64).
    
     - Where a hexadecimal value is expected (e.g. Column 3: SCSI command
       opcode) the "0x" prefix is optional on the value (e.g. the INQUIRY
       opcode can be given as '0x12' or '12').
    
     - When the Error count is negative, reading ${error} will show that value
       incrementing, stopping when it gets to 0.
    Acked-by: default avatarDouglas Gilbert <dgilbert@interlog.com>
    Signed-off-by: default avatarWenchao Hao <haowenchao2@huawei.com>
    Link: https://lore.kernel.org/r/20231010092051.608007-3-haowenchao2@huawei.comSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    a9996d72
scsi_debug.c 231 KB