diff options
Diffstat (limited to 'fs/gfs2/lock_dlm.c')
| -rw-r--r-- | fs/gfs2/lock_dlm.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index 46df988323b..0e5e0e7022e 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c @@ -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;  	}  |