Commit 5ddd9ced authored by Miklos Szeredi's avatar Miklos Szeredi
Browse files

fuse: update attr_version counter on fuse_notify_inval_inode()



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: default avatarKrzysztof Rusek <rusek@9livesdata.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 32f98877
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -321,6 +321,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;
@@ -329,6 +331,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) {