]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.fixes/ocfs2-1.4-git-b4c30de39a2596503e888a7b47d19792f25913d6
Imported linux-2.6.27.39 suse/xen patches.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.fixes / ocfs2-1.4-git-b4c30de39a2596503e888a7b47d19792f25913d6
CommitLineData
2cb7cef9
BS
1From: Jan Kara <jack@suse.cz>
2Subject: ocfs2: Fix lock inversion in ocfs2_local_read_info()
3Patch-mainline: 2.6.31
4
5This function is called with dqio_mutex held but it has to acquire lock
6from global quota file which ranks above this lock. This is not deadlockable
7lock inversion since this code path is take only during mount when noone
8else can race with us but let's clean this up to silence lockdep.
9
10We just drop the dqio_mutex in the beginning of the function and reacquire
11it in the end since we don't need it - noone can race with us at this moment.
12
13Signed-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