On 2018/7/12 23:09, Yunlong Song wrote: > For the case when sbi->segs_per_sec > 1, take section:segment = 5 for > example, if the section prefree_map is ...previous section | current > section (1 1 0 1 1) | next section..., then the start = x, end = x + 1, > after start = start_segno + sbi->segs_per_sec, start = x + 5, then it > will skip x + 3 and x + 4, but their bitmap is still set, which will > cause duplicated f2fs_issue_discard of this same section in the next > write_checkpoint, so fix it.
I didn't get it, if # 2 segment is not prefree state, so it still has valid blocks there, so we won't issue discard due to below condition, right? if (!IS_CURSEC(sbi, secno) && !get_valid_blocks(sbi, start, true)) Thanks, > > Signed-off-by: Yunlong Song <yunlong.s...@huawei.com> > --- > fs/f2fs/segment.c | 19 +++++++++++++++++-- > 1 file changed, 17 insertions(+), 2 deletions(-) > > diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c > index 47b6595..fd38b61 100644 > --- a/fs/f2fs/segment.c > +++ b/fs/f2fs/segment.c > @@ -1684,8 +1684,23 @@ void f2fs_clear_prefree_segments(struct f2fs_sb_info > *sbi, > start = start_segno + sbi->segs_per_sec; > if (start < end) > goto next; > - else > - end = start - 1; > + else { > + start_segno = start; > + > + while (1) { > + start = find_next_bit(prefree_map, start_segno, > + end + > 1); > + if (start >= start_segno) > + break; > + end = find_next_zero_bit(prefree_map, > start_segno, > + > start + 1); > + for (i = start; i < end; i++) > + clear_bit(i, prefree_map); > + dirty_i->nr_dirty[PRE] -= end - start; > + } > + > + end = start_segno - 1; > + } > } > mutex_unlock(&dirty_i->seglist_lock); > > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel