Commit ba1d41a5 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull pstore updates from Kees Cook:

 - Clean up unused but exposed API (Christoph Hellwig)

 - Provide KCONFIG for default size of kmsg buffer (Vasile-Laurentiu
   Stanimir)

* tag 'pstore-v5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  pstore: Move kmsg_bytes default into Kconfig
  pstore/blk: remove {un,}register_pstore_blk
  pstore/blk: update the command line example
  pstore/zone: cap the maximum device size
parents 6df0f285 26fecbf7
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ module parameters have priority over Kconfig.

Here is an example for module parameters::

        pstore_blk.blkdev=179:7 pstore_blk.kmsg_size=64
        pstore_blk.blkdev=/dev/mmcblk0p7 pstore_blk.kmsg_size=64 best_effort=y

The detail of each configurations may be of interest to you.

@@ -151,10 +151,7 @@ otherwise KMSG_DUMP_MAX.
Configurations for driver
-------------------------

Only a block device driver cares about these configurations. A block device
driver uses ``register_pstore_blk`` to register to pstore/blk.

A non-block device driver uses ``register_pstore_device`` with
A device driver uses ``register_pstore_device`` with
``struct pstore_device_info`` to register to pstore/blk.

.. kernel-doc:: fs/pstore/blk.c
+8 −0
Original line number Diff line number Diff line
@@ -14,6 +14,14 @@ config PSTORE
	   If you don't have a platform persistent store driver,
	   say N.

config PSTORE_DEFAULT_KMSG_BYTES
	int "Default kernel log storage space" if EXPERT
	depends on PSTORE
	default "10240"
	help
	  Defines default size of pstore kernel log storage.
	  Can be enlarged if needed, not recommended to shrink it.

config PSTORE_DEFLATE_COMPRESS
	tristate "DEFLATE (ZLIB) compression"
	default y
+10 −73
Original line number Diff line number Diff line
@@ -90,7 +90,6 @@ MODULE_PARM_DESC(blkdev, "block device for pstore storage");
static DEFINE_MUTEX(pstore_blk_lock);
static struct block_device *psblk_bdev;
static struct pstore_zone_info *pstore_zone_info;
static pstore_blk_panic_write_op blkdev_panic_write;

struct bdev_info {
	dev_t devt;
@@ -341,24 +340,11 @@ static ssize_t psblk_generic_blk_write(const char *buf, size_t bytes,
	return ret;
}

static ssize_t psblk_blk_panic_write(const char *buf, size_t size,
		loff_t off)
{
	int ret;

	if (!blkdev_panic_write)
		return -EOPNOTSUPP;

	/* size and off must align to SECTOR_SIZE for block device */
	ret = blkdev_panic_write(buf, off >> SECTOR_SHIFT,
			size >> SECTOR_SHIFT);
	/* try next zone */
	if (ret == -ENOMSG)
		return ret;
	return ret ? -EIO : size;
}

static int __register_pstore_blk(struct pstore_blk_info *info)
/*
 * This takes its configuration only from the module parameters now.
 * See psblk_get_bdev() and blkdev.
 */
static int __register_pstore_blk(void)
{
	char bdev_name[BDEVNAME_SIZE];
	struct block_device *bdev;
@@ -378,68 +364,34 @@ static int __register_pstore_blk(struct pstore_blk_info *info)
	}

	/* only allow driver matching the @blkdev */
	if (!binfo.devt || (!best_effort &&
			    MAJOR(binfo.devt) != info->major)) {
		pr_debug("invalid major %u (expect %u)\n",
				info->major, MAJOR(binfo.devt));
	if (!binfo.devt) {
		pr_debug("no major\n");
		ret = -ENODEV;
		goto err_put_bdev;
	}

	/* psblk_bdev must be assigned before register to pstore/blk */
	psblk_bdev = bdev;
	blkdev_panic_write = info->panic_write;

	/* Copy back block device details. */
	info->devt = binfo.devt;
	info->nr_sects = binfo.nr_sects;
	info->start_sect = binfo.start_sect;

	memset(&dev, 0, sizeof(dev));
	dev.total_size = info->nr_sects << SECTOR_SHIFT;
	dev.flags = info->flags;
	dev.total_size = binfo.nr_sects << SECTOR_SHIFT;
	dev.read = psblk_generic_blk_read;
	dev.write = psblk_generic_blk_write;
	dev.erase = NULL;
	dev.panic_write = info->panic_write ? psblk_blk_panic_write : NULL;

	ret = __register_pstore_device(&dev);
	if (ret)
		goto err_put_bdev;

	bdevname(bdev, bdev_name);
	pr_info("attached %s%s\n", bdev_name,
		info->panic_write ? "" : " (no dedicated panic_write!)");
	pr_info("attached %s (no dedicated panic_write!)\n", bdev_name);
	return 0;

err_put_bdev:
	psblk_bdev = NULL;
	blkdev_panic_write = NULL;
	psblk_put_bdev(bdev, holder);
	return ret;
}

/**
 * register_pstore_blk() - register block device to pstore/blk
 *
 * @info: details on the desired block device interface
 *
 * Return:
 * * 0		- OK
 * * Others	- something error.
 */
int register_pstore_blk(struct pstore_blk_info *info)
{
	int ret;

	mutex_lock(&pstore_blk_lock);
	ret = __register_pstore_blk(info);
	mutex_unlock(&pstore_blk_lock);

	return ret;
}
EXPORT_SYMBOL_GPL(register_pstore_blk);

static void __unregister_pstore_blk(unsigned int major)
{
	struct pstore_device_info dev = { .read = psblk_generic_blk_read };
@@ -449,24 +401,10 @@ static void __unregister_pstore_blk(unsigned int major)
	if (psblk_bdev && MAJOR(psblk_bdev->bd_dev) == major) {
		__unregister_pstore_device(&dev);
		psblk_put_bdev(psblk_bdev, holder);
		blkdev_panic_write = NULL;
		psblk_bdev = NULL;
	}
}

/**
 * unregister_pstore_blk() - unregister block device from pstore/blk
 *
 * @major: the major device number of device
 */
void unregister_pstore_blk(unsigned int major)
{
	mutex_lock(&pstore_blk_lock);
	__unregister_pstore_blk(major);
	mutex_unlock(&pstore_blk_lock);
}
EXPORT_SYMBOL_GPL(unregister_pstore_blk);

/* get information of pstore/blk */
int pstore_blk_get_config(struct pstore_blk_config *info)
{
@@ -483,12 +421,11 @@ EXPORT_SYMBOL_GPL(pstore_blk_get_config);

static int __init pstore_blk_init(void)
{
	struct pstore_blk_info info = { };
	int ret = 0;

	mutex_lock(&pstore_blk_lock);
	if (!pstore_zone_info && best_effort && blkdev[0])
		ret = __register_pstore_blk(&info);
		ret = __register_pstore_blk();
	mutex_unlock(&pstore_blk_lock);

	return ret;
+1 −1
Original line number Diff line number Diff line
@@ -266,7 +266,7 @@ static void parse_options(char *options)
 */
static int pstore_show_options(struct seq_file *m, struct dentry *root)
{
	if (kmsg_bytes != PSTORE_DEFAULT_KMSG_BYTES)
	if (kmsg_bytes != CONFIG_PSTORE_DEFAULT_KMSG_BYTES)
		seq_printf(m, ",kmsg_bytes=%lu", kmsg_bytes);
	return 0;
}
+0 −1
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@
#include <linux/time.h>
#include <linux/pstore.h>

#define PSTORE_DEFAULT_KMSG_BYTES 10240
extern unsigned long kmsg_bytes;

#ifdef CONFIG_PSTORE_FTRACE
Loading