9P: introduction of a new cache=mmap model.
- Add cache=mmap option - Make mmap read-write while keeping it as synchronous as possible - Build writeback fid on mmap creation if it is writable Signed-off-by: Dominique Martinet <dominique.martinet@cea.fr> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:

committed by
Eric Van Hensbergen

parent
f94741fd28
commit
fb89b45cdf
@@ -299,15 +299,22 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses,
|
||||
case S_IFREG:
|
||||
if (v9fs_proto_dotl(v9ses)) {
|
||||
inode->i_op = &v9fs_file_inode_operations_dotl;
|
||||
if (v9ses->cache)
|
||||
if (v9ses->cache == CACHE_LOOSE ||
|
||||
v9ses->cache == CACHE_FSCACHE)
|
||||
inode->i_fop =
|
||||
&v9fs_cached_file_operations_dotl;
|
||||
else if (v9ses->cache == CACHE_MMAP)
|
||||
inode->i_fop = &v9fs_mmap_file_operations_dotl;
|
||||
else
|
||||
inode->i_fop = &v9fs_file_operations_dotl;
|
||||
} else {
|
||||
inode->i_op = &v9fs_file_inode_operations;
|
||||
if (v9ses->cache)
|
||||
inode->i_fop = &v9fs_cached_file_operations;
|
||||
if (v9ses->cache == CACHE_LOOSE ||
|
||||
v9ses->cache == CACHE_FSCACHE)
|
||||
inode->i_fop =
|
||||
&v9fs_cached_file_operations;
|
||||
else if (v9ses->cache == CACHE_MMAP)
|
||||
inode->i_fop = &v9fs_mmap_file_operations;
|
||||
else
|
||||
inode->i_fop = &v9fs_file_operations;
|
||||
}
|
||||
@@ -810,7 +817,7 @@ struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
|
||||
* unlink. For cached mode create calls request for new
|
||||
* inode. But with cache disabled, lookup should do this.
|
||||
*/
|
||||
if (v9ses->cache)
|
||||
if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
|
||||
inode = v9fs_get_inode_from_fid(v9ses, fid, dir->i_sb);
|
||||
else
|
||||
inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
|
||||
@@ -876,7 +883,8 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *dentry,
|
||||
v9fs_invalidate_inode_attr(dir);
|
||||
v9inode = V9FS_I(dentry->d_inode);
|
||||
mutex_lock(&v9inode->v_mutex);
|
||||
if (v9ses->cache && !v9inode->writeback_fid &&
|
||||
if ((v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) &&
|
||||
!v9inode->writeback_fid &&
|
||||
((flags & O_ACCMODE) != O_RDONLY)) {
|
||||
/*
|
||||
* clone a fid and add it to writeback_fid
|
||||
@@ -899,7 +907,7 @@ v9fs_vfs_atomic_open(struct inode *dir, struct dentry *dentry,
|
||||
goto error;
|
||||
|
||||
file->private_data = fid;
|
||||
if (v9ses->cache)
|
||||
if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
|
||||
v9fs_cache_inode_set_cookie(dentry->d_inode, file);
|
||||
|
||||
*opened |= FILE_CREATED;
|
||||
@@ -1477,7 +1485,7 @@ int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode)
|
||||
*/
|
||||
i_size = inode->i_size;
|
||||
v9fs_stat2inode(st, inode, inode->i_sb);
|
||||
if (v9ses->cache)
|
||||
if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
|
||||
inode->i_size = i_size;
|
||||
spin_unlock(&inode->i_lock);
|
||||
out:
|
||||
|
Reference in New Issue
Block a user