diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2010-04-27 10:24:25 -0400 |
|---|---|---|
| committer | Frederic Weisbecker <fweisbec@gmail.com> | 2010-05-16 23:27:04 -0400 |
| commit | ce8273a573918612cbd320597db3d5dd89578454 (patch) | |
| tree | f3a6df94053ee0c3276c318e108c88bc479106c3 | |
| parent | 977183902a52d1e0adc986f9462424db5a545044 (diff) | |
smbfs: Push down BKL into ioctl function
Converting from ->ioctl to ->unlocked_ioctl with explicit
lock_kernel lets us kill the ioctl operation.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
[fixed inode reference in smb_ioctl]
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
| -rw-r--r-- | fs/smbfs/dir.c | 2 | ||||
| -rw-r--r-- | fs/smbfs/file.c | 2 | ||||
| -rw-r--r-- | fs/smbfs/ioctl.c | 10 | ||||
| -rw-r--r-- | fs/smbfs/proto.h | 2 |
4 files changed, 9 insertions, 7 deletions
diff --git a/fs/smbfs/dir.c b/fs/smbfs/dir.c index 3e4803b4427e..6c978428892d 100644 --- a/fs/smbfs/dir.c +++ b/fs/smbfs/dir.c | |||
| @@ -39,7 +39,7 @@ const struct file_operations smb_dir_operations = | |||
| 39 | { | 39 | { |
| 40 | .read = generic_read_dir, | 40 | .read = generic_read_dir, |
| 41 | .readdir = smb_readdir, | 41 | .readdir = smb_readdir, |
| 42 | .ioctl = smb_ioctl, | 42 | .unlocked_ioctl = smb_ioctl, |
| 43 | .open = smb_dir_open, | 43 | .open = smb_dir_open, |
| 44 | }; | 44 | }; |
| 45 | 45 | ||
diff --git a/fs/smbfs/file.c b/fs/smbfs/file.c index dbf6548bbf06..84ecf0e43f91 100644 --- a/fs/smbfs/file.c +++ b/fs/smbfs/file.c | |||
| @@ -437,7 +437,7 @@ const struct file_operations smb_file_operations = | |||
| 437 | .aio_read = smb_file_aio_read, | 437 | .aio_read = smb_file_aio_read, |
| 438 | .write = do_sync_write, | 438 | .write = do_sync_write, |
| 439 | .aio_write = smb_file_aio_write, | 439 | .aio_write = smb_file_aio_write, |
| 440 | .ioctl = smb_ioctl, | 440 | .unlocked_ioctl = smb_ioctl, |
| 441 | .mmap = smb_file_mmap, | 441 | .mmap = smb_file_mmap, |
| 442 | .open = smb_file_open, | 442 | .open = smb_file_open, |
| 443 | .release = smb_file_release, | 443 | .release = smb_file_release, |
diff --git a/fs/smbfs/ioctl.c b/fs/smbfs/ioctl.c index dbae1f8ea26f..07215312ad39 100644 --- a/fs/smbfs/ioctl.c +++ b/fs/smbfs/ioctl.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/time.h> | 13 | #include <linux/time.h> |
| 14 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
| 15 | #include <linux/highuid.h> | 15 | #include <linux/highuid.h> |
| 16 | #include <linux/smp_lock.h> | ||
| 16 | #include <linux/net.h> | 17 | #include <linux/net.h> |
| 17 | 18 | ||
| 18 | #include <linux/smb_fs.h> | 19 | #include <linux/smb_fs.h> |
| @@ -22,14 +23,14 @@ | |||
| 22 | 23 | ||
| 23 | #include "proto.h" | 24 | #include "proto.h" |
| 24 | 25 | ||
| 25 | int | 26 | long |
| 26 | smb_ioctl(struct inode *inode, struct file *filp, | 27 | smb_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
| 27 | unsigned int cmd, unsigned long arg) | ||
| 28 | { | 28 | { |
| 29 | struct smb_sb_info *server = server_from_inode(inode); | 29 | struct smb_sb_info *server = server_from_inode(filp->f_path.dentry->d_inode); |
| 30 | struct smb_conn_opt opt; | 30 | struct smb_conn_opt opt; |
| 31 | int result = -EINVAL; | 31 | int result = -EINVAL; |
| 32 | 32 | ||
| 33 | lock_kernel(); | ||
| 33 | switch (cmd) { | 34 | switch (cmd) { |
| 34 | uid16_t uid16; | 35 | uid16_t uid16; |
| 35 | uid_t uid32; | 36 | uid_t uid32; |
| @@ -62,6 +63,7 @@ smb_ioctl(struct inode *inode, struct file *filp, | |||
| 62 | default: | 63 | default: |
| 63 | break; | 64 | break; |
| 64 | } | 65 | } |
| 66 | unlock_kernel(); | ||
| 65 | 67 | ||
| 66 | return result; | 68 | return result; |
| 67 | } | 69 | } |
diff --git a/fs/smbfs/proto.h b/fs/smbfs/proto.h index 03f456c1b7d4..05939a6f43e6 100644 --- a/fs/smbfs/proto.h +++ b/fs/smbfs/proto.h | |||
| @@ -67,7 +67,7 @@ extern const struct address_space_operations smb_file_aops; | |||
| 67 | extern const struct file_operations smb_file_operations; | 67 | extern const struct file_operations smb_file_operations; |
| 68 | extern const struct inode_operations smb_file_inode_operations; | 68 | extern const struct inode_operations smb_file_inode_operations; |
| 69 | /* ioctl.c */ | 69 | /* ioctl.c */ |
| 70 | extern int smb_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); | 70 | extern long smb_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); |
| 71 | /* smbiod.c */ | 71 | /* smbiod.c */ |
| 72 | extern void smbiod_wake_up(void); | 72 | extern void smbiod_wake_up(void); |
| 73 | extern int smbiod_register_server(struct smb_sb_info *server); | 73 | extern int smbiod_register_server(struct smb_sb_info *server); |
