Merge tag 'pstore-v4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull pstore updates from Kees Cook: "This has a large internal refactoring along with several smaller fixes. - constify compression structures; Bhumika Goyal - restore powerpc dumping; Ankit Kumar - fix more bugs in the rarely exercises module unloading logic - reorganize filesystem locking to fix problems noticed by lockdep - refactor internal pstore APIs to make development and review easier: - improve error reporting - add kernel-doc structure and function comments - avoid insane argument passing by using a common record structure" * tag 'pstore-v4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: (23 commits) pstore: Solve lockdep warning by moving inode locks pstore: Fix flags to enable dumps on powerpc pstore: Remove unused vmalloc.h in pmsg pstore: simplify write_user_compat() pstore: Remove write_buf() callback pstore: Replace arguments for write_buf_user() API pstore: Replace arguments for write_buf() API pstore: Replace arguments for erase() API pstore: Do not duplicate record metadata pstore: Allocate records on heap instead of stack pstore: Pass record contents instead of copying pstore: Always allocate buffer for decompression pstore: Replace arguments for write() API pstore: Replace arguments for read() API pstore: Switch pstore_mkfile to pass record pstore: Move record decompression to function pstore: Extract common arguments into structure pstore: Add kernel-doc for struct pstore_info pstore: Improve register_pstore() error reporting pstore: Avoid race in module unloading ...
This commit is contained in:
@@ -30,7 +30,9 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/* types */
|
||||
struct module;
|
||||
|
||||
/* pstore record types (see fs/pstore/inode.c for filename templates) */
|
||||
enum pstore_type_id {
|
||||
PSTORE_TYPE_DMESG = 0,
|
||||
PSTORE_TYPE_MCE = 1,
|
||||
@@ -45,42 +47,146 @@ enum pstore_type_id {
|
||||
PSTORE_TYPE_UNKNOWN = 255
|
||||
};
|
||||
|
||||
struct module;
|
||||
struct pstore_info;
|
||||
/**
|
||||
* struct pstore_record - details of a pstore record entry
|
||||
* @psi: pstore backend driver information
|
||||
* @type: pstore record type
|
||||
* @id: per-type unique identifier for record
|
||||
* @time: timestamp of the record
|
||||
* @buf: pointer to record contents
|
||||
* @size: size of @buf
|
||||
* @ecc_notice_size:
|
||||
* ECC information for @buf
|
||||
*
|
||||
* Valid for PSTORE_TYPE_DMESG @type:
|
||||
*
|
||||
* @count: Oops count since boot
|
||||
* @reason: kdump reason for notification
|
||||
* @part: position in a multipart record
|
||||
* @compressed: whether the buffer is compressed
|
||||
*
|
||||
*/
|
||||
struct pstore_record {
|
||||
struct pstore_info *psi;
|
||||
enum pstore_type_id type;
|
||||
u64 id;
|
||||
struct timespec time;
|
||||
char *buf;
|
||||
ssize_t size;
|
||||
ssize_t ecc_notice_size;
|
||||
|
||||
int count;
|
||||
enum kmsg_dump_reason reason;
|
||||
unsigned int part;
|
||||
bool compressed;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct pstore_info - backend pstore driver structure
|
||||
*
|
||||
* @owner: module which is repsonsible for this backend driver
|
||||
* @name: name of the backend driver
|
||||
*
|
||||
* @buf_lock: spinlock to serialize access to @buf
|
||||
* @buf: preallocated crash dump buffer
|
||||
* @bufsize: size of @buf available for crash dump writes
|
||||
*
|
||||
* @read_mutex: serializes @open, @read, @close, and @erase callbacks
|
||||
* @flags: bitfield of frontends the backend can accept writes for
|
||||
* @data: backend-private pointer passed back during callbacks
|
||||
*
|
||||
* Callbacks:
|
||||
*
|
||||
* @open:
|
||||
* Notify backend that pstore is starting a full read of backend
|
||||
* records. Followed by one or more @read calls, and a final @close.
|
||||
*
|
||||
* @psi: in: pointer to the struct pstore_info for the backend
|
||||
*
|
||||
* Returns 0 on success, and non-zero on error.
|
||||
*
|
||||
* @close:
|
||||
* Notify backend that pstore has finished a full read of backend
|
||||
* records. Always preceded by an @open call and one or more @read
|
||||
* calls.
|
||||
*
|
||||
* @psi: in: pointer to the struct pstore_info for the backend
|
||||
*
|
||||
* Returns 0 on success, and non-zero on error. (Though pstore will
|
||||
* ignore the error.)
|
||||
*
|
||||
* @read:
|
||||
* Read next available backend record. Called after a successful
|
||||
* @open.
|
||||
*
|
||||
* @record:
|
||||
* pointer to record to populate. @buf should be allocated
|
||||
* by the backend and filled. At least @type and @id should
|
||||
* be populated, since these are used when creating pstorefs
|
||||
* file names.
|
||||
*
|
||||
* Returns record size on success, zero when no more records are
|
||||
* available, or negative on error.
|
||||
*
|
||||
* @write:
|
||||
* A newly generated record needs to be written to backend storage.
|
||||
*
|
||||
* @record:
|
||||
* pointer to record metadata. When @type is PSTORE_TYPE_DMESG,
|
||||
* @buf will be pointing to the preallocated @psi.buf, since
|
||||
* memory allocation may be broken during an Oops. Regardless,
|
||||
* @buf must be proccesed or copied before returning. The
|
||||
* backend is also expected to write @id with something that
|
||||
8 can help identify this record to a future @erase callback.
|
||||
*
|
||||
* Returns 0 on success, and non-zero on error.
|
||||
*
|
||||
* @write_user:
|
||||
* Perform a frontend write to a backend record, using a specified
|
||||
* buffer that is coming directly from userspace, instead of the
|
||||
* @record @buf.
|
||||
*
|
||||
* @record: pointer to record metadata.
|
||||
* @buf: pointer to userspace contents to write to backend
|
||||
*
|
||||
* Returns 0 on success, and non-zero on error.
|
||||
*
|
||||
* @erase:
|
||||
* Delete a record from backend storage. Different backends
|
||||
* identify records differently, so entire original record is
|
||||
* passed back to assist in identification of what the backend
|
||||
* should remove from storage.
|
||||
*
|
||||
* @record: pointer to record metadata.
|
||||
*
|
||||
* Returns 0 on success, and non-zero on error.
|
||||
*
|
||||
*/
|
||||
struct pstore_info {
|
||||
struct module *owner;
|
||||
char *name;
|
||||
spinlock_t buf_lock; /* serialize access to 'buf' */
|
||||
|
||||
spinlock_t buf_lock;
|
||||
char *buf;
|
||||
size_t bufsize;
|
||||
struct mutex read_mutex; /* serialize open/read/close */
|
||||
|
||||
struct mutex read_mutex;
|
||||
|
||||
int flags;
|
||||
void *data;
|
||||
|
||||
int (*open)(struct pstore_info *psi);
|
||||
int (*close)(struct pstore_info *psi);
|
||||
ssize_t (*read)(u64 *id, enum pstore_type_id *type,
|
||||
int *count, struct timespec *time, char **buf,
|
||||
bool *compressed, ssize_t *ecc_notice_size,
|
||||
struct pstore_info *psi);
|
||||
int (*write)(enum pstore_type_id type,
|
||||
enum kmsg_dump_reason reason, u64 *id,
|
||||
unsigned int part, int count, bool compressed,
|
||||
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, bool compressed,
|
||||
size_t size, struct pstore_info *psi);
|
||||
int (*write_buf_user)(enum pstore_type_id type,
|
||||
enum kmsg_dump_reason reason, u64 *id,
|
||||
unsigned int part, const char __user *buf,
|
||||
bool compressed, size_t size, struct pstore_info *psi);
|
||||
int (*erase)(enum pstore_type_id type, u64 id,
|
||||
int count, struct timespec time,
|
||||
struct pstore_info *psi);
|
||||
void *data;
|
||||
ssize_t (*read)(struct pstore_record *record);
|
||||
int (*write)(struct pstore_record *record);
|
||||
int (*write_user)(struct pstore_record *record,
|
||||
const char __user *buf);
|
||||
int (*erase)(struct pstore_record *record);
|
||||
};
|
||||
|
||||
/* Supported frontends */
|
||||
#define PSTORE_FLAGS_DMESG (1 << 0)
|
||||
#define PSTORE_FLAGS_FRAGILE PSTORE_FLAGS_DMESG
|
||||
#define PSTORE_FLAGS_CONSOLE (1 << 1)
|
||||
#define PSTORE_FLAGS_FTRACE (1 << 2)
|
||||
#define PSTORE_FLAGS_PMSG (1 << 3)
|
||||
|
Reference in New Issue
Block a user