summaryrefslogtreecommitdiff
path: root/fs/direct-io.c
diff options
context:
space:
mode:
authorMike Marshall <hubcap@omnibond.com>2016-01-15 14:22:14 -0500
committerMike Marshall <hubcap@omnibond.com>2016-01-15 14:22:14 -0500
commit5e1f3938f9e4ef539031d639879cb1cea870fab5 (patch)
treeb262a7c002b05b7bc800a106d6ca6777dabe15bf /fs/direct-io.c
parent1808f8cc6cb2842c53147eccfd5e88044d0d22a6 (diff)
parentafd2ff9b7e1b367172f18ba7f693dfb62bdcb2dc (diff)
downloadlinux-rpi-5e1f3938f9e4ef539031d639879cb1cea870fab5.tar.gz
linux-rpi-5e1f3938f9e4ef539031d639879cb1cea870fab5.tar.bz2
linux-rpi-5e1f3938f9e4ef539031d639879cb1cea870fab5.zip
Orangefs: merge with V4.4
Merge tag 'v4.4' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into current Linux 4.4
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r--fs/direct-io.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c
index cb5337d8c273..602e8441bc0f 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -1169,6 +1169,16 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
}
}
+ /* Once we sampled i_size check for reads beyond EOF */
+ dio->i_size = i_size_read(inode);
+ if (iov_iter_rw(iter) == READ && offset >= dio->i_size) {
+ if (dio->flags & DIO_LOCKING)
+ mutex_unlock(&inode->i_mutex);
+ kmem_cache_free(dio_cache, dio);
+ retval = 0;
+ goto out;
+ }
+
/*
* For file extending writes updating i_size before data writeouts
* complete can expose uninitialized blocks in dumb filesystems.
@@ -1222,7 +1232,6 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
sdio.next_block_for_io = -1;
dio->iocb = iocb;
- dio->i_size = i_size_read(inode);
spin_lock_init(&dio->bio_lock);
dio->refcount = 1;