File: test_generic_15.sh

package info (click to toggle)
linux 6.19.6-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,760,712 kB
  • sloc: ansic: 27,010,185; asm: 273,400; sh: 151,347; python: 81,280; makefile: 58,564; perl: 34,311; xml: 21,064; cpp: 5,986; yacc: 4,841; lex: 2,901; awk: 1,707; sed: 30; ruby: 25
file content (68 lines) | stat: -rwxr-xr-x 2,142 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0

. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh

TID="generic_15"
ERR_CODE=0

_test_partition_scan_no_hang()
{
	local recovery_flag=$1
	local expected_state=$2
	local dev_id
	local state
	local daemon_pid
	local start_time
	local elapsed

	# Create ublk device with fault_inject target and very large delay
	# to simulate hang during partition table read
	# --delay_us 60000000 = 60 seconds delay
	# Use _add_ublk_dev_no_settle to avoid udevadm settle hang waiting
	# for partition scan events to complete
	if [ "$recovery_flag" = "yes" ]; then
		echo "Testing partition scan with recovery support..."
		dev_id=$(_add_ublk_dev_no_settle -t fault_inject -q 1 -d 1 --delay_us 60000000 -r 1)
	else
		echo "Testing partition scan without recovery..."
		dev_id=$(_add_ublk_dev_no_settle -t fault_inject -q 1 -d 1 --delay_us 60000000)
	fi

	_check_add_dev "$TID" $?

	# The add command should return quickly because partition scan is async.
	# Now sleep briefly to let the async partition scan work start and hit
	# the delay in the fault_inject handler.
	sleep 1

	# Kill the ublk daemon while partition scan is potentially blocked
	# And check state transitions properly
	start_time=${SECONDS}
	daemon_pid=$(_get_ublk_daemon_pid "${dev_id}")
	state=$(__ublk_kill_daemon "${dev_id}" "${expected_state}")
	elapsed=$((SECONDS - start_time))

	# Verify the device transitioned to expected state
	if [ "$state" != "${expected_state}" ]; then
		echo "FAIL: Device state is $state, expected ${expected_state}"
		ERR_CODE=255
		${UBLK_PROG} del -n "${dev_id}" > /dev/null 2>&1
		return
	fi
	echo "PASS: Device transitioned to ${expected_state} in ${elapsed}s without hanging"

	# Clean up the device
	${UBLK_PROG} del -n "${dev_id}" > /dev/null 2>&1
}

_prep_test "partition_scan" "verify async partition scan prevents IO hang"

# Test 1: Without recovery support - should transition to DEAD
_test_partition_scan_no_hang "no" "DEAD"

# Test 2: With recovery support - should transition to QUIESCED
_test_partition_scan_no_hang "yes" "QUIESCED"

_cleanup_test "partition_scan"
_show_result $TID $ERR_CODE