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
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 |
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...