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
Kbuild -rw-r--r-- 39 bytes
a.out.h -rw-r--r-- 188 bytes
atomic.h -rw-r--r-- 8.9 KB
auxvec.h -rw-r--r-- 54 bytes
ax88796.h -rw-r--r-- 751 bytes
bitops.h -rw-r--r-- 4.2 KB
bug.h -rw-r--r-- 1.3 KB
bugs.h -rw-r--r-- 445 bytes
busctl-regs.h -rw-r--r-- 2.0 KB
byteorder.h -rw-r--r-- 290 bytes
cache.h -rw-r--r-- 727 bytes
cacheflush.h -rw-r--r-- 3.0 KB
checksum.h -rw-r--r-- 4.7 KB
cpu-irqs.h -rw-r--r-- 1.9 KB
cpumask.h -rw-r--r-- 109 bytes
cputime.h -rw-r--r-- 109 bytes
current.h -rw-r--r-- 685 bytes
delay.h -rw-r--r-- 1.3 KB
div64.h -rw-r--r-- 31 bytes
dm9000.h -rw-r--r-- 1.1 KB
dma-mapping.h -rw-r--r-- 5.1 KB
dma.h -rw-r--r-- 3.7 KB
elf.h -rw-r--r-- 5.3 KB
emergency-restart.h -rw-r--r-- 149 bytes
errno.h -rw-r--r-- 102 bytes
fcntl.h -rw-r--r-- 31 bytes
fpu.h -rw-r--r-- 222 bytes
futex.h -rw-r--r-- 334 bytes
gdb-stub.h -rw-r--r-- 4.4 KB
gpio-regs.h -rw-r--r-- 3.6 KB
hardirq.h -rw-r--r-- 797 bytes
highmem.h -rw-r--r-- 5.2 KB
hw_irq.h -rw-r--r-- 484 bytes
ide.h -rw-r--r-- 1.2 KB
init.h -rw-r--r-- 340 bytes
io.h -rw-r--r-- 9.4 KB
ioctl.h -rw-r--r-- 31 bytes
ioctls.h -rw-r--r-- 2.4 KB
ipc.h -rw-r--r-- 29 bytes
ipcbuf.h -rw-r--r-- 629 bytes
irc-regs.h -rw-r--r-- 1.8 KB
irq-routing.h -rw-r--r-- 1.9 KB
irq.h -rw-r--r-- 1.2 KB
kmap_types.h -rw-r--r-- 641 bytes
linkage.h -rw-r--r-- 114 bytes
local.h -rw-r--r-- 101 bytes
math-emu.h -rw-r--r-- 6.3 KB
mb-regs.h -rw-r--r-- 6.9 KB
mb86943a.h -rw-r--r-- 1.7 KB
mb93091-fpga-irqs.h -rw-r--r-- 1.1 KB
mb93093-fpga-irqs.h -rw-r--r-- 852 bytes
mb93493-irqs.h -rw-r--r-- 1.8 KB
mb93493-regs.h -rw-r--r-- 12.3 KB
mc146818rtc.h -rw-r--r-- 485 bytes
mem-layout.h -rw-r--r-- 2.0 KB
mman.h -rw-r--r-- 614 bytes
mmu.h -rw-r--r-- 1.3 KB
mmu_context.h -rw-r--r-- 1.3 KB
module.h -rw-r--r-- 699 bytes
msgbuf.h -rw-r--r-- 980 bytes
mutex.h -rw-r--r-- 308 bytes
namei.h -rw-r--r-- 283 bytes
page.h -rw-r--r-- 2.4 KB
param.h -rw-r--r-- 466 bytes
pci.h -rw-r--r-- 3.7 KB
percpu.h -rw-r--r-- 108 bytes
pgalloc.h -rw-r--r-- 1.7 KB
pgtable.h -rw-r--r-- 17.4 KB
poll.h -rw-r--r-- 386 bytes
posix_types.h -rw-r--r-- 1.9 KB
processor.h -rw-r--r-- 4.0 KB
ptrace.h -rw-r--r-- 2.4 KB
registers.h -rw-r--r-- 6.7 KB
resource.h -rw-r--r-- 114 bytes
scatterlist.h -rw-r--r-- 942 bytes
sections.h -rw-r--r-- 1.2 KB
segment.h -rw-r--r-- 1.1 KB
semaphore.h -rw-r--r-- 3.5 KB
sembuf.h -rw-r--r-- 697 bytes
serial-regs.h -rw-r--r-- 1.6 KB
serial.h -rw-r--r-- 378 bytes
setup.h -rw-r--r-- 613 bytes
shmbuf.h -rw-r--r-- 1.1 KB
shmparam.h -rw-r--r-- 144 bytes
sigcontext.h -rw-r--r-- 803 bytes
siginfo.h -rw-r--r-- 204 bytes
signal.h -rw-r--r-- 3.4 KB
smp.h -rw-r--r-- 100 bytes
socket.h -rw-r--r-- 1.1 KB
sockios.h -rw-r--r-- 285 bytes
spinlock.h -rw-r--r-- 516 bytes
spr-regs.h -rw-r--r-- 17.4 KB
stat.h -rw-r--r-- 2.2 KB
statfs.h -rw-r--r-- 106 bytes
string.h -rw-r--r-- 1.4 KB
suspend.h -rw-r--r-- 537 bytes
system.h -rw-r--r-- 5.1 KB
termbits.h -rw-r--r-- 3.8 KB
termios.h -rw-r--r-- 2.0 KB
thread_info.h -rw-r--r-- 4.2 KB
timer-regs.h -rw-r--r-- 3.6 KB
timex.h -rw-r--r-- 601 bytes
tlb.h -rw-r--r-- 510 bytes
tlbflush.h -rw-r--r-- 2.0 KB
topology.h -rw-r--r-- 216 bytes
types.h -rw-r--r-- 1.4 KB
uaccess.h -rw-r--r-- 8.2 KB
ucontext.h -rw-r--r-- 242 bytes
unaligned.h -rw-r--r-- 5.5 KB
unistd.h -rw-r--r-- 15.7 KB
user.h -rw-r--r-- 3.3 KB
vga.h -rw-r--r-- 464 bytes
virtconvert.h -rw-r--r-- 1.1 KB
xor.h -rw-r--r-- 29 bytes

back to top