fops.c (899e373ef0b0d3f1c2712a849f019de4f46bfa02) fops.c (0718afd47f70cf46877c39c25d06b786e1a3f36c)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 1991, 1992 Linus Torvalds
4 * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
5 * Copyright (C) 2016 - 2020 Christoph Hellwig
6 */
7#include <linux/init.h>
8#include <linux/mm.h>

--- 476 unchanged lines hidden (view full) ---

485
486 if (filp->f_flags & O_NDELAY)
487 filp->f_mode |= FMODE_NDELAY;
488 if (filp->f_flags & O_EXCL)
489 filp->f_mode |= FMODE_EXCL;
490 if ((filp->f_flags & O_ACCMODE) == 3)
491 filp->f_mode |= FMODE_WRITE_IOCTL;
492
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 1991, 1992 Linus Torvalds
4 * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
5 * Copyright (C) 2016 - 2020 Christoph Hellwig
6 */
7#include <linux/init.h>
8#include <linux/mm.h>

--- 476 unchanged lines hidden (view full) ---

485
486 if (filp->f_flags & O_NDELAY)
487 filp->f_mode |= FMODE_NDELAY;
488 if (filp->f_flags & O_EXCL)
489 filp->f_mode |= FMODE_EXCL;
490 if ((filp->f_flags & O_ACCMODE) == 3)
491 filp->f_mode |= FMODE_WRITE_IOCTL;
492
493 bdev = blkdev_get_by_dev(inode->i_rdev, filp->f_mode, filp);
493 bdev = blkdev_get_by_dev(inode->i_rdev, filp->f_mode, filp, NULL);
494 if (IS_ERR(bdev))
495 return PTR_ERR(bdev);
496
497 filp->private_data = bdev;
498 filp->f_mapping = bdev->bd_inode->i_mapping;
499 filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping);
500 return 0;
501}

--- 13 unchanged lines hidden (view full) ---

515 * Does not take i_mutex for the write and thus is not for general purpose
516 * use.
517 */
518static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
519{
520 struct block_device *bdev = iocb->ki_filp->private_data;
521 struct inode *bd_inode = bdev->bd_inode;
522 loff_t size = bdev_nr_bytes(bdev);
494 if (IS_ERR(bdev))
495 return PTR_ERR(bdev);
496
497 filp->private_data = bdev;
498 filp->f_mapping = bdev->bd_inode->i_mapping;
499 filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping);
500 return 0;
501}

--- 13 unchanged lines hidden (view full) ---

515 * Does not take i_mutex for the write and thus is not for general purpose
516 * use.
517 */
518static ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
519{
520 struct block_device *bdev = iocb->ki_filp->private_data;
521 struct inode *bd_inode = bdev->bd_inode;
522 loff_t size = bdev_nr_bytes(bdev);
523 struct blk_plug plug;
524 size_t shorted = 0;
525 ssize_t ret;
526
527 if (bdev_read_only(bdev))
528 return -EPERM;
529
530 if (IS_SWAPFILE(bd_inode) && !is_hibernate_resume_dev(bd_inode->i_rdev))
531 return -ETXTBSY;

--- 8 unchanged lines hidden (view full) ---

540 return -EOPNOTSUPP;
541
542 size -= iocb->ki_pos;
543 if (iov_iter_count(from) > size) {
544 shorted = iov_iter_count(from) - size;
545 iov_iter_truncate(from, size);
546 }
547
523 size_t shorted = 0;
524 ssize_t ret;
525
526 if (bdev_read_only(bdev))
527 return -EPERM;
528
529 if (IS_SWAPFILE(bd_inode) && !is_hibernate_resume_dev(bd_inode->i_rdev))
530 return -ETXTBSY;

--- 8 unchanged lines hidden (view full) ---

539 return -EOPNOTSUPP;
540
541 size -= iocb->ki_pos;
542 if (iov_iter_count(from) > size) {
543 shorted = iov_iter_count(from) - size;
544 iov_iter_truncate(from, size);
545 }
546
548 blk_start_plug(&plug);
549 ret = __generic_file_write_iter(iocb, from);
550 if (ret > 0)
551 ret = generic_write_sync(iocb, ret);
552 iov_iter_reexpand(from, iov_iter_count(from) + shorted);
547 ret = __generic_file_write_iter(iocb, from);
548 if (ret > 0)
549 ret = generic_write_sync(iocb, ret);
550 iov_iter_reexpand(from, iov_iter_count(from) + shorted);
553 blk_finish_plug(&plug);
554 return ret;
555}
556
557static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
558{
559 struct block_device *bdev = iocb->ki_filp->private_data;
560 loff_t size = bdev_nr_bytes(bdev);
561 loff_t pos = iocb->ki_pos;

--- 111 unchanged lines hidden (view full) ---

673 error = -EOPNOTSUPP;
674 }
675
676 fail:
677 filemap_invalidate_unlock(inode->i_mapping);
678 return error;
679}
680
551 return ret;
552}
553
554static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
555{
556 struct block_device *bdev = iocb->ki_filp->private_data;
557 loff_t size = bdev_nr_bytes(bdev);
558 loff_t pos = iocb->ki_pos;

--- 111 unchanged lines hidden (view full) ---

670 error = -EOPNOTSUPP;
671 }
672
673 fail:
674 filemap_invalidate_unlock(inode->i_mapping);
675 return error;
676}
677
681static int blkdev_mmap(struct file *file, struct vm_area_struct *vma)
682{
683 struct inode *bd_inode = bdev_file_inode(file);
684
685 if (bdev_read_only(I_BDEV(bd_inode)))
686 return generic_file_readonly_mmap(file, vma);
687
688 return generic_file_mmap(file, vma);
689}
690
691const struct file_operations def_blk_fops = {
692 .open = blkdev_open,
693 .release = blkdev_close,
694 .llseek = blkdev_llseek,
695 .read_iter = blkdev_read_iter,
696 .write_iter = blkdev_write_iter,
697 .iopoll = iocb_bio_iopoll,
678const struct file_operations def_blk_fops = {
679 .open = blkdev_open,
680 .release = blkdev_close,
681 .llseek = blkdev_llseek,
682 .read_iter = blkdev_read_iter,
683 .write_iter = blkdev_write_iter,
684 .iopoll = iocb_bio_iopoll,
698 .mmap = blkdev_mmap,
685 .mmap = generic_file_mmap,
699 .fsync = blkdev_fsync,
700 .unlocked_ioctl = blkdev_ioctl,
701#ifdef CONFIG_COMPAT
702 .compat_ioctl = compat_blkdev_ioctl,
703#endif
686 .fsync = blkdev_fsync,
687 .unlocked_ioctl = blkdev_ioctl,
688#ifdef CONFIG_COMPAT
689 .compat_ioctl = compat_blkdev_ioctl,
690#endif
704 .splice_read = generic_file_splice_read,
691 .splice_read = filemap_splice_read,
705 .splice_write = iter_file_splice_write,
706 .fallocate = blkdev_fallocate,
707};
708
709static __init int blkdev_init(void)
710{
711 return bioset_init(&blkdev_dio_pool, 4,
712 offsetof(struct blkdev_dio, bio),
713 BIOSET_NEED_BVECS|BIOSET_PERCPU_CACHE);
714}
715module_init(blkdev_init);
692 .splice_write = iter_file_splice_write,
693 .fallocate = blkdev_fallocate,
694};
695
696static __init int blkdev_init(void)
697{
698 return bioset_init(&blkdev_dio_pool, 4,
699 offsetof(struct blkdev_dio, bio),
700 BIOSET_NEED_BVECS|BIOSET_PERCPU_CACHE);
701}
702module_init(blkdev_init);