nodemanager.c (13a83fc9096dfaf2a7f4671b5777780bbe1d4a30) nodemanager.c (45b997737a8025be2825e464e9e9dd5d07160dc3)
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

--- 158 unchanged lines hidden (view full) ---

167}
168
169static void o2nm_node_release(struct config_item *item)
170{
171 struct o2nm_node *node = to_o2nm_node(item);
172 kfree(node);
173}
174
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

--- 158 unchanged lines hidden (view full) ---

167}
168
169static void o2nm_node_release(struct config_item *item)
170{
171 struct o2nm_node *node = to_o2nm_node(item);
172 kfree(node);
173}
174
175static ssize_t o2nm_node_num_read(struct o2nm_node *node, char *page)
175static ssize_t o2nm_node_num_show(struct config_item *item, char *page)
176{
176{
177 return sprintf(page, "%d\n", node->nd_num);
177 return sprintf(page, "%d\n", to_o2nm_node(item)->nd_num);
178}
179
180static struct o2nm_cluster *to_o2nm_cluster_from_node(struct o2nm_node *node)
181{
182 /* through the first node_set .parent
183 * mycluster/nodes/mynode == o2nm_cluster->o2nm_node_group->o2nm_node */
184 return to_o2nm_cluster(node->nd_item.ci_parent->ci_parent);
185}
186
187enum {
188 O2NM_NODE_ATTR_NUM = 0,
189 O2NM_NODE_ATTR_PORT,
190 O2NM_NODE_ATTR_ADDRESS,
191};
192
178}
179
180static struct o2nm_cluster *to_o2nm_cluster_from_node(struct o2nm_node *node)
181{
182 /* through the first node_set .parent
183 * mycluster/nodes/mynode == o2nm_cluster->o2nm_node_group->o2nm_node */
184 return to_o2nm_cluster(node->nd_item.ci_parent->ci_parent);
185}
186
187enum {
188 O2NM_NODE_ATTR_NUM = 0,
189 O2NM_NODE_ATTR_PORT,
190 O2NM_NODE_ATTR_ADDRESS,
191};
192
193static ssize_t o2nm_node_num_write(struct o2nm_node *node, const char *page,
193static ssize_t o2nm_node_num_store(struct config_item *item, const char *page,
194 size_t count)
195{
194 size_t count)
195{
196 struct o2nm_node *node = to_o2nm_node(item);
196 struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
197 unsigned long tmp;
198 char *p = (char *)page;
199 int ret = 0;
200
201 tmp = simple_strtoul(p, &p, 0);
202 if (!p || (*p && (*p != '\n')))
203 return -EINVAL;

--- 21 unchanged lines hidden (view full) ---

225 set_bit(tmp, cluster->cl_nodes_bitmap);
226 }
227 write_unlock(&cluster->cl_nodes_lock);
228 if (ret)
229 return ret;
230
231 return count;
232}
197 struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
198 unsigned long tmp;
199 char *p = (char *)page;
200 int ret = 0;
201
202 tmp = simple_strtoul(p, &p, 0);
203 if (!p || (*p && (*p != '\n')))
204 return -EINVAL;

--- 21 unchanged lines hidden (view full) ---

226 set_bit(tmp, cluster->cl_nodes_bitmap);
227 }
228 write_unlock(&cluster->cl_nodes_lock);
229 if (ret)
230 return ret;
231
232 return count;
233}
233static ssize_t o2nm_node_ipv4_port_read(struct o2nm_node *node, char *page)
234static ssize_t o2nm_node_ipv4_port_show(struct config_item *item, char *page)
234{
235{
235 return sprintf(page, "%u\n", ntohs(node->nd_ipv4_port));
236 return sprintf(page, "%u\n", ntohs(to_o2nm_node(item)->nd_ipv4_port));
236}
237
237}
238
238static ssize_t o2nm_node_ipv4_port_write(struct o2nm_node *node,
239static ssize_t o2nm_node_ipv4_port_store(struct config_item *item,
239 const char *page, size_t count)
240{
240 const char *page, size_t count)
241{
242 struct o2nm_node *node = to_o2nm_node(item);
241 unsigned long tmp;
242 char *p = (char *)page;
243
244 tmp = simple_strtoul(p, &p, 0);
245 if (!p || (*p && (*p != '\n')))
246 return -EINVAL;
247
248 if (tmp == 0)
249 return -EINVAL;
250 if (tmp >= (u16)-1)
251 return -ERANGE;
252
253 if (test_and_set_bit(O2NM_NODE_ATTR_PORT, &node->nd_set_attributes))
254 return -EBUSY;
255 node->nd_ipv4_port = htons(tmp);
256
257 return count;
258}
259
243 unsigned long tmp;
244 char *p = (char *)page;
245
246 tmp = simple_strtoul(p, &p, 0);
247 if (!p || (*p && (*p != '\n')))
248 return -EINVAL;
249
250 if (tmp == 0)
251 return -EINVAL;
252 if (tmp >= (u16)-1)
253 return -ERANGE;
254
255 if (test_and_set_bit(O2NM_NODE_ATTR_PORT, &node->nd_set_attributes))
256 return -EBUSY;
257 node->nd_ipv4_port = htons(tmp);
258
259 return count;
260}
261
260static ssize_t o2nm_node_ipv4_address_read(struct o2nm_node *node, char *page)
262static ssize_t o2nm_node_ipv4_address_show(struct config_item *item, char *page)
261{
263{
262 return sprintf(page, "%pI4\n", &node->nd_ipv4_address);
264 return sprintf(page, "%pI4\n", &to_o2nm_node(item)->nd_ipv4_address);
263}
264
265}
266
265static ssize_t o2nm_node_ipv4_address_write(struct o2nm_node *node,
267static ssize_t o2nm_node_ipv4_address_store(struct config_item *item,
266 const char *page,
267 size_t count)
268{
268 const char *page,
269 size_t count)
270{
271 struct o2nm_node *node = to_o2nm_node(item);
269 struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
270 int ret, i;
271 struct rb_node **p, *parent;
272 unsigned int octets[4];
273 __be32 ipv4_addr = 0;
274
275 ret = sscanf(page, "%3u.%3u.%3u.%3u", &octets[3], &octets[2],
276 &octets[1], &octets[0]);

--- 21 unchanged lines hidden (view full) ---

298 if (ret)
299 return ret;
300
301 memcpy(&node->nd_ipv4_address, &ipv4_addr, sizeof(ipv4_addr));
302
303 return count;
304}
305
272 struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
273 int ret, i;
274 struct rb_node **p, *parent;
275 unsigned int octets[4];
276 __be32 ipv4_addr = 0;
277
278 ret = sscanf(page, "%3u.%3u.%3u.%3u", &octets[3], &octets[2],
279 &octets[1], &octets[0]);

--- 21 unchanged lines hidden (view full) ---

301 if (ret)
302 return ret;
303
304 memcpy(&node->nd_ipv4_address, &ipv4_addr, sizeof(ipv4_addr));
305
306 return count;
307}
308
306static ssize_t o2nm_node_local_read(struct o2nm_node *node, char *page)
309static ssize_t o2nm_node_local_show(struct config_item *item, char *page)
307{
310{
308 return sprintf(page, "%d\n", node->nd_local);
311 return sprintf(page, "%d\n", to_o2nm_node(item)->nd_local);
309}
310
312}
313
311static ssize_t o2nm_node_local_write(struct o2nm_node *node, const char *page,
314static ssize_t o2nm_node_local_store(struct config_item *item, const char *page,
312 size_t count)
313{
315 size_t count)
316{
317 struct o2nm_node *node = to_o2nm_node(item);
314 struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
315 unsigned long tmp;
316 char *p = (char *)page;
317 ssize_t ret;
318
319 tmp = simple_strtoul(p, &p, 0);
320 if (!p || (*p && (*p != '\n')))
321 return -EINVAL;

--- 30 unchanged lines hidden (view full) ---

352 if (node->nd_local) {
353 cluster->cl_has_local = tmp;
354 cluster->cl_local_node = node->nd_num;
355 }
356
357 return count;
358}
359
318 struct o2nm_cluster *cluster = to_o2nm_cluster_from_node(node);
319 unsigned long tmp;
320 char *p = (char *)page;
321 ssize_t ret;
322
323 tmp = simple_strtoul(p, &p, 0);
324 if (!p || (*p && (*p != '\n')))
325 return -EINVAL;

--- 30 unchanged lines hidden (view full) ---

356 if (node->nd_local) {
357 cluster->cl_has_local = tmp;
358 cluster->cl_local_node = node->nd_num;
359 }
360
361 return count;
362}
363
360struct o2nm_node_attribute {
361 struct configfs_attribute attr;
362 ssize_t (*show)(struct o2nm_node *, char *);
363 ssize_t (*store)(struct o2nm_node *, const char *, size_t);
364};
364CONFIGFS_ATTR(o2nm_node_, num);
365CONFIGFS_ATTR(o2nm_node_, ipv4_port);
366CONFIGFS_ATTR(o2nm_node_, ipv4_address);
367CONFIGFS_ATTR(o2nm_node_, local);
365
368
366static struct o2nm_node_attribute o2nm_node_attr_num = {
367 .attr = { .ca_owner = THIS_MODULE,
368 .ca_name = "num",
369 .ca_mode = S_IRUGO | S_IWUSR },
370 .show = o2nm_node_num_read,
371 .store = o2nm_node_num_write,
372};
373
374static struct o2nm_node_attribute o2nm_node_attr_ipv4_port = {
375 .attr = { .ca_owner = THIS_MODULE,
376 .ca_name = "ipv4_port",
377 .ca_mode = S_IRUGO | S_IWUSR },
378 .show = o2nm_node_ipv4_port_read,
379 .store = o2nm_node_ipv4_port_write,
380};
381
382static struct o2nm_node_attribute o2nm_node_attr_ipv4_address = {
383 .attr = { .ca_owner = THIS_MODULE,
384 .ca_name = "ipv4_address",
385 .ca_mode = S_IRUGO | S_IWUSR },
386 .show = o2nm_node_ipv4_address_read,
387 .store = o2nm_node_ipv4_address_write,
388};
389
390static struct o2nm_node_attribute o2nm_node_attr_local = {
391 .attr = { .ca_owner = THIS_MODULE,
392 .ca_name = "local",
393 .ca_mode = S_IRUGO | S_IWUSR },
394 .show = o2nm_node_local_read,
395 .store = o2nm_node_local_write,
396};
397
398static struct configfs_attribute *o2nm_node_attrs[] = {
369static struct configfs_attribute *o2nm_node_attrs[] = {
399 &o2nm_node_attr_num.attr,
400 &o2nm_node_attr_ipv4_port.attr,
401 &o2nm_node_attr_ipv4_address.attr,
402 &o2nm_node_attr_local.attr,
370 &o2nm_node_attr_num,
371 &o2nm_node_attr_ipv4_port,
372 &o2nm_node_attr_ipv4_address,
373 &o2nm_node_attr_local,
403 NULL,
404};
405
374 NULL,
375};
376
406static ssize_t o2nm_node_show(struct config_item *item,
407 struct configfs_attribute *attr,
408 char *page)
409{
410 struct o2nm_node *node = to_o2nm_node(item);
411 struct o2nm_node_attribute *o2nm_node_attr =
412 container_of(attr, struct o2nm_node_attribute, attr);
413 ssize_t ret = 0;
414
415 if (o2nm_node_attr->show)
416 ret = o2nm_node_attr->show(node, page);
417 return ret;
418}
419
420static ssize_t o2nm_node_store(struct config_item *item,
421 struct configfs_attribute *attr,
422 const char *page, size_t count)
423{
424 struct o2nm_node *node = to_o2nm_node(item);
425 struct o2nm_node_attribute *o2nm_node_attr =
426 container_of(attr, struct o2nm_node_attribute, attr);
427
428 if (o2nm_node_attr->store == NULL)
429 return -EINVAL;
430
431 return o2nm_node_attr->store(node, page, count);
432}
433
434static struct configfs_item_operations o2nm_node_item_ops = {
435 .release = o2nm_node_release,
377static struct configfs_item_operations o2nm_node_item_ops = {
378 .release = o2nm_node_release,
436 .show_attribute = o2nm_node_show,
437 .store_attribute = o2nm_node_store,
438};
439
440static struct config_item_type o2nm_node_type = {
441 .ct_item_ops = &o2nm_node_item_ops,
442 .ct_attrs = o2nm_node_attrs,
443 .ct_owner = THIS_MODULE,
444};
445

--- 8 unchanged lines hidden (view full) ---

454static struct o2nm_node_group *to_o2nm_node_group(struct config_group *group)
455{
456 return group ?
457 container_of(group, struct o2nm_node_group, ns_group)
458 : NULL;
459}
460#endif
461
379};
380
381static struct config_item_type o2nm_node_type = {
382 .ct_item_ops = &o2nm_node_item_ops,
383 .ct_attrs = o2nm_node_attrs,
384 .ct_owner = THIS_MODULE,
385};
386

--- 8 unchanged lines hidden (view full) ---

395static struct o2nm_node_group *to_o2nm_node_group(struct config_group *group)
396{
397 return group ?
398 container_of(group, struct o2nm_node_group, ns_group)
399 : NULL;
400}
401#endif
402
462struct o2nm_cluster_attribute {
463 struct configfs_attribute attr;
464 ssize_t (*show)(struct o2nm_cluster *, char *);
465 ssize_t (*store)(struct o2nm_cluster *, const char *, size_t);
466};
467
468static ssize_t o2nm_cluster_attr_write(const char *page, ssize_t count,
469 unsigned int *val)
470{
471 unsigned long tmp;
472 char *p = (char *)page;
473
474 tmp = simple_strtoul(p, &p, 0);
475 if (!p || (*p && (*p != '\n')))

--- 4 unchanged lines hidden (view full) ---

480 if (tmp >= (u32)-1)
481 return -ERANGE;
482
483 *val = tmp;
484
485 return count;
486}
487
403static ssize_t o2nm_cluster_attr_write(const char *page, ssize_t count,
404 unsigned int *val)
405{
406 unsigned long tmp;
407 char *p = (char *)page;
408
409 tmp = simple_strtoul(p, &p, 0);
410 if (!p || (*p && (*p != '\n')))

--- 4 unchanged lines hidden (view full) ---

415 if (tmp >= (u32)-1)
416 return -ERANGE;
417
418 *val = tmp;
419
420 return count;
421}
422
488static ssize_t o2nm_cluster_attr_idle_timeout_ms_read(
489 struct o2nm_cluster *cluster, char *page)
423static ssize_t o2nm_cluster_idle_timeout_ms_show(struct config_item *item,
424 char *page)
490{
425{
491 return sprintf(page, "%u\n", cluster->cl_idle_timeout_ms);
426 return sprintf(page, "%u\n", to_o2nm_cluster(item)->cl_idle_timeout_ms);
492}
493
427}
428
494static ssize_t o2nm_cluster_attr_idle_timeout_ms_write(
495 struct o2nm_cluster *cluster, const char *page, size_t count)
429static ssize_t o2nm_cluster_idle_timeout_ms_store(struct config_item *item,
430 const char *page, size_t count)
496{
431{
432 struct o2nm_cluster *cluster = to_o2nm_cluster(item);
497 ssize_t ret;
498 unsigned int val;
499
500 ret = o2nm_cluster_attr_write(page, count, &val);
501
502 if (ret > 0) {
503 if (cluster->cl_idle_timeout_ms != val
504 && o2net_num_connected_peers()) {

--- 10 unchanged lines hidden (view full) ---

515 } else {
516 cluster->cl_idle_timeout_ms = val;
517 }
518 }
519
520 return ret;
521}
522
433 ssize_t ret;
434 unsigned int val;
435
436 ret = o2nm_cluster_attr_write(page, count, &val);
437
438 if (ret > 0) {
439 if (cluster->cl_idle_timeout_ms != val
440 && o2net_num_connected_peers()) {

--- 10 unchanged lines hidden (view full) ---

451 } else {
452 cluster->cl_idle_timeout_ms = val;
453 }
454 }
455
456 return ret;
457}
458
523static ssize_t o2nm_cluster_attr_keepalive_delay_ms_read(
524 struct o2nm_cluster *cluster, char *page)
459static ssize_t o2nm_cluster_keepalive_delay_ms_show(
460 struct config_item *item, char *page)
525{
461{
526 return sprintf(page, "%u\n", cluster->cl_keepalive_delay_ms);
462 return sprintf(page, "%u\n",
463 to_o2nm_cluster(item)->cl_keepalive_delay_ms);
527}
528
464}
465
529static ssize_t o2nm_cluster_attr_keepalive_delay_ms_write(
530 struct o2nm_cluster *cluster, const char *page, size_t count)
466static ssize_t o2nm_cluster_keepalive_delay_ms_store(
467 struct config_item *item, const char *page, size_t count)
531{
468{
469 struct o2nm_cluster *cluster = to_o2nm_cluster(item);
532 ssize_t ret;
533 unsigned int val;
534
535 ret = o2nm_cluster_attr_write(page, count, &val);
536
537 if (ret > 0) {
538 if (cluster->cl_keepalive_delay_ms != val
539 && o2net_num_connected_peers()) {

--- 10 unchanged lines hidden (view full) ---

550 } else {
551 cluster->cl_keepalive_delay_ms = val;
552 }
553 }
554
555 return ret;
556}
557
470 ssize_t ret;
471 unsigned int val;
472
473 ret = o2nm_cluster_attr_write(page, count, &val);
474
475 if (ret > 0) {
476 if (cluster->cl_keepalive_delay_ms != val
477 && o2net_num_connected_peers()) {

--- 10 unchanged lines hidden (view full) ---

488 } else {
489 cluster->cl_keepalive_delay_ms = val;
490 }
491 }
492
493 return ret;
494}
495
558static ssize_t o2nm_cluster_attr_reconnect_delay_ms_read(
559 struct o2nm_cluster *cluster, char *page)
496static ssize_t o2nm_cluster_reconnect_delay_ms_show(
497 struct config_item *item, char *page)
560{
498{
561 return sprintf(page, "%u\n", cluster->cl_reconnect_delay_ms);
499 return sprintf(page, "%u\n",
500 to_o2nm_cluster(item)->cl_reconnect_delay_ms);
562}
563
501}
502
564static ssize_t o2nm_cluster_attr_reconnect_delay_ms_write(
565 struct o2nm_cluster *cluster, const char *page, size_t count)
503static ssize_t o2nm_cluster_reconnect_delay_ms_store(
504 struct config_item *item, const char *page, size_t count)
566{
567 return o2nm_cluster_attr_write(page, count,
505{
506 return o2nm_cluster_attr_write(page, count,
568 &cluster->cl_reconnect_delay_ms);
507 &to_o2nm_cluster(item)->cl_reconnect_delay_ms);
569}
570
508}
509
571static ssize_t o2nm_cluster_attr_fence_method_read(
572 struct o2nm_cluster *cluster, char *page)
510static ssize_t o2nm_cluster_fence_method_show(
511 struct config_item *item, char *page)
573{
512{
513 struct o2nm_cluster *cluster = to_o2nm_cluster(item);
574 ssize_t ret = 0;
575
576 if (cluster)
577 ret = sprintf(page, "%s\n",
578 o2nm_fence_method_desc[cluster->cl_fence_method]);
579 return ret;
580}
581
514 ssize_t ret = 0;
515
516 if (cluster)
517 ret = sprintf(page, "%s\n",
518 o2nm_fence_method_desc[cluster->cl_fence_method]);
519 return ret;
520}
521
582static ssize_t o2nm_cluster_attr_fence_method_write(
583 struct o2nm_cluster *cluster, const char *page, size_t count)
522static ssize_t o2nm_cluster_fence_method_store(
523 struct config_item *item, const char *page, size_t count)
584{
585 unsigned int i;
586
587 if (page[count - 1] != '\n')
588 goto bail;
589
590 for (i = 0; i < O2NM_FENCE_METHODS; ++i) {
591 if (count != strlen(o2nm_fence_method_desc[i]) + 1)
592 continue;
593 if (strncasecmp(page, o2nm_fence_method_desc[i], count - 1))
594 continue;
524{
525 unsigned int i;
526
527 if (page[count - 1] != '\n')
528 goto bail;
529
530 for (i = 0; i < O2NM_FENCE_METHODS; ++i) {
531 if (count != strlen(o2nm_fence_method_desc[i]) + 1)
532 continue;
533 if (strncasecmp(page, o2nm_fence_method_desc[i], count - 1))
534 continue;
595 if (cluster->cl_fence_method != i) {
535 if (to_o2nm_cluster(item)->cl_fence_method != i) {
596 printk(KERN_INFO "ocfs2: Changing fence method to %s\n",
597 o2nm_fence_method_desc[i]);
536 printk(KERN_INFO "ocfs2: Changing fence method to %s\n",
537 o2nm_fence_method_desc[i]);
598 cluster->cl_fence_method = i;
538 to_o2nm_cluster(item)->cl_fence_method = i;
599 }
600 return count;
601 }
602
603bail:
604 return -EINVAL;
605}
606
539 }
540 return count;
541 }
542
543bail:
544 return -EINVAL;
545}
546
607static struct o2nm_cluster_attribute o2nm_cluster_attr_idle_timeout_ms = {
608 .attr = { .ca_owner = THIS_MODULE,
609 .ca_name = "idle_timeout_ms",
610 .ca_mode = S_IRUGO | S_IWUSR },
611 .show = o2nm_cluster_attr_idle_timeout_ms_read,
612 .store = o2nm_cluster_attr_idle_timeout_ms_write,
613};
547CONFIGFS_ATTR(o2nm_cluster_, idle_timeout_ms);
548CONFIGFS_ATTR(o2nm_cluster_, keepalive_delay_ms);
549CONFIGFS_ATTR(o2nm_cluster_, reconnect_delay_ms);
550CONFIGFS_ATTR(o2nm_cluster_, fence_method);
614
551
615static struct o2nm_cluster_attribute o2nm_cluster_attr_keepalive_delay_ms = {
616 .attr = { .ca_owner = THIS_MODULE,
617 .ca_name = "keepalive_delay_ms",
618 .ca_mode = S_IRUGO | S_IWUSR },
619 .show = o2nm_cluster_attr_keepalive_delay_ms_read,
620 .store = o2nm_cluster_attr_keepalive_delay_ms_write,
621};
622
623static struct o2nm_cluster_attribute o2nm_cluster_attr_reconnect_delay_ms = {
624 .attr = { .ca_owner = THIS_MODULE,
625 .ca_name = "reconnect_delay_ms",
626 .ca_mode = S_IRUGO | S_IWUSR },
627 .show = o2nm_cluster_attr_reconnect_delay_ms_read,
628 .store = o2nm_cluster_attr_reconnect_delay_ms_write,
629};
630
631static struct o2nm_cluster_attribute o2nm_cluster_attr_fence_method = {
632 .attr = { .ca_owner = THIS_MODULE,
633 .ca_name = "fence_method",
634 .ca_mode = S_IRUGO | S_IWUSR },
635 .show = o2nm_cluster_attr_fence_method_read,
636 .store = o2nm_cluster_attr_fence_method_write,
637};
638
639static struct configfs_attribute *o2nm_cluster_attrs[] = {
552static struct configfs_attribute *o2nm_cluster_attrs[] = {
640 &o2nm_cluster_attr_idle_timeout_ms.attr,
641 &o2nm_cluster_attr_keepalive_delay_ms.attr,
642 &o2nm_cluster_attr_reconnect_delay_ms.attr,
643 &o2nm_cluster_attr_fence_method.attr,
553 &o2nm_cluster_attr_idle_timeout_ms,
554 &o2nm_cluster_attr_keepalive_delay_ms,
555 &o2nm_cluster_attr_reconnect_delay_ms,
556 &o2nm_cluster_attr_fence_method,
644 NULL,
645};
557 NULL,
558};
646static ssize_t o2nm_cluster_show(struct config_item *item,
647 struct configfs_attribute *attr,
648 char *page)
649{
650 struct o2nm_cluster *cluster = to_o2nm_cluster(item);
651 struct o2nm_cluster_attribute *o2nm_cluster_attr =
652 container_of(attr, struct o2nm_cluster_attribute, attr);
653 ssize_t ret = 0;
654
559
655 if (o2nm_cluster_attr->show)
656 ret = o2nm_cluster_attr->show(cluster, page);
657 return ret;
658}
659
660static ssize_t o2nm_cluster_store(struct config_item *item,
661 struct configfs_attribute *attr,
662 const char *page, size_t count)
663{
664 struct o2nm_cluster *cluster = to_o2nm_cluster(item);
665 struct o2nm_cluster_attribute *o2nm_cluster_attr =
666 container_of(attr, struct o2nm_cluster_attribute, attr);
667 ssize_t ret;
668
669 if (o2nm_cluster_attr->store == NULL) {
670 ret = -EINVAL;
671 goto out;
672 }
673
674 ret = o2nm_cluster_attr->store(cluster, page, count);
675 if (ret < count)
676 goto out;
677out:
678 return ret;
679}
680
681static struct config_item *o2nm_node_group_make_item(struct config_group *group,
682 const char *name)
683{
684 struct o2nm_node *node = NULL;
685
686 if (strlen(name) > O2NM_MAX_NAME_LEN)
687 return ERR_PTR(-ENAMETOOLONG);
688

--- 63 unchanged lines hidden (view full) ---

752 struct o2nm_cluster *cluster = to_o2nm_cluster(item);
753
754 kfree(cluster->cl_group.default_groups);
755 kfree(cluster);
756}
757
758static struct configfs_item_operations o2nm_cluster_item_ops = {
759 .release = o2nm_cluster_release,
560static struct config_item *o2nm_node_group_make_item(struct config_group *group,
561 const char *name)
562{
563 struct o2nm_node *node = NULL;
564
565 if (strlen(name) > O2NM_MAX_NAME_LEN)
566 return ERR_PTR(-ENAMETOOLONG);
567

--- 63 unchanged lines hidden (view full) ---

631 struct o2nm_cluster *cluster = to_o2nm_cluster(item);
632
633 kfree(cluster->cl_group.default_groups);
634 kfree(cluster);
635}
636
637static struct configfs_item_operations o2nm_cluster_item_ops = {
638 .release = o2nm_cluster_release,
760 .show_attribute = o2nm_cluster_show,
761 .store_attribute = o2nm_cluster_store,
762};
763
764static struct config_item_type o2nm_cluster_type = {
765 .ct_item_ops = &o2nm_cluster_item_ops,
766 .ct_attrs = o2nm_cluster_attrs,
767 .ct_owner = THIS_MODULE,
768};
769

--- 202 unchanged lines hidden ---
639};
640
641static struct config_item_type o2nm_cluster_type = {
642 .ct_item_ops = &o2nm_cluster_item_ops,
643 .ct_attrs = o2nm_cluster_attrs,
644 .ct_owner = THIS_MODULE,
645};
646

--- 202 unchanged lines hidden ---