|
@@ -134,6 +134,7 @@ EXPORT_SYMBOL_GPL(fuse_do_open);
|
|
|
void fuse_finish_open(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
struct fuse_file *ff = file->private_data;
|
|
|
+ struct fuse_conn *fc = get_fuse_conn(inode);
|
|
|
|
|
|
if (ff->open_flags & FOPEN_DIRECT_IO)
|
|
|
file->f_op = &fuse_direct_io_file_operations;
|
|
@@ -141,6 +142,15 @@ void fuse_finish_open(struct inode *inode, struct file *file)
|
|
|
invalidate_inode_pages2(inode->i_mapping);
|
|
|
if (ff->open_flags & FOPEN_NONSEEKABLE)
|
|
|
nonseekable_open(inode, file);
|
|
|
+ if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) {
|
|
|
+ struct fuse_inode *fi = get_fuse_inode(inode);
|
|
|
+
|
|
|
+ spin_lock(&fc->lock);
|
|
|
+ fi->attr_version = ++fc->attr_version;
|
|
|
+ i_size_write(inode, 0);
|
|
|
+ spin_unlock(&fc->lock);
|
|
|
+ fuse_invalidate_attr(inode);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
int fuse_open_common(struct inode *inode, struct file *file, bool isdir)
|