diff options
| -rw-r--r-- | include/linux/time.h | 1 | ||||
| -rw-r--r-- | kernel/time.c | 8 | ||||
| -rw-r--r-- | kernel/time/ntp.c | 8 |
3 files changed, 15 insertions, 2 deletions
diff --git a/include/linux/time.h b/include/linux/time.h index 476e1d7b2c37..a3ab6a814a9c 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
| @@ -128,6 +128,7 @@ static inline bool has_persistent_clock(void) | |||
| 128 | 128 | ||
| 129 | extern void read_persistent_clock(struct timespec *ts); | 129 | extern void read_persistent_clock(struct timespec *ts); |
| 130 | extern void read_boot_clock(struct timespec *ts); | 130 | extern void read_boot_clock(struct timespec *ts); |
| 131 | extern int persistent_clock_is_local; | ||
| 131 | extern int update_persistent_clock(struct timespec now); | 132 | extern int update_persistent_clock(struct timespec now); |
| 132 | void timekeeping_init(void); | 133 | void timekeeping_init(void); |
| 133 | extern int timekeeping_suspended; | 134 | extern int timekeeping_suspended; |
diff --git a/kernel/time.c b/kernel/time.c index d226c6a3fd28..c2a27dd93142 100644 --- a/kernel/time.c +++ b/kernel/time.c | |||
| @@ -115,6 +115,12 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv, | |||
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | /* | 117 | /* |
| 118 | * Indicates if there is an offset between the system clock and the hardware | ||
| 119 | * clock/persistent clock/rtc. | ||
| 120 | */ | ||
| 121 | int persistent_clock_is_local; | ||
| 122 | |||
| 123 | /* | ||
| 118 | * Adjust the time obtained from the CMOS to be UTC time instead of | 124 | * Adjust the time obtained from the CMOS to be UTC time instead of |
| 119 | * local time. | 125 | * local time. |
| 120 | * | 126 | * |
| @@ -135,6 +141,8 @@ static inline void warp_clock(void) | |||
| 135 | struct timespec adjust; | 141 | struct timespec adjust; |
| 136 | 142 | ||
| 137 | adjust = current_kernel_time(); | 143 | adjust = current_kernel_time(); |
| 144 | if (sys_tz.tz_minuteswest != 0) | ||
| 145 | persistent_clock_is_local = 1; | ||
| 138 | adjust.tv_sec += sys_tz.tz_minuteswest * 60; | 146 | adjust.tv_sec += sys_tz.tz_minuteswest * 60; |
| 139 | do_settimeofday(&adjust); | 147 | do_settimeofday(&adjust); |
| 140 | } | 148 | } |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 313b161504b7..b10a42bb0165 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
| @@ -511,13 +511,17 @@ static void sync_cmos_clock(struct work_struct *work) | |||
| 511 | 511 | ||
| 512 | getnstimeofday(&now); | 512 | getnstimeofday(&now); |
| 513 | if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) { | 513 | if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) { |
| 514 | struct timespec adjust = now; | ||
| 515 | |||
| 514 | fail = -ENODEV; | 516 | fail = -ENODEV; |
| 517 | if (persistent_clock_is_local) | ||
| 518 | adjust.tv_sec -= (sys_tz.tz_minuteswest * 60); | ||
| 515 | #ifdef CONFIG_GENERIC_CMOS_UPDATE | 519 | #ifdef CONFIG_GENERIC_CMOS_UPDATE |
| 516 | fail = update_persistent_clock(now); | 520 | fail = update_persistent_clock(adjust); |
| 517 | #endif | 521 | #endif |
| 518 | #ifdef CONFIG_RTC_SYSTOHC | 522 | #ifdef CONFIG_RTC_SYSTOHC |
| 519 | if (fail == -ENODEV) | 523 | if (fail == -ENODEV) |
| 520 | fail = rtc_set_ntp_time(now); | 524 | fail = rtc_set_ntp_time(adjust); |
| 521 | #endif | 525 | #endif |
| 522 | } | 526 | } |
| 523 | 527 | ||
