Patch "gfs2: Use rhashtable walk interface in glock_hash_walk" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
gfs2: Use rhashtable walk interface in glock_hash_walk
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
gfs2-use-rhashtable-walk-interface-in-glock_hash_walk.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Jun 15 09:31:48 CEST 2017
From: Herbert Xu <[email protected]>
Date: Tue, 23 May 2017 21:53:36 -0400
Subject: gfs2: Use rhashtable walk interface in glock_hash_walk
From: Herbert Xu <[email protected]>
[ Upstream commit 6a25478077d987edc5e2f880590a2bc5fcab4441 ]
The function glock_hash_walk walks the rhashtable by hand. This is broken because if it catches the hash table in the middle of a rehash, then it will miss entries.
This patch replaces the manual walk by using the rhashtable walk interface.
--- fs/gfs2/glock.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-)
fs/gfs2/glock.c +18 -12
@@ -1425,26 +1425,32 @@ static struct shrinker glock_shrinker =* @sdp: the filesystem * @bucket: the bucket * +* Note that the function can be called multiple times on the same +* object. So the user must ensure that the function can cope with +* that. */ static void glock_hash_walk (glock_examiner examiner,const struct gfs2_sbd *sdp) {struct gfs2_glock *gl; -struct rhash_head *pos; -const struct bucket_table *tbl; -int i; - -rcu_read_lock (); - tbl =rht_dereference_rcu (gl_hash_table.tbl, &gl_hash_table); -for (i =0 ; i < tbl->size; i++) { -rht_for_each_entry_rcu (gl, pos, tbl, i, gl_node) { +struct rhashtable_iter iter; + +rhashtable_walk_enter (&gl_hash_table, &iter); + +do { + gl =ERR_PTR (rhashtable_walk_start (&iter)); +if (gl) +continue ; + +while ((gl =rhashtable_walk_next (&iter)) && !IS_ERR (gl))if ((gl->gl_name.ln_sbd == sdp) &&lockref_get_not_dead (&gl->gl_lockref))examiner (gl); - } - } -rcu_read_unlock (); -cond_resched (); + +rhashtable_walk_stop (&iter); + }while (cond_resched (), gl ==ERR_PTR (-EAGAIN )); + +rhashtable_walk_exit (&iter); }/**
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/gfs2-use-rhashtable-walk-interface-in-glock_hash_walk.patch queue-4.9/tipc-fix-tipc_sk_reinit-race-conditions.patch