• Home
  • Raw
  • Download

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()
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()
114 return -EINVAL; in blk_ioctl_discard()
116 filemap_invalidate_lock(inode->i_mapping); in blk_ioctl_discard()
117 err = truncate_bdev_range(bdev, mode, start, start + len - 1); in blk_ioctl_discard()
122 filemap_invalidate_unlock(inode->i_mapping); in blk_ioctl_discard()
126 static int blk_ioctl_secure_erase(struct block_device *bdev, blk_mode_t mode, in blk_ioctl_secure_erase() argument
133 if (!(mode & BLK_OPEN_WRITE)) in blk_ioctl_secure_erase()
134 return -EBADF; in blk_ioctl_secure_erase()
136 return -EOPNOTSUPP; in blk_ioctl_secure_erase()
138 return -EFAULT; in blk_ioctl_secure_erase()
143 return -EINVAL; in blk_ioctl_secure_erase()
145 return -EINVAL; in blk_ioctl_secure_erase()
147 filemap_invalidate_lock(bdev->bd_inode->i_mapping); in blk_ioctl_secure_erase()
148 err = truncate_bdev_range(bdev, mode, start, start + len - 1); in blk_ioctl_secure_erase()
152 filemap_invalidate_unlock(bdev->bd_inode->i_mapping); in blk_ioctl_secure_erase()
157 static int blk_ioctl_zeroout(struct block_device *bdev, blk_mode_t mode, in blk_ioctl_zeroout() argument
162 struct inode *inode = bdev->bd_inode; in blk_ioctl_zeroout()
165 if (!(mode & BLK_OPEN_WRITE)) in blk_ioctl_zeroout()
166 return -EBADF; in blk_ioctl_zeroout()
169 return -EFAULT; in blk_ioctl_zeroout()
173 end = start + len - 1; in blk_ioctl_zeroout()
176 return -EINVAL; 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()
185 filemap_invalidate_lock(inode->i_mapping); in blk_ioctl_zeroout()
186 err = truncate_bdev_range(bdev, mode, start, end); in blk_ioctl_zeroout()
194 filemap_invalidate_unlock(inode->i_mapping); in blk_ioctl_zeroout()
244 * between 32-bit and 64-bit user space
246 int blkdev_compat_ptr_ioctl(struct block_device *bdev, blk_mode_t mode, in blkdev_compat_ptr_ioctl() argument
249 struct gendisk *disk = bdev->bd_disk; in blkdev_compat_ptr_ioctl()
251 if (disk->fops->ioctl) in blkdev_compat_ptr_ioctl()
252 return disk->fops->ioctl(bdev, mode, cmd, in blkdev_compat_ptr_ioctl()
255 return -ENOIOCTLCMD; in blkdev_compat_ptr_ioctl()
260 static bool blkdev_pr_allowed(struct block_device *bdev, blk_mode_t mode) in blkdev_pr_allowed() argument
266 if (capable(CAP_SYS_ADMIN)) in blkdev_pr_allowed()
272 return mode & BLK_OPEN_WRITE; in blkdev_pr_allowed()
275 static int blkdev_pr_register(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_register() argument
278 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_register()
281 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_register()
282 return -EPERM; in blkdev_pr_register()
283 if (!ops || !ops->pr_register) in blkdev_pr_register()
284 return -EOPNOTSUPP; in blkdev_pr_register()
286 return -EFAULT; in blkdev_pr_register()
289 return -EOPNOTSUPP; in blkdev_pr_register()
290 return ops->pr_register(bdev, reg.old_key, reg.new_key, reg.flags); in blkdev_pr_register()
293 static int blkdev_pr_reserve(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_reserve() argument
296 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_reserve()
299 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_reserve()
300 return -EPERM; in blkdev_pr_reserve()
301 if (!ops || !ops->pr_reserve) in blkdev_pr_reserve()
302 return -EOPNOTSUPP; in blkdev_pr_reserve()
304 return -EFAULT; in blkdev_pr_reserve()
307 return -EOPNOTSUPP; in blkdev_pr_reserve()
308 return ops->pr_reserve(bdev, rsv.key, rsv.type, rsv.flags); in blkdev_pr_reserve()
311 static int blkdev_pr_release(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_release() argument
314 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_release()
317 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_release()
318 return -EPERM; in blkdev_pr_release()
319 if (!ops || !ops->pr_release) in blkdev_pr_release()
320 return -EOPNOTSUPP; in blkdev_pr_release()
322 return -EFAULT; in blkdev_pr_release()
325 return -EOPNOTSUPP; in blkdev_pr_release()
326 return ops->pr_release(bdev, rsv.key, rsv.type); in blkdev_pr_release()
329 static int blkdev_pr_preempt(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_preempt() argument
332 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_preempt()
335 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_preempt()
336 return -EPERM; in blkdev_pr_preempt()
337 if (!ops || !ops->pr_preempt) in blkdev_pr_preempt()
338 return -EOPNOTSUPP; in blkdev_pr_preempt()
340 return -EFAULT; in blkdev_pr_preempt()
343 return -EOPNOTSUPP; in blkdev_pr_preempt()
344 return ops->pr_preempt(bdev, p.old_key, p.new_key, p.type, abort); in blkdev_pr_preempt()
347 static int blkdev_pr_clear(struct block_device *bdev, blk_mode_t mode, in blkdev_pr_clear() argument
350 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_clear()
353 if (!blkdev_pr_allowed(bdev, mode)) in blkdev_pr_clear()
354 return -EPERM; in blkdev_pr_clear()
355 if (!ops || !ops->pr_clear) in blkdev_pr_clear()
356 return -EOPNOTSUPP; in blkdev_pr_clear()
358 return -EFAULT; in blkdev_pr_clear()
361 return -EOPNOTSUPP; in blkdev_pr_clear()
362 return ops->pr_clear(bdev, c.key); in blkdev_pr_clear()
368 if (!capable(CAP_SYS_ADMIN)) in blkdev_flushbuf()
369 return -EACCES; in blkdev_flushbuf()
371 mutex_lock(&bdev->bd_holder_lock); in blkdev_flushbuf()
372 if (bdev->bd_holder_ops && bdev->bd_holder_ops->sync) in blkdev_flushbuf()
373 bdev->bd_holder_ops->sync(bdev); in blkdev_flushbuf()
376 mutex_unlock(&bdev->bd_holder_lock); in blkdev_flushbuf()
387 if (!capable(CAP_SYS_ADMIN)) in blkdev_roset()
388 return -EACCES; in blkdev_roset()
391 return -EFAULT; in blkdev_roset()
392 if (bdev->bd_disk->fops->set_read_only) { in blkdev_roset()
393 ret = bdev->bd_disk->fops->set_read_only(bdev, n); in blkdev_roset()
397 bdev->bd_read_only = n; in blkdev_roset()
404 struct gendisk *disk = bdev->bd_disk; in blkdev_getgeo()
409 return -EINVAL; in blkdev_getgeo()
410 if (!disk->fops->getgeo) in blkdev_getgeo()
411 return -ENOTTY; in blkdev_getgeo()
419 ret = disk->fops->getgeo(bdev, &geo); in blkdev_getgeo()
423 return -EFAULT; in blkdev_getgeo()
438 struct gendisk *disk = bdev->bd_disk; in compat_hdio_getgeo()
443 return -EINVAL; in compat_hdio_getgeo()
444 if (!disk->fops->getgeo) in compat_hdio_getgeo()
445 return -ENOTTY; in compat_hdio_getgeo()
453 ret = disk->fops->getgeo(bdev, &geo); in compat_hdio_getgeo()
458 ret |= put_user(geo.start, &ugeo->start); in compat_hdio_getgeo()
460 ret = -EFAULT; in compat_hdio_getgeo()
467 static int blkdev_bszset(struct block_device *bdev, blk_mode_t mode, in blkdev_bszset() argument
472 if (!capable(CAP_SYS_ADMIN)) in blkdev_bszset()
473 return -EACCES; in blkdev_bszset()
475 return -EINVAL; in blkdev_bszset()
477 return -EFAULT; in blkdev_bszset()
479 if (mode & BLK_OPEN_EXCL) in blkdev_bszset()
482 if (IS_ERR(blkdev_get_by_dev(bdev->bd_dev, mode, &bdev, NULL))) in blkdev_bszset()
483 return -EBUSY; in blkdev_bszset()
495 static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode, in blkdev_common_ioctl() argument
507 return blk_ioctl_discard(bdev, mode, arg); in blkdev_common_ioctl()
509 return blk_ioctl_secure_erase(bdev, mode, argp); in blkdev_common_ioctl()
511 return blk_ioctl_zeroout(bdev, mode, arg); in blkdev_common_ioctl()
513 return put_u64(argp, bdev->bd_disk->diskseq); in blkdev_common_ioctl()
520 return blkdev_zone_mgmt_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
547 if(!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
548 return -EACCES; in blkdev_common_ioctl()
549 bdev->bd_disk->bdi->ra_pages = (arg * 512) / PAGE_SIZE; in blkdev_common_ioctl()
552 if (!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
553 return -EACCES; in blkdev_common_ioctl()
555 return -EINVAL; in blkdev_common_ioctl()
556 return disk_scan_partitions(bdev->bd_disk, mode); in blkdev_common_ioctl()
562 return blkdev_pr_register(bdev, mode, argp); in blkdev_common_ioctl()
564 return blkdev_pr_reserve(bdev, mode, argp); in blkdev_common_ioctl()
566 return blkdev_pr_release(bdev, mode, argp); in blkdev_common_ioctl()
568 return blkdev_pr_preempt(bdev, mode, argp, false); in blkdev_common_ioctl()
570 return blkdev_pr_preempt(bdev, mode, argp, true); in blkdev_common_ioctl()
572 return blkdev_pr_clear(bdev, mode, argp); in blkdev_common_ioctl()
574 return -ENOIOCTLCMD; in blkdev_common_ioctl()
586 struct block_device *bdev = I_BDEV(file->f_mapping->host); in blkdev_ioctl()
588 blk_mode_t mode = file_to_blk_mode(file); in blkdev_ioctl() local
598 /* Compat mode returns 32-bit data instead of 'long' */ in blkdev_ioctl()
602 return -EINVAL; in blkdev_ioctl()
604 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in blkdev_ioctl()
607 return -EFBIG; in blkdev_ioctl()
614 return blkdev_bszset(bdev, mode, argp); in blkdev_ioctl()
625 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in blkdev_ioctl()
626 if (ret != -ENOIOCTLCMD) in blkdev_ioctl()
629 if (!bdev->bd_disk->fops->ioctl) in blkdev_ioctl()
630 return -ENOTTY; in blkdev_ioctl()
631 return bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
647 struct block_device *bdev = I_BDEV(file->f_mapping->host); in compat_blkdev_ioctl()
648 struct gendisk *disk = bdev->bd_disk; in compat_blkdev_ioctl()
649 blk_mode_t mode = file_to_blk_mode(file); in compat_blkdev_ioctl() local
658 /* Compat mode returns 32-bit data instead of 'long' */ in compat_blkdev_ioctl()
662 return -EINVAL; in compat_blkdev_ioctl()
664 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in compat_blkdev_ioctl()
667 return -EFBIG; in compat_blkdev_ioctl()
674 return blkdev_bszset(bdev, mode, argp); in compat_blkdev_ioctl()
685 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in compat_blkdev_ioctl()
686 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) in compat_blkdev_ioctl()
687 ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); in compat_blkdev_ioctl()