]>
Commit | Line | Data |
---|---|---|
2cb7cef9 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 file changed, 5 insertions(+) | |
17 | ||
18 | --- a/fs/ocfs2/quota_local.c | |
19 | +++ b/fs/ocfs2/quota_local.c | |
20 | @@ -647,6 +647,9 @@ static int ocfs2_local_read_info(struct | |
21 | struct ocfs2_quota_recovery *rec; | |
22 | int locked = 0; | |
23 | ||
24 | + /* We don't need the lock and we have to acquire quota file locks | |
25 | + * which will later depend on this lock */ | |
26 | + mutex_unlock(&sb_dqopt(sb)->dqio_mutex); | |
27 | info->dqi_maxblimit = 0x7fffffffffffffffLL; | |
28 | info->dqi_maxilimit = 0x7fffffffffffffffLL; | |
29 | oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS); | |
30 | @@ -725,6 +728,7 @@ static int ocfs2_local_read_info(struct | |
31 | goto out_err; | |
32 | } | |
33 | ||
34 | + mutex_lock(&sb_dqopt(sb)->dqio_mutex); | |
35 | return 0; | |
36 | out_err: | |
37 | if (oinfo) { | |
38 | @@ -738,6 +742,7 @@ out_err: | |
39 | kfree(oinfo); | |
40 | } | |
41 | brelse(bh); | |
42 | + mutex_lock(&sb_dqopt(sb)->dqio_mutex); | |
43 | return -1; | |
44 | } | |
45 |