USB: usbmon: Use 64bit timestamp for mon_bin_hdr
authorTina Ruchandani <ruchandani.tina@gmail.com>
Fri, 30 Oct 2015 05:44:31 +0000 (22:44 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 1 Dec 2015 22:54:06 +0000 (14:54 -0800)
struct mon_bin_hdr allows for a 64-bit seconds timestamp. The code
currently uses 'struct timeval' to populate the timestamp in mon_bin_hdr,
which has a 32-bit seconds field and will overflow in year 2038 and beyond.
This patch replaces 'struct timeval' with 'struct timespec64' which is
y2038 safe. This patch is part of a larger attempt to remove instances
of struct timeval and other 32-bit timekeeping (time_t, struct timespec)
from the kernel.

Signed-off-by: Tina Ruchandani <ruchandani.tina@gmail.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/mon/mon_bin.c

index 3598f1a..1a874a1 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/mm.h>
 #include <linux/scatterlist.h>
 #include <linux/slab.h>
+#include <linux/time64.h>
 
 #include <asm/uaccess.h>
 
@@ -92,8 +93,8 @@ struct mon_bin_hdr {
        unsigned short busnum;  /* Bus number */
        char flag_setup;
        char flag_data;
-       s64 ts_sec;             /* gettimeofday */
-       s32 ts_usec;            /* gettimeofday */
+       s64 ts_sec;             /* getnstimeofday64 */
+       s32 ts_usec;            /* getnstimeofday64 */
        int status;
        unsigned int len_urb;   /* Length of data (submitted or actual) */
        unsigned int len_cap;   /* Delivered length */
@@ -483,7 +484,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
     char ev_type, int status)
 {
        const struct usb_endpoint_descriptor *epd = &urb->ep->desc;
-       struct timeval ts;
+       struct timespec64 ts;
        unsigned long flags;
        unsigned int urb_length;
        unsigned int offset;
@@ -494,7 +495,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
        struct mon_bin_hdr *ep;
        char data_tag = 0;
 
-       do_gettimeofday(&ts);
+       getnstimeofday64(&ts);
 
        spin_lock_irqsave(&rp->b_lock, flags);
 
@@ -568,7 +569,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
        ep->busnum = urb->dev->bus->busnum;
        ep->id = (unsigned long) urb;
        ep->ts_sec = ts.tv_sec;
-       ep->ts_usec = ts.tv_usec;
+       ep->ts_usec = ts.tv_nsec / NSEC_PER_USEC;
        ep->status = status;
        ep->len_urb = urb_length;
        ep->len_cap = length + lendesc;
@@ -629,12 +630,12 @@ static void mon_bin_complete(void *data, struct urb *urb, int status)
 static void mon_bin_error(void *data, struct urb *urb, int error)
 {
        struct mon_reader_bin *rp = data;
-       struct timeval ts;
+       struct timespec64 ts;
        unsigned long flags;
        unsigned int offset;
        struct mon_bin_hdr *ep;
 
-       do_gettimeofday(&ts);
+       getnstimeofday64(&ts);
 
        spin_lock_irqsave(&rp->b_lock, flags);
 
@@ -656,7 +657,7 @@ static void mon_bin_error(void *data, struct urb *urb, int error)
        ep->busnum = urb->dev->bus->busnum;
        ep->id = (unsigned long) urb;
        ep->ts_sec = ts.tv_sec;
-       ep->ts_usec = ts.tv_usec;
+       ep->ts_usec = ts.tv_nsec / NSEC_PER_USEC;
        ep->status = error;
 
        ep->flag_setup = '-';