diff options
Diffstat (limited to 'fs/ioctl.c')
| -rw-r--r-- | fs/ioctl.c | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/fs/ioctl.c b/fs/ioctl.c index 2d140a713861..f855ea4fc888 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c | |||
| @@ -29,7 +29,6 @@ | |||
| 29 | * @arg: command-specific argument for ioctl | 29 | * @arg: command-specific argument for ioctl |
| 30 | * | 30 | * |
| 31 | * Invokes filesystem specific ->unlocked_ioctl, if one exists; otherwise | 31 | * Invokes filesystem specific ->unlocked_ioctl, if one exists; otherwise |
| 32 | * invokes filesystem specific ->ioctl method. If neither method exists, | ||
| 33 | * returns -ENOTTY. | 32 | * returns -ENOTTY. |
| 34 | * | 33 | * |
| 35 | * Returns 0 on success, -errno on error. | 34 | * Returns 0 on success, -errno on error. |
| @@ -39,21 +38,12 @@ static long vfs_ioctl(struct file *filp, unsigned int cmd, | |||
| 39 | { | 38 | { |
| 40 | int error = -ENOTTY; | 39 | int error = -ENOTTY; |
| 41 | 40 | ||
| 42 | if (!filp->f_op) | 41 | if (!filp->f_op || !filp->f_op->unlocked_ioctl) |
| 43 | goto out; | 42 | goto out; |
| 44 | 43 | ||
| 45 | if (filp->f_op->unlocked_ioctl) { | 44 | error = filp->f_op->unlocked_ioctl(filp, cmd, arg); |
| 46 | error = filp->f_op->unlocked_ioctl(filp, cmd, arg); | 45 | if (error == -ENOIOCTLCMD) |
| 47 | if (error == -ENOIOCTLCMD) | 46 | error = -EINVAL; |
| 48 | error = -EINVAL; | ||
| 49 | goto out; | ||
| 50 | } else if (filp->f_op->ioctl) { | ||
| 51 | lock_kernel(); | ||
| 52 | error = filp->f_op->ioctl(filp->f_path.dentry->d_inode, | ||
| 53 | filp, cmd, arg); | ||
| 54 | unlock_kernel(); | ||
| 55 | } | ||
| 56 | |||
| 57 | out: | 47 | out: |
| 58 | return error; | 48 | return error; |
| 59 | } | 49 | } |
