diff options
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index f2479af09da9..5885925cdb5b 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1838,8 +1838,6 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) | |||
1838 | { | 1838 | { |
1839 | struct file *file = iocb->ki_filp; | 1839 | struct file *file = iocb->ki_filp; |
1840 | ssize_t retval = 0; | 1840 | ssize_t retval = 0; |
1841 | loff_t *ppos = &iocb->ki_pos; | ||
1842 | loff_t pos = *ppos; | ||
1843 | size_t count = iov_iter_count(iter); | 1841 | size_t count = iov_iter_count(iter); |
1844 | 1842 | ||
1845 | if (!count) | 1843 | if (!count) |
@@ -1851,15 +1849,16 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) | |||
1851 | loff_t size; | 1849 | loff_t size; |
1852 | 1850 | ||
1853 | size = i_size_read(inode); | 1851 | size = i_size_read(inode); |
1854 | retval = filemap_write_and_wait_range(mapping, pos, | 1852 | retval = filemap_write_and_wait_range(mapping, iocb->ki_pos, |
1855 | pos + count - 1); | 1853 | iocb->ki_pos + count - 1); |
1856 | if (!retval) { | 1854 | if (!retval) { |
1857 | struct iov_iter data = *iter; | 1855 | struct iov_iter data = *iter; |
1858 | retval = mapping->a_ops->direct_IO(iocb, &data, pos); | 1856 | retval = mapping->a_ops->direct_IO(iocb, &data, |
1857 | iocb->ki_pos); | ||
1859 | } | 1858 | } |
1860 | 1859 | ||
1861 | if (retval > 0) { | 1860 | if (retval > 0) { |
1862 | *ppos = pos + retval; | 1861 | iocb->ki_pos += retval; |
1863 | iov_iter_advance(iter, retval); | 1862 | iov_iter_advance(iter, retval); |
1864 | } | 1863 | } |
1865 | 1864 | ||
@@ -1872,14 +1871,14 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) | |||
1872 | * the rest of the read. Buffered reads will not work for | 1871 | * the rest of the read. Buffered reads will not work for |
1873 | * DAX files, so don't bother trying. | 1872 | * DAX files, so don't bother trying. |
1874 | */ | 1873 | */ |
1875 | if (retval < 0 || !iov_iter_count(iter) || *ppos >= size || | 1874 | if (retval < 0 || !iov_iter_count(iter) || iocb->ki_pos >= size || |
1876 | IS_DAX(inode)) { | 1875 | IS_DAX(inode)) { |
1877 | file_accessed(file); | 1876 | file_accessed(file); |
1878 | goto out; | 1877 | goto out; |
1879 | } | 1878 | } |
1880 | } | 1879 | } |
1881 | 1880 | ||
1882 | retval = do_generic_file_read(file, ppos, iter, retval); | 1881 | retval = do_generic_file_read(file, &iocb->ki_pos, iter, retval); |
1883 | out: | 1882 | out: |
1884 | return retval; | 1883 | return retval; |
1885 | } | 1884 | } |