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

Commit f38e5fb9 authored by Andrew Price's avatar Andrew Price Committed by Bob Peterson
Browse files

gfs2: Add missing rcu locking for glock lookup



We must hold the rcu read lock across looking up glocks and trying to
bump their refcount to prevent the glocks from being freed in between.

Cc: <stable@vger.kernel.org> # 4.3+
Signed-off-by: default avatarAndrew Price <anprice@redhat.com>
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
parent c548a1c1
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -658,9 +658,11 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
	struct kmem_cache *cachep;
	int ret, tries = 0;

	rcu_read_lock();
	gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
	if (gl && !lockref_get_not_dead(&gl->gl_lockref))
		gl = NULL;
	rcu_read_unlock();

	*glp = gl;
	if (gl)
@@ -728,15 +730,18 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,

	if (ret == -EEXIST) {
		ret = 0;
		rcu_read_lock();
		tmp = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
		if (tmp == NULL || !lockref_get_not_dead(&tmp->gl_lockref)) {
			if (++tries < 100) {
				rcu_read_unlock();
				cond_resched();
				goto again;
			}
			tmp = NULL;
			ret = -ENOMEM;
		}
		rcu_read_unlock();
	} else {
		WARN_ON_ONCE(ret);
	}