Commit c7f3c595 authored by Kees Cook's avatar Kees Cook

pstore: Populate pstore record->time field

The current time will be initially available in the record->time field
for all pstore_read() and pstore_write() calls. Backends can either
update the field during read(), or use the field during write() instead
of fetching time themselves.
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
parent e581ca81
...@@ -244,9 +244,6 @@ static int efi_pstore_write(struct pstore_record *record) ...@@ -244,9 +244,6 @@ static int efi_pstore_write(struct pstore_record *record)
efi_guid_t vendor = LINUX_EFI_CRASH_GUID; efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
int i, ret = 0; int i, ret = 0;
record->time.tv_sec = get_seconds();
record->time.tv_nsec = 0;
record->id = generic_id(record->time.tv_sec, record->part, record->id = generic_id(record->time.tv_sec, record->part,
record->count); record->count);
......
...@@ -480,6 +480,12 @@ void pstore_record_init(struct pstore_record *record, ...@@ -480,6 +480,12 @@ void pstore_record_init(struct pstore_record *record,
memset(record, 0, sizeof(*record)); memset(record, 0, sizeof(*record));
record->psi = psinfo; record->psi = psinfo;
/* Report zeroed timestamp if called before timekeeping has resumed. */
if (__getnstimeofday(&record->time)) {
record->time.tv_sec = 0;
record->time.tv_nsec = 0;
}
} }
/* /*
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/pstore.h> #include <linux/pstore.h>
#include <linux/time.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -356,20 +355,15 @@ static ssize_t ramoops_pstore_read(struct pstore_record *record) ...@@ -356,20 +355,15 @@ static ssize_t ramoops_pstore_read(struct pstore_record *record)
} }
static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz, static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone *prz,
bool compressed) struct pstore_record *record)
{ {
char *hdr; char *hdr;
struct timespec timestamp;
size_t len; size_t len;
/* Report zeroed timestamp if called before timekeeping has resumed. */
if (__getnstimeofday(&timestamp)) {
timestamp.tv_sec = 0;
timestamp.tv_nsec = 0;
}
hdr = kasprintf(GFP_ATOMIC, RAMOOPS_KERNMSG_HDR "%lu.%lu-%c\n", hdr = kasprintf(GFP_ATOMIC, RAMOOPS_KERNMSG_HDR "%lu.%lu-%c\n",
(long)timestamp.tv_sec, (long)(timestamp.tv_nsec / 1000), record->time.tv_sec,
compressed ? 'C' : 'D'); record->time.tv_nsec / 1000,
record->compressed ? 'C' : 'D');
WARN_ON_ONCE(!hdr); WARN_ON_ONCE(!hdr);
len = hdr ? strlen(hdr) : 0; len = hdr ? strlen(hdr) : 0;
persistent_ram_write(prz, hdr, len); persistent_ram_write(prz, hdr, len);
...@@ -440,7 +434,7 @@ static int notrace ramoops_pstore_write(struct pstore_record *record) ...@@ -440,7 +434,7 @@ static int notrace ramoops_pstore_write(struct pstore_record *record)
prz = cxt->dprzs[cxt->dump_write_cnt]; prz = cxt->dprzs[cxt->dump_write_cnt];
/* Build header and append record contents. */ /* Build header and append record contents. */
hlen = ramoops_write_kmsg_hdr(prz, record->compressed); hlen = ramoops_write_kmsg_hdr(prz, record);
size = record->size; size = record->size;
if (size + hlen > prz->buffer_size) if (size + hlen > prz->buffer_size)
size = prz->buffer_size - hlen; size = prz->buffer_size - hlen;
......
...@@ -138,7 +138,10 @@ struct pstore_record { ...@@ -138,7 +138,10 @@ struct pstore_record {
* memory allocation may be broken during an Oops. Regardless, * memory allocation may be broken during an Oops. Regardless,
* @buf must be proccesed or copied before returning. The * @buf must be proccesed or copied before returning. The
* backend is also expected to write @id with something that * backend is also expected to write @id with something that
8 can help identify this record to a future @erase callback. * can help identify this record to a future @erase callback.
* The @time field will be prepopulated with the current time,
* when available. The @size field will have the size of data
* in @buf.
* *
* Returns 0 on success, and non-zero on error. * Returns 0 on success, and non-zero on error.
* *
......
Markdown is supported
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