Commit c06bcbfa authored by Jan Kara's avatar Jan Kara

ocfs2: Fix lock inversion in quotas during umount

We cannot cancel delayed work from ocfs2_local_free_info because that is called
with dqonoff_mutex held and the work it cancels requires dqonoff_mutex to
finish. Cancel the work before acquiring dqonoff_mutex.
Acked-by: default avatarJoel Becker <Joel.Becker@oracle.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 52a9ee28
...@@ -816,10 +816,6 @@ static int ocfs2_local_free_info(struct super_block *sb, int type) ...@@ -816,10 +816,6 @@ static int ocfs2_local_free_info(struct super_block *sb, int type)
int mark_clean = 1, len; int mark_clean = 1, len;
int status; int status;
/* At this point we know there are no more dquots and thus
* even if there's some sync in the pdflush queue, it won't
* find any dquots and return without doing anything */
cancel_delayed_work_sync(&oinfo->dqi_sync_work);
iput(oinfo->dqi_gqinode); iput(oinfo->dqi_gqinode);
ocfs2_simple_drop_lockres(OCFS2_SB(sb), &oinfo->dqi_gqlock); ocfs2_simple_drop_lockres(OCFS2_SB(sb), &oinfo->dqi_gqlock);
ocfs2_lock_res_free(&oinfo->dqi_gqlock); ocfs2_lock_res_free(&oinfo->dqi_gqlock);
......
...@@ -938,12 +938,16 @@ static void ocfs2_disable_quotas(struct ocfs2_super *osb) ...@@ -938,12 +938,16 @@ static void ocfs2_disable_quotas(struct ocfs2_super *osb)
int type; int type;
struct inode *inode; struct inode *inode;
struct super_block *sb = osb->sb; struct super_block *sb = osb->sb;
struct ocfs2_mem_dqinfo *oinfo;
/* We mostly ignore errors in this function because there's not much /* We mostly ignore errors in this function because there's not much
* we can do when we see them */ * we can do when we see them */
for (type = 0; type < MAXQUOTAS; type++) { for (type = 0; type < MAXQUOTAS; type++) {
if (!sb_has_quota_loaded(sb, type)) if (!sb_has_quota_loaded(sb, type))
continue; continue;
/* Cancel periodic syncing before we grab dqonoff_mutex */
oinfo = sb_dqinfo(sb, type)->dqi_priv;
cancel_delayed_work_sync(&oinfo->dqi_sync_work);
inode = igrab(sb->s_dquot.files[type]); inode = igrab(sb->s_dquot.files[type]);
/* Turn off quotas. This will remove all dquot structures from /* Turn off quotas. This will remove all dquot structures from
* memory and so they will be automatically synced to global * memory and so they will be automatically synced to global
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment