Beispiel #1
0
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);

    if (gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID)
        memset(gl->gl_lvb, 0, GDLM_LVB_SIZE);

    switch (gl->gl_lksb.sb_status) {
    case -DLM_EUNLOCK: /* Unlocked, so glock can be freed */
        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;
        goto out;
    case -EAGAIN: /* Try lock fails */
        goto out;
    case -EINVAL: /* Invalid */
    case -ENOMEM: /* Out of memory */
        ret |= LM_OUT_ERROR;
        goto out;
    case 0: /* Success */
        break;
    default: /* Something unexpected */
        BUG();
    }

    ret = gl->gl_req;
    if (gl->gl_lksb.sb_flags & DLM_SBF_ALTMODE) {
        if (gl->gl_req == LM_ST_SHARED)
            ret = LM_ST_DEFERRED;
        else if (gl->gl_req == LM_ST_DEFERRED)
            ret = LM_ST_SHARED;
        else
            BUG();
    }

    set_bit(GLF_INITIAL, &gl->gl_flags);
    gfs2_glock_complete(gl, ret);
    return;
out:
    if (!test_bit(GLF_INITIAL, &gl->gl_flags))
        gl->gl_lksb.sb_lkid = 0;
    gfs2_glock_complete(gl, ret);
}
static void gdlm_ast(void *arg)
{
	struct gfs2_glock *gl = arg;
	unsigned ret = gl->gl_state;

	gfs2_update_reply_times(gl);
	BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);

	if ((gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID) && gl->gl_lksb.sb_lvbptr)
		memset(gl->gl_lksb.sb_lvbptr, 0, GDLM_LVB_SIZE);

	switch (gl->gl_lksb.sb_status) {
	case -DLM_EUNLOCK: /* Unlocked, so glock can be freed */
		gfs2_glock_free(gl);
		return;
	case -DLM_ECANCEL: /* Cancel while getting lock */
		ret |= LM_OUT_CANCELED;
		goto out;
	case -EAGAIN: /* Try lock fails */
	case -EDEADLK: /* Deadlock detected */
		goto out;
	case -ETIMEDOUT: /* Canceled due to timeout */
		ret |= LM_OUT_ERROR;
		goto out;
	case 0: /* Success */
		break;
	default: /* Something unexpected */
		BUG();
	}

	ret = gl->gl_req;
	if (gl->gl_lksb.sb_flags & DLM_SBF_ALTMODE) {
		if (gl->gl_req == LM_ST_SHARED)
			ret = LM_ST_DEFERRED;
		else if (gl->gl_req == LM_ST_DEFERRED)
			ret = LM_ST_SHARED;
		else
			BUG();
	}

	set_bit(GLF_INITIAL, &gl->gl_flags);
	gfs2_glock_complete(gl, ret);
	return;
out:
	if (!test_bit(GLF_INITIAL, &gl->gl_flags))
		gl->gl_lksb.sb_lkid = 0;
	gfs2_glock_complete(gl, ret);
}
static void gdlm_ast(void *arg)
{
	struct gfs2_glock *gl = arg;
	unsigned ret = gl->gl_state;

	gfs2_update_reply_times(gl);
	BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);

	if (gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID)
		memset(gl->gl_lvb, 0, GDLM_LVB_SIZE);

	switch (gl->gl_lksb.sb_status) {
	case -DLM_EUNLOCK: 
		gfs2_glock_free(gl);
		return;
	case -DLM_ECANCEL: 
		ret |= LM_OUT_CANCELED;
		goto out;
	case -EAGAIN: 
	case -EDEADLK: 
		goto out;
	case -ETIMEDOUT: 
		ret |= LM_OUT_ERROR;
		goto out;
	case 0: 
		break;
	default: 
		BUG();
	}

	ret = gl->gl_req;
	if (gl->gl_lksb.sb_flags & DLM_SBF_ALTMODE) {
		if (gl->gl_req == LM_ST_SHARED)
			ret = LM_ST_DEFERRED;
		else if (gl->gl_req == LM_ST_DEFERRED)
			ret = LM_ST_SHARED;
		else
			BUG();
	}

	set_bit(GLF_INITIAL, &gl->gl_flags);
	gfs2_glock_complete(gl, ret);
	return;
out:
	if (!test_bit(GLF_INITIAL, &gl->gl_flags))
		gl->gl_lksb.sb_lkid = 0;
	gfs2_glock_complete(gl, ret);
}