DragonFlyBSD Kernel Audit
DF-0791 / panic.txt
← back to finding ↓ download raw
=== Sibling lockmgr self-lock that blocks the live dive path (ntfs_ntlookupfile+0x57) ===
Captured from dfbsd-qemu/boot.log after `stat /mnt/ntfs/a` on the crafted image
(ntfs_0791.img, root-dir INDEX_ROOT entry "zzzzzz" SUBNODE reclen=0xFFFF).
This panic fires at the TOP of ntfs_ntlookupfile (inlined ntfs_ntget ->
LOCKMGR(&ip->i_lock, LK_EXCLUSIVE)), BEFORE the INDEX_ROOT walk and the
subnode dive (cn read at +0x2c0). It is a separate NTFS directory-lookup
defect (not DF-0791) that makes the DF-0791 dive latent on this kernel.

panic: lockmgr: locking against itself
lockmgr_exclusive() at lockmgr_exclusive+0x3e0 0xffffffff80647f30 
lockmgr_exclusive() at lockmgr_exclusive+0x3e0 0xffffffff80647f30 
ntfs_ntlookupfile() at ntfs_ntlookupfile+0x57 0xffffffff82604c27 
ntfs_lookup() at ntfs_lookup+0x63 0xffffffff82601e13 
Stopped at      Debugger+0x7c:  movb    $0,0xbdaf09(%rip)
db> 

Disassembly of ntfs_ntlookupfile (ntfs.ko, ntfs_ntlookupfile @ 0x4bd0):
    4c15:  addl   $0x1,0x70(%r14)        ; ip->i_usecount++   (inlined ntfs_ntget)
    4c1a:  lea    0x48(%r14),%rdi        ; &ip->i_lock
    4c22:  callq  4c27                   ; -> lockmgr(LK_EXCLUSIVE)  [+0x57 = self-lock]
    4c27:  ...                           ; (return addr = ntfs_ntlookupfile+0x57)
    4c40:  callq  (ntfs_ntvattrget NTFS_A_INDXROOT=0x90)   ; [+0x75] INDEX_ROOT fetch is AFTER the panic

The dive (cn = *(cn_t*)(rdbuf+aoff+reclen-8)) is at +0x2c0, far past the panic point.