f2fs_gc_range may return error, so its caller
f2fs_allocate_pinning_section should determine whether
to do retry based on ist return value.

Also just do f2fs_gc_range when f2fs_allocate_new_section
return -EAGAIN, and check cp error case in f2fs_gc_range.

Signed-off-by: Zhiguo Niu <zhiguo....@unisoc.com>
---
 fs/f2fs/gc.c      |  3 +++
 fs/f2fs/segment.c | 13 ++++++++-----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index e435e1f..c60b747 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -1986,6 +1986,9 @@ int f2fs_gc_range(struct f2fs_sb_info *sbi,
        unsigned int segno;
        unsigned int gc_secs = dry_run_sections;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        for (segno = start_seg; segno <= end_seg; segno += SEGS_PER_SEC(sbi)) {
                struct gc_inode_list gc_list = {
                        .ilist = LIST_HEAD_INIT(gc_list.ilist),
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index 72f6ee3..1bb3019 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -3109,6 +3109,7 @@ static int __allocate_new_segment(struct f2fs_sb_info 
*sbi, int type,
 {
        struct curseg_info *curseg = CURSEG_I(sbi, type);
        unsigned int old_segno;
+       int err = 0;
 
        if (type == CURSEG_COLD_DATA_PINNED && !curseg->inited)
                goto allocate;
@@ -3121,8 +3122,9 @@ static int __allocate_new_segment(struct f2fs_sb_info 
*sbi, int type,
 
 allocate:
        old_segno = curseg->segno;
-       if (new_curseg(sbi, type, true))
-               return -EAGAIN;
+       err = new_curseg(sbi, type, true);
+       if (err)
+               return err;
        stat_inc_seg_type(sbi, curseg);
        locate_dirty_segment(sbi, old_segno);
        return 0;
@@ -3151,13 +3153,14 @@ int f2fs_allocate_pinning_section(struct f2fs_sb_info 
*sbi)
        err = f2fs_allocate_new_section(sbi, CURSEG_COLD_DATA_PINNED, false);
        f2fs_unlock_op(sbi);
 
-       if (f2fs_sb_has_blkzoned(sbi) && err && gc_required) {
+       if (f2fs_sb_has_blkzoned(sbi) && err == -EAGAIN && gc_required) {
                f2fs_down_write(&sbi->gc_lock);
-               f2fs_gc_range(sbi, 0, GET_SEGNO(sbi, FDEV(0).end_blk), true, 1);
+               err = f2fs_gc_range(sbi, 0, GET_SEGNO(sbi, FDEV(0).end_blk), 
true, 1);
                f2fs_up_write(&sbi->gc_lock);
 
                gc_required = false;
-               goto retry;
+               if (!err)
+                       goto retry;
        }
 
        return err;
-- 
1.9.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to