diff options
Diffstat (limited to 'fs/ioctl.c')
-rw-r--r-- | fs/ioctl.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/fs/ioctl.c b/fs/ioctl.c index 652cacf433ff..e6500cd12258 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c | |||
@@ -16,8 +16,20 @@ | |||
16 | 16 | ||
17 | #include <asm/ioctls.h> | 17 | #include <asm/ioctls.h> |
18 | 18 | ||
19 | static long do_ioctl(struct file *filp, unsigned int cmd, | 19 | /** |
20 | unsigned long arg) | 20 | * vfs_ioctl - call filesystem specific ioctl methods |
21 | * @filp: [in] open file to invoke ioctl method on | ||
22 | * @cmd: [in] ioctl command to execute | ||
23 | * @arg: [in/out] command-specific argument for ioctl | ||
24 | * | ||
25 | * Invokes filesystem specific ->unlocked_ioctl, if one exists; otherwise | ||
26 | * invokes * filesystem specific ->ioctl method. If neither method exists, | ||
27 | * returns -ENOTTY. | ||
28 | * | ||
29 | * Returns 0 on success, -errno on error. | ||
30 | */ | ||
31 | long vfs_ioctl(struct file *filp, unsigned int cmd, | ||
32 | unsigned long arg) | ||
21 | { | 33 | { |
22 | int error = -ENOTTY; | 34 | int error = -ENOTTY; |
23 | 35 | ||
@@ -72,18 +84,18 @@ static int file_ioctl(struct file *filp, unsigned int cmd, | |||
72 | return put_user(i_size_read(inode) - filp->f_pos, p); | 84 | return put_user(i_size_read(inode) - filp->f_pos, p); |
73 | } | 85 | } |
74 | 86 | ||
75 | return do_ioctl(filp, cmd, arg); | 87 | return vfs_ioctl(filp, cmd, arg); |
76 | } | 88 | } |
77 | 89 | ||
78 | /* | 90 | /* |
79 | * When you add any new common ioctls to the switches above and below | 91 | * When you add any new common ioctls to the switches above and below |
80 | * please update compat_sys_ioctl() too. | 92 | * please update compat_sys_ioctl() too. |
81 | * | 93 | * |
82 | * vfs_ioctl() is not for drivers and not intended to be EXPORT_SYMBOL()'d. | 94 | * do_vfs_ioctl() is not for drivers and not intended to be EXPORT_SYMBOL()'d. |
83 | * It's just a simple helper for sys_ioctl and compat_sys_ioctl. | 95 | * It's just a simple helper for sys_ioctl and compat_sys_ioctl. |
84 | */ | 96 | */ |
85 | int vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, | 97 | int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, |
86 | unsigned long arg) | 98 | unsigned long arg) |
87 | { | 99 | { |
88 | unsigned int flag; | 100 | unsigned int flag; |
89 | int on, error = 0; | 101 | int on, error = 0; |
@@ -152,7 +164,7 @@ int vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, | |||
152 | if (S_ISREG(filp->f_path.dentry->d_inode->i_mode)) | 164 | if (S_ISREG(filp->f_path.dentry->d_inode->i_mode)) |
153 | error = file_ioctl(filp, cmd, arg); | 165 | error = file_ioctl(filp, cmd, arg); |
154 | else | 166 | else |
155 | error = do_ioctl(filp, cmd, arg); | 167 | error = vfs_ioctl(filp, cmd, arg); |
156 | break; | 168 | break; |
157 | } | 169 | } |
158 | return error; | 170 | return error; |
@@ -172,7 +184,7 @@ asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) | |||
172 | if (error) | 184 | if (error) |
173 | goto out_fput; | 185 | goto out_fput; |
174 | 186 | ||
175 | error = vfs_ioctl(filp, fd, cmd, arg); | 187 | error = do_vfs_ioctl(filp, fd, cmd, arg); |
176 | out_fput: | 188 | out_fput: |
177 | fput_light(filp, fput_needed); | 189 | fput_light(filp, fput_needed); |
178 | out: | 190 | out: |