hwclock: do not seal the kernel's time-warp call from inside the initrd

This commit is contained in:
Kay Sievers 2012-10-27 16:23:32 +02:00
parent b80f194eea
commit 19e6561356
2 changed files with 13 additions and 6 deletions

View File

@ -1350,8 +1350,15 @@ int main(int argc, char *argv[]) {
log_error("Failed to apply local time delta, ignoring: %s", strerror(-r)); log_error("Failed to apply local time delta, ignoring: %s", strerror(-r));
else else
log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min); log_info("RTC configured in localtime, applying delta of %i minutes to system time.", min);
} else { } else if (!in_initrd()) {
/* Do dummy first-time call to seal the kernel's time warp magic */ /*
* 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(); hwclock_reset_timezone();
/* Tell the kernel our time zone */ /* Tell the kernel our time zone */

View File

@ -199,14 +199,14 @@ int hwclock_set_timezone(int *min) {
const struct timeval *tv_null = NULL; const struct timeval *tv_null = NULL;
struct timespec ts; struct timespec ts;
struct tm *tm; struct tm *tm;
int minuteswest; int minutesdelta;
struct timezone tz; struct timezone tz;
assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
assert_se(tm = localtime(&ts.tv_sec)); 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*/ tz.tz_dsttime = 0; /* DST_NONE*/
/* /*
@ -217,7 +217,7 @@ int hwclock_set_timezone(int *min) {
if (settimeofday(tv_null, &tz) < 0) if (settimeofday(tv_null, &tz) < 0)
return -errno; return -errno;
if (min) if (min)
*min = minuteswest; *min = minutesdelta;
return 0; return 0;
} }