Commit 8ab0f723 authored by Tina Ruchandani's avatar Tina Ruchandani Committed by Greg Kroah-Hartman

USB: usbmon: Use 64bit timestamp for mon_bin_hdr

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: default avatarTina Ruchandani <ruchandani.tina@gmail.com>
Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 18fc4ebd
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/time64.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -92,8 +93,8 @@ struct mon_bin_hdr { ...@@ -92,8 +93,8 @@ struct mon_bin_hdr {
unsigned short busnum; /* Bus number */ unsigned short busnum; /* Bus number */
char flag_setup; char flag_setup;
char flag_data; char flag_data;
s64 ts_sec; /* gettimeofday */ s64 ts_sec; /* getnstimeofday64 */
s32 ts_usec; /* gettimeofday */ s32 ts_usec; /* getnstimeofday64 */
int status; int status;
unsigned int len_urb; /* Length of data (submitted or actual) */ unsigned int len_urb; /* Length of data (submitted or actual) */
unsigned int len_cap; /* Delivered length */ unsigned int len_cap; /* Delivered length */
...@@ -483,7 +484,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, ...@@ -483,7 +484,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
char ev_type, int status) char ev_type, int status)
{ {
const struct usb_endpoint_descriptor *epd = &urb->ep->desc; const struct usb_endpoint_descriptor *epd = &urb->ep->desc;
struct timeval ts; struct timespec64 ts;
unsigned long flags; unsigned long flags;
unsigned int urb_length; unsigned int urb_length;
unsigned int offset; unsigned int offset;
...@@ -494,7 +495,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, ...@@ -494,7 +495,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
struct mon_bin_hdr *ep; struct mon_bin_hdr *ep;
char data_tag = 0; char data_tag = 0;
do_gettimeofday(&ts); getnstimeofday64(&ts);
spin_lock_irqsave(&rp->b_lock, flags); spin_lock_irqsave(&rp->b_lock, flags);
...@@ -568,7 +569,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, ...@@ -568,7 +569,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb,
ep->busnum = urb->dev->bus->busnum; ep->busnum = urb->dev->bus->busnum;
ep->id = (unsigned long) urb; ep->id = (unsigned long) urb;
ep->ts_sec = ts.tv_sec; 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->status = status;
ep->len_urb = urb_length; ep->len_urb = urb_length;
ep->len_cap = length + lendesc; ep->len_cap = length + lendesc;
...@@ -629,12 +630,12 @@ static void mon_bin_complete(void *data, struct urb *urb, int status) ...@@ -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) static void mon_bin_error(void *data, struct urb *urb, int error)
{ {
struct mon_reader_bin *rp = data; struct mon_reader_bin *rp = data;
struct timeval ts; struct timespec64 ts;
unsigned long flags; unsigned long flags;
unsigned int offset; unsigned int offset;
struct mon_bin_hdr *ep; struct mon_bin_hdr *ep;
do_gettimeofday(&ts); getnstimeofday64(&ts);
spin_lock_irqsave(&rp->b_lock, flags); spin_lock_irqsave(&rp->b_lock, flags);
...@@ -656,7 +657,7 @@ static void mon_bin_error(void *data, struct urb *urb, int error) ...@@ -656,7 +657,7 @@ static void mon_bin_error(void *data, struct urb *urb, int error)
ep->busnum = urb->dev->bus->busnum; ep->busnum = urb->dev->bus->busnum;
ep->id = (unsigned long) urb; ep->id = (unsigned long) urb;
ep->ts_sec = ts.tv_sec; 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->status = error;
ep->flag_setup = '-'; ep->flag_setup = '-';
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment