1 /******************************************************************************
2 *******************************************************************************
4 ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
5 ** Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
7 ** This copyrighted material is made available to anyone wishing to use,
8 ** modify, copy, or redistribute it subject to the terms and conditions
9 ** of the GNU General Public License v.2.
11 *******************************************************************************
12 ******************************************************************************/
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/configfs.h>
17 #include <linux/slab.h>
19 #include <linux/in6.h>
20 #include <linux/dlmconstants.h>
28 * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/nodeid
29 * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/weight
30 * /config/dlm/<cluster>/comms/<comm>/nodeid
31 * /config/dlm/<cluster>/comms/<comm>/local
32 * /config/dlm/<cluster>/comms/<comm>/addr (write only)
33 * /config/dlm/<cluster>/comms/<comm>/addr_list (read only)
34 * The <cluster> level is useless, but I haven't figured out how to avoid it.
37 static struct config_group
*space_list
;
38 static struct config_group
*comm_list
;
39 static struct dlm_comm
*local_comm
;
40 static uint32_t dlm_comm_count
;
51 static struct config_group
*make_cluster(struct config_group
*, const char *);
52 static void drop_cluster(struct config_group
*, struct config_item
*);
53 static void release_cluster(struct config_item
*);
54 static struct config_group
*make_space(struct config_group
*, const char *);
55 static void drop_space(struct config_group
*, struct config_item
*);
56 static void release_space(struct config_item
*);
57 static struct config_item
*make_comm(struct config_group
*, const char *);
58 static void drop_comm(struct config_group
*, struct config_item
*);
59 static void release_comm(struct config_item
*);
60 static struct config_item
*make_node(struct config_group
*, const char *);
61 static void drop_node(struct config_group
*, struct config_item
*);
62 static void release_node(struct config_item
*);
64 static ssize_t
show_cluster(struct config_item
*i
, struct configfs_attribute
*a
,
66 static ssize_t
store_cluster(struct config_item
*i
,
67 struct configfs_attribute
*a
,
68 const char *buf
, size_t len
);
69 static ssize_t
show_comm(struct config_item
*i
, struct configfs_attribute
*a
,
71 static ssize_t
store_comm(struct config_item
*i
, struct configfs_attribute
*a
,
72 const char *buf
, size_t len
);
73 static ssize_t
show_node(struct config_item
*i
, struct configfs_attribute
*a
,
75 static ssize_t
store_node(struct config_item
*i
, struct configfs_attribute
*a
,
76 const char *buf
, size_t len
);
78 static ssize_t
comm_nodeid_read(struct dlm_comm
*cm
, char *buf
);
79 static ssize_t
comm_nodeid_write(struct dlm_comm
*cm
, const char *buf
,
81 static ssize_t
comm_local_read(struct dlm_comm
*cm
, char *buf
);
82 static ssize_t
comm_local_write(struct dlm_comm
*cm
, const char *buf
,
84 static ssize_t
comm_addr_write(struct dlm_comm
*cm
, const char *buf
,
86 static ssize_t
comm_addr_list_read(struct dlm_comm
*cm
, char *buf
);
87 static ssize_t
node_nodeid_read(struct dlm_node
*nd
, char *buf
);
88 static ssize_t
node_nodeid_write(struct dlm_node
*nd
, const char *buf
,
90 static ssize_t
node_weight_read(struct dlm_node
*nd
, char *buf
);
91 static ssize_t
node_weight_write(struct dlm_node
*nd
, const char *buf
,
95 struct config_group group
;
96 unsigned int cl_tcp_port
;
97 unsigned int cl_buffer_size
;
98 unsigned int cl_rsbtbl_size
;
99 unsigned int cl_recover_timer
;
100 unsigned int cl_toss_secs
;
101 unsigned int cl_scan_secs
;
102 unsigned int cl_log_debug
;
103 unsigned int cl_protocol
;
104 unsigned int cl_timewarn_cs
;
105 unsigned int cl_waitwarn_us
;
106 unsigned int cl_new_rsb_count
;
107 unsigned int cl_recover_callbacks
;
108 char cl_cluster_name
[DLM_LOCKSPACE_LEN
];
112 CLUSTER_ATTR_TCP_PORT
= 0,
113 CLUSTER_ATTR_BUFFER_SIZE
,
114 CLUSTER_ATTR_RSBTBL_SIZE
,
115 CLUSTER_ATTR_RECOVER_TIMER
,
116 CLUSTER_ATTR_TOSS_SECS
,
117 CLUSTER_ATTR_SCAN_SECS
,
118 CLUSTER_ATTR_LOG_DEBUG
,
119 CLUSTER_ATTR_PROTOCOL
,
120 CLUSTER_ATTR_TIMEWARN_CS
,
121 CLUSTER_ATTR_WAITWARN_US
,
122 CLUSTER_ATTR_NEW_RSB_COUNT
,
123 CLUSTER_ATTR_RECOVER_CALLBACKS
,
124 CLUSTER_ATTR_CLUSTER_NAME
,
127 struct cluster_attribute
{
128 struct configfs_attribute attr
;
129 ssize_t (*show
)(struct dlm_cluster
*, char *);
130 ssize_t (*store
)(struct dlm_cluster
*, const char *, size_t);
133 static ssize_t
cluster_cluster_name_read(struct dlm_cluster
*cl
, char *buf
)
135 return sprintf(buf
, "%s\n", cl
->cl_cluster_name
);
138 static ssize_t
cluster_cluster_name_write(struct dlm_cluster
*cl
,
139 const char *buf
, size_t len
)
141 strlcpy(dlm_config
.ci_cluster_name
, buf
,
142 sizeof(dlm_config
.ci_cluster_name
));
143 strlcpy(cl
->cl_cluster_name
, buf
, sizeof(cl
->cl_cluster_name
));
147 static struct cluster_attribute cluster_attr_cluster_name
= {
148 .attr
= { .ca_owner
= THIS_MODULE
,
149 .ca_name
= "cluster_name",
150 .ca_mode
= S_IRUGO
| S_IWUSR
},
151 .show
= cluster_cluster_name_read
,
152 .store
= cluster_cluster_name_write
,
155 static ssize_t
cluster_set(struct dlm_cluster
*cl
, unsigned int *cl_field
,
156 int *info_field
, int check_zero
,
157 const char *buf
, size_t len
)
162 if (!capable(CAP_SYS_ADMIN
))
164 rc
= kstrtouint(buf
, 0, &x
);
168 if (check_zero
&& !x
)
177 #define CLUSTER_ATTR(name, check_zero) \
178 static ssize_t name##_write(struct dlm_cluster *cl, const char *buf, size_t len) \
180 return cluster_set(cl, &cl->cl_##name, &dlm_config.ci_##name, \
181 check_zero, buf, len); \
183 static ssize_t name##_read(struct dlm_cluster *cl, char *buf) \
185 return snprintf(buf, PAGE_SIZE, "%u\n", cl->cl_##name); \
187 static struct cluster_attribute cluster_attr_##name = \
188 __CONFIGFS_ATTR(name, 0644, name##_read, name##_write)
190 CLUSTER_ATTR(tcp_port
, 1);
191 CLUSTER_ATTR(buffer_size
, 1);
192 CLUSTER_ATTR(rsbtbl_size
, 1);
193 CLUSTER_ATTR(recover_timer
, 1);
194 CLUSTER_ATTR(toss_secs
, 1);
195 CLUSTER_ATTR(scan_secs
, 1);
196 CLUSTER_ATTR(log_debug
, 0);
197 CLUSTER_ATTR(protocol
, 0);
198 CLUSTER_ATTR(timewarn_cs
, 1);
199 CLUSTER_ATTR(waitwarn_us
, 0);
200 CLUSTER_ATTR(new_rsb_count
, 0);
201 CLUSTER_ATTR(recover_callbacks
, 0);
203 static struct configfs_attribute
*cluster_attrs
[] = {
204 [CLUSTER_ATTR_TCP_PORT
] = &cluster_attr_tcp_port
.attr
,
205 [CLUSTER_ATTR_BUFFER_SIZE
] = &cluster_attr_buffer_size
.attr
,
206 [CLUSTER_ATTR_RSBTBL_SIZE
] = &cluster_attr_rsbtbl_size
.attr
,
207 [CLUSTER_ATTR_RECOVER_TIMER
] = &cluster_attr_recover_timer
.attr
,
208 [CLUSTER_ATTR_TOSS_SECS
] = &cluster_attr_toss_secs
.attr
,
209 [CLUSTER_ATTR_SCAN_SECS
] = &cluster_attr_scan_secs
.attr
,
210 [CLUSTER_ATTR_LOG_DEBUG
] = &cluster_attr_log_debug
.attr
,
211 [CLUSTER_ATTR_PROTOCOL
] = &cluster_attr_protocol
.attr
,
212 [CLUSTER_ATTR_TIMEWARN_CS
] = &cluster_attr_timewarn_cs
.attr
,
213 [CLUSTER_ATTR_WAITWARN_US
] = &cluster_attr_waitwarn_us
.attr
,
214 [CLUSTER_ATTR_NEW_RSB_COUNT
] = &cluster_attr_new_rsb_count
.attr
,
215 [CLUSTER_ATTR_RECOVER_CALLBACKS
] = &cluster_attr_recover_callbacks
.attr
,
216 [CLUSTER_ATTR_CLUSTER_NAME
] = &cluster_attr_cluster_name
.attr
,
221 COMM_ATTR_NODEID
= 0,
227 struct comm_attribute
{
228 struct configfs_attribute attr
;
229 ssize_t (*show
)(struct dlm_comm
*, char *);
230 ssize_t (*store
)(struct dlm_comm
*, const char *, size_t);
233 static struct comm_attribute comm_attr_nodeid
= {
234 .attr
= { .ca_owner
= THIS_MODULE
,
236 .ca_mode
= S_IRUGO
| S_IWUSR
},
237 .show
= comm_nodeid_read
,
238 .store
= comm_nodeid_write
,
241 static struct comm_attribute comm_attr_local
= {
242 .attr
= { .ca_owner
= THIS_MODULE
,
244 .ca_mode
= S_IRUGO
| S_IWUSR
},
245 .show
= comm_local_read
,
246 .store
= comm_local_write
,
249 static struct comm_attribute comm_attr_addr
= {
250 .attr
= { .ca_owner
= THIS_MODULE
,
252 .ca_mode
= S_IWUSR
},
253 .store
= comm_addr_write
,
256 static struct comm_attribute comm_attr_addr_list
= {
257 .attr
= { .ca_owner
= THIS_MODULE
,
258 .ca_name
= "addr_list",
259 .ca_mode
= S_IRUGO
},
260 .show
= comm_addr_list_read
,
263 static struct configfs_attribute
*comm_attrs
[] = {
264 [COMM_ATTR_NODEID
] = &comm_attr_nodeid
.attr
,
265 [COMM_ATTR_LOCAL
] = &comm_attr_local
.attr
,
266 [COMM_ATTR_ADDR
] = &comm_attr_addr
.attr
,
267 [COMM_ATTR_ADDR_LIST
] = &comm_attr_addr_list
.attr
,
272 NODE_ATTR_NODEID
= 0,
276 struct node_attribute
{
277 struct configfs_attribute attr
;
278 ssize_t (*show
)(struct dlm_node
*, char *);
279 ssize_t (*store
)(struct dlm_node
*, const char *, size_t);
282 static struct node_attribute node_attr_nodeid
= {
283 .attr
= { .ca_owner
= THIS_MODULE
,
285 .ca_mode
= S_IRUGO
| S_IWUSR
},
286 .show
= node_nodeid_read
,
287 .store
= node_nodeid_write
,
290 static struct node_attribute node_attr_weight
= {
291 .attr
= { .ca_owner
= THIS_MODULE
,
293 .ca_mode
= S_IRUGO
| S_IWUSR
},
294 .show
= node_weight_read
,
295 .store
= node_weight_write
,
298 static struct configfs_attribute
*node_attrs
[] = {
299 [NODE_ATTR_NODEID
] = &node_attr_nodeid
.attr
,
300 [NODE_ATTR_WEIGHT
] = &node_attr_weight
.attr
,
304 struct dlm_clusters
{
305 struct configfs_subsystem subsys
;
309 struct config_group ss_group
;
313 struct config_group group
;
314 struct list_head members
;
315 struct mutex members_lock
;
320 struct config_group cs_group
;
324 struct config_item item
;
329 struct sockaddr_storage
*addr
[DLM_MAX_ADDR_COUNT
];
333 struct config_group ns_group
;
337 struct config_item item
;
338 struct list_head list
; /* space->members */
342 int comm_seq
; /* copy of cm->seq when nd->nodeid is set */
345 static struct configfs_group_operations clusters_ops
= {
346 .make_group
= make_cluster
,
347 .drop_item
= drop_cluster
,
350 static struct configfs_item_operations cluster_ops
= {
351 .release
= release_cluster
,
352 .show_attribute
= show_cluster
,
353 .store_attribute
= store_cluster
,
356 static struct configfs_group_operations spaces_ops
= {
357 .make_group
= make_space
,
358 .drop_item
= drop_space
,
361 static struct configfs_item_operations space_ops
= {
362 .release
= release_space
,
365 static struct configfs_group_operations comms_ops
= {
366 .make_item
= make_comm
,
367 .drop_item
= drop_comm
,
370 static struct configfs_item_operations comm_ops
= {
371 .release
= release_comm
,
372 .show_attribute
= show_comm
,
373 .store_attribute
= store_comm
,
376 static struct configfs_group_operations nodes_ops
= {
377 .make_item
= make_node
,
378 .drop_item
= drop_node
,
381 static struct configfs_item_operations node_ops
= {
382 .release
= release_node
,
383 .show_attribute
= show_node
,
384 .store_attribute
= store_node
,
387 static struct config_item_type clusters_type
= {
388 .ct_group_ops
= &clusters_ops
,
389 .ct_owner
= THIS_MODULE
,
392 static struct config_item_type cluster_type
= {
393 .ct_item_ops
= &cluster_ops
,
394 .ct_attrs
= cluster_attrs
,
395 .ct_owner
= THIS_MODULE
,
398 static struct config_item_type spaces_type
= {
399 .ct_group_ops
= &spaces_ops
,
400 .ct_owner
= THIS_MODULE
,
403 static struct config_item_type space_type
= {
404 .ct_item_ops
= &space_ops
,
405 .ct_owner
= THIS_MODULE
,
408 static struct config_item_type comms_type
= {
409 .ct_group_ops
= &comms_ops
,
410 .ct_owner
= THIS_MODULE
,
413 static struct config_item_type comm_type
= {
414 .ct_item_ops
= &comm_ops
,
415 .ct_attrs
= comm_attrs
,
416 .ct_owner
= THIS_MODULE
,
419 static struct config_item_type nodes_type
= {
420 .ct_group_ops
= &nodes_ops
,
421 .ct_owner
= THIS_MODULE
,
424 static struct config_item_type node_type
= {
425 .ct_item_ops
= &node_ops
,
426 .ct_attrs
= node_attrs
,
427 .ct_owner
= THIS_MODULE
,
430 static struct dlm_cluster
*config_item_to_cluster(struct config_item
*i
)
432 return i
? container_of(to_config_group(i
), struct dlm_cluster
, group
) :
436 static struct dlm_space
*config_item_to_space(struct config_item
*i
)
438 return i
? container_of(to_config_group(i
), struct dlm_space
, group
) :
442 static struct dlm_comm
*config_item_to_comm(struct config_item
*i
)
444 return i
? container_of(i
, struct dlm_comm
, item
) : NULL
;
447 static struct dlm_node
*config_item_to_node(struct config_item
*i
)
449 return i
? container_of(i
, struct dlm_node
, item
) : NULL
;
452 static struct config_group
*make_cluster(struct config_group
*g
,
455 struct dlm_cluster
*cl
= NULL
;
456 struct dlm_spaces
*sps
= NULL
;
457 struct dlm_comms
*cms
= NULL
;
460 cl
= kzalloc(sizeof(struct dlm_cluster
), GFP_NOFS
);
461 gps
= kcalloc(3, sizeof(struct config_group
*), GFP_NOFS
);
462 sps
= kzalloc(sizeof(struct dlm_spaces
), GFP_NOFS
);
463 cms
= kzalloc(sizeof(struct dlm_comms
), GFP_NOFS
);
465 if (!cl
|| !gps
|| !sps
|| !cms
)
468 config_group_init_type_name(&cl
->group
, name
, &cluster_type
);
469 config_group_init_type_name(&sps
->ss_group
, "spaces", &spaces_type
);
470 config_group_init_type_name(&cms
->cs_group
, "comms", &comms_type
);
472 cl
->group
.default_groups
= gps
;
473 cl
->group
.default_groups
[0] = &sps
->ss_group
;
474 cl
->group
.default_groups
[1] = &cms
->cs_group
;
475 cl
->group
.default_groups
[2] = NULL
;
477 cl
->cl_tcp_port
= dlm_config
.ci_tcp_port
;
478 cl
->cl_buffer_size
= dlm_config
.ci_buffer_size
;
479 cl
->cl_rsbtbl_size
= dlm_config
.ci_rsbtbl_size
;
480 cl
->cl_recover_timer
= dlm_config
.ci_recover_timer
;
481 cl
->cl_toss_secs
= dlm_config
.ci_toss_secs
;
482 cl
->cl_scan_secs
= dlm_config
.ci_scan_secs
;
483 cl
->cl_log_debug
= dlm_config
.ci_log_debug
;
484 cl
->cl_protocol
= dlm_config
.ci_protocol
;
485 cl
->cl_timewarn_cs
= dlm_config
.ci_timewarn_cs
;
486 cl
->cl_waitwarn_us
= dlm_config
.ci_waitwarn_us
;
487 cl
->cl_new_rsb_count
= dlm_config
.ci_new_rsb_count
;
488 cl
->cl_recover_callbacks
= dlm_config
.ci_recover_callbacks
;
489 memcpy(cl
->cl_cluster_name
, dlm_config
.ci_cluster_name
,
492 space_list
= &sps
->ss_group
;
493 comm_list
= &cms
->cs_group
;
501 return ERR_PTR(-ENOMEM
);
504 static void drop_cluster(struct config_group
*g
, struct config_item
*i
)
506 struct dlm_cluster
*cl
= config_item_to_cluster(i
);
507 struct config_item
*tmp
;
510 for (j
= 0; cl
->group
.default_groups
[j
]; j
++) {
511 tmp
= &cl
->group
.default_groups
[j
]->cg_item
;
512 cl
->group
.default_groups
[j
] = NULL
;
513 config_item_put(tmp
);
522 static void release_cluster(struct config_item
*i
)
524 struct dlm_cluster
*cl
= config_item_to_cluster(i
);
525 kfree(cl
->group
.default_groups
);
529 static struct config_group
*make_space(struct config_group
*g
, const char *name
)
531 struct dlm_space
*sp
= NULL
;
532 struct dlm_nodes
*nds
= NULL
;
535 sp
= kzalloc(sizeof(struct dlm_space
), GFP_NOFS
);
536 gps
= kcalloc(2, sizeof(struct config_group
*), GFP_NOFS
);
537 nds
= kzalloc(sizeof(struct dlm_nodes
), GFP_NOFS
);
539 if (!sp
|| !gps
|| !nds
)
542 config_group_init_type_name(&sp
->group
, name
, &space_type
);
543 config_group_init_type_name(&nds
->ns_group
, "nodes", &nodes_type
);
545 sp
->group
.default_groups
= gps
;
546 sp
->group
.default_groups
[0] = &nds
->ns_group
;
547 sp
->group
.default_groups
[1] = NULL
;
549 INIT_LIST_HEAD(&sp
->members
);
550 mutex_init(&sp
->members_lock
);
551 sp
->members_count
= 0;
558 return ERR_PTR(-ENOMEM
);
561 static void drop_space(struct config_group
*g
, struct config_item
*i
)
563 struct dlm_space
*sp
= config_item_to_space(i
);
564 struct config_item
*tmp
;
567 /* assert list_empty(&sp->members) */
569 for (j
= 0; sp
->group
.default_groups
[j
]; j
++) {
570 tmp
= &sp
->group
.default_groups
[j
]->cg_item
;
571 sp
->group
.default_groups
[j
] = NULL
;
572 config_item_put(tmp
);
578 static void release_space(struct config_item
*i
)
580 struct dlm_space
*sp
= config_item_to_space(i
);
581 kfree(sp
->group
.default_groups
);
585 static struct config_item
*make_comm(struct config_group
*g
, const char *name
)
589 cm
= kzalloc(sizeof(struct dlm_comm
), GFP_NOFS
);
591 return ERR_PTR(-ENOMEM
);
593 config_item_init_type_name(&cm
->item
, name
, &comm_type
);
595 cm
->seq
= dlm_comm_count
++;
597 cm
->seq
= dlm_comm_count
++;
605 static void drop_comm(struct config_group
*g
, struct config_item
*i
)
607 struct dlm_comm
*cm
= config_item_to_comm(i
);
608 if (local_comm
== cm
)
610 dlm_lowcomms_close(cm
->nodeid
);
611 while (cm
->addr_count
--)
612 kfree(cm
->addr
[cm
->addr_count
]);
616 static void release_comm(struct config_item
*i
)
618 struct dlm_comm
*cm
= config_item_to_comm(i
);
622 static struct config_item
*make_node(struct config_group
*g
, const char *name
)
624 struct dlm_space
*sp
= config_item_to_space(g
->cg_item
.ci_parent
);
627 nd
= kzalloc(sizeof(struct dlm_node
), GFP_NOFS
);
629 return ERR_PTR(-ENOMEM
);
631 config_item_init_type_name(&nd
->item
, name
, &node_type
);
633 nd
->weight
= 1; /* default weight of 1 if none is set */
634 nd
->new = 1; /* set to 0 once it's been read by dlm_nodeid_list() */
636 mutex_lock(&sp
->members_lock
);
637 list_add(&nd
->list
, &sp
->members
);
639 mutex_unlock(&sp
->members_lock
);
644 static void drop_node(struct config_group
*g
, struct config_item
*i
)
646 struct dlm_space
*sp
= config_item_to_space(g
->cg_item
.ci_parent
);
647 struct dlm_node
*nd
= config_item_to_node(i
);
649 mutex_lock(&sp
->members_lock
);
652 mutex_unlock(&sp
->members_lock
);
657 static void release_node(struct config_item
*i
)
659 struct dlm_node
*nd
= config_item_to_node(i
);
663 static struct dlm_clusters clusters_root
= {
668 .ci_type
= &clusters_type
,
674 int __init
dlm_config_init(void)
676 config_group_init(&clusters_root
.subsys
.su_group
);
677 mutex_init(&clusters_root
.subsys
.su_mutex
);
678 return configfs_register_subsystem(&clusters_root
.subsys
);
681 void dlm_config_exit(void)
683 configfs_unregister_subsystem(&clusters_root
.subsys
);
687 * Functions for user space to read/write attributes
690 static ssize_t
show_cluster(struct config_item
*i
, struct configfs_attribute
*a
,
693 struct dlm_cluster
*cl
= config_item_to_cluster(i
);
694 struct cluster_attribute
*cla
=
695 container_of(a
, struct cluster_attribute
, attr
);
696 return cla
->show
? cla
->show(cl
, buf
) : 0;
699 static ssize_t
store_cluster(struct config_item
*i
,
700 struct configfs_attribute
*a
,
701 const char *buf
, size_t len
)
703 struct dlm_cluster
*cl
= config_item_to_cluster(i
);
704 struct cluster_attribute
*cla
=
705 container_of(a
, struct cluster_attribute
, attr
);
706 return cla
->store
? cla
->store(cl
, buf
, len
) : -EINVAL
;
709 static ssize_t
show_comm(struct config_item
*i
, struct configfs_attribute
*a
,
712 struct dlm_comm
*cm
= config_item_to_comm(i
);
713 struct comm_attribute
*cma
=
714 container_of(a
, struct comm_attribute
, attr
);
715 return cma
->show
? cma
->show(cm
, buf
) : 0;
718 static ssize_t
store_comm(struct config_item
*i
, struct configfs_attribute
*a
,
719 const char *buf
, size_t len
)
721 struct dlm_comm
*cm
= config_item_to_comm(i
);
722 struct comm_attribute
*cma
=
723 container_of(a
, struct comm_attribute
, attr
);
724 return cma
->store
? cma
->store(cm
, buf
, len
) : -EINVAL
;
727 static ssize_t
comm_nodeid_read(struct dlm_comm
*cm
, char *buf
)
729 return sprintf(buf
, "%d\n", cm
->nodeid
);
732 static ssize_t
comm_nodeid_write(struct dlm_comm
*cm
, const char *buf
,
735 int rc
= kstrtoint(buf
, 0, &cm
->nodeid
);
742 static ssize_t
comm_local_read(struct dlm_comm
*cm
, char *buf
)
744 return sprintf(buf
, "%d\n", cm
->local
);
747 static ssize_t
comm_local_write(struct dlm_comm
*cm
, const char *buf
,
750 int rc
= kstrtoint(buf
, 0, &cm
->local
);
754 if (cm
->local
&& !local_comm
)
759 static ssize_t
comm_addr_write(struct dlm_comm
*cm
, const char *buf
, size_t len
)
761 struct sockaddr_storage
*addr
;
764 if (len
!= sizeof(struct sockaddr_storage
))
767 if (cm
->addr_count
>= DLM_MAX_ADDR_COUNT
)
770 addr
= kzalloc(sizeof(*addr
), GFP_NOFS
);
774 memcpy(addr
, buf
, len
);
776 rv
= dlm_lowcomms_addr(cm
->nodeid
, addr
, len
);
782 cm
->addr
[cm
->addr_count
++] = addr
;
786 static ssize_t
comm_addr_list_read(struct dlm_comm
*cm
, char *buf
)
791 struct sockaddr_storage
*addr
;
792 struct sockaddr_in
*addr_in
;
793 struct sockaddr_in6
*addr_in6
;
795 /* Taken from ip6_addr_string() defined in lib/vsprintf.c */
796 char buf0
[sizeof("AF_INET6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255\n")];
799 /* Derived from SIMPLE_ATTR_SIZE of fs/configfs/file.c */
803 for (i
= 0; i
< cm
->addr_count
; i
++) {
806 switch(addr
->ss_family
) {
808 addr_in
= (struct sockaddr_in
*)addr
;
809 s
= sprintf(buf0
, "AF_INET %pI4\n", &addr_in
->sin_addr
.s_addr
);
812 addr_in6
= (struct sockaddr_in6
*)addr
;
813 s
= sprintf(buf0
, "AF_INET6 %pI6\n", &addr_in6
->sin6_addr
);
816 s
= sprintf(buf0
, "%s\n", "<UNKNOWN>");
827 return 4096 - allowance
;
830 static ssize_t
show_node(struct config_item
*i
, struct configfs_attribute
*a
,
833 struct dlm_node
*nd
= config_item_to_node(i
);
834 struct node_attribute
*nda
=
835 container_of(a
, struct node_attribute
, attr
);
836 return nda
->show
? nda
->show(nd
, buf
) : 0;
839 static ssize_t
store_node(struct config_item
*i
, struct configfs_attribute
*a
,
840 const char *buf
, size_t len
)
842 struct dlm_node
*nd
= config_item_to_node(i
);
843 struct node_attribute
*nda
=
844 container_of(a
, struct node_attribute
, attr
);
845 return nda
->store
? nda
->store(nd
, buf
, len
) : -EINVAL
;
848 static ssize_t
node_nodeid_read(struct dlm_node
*nd
, char *buf
)
850 return sprintf(buf
, "%d\n", nd
->nodeid
);
853 static ssize_t
node_nodeid_write(struct dlm_node
*nd
, const char *buf
,
857 int rc
= kstrtoint(buf
, 0, &nd
->nodeid
);
861 dlm_comm_seq(nd
->nodeid
, &seq
);
866 static ssize_t
node_weight_read(struct dlm_node
*nd
, char *buf
)
868 return sprintf(buf
, "%d\n", nd
->weight
);
871 static ssize_t
node_weight_write(struct dlm_node
*nd
, const char *buf
,
874 int rc
= kstrtoint(buf
, 0, &nd
->weight
);
882 * Functions for the dlm to get the info that's been configured
885 static struct dlm_space
*get_space(char *name
)
887 struct config_item
*i
;
892 mutex_lock(&space_list
->cg_subsys
->su_mutex
);
893 i
= config_group_find_item(space_list
, name
);
894 mutex_unlock(&space_list
->cg_subsys
->su_mutex
);
896 return config_item_to_space(i
);
899 static void put_space(struct dlm_space
*sp
)
901 config_item_put(&sp
->group
.cg_item
);
904 static struct dlm_comm
*get_comm(int nodeid
)
906 struct config_item
*i
;
907 struct dlm_comm
*cm
= NULL
;
913 mutex_lock(&clusters_root
.subsys
.su_mutex
);
915 list_for_each_entry(i
, &comm_list
->cg_children
, ci_entry
) {
916 cm
= config_item_to_comm(i
);
918 if (cm
->nodeid
!= nodeid
)
924 mutex_unlock(&clusters_root
.subsys
.su_mutex
);
931 static void put_comm(struct dlm_comm
*cm
)
933 config_item_put(&cm
->item
);
936 /* caller must free mem */
937 int dlm_config_nodes(char *lsname
, struct dlm_config_node
**nodes_out
,
940 struct dlm_space
*sp
;
942 struct dlm_config_node
*nodes
, *node
;
945 sp
= get_space(lsname
);
949 mutex_lock(&sp
->members_lock
);
950 if (!sp
->members_count
) {
952 printk(KERN_ERR
"dlm: zero members_count\n");
956 count
= sp
->members_count
;
958 nodes
= kcalloc(count
, sizeof(struct dlm_config_node
), GFP_NOFS
);
965 list_for_each_entry(nd
, &sp
->members
, list
) {
966 node
->nodeid
= nd
->nodeid
;
967 node
->weight
= nd
->weight
;
969 node
->comm_seq
= nd
->comm_seq
;
979 mutex_unlock(&sp
->members_lock
);
984 int dlm_comm_seq(int nodeid
, uint32_t *seq
)
986 struct dlm_comm
*cm
= get_comm(nodeid
);
994 int dlm_our_nodeid(void)
996 return local_comm
? local_comm
->nodeid
: 0;
999 /* num 0 is first addr, num 1 is second addr */
1000 int dlm_our_addr(struct sockaddr_storage
*addr
, int num
)
1004 if (num
+ 1 > local_comm
->addr_count
)
1006 memcpy(addr
, local_comm
->addr
[num
], sizeof(*addr
));
1010 /* Config file defaults */
1011 #define DEFAULT_TCP_PORT 21064
1012 #define DEFAULT_BUFFER_SIZE 4096
1013 #define DEFAULT_RSBTBL_SIZE 1024
1014 #define DEFAULT_RECOVER_TIMER 5
1015 #define DEFAULT_TOSS_SECS 10
1016 #define DEFAULT_SCAN_SECS 5
1017 #define DEFAULT_LOG_DEBUG 0
1018 #define DEFAULT_PROTOCOL 0
1019 #define DEFAULT_TIMEWARN_CS 500 /* 5 sec = 500 centiseconds */
1020 #define DEFAULT_WAITWARN_US 0
1021 #define DEFAULT_NEW_RSB_COUNT 128
1022 #define DEFAULT_RECOVER_CALLBACKS 0
1023 #define DEFAULT_CLUSTER_NAME ""
1025 struct dlm_config_info dlm_config
= {
1026 .ci_tcp_port
= DEFAULT_TCP_PORT
,
1027 .ci_buffer_size
= DEFAULT_BUFFER_SIZE
,
1028 .ci_rsbtbl_size
= DEFAULT_RSBTBL_SIZE
,
1029 .ci_recover_timer
= DEFAULT_RECOVER_TIMER
,
1030 .ci_toss_secs
= DEFAULT_TOSS_SECS
,
1031 .ci_scan_secs
= DEFAULT_SCAN_SECS
,
1032 .ci_log_debug
= DEFAULT_LOG_DEBUG
,
1033 .ci_protocol
= DEFAULT_PROTOCOL
,
1034 .ci_timewarn_cs
= DEFAULT_TIMEWARN_CS
,
1035 .ci_waitwarn_us
= DEFAULT_WAITWARN_US
,
1036 .ci_new_rsb_count
= DEFAULT_NEW_RSB_COUNT
,
1037 .ci_recover_callbacks
= DEFAULT_RECOVER_CALLBACKS
,
1038 .ci_cluster_name
= DEFAULT_CLUSTER_NAME