22 #include <linux/slab.h>
23 #include <linux/kernel.h>
24 #include <linux/module.h>
50 node = r2nm_single_cluster->
cl_nodes[node_num];
105 if (ret_parent !=
NULL)
106 *ret_parent = parent;
120 node = r2nm_node_ip_tree_lookup(cluster, addr,
NULL,
NULL);
146 if (r2nm_single_cluster && r2nm_single_cluster->
cl_has_local)
168 static void r2nm_node_release(
struct config_item *item)
170 struct r2nm_node *node = to_r2nm_node(item);
183 return to_r2nm_cluster(node->
nd_item.ci_parent->ci_parent);
196 struct r2nm_cluster *cluster = to_r2nm_cluster_from_node(node);
198 char *p = (
char *)page;
201 err = kstrtoul(p, 10, &tmp);
236 const char *page,
size_t count)
239 char *p = (
char *)page;
242 err = kstrtoul(p, 10, &tmp);
256 static ssize_t r2nm_node_ipv4_address_read(
struct r2nm_node *node,
char *page)
265 struct r2nm_cluster *cluster = to_r2nm_cluster_from_node(node);
268 unsigned int octets[4];
271 ret =
sscanf(page,
"%3u.%3u.%3u.%3u", &octets[3], &octets[2],
272 &octets[1], &octets[0]);
279 be32_add_cpu(&ipv4_addr, octets[i] << (i * 8));
284 if (r2nm_node_ip_tree_lookup(cluster, ipv4_addr, &p, &parent))
304 static ssize_t r2nm_node_local_write(
struct r2nm_node *node,
const char *page,
307 struct r2nm_cluster *cluster = to_r2nm_cluster_from_node(node);
309 char *p = (
char *)page;
313 err = kstrtoul(p, 10, &tmp);
364 .show = r2nm_node_num_read,
365 .store = r2nm_node_num_write,
370 .ca_name =
"ipv4_port",
372 .show = r2nm_node_ipv4_port_read,
373 .store = r2nm_node_ipv4_port_write,
378 .ca_name =
"ipv4_address",
380 .show = r2nm_node_ipv4_address_read,
381 .store = r2nm_node_ipv4_address_write,
388 .show = r2nm_node_local_read,
389 .store = r2nm_node_local_write,
403 for (i = 0; i <
ARRAY_SIZE(r2nm_node_attrs); i++) {
404 if (attr == r2nm_node_attrs[i])
415 struct r2nm_node *node = to_r2nm_node(item);
420 if (r2nm_node_attr->
show)
421 ret = r2nm_node_attr->
show(node, page);
427 const char *page,
size_t count)
429 struct r2nm_node *node = to_r2nm_node(item);
433 int attr_index = r2nm_attr_index(attr);
443 ret = r2nm_node_attr->
store(node, page, count);
453 .release = r2nm_node_release,
454 .show_attribute = r2nm_node_show,
455 .store_attribute = r2nm_node_store,
459 .ct_item_ops = &r2nm_node_item_ops,
460 .ct_attrs = r2nm_node_attrs,
486 static ssize_t r2nm_cluster_attr_write(
const char *page,
ssize_t count,
490 char *p = (
char *)page;
493 err = kstrtoul(p, 10, &tmp);
507 static ssize_t r2nm_cluster_attr_idle_timeout_ms_read(
513 static ssize_t r2nm_cluster_attr_idle_timeout_ms_write(
514 struct r2nm_cluster *cluster,
const char *page,
size_t count)
517 unsigned int val = 0;
519 ret = r2nm_cluster_attr_write(page, count, &val);
525 "r2net: cannot change idle timeout after "
526 "the first peer has agreed to it."
527 " %d connected peers\n",
532 "r2net: idle timeout must be larger "
533 "than keepalive delay\n");
543 static ssize_t r2nm_cluster_attr_keepalive_delay_ms_read(
549 static ssize_t r2nm_cluster_attr_keepalive_delay_ms_write(
550 struct r2nm_cluster *cluster,
const char *page,
size_t count)
553 unsigned int val = 0;
555 ret = r2nm_cluster_attr_write(page, count, &val);
561 "r2net: cannot change keepalive delay after"
562 " the first peer has agreed to it."
563 " %d connected peers\n",
568 "r2net: keepalive delay must be "
569 "smaller than idle timeout\n");
579 static ssize_t r2nm_cluster_attr_reconnect_delay_ms_read(
585 static ssize_t r2nm_cluster_attr_reconnect_delay_ms_write(
586 struct r2nm_cluster *cluster,
const char *page,
size_t count)
588 return r2nm_cluster_attr_write(page, count,
592 static ssize_t r2nm_cluster_attr_fence_method_read(
603 static ssize_t r2nm_cluster_attr_fence_method_write(
604 struct r2nm_cluster *cluster,
const char *page,
size_t count)
608 if (page[count - 1] !=
'\n')
617 pr_info(
"ramster: Changing fence method to %s\n",
630 .ca_name =
"idle_timeout_ms",
632 .show = r2nm_cluster_attr_idle_timeout_ms_read,
633 .store = r2nm_cluster_attr_idle_timeout_ms_write,
638 .ca_name =
"keepalive_delay_ms",
640 .show = r2nm_cluster_attr_keepalive_delay_ms_read,
641 .store = r2nm_cluster_attr_keepalive_delay_ms_write,
646 .ca_name =
"reconnect_delay_ms",
648 .show = r2nm_cluster_attr_reconnect_delay_ms_read,
649 .store = r2nm_cluster_attr_reconnect_delay_ms_write,
654 .ca_name =
"fence_method",
656 .show = r2nm_cluster_attr_fence_method_read,
657 .store = r2nm_cluster_attr_fence_method_write,
661 &r2nm_cluster_attr_idle_timeout_ms.
attr,
662 &r2nm_cluster_attr_keepalive_delay_ms.
attr,
663 &r2nm_cluster_attr_reconnect_delay_ms.
attr,
664 &r2nm_cluster_attr_fence_method.
attr,
676 if (r2nm_cluster_attr->
show)
677 ret = r2nm_cluster_attr->
show(cluster, page);
683 const char *page,
size_t count)
695 ret = r2nm_cluster_attr->
store(cluster, page, count);
723 static void r2nm_node_group_drop_item(
struct config_group *group,
726 struct r2nm_node *node = to_r2nm_node(item);
728 to_r2nm_cluster(group->
cg_item.ci_parent);
755 config_item_name(&node->
nd_item));
761 .make_item = r2nm_node_group_make_item,
762 .drop_item = r2nm_node_group_drop_item,
766 .ct_group_ops = &r2nm_node_group_group_ops,
772 static void r2nm_cluster_release(
struct config_item *item)
781 .release = r2nm_cluster_release,
782 .show_attribute = r2nm_cluster_show,
783 .store_attribute = r2nm_cluster_store,
787 .ct_item_ops = &r2nm_cluster_item_ops,
788 .ct_attrs = r2nm_cluster_attrs,
811 r2nm_cluster_group_make_group(
struct config_group *group,
821 if (r2nm_single_cluster)
834 &r2nm_node_group_type);
836 cluster->
cl_group.default_groups = defs;
838 cluster->
cl_group.default_groups[1] = r2hb_group;
862 static void r2nm_cluster_group_drop_item(
struct config_group *group,
869 BUG_ON(r2nm_single_cluster != cluster);
870 r2nm_single_cluster =
NULL;
872 for (i = 0; cluster->
cl_group.default_groups[
i]; i++) {
873 killme = &cluster->
cl_group.default_groups[
i]->cg_item;
882 .make_group = r2nm_cluster_group_make_group,
883 .drop_item = r2nm_cluster_group_drop_item,
887 .ct_group_ops = &r2nm_cluster_group_group_ops,
895 .ci_namebuf =
"cluster",
896 .ci_type = &r2nm_cluster_group_type,
942 static void __exit exit_r2nm(
void)
952 static int __init init_r2nm(
void)
972 pr_err(
"nodemanager: Registration returned %d\n", ret);