]>
Commit | Line | Data |
---|---|---|
00e5a55c BS |
1 | From: Jan Kara <jack@suse.cz> |
2 | Subject: ocfs2: Fix lock inversion in ocfs2_local_read_info() | |
3 | Patch-mainline: 2.6.31 | |
4 | ||
5 | This function is called with dqio_mutex held but it has to acquire lock | |
6 | from global quota file which ranks above this lock. This is not deadlockable | |
7 | lock inversion since this code path is take only during mount when noone | |
8 | else can race with us but let's clean this up to silence lockdep. | |
9 | ||
10 | We just drop the dqio_mutex in the beginning of the function and reacquire | |
11 | it in the end since we don't need it - noone can race with us at this moment. | |
12 | ||
13 | Signed-off-by: Jan Kara <jack@suse.cz> | |
14 | --- | |
15 | fs/ocfs2/quota_local.c | 5 +++++ | |
16 | 1 files changed, 5 insertions(+), 0 deletions(-) | |
17 | ||
18 | diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c | |
19 | index 07deec5..71cf410 100644 | |
20 | --- a/fs/ocfs2/quota_local.c | |
21 | +++ b/fs/ocfs2/quota_local.c | |
22 | @@ -655,6 +655,9 @@ static int ocfs2_local_read_info(struct super_block *sb, int type) | |
23 | struct ocfs2_quota_recovery *rec; | |
24 | int locked = 0; | |
25 | ||
26 | + /* We don't need the lock and we have to acquire quota file locks | |
27 | + * which will later depend on this lock */ | |
28 | + mutex_unlock(&sb_dqopt(sb)->dqio_mutex); | |
29 | info->dqi_maxblimit = 0x7fffffffffffffffLL; | |
30 | info->dqi_maxilimit = 0x7fffffffffffffffLL; | |
31 | oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS); | |
32 | @@ -733,6 +736,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type) | |
33 | goto out_err; | |
34 | } | |
35 | ||
36 | + mutex_lock(&sb_dqopt(sb)->dqio_mutex); | |
37 | return 0; | |
38 | out_err: | |
39 | if (oinfo) { | |
40 | @@ -746,6 +750,7 @@ out_err: | |
41 | kfree(oinfo); | |
42 | } | |
43 | brelse(bh); | |
44 | + mutex_lock(&sb_dqopt(sb)->dqio_mutex); | |
45 | return -1; | |
46 | } | |
47 | ||
48 | -- | |
49 | 1.6.0.2 | |
50 |