Hello Roland,

[adding upstream to Cc: so adding some context first:]

In Debian bug #1107479 you report that inserting a DVD-RAM reliably
makes blkid (which is triggered by udev) result in a process hang.

On Thu, Jun 19, 2025 at 05:05:07PM +0200, Roland Sommer wrote:
> > Can you easily tell if this happens for several DVD-RAMs or just a
> > single one? (That might affect how good this is reproducible for
> > upstream.)
> 
> I've tested 3 different DVD-RAMs, thus, 3 traces below.
> 
> > Usually only the first one is interesting. After that the state of the
> > system is broken and the info from later traces is unreliable.
> > 
> > So yes, please provide (at least) the first trace output.
> 
> [  330.049632] pktcdvd: pktcdvd0: writer mapped to sr0
> [...]
> [  484.389280]  </TASK>

Translating the addresses here to line numbers yields:

[  330.049632] pktcdvd: pktcdvd0: writer mapped to sr0
[  330.074390] sr0: detected capacity change from 8946816 to 8946812
[  484.388532] INFO: task blkid:1979 blocked for more than 120 seconds.
[  484.388562]       Tainted: G          I        6.1.0-37-amd64 #1 Debian 
6.1.140-1
[  484.388577] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this 
message.
[  484.388585] task:blkid           state:D stack:0     pid:1979  ppid:1768   
flags:0x00004002
[  484.388610] Call Trace:
[  484.388618]  <TASK>
[  484.388634] __schedule (kernel/sched/core.c:5244 kernel/sched/core.c:6561)
[  484.388682] schedule (arch/x86/include/asm/bitops.h:207 (discriminator 1) 
arch/x86/include/asm/bitops.h:239 (discriminator 1) 
include/asm-generic/bitops/instrumented-non-atomic.h:142 (discriminator 1) 
include/linux/thread_info.h:118 (discriminator 1) include/linux/sched.h:2230 
(discriminator 1) kernel/sched/core.c:6639 (discriminator 1))
[  484.388706] schedule_preempt_disabled (arch/x86/include/asm/preempt.h:80 
kernel/sched/core.c:6697)
[  484.388728] __mutex_lock.constprop.0 (kernel/locking/mutex.c:197 
kernel/locking/mutex.c:681 kernel/locking/mutex.c:747)
[  484.388761] pkt_ioctl (drivers/block/pktcdvd.c:2590) pktcdvd
[  484.388813] pkt_ioctl (drivers/block/pktcdvd.c:2610) pktcdvd
[  484.388853] ? tomoyo_init_request_info (security/tomoyo/util.c:1026)
[  484.388876] blkdev_ioctl (block/ioctl.c:620)
[  484.388896] __x64_sys_ioctl (fs/ioctl.c:51 fs/ioctl.c:870 fs/ioctl.c:856 
fs/ioctl.c:856)
[  484.388920] do_syscall_64 (arch/x86/entry/common.c:51 
arch/x86/entry/common.c:81)
[  484.388947] ? mutex_lock (arch/x86/include/asm/atomic64_64.h:190 
include/linux/atomic/atomic-long.h:443 
include/linux/atomic/atomic-instrumented.h:1781 kernel/locking/mutex.c:171 
kernel/locking/mutex.c:285)
[  484.388969] ? pkt_ioctl (drivers/block/pktcdvd.c:2619) pktcdvd
[  484.389013] ? blkdev_ioctl (block/ioctl.c:620)
[  484.389030] ? exit_to_user_mode_prepare 
(arch/x86/include/asm/entry-common.h:57 kernel/entry/common.c:212)
[  484.389053] ? syscall_exit_to_user_mode (kernel/entry/common.c:306)
[  484.389067] ? do_syscall_64 (arch/x86/entry/common.c:88)
[  484.389089] ? handle_mm_fault (mm/memory.c:5295)
[  484.389117] ? do_user_addr_fault (arch/x86/mm/fault.c:1369)
[  484.389141] ? exit_to_user_mode_prepare 
(arch/x86/include/asm/entry-common.h:57 kernel/entry/common.c:212)
[  484.389161] entry_SYSCALL_64_after_hwframe 
(/build/reproducible-path/linux-6.1.140/arch/x86/entry/entry_64.S:121)
[  484.389181] RIP: 0033:0x7fce32c8ed1b
[  484.389196] RSP: 002b:00007ffd2857ee10 EFLAGS: 00000246 ORIG_RAX: 
0000000000000010
[  484.389215] RAX: ffffffffffffffda RBX: 0000557da4646b40 RCX: 00007fce32c8ed1b
[  484.389226] RDX: 00007ffd2857ee90 RSI: 0000000000005395 RDI: 0000000000000006
[  484.389235] RBP: 0000000000000006 R08: 0000000000000007 R09: 0000557da4646a50
[  484.389245] R10: 525ee8f48e4e6f05 R11: 0000000000000246 R12: 0000000000000000
[  484.389255] R13: 0000000000000000 R14: 0000000000000000 R15: 8000000068541db5
[  484.389280]  </TASK>

blkdev_ioctl calls:

        bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg);

Obviously we have bdev->bd_disk->fops->ioctl == pkt_ioctl and this
function then calls itself in line 2610 with:

        ret = bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg);

So this explains the hang as the second instance of pkt_ioctl wants to
grab the mutex that the first is already holding.

A quick look over the commits since 6.1 to current mainline shows no
change that looks relevant.

In current linus/master (5c8013ae2e86) both functions still have these
calls, so I assume newer kernels are affected in the same way.

Best regards
Uwe

Attachment: signature.asc
Description: PGP signature

Reply via email to