aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Price <[email protected]>2017-02-22 12:05:03 -0500
committerBob Peterson <[email protected]>2017-02-23 10:06:00 -0500
commitf38e5fb95a1f8feda88531eedc98f69b24748712 (patch)
tree941eb63a04a4ce71733273d1db846d501bfccf22
parentc548a1c175608e268f6495f3f82461303584d1c9 (diff)
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: <[email protected]> # 4.3+ Signed-off-by: Andrew Price <[email protected]> Signed-off-by: Andreas Gruenbacher <[email protected]> Signed-off-by: Bob Peterson <[email protected]>
-rw-r--r--fs/gfs2/glock.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 2928f1209b67..d004debe2856 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);
}