From 9523a841b109765f8779236d28be6458ee3a6824 Mon Sep 17 00:00:00 2001 From: Eric Van Hensbergen Date: Fri, 13 Jul 2007 13:01:27 -0500 Subject: 9p: cache meta-data when cache=loose This patch expands the impact of the loose cache mode to allow for cached metadata increasing the performance of directory listings and other metadata read operations. Signed-off-by: Eric Van Hensbergen --- fs/9p/vfs_file.c | 14 ++++++++++++-- fs/9p/vfs_inode.c | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'fs/9p') diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index c1f7c027cfeb..2a40c2946d0a 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -67,10 +67,14 @@ int v9fs_file_open(struct inode *inode, struct file *file) return PTR_ERR(fid); err = p9_client_open(fid, omode); - if (err < 0) { + if (err < 0) { p9_client_clunk(fid); return err; } + if (omode & P9_OTRUNC) { + inode->i_size = 0; + inode->i_blocks = 0; + } } file->private_data = fid; @@ -151,6 +155,7 @@ v9fs_file_write(struct file *filp, const char __user * data, { int ret; struct p9_fid *fid; + struct inode *inode = filp->f_path.dentry->d_inode; P9_DPRINTK(P9_DEBUG_VFS, "data %p count %d offset %x\n", data, (int)count, (int)*offset); @@ -160,7 +165,12 @@ v9fs_file_write(struct file *filp, const char __user * data, if (ret > 0) *offset += ret; - invalidate_inode_pages2(filp->f_path.dentry->d_inode->i_mapping); + if (*offset > inode->i_size) { + inode->i_size = *offset; + inode->i_blocks = (inode->i_size + 512 - 1) >> 9; + } + + invalidate_inode_pages2(inode->i_mapping); return ret; } diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index c602c0e054a2..e5c45eed58a9 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -716,6 +716,9 @@ v9fs_vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, P9_DPRINTK(P9_DEBUG_VFS, "dentry: %p\n", dentry); err = -EPERM; v9ses = v9fs_inode2v9ses(dentry->d_inode); + if (v9ses->cache == CACHE_LOOSE) + return simple_getattr(mnt, dentry, stat); + fid = v9fs_fid_lookup(dentry); if (IS_ERR(fid)) return PTR_ERR(fid); -- cgit v1.2.2