]> git.itanic.dy.fi Git - linux-stable/commitdiff
ocfs2: Avoid touching renamed directory if parent does not change
authorJan Kara <jack@suse.cz>
Thu, 12 Oct 2023 21:14:21 +0000 (23:14 +0200)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Nov 2023 07:53:20 +0000 (02:53 -0500)
The VFS will not be locking moved directory if its parent does not
change. Change ocfs2 rename code to avoid touching renamed directory if
its parent does not change as without locking that can corrupt the
filesystem.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ocfs2/namei.c

index 814733ba2f4ba0fba52b985301725fb323efda13..9221a33f917b81d8b305fd212758595d75f168fc 100644 (file)
@@ -1336,7 +1336,7 @@ static int ocfs2_rename(struct mnt_idmap *idmap,
                goto bail;
        }
 
-       if (S_ISDIR(old_inode->i_mode)) {
+       if (S_ISDIR(old_inode->i_mode) && new_dir != old_dir) {
                u64 old_inode_parent;
 
                update_dot_dot = 1;
@@ -1353,8 +1353,7 @@ static int ocfs2_rename(struct mnt_idmap *idmap,
                        goto bail;
                }
 
-               if (!new_inode && new_dir != old_dir &&
-                   new_dir->i_nlink >= ocfs2_link_max(osb)) {
+               if (!new_inode && new_dir->i_nlink >= ocfs2_link_max(osb)) {
                        status = -EMLINK;
                        goto bail;
                }
@@ -1601,6 +1600,9 @@ static int ocfs2_rename(struct mnt_idmap *idmap,
                        mlog_errno(status);
                        goto bail;
                }
+       }
+
+       if (S_ISDIR(old_inode->i_mode)) {
                drop_nlink(old_dir);
                if (new_inode) {
                        drop_nlink(new_inode);