NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/60795: LFS userland cleaner and umount can enter deadlock



>Number:         60795
>Category:       kern
>Synopsis:       LFS userland cleaner and umount can enter deadlock
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Sep 26 06:20:00 +0000 2026
>Originator:     Shinichi Doyashiki
>Release:        11.99.8 around 2026-09-26 14:00 JST
>Organization:
at home
>Environment:
etBSD kanade2.hq.csel.org 11.99.8 NetBSD 11.99.8 (KANADE2_12) #21: Sat Sep 26 14:10:54 JST 2026  clare%kanade2.hq.csel.org@localhost:/export/netbsd/debuglfs/src/sys/arch/amd64/compile/KANADE2_12 amd64

>Description:
LFS deadlock was observed while cycling mount/dd/rm/umount test.

db{0}> ps
PID     LID S CPU     FLAGS       STRUCT LWP *               NAME WAIT
(snip)
19034 19034 3   1         0   ffff9bff037be800       sshd-session mutex
21479 21479 3   1   1000000   ffff9bff0365e000             umount rwlock
22182 22182 3   1         0   ffff9bff0365e400       lfs_cleanerd fstchg
(snip)
0     21074 3   1       240   ffff9bff01c77000         lfs_writer mutex
(snip)
0    >  102 1   3       201   ffff9bfef726bc00             idle/3
(snip)
0    >   96 1   2       201   ffff9bfef717b400             idle/2
(snip)
0    >   25 1   1       201   ffff9c062fa54c00             idle/1
(snip)
0        12 3   0       200   ffff9c0630ab1800             lfsswq mutex
0        11 3   0       200   ffff9c0630ab1400             lfscwq lfscwq
(snip)
0    >    2 1   0       201   ffff9c0633b1d000             idle/0
0         0 3   0       200   ffffffff814648c0            swapper uvm

the umount process

db{0}> bt /a ffff9bff0365e000
trace: pid 21479 lid 21479 at 0xffffcc094754cc00
sleepq_block() at netbsd:sleepq_block+0xea
turnstile_block() at netbsd:turnstile_block+0x24b
rw_vector_enter() at netbsd:rw_vector_enter+0x161
lfs_prelock() at netbsd:lfs_prelock+0x86
lfs_seglock() at netbsd:lfs_seglock+0x16
lfs_segwrite() at netbsd:lfs_segwrite+0x71
lfs_flushfiles() at netbsd:lfs_flushfiles+0x1a4
lfs_unmount() at netbsd:lfs_unmount+0x27
VFS_UNMOUNT() at netbsd:VFS_UNMOUNT+0x22
dounmount() at netbsd:dounmount+0xa9
sys_unmount() at netbsd:sys_unmount+0x101
syscall() at netbsd:syscall+0x9d
--- syscall (number 22) ---
netbsd:syscall+0x9d:

the lfs_cleanerd (userland) process

db{0}> bt /a ffff9bff0365e400
trace: pid 22182 lid 22182 at 0xffffcc09486d4950
sleepq_block() at netbsd:sleepq_block+0xea
cv_wait() at netbsd:cv_wait+0xca
fstrans_start() at netbsd:fstrans_start+0x14c
VOP_BMAP() at netbsd:VOP_BMAP+0x48
lfs_strategy() at netbsd:lfs_strategy+0x3b3
VOP_STRATEGY() at netbsd:VOP_STRATEGY+0x64
bio_doread() at netbsd:bio_doread+0x5f
bread() at netbsd:bread+0x18
ino_func_setclean() at netbsd:ino_func_setclean+0x2f7
lfs_parse_pseg() at netbsd:lfs_parse_pseg+0x87f
lfs_rewrite_segments() at netbsd:lfs_rewrite_segments+0x3f6
lfs_fcntl() at netbsd:lfs_fcntl+0x15b3
VOP_FCNTL() at netbsd:VOP_FCNTL+0x6e
sys_fcntl() at netbsd:sys_fcntl+0x461
syscall() at netbsd:syscall+0x9d
--- syscall (number 92) ---
netbsd:syscall+0x9d:

the lfs_writer thread

db{0}> bt /a ffff9bff01c77000
trace: pid 0 lid 21074 at 0xffffcc094a0d4e60
sleepq_block() at netbsd:sleepq_block+0xea
turnstile_block() at netbsd:turnstile_block+0x24b
mutex_vector_enter() at netbsd:mutex_vector_enter+0x13f
cv_timedwait() at netbsd:cv_timedwait+0xde
lfs_writerd() at netbsd:lfs_writerd+0x3ad

db{0}> show locks
PID     LID CPU       STRUCT LWP *              OWNER BITS LOCK
19034 19034   1   ffff9bff037be800   ffff9bff0365e000    2 netbsd:vfs_suspend_lock
21479 21479   1   ffff9bff0365e000                 20    3 ffff9bff04a112b8
0     21074   1   ffff9bff01c77000   ffff9bff0365e000    2 netbsd:lfs_lock
0        12   0   ffff9c0630ab1800   ffff9bff0365e000    2 netbsd:lfs_lock

db{0}> call fstrans_dump(0)
Fstrans locks by lwp:
[ 1371.1778959] Fstrans state by mount:
[ 1371.1778959] /testlfs         owner 0xffff9bff0365e000 state suspended
0

>How-To-Repeat:
#!/bin/sh
#
# LFS umount while cleaner test 2
#
DISK=/dev/dk4
RDISK=/dev/rdk4

newfs_lfs -f4k -b32k $RDISK
mkdir -p /testlfs
count=0
while true; do
  count=`expr $count + 1`
  echo "===> MOUNT $count"
  if mount_lfs -u $DISK /testlfs; then
    echo "===> GOOD mount"
  else
    echo "===> BAD mount"
    exit 1
  fi
  echo "===> try file access"
  {
    cd /testlfs
    dd if=/dev/zero of=testfile1.bin bs=1m count=1
    #dd if=/dev/zero of=testfile2.bin bs=1m count=1
    #dd if=/dev/zero of=testfile3.bin bs=1m count=1
    #dd if=/dev/zero of=testfile4.bin bs=1m count=1
    #dd if=/dev/zero of=testfile5.bin bs=1m count=1
    #dd if=/dev/zero of=testfile6.bin bs=1m count=1
    #dd if=/dev/zero of=testfile7.bin bs=1m count=1
    #dd if=/dev/zero of=testfile8.bin bs=1m count=1
    rm testfile*.bin
    cd ..
  }
  echo "===> try umount"
  if umount /testlfs; then
    echo "===> GOOD umount"
  else
    echo "===> BAD umount"
    exit 1
  fi
  if fsck_lfs -nf $RDISK; then
    echo "===> GOOD fsck_lfs"
  else
    echo "===> BAD fsck_lfs"
    exit 1
  fi
done

>Fix:
unknown




Home | Main Index | Thread Index | Old Index