Messages in this thread Patch in this message | | | From | Frederic Weisbecker <> | Subject | [GIT PULL v2] Preparation for BKL'ed ioctl removal | Date | Thu, 22 Apr 2010 02:48:02 +0200 |
| |
Linus,
In this v2, I've removed the declaration of default_llseek from smp_lock.h, as this export can be made later (we want to make any use of default_llseek() depend on CONFIG_BKL as well, but that can wait).
Please pull the bkl/ioctl-v2 branch that can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing.git bkl/ioctl-v2
Thanks, Frederic ---
Arnd Bergmann (1): vfs: Introduce CONFIG_BKL and deprecated_ioctl
fs/ioctl.c | 22 ++++++++++++++++++++++ include/linux/fs.h | 3 +++ include/linux/smp_lock.h | 3 +++ kernel/Kconfig.locks | 10 ++++++++++ 4 files changed, 38 insertions(+), 0 deletions(-)
--- commit 333f5fb46d15d057f0d69da0dd8b0a3db89bf34f Author: Arnd Bergmann <arnd@arndb.de> Date: Thu Apr 1 14:42:38 2010 +0200
vfs: Introduce CONFIG_BKL and deprecated_ioctl This is a preparation for the removal of the big kernel lock that introduces new interfaces for device drivers still using it. We can start marking those device drivers as 'depends on CONFIG_BKL' now, and make that symbol optional later, when the point has come at which we are able to build a kernel without the BKL. Similarly, device drivers that currently make use of the implicit BKL locking around the ioctl function can now get annotated by changing .ioctl = foo_ioctl, to .locked_ioctl = foo_ioctl, .unlocked_ioctl = deprecated_ioctl, As soon as no driver remains using the old ioctl callback, it can get removed. [fweisbec: move config bkl from Kconfig.debug to Kconfig.locks, rename default_ioctl to deprecated_ioctl] v2: Remove default_llseek() declaration from smp_lock.h, we don't need to prepare it to be modularized right now. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
diff --git a/fs/ioctl.c b/fs/ioctl.c index 6c75110..e6d6a75 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -58,6 +58,28 @@ static long vfs_ioctl(struct file *filp, unsigned int cmd, return error; } +#ifdef CONFIG_BKL +/* + * deprecated_ioctl - call locked_ioctl with BKL held + * + * Setting only the ioctl operation but not unlocked_ioctl will become + * invalid in the future, all drivers that are not converted to unlocked_ioctl + * should set .unlocked_ioctl = deprecated_ioctl now. + */ +long deprecated_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + int error = -ENOTTY; + if (filp->f_op->locked_ioctl) { + lock_kernel(); + error = filp->f_op->locked_ioctl(filp->f_path.dentry->d_inode, + filp, cmd, arg); + unlock_kernel(); + } + return error; +} +EXPORT_SYMBOL_GPL(default_ioctl); +#endif + static int ioctl_fibmap(struct file *filp, int __user *p) { struct address_space *mapping = filp->f_mapping; diff --git a/include/linux/fs.h b/include/linux/fs.h index 39d57bc..6b65b26 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1492,6 +1492,9 @@ struct file_operations { int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); +#ifdef CONFIG_BKL + int (*locked_ioctl) (struct inode *, struct file *, unsigned int, unsigned long); +#endif long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); diff --git a/include/linux/smp_lock.h b/include/linux/smp_lock.h index 2ea1dd1..3ed34da 100644 --- a/include/linux/smp_lock.h +++ b/include/linux/smp_lock.h @@ -62,4 +62,7 @@ static inline void cycle_kernel_lock(void) #define kernel_locked() 1 #endif /* CONFIG_LOCK_KERNEL */ + +long deprecated_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); + #endif /* __LINUX_SMPLOCK_H */ diff --git a/kernel/Kconfig.locks b/kernel/Kconfig.locks index 88c92fb..9a80413 100644 --- a/kernel/Kconfig.locks +++ b/kernel/Kconfig.locks @@ -200,3 +200,13 @@ config INLINE_WRITE_UNLOCK_IRQRESTORE config MUTEX_SPIN_ON_OWNER def_bool SMP && !DEBUG_MUTEXES && !HAVE_DEFAULT_NO_SPIN_MUTEXES + +config BKL + def_bool y + help + This is the traditional lock that is used in old code instead + of proper locking. All drivers that use the BKL should depend + on this symbol. + This configuration option will become user-selectable in the + future, as soon as it is possible to build a kernel without + it.
| |