- struct glock_plug plug;
- struct list_head *tmp;
- struct gfs2_glock *gl;
- int entries;
-
- /* Add "plug" to end of bucket list, work back up list from there */
- memset(&plug.gl_flags, 0, sizeof(unsigned long));
- set_bit(GLF_PLUG, &plug.gl_flags);
-
- write_lock(gl_lock_addr(hash));
- list_add(&plug.gl_list, &gl_hash_table[hash].hb_list);
- write_unlock(gl_lock_addr(hash));
-
- for (;;) {
- write_lock(gl_lock_addr(hash));
-
- for (;;) {
- tmp = plug.gl_list.next;
-
- if (tmp == &gl_hash_table[hash].hb_list) {
- list_del(&plug.gl_list);
- entries = !list_empty(&gl_hash_table[hash].hb_list);
- write_unlock(gl_lock_addr(hash));
- return entries;
- }
- gl = list_entry(tmp, struct gfs2_glock, gl_list);
-
- /* Move plug up list */
- list_move(&plug.gl_list, &gl->gl_list);
+ struct gfs2_glock *gl, *prev = NULL;
+ int has_entries = 0;
+ struct hlist_head *head = &gl_hash_table[hash].hb_list;