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 blk_ioctl_discard(struct block_device *bdev, fmode_t mode, in blk_ioctl_discard() argument
90 struct inode *inode = bdev->bd_inode; in blk_ioctl_discard()
93 if (!(mode & FMODE_WRITE)) in blk_ioctl_discard()
94 return -EBADF; in blk_ioctl_discard()
97 return -EOPNOTSUPP; in blk_ioctl_discard()
100 return -EFAULT; in blk_ioctl_discard()
106 return -EINVAL; in blk_ioctl_discard()
108 return -EINVAL; in blk_ioctl_discard()
111 return -EINVAL; in blk_ioctl_discard()
113 filemap_invalidate_lock(inode->i_mapping); in blk_ioctl_discard()
114 err = truncate_bdev_range(bdev, mode, start, start + len - 1); in blk_ioctl_discard()
119 filemap_invalidate_unlock(inode->i_mapping); in blk_ioctl_discard()
123 static int blk_ioctl_secure_erase(struct block_device *bdev, fmode_t mode, in blk_ioctl_secure_erase() argument
130 if (!(mode & FMODE_WRITE)) in blk_ioctl_secure_erase()
131 return -EBADF; in blk_ioctl_secure_erase()
133 return -EOPNOTSUPP; in blk_ioctl_secure_erase()
135 return -EFAULT; in blk_ioctl_secure_erase()
140 return -EINVAL; in blk_ioctl_secure_erase()
142 return -EINVAL; in blk_ioctl_secure_erase()
144 filemap_invalidate_lock(bdev->bd_inode->i_mapping); in blk_ioctl_secure_erase()
145 err = truncate_bdev_range(bdev, mode, start, start + len - 1); in blk_ioctl_secure_erase()
149 filemap_invalidate_unlock(bdev->bd_inode->i_mapping); in blk_ioctl_secure_erase()
154 static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, in blk_ioctl_zeroout() argument
159 struct inode *inode = bdev->bd_inode; in blk_ioctl_zeroout()
162 if (!(mode & FMODE_WRITE)) in blk_ioctl_zeroout()
163 return -EBADF; in blk_ioctl_zeroout()
166 return -EFAULT; in blk_ioctl_zeroout()
170 end = start + len - 1; in blk_ioctl_zeroout()
173 return -EINVAL; in blk_ioctl_zeroout()
175 return -EINVAL; in blk_ioctl_zeroout()
177 return -EINVAL; in blk_ioctl_zeroout()
179 return -EINVAL; in blk_ioctl_zeroout()
182 filemap_invalidate_lock(inode->i_mapping); in blk_ioctl_zeroout()
183 err = truncate_bdev_range(bdev, mode, start, end); in blk_ioctl_zeroout()
191 filemap_invalidate_unlock(inode->i_mapping); in blk_ioctl_zeroout()
241 * between 32-bit and 64-bit user space
243 int blkdev_compat_ptr_ioctl(struct block_device *bdev, fmode_t mode, in blkdev_compat_ptr_ioctl() argument
246 struct gendisk *disk = bdev->bd_disk; in blkdev_compat_ptr_ioctl()
248 if (disk->fops->ioctl) in blkdev_compat_ptr_ioctl()
249 return disk->fops->ioctl(bdev, mode, cmd, in blkdev_compat_ptr_ioctl()
252 return -ENOIOCTLCMD; in blkdev_compat_ptr_ioctl()
260 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_register()
263 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_register()
264 return -EPERM; in blkdev_pr_register()
265 if (!ops || !ops->pr_register) in blkdev_pr_register()
266 return -EOPNOTSUPP; in blkdev_pr_register()
268 return -EFAULT; in blkdev_pr_register()
271 return -EOPNOTSUPP; in blkdev_pr_register()
272 return ops->pr_register(bdev, reg.old_key, reg.new_key, reg.flags); in blkdev_pr_register()
278 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_reserve()
281 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_reserve()
282 return -EPERM; in blkdev_pr_reserve()
283 if (!ops || !ops->pr_reserve) in blkdev_pr_reserve()
284 return -EOPNOTSUPP; in blkdev_pr_reserve()
286 return -EFAULT; in blkdev_pr_reserve()
289 return -EOPNOTSUPP; in blkdev_pr_reserve()
290 return ops->pr_reserve(bdev, rsv.key, rsv.type, rsv.flags); in blkdev_pr_reserve()
296 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_release()
299 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_release()
300 return -EPERM; in blkdev_pr_release()
301 if (!ops || !ops->pr_release) in blkdev_pr_release()
302 return -EOPNOTSUPP; in blkdev_pr_release()
304 return -EFAULT; in blkdev_pr_release()
307 return -EOPNOTSUPP; in blkdev_pr_release()
308 return ops->pr_release(bdev, rsv.key, rsv.type); in blkdev_pr_release()
314 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_preempt()
317 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_preempt()
318 return -EPERM; in blkdev_pr_preempt()
319 if (!ops || !ops->pr_preempt) in blkdev_pr_preempt()
320 return -EOPNOTSUPP; in blkdev_pr_preempt()
322 return -EFAULT; in blkdev_pr_preempt()
325 return -EOPNOTSUPP; in blkdev_pr_preempt()
326 return ops->pr_preempt(bdev, p.old_key, p.new_key, p.type, abort); in blkdev_pr_preempt()
332 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_clear()
335 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_clear()
336 return -EPERM; in blkdev_pr_clear()
337 if (!ops || !ops->pr_clear) in blkdev_pr_clear()
338 return -EOPNOTSUPP; in blkdev_pr_clear()
340 return -EFAULT; in blkdev_pr_clear()
343 return -EOPNOTSUPP; in blkdev_pr_clear()
344 return ops->pr_clear(bdev, c.key); in blkdev_pr_clear()
347 static int blkdev_flushbuf(struct block_device *bdev, fmode_t mode, in blkdev_flushbuf() argument
350 if (!capable(CAP_SYS_ADMIN)) in blkdev_flushbuf()
351 return -EACCES; in blkdev_flushbuf()
357 static int blkdev_roset(struct block_device *bdev, fmode_t mode, in blkdev_roset() argument
362 if (!capable(CAP_SYS_ADMIN)) in blkdev_roset()
363 return -EACCES; in blkdev_roset()
366 return -EFAULT; in blkdev_roset()
367 if (bdev->bd_disk->fops->set_read_only) { in blkdev_roset()
368 ret = bdev->bd_disk->fops->set_read_only(bdev, n); in blkdev_roset()
372 bdev->bd_read_only = n; in blkdev_roset()
379 struct gendisk *disk = bdev->bd_disk; in blkdev_getgeo()
384 return -EINVAL; in blkdev_getgeo()
385 if (!disk->fops->getgeo) in blkdev_getgeo()
386 return -ENOTTY; in blkdev_getgeo()
394 ret = disk->fops->getgeo(bdev, &geo); in blkdev_getgeo()
398 return -EFAULT; in blkdev_getgeo()
413 struct gendisk *disk = bdev->bd_disk; in compat_hdio_getgeo()
418 return -EINVAL; in compat_hdio_getgeo()
419 if (!disk->fops->getgeo) in compat_hdio_getgeo()
420 return -ENOTTY; in compat_hdio_getgeo()
428 ret = disk->fops->getgeo(bdev, &geo); in compat_hdio_getgeo()
433 ret |= put_user(geo.start, &ugeo->start); in compat_hdio_getgeo()
435 ret = -EFAULT; in compat_hdio_getgeo()
442 static int blkdev_bszset(struct block_device *bdev, fmode_t mode, in blkdev_bszset() argument
447 if (!capable(CAP_SYS_ADMIN)) in blkdev_bszset()
448 return -EACCES; in blkdev_bszset()
450 return -EINVAL; in blkdev_bszset()
452 return -EFAULT; in blkdev_bszset()
454 if (mode & FMODE_EXCL) in blkdev_bszset()
457 if (IS_ERR(blkdev_get_by_dev(bdev->bd_dev, mode | FMODE_EXCL, &bdev))) in blkdev_bszset()
458 return -EBUSY; in blkdev_bszset()
460 blkdev_put(bdev, mode | FMODE_EXCL); in blkdev_bszset()
470 static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode, in blkdev_common_ioctl() argument
477 return blkdev_flushbuf(bdev, mode, cmd, arg); in blkdev_common_ioctl()
479 return blkdev_roset(bdev, mode, cmd, arg); in blkdev_common_ioctl()
481 return blk_ioctl_discard(bdev, mode, arg); in blkdev_common_ioctl()
483 return blk_ioctl_secure_erase(bdev, mode, argp); in blkdev_common_ioctl()
485 return blk_ioctl_zeroout(bdev, mode, arg); in blkdev_common_ioctl()
487 return put_u64(argp, bdev->bd_disk->diskseq); in blkdev_common_ioctl()
489 return blkdev_report_zones_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
494 return blkdev_zone_mgmt_ioctl(bdev, mode, cmd, arg); in blkdev_common_ioctl()
521 if(!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
522 return -EACCES; in blkdev_common_ioctl()
523 bdev->bd_disk->bdi->ra_pages = (arg * 512) / PAGE_SIZE; in blkdev_common_ioctl()
526 if (!capable(CAP_SYS_ADMIN)) in blkdev_common_ioctl()
527 return -EACCES; in blkdev_common_ioctl()
529 return -EINVAL; in blkdev_common_ioctl()
530 return disk_scan_partitions(bdev->bd_disk, mode & ~FMODE_EXCL); in blkdev_common_ioctl()
548 return -ENOIOCTLCMD; in blkdev_common_ioctl()
560 struct block_device *bdev = I_BDEV(file->f_mapping->host); in blkdev_ioctl()
562 fmode_t mode = file->f_mode; in blkdev_ioctl() local
569 if (file->f_flags & O_NDELAY) in blkdev_ioctl()
570 mode |= FMODE_NDELAY; in blkdev_ioctl()
572 mode &= ~FMODE_NDELAY; in blkdev_ioctl()
581 /* Compat mode returns 32-bit data instead of 'long' */ in blkdev_ioctl()
585 return -EINVAL; in blkdev_ioctl()
587 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in blkdev_ioctl()
590 return -EFBIG; in blkdev_ioctl()
597 return blkdev_bszset(bdev, mode, argp); in blkdev_ioctl()
608 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in blkdev_ioctl()
609 if (ret != -ENOIOCTLCMD) in blkdev_ioctl()
612 if (!bdev->bd_disk->fops->ioctl) in blkdev_ioctl()
613 return -ENOTTY; in blkdev_ioctl()
614 return bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
630 struct block_device *bdev = I_BDEV(file->f_mapping->host); in compat_blkdev_ioctl()
631 struct gendisk *disk = bdev->bd_disk; in compat_blkdev_ioctl()
632 fmode_t mode = file->f_mode; in compat_blkdev_ioctl() local
638 if (file->f_flags & O_NDELAY) in compat_blkdev_ioctl()
639 mode |= FMODE_NDELAY; in compat_blkdev_ioctl()
641 mode &= ~FMODE_NDELAY; in compat_blkdev_ioctl()
650 /* Compat mode returns 32-bit data instead of 'long' */ in compat_blkdev_ioctl()
654 return -EINVAL; in compat_blkdev_ioctl()
656 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in compat_blkdev_ioctl()
659 return -EFBIG; in compat_blkdev_ioctl()
666 return blkdev_bszset(bdev, mode, argp); in compat_blkdev_ioctl()
677 ret = blkdev_common_ioctl(bdev, mode, cmd, arg, argp); in compat_blkdev_ioctl()
678 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) in compat_blkdev_ioctl()
679 ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); in compat_blkdev_ioctl()