Hi Miao,

Here is an excerpt of the V4 patch applied kernel boot log:

=======================================================
[ INFO: possible circular locking dependency detected ]
2.6.36-xie+ #117
-------------------------------------------------------
vgs/1210 is trying to acquire lock:
 (&delayed_node->mutex){+.+...}, at: [<ffffffff8121184b>] 
btrfs_delayed_update_inode+0x45/0x101

but task is already holding lock:
 (&mm->mmap_sem){++++++}, at: [<ffffffff810f6512>] sys_mmap_pgoff+0xd6/0x12e

which lock already depends on the new lock.


the existing dependency chain (in reverse order) is:

-> #1 (&mm->mmap_sem){++++++}:
       [<ffffffff81076a3d>] lock_acquire+0x11d/0x143
       [<ffffffff810edc79>] might_fault+0x95/0xb8
       [<ffffffff8112b5ce>] filldir+0x75/0xd0
       [<ffffffff811d77f8>] btrfs_real_readdir+0x3d7/0x528
       [<ffffffff8112b75c>] vfs_readdir+0x79/0xb6
       [<ffffffff8112b8e9>] sys_getdents+0x85/0xd8
       [<ffffffff81002ddb>] system_call_fastpath+0x16/0x1b

-> #0 (&delayed_node->mutex){+.+...}:
       [<ffffffff81076612>] __lock_acquire+0xa98/0xda6
       [<ffffffff81076a3d>] lock_acquire+0x11d/0x143
       [<ffffffff814c38b1>] __mutex_lock_common+0x5a/0x444
       [<ffffffff814c3d50>] mutex_lock_nested+0x39/0x3e
       [<ffffffff8121184b>] btrfs_delayed_update_inode+0x45/0x101
       [<ffffffff811dbd4f>] btrfs_update_inode+0x2e/0x129
       [<ffffffff811de008>] btrfs_dirty_inode+0x57/0x113
       [<ffffffff8113c2a5>] __mark_inode_dirty+0x33/0x1aa
       [<ffffffff81130939>] touch_atime+0x107/0x12a
       [<ffffffff811e15b2>] btrfs_file_mmap+0x3e/0x57
       [<ffffffff810f5f40>] mmap_region+0x2bb/0x4c4
       [<ffffffff810f63d9>] do_mmap_pgoff+0x290/0x2f3
       [<ffffffff810f6532>] sys_mmap_pgoff+0xf6/0x12e
       [<ffffffff81006e9a>] sys_mmap+0x22/0x24
       [<ffffffff81002ddb>] system_call_fastpath+0x16/0x1b

other info that might help us debug this:

1 lock held by vgs/1210:
 #0:  (&mm->mmap_sem){++++++}, at: [<ffffffff810f6512>] 
sys_mmap_pgoff+0xd6/0x12e

stack backtrace:
Pid: 1210, comm: vgs Not tainted 2.6.36-xie+ #117
Call Trace:
 [<ffffffff81074c15>] print_circular_bug+0xaf/0xbd
 [<ffffffff81076612>] __lock_acquire+0xa98/0xda6
 [<ffffffff8121184b>] ? btrfs_delayed_update_inode+0x45/0x101
 [<ffffffff81076a3d>] lock_acquire+0x11d/0x143
 [<ffffffff8121184b>] ? btrfs_delayed_update_inode+0x45/0x101
 [<ffffffff8121184b>] ? btrfs_delayed_update_inode+0x45/0x101
 [<ffffffff814c38b1>] __mutex_lock_common+0x5a/0x444
 [<ffffffff8121184b>] ? btrfs_delayed_update_inode+0x45/0x101
 [<ffffffff8107162f>] ? debug_mutex_init+0x31/0x3c
 [<ffffffff814c3d50>] mutex_lock_nested+0x39/0x3e
 [<ffffffff8121184b>] btrfs_delayed_update_inode+0x45/0x101
 [<ffffffff814c36c6>] ? __mutex_unlock_slowpath+0x129/0x13a
 [<ffffffff811dbd4f>] btrfs_update_inode+0x2e/0x129
 [<ffffffff811de008>] btrfs_dirty_inode+0x57/0x113
 [<ffffffff8113c2a5>] __mark_inode_dirty+0x33/0x1aa
 [<ffffffff81130939>] touch_atime+0x107/0x12a
 [<ffffffff811e15b2>] btrfs_file_mmap+0x3e/0x57
 [<ffffffff810f5f40>] mmap_region+0x2bb/0x4c4
 [<ffffffff81229f10>] ? file_map_prot_check+0x9a/0xa3
 [<ffffffff810f63d9>] do_mmap_pgoff+0x290/0x2f3
 [<ffffffff810f6512>] ? sys_mmap_pgoff+0xd6/0x12e
 [<ffffffff810f6532>] sys_mmap_pgoff+0xf6/0x12e
 [<ffffffff814c4b75>] ? trace_hardirqs_on_thunk+0x3a/0x3f
 [<ffffffff81006e9a>] sys_mmap+0x22/0x24
 [<ffffffff81002ddb>] system_call_fastpath+0x16/0x1b

As the corresponding delayed node mutex lock is taken in btrfs_real_readdir, 
that seems deadlockable.
vfs_readdir holds i_mutex, I wonder if we can execute 
btrfs_readdir_delayed_dir_index without
taking the node lock. 

 
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to