|
@@ -1183,7 +1183,7 @@ static void detach_lkb(struct dlm_lkb *lkb)
|
|
|
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)
|
|
@@ -1199,19 +1199,13 @@ static int create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret)
|
|
|
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);
|