mirror of https://gitee.com/openkylin/linux.git
scsi: pmcraid: replace struct timeval with ktime_get_real_seconds()
Replace the use of struct timeval and do_gettimeofday() with 64 bit ktime_get_real_seconds. Prevents 32-bit type overflow in year 2038 on 32-bit systems. Driver was using the seconds portion of struct timeval (.tv_secs) to pass a millseconds timestamp to the firmware. This change maintains that same behavior using ktime_get_real_seconds. The structure used to pass the timestamp to firmware is 48 bits and works fine as long as the top 16 bits are zero and they will be zero for a long time..ie. thousands of years. Alternative Change: Add sub second granularity to timestamp As noted above, the driver only used the seconds portion of timeval, ignores the microseconds portion, and by multiplying by 1000 effectively does a <<10 and always writes zero into timestamp[0]. The alternative change would pass all the bits to the firmware: struct timespec64 ts; ktime_get_real_ts64(&ts); timestamp = ts.tv_sec * MSEC_PER_SEC + ts.tv_nsec / NSEC_PER_MSEC; Signed-off-by: Alison Schofield <amsfield22@gmail.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
36f8ef7f76
commit
9c9bd593f3
|
@ -45,6 +45,7 @@
|
|||
#include <asm/processor.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <scsi/scsi_device.h>
|
||||
|
@ -5563,11 +5564,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_get_real_seconds() * 1000;
|
||||
|
||||
pinstance->timestamp_data->timestamp[0] = (__u8)(timestamp);
|
||||
pinstance->timestamp_data->timestamp[1] = (__u8)((timestamp) >> 8);
|
||||
|
|
Loading…
Reference in New Issue