[PATCH v3 09/11] pstore/blk: a way to get user configure about pstore front-ends.

From: WeiXiong Liao
Date: Wed Mar 25 2020 - 04:56:21 EST


It's one of a series of patches to adapt to MTD device.

It's different to block driver, MTD driver should check zone size
and get identifier to MTD device. To make it, psblk_usr_info() is
created.

Signed-off-by: WeiXiong Liao <liaoweixiong@xxxxxxxxxxxxxxxxx>
---
fs/pstore/pstore_blk.c | 37 ++++++++++++++++++++++++++++++-------
include/linux/pstore_blk.h | 10 ++++++++++
2 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/fs/pstore/pstore_blk.c b/fs/pstore/pstore_blk.c
index d6949146135b..061609b66d8a 100644
--- a/fs/pstore/pstore_blk.c
+++ b/fs/pstore/pstore_blk.c
@@ -84,6 +84,17 @@
sector_t start_sect;
} g_bdev_info;

+#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 psblk_device - back-end pstore/blk driver structure.
*
@@ -138,13 +149,11 @@ static int psblk_register_do(struct psblk_device *dev)
if (!dev->flags)
dev->flags = UINT_MAX;
#define verify_size(name, alignsize, enable) { \
- long _##name_ = (enable) ? (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 (enable) \
+ _##name_ = check_size(name, alignsize); \
+ else \
+ _##name_ = 0; \
name = _##name_ / 1024; \
psz_info->name = _##name_; \
}
@@ -464,6 +473,20 @@ int psblk_blkdev_info(dev_t *devt, sector_t *nr_sects, sector_t *start_sect)
}
EXPORT_SYMBOL_GPL(psblk_blkdev_info);

+/* get information of pstore/blk */
+int psblk_usr_info(struct psblk_info *info)
+{
+ strncpy(info->device, blkdev, 80);
+ info->dump_oops = dump_oops <= 0 ? 0 : 1;
+ info->oops_size = check_size(oops_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(psblk_usr_info);
+
MODULE_LICENSE("GPL");
MODULE_AUTHOR("WeiXiong Liao <liaoweixiong@xxxxxxxxxxxxxxxxx>");
MODULE_DESCRIPTION("Block device Oops/Panic logger");
diff --git a/include/linux/pstore_blk.h b/include/linux/pstore_blk.h
index 828b0763d477..d2ea1733b51a 100644
--- a/include/linux/pstore_blk.h
+++ b/include/linux/pstore_blk.h
@@ -27,4 +27,14 @@ int psblk_register_blkdev(unsigned int major, unsigned int flags,
void psblk_unregister_blkdev(unsigned int major);
int psblk_blkdev_info(dev_t *devt, sector_t *nr_sects, sector_t *start_sect);

+struct psblk_info {
+ int dump_oops;
+ char device[80];
+ unsigned long oops_size;
+ unsigned long pmsg_size;
+ unsigned long console_size;
+ unsigned long ftrace_size;
+};
+int psblk_usr_info(struct psblk_info *info);
+
#endif
--
1.9.1