[Devel] [PATCH] fs/fuse: set FATTR_FH flag on mtime file flush
Kirill Tkhai
ktkhai at virtuozzo.com
Tue Jun 5 13:28:43 MSK 2018
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 <pbutsykin at 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.
More information about the Devel
mailing list