nodemanager.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. /* -*- mode: c; c-basic-offset: 8; -*-
  2. * vim: noexpandtab sw=8 ts=8 sts=0:
  3. *
  4. * Copyright (C) 2004, 2005 Oracle. All rights reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public
  17. * License along with this program; if not, write to the
  18. * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  19. * Boston, MA 021110-1307, USA.
  20. */
  21. #include <linux/kernel.h>
  22. #include <linux/module.h>
  23. #include <linux/configfs.h>
  24. #include "tcp.h"
  25. #include "nodemanager.h"
  26. #include "heartbeat.h"
  27. #include "masklog.h"
  28. #include "sys.h"
  29. #include "ver.h"
  30. /* for now we operate under the assertion that there can be only one
  31. * cluster active at a time. Changing this will require trickling
  32. * cluster references throughout where nodes are looked up */
  33. struct o2nm_cluster *o2nm_single_cluster = NULL;
  34. struct o2nm_node *o2nm_get_node_by_num(u8 node_num)
  35. {
  36. struct o2nm_node *node = NULL;
  37. if (node_num >= O2NM_MAX_NODES || o2nm_single_cluster == NULL)
  38. goto out;
  39. read_lock(&o2nm_single_cluster->cl_nodes_lock);
  40. node = o2nm_single_cluster->cl_nodes[node_num];
  41. if (node)
  42. config_item_get(&node->nd_item);
  43. read_unlock(&o2nm_single_cluster->cl_nodes_lock);
  44. out:
  45. return node;
  46. }
  47. EXPORT_SYMBOL_GPL(o2nm_get_node_by_num);
  48. int o2nm_configured_node_map(unsigned long *map, unsigned bytes)
  49. {
  50. struct o2nm_cluster *cluster = o2nm_single_cluster;
  51. BUG_ON(bytes < (sizeof(cluster->cl_nodes_bitmap)));
  52. if (cluster == NULL)
  53. return -EINVAL;
  54. read_lock(&cluster->cl_nodes_lock);
  55. memcpy(map, cluster->cl_nodes_bitmap, sizeof(cluster->cl_nodes_bitmap));
  56. read_unlock(&cluster->cl_nodes_lock);
  57. return 0;
  58. }
  59. EXPORT_SYMBOL_GPL(o2nm_configured_node_map);
  60. static struct o2nm_node *o2nm_node_ip_tree_lookup(struct o2nm_cluster *cluster,
  61. __be32 ip_needle,
  62. struct rb_node ***ret_p,
  63. struct rb_node **ret_parent)
  64. {
  65. struct rb_node **p = &cluster->cl_node_ip_tree.rb_node;
  66. struct rb_node *parent = NULL;
  67. struct o2nm_node *node, *ret = NULL;
  68. while (*p) {
  69. int cmp;
  70. parent = *p;
  71. node = rb_entry(parent, struct o2nm_node, nd_ip_node);
  72. cmp = memcmp(&ip_needle, &node->nd_ipv4_address,
  73. sizeof(ip_needle));
  74. if (cmp < 0)
  75. p = &(*p)->rb_left;
  76. else if (cmp > 0)
  77. p = &(*p)->rb_right;
  78. else {
  79. ret = node;
  80. break;
  81. }
  82. }
  83. if (ret_p != NULL)
  84. *ret_p = p;
  85. if (ret_parent != NULL)
  86. *ret_parent = parent;
  87. return ret;
  88. }
  89. struct o2nm_node *o2nm_get_node_by_ip(__be32 addr)
  90. {
  91. struct o2nm_node *node = NULL;
  92. struct o2nm_cluster *cluster = o2nm_single_cluster;
  93. if (cluster == NULL)
  94. goto out;
  95. read_lock(&cluster->cl_nodes_lock);
  96. node = o2nm_node_ip_tree_lookup(cluster, addr, NULL, NULL);
  97. if (node)
  98. config_item_get(&node->nd_item);
  99. read_unlock(&cluster->cl_nodes_lock);
  100. out:
  101. return node;
  102. }
  103. EXPORT_SYMBOL_GPL(o2nm_get_node_by_ip);
  104. void o2nm_node_put(struct o2nm_node *node)
  105. {
  106. config_item_put(&node->nd_item);
  107. }
  108. EXPORT_SYMBOL_GPL(o2nm_node_put);
  109. void o2nm_node_get(struct o2nm_node *node)
  110. {
  111. config_item_get(&node->nd_item);
  112. }
  113. EXPORT_SYMBOL_GPL(o2nm_node_get);
  114. u8 o2nm_this_node(void)
  115. {
  116. u8 node_num = O2NM_MAX_NODES;
  117. if (o2nm_single_cluster && o2nm_single_cluster->cl_has_local)
  118. node_num = o2nm_single_cluster->cl_local_node;
  119. return node_num;
  120. }
  121. EXPORT_SYMBOL_GPL(o2nm_this_node);
  122. /* node configfs bits */
  123. static struct o2nm_cluster *to_o2nm_cluster(struct config_item *item)
  124. {
  125. return item ?
  126. container_of(to_config_group(item), struct o2nm_cluster,
  127. cl_group)
  128. : NULL;
  129. }
  130. static struct o2nm_node *to_o2nm_node(struct config_item *item)
  131. {
  132. return item ? container_of(item, struct o2nm_node, nd_item) : NULL;
  133. }
  134. static void o2nm_node_release(struct config_item *item)
  135. {
  136. struct o2nm_node *node = to_o2nm_node(item);
  137. kfree(node);
  138. }
  139. static ssize_t o2nm_node_num_read(struct o2nm_node *node, char *page)
  140. {
  141. return sprintf(page, "%d\n", node->nd_num);
  142. }
  143. static struct o2nm_cluster *to_o2nm_cluster_from_node(struct o2nm_node *node)
  144. {
  145. /* through the first node_set .parent
  146. * mycluster/nodes/mynode == o2nm_cluster->o2nm_node_group->o2nm_node */
  147. return to_o2nm_cluster(node->nd_item.ci_parent->ci_parent);
  148. }
  149. enum {
  150. O2NM_NODE_ATTR_NUM = 0,
  151. O2NM_NODE_ATTR_PORT,
  152. O2NM_NODE_ATTR_ADDRESS,
  153. O2NM_NODE_ATTR_LOCAL,
  154. };
  155. static ssize_t o2nm_node_num_write(struct o2nm_node *node, const char *page,
  156. size_t count)
  157. {
  158. struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
  159. unsigned long tmp;
  160. char *p = (char *)page;
  161. tmp = simple_strtoul(p, &p, 0);
  162. if (!p || (*p && (*p != '\n')))
  163. return -EINVAL;
  164. if (tmp >= O2NM_MAX_NODES)
  165. return -ERANGE;
  166. /* once we're in the cl_nodes tree networking can look us up by
  167. * node number and try to use our address and port attributes
  168. * to connect to this node.. make sure that they've been set
  169. * before writing the node attribute? */
  170. if (!test_bit(O2NM_NODE_ATTR_ADDRESS, &node->nd_set_attributes) ||
  171. !test_bit(O2NM_NODE_ATTR_PORT, &node->nd_set_attributes))
  172. return -EINVAL; /* XXX */
  173. write_lock(&cluster->cl_nodes_lock);
  174. if (cluster->cl_nodes[tmp])
  175. p = NULL;
  176. else {
  177. cluster->cl_nodes[tmp] = node;
  178. node->nd_num = tmp;
  179. set_bit(tmp, cluster->cl_nodes_bitmap);
  180. }
  181. write_unlock(&cluster->cl_nodes_lock);
  182. if (p == NULL)
  183. return -EEXIST;
  184. return count;
  185. }
  186. static ssize_t o2nm_node_ipv4_port_read(struct o2nm_node *node, char *page)
  187. {
  188. return sprintf(page, "%u\n", ntohs(node->nd_ipv4_port));
  189. }
  190. static ssize_t o2nm_node_ipv4_port_write(struct o2nm_node *node,
  191. const char *page, size_t count)
  192. {
  193. unsigned long tmp;
  194. char *p = (char *)page;
  195. tmp = simple_strtoul(p, &p, 0);
  196. if (!p || (*p && (*p != '\n')))
  197. return -EINVAL;
  198. if (tmp == 0)
  199. return -EINVAL;
  200. if (tmp >= (u16)-1)
  201. return -ERANGE;
  202. node->nd_ipv4_port = htons(tmp);
  203. return count;
  204. }
  205. static ssize_t o2nm_node_ipv4_address_read(struct o2nm_node *node, char *page)
  206. {
  207. return sprintf(page, "%pI4\n", &node->nd_ipv4_address);
  208. }
  209. static ssize_t o2nm_node_ipv4_address_write(struct o2nm_node *node,
  210. const char *page,
  211. size_t count)
  212. {
  213. struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
  214. int ret, i;
  215. struct rb_node **p, *parent;
  216. unsigned int octets[4];
  217. __be32 ipv4_addr = 0;
  218. ret = sscanf(page, "%3u.%3u.%3u.%3u", &octets[3], &octets[2],
  219. &octets[1], &octets[0]);
  220. if (ret != 4)
  221. return -EINVAL;
  222. for (i = 0; i < ARRAY_SIZE(octets); i++) {
  223. if (octets[i] > 255)
  224. return -ERANGE;
  225. be32_add_cpu(&ipv4_addr, octets[i] << (i * 8));
  226. }
  227. ret = 0;
  228. write_lock(&cluster->cl_nodes_lock);
  229. if (o2nm_node_ip_tree_lookup(cluster, ipv4_addr, &p, &parent))
  230. ret = -EEXIST;
  231. else {
  232. rb_link_node(&node->nd_ip_node, parent, p);
  233. rb_insert_color(&node->nd_ip_node, &cluster->cl_node_ip_tree);
  234. }
  235. write_unlock(&cluster->cl_nodes_lock);
  236. if (ret)
  237. return ret;
  238. memcpy(&node->nd_ipv4_address, &ipv4_addr, sizeof(ipv4_addr));
  239. return count;
  240. }
  241. static ssize_t o2nm_node_local_read(struct o2nm_node *node, char *page)
  242. {
  243. return sprintf(page, "%d\n", node->nd_local);
  244. }
  245. static ssize_t o2nm_node_local_write(struct o2nm_node *node, const char *page,
  246. size_t count)
  247. {
  248. struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
  249. unsigned long tmp;
  250. char *p = (char *)page;
  251. ssize_t ret;
  252. tmp = simple_strtoul(p, &p, 0);
  253. if (!p || (*p && (*p != '\n')))
  254. return -EINVAL;
  255. tmp = !!tmp; /* boolean of whether this node wants to be local */
  256. /* setting local turns on networking rx for now so we require having
  257. * set everything else first */
  258. if (!test_bit(O2NM_NODE_ATTR_ADDRESS, &node->nd_set_attributes) ||
  259. !test_bit(O2NM_NODE_ATTR_NUM, &node->nd_set_attributes) ||
  260. !test_bit(O2NM_NODE_ATTR_PORT, &node->nd_set_attributes))
  261. return -EINVAL; /* XXX */
  262. /* the only failure case is trying to set a new local node
  263. * when a different one is already set */
  264. if (tmp && tmp == cluster->cl_has_local &&
  265. cluster->cl_local_node != node->nd_num)
  266. return -EBUSY;
  267. /* bring up the rx thread if we're setting the new local node. */
  268. if (tmp && !cluster->cl_has_local) {
  269. ret = o2net_start_listening(node);
  270. if (ret)
  271. return ret;
  272. }
  273. if (!tmp && cluster->cl_has_local &&
  274. cluster->cl_local_node == node->nd_num) {
  275. o2net_stop_listening(node);
  276. cluster->cl_local_node = O2NM_INVALID_NODE_NUM;
  277. }
  278. node->nd_local = tmp;
  279. if (node->nd_local) {
  280. cluster->cl_has_local = tmp;
  281. cluster->cl_local_node = node->nd_num;
  282. }
  283. return count;
  284. }
  285. struct o2nm_node_attribute {
  286. struct configfs_attribute attr;
  287. ssize_t (*show)(struct o2nm_node *, char *);
  288. ssize_t (*store)(struct o2nm_node *, const char *, size_t);
  289. };
  290. static struct o2nm_node_attribute o2nm_node_attr_num = {
  291. .attr = { .ca_owner = THIS_MODULE,
  292. .ca_name = "num",
  293. .ca_mode = S_IRUGO | S_IWUSR },
  294. .show = o2nm_node_num_read,
  295. .store = o2nm_node_num_write,
  296. };
  297. static struct o2nm_node_attribute o2nm_node_attr_ipv4_port = {
  298. .attr = { .ca_owner = THIS_MODULE,
  299. .ca_name = "ipv4_port",
  300. .ca_mode = S_IRUGO | S_IWUSR },
  301. .show = o2nm_node_ipv4_port_read,
  302. .store = o2nm_node_ipv4_port_write,
  303. };
  304. static struct o2nm_node_attribute o2nm_node_attr_ipv4_address = {
  305. .attr = { .ca_owner = THIS_MODULE,
  306. .ca_name = "ipv4_address",
  307. .ca_mode = S_IRUGO | S_IWUSR },
  308. .show = o2nm_node_ipv4_address_read,
  309. .store = o2nm_node_ipv4_address_write,
  310. };
  311. static struct o2nm_node_attribute o2nm_node_attr_local = {
  312. .attr = { .ca_owner = THIS_MODULE,
  313. .ca_name = "local",
  314. .ca_mode = S_IRUGO | S_IWUSR },
  315. .show = o2nm_node_local_read,
  316. .store = o2nm_node_local_write,
  317. };
  318. static struct configfs_attribute *o2nm_node_attrs[] = {
  319. [O2NM_NODE_ATTR_NUM] = &o2nm_node_attr_num.attr,
  320. [O2NM_NODE_ATTR_PORT] = &o2nm_node_attr_ipv4_port.attr,
  321. [O2NM_NODE_ATTR_ADDRESS] = &o2nm_node_attr_ipv4_address.attr,
  322. [O2NM_NODE_ATTR_LOCAL] = &o2nm_node_attr_local.attr,
  323. NULL,
  324. };
  325. static int o2nm_attr_index(struct configfs_attribute *attr)
  326. {
  327. int i;
  328. for (i = 0; i < ARRAY_SIZE(o2nm_node_attrs); i++) {
  329. if (attr == o2nm_node_attrs[i])
  330. return i;
  331. }
  332. BUG();
  333. return 0;
  334. }
  335. static ssize_t o2nm_node_show(struct config_item *item,
  336. struct configfs_attribute *attr,
  337. char *page)
  338. {
  339. struct o2nm_node *node = to_o2nm_node(item);
  340. struct o2nm_node_attribute *o2nm_node_attr =
  341. container_of(attr, struct o2nm_node_attribute, attr);
  342. ssize_t ret = 0;
  343. if (o2nm_node_attr->show)
  344. ret = o2nm_node_attr->show(node, page);
  345. return ret;
  346. }
  347. static ssize_t o2nm_node_store(struct config_item *item,
  348. struct configfs_attribute *attr,
  349. const char *page, size_t count)
  350. {
  351. struct o2nm_node *node = to_o2nm_node(item);
  352. struct o2nm_node_attribute *o2nm_node_attr =
  353. container_of(attr, struct o2nm_node_attribute, attr);
  354. ssize_t ret;
  355. int attr_index = o2nm_attr_index(attr);
  356. if (o2nm_node_attr->store == NULL) {
  357. ret = -EINVAL;
  358. goto out;
  359. }
  360. if (test_bit(attr_index, &node->nd_set_attributes))
  361. return -EBUSY;
  362. ret = o2nm_node_attr->store(node, page, count);
  363. if (ret < count)
  364. goto out;
  365. set_bit(attr_index, &node->nd_set_attributes);
  366. out:
  367. return ret;
  368. }
  369. static struct configfs_item_operations o2nm_node_item_ops = {
  370. .release = o2nm_node_release,
  371. .show_attribute = o2nm_node_show,
  372. .store_attribute = o2nm_node_store,
  373. };
  374. static struct config_item_type o2nm_node_type = {
  375. .ct_item_ops = &o2nm_node_item_ops,
  376. .ct_attrs = o2nm_node_attrs,
  377. .ct_owner = THIS_MODULE,
  378. };
  379. /* node set */
  380. struct o2nm_node_group {
  381. struct config_group ns_group;
  382. /* some stuff? */
  383. };
  384. #if 0
  385. static struct o2nm_node_group *to_o2nm_node_group(struct config_group *group)
  386. {
  387. return group ?
  388. container_of(group, struct o2nm_node_group, ns_group)
  389. : NULL;
  390. }
  391. #endif
  392. struct o2nm_cluster_attribute {
  393. struct configfs_attribute attr;
  394. ssize_t (*show)(struct o2nm_cluster *, char *);
  395. ssize_t (*store)(struct o2nm_cluster *, const char *, size_t);
  396. };
  397. static ssize_t o2nm_cluster_attr_write(const char *page, ssize_t count,
  398. unsigned int *val)
  399. {
  400. unsigned long tmp;
  401. char *p = (char *)page;
  402. tmp = simple_strtoul(p, &p, 0);
  403. if (!p || (*p && (*p != '\n')))
  404. return -EINVAL;
  405. if (tmp == 0)
  406. return -EINVAL;
  407. if (tmp >= (u32)-1)
  408. return -ERANGE;
  409. *val = tmp;
  410. return count;
  411. }
  412. static ssize_t o2nm_cluster_attr_idle_timeout_ms_read(
  413. struct o2nm_cluster *cluster, char *page)
  414. {
  415. return sprintf(page, "%u\n", cluster->cl_idle_timeout_ms);
  416. }
  417. static ssize_t o2nm_cluster_attr_idle_timeout_ms_write(
  418. struct o2nm_cluster *cluster, const char *page, size_t count)
  419. {
  420. ssize_t ret;
  421. unsigned int val;
  422. ret = o2nm_cluster_attr_write(page, count, &val);
  423. if (ret > 0) {
  424. if (cluster->cl_idle_timeout_ms != val
  425. && o2net_num_connected_peers()) {
  426. mlog(ML_NOTICE,
  427. "o2net: cannot change idle timeout after "
  428. "the first peer has agreed to it."
  429. " %d connected peers\n",
  430. o2net_num_connected_peers());
  431. ret = -EINVAL;
  432. } else if (val <= cluster->cl_keepalive_delay_ms) {
  433. mlog(ML_NOTICE, "o2net: idle timeout must be larger "
  434. "than keepalive delay\n");
  435. ret = -EINVAL;
  436. } else {
  437. cluster->cl_idle_timeout_ms = val;
  438. }
  439. }
  440. return ret;
  441. }
  442. static ssize_t o2nm_cluster_attr_keepalive_delay_ms_read(
  443. struct o2nm_cluster *cluster, char *page)
  444. {
  445. return sprintf(page, "%u\n", cluster->cl_keepalive_delay_ms);
  446. }
  447. static ssize_t o2nm_cluster_attr_keepalive_delay_ms_write(
  448. struct o2nm_cluster *cluster, const char *page, size_t count)
  449. {
  450. ssize_t ret;
  451. unsigned int val;
  452. ret = o2nm_cluster_attr_write(page, count, &val);
  453. if (ret > 0) {
  454. if (cluster->cl_keepalive_delay_ms != val
  455. && o2net_num_connected_peers()) {
  456. mlog(ML_NOTICE,
  457. "o2net: cannot change keepalive delay after"
  458. " the first peer has agreed to it."
  459. " %d connected peers\n",
  460. o2net_num_connected_peers());
  461. ret = -EINVAL;
  462. } else if (val >= cluster->cl_idle_timeout_ms) {
  463. mlog(ML_NOTICE, "o2net: keepalive delay must be "
  464. "smaller than idle timeout\n");
  465. ret = -EINVAL;
  466. } else {
  467. cluster->cl_keepalive_delay_ms = val;
  468. }
  469. }
  470. return ret;
  471. }
  472. static ssize_t o2nm_cluster_attr_reconnect_delay_ms_read(
  473. struct o2nm_cluster *cluster, char *page)
  474. {
  475. return sprintf(page, "%u\n", cluster->cl_reconnect_delay_ms);
  476. }
  477. static ssize_t o2nm_cluster_attr_reconnect_delay_ms_write(
  478. struct o2nm_cluster *cluster, const char *page, size_t count)
  479. {
  480. return o2nm_cluster_attr_write(page, count,
  481. &cluster->cl_reconnect_delay_ms);
  482. }
  483. static struct o2nm_cluster_attribute o2nm_cluster_attr_idle_timeout_ms = {
  484. .attr = { .ca_owner = THIS_MODULE,
  485. .ca_name = "idle_timeout_ms",
  486. .ca_mode = S_IRUGO | S_IWUSR },
  487. .show = o2nm_cluster_attr_idle_timeout_ms_read,
  488. .store = o2nm_cluster_attr_idle_timeout_ms_write,
  489. };
  490. static struct o2nm_cluster_attribute o2nm_cluster_attr_keepalive_delay_ms = {
  491. .attr = { .ca_owner = THIS_MODULE,
  492. .ca_name = "keepalive_delay_ms",
  493. .ca_mode = S_IRUGO | S_IWUSR },
  494. .show = o2nm_cluster_attr_keepalive_delay_ms_read,
  495. .store = o2nm_cluster_attr_keepalive_delay_ms_write,
  496. };
  497. static struct o2nm_cluster_attribute o2nm_cluster_attr_reconnect_delay_ms = {
  498. .attr = { .ca_owner = THIS_MODULE,
  499. .ca_name = "reconnect_delay_ms",
  500. .ca_mode = S_IRUGO | S_IWUSR },
  501. .show = o2nm_cluster_attr_reconnect_delay_ms_read,
  502. .store = o2nm_cluster_attr_reconnect_delay_ms_write,
  503. };
  504. static struct configfs_attribute *o2nm_cluster_attrs[] = {
  505. &o2nm_cluster_attr_idle_timeout_ms.attr,
  506. &o2nm_cluster_attr_keepalive_delay_ms.attr,
  507. &o2nm_cluster_attr_reconnect_delay_ms.attr,
  508. NULL,
  509. };
  510. static ssize_t o2nm_cluster_show(struct config_item *item,
  511. struct configfs_attribute *attr,
  512. char *page)
  513. {
  514. struct o2nm_cluster *cluster = to_o2nm_cluster(item);
  515. struct o2nm_cluster_attribute *o2nm_cluster_attr =
  516. container_of(attr, struct o2nm_cluster_attribute, attr);
  517. ssize_t ret = 0;
  518. if (o2nm_cluster_attr->show)
  519. ret = o2nm_cluster_attr->show(cluster, page);
  520. return ret;
  521. }
  522. static ssize_t o2nm_cluster_store(struct config_item *item,
  523. struct configfs_attribute *attr,
  524. const char *page, size_t count)
  525. {
  526. struct o2nm_cluster *cluster = to_o2nm_cluster(item);
  527. struct o2nm_cluster_attribute *o2nm_cluster_attr =
  528. container_of(attr, struct o2nm_cluster_attribute, attr);
  529. ssize_t ret;
  530. if (o2nm_cluster_attr->store == NULL) {
  531. ret = -EINVAL;
  532. goto out;
  533. }
  534. ret = o2nm_cluster_attr->store(cluster, page, count);
  535. if (ret < count)
  536. goto out;
  537. out:
  538. return ret;
  539. }
  540. static struct config_item *o2nm_node_group_make_item(struct config_group *group,
  541. const char *name)
  542. {
  543. struct o2nm_node *node = NULL;
  544. if (strlen(name) > O2NM_MAX_NAME_LEN)
  545. return ERR_PTR(-ENAMETOOLONG);
  546. node = kzalloc(sizeof(struct o2nm_node), GFP_KERNEL);
  547. if (node == NULL)
  548. return ERR_PTR(-ENOMEM);
  549. strcpy(node->nd_name, name); /* use item.ci_namebuf instead? */
  550. config_item_init_type_name(&node->nd_item, name, &o2nm_node_type);
  551. spin_lock_init(&node->nd_lock);
  552. return &node->nd_item;
  553. }
  554. static void o2nm_node_group_drop_item(struct config_group *group,
  555. struct config_item *item)
  556. {
  557. struct o2nm_node *node = to_o2nm_node(item);
  558. struct o2nm_cluster *cluster = to_o2nm_cluster(group->cg_item.ci_parent);
  559. o2net_disconnect_node(node);
  560. if (cluster->cl_has_local &&
  561. (cluster->cl_local_node == node->nd_num)) {
  562. cluster->cl_has_local = 0;
  563. cluster->cl_local_node = O2NM_INVALID_NODE_NUM;
  564. o2net_stop_listening(node);
  565. }
  566. /* XXX call into net to stop this node from trading messages */
  567. write_lock(&cluster->cl_nodes_lock);
  568. /* XXX sloppy */
  569. if (node->nd_ipv4_address)
  570. rb_erase(&node->nd_ip_node, &cluster->cl_node_ip_tree);
  571. /* nd_num might be 0 if the node number hasn't been set.. */
  572. if (cluster->cl_nodes[node->nd_num] == node) {
  573. cluster->cl_nodes[node->nd_num] = NULL;
  574. clear_bit(node->nd_num, cluster->cl_nodes_bitmap);
  575. }
  576. write_unlock(&cluster->cl_nodes_lock);
  577. config_item_put(item);
  578. }
  579. static struct configfs_group_operations o2nm_node_group_group_ops = {
  580. .make_item = o2nm_node_group_make_item,
  581. .drop_item = o2nm_node_group_drop_item,
  582. };
  583. static struct config_item_type o2nm_node_group_type = {
  584. .ct_group_ops = &o2nm_node_group_group_ops,
  585. .ct_owner = THIS_MODULE,
  586. };
  587. /* cluster */
  588. static void o2nm_cluster_release(struct config_item *item)
  589. {
  590. struct o2nm_cluster *cluster = to_o2nm_cluster(item);
  591. kfree(cluster->cl_group.default_groups);
  592. kfree(cluster);
  593. }
  594. static struct configfs_item_operations o2nm_cluster_item_ops = {
  595. .release = o2nm_cluster_release,
  596. .show_attribute = o2nm_cluster_show,
  597. .store_attribute = o2nm_cluster_store,
  598. };
  599. static struct config_item_type o2nm_cluster_type = {
  600. .ct_item_ops = &o2nm_cluster_item_ops,
  601. .ct_attrs = o2nm_cluster_attrs,
  602. .ct_owner = THIS_MODULE,
  603. };
  604. /* cluster set */
  605. struct o2nm_cluster_group {
  606. struct configfs_subsystem cs_subsys;
  607. /* some stuff? */
  608. };
  609. #if 0
  610. static struct o2nm_cluster_group *to_o2nm_cluster_group(struct config_group *group)
  611. {
  612. return group ?
  613. container_of(to_configfs_subsystem(group), struct o2nm_cluster_group, cs_subsys)
  614. : NULL;
  615. }
  616. #endif
  617. static struct config_group *o2nm_cluster_group_make_group(struct config_group *group,
  618. const char *name)
  619. {
  620. struct o2nm_cluster *cluster = NULL;
  621. struct o2nm_node_group *ns = NULL;
  622. struct config_group *o2hb_group = NULL, *ret = NULL;
  623. void *defs = NULL;
  624. /* this runs under the parent dir's i_mutex; there can be only
  625. * one caller in here at a time */
  626. if (o2nm_single_cluster)
  627. return ERR_PTR(-ENOSPC);
  628. cluster = kzalloc(sizeof(struct o2nm_cluster), GFP_KERNEL);
  629. ns = kzalloc(sizeof(struct o2nm_node_group), GFP_KERNEL);
  630. defs = kcalloc(3, sizeof(struct config_group *), GFP_KERNEL);
  631. o2hb_group = o2hb_alloc_hb_set();
  632. if (cluster == NULL || ns == NULL || o2hb_group == NULL || defs == NULL)
  633. goto out;
  634. config_group_init_type_name(&cluster->cl_group, name,
  635. &o2nm_cluster_type);
  636. config_group_init_type_name(&ns->ns_group, "node",
  637. &o2nm_node_group_type);
  638. cluster->cl_group.default_groups = defs;
  639. cluster->cl_group.default_groups[0] = &ns->ns_group;
  640. cluster->cl_group.default_groups[1] = o2hb_group;
  641. cluster->cl_group.default_groups[2] = NULL;
  642. rwlock_init(&cluster->cl_nodes_lock);
  643. cluster->cl_node_ip_tree = RB_ROOT;
  644. cluster->cl_reconnect_delay_ms = O2NET_RECONNECT_DELAY_MS_DEFAULT;
  645. cluster->cl_idle_timeout_ms = O2NET_IDLE_TIMEOUT_MS_DEFAULT;
  646. cluster->cl_keepalive_delay_ms = O2NET_KEEPALIVE_DELAY_MS_DEFAULT;
  647. ret = &cluster->cl_group;
  648. o2nm_single_cluster = cluster;
  649. out:
  650. if (ret == NULL) {
  651. kfree(cluster);
  652. kfree(ns);
  653. o2hb_free_hb_set(o2hb_group);
  654. kfree(defs);
  655. ret = ERR_PTR(-ENOMEM);
  656. }
  657. return ret;
  658. }
  659. static void o2nm_cluster_group_drop_item(struct config_group *group, struct config_item *item)
  660. {
  661. struct o2nm_cluster *cluster = to_o2nm_cluster(item);
  662. int i;
  663. struct config_item *killme;
  664. BUG_ON(o2nm_single_cluster != cluster);
  665. o2nm_single_cluster = NULL;
  666. for (i = 0; cluster->cl_group.default_groups[i]; i++) {
  667. killme = &cluster->cl_group.default_groups[i]->cg_item;
  668. cluster->cl_group.default_groups[i] = NULL;
  669. config_item_put(killme);
  670. }
  671. config_item_put(item);
  672. }
  673. static struct configfs_group_operations o2nm_cluster_group_group_ops = {
  674. .make_group = o2nm_cluster_group_make_group,
  675. .drop_item = o2nm_cluster_group_drop_item,
  676. };
  677. static struct config_item_type o2nm_cluster_group_type = {
  678. .ct_group_ops = &o2nm_cluster_group_group_ops,
  679. .ct_owner = THIS_MODULE,
  680. };
  681. static struct o2nm_cluster_group o2nm_cluster_group = {
  682. .cs_subsys = {
  683. .su_group = {
  684. .cg_item = {
  685. .ci_namebuf = "cluster",
  686. .ci_type = &o2nm_cluster_group_type,
  687. },
  688. },
  689. },
  690. };
  691. int o2nm_depend_item(struct config_item *item)
  692. {
  693. return configfs_depend_item(&o2nm_cluster_group.cs_subsys, item);
  694. }
  695. void o2nm_undepend_item(struct config_item *item)
  696. {
  697. configfs_undepend_item(&o2nm_cluster_group.cs_subsys, item);
  698. }
  699. int o2nm_depend_this_node(void)
  700. {
  701. int ret = 0;
  702. struct o2nm_node *local_node;
  703. local_node = o2nm_get_node_by_num(o2nm_this_node());
  704. if (!local_node) {
  705. ret = -EINVAL;
  706. goto out;
  707. }
  708. ret = o2nm_depend_item(&local_node->nd_item);
  709. o2nm_node_put(local_node);
  710. out:
  711. return ret;
  712. }
  713. void o2nm_undepend_this_node(void)
  714. {
  715. struct o2nm_node *local_node;
  716. local_node = o2nm_get_node_by_num(o2nm_this_node());
  717. BUG_ON(!local_node);
  718. o2nm_undepend_item(&local_node->nd_item);
  719. o2nm_node_put(local_node);
  720. }
  721. static void __exit exit_o2nm(void)
  722. {
  723. /* XXX sync with hb callbacks and shut down hb? */
  724. o2net_unregister_hb_callbacks();
  725. configfs_unregister_subsystem(&o2nm_cluster_group.cs_subsys);
  726. o2cb_sys_shutdown();
  727. o2net_exit();
  728. o2hb_exit();
  729. }
  730. static int __init init_o2nm(void)
  731. {
  732. int ret = -1;
  733. cluster_print_version();
  734. ret = o2hb_init();
  735. if (ret)
  736. goto out;
  737. ret = o2net_init();
  738. if (ret)
  739. goto out_o2hb;
  740. ret = o2net_register_hb_callbacks();
  741. if (ret)
  742. goto out_o2net;
  743. config_group_init(&o2nm_cluster_group.cs_subsys.su_group);
  744. mutex_init(&o2nm_cluster_group.cs_subsys.su_mutex);
  745. ret = configfs_register_subsystem(&o2nm_cluster_group.cs_subsys);
  746. if (ret) {
  747. printk(KERN_ERR "nodemanager: Registration returned %d\n", ret);
  748. goto out_callbacks;
  749. }
  750. ret = o2cb_sys_init();
  751. if (!ret)
  752. goto out;
  753. configfs_unregister_subsystem(&o2nm_cluster_group.cs_subsys);
  754. out_callbacks:
  755. o2net_unregister_hb_callbacks();
  756. out_o2net:
  757. o2net_exit();
  758. out_o2hb:
  759. o2hb_exit();
  760. out:
  761. return ret;
  762. }
  763. MODULE_AUTHOR("Oracle");
  764. MODULE_LICENSE("GPL");
  765. module_init(init_o2nm)
  766. module_exit(exit_o2nm)