diff options
Diffstat (limited to 'fs/9p/vfs_file.c')
-rw-r--r-- | fs/9p/vfs_file.c | 14 |
1 files changed, 12 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; } |