diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2018-10-15 15:43:06 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2018-10-15 15:43:06 +0200 |
commit | 802dc0497be2b538ca4300704b45b59bffe29585 (patch) | |
tree | d93976a0f3c7162eeb80933eab2c9b906fb5c57a /fs/fuse | |
parent | fuse: allow fine grained attr cache invaldation (diff) | |
download | linux-802dc0497be2b538ca4300704b45b59bffe29585.tar.xz linux-802dc0497be2b538ca4300704b45b59bffe29585.zip |
fuse: don't need GETATTR after every READ
If 'auto_inval_data' mode is active, then fuse_file_read_iter() will call
fuse_update_attributes(), which will check the attribute validity and send
a GETATTR request if some of the attributes are no longer valid. The page
cache is then invalidated if the size or mtime have changed.
Then, if a READ request was sent and reply received (which is the case if
the data wasn't cached yet, or if the file is opened for O_DIRECT), the
atime attribute is invalidated.
This will result in the next read() also triggering a GETATTR, ...
This can be fixed by only sending GETATTR if the mode or size are invalid,
we don't need to do a refresh if only atime is invalid.
More generally, none of the callers of fuse_update_attributes() need an
up-to-date atime value, so for now just remove STATX_ATIME from the request
mask when attributes are updated for internal use.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/fuse')
-rw-r--r-- | fs/fuse/dir.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 2b6fc2b35649..7b8f63e7489f 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -952,7 +952,9 @@ static int fuse_update_get_attr(struct inode *inode, struct file *file, int fuse_update_attributes(struct inode *inode, struct file *file) { - return fuse_update_get_attr(inode, file, NULL, STATX_BASIC_STATS, 0); + /* Do *not* need to get atime for internal purposes */ + return fuse_update_get_attr(inode, file, NULL, + STATX_BASIC_STATS & ~STATX_ATIME, 0); } int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid, |