aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-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 14cbf60167a7..133f322573b5 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,
658 struct kmem_cache *cachep; 658 struct kmem_cache *cachep;
659 int ret, tries = 0; 659 int ret, tries = 0;
660 660
661 rcu_read_lock();
661 gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms); 662 gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
662 if (gl && !lockref_get_not_dead(&gl->gl_lockref)) 663 if (gl && !lockref_get_not_dead(&gl->gl_lockref))
663 gl = NULL; 664 gl = NULL;
665 rcu_read_unlock();
664 666
665 *glp = gl; 667 *glp = gl;
666 if (gl) 668 if (gl)
@@ -728,15 +730,18 @@ again:
728 730
729 if (ret == -EEXIST) { 731 if (ret == -EEXIST) {
730 ret = 0; 732 ret = 0;
733 rcu_read_lock();
731 tmp = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms); 734 tmp = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
732 if (tmp == NULL || !lockref_get_not_dead(&tmp->gl_lockref)) { 735 if (tmp == NULL || !lockref_get_not_dead(&tmp->gl_lockref)) {
733 if (++tries < 100) { 736 if (++tries < 100) {
737 rcu_read_unlock();
734 cond_resched(); 738 cond_resched();
735 goto again; 739 goto again;
736 } 740 }
737 tmp = NULL; 741 tmp = NULL;
738 ret = -ENOMEM; 742 ret = -ENOMEM;
739 } 743 }
744 rcu_read_unlock();
740 } else { 745 } else {
741 WARN_ON_ONCE(ret); 746 WARN_ON_ONCE(ret);
742 } 747 }