Commit 4cf918c8 authored by Andrew Price's avatar Andrew Price Committed by Greg Kroah-Hartman

gfs2: Add missing rcu locking for glock lookup

commit f38e5fb9 upstream.

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.
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>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c8cdd923
...@@ -658,9 +658,11 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -658,9 +658,11 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
struct kmem_cache *cachep; struct kmem_cache *cachep;
int ret, tries = 0; int ret, tries = 0;
rcu_read_lock();
gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms); gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
if (gl && !lockref_get_not_dead(&gl->gl_lockref)) if (gl && !lockref_get_not_dead(&gl->gl_lockref))
gl = NULL; gl = NULL;
rcu_read_unlock();
*glp = gl; *glp = gl;
if (gl) if (gl)
...@@ -728,15 +730,18 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -728,15 +730,18 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
if (ret == -EEXIST) { if (ret == -EEXIST) {
ret = 0; ret = 0;
rcu_read_lock();
tmp = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms); tmp = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
if (tmp == NULL || !lockref_get_not_dead(&tmp->gl_lockref)) { if (tmp == NULL || !lockref_get_not_dead(&tmp->gl_lockref)) {
if (++tries < 100) { if (++tries < 100) {
rcu_read_unlock();
cond_resched(); cond_resched();
goto again; goto again;
} }
tmp = NULL; tmp = NULL;
ret = -ENOMEM; ret = -ENOMEM;
} }
rcu_read_unlock();
} else { } else {
WARN_ON_ONCE(ret); WARN_ON_ONCE(ret);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment