From a76c96d3610a78b99e74e467acbbbc51a2b13634 Mon Sep 17 00:00:00 2001 From: Guilhem Moulin Date: Fri, 15 Jul 2022 18:10:20 +0200 Subject: [PATCH] unit-wipe-test: Wait a bit so scsi_debug has a chance to fully initialize. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On my test system `tests/unit-wipe-test` fails (as root) due to a race condition in add_device(): root@host:~# ./unit-wipe-test [1] Wipe full file [0/DIO][0][1048576/DIO][1048576][4194304/DIO][4194304][OK] [2] Wipe blocks in file [0/DIO][0][1048576/DIO][1048576][4194304/DIO][4194304][OK] [ 105.828258] scsi_debug:sdebug_driver_probe: scsi_debug: trim poll_queues to 0. poll_q/nr_hw = (0/1) [ 105.830450] scsi host2: scsi_debug: version 0191 [20210520] [ 105.830450] dev_size_mb=8, opts=0x0, submit_queues=1, statistics=0 [ 105.832924] scsi 2:0:0:0: Direct-Access Linux scsi_debug 0191 PQ: 0 ANSI: 7 [ 105.835417] scsi 2:0:0:0: Attached scsi generic sg1 type 0 FAIL Cannot find /dev/. FAILED backtrace: 48 ./unit-wipe-test 144 main ./unit-wipe-test [ 105.875131] sd 2:0:0:0: Power-on or device reset occurred [ 105.876069] sd 2:0:0:0: [sda] 16384 512-byte logical blocks: (8.39 MB/8.00 MiB) [ 105.877190] sd 2:0:0:0: [sda] Write Protect is off [ 105.878002] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, supports DPO and FUA [ 105.879619] sd 2:0:0:0: [sda] Optimal transfer size 524288 bytes [ 105.914222] sd 2:0:0:0: [sda] Attached SCSI disk [ 106.866296] sd 2:0:0:0: [sda] Synchronizing SCSI cache Observe how the “Power-on or device reset occurred” event occurs only after add_device() has returned. Interestingly, for subsequent runs the delay appears to be much shorter and doesn't trigger the race condition: root@host:~# ./unit-wipe-test [1] Wipe full file [0/DIO][0][1048576/DIO][1048576][4194304/DIO][4194304][OK] [2] Wipe blocks in file [0/DIO][0][1048576/DIO][1048576][4194304/DIO][4194304][OK] [ 130.639855] scsi_debug:sdebug_driver_probe: scsi_debug: trim poll_queues to 0. poll_q/nr_hw = (0/1) [ 130.641463] scsi host2: scsi_debug: version 0191 [20210520] [ 130.641463] dev_size_mb=8, opts=0x0, submit_queues=1, statistics=0 [ 130.643809] scsi 2:0:0:0: Direct-Access Linux scsi_debug 0191 PQ: 0 ANSI: 7 [ 130.645342] sd 2:0:0:0: Power-on or device reset occurred [ 130.646364] sd 2:0:0:0: [sda] 16384 512-byte logical blocks: (8.39 MB/8.00 MiB) [ 130.647585] sd 2:0:0:0: [sda] Write Protect is off [ 130.648428] sd 2:0:0:0: Attached scsi generic sg1 type 0 [ 130.649339] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, supports DPO and FUA [ 130.650763] sd 2:0:0:0: [sda] Optimal transfer size 524288 bytes [ 130.682223] sd 2:0:0:0: [sda] Attached SCSI disk [3] Wipe full block device [0/DIO][0][1048576/DIO][1048576][4194304/DIO][4194304][OK] [4] Wipe blocks in block device [0/DIO][0][1048576/DIO][1048576][4194304/DIO][4194304][OK] [ 137.858283] sd 2:0:0:0: [sda] Synchronizing SCSI cache This commit adds an optional 2s delay if scsi_debug hasn't shown up in sysfs after the modprobe call. --- tests/unit-wipe-test | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit-wipe-test b/tests/unit-wipe-test index 7d28da25..d6663acf 100755 --- a/tests/unit-wipe-test +++ b/tests/unit-wipe-test @@ -43,6 +43,7 @@ function add_device() echo "This kernel seems to not support proper scsi_debug module, test skipped." exit 77 fi + grep -q scsi_debug /sys/block/*/device/model || sleep 2 DEV=$(grep -l -e scsi_debug /sys/block/*/device/model | cut -f4 -d /) DEV="/dev/$DEV" [ -b $DEV ] || fail "Cannot find $DEV."