]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.fixes/ocfs2-1.4-git-b4c30de39a2596503e888a7b47d19792f25913d6
Updated xen patches taken from suse.
[people/teissler/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.fixes / ocfs2-1.4-git-b4c30de39a2596503e888a7b47d19792f25913d6
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