f2fs: fix incorrect error path handling in f2fs_move_rehashed_dirents
authorChao Yu <yuchao0@huawei.com>
Sat, 14 May 2016 11:03:53 +0000 (19:03 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 16 May 2016 22:32:01 +0000 (15:32 -0700)
Fix two bugs in error path of f2fs_move_rehashed_dirents:
 - release dir's inode page if fail to call kmalloc
 - recover i_current_depth if fail to converting

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/inline.c

index 60ba7ac808b99a0f38c94690d5fcff28b2eefe09..a4bb155dd00aeaf796ad143f8677590e660eeb77 100644 (file)
@@ -464,12 +464,15 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
                                struct f2fs_inline_dentry *inline_dentry)
 {
        struct f2fs_inline_dentry *backup_dentry;
+       struct f2fs_inode_info *fi = F2FS_I(dir);
        int err;
 
        backup_dentry = f2fs_kmalloc(sizeof(struct f2fs_inline_dentry),
                                                        GFP_F2FS_ZERO);
-       if (!backup_dentry)
+       if (!backup_dentry) {
+               f2fs_put_page(ipage, 1);
                return -ENOMEM;
+       }
 
        memcpy(backup_dentry, inline_dentry, MAX_INLINE_DATA);
        truncate_inline_inode(ipage, 0);
@@ -483,13 +486,14 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
        lock_page(ipage);
 
        stat_dec_inline_dir(dir);
-       clear_inode_flag(F2FS_I(dir), FI_INLINE_DENTRY);
+       clear_inode_flag(fi, FI_INLINE_DENTRY);
        update_inode(dir, ipage);
        kfree(backup_dentry);
        return 0;
 recover:
        lock_page(ipage);
        memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA);
+       fi->i_current_depth = 0;
        i_size_write(dir, MAX_INLINE_DATA);
        update_inode(dir, ipage);
        f2fs_put_page(ipage, 1);