Merge tag 'for-f2fs-4.12' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[sfrench/cifs-2.6.git] / fs / f2fs / dir.c
index f32e23eaf8dc896be457c2a009b3b6a8064bd182..94756f55a97e7d86052cdb49ce79fcc131738cfd 100644 (file)
@@ -94,7 +94,7 @@ static struct f2fs_dir_entry *find_in_block(struct page *dentry_page,
 
        dentry_blk = (struct f2fs_dentry_block *)kmap(dentry_page);
 
-       make_dentry_ptr(NULL, &d, (void *)dentry_blk, 1);
+       make_dentry_ptr_block(NULL, &d, dentry_blk);
        de = find_target_dentry(fname, namehash, max_slots, &d);
        if (de)
                *res_page = dentry_page;
@@ -111,8 +111,6 @@ struct f2fs_dir_entry *find_target_dentry(struct fscrypt_name *fname,
        struct f2fs_dir_entry *de;
        unsigned long bit_pos = 0;
        int max_len = 0;
-       struct fscrypt_str de_name = FSTR_INIT(NULL, 0);
-       struct fscrypt_str *name = &fname->disk_name;
 
        if (max_slots)
                *max_slots = 0;
@@ -130,29 +128,11 @@ struct f2fs_dir_entry *find_target_dentry(struct fscrypt_name *fname,
                        continue;
                }
 
-               if (de->hash_code != namehash)
-                       goto not_match;
-
-               de_name.name = d->filename[bit_pos];
-               de_name.len = le16_to_cpu(de->name_len);
-
-#ifdef CONFIG_F2FS_FS_ENCRYPTION
-               if (unlikely(!name->name)) {
-                       if (fname->usr_fname->name[0] == '_') {
-                               if (de_name.len >= 16 &&
-                                       !memcmp(de_name.name + de_name.len - 16,
-                                               fname->crypto_buf.name + 8, 16))
-                                       goto found;
-                               goto not_match;
-                       }
-                       name->name = fname->crypto_buf.name;
-                       name->len = fname->crypto_buf.len;
-               }
-#endif
-               if (de_name.len == name->len &&
-                               !memcmp(de_name.name, name->name, name->len))
+               if (de->hash_code == namehash &&
+                   fscrypt_match_name(fname, d->filename[bit_pos],
+                                      le16_to_cpu(de->name_len)))
                        goto found;
-not_match:
+
                if (max_slots && max_len > *max_slots)
                        *max_slots = max_len;
                max_len = 0;
@@ -212,13 +192,9 @@ static struct f2fs_dir_entry *find_in_level(struct inode *dir,
                f2fs_put_page(dentry_page, 0);
        }
 
-       /* This is to increase the speed of f2fs_create */
-       if (!de && room) {
-               F2FS_I(dir)->task = current;
-               if (F2FS_I(dir)->chash != namehash) {
-                       F2FS_I(dir)->chash = namehash;
-                       F2FS_I(dir)->clevel = level;
-               }
+       if (!de && room && F2FS_I(dir)->chash != namehash) {
+               F2FS_I(dir)->chash = namehash;
+               F2FS_I(dir)->clevel = level;
        }
 
        return de;
@@ -259,6 +235,9 @@ struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
                        break;
        }
 out:
+       /* This is to increase the speed of f2fs_create */
+       if (!de)
+               F2FS_I(dir)->task = current;
        return de;
 }
 
@@ -342,24 +321,6 @@ static void init_dent_inode(const struct qstr *name, struct page *ipage)
        set_page_dirty(ipage);
 }
 
-int update_dent_inode(struct inode *inode, struct inode *to,
-                                       const struct qstr *name)
-{
-       struct page *page;
-
-       if (file_enc_name(to))
-               return 0;
-
-       page = get_node_page(F2FS_I_SB(inode), inode->i_ino);
-       if (IS_ERR(page))
-               return PTR_ERR(page);
-
-       init_dent_inode(name, page);
-       f2fs_put_page(page, 1);
-
-       return 0;
-}
-
 void do_make_empty_dir(struct inode *inode, struct inode *parent,
                                        struct f2fs_dentry_ptr *d)
 {
@@ -389,7 +350,7 @@ static int make_empty_dir(struct inode *inode,
 
        dentry_blk = kmap_atomic(dentry_page);
 
-       make_dentry_ptr(NULL, &d, (void *)dentry_blk, 1);
+       make_dentry_ptr_block(NULL, &d, dentry_blk);
        do_make_empty_dir(inode, parent, &d);
 
        kunmap_atomic(dentry_blk);
@@ -443,8 +404,11 @@ struct page *init_inode_metadata(struct inode *inode, struct inode *dir,
                set_cold_node(inode, page);
        }
 
-       if (new_name)
+       if (new_name) {
                init_dent_inode(new_name, page);
+               if (f2fs_encrypted_inode(dir))
+                       file_set_enc_name(inode);
+       }
 
        /*
         * This file should be checkpointed during fsync.
@@ -604,11 +568,9 @@ add_dentry:
                        err = PTR_ERR(page);
                        goto fail;
                }
-               if (f2fs_encrypted_inode(dir))
-                       file_set_enc_name(inode);
        }
 
-       make_dentry_ptr(NULL, &d, (void *)dentry_blk, 1);
+       make_dentry_ptr_block(NULL, &d, dentry_blk);
        f2fs_update_dentry(ino, mode, &d, new_name, dentry_hash, bit_pos);
 
        set_page_dirty(dentry_page);
@@ -916,7 +878,7 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx)
 
                dentry_blk = kmap(dentry_page);
 
-               make_dentry_ptr(inode, &d, (void *)dentry_blk, 1);
+               make_dentry_ptr_block(inode, &d, dentry_blk);
 
                err = f2fs_fill_dentries(ctx, &d,
                                n * NR_DENTRY_IN_BLOCK, &fstr);