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()
36 if (p.start < 0 || p.length <= 0 || LLONG_MAX - p.length < p.start) in blkpg_do_ioctl()
37 return -EINVAL; in blkpg_do_ioctl()
40 return -EINVAL; in blkpg_do_ioctl()
51 return -EINVAL; in blkpg_do_ioctl()
61 if (get_user(op, &arg->op) || get_user(udata, &arg->data)) in blkpg_ioctl()
62 return -EFAULT; in blkpg_ioctl()
81 if (get_user(op, &arg->op) || get_user(udata, &arg->data)) in compat_blkpg_ioctl()
82 return -EFAULT; in compat_blkpg_ioctl()
88 static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode, in blk_ioctl_discard() argument
93 struct inode *inode = bdev->bd_inode; in blk_ioctl_discard()
96 if (!(mode & BLK_OPEN_WRITE)) in blk_ioctl_discard()
97 return -EBADF; in blk_ioctl_discard()
100 return -EOPNOTSUPP; in blk_ioctl_discard()
103 return -EFAULT; in blk_ioctl_discard()
109 return -EINVAL; in blk_ioctl_discard()
111 return -EINVAL; in blk_ioctl_discard()
115 return -EINVAL; in blk_ioctl_discard()
117 filemap_invalidate_lock(inode->i_mapping); in blk_ioctl_discard()
118 err = truncate_bdev_range(bdev, mode, start, end - 1); in blk_ioctl_discard()
123 filemap_invalidate_unlock(inode->i_mapping); in blk_ioctl_discard()
127 static int blk_ioctl_secure_erase(struct block_device *bdev, blk_mode_t mode, in blk_ioctl_secure_erase() argument
134 if (!(mode & BLK_OPEN_WRITE)) in blk_ioctl_secure_erase()
135 return -EBADF; in blk_ioctl_secure_erase()
137 return -EOPNOTSUPP; in blk_ioctl_secure_erase()
139 return -EFAULT; in blk_ioctl_secure_erase()
144 return -EINVAL; in blk_ioctl_secure_erase()
147 return -EINVAL; in blk_ioctl_secure_erase()
149 filemap_invalidate_lock(bdev->bd_inode->i_mapping); in blk_ioctl_secure_erase()
150 err = truncate_bdev_range(bdev, mode, start, end - 1); in blk_ioctl_secure_erase()
154 filemap_invalidate_unlock(bdev->bd_inode->i_mapping); in blk_ioctl_secure_erase()
159 static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode, in blk_ioctl_zeroout() argument
164 struct inode *inode = bdev->bd_inode; in blk_ioctl_zeroout()
167 if (!(mode & BLK_OPEN_WRITE)) in blk_ioctl_zeroout()
168 return -EBADF; in blk_ioctl_zeroout()
171 return -EFAULT; in blk_ioctl_zeroout()
175 end = start + len - 1; in blk_ioctl_zeroout()
178 return -EINVAL; in blk_ioctl_zeroout()
180 return -EINVAL; in blk_ioctl_zeroout()
182 return -EINVAL; in blk_ioctl_zeroout()
184 return -EINVAL; in blk_ioctl_zeroout()
187 filemap_invalidate_lock(inode->i_mapping); in blk_ioctl_zeroout()
188 err = truncate_bdev_range(bdev, mode, start, end); in blk_ioctl_zeroout()
196 filemap_invalidate_unlock(inode->i_mapping); in blk_ioctl_zeroout()
246 * between 32-bit and 64-bit user space
248 int blkdev_compat_ptr_ioctl(struct block_device *bdev, blk_mode_t mode, in blkdev_compat_ptr_ioctl() argument
251 struct gendisk *disk = bdev->bd_disk; in blkdev_compat_ptr_ioctl()
253 if (disk->fops->ioctl) in blkdev_compat_ptr_ioctl()
254 return disk->fops->ioctl(bdev, mode, cmd, in blkdev_compat_ptr_ioctl()
257 return -ENOIOCTLCMD; in blkdev_compat_ptr_ioctl()
262 static bool blkdev_pr_allowed(struct block_device *bdev, blk_mode_t mode) in blkdev_pr_allowed() argument
268 if (capable(CAP_SYS_ADMIN)) in blkdev_pr_allowed()
274 return mode & BLK_OPEN_WRITE; in blkdev_pr_allowed()
277 static int blkdev_pr_register(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_register() argument
280 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_register()
283 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_register()
284 return -EPERM; in blkdev_pr_register()
285 if (!ops || !ops->pr_register) in blkdev_pr_register()
286 return -EOPNOTSUPP; in blkdev_pr_register()
288 return -EFAULT; in blkdev_pr_register()
291 return -EOPNOTSUPP; in blkdev_pr_register()
292 return ops->pr_register(bdev, reg.old_key, reg.new_key, reg.flags); in blkdev_pr_register()
295 static int blkdev_pr_reserve(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_reserve() argument
298 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_reserve()
301 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_reserve()
302 return -EPERM; in blkdev_pr_reserve()
303 if (!ops || !ops->pr_reserve) in blkdev_pr_reserve()
304 return -EOPNOTSUPP; in blkdev_pr_reserve()
306 return -EFAULT; in blkdev_pr_reserve()
309 return -EOPNOTSUPP; in blkdev_pr_reserve()
310 return ops->pr_reserve(bdev, rsv.key, rsv.type, rsv.flags); in blkdev_pr_reserve()
313 static int blkdev_pr_release(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_release() argument
316 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_release()
319 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_release()
320 return -EPERM; in blkdev_pr_release()
321 if (!ops || !ops->pr_release) in blkdev_pr_release()
322 return -EOPNOTSUPP; in blkdev_pr_release()
324 return -EFAULT; in blkdev_pr_release()
327 return -EOPNOTSUPP; in blkdev_pr_release()
328 return ops->pr_release(bdev, rsv.key, rsv.type); in blkdev_pr_release()
331 static int blkdev_pr_preempt(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_preempt() argument
334 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_preempt()
337 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_preempt()
338 return -EPERM; in blkdev_pr_preempt()
339 if (!ops || !ops->pr_preempt) in blkdev_pr_preempt()
340 return -EOPNOTSUPP; in blkdev_pr_preempt()
342 return -EFAULT; in blkdev_pr_preempt()
345 return -EOPNOTSUPP; in blkdev_pr_preempt()
346 return ops->pr_preempt(bdev, p.old_key, p.new_key, p.type, abort); in blkdev_pr_preempt()
349 static int blkdev_pr_clear(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_clear() argument
352 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_clear()
355 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_clear()
356 return -EPERM; in blkdev_pr_clear()
357 if (!ops || !ops->pr_clear) in blkdev_pr_clear()
358 return -EOPNOTSUPP; in blkdev_pr_clear()
360 return -EFAULT; in blkdev_pr_clear()
363 return -EOPNOTSUPP; in blkdev_pr_clear()
364 return ops->pr_clear(bdev, c.key); in blkdev_pr_clear()
370 if (!capable(CAP_SYS_ADMIN)) in blkdev_flushbuf()
371 return -EACCES; in blkdev_flushbuf()
373 mutex_lock(&bdev->bd_holder_lock); in blkdev_flushbuf()
374 if (bdev->bd_holder_ops && bdev->bd_holder_ops->sync) in blkdev_flushbuf()
375 bdev->bd_holder_ops->sync(bdev); in blkdev_flushbuf()
378 mutex_unlock(&bdev->bd_holder_lock); in blkdev_flushbuf()
389 if (!capable(CAP_SYS_ADMIN)) in blkdev_roset()
390 return -EACCES; in blkdev_roset()
393 return -EFAULT; in blkdev_roset()
394 if (bdev->bd_disk->fops->set_read_only) { in blkdev_roset()
395 ret = bdev->bd_disk->fops->set_read_only(bdev, n); in blkdev_roset()
399 bdev->bd_read_only = n; 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, blk_mode_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 & BLK_OPEN_EXCL) in blkdev_bszset()
484 if (IS_ERR(blkdev_get_by_dev(bdev->bd_dev, mode, &bdev, NULL))) in blkdev_bszset()
485 return -EBUSY; in blkdev_bszset()
497 static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode, in blkdev_common_ioctl() argument
509 return blk_ioctl_discard(bdev, mode, arg); in blkdev_common_ioctl()
511 return blk_ioctl_secure_erase(bdev, mode, argp); in blkdev_common_ioctl()
513 return blk_ioctl_zeroout(bdev, mode, arg); in blkdev_common_ioctl()
515 return put_u64(argp, bdev->bd_disk->diskseq); in blkdev_common_ioctl()
522 return blkdev_zone_mgmt_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
549 if(!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
550 return -EACCES; in blkdev_common_ioctl()
551 bdev->bd_disk->bdi->ra_pages = (arg * 512) / PAGE_SIZE; in blkdev_common_ioctl()
554 if (!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
555 return -EACCES; in blkdev_common_ioctl()
557 return -EINVAL; in blkdev_common_ioctl()
558 return disk_scan_partitions(bdev->bd_disk, mode); in blkdev_common_ioctl()
564 return blkdev_pr_register(bdev, mode, argp); in blkdev_common_ioctl()
566 return blkdev_pr_reserve(bdev, mode, argp); in blkdev_common_ioctl()
568 return blkdev_pr_release(bdev, mode, argp); in blkdev_common_ioctl()
570 return blkdev_pr_preempt(bdev, mode, argp, false); in blkdev_common_ioctl()
572 return blkdev_pr_preempt(bdev, mode, argp, true); in blkdev_common_ioctl()
574 return blkdev_pr_clear(bdev, mode, argp); in blkdev_common_ioctl()
576 return -ENOIOCTLCMD; in blkdev_common_ioctl()
588 struct block_device *bdev = I_BDEV(file->f_mapping->host); in blkdev_ioctl()
590 blk_mode_t mode = file_to_blk_mode(file); in blkdev_ioctl() local
600 /* Compat mode returns 32-bit data instead of 'long' */ in blkdev_ioctl()
604 return -EINVAL; in blkdev_ioctl()
606 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in blkdev_ioctl()
609 return -EFBIG; in blkdev_ioctl()
616 return blkdev_bszset(bdev, mode, argp); in blkdev_ioctl()
627 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in blkdev_ioctl()
628 if (ret != -ENOIOCTLCMD) in blkdev_ioctl()
631 if (!bdev->bd_disk->fops->ioctl) in blkdev_ioctl()
632 return -ENOTTY; in blkdev_ioctl()
633 return bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
649 struct block_device *bdev = I_BDEV(file->f_mapping->host); in compat_blkdev_ioctl()
650 struct gendisk *disk = bdev->bd_disk; in compat_blkdev_ioctl()
651 blk_mode_t mode = file_to_blk_mode(file); in compat_blkdev_ioctl() local
660 /* Compat mode returns 32-bit data instead of 'long' */ in compat_blkdev_ioctl()
664 return -EINVAL; in compat_blkdev_ioctl()
666 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in compat_blkdev_ioctl()
669 return -EFBIG; in compat_blkdev_ioctl()
676 return blkdev_bszset(bdev, mode, argp); in compat_blkdev_ioctl()
687 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in compat_blkdev_ioctl()
688 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) in compat_blkdev_ioctl()
689 ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); in compat_blkdev_ioctl()