During block allocation in large free section, we need to change all sub segments' type in it, otherwise, we will fail to allocate block in non-first segment due to mismatch seg-type.
Signed-off-by: Chao Yu <yuch...@huawei.com> --- fsck/mount.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/fsck/mount.c b/fsck/mount.c index 46fe1be..ad20d19 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -2393,6 +2393,20 @@ int relocate_curseg_offset(struct f2fs_sb_info *sbi, int type) return 0; } +void set_section_type(struct f2fs_sb_info *sbi, unsigned int segno, int type) +{ + struct seg_entry *se; + unsigned int i; + + if (sbi->segs_per_sec == 1) + return; + + for (i = 0; i < sbi->segs_per_sec; i++) { + se = get_seg_entry(sbi, segno + i); + se->type = type; + } +} + int find_next_free_block(struct f2fs_sb_info *sbi, u64 *to, int left, int type) { struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi); @@ -2436,8 +2450,11 @@ int find_next_free_block(struct f2fs_sb_info *sbi, u64 *to, int left, int type) if (se2->valid_blocks) break; } - if (i == sbi->segs_per_sec) + + if (i == sbi->segs_per_sec) { + set_section_type(sbi, segno, type); return 0; + } } if (se->type == type && -- 2.18.0.rc1 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel