diff options
Diffstat (limited to 'fs/fuse/file.c')
| -rw-r--r-- | fs/fuse/file.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 93d8d6c9494..aba15f1b7ad 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -703,13 +703,16 @@ static ssize_t fuse_file_aio_read(struct kiocb *iocb, const struct iovec *iov,  				  unsigned long nr_segs, loff_t pos)  {  	struct inode *inode = iocb->ki_filp->f_mapping->host; +	struct fuse_conn *fc = get_fuse_conn(inode); -	if (pos + iov_length(iov, nr_segs) > i_size_read(inode)) { +	/* +	 * In auto invalidate mode, always update attributes on read. +	 * Otherwise, only update if we attempt to read past EOF (to ensure +	 * i_size is up to date). +	 */ +	if (fc->auto_inval_data || +	    (pos + iov_length(iov, nr_segs) > i_size_read(inode))) {  		int err; -		/* -		 * If trying to read past EOF, make sure the i_size -		 * attribute is up-to-date. -		 */  		err = fuse_update_attributes(inode, NULL, iocb->ki_filp, NULL);  		if (err)  			return err; @@ -1700,7 +1703,7 @@ static int fuse_verify_ioctl_iov(struct iovec *iov, size_t count)  	size_t n;  	u32 max = FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT; -	for (n = 0; n < count; n++) { +	for (n = 0; n < count; n++, iov++) {  		if (iov->iov_len > (size_t) max)  			return -ENOMEM;  		max -= iov->iov_len;  |