Lines Matching +full:mode +full:- +full:capable

1 // SPDX-License-Identifier: GPL-2.0
9 #include <linux/backing-dev.h>
19 struct gendisk *disk = bdev->bd_disk; in blkpg_do_ioctl()
23 if (!capable(CAP_SYS_ADMIN)) in blkpg_do_ioctl()
24 return -EACCES; in blkpg_do_ioctl()
26 return -EFAULT; in blkpg_do_ioctl()
28 return -EINVAL; in blkpg_do_ioctl()
31 return -EINVAL; in blkpg_do_ioctl()
42 if (p.start & (bdev_logical_block_size(bdev) - 1)) in blkpg_do_ioctl()
43 return -EINVAL; in blkpg_do_ioctl()
48 return -EINVAL; in blkpg_do_ioctl()
58 if (get_user(op, &arg->op) || get_user(udata, &arg->data)) in blkpg_ioctl()
59 return -EFAULT; in blkpg_ioctl()
78 if (get_user(op, &arg->op) || get_user(udata, &arg->data)) in compat_blkpg_ioctl()
79 return -EFAULT; in compat_blkpg_ioctl()
85 static int blkdev_reread_part(struct block_device *bdev, fmode_t mode) in blkdev_reread_part() argument
89 if (!disk_part_scan_enabled(bdev->bd_disk) || bdev_is_partition(bdev)) in blkdev_reread_part()
90 return -EINVAL; in blkdev_reread_part()
91 if (!capable(CAP_SYS_ADMIN)) in blkdev_reread_part()
92 return -EACCES; in blkdev_reread_part()
93 if (bdev->bd_disk->open_partitions) in blkdev_reread_part()
94 return -EBUSY; in blkdev_reread_part()
100 mode &= ~FMODE_EXCL; in blkdev_reread_part()
101 set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state); in blkdev_reread_part()
103 tmp = blkdev_get_by_dev(bdev->bd_dev, mode, NULL); in blkdev_reread_part()
106 blkdev_put(tmp, mode); in blkdev_reread_part()
110 static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, in blk_ioctl_discard() argument
118 if (!(mode & FMODE_WRITE)) in blk_ioctl_discard()
119 return -EBADF; in blk_ioctl_discard()
122 return -EOPNOTSUPP; in blk_ioctl_discard()
125 return -EFAULT; in blk_ioctl_discard()
131 return -EINVAL; in blk_ioctl_discard()
133 return -EINVAL; in blk_ioctl_discard()
135 if (start + len > i_size_read(bdev->bd_inode)) in blk_ioctl_discard()
136 return -EINVAL; in blk_ioctl_discard()
138 err = truncate_bdev_range(bdev, mode, start, start + len - 1); in blk_ioctl_discard()
146 static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, in blk_ioctl_zeroout() argument
153 if (!(mode & FMODE_WRITE)) in blk_ioctl_zeroout()
154 return -EBADF; in blk_ioctl_zeroout()
157 return -EFAULT; in blk_ioctl_zeroout()
161 end = start + len - 1; in blk_ioctl_zeroout()
164 return -EINVAL; in blk_ioctl_zeroout()
166 return -EINVAL; in blk_ioctl_zeroout()
167 if (end >= (uint64_t)i_size_read(bdev->bd_inode)) in blk_ioctl_zeroout()
168 return -EINVAL; in blk_ioctl_zeroout()
170 return -EINVAL; in blk_ioctl_zeroout()
173 err = truncate_bdev_range(bdev, mode, start, end); in blk_ioctl_zeroout()
227 * between 32-bit and 64-bit user space
229 int blkdev_compat_ptr_ioctl(struct block_device *bdev, fmode_t mode, in blkdev_compat_ptr_ioctl() argument
232 struct gendisk *disk = bdev->bd_disk; in blkdev_compat_ptr_ioctl()
234 if (disk->fops->ioctl) in blkdev_compat_ptr_ioctl()
235 return disk->fops->ioctl(bdev, mode, cmd, in blkdev_compat_ptr_ioctl()
238 return -ENOIOCTLCMD; in blkdev_compat_ptr_ioctl()
246 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_register()
249 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_register()
250 return -EPERM; in blkdev_pr_register()
251 if (!ops || !ops->pr_register) in blkdev_pr_register()
252 return -EOPNOTSUPP; in blkdev_pr_register()
254 return -EFAULT; in blkdev_pr_register()
257 return -EOPNOTSUPP; in blkdev_pr_register()
258 return ops->pr_register(bdev, reg.old_key, reg.new_key, reg.flags); in blkdev_pr_register()
264 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_reserve()
267 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_reserve()
268 return -EPERM; in blkdev_pr_reserve()
269 if (!ops || !ops->pr_reserve) in blkdev_pr_reserve()
270 return -EOPNOTSUPP; in blkdev_pr_reserve()
272 return -EFAULT; in blkdev_pr_reserve()
275 return -EOPNOTSUPP; in blkdev_pr_reserve()
276 return ops->pr_reserve(bdev, rsv.key, rsv.type, rsv.flags); in blkdev_pr_reserve()
282 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_release()
285 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_release()
286 return -EPERM; in blkdev_pr_release()
287 if (!ops || !ops->pr_release) in blkdev_pr_release()
288 return -EOPNOTSUPP; in blkdev_pr_release()
290 return -EFAULT; in blkdev_pr_release()
293 return -EOPNOTSUPP; in blkdev_pr_release()
294 return ops->pr_release(bdev, rsv.key, rsv.type); in blkdev_pr_release()
300 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_preempt()
303 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_preempt()
304 return -EPERM; in blkdev_pr_preempt()
305 if (!ops || !ops->pr_preempt) in blkdev_pr_preempt()
306 return -EOPNOTSUPP; in blkdev_pr_preempt()
308 return -EFAULT; in blkdev_pr_preempt()
311 return -EOPNOTSUPP; in blkdev_pr_preempt()
312 return ops->pr_preempt(bdev, p.old_key, p.new_key, p.type, abort); in blkdev_pr_preempt()
318 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_clear()
321 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_clear()
322 return -EPERM; in blkdev_pr_clear()
323 if (!ops || !ops->pr_clear) in blkdev_pr_clear()
324 return -EOPNOTSUPP; in blkdev_pr_clear()
326 return -EFAULT; in blkdev_pr_clear()
329 return -EOPNOTSUPP; in blkdev_pr_clear()
330 return ops->pr_clear(bdev, c.key); in blkdev_pr_clear()
333 static int blkdev_flushbuf(struct block_device *bdev, fmode_t mode, in blkdev_flushbuf() argument
336 if (!capable(CAP_SYS_ADMIN)) in blkdev_flushbuf()
337 return -EACCES; in blkdev_flushbuf()
343 static int blkdev_roset(struct block_device *bdev, fmode_t mode, in blkdev_roset() argument
348 if (!capable(CAP_SYS_ADMIN)) in blkdev_roset()
349 return -EACCES; in blkdev_roset()
352 return -EFAULT; in blkdev_roset()
353 if (bdev->bd_disk->fops->set_read_only) { in blkdev_roset()
354 ret = bdev->bd_disk->fops->set_read_only(bdev, n); in blkdev_roset()
358 bdev->bd_read_only = n; in blkdev_roset()
365 struct gendisk *disk = bdev->bd_disk; in blkdev_getgeo()
370 return -EINVAL; in blkdev_getgeo()
371 if (!disk->fops->getgeo) in blkdev_getgeo()
372 return -ENOTTY; in blkdev_getgeo()
380 ret = disk->fops->getgeo(bdev, &geo); in blkdev_getgeo()
384 return -EFAULT; in blkdev_getgeo()
399 struct gendisk *disk = bdev->bd_disk; in compat_hdio_getgeo()
404 return -EINVAL; in compat_hdio_getgeo()
405 if (!disk->fops->getgeo) in compat_hdio_getgeo()
406 return -ENOTTY; in compat_hdio_getgeo()
414 ret = disk->fops->getgeo(bdev, &geo); in compat_hdio_getgeo()
419 ret |= put_user(geo.start, &ugeo->start); in compat_hdio_getgeo()
421 ret = -EFAULT; in compat_hdio_getgeo()
428 static int blkdev_bszset(struct block_device *bdev, fmode_t mode, in blkdev_bszset() argument
433 if (!capable(CAP_SYS_ADMIN)) in blkdev_bszset()
434 return -EACCES; in blkdev_bszset()
436 return -EINVAL; in blkdev_bszset()
438 return -EFAULT; in blkdev_bszset()
440 if (mode & FMODE_EXCL) in blkdev_bszset()
443 if (IS_ERR(blkdev_get_by_dev(bdev->bd_dev, mode | FMODE_EXCL, &bdev))) in blkdev_bszset()
444 return -EBUSY; in blkdev_bszset()
446 blkdev_put(bdev, mode | FMODE_EXCL); in blkdev_bszset()
456 static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode, in blkdev_common_ioctl() argument
463 return blkdev_flushbuf(bdev, mode, cmd, arg); in blkdev_common_ioctl()
465 return blkdev_roset(bdev, mode, cmd, arg); in blkdev_common_ioctl()
467 return blk_ioctl_discard(bdev, mode, arg, 0); in blkdev_common_ioctl()
469 return blk_ioctl_discard(bdev, mode, arg, in blkdev_common_ioctl()
472 return blk_ioctl_zeroout(bdev, mode, arg); in blkdev_common_ioctl()
474 return put_u64(argp, bdev->bd_disk->diskseq); in blkdev_common_ioctl()
476 return blkdev_report_zones_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
481 return blkdev_zone_mgmt_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
485 return put_uint(argp, blkdev_nr_zones(bdev->bd_disk)); in blkdev_common_ioctl()
508 if(!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
509 return -EACCES; in blkdev_common_ioctl()
510 bdev->bd_disk->bdi->ra_pages = (arg * 512) / PAGE_SIZE; in blkdev_common_ioctl()
513 return blkdev_reread_part(bdev, mode); in blkdev_common_ioctl()
531 return -ENOIOCTLCMD; in blkdev_common_ioctl()
541 int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, in blkdev_ioctl() argument
555 /* Compat mode returns 32-bit data instead of 'long' */ in blkdev_ioctl()
559 return -EINVAL; in blkdev_ioctl()
561 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in blkdev_ioctl()
563 size = i_size_read(bdev->bd_inode); in blkdev_ioctl()
565 return -EFBIG; in blkdev_ioctl()
572 return blkdev_bszset(bdev, mode, argp); in blkdev_ioctl()
574 return put_u64(argp, i_size_read(bdev->bd_inode)); in blkdev_ioctl()
583 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in blkdev_ioctl()
584 if (ret != -ENOIOCTLCMD) in blkdev_ioctl()
587 if (!bdev->bd_disk->fops->ioctl) in blkdev_ioctl()
588 return -ENOTTY; in blkdev_ioctl()
589 return bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
606 struct block_device *bdev = I_BDEV(file->f_mapping->host); in compat_blkdev_ioctl()
607 struct gendisk *disk = bdev->bd_disk; in compat_blkdev_ioctl()
608 fmode_t mode = file->f_mode; in compat_blkdev_ioctl() local
615 if (file->f_flags & O_NDELAY) in compat_blkdev_ioctl()
616 mode |= FMODE_NDELAY; in compat_blkdev_ioctl()
618 mode &= ~FMODE_NDELAY; in compat_blkdev_ioctl()
627 /* Compat mode returns 32-bit data instead of 'long' */ in compat_blkdev_ioctl()
631 return -EINVAL; in compat_blkdev_ioctl()
633 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in compat_blkdev_ioctl()
635 size = i_size_read(bdev->bd_inode); in compat_blkdev_ioctl()
637 return -EFBIG; in compat_blkdev_ioctl()
644 return blkdev_bszset(bdev, mode, argp); in compat_blkdev_ioctl()
646 return put_u64(argp, i_size_read(bdev->bd_inode)); in compat_blkdev_ioctl()
655 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in compat_blkdev_ioctl()
656 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) in compat_blkdev_ioctl()
657 ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); in compat_blkdev_ioctl()