diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 48c530b83000e..52fda87f5d674 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1366,13 +1366,13 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
if (partscan) lo->lo_disk->flags &= ~GENHD_FL_NO_PART_SCAN;
- /* enable and uncork uevent now that we are done */
- dev_set_uevent_suppress(disk_to_dev(lo->lo_disk), 0);
- loop_global_unlock(lo, is_loop);
if (partscan) loop_reread_partitions(lo);
+ /* enable and uncork uevent now that we are done */
+ dev_set_uevent_suppress(disk_to_dev(lo->lo_disk), 0);
+
if (!(mode & FMODE_EXCL)) bd_abort_claiming(bdev, loop_configure);
I ran the above test: /autopkgtest. ubuntu. com/results/ autopkgtest- jammy-dannf- test/jammy/ amd64/l/ livecd- rootfs/ 20240123_ 035147_ 6470b@/ log.gz
https:/
It does appear that systemd-udevd is trying to scan partitions at the same time as losetup:
1599s ++ losetup --show -f -P -v binary/ boot/disk- uefi.ext4 /dev/loop0 dev_mapper= /dev/loop0p1 debug/tracing/ trace in-buffer/ entries- written: 2/2 #P:4 reread_ partitions
1600s + loop_device=
1600s + '[' '!' -b /dev/loop0 ']'
1600s + rootfs_
1600s + '[' '!' -b /dev/loop0p1 ']'
1600s + echo '/dev/loop0p1 is not a block device'
1600s /dev/loop0p1 is not a block device
1600s + echo '=== dmesg ==='
1600s === dmesg ===
1600s + dmesg -c
1600s [ 986.014824] EXT4-fs (loop0p1): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
1600s [ 992.684380] EXT4-fs (loop0p1): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
1600s [ 1043.171603] loop0: detected capacity change from 0 to 4612096
1600s [ 1043.171924] loop0: p1 p14 p15
1600s [ 1043.190421] loop0: p1 p14 p15
1600s + cat /sys/kernel/
1600s # tracer: function
1600s #
1600s # entries-
1600s #
1600s # _-----=> irqs-off
1600s # / _----=> need-resched
1600s # | / _---=> hardirq/softirq
1600s # || / _--=> preempt-depth
1600s # ||| / _-=> migrate-disable
1600s # |||| / delay
1600s # TASK-PID CPU# ||||| TIMESTAMP FUNCTION
1600s # | | | ||||| | |
1600s losetup-50167 [002] ..... 1043.176845: bdev_disk_changed <-loop_
1600s systemd-udevd-321 [000] ..... 1043.195003: bdev_disk_changed <-blkdev_get_whole
1600s + echo 0
1600s + ls -l /dev/loop0p1
1600s brw------- 1 root root 259, 3 Jan 23 03:51 /dev/loop0p1
1600s + exit 1
1600s + clean_loops
Maybe we just need something like this?
diff --git a/drivers/ block/loop. c b/drivers/ block/loop. c .52fda87f5d674 100644 block/loop. c block/loop. c struct loop_device *lo, fmode_t mode,
lo->lo_ disk->flags &= ~GENHD_ FL_NO_PART_ SCAN;
index 48c530b83000e.
--- a/drivers/
+++ b/drivers/
@@ -1366,13 +1366,13 @@ static int loop_configure(
if (partscan)
- /* enable and uncork uevent now that we are done */ uevent_ suppress( disk_to_ dev(lo- >lo_disk) , 0);
loop_global_ unlock( lo, is_loop);
loop_ reread_ partitions( lo);
- dev_set_
-
if (partscan)
+ /* enable and uncork uevent now that we are done */ uevent_ suppress( disk_to_ dev(lo- >lo_disk) , 0);
bd_abort_ claiming( bdev, loop_configure);
+ dev_set_
+
if (!(mode & FMODE_EXCL))