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()
93 static int blkdev_reread_part(struct block_device *bdev, fmode_t mode) in blkdev_reread_part() argument
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()
101 if (bdev->bd_part_count) in blkdev_reread_part()
102 return -EBUSY; in blkdev_reread_part()
108 mode &= ~FMODE_EXCL; in blkdev_reread_part()
109 set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state); in blkdev_reread_part()
111 tmp = blkdev_get_by_dev(bdev->bd_dev, mode, NULL); in blkdev_reread_part()
114 blkdev_put(tmp, mode); in blkdev_reread_part()
118 static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, in blk_ioctl_discard() argument
126 if (!(mode & FMODE_WRITE)) in blk_ioctl_discard()
127 return -EBADF; in blk_ioctl_discard()
130 return -EOPNOTSUPP; in blk_ioctl_discard()
133 return -EFAULT; in blk_ioctl_discard()
139 return -EINVAL; in blk_ioctl_discard()
141 return -EINVAL; in blk_ioctl_discard()
143 if (start + len > i_size_read(bdev->bd_inode)) in blk_ioctl_discard()
144 return -EINVAL; in blk_ioctl_discard()
146 err = truncate_bdev_range(bdev, mode, start, start + len - 1); in blk_ioctl_discard()
154 static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, in blk_ioctl_zeroout() argument
161 if (!(mode & FMODE_WRITE)) in blk_ioctl_zeroout()
162 return -EBADF; in blk_ioctl_zeroout()
165 return -EFAULT; in blk_ioctl_zeroout()
169 end = start + len - 1; in blk_ioctl_zeroout()
172 return -EINVAL; in blk_ioctl_zeroout()
174 return -EINVAL; in blk_ioctl_zeroout()
175 if (end >= (uint64_t)i_size_read(bdev->bd_inode)) in blk_ioctl_zeroout()
176 return -EINVAL; in blk_ioctl_zeroout()
178 return -EINVAL; in blk_ioctl_zeroout()
181 err = truncate_bdev_range(bdev, mode, start, end); in blk_ioctl_zeroout()
231 int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, in __blkdev_driver_ioctl() argument
234 struct gendisk *disk = bdev->bd_disk; in __blkdev_driver_ioctl()
236 if (disk->fops->ioctl) in __blkdev_driver_ioctl()
237 return disk->fops->ioctl(bdev, mode, cmd, arg); in __blkdev_driver_ioctl()
239 return -ENOTTY; in __blkdev_driver_ioctl()
244 * at all and could be open-coded without any exports by anybody who cares.
252 * between 32-bit and 64-bit user space
254 int blkdev_compat_ptr_ioctl(struct block_device *bdev, fmode_t mode, in blkdev_compat_ptr_ioctl() argument
257 struct gendisk *disk = bdev->bd_disk; in blkdev_compat_ptr_ioctl()
259 if (disk->fops->ioctl) in blkdev_compat_ptr_ioctl()
260 return disk->fops->ioctl(bdev, mode, cmd, in blkdev_compat_ptr_ioctl()
263 return -ENOIOCTLCMD; in blkdev_compat_ptr_ioctl()
271 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_register()
274 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_register()
275 return -EPERM; in blkdev_pr_register()
276 if (!ops || !ops->pr_register) in blkdev_pr_register()
277 return -EOPNOTSUPP; in blkdev_pr_register()
279 return -EFAULT; in blkdev_pr_register()
282 return -EOPNOTSUPP; in blkdev_pr_register()
283 return ops->pr_register(bdev, reg.old_key, reg.new_key, reg.flags); in blkdev_pr_register()
289 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_reserve()
292 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_reserve()
293 return -EPERM; in blkdev_pr_reserve()
294 if (!ops || !ops->pr_reserve) in blkdev_pr_reserve()
295 return -EOPNOTSUPP; in blkdev_pr_reserve()
297 return -EFAULT; in blkdev_pr_reserve()
300 return -EOPNOTSUPP; in blkdev_pr_reserve()
301 return ops->pr_reserve(bdev, rsv.key, rsv.type, rsv.flags); in blkdev_pr_reserve()
307 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_release()
310 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_release()
311 return -EPERM; in blkdev_pr_release()
312 if (!ops || !ops->pr_release) in blkdev_pr_release()
313 return -EOPNOTSUPP; in blkdev_pr_release()
315 return -EFAULT; in blkdev_pr_release()
318 return -EOPNOTSUPP; in blkdev_pr_release()
319 return ops->pr_release(bdev, rsv.key, rsv.type); in blkdev_pr_release()
325 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_preempt()
328 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_preempt()
329 return -EPERM; in blkdev_pr_preempt()
330 if (!ops || !ops->pr_preempt) in blkdev_pr_preempt()
331 return -EOPNOTSUPP; in blkdev_pr_preempt()
333 return -EFAULT; in blkdev_pr_preempt()
336 return -EOPNOTSUPP; in blkdev_pr_preempt()
337 return ops->pr_preempt(bdev, p.old_key, p.new_key, p.type, abort); in blkdev_pr_preempt()
343 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_clear()
346 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_clear()
347 return -EPERM; in blkdev_pr_clear()
348 if (!ops || !ops->pr_clear) in blkdev_pr_clear()
349 return -EOPNOTSUPP; in blkdev_pr_clear()
351 return -EFAULT; in blkdev_pr_clear()
354 return -EOPNOTSUPP; in blkdev_pr_clear()
355 return ops->pr_clear(bdev, c.key); in blkdev_pr_clear()
373 return ret == -EINVAL || in is_unrecognized_ioctl()
374 ret == -ENOTTY || in is_unrecognized_ioctl()
375 ret == -ENOIOCTLCMD; in is_unrecognized_ioctl()
378 static int blkdev_flushbuf(struct block_device *bdev, fmode_t mode, in blkdev_flushbuf() argument
383 if (!capable(CAP_SYS_ADMIN)) in blkdev_flushbuf()
384 return -EACCES; in blkdev_flushbuf()
386 ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_flushbuf()
395 static int blkdev_roset(struct block_device *bdev, fmode_t mode, in blkdev_roset() argument
400 if (!capable(CAP_SYS_ADMIN)) in blkdev_roset()
401 return -EACCES; in blkdev_roset()
403 ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_roset()
407 return -EFAULT; in blkdev_roset()
415 struct gendisk *disk = bdev->bd_disk; in blkdev_getgeo()
420 return -EINVAL; in blkdev_getgeo()
421 if (!disk->fops->getgeo) in blkdev_getgeo()
422 return -ENOTTY; in blkdev_getgeo()
430 ret = disk->fops->getgeo(bdev, &geo); in blkdev_getgeo()
434 return -EFAULT; in blkdev_getgeo()
449 struct gendisk *disk = bdev->bd_disk; in compat_hdio_getgeo()
454 return -EINVAL; in compat_hdio_getgeo()
455 if (!disk->fops->getgeo) in compat_hdio_getgeo()
456 return -ENOTTY; in compat_hdio_getgeo()
464 ret = disk->fops->getgeo(bdev, &geo); in compat_hdio_getgeo()
469 ret |= put_user(geo.start, &ugeo->start); in compat_hdio_getgeo()
471 ret = -EFAULT; in compat_hdio_getgeo()
478 static int blkdev_bszset(struct block_device *bdev, fmode_t mode, in blkdev_bszset() argument
483 if (!capable(CAP_SYS_ADMIN)) in blkdev_bszset()
484 return -EACCES; in blkdev_bszset()
486 return -EINVAL; in blkdev_bszset()
488 return -EFAULT; in blkdev_bszset()
490 if (mode & FMODE_EXCL) in blkdev_bszset()
493 if (IS_ERR(blkdev_get_by_dev(bdev->bd_dev, mode | FMODE_EXCL, &bdev))) in blkdev_bszset()
494 return -EBUSY; in blkdev_bszset()
496 blkdev_put(bdev, mode | FMODE_EXCL); in blkdev_bszset()
506 static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode, in blkdev_common_ioctl() argument
513 return blkdev_flushbuf(bdev, mode, cmd, arg); in blkdev_common_ioctl()
515 return blkdev_roset(bdev, mode, cmd, arg); in blkdev_common_ioctl()
517 return blk_ioctl_discard(bdev, mode, arg, 0); in blkdev_common_ioctl()
519 return blk_ioctl_discard(bdev, mode, arg, in blkdev_common_ioctl()
522 return blk_ioctl_zeroout(bdev, mode, arg); in blkdev_common_ioctl()
524 return blkdev_report_zones_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
529 return blkdev_zone_mgmt_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
533 return put_uint(argp, blkdev_nr_zones(bdev->bd_disk)); in blkdev_common_ioctl()
556 if(!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
557 return -EACCES; in blkdev_common_ioctl()
558 bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE; in blkdev_common_ioctl()
561 return blkdev_reread_part(bdev, mode); in blkdev_common_ioctl()
579 return -ENOIOCTLCMD; in blkdev_common_ioctl()
589 int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, in blkdev_ioctl() argument
603 /* Compat mode returns 32-bit data instead of 'long' */ in blkdev_ioctl()
607 return -EINVAL; in blkdev_ioctl()
608 return put_long(argp, (bdev->bd_bdi->ra_pages*PAGE_SIZE) / 512); in blkdev_ioctl()
610 size = i_size_read(bdev->bd_inode); in blkdev_ioctl()
612 return -EFBIG; in blkdev_ioctl()
619 return blkdev_bszset(bdev, mode, argp); in blkdev_ioctl()
621 return put_u64(argp, i_size_read(bdev->bd_inode)); in blkdev_ioctl()
630 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in blkdev_ioctl()
631 if (ret == -ENOIOCTLCMD) in blkdev_ioctl()
632 return __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
651 struct inode *inode = file->f_mapping->host; in compat_blkdev_ioctl()
652 struct block_device *bdev = inode->i_bdev; in compat_blkdev_ioctl()
653 struct gendisk *disk = bdev->bd_disk; in compat_blkdev_ioctl()
654 fmode_t mode = file->f_mode; in compat_blkdev_ioctl() local
661 if (file->f_flags & O_NDELAY) in compat_blkdev_ioctl()
662 mode |= FMODE_NDELAY; in compat_blkdev_ioctl()
664 mode &= ~FMODE_NDELAY; in compat_blkdev_ioctl()
673 /* Compat mode returns 32-bit data instead of 'long' */ in compat_blkdev_ioctl()
677 return -EINVAL; in compat_blkdev_ioctl()
679 (bdev->bd_bdi->ra_pages * PAGE_SIZE) / 512); in compat_blkdev_ioctl()
681 size = i_size_read(bdev->bd_inode); in compat_blkdev_ioctl()
683 return -EFBIG; in compat_blkdev_ioctl()
690 return blkdev_bszset(bdev, mode, argp); in compat_blkdev_ioctl()
692 return put_u64(argp, i_size_read(bdev->bd_inode)); in compat_blkdev_ioctl()
701 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in compat_blkdev_ioctl()
702 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) in compat_blkdev_ioctl()
703 ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); in compat_blkdev_ioctl()