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

Commit 15192b02 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
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);
	}