Revision 6946bd636364effce06ea46fe8f8cd6e2edb004e authored by Peter Zijlstra on 27 August 2006, 08:23:31 UTC, committed by Linus Torvalds on 27 August 2006, 18:01:29 UTC
On Wed, 2006-08-09 at 07:57 +0200, Rolf Eike Beer wrote:
> =============================================
> [ INFO: possible recursive locking detected ]
> ---------------------------------------------
> parted/7929 is trying to acquire lock:
>  (&bdev->bd_mutex){--..}, at: [<c105eb8d>] __blkdev_put+0x1e/0x13c
>
> but task is already holding lock:
>  (&bdev->bd_mutex){--..}, at: [<c105eec6>] do_open+0x72/0x3a8
>
> other info that might help us debug this:
> 1 lock held by parted/7929:
>  #0:  (&bdev->bd_mutex){--..}, at: [<c105eec6>] do_open+0x72/0x3a8
> stack backtrace:
>  [<c1003aad>] show_trace_log_lvl+0x58/0x15b
>  [<c100495f>] show_trace+0xd/0x10
>  [<c1004979>] dump_stack+0x17/0x1a
>  [<c102dee5>] __lock_acquire+0x753/0x99c
>  [<c102e3b0>] lock_acquire+0x4a/0x6a
>  [<c1204501>] mutex_lock_nested+0xc8/0x20c
>  [<c105eb8d>] __blkdev_put+0x1e/0x13c
>  [<c105ecc4>] blkdev_put+0xa/0xc
>  [<c105f18a>] do_open+0x336/0x3a8
>  [<c105f21b>] blkdev_open+0x1f/0x4c
>  [<c1057b40>] __dentry_open+0xc7/0x1aa
>  [<c1057c91>] nameidata_to_filp+0x1c/0x2e
>  [<c1057cd1>] do_filp_open+0x2e/0x35
>  [<c1057dd7>] do_sys_open+0x38/0x68
>  [<c1057e33>] sys_open+0x16/0x18
>  [<c1002845>] sysenter_past_esp+0x56/0x8d

OK, I'm having a look here; its all new to me so bear with me.

blkdev_open() calls
  do_open(bdev, ...,BD_MUTEX_NORMAL) and takes
    mutex_lock_nested(&bdev->bd_mutex, BD_MUTEX_NORMAL)

then something fails, and we're thrown to:

out_first: where
    if (bdev != bdev->bd_contains)
      blkdev_put(bdev->bd_contains) which is
        __blkdev_put(bdev->bd_contains, BD_MUTEX_NORMAL) which does
          mutex_lock_nested(&bdev->bd_contains->bd_mutex, BD_MUTEX_NORMAL) <--- lockdep trigger

When going to out_first, dbev->bd_contains is either bdev or whole, and
since we take the branch it must be whole. So it seems to me the
following patch would be the right one:

[akpm@osdl.org: compile fix]
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Acked-by: NeilBrown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
1 parent 7334bb4
History
File Mode Size
8253pit.h -rw-r--r-- 129 bytes
Kbuild -rw-r--r-- 286 bytes
a.out.h -rw-r--r-- 813 bytes
acpi.h -rw-r--r-- 4.4 KB
agp.h -rw-r--r-- 1.0 KB
alternative.h -rw-r--r-- 5.7 KB
apic.h -rw-r--r-- 2.7 KB
apicdef.h -rw-r--r-- 9.9 KB
atomic.h -rw-r--r-- 9.7 KB
auxvec.h -rw-r--r-- 68 bytes
bitops.h -rw-r--r-- 9.9 KB
boot.h -rw-r--r-- 409 bytes
bootsetup.h -rw-r--r-- 1.7 KB
bug.h -rw-r--r-- 847 bytes
bugs.h -rw-r--r-- 549 bytes
byteorder.h -rw-r--r-- 726 bytes
cache.h -rw-r--r-- 603 bytes
cacheflush.h -rw-r--r-- 1.2 KB
calgary.h -rw-r--r-- 2.1 KB
calling.h -rw-r--r-- 3.0 KB
checksum.h -rw-r--r-- 5.3 KB
compat.h -rw-r--r-- 4.5 KB
cpu.h -rw-r--r-- 26 bytes
cpufeature.h -rw-r--r-- 5.8 KB
cputime.h -rw-r--r-- 121 bytes
current.h -rw-r--r-- 434 bytes
debugreg.h -rw-r--r-- 2.7 KB
delay.h -rw-r--r-- 709 bytes
desc.h -rw-r--r-- 5.8 KB
div64.h -rw-r--r-- 31 bytes
dma-mapping.h -rw-r--r-- 6.2 KB
dma.h -rw-r--r-- 9.7 KB
dmi.h -rw-r--r-- 640 bytes
dwarf2.h -rw-r--r-- 1.3 KB
e820.h -rw-r--r-- 2.0 KB
edac.h -rw-r--r-- 422 bytes
elf.h -rw-r--r-- 5.6 KB
emergency-restart.h -rw-r--r-- 151 bytes
errno.h -rw-r--r-- 86 bytes
fcntl.h -rw-r--r-- 31 bytes
fixmap.h -rw-r--r-- 2.8 KB
floppy.h -rw-r--r-- 6.5 KB
fpu32.h -rw-r--r-- 279 bytes
futex.h -rw-r--r-- 2.9 KB
genapic.h -rw-r--r-- 846 bytes
hardirq.h -rw-r--r-- 470 bytes
hpet.h -rw-r--r-- 2.0 KB
hw_irq.h -rw-r--r-- 3.3 KB
i387.h -rw-r--r-- 5.7 KB
ia32.h -rw-r--r-- 3.9 KB
ia32_unistd.h -rw-r--r-- 550 bytes
ide.h -rw-r--r-- 26 bytes
idle.h -rw-r--r-- 287 bytes
intel_arch_perfmon.h -rw-r--r-- 668 bytes
io.h -rw-r--r-- 8.3 KB
io_apic.h -rw-r--r-- 5.5 KB
ioctl.h -rw-r--r-- 31 bytes
ioctls.h -rw-r--r-- 2.5 KB
ipcbuf.h -rw-r--r-- 636 bytes
ipi.h -rw-r--r-- 2.5 KB
irq.h -rw-r--r-- 1.3 KB
irqflags.h -rw-r--r-- 2.6 KB
k8.h -rw-r--r-- 298 bytes
kdebug.h -rw-r--r-- 1.3 KB
kexec.h -rw-r--r-- 2.5 KB
kmap_types.h -rw-r--r-- 255 bytes
kprobes.h -rw-r--r-- 2.8 KB
ldt.h -rw-r--r-- 909 bytes
linkage.h -rw-r--r-- 86 bytes
local.h -rw-r--r-- 2.3 KB
mach_apic.h -rw-r--r-- 954 bytes
mc146818rtc.h -rw-r--r-- 639 bytes
mce.h -rw-r--r-- 3.0 KB
mman.h -rw-r--r-- 657 bytes
mmsegment.h -rw-r--r-- 114 bytes
mmu.h -rw-r--r-- 357 bytes
mmu_context.h -rw-r--r-- 1.7 KB
mmx.h -rw-r--r-- 270 bytes
mmzone.h -rw-r--r-- 1.3 KB
module.h -rw-r--r-- 179 bytes
mpspec.h -rw-r--r-- 6.6 KB
msgbuf.h -rw-r--r-- 838 bytes
msi.h -rw-r--r-- 437 bytes
msr.h -rw-r--r-- 11.4 KB
mtrr.h -rw-r--r-- 5.1 KB
mutex.h -rw-r--r-- 3.1 KB
namei.h -rw-r--r-- 226 bytes
nmi.h -rw-r--r-- 1.6 KB
node.h -rw-r--r-- 27 bytes
numa.h -rw-r--r-- 808 bytes
page.h -rw-r--r-- 4.4 KB
param.h -rw-r--r-- 460 bytes
parport.h -rw-r--r-- 481 bytes
pci-direct.h -rw-r--r-- 1.2 KB
pci.h -rw-r--r-- 4.1 KB
pda.h -rw-r--r-- 3.0 KB
percpu.h -rw-r--r-- 1.7 KB
pgalloc.h -rw-r--r-- 3.3 KB
pgtable.h -rw-r--r-- 15.2 KB
poll.h -rw-r--r-- 545 bytes
posix_types.h -rw-r--r-- 3.2 KB
prctl.h -rw-r--r-- 166 bytes
processor.h -rw-r--r-- 12.9 KB
proto.h -rw-r--r-- 3.8 KB
ptrace.h -rw-r--r-- 3.0 KB
resource.h -rw-r--r-- 95 bytes
rtc.h -rw-r--r-- 142 bytes
rwlock.h -rw-r--r-- 2.4 KB
scatterlist.h -rw-r--r-- 592 bytes
seccomp.h -rw-r--r-- 587 bytes
sections.h -rw-r--r-- 128 bytes
segment.h -rw-r--r-- 1.1 KB
semaphore.h -rw-r--r-- 5.3 KB
sembuf.h -rw-r--r-- 705 bytes
serial.h -rw-r--r-- 1007 bytes
setup.h -rw-r--r-- 85 bytes
shmbuf.h -rw-r--r-- 1023 bytes
shmparam.h -rw-r--r-- 158 bytes
sigcontext.h -rw-r--r-- 1.2 KB
sigcontext32.h -rw-r--r-- 1.5 KB
siginfo.h -rw-r--r-- 143 bytes
signal.h -rw-r--r-- 3.9 KB
smp.h -rw-r--r-- 3.2 KB
socket.h -rw-r--r-- 1.1 KB
sockios.h -rw-r--r-- 279 bytes
sparsemem.h -rw-r--r-- 678 bytes
spinlock.h -rw-r--r-- 3.1 KB
spinlock_types.h -rw-r--r-- 380 bytes
stat.h -rw-r--r-- 904 bytes
statfs.h -rw-r--r-- 900 bytes
string.h -rw-r--r-- 1.4 KB
suspend.h -rw-r--r-- 1.6 KB
swiotlb.h -rw-r--r-- 1.9 KB
system.h -rw-r--r-- 6.4 KB
tce.h -rw-r--r-- 1.7 KB
termbits.h -rw-r--r-- 3.7 KB
termios.h -rw-r--r-- 3.1 KB
thread_info.h -rw-r--r-- 4.6 KB
timex.h -rw-r--r-- 1.1 KB
tlb.h -rw-r--r-- 282 bytes
tlbflush.h -rw-r--r-- 3.4 KB
topology.h -rw-r--r-- 1.8 KB
types.h -rw-r--r-- 1.0 KB
uaccess.h -rw-r--r-- 11.2 KB
ucontext.h -rw-r--r-- 255 bytes
unaligned.h -rw-r--r-- 1.2 KB
unistd.h -rw-r--r-- 29.7 KB
unwind.h -rw-r--r-- 3.0 KB
user.h -rw-r--r-- 4.9 KB
user32.h -rw-r--r-- 2.1 KB
vga.h -rw-r--r-- 379 bytes
vsyscall.h -rw-r--r-- 1.9 KB
vsyscall32.h -rw-r--r-- 670 bytes
xor.h -rw-r--r-- 7.8 KB

back to top