]> www.infradead.org Git - users/willy/xarray.git/commitdiff
dlm: Convert recovery_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Tue, 12 Feb 2019 18:46:11 +0000 (13:46 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Aug 2019 14:29:41 +0000 (10:29 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
fs/dlm/dlm_internal.h
fs/dlm/lockspace.c
fs/dlm/recover.c

index 4a9d12ccf897de21f1f8a6cfe6046894dbf3b373..0140a797963093386dafad2250ff8d442c22c9d6 100644 (file)
@@ -611,8 +611,7 @@ struct dlm_ls {
        struct list_head        ls_recover_list;
        spinlock_t              ls_recover_list_lock;
        int                     ls_recover_list_count;
-       struct idr              ls_recover_idr;
-       spinlock_t              ls_recover_idr_lock;
+       struct xarray           ls_recover_array;
        wait_queue_head_t       ls_wait_general;
        wait_queue_head_t       ls_recover_lock_wait;
        struct mutex            ls_clear_proc_locks;
index 85b30547933dabd6812ce71aaa767ab34830fad2..743eb99a079cd44dedf9d5b201141f07ebc09a1e 100644 (file)
@@ -592,8 +592,7 @@ static int new_lockspace(const char *name, const char *cluster,
 
        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);
@@ -674,7 +673,6 @@ static int new_lockspace(const char *name, const char *cluster,
        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++)
@@ -782,7 +780,6 @@ static int release_lockspace(struct dlm_ls *ls, int force)
 
        dlm_delete_debug_file(ls);
 
-       idr_destroy(&ls->ls_recover_idr);
        kfree(ls->ls_recover_buf);
 
        /*
index 8928e99dfd47d0ac033e064b23570423850537c4..375d1dac495c81324c3f51184b2b783383e518e5 100644 (file)
@@ -292,75 +292,60 @@ static void recover_list_clear(struct dlm_ls *ls)
        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--;
@@ -373,7 +358,7 @@ static void recover_idr_clear(struct dlm_ls *ls)
                          ls->ls_recover_list_count);
                ls->ls_recover_list_count = 0;
        }
-       spin_unlock(&ls->ls_recover_idr_lock);
+       xa_unlock(&ls->ls_recover_array);
 }
 
 
@@ -471,7 +456,7 @@ static int recover_master(struct dlm_rsb *r, unsigned int *count)
                set_new_master(r);
                error = 0;
        } else {
-               recover_idr_add(r);
+               recover_array_add(r);
                error = dlm_send_rcom_lookup(r, dir_nodeid);
        }
 
@@ -556,10 +541,10 @@ int dlm_recover_masters(struct dlm_ls *ls)
 
        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;
 }
 
@@ -568,7 +553,7 @@ int dlm_recover_master_reply(struct dlm_ls *ls, struct dlm_rcom *rc)
        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);
@@ -587,9 +572,9 @@ int dlm_recover_master_reply(struct dlm_ls *ls, struct dlm_rcom *rc)
        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;