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
9p
adfs
affs
afs
autofs
autofs4
befs
bfs
cifs
coda
configfs
cramfs
debugfs
devpts
efs
exportfs
ext2
ext3
fat
freevxfs
fuse
hfs
hfsplus
hostfs
hpfs
hppfs
hugetlbfs
isofs
jbd
jffs
jffs2
jfs
lockd
minix
msdos
ncpfs
nfs
nfs_common
nfsd
nls
ntfs
ocfs2
openpromfs
partitions
proc
qnx4
ramfs
reiserfs
romfs
smbfs
sysfs
sysv
udf
ufs
vfat
xfs
Kconfig -rw-r--r-- 69.8 KB
Kconfig.binfmt -rw-r--r-- 5.3 KB
Makefile -rw-r--r-- 3.3 KB
aio.c -rw-r--r-- 43.8 KB
attr.c -rw-r--r-- 4.2 KB
bad_inode.c -rw-r--r-- 2.8 KB
binfmt_aout.c -rw-r--r-- 14.8 KB
binfmt_elf.c -rw-r--r-- 45.5 KB
binfmt_elf_fdpic.c -rw-r--r-- 46.5 KB
binfmt_em86.c -rw-r--r-- 2.8 KB
binfmt_flat.c -rw-r--r-- 26.0 KB
binfmt_misc.c -rw-r--r-- 15.7 KB
binfmt_script.c -rw-r--r-- 2.7 KB
binfmt_som.c -rw-r--r-- 7.6 KB
bio.c -rw-r--r-- 30.0 KB
block_dev.c -rw-r--r-- 31.3 KB
buffer.c -rw-r--r-- 83.2 KB
char_dev.c -rw-r--r-- 9.9 KB
compat.c -rw-r--r-- 52.6 KB
compat_ioctl.c -rw-r--r-- 82.9 KB
dcache.c -rw-r--r-- 45.5 KB
dcookies.c -rw-r--r-- 6.4 KB
direct-io.c -rw-r--r-- 35.0 KB
dnotify.c -rw-r--r-- 4.3 KB
dquot.c -rw-r--r-- 52.5 KB
drop_caches.c -rw-r--r-- 1.4 KB
eventpoll.c -rw-r--r-- 44.3 KB
exec.c -rw-r--r-- 34.7 KB
fcntl.c -rw-r--r-- 13.7 KB
fifo.c -rw-r--r-- 3.1 KB
file.c -rw-r--r-- 8.6 KB
file_table.c -rw-r--r-- 6.7 KB
filesystems.c -rw-r--r-- 5.2 KB
fs-writeback.c -rw-r--r-- 19.8 KB
inode.c -rw-r--r-- 36.5 KB
inotify.c -rw-r--r-- 19.2 KB
inotify_user.c -rw-r--r-- 17.3 KB
ioctl.c -rw-r--r-- 3.9 KB
ioprio.c -rw-r--r-- 4.5 KB
libfs.c -rw-r--r-- 15.4 KB
locks.c -rw-r--r-- 55.1 KB
mbcache.c -rw-r--r-- 18.2 KB
mpage.c -rw-r--r-- 22.8 KB
namei.c -rw-r--r-- 67.2 KB
namespace.c -rw-r--r-- 46.9 KB
nfsctl.c -rw-r--r-- 2.4 KB
open.c -rw-r--r-- 27.5 KB
pipe.c -rw-r--r-- 21.4 KB
pnode.c -rw-r--r-- 7.6 KB
pnode.h -rw-r--r-- 1013 bytes
posix_acl.c -rw-r--r-- 8.5 KB
quota.c -rw-r--r-- 8.9 KB
quota_v1.c -rw-r--r-- 5.7 KB
quota_v2.c -rw-r--r-- 20.1 KB
read_write.c -rw-r--r-- 16.2 KB
readdir.c -rw-r--r-- 6.7 KB
select.c -rw-r--r-- 20.6 KB
seq_file.c -rw-r--r-- 9.6 KB
splice.c -rw-r--r-- 34.4 KB
stat.c -rw-r--r-- 10.5 KB
super.c -rw-r--r-- 20.5 KB
sync.c -rw-r--r-- 4.4 KB
xattr.c -rw-r--r-- 13.3 KB
xattr_acl.c -rw-r--r-- 2.3 KB

back to top