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 <ericvh@gmail.com>
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
index c1f7c02..2a40c29 100644
--- a/fs/9p/vfs_file.c
+++ b/fs/9p/vfs_file.c
@@ -67,10 +67,14 @@
 			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 @@
 {
 	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 @@
 	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;
 }