On Tue, May 19, 2015 at 5:49 AM, Baolin Wang <[email protected]> wrote: > This patch introduces the clock_set64 method with timespec64 type for > k_clock structure, that makes it ready for the 2038 year. > > Convert to the 64bit method with timespec64 type for the > clock_settime syscall function, and change the clock_settime syscall > implementation according to the CONFIG_64BIT macro. > > Also add a default 64bit method for the clock_set64 pointer of > k_clock structure, and it will be removed after all the drivers are > converted to 64bit methods. > > Signed-off-by: Baolin Wang <[email protected]> > --- > include/linux/posix-timers.h | 2 ++ > kernel/time/posix-timers.c | 30 +++++++++++++++++++++++++++--- > 2 files changed, 29 insertions(+), 3 deletions(-) > > diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h > index 16c3364..2b19ec8 100644 > --- a/include/linux/posix-timers.h > +++ b/include/linux/posix-timers.h > @@ -100,6 +100,8 @@ struct k_clock { > int (*clock_getres) (const clockid_t which_clock, struct timespec > *tp); > int (*clock_set) (const clockid_t which_clock, > const struct timespec *tp); > + int (*clock_set64) (const clockid_t which_clock, > + const struct timespec64 *tp); > int (*clock_get) (const clockid_t which_clock, struct timespec * tp); > int (*clock_adj) (const clockid_t which_clock, struct timex *tx); > int (*timer_create) (struct k_itimer *timer); > diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c > index bfcfc78..3d59efa 100644 > --- a/kernel/time/posix-timers.c > +++ b/kernel/time/posix-timers.c > @@ -541,6 +541,18 @@ static int default_timer_set64(struct k_itimer *timr, > int flags, > return ret; > } > > +static int default_clock_set64(const clockid_t which_clock, > + const struct timespec64 *tp64) > +{ > + struct k_clock *kc = clockid_to_kclock(which_clock); > + struct timespec tp; > + int ret; > + > + tp = timespec64_to_timespec(*tp64); > + ret = kc->clock_set(which_clock, &tp); > + return ret; > +} > + > void posix_timers_register_clock(const clockid_t clock_id, > struct k_clock *new_clock) > { > @@ -565,6 +577,8 @@ void posix_timers_register_clock(const clockid_t clock_id, > new_clock->timer_get64 = default_timer_get64; > if (new_clock->timer_set && !new_clock->timer_set64) > new_clock->timer_set64 = default_timer_set64; > + if (new_clock->clock_set && !new_clock->clock_set64) > + new_clock->clock_set64 = default_clock_set64; > > posix_clocks[clock_id] = *new_clock; > } > @@ -1075,25 +1089,35 @@ void exit_itimers(struct signal_struct *sig) > } > } > > -static int __clock_settime(clockid_t which_clock, struct timespec *ts) > +static int __clock_settime(clockid_t which_clock, struct timespec64 *ts) > { > struct k_clock *kc = clockid_to_kclock(which_clock); > > - if (!kc || !kc->clock_set) > + if (!kc || !kc->clock_set64) > return -EINVAL; > > - return kc->clock_set(which_clock, ts); > + return kc->clock_set64(which_clock, ts); > } > > SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, > const struct timespec __user *, tp) > { > +#ifdef CONFIG_64BIT > + struct timespec64 new_tp; > +#else > struct timespec new_tp; > + struct timespec64 new_tp64; > +#endif > > if (copy_from_user(&new_tp, tp, sizeof (*tp))) > return -EFAULT; > > +#ifdef CONFIG_64BIT > return __clock_settime(which_clock, &new_tp); > +#else > + new_tp64 = timespec_to_timespec64(new_tp); > + return __clock_settime(which_clock, &new_tp64); > +#endif > }
Please just have two clock_settime functions wrapped by the ifdef conditional. You should always try to avoid ifdefs inside of functions. thanks -john _______________________________________________ Y2038 mailing list [email protected] https://lists.linaro.org/mailman/listinfo/y2038
