Bob, [sorry for the empty previous reply ...]
2015-07-09 20:25 GMT+02:00 Bob Peterson <rpete...@redhat.com>: > @@ -1460,31 +1421,24 @@ static struct shrinker glock_shrinker = { > * > */ > > -static void examine_bucket(glock_examiner examiner, const struct gfs2_sbd > *sdp, > - unsigned int hash) > +static void glock_hash_walk(glock_examiner examiner, const struct gfs2_sbd > *sdp) > { > struct gfs2_glock *gl; > - struct hlist_bl_head *head = &gl_hash_table[hash]; > - struct hlist_bl_node *pos; > + struct rhash_head *pos, *next; > + const struct bucket_table *tbl; > + int i; > > - rcu_read_lock(); > - hlist_bl_for_each_entry_rcu(gl, pos, head, gl_list) { > - if ((gl->gl_name.ln_sbd == sdp) && > lockref_get_not_dead(&gl->gl_lockref)) > - examiner(gl); > + tbl = rht_dereference_rcu(gl_hash_table.tbl, &gl_hash_table); > + for (i = 0; i < tbl->size; i++) { > + rht_for_each_entry_safe(gl, pos, next, tbl, i, gl_node) { > + if ((gl->gl_name.ln_sbd == sdp) && > + lockref_get_not_dead(&gl->gl_lockref)) > + examiner(gl); > + } > } > - rcu_read_unlock(); > cond_resched(); > } > > -static void glock_hash_walk(glock_examiner examiner, const struct gfs2_sbd > *sdp) > -{ > - unsigned x; > - > - for (x = 0; x < GFS2_GL_HASH_SIZE; x++) > - examine_bucket(examiner, sdp, x); > -} > - > - > /** > * thaw_glock - thaw out a glock which has an unprocessed reply waiting > * @gl: The glock to thaw I don't think we can drop the rcu read lock in glock_hash_walk(): That "lock" prevents a concurrent hash table resize from freeing the bucket table under us. Thanks, Andreas