On 2023/8/23 17:01, Miklos Szeredi wrote:
On Tue, 11 Jul 2023 at 06:36, Jiachen Zhang
<zhangjiachen.jaycee@xxxxxxxxxxxxx> wrote:
Add FOPEN_INVAL_ATTR so that the fuse daemon can ask kernel to invalidate
the attr cache on file open.
The fi->attr_version should be increased when handling FOPEN_INVAL_ATTR.
Because if a FUSE request returning attributes (getattr, setattr, lookup,
and readdirplus) starts before a FUSE_OPEN replying FOPEN_INVAL_ATTR, but
finishes after the FUSE_OPEN, staled attributes will be set to the inode
and falsely clears the inval_mask.
Signed-off-by: Jiachen Zhang <zhangjiachen.jaycee@xxxxxxxxxxxxx>
---
fs/fuse/file.c | 10 ++++++++++
include/uapi/linux/fuse.h | 2 ++
2 files changed, 12 insertions(+)
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index de37a3a06a71..412824a11b7b 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -215,6 +215,16 @@ void fuse_finish_open(struct inode *inode, struct file *file)
file_update_time(file);
fuse_invalidate_attr_mask(inode, FUSE_STATX_MODSIZE);
}
+
+ if (ff->open_flags & FOPEN_INVAL_ATTR) {
+ struct fuse_inode *fi = get_fuse_inode(inode);
+
+ spin_lock(&fi->lock);
+ fi->attr_version = atomic64_inc_return(&fc->attr_version);
No need to add locking or change fi->attr_version. This will be done
next time the attributes are updated.
Thanks,
Miklos
Hi Miklos,
Thanks for the review! As said in the commit message, increasing the
attr version here is to prevent the attr updated by staled operations.
If such cases happen, inval_mask will be falsely cleared, and
FOPEN_INVAL_ATTR takes no effect from the user's point of view.
The increasing of attr_version here can also be explained as the
attr has been updated from the server side.
Thanks,
Jiachen