|
@@ -745,12 +745,23 @@ 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 0;
|
|
|
+ }
|
|
|
+ return sit_i->elapsed_time;
|
|
|
}
|
|
|
|
|
|
static inline void set_summary(struct f2fs_summary *sum, nid_t nid,
|