--- cman-kernel/src/membership.c 2006/06/26 08:42:06 1.44.2.24 +++ cman-kernel/src/membership.c 2007/01/19 16:20:14 1.44.2.26 @@ -1068,6 +1068,12 @@ { char killmsg; struct sockaddr_cl saddr; + int flags; + + if (needack) + flags = MSG_QUEUE; + else + flags = MSG_NOACK; killmsg = CLUSTER_MEM_KILL; @@ -1075,7 +1081,7 @@ saddr.scl_port = CLUSTER_PORT_MEMBERSHIP; saddr.scl_nodeid = nodeid; return kcl_sendmsg(mem_socket, &killmsg, 1, &saddr, - sizeof (struct sockaddr_cl), needack?0:MSG_NOACK); + sizeof (struct sockaddr_cl), flags); } /* Tell the rest of the cluster a node has gone down */ @@ -1364,7 +1370,7 @@ * list and wake it */ if (current != membership_task) { struct cl_new_dead_node *newnode = - kmalloc(sizeof (struct cl_new_dead_node), GFP_KERNEL); + kmalloc(sizeof (struct cl_new_dead_node), GFP_KERNEL); if (!newnode) return; newnode->node = node; @@ -1372,7 +1378,10 @@ list_add_tail(&newnode->list, &new_dead_node_list); set_bit(WAKE_FLAG_DEADNODE, &wake_flags); spin_unlock(&new_dead_node_lock); - wake_up_process(membership_task); + spin_lock(&membership_task_lock); + if (membership_task) + wake_up_process(membership_task); + spin_unlock(&membership_task_lock); P_MEMB("Passing dead node %s onto kmembershipd\n", node->name); return; } --- cman-kernel/src/cnxman.c 2006/05/09 09:26:31 1.42.2.25 +++ cman-kernel/src/cnxman.c 2007/01/19 10:23:14 1.42.2.27 @@ -1703,6 +1703,17 @@ return 0; } +static int do_ioctl_set_clusterid(unsigned long arg) +{ + if (!capable(CAP_CLUSTER)) + return -EPERM; + if (atomic_read(&cnxman_running)) + return -EALREADY; + + cluster_id = (uint16_t)arg; + return 0; +} + static int do_ioctl_join_cluster(unsigned long arg) { struct cl_join_cluster_info join_info; @@ -1724,7 +1735,8 @@ return -ENOTCONN; set_votes(join_info.votes, join_info.expected_votes); - cluster_id = generate_cluster_id(join_info.cluster_name); + if (!cluster_id) + cluster_id = generate_cluster_id(join_info.cluster_name); strncpy(cluster_name, join_info.cluster_name, MAX_CLUSTER_NAME_LEN); two_node = join_info.two_node; config_version = join_info.config_version; @@ -1925,6 +1937,13 @@ err = do_ioctl_set_nodeid(arg); break; + case SIOCCLUSTER_SET_CLUSTERID: + if (sock->sk->sk_protocol != CLPROTO_MASTER) + err = -EOPNOTSUPP; + else + err = do_ioctl_set_clusterid(arg); + break; + case SIOCCLUSTER_JOIN_CLUSTER: if (sock->sk->sk_protocol != CLPROTO_MASTER) err = -EOPNOTSUPP; @@ -2985,6 +3004,7 @@ acks_expected = 0; wanted_nodeid = 0; cur_seq = 0; + cluster_id = 0; quorum_device = NULL; } @@ -4159,12 +4179,14 @@ if (quorum_device->state == NODESTATE_DEAD) { quorum_device->state = NODESTATE_MEMBER; recalculate_quorum(0); + sm_member_update(cluster_is_quorate); } } else { if (quorum_device->state == NODESTATE_MEMBER) { quorum_device->state = NODESTATE_DEAD; recalculate_quorum(0); + sm_member_update(cluster_is_quorate); } } --- cman-kernel/src/cnxman-socket.h 2006/03/13 11:33:30 1.7.2.2 +++ cman-kernel/src/cnxman-socket.h 2006/12/18 13:37:55 1.7.2.3 @@ -57,6 +57,7 @@ #define SIOCCLUSTER_QD_REGISTER _IOW('x', 0x0a1, struct cl_quorumdevice_info) #define SIOCCLUSTER_QD_UNREGISTER _IO('x', 0x0a2) #define SIOCCLUSTER_QD_POLL _IOW('x', 0x0a3, int) +#define SIOCCLUSTER_SET_CLUSTERID _IOW('x', 0x0a4, uint16_t) /* These were setsockopts */ #define SIOCCLUSTER_PASS_SOCKET _IOW('x', 0x0b0, struct cl_passed_sock)