pstore/blk: Introduce backend for block devices
pstore/blk is similar to pstore/ram, but uses a block device as the
storage rather than persistent ram.
The pstore/blk backend solves two common use-cases that used to preclude
using pstore/ram:
- not all devices have a battery that could be used to persist
regular RAM across power failures.
- most embedded intelligent equipment have no persistent ram, which
increases costs, instead preferring cheaper solutions, like block
devices.
pstore/blk provides separate configurations for the end user and for the
block drivers. User configuration determines how pstore/blk operates, such
as record sizes, max kmsg dump reasons, etc. These can be set by Kconfig
and/or module parameters, but module parameter have priority over Kconfig.
Driver configuration covers all the details about the target block device,
such as total size of the device and how to perform read/write operations.
These are provided by block drivers, calling pstore_register_blkdev(),
including an optional panic_write callback used to bypass regular IO
APIs in an effort to avoid potentially destabilized kernel code during
a panic.
Signed-off-by: WeiXiong Liao <liaoweixiong@allwinnertech.com>
Link: https://lore.kernel.org/lkml/20200511233229.27745-3-keescook@chromium.org/
Co-developed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
2020-03-25 02:54:57 -06:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
|
|
|
|
#ifndef __PSTORE_BLK_H_
|
|
|
|
#define __PSTORE_BLK_H_
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/pstore.h>
|
|
|
|
#include <linux/pstore_zone.h>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* typedef pstore_blk_panic_write_op - panic write operation to block device
|
|
|
|
*
|
|
|
|
* @buf: the data to write
|
|
|
|
* @start_sect: start sector to block device
|
|
|
|
* @sects: sectors count on buf
|
|
|
|
*
|
2020-03-25 02:55:03 -06:00
|
|
|
* Return: On success, zero should be returned. Others excluding -ENOMSG
|
|
|
|
* mean error. -ENOMSG means to try next zone.
|
pstore/blk: Introduce backend for block devices
pstore/blk is similar to pstore/ram, but uses a block device as the
storage rather than persistent ram.
The pstore/blk backend solves two common use-cases that used to preclude
using pstore/ram:
- not all devices have a battery that could be used to persist
regular RAM across power failures.
- most embedded intelligent equipment have no persistent ram, which
increases costs, instead preferring cheaper solutions, like block
devices.
pstore/blk provides separate configurations for the end user and for the
block drivers. User configuration determines how pstore/blk operates, such
as record sizes, max kmsg dump reasons, etc. These can be set by Kconfig
and/or module parameters, but module parameter have priority over Kconfig.
Driver configuration covers all the details about the target block device,
such as total size of the device and how to perform read/write operations.
These are provided by block drivers, calling pstore_register_blkdev(),
including an optional panic_write callback used to bypass regular IO
APIs in an effort to avoid potentially destabilized kernel code during
a panic.
Signed-off-by: WeiXiong Liao <liaoweixiong@allwinnertech.com>
Link: https://lore.kernel.org/lkml/20200511233229.27745-3-keescook@chromium.org/
Co-developed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
2020-03-25 02:54:57 -06:00
|
|
|
*
|
|
|
|
* Panic write to block device must be aligned to SECTOR_SIZE.
|
|
|
|
*/
|
|
|
|
typedef int (*pstore_blk_panic_write_op)(const char *buf, sector_t start_sect,
|
|
|
|
sector_t sects);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct pstore_blk_info - pstore/blk registration details
|
|
|
|
*
|
|
|
|
* @major: Which major device number to support with pstore/blk
|
|
|
|
* @flags: The supported PSTORE_FLAGS_* from linux/pstore.h.
|
|
|
|
* @panic_write:The write operation only used for the panic case.
|
|
|
|
* This can be NULL, but is recommended to avoid losing
|
|
|
|
* crash data if the kernel's IO path or work queues are
|
|
|
|
* broken during a panic.
|
|
|
|
* @devt: The dev_t that pstore/blk has attached to.
|
|
|
|
* @nr_sects: Number of sectors on @devt.
|
|
|
|
* @start_sect: Starting sector on @devt.
|
|
|
|
*/
|
|
|
|
struct pstore_blk_info {
|
|
|
|
unsigned int major;
|
|
|
|
unsigned int flags;
|
|
|
|
pstore_blk_panic_write_op panic_write;
|
|
|
|
|
|
|
|
/* Filled in by pstore/blk after registration. */
|
|
|
|
dev_t devt;
|
|
|
|
sector_t nr_sects;
|
|
|
|
sector_t start_sect;
|
|
|
|
};
|
|
|
|
|
|
|
|
int register_pstore_blk(struct pstore_blk_info *info);
|
|
|
|
void unregister_pstore_blk(unsigned int major);
|
|
|
|
|
2020-03-25 02:55:05 -06:00
|
|
|
/**
|
|
|
|
* struct pstore_device_info - back-end pstore/blk driver structure.
|
|
|
|
*
|
|
|
|
* @total_size: The total size in bytes pstore/blk can use. It must be greater
|
|
|
|
* than 4096 and be multiple of 4096.
|
|
|
|
* @flags: Refer to macro starting with PSTORE_FLAGS defined in
|
|
|
|
* linux/pstore.h. It means what front-ends this device support.
|
|
|
|
* Zero means all backends for compatible.
|
|
|
|
* @read: The general read operation. Both of the function parameters
|
|
|
|
* @size and @offset are relative value to bock device (not the
|
|
|
|
* whole disk).
|
|
|
|
* On success, the number of bytes should be returned, others
|
|
|
|
* means error.
|
|
|
|
* @write: The same as @read, but the following error number:
|
|
|
|
* -EBUSY means try to write again later.
|
|
|
|
* -ENOMSG means to try next zone.
|
|
|
|
* @erase: The general erase operation for device with special removing
|
|
|
|
* job. Both of the function parameters @size and @offset are
|
|
|
|
* relative value to storage.
|
|
|
|
* Return 0 on success and others on failure.
|
|
|
|
* @panic_write:The write operation only used for panic case. It's optional
|
|
|
|
* if you do not care panic log. The parameters are relative
|
|
|
|
* value to storage.
|
|
|
|
* On success, the number of bytes should be returned, others
|
|
|
|
* excluding -ENOMSG mean error. -ENOMSG means to try next zone.
|
|
|
|
*/
|
|
|
|
struct pstore_device_info {
|
|
|
|
unsigned long total_size;
|
|
|
|
unsigned int flags;
|
|
|
|
pstore_zone_read_op read;
|
|
|
|
pstore_zone_write_op write;
|
|
|
|
pstore_zone_erase_op erase;
|
|
|
|
pstore_zone_write_op panic_write;
|
|
|
|
};
|
|
|
|
|
|
|
|
int register_pstore_device(struct pstore_device_info *dev);
|
|
|
|
void unregister_pstore_device(struct pstore_device_info *dev);
|
|
|
|
|
2020-03-25 02:55:04 -06:00
|
|
|
/**
|
|
|
|
* struct pstore_blk_config - the pstore_blk backend configuration
|
|
|
|
*
|
|
|
|
* @device: Name of the desired block device
|
|
|
|
* @max_reason: Maximum kmsg dump reason to store to block device
|
|
|
|
* @kmsg_size: Total size of for kmsg dumps
|
|
|
|
* @pmsg_size: Total size of the pmsg storage area
|
|
|
|
* @console_size: Total size of the console storage area
|
|
|
|
* @ftrace_size: Total size for ftrace logging data (for all CPUs)
|
|
|
|
*/
|
|
|
|
struct pstore_blk_config {
|
|
|
|
char device[80];
|
|
|
|
enum kmsg_dump_reason max_reason;
|
|
|
|
unsigned long kmsg_size;
|
|
|
|
unsigned long pmsg_size;
|
|
|
|
unsigned long console_size;
|
|
|
|
unsigned long ftrace_size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* pstore_blk_get_config - get a copy of the pstore_blk backend configuration
|
|
|
|
*
|
|
|
|
* @info: The sturct pstore_blk_config to be filled in
|
|
|
|
*
|
|
|
|
* Failure returns negative error code, and success returns 0.
|
|
|
|
*/
|
|
|
|
int pstore_blk_get_config(struct pstore_blk_config *info);
|
|
|
|
|
pstore/blk: Introduce backend for block devices
pstore/blk is similar to pstore/ram, but uses a block device as the
storage rather than persistent ram.
The pstore/blk backend solves two common use-cases that used to preclude
using pstore/ram:
- not all devices have a battery that could be used to persist
regular RAM across power failures.
- most embedded intelligent equipment have no persistent ram, which
increases costs, instead preferring cheaper solutions, like block
devices.
pstore/blk provides separate configurations for the end user and for the
block drivers. User configuration determines how pstore/blk operates, such
as record sizes, max kmsg dump reasons, etc. These can be set by Kconfig
and/or module parameters, but module parameter have priority over Kconfig.
Driver configuration covers all the details about the target block device,
such as total size of the device and how to perform read/write operations.
These are provided by block drivers, calling pstore_register_blkdev(),
including an optional panic_write callback used to bypass regular IO
APIs in an effort to avoid potentially destabilized kernel code during
a panic.
Signed-off-by: WeiXiong Liao <liaoweixiong@allwinnertech.com>
Link: https://lore.kernel.org/lkml/20200511233229.27745-3-keescook@chromium.org/
Co-developed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
2020-03-25 02:54:57 -06:00
|
|
|
#endif
|