nodemanager.c 21 KB

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