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); |