diff options
Diffstat (limited to 'fs/9p')
-rw-r--r-- | fs/9p/vfs_file.c | 14 | ||||
-rw-r--r-- | fs/9p/vfs_inode.c | 3 |
2 files changed, 15 insertions, 2 deletions
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index c1f7c027cfe..2a40c2946d0 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 c602c0e054a..e5c45eed58a 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); |