#include "member.h"
#include "recoverd.h"
#include "recover.h"
-#include "lowcomms.h"
#include "rcom.h"
#include "config.h"
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;
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)
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)
/* 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)
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;
}
}
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;
}
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)