lkml.org 
[lkml]   [2015]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/21] rtc: Provide y2038 safe rtc_class_ops.set_mmss() replacement
    Date
    From: Xunlei Pang <pang.xunlei@linaro.org>

    Currently the rtc_class_op's set_mmss() function takes a 32bit second
    value (on 32bit systems), which is problematic for dates past y2038.

    This patch provides a safe version named set_mmss64() using y2038 safe
    time64_t.

    After this patch, set_mmss() is deprecated and all its users will be
    fixed to use set_mmss64(), it can be removed when having no users.

    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@kernel.org>
    Acked-by: Alessandro Zummo <a.zummo@towertech.it>
    Signed-off-by: Xunlei Pang <pang.xunlei@linaro.org>
    [jstultz: Add whitespace fix for checkpatch]
    Signed-off-by: John Stultz <john.stultz@linaro.org>
    ---
    drivers/rtc/interface.c | 8 +++++++-
    drivers/rtc/systohc.c | 5 ++++-
    include/linux/rtc.h | 1 +
    3 files changed, 12 insertions(+), 2 deletions(-)

    diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
    index 37215cf..d43ee40 100644
    --- a/drivers/rtc/interface.c
    +++ b/drivers/rtc/interface.c
    @@ -72,7 +72,11 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
    err = -ENODEV;
    else if (rtc->ops->set_time)
    err = rtc->ops->set_time(rtc->dev.parent, tm);
    - else if (rtc->ops->set_mmss) {
    + else if (rtc->ops->set_mmss64) {
    + time64_t secs64 = rtc_tm_to_time64(tm);
    +
    + err = rtc->ops->set_mmss64(rtc->dev.parent, secs64);
    + } else if (rtc->ops->set_mmss) {
    time64_t secs64 = rtc_tm_to_time64(tm);
    err = rtc->ops->set_mmss(rtc->dev.parent, secs64);
    } else
    @@ -96,6 +100,8 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)

    if (!rtc->ops)
    err = -ENODEV;
    + else if (rtc->ops->set_mmss64)
    + err = rtc->ops->set_mmss64(rtc->dev.parent, secs);
    else if (rtc->ops->set_mmss)
    err = rtc->ops->set_mmss(rtc->dev.parent, secs);
    else if (rtc->ops->read_time && rtc->ops->set_time) {
    diff --git a/drivers/rtc/systohc.c b/drivers/rtc/systohc.c
    index ef3c07a..7728d5e 100644
    --- a/drivers/rtc/systohc.c
    +++ b/drivers/rtc/systohc.c
    @@ -35,7 +35,10 @@ int rtc_set_ntp_time(struct timespec64 now)
    if (rtc) {
    /* rtc_hctosys exclusively uses UTC, so we call set_time here,
    * not set_mmss. */
    - if (rtc->ops && (rtc->ops->set_time || rtc->ops->set_mmss))
    + if (rtc->ops &&
    + (rtc->ops->set_time ||
    + rtc->ops->set_mmss64 ||
    + rtc->ops->set_mmss))
    err = rtc_set_time(rtc, &tm);
    rtc_class_close(rtc);
    }
    diff --git a/include/linux/rtc.h b/include/linux/rtc.h
    index dcad7ee..8dcf682 100644
    --- a/include/linux/rtc.h
    +++ b/include/linux/rtc.h
    @@ -77,6 +77,7 @@ struct rtc_class_ops {
    int (*read_alarm)(struct device *, struct rtc_wkalrm *);
    int (*set_alarm)(struct device *, struct rtc_wkalrm *);
    int (*proc)(struct device *, struct seq_file *);
    + int (*set_mmss64)(struct device *, time64_t secs);
    int (*set_mmss)(struct device *, unsigned long secs);
    int (*read_callback)(struct device *, int data);
    int (*alarm_irq_enable)(struct device *, unsigned int enabled);
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-04-02 06:01    [W:5.079 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site