ALSA: hda: Initialize power_state field properly
[platform/kernel/linux-rpi.git] / fs / gfs2 / glock.c
index 4614ee2..ccdd8c8 100644 (file)
@@ -107,7 +107,7 @@ static int glock_wake_function(wait_queue_entry_t *wait, unsigned int mode,
 
 static wait_queue_head_t *glock_waitqueue(struct lm_lockname *name)
 {
-       u32 hash = jhash2((u32 *)name, sizeof(*name) / 4, 0);
+       u32 hash = jhash2((u32 *)name, ht_parms.key_len / 4, 0);
 
        return glock_wait_table + hash_32(hash, GLOCK_WAIT_TABLE_BITS);
 }
@@ -140,6 +140,7 @@ void gfs2_glock_free(struct gfs2_glock *gl)
 {
        struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
 
+       BUG_ON(atomic_read(&gl->gl_revokes));
        rhashtable_remove_fast(&gl_hash_table, &gl->gl_node, ht_parms);
        smp_mb();
        wake_up_glock(gl);
@@ -183,15 +184,19 @@ static int demote_ok(const struct gfs2_glock *gl)
 
 void gfs2_glock_add_to_lru(struct gfs2_glock *gl)
 {
+       if (!(gl->gl_ops->go_flags & GLOF_LRU))
+               return;
+
        spin_lock(&lru_lock);
 
-       if (!list_empty(&gl->gl_lru))
-               list_del_init(&gl->gl_lru);
-       else
+       list_del(&gl->gl_lru);
+       list_add_tail(&gl->gl_lru, &lru_list);
+
+       if (!test_bit(GLF_LRU, &gl->gl_flags)) {
+               set_bit(GLF_LRU, &gl->gl_flags);
                atomic_inc(&lru_count);
+       }
 
-       list_add_tail(&gl->gl_lru, &lru_list);
-       set_bit(GLF_LRU, &gl->gl_flags);
        spin_unlock(&lru_lock);
 }
 
@@ -201,7 +206,7 @@ static void gfs2_glock_remove_from_lru(struct gfs2_glock *gl)
                return;
 
        spin_lock(&lru_lock);
-       if (!list_empty(&gl->gl_lru)) {
+       if (test_bit(GLF_LRU, &gl->gl_flags)) {
                list_del_init(&gl->gl_lru);
                atomic_dec(&lru_count);
                clear_bit(GLF_LRU, &gl->gl_flags);
@@ -1158,8 +1163,7 @@ void gfs2_glock_dq(struct gfs2_holder *gh)
                    !test_bit(GLF_DEMOTE, &gl->gl_flags))
                        fast_path = 1;
        }
-       if (!test_bit(GLF_LFLUSH, &gl->gl_flags) && demote_ok(gl) &&
-           (glops->go_flags & GLOF_LRU))
+       if (!test_bit(GLF_LFLUSH, &gl->gl_flags) && demote_ok(gl))
                gfs2_glock_add_to_lru(gl);
 
        trace_gfs2_glock_queue(gh, 0);
@@ -1455,6 +1459,7 @@ __acquires(&lru_lock)
                if (!spin_trylock(&gl->gl_lockref.lock)) {
 add_back_to_lru:
                        list_add(&gl->gl_lru, &lru_list);
+                       set_bit(GLF_LRU, &gl->gl_flags);
                        atomic_inc(&lru_count);
                        continue;
                }
@@ -1462,7 +1467,6 @@ add_back_to_lru:
                        spin_unlock(&gl->gl_lockref.lock);
                        goto add_back_to_lru;
                }
-               clear_bit(GLF_LRU, &gl->gl_flags);
                gl->gl_lockref.count++;
                if (demote_ok(gl))
                        handle_callback(gl, LM_ST_UNLOCKED, 0, false);
@@ -1497,6 +1501,7 @@ static long gfs2_scan_glock_lru(int nr)
                if (!test_bit(GLF_LOCK, &gl->gl_flags)) {
                        list_move(&gl->gl_lru, &dispose);
                        atomic_dec(&lru_count);
+                       clear_bit(GLF_LRU, &gl->gl_flags);
                        freed++;
                        continue;
                }