lib/vsprintf: Add specifier for printing struct timespec64

A handful drivers want to print a content of the struct timespec64
in a format of %lld:%09ld. In order to make their lives easier, add
the respecting specifier directly to the printf() implementation.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Tested-by: Petr Mladek <pmladek@suse.com>
Link: https://patch.msgid.link/20251113150217.3030010-2-andriy.shevchenko@linux.intel.com
Signed-off-by: Petr Mladek <pmladek@suse.com>
This commit is contained in:
Andy Shevchenko
2025-11-13 15:32:15 +01:00
committed by Petr Mladek
parent 48e3694ae7
commit bccd593744
3 changed files with 40 additions and 3 deletions

View File

@@ -1992,6 +1992,28 @@ char *time64_str(char *buf, char *end, const time64_t time,
return rtc_str(buf, end, &rtc_time, spec, fmt);
}
static noinline_for_stack
char *timespec64_str(char *buf, char *end, const struct timespec64 *ts,
struct printf_spec spec, const char *fmt)
{
static const struct printf_spec default_dec09_spec = {
.base = 10,
.field_width = 9,
.precision = -1,
.flags = ZEROPAD,
};
if (fmt[2] == 'p')
buf = number(buf, end, ts->tv_sec, default_dec_spec);
else
buf = time64_str(buf, end, ts->tv_sec, spec, fmt);
if (buf < end)
*buf = '.';
buf++;
return number(buf, end, ts->tv_nsec, default_dec09_spec);
}
static noinline_for_stack
char *time_and_date(char *buf, char *end, void *ptr, struct printf_spec spec,
const char *fmt)
@@ -1999,6 +2021,8 @@ char *time_and_date(char *buf, char *end, void *ptr, struct printf_spec spec,
switch (fmt[1]) {
case 'R':
return rtc_str(buf, end, (const struct rtc_time *)ptr, spec, fmt);
case 'S':
return timespec64_str(buf, end, (const struct timespec64 *)ptr, spec, fmt);
case 'T':
return time64_str(buf, end, *(const time64_t *)ptr, spec, fmt);
default:
@@ -2462,9 +2486,11 @@ early_param("no_hash_pointers", no_hash_pointers_enable);
* - 'd[234]' For a dentry name (optionally 2-4 last components)
* - 'D[234]' Same as 'd' but for a struct file
* - 'g' For block_device name (gendisk + partition number)
* - 't[RT][dt][r][s]' For time and date as represented by:
* - 't[RST][dt][r][s]' For time and date as represented by:
* R struct rtc_time
* S struct timespec64
* T time64_t
* - 'tSp' For time represented by struct timespec64 printed as <seconds>.<nanoseconds>
* - 'C' For a clock, it prints the name (Common Clock Framework) or address
* (legacy clock framework) of the clock
* - 'G' For flags to be printed as a collection of symbolic strings that would