]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/f2fs/dir.c
Merge remote-tracking branch 'f2fs/dev'
[karo-tx-linux.git] / fs / f2fs / dir.c
index 8f15fc134040c5ee4865f975cc37dfeffe58360f..7c1678ba8f9265c98df78d16d18c7510aeafa1a4 100644 (file)
@@ -258,7 +258,7 @@ struct f2fs_dir_entry *f2fs_parent_dir(struct inode *dir, struct page **p)
        if (f2fs_has_inline_dentry(dir))
                return f2fs_parent_inline_dir(dir, p);
 
-       page = get_lock_data_page(dir, 0);
+       page = get_lock_data_page(dir, 0, false);
        if (IS_ERR(page))
                return NULL;
 
@@ -740,7 +740,7 @@ bool f2fs_empty_dir(struct inode *dir)
                return f2fs_empty_inline_dir(dir);
 
        for (bidx = 0; bidx < nblock; bidx++) {
-               dentry_page = get_lock_data_page(dir, bidx);
+               dentry_page = get_lock_data_page(dir, bidx, false);
                if (IS_ERR(dentry_page)) {
                        if (PTR_ERR(dentry_page) == -ENOENT)
                                continue;
@@ -787,7 +787,6 @@ bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
                else
                        d_type = DT_UNKNOWN;
 
-               /* encrypted case */
                de_name.name = d->filename[bit_pos];
                de_name.len = le16_to_cpu(de->name_len);
 
@@ -795,12 +794,20 @@ bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
                        int save_len = fstr->len;
                        int ret;
 
+                       de_name.name = kmalloc(de_name.len, GFP_NOFS);
+                       if (!de_name.name)
+                               return false;
+
+                       memcpy(de_name.name, d->filename[bit_pos], de_name.len);
+
                        ret = f2fs_fname_disk_to_usr(d->inode, &de->hash_code,
                                                        &de_name, fstr);
-                       de_name = *fstr;
-                       fstr->len = save_len;
+                       kfree(de_name.name);
                        if (ret < 0)
                                return true;
+
+                       de_name = *fstr;
+                       fstr->len = save_len;
                }
 
                if (!dir_emit(ctx, de_name.name, de_name.len,
@@ -847,7 +854,7 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx)
                                min(npages - n, (pgoff_t)MAX_DIR_RA_PAGES));
 
        for (; n < npages; n++) {
-               dentry_page = get_lock_data_page(inode, n);
+               dentry_page = get_lock_data_page(inode, n, false);
                if (IS_ERR(dentry_page))
                        continue;