On 21 May 2015 at 01:55, John Stultz <[email protected]> wrote: > 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 >
Thanks for your comments. I'll fix that to make it look easily. -- Baolin.wang Best Regards _______________________________________________ Y2038 mailing list [email protected] https://lists.linaro.org/mailman/listinfo/y2038
