Message ID | 20240706091634.1970874-1-shengyong@oppo.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [f2fs-dev] f2fs: fix start segno of large section | expand |
On 2024/7/6 17:16, Sheng Yong wrote: > get_ckpt_valid_blocks() checks valid ckpt blocks in current section. > It counts all vblocks from the first to the last segment in the > large section. However, START_SEGNO() is used to get the first segno > in an SIT block. This patch fixes that to get the correct start segno. > > Fixes: 61461fc921b7 ("f2fs: fix to avoid touching checkpointed data in get_victim()") > Signed-off-by: Sheng Yong <shengyong@oppo.com> > --- > fs/f2fs/segment.h | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h > index e1c0f418aa11..6ed5bc811d2c 100644 > --- a/fs/f2fs/segment.h > +++ b/fs/f2fs/segment.h > @@ -347,7 +347,8 @@ static inline unsigned int get_ckpt_valid_blocks(struct f2fs_sb_info *sbi, > unsigned int segno, bool use_section) > { > if (use_section && __is_large_section(sbi)) { > - unsigned int start_segno = START_SEGNO(segno); > + unsigned int start_segno = segno / SEGS_PER_SEC(sbi) * > + SEGS_PER_SEC(sbi); How about using macro? unsigned int secno = GET_SEC_FROM_SEG(sbi, segno); unsigned int start_seno = GET_SEG_FROM_SEC(sbi, secno); Thanks, > unsigned int blocks = 0; > int i; >
On 2024/7/8 14:09, Chao Yu wrote: > On 2024/7/6 17:16, Sheng Yong wrote: >> get_ckpt_valid_blocks() checks valid ckpt blocks in current section. >> It counts all vblocks from the first to the last segment in the >> large section. However, START_SEGNO() is used to get the first segno >> in an SIT block. This patch fixes that to get the correct start segno. >> >> Fixes: 61461fc921b7 ("f2fs: fix to avoid touching checkpointed data in get_victim()") >> Signed-off-by: Sheng Yong <shengyong@oppo.com> >> --- >> fs/f2fs/segment.h | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h >> index e1c0f418aa11..6ed5bc811d2c 100644 >> --- a/fs/f2fs/segment.h >> +++ b/fs/f2fs/segment.h >> @@ -347,7 +347,8 @@ static inline unsigned int get_ckpt_valid_blocks(struct f2fs_sb_info *sbi, >> unsigned int segno, bool use_section) >> { >> if (use_section && __is_large_section(sbi)) { >> - unsigned int start_segno = START_SEGNO(segno); >> + unsigned int start_segno = segno / SEGS_PER_SEC(sbi) * >> + SEGS_PER_SEC(sbi); > > How about using macro? > > unsigned int secno = GET_SEC_FROM_SEG(sbi, segno); > unsigned int start_seno = GET_SEG_FROM_SEC(sbi, secno); I will update it in next version. thanks, shengyong > > Thanks, > >> unsigned int blocks = 0; >> int i;
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index e1c0f418aa11..6ed5bc811d2c 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h @@ -347,7 +347,8 @@ static inline unsigned int get_ckpt_valid_blocks(struct f2fs_sb_info *sbi, unsigned int segno, bool use_section) { if (use_section && __is_large_section(sbi)) { - unsigned int start_segno = START_SEGNO(segno); + unsigned int start_segno = segno / SEGS_PER_SEC(sbi) * + SEGS_PER_SEC(sbi); unsigned int blocks = 0; int i;
get_ckpt_valid_blocks() checks valid ckpt blocks in current section. It counts all vblocks from the first to the last segment in the large section. However, START_SEGNO() is used to get the first segno in an SIT block. This patch fixes that to get the correct start segno. Fixes: 61461fc921b7 ("f2fs: fix to avoid touching checkpointed data in get_victim()") Signed-off-by: Sheng Yong <shengyong@oppo.com> --- fs/f2fs/segment.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)