aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2010-03-30 01:27:50 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2010-05-16 21:06:12 -0400
commitd79b6f4de5db0103ceb4734e42ad101d836d61d9 (patch)
tree42fada62898eb8d70faff151d87c16575dbabd58 /drivers
parent73296bc611cee009f3be6b451e827d1425b9c10f (diff)
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: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: Arnd 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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/char/i8k.c21
-rw-r--r--drivers/isdn/divert/divert_procfs.c18
2 files changed, 30 insertions, 9 deletions
diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c
index fc8cf7ac7f2b..4cd8b227c11f 100644
--- a/drivers/char/i8k.c
+++ b/drivers/char/i8k.c
@@ -23,6 +23,7 @@
23#include <linux/seq_file.h> 23#include <linux/seq_file.h>
24#include <linux/dmi.h> 24#include <linux/dmi.h>
25#include <linux/capability.h> 25#include <linux/capability.h>
26#include <linux/smp_lock.h>
26#include <asm/uaccess.h> 27#include <asm/uaccess.h>
27#include <asm/io.h> 28#include <asm/io.h>
28 29
@@ -82,8 +83,7 @@ module_param(fan_mult, int, 0);
82MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with"); 83MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with");
83 84
84static int i8k_open_fs(struct inode *inode, struct file *file); 85static int i8k_open_fs(struct inode *inode, struct file *file);
85static int i8k_ioctl(struct inode *, struct file *, unsigned int, 86static long i8k_ioctl(struct file *, unsigned int, unsigned long);
86 unsigned long);
87 87
88static const struct file_operations i8k_fops = { 88static const struct file_operations i8k_fops = {
89 .owner = THIS_MODULE, 89 .owner = THIS_MODULE,
@@ -91,7 +91,7 @@ static const struct file_operations i8k_fops = {
91 .read = seq_read, 91 .read = seq_read,
92 .llseek = seq_lseek, 92 .llseek = seq_lseek,
93 .release = single_release, 93 .release = single_release,
94 .ioctl = i8k_ioctl, 94 .unlocked_ioctl = i8k_ioctl,
95}; 95};
96 96
97struct smm_regs { 97struct smm_regs {
@@ -307,8 +307,8 @@ static int i8k_get_dell_signature(int req_fn)
307 return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; 307 return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1;
308} 308}
309 309
310static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, 310static int
311 unsigned long arg) 311i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg)
312{ 312{
313 int val = 0; 313 int val = 0;
314 int speed; 314 int speed;
@@ -395,6 +395,17 @@ static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
395 return 0; 395 return 0;
396} 396}
397 397
398static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg)
399{
400 long ret;
401
402 lock_kernel();
403 ret = i8k_ioctl_unlocked(fp, cmd, arg);
404 unlock_kernel();
405
406 return ret;
407}
408
398/* 409/*
399 * Print the information for /proc/i8k. 410 * Print the information for /proc/i8k.
400 */ 411 */
diff --git a/drivers/isdn/divert/divert_procfs.c b/drivers/isdn/divert/divert_procfs.c
index 3697c409bec6..724693c4d975 100644
--- a/drivers/isdn/divert/divert_procfs.c
+++ b/drivers/isdn/divert/divert_procfs.c
@@ -19,6 +19,7 @@
19#include <linux/sched.h> 19#include <linux/sched.h>
20#include <linux/isdnif.h> 20#include <linux/isdnif.h>
21#include <net/net_namespace.h> 21#include <net/net_namespace.h>
22#include <linux/smp_lock.h>
22#include "isdn_divert.h" 23#include "isdn_divert.h"
23 24
24 25
@@ -176,9 +177,7 @@ isdn_divert_close(struct inode *ino, struct file *filep)
176/*********/ 177/*********/
177/* IOCTL */ 178/* IOCTL */
178/*********/ 179/*********/
179static int 180static int isdn_divert_ioctl_unlocked(struct file *file, uint cmd, ulong arg)
180isdn_divert_ioctl(struct inode *inode, struct file *file,
181 uint cmd, ulong arg)
182{ 181{
183 divert_ioctl dioctl; 182 divert_ioctl dioctl;
184 int i; 183 int i;
@@ -257,6 +256,17 @@ isdn_divert_ioctl(struct inode *inode, struct file *file,
257 return copy_to_user((void __user *)arg, &dioctl, sizeof(dioctl)) ? -EFAULT : 0; 256 return copy_to_user((void __user *)arg, &dioctl, sizeof(dioctl)) ? -EFAULT : 0;
258} /* isdn_divert_ioctl */ 257} /* isdn_divert_ioctl */
259 258
259static long isdn_divert_ioctl(struct file *file, uint cmd, ulong arg)
260{
261 long ret;
262
263 lock_kernel();
264 ret = isdn_divert_ioctl_unlocked(file, cmd, arg);
265 unlock_kernel();
266
267 return ret;
268}
269
260static const struct file_operations isdn_fops = 270static const struct file_operations isdn_fops =
261{ 271{
262 .owner = THIS_MODULE, 272 .owner = THIS_MODULE,
@@ -264,7 +274,7 @@ static const struct file_operations isdn_fops =
264 .read = isdn_divert_read, 274 .read = isdn_divert_read,
265 .write = isdn_divert_write, 275 .write = isdn_divert_write,
266 .poll = isdn_divert_poll, 276 .poll = isdn_divert_poll,
267 .ioctl = isdn_divert_ioctl, 277 .unlocked_ioctl = isdn_divert_ioctl,
268 .open = isdn_divert_open, 278 .open = isdn_divert_open,
269 .release = isdn_divert_close, 279 .release = isdn_divert_close,
270}; 280};