"systemd[1]: Failed to apply local time delta" with v4.7-rc1
Hi,
I noticed that when I boot my Lenovo Yoga 900 with v4.7-rc1 I get following error from systemd:
systemd[1]: Failed to apply local time delta, ignoring: Invalid argument
and my system time is left being 180 minutes off.
With following commits reverted it works fine:
86d3473224b0 time: Introduce do_sys_settimeofday64() 457db29bfcfd security: Introduce security_settime64()
and systemd prints:
systemd[1]: RTC configured in localtime, applying delta of 180 minutes to system time.
Quoted 1 line
From systemd source code it seems to use Linux specific feature to "warp" the
system clock according the timezone passed in:
clock_set_timezone() {
const struct timeval *tv_null = NULL;
...
/*
* If the RTC does not run in UTC but in local time, the very first
* call to settimeofday() will set the kernel's timezone and will warp the
* system clock, so that it runs in UTC instead of the local time we
* have read from the RTC.
*/
if (settimeofday(tv_null, &tz) < 0)
return -errno;
if (min)
*min = minutesdelta;With commit 86d3473224b0 it seems that do_sys_settimeofday() started returning -EINVAL when tv is NULL which seems to break the above.
Is this intentional or am I missing something?
Quoted 37 lines · Mika Westerberg
Hi,
I noticed that when I boot my Lenovo Yoga 900 with v4.7-rc1 I get following error from systemd:
systemd[1]: Failed to apply local time delta, ignoring: Invalid argument
and my system time is left being 180 minutes off.
With following commits reverted it works fine:
86d3473224b0time: Introducedo_sys_settimeofday64()457db29bfcfdsecurity: Introducesecurity_settime64()and systemd prints:
systemd[1]: RTC configured in localtime, applying delta of 180 minutes to system time.
From systemd source code it seems to use Linux specific feature to "warp" the system clock according the timezone passed in:
clock_set_timezone() { const struct timeval *tv_null = NULL;... /* * If the RTC does not run in UTC but in local time, the very first * call to settimeofday() will set the kernel's timezone and will warp the * system clock, so that it runs in UTC instead of the local time we * have read from the RTC. */ if (settimeofday(tv_null, &tz) < 0) return -errno; if (min) *min = minutesdelta;
Quoted 4 lines
With commit
86d3473224b0it seems thatdo_sys_settimeofday()started returning-EINVALwhen tv is NULL which seems to break the above.Is this intentional or am I missing something?
:(
No, that wasn't intentional. Thanks for the report. I'll try to sort it out here shortly.
thanks
-john