From 6b851383eb41bbc05e81ac994aa0e5122bcc9656 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 17 Dec 2021 09:21:42 -0500 Subject: [PATCH] TT#14008 use stream_open for main kernel interface The main kernel interface has no concept of file position, therefore it makes no sense to keep the additional overhead of ensuring an atomic file position. Calling stream_open disables the FMODE_ATOMIC_POS flag which in turn disables the extra locking for the fpos. Change-Id: I14c37c3894791126aaf9caa0695da654a2012261 --- kernel-module/xt_RTPENGINE.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index 36d59acbb..e12f85f10 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -216,6 +216,7 @@ static ssize_t proc_status(struct file *, char __user *, size_t, loff_t *); static ssize_t proc_main_control_write(struct file *, const char __user *, size_t, loff_t *); static int proc_generic_open_modref(struct inode *, struct file *); +static int proc_generic_open_stream_modref(struct inode *inode, struct file *file); static int proc_generic_close_modref(struct inode *, struct file *); static int proc_generic_seqrelease_modref(struct inode *inode, struct file *file); @@ -511,7 +512,7 @@ static const struct PROC_OP_STRUCT proc_control_ops = { static const struct PROC_OP_STRUCT proc_main_control_ops = { PROC_OWNER .PROC_WRITE = proc_main_control_write, - .PROC_OPEN = proc_generic_open_modref, + .PROC_OPEN = proc_generic_open_stream_modref, .PROC_RELEASE = proc_generic_close_modref, }; @@ -2532,6 +2533,11 @@ static int proc_generic_open_modref(struct inode *inode, struct file *file) { return -ENXIO; return 0; } +static int proc_generic_open_stream_modref(struct inode *inode, struct file *file) { + if (!try_module_get(THIS_MODULE)) + return -ENXIO; + return stream_open(inode, file); +} static int proc_generic_close_modref(struct inode *inode, struct file *file) { module_put(THIS_MODULE); return 0; @@ -2615,7 +2621,7 @@ static int proc_control_open(struct inode *inode, struct file *file) { write_unlock_irqrestore(&table_lock, flags); table_put(t); - return 0; + return stream_open(inode, file); } static int proc_control_close(struct inode *inode, struct file *file) { @@ -3425,7 +3431,7 @@ out: -static inline ssize_t proc_control_read_write(struct file *file, char __user *ubuf, size_t buflen, loff_t *off, +static inline ssize_t proc_control_read_write(struct file *file, char __user *ubuf, size_t buflen, int writeable) { struct inode *inode; @@ -3548,10 +3554,10 @@ out: return err; } static ssize_t proc_control_write(struct file *file, const char __user *ubuf, size_t buflen, loff_t *off) { - return proc_control_read_write(file, (char __user *) ubuf, buflen, off, 0); + return proc_control_read_write(file, (char __user *) ubuf, buflen, 0); } static ssize_t proc_control_read(struct file *file, char __user *ubuf, size_t buflen, loff_t *off) { - return proc_control_read_write(file, ubuf, buflen, off, 1); + return proc_control_read_write(file, ubuf, buflen, 1); }