1 // SPDX-License-Identifier: GPL-2.0-only
2 /******************************************************************************
3 *******************************************************************************
5 ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
6 ** Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
9 *******************************************************************************
10 ******************************************************************************/
12 #include <linux/kernel.h>
13 #include <linux/init.h>
14 #include <linux/configfs.h>
15 #include <linux/slab.h>
17 #include <linux/in6.h>
18 #include <linux/dlmconstants.h>
26 * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/nodeid
27 * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/weight
28 * /config/dlm/<cluster>/comms/<comm>/nodeid
29 * /config/dlm/<cluster>/comms/<comm>/local
30 * /config/dlm/<cluster>/comms/<comm>/addr (write only)
31 * /config/dlm/<cluster>/comms/<comm>/addr_list (read only)
32 * The <cluster> level is useless, but I haven't figured out how to avoid it.
35 static struct config_group
*space_list
;
36 static struct config_group
*comm_list
;
37 static struct dlm_comm
*local_comm
;
38 static uint32_t dlm_comm_count
;
49 static struct config_group
*make_cluster(struct config_group
*, const char *);
50 static void drop_cluster(struct config_group
*, struct config_item
*);
51 static void release_cluster(struct config_item
*);
52 static struct config_group
*make_space(struct config_group
*, const char *);
53 static void drop_space(struct config_group
*, struct config_item
*);
54 static void release_space(struct config_item
*);
55 static struct config_item
*make_comm(struct config_group
*, const char *);
56 static void drop_comm(struct config_group
*, struct config_item
*);
57 static void release_comm(struct config_item
*);
58 static struct config_item
*make_node(struct config_group
*, const char *);
59 static void drop_node(struct config_group
*, struct config_item
*);
60 static void release_node(struct config_item
*);
62 static struct configfs_attribute
*comm_attrs
[];
63 static struct configfs_attribute
*node_attrs
[];
66 struct config_group group
;
67 unsigned int cl_tcp_port
;
68 unsigned int cl_buffer_size
;
69 unsigned int cl_rsbtbl_size
;
70 unsigned int cl_recover_timer
;
71 unsigned int cl_toss_secs
;
72 unsigned int cl_scan_secs
;
73 unsigned int cl_log_debug
;
74 unsigned int cl_log_info
;
75 unsigned int cl_protocol
;
77 unsigned int cl_timewarn_cs
;
78 unsigned int cl_waitwarn_us
;
79 unsigned int cl_new_rsb_count
;
80 unsigned int cl_recover_callbacks
;
81 char cl_cluster_name
[DLM_LOCKSPACE_LEN
];
84 static struct dlm_cluster
*config_item_to_cluster(struct config_item
*i
)
86 return i
? container_of(to_config_group(i
), struct dlm_cluster
, group
) :
91 CLUSTER_ATTR_TCP_PORT
= 0,
92 CLUSTER_ATTR_BUFFER_SIZE
,
93 CLUSTER_ATTR_RSBTBL_SIZE
,
94 CLUSTER_ATTR_RECOVER_TIMER
,
95 CLUSTER_ATTR_TOSS_SECS
,
96 CLUSTER_ATTR_SCAN_SECS
,
97 CLUSTER_ATTR_LOG_DEBUG
,
98 CLUSTER_ATTR_LOG_INFO
,
99 CLUSTER_ATTR_PROTOCOL
,
101 CLUSTER_ATTR_TIMEWARN_CS
,
102 CLUSTER_ATTR_WAITWARN_US
,
103 CLUSTER_ATTR_NEW_RSB_COUNT
,
104 CLUSTER_ATTR_RECOVER_CALLBACKS
,
105 CLUSTER_ATTR_CLUSTER_NAME
,
108 static ssize_t
cluster_cluster_name_show(struct config_item
*item
, char *buf
)
110 struct dlm_cluster
*cl
= config_item_to_cluster(item
);
111 return sprintf(buf
, "%s\n", cl
->cl_cluster_name
);
114 static ssize_t
cluster_cluster_name_store(struct config_item
*item
,
115 const char *buf
, size_t len
)
117 struct dlm_cluster
*cl
= config_item_to_cluster(item
);
119 strlcpy(dlm_config
.ci_cluster_name
, buf
,
120 sizeof(dlm_config
.ci_cluster_name
));
121 strlcpy(cl
->cl_cluster_name
, buf
, sizeof(cl
->cl_cluster_name
));
125 CONFIGFS_ATTR(cluster_
, cluster_name
);
127 static ssize_t
cluster_set(struct dlm_cluster
*cl
, unsigned int *cl_field
,
128 int *info_field
, int check_zero
,
129 const char *buf
, size_t len
)
134 if (!capable(CAP_SYS_ADMIN
))
136 rc
= kstrtouint(buf
, 0, &x
);
140 if (check_zero
&& !x
)
149 #define CLUSTER_ATTR(name, check_zero) \
150 static ssize_t cluster_##name##_store(struct config_item *item, \
151 const char *buf, size_t len) \
153 struct dlm_cluster *cl = config_item_to_cluster(item); \
154 return cluster_set(cl, &cl->cl_##name, &dlm_config.ci_##name, \
155 check_zero, buf, len); \
157 static ssize_t cluster_##name##_show(struct config_item *item, char *buf) \
159 struct dlm_cluster *cl = config_item_to_cluster(item); \
160 return snprintf(buf, PAGE_SIZE, "%u\n", cl->cl_##name); \
162 CONFIGFS_ATTR(cluster_, name);
164 CLUSTER_ATTR(tcp_port
, 1);
165 CLUSTER_ATTR(buffer_size
, 1);
166 CLUSTER_ATTR(rsbtbl_size
, 1);
167 CLUSTER_ATTR(recover_timer
, 1);
168 CLUSTER_ATTR(toss_secs
, 1);
169 CLUSTER_ATTR(scan_secs
, 1);
170 CLUSTER_ATTR(log_debug
, 0);
171 CLUSTER_ATTR(log_info
, 0);
172 CLUSTER_ATTR(protocol
, 0);
173 CLUSTER_ATTR(mark
, 0);
174 CLUSTER_ATTR(timewarn_cs
, 1);
175 CLUSTER_ATTR(waitwarn_us
, 0);
176 CLUSTER_ATTR(new_rsb_count
, 0);
177 CLUSTER_ATTR(recover_callbacks
, 0);
179 static struct configfs_attribute
*cluster_attrs
[] = {
180 [CLUSTER_ATTR_TCP_PORT
] = &cluster_attr_tcp_port
,
181 [CLUSTER_ATTR_BUFFER_SIZE
] = &cluster_attr_buffer_size
,
182 [CLUSTER_ATTR_RSBTBL_SIZE
] = &cluster_attr_rsbtbl_size
,
183 [CLUSTER_ATTR_RECOVER_TIMER
] = &cluster_attr_recover_timer
,
184 [CLUSTER_ATTR_TOSS_SECS
] = &cluster_attr_toss_secs
,
185 [CLUSTER_ATTR_SCAN_SECS
] = &cluster_attr_scan_secs
,
186 [CLUSTER_ATTR_LOG_DEBUG
] = &cluster_attr_log_debug
,
187 [CLUSTER_ATTR_LOG_INFO
] = &cluster_attr_log_info
,
188 [CLUSTER_ATTR_PROTOCOL
] = &cluster_attr_protocol
,
189 [CLUSTER_ATTR_MARK
] = &cluster_attr_mark
,
190 [CLUSTER_ATTR_TIMEWARN_CS
] = &cluster_attr_timewarn_cs
,
191 [CLUSTER_ATTR_WAITWARN_US
] = &cluster_attr_waitwarn_us
,
192 [CLUSTER_ATTR_NEW_RSB_COUNT
] = &cluster_attr_new_rsb_count
,
193 [CLUSTER_ATTR_RECOVER_CALLBACKS
] = &cluster_attr_recover_callbacks
,
194 [CLUSTER_ATTR_CLUSTER_NAME
] = &cluster_attr_cluster_name
,
199 COMM_ATTR_NODEID
= 0,
207 NODE_ATTR_NODEID
= 0,
211 struct dlm_clusters
{
212 struct configfs_subsystem subsys
;
216 struct config_group ss_group
;
220 struct config_group group
;
221 struct list_head members
;
222 struct mutex members_lock
;
227 struct config_group cs_group
;
231 struct config_item item
;
237 struct sockaddr_storage
*addr
[DLM_MAX_ADDR_COUNT
];
241 struct config_group ns_group
;
245 struct config_item item
;
246 struct list_head list
; /* space->members */
250 int comm_seq
; /* copy of cm->seq when nd->nodeid is set */
253 static struct configfs_group_operations clusters_ops
= {
254 .make_group
= make_cluster
,
255 .drop_item
= drop_cluster
,
258 static struct configfs_item_operations cluster_ops
= {
259 .release
= release_cluster
,
262 static struct configfs_group_operations spaces_ops
= {
263 .make_group
= make_space
,
264 .drop_item
= drop_space
,
267 static struct configfs_item_operations space_ops
= {
268 .release
= release_space
,
271 static struct configfs_group_operations comms_ops
= {
272 .make_item
= make_comm
,
273 .drop_item
= drop_comm
,
276 static struct configfs_item_operations comm_ops
= {
277 .release
= release_comm
,
280 static struct configfs_group_operations nodes_ops
= {
281 .make_item
= make_node
,
282 .drop_item
= drop_node
,
285 static struct configfs_item_operations node_ops
= {
286 .release
= release_node
,
289 static const struct config_item_type clusters_type
= {
290 .ct_group_ops
= &clusters_ops
,
291 .ct_owner
= THIS_MODULE
,
294 static const struct config_item_type cluster_type
= {
295 .ct_item_ops
= &cluster_ops
,
296 .ct_attrs
= cluster_attrs
,
297 .ct_owner
= THIS_MODULE
,
300 static const struct config_item_type spaces_type
= {
301 .ct_group_ops
= &spaces_ops
,
302 .ct_owner
= THIS_MODULE
,
305 static const struct config_item_type space_type
= {
306 .ct_item_ops
= &space_ops
,
307 .ct_owner
= THIS_MODULE
,
310 static const struct config_item_type comms_type
= {
311 .ct_group_ops
= &comms_ops
,
312 .ct_owner
= THIS_MODULE
,
315 static const struct config_item_type comm_type
= {
316 .ct_item_ops
= &comm_ops
,
317 .ct_attrs
= comm_attrs
,
318 .ct_owner
= THIS_MODULE
,
321 static const struct config_item_type nodes_type
= {
322 .ct_group_ops
= &nodes_ops
,
323 .ct_owner
= THIS_MODULE
,
326 static const struct config_item_type node_type
= {
327 .ct_item_ops
= &node_ops
,
328 .ct_attrs
= node_attrs
,
329 .ct_owner
= THIS_MODULE
,
332 static struct dlm_space
*config_item_to_space(struct config_item
*i
)
334 return i
? container_of(to_config_group(i
), struct dlm_space
, group
) :
338 static struct dlm_comm
*config_item_to_comm(struct config_item
*i
)
340 return i
? container_of(i
, struct dlm_comm
, item
) : NULL
;
343 static struct dlm_node
*config_item_to_node(struct config_item
*i
)
345 return i
? container_of(i
, struct dlm_node
, item
) : NULL
;
348 static struct config_group
*make_cluster(struct config_group
*g
,
351 struct dlm_cluster
*cl
= NULL
;
352 struct dlm_spaces
*sps
= NULL
;
353 struct dlm_comms
*cms
= NULL
;
355 cl
= kzalloc(sizeof(struct dlm_cluster
), GFP_NOFS
);
356 sps
= kzalloc(sizeof(struct dlm_spaces
), GFP_NOFS
);
357 cms
= kzalloc(sizeof(struct dlm_comms
), GFP_NOFS
);
359 if (!cl
|| !sps
|| !cms
)
362 config_group_init_type_name(&cl
->group
, name
, &cluster_type
);
363 config_group_init_type_name(&sps
->ss_group
, "spaces", &spaces_type
);
364 config_group_init_type_name(&cms
->cs_group
, "comms", &comms_type
);
366 configfs_add_default_group(&sps
->ss_group
, &cl
->group
);
367 configfs_add_default_group(&cms
->cs_group
, &cl
->group
);
369 cl
->cl_tcp_port
= dlm_config
.ci_tcp_port
;
370 cl
->cl_buffer_size
= dlm_config
.ci_buffer_size
;
371 cl
->cl_rsbtbl_size
= dlm_config
.ci_rsbtbl_size
;
372 cl
->cl_recover_timer
= dlm_config
.ci_recover_timer
;
373 cl
->cl_toss_secs
= dlm_config
.ci_toss_secs
;
374 cl
->cl_scan_secs
= dlm_config
.ci_scan_secs
;
375 cl
->cl_log_debug
= dlm_config
.ci_log_debug
;
376 cl
->cl_log_info
= dlm_config
.ci_log_info
;
377 cl
->cl_protocol
= dlm_config
.ci_protocol
;
378 cl
->cl_timewarn_cs
= dlm_config
.ci_timewarn_cs
;
379 cl
->cl_waitwarn_us
= dlm_config
.ci_waitwarn_us
;
380 cl
->cl_new_rsb_count
= dlm_config
.ci_new_rsb_count
;
381 cl
->cl_recover_callbacks
= dlm_config
.ci_recover_callbacks
;
382 memcpy(cl
->cl_cluster_name
, dlm_config
.ci_cluster_name
,
385 space_list
= &sps
->ss_group
;
386 comm_list
= &cms
->cs_group
;
393 return ERR_PTR(-ENOMEM
);
396 static void drop_cluster(struct config_group
*g
, struct config_item
*i
)
398 struct dlm_cluster
*cl
= config_item_to_cluster(i
);
400 configfs_remove_default_groups(&cl
->group
);
408 static void release_cluster(struct config_item
*i
)
410 struct dlm_cluster
*cl
= config_item_to_cluster(i
);
414 static struct config_group
*make_space(struct config_group
*g
, const char *name
)
416 struct dlm_space
*sp
= NULL
;
417 struct dlm_nodes
*nds
= NULL
;
419 sp
= kzalloc(sizeof(struct dlm_space
), GFP_NOFS
);
420 nds
= kzalloc(sizeof(struct dlm_nodes
), GFP_NOFS
);
425 config_group_init_type_name(&sp
->group
, name
, &space_type
);
427 config_group_init_type_name(&nds
->ns_group
, "nodes", &nodes_type
);
428 configfs_add_default_group(&nds
->ns_group
, &sp
->group
);
430 INIT_LIST_HEAD(&sp
->members
);
431 mutex_init(&sp
->members_lock
);
432 sp
->members_count
= 0;
438 return ERR_PTR(-ENOMEM
);
441 static void drop_space(struct config_group
*g
, struct config_item
*i
)
443 struct dlm_space
*sp
= config_item_to_space(i
);
445 /* assert list_empty(&sp->members) */
447 configfs_remove_default_groups(&sp
->group
);
451 static void release_space(struct config_item
*i
)
453 struct dlm_space
*sp
= config_item_to_space(i
);
457 static struct config_item
*make_comm(struct config_group
*g
, const char *name
)
461 cm
= kzalloc(sizeof(struct dlm_comm
), GFP_NOFS
);
463 return ERR_PTR(-ENOMEM
);
465 config_item_init_type_name(&cm
->item
, name
, &comm_type
);
467 cm
->seq
= dlm_comm_count
++;
469 cm
->seq
= dlm_comm_count
++;
478 static void drop_comm(struct config_group
*g
, struct config_item
*i
)
480 struct dlm_comm
*cm
= config_item_to_comm(i
);
481 if (local_comm
== cm
)
483 dlm_lowcomms_close(cm
->nodeid
);
484 while (cm
->addr_count
--)
485 kfree(cm
->addr
[cm
->addr_count
]);
489 static void release_comm(struct config_item
*i
)
491 struct dlm_comm
*cm
= config_item_to_comm(i
);
495 static struct config_item
*make_node(struct config_group
*g
, const char *name
)
497 struct dlm_space
*sp
= config_item_to_space(g
->cg_item
.ci_parent
);
500 nd
= kzalloc(sizeof(struct dlm_node
), GFP_NOFS
);
502 return ERR_PTR(-ENOMEM
);
504 config_item_init_type_name(&nd
->item
, name
, &node_type
);
506 nd
->weight
= 1; /* default weight of 1 if none is set */
507 nd
->new = 1; /* set to 0 once it's been read by dlm_nodeid_list() */
509 mutex_lock(&sp
->members_lock
);
510 list_add(&nd
->list
, &sp
->members
);
512 mutex_unlock(&sp
->members_lock
);
517 static void drop_node(struct config_group
*g
, struct config_item
*i
)
519 struct dlm_space
*sp
= config_item_to_space(g
->cg_item
.ci_parent
);
520 struct dlm_node
*nd
= config_item_to_node(i
);
522 mutex_lock(&sp
->members_lock
);
525 mutex_unlock(&sp
->members_lock
);
530 static void release_node(struct config_item
*i
)
532 struct dlm_node
*nd
= config_item_to_node(i
);
536 static struct dlm_clusters clusters_root
= {
541 .ci_type
= &clusters_type
,
547 int __init
dlm_config_init(void)
549 config_group_init(&clusters_root
.subsys
.su_group
);
550 mutex_init(&clusters_root
.subsys
.su_mutex
);
551 return configfs_register_subsystem(&clusters_root
.subsys
);
554 void dlm_config_exit(void)
556 configfs_unregister_subsystem(&clusters_root
.subsys
);
560 * Functions for user space to read/write attributes
563 static ssize_t
comm_nodeid_show(struct config_item
*item
, char *buf
)
565 return sprintf(buf
, "%d\n", config_item_to_comm(item
)->nodeid
);
568 static ssize_t
comm_nodeid_store(struct config_item
*item
, const char *buf
,
571 int rc
= kstrtoint(buf
, 0, &config_item_to_comm(item
)->nodeid
);
578 static ssize_t
comm_local_show(struct config_item
*item
, char *buf
)
580 return sprintf(buf
, "%d\n", config_item_to_comm(item
)->local
);
583 static ssize_t
comm_local_store(struct config_item
*item
, const char *buf
,
586 struct dlm_comm
*cm
= config_item_to_comm(item
);
587 int rc
= kstrtoint(buf
, 0, &cm
->local
);
591 if (cm
->local
&& !local_comm
)
596 static ssize_t
comm_addr_store(struct config_item
*item
, const char *buf
,
599 struct dlm_comm
*cm
= config_item_to_comm(item
);
600 struct sockaddr_storage
*addr
;
603 if (len
!= sizeof(struct sockaddr_storage
))
606 if (cm
->addr_count
>= DLM_MAX_ADDR_COUNT
)
609 addr
= kzalloc(sizeof(*addr
), GFP_NOFS
);
613 memcpy(addr
, buf
, len
);
615 rv
= dlm_lowcomms_addr(cm
->nodeid
, addr
, len
);
621 cm
->addr
[cm
->addr_count
++] = addr
;
625 static ssize_t
comm_addr_list_show(struct config_item
*item
, char *buf
)
627 struct dlm_comm
*cm
= config_item_to_comm(item
);
631 struct sockaddr_storage
*addr
;
632 struct sockaddr_in
*addr_in
;
633 struct sockaddr_in6
*addr_in6
;
635 /* Taken from ip6_addr_string() defined in lib/vsprintf.c */
636 char buf0
[sizeof("AF_INET6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255\n")];
639 /* Derived from SIMPLE_ATTR_SIZE of fs/configfs/file.c */
643 for (i
= 0; i
< cm
->addr_count
; i
++) {
646 switch(addr
->ss_family
) {
648 addr_in
= (struct sockaddr_in
*)addr
;
649 s
= sprintf(buf0
, "AF_INET %pI4\n", &addr_in
->sin_addr
.s_addr
);
652 addr_in6
= (struct sockaddr_in6
*)addr
;
653 s
= sprintf(buf0
, "AF_INET6 %pI6\n", &addr_in6
->sin6_addr
);
656 s
= sprintf(buf0
, "%s\n", "<UNKNOWN>");
667 return 4096 - allowance
;
670 static ssize_t
comm_mark_show(struct config_item
*item
, char *buf
)
672 return sprintf(buf
, "%u\n", config_item_to_comm(item
)->mark
);
675 static ssize_t
comm_mark_store(struct config_item
*item
, const char *buf
,
681 rc
= kstrtouint(buf
, 0, &mark
);
685 config_item_to_comm(item
)->mark
= mark
;
689 CONFIGFS_ATTR(comm_
, nodeid
);
690 CONFIGFS_ATTR(comm_
, local
);
691 CONFIGFS_ATTR(comm_
, mark
);
692 CONFIGFS_ATTR_WO(comm_
, addr
);
693 CONFIGFS_ATTR_RO(comm_
, addr_list
);
695 static struct configfs_attribute
*comm_attrs
[] = {
696 [COMM_ATTR_NODEID
] = &comm_attr_nodeid
,
697 [COMM_ATTR_LOCAL
] = &comm_attr_local
,
698 [COMM_ATTR_ADDR
] = &comm_attr_addr
,
699 [COMM_ATTR_ADDR_LIST
] = &comm_attr_addr_list
,
700 [COMM_ATTR_MARK
] = &comm_attr_mark
,
704 static ssize_t
node_nodeid_show(struct config_item
*item
, char *buf
)
706 return sprintf(buf
, "%d\n", config_item_to_node(item
)->nodeid
);
709 static ssize_t
node_nodeid_store(struct config_item
*item
, const char *buf
,
712 struct dlm_node
*nd
= config_item_to_node(item
);
714 int rc
= kstrtoint(buf
, 0, &nd
->nodeid
);
718 dlm_comm_seq(nd
->nodeid
, &seq
);
723 static ssize_t
node_weight_show(struct config_item
*item
, char *buf
)
725 return sprintf(buf
, "%d\n", config_item_to_node(item
)->weight
);
728 static ssize_t
node_weight_store(struct config_item
*item
, const char *buf
,
731 int rc
= kstrtoint(buf
, 0, &config_item_to_node(item
)->weight
);
738 CONFIGFS_ATTR(node_
, nodeid
);
739 CONFIGFS_ATTR(node_
, weight
);
741 static struct configfs_attribute
*node_attrs
[] = {
742 [NODE_ATTR_NODEID
] = &node_attr_nodeid
,
743 [NODE_ATTR_WEIGHT
] = &node_attr_weight
,
748 * Functions for the dlm to get the info that's been configured
751 static struct dlm_space
*get_space(char *name
)
753 struct config_item
*i
;
758 mutex_lock(&space_list
->cg_subsys
->su_mutex
);
759 i
= config_group_find_item(space_list
, name
);
760 mutex_unlock(&space_list
->cg_subsys
->su_mutex
);
762 return config_item_to_space(i
);
765 static void put_space(struct dlm_space
*sp
)
767 config_item_put(&sp
->group
.cg_item
);
770 static struct dlm_comm
*get_comm(int nodeid
)
772 struct config_item
*i
;
773 struct dlm_comm
*cm
= NULL
;
779 mutex_lock(&clusters_root
.subsys
.su_mutex
);
781 list_for_each_entry(i
, &comm_list
->cg_children
, ci_entry
) {
782 cm
= config_item_to_comm(i
);
784 if (cm
->nodeid
!= nodeid
)
790 mutex_unlock(&clusters_root
.subsys
.su_mutex
);
797 static void put_comm(struct dlm_comm
*cm
)
799 config_item_put(&cm
->item
);
802 /* caller must free mem */
803 int dlm_config_nodes(char *lsname
, struct dlm_config_node
**nodes_out
,
806 struct dlm_space
*sp
;
808 struct dlm_config_node
*nodes
, *node
;
811 sp
= get_space(lsname
);
815 mutex_lock(&sp
->members_lock
);
816 if (!sp
->members_count
) {
818 printk(KERN_ERR
"dlm: zero members_count\n");
822 count
= sp
->members_count
;
824 nodes
= kcalloc(count
, sizeof(struct dlm_config_node
), GFP_NOFS
);
831 list_for_each_entry(nd
, &sp
->members
, list
) {
832 node
->nodeid
= nd
->nodeid
;
833 node
->weight
= nd
->weight
;
835 node
->comm_seq
= nd
->comm_seq
;
845 mutex_unlock(&sp
->members_lock
);
850 int dlm_comm_seq(int nodeid
, uint32_t *seq
)
852 struct dlm_comm
*cm
= get_comm(nodeid
);
860 int dlm_comm_mark(int nodeid
, unsigned int *mark
)
864 cm
= get_comm(nodeid
);
874 int dlm_our_nodeid(void)
876 return local_comm
? local_comm
->nodeid
: 0;
879 /* num 0 is first addr, num 1 is second addr */
880 int dlm_our_addr(struct sockaddr_storage
*addr
, int num
)
884 if (num
+ 1 > local_comm
->addr_count
)
886 memcpy(addr
, local_comm
->addr
[num
], sizeof(*addr
));
890 /* Config file defaults */
891 #define DEFAULT_TCP_PORT 21064
892 #define DEFAULT_BUFFER_SIZE 4096
893 #define DEFAULT_RSBTBL_SIZE 1024
894 #define DEFAULT_RECOVER_TIMER 5
895 #define DEFAULT_TOSS_SECS 10
896 #define DEFAULT_SCAN_SECS 5
897 #define DEFAULT_LOG_DEBUG 0
898 #define DEFAULT_LOG_INFO 1
899 #define DEFAULT_PROTOCOL 0
900 #define DEFAULT_MARK 0
901 #define DEFAULT_TIMEWARN_CS 500 /* 5 sec = 500 centiseconds */
902 #define DEFAULT_WAITWARN_US 0
903 #define DEFAULT_NEW_RSB_COUNT 128
904 #define DEFAULT_RECOVER_CALLBACKS 0
905 #define DEFAULT_CLUSTER_NAME ""
907 struct dlm_config_info dlm_config
= {
908 .ci_tcp_port
= DEFAULT_TCP_PORT
,
909 .ci_buffer_size
= DEFAULT_BUFFER_SIZE
,
910 .ci_rsbtbl_size
= DEFAULT_RSBTBL_SIZE
,
911 .ci_recover_timer
= DEFAULT_RECOVER_TIMER
,
912 .ci_toss_secs
= DEFAULT_TOSS_SECS
,
913 .ci_scan_secs
= DEFAULT_SCAN_SECS
,
914 .ci_log_debug
= DEFAULT_LOG_DEBUG
,
915 .ci_log_info
= DEFAULT_LOG_INFO
,
916 .ci_protocol
= DEFAULT_PROTOCOL
,
917 .ci_mark
= DEFAULT_MARK
,
918 .ci_timewarn_cs
= DEFAULT_TIMEWARN_CS
,
919 .ci_waitwarn_us
= DEFAULT_WAITWARN_US
,
920 .ci_new_rsb_count
= DEFAULT_NEW_RSB_COUNT
,
921 .ci_recover_callbacks
= DEFAULT_RECOVER_CALLBACKS
,
922 .ci_cluster_name
= DEFAULT_CLUSTER_NAME