ocfs2: Fix possible deadlock in ocfs2_global_read_dquot()
It is not possible to get a read lock and then try to get the same write lock in one thread as that can block on downconvert being requested by other node leading to deadlock. So first drop the quota lock for reading and only after that get it for writing. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
parent
2b53bc7bff
commit
4e8a301929
|
@ -421,6 +421,7 @@ int ocfs2_global_read_dquot(struct dquot *dquot)
|
|||
OCFS2_DQUOT(dquot)->dq_originodes = dquot->dq_dqb.dqb_curinodes;
|
||||
if (!dquot->dq_off) { /* No real quota entry? */
|
||||
/* Upgrade to exclusive lock for allocation */
|
||||
ocfs2_qinfo_unlock(info, 0);
|
||||
err = ocfs2_qinfo_lock(info, 1);
|
||||
if (err < 0)
|
||||
goto out_qlock;
|
||||
|
@ -435,7 +436,8 @@ int ocfs2_global_read_dquot(struct dquot *dquot)
|
|||
out_qlock:
|
||||
if (ex)
|
||||
ocfs2_qinfo_unlock(info, 1);
|
||||
ocfs2_qinfo_unlock(info, 0);
|
||||
else
|
||||
ocfs2_qinfo_unlock(info, 0);
|
||||
out:
|
||||
if (err < 0)
|
||||
mlog_errno(err);
|
||||
|
|
Loading…
Reference in New Issue