INIT_LIST_HEAD(&ls->ls_recover_list);
spin_lock_init(&ls->ls_recover_list_lock);
- idr_init(&ls->ls_recover_idr);
- spin_lock_init(&ls->ls_recover_idr_lock);
+ xa_init_flags(&ls->ls_recover_array, XA_FLAGS_ALLOC1);
ls->ls_recover_list_count = 0;
ls->ls_local_handle = ls;
init_waitqueue_head(&ls->ls_wait_general);
spin_lock(&lslist_lock);
list_del(&ls->ls_list);
spin_unlock(&lslist_lock);
- idr_destroy(&ls->ls_recover_idr);
kfree(ls->ls_recover_buf);
out_rsbtbl:
for (i = 0; i < DLM_REMOVE_NAMES_MAX; i++)
dlm_delete_debug_file(ls);
- idr_destroy(&ls->ls_recover_idr);
kfree(ls->ls_recover_buf);
/*
spin_unlock(&ls->ls_recover_list_lock);
}
-static int recover_idr_empty(struct dlm_ls *ls)
+static int recover_array_empty(struct dlm_ls *ls)
{
- int empty = 1;
-
- spin_lock(&ls->ls_recover_idr_lock);
- if (ls->ls_recover_list_count)
- empty = 0;
- spin_unlock(&ls->ls_recover_idr_lock);
-
- return empty;
+ return xa_empty(&ls->ls_recover_array);
}
-static int recover_idr_add(struct dlm_rsb *r)
+static int recover_array_add(struct dlm_rsb *r)
{
struct dlm_ls *ls = r->res_ls;
int rv;
- idr_preload(GFP_NOFS);
- spin_lock(&ls->ls_recover_idr_lock);
+ xa_lock(&ls->ls_recover_array);
if (r->res_id) {
rv = -1;
goto out_unlock;
}
- rv = idr_alloc(&ls->ls_recover_idr, r, 1, 0, GFP_NOWAIT);
+ rv = __xa_alloc(&ls->ls_recover_array, &r->res_id, r, xa_limit_31b,
+ GFP_NOFS);
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);
- idr_preload_end();
+ xa_unlock(&ls->ls_recover_array);
return rv;
}
-static void recover_idr_del(struct dlm_rsb *r)
+static void recover_array_del(struct dlm_rsb *r)
{
struct dlm_ls *ls = r->res_ls;
- spin_lock(&ls->ls_recover_idr_lock);
- idr_remove(&ls->ls_recover_idr, r->res_id);
+ xa_lock(&ls->ls_recover_array);
+ __xa_erase(&ls->ls_recover_array, r->res_id);
r->res_id = 0;
ls->ls_recover_list_count--;
- spin_unlock(&ls->ls_recover_idr_lock);
+ xa_unlock(&ls->ls_recover_array);
dlm_put_rsb(r);
}
-static struct dlm_rsb *recover_idr_find(struct dlm_ls *ls, uint64_t id)
+static struct dlm_rsb *recover_array_find(struct dlm_ls *ls, uint64_t id)
{
- struct dlm_rsb *r;
-
- spin_lock(&ls->ls_recover_idr_lock);
- r = idr_find(&ls->ls_recover_idr, (int)id);
- spin_unlock(&ls->ls_recover_idr_lock);
- return r;
+ return xa_load(&ls->ls_recover_array, id);
}
-static void recover_idr_clear(struct dlm_ls *ls)
+static void recover_array_clear(struct dlm_ls *ls)
{
struct dlm_rsb *r;
- int id;
-
- spin_lock(&ls->ls_recover_idr_lock);
+ unsigned long id;
- idr_for_each_entry(&ls->ls_recover_idr, r, id) {
- idr_remove(&ls->ls_recover_idr, id);
+ xa_lock(&ls->ls_recover_array);
+ xa_for_each(&ls->ls_recover_array, id, r) {
+ __xa_erase(&ls->ls_recover_array, id);
r->res_id = 0;
r->res_recover_locks_count = 0;
ls->ls_recover_list_count--;
ls->ls_recover_list_count);
ls->ls_recover_list_count = 0;
}
- spin_unlock(&ls->ls_recover_idr_lock);
+ xa_unlock(&ls->ls_recover_array);
}
set_new_master(r);
error = 0;
} else {
- recover_idr_add(r);
+ recover_array_add(r);
error = dlm_send_rcom_lookup(r, dir_nodeid);
}
log_rinfo(ls, "dlm_recover_masters %u of %u", count, total);
- error = dlm_wait_function(ls, &recover_idr_empty);
+ error = dlm_wait_function(ls, &recover_array_empty);
out:
if (error)
- recover_idr_clear(ls);
+ recover_array_clear(ls);
return error;
}
struct dlm_rsb *r;
int ret_nodeid, new_master;
- r = recover_idr_find(ls, rc->rc_id);
+ r = recover_array_find(ls, rc->rc_id);
if (!r) {
log_error(ls, "dlm_recover_master_reply no id %llx",
(unsigned long long)rc->rc_id);
r->res_nodeid = new_master;
set_new_master(r);
unlock_rsb(r);
- recover_idr_del(r);
+ recover_array_del(r);
- if (recover_idr_empty(ls))
+ if (recover_array_empty(ls))
wake_up(&ls->ls_wait_general);
out:
return 0;