function clear_disk_error() { local str=$(lsscsi | grep scsi_debug | grep $1 | awk '{print $1}') local scsi_id=${str#*\[} local scsi_id=${scsi_id%\]*} local error=/sys/kernel/debug/scsi_debug/$scsi_id/error local target_id=${scsi_id%\:*} tmpfile=$$_clear cat $error cat $error | grep -v Type | awk '{print $1,$3}' > $tmpfile while read -r line; do echo "- $line" > $error; done < $tmpfile rm -rf $tmpfile echo 0 > /sys/kernel/debug/scsi_debug/target$target_id/fail_reset } function disk_id() { local str=$(lsscsi | grep scsi_debug | grep $1 | awk '{print $1}') local scsi_id=${str#*\[} local scsi_id=${scsi_id%\]*} echo $error } function disk_target_id() { local str=$(lsscsi | grep scsi_debug | grep $1 | awk '{print $1}') local scsi_id=${str#*\[} local scsi_id=${scsi_id%\]*} local target_id=${scsi_id%\:*} echo $target_id } function disk_error() { local str=$(lsscsi | grep scsi_debug | grep $1 | awk '{print $1}') local scsi_id=${str#*\[} local scsi_id=${scsi_id%\]*} local error=/sys/kernel/debug/scsi_debug/$scsi_id/error echo $error } # time out and abort failed command # would trigger error recovery from timeout # $1: diskname # $2: command name # $3: rule time function inject_TIMEOUT_ABORT() { error=$(disk_error $1) echo "0 $3 $2" > ${error} echo "3 $3 $2" > ${error} } # finish command with DID_TIME_OUT # would trigger error recovery when command finihed in scsi_decide_position # $1: diskname # $2: command name # $3: rule time function inject_DID_TIME_OUT() { error=$(disk_error $1) echo "2 $3 $2 0x3 0 0 0 0 0" > ${error} } # finish command with LUN NOT READY, INITIALIZING COMMAND REQUIRED # would trigger error recovery when command finihed in scsi_check_sense # status: 0x2 # sense_key: 0x6 # asc: 0x4 # ascq: 0x2 # $1: diskname # $2: command name # $3: rule time function inject_LUN_NOT_READY() { error=$(disk_error $1) echo "2 $3 $2 0 0 0x2 0x6 0x4 0x2" > ${error} } # finish command with Medium Error # would not trigger error recovery but EIO is triggered # $1: diskname # $2: command name # $3: rule time function inject_MEDIUM_ERROR() { error=$(disk_error $1) echo "2 $3 $2 0 0 0x2 0x3 0x11 0x0" > ${error} } # device reset failed for 10 time # $1: disk name to inject, for example sda function recovery_inject1() { error=$(disk_error $1) echo "4 -10 0xff" > ${error} } # target failed for 10 time # $1: disk name to inject, for example sda function recovery_inject2() { target_id=$(disk_target_id $1) echo 1 > /sys/kernel/debug/scsi_debug/target$target_id/fail_reset } function recovery_inject3() { inject_DID_TIME_OUT $1 0x12 -10 } function recovery_inject4() { inject_LUN_NOT_READY $1 0x12 -10 } function recovery_inject5() { inject_TIMEOUT_ABORT $1 0x12 -10 } function recovery_inject6() { inject_DID_TIME_OUT $1 0x1b -10 } function recovery_inject7() { inject_LUN_NOT_READY $1 0x1b -10 } function recovery_inject8() { inject_TIMEOUT_ABORT $1 0x1b -10 } function error_inject1() { inject_TIMEOUT_ABORT $1 0x28 -10 } function error_inject2() { inject_TIMEOUT_ABORT $1 0xa8 -10 } function error_inject3() { inject_TIMEOUT_ABORT $1 0x88 -10 } function error_inject4() { inject_TIMEOUT_ABORT $1 0x2a -10 } function error_inject5() { inject_TIMEOUT_ABORT $1 0xaa -10 } function error_inject6() { inject_TIMEOUT_ABORT $1 0x8a -10 } function error_inject7() { inject_TIMEOUT_ABORT $1 0x28 1 } function error_inject8() { inject_TIMEOUT_ABORT $1 0xa8 1 } function error_inject9() { inject_TIMEOUT_ABORT $1 0x88 1 } function error_inject10() { inject_TIMEOUT_ABORT $1 0x2a 1 } function error_inject11() { inject_TIMEOUT_ABORT $1 0xaa 1 } function error_inject12() { inject_TIMEOUT_ABORT $1 0x8a 1 } function error_inject13() { inject_DID_TIME_OUT $1 0x28 -10 } function error_inject14() { inject_DID_TIME_OUT $1 0xa8 -10 } function error_inject15() { inject_DID_TIME_OUT $1 0x88 -10 } function error_inject16() { inject_DID_TIME_OUT $1 0x2a -10 } function error_inject17() { inject_DID_TIME_OUT $1 0xaa -10 } function error_inject18() { inject_DID_TIME_OUT $1 0x8a -10 } function error_inject19() { inject_DID_TIME_OUT $1 0x28 1 } function error_inject20() { inject_DID_TIME_OUT $1 0xa8 1 } function error_inject21() { inject_DID_TIME_OUT $1 0x88 1 } function error_inject22() { inject_DID_TIME_OUT $1 0x2a 1 } function error_inject23() { inject_DID_TIME_OUT $1 0xaa 1 } function error_inject24() { inject_DID_TIME_OUT $1 0x8a 1 } function error_inject25() { inject_LUN_NOT_READY $1 0x28 -10 } function error_inject26() { inject_LUN_NOT_READY $1 0xa8 -10 } function error_inject27() { inject_LUN_NOT_READY $1 0x88 -10 } function error_inject28() { inject_LUN_NOT_READY $1 0x2a -10 } function error_inject29() { inject_LUN_NOT_READY $1 0xaa -10 } function error_inject30() { inject_LUN_NOT_READY $1 0x8a -10 } function error_inject31() { inject_LUN_NOT_READY $1 0x28 1 } function error_inject32() { inject_LUN_NOT_READY $1 0xa8 1 } function error_inject33() { inject_LUN_NOT_READY $1 0x88 1 } function error_inject34() { inject_LUN_NOT_READY $1 0x2a 1 } function error_inject35() { inject_LUN_NOT_READY $1 0xaa 1 } function error_inject36() { inject_LUN_NOT_READY $1 0x8a 1 } function error_inject37() { inject_MEDIUM_ERROR $1 0x28 -10 } function error_inject38() { inject_MEDIUM_ERROR $1 0xa8 -10 } function error_inject39() { inject_MEDIUM_ERROR $1 0x88 -10 } function error_inject40() { inject_MEDIUM_ERROR $1 0x2a -10 } function error_inject41() { inject_MEDIUM_ERROR $1 0xaa -10 } function error_inject42() { inject_MEDIUM_ERROR $1 0x8a -10 } function error_inject43() { inject_MEDIUM_ERROR $1 0x28 1 } function error_inject44() { inject_MEDIUM_ERROR $1 0xa8 1 } function error_inject45() { inject_MEDIUM_ERROR $1 0x88 1 } function error_inject46() { inject_MEDIUM_ERROR $1 0x2a 1 } function error_inject47() { inject_MEDIUM_ERROR $1 0xaa 1 } function error_inject48() { inject_MEDIUM_ERROR $1 0x8a 1 }