{
struct inode *inode = iocb->ki_filp->f_mapping->host;
struct fuse_conn *fc = get_fuse_conn(inode);
+ int ret;
/*
* In auto invalidate mode, always update attributes on read.
if (err)
return err;
}
-
- return generic_file_aio_read(iocb, iov, nr_segs, pos);
+ mutex_lock(&fc->invalidate_mutex);
+ ret = generic_file_aio_read(iocb, iov, nr_segs, pos);
+ mutex_unlock(&fc->invalidate_mutex);
+ return ret;
}
static void fuse_write_fill(struct fuse_req *req, struct fuse_file *ff,
struct inode *inode;
pgoff_t pg_start;
pgoff_t pg_end;
+ struct fuse_conn *fc;
inode = ilookup5(sb, nodeid, fuse_inode_eq, &nodeid);
if (!inode)
fuse_invalidate_attr(inode);
if (offset >= 0) {
+ fc = get_fuse_conn(inode);
+ mutex_lock(&fc->invalidate_mutex);
pg_start = offset >> PAGE_CACHE_SHIFT;
if (len <= 0)
pg_end = -1;
pg_end = (offset + len - 1) >> PAGE_CACHE_SHIFT;
invalidate_inode_pages2_range(inode->i_mapping,
pg_start, pg_end);
+ mutex_unlock(&fc->invalidate_mutex);
}
iput(inode);
return 0;
memset(fc, 0, sizeof(*fc));
spin_lock_init(&fc->lock);
mutex_init(&fc->inst_mutex);
+ mutex_init(&fc->invalidate_mutex);
init_rwsem(&fc->killsb);
atomic_set(&fc->count, 1);
init_waitqueue_head(&fc->waitq);