Frederic Weisbecker
47376ceba5
reiserfs: Fix reiserfs lock <-> inode mutex dependency inversion
The reiserfs lock -> inode mutex dependency gets inverted when we
relax the lock while walking to the tree.
To fix this, use a specialized version of reiserfs_mutex_lock_safe
that takes care of mutex subclasses. Then we can grab the inode
mutex with I_MUTEX_XATTR subclass without any reiserfs lock
dependency.
This fixes the following report:
[ INFO: possible circular locking dependency detected ]
2.6.32-06793-gf405425-dirty #2
-------------------------------------------------------
mv/18566 is trying to acquire lock:
(&REISERFS_SB(s)->lock){+.+.+.}, at: [<c1110708>] reiserfs_write_lock+0x28=
/0x40
but task is already holding lock:
(&sb->s_type->i_mutex_key#5/3){+.+.+.}, at: [<c111033c>]
reiserfs_for_each_xattr+0x10c/0x380
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&sb->s_type->i_mutex_key#5/3){+.+.+.}:
[<c104f723>] validate_chain+0xa23/0xf70
[<c1050155>] __lock_acquire+0x4e5/0xa70
[<c105075a>] lock_acquire+0x7a/0xa0
[<c134c76f>] mutex_lock_nested+0x5f/0x2b0
[<c11102b4>] reiserfs_for_each_xattr+0x84/0x380
[<c1110615>] reiserfs_delete_xattrs+0x15/0x50
[<c10ef57f>] reiserfs_delete_inode+0x8f/0x140
[<c10a565c>] generic_delete_inode+0x9c/0x150
[<c10a574d>] generic_drop_inode+0x3d/0x60
[<c10a4667>] iput+0x47/0x50
[<c109cc0b>] do_unlinkat+0xdb/0x160
[<c109cca0>] sys_unlink+0x10/0x20
[<c1002c50>] sysenter_do_call+0x12/0x36
-> #0 (&REISERFS_SB(s)->lock){+.+.+.}:
[<c104fc68>] validate_chain+0xf68/0xf70
[<c1050155>] __lock_acquire+0x4e5/0xa70
[<c105075a>] lock_acquire+0x7a/0xa0
[<c134c76f>] mutex_lock_nested+0x5f/0x2b0
[<c1110708>] reiserfs_write_lock+0x28/0x40
[<c1103d6b>] search_by_key+0x1f7b/0x21b0
[<c10e73ef>] search_by_entry_key+0x1f/0x3b0
[<c10e77f7>] reiserfs_find_entry+0x77/0x400
[<c10e81e5>] reiserfs_lookup+0x85/0x130
[<c109a144>] __lookup_hash+0xb4/0x110
[<c109b763>] lookup_one_len+0xb3/0x100
[<c1110350>] reiserfs_for_each_xattr+0x120/0x380
[<c1110615>] reiserfs_delete_xattrs+0x15/0x50
[<c10ef57f>] reiserfs_delete_inode+0x8f/0x140
[<c10a565c>] generic_delete_inode+0x9c/0x150
[<c10a574d>] generic_drop_inode+0x3d/0x60
[<c10a4667>] iput+0x47/0x50
[<c10a1c4f>] dentry_iput+0x6f/0xf0
[<c10a1d74>] d_kill+0x24/0x50
[<c10a396b>] dput+0x5b/0x120
[<c109ca89>] sys_renameat+0x1b9/0x230
[<c109cb28>] sys_rename+0x28/0x30
[<c1002c50>] sysenter_do_call+0x12/0x36
other info that might help us debug this:
2 locks held by mv/18566:
#0: (&sb->s_type->i_mutex_key#5/1){+.+.+.}, at: [<c109b6ac>]
lock_rename+0xcc/0xd0
#1: (&sb->s_type->i_mutex_key#5/3){+.+.+.}, at: [<c111033c>]
reiserfs_for_each_xattr+0x10c/0x380
stack backtrace:
Pid: 18566, comm: mv Tainted: G C 2.6.32-06793-gf405425-dirty #2
Call Trace:
[<c134b252>] ? printk+0x18/0x1e
[<c104e790>] print_circular_bug+0xc0/0xd0
[<c104fc68>] validate_chain+0xf68/0xf70
[<c104c8cb>] ? trace_hardirqs_off+0xb/0x10
[<c1050155>] __lock_acquire+0x4e5/0xa70
[<c105075a>] lock_acquire+0x7a/0xa0
[<c1110708>] ? reiserfs_write_lock+0x28/0x40
[<c134c76f>] mutex_lock_nested+0x5f/0x2b0
[<c1110708>] ? reiserfs_write_lock+0x28/0x40
[<c1110708>] ? reiserfs_write_lock+0x28/0x40
[<c134b60a>] ? schedule+0x27a/0x440
[<c1110708>] reiserfs_write_lock+0x28/0x40
[<c1103d6b>] search_by_key+0x1f7b/0x21b0
[<c1050176>] ? __lock_acquire+0x506/0xa70
[<c1051267>] ? lock_release_non_nested+0x1e7/0x340
[<c1110708>] ? reiserfs_write_lock+0x28/0x40
[<c104e354>] ? trace_hardirqs_on_caller+0x124/0x170
[<c104e3ab>] ? trace_hardirqs_on+0xb/0x10
[<c1042a55>] ? T.316+0x15/0x1a0
[<c1042d2d>] ? sched_clock_cpu+0x9d/0x100
[<c10e73ef>] search_by_entry_key+0x1f/0x3b0
[<c134bf2a>] ? __mutex_unlock_slowpath+0x9a/0x120
[<c104e354>] ? trace_hardirqs_on_caller+0x124/0x170
[<c10e77f7>] reiserfs_find_entry+0x77/0x400
[<c10e81e5>] reiserfs_lookup+0x85/0x130
[<c1042d2d>] ? sched_clock_cpu+0x9d/0x100
[<c109a144>] __lookup_hash+0xb4/0x110
[<c109b763>] lookup_one_len+0xb3/0x100
[<c1110350>] reiserfs_for_each_xattr+0x120/0x380
[<c110ffe0>] ? delete_one_xattr+0x0/0x1c0
[<c1003342>] ? math_error+0x22/0x150
[<c1110708>] ? reiserfs_write_lock+0x28/0x40
[<c1110615>] reiserfs_delete_xattrs+0x15/0x50
[<c1110708>] ? reiserfs_write_lock+0x28/0x40
[<c10ef57f>] reiserfs_delete_inode+0x8f/0x140
[<c10a561f>] ? generic_delete_inode+0x5f/0x150
[<c10ef4f0>] ? reiserfs_delete_inode+0x0/0x140
[<c10a565c>] generic_delete_inode+0x9c/0x150
[<c10a574d>] generic_drop_inode+0x3d/0x60
[<c10a4667>] iput+0x47/0x50
[<c10a1c4f>] dentry_iput+0x6f/0xf0
[<c10a1d74>] d_kill+0x24/0x50
[<c10a396b>] dput+0x5b/0x120
[<c109ca89>] sys_renameat+0x1b9/0x230
[<c1042d2d>] ? sched_clock_cpu+0x9d/0x100
[<c104c8cb>] ? trace_hardirqs_off+0xb/0x10
[<c1042dde>] ? cpu_clock+0x4e/0x60
[<c1350825>] ? do_page_fault+0x155/0x370
[<c1041816>] ? up_read+0x16/0x30
[<c1350825>] ? do_page_fault+0x155/0x370
[<c109cb28>] sys_rename+0x28/0x30
[<c1002c50>] sysenter_do_call+0x12/0x36
Reported-by: Alexander Beregalov <a.beregalov@gmail.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Chris Mason <chris.mason@oracle.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
2009-12-16 23:25:50 +01:00
..
2009-09-22 20:49:04 +01:00
2009-09-04 02:16:14 -07:00
2009-09-19 00:51:34 -03:00
2009-10-09 13:32:24 -07:00
2009-09-22 07:54:33 -07:00
2009-12-01 11:24:19 +01:00
2009-10-11 11:20:58 -07:00
2009-09-20 05:55:36 -07:00
2009-09-23 07:39:29 -07:00
2009-09-22 13:32:45 +01:00
2009-09-26 10:49:42 -07:00
2009-09-09 11:19:00 -04:00
2009-09-23 14:36:38 -04:00
2009-09-24 07:21:05 -07:00
2009-10-09 13:52:05 -07:00
2009-09-19 02:14:45 -04:00
2009-09-27 11:39:25 -07:00
2009-09-20 16:09:20 +05:30
2009-09-23 07:39:29 -07:00
2009-09-01 01:14:07 -07:00
2009-09-08 17:42:50 -07:00
2009-10-06 00:26:26 -04:00
2009-09-30 16:12:20 -07:00
2009-09-15 09:50:47 -07:00
2009-09-26 00:10:40 +02:00
2009-09-21 21:03:58 +01:00
2009-09-24 07:21:01 -07:00
2009-09-11 14:33:31 +02:00
2009-09-11 14:33:32 +02:00
2009-10-05 11:03:58 +02:00
2009-10-01 21:19:34 +02:00
2009-09-22 07:17:38 -07:00
2009-09-21 15:14:51 +02:00
2009-10-01 16:11:11 -07:00
2009-09-23 07:39:29 -07:00
2009-09-24 07:20:57 -07:00
2009-10-02 10:54:05 -07:00
2009-10-29 07:39:24 -07:00
2009-09-24 09:34:53 +09:30
2009-09-23 11:01:25 -07:00
2009-09-19 13:13:31 -07:00
2009-09-10 10:00:05 -07:00
2009-09-01 01:24:30 -07:00
2009-09-24 07:20:57 -07:00
2009-09-18 09:48:52 -07:00
2009-09-04 20:40:25 +01:00
2009-10-30 14:59:51 -07:00
2009-09-04 20:40:34 +01:00
2009-09-08 17:55:21 -07:00
2009-09-08 21:17:48 -04:00
2009-09-14 17:41:42 -07:00
2009-10-06 10:35:10 +02:00
2009-09-02 23:07:39 -07:00
2009-09-23 07:39:29 -07:00
2009-11-11 15:22:49 +01:00
2009-11-12 07:25:56 -08:00
2009-09-12 14:48:40 +02:00
2009-09-22 07:17:47 -07:00
2009-10-04 12:39:14 -07:00
2009-11-19 18:12:05 +00:00
2009-11-19 18:11:35 +00:00
2009-09-18 07:25:44 +02:00
2009-10-07 15:52:09 -04:00
2009-10-08 12:16:35 -07:00
2009-10-06 20:16:55 +02:00
2009-09-23 07:39:29 -07:00
2009-09-23 07:39:46 -07:00
2009-09-11 13:23:18 -07:00
2009-09-19 13:13:31 -07:00
2009-09-01 01:13:31 -07:00
2009-09-17 15:15:11 +02:00
2009-09-27 11:39:25 -07:00
2009-09-19 00:16:14 -03:00
2009-11-20 00:25:42 +00:00
2009-11-07 13:10:46 +01:00
2009-09-17 23:23:45 -07:00
2009-09-01 17:52:57 -07:00
2009-09-11 12:54:58 -07:00
2009-09-07 01:56:33 -07:00
2009-09-26 20:28:07 -07:00
2009-09-15 02:37:40 -07:00
2009-09-21 14:28:04 +02:00
2009-10-02 15:42:19 +02:00
2009-11-10 21:13:32 -08:00
2009-09-11 16:40:10 +01:00
2009-10-11 11:20:58 -07:00
2009-09-23 07:39:41 -07:00
2009-09-26 10:17:19 -07:00
2009-09-11 13:21:31 -07:00
2009-11-15 22:23:47 -08:00
2009-09-30 00:32:06 -04:00
2009-09-23 07:39:58 -07:00
2009-10-22 16:39:28 +10:30
2009-10-11 23:21:25 +02:00
2009-09-02 21:29:22 +10:00
2009-09-02 21:29:22 +10:00
2009-09-19 13:13:17 -07:00
2009-09-23 07:39:29 -07:00
2009-09-15 23:51:31 -04:00
2009-09-26 10:17:19 -07:00
2009-09-22 07:17:33 -07:00
2009-09-18 21:22:08 +02:00
2009-09-10 08:33:20 +03:00
2009-09-10 08:33:16 +03:00
2009-10-06 00:26:27 -04:00
2009-09-17 23:23:45 -07:00
2009-09-21 06:27:08 +02:00
2009-09-22 07:17:48 -07:00
2009-08-31 17:30:14 -10:00
2009-09-23 07:39:42 -07:00
2009-09-24 07:20:59 -07:00
2009-09-23 07:39:41 -07:00
2009-09-22 07:17:35 -07:00
2009-09-19 12:50:38 -07:00
2009-09-21 15:14:56 +02:00
2009-09-22 07:17:37 -07:00
2009-09-27 11:39:25 -07:00
2009-09-24 17:20:20 -07:00
2009-09-22 07:17:42 -07:00
2009-09-22 07:17:31 -07:00
2009-09-24 07:21:04 -07:00
2009-09-23 07:39:43 -07:00
2009-09-25 00:32:58 +09:30
2009-10-29 08:56:17 +10:30
2009-09-30 16:12:20 -07:00
2009-09-30 16:12:20 -07:00
2009-09-21 15:14:51 +02:00
2009-09-30 16:12:20 -07:00
2009-10-07 13:53:11 -07:00
2009-09-30 16:12:20 -07:00
2009-09-24 15:44:05 -07:00
2009-09-22 07:54:33 -07:00
2009-09-26 10:17:19 -07:00
2009-11-15 17:17:38 +09:00
2009-09-15 02:37:40 -07:00
2009-09-22 07:17:38 -07:00
2009-09-24 07:20:58 -07:00
2009-09-24 07:53:22 -07:00
2009-09-14 17:39:12 -07:00
2009-11-12 07:25:57 -08:00
2009-09-15 09:50:48 -07:00
2009-09-09 14:19:11 -07:00
2009-09-15 09:39:44 -07:00
2009-09-22 15:42:01 +02:00
2009-10-23 09:35:02 +02:00
2009-09-24 15:38:57 -07:00
2009-09-14 20:27:00 +02:00
2009-09-22 07:17:49 -07:00
2009-09-22 07:17:47 -07:00
2009-10-04 15:05:10 -07:00
2009-10-04 03:23:17 +02:00
2009-09-23 07:39:41 -07:00
2009-09-22 07:17:24 -07:00
2009-09-27 11:39:25 -07:00
2009-09-19 08:53:22 +02:00
2009-10-05 21:02:02 +02:00
2009-10-15 11:17:17 +02:00
2009-09-14 07:18:25 +02:00
2009-12-16 23:25:50 +01:00
2009-09-24 07:20:57 -07:00
2009-10-01 16:11:13 -07:00
2009-09-01 12:48:21 -04:00
2009-09-04 19:42:22 -04:00
2009-09-24 07:53:22 -07:00
2009-09-09 03:42:23 -07:00
2009-09-15 02:44:17 -07:00
2009-09-24 07:53:22 -07:00
2009-09-24 07:21:04 -07:00
2009-09-15 11:37:33 +10:00
2009-09-24 07:47:35 -04:00
2009-09-19 13:13:19 -07:00
2009-09-30 21:46:59 +02:00
2009-09-19 13:13:30 -07:00
2009-09-15 09:50:49 -07:00
2009-09-24 07:21:01 -07:00
2009-10-30 12:25:12 -07:00
2009-12-01 08:20:31 -08:00
2009-09-14 20:19:06 +03:00
2009-09-24 09:34:40 +09:30
2009-10-05 00:24:36 -07:00
2009-08-31 18:08:51 +02:00
2009-08-31 18:08:51 +02:00
2009-10-29 07:39:25 -07:00
2009-11-17 17:40:33 -08:00
2009-09-24 07:53:22 -07:00
2009-09-16 11:50:05 +02:00
2009-09-23 09:21:05 -07:00
2009-09-24 07:21:04 -07:00
2009-09-18 09:48:52 -07:00
2009-09-01 18:25:07 -07:00
2009-09-02 01:03:43 -07:00
2009-09-24 07:20:56 -07:00
2009-10-14 15:02:34 +02:00
2009-10-24 11:07:51 +02:00
2009-09-24 07:21:00 -07:00
2009-09-24 07:20:57 -07:00
2009-09-15 09:50:47 -07:00
2009-09-27 13:35:16 -07:00
2009-09-19 13:13:35 -07:00
2009-09-23 07:39:48 -07:00
2009-09-23 06:46:23 -07:00
2009-09-23 06:46:39 -07:00
2009-09-23 18:13:10 -07:00
2009-09-24 09:57:08 -07:00
2009-09-19 00:18:36 -03:00
2009-10-22 16:39:28 +10:30
2009-10-22 16:39:28 +10:30
2009-10-22 16:39:30 +10:30
2009-09-23 07:39:29 -07:00
2009-10-22 16:39:28 +10:30
2009-09-23 22:26:32 +09:30
2009-10-22 16:39:28 +10:30
2009-10-22 16:39:28 +10:30
2009-09-23 22:26:31 +09:30
2009-09-22 07:17:30 -07:00
2009-09-19 13:13:25 -07:00
2009-11-19 13:43:06 -08:00
2009-09-15 16:51:30 +02:00
2009-09-04 20:20:58 +04:00
2009-09-23 03:49:27 +04:00
2009-10-14 09:16:42 -07:00
2009-09-24 07:21:04 -07:00
2009-09-10 10:11:22 +10:00