fs: dlm: rename socket and app buffer defines
[linux-block.git] / fs / dlm / member.c
index ceef3f2074ffd3f5585f1502c2c0e46a3c2f2a20..d9e1e4170eb153ff4cb8abb524c70dd6eea7916a 100644 (file)
@@ -15,6 +15,7 @@
 #include "recover.h"
 #include "rcom.h"
 #include "config.h"
+#include "midcomms.h"
 #include "lowcomms.h"
 
 int dlm_slots_version(struct dlm_header *h)
@@ -270,7 +271,7 @@ int dlm_slots_assign(struct dlm_ls *ls, int *num_slots, int *slots_size,
 
        log_slots(ls, gen, num, NULL, array, array_size);
 
-       max_slots = (LOWCOMMS_MAX_TX_BUFFER_LEN - sizeof(struct dlm_rcom) -
+       max_slots = (DLM_MAX_APP_BUFSIZE - sizeof(struct dlm_rcom) -
                     sizeof(struct rcom_config)) / sizeof(struct rcom_slot);
 
        if (num > max_slots) {
@@ -329,6 +330,7 @@ static int dlm_add_member(struct dlm_ls *ls, struct dlm_config_node *node)
        memb->nodeid = node->nodeid;
        memb->weight = node->weight;
        memb->comm_seq = node->comm_seq;
+       dlm_midcomms_add_member(node->nodeid);
        add_ordered_member(ls, memb);
        ls->ls_num_nodes++;
        return 0;
@@ -359,26 +361,34 @@ int dlm_is_removed(struct dlm_ls *ls, int nodeid)
        return 0;
 }
 
-static void clear_memb_list(struct list_head *head)
+static void clear_memb_list(struct list_head *head,
+                           void (*after_del)(int nodeid))
 {
        struct dlm_member *memb;
 
        while (!list_empty(head)) {
                memb = list_entry(head->next, struct dlm_member, list);
                list_del(&memb->list);
+               if (after_del)
+                       after_del(memb->nodeid);
                kfree(memb);
        }
 }
 
+static void clear_members_cb(int nodeid)
+{
+       dlm_midcomms_remove_member(nodeid);
+}
+
 void dlm_clear_members(struct dlm_ls *ls)
 {
-       clear_memb_list(&ls->ls_nodes);
+       clear_memb_list(&ls->ls_nodes, clear_members_cb);
        ls->ls_num_nodes = 0;
 }
 
 void dlm_clear_members_gone(struct dlm_ls *ls)
 {
-       clear_memb_list(&ls->ls_nodes_gone);
+       clear_memb_list(&ls->ls_nodes_gone, NULL);
 }
 
 static void make_member_array(struct dlm_ls *ls)
@@ -552,6 +562,7 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
 
                neg++;
                list_move(&memb->list, &ls->ls_nodes_gone);
+               dlm_midcomms_remove_member(memb->nodeid);
                ls->ls_num_nodes--;
                dlm_lsop_recover_slot(ls, memb);
        }
@@ -576,12 +587,18 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
        *neg_out = neg;
 
        error = ping_members(ls);
-       if (!error || error == -EPROTO) {
-               /* new_lockspace() may be waiting to know if the config
-                  is good or bad */
-               ls->ls_members_result = error;
-               complete(&ls->ls_members_done);
-       }
+       /* error -EINTR means that a new recovery action is triggered.
+        * We ignore this recovery action and let run the new one which might
+        * have new member configuration.
+        */
+       if (error == -EINTR)
+               error = 0;
+
+       /* new_lockspace() may be waiting to know if the config
+        * is good or bad
+        */
+       ls->ls_members_result = error;
+       complete(&ls->ls_members_done);
 
        log_rinfo(ls, "dlm_recover_members %d nodes", ls->ls_num_nodes);
        return error;