|
@@ -67,10 +67,14 @@ int v9fs_file_open(struct inode *inode, struct file *file)
|
|
return PTR_ERR(fid);
|
|
return PTR_ERR(fid);
|
|
|
|
|
|
err = p9_client_open(fid, omode);
|
|
err = p9_client_open(fid, omode);
|
|
- if (err < 0) {
|
|
|
|
|
|
+ if (err < 0) {
|
|
p9_client_clunk(fid);
|
|
p9_client_clunk(fid);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
+ if (omode & P9_OTRUNC) {
|
|
|
|
+ inode->i_size = 0;
|
|
|
|
+ inode->i_blocks = 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
file->private_data = fid;
|
|
file->private_data = fid;
|
|
@@ -151,6 +155,7 @@ v9fs_file_write(struct file *filp, const char __user * data,
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
struct p9_fid *fid;
|
|
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,
|
|
P9_DPRINTK(P9_DEBUG_VFS, "data %p count %d offset %x\n", data,
|
|
(int)count, (int)*offset);
|
|
(int)count, (int)*offset);
|
|
@@ -160,7 +165,12 @@ v9fs_file_write(struct file *filp, const char __user * data,
|
|
if (ret > 0)
|
|
if (ret > 0)
|
|
*offset += ret;
|
|
*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;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|