|
@@ -130,19 +130,29 @@ struct f2fs_dir_entry *find_target_dentry(struct fscrypt_name *fname,
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- /* encrypted case */
|
|
|
+ if (de->hash_code != namehash)
|
|
|
+ goto not_match;
|
|
|
+
|
|
|
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))
|
|
|
+#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))
|
|
|
goto found;
|
|
|
-
|
|
|
+not_match:
|
|
|
if (max_slots && max_len > *max_slots)
|
|
|
*max_slots = max_len;
|
|
|
max_len = 0;
|
|
@@ -170,12 +180,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);
|
|
@@ -542,7 +547,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) {
|