Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d6af6f9 authored by David Howells's avatar David Howells Committed by Greg Kroah-Hartman
Browse files

afs: Fix key refcounting in file locking code



[ Upstream commit 59d49076ae3e6912e6d7df2fd68e2337f3d02036 ]

Fix the refcounting of the authentication keys in the file locking code.
The vnode->lock_key member points to a key on which it expects to be
holding a ref, but it isn't always given an extra ref, however.

Fixes: 0fafdc9f ("afs: Fix file locking")
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent dc4ec1ba
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@ void afs_lock_work(struct work_struct *work)
		/* The new front of the queue now owns the state variables. */
		next = list_entry(vnode->pending_locks.next,
				  struct file_lock, fl_u.afs.link);
		vnode->lock_key = afs_file_key(next->fl_file);
		vnode->lock_key = key_get(afs_file_key(next->fl_file));
		vnode->lock_type = (next->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE;
		vnode->lock_state = AFS_VNODE_LOCK_WAITING_FOR_CB;
		goto again;
@@ -413,7 +413,7 @@ static void afs_dequeue_lock(struct afs_vnode *vnode, struct file_lock *fl)
	/* The new front of the queue now owns the state variables. */
	next = list_entry(vnode->pending_locks.next,
			  struct file_lock, fl_u.afs.link);
	vnode->lock_key = afs_file_key(next->fl_file);
	vnode->lock_key = key_get(afs_file_key(next->fl_file));
	vnode->lock_type = (next->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE;
	vnode->lock_state = AFS_VNODE_LOCK_WAITING_FOR_CB;
	afs_lock_may_be_available(vnode);
+2 −0
Original line number Diff line number Diff line
@@ -542,6 +542,8 @@ void afs_evict_inode(struct inode *inode)
#endif

	afs_put_permits(rcu_access_pointer(vnode->permit_cache));
	key_put(vnode->lock_key);
	vnode->lock_key = NULL;
	_leave("");
}