Example #1
0
static int handle_enter_barrier(struct rpc_desc* desc,
				void *_msg, size_t size)
{
	struct cluster_barrier_id *id = ((struct cluster_barrier_id *) _msg);
	struct cluster_barrier_core *core_bar;
	struct cluster_barrier *barrier;
	krgnodemask_t nodes;

	rpc_unpack(desc, 0, &nodes, sizeof(krgnodemask_t));

	barrier = hashtable_find (barrier_table, id->key);
	BUG_ON(!barrier);

	core_bar = &barrier->core[id->toggle];

	if (krgnodes_empty(core_bar->nodes_to_wait)) {
		krgnodes_copy(core_bar->nodes_in_barrier, nodes);
		krgnodes_copy(core_bar->nodes_to_wait, nodes);
	}
	else
		BUG_ON(!krgnodes_equal(core_bar->nodes_in_barrier, nodes));

	krgnode_clear(desc->client, core_bar->nodes_to_wait);

	if (krgnodes_empty(core_bar->nodes_to_wait)) {
                rpc_async_m(RPC_EXIT_BARRIER, &core_bar->nodes_in_barrier,
			    id, sizeof (struct cluster_barrier_id));
	}

	return 0;
}
Example #2
0
static void do_other_node_remove(struct rpc_desc *desc,
				 struct hotplug_context *ctx)
{
	int ret;

	printk("do_other_node_remove\n");
	atomic_set(&nr_to_wait, krgnodes_weight(ctx->node_set.v));
	hotplug_remove_notify(ctx, HOTPLUG_NOTIFY_REMOVE_ADVERT);
	rpc_async_m(NODE_REMOVE_ACK, ctx->ns->rpc_comm, &ctx->node_set.v, NULL, 0);
	wait_event(all_removed_wqh, atomic_read(&nr_to_wait) == 0);

	ret = 0;
	rpc_pack_type(desc, ret);
	rpc_unpack_type(desc, ret);

	rpc_close_mask(ctx->ns->rpc_comm, &ctx->node_set.v);
}
Example #3
0
static int nodes_poweroff(void __user *arg)
{
	struct __hotplug_node_set __node_set;
	struct hotplug_node_set node_set;
	int unused;
	int err;

	if (copy_from_user(&__node_set, arg, sizeof(__node_set)))
		return -EFAULT;

	node_set.subclusterid = __node_set.subclusterid;

	err = krgnodemask_copy_from_user(&node_set.v, &__node_set.v);
	if (err)
		return err;

	rpc_async_m(NODE_POWEROFF,
		    current->nsproxy->krg_ns->rpc_comm, &node_set.v,
		    &unused, sizeof(unused));

	return 0;
}