resending for review...
On Fri, Nov 20, 2015 at 10:23:17AM -0800, Alison Schofield wrote: > divamnt stores a start_time at init and uses it to calculate > elapsed time. These operations are all internal to divamnt. > > Address struct timeval overflow on 32-bit systems by replacing: > struct timeval with struct timespec64; do_gettimeofday() with > getnstimeofday64(); the calculations that yield a safe and normalized > elapsed time with timespec64_sub() which provides same. > > Signed-off-by: Alison Schofield <[email protected]> > --- > drivers/isdn/hardware/eicon/divamnt.c | 35 > +++++++++++------------------------ > 1 file changed, 11 insertions(+), 24 deletions(-) > > diff --git a/drivers/isdn/hardware/eicon/divamnt.c > b/drivers/isdn/hardware/eicon/divamnt.c > index 48db08d..7ac057e 100644 > --- a/drivers/isdn/hardware/eicon/divamnt.c > +++ b/drivers/isdn/hardware/eicon/divamnt.c > @@ -45,7 +45,7 @@ char *DRIVERRELEASE_MNT = "2.0"; > > static wait_queue_head_t msgwaitq; > static unsigned long opened; > -static struct timeval start_time; > +static struct timespec64 start_time; > > extern int mntfunc_init(int *, void **, unsigned long); > extern void mntfunc_finit(void); > @@ -88,28 +88,15 @@ int diva_os_copy_from_user(void *os_handle, void *dst, > const void __user *src, > */ > void diva_os_get_time(dword *sec, dword *usec) > { > - struct timeval tv; > - > - do_gettimeofday(&tv); > - > - if (tv.tv_sec > start_time.tv_sec) { > - if (start_time.tv_usec > tv.tv_usec) { > - tv.tv_sec--; > - tv.tv_usec += 1000000; > - } > - *sec = (dword) (tv.tv_sec - start_time.tv_sec); > - *usec = (dword) (tv.tv_usec - start_time.tv_usec); > - } else if (tv.tv_sec == start_time.tv_sec) { > - *sec = 0; > - if (start_time.tv_usec < tv.tv_usec) { > - *usec = (dword) (tv.tv_usec - start_time.tv_usec); > - } else { > - *usec = 0; > - } > - } else { > - *sec = (dword) tv.tv_sec; > - *usec = (dword) tv.tv_usec; > - } > + struct timespec64 curr_time; > + struct timespec64 delta; > + > + getnstimeofday64(&curr_time); > + > + delta = timespec64_sub(curr_time, start_time); > + > + *sec = (dword) delta.tv_sec; > + *usec = (dword) (delta.tv_nsec / NSEC_PER_USEC); > } > > /* > @@ -213,7 +200,7 @@ static int __init maint_init(void) > int ret = 0; > void *buffer = NULL; > > - do_gettimeofday(&start_time); > + getnstimeofday64(&start_time); > init_waitqueue_head(&msgwaitq); > > printk(KERN_INFO "%s\n", DRIVERNAME); > -- > 2.1.4 > _______________________________________________ Y2038 mailing list [email protected] https://lists.linaro.org/mailman/listinfo/y2038
