aboutsummaryrefslogtreecommitdiffstats
path: root/fs/direct-io.c
diff options
context:
space:
mode:
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,
1169 } 1169 }
1170 } 1170 }
1171 1171
1172 /* Once we sampled i_size check for reads beyond EOF */
1173 dio->i_size = i_size_read(inode);
1174 if (iov_iter_rw(iter) == READ && offset >= dio->i_size) {
1175 if (dio->flags & DIO_LOCKING)
1176 mutex_unlock(&inode->i_mutex);
1177 kmem_cache_free(dio_cache, dio);
1178 retval = 0;
1179 goto out;
1180 }
1181
1172 /* 1182 /*
1173 * For file extending writes updating i_size before data writeouts 1183 * For file extending writes updating i_size before data writeouts
1174 * complete can expose uninitialized blocks in dumb filesystems. 1184 * complete can expose uninitialized blocks in dumb filesystems.
@@ -1222,7 +1232,6 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
1222 sdio.next_block_for_io = -1; 1232 sdio.next_block_for_io = -1;
1223 1233
1224 dio->iocb = iocb; 1234 dio->iocb = iocb;
1225 dio->i_size = i_size_read(inode);
1226 1235
1227 spin_lock_init(&dio->bio_lock); 1236 spin_lock_init(&dio->bio_lock);
1228 dio->refcount = 1; 1237 dio->refcount = 1;