ata: fix "ering" sysfs time printing
The sysfs file for the libata error handling has multiple issues in the way it prints time stamps: * it prints a 9-digit nanosecond value using a %06lu format string, which drops some leading zeroes * it converts a 64-bit jiffes value to a timespec using jiffies_to_timespec(), which takes a 'long' argument, so the result is wrong after a jiffies overflow (49 days). * we try to avoid using timespec because that generally overflows in 2038, although this particular usage is ok. This replaces the jiffies_to_timespec call with an open-coded implementation that gets it right. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
8dbcad020f
commit
f3f99d37e6
|
@ -495,12 +495,13 @@ struct ata_show_ering_arg {
|
||||||
static int ata_show_ering(struct ata_ering_entry *ent, void *void_arg)
|
static int ata_show_ering(struct ata_ering_entry *ent, void *void_arg)
|
||||||
{
|
{
|
||||||
struct ata_show_ering_arg* arg = void_arg;
|
struct ata_show_ering_arg* arg = void_arg;
|
||||||
struct timespec time;
|
u64 seconds;
|
||||||
|
u32 rem;
|
||||||
|
|
||||||
jiffies_to_timespec(ent->timestamp,&time);
|
seconds = div_u64_rem(ent->timestamp, HZ, &rem);
|
||||||
arg->written += sprintf(arg->buf + arg->written,
|
arg->written += sprintf(arg->buf + arg->written,
|
||||||
"[%5lu.%06lu]",
|
"[%5llu.%09lu]", seconds,
|
||||||
time.tv_sec, time.tv_nsec);
|
rem * NSEC_PER_SEC / HZ);
|
||||||
arg->written += get_ata_err_names(ent->err_mask,
|
arg->written += get_ata_err_names(ent->err_mask,
|
||||||
arg->buf + arg->written);
|
arg->buf + arg->written);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue