This is an addendum for the 4.11 merge window.
Andy Price wrote this patch to close a nasty race condition that allows access to glocks that are being destroyed. Without this patch, GFS2 is vulnerable to random corruption and kernel panic. -----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJYrv8+AAoJENeLYdPf93o7T58H/i3K+awecX1yrCl9qvAvxte+ UJioZd9wnrjHsprFkMMzeVC2rFH5EIm5JKEyl8zGGwIq/oaGtgWlxQsBOvyOnSyx WRvu99XjZTzu3vov7u1kiWmOOvVturdcALPHH6mFdgkCw8d15AHqQdfDvljfWbRp aHFc+x1evptskRTj4D7I6EeWig8v3Sr9qosJ2N8uKtsrcc/xIlh4ItsonlQh3Cz0 Dg83HVN2opHI5CWjRAjTK6zjF6XoEMgsjIOR4HLRVC9XEXiWLd3w+JBnTbFYJt0f k8NMk8oGbmzTC/HteJvnzGuNfSlkk4RAwaCkYo7F9f6hcKsWPECzUdyHn3ubm7M= =uIIs -----END PGP SIGNATURE----- Merge tag 'gfs2-4.11.addendum' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2 Pull GFS2 fix from Bob Peterson: "This is an addendum for the 4.11 merge window. Andy Price wrote this patch to close a nasty race condition that allows access to glocks that are being destroyed. Without this patch, GFS2 is vulnerable to random corruption and kernel panic" * tag 'gfs2-4.11.addendum' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2: gfs2: Add missing rcu locking for glock lookup
This commit is contained in:
commit
15192b0295
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user