Lines Matching +full:mode +full:- +full:capable
1 // SPDX-License-Identifier: GPL-2.0
9 #include <linux/backing-dev.h>
22 if (!capable(CAP_SYS_ADMIN)) in blkpg_do_ioctl()
23 return -EACCES; in blkpg_do_ioctl()
25 return -EFAULT; in blkpg_do_ioctl()
27 return -EINVAL; in blkpg_do_ioctl()
30 return -EINVAL; in blkpg_do_ioctl()
44 return -EINVAL; in blkpg_do_ioctl()
50 if (p.start & (bdev_logical_block_size(bdev) - 1)) in blkpg_do_ioctl()
51 return -EINVAL; in blkpg_do_ioctl()
56 return -EINVAL; in blkpg_do_ioctl()
66 if (get_user(op, &arg->op) || get_user(udata, &arg->data)) in blkpg_ioctl()
67 return -EFAULT; in blkpg_ioctl()
86 if (get_user(op, &arg->op) || get_user(udata, &arg->data)) in compat_blkpg_ioctl()
87 return -EFAULT; in compat_blkpg_ioctl()
97 if (!disk_part_scan_enabled(bdev->bd_disk) || bdev_is_partition(bdev)) in blkdev_reread_part()
98 return -EINVAL; in blkdev_reread_part()
99 if (!capable(CAP_SYS_ADMIN)) in blkdev_reread_part()
100 return -EACCES; in blkdev_reread_part()
102 mutex_lock(&bdev->bd_mutex); in blkdev_reread_part()
104 mutex_unlock(&bdev->bd_mutex); in blkdev_reread_part()
109 static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, in blk_ioctl_discard() argument
117 if (!(mode & FMODE_WRITE)) in blk_ioctl_discard()
118 return -EBADF; in blk_ioctl_discard()
121 return -EOPNOTSUPP; in blk_ioctl_discard()
124 return -EFAULT; in blk_ioctl_discard()
130 return -EINVAL; in blk_ioctl_discard()
132 return -EINVAL; in blk_ioctl_discard()
134 if (start + len > i_size_read(bdev->bd_inode)) in blk_ioctl_discard()
135 return -EINVAL; in blk_ioctl_discard()
137 err = truncate_bdev_range(bdev, mode, start, start + len - 1); in blk_ioctl_discard()
145 static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, in blk_ioctl_zeroout() argument
152 if (!(mode & FMODE_WRITE)) in blk_ioctl_zeroout()
153 return -EBADF; in blk_ioctl_zeroout()
156 return -EFAULT; in blk_ioctl_zeroout()
160 end = start + len - 1; in blk_ioctl_zeroout()
163 return -EINVAL; in blk_ioctl_zeroout()
165 return -EINVAL; in blk_ioctl_zeroout()
166 if (end >= (uint64_t)i_size_read(bdev->bd_inode)) in blk_ioctl_zeroout()
167 return -EINVAL; in blk_ioctl_zeroout()
169 return -EINVAL; in blk_ioctl_zeroout()
172 err = truncate_bdev_range(bdev, mode, start, end); in blk_ioctl_zeroout()
222 int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, in __blkdev_driver_ioctl() argument
225 struct gendisk *disk = bdev->bd_disk; in __blkdev_driver_ioctl()
227 if (disk->fops->ioctl) in __blkdev_driver_ioctl()
228 return disk->fops->ioctl(bdev, mode, cmd, arg); in __blkdev_driver_ioctl()
230 return -ENOTTY; in __blkdev_driver_ioctl()
235 * at all and could be open-coded without any exports by anybody who cares.
243 * between 32-bit and 64-bit user space
245 int blkdev_compat_ptr_ioctl(struct block_device *bdev, fmode_t mode, in blkdev_compat_ptr_ioctl() argument
248 struct gendisk *disk = bdev->bd_disk; in blkdev_compat_ptr_ioctl()
250 if (disk->fops->ioctl) in blkdev_compat_ptr_ioctl()
251 return disk->fops->ioctl(bdev, mode, cmd, in blkdev_compat_ptr_ioctl()
254 return -ENOIOCTLCMD; in blkdev_compat_ptr_ioctl()
262 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_register()
265 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_register()
266 return -EPERM; in blkdev_pr_register()
267 if (!ops || !ops->pr_register) in blkdev_pr_register()
268 return -EOPNOTSUPP; in blkdev_pr_register()
270 return -EFAULT; in blkdev_pr_register()
273 return -EOPNOTSUPP; in blkdev_pr_register()
274 return ops->pr_register(bdev, reg.old_key, reg.new_key, reg.flags); in blkdev_pr_register()
280 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_reserve()
283 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_reserve()
284 return -EPERM; in blkdev_pr_reserve()
285 if (!ops || !ops->pr_reserve) in blkdev_pr_reserve()
286 return -EOPNOTSUPP; in blkdev_pr_reserve()
288 return -EFAULT; in blkdev_pr_reserve()
291 return -EOPNOTSUPP; in blkdev_pr_reserve()
292 return ops->pr_reserve(bdev, rsv.key, rsv.type, rsv.flags); in blkdev_pr_reserve()
298 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_release()
301 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_release()
302 return -EPERM; in blkdev_pr_release()
303 if (!ops || !ops->pr_release) in blkdev_pr_release()
304 return -EOPNOTSUPP; in blkdev_pr_release()
306 return -EFAULT; in blkdev_pr_release()
309 return -EOPNOTSUPP; in blkdev_pr_release()
310 return ops->pr_release(bdev, rsv.key, rsv.type); in blkdev_pr_release()
316 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_preempt()
319 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_preempt()
320 return -EPERM; in blkdev_pr_preempt()
321 if (!ops || !ops->pr_preempt) in blkdev_pr_preempt()
322 return -EOPNOTSUPP; in blkdev_pr_preempt()
324 return -EFAULT; in blkdev_pr_preempt()
327 return -EOPNOTSUPP; in blkdev_pr_preempt()
328 return ops->pr_preempt(bdev, p.old_key, p.new_key, p.type, abort); in blkdev_pr_preempt()
334 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_clear()
337 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_clear()
338 return -EPERM; in blkdev_pr_clear()
339 if (!ops || !ops->pr_clear) in blkdev_pr_clear()
340 return -EOPNOTSUPP; in blkdev_pr_clear()
342 return -EFAULT; in blkdev_pr_clear()
345 return -EOPNOTSUPP; in blkdev_pr_clear()
346 return ops->pr_clear(bdev, c.key); in blkdev_pr_clear()
364 return ret == -EINVAL || in is_unrecognized_ioctl()
365 ret == -ENOTTY || in is_unrecognized_ioctl()
366 ret == -ENOIOCTLCMD; in is_unrecognized_ioctl()
369 static int blkdev_flushbuf(struct block_device *bdev, fmode_t mode, in blkdev_flushbuf() argument
374 if (!capable(CAP_SYS_ADMIN)) in blkdev_flushbuf()
375 return -EACCES; in blkdev_flushbuf()
377 ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_flushbuf()
386 static int blkdev_roset(struct block_device *bdev, fmode_t mode, in blkdev_roset() argument
391 if (!capable(CAP_SYS_ADMIN)) in blkdev_roset()
392 return -EACCES; in blkdev_roset()
394 ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_roset()
398 return -EFAULT; in blkdev_roset()
406 struct gendisk *disk = bdev->bd_disk; in blkdev_getgeo()
411 return -EINVAL; in blkdev_getgeo()
412 if (!disk->fops->getgeo) in blkdev_getgeo()
413 return -ENOTTY; in blkdev_getgeo()
421 ret = disk->fops->getgeo(bdev, &geo); in blkdev_getgeo()
425 return -EFAULT; in blkdev_getgeo()
440 struct gendisk *disk = bdev->bd_disk; in compat_hdio_getgeo()
445 return -EINVAL; in compat_hdio_getgeo()
446 if (!disk->fops->getgeo) in compat_hdio_getgeo()
447 return -ENOTTY; in compat_hdio_getgeo()
455 ret = disk->fops->getgeo(bdev, &geo); in compat_hdio_getgeo()
460 ret |= put_user(geo.start, &ugeo->start); in compat_hdio_getgeo()
462 ret = -EFAULT; in compat_hdio_getgeo()
469 static int blkdev_bszset(struct block_device *bdev, fmode_t mode, in blkdev_bszset() argument
474 if (!capable(CAP_SYS_ADMIN)) in blkdev_bszset()
475 return -EACCES; in blkdev_bszset()
477 return -EINVAL; in blkdev_bszset()
479 return -EFAULT; in blkdev_bszset()
481 if (mode & FMODE_EXCL) in blkdev_bszset()
484 if (IS_ERR(blkdev_get_by_dev(bdev->bd_dev, mode | FMODE_EXCL, &bdev))) in blkdev_bszset()
485 return -EBUSY; in blkdev_bszset()
487 blkdev_put(bdev, mode | FMODE_EXCL); in blkdev_bszset()
497 static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode, in blkdev_common_ioctl() argument
504 return blkdev_flushbuf(bdev, mode, cmd, arg); in blkdev_common_ioctl()
506 return blkdev_roset(bdev, mode, cmd, arg); in blkdev_common_ioctl()
508 return blk_ioctl_discard(bdev, mode, arg, 0); in blkdev_common_ioctl()
510 return blk_ioctl_discard(bdev, mode, arg, in blkdev_common_ioctl()
513 return blk_ioctl_zeroout(bdev, mode, arg); in blkdev_common_ioctl()
515 return blkdev_report_zones_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
520 return blkdev_zone_mgmt_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
524 return put_uint(argp, blkdev_nr_zones(bdev->bd_disk)); in blkdev_common_ioctl()
547 if(!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
548 return -EACCES; in blkdev_common_ioctl()
549 bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE; in blkdev_common_ioctl()
570 return -ENOIOCTLCMD; in blkdev_common_ioctl()
580 int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, in blkdev_ioctl() argument
594 /* Compat mode returns 32-bit data instead of 'long' */ in blkdev_ioctl()
598 return -EINVAL; in blkdev_ioctl()
599 return put_long(argp, (bdev->bd_bdi->ra_pages*PAGE_SIZE) / 512); in blkdev_ioctl()
601 size = i_size_read(bdev->bd_inode); in blkdev_ioctl()
603 return -EFBIG; in blkdev_ioctl()
610 return blkdev_bszset(bdev, mode, argp); in blkdev_ioctl()
612 return put_u64(argp, i_size_read(bdev->bd_inode)); in blkdev_ioctl()
621 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in blkdev_ioctl()
622 if (ret == -ENOIOCTLCMD) in blkdev_ioctl()
623 return __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
642 struct inode *inode = file->f_mapping->host; in compat_blkdev_ioctl()
643 struct block_device *bdev = inode->i_bdev; in compat_blkdev_ioctl()
644 struct gendisk *disk = bdev->bd_disk; in compat_blkdev_ioctl()
645 fmode_t mode = file->f_mode; in compat_blkdev_ioctl() local
652 if (file->f_flags & O_NDELAY) in compat_blkdev_ioctl()
653 mode |= FMODE_NDELAY; in compat_blkdev_ioctl()
655 mode &= ~FMODE_NDELAY; in compat_blkdev_ioctl()
664 /* Compat mode returns 32-bit data instead of 'long' */ in compat_blkdev_ioctl()
668 return -EINVAL; in compat_blkdev_ioctl()
670 (bdev->bd_bdi->ra_pages * PAGE_SIZE) / 512); in compat_blkdev_ioctl()
672 size = i_size_read(bdev->bd_inode); in compat_blkdev_ioctl()
674 return -EFBIG; in compat_blkdev_ioctl()
681 return blkdev_bszset(bdev, mode, argp); in compat_blkdev_ioctl()
683 return put_u64(argp, i_size_read(bdev->bd_inode)); in compat_blkdev_ioctl()
692 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in compat_blkdev_ioctl()
693 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) in compat_blkdev_ioctl()
694 ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); in compat_blkdev_ioctl()