/* This is analagous to hb_up. as a node's connection comes up we delay the * quorum decision until we see it heartbeating. the hold will be droped in * hb_up or hb_down. it might be perpetuated by con_err until hb_down. if * it's already heartbeating we we might be dropping a hold that conn_up got. * */ void o2quo_conn_up(u8 node) { struct o2quo_state *qs = &o2quo_state; spin_lock(&qs->qs_lock); qs->qs_connected++; mlog_bug_on_msg(qs->qs_connected == O2NM_MAX_NODES, "node %u\n", node); mlog_bug_on_msg(test_bit(node, qs->qs_conn_bm), "node %u\n", node); set_bit(node, qs->qs_conn_bm); mlog(0, "node %u, %d total\n", node, qs->qs_connected); if (!test_bit(node, qs->qs_hb_bm)) o2quo_set_hold(qs, node); else o2quo_clear_hold(qs, node); spin_unlock(&qs->qs_lock); }
/* we've decided that we won't ever be connecting to the node again. if it's * still heartbeating we grab a hold that will delay decisions until either the * node stops heartbeating from hb_down or the caller decides that the node is * still up and calls still_up */ void o2quo_conn_err(u8 node) { struct o2quo_state *qs = &o2quo_state; spin_lock(&qs->qs_lock); if (test_bit(node, qs->qs_conn_bm)) { qs->qs_connected--; mlog_bug_on_msg(qs->qs_connected < 0, "node %u, connected %d\n", node, qs->qs_connected); clear_bit(node, qs->qs_conn_bm); } mlog(0, "node %u, %d total\n", node, qs->qs_connected); if (test_bit(node, qs->qs_hb_bm)) o2quo_set_hold(qs, node); spin_unlock(&qs->qs_lock); }