summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMarcin Niesluchowski <m.niesluchow@samsung.com>2015-07-20 14:52:06 +0200
committerSeung-Woo Kim <sw0312.kim@samsung.com>2016-12-14 13:49:13 +0900
commit62bbd37627b8fa194ae668b352d40c090d9cc6e0 (patch)
treee8103004a09347ce9d2c3fa5da1cda219dac0992 /kernel
parent8c83cc6f929d470636e6756d5447337e2f67e741 (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.c43
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