diff options
author | Marcin Niesluchowski <m.niesluchow@samsung.com> | 2015-07-20 14:52:06 +0200 |
---|---|---|
committer | Seung-Woo Kim <sw0312.kim@samsung.com> | 2016-12-14 13:49:13 +0900 |
commit | 62bbd37627b8fa194ae668b352d40c090d9cc6e0 (patch) | |
tree | e8103004a09347ce9d2c3fa5da1cda219dac0992 /kernel | |
parent | 8c83cc6f929d470636e6756d5447337e2f67e741 (diff) |
kmsg: add additional buffers support to memory class
Memory class does not support additional kmsg buffers.
Add additional kmsg buffers support to:
* devnode() callback of "mem" class
* file operations of major "mem" character device
Change-Id: I15b6c79435b4dc18422a9bd6836bd9c7a87ad60a
Signed-off-by: Marcin Niesluchowski <m.niesluchow@samsung.com>
Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/printk/printk.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index ab82f563a0ea..94ae006569fb 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -46,6 +46,8 @@ #include <linux/utsname.h> #include <linux/ctype.h> #include <linux/uio.h> +#include <linux/device.h> +#include <linux/kdev_t.h> #include <asm/uaccess.h> @@ -241,6 +243,7 @@ struct log_buffer { u64 next_seq; #ifdef CONFIG_PRINTK u32 next_idx; /* index of the next record to store */ + int mode; /* mode of device */ int minor; /* minor representing buffer device */ #endif }; @@ -283,6 +286,7 @@ static struct log_buffer log_buf = { .first_idx = 0, .next_seq = 0, .next_idx = 0, + .mode = 0, .minor = 0, }; @@ -1186,6 +1190,45 @@ const struct file_operations kmsg_fops = { .release = devkmsg_release, }; +/* Should be used for device registration */ +struct device *init_kmsg(int minor, umode_t mode) +{ + log_buf.minor = minor; + log_buf.mode = mode; + return device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), + NULL, "kmsg"); +} + +int kmsg_memory_open(struct inode *inode, struct file *filp) +{ + filp->f_op = &kmsg_fops; + + return kmsg_fops.open(inode, filp); +} + +int kmsg_mode(int minor, umode_t *mode) +{ + int ret = -ENXIO; + struct log_buffer *log_b; + + if (minor == log_buf.minor) { + *mode = log_buf.mode; + return 0; + } + + rcu_read_lock(); + list_for_each_entry_rcu(log_b, &log_buf.list, list) { + if (log_b->minor == minor) { + *mode = log_b->mode; + ret = 0; + break; + } + } + rcu_read_unlock(); + + return ret; +} + #ifdef CONFIG_KEXEC /* * This appends the listed symbols to /proc/vmcore |