Re: [f2fs-dev] [PATCH 2/2] f2fs: fix to check return value of f2fs_gc_range

2024-03-03 Thread Chao Yu

On 2024/3/1 16:25, Zhiguo Niu wrote:

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 


Reviewed-by: Chao Yu 

Thanks,


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


[f2fs-dev] [PATCH 2/2] f2fs: fix to check return value of f2fs_gc_range

2024-03-01 Thread Zhiguo Niu
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 
---
 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(>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(>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