__mark_sit_entry_dirty(sbi, segno);
 }
 
+static void update_segment_mtime(struct f2fs_sb_info *sbi, block_t blkaddr)
+{
+       unsigned int segno = GET_SEGNO(sbi, blkaddr);
+       struct seg_entry *se = get_seg_entry(sbi, segno);
+       unsigned long long mtime = get_mtime(sbi, false);
+
+       if (!se->mtime)
+               se->mtime = mtime;
+       else
+               se->mtime = div_u64(se->mtime * se->valid_blocks + mtime,
+                                               se->valid_blocks + 1);
+
+       if (mtime > SIT_I(sbi)->max_mtime)
+               SIT_I(sbi)->max_mtime = mtime;
+}
+
 static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
 {
        struct seg_entry *se;
        f2fs_bug_on(sbi, (new_vblocks < 0 ||
                        (new_vblocks > f2fs_usable_blks_in_seg(sbi, segno))));
 
+       update_segment_mtime(sbi, blkaddr);
+
        se->valid_blocks = new_vblocks;
-       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) {