On 05.06.2018 13:05, Pavel Butsykin wrote: > On 05.06.2018 12:53, Kirill Tkhai wrote: >> On 04.06.2018 16:57, Pavel Butsykin wrote: >>> If setattr request is for a file, FATTR_FH flag should be set. >>> In fuse_flush_mtime() that is clearly missed. >>> >>> This fix is present in commit 1e18bda, but it wasn't backported because >>> the commit has a lot of unrelated changes. So this patch can be safely >>> dropped >>> in case of moving to a newer kernel. >>> >>> #VSTOR-10676 >>> >>> Signed-off-by: Pavel Butsykin <pbutsy...@virtuozzo.com> >>> --- >>> fs/fuse/dir.c | 6 +++++- >>> fs/fuse/file.c | 4 ++-- >>> fs/fuse/fuse_i.h | 2 +- >>> 3 files changed, 8 insertions(+), 4 deletions(-) >>> >>> diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c >>> index 0ae0344be3c5..b04023bf230a 100644 >>> --- a/fs/fuse/dir.c >>> +++ b/fs/fuse/dir.c >>> @@ -1690,7 +1690,7 @@ static void fuse_setattr_fill(struct fuse_conn *fc, >>> struct fuse_req *req, >>> /* >>> * Flush inode->i_mtime to the server >>> */ >>> -int fuse_flush_mtime(struct file *file, bool nofail) >>> +int fuse_flush_mtime(struct file *file, struct fuse_file *ff, bool nofail) >>> { >>> struct inode *inode = file->f_mapping->host; >>> struct fuse_inode *fi = get_fuse_inode(inode); >>> @@ -1715,6 +1715,10 @@ int fuse_flush_mtime(struct file *file, bool nofail) >>> inarg.mtime = inode->i_mtime.tv_sec; >>> inarg.mtimensec = inode->i_mtime.tv_nsec; >>> + if (ff) { >>> + inarg.valid |= FATTR_FH; >>> + inarg.fh = ff->fh; >>> + } >>> fuse_setattr_fill(fc, req, inode, &inarg, &outarg); >>> fuse_request_send(fc, req); >>> err = req->out.h.error; >>> diff --git a/fs/fuse/file.c b/fs/fuse/file.c >>> index 53e81bdca6ed..ddfb41af54ec 100644 >>> --- a/fs/fuse/file.c >>> +++ b/fs/fuse/file.c >>> @@ -458,7 +458,7 @@ static int fuse_release(struct inode *inode, struct >>> file *file) >>> if (test_bit(FUSE_I_MTIME_UPDATED, >>> &get_fuse_inode(inode)->state)) >>> - fuse_flush_mtime(file, true); >>> + fuse_flush_mtime(file, ff, true); >>> fuse_release_common(file, FUSE_RELEASE); >>> @@ -724,7 +724,7 @@ int fuse_fsync_common(struct file *file, loff_t >>> start, loff_t end, >>> if (!datasync && test_bit(FUSE_I_MTIME_UPDATED, >>> &get_fuse_inode(inode)->state)) { >>> - err = fuse_flush_mtime(file, false); >>> + err = fuse_flush_mtime(file, isdir ? NULL : ff, false); >> >> Everything looks OK for me, and the only thing I want to ask you is the >> reason >> we ignore ff in case of directory. Why we should do this? > > Because FATTR_FH flag indicates that request belongs to a file. > Correspondingly, this flag should be set for a directory.
It looks like MS may set this flag for both cases. Let's keep it for file only now, since we have no a real workload to test this (and we don't want to break anything). If someone needs this, we add it for directory too. _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel