aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2009-06-02 08:24:00 -0400
committerJoel Becker <joel.becker@oracle.com>2009-06-03 22:14:29 -0400
commitb4c30de39a2596503e888a7b47d19792f25913d6 (patch)
tree835abce3ce64d3dfbb939675304d0ff1e6406cfd
parent4e8a301929bfa017e6ffe11e3cf78ccaf8492801 (diff)
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>
-rw-r--r--fs/ocfs2/quota_local.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c
index 07deec5e9721..71cf410e89f0 100644
--- a/fs/ocfs2/quota_local.c
+++ b/fs/ocfs2/quota_local.c
@@ -655,6 +655,9 @@ static int ocfs2_local_read_info(struct super_block *sb, int type)
655 struct ocfs2_quota_recovery *rec; 655 struct ocfs2_quota_recovery *rec;
656 int locked = 0; 656 int locked = 0;
657 657
658 /* We don't need the lock and we have to acquire quota file locks
659 * which will later depend on this lock */
660 mutex_unlock(&sb_dqopt(sb)->dqio_mutex);
658 info->dqi_maxblimit = 0x7fffffffffffffffLL; 661 info->dqi_maxblimit = 0x7fffffffffffffffLL;
659 info->dqi_maxilimit = 0x7fffffffffffffffLL; 662 info->dqi_maxilimit = 0x7fffffffffffffffLL;
660 oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS); 663 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)
733 goto out_err; 736 goto out_err;
734 } 737 }
735 738
739 mutex_lock(&sb_dqopt(sb)->dqio_mutex);
736 return 0; 740 return 0;
737out_err: 741out_err:
738 if (oinfo) { 742 if (oinfo) {
@@ -746,6 +750,7 @@ out_err:
746 kfree(oinfo); 750 kfree(oinfo);
747 } 751 }
748 brelse(bh); 752 brelse(bh);
753 mutex_lock(&sb_dqopt(sb)->dqio_mutex);
749 return -1; 754 return -1;
750} 755}
751 756