drm/nouveau: off by one in init_i2c_device_find()
[safe/jmp/linux-2.6] / fs / gfs2 / lock_dlm.c
index a0bb7d2..0e0470e 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <linux/fs.h>
 #include <linux/dlm.h>
+#include <linux/slab.h>
 #include <linux/types.h>
 #include <linux/gfs2_ondisk.h>
 
@@ -21,6 +22,7 @@ static void gdlm_ast(void *arg)
 {
        struct gfs2_glock *gl = arg;
        unsigned ret = gl->gl_state;
+       struct gfs2_sbd *sdp = gl->gl_sbd;
 
        BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);
 
@@ -29,7 +31,12 @@ static void gdlm_ast(void *arg)
 
        switch (gl->gl_lksb.sb_status) {
        case -DLM_EUNLOCK: /* Unlocked, so glock can be freed */
-               kmem_cache_free(gfs2_glock_cachep, gl);
+               if (gl->gl_ops->go_flags & GLOF_ASPACE)
+                       kmem_cache_free(gfs2_glock_aspace_cachep, gl);
+               else
+                       kmem_cache_free(gfs2_glock_cachep, gl);
+               if (atomic_dec_and_test(&sdp->sd_glock_disposal))
+                       wake_up(&sdp->sd_glock_wait);
                return;
        case -DLM_ECANCEL: /* Cancel while getting lock */
                ret |= LM_OUT_CANCELED;
@@ -46,11 +53,11 @@ static void gdlm_ast(void *arg)
                BUG();
        }
 
-       ret = gl->gl_target;
+       ret = gl->gl_req;
        if (gl->gl_lksb.sb_flags & DLM_SBF_ALTMODE) {
-               if (gl->gl_target == LM_ST_SHARED)
+               if (gl->gl_req == LM_ST_SHARED)
                        ret = LM_ST_DEFERRED;
-               else if (gl->gl_target == LM_ST_DEFERRED)
+               else if (gl->gl_req == LM_ST_DEFERRED)
                        ret = LM_ST_SHARED;
                else
                        BUG();
@@ -147,6 +154,7 @@ static unsigned int gdlm_lock(struct gfs2_glock *gl,
        int req;
        u32 lkf;
 
+       gl->gl_req = req_state;
        req = make_mode(req_state);
        lkf = make_flags(gl->gl_lksb.sb_lkid, flags, req);
 
@@ -163,14 +171,16 @@ static unsigned int gdlm_lock(struct gfs2_glock *gl,
        return LM_OUT_ASYNC;
 }
 
-static void gdlm_put_lock(struct kmem_cache *cachep, void *ptr)
+static void gdlm_put_lock(struct kmem_cache *cachep, struct gfs2_glock *gl)
 {
-       struct gfs2_glock *gl = ptr;
-       struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct;
+       struct gfs2_sbd *sdp = gl->gl_sbd;
+       struct lm_lockstruct *ls = &sdp->sd_lockstruct;
        int error;
 
        if (gl->gl_lksb.sb_lkid == 0) {
                kmem_cache_free(cachep, gl);
+               if (atomic_dec_and_test(&sdp->sd_glock_disposal))
+                       wake_up(&sdp->sd_glock_wait);
                return;
        }