Lines Matching +full:cache +full:- +full:op +full:- +full:block +full:- +full:size

1 // SPDX-License-Identifier: GPL-2.0
9 #include <linux/backing-dev.h>
17 struct blkpg_partition __user *upart, int op) in blkpg_do_ioctl() argument
19 struct gendisk *disk = bdev->bd_disk; 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()
33 if (op == BLKPG_DEL_PARTITION) in blkpg_do_ioctl()
37 return -EINVAL; in blkpg_do_ioctl()
38 /* Check that the partition is aligned to the block size */ in blkpg_do_ioctl()
40 return -EINVAL; in blkpg_do_ioctl()
45 switch (op) { in blkpg_do_ioctl()
51 return -EINVAL; in blkpg_do_ioctl()
59 int op; in blkpg_ioctl() local
61 if (get_user(op, &arg->op) || get_user(udata, &arg->data)) in blkpg_ioctl()
62 return -EFAULT; in blkpg_ioctl()
64 return blkpg_do_ioctl(bdev, udata, op); in blkpg_ioctl()
69 compat_int_t op; member
79 int op; in compat_blkpg_ioctl() local
81 if (get_user(op, &arg->op) || get_user(udata, &arg->data)) in compat_blkpg_ioctl()
82 return -EFAULT; in compat_blkpg_ioctl()
84 return blkpg_do_ioctl(bdev, compat_ptr(udata), op); in compat_blkpg_ioctl()
93 struct inode *inode = bdev->bd_inode; 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()
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()
162 struct inode *inode = bdev->bd_inode; 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()
184 /* Invalidate the page cache, including dirty pages */ in blk_ioctl_zeroout()
185 filemap_invalidate_lock(inode->i_mapping); in blk_ioctl_zeroout()
194 filemap_invalidate_unlock(inode->i_mapping); in blk_ioctl_zeroout()
242 * This is the equivalent of compat_ptr_ioctl(), to be used by block
244 * between 32-bit and 64-bit user space
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()
278 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 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()
296 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 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()
314 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 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()
332 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 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()
350 const struct pr_ops *ops = bdev->bd_disk->fops->pr_ops; 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()
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()
375 mutex_unlock(&bdev->bd_holder_lock); in blkdev_flushbuf()
389 return -EACCES; in blkdev_roset()
392 return -EFAULT; in blkdev_roset()
393 if (bdev->bd_disk->fops->set_read_only) { in blkdev_roset()
394 ret = bdev->bd_disk->fops->set_read_only(bdev, n); in blkdev_roset()
398 bdev->bd_read_only = n; in blkdev_roset()
405 struct gendisk *disk = bdev->bd_disk; in blkdev_getgeo()
410 return -EINVAL; in blkdev_getgeo()
411 if (!disk->fops->getgeo) in blkdev_getgeo()
412 return -ENOTTY; in blkdev_getgeo()
420 ret = disk->fops->getgeo(bdev, &geo); in blkdev_getgeo()
424 return -EFAULT; in blkdev_getgeo()
439 struct gendisk *disk = bdev->bd_disk; in compat_hdio_getgeo()
444 return -EINVAL; in compat_hdio_getgeo()
445 if (!disk->fops->getgeo) in compat_hdio_getgeo()
446 return -ENOTTY; in compat_hdio_getgeo()
454 ret = disk->fops->getgeo(bdev, &geo); in compat_hdio_getgeo()
459 ret |= put_user(geo.start, &ugeo->start); in compat_hdio_getgeo()
461 ret = -EFAULT; in compat_hdio_getgeo()
467 /* set the logical block size */
475 return -EACCES; in blkdev_bszset()
477 return -EINVAL; in blkdev_bszset()
479 return -EFAULT; in blkdev_bszset()
484 handle = bdev_open_by_dev(bdev->bd_dev, mode, &bdev, NULL); in blkdev_bszset()
486 return -EBUSY; in blkdev_bszset()
516 return put_u64(argp, bdev->bd_disk->diskseq); in blkdev_common_ioctl()
530 case BLKSSZGET: /* get block device logical block size */ in blkdev_common_ioctl()
532 case BLKPBSZGET: /* get block device physical block size */ in blkdev_common_ioctl()
551 return -EACCES; in blkdev_common_ioctl()
552 bdev->bd_disk->bdi->ra_pages = (arg * 512) / PAGE_SIZE; in blkdev_common_ioctl()
556 return -EACCES; in blkdev_common_ioctl()
558 return -EINVAL; in blkdev_common_ioctl()
559 return disk_scan_partitions(bdev->bd_disk, mode); in blkdev_common_ioctl()
577 return -ENOIOCTLCMD; in blkdev_common_ioctl()
589 struct block_device *bdev = I_BDEV(file->f_mapping->host); in blkdev_ioctl()
601 /* Compat mode returns 32-bit data instead of 'long' */ in blkdev_ioctl()
605 return -EINVAL; in blkdev_ioctl()
607 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in blkdev_ioctl()
610 return -EFBIG; in blkdev_ioctl()
614 case BLKBSZGET: /* get block device soft block size (cf. BLKSSZGET) */ in blkdev_ioctl()
629 if (ret != -ENOIOCTLCMD) in blkdev_ioctl()
632 if (!bdev->bd_disk->fops->ioctl) in blkdev_ioctl()
633 return -ENOTTY; in blkdev_ioctl()
634 return bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg); in blkdev_ioctl()
650 struct block_device *bdev = I_BDEV(file->f_mapping->host); in compat_blkdev_ioctl()
651 struct gendisk *disk = bdev->bd_disk; in compat_blkdev_ioctl()
661 /* Compat mode returns 32-bit data instead of 'long' */ in compat_blkdev_ioctl()
665 return -EINVAL; in compat_blkdev_ioctl()
667 (bdev->bd_disk->bdi->ra_pages * PAGE_SIZE) / 512); in compat_blkdev_ioctl()
670 return -EFBIG; in compat_blkdev_ioctl()
674 case BLKBSZGET_32: /* get the logical block size (cf. BLKSSZGET) */ in compat_blkdev_ioctl()
689 if (ret == -ENOIOCTLCMD && disk->fops->compat_ioctl) in compat_blkdev_ioctl()
690 ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); in compat_blkdev_ioctl()