Commit 15192b02 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'gfs2-4.11.addendum' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2

Pull GFS2 fix from Bob Peterson:
 "This is an addendum for the 4.11 merge window.

  Andy Price wrote this patch to close a nasty race condition that
  allows access to glocks that are being destroyed. Without this patch,
  GFS2 is vulnerable to random corruption and kernel panic"

* tag 'gfs2-4.11.addendum' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2:
  gfs2: Add missing rcu locking for glock	lookup
parents 28cbc335 f38e5fb9
...@@ -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