]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ocfs2: should call ocfs2_journal_access_di() before ocfs2_delete_entry() in ocfs2_orp...
authorYounger Liu <younger.liu@huawei.com>
Tue, 5 Nov 2013 05:55:11 +0000 (16:55 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 5 Nov 2013 05:55:11 +0000 (16:55 +1100)
While deleting a file into orphan dir in ocfs2_orphan_del(), it calls
ocfs2_delete_entry() before ocfs2_journal_access_di().  If
ocfs2_delete_entry() succeeded and ocfs2_journal_access_di() failed, there
would be a inconsistency: the file is deleted from orphan dir, but orphan
dir dinode is not updated.

So we need to call ocfs2_journal_access_di() before ocfs2_orphan_del().

Signed-off-by: Younger Liu <younger.liu@huawei.com>
Reviewed-by: Jensen <shencanquan@huawei.com>
Cc: Jie Liu <jeff.liu@oracle.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Mark Fasheh <mfasheh@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/ocfs2/namei.c

index 4f791f6d27d0463f8bef77dc20a5f5274df8ddea..6ee9b3d34016cc002a060d298c2e98cc85b5ac6a 100644 (file)
@@ -2101,17 +2101,17 @@ int ocfs2_orphan_del(struct ocfs2_super *osb,
                goto leave;
        }
 
-       /* remove it from the orphan directory */
-       status = ocfs2_delete_entry(handle, orphan_dir_inode, &lookup);
+       status = ocfs2_journal_access_di(handle,
+                                        INODE_CACHE(orphan_dir_inode),
+                                        orphan_dir_bh,
+                                        OCFS2_JOURNAL_ACCESS_WRITE);
        if (status < 0) {
                mlog_errno(status);
                goto leave;
        }
 
-       status = ocfs2_journal_access_di(handle,
-                                        INODE_CACHE(orphan_dir_inode),
-                                        orphan_dir_bh,
-                                        OCFS2_JOURNAL_ACCESS_WRITE);
+       /* remove it from the orphan directory */
+       status = ocfs2_delete_entry(handle, orphan_dir_inode, &lookup);
        if (status < 0) {
                mlog_errno(status);
                goto leave;