@@ -914,7 +914,8 @@ static void __add_discard_entry(struct f2fs_sb_info *sbi,
914914 SM_I (sbi )-> nr_discards += end - start ;
915915}
916916
917- static void add_discard_addrs (struct f2fs_sb_info * sbi , struct cp_control * cpc )
917+ static bool add_discard_addrs (struct f2fs_sb_info * sbi , struct cp_control * cpc ,
918+ bool check_only )
918919{
919920 int entries = SIT_VBLOCK_MAP_SIZE / sizeof (unsigned long );
920921 int max_blocks = sbi -> blocks_per_seg ;
@@ -928,12 +929,12 @@ static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc)
928929 int i ;
929930
930931 if (se -> valid_blocks == max_blocks || !f2fs_discard_en (sbi ))
931- return ;
932+ return false ;
932933
933934 if (!force ) {
934935 if (!test_opt (sbi , DISCARD ) || !se -> valid_blocks ||
935936 SM_I (sbi )-> nr_discards >= SM_I (sbi )-> max_discards )
936- return ;
937+ return false ;
937938 }
938939
939940 /* SIT_VBLOCK_MAP_SIZE should be multiple of sizeof(unsigned long) */
@@ -951,8 +952,12 @@ static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc)
951952 && (end - start ) < cpc -> trim_minlen )
952953 continue ;
953954
955+ if (check_only )
956+ return true;
957+
954958 __add_discard_entry (sbi , cpc , se , start , end );
955959 }
960+ return false;
956961}
957962
958963void release_discard_addrs (struct f2fs_sb_info * sbi )
@@ -1533,6 +1538,19 @@ static const struct segment_allocation default_salloc_ops = {
15331538 .allocate_segment = allocate_segment_by_default ,
15341539};
15351540
1541+ bool exist_trim_candidates (struct f2fs_sb_info * sbi , struct cp_control * cpc )
1542+ {
1543+ __u64 trim_start = cpc -> trim_start ;
1544+
1545+ mutex_lock (& SIT_I (sbi )-> sentry_lock );
1546+ for (; trim_start <= cpc -> trim_end ; trim_start ++ )
1547+ if (add_discard_addrs (sbi , cpc , true))
1548+ break ;
1549+ mutex_unlock (& SIT_I (sbi )-> sentry_lock );
1550+
1551+ return trim_start <= cpc -> trim_end ;
1552+ }
1553+
15361554int f2fs_trim_fs (struct f2fs_sb_info * sbi , struct fstrim_range * range )
15371555{
15381556 __u64 start = F2FS_BYTES_TO_BLK (range -> start );
@@ -2329,7 +2347,7 @@ void flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
23292347 /* add discard candidates */
23302348 if (cpc -> reason != CP_DISCARD ) {
23312349 cpc -> trim_start = segno ;
2332- add_discard_addrs (sbi , cpc );
2350+ add_discard_addrs (sbi , cpc , false );
23332351 }
23342352
23352353 if (to_journal ) {
@@ -2367,7 +2385,7 @@ void flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
23672385 __u64 trim_start = cpc -> trim_start ;
23682386
23692387 for (; cpc -> trim_start <= cpc -> trim_end ; cpc -> trim_start ++ )
2370- add_discard_addrs (sbi , cpc );
2388+ add_discard_addrs (sbi , cpc , false );
23712389
23722390 cpc -> trim_start = trim_start ;
23732391 }
0 commit comments