From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bob Peterson Date: Fri, 7 Jul 2017 14:55:21 -0400 (EDT) Subject: [Cluster-devel] [PATCH] gfs2: Fix glock rhashtable rcu bug In-Reply-To: <1499450053-16087-1-git-send-email-agruenba@redhat.com> References: <1499450053-16087-1-git-send-email-agruenba@redhat.com> Message-ID: <521092828.29254494.1499453721917.JavaMail.zimbra@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit ----- Original Message ----- | Before commit 88ffbf3e03 "GFS2: Use resizable hash table for glocks", | glocks were freed via call_rcu to allow reading the glock hashtable | locklessly using rcu. This was then changed to free glocks immediately, | which made reading the glock hashtable unsafe. Bring back the original | code for freeing glocks via call_rcu. | | Signed-off-by: Andreas Gruenbacher | Cc: stable at vger.kernel.org # 4.3 | --- | fs/gfs2/glock.c | 11 +++++++++-- | fs/gfs2/incore.h | 1 + | 2 files changed, 10 insertions(+), 2 deletions(-) | | diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c | index 6cd71c5..c38ab6c 100644 | --- a/fs/gfs2/glock.c | +++ b/fs/gfs2/glock.c | @@ -80,9 +80,9 @@ static struct rhashtable_params ht_parms = { | | static struct rhashtable gl_hash_table; | | -void gfs2_glock_free(struct gfs2_glock *gl) | +static void gfs2_glock_dealloc(struct rcu_head *rcu) | { | - struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; | + struct gfs2_glock *gl = container_of(rcu, struct gfs2_glock, gl_rcu); | | if (gl->gl_ops->go_flags & GLOF_ASPACE) { | kmem_cache_free(gfs2_glock_aspace_cachep, gl); | @@ -90,6 +90,13 @@ void gfs2_glock_free(struct gfs2_glock *gl) | kfree(gl->gl_lksb.sb_lvbptr); | kmem_cache_free(gfs2_glock_cachep, gl); | } | +} | + | +void gfs2_glock_free(struct gfs2_glock *gl) | +{ | + struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; | + | + call_rcu(&gl->gl_rcu, gfs2_glock_dealloc); | if (atomic_dec_and_test(&sdp->sd_glock_disposal)) | wake_up(&sdp->sd_glock_wait); | } | diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h | index 790e739..73fce76 100644 | --- a/fs/gfs2/incore.h | +++ b/fs/gfs2/incore.h | @@ -373,6 +373,7 @@ struct gfs2_glock { | loff_t end; | } gl_vm; | }; | + struct rcu_head gl_rcu; | struct rhash_head gl_node; | }; | | -- | 2.7.5 Hi, Thanks. This is now applied to the for-next branch of the linux-gfs2 tree: https://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2.git/commit/fs/gfs2?h=for-next&id=961ae1d83d055a4b9ebbfb4cc8ca62ec1a7a3b74 Next time, please cc cluster-devel. This is important enough that I'm going to tag it and ask to merge it right away. Regards, Bob Peterson Red Hat File Systems