Merge tag 'f2fs-for-5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[linux-2.6-microblaze.git] / fs / f2fs / namei.c
index 5f213f0..5ed79b2 100644 (file)
@@ -22,7 +22,8 @@
 #include "acl.h"
 #include <trace/events/f2fs.h>
 
-static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
+static struct inode *f2fs_new_inode(struct user_namespace *mnt_userns,
+                                               struct inode *dir, umode_t mode)
 {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        nid_t ino;
@@ -46,7 +47,7 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
 
        nid_free = true;
 
-       inode_init_owner(&init_user_ns, inode, dir, mode);
+       inode_init_owner(mnt_userns, inode, dir, mode);
 
        inode->i_ino = ino;
        inode->i_blocks = 0;
@@ -67,7 +68,7 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
                (F2FS_I(dir)->i_flags & F2FS_PROJINHERIT_FL))
                F2FS_I(inode)->i_projid = F2FS_I(dir)->i_projid;
        else
-               F2FS_I(inode)->i_projid = make_kprojid(&init_user_ns,
+               F2FS_I(inode)->i_projid = make_kprojid(mnt_userns,
                                                        F2FS_DEF_PROJID);
 
        err = fscrypt_prepare_new_inode(dir, inode, &encrypt);
@@ -196,7 +197,7 @@ static inline void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *
        __u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list;
        int i, cold_count, hot_count;
 
-       down_read(&sbi->sb_lock);
+       f2fs_down_read(&sbi->sb_lock);
 
        cold_count = le32_to_cpu(sbi->raw_super->extension_count);
        hot_count = sbi->raw_super->hot_ext_count;
@@ -206,7 +207,7 @@ static inline void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *
                        break;
        }
 
-       up_read(&sbi->sb_lock);
+       f2fs_up_read(&sbi->sb_lock);
 
        if (i == cold_count + hot_count)
                return;
@@ -299,19 +300,19 @@ static void set_compress_inode(struct f2fs_sb_info *sbi, struct inode *inode,
                        (!ext_cnt && !noext_cnt))
                return;
 
-       down_read(&sbi->sb_lock);
+       f2fs_down_read(&sbi->sb_lock);
 
        cold_count = le32_to_cpu(sbi->raw_super->extension_count);
        hot_count = sbi->raw_super->hot_ext_count;
 
        for (i = cold_count; i < cold_count + hot_count; i++) {
                if (is_extension_exist(name, extlist[i], false)) {
-                       up_read(&sbi->sb_lock);
+                       f2fs_up_read(&sbi->sb_lock);
                        return;
                }
        }
 
-       up_read(&sbi->sb_lock);
+       f2fs_up_read(&sbi->sb_lock);
 
        for (i = 0; i < noext_cnt; i++) {
                if (is_extension_exist(name, noext[i], false)) {
@@ -349,7 +350,7 @@ static int f2fs_create(struct user_namespace *mnt_userns, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(dir, mode);
+       inode = f2fs_new_inode(mnt_userns, dir, mode);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -679,7 +680,7 @@ static int f2fs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(dir, S_IFLNK | S_IRWXUGO);
+       inode = f2fs_new_inode(mnt_userns, dir, S_IFLNK | S_IRWXUGO);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -750,7 +751,7 @@ static int f2fs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(dir, S_IFDIR | mode);
+       inode = f2fs_new_inode(mnt_userns, dir, S_IFDIR | mode);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -807,7 +808,7 @@ static int f2fs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(dir, mode);
+       inode = f2fs_new_inode(mnt_userns, dir, mode);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -834,8 +835,9 @@ out:
        return err;
 }
 
-static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
-                                       umode_t mode, struct inode **whiteout)
+static int __f2fs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
+                                       struct dentry *dentry, umode_t mode,
+                                       struct inode **whiteout)
 {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        struct inode *inode;
@@ -845,7 +847,7 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
        if (err)
                return err;
 
-       inode = f2fs_new_inode(dir, mode);
+       inode = f2fs_new_inode(mnt_userns, dir, mode);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
 
@@ -909,20 +911,22 @@ static int f2fs_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
        if (!f2fs_is_checkpoint_ready(sbi))
                return -ENOSPC;
 
-       return __f2fs_tmpfile(dir, dentry, mode, NULL);
+       return __f2fs_tmpfile(mnt_userns, dir, dentry, mode, NULL);
 }
 
-static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout)
+static int f2fs_create_whiteout(struct user_namespace *mnt_userns,
+                               struct inode *dir, struct inode **whiteout)
 {
        if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
                return -EIO;
 
-       return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout);
+       return __f2fs_tmpfile(mnt_userns, dir, NULL,
+                               S_IFCHR | WHITEOUT_MODE, whiteout);
 }
 
-static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
-                       struct inode *new_dir, struct dentry *new_dentry,
-                       unsigned int flags)
+static int f2fs_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
+                       struct dentry *old_dentry, struct inode *new_dir,
+                       struct dentry *new_dentry, unsigned int flags)
 {
        struct f2fs_sb_info *sbi = F2FS_I_SB(old_dir);
        struct inode *old_inode = d_inode(old_dentry);
@@ -960,7 +964,7 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
        }
 
        if (flags & RENAME_WHITEOUT) {
-               err = f2fs_create_whiteout(old_dir, &whiteout);
+               err = f2fs_create_whiteout(mnt_userns, old_dir, &whiteout);
                if (err)
                        return err;
        }
@@ -1023,11 +1027,11 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
                new_page = NULL;
 
                new_inode->i_ctime = current_time(new_inode);
-               down_write(&F2FS_I(new_inode)->i_sem);
+               f2fs_down_write(&F2FS_I(new_inode)->i_sem);
                if (old_dir_entry)
                        f2fs_i_links_write(new_inode, false);
                f2fs_i_links_write(new_inode, false);
-               up_write(&F2FS_I(new_inode)->i_sem);
+               f2fs_up_write(&F2FS_I(new_inode)->i_sem);
 
                if (!new_inode->i_nlink)
                        f2fs_add_orphan_inode(new_inode);
@@ -1048,13 +1052,13 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
                        f2fs_i_links_write(new_dir, true);
        }
 
-       down_write(&F2FS_I(old_inode)->i_sem);
+       f2fs_down_write(&F2FS_I(old_inode)->i_sem);
        if (!old_dir_entry || whiteout)
                file_lost_pino(old_inode);
        else
                /* adjust dir's i_pino to pass fsck check */
                f2fs_i_pino_write(old_inode, new_dir->i_ino);
-       up_write(&F2FS_I(old_inode)->i_sem);
+       f2fs_up_write(&F2FS_I(old_inode)->i_sem);
 
        old_inode->i_ctime = current_time(old_inode);
        f2fs_mark_inode_dirty_sync(old_inode, false);
@@ -1107,8 +1111,7 @@ out_dir:
 out_old:
        f2fs_put_page(old_page, 0);
 out:
-       if (whiteout)
-               iput(whiteout);
+       iput(whiteout);
        return err;
 }
 
@@ -1214,38 +1217,38 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
        /* update directory entry info of old dir inode */
        f2fs_set_link(old_dir, old_entry, old_page, new_inode);
 
-       down_write(&F2FS_I(old_inode)->i_sem);
+       f2fs_down_write(&F2FS_I(old_inode)->i_sem);
        if (!old_dir_entry)
                file_lost_pino(old_inode);
        else
                /* adjust dir's i_pino to pass fsck check */
                f2fs_i_pino_write(old_inode, new_dir->i_ino);
-       up_write(&F2FS_I(old_inode)->i_sem);
+       f2fs_up_write(&F2FS_I(old_inode)->i_sem);
 
        old_dir->i_ctime = current_time(old_dir);
        if (old_nlink) {
-               down_write(&F2FS_I(old_dir)->i_sem);
+               f2fs_down_write(&F2FS_I(old_dir)->i_sem);
                f2fs_i_links_write(old_dir, old_nlink > 0);
-               up_write(&F2FS_I(old_dir)->i_sem);
+               f2fs_up_write(&F2FS_I(old_dir)->i_sem);
        }
        f2fs_mark_inode_dirty_sync(old_dir, false);
 
        /* update directory entry info of new dir inode */
        f2fs_set_link(new_dir, new_entry, new_page, old_inode);
 
-       down_write(&F2FS_I(new_inode)->i_sem);
+       f2fs_down_write(&F2FS_I(new_inode)->i_sem);
        if (!new_dir_entry)
                file_lost_pino(new_inode);
        else
                /* adjust dir's i_pino to pass fsck check */
                f2fs_i_pino_write(new_inode, old_dir->i_ino);
-       up_write(&F2FS_I(new_inode)->i_sem);
+       f2fs_up_write(&F2FS_I(new_inode)->i_sem);
 
        new_dir->i_ctime = current_time(new_dir);
        if (new_nlink) {
-               down_write(&F2FS_I(new_dir)->i_sem);
+               f2fs_down_write(&F2FS_I(new_dir)->i_sem);
                f2fs_i_links_write(new_dir, new_nlink > 0);
-               up_write(&F2FS_I(new_dir)->i_sem);
+               f2fs_up_write(&F2FS_I(new_dir)->i_sem);
        }
        f2fs_mark_inode_dirty_sync(new_dir, false);
 
@@ -1300,7 +1303,8 @@ static int f2fs_rename2(struct user_namespace *mnt_userns,
         * VFS has already handled the new dentry existence case,
         * here, we just deal with "RENAME_NOREPLACE" as regular rename.
         */
-       return f2fs_rename(old_dir, old_dentry, new_dir, new_dentry, flags);
+       return f2fs_rename(mnt_userns, old_dir, old_dentry,
+                                       new_dir, new_dentry, flags);
 }
 
 static const char *f2fs_encrypted_get_link(struct dentry *dentry,