diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2021-10-22 17:03:03 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2021-10-28 09:45:33 +0200 |
commit | ec85537519b330a0deb8fe742fd1b0efc40a1710 (patch) | |
tree | fe947b1a9edfc3506846c3698a501f5cd2c6f266 | |
parent | 4b52f059b5ddbb364d35f2bcc3d267a009078db7 (diff) | |
download | linux-ec85537519b330a0deb8fe742fd1b0efc40a1710.tar.gz linux-ec85537519b330a0deb8fe742fd1b0efc40a1710.tar.bz2 linux-ec85537519b330a0deb8fe742fd1b0efc40a1710.zip |
fuse: take cache_mask into account in getattr
When deciding to send a GETATTR request take into account the cache mask
(which attributes are always valid). The cache mask takes precedence over
the invalid mask.
This results in the GETATTR request not being sent unnecessarily.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
-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 4c934627b419..03767bbafb8a 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1021,12 +1021,14 @@ static int fuse_update_get_attr(struct inode *inode, struct file *file, struct fuse_inode *fi = get_fuse_inode(inode); int err = 0; bool sync; + u32 inval_mask = READ_ONCE(fi->inval_mask); + u32 cache_mask = fuse_get_cache_mask(inode); if (flags & AT_STATX_FORCE_SYNC) sync = true; else if (flags & AT_STATX_DONT_SYNC) sync = false; - else if (request_mask & READ_ONCE(fi->inval_mask)) + else if (request_mask & inval_mask & ~cache_mask) sync = true; else sync = time_before64(fi->i_time, get_jiffies_64()); |