static int create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret)
 {
        struct dlm_lkb *lkb;
-       int rv, id;
+       int rv;
 
        lkb = dlm_allocate_lkb(ls);
        if (!lkb)
        mutex_init(&lkb->lkb_cb_mutex);
        INIT_WORK(&lkb->lkb_cb_work, dlm_callback_work);
 
- retry:
-       rv = idr_pre_get(&ls->ls_lkbidr, GFP_NOFS);
-       if (!rv)
-               return -ENOMEM;
-
+       idr_preload(GFP_NOFS);
        spin_lock(&ls->ls_lkbidr_spin);
-       rv = idr_get_new_above(&ls->ls_lkbidr, lkb, 1, &id);
-       if (!rv)
-               lkb->lkb_id = id;
+       rv = idr_alloc(&ls->ls_lkbidr, lkb, 1, 0, GFP_NOWAIT);
+       if (rv >= 0)
+               lkb->lkb_id = rv;
        spin_unlock(&ls->ls_lkbidr_spin);
-
-       if (rv == -EAGAIN)
-               goto retry;
+       idr_preload_end();
 
        if (rv < 0) {
                log_error(ls, "create_lkb idr error %d", rv);
 
 static int recover_idr_add(struct dlm_rsb *r)
 {
        struct dlm_ls *ls = r->res_ls;
-       int rv, id;
-
-       rv = idr_pre_get(&ls->ls_recover_idr, GFP_NOFS);
-       if (!rv)
-               return -ENOMEM;
+       int rv;
 
+       idr_preload(GFP_NOFS);
        spin_lock(&ls->ls_recover_idr_lock);
        if (r->res_id) {
-               spin_unlock(&ls->ls_recover_idr_lock);
-               return -1;
-       }
-       rv = idr_get_new_above(&ls->ls_recover_idr, r, 1, &id);
-       if (rv) {
-               spin_unlock(&ls->ls_recover_idr_lock);
-               return rv;
+               rv = -1;
+               goto out_unlock;
        }
-       r->res_id = id;
+       rv = idr_alloc(&ls->ls_recover_idr, r, 1, 0, GFP_NOWAIT);
+       if (rv < 0)
+               goto out_unlock;
+
+       r->res_id = rv;
        ls->ls_recover_list_count++;
        dlm_hold_rsb(r);
+       rv = 0;
+out_unlock:
        spin_unlock(&ls->ls_recover_idr_lock);
-       return 0;
+       idr_preload_end();
+       return rv;
 }
 
 static void recover_idr_del(struct dlm_rsb *r)