• Home
  • Raw
  • Download

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

7 #include <linux/backing-dev.h>
24 if (!capable(CAP_SYS_ADMIN)) in blkpg_ioctl()
25 return -EACCES; in blkpg_ioctl()
27 return -EFAULT; in blkpg_ioctl()
29 return -EFAULT; in blkpg_ioctl()
30 disk = bdev->bd_disk; in blkpg_ioctl()
31 if (bdev != bdev->bd_contains) in blkpg_ioctl()
32 return -EINVAL; in blkpg_ioctl()
35 return -EINVAL; in blkpg_ioctl()
46 return -EINVAL; in blkpg_ioctl()
49 if (p.start & (bdev_logical_block_size(bdev) - 1)) in blkpg_ioctl()
50 return -EINVAL; in blkpg_ioctl()
52 mutex_lock(&bdev->bd_mutex); in blkpg_ioctl()
58 if (!(start + length <= part->start_sect || in blkpg_ioctl()
59 start >= part->start_sect + part->nr_sects)) { in blkpg_ioctl()
61 mutex_unlock(&bdev->bd_mutex); in blkpg_ioctl()
62 return -EBUSY; in blkpg_ioctl()
70 mutex_unlock(&bdev->bd_mutex); in blkpg_ioctl()
75 return -ENXIO; in blkpg_ioctl()
80 return -ENOMEM; in blkpg_ioctl()
82 mutex_lock(&bdevp->bd_mutex); in blkpg_ioctl()
83 if (bdevp->bd_openers) { in blkpg_ioctl()
84 mutex_unlock(&bdevp->bd_mutex); in blkpg_ioctl()
86 return -EBUSY; in blkpg_ioctl()
92 mutex_lock_nested(&bdev->bd_mutex, 1); in blkpg_ioctl()
94 mutex_unlock(&bdev->bd_mutex); in blkpg_ioctl()
95 mutex_unlock(&bdevp->bd_mutex); in blkpg_ioctl()
109 return -EINVAL; in blkpg_ioctl()
113 return -ENXIO; in blkpg_ioctl()
117 return -ENOMEM; in blkpg_ioctl()
119 mutex_lock(&bdevp->bd_mutex); in blkpg_ioctl()
120 mutex_lock_nested(&bdev->bd_mutex, 1); in blkpg_ioctl()
121 if (start != part->start_sect) { in blkpg_ioctl()
122 mutex_unlock(&bdevp->bd_mutex); in blkpg_ioctl()
123 mutex_unlock(&bdev->bd_mutex); in blkpg_ioctl()
126 return -EINVAL; in blkpg_ioctl()
132 if (lpart->partno != partno && in blkpg_ioctl()
133 !(start + length <= lpart->start_sect || in blkpg_ioctl()
134 start >= lpart->start_sect + lpart->nr_sects) in blkpg_ioctl()
137 mutex_unlock(&bdevp->bd_mutex); in blkpg_ioctl()
138 mutex_unlock(&bdev->bd_mutex); in blkpg_ioctl()
141 return -EBUSY; in blkpg_ioctl()
146 i_size_write(bdevp->bd_inode, p.length); in blkpg_ioctl()
147 mutex_unlock(&bdevp->bd_mutex); in blkpg_ioctl()
148 mutex_unlock(&bdev->bd_mutex); in blkpg_ioctl()
153 return -EINVAL; in blkpg_ioctl()
164 struct gendisk *disk = bdev->bd_disk; in __blkdev_reread_part()
166 if (!disk_part_scan_enabled(disk) || bdev != bdev->bd_contains) in __blkdev_reread_part()
167 return -EINVAL; in __blkdev_reread_part()
168 if (!capable(CAP_SYS_ADMIN)) in __blkdev_reread_part()
169 return -EACCES; in __blkdev_reread_part()
171 lockdep_assert_held(&bdev->bd_mutex); in __blkdev_reread_part()
184 * - bd_mutex is held before calling block driver's open/close
186 * - reading partition table may submit I/O to the block device
192 mutex_lock(&bdev->bd_mutex); in blkdev_reread_part()
194 mutex_unlock(&bdev->bd_mutex); in blkdev_reread_part()
200 static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, in blk_ioctl_discard() argument
206 struct address_space *mapping = bdev->bd_inode->i_mapping; in blk_ioctl_discard()
209 if (!(mode & FMODE_WRITE)) in blk_ioctl_discard()
210 return -EBADF; in blk_ioctl_discard()
213 return -EOPNOTSUPP; in blk_ioctl_discard()
216 return -EFAULT; in blk_ioctl_discard()
222 return -EINVAL; in blk_ioctl_discard()
224 return -EINVAL; in blk_ioctl_discard()
226 if (start + len > i_size_read(bdev->bd_inode)) in blk_ioctl_discard()
227 return -EINVAL; in blk_ioctl_discard()
228 truncate_inode_pages_range(mapping, start, start + len - 1); in blk_ioctl_discard()
233 static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, in blk_ioctl_zeroout() argument
240 if (!(mode & FMODE_WRITE)) in blk_ioctl_zeroout()
241 return -EBADF; in blk_ioctl_zeroout()
244 return -EFAULT; in blk_ioctl_zeroout()
248 end = start + len - 1; in blk_ioctl_zeroout()
251 return -EINVAL; in blk_ioctl_zeroout()
253 return -EINVAL; in blk_ioctl_zeroout()
254 if (end >= (uint64_t)i_size_read(bdev->bd_inode)) in blk_ioctl_zeroout()
255 return -EINVAL; in blk_ioctl_zeroout()
257 return -EINVAL; in blk_ioctl_zeroout()
260 mapping = bdev->bd_inode->i_mapping; in blk_ioctl_zeroout()
297 int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, in __blkdev_driver_ioctl() argument
300 struct gendisk *disk = bdev->bd_disk; in __blkdev_driver_ioctl()
302 if (disk->fops->ioctl) in __blkdev_driver_ioctl()
303 return disk->fops->ioctl(bdev, mode, cmd, arg); in __blkdev_driver_ioctl()
305 return -ENOTTY; in __blkdev_driver_ioctl()
310 * at all and could be open-coded without any exports by anybody who cares.
317 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_register()
320 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_register()
321 return -EPERM; in blkdev_pr_register()
322 if (!ops || !ops->pr_register) in blkdev_pr_register()
323 return -EOPNOTSUPP; in blkdev_pr_register()
325 return -EFAULT; in blkdev_pr_register()
328 return -EOPNOTSUPP; in blkdev_pr_register()
329 return ops->pr_register(bdev, reg.old_key, reg.new_key, reg.flags); in blkdev_pr_register()
335 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_reserve()
338 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_reserve()
339 return -EPERM; in blkdev_pr_reserve()
340 if (!ops || !ops->pr_reserve) in blkdev_pr_reserve()
341 return -EOPNOTSUPP; in blkdev_pr_reserve()
343 return -EFAULT; in blkdev_pr_reserve()
346 return -EOPNOTSUPP; in blkdev_pr_reserve()
347 return ops->pr_reserve(bdev, rsv.key, rsv.type, rsv.flags); in blkdev_pr_reserve()
353 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_release()
356 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_release()
357 return -EPERM; in blkdev_pr_release()
358 if (!ops || !ops->pr_release) in blkdev_pr_release()
359 return -EOPNOTSUPP; in blkdev_pr_release()
361 return -EFAULT; in blkdev_pr_release()
364 return -EOPNOTSUPP; in blkdev_pr_release()
365 return ops->pr_release(bdev, rsv.key, rsv.type); in blkdev_pr_release()
371 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_preempt()
374 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_preempt()
375 return -EPERM; in blkdev_pr_preempt()
376 if (!ops || !ops->pr_preempt) in blkdev_pr_preempt()
377 return -EOPNOTSUPP; in blkdev_pr_preempt()
379 return -EFAULT; in blkdev_pr_preempt()
382 return -EOPNOTSUPP; in blkdev_pr_preempt()
383 return ops->pr_preempt(bdev, p.old_key, p.new_key, p.type, abort); in blkdev_pr_preempt()
389 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; in blkdev_pr_clear()
392 if (!capable(CAP_SYS_ADMIN)) in blkdev_pr_clear()
393 return -EPERM; in blkdev_pr_clear()
394 if (!ops || !ops->pr_clear) in blkdev_pr_clear()
395 return -EOPNOTSUPP; in blkdev_pr_clear()
397 return -EFAULT; in blkdev_pr_clear()
400 return -EOPNOTSUPP; in blkdev_pr_clear()
401 return ops->pr_clear(bdev, c.key); in blkdev_pr_clear()
419 return ret == -EINVAL || in is_unrecognized_ioctl()
420 ret == -ENOTTY || in is_unrecognized_ioctl()
421 ret == -ENOIOCTLCMD; in is_unrecognized_ioctl()
424 static int blkdev_flushbuf(struct block_device *bdev, fmode_t mode, in blkdev_flushbuf() argument
429 if (!capable(CAP_SYS_ADMIN)) in blkdev_flushbuf()
430 return -EACCES; in blkdev_flushbuf()
432 ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_flushbuf()
441 static int blkdev_roset(struct block_device *bdev, fmode_t mode, in blkdev_roset() argument
446 if (!capable(CAP_SYS_ADMIN)) in blkdev_roset()
447 return -EACCES; in blkdev_roset()
449 ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_roset()
453 return -EFAULT; in blkdev_roset()
461 struct gendisk *disk = bdev->bd_disk; in blkdev_getgeo()
466 return -EINVAL; in blkdev_getgeo()
467 if (!disk->fops->getgeo) in blkdev_getgeo()
468 return -ENOTTY; in blkdev_getgeo()
476 ret = disk->fops->getgeo(bdev, &geo); in blkdev_getgeo()
480 return -EFAULT; in blkdev_getgeo()
485 static int blkdev_bszset(struct block_device *bdev, fmode_t mode, in blkdev_bszset() argument
490 if (!capable(CAP_SYS_ADMIN)) in blkdev_bszset()
491 return -EACCES; in blkdev_bszset()
493 return -EINVAL; in blkdev_bszset()
495 return -EFAULT; in blkdev_bszset()
497 if (!(mode & FMODE_EXCL)) { in blkdev_bszset()
499 if (blkdev_get(bdev, mode | FMODE_EXCL, &bdev) < 0) in blkdev_bszset()
500 return -EBUSY; in blkdev_bszset()
504 if (!(mode & FMODE_EXCL)) in blkdev_bszset()
505 blkdev_put(bdev, mode | FMODE_EXCL); in blkdev_bszset()
512 int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, in blkdev_ioctl() argument
521 return blkdev_flushbuf(bdev, mode, cmd, arg); in blkdev_ioctl()
523 return blkdev_roset(bdev, mode, cmd, arg); in blkdev_ioctl()
525 return blk_ioctl_discard(bdev, mode, arg, 0); in blkdev_ioctl()
527 return blk_ioctl_discard(bdev, mode, arg, in blkdev_ioctl()
530 return blk_ioctl_zeroout(bdev, mode, arg); in blkdev_ioctl()
532 return blkdev_report_zones_ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
534 return blkdev_reset_zones_ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
540 return -EINVAL; in blkdev_ioctl()
541 return put_long(arg, (bdev->bd_bdi->ra_pages*PAGE_SIZE) / 512); in blkdev_ioctl()
566 if(!capable(CAP_SYS_ADMIN)) in blkdev_ioctl()
567 return -EACCES; in blkdev_ioctl()
568 bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE; in blkdev_ioctl()
571 return blkdev_bszset(bdev, mode, argp); in blkdev_ioctl()
577 size = i_size_read(bdev->bd_inode); in blkdev_ioctl()
579 return -EFBIG; in blkdev_ioctl()
582 return put_u64(arg, i_size_read(bdev->bd_inode)); in blkdev_ioctl()
601 return __blkdev_driver_ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()