OSDN Git Service

f2fs: make sure f2fs_gc returns consistent errno
authorWeichao Guo <guoweichao@huawei.com>
Wed, 10 May 2017 20:28:00 +0000 (04:28 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 24 May 2017 04:05:35 +0000 (21:05 -0700)
By default, f2fs_gc returns -EINVAL in general error cases, e.g., no victim
was selected. However, the default errno may be overwritten in two cases:
gc_more and BG_GC -> FG_GC. We should return consistent errno in such cases.

Signed-off-by: Weichao Guo <guoweichao@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/gc.c

index 0265221..965fbf5 100644 (file)
@@ -955,7 +955,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
 {
        int gc_type = sync ? FG_GC : BG_GC;
        int sec_freed = 0;
-       int ret = -EINVAL;
+       int ret;
        struct cp_control cpc;
        unsigned int init_segno = segno;
        struct gc_inode_list gc_list = {
@@ -965,8 +965,10 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
 
        cpc.reason = __get_cp_reason(sbi);
 gc_more:
-       if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE)))
+       if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE))) {
+               ret = -EINVAL;
                goto stop;
+       }
        if (unlikely(f2fs_cp_error(sbi))) {
                ret = -EIO;
                goto stop;
@@ -987,6 +989,7 @@ gc_more:
                        gc_type = FG_GC;
        }
 
+       ret = -EINVAL;
        /* f2fs_balance_fs doesn't need to do BG_GC in critical path. */
        if (gc_type == BG_GC && !background)
                goto stop;