f2fs: handle quota for orphan inodes
authorJaegeuk Kim <jaegeuk@kernel.org>
Thu, 8 Feb 2018 01:01:48 +0000 (17:01 -0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 12 Mar 2018 23:05:38 +0000 (08:05 +0900)
This is to detect dquot_initialize errors early from evict_inode
for orphan inodes.

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

index 8b0945b..e3bf753 100644 (file)
@@ -569,13 +569,8 @@ static int recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
        struct node_info ni;
        int err = acquire_orphan_inode(sbi);
 
-       if (err) {
-               set_sbi_flag(sbi, SBI_NEED_FSCK);
-               f2fs_msg(sbi->sb, KERN_WARNING,
-                               "%s: orphan failed (ino=%x), run fsck to fix.",
-                               __func__, ino);
-               return err;
-       }
+       if (err)
+               goto err_out;
 
        __add_ino_entry(sbi, ino, 0, ORPHAN_INO);
 
@@ -589,6 +584,11 @@ static int recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
                return PTR_ERR(inode);
        }
 
+       err = dquot_initialize(inode);
+       if (err)
+               goto err_out;
+
+       dquot_initialize(inode);
        clear_nlink(inode);
 
        /* truncate all the data during iput */
@@ -598,14 +598,18 @@ static int recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
 
        /* ENOMEM was fully retried in f2fs_evict_inode. */
        if (ni.blk_addr != NULL_ADDR) {
-               set_sbi_flag(sbi, SBI_NEED_FSCK);
-               f2fs_msg(sbi->sb, KERN_WARNING,
-                       "%s: orphan failed (ino=%x) by kernel, retry mount.",
-                               __func__, ino);
-               return -EIO;
+               err = -EIO;
+               goto err_out;
        }
        __remove_ino_entry(sbi, ino, ORPHAN_INO);
        return 0;
+
+err_out:
+       set_sbi_flag(sbi, SBI_NEED_FSCK);
+       f2fs_msg(sbi->sb, KERN_WARNING,
+                       "%s: orphan failed (ino=%x), run fsck to fix.",
+                       __func__, ino);
+       return err;
 }
 
 int recover_orphan_inodes(struct f2fs_sb_info *sbi)