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: Kees Cook <keescook@chromium.org>
This commit is contained in:
parent
e581ca813a
commit
c7f3c595f6
|
@ -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,
|
||||||
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 @@
|
||||||
#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 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
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(×tamp)) {
|
|
||||||
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)
|
||||||
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 {
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue