]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - fs/f2fs/namei.c
Merge tag 'f2fs-for-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[thirdparty/linux.git] / fs / f2fs / namei.c
index f7f63a567d869d66e024b0334a06e1cc83c8b6f4..e54f8c08bda832b2b25c93495b796fa943a13d8e 100644 (file)
@@ -851,7 +851,7 @@ out:
 
 static int __f2fs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                          struct file *file, umode_t mode, bool is_whiteout,
-                         struct inode **new_inode)
+                         struct inode **new_inode, struct f2fs_filename *fname)
 {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        struct inode *inode;
@@ -879,7 +879,7 @@ static int __f2fs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
        if (err)
                goto out;
 
-       err = f2fs_do_tmpfile(inode, dir);
+       err = f2fs_do_tmpfile(inode, dir, fname);
        if (err)
                goto release_out;
 
@@ -930,22 +930,24 @@ static int f2fs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
        if (!f2fs_is_checkpoint_ready(sbi))
                return -ENOSPC;
 
-       err = __f2fs_tmpfile(idmap, dir, file, mode, false, NULL);
+       err = __f2fs_tmpfile(idmap, dir, file, mode, false, NULL, NULL);
 
        return finish_open_simple(file, err);
 }
 
 static int f2fs_create_whiteout(struct mnt_idmap *idmap,
-                               struct inode *dir, struct inode **whiteout)
+                               struct inode *dir, struct inode **whiteout,
+                               struct f2fs_filename *fname)
 {
-       return __f2fs_tmpfile(idmap, dir, NULL,
-                               S_IFCHR | WHITEOUT_MODE, true, whiteout);
+       return __f2fs_tmpfile(idmap, dir, NULL, S_IFCHR | WHITEOUT_MODE,
+                                               true, whiteout, fname);
 }
 
 int f2fs_get_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
                     struct inode **new_inode)
 {
-       return __f2fs_tmpfile(idmap, dir, NULL, S_IFREG, false, new_inode);
+       return __f2fs_tmpfile(idmap, dir, NULL, S_IFREG,
+                               false, new_inode, NULL);
 }
 
 static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
@@ -989,7 +991,14 @@ static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
        }
 
        if (flags & RENAME_WHITEOUT) {
-               err = f2fs_create_whiteout(idmap, old_dir, &whiteout);
+               struct f2fs_filename fname;
+
+               err = f2fs_setup_filename(old_dir, &old_dentry->d_name,
+                                                       0, &fname);
+               if (err)
+                       return err;
+
+               err = f2fs_create_whiteout(idmap, old_dir, &whiteout, &fname);
                if (err)
                        return err;
        }
@@ -1104,14 +1113,11 @@ static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
                iput(whiteout);
        }
 
-       if (old_is_dir) {
-               if (old_dir_entry)
-                       f2fs_set_link(old_inode, old_dir_entry,
-                                               old_dir_page, new_dir);
-               else
-                       f2fs_put_page(old_dir_page, 0);
+       if (old_dir_entry)
+               f2fs_set_link(old_inode, old_dir_entry, old_dir_page, new_dir);
+       if (old_is_dir)
                f2fs_i_links_write(old_dir, false);
-       }
+
        if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT) {
                f2fs_add_ino_entry(sbi, new_dir->i_ino, TRANS_DIR_INO);
                if (S_ISDIR(old_inode->i_mode))