]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/dlm/lockspace.c
dlm: add node slots and generation
[mirror_ubuntu-bionic-kernel.git] / fs / dlm / lockspace.c
index a1d8f1af144b92af587d9772d1276b625db508b5..1441f04bfabebb25359d68999f948a3e44149094 100644 (file)
@@ -457,8 +457,8 @@ static int new_lockspace(const char *name, int namelen, void **lockspace,
        if (!ls->ls_rsbtbl)
                goto out_lsfree;
        for (i = 0; i < size; i++) {
-               INIT_LIST_HEAD(&ls->ls_rsbtbl[i].list);
-               INIT_LIST_HEAD(&ls->ls_rsbtbl[i].toss);
+               ls->ls_rsbtbl[i].keep.rb_node = NULL;
+               ls->ls_rsbtbl[i].toss.rb_node = NULL;
                spin_lock_init(&ls->ls_rsbtbl[i].lock);
        }
 
@@ -525,6 +525,11 @@ static int new_lockspace(const char *name, int namelen, void **lockspace,
        if (!ls->ls_recover_buf)
                goto out_dirfree;
 
+       ls->ls_slot = 0;
+       ls->ls_num_slots = 0;
+       ls->ls_slots_size = 0;
+       ls->ls_slots = NULL;
+
        INIT_LIST_HEAD(&ls->ls_recover_list);
        spin_lock_init(&ls->ls_recover_list_lock);
        ls->ls_recover_list_count = 0;
@@ -685,7 +690,7 @@ static int lockspace_busy(struct dlm_ls *ls, int force)
 static int release_lockspace(struct dlm_ls *ls, int force)
 {
        struct dlm_rsb *rsb;
-       struct list_head *head;
+       struct rb_node *n;
        int i, busy, rv;
 
        busy = lockspace_busy(ls, force);
@@ -746,20 +751,15 @@ static int release_lockspace(struct dlm_ls *ls, int force)
         */
 
        for (i = 0; i < ls->ls_rsbtbl_size; i++) {
-               head = &ls->ls_rsbtbl[i].list;
-               while (!list_empty(head)) {
-                       rsb = list_entry(head->next, struct dlm_rsb,
-                                        res_hashchain);
-
-                       list_del(&rsb->res_hashchain);
+               while ((n = rb_first(&ls->ls_rsbtbl[i].keep))) {
+                       rsb = rb_entry(n, struct dlm_rsb, res_hashnode);
+                       rb_erase(n, &ls->ls_rsbtbl[i].keep);
                        dlm_free_rsb(rsb);
                }
 
-               head = &ls->ls_rsbtbl[i].toss;
-               while (!list_empty(head)) {
-                       rsb = list_entry(head->next, struct dlm_rsb,
-                                        res_hashchain);
-                       list_del(&rsb->res_hashchain);
+               while ((n = rb_first(&ls->ls_rsbtbl[i].toss))) {
+                       rsb = rb_entry(n, struct dlm_rsb, res_hashnode);
+                       rb_erase(n, &ls->ls_rsbtbl[i].toss);
                        dlm_free_rsb(rsb);
                }
        }