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 8d5c62b07b283f53e90ded2366c8bb9375409fa2..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,17 +128,9 @@ struct f2fs_dir_entry *find_target_dentry(struct fscrypt_name *fname,
                        continue;
                }
 
-               /* encrypted case */
-               de_name.name = d->filename[bit_pos];
-               de_name.len = le16_to_cpu(de->name_len);
-
-               /* show encrypted name */
-               if (fname->hash) {
-                       if (de->hash_code == cpu_to_le32(fname->hash))
-                               goto found;
-               } else if (de_name.len == name->len &&
-                       de->hash_code == namehash &&
-                       !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;
 
                if (max_slots && max_len > *max_slots)
@@ -170,12 +160,7 @@ static struct f2fs_dir_entry *find_in_level(struct inode *dir,
        struct f2fs_dir_entry *de = NULL;
        bool room = false;
        int max_slots;
-       f2fs_hash_t namehash;
-
-       if(fname->hash)
-               namehash = cpu_to_le32(fname->hash);
-       else
-               namehash = f2fs_dentry_hash(&name);
+       f2fs_hash_t namehash = f2fs_dentry_hash(&name, fname);
 
        nbucket = dir_buckets(level, F2FS_I(dir)->i_dir_level);
        nblock = bucket_blocks(level);
@@ -207,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;
@@ -254,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;
 }
 
@@ -337,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)
 {
@@ -384,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);
@@ -438,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.
@@ -542,7 +511,7 @@ int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name,
 
        level = 0;
        slots = GET_DENTRY_SLOTS(new_name->len);
-       dentry_hash = f2fs_dentry_hash(new_name);
+       dentry_hash = f2fs_dentry_hash(new_name, NULL);
 
        current_depth = F2FS_I(dir)->i_current_depth;
        if (F2FS_I(dir)->chash == dentry_hash) {
@@ -599,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);
@@ -911,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);