On 5/7/25 12:30, yohan.joung wrote:
> In LFS mode, the previous segment cannot use invalid blocks,
> so the remaining blocks from the next_blkoff of the current segment
> to the end of the section are calculated.
> 
> Signed-off-by: yohan.joung <yohan.jo...@sk.com>
> ---
>  fs/f2fs/segment.h | 23 +++++++++++++++++++----
>  1 file changed, 19 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
> index 03c0f59be5a8..f5d30f32ebdb 100644
> --- a/fs/f2fs/segment.h
> +++ b/fs/f2fs/segment.h
> @@ -102,6 +102,8 @@ static inline void sanity_check_seg_type(struct 
> f2fs_sb_info *sbi,
>  #define CAP_SEGS_PER_SEC(sbi)                                        \
>       (SEGS_PER_SEC(sbi) -                                    \
>       BLKS_TO_SEGS(sbi, (sbi)->unusable_blocks_per_sec))
> +#define GET_START_SEG_FROM_SEC(sbi, segno)                   \
> +     (rounddown(segno, SEGS_PER_SEC(sbi)))
>  #define GET_SEC_FROM_SEG(sbi, segno)                         \
>       (((segno) == -1) ? -1 : (segno) / SEGS_PER_SEC(sbi))
>  #define GET_SEG_FROM_SEC(sbi, secno)                         \
> @@ -582,8 +584,14 @@ static inline bool has_curseg_enough_space(struct 
> f2fs_sb_info *sbi,
>               if (unlikely(segno == NULL_SEGNO))
>                       return false;
>  
> -             left_blocks = CAP_BLKS_PER_SEC(sbi) -
> -                             get_ckpt_valid_blocks(sbi, segno, true);
> +             if (f2fs_lfs_mode(sbi) && __is_large_section(sbi)) {
> +                     left_blocks = CAP_BLKS_PER_SEC(sbi) -
> +                             (segno - GET_START_SEG_FROM_SEC(sbi, segno)) * 
> BLKS_PER_SEG(sbi) -

SEGS_TO_BLKS(sbi, (segno - GET_START_SEG_FROM_SEC(sbi, segno))) ?

> +                             CURSEG_I(sbi, i)->next_blkoff;
> +             } else {
> +                     left_blocks = CAP_BLKS_PER_SEC(sbi) -
> +                                     get_ckpt_valid_blocks(sbi, segno, true);
> +             }
>  
>               blocks = i <= CURSEG_COLD_DATA ? data_blocks : node_blocks;
>               if (blocks > left_blocks)
> @@ -596,8 +604,15 @@ static inline bool has_curseg_enough_space(struct 
> f2fs_sb_info *sbi,
>       if (unlikely(segno == NULL_SEGNO))
>               return false;
>  
> -     left_blocks = CAP_BLKS_PER_SEC(sbi) -
> -                     get_ckpt_valid_blocks(sbi, segno, true);
> +     if (f2fs_lfs_mode(sbi) && __is_large_section(sbi)) {
> +             left_blocks = CAP_BLKS_PER_SEC(sbi) -
> +                             (segno - GET_START_SEG_FROM_SEC(sbi, segno)) * 
> BLKS_PER_SEG(sbi) -

Ditto,

> +                             CURSEG_I(sbi, CURSEG_HOT_DATA)->next_blkoff;
> +     } else {
> +             left_blocks = CAP_BLKS_PER_SEC(sbi) -
> +                             get_ckpt_valid_blocks(sbi, segno, true);
> +     }
> +
>       if (dent_blocks > left_blocks)
>               return false;
>       return true;



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

Reply via email to