mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 04:48:04 +09:00
fuse: update attr_version counter on fuse_notify_inval_inode()
[ Upstream commit 5ddd9ced9a ]
A GETATTR request can race with FUSE_NOTIFY_INVAL_INODE, resulting in the
attribute cache being updated with stale information after the
invalidation.
Fix this by bumping the attribute version in fuse_reverse_inval_inode().
Reported-by: Krzysztof Rusek <rusek@9livesdata.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e431e923c8
commit
89e6cf1c0a
@@ -323,6 +323,8 @@ struct inode *fuse_iget(struct super_block *sb, u64 nodeid,
|
||||
int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,
|
||||
loff_t offset, loff_t len)
|
||||
{
|
||||
struct fuse_conn *fc = get_fuse_conn_super(sb);
|
||||
struct fuse_inode *fi;
|
||||
struct inode *inode;
|
||||
pgoff_t pg_start;
|
||||
pgoff_t pg_end;
|
||||
@@ -331,6 +333,11 @@ int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,
|
||||
if (!inode)
|
||||
return -ENOENT;
|
||||
|
||||
fi = get_fuse_inode(inode);
|
||||
spin_lock(&fi->lock);
|
||||
fi->attr_version = atomic64_inc_return(&fc->attr_version);
|
||||
spin_unlock(&fi->lock);
|
||||
|
||||
fuse_invalidate_attr(inode);
|
||||
forget_all_cached_acls(inode);
|
||||
if (offset >= 0) {
|
||||
|
||||
Reference in New Issue
Block a user