]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/dlm/member.c
timerfd use waitqueue lock ...
[mv-sheeva.git] / fs / dlm / member.c
index 439249b62a574abdfd3c45213925f3394795666b..85e2897bd7400fc4155948fc8eb1c81cb1ff8e01 100644 (file)
@@ -15,7 +15,6 @@
 #include "member.h"
 #include "recoverd.h"
 #include "recover.h"
-#include "lowcomms.h"
 #include "rcom.h"
 #include "config.h"
 
@@ -52,7 +51,7 @@ static int dlm_add_member(struct dlm_ls *ls, int nodeid)
        struct dlm_member *memb;
        int w;
 
-       memb = kmalloc(sizeof(struct dlm_member), GFP_KERNEL);
+       memb = kzalloc(sizeof(struct dlm_member), GFP_KERNEL);
        if (!memb)
                return -ENOMEM;
 
@@ -79,9 +78,9 @@ static int dlm_is_member(struct dlm_ls *ls, int nodeid)
 
        list_for_each_entry(memb, &ls->ls_nodes, list) {
                if (memb->nodeid == nodeid)
-                       return TRUE;
+                       return 1;
        }
-       return FALSE;
+       return 0;
 }
 
 int dlm_is_removed(struct dlm_ls *ls, int nodeid)
@@ -90,9 +89,9 @@ int dlm_is_removed(struct dlm_ls *ls, int nodeid)
 
        list_for_each_entry(memb, &ls->ls_nodes_gone, list) {
                if (memb->nodeid == nodeid)
-                       return TRUE;
+                       return 1;
        }
-       return FALSE;
+       return 0;
 }
 
 static void clear_memb_list(struct list_head *head)
@@ -163,11 +162,23 @@ static void make_member_array(struct dlm_ls *ls)
 
 /* send a status request to all members just to establish comms connections */
 
-static void ping_members(struct dlm_ls *ls)
+static int ping_members(struct dlm_ls *ls)
 {
        struct dlm_member *memb;
-       list_for_each_entry(memb, &ls->ls_nodes, list)
-               dlm_rcom_status(ls, memb->nodeid);
+       int error = 0;
+
+       list_for_each_entry(memb, &ls->ls_nodes, list) {
+               error = dlm_recovery_stopped(ls);
+               if (error)
+                       break;
+               error = dlm_rcom_status(ls, memb->nodeid);
+               if (error)
+                       break;
+       }
+       if (error)
+               log_debug(ls, "ping_members aborted %d last nodeid %d",
+                         error, ls->ls_recover_nodeid);
+       return error;
 }
 
 int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
@@ -175,13 +186,21 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
        struct dlm_member *memb, *safe;
        int i, error, found, pos = 0, neg = 0, low = -1;
 
+       /* previously removed members that we've not finished removing need to
+          count as a negative change so the "neg" recovery steps will happen */
+
+       list_for_each_entry(memb, &ls->ls_nodes_gone, list) {
+               log_debug(ls, "prev removed member %d", memb->nodeid);
+               neg++;
+       }
+
        /* move departed members from ls_nodes to ls_nodes_gone */
 
        list_for_each_entry_safe(memb, safe, &ls->ls_nodes, list) {
-               found = FALSE;
+               found = 0;
                for (i = 0; i < rv->node_count; i++) {
                        if (memb->nodeid == rv->nodeids[i]) {
-                               found = TRUE;
+                               found = 1;
                                break;
                        }
                }
@@ -213,10 +232,13 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
        dlm_set_recover_status(ls, DLM_RS_NODES);
        *neg_out = neg;
 
-       ping_members(ls);
+       error = ping_members(ls);
+       if (error)
+               goto out;
 
        error = dlm_recover_members_wait(ls);
-       log_debug(ls, "total members %d", ls->ls_num_nodes);
+ out:
+       log_debug(ls, "total members %d error %d", ls->ls_num_nodes, error);
        return error;
 }
 
@@ -271,10 +293,9 @@ int dlm_ls_start(struct dlm_ls *ls)
        int *ids = NULL;
        int error, count;
 
-       rv = kmalloc(sizeof(struct dlm_recover), GFP_KERNEL);
+       rv = kzalloc(sizeof(struct dlm_recover), GFP_KERNEL);
        if (!rv)
                return -ENOMEM;
-       memset(rv, 0, sizeof(struct dlm_recover));
 
        error = count = dlm_nodeid_list(ls->ls_name, &ids);
        if (error <= 0)