public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Zhaolei <zhaolei@cn.fujitsu.com>
To: Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
	Andrew Morton <akpm@linux-foundation.org>,
	OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 2/2] fs/fat: Use common localtime/gmtime in fat_time_unix2fat()
Date: Tue, 14 Jul 2009 16:04:50 +0800	[thread overview]
Message-ID: <4A5C3C22.8030707@cn.fujitsu.com> (raw)
In-Reply-To: <4A5C3BC0.6020701@cn.fujitsu.com>

It is not necessary to write custom code for convert calendar time
to broken-down time.
localtime()/gmtime() is more generic to do that.

Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
---
 fs/fat/misc.c |   62 
++++++++++++++++++--------------------------------------
 1 files changed, 20 insertions(+), 42 deletions(-)

diff --git a/fs/fat/misc.c b/fs/fat/misc.c
index a6c2047..d9b6552 100644
--- a/fs/fat/misc.c
+++ b/fs/fat/misc.c
@@ -9,6 +9,7 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/buffer_head.h>
+#include <linux/time.h>
 #include "fat.h"
 
 /*
@@ -155,10 +156,6 @@ extern struct timezone sys_tz;
 #define SECS_PER_MIN    60
 #define SECS_PER_HOUR    (60 * 60)
 #define SECS_PER_DAY    (SECS_PER_HOUR * 24)
-#define UNIX_SECS_1980    315532800L
-#if BITS_PER_LONG == 64
-#define UNIX_SECS_2108    4354819200L
-#endif
 /* days between 1.1.70 and 1.1.80 (2 leap days) */
 #define DAYS_DELTA    (365 * 10 + 2)
 /* 120 (2100 - 1980) isn't leap year */
@@ -211,58 +208,40 @@ void fat_time_fat2unix(struct msdos_sb_info *sbi, 
struct timespec *ts,
 void fat_time_unix2fat(struct msdos_sb_info *sbi, struct timespec *ts,
                __le16 *time, __le16 *date, u8 *time_cs)
 {
-    time_t second = ts->tv_sec;
-    time_t day, leap_day, month, year;
-
-    if (!sbi->options.tz_utc)
-        second -= sys_tz.tz_minuteswest * SECS_PER_MIN;
+    unsigned int year, mon, mday, hour, min, sec;
+    if (sbi->options.tz_utc) {
+        gmtime(ts->tv_sec,
+               &year, &mon, &mday, &hour, &min, &sec, NULL, NULL);
+    } else {
+        localtime(ts->tv_sec,
+               &year, &mon, &mday, &hour, &min, &sec, NULL, NULL);
+    }
 
-    /* Jan 1 GMT 00:00:00 1980. But what about another time zone? */
-    if (second < UNIX_SECS_1980) {
+    /*  FAT can only support year between 1980 to 2107 */
+    if (year < 1980 - 1900) {
         *time = 0;
         *date = cpu_to_le16((0 << 9) | (1 << 5) | 1);
         if (time_cs)
             *time_cs = 0;
         return;
     }
-#if BITS_PER_LONG == 64
-    if (second >= UNIX_SECS_2108) {
+    if (year > 2107 - 1900) {
         *time = cpu_to_le16((23 << 11) | (59 << 5) | 29);
         *date = cpu_to_le16((127 << 9) | (12 << 5) | 31);
         if (time_cs)
             *time_cs = 199;
         return;
     }
-#endif
 
-    day = second / SECS_PER_DAY - DAYS_DELTA;
-    year = day / 365;
-    leap_day = (year + 3) / 4;
-    if (year > YEAR_2100)        /* 2100 isn't leap year */
-        leap_day--;
-    if (year * 365 + leap_day > day)
-        year--;
-    leap_day = (year + 3) / 4;
-    if (year > YEAR_2100)        /* 2100 isn't leap year */
-        leap_day--;
-    day -= year * 365 + leap_day;
+    /* from 1900 -> from 1980 */
+    year -= 80;
+    /* 0~11 -> 1~12 */
+    mon++;
+    /* 0~59 -> 0~29(2sec counts) */
+    sec >>= 1;
 
-    if (IS_LEAP_YEAR(year) && day == days_in_year[3]) {
-        month = 2;
-    } else {
-        if (IS_LEAP_YEAR(year) && day > days_in_year[3])
-            day--;
-        for (month = 1; month < 12; month++) {
-            if (days_in_year[month + 1] > day)
-                break;
-        }
-    }
-    day -= days_in_year[month];
-
-    *time = cpu_to_le16(((second / SECS_PER_HOUR) % 24) << 11
-                | ((second / SECS_PER_MIN) % 60) << 5
-                | (second % SECS_PER_MIN) >> 1);
-    *date = cpu_to_le16((year << 9) | (month << 5) | (day + 1));
+    *time = cpu_to_le16(hour << 11 | min << 5 | sec);
+    *date = cpu_to_le16(year << 9 | mon << 5 | mday);
     if (time_cs)
         *time_cs = (ts->tv_sec & 1) * 100 + ts->tv_nsec / 10000000;
 }
@@ -283,4 +262,3 @@ int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs)
     }
     return err;
 }
-
-- 
1.5.5.3



  reply	other threads:[~2009-07-14  8:04 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-14  8:03 [PATCH 1/2] Add function to convert between calendar time and broken-down time for universal use Zhaolei
2009-07-14  8:04 ` Zhaolei [this message]
2009-07-14 22:10 ` Andrew Morton
2009-07-15  0:59   ` Zhaolei
2009-07-15  7:23   ` [PATCH v2 0/2] " Zhaolei
2009-07-15  7:24     ` [PATCH v2 1/2] " Zhaolei
2009-07-15  7:25     ` [PATCH v2 2/2] Use common localtime/gmtime in fat_time_unix2fat() Zhaolei
2009-07-18 11:50   ` [PATCH 1/2] Add function to convert between calendar time and broken-down time for universal use Pavel Machek
2009-07-20  2:56     ` [PATCH 1/2] Add function to convert between calendar time andbroken-down " Zhaolei
2009-07-20  3:20       ` Andrew Morton
2009-07-20  9:55         ` [PATCH v3 0/2] Add function to convert between calendar time and broken-down " Zhaolei
2009-07-20  9:56           ` [PATCH v3 1/2] " Zhaolei
2009-07-25  5:42             ` OGAWA Hirofumi
2009-07-25  8:50               ` OGAWA Hirofumi
2009-07-25 12:15               ` OGAWA Hirofumi
2009-07-27  3:15               ` Zhaolei
2009-07-27  6:04                 ` OGAWA Hirofumi
2009-07-28  3:05                   ` Zhaolei
2009-07-28  5:12                     ` OGAWA Hirofumi
2009-07-30  5:39                       ` [PATCH v4 0/2] " Zhaolei
2009-07-30  5:40                         ` [PATCH v4 1/2] " Zhaolei
2009-07-30  5:41                         ` [PATCH v4 2/2] Use common time_to_tm in fat_time_unix2fat() Zhaolei
2009-07-27 22:44               ` [PATCH v3 1/2] Add function to convert between calendar time and broken-down time for universal use Pavel Machek
2009-07-28  4:52                 ` OGAWA Hirofumi
2009-07-20  9:57           ` [PATCH v3 2/2] Use common localtime/gmtime in fat_time_unix2fat() Zhaolei
2009-07-20 10:03             ` Pavel Machek
2009-07-25  5:43             ` OGAWA Hirofumi
2009-07-27  3:21               ` Zhaolei
2009-07-18 10:02 ` [PATCH 1/2] Add function to convert between calendar time and broken-down time for universal use Ingo Molnar
2009-07-18 12:10   ` H. Peter Anvin
2009-07-18 12:41   ` Ulrich Drepper
2009-07-18 12:26 ` Andi Kleen
2009-07-20  2:41   ` Zhaolei

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A5C3C22.8030707@cn.fujitsu.com \
    --to=zhaolei@cn.fujitsu.com \
    --cc=akpm@linux-foundation.org \
    --cc=hirofumi@mail.parknet.co.jp \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox