lp->cur = DLM_LOCK_IV;
        lp->lvb = NULL;
        lp->hold_null = NULL;
-       init_completion(&lp->ast_wait);
        INIT_LIST_HEAD(&lp->clist);
        INIT_LIST_HEAD(&lp->blist);
        INIT_LIST_HEAD(&lp->delay_list);
        lp->lksb.sb_lvbptr = NULL;
 }
 
+static int gdlm_ast_wait(void *word)
+{
+       schedule();
+       return 0;
+}
+
 /* This can do a synchronous dlm request (requiring a lock_dlm thread to get
    the completion) because gfs won't call hold_lvb() during a callback (from
    the context of a lock_dlm thread). */
        lpn->lkf = DLM_LKF_VALBLK | DLM_LKF_EXPEDITE;
        set_bit(LFL_NOBAST, &lpn->flags);
        set_bit(LFL_INLOCK, &lpn->flags);
+       set_bit(LFL_AST_WAIT, &lpn->flags);
 
-       init_completion(&lpn->ast_wait);
        gdlm_do_lock(lpn);
-       wait_for_completion(&lpn->ast_wait);
+       wait_on_bit(&lpn->flags, LFL_AST_WAIT, gdlm_ast_wait, TASK_UNINTERRUPTIBLE);
        error = lpn->lksb.sb_status;
        if (error) {
                printk(KERN_INFO "lock_dlm: hold_null_lock dlm error %d\n",
 
        LFL_NOBAST              = 10,
        LFL_HEADQUE             = 11,
        LFL_UNLOCK_DELETE       = 12,
+       LFL_AST_WAIT            = 13,
 };
 
 struct gdlm_lock {
        unsigned long           flags;          /* lock_dlm flags LFL_ */
 
        int                     bast_mode;      /* protected by async_lock */
-       struct completion       ast_wait;
 
        struct list_head        clist;          /* complete */
        struct list_head        blist;          /* blocking */
 
        ls->fscb(ls->sdp, cb, &lp->lockname);
 }
 
+static void wake_up_ast(struct gdlm_lock *lp)
+{
+       clear_bit(LFL_AST_WAIT, &lp->flags);
+       smp_mb__after_clear_bit();
+       wake_up_bit(&lp->flags, LFL_AST_WAIT);
+}
+
 static void process_complete(struct gdlm_lock *lp)
 {
        struct gdlm_ls *ls = lp->ls;
         */
 
        if (test_and_clear_bit(LFL_SYNC_LVB, &lp->flags)) {
-               complete(&lp->ast_wait);
+               wake_up_ast(lp);
                return;
        }
 
        if (test_bit(LFL_INLOCK, &lp->flags)) {
                clear_bit(LFL_NOBLOCK, &lp->flags);
                lp->cur = lp->req;
-               complete(&lp->ast_wait);
+               wake_up_ast(lp);
                return;
        }