scsi: Remove usage of struct timeval
Subsystems (2)
PATCH 1/1 scsi: Remove usage of struct timeval
struct timeval will have its tv_sec field overflow on 32-bit systems in year 2038 and beyond. This patch removes the usage of struct timeval and instead uses 64-bit ktime_t to get the current milliseconds to populate pmcraid_timestamp_data.
--- drivers/scsi/pmcraid.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/scsi/pmcraid.c +2 -3
@@ -25,6 +25,7 @@#include <linux/fs.h> #include <linux/init.h> #include <linux/types.h> +#include <linux/ktime.h> #include <linux/errno.h> #include <linux/kernel.h> #include <linux/ioport.h>
@@ -5569,11 +5570,9 @@ static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd)__be32 time_stamp_len =cpu_to_be32 (PMCRAID_TIMESTAMP_LEN );struct pmcraid_ioadl_desc *ioadl = ioarcb->add_data.u.ioadl; -struct timeval tv;__le64 timestamp; -do_gettimeofday (&tv); - timestamp = tv.tv_sec *1000 ; + timestamp =ktime_to_ms (ktime_get_real ()); pinstance->timestamp_data->timestamp[0 ] = (__u8)(timestamp); pinstance->timestamp_data->timestamp[1 ] = (__u8)((timestamp) >>8 );
Signature · 1 line
2.2.0.rc0.207.ga3a616c
Quoted 6 lines · On Wednesday 04 February 2015 08:39:54 Tina Ruchandani wrote:
struct timeval will have its
tv_secfield overflow on 32-bit systems in year 2038 and beyond. This patch removes the usage of struct timeval and instead uses 64-bitktime_tto get the current milliseconds to populatepmcraid_timestamp_data.Signed-off-by Tina Ruchandani <[email protected]>
The change you did looks correct, but I see two problems:
- The subject line should mention the name of the driver you change, as you are not doing this for the entire scsi subsystem at once.
drivers/scsi/pmcraid.c static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd) · line 5578
Quoted 13 lines
drivers/scsi/pmcraid.c +1
-3@@ -5569,11 +5570,9 @@ static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd)__be32 time_stamp_len =cpu_to_be32 (PMCRAID_TIMESTAMP_LEN );struct pmcraid_ioadl_desc *ioadl = ioarcb->add_data.u.ioadl; -struct timeval tv;__le64 timestamp; -do_gettimeofday (&tv); - timestamp = tv.tv_sec *1000 ; + timestamp =ktime_to_ms (ktime_get_real ()); pinstance->timestamp_data->timestamp[0 ] = (__u8)(timestamp); pinstance->timestamp_data->timestamp[1 ] = (__u8)((timestamp) >>8 );
It looks like a preexisting bug here, but it makes sense to fix it at the same time and describe that change in the patch changelog:
timestamp is declared as an __le64 type but gets set to a cpu-endian value from tv.tv_sec or ktime_to_ms, which is wrong. The code indeed gets the endianess right by copying the bytes individually, so I think you should just use a u64 type here.
Arnd