fat: split fat_truncate_time() into separate functions
authorChung-Chiang Cheng <cccheng@synology.com>
Tue, 3 May 2022 15:25:33 +0000 (23:25 +0800)
committerakpm <akpm@linux-foundation.org>
Thu, 19 May 2022 21:10:31 +0000 (14:10 -0700)
Separate fat_truncate_time() to each timestamps for later creation time
work.

This patch does not introduce any functional changes, it's merely
refactoring change.

Link: https://lkml.kernel.org/r/20220503152536.2503003-1-cccheng@synology.com
Signed-off-by: Chung-Chiang Cheng <cccheng@synology.com>
Acked-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/fat/fat.h
fs/fat/misc.c

index 2cf85a6..b7f60b3 100644 (file)
@@ -453,6 +453,12 @@ extern void fat_time_fat2unix(struct msdos_sb_info *sbi, struct timespec64 *ts,
                              __le16 __time, __le16 __date, u8 time_cs);
 extern void fat_time_unix2fat(struct msdos_sb_info *sbi, struct timespec64 *ts,
                              __le16 *time, __le16 *date, u8 *time_cs);
+extern struct timespec64 fat_truncate_atime(const struct msdos_sb_info *sbi,
+                                           const struct timespec64 *ts);
+extern struct timespec64 fat_truncate_crtime(const struct msdos_sb_info *sbi,
+                                            const struct timespec64 *ts);
+extern struct timespec64 fat_truncate_mtime(const struct msdos_sb_info *sbi,
+                                           const struct timespec64 *ts);
 extern int fat_truncate_time(struct inode *inode, struct timespec64 *now,
                             int flags);
 extern int fat_update_time(struct inode *inode, struct timespec64 *now,
index 855477d..80c6f8b 100644 (file)
@@ -193,7 +193,7 @@ static long days_in_year[] = {
        0,   0,  31,  59,  90, 120, 151, 181, 212, 243, 273, 304, 334, 0, 0, 0,
 };
 
-static inline int fat_tz_offset(struct msdos_sb_info *sbi)
+static inline int fat_tz_offset(const struct msdos_sb_info *sbi)
 {
        return (sbi->options.tz_set ?
               -sbi->options.time_offset :
@@ -288,16 +288,49 @@ static inline struct timespec64 fat_timespec64_trunc_10ms(struct timespec64 ts)
        return ts;
 }
 
+/*
+ * truncate atime to 24 hour granularity (00:00:00 in local timezone)
+ */
+struct timespec64 fat_truncate_atime(const struct msdos_sb_info *sbi,
+                                    const struct timespec64 *ts)
+{
+       /* to localtime */
+       time64_t seconds = ts->tv_sec - fat_tz_offset(sbi);
+       s32 remainder;
+
+       div_s64_rem(seconds, SECS_PER_DAY, &remainder);
+       /* to day boundary, and back to unix time */
+       seconds = seconds + fat_tz_offset(sbi) - remainder;
+
+       return (struct timespec64){ seconds, 0 };
+}
+
+/*
+ * truncate creation time with appropriate granularity:
+ *   msdos - 2 seconds
+ *   vfat  - 10 milliseconds
+ */
+struct timespec64 fat_truncate_crtime(const struct msdos_sb_info *sbi,
+                                     const struct timespec64 *ts)
+{
+       if (sbi->options.isvfat)
+               return fat_timespec64_trunc_10ms(*ts);
+       else
+               return fat_timespec64_trunc_2secs(*ts);
+}
+
+/*
+ * truncate mtime to 2 second granularity
+ */
+struct timespec64 fat_truncate_mtime(const struct msdos_sb_info *sbi,
+                                    const struct timespec64 *ts)
+{
+       return fat_timespec64_trunc_2secs(*ts);
+}
+
 /*
  * truncate the various times with appropriate granularity:
- *   root inode:
- *     all times always 0
- *   all other inodes:
- *     mtime - 2 seconds
- *     ctime
- *       msdos - 2 seconds
- *       vfat  - 10 milliseconds
- *     atime - 24 hours (00:00:00 in local timezone)
+ *   all times in root node are always 0
  */
 int fat_truncate_time(struct inode *inode, struct timespec64 *now, int flags)
 {
@@ -312,25 +345,12 @@ int fat_truncate_time(struct inode *inode, struct timespec64 *now, int flags)
                ts = current_time(inode);
        }
 
-       if (flags & S_ATIME) {
-               /* to localtime */
-               time64_t seconds = now->tv_sec - fat_tz_offset(sbi);
-               s32 remainder;
-
-               div_s64_rem(seconds, SECS_PER_DAY, &remainder);
-               /* to day boundary, and back to unix time */
-               seconds = seconds + fat_tz_offset(sbi) - remainder;
-
-               inode->i_atime = (struct timespec64){ seconds, 0 };
-       }
-       if (flags & S_CTIME) {
-               if (sbi->options.isvfat)
-                       inode->i_ctime = fat_timespec64_trunc_10ms(*now);
-               else
-                       inode->i_ctime = fat_timespec64_trunc_2secs(*now);
-       }
+       if (flags & S_ATIME)
+               inode->i_atime = fat_truncate_atime(sbi, now);
+       if (flags & S_CTIME)
+               inode->i_ctime = fat_truncate_crtime(sbi, now);
        if (flags & S_MTIME)
-               inode->i_mtime = fat_timespec64_trunc_2secs(*now);
+               inode->i_mtime = fat_truncate_mtime(sbi, now);
 
        return 0;
 }