diff options
Diffstat (limited to 'fs/ext4/indirect.c')
-rw-r--r-- | fs/ext4/indirect.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index 740c7871c117..3580629e42d3 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c | |||
@@ -642,8 +642,8 @@ out: | |||
642 | * crashes then stale disk data _may_ be exposed inside the file. But current | 642 | * crashes then stale disk data _may_ be exposed inside the file. But current |
643 | * VFS code falls back into buffered path in that case so we are safe. | 643 | * VFS code falls back into buffered path in that case so we are safe. |
644 | */ | 644 | */ |
645 | ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, | 645 | ssize_t ext4_ind_direct_IO(struct kiocb *iocb, struct iov_iter *iter, |
646 | struct iov_iter *iter, loff_t offset) | 646 | loff_t offset) |
647 | { | 647 | { |
648 | struct file *file = iocb->ki_filp; | 648 | struct file *file = iocb->ki_filp; |
649 | struct inode *inode = file->f_mapping->host; | 649 | struct inode *inode = file->f_mapping->host; |
@@ -654,7 +654,7 @@ ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, | |||
654 | size_t count = iov_iter_count(iter); | 654 | size_t count = iov_iter_count(iter); |
655 | int retries = 0; | 655 | int retries = 0; |
656 | 656 | ||
657 | if (rw == WRITE) { | 657 | if (iov_iter_rw(iter) == WRITE) { |
658 | loff_t final_size = offset + count; | 658 | loff_t final_size = offset + count; |
659 | 659 | ||
660 | if (final_size > inode->i_size) { | 660 | if (final_size > inode->i_size) { |
@@ -676,7 +676,7 @@ ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, | |||
676 | } | 676 | } |
677 | 677 | ||
678 | retry: | 678 | retry: |
679 | if (rw == READ && ext4_should_dioread_nolock(inode)) { | 679 | if (iov_iter_rw(iter) == READ && ext4_should_dioread_nolock(inode)) { |
680 | /* | 680 | /* |
681 | * Nolock dioread optimization may be dynamically disabled | 681 | * Nolock dioread optimization may be dynamically disabled |
682 | * via ext4_inode_block_unlocked_dio(). Check inode's state | 682 | * via ext4_inode_block_unlocked_dio(). Check inode's state |
@@ -690,23 +690,24 @@ retry: | |||
690 | goto locked; | 690 | goto locked; |
691 | } | 691 | } |
692 | if (IS_DAX(inode)) | 692 | if (IS_DAX(inode)) |
693 | ret = dax_do_io(rw, iocb, inode, iter, offset, | 693 | ret = dax_do_io(iocb, inode, iter, offset, |
694 | ext4_get_block, NULL, 0); | 694 | ext4_get_block, NULL, 0); |
695 | else | 695 | else |
696 | ret = __blockdev_direct_IO(rw, iocb, inode, | 696 | ret = __blockdev_direct_IO(iocb, inode, |
697 | inode->i_sb->s_bdev, iter, offset, | 697 | inode->i_sb->s_bdev, iter, |
698 | ext4_get_block, NULL, NULL, 0); | 698 | offset, ext4_get_block, NULL, |
699 | NULL, 0); | ||
699 | inode_dio_done(inode); | 700 | inode_dio_done(inode); |
700 | } else { | 701 | } else { |
701 | locked: | 702 | locked: |
702 | if (IS_DAX(inode)) | 703 | if (IS_DAX(inode)) |
703 | ret = dax_do_io(rw, iocb, inode, iter, offset, | 704 | ret = dax_do_io(iocb, inode, iter, offset, |
704 | ext4_get_block, NULL, DIO_LOCKING); | 705 | ext4_get_block, NULL, DIO_LOCKING); |
705 | else | 706 | else |
706 | ret = blockdev_direct_IO(rw, iocb, inode, iter, | 707 | ret = blockdev_direct_IO(iocb, inode, iter, offset, |
707 | offset, ext4_get_block); | 708 | ext4_get_block); |
708 | 709 | ||
709 | if (unlikely((rw & WRITE) && ret < 0)) { | 710 | if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { |
710 | loff_t isize = i_size_read(inode); | 711 | loff_t isize = i_size_read(inode); |
711 | loff_t end = offset + count; | 712 | loff_t end = offset + count; |
712 | 713 | ||