Commit e264abea authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

pstore: Remove bogus format string definition

The pstore conversion to timespec64 introduces its own method of passing
seconds into sscanf() and sprintf() type functions to work around the
timespec64 definition on 64-bit systems that redefine it to 'timespec'.

That hack is now finally getting removed, but that means we get a (harmless)
warning once both patches are merged:

fs/pstore/ram.c: In function 'ramoops_read_kmsg_hdr':
fs/pstore/ram.c:39:29: error: format '%ld' expects argument of type 'long int *', but argument 3 has type 'time64_t *' {aka 'long long int *'} [-Werror=format=]
 #define RAMOOPS_KERNMSG_HDR "===="
                             ^~~~~~
fs/pstore/ram.c:167:21: note: in expansion of macro 'RAMOOPS_KERNMSG_HDR'

This removes the pstore specific workaround and uses the same method that
we have in place for all other functions that print a timespec64.

Related to this, I found that the kasprintf() output contains an incorrect
nanosecond values for any number starting with zeroes, and I adapt the
format string accordingly.

Link: https://lkml.org/lkml/2018/5/19/115
Link: https://lkml.org/lkml/2018/5/16/1080


Fixes: 0f0d83b99ef7 ("pstore: Convert internal records to timespec64")
Acked-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 15eefe2a
...@@ -38,11 +38,6 @@ ...@@ -38,11 +38,6 @@
#define RAMOOPS_KERNMSG_HDR "====" #define RAMOOPS_KERNMSG_HDR "===="
#define MIN_MEM_SIZE 4096UL #define MIN_MEM_SIZE 4096UL
#if __BITS_PER_LONG == 64
# define TVSEC_FMT "%ld"
#else
# define TVSEC_FMT "%lld"
#endif
static ulong record_size = MIN_MEM_SIZE; static ulong record_size = MIN_MEM_SIZE;
module_param(record_size, ulong, 0400); module_param(record_size, ulong, 0400);
...@@ -164,15 +159,15 @@ static int ramoops_read_kmsg_hdr(char *buffer, struct timespec64 *time, ...@@ -164,15 +159,15 @@ static int ramoops_read_kmsg_hdr(char *buffer, struct timespec64 *time,
char data_type; char data_type;
int header_length = 0; int header_length = 0;
if (sscanf(buffer, RAMOOPS_KERNMSG_HDR TVSEC_FMT ".%lu-%c\n%n", if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lld.%lu-%c\n%n",
&time->tv_sec, &time->tv_nsec, &data_type, (time64_t *)&time->tv_sec, &time->tv_nsec, &data_type,
&header_length) == 3) { &header_length) == 3) {
if (data_type == 'C') if (data_type == 'C')
*compressed = true; *compressed = true;
else else
*compressed = false; *compressed = false;
} else if (sscanf(buffer, RAMOOPS_KERNMSG_HDR TVSEC_FMT ".%lu\n%n", } else if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lld.%lu\n%n",
&time->tv_sec, &time->tv_nsec, (time64_t *)&time->tv_sec, &time->tv_nsec,
&header_length) == 2) { &header_length) == 2) {
*compressed = false; *compressed = false;
} else { } else {
...@@ -367,8 +362,8 @@ static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz, ...@@ -367,8 +362,8 @@ static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz,
char *hdr; char *hdr;
size_t len; size_t len;
hdr = kasprintf(GFP_ATOMIC, RAMOOPS_KERNMSG_HDR TVSEC_FMT ".%lu-%c\n", hdr = kasprintf(GFP_ATOMIC, RAMOOPS_KERNMSG_HDR "%lld.%06lu-%c\n",
record->time.tv_sec, (time64_t)record->time.tv_sec,
record->time.tv_nsec / 1000, record->time.tv_nsec / 1000,
record->compressed ? 'C' : 'D'); record->compressed ? 'C' : 'D');
WARN_ON_ONCE(!hdr); WARN_ON_ONCE(!hdr);
......
Supports Markdown
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