Browse Source

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
pull/1439/head
Richard Fuchs 4 years ago
parent
commit
6b851383eb
1 changed files with 11 additions and 5 deletions
  1. +11
    -5
      kernel-module/xt_RTPENGINE.c

+ 11
- 5
kernel-module/xt_RTPENGINE.c View File

@ -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);
}


Loading…
Cancel
Save