diff options
author | J William Piggott | 2017-07-29 15:21:19 +0200 |
---|---|---|
committer | J William Piggott | 2017-08-04 14:53:44 +0200 |
commit | a218e2a83fb6c64103b0b33e233db019bede44e2 (patch) | |
tree | 10b2f3555cecb8fe4f3dc966d5b866eedbc1fc8d /sys-utils | |
parent | hwclock: move rtc permissions test (diff) | |
download | kernel-qcow2-util-linux-a218e2a83fb6c64103b0b33e233db019bede44e2.tar.gz kernel-qcow2-util-linux-a218e2a83fb6c64103b0b33e233db019bede44e2.tar.xz kernel-qcow2-util-linux-a218e2a83fb6c64103b0b33e233db019bede44e2.zip |
hwclock: move drift correction and --predict
Move the predict branch above the RTC read branch.
Move drift correction into the RTC read branch, because it
requires an accurate RTC read, and it needs to be skipped for
operations that do not require an RTC read.
Simplify the RTC read branch test.
Signed-off-by: J William Piggott <elseifthen@gmx.com>
Diffstat (limited to 'sys-utils')
-rw-r--r-- | sys-utils/hwclock.c | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/sys-utils/hwclock.c b/sys-utils/hwclock.c index ad9c502d3..1550dfe56 100644 --- a/sys-utils/hwclock.c +++ b/sys-utils/hwclock.c @@ -1042,15 +1042,34 @@ manipulate_clock(const struct hwclock_control *ctl, const time_t set_time, adjtime->local_utc = ctl->universal ? UTC : LOCAL; adjtime->dirty = TRUE; } + /* + * Negate the drift correction, because we want to 'predict' a + * Hardware Clock time that includes drift. + */ + if (ctl->predict) { + hclocktime = t2tv(set_time); + calculate_adjustment(ctl, adjtime->drift_factor, + adjtime->last_adj_time, + adjtime->not_adjusted, + hclocktime.tv_sec, &tdrift); + hclocktime = time_inc(hclocktime, (double) + -(tdrift.tv_sec + tdrift.tv_usec / 1E6)); + if (ctl->debug) { + printf(_ ("Target date: %ld\n"), set_time); + printf(_ ("Predicted RTC: %ld\n"), hclocktime.tv_sec); + } + display_time(TRUE, hclocktime); + return 0; + } if (ctl->systz) return set_system_clock_timezone(ctl); - if (!ctl->predict && ur->get_permissions()) + if (ur->get_permissions()) return EX_NOPERM; if (ctl->show || ctl->get || ctl->adjust || ctl->hctosys - || (!ctl->noadjfile && !ctl->predict)) { + || !ctl->noadjfile) { /* data from HW-clock are required */ rc = synchronize_to_clock_tick(ctl); @@ -1075,22 +1094,17 @@ manipulate_clock(const struct hwclock_control *ctl, const time_t set_time, if (rc && !ctl->set && !ctl->systohc) return EX_IOERR; } + /* + * Calculate and apply drift correction to the Hardware Clock + * time for everything except --show + */ + calculate_adjustment(ctl, adjtime->drift_factor, + adjtime->last_adj_time, + adjtime->not_adjusted, + hclocktime.tv_sec, &tdrift); + if (!ctl->show) + hclocktime = time_inc(tdrift, hclocktime.tv_sec); } - /* - * Calculate Hardware Clock drift for --predict with the user - * supplied --date option time, and with the time read from the - * Hardware Clock for all other operations. Apply drift correction - * to the Hardware Clock time for everything except --show and - * --predict. For --predict negate the drift correction, because we - * want to 'predict' a future Hardware Clock time that includes drift. - */ - hclocktime = ctl->predict ? t2tv(set_time) : hclocktime; - calculate_adjustment(ctl, adjtime->drift_factor, - adjtime->last_adj_time, - adjtime->not_adjusted, - hclocktime.tv_sec, &tdrift); - if (!ctl->show && !ctl->predict) - hclocktime = time_inc(tdrift, hclocktime.tv_sec); if (ctl->show || ctl->get) { display_time(hclock_valid, time_inc(hclocktime, -time_diff @@ -1126,15 +1140,6 @@ manipulate_clock(const struct hwclock_control *ctl, const time_t set_time, hclock_valid, hclocktime); } else if (ctl->hctosys) { return set_system_clock(ctl, hclock_valid, hclocktime); - } else if (ctl->predict) { - hclocktime = time_inc(hclocktime, (double) - -(tdrift.tv_sec + tdrift.tv_usec / 1E6)); - if (ctl->debug) { - printf(_ - ("At %ld seconds after 1969, RTC is predicted to read %ld seconds after 1969.\n"), - set_time, hclocktime.tv_sec); - } - display_time(TRUE, hclocktime); } if (!ctl->noadjfile) save_adjtime(ctl, adjtime); |