mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 13:16:22 +00:00
a9efd39cd5
[Issue] Currently, a variable name, which is used to identify each log entry, consists of type, id and ctime. But an erase callback does not use ctime. If efi_pstore supported just one log, type and id were enough. However, in case of supporting multiple logs, it doesn't work because it can't distinguish each entry without ctime at erasing time. <Example> As you can see below, efi_pstore can't differentiate first event from second one without ctime. a variable name of first event: dump-type0-1-12345678 a variable name of second event: dump-type0-1-23456789 type:0 id:1 ctime:12345678, 23456789 [Solution] This patch adds ctime to an argument of an erase callback. It works across reboots because ctime of pstore means the date that the record was originally stored. To do this, efi_pstore saves the ctime to variable name at writing time and passes it to pstore at reading time. Signed-off-by: Seiji Aguchi <seiji.aguchi@hds.com> Acked-by: Mike Waychison <mikew@google.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
78 lines
2.2 KiB
C
78 lines
2.2 KiB
C
/*
|
|
* Persistent Storage - pstore.h
|
|
*
|
|
* Copyright (C) 2010 Intel Corporation <tony.luck@intel.com>
|
|
*
|
|
* This code is the generic layer to export data records from platform
|
|
* level persistent storage via a file system.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
#ifndef _LINUX_PSTORE_H
|
|
#define _LINUX_PSTORE_H
|
|
|
|
#include <linux/time.h>
|
|
#include <linux/kmsg_dump.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/types.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/errno.h>
|
|
|
|
/* types */
|
|
enum pstore_type_id {
|
|
PSTORE_TYPE_DMESG = 0,
|
|
PSTORE_TYPE_MCE = 1,
|
|
PSTORE_TYPE_CONSOLE = 2,
|
|
PSTORE_TYPE_FTRACE = 3,
|
|
PSTORE_TYPE_UNKNOWN = 255
|
|
};
|
|
|
|
struct module;
|
|
|
|
struct pstore_info {
|
|
struct module *owner;
|
|
char *name;
|
|
spinlock_t buf_lock; /* serialize access to 'buf' */
|
|
char *buf;
|
|
size_t bufsize;
|
|
struct mutex read_mutex; /* serialize open/read/close */
|
|
int (*open)(struct pstore_info *psi);
|
|
int (*close)(struct pstore_info *psi);
|
|
ssize_t (*read)(u64 *id, enum pstore_type_id *type,
|
|
struct timespec *time, char **buf,
|
|
struct pstore_info *psi);
|
|
int (*write)(enum pstore_type_id type,
|
|
enum kmsg_dump_reason reason, u64 *id,
|
|
unsigned int part, size_t size, struct pstore_info *psi);
|
|
int (*write_buf)(enum pstore_type_id type,
|
|
enum kmsg_dump_reason reason, u64 *id,
|
|
unsigned int part, const char *buf, size_t size,
|
|
struct pstore_info *psi);
|
|
int (*erase)(enum pstore_type_id type, u64 id,
|
|
struct timespec time, struct pstore_info *psi);
|
|
void *data;
|
|
};
|
|
|
|
#ifdef CONFIG_PSTORE
|
|
extern int pstore_register(struct pstore_info *);
|
|
#else
|
|
static inline int
|
|
pstore_register(struct pstore_info *psi)
|
|
{
|
|
return -ENODEV;
|
|
}
|
|
#endif
|
|
|
|
#endif /*_LINUX_PSTORE_H*/
|