1 From: Jan Kara <jack@suse.cz>
2 Subject: ocfs2: Fix lock inversion in ocfs2_local_read_info()
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.
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.
13 Signed-off-by: Jan Kara <jack@suse.cz>
15 fs/ocfs2/quota_local.c | 5 +++++
16 1 file changed, 5 insertions(+)
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;
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
34 + mutex_lock(&sb_dqopt(sb)->dqio_mutex);
38 @@ -738,6 +742,7 @@ out_err:
42 + mutex_lock(&sb_dqopt(sb)->dqio_mutex);