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: <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>
这个提交包含在:
@@ -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);
|
||||
}
|
||||
|
在新工单中引用
屏蔽一个用户