summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakochetkov <al.kochet@gmail.com>2016-11-11 20:50:46 +0300
committerLennart Poettering <lennart@poettering.net>2016-11-11 18:50:46 +0100
commit5f36e3d30375cf04292bbc1bf3f4d7512cf80139 (patch)
treed5983c7b855fd6c331bfb3abc6029c682ccdf8ef
parentabd67ce74858491565cde157c7b08fda43d3279c (diff)
timesyncd: clear ADJ_MAXERROR to keep STA_UNSYNC cleared after jump adjust (#4626)
NTP use jump adjust if system has incorrect time read from RTC during boot. It is desireble to update RTC time as soon as NTP set correct system time. Sometimes kernel failed to update RTC due to STA_UNSYNC get set before RTC update finised. In that case RTC time wouldn't be updated within long time. The commit makes RTC updates stable. When NTP do jump time adjust using ADJ_SETOFFSET it clears STA_UNSYNC flag. If don't clear ADJ_MAXERROR, STA_UNSYNC will be set again by kernel within 1 second (by second_overflow() function). STA_UNSYNC flag prevent RTC updates in kernel. Sometimes the kernel is able to update RTC withing 1 second, but sometimes it falied.
-rw-r--r--src/timesync/timesyncd-manager.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c
index a455652a27..6a6c1577c6 100644
--- a/src/timesync/timesyncd-manager.c
+++ b/src/timesync/timesyncd-manager.c
@@ -330,11 +330,13 @@ static int manager_adjust_clock(Manager *m, double offset, int leap_sec) {
tmx.esterror = 0;
log_debug(" adjust (slew): %+.3f sec", offset);
} else {
- tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_SETOFFSET;
+ tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_SETOFFSET | ADJ_MAXERROR | ADJ_ESTERROR;
/* ADJ_NANO uses nanoseconds in the microseconds field */
tmx.time.tv_sec = (long)offset;
tmx.time.tv_usec = (offset - tmx.time.tv_sec) * NSEC_PER_SEC;
+ tmx.maxerror = 0;
+ tmx.esterror = 0;
/* the kernel expects -0.3s as {-1, 7000.000.000} */
if (tmx.time.tv_usec < 0) {