| From ac8323ee916445efe422b26e29142f711f1c1821 Mon Sep 17 00:00:00 2001 |
| From: Andrew Price <anprice@redhat.com> |
| Date: Wed, 22 Feb 2017 12:05:03 -0500 |
| Subject: [PATCH] gfs2: Add missing rcu locking for glock lookup |
| |
| commit f38e5fb95a1f8feda88531eedc98f69b24748712 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. |
| |
| Cc: <stable@vger.kernel.org> # 4.3+ |
| Signed-off-by: Andrew Price <anprice@redhat.com> |
| Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> |
| Signed-off-by: Bob Peterson <rpeterso@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c |
| index 3a90b2b5b9bb..253e1f956ffe 100644 |
| --- a/fs/gfs2/glock.c |
| +++ b/fs/gfs2/glock.c |
| @@ -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 @@ again: |
| |
| 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); |
| } |
| -- |
| 2.12.0 |
| |