summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2012-10-27 16:23:32 +0200
committerKay Sievers <kay@vrfy.org>2012-10-27 16:31:10 +0200
commit19e65613563dd9c14cf1ce58aa6e151de8fb90c2 (patch)
treee4ee82809a4dbb218d041a5966e46ad872b0715d
parentb80f194eea3e2757966118cadf218354b11bf5da (diff)
hwclock: do not seal the kernel's time-warp call from inside the initrd
-rw-r--r--src/core/main.c11
-rw-r--r--src/shared/hwclock.c8
2 files changed, 13 insertions, 6 deletions
diff --git a/src/core/main.c b/src/core/main.c
index e094efeb3c..4da8ecb864 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1350,8 +1350,15 @@ int main(int argc, char *argv[]) {
log_error("Failed to apply local time delta, ignoring: %s", strerror(-r));
else
log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
- } else {
- /* Do dummy first-time call to seal the kernel's time warp magic */
+ } else if (!in_initrd()) {
+ /*
+ * Do dummy first-time call to seal the kernel's time warp magic
+ *
+ * Do not call this this from inside the initrd. The initrd might not
+ * carry /etc/adjtime with LOCAL, but the real system could be set up
+ * that way. In such case, we need to delay the time-warp or the sealing
+ * until we reach the real system.
+ */
hwclock_reset_timezone();
/* Tell the kernel our time zone */
diff --git a/src/shared/hwclock.c b/src/shared/hwclock.c
index 0e8fa45971..f9adf0369e 100644
--- a/src/shared/hwclock.c
+++ b/src/shared/hwclock.c
@@ -199,14 +199,14 @@ int hwclock_set_timezone(int *min) {
const struct timeval *tv_null = NULL;
struct timespec ts;
struct tm *tm;
- int minuteswest;
+ int minutesdelta;
struct timezone tz;
assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
assert_se(tm = localtime(&ts.tv_sec));
- minuteswest = tm->tm_gmtoff / 60;
+ minutesdelta = tm->tm_gmtoff / 60;
- tz.tz_minuteswest = -minuteswest;
+ tz.tz_minuteswest = -minutesdelta;
tz.tz_dsttime = 0; /* DST_NONE*/
/*
@@ -217,7 +217,7 @@ int hwclock_set_timezone(int *min) {
if (settimeofday(tv_null, &tz) < 0)
return -errno;
if (min)
- *min = minuteswest;
+ *min = minutesdelta;
return 0;
}