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; }
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); }
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; }