Add to pass the file handle (if it is) for FUSE_SETATTR request inside submit_size_grow().
Signed-off-by: Pavel Butsykin <pbutsy...@virtuozzo.com> --- fs/fuse/file.c | 5 +++-- fs/fuse/fuse_i.h | 4 ++++ fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 8 ++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index ddfb41af54ec..9ae260a10490 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1137,6 +1137,7 @@ void fuse_release_ff(struct inode *inode, struct fuse_file *ff) } } } +EXPORT_SYMBOL_GPL(fuse_release_ff); static void fuse_readpages_end(struct fuse_conn *fc, struct fuse_req *req) { @@ -1997,8 +1998,7 @@ static void fuse_writepage_end(struct fuse_conn *fc, struct fuse_req *req) fuse_writepage_free(fc, req); } -static struct fuse_file *fuse_write_file(struct fuse_conn *fc, - struct fuse_inode *fi) +struct fuse_file *fuse_write_file(struct fuse_conn *fc, struct fuse_inode *fi) { struct fuse_file *ff = NULL; @@ -2011,6 +2011,7 @@ static struct fuse_file *fuse_write_file(struct fuse_conn *fc, return ff; } +EXPORT_SYMBOL_GPL(fuse_write_file); static int tree_insert(struct rb_root *root, struct fuse_req *ins_req) { diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 939835f585b1..20295250070a 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -1091,4 +1091,8 @@ void fuse_stat_account(struct fuse_conn * fc, int op, ktime_t val); int fuse_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); +struct fuse_file *fuse_write_file(struct fuse_conn *fc, struct fuse_inode *fi); + +void fuse_release_ff(struct inode *inode, struct fuse_file *ff); + #endif /* _FS_FUSE_I_H */ diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c index 1a6776f7977a..4f8b0133ca5b 100644 --- a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c +++ b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c @@ -608,6 +608,7 @@ void ireq_destroy(struct pcs_int_request *ireq) static int submit_size_grow(struct inode *inode, unsigned long long size) { struct fuse_conn *fc = get_fuse_conn(inode); + struct fuse_file *ff; struct fuse_setattr_in inarg; struct fuse_attr_out outarg; struct fuse_req *req; @@ -630,6 +631,11 @@ static int submit_size_grow(struct inode *inode, unsigned long long size) inarg.valid |= FATTR_SIZE; inarg.size = size; + ff = fuse_write_file(fc, get_fuse_inode(inode)); + if (ff) { + inarg.valid |= FATTR_FH; + inarg.fh = ff->fh; + } req->io_inode = inode; req->in.h.opcode = FUSE_SETATTR; req->in.h.nodeid = get_node_id(inode); @@ -641,7 +647,9 @@ static int submit_size_grow(struct inode *inode, unsigned long long size) req->out.args[0].value = &outarg; fuse_request_send(fc, req); + err = req->out.h.error; + fuse_release_ff(inode, ff); fuse_put_request(fc, req); return err; -- 2.15.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel