diff options
| -rw-r--r-- | block/ioctl.c | 29 | ||||
| -rw-r--r-- | include/linux/fs.h | 3 |
2 files changed, 10 insertions, 22 deletions
diff --git a/block/ioctl.c b/block/ioctl.c index 0db89f95b15f..b4e0abed1b4b 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
| @@ -265,21 +265,6 @@ static int blkdev_locked_ioctl(struct file *file, struct block_device *bdev, | |||
| 265 | return -ENOIOCTLCMD; | 265 | return -ENOIOCTLCMD; |
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | int blkdev_driver_ioctl(struct inode *inode, struct file *file, | ||
| 269 | struct gendisk *disk, unsigned cmd, unsigned long arg) | ||
| 270 | { | ||
| 271 | int ret; | ||
| 272 | fmode_t mode = 0; | ||
| 273 | if (file) { | ||
| 274 | mode = file->f_mode; | ||
| 275 | if (file->f_flags & O_NDELAY) | ||
| 276 | mode |= FMODE_NDELAY_NOW; | ||
| 277 | } | ||
| 278 | |||
| 279 | return __blkdev_driver_ioctl(inode->i_bdev, mode, cmd, arg); | ||
| 280 | } | ||
| 281 | EXPORT_SYMBOL_GPL(blkdev_driver_ioctl); | ||
| 282 | |||
| 283 | int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, | 268 | int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, |
| 284 | unsigned cmd, unsigned long arg) | 269 | unsigned cmd, unsigned long arg) |
| 285 | { | 270 | { |
| @@ -315,13 +300,19 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 315 | struct block_device *bdev = inode->i_bdev; | 300 | struct block_device *bdev = inode->i_bdev; |
| 316 | struct gendisk *disk = bdev->bd_disk; | 301 | struct gendisk *disk = bdev->bd_disk; |
| 317 | int ret, n; | 302 | int ret, n; |
| 303 | fmode_t mode = 0; | ||
| 304 | if (file) { | ||
| 305 | mode = file->f_mode; | ||
| 306 | if (file->f_flags & O_NDELAY) | ||
| 307 | mode |= FMODE_NDELAY_NOW; | ||
| 308 | } | ||
| 318 | 309 | ||
| 319 | switch(cmd) { | 310 | switch(cmd) { |
| 320 | case BLKFLSBUF: | 311 | case BLKFLSBUF: |
| 321 | if (!capable(CAP_SYS_ADMIN)) | 312 | if (!capable(CAP_SYS_ADMIN)) |
| 322 | return -EACCES; | 313 | return -EACCES; |
| 323 | 314 | ||
| 324 | ret = blkdev_driver_ioctl(inode, file, disk, cmd, arg); | 315 | ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
| 325 | /* -EINVAL to handle old uncorrected drivers */ | 316 | /* -EINVAL to handle old uncorrected drivers */ |
| 326 | if (ret != -EINVAL && ret != -ENOTTY) | 317 | if (ret != -EINVAL && ret != -ENOTTY) |
| 327 | return ret; | 318 | return ret; |
| @@ -333,7 +324,7 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 333 | return 0; | 324 | return 0; |
| 334 | 325 | ||
| 335 | case BLKROSET: | 326 | case BLKROSET: |
| 336 | ret = blkdev_driver_ioctl(inode, file, disk, cmd, arg); | 327 | ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
| 337 | /* -EINVAL to handle old uncorrected drivers */ | 328 | /* -EINVAL to handle old uncorrected drivers */ |
| 338 | if (ret != -EINVAL && ret != -ENOTTY) | 329 | if (ret != -EINVAL && ret != -ENOTTY) |
| 339 | return ret; | 330 | return ret; |
| @@ -349,7 +340,7 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 349 | case BLKDISCARD: { | 340 | case BLKDISCARD: { |
| 350 | uint64_t range[2]; | 341 | uint64_t range[2]; |
| 351 | 342 | ||
| 352 | if (!(file->f_mode & FMODE_WRITE)) | 343 | if (!(mode & FMODE_WRITE)) |
| 353 | return -EBADF; | 344 | return -EBADF; |
| 354 | 345 | ||
| 355 | if (copy_from_user(range, (void __user *)arg, sizeof(range))) | 346 | if (copy_from_user(range, (void __user *)arg, sizeof(range))) |
| @@ -387,6 +378,6 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
| 387 | if (ret != -ENOIOCTLCMD) | 378 | if (ret != -ENOIOCTLCMD) |
| 388 | return ret; | 379 | return ret; |
| 389 | 380 | ||
| 390 | return blkdev_driver_ioctl(inode, file, disk, cmd, arg); | 381 | ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); |
| 391 | } | 382 | } |
| 392 | EXPORT_SYMBOL_GPL(blkdev_ioctl); | 383 | EXPORT_SYMBOL_GPL(blkdev_ioctl); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index cb78e389699b..11de682c65a1 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1718,9 +1718,6 @@ extern const struct file_operations def_fifo_fops; | |||
| 1718 | #ifdef CONFIG_BLOCK | 1718 | #ifdef CONFIG_BLOCK |
| 1719 | extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); | 1719 | extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); |
| 1720 | extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long); | 1720 | extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long); |
| 1721 | extern int blkdev_driver_ioctl(struct inode *inode, struct file *file, | ||
| 1722 | struct gendisk *disk, unsigned cmd, | ||
| 1723 | unsigned long arg); | ||
| 1724 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); | 1721 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); |
| 1725 | extern int blkdev_get(struct block_device *, fmode_t); | 1722 | extern int blkdev_get(struct block_device *, fmode_t); |
| 1726 | extern int blkdev_put(struct block_device *, fmode_t); | 1723 | extern int blkdev_put(struct block_device *, fmode_t); |
