f2fs: add roll-forward recovery process for encrypted dentry
[deliverable/linux.git] / fs / f2fs / recovery.c
index 9e652d5a659bd3377be2a818e0f8e1c61e7b4272..ba0fc2ec7caf2152864fbdbe4ef5a7ea8b5b7a61 100644 (file)
@@ -96,11 +96,12 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
        struct f2fs_inode *raw_inode = F2FS_INODE(ipage);
        nid_t pino = le32_to_cpu(raw_inode->i_pino);
        struct f2fs_dir_entry *de;
-       struct qstr name;
+       struct fscrypt_name fname;
        struct page *page;
        struct inode *dir, *einode;
        struct fsync_inode_entry *entry;
        int err = 0;
+       char *name;
 
        entry = get_fsync_inode(dir_list, pino);
        if (!entry) {
@@ -120,19 +121,17 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
 
        dir = entry->inode;
 
-       if (file_enc_name(inode))
-               return 0;
-
-       name.len = le32_to_cpu(raw_inode->i_namelen);
-       name.name = raw_inode->i_name;
+       memset(&fname, 0, sizeof(struct fscrypt_name));
+       fname.disk_name.len = le32_to_cpu(raw_inode->i_namelen);
+       fname.disk_name.name = raw_inode->i_name;
 
-       if (unlikely(name.len > F2FS_NAME_LEN)) {
+       if (unlikely(fname.disk_name.len > F2FS_NAME_LEN)) {
                WARN_ON(1);
                err = -ENAMETOOLONG;
                goto out;
        }
 retry:
-       de = f2fs_find_entry(dir, &name, &page);
+       de = __f2fs_find_entry(dir, &fname, &page);
        if (de && inode->i_ino == le32_to_cpu(de->ino))
                goto out_unmap_put;
 
@@ -156,7 +155,7 @@ retry:
        } else if (IS_ERR(page)) {
                err = PTR_ERR(page);
        } else {
-               err = __f2fs_add_link(dir, &name, inode,
+               err = __f2fs_do_add_link(dir, &fname, inode,
                                        inode->i_ino, inode->i_mode);
        }
        goto out;
@@ -165,9 +164,13 @@ out_unmap_put:
        f2fs_dentry_kunmap(dir, page);
        f2fs_put_page(page, 0);
 out:
+       if (file_enc_name(inode))
+               name = "<encrypted>";
+       else
+               name = raw_inode->i_name;
        f2fs_msg(inode->i_sb, KERN_NOTICE,
                        "%s: ino = %x, name = %s, dir = %lx, err = %d",
-                       __func__, ino_of_node(ipage), raw_inode->i_name,
+                       __func__, ino_of_node(ipage), name,
                        IS_ERR(dir) ? 0 : dir->i_ino, err);
        return err;
 }
@@ -636,6 +639,8 @@ out:
                        invalidate = true;
                }
 
+               f2fs_wait_all_discard_bio(sbi);
+
                /* Flush all the NAT/SIT pages */
                while (get_pages(sbi, F2FS_DIRTY_META))
                        sync_meta_pages(sbi, META, LONG_MAX);
This page took 0.024866 seconds and 5 git commands to generate.