ocfs2: adjust code to match locking/unlocking order
authorJoseph Qi <joseph.qi@huawei.com>
Fri, 4 Sep 2015 22:43:52 +0000 (15:43 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 4 Sep 2015 23:54:41 +0000 (16:54 -0700)
Unlocking order in ocfs2_unlink and ocfs2_rename mismatches the
corresponding locking order, although it won't cause issues, adjust the
code so that it looks more reasonable.

Signed-off-by: Joseph Qi <joseph.qi@huawei.com>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/ocfs2/namei.c

index e9ea7f23da125dca99520d5680671c0c89e4ef0f..97c47d71efa721d9e1f669634538600c726ddc46 100644 (file)
@@ -1035,11 +1035,6 @@ leave:
        if (handle)
                ocfs2_commit_trans(osb, handle);
 
-       if (child_locked)
-               ocfs2_inode_unlock(inode, 1);
-
-       ocfs2_inode_unlock(dir, 1);
-
        if (orphan_dir) {
                /* This was locked for us in ocfs2_prepare_orphan_dir() */
                ocfs2_inode_unlock(orphan_dir, 1);
@@ -1047,6 +1042,11 @@ leave:
                iput(orphan_dir);
        }
 
+       if (child_locked)
+               ocfs2_inode_unlock(inode, 1);
+
+       ocfs2_inode_unlock(dir, 1);
+
        brelse(fe_bh);
        brelse(parent_node_bh);
 
@@ -1633,21 +1633,9 @@ static int ocfs2_rename(struct inode *old_dir,
        ocfs2_dentry_move(old_dentry, new_dentry, old_dir, new_dir);
        status = 0;
 bail:
-       if (rename_lock)
-               ocfs2_rename_unlock(osb);
-
        if (handle)
                ocfs2_commit_trans(osb, handle);
 
-       if (parents_locked)
-               ocfs2_double_unlock(old_dir, new_dir);
-
-       if (old_child_locked)
-               ocfs2_inode_unlock(old_inode, 1);
-
-       if (new_child_locked)
-               ocfs2_inode_unlock(new_inode, 1);
-
        if (orphan_dir) {
                /* This was locked for us in ocfs2_prepare_orphan_dir() */
                ocfs2_inode_unlock(orphan_dir, 1);
@@ -1655,6 +1643,18 @@ bail:
                iput(orphan_dir);
        }
 
+       if (new_child_locked)
+               ocfs2_inode_unlock(new_inode, 1);
+
+       if (old_child_locked)
+               ocfs2_inode_unlock(old_inode, 1);
+
+       if (parents_locked)
+               ocfs2_double_unlock(old_dir, new_dir);
+
+       if (rename_lock)
+               ocfs2_rename_unlock(osb);
+
        if (new_inode)
                sync_mapping_buffers(old_inode->i_mapping);