f2fs: fix to correct return value of f2fs_trim_fs
Chao Yu
maintainerPATCH v2 1/2 f2fs: fix to correct return value of f2fs_trim_fs
From: Chao Yu <[email protected]>
We should account trimmed block number from __wait_all_discard_cmd in __issue_discard_cmd_range, otherwise trimmed blocks returned by f2fs_trim_fs will be wrong, this patch fixes it.
Signed-off-by Chao Yu <[email protected]>
---
v2:
- fix to add missing return value in __wait_all_discard_cmd.
fs/f2fs/segment.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
fs/f2fs/segment.c +16 -12
@@ -1319,21 +1319,21 @@ static unsigned int __wait_discard_cmd_range(struct f2fs_sb_info *sbi,return trimmed; } -static void __wait_all_discard_cmd (struct f2fs_sb_info *sbi, +static unsigned int __wait_all_discard_cmd (struct f2fs_sb_info *sbi,struct discard_policy *dpolicy) {struct discard_policy dp; +unsigned int discard_blks; -if (dpolicy) { -__wait_discard_cmd_range (sbi, dpolicy,0 ,UINT_MAX ); -return ; - } +if (dpolicy) +return __wait_discard_cmd_range (sbi, dpolicy,0 ,UINT_MAX );/* wait all */ __init_discard_policy (sbi, &dp,DPOLICY_FSTRIM ,1 ); -__wait_discard_cmd_range (sbi, &dp,0 ,UINT_MAX ); + discard_blks =__wait_discard_cmd_range (sbi, &dp,0 ,UINT_MAX );__init_discard_policy (sbi, &dp,DPOLICY_UMOUNT ,1 ); -__wait_discard_cmd_range (sbi, &dp,0 ,UINT_MAX ); + discard_blks +=__wait_discard_cmd_range (sbi, &dp,0 ,UINT_MAX ); +return 0 ; }/* This should be covered by global mutex, &sit_i->sentry_lock */
@@ -2365,7 +2365,7 @@ bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi,return has_candidate; } -static void __issue_discard_cmd_range (struct f2fs_sb_info *sbi, +static unsigned int __issue_discard_cmd_range (struct f2fs_sb_info *sbi,struct discard_policy *dpolicy,unsigned int start,unsigned int end) {
@@ -2375,6 +2375,7 @@ static void __issue_discard_cmd_range(struct f2fs_sb_info *sbi,struct discard_cmd *dc;struct blk_plug plug;int issued; +unsigned int trimmed =0 ; next: issued =0 ;
@@ -2410,7 +2411,7 @@ static void __issue_discard_cmd_range(struct f2fs_sb_info *sbi,blk_finish_plug (&plug);mutex_unlock (&dcc->cmd_lock); -__wait_all_discard_cmd (sbi,NULL ); + trimmed +=__wait_all_discard_cmd (sbi,NULL );congestion_wait (BLK_RW_ASYNC ,HZ /50 ); goto next; }
@@ -2424,6 +2425,8 @@ static void __issue_discard_cmd_range(struct f2fs_sb_info *sbi,blk_finish_plug (&plug);mutex_unlock (&dcc->cmd_lock); + +return trimmed; }int f2fs_trim_fs (struct f2fs_sb_info *sbi,struct fstrim_range *range)
@@ -2434,7 +2437,7 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range)block_t start_block, end_block;struct cp_control cpc;struct discard_policy dpolicy; -unsigned long long trimmed =0 ; +unsigned long long trimmed;int err =0 ;if (start >=MAX_BLKADDR (sbi) || range->len < sbi->blocksize)
@@ -2472,8 +2475,9 @@ int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range) end_block =START_BLOCK (sbi, end_segno +1 );__init_discard_policy (sbi, &dpolicy,DPOLICY_FSTRIM , cpc.trim_minlen); -__issue_discard_cmd_range (sbi, &dpolicy, start_block, end_block); - trimmed =__wait_discard_cmd_range (sbi, &dpolicy, + trimmed =__issue_discard_cmd_range (sbi, &dpolicy, + start_block, end_block); + trimmed +=__wait_discard_cmd_range (sbi, &dpolicy, start_block, end_block); range->len =F2FS_BLK_TO_BYTES (trimmed); out:
Signature · 1 line
2.16.2.17.g38e79b1fd
Chao Yu
maintainerPATCH v2 2/2 f2fs: fix to update mtime correctly
From: Chao Yu <[email protected]>
If we change system time to the past, get_mtime() will return a overflowed time, and SIT_I(sbi)->max_mtime will be udpated incorrectly, this patch fixes the two issues.
Signed-off-by Chao Yu <[email protected]>
---
v2:
- fix to cover base time updating.
fs/f2fs/checkpoint.c | 2 +- fs/f2fs/segment.c | 7 ++++--- fs/f2fs/segment.h | 16 +++++++++++++--- 3 files changed, 18 insertions(+), 7 deletions(-)
fs/f2fs/checkpoint.c +1 -1
@@ -1233,7 +1233,7 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)* modify checkpoint * version number is already updated */ - ckpt->elapsed_time =cpu_to_le64 (get_mtime (sbi)); + ckpt->elapsed_time =cpu_to_le64 (get_mtime (sbi, true)); ckpt->free_segment_count =cpu_to_le32 (free_segments (sbi));for (i =0 ; i <NR_CURSEG_NODE_TYPE ; i++) { ckpt->cur_node_segno[i] =
fs/f2fs/segment.c +4 -3
@@ -1822,8 +1822,9 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del) (new_vblocks > sbi->blocks_per_seg))); se->valid_blocks = new_vblocks; - se->mtime =get_mtime (sbi); -SIT_I (sbi)->max_mtime = se->mtime; + se->mtime =get_mtime (sbi, false); +if (se->mtime >SIT_I (sbi)->max_mtime) +SIT_I (sbi)->max_mtime = se->mtime;/* Update valid block bitmap */ if (del >0 ) {
@@ -3879,7 +3880,7 @@ static void init_min_max_mtime(struct f2fs_sb_info *sbi)if (sit_i->min_mtime > mtime) sit_i->min_mtime = mtime; } - sit_i->max_mtime =get_mtime (sbi); + sit_i->max_mtime =get_mtime (sbi, false);up_write (&sit_i->sentry_lock); }
fs/f2fs/segment.h +13 -3
@@ -745,12 +745,22 @@ static inline void set_to_next_sit(struct sit_info *sit_i, unsigned int start)#endif } -static inline unsigned long long get_mtime (struct f2fs_sb_info *sbi) +static inline unsigned long long get_mtime (struct f2fs_sb_info *sbi, +bool base_time) {struct sit_info *sit_i =SIT_I (sbi); -time64_t now =ktime_get_real_seconds (); +time64_t diff, now =ktime_get_real_seconds (); -return sit_i->elapsed_time + now - sit_i->mounted_time; +if (now >= sit_i->mounted_time) +return sit_i->elapsed_time + now - sit_i->mounted_time; + +/* system time is set to the past */ +if (!base_time) { + diff = sit_i->mounted_time - now; +if (sit_i->elapsed_time >= diff) +return sit_i->elapsed_time - diff; + } +return sit_i->elapsed_time; } static inline void set_summary(struct f2fs_summary *sum, nid_t nid,
Signature · 6 lines
2.16.2.17.g38e79b1fd ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot