From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Wed, 22 Feb 2017 15:13:32 +0000 Subject: [Cluster-devel] [PATCH] gfs2: Add missing rcu locking for glock lookup In-Reply-To: <1487776193-18506-1-git-send-email-agruenba@redhat.com> References: <1487776193-18506-1-git-send-email-agruenba@redhat.com> Message-ID: List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Looks good, but can we fix that "retry for 100 times" loop too at the same time? There does appear to be an rhashtable API function that does what we need there, Steve. On 22/02/17 15:09, Andreas Gruenbacher wrote: > From: Andrew Price > > 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. > > Signed-off-by: Andreas Gruenbacher > --- > fs/gfs2/glock.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c > index 94f50ca..1d60f5f 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 @@ 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); > }