Commit d79b6f4d authored by Frederic Weisbecker's avatar Frederic Weisbecker

procfs: Push down the bkl from ioctl

Push down the bkl from procfs's ioctl main handler to its users.
Only three procfs users implement an ioctl (non unlocked) handler.
Turn them into unlocked_ioctl and push down the Devil inside.

v2: PDE(inode)->data doesn't need to be under bkl
v3: And don't forget to git-add the result
v4: Use wrappers to pushdown instead of an invasive and error prone
    handlers surgery.
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: John Kacur <jkacur@redhat.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
parent 73296bc6
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/smp_lock.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -82,8 +83,7 @@ module_param(fan_mult, int, 0); ...@@ -82,8 +83,7 @@ module_param(fan_mult, int, 0);
MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with"); MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with");
static int i8k_open_fs(struct inode *inode, struct file *file); static int i8k_open_fs(struct inode *inode, struct file *file);
static int i8k_ioctl(struct inode *, struct file *, unsigned int, static long i8k_ioctl(struct file *, unsigned int, unsigned long);
unsigned long);
static const struct file_operations i8k_fops = { static const struct file_operations i8k_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -91,7 +91,7 @@ static const struct file_operations i8k_fops = { ...@@ -91,7 +91,7 @@ static const struct file_operations i8k_fops = {
.read = seq_read, .read = seq_read,
.llseek = seq_lseek, .llseek = seq_lseek,
.release = single_release, .release = single_release,
.ioctl = i8k_ioctl, .unlocked_ioctl = i8k_ioctl,
}; };
struct smm_regs { struct smm_regs {
...@@ -307,8 +307,8 @@ static int i8k_get_dell_signature(int req_fn) ...@@ -307,8 +307,8 @@ static int i8k_get_dell_signature(int req_fn)
return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1;
} }
static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, static int
unsigned long arg) i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg)
{ {
int val = 0; int val = 0;
int speed; int speed;
...@@ -395,6 +395,17 @@ static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, ...@@ -395,6 +395,17 @@ static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
return 0; return 0;
} }
static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
{
long ret;
lock_kernel();
ret = i8k_ioctl_unlocked(fp, cmd, arg);
unlock_kernel();
return ret;
}
/* /*
* Print the information for /proc/i8k. * Print the information for /proc/i8k.
*/ */
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/isdnif.h> #include <linux/isdnif.h>
#include <net/net_namespace.h> #include <net/net_namespace.h>
#include <linux/smp_lock.h>
#include "isdn_divert.h" #include "isdn_divert.h"
...@@ -176,9 +177,7 @@ isdn_divert_close(struct inode *ino, struct file *filep) ...@@ -176,9 +177,7 @@ isdn_divert_close(struct inode *ino, struct file *filep)
/*********/ /*********/
/* IOCTL */ /* IOCTL */
/*********/ /*********/
static int static int isdn_divert_ioctl_unlocked(struct file *file, uint cmd, ulong arg)
isdn_divert_ioctl(struct inode *inode, struct file *file,
uint cmd, ulong arg)
{ {
divert_ioctl dioctl; divert_ioctl dioctl;
int i; int i;
...@@ -257,6 +256,17 @@ isdn_divert_ioctl(struct inode *inode, struct file *file, ...@@ -257,6 +256,17 @@ isdn_divert_ioctl(struct inode *inode, struct file *file,
return copy_to_user((void __user *)arg, &dioctl, sizeof(dioctl)) ? -EFAULT : 0; return copy_to_user((void __user *)arg, &dioctl, sizeof(dioctl)) ? -EFAULT : 0;
} /* isdn_divert_ioctl */ } /* isdn_divert_ioctl */
static long isdn_divert_ioctl(struct file *file, uint cmd, ulong arg)
{
long ret;
lock_kernel();
ret = isdn_divert_ioctl_unlocked(file, cmd, arg);
unlock_kernel();
return ret;
}
static const struct file_operations isdn_fops = static const struct file_operations isdn_fops =
{ {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -264,7 +274,7 @@ static const struct file_operations isdn_fops = ...@@ -264,7 +274,7 @@ static const struct file_operations isdn_fops =
.read = isdn_divert_read, .read = isdn_divert_read,
.write = isdn_divert_write, .write = isdn_divert_write,
.poll = isdn_divert_poll, .poll = isdn_divert_poll,
.ioctl = isdn_divert_ioctl, .unlocked_ioctl = isdn_divert_ioctl,
.open = isdn_divert_open, .open = isdn_divert_open,
.release = isdn_divert_close, .release = isdn_divert_close,
}; };
......
...@@ -1331,12 +1331,18 @@ static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait) ...@@ -1331,12 +1331,18 @@ static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait)
return cache_poll(filp, wait, cd); return cache_poll(filp, wait, cd);
} }
static int cache_ioctl_procfs(struct inode *inode, struct file *filp, static long cache_ioctl_procfs(struct file *filp,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
long ret;
struct inode *inode = filp->f_path.dentry->d_inode;
struct cache_detail *cd = PDE(inode)->data; struct cache_detail *cd = PDE(inode)->data;
return cache_ioctl(inode, filp, cmd, arg, cd); lock_kernel();
ret = cache_ioctl(inode, filp, cmd, arg, cd);
unlock_kernel();
return ret;
} }
static int cache_open_procfs(struct inode *inode, struct file *filp) static int cache_open_procfs(struct inode *inode, struct file *filp)
...@@ -1359,7 +1365,7 @@ static const struct file_operations cache_file_operations_procfs = { ...@@ -1359,7 +1365,7 @@ static const struct file_operations cache_file_operations_procfs = {
.read = cache_read_procfs, .read = cache_read_procfs,
.write = cache_write_procfs, .write = cache_write_procfs,
.poll = cache_poll_procfs, .poll = cache_poll_procfs,
.ioctl = cache_ioctl_procfs, /* for FIONREAD */ .unlocked_ioctl = cache_ioctl_procfs, /* for FIONREAD */
.open = cache_open_procfs, .open = cache_open_procfs,
.release = cache_release_procfs, .release = cache_release_procfs,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment