Commit 1525fb3b authored by WeiXiong Liao's avatar WeiXiong Liao Committed by Kees Cook
Browse files

pstore/blk: Provide way to query pstore configuration



In order to configure itself, the MTD backend needs to be able to query
the current pstore configuration. Introduce pstore_blk_get_config() for
this purpose.

Signed-off-by: default avatarWeiXiong Liao <liaoweixiong@allwinnertech.com>
Link: https://lore.kernel.org/lkml/20200511233229.27745-9-keescook@chromium.org/


Co-developed-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
parent 335426c6
Loading
Loading
Loading
Loading
+30 −7
Original line number Diff line number Diff line
@@ -94,6 +94,17 @@ struct bdev_info {
	sector_t start_sect;
};

#define check_size(name, alignsize) ({				\
	long _##name_ = (name);					\
	_##name_ = _##name_ <= 0 ? 0 : (_##name_ * 1024);	\
	if (_##name_ & ((alignsize) - 1)) {			\
		pr_info(#name " must align to %d\n",		\
				(alignsize));			\
		_##name_ = ALIGN(name, (alignsize));		\
	}							\
	_##name_;						\
})

/**
 * struct pstore_device_info - back-end pstore/blk driver structure.
 *
@@ -149,13 +160,11 @@ static int psblk_register_do(struct pstore_device_info *dev)
		dev->flags = UINT_MAX;

#define verify_size(name, alignsize, enabled) {				\
		long _##name_ = (enabled) ? (name) : 0;			\
		_##name_ = _##name_ <= 0 ? 0 : (_##name_ * 1024);	\
		if (_##name_ & ((alignsize) - 1)) {			\
			pr_info(#name " must align to %d\n",		\
					(alignsize));			\
			_##name_ = ALIGN(name, (alignsize));		\
		}							\
		long _##name_;						\
		if (enabled)						\
			_##name_ = check_size(name, alignsize);		\
		else							\
			_##name_ = 0;					\
		name = _##name_ / 1024;					\
		pstore_zone_info->name = _##name_;			\
	}
@@ -453,6 +462,20 @@ void unregister_pstore_blk(unsigned int major)
}
EXPORT_SYMBOL_GPL(unregister_pstore_blk);

/* get information of pstore/blk */
int pstore_blk_get_config(struct pstore_blk_config *info)
{
	strncpy(info->device, blkdev, 80);
	info->max_reason = max_reason;
	info->kmsg_size = check_size(kmsg_size, 4096);
	info->pmsg_size = check_size(pmsg_size, 4096);
	info->ftrace_size = check_size(ftrace_size, 4096);
	info->console_size = check_size(console_size, 4096);

	return 0;
}
EXPORT_SYMBOL_GPL(pstore_blk_get_config);

static void __exit pstore_blk_exit(void)
{
	mutex_lock(&pstore_blk_lock);
+28 −0
Original line number Diff line number Diff line
@@ -49,4 +49,32 @@ struct pstore_blk_info {
int  register_pstore_blk(struct pstore_blk_info *info);
void unregister_pstore_blk(unsigned int major);

/**
 * 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);

#endif