X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=fs%2Ffuse%2Ffile.c;h=aba15f1b7ad2974aa85e2c7272afc3d7836a40bc;hb=092369943623749b6c2321d65aaf4ec432cd3d04;hp=93d8d6c9494dbd5737b0842a3ebb55ef972e0d87;hpb=ddc5057c1c1fb3e99afeeef45d2b8ff9597e6707;p=~andy%2Flinux 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;