cifs: Push the BKL down into the fs ioctl code
PATCH 1/1 cifs: Push the BKL down into the fs ioctl code
Switch to unlocked_ioctl. Wrap the ioctl handler internally with lock_kernel until someone can prove it isn't needed or fix it so it isn't.
Signed-off-by Alan Cox <[email protected]>
fs/cifs/cifsfs.c +5 -5
@@ -657,7 +657,7 @@ const struct file_operations cifs_file_ops = { .splice_read = generic_file_splice_read, .llseek = cifs_llseek,#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl,#endif /* CONFIG_CIFS_POSIX */ #ifdef CONFIG_CIFS_EXPERIMENTAL
@@ -677,7 +677,7 @@ const struct file_operations cifs_file_direct_ops = { .flush = cifs_flush, .splice_read = generic_file_splice_read,#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl,#endif /* CONFIG_CIFS_POSIX */ .llseek = cifs_llseek,#ifdef CONFIG_CIFS_EXPERIMENTAL
@@ -697,7 +697,7 @@ const struct file_operations cifs_file_nobrl_ops = { .splice_read = generic_file_splice_read, .llseek = cifs_llseek,#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl,#endif /* CONFIG_CIFS_POSIX */ #ifdef CONFIG_CIFS_EXPERIMENTAL
@@ -716,7 +716,7 @@ const struct file_operations cifs_file_direct_nobrl_ops = { .flush = cifs_flush, .splice_read = generic_file_splice_read,#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl,#endif /* CONFIG_CIFS_POSIX */ .llseek = cifs_llseek,#ifdef CONFIG_CIFS_EXPERIMENTAL
@@ -731,7 +731,7 @@ const struct file_operations cifs_dir_ops = {#ifdef CONFIG_CIFS_EXPERIMENTAL .dir_notify = cifs_dir_notify,#endif /* CONFIG_CIFS_EXPERIMENTAL */ - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl, }; static void
fs/cifs/cifsfs.h +2 -2
@@ -95,8 +95,8 @@ extern int cifs_setxattr(struct dentry *, const char *, const void *, size_t, int);extern ssize_t cifs_getxattr (struct dentry *,const char *,void *,size_t );extern ssize_t cifs_listxattr (struct dentry *,char *,size_t ); -extern int cifs_ioctl (struct inode *inode,struct file *filep, -unsigned int command,unsigned long arg); +extern long cifs_ioctl (struct file *filep,unsigned int command, +unsigned long arg);#ifdef CONFIG_CIFS_EXPERIMENTAL extern const struct export_operations cifs_export_ops;
fs/cifs/ioctl.c +7 -2
@@ -22,6 +22,7 @@*/ #include <linux/fs.h> +#include <linux/smp_lock.h> #include "cifspdu.h" #include "cifsglob.h" #include "cifsproto.h"
@@ -30,9 +31,9 @@#define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) -int cifs_ioctl (struct inode *inode,struct file *filep, -unsigned int command,unsigned long arg) +long cifs_ioctl (struct file *filep,unsigned int command,unsigned long arg) { +struct inode *inode = filep->f_path.dentry->d_inode;int rc = -ENOTTY ;/* strange error - but the precedent */ int xid;struct cifs_sb_info *cifs_sb;
@@ -45,6 +46,8 @@ int cifs_ioctl(struct inode *inode, struct file *filep, (struct cifsFileInfo *)filep->private_data;#endif /* CONFIG_CIFS_POSIX */ +lock_kernel (); + xid =GetXid ();cFYI (1 , ("ioctl file %p cmd %u arg %lu" , filep, command, arg));
@@ -58,6 +61,7 @@ int cifs_ioctl(struct inode *inode, struct file *filep, else { rc = -EIO ;FreeXid (xid); +unlock_kernel ();return -EIO ; }#endif /* CONFIG_CIFS_POSIX */
@@ -106,5 +110,6 @@ int cifs_ioctl(struct inode *inode, struct file *filep, }FreeXid (xid); +unlock_kernel ();return rc; }
cifs already converted to unlocked ioctl last week.
Quoted 118 lines · Alan Cox
Switch to
unlocked_ioctl. Wrap the ioctl handler internally withlock_kerneluntil someone can prove it isn't needed or fix it so it isn't.Signed-off-by Alan Cox <[email protected]>fs/cifs/cifsfs.c +5
-5@@ -657,7 +657,7 @@ const struct file_operations cifs_file_ops = { .splice_read = generic_file_splice_read, .llseek = cifs_llseek,#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl,#endif /* CONFIG_CIFS_POSIX */ #ifdef CONFIG_CIFS_EXPERIMENTAL @@ -677,7 +677,7 @@ const struct file_operations cifs_file_direct_ops = { .flush = cifs_flush, .splice_read = generic_file_splice_read,#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl,#endif /* CONFIG_CIFS_POSIX */ .llseek = cifs_llseek,#ifdef CONFIG_CIFS_EXPERIMENTAL @@ -697,7 +697,7 @@ const struct file_operations cifs_file_nobrl_ops = { .splice_read = generic_file_splice_read, .llseek = cifs_llseek,#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl,#endif /* CONFIG_CIFS_POSIX */ #ifdef CONFIG_CIFS_EXPERIMENTAL @@ -716,7 +716,7 @@ const struct file_operations cifs_file_direct_nobrl_ops = { .flush = cifs_flush, .splice_read = generic_file_splice_read,#ifdef CONFIG_CIFS_POSIX - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl,#endif /* CONFIG_CIFS_POSIX */ .llseek = cifs_llseek,#ifdef CONFIG_CIFS_EXPERIMENTAL @@ -731,7 +731,7 @@ const struct file_operations cifs_dir_ops = {#ifdef CONFIG_CIFS_EXPERIMENTAL .dir_notify = cifs_dir_notify,#endif /* CONFIG_CIFS_EXPERIMENTAL */ - .ioctl = cifs_ioctl, + .unlocked_ioctl = cifs_ioctl, }; static voidfs/cifs/cifsfs.h +2
-2@@ -95,8 +95,8 @@ extern int cifs_setxattr(struct dentry *, const char *, const void *, size_t, int);extern ssize_t cifs_getxattr (struct dentry *,const char *,void *,size_t );extern ssize_t cifs_listxattr (struct dentry *,char *,size_t ); -extern int cifs_ioctl (struct inode *inode,struct file *filep, -unsigned int command,unsigned long arg); +extern long cifs_ioctl (struct file *filep,unsigned int command, +unsigned long arg);#ifdef CONFIG_CIFS_EXPERIMENTAL extern const struct export_operations cifs_export_ops;fs/cifs/ioctl.c +7
-2@@ -22,6 +22,7 @@*/ #include <linux/fs.h> +#include <linux/smp_lock.h> #include "cifspdu.h" #include "cifsglob.h" #include "cifsproto.h" @@ -30,9 +31,9 @@#define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) -int cifs_ioctl (struct inode *inode,struct file *filep, -unsigned int command,unsigned long arg) +long cifs_ioctl (struct file *filep,unsigned int command,unsigned long arg) { +struct inode *inode = filep->f_path.dentry->d_inode;int rc = -ENOTTY ;/* strange error - but the precedent */ int xid;struct cifs_sb_info *cifs_sb;@@ -45,6 +46,8 @@ int cifs_ioctl(struct inode *inode, struct file *filep, (struct cifsFileInfo *)filep->private_data;#endif /* CONFIG_CIFS_POSIX */ +lock_kernel (); + xid =GetXid ();cFYI (1 , ("ioctl file %p cmd %u arg %lu" , filep, command, arg));@@ -58,6 +61,7 @@ int cifs_ioctl(struct inode *inode, struct file *filep, else { rc = -EIO ;FreeXid (xid); +unlock_kernel ();return -EIO ; }#endif /* CONFIG_CIFS_POSIX */ @@ -106,5 +110,6 @@ int cifs_ioctl(struct inode *inode, struct file *filep, }FreeXid (xid); +unlock_kernel ();return rc; }
Signature · 3 lines
Thanks, Steve