]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/gfs2/lock_dlm.c
Merge remote branch 'korg/drm-radeon-testing' into drm-next-stage
[mv-sheeva.git] / fs / gfs2 / lock_dlm.c
index 46df988323bc035285d5663429588038df6d6b9c..0e5e0e7022e59a0552987644d1a8953e3dc476c0 100644 (file)
@@ -21,6 +21,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);
 
@@ -30,6 +31,8 @@ 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 (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;
@@ -164,14 +167,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;
        }