ocfs2: Fix lock inversion in ocfs2_local_read_info()
This function is called with dqio_mutex held but it has to acquire lock from global quota file which ranks above this lock. This is not deadlockable lock inversion since this code path is take only during mount when noone else can race with us but let's clean this up to silence lockdep. We just drop the dqio_mutex in the beginning of the function and reacquire it in the end since we don't need it - noone can race with us at this moment. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
parent
4e8a301929
commit
b4c30de39a
|
@ -655,6 +655,9 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
|
||||||
struct ocfs2_quota_recovery *rec;
|
struct ocfs2_quota_recovery *rec;
|
||||||
int locked = 0;
|
int locked = 0;
|
||||||
|
|
||||||
|
/* We don't need the lock and we have to acquire quota file locks
|
||||||
|
* which will later depend on this lock */
|
||||||
|
mutex_unlock(&sb_dqopt(sb)->dqio_mutex);
|
||||||
info->dqi_maxblimit = 0x7fffffffffffffffLL;
|
info->dqi_maxblimit = 0x7fffffffffffffffLL;
|
||||||
info->dqi_maxilimit = 0x7fffffffffffffffLL;
|
info->dqi_maxilimit = 0x7fffffffffffffffLL;
|
||||||
oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS);
|
oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS);
|
||||||
|
@ -733,6 +736,7 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_lock(&sb_dqopt(sb)->dqio_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
out_err:
|
out_err:
|
||||||
if (oinfo) {
|
if (oinfo) {
|
||||||
|
@ -746,6 +750,7 @@ out_err:
|
||||||
kfree(oinfo);
|
kfree(oinfo);
|
||||||
}
|
}
|
||||||
brelse(bh);
|
brelse(bh);
|
||||||
|
mutex_lock(&sb_dqopt(sb)->dqio_mutex);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue