I checked out the latest cvs and noticed my patch to fix the referencing of freed memory is not included. Here is the patch again. Please let me know how to get this patch into the cvs tree. Thanks, Daniel Looking through the code, I found when that a call to queue_ast(lkb, AST_COMP | AST_DEL, 0); will lead to process_asts() which will free the dlm_rsb. So there is a race where the rsb can be freed BEFORE we do the up_write(rsb->res_lock); The fix is simple, do the up_write() before the queue_ast(). --- cluster.orig/dlm-kernel/src/locking.c 2004-12-09 15:23:13.789834384 -0800 +++ cluster/dlm-kernel/src/locking.c 2004-12-09 15:24:51.809742940 -0800 @@ -687,8 +687,13 @@ void dlm_lock_stage3(struct dlm_lkb *lkb lkb->lkb_retstatus = -EAGAIN; if (lkb->lkb_lockqueue_flags & DLM_LKF_NOQUEUEBAST) send_blocking_asts_all(rsb, lkb); + /* + * up the res_lock before queueing ast, since the AST_DEL will + * cause the rsb to be released and that can happen anytime. + */ + up_write(&rsb->res_lock); queue_ast(lkb, AST_COMP | AST_DEL, 0); - goto out; + return; } /* @@ -888,7 +893,13 @@ int dlm_unlock_stage2(struct dlm_lkb *lk lkb->lkb_retstatus = flags & DLM_LKF_CANCEL ? -DLM_ECANCEL:-DLM_EUNLOCK; if (!remote) { + /* + * up the res_lock before queueing ast, since the AST_DEL will + * cause the rsb to be released and that can happen anytime. + */ + up_write(&rsb->res_lock); queue_ast(lkb, AST_COMP | AST_DEL, 0); + goto out2; } else { up_write(&rsb->res_lock); release_lkb(rsb->res_ls, lkb);