Merge branch 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86
[cascardo/linux.git] / fs / f2fs / recovery.c
index b1ae89f..a112368 100644 (file)
@@ -46,15 +46,10 @@ static int recover_dentry(struct page *ipage, struct inode *inode)
        struct inode *dir, *einode;
        int err = 0;
 
-       dir = check_dirty_dir_inode(F2FS_SB(inode->i_sb), pino);
-       if (!dir) {
-               dir = f2fs_iget(inode->i_sb, pino);
-               if (IS_ERR(dir)) {
-                       err = PTR_ERR(dir);
-                       goto out;
-               }
-               set_inode_flag(F2FS_I(dir), FI_DELAY_IPUT);
-               add_dirty_dir_inode(dir);
+       dir = f2fs_iget(inode->i_sb, pino);
+       if (IS_ERR(dir)) {
+               err = PTR_ERR(dir);
+               goto out;
        }
 
        name.len = le32_to_cpu(raw_inode->i_namelen);
@@ -63,7 +58,7 @@ static int recover_dentry(struct page *ipage, struct inode *inode)
        if (unlikely(name.len > F2FS_NAME_LEN)) {
                WARN_ON(1);
                err = -ENAMETOOLONG;
-               goto out;
+               goto out_err;
        }
 retry:
        de = f2fs_find_entry(dir, &name, &page);
@@ -73,7 +68,8 @@ retry:
                einode = f2fs_iget(inode->i_sb, le32_to_cpu(de->ino));
                if (IS_ERR(einode)) {
                        WARN_ON(1);
-                       if (PTR_ERR(einode) == -ENOENT)
+                       err = PTR_ERR(einode);
+                       if (err == -ENOENT)
                                err = -EEXIST;
                        goto out_unmap_put;
                }
@@ -87,11 +83,23 @@ retry:
                goto retry;
        }
        err = __f2fs_add_link(dir, &name, inode);
+       if (err)
+               goto out_err;
+
+       if (is_inode_flag_set(F2FS_I(dir), FI_DELAY_IPUT)) {
+               iput(dir);
+       } else {
+               add_dirty_dir_inode(dir);
+               set_inode_flag(F2FS_I(dir), FI_DELAY_IPUT);
+       }
+
        goto out;
 
 out_unmap_put:
        kunmap(page);
        f2fs_put_page(page, 0);
+out_err:
+       iput(dir);
 out:
        f2fs_msg(inode->i_sb, KERN_NOTICE,
                        "%s: ino = %x, name = %s, dir = %lx, err = %d",
@@ -299,10 +307,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
                goto out;
 
        start = start_bidx_of_node(ofs_of_node(page), fi);
-       if (IS_INODE(page))
-               end = start + ADDRS_PER_INODE(fi);
-       else
-               end = start + ADDRS_PER_BLOCK;
+       end = start + ADDRS_PER_PAGE(page, fi);
 
        f2fs_lock_op(sbi);