.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /****************************************************************************** |
---|
2 | 3 | ******************************************************************************* |
---|
3 | 4 | ** |
---|
4 | 5 | ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. |
---|
5 | 6 | ** Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved. |
---|
6 | 7 | ** |
---|
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. |
---|
10 | 8 | ** |
---|
11 | 9 | ******************************************************************************* |
---|
12 | 10 | ******************************************************************************/ |
---|
.. | .. |
---|
75 | 73 | unsigned int cl_log_debug; |
---|
76 | 74 | unsigned int cl_log_info; |
---|
77 | 75 | unsigned int cl_protocol; |
---|
| 76 | + unsigned int cl_mark; |
---|
78 | 77 | unsigned int cl_timewarn_cs; |
---|
79 | 78 | unsigned int cl_waitwarn_us; |
---|
80 | 79 | unsigned int cl_new_rsb_count; |
---|
.. | .. |
---|
101 | 100 | CLUSTER_ATTR_LOG_DEBUG, |
---|
102 | 101 | CLUSTER_ATTR_LOG_INFO, |
---|
103 | 102 | CLUSTER_ATTR_PROTOCOL, |
---|
| 103 | + CLUSTER_ATTR_MARK, |
---|
104 | 104 | CLUSTER_ATTR_TIMEWARN_CS, |
---|
105 | 105 | CLUSTER_ATTR_WAITWARN_US, |
---|
106 | 106 | CLUSTER_ATTR_NEW_RSB_COUNT, |
---|
.. | .. |
---|
128 | 128 | CONFIGFS_ATTR(cluster_, cluster_name); |
---|
129 | 129 | |
---|
130 | 130 | static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field, |
---|
131 | | - int *info_field, int check_zero, |
---|
| 131 | + int *info_field, int (*check_cb)(unsigned int x), |
---|
132 | 132 | const char *buf, size_t len) |
---|
133 | 133 | { |
---|
134 | 134 | unsigned int x; |
---|
.. | .. |
---|
140 | 140 | if (rc) |
---|
141 | 141 | return rc; |
---|
142 | 142 | |
---|
143 | | - if (check_zero && !x) |
---|
144 | | - return -EINVAL; |
---|
| 143 | + if (check_cb) { |
---|
| 144 | + rc = check_cb(x); |
---|
| 145 | + if (rc) |
---|
| 146 | + return rc; |
---|
| 147 | + } |
---|
145 | 148 | |
---|
146 | 149 | *cl_field = x; |
---|
147 | 150 | *info_field = x; |
---|
.. | .. |
---|
149 | 152 | return len; |
---|
150 | 153 | } |
---|
151 | 154 | |
---|
152 | | -#define CLUSTER_ATTR(name, check_zero) \ |
---|
| 155 | +#define CLUSTER_ATTR(name, check_cb) \ |
---|
153 | 156 | static ssize_t cluster_##name##_store(struct config_item *item, \ |
---|
154 | 157 | const char *buf, size_t len) \ |
---|
155 | 158 | { \ |
---|
156 | 159 | struct dlm_cluster *cl = config_item_to_cluster(item); \ |
---|
157 | 160 | return cluster_set(cl, &cl->cl_##name, &dlm_config.ci_##name, \ |
---|
158 | | - check_zero, buf, len); \ |
---|
| 161 | + check_cb, buf, len); \ |
---|
159 | 162 | } \ |
---|
160 | 163 | static ssize_t cluster_##name##_show(struct config_item *item, char *buf) \ |
---|
161 | 164 | { \ |
---|
.. | .. |
---|
164 | 167 | } \ |
---|
165 | 168 | CONFIGFS_ATTR(cluster_, name); |
---|
166 | 169 | |
---|
167 | | -CLUSTER_ATTR(tcp_port, 1); |
---|
168 | | -CLUSTER_ATTR(buffer_size, 1); |
---|
169 | | -CLUSTER_ATTR(rsbtbl_size, 1); |
---|
170 | | -CLUSTER_ATTR(recover_timer, 1); |
---|
171 | | -CLUSTER_ATTR(toss_secs, 1); |
---|
172 | | -CLUSTER_ATTR(scan_secs, 1); |
---|
173 | | -CLUSTER_ATTR(log_debug, 0); |
---|
174 | | -CLUSTER_ATTR(log_info, 0); |
---|
175 | | -CLUSTER_ATTR(protocol, 0); |
---|
176 | | -CLUSTER_ATTR(timewarn_cs, 1); |
---|
177 | | -CLUSTER_ATTR(waitwarn_us, 0); |
---|
178 | | -CLUSTER_ATTR(new_rsb_count, 0); |
---|
179 | | -CLUSTER_ATTR(recover_callbacks, 0); |
---|
| 170 | +static int dlm_check_zero(unsigned int x) |
---|
| 171 | +{ |
---|
| 172 | + if (!x) |
---|
| 173 | + return -EINVAL; |
---|
| 174 | + |
---|
| 175 | + return 0; |
---|
| 176 | +} |
---|
| 177 | + |
---|
| 178 | +static int dlm_check_buffer_size(unsigned int x) |
---|
| 179 | +{ |
---|
| 180 | + if (x < DEFAULT_BUFFER_SIZE) |
---|
| 181 | + return -EINVAL; |
---|
| 182 | + |
---|
| 183 | + return 0; |
---|
| 184 | +} |
---|
| 185 | + |
---|
| 186 | +CLUSTER_ATTR(tcp_port, dlm_check_zero); |
---|
| 187 | +CLUSTER_ATTR(buffer_size, dlm_check_buffer_size); |
---|
| 188 | +CLUSTER_ATTR(rsbtbl_size, dlm_check_zero); |
---|
| 189 | +CLUSTER_ATTR(recover_timer, dlm_check_zero); |
---|
| 190 | +CLUSTER_ATTR(toss_secs, dlm_check_zero); |
---|
| 191 | +CLUSTER_ATTR(scan_secs, dlm_check_zero); |
---|
| 192 | +CLUSTER_ATTR(log_debug, NULL); |
---|
| 193 | +CLUSTER_ATTR(log_info, NULL); |
---|
| 194 | +CLUSTER_ATTR(protocol, NULL); |
---|
| 195 | +CLUSTER_ATTR(mark, NULL); |
---|
| 196 | +CLUSTER_ATTR(timewarn_cs, dlm_check_zero); |
---|
| 197 | +CLUSTER_ATTR(waitwarn_us, NULL); |
---|
| 198 | +CLUSTER_ATTR(new_rsb_count, NULL); |
---|
| 199 | +CLUSTER_ATTR(recover_callbacks, NULL); |
---|
180 | 200 | |
---|
181 | 201 | static struct configfs_attribute *cluster_attrs[] = { |
---|
182 | 202 | [CLUSTER_ATTR_TCP_PORT] = &cluster_attr_tcp_port, |
---|
.. | .. |
---|
188 | 208 | [CLUSTER_ATTR_LOG_DEBUG] = &cluster_attr_log_debug, |
---|
189 | 209 | [CLUSTER_ATTR_LOG_INFO] = &cluster_attr_log_info, |
---|
190 | 210 | [CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol, |
---|
| 211 | + [CLUSTER_ATTR_MARK] = &cluster_attr_mark, |
---|
191 | 212 | [CLUSTER_ATTR_TIMEWARN_CS] = &cluster_attr_timewarn_cs, |
---|
192 | 213 | [CLUSTER_ATTR_WAITWARN_US] = &cluster_attr_waitwarn_us, |
---|
193 | 214 | [CLUSTER_ATTR_NEW_RSB_COUNT] = &cluster_attr_new_rsb_count, |
---|
.. | .. |
---|
201 | 222 | COMM_ATTR_LOCAL, |
---|
202 | 223 | COMM_ATTR_ADDR, |
---|
203 | 224 | COMM_ATTR_ADDR_LIST, |
---|
| 225 | + COMM_ATTR_MARK, |
---|
204 | 226 | }; |
---|
205 | 227 | |
---|
206 | 228 | enum { |
---|
.. | .. |
---|
234 | 256 | int nodeid; |
---|
235 | 257 | int local; |
---|
236 | 258 | int addr_count; |
---|
| 259 | + unsigned int mark; |
---|
237 | 260 | struct sockaddr_storage *addr[DLM_MAX_ADDR_COUNT]; |
---|
238 | 261 | }; |
---|
239 | 262 | |
---|
.. | .. |
---|
479 | 502 | cm->nodeid = -1; |
---|
480 | 503 | cm->local = 0; |
---|
481 | 504 | cm->addr_count = 0; |
---|
| 505 | + cm->mark = 0; |
---|
482 | 506 | return &cm->item; |
---|
483 | 507 | } |
---|
484 | 508 | |
---|
.. | .. |
---|
674 | 698 | return 4096 - allowance; |
---|
675 | 699 | } |
---|
676 | 700 | |
---|
| 701 | +static ssize_t comm_mark_show(struct config_item *item, char *buf) |
---|
| 702 | +{ |
---|
| 703 | + return sprintf(buf, "%u\n", config_item_to_comm(item)->mark); |
---|
| 704 | +} |
---|
| 705 | + |
---|
| 706 | +static ssize_t comm_mark_store(struct config_item *item, const char *buf, |
---|
| 707 | + size_t len) |
---|
| 708 | +{ |
---|
| 709 | + unsigned int mark; |
---|
| 710 | + int rc; |
---|
| 711 | + |
---|
| 712 | + rc = kstrtouint(buf, 0, &mark); |
---|
| 713 | + if (rc) |
---|
| 714 | + return rc; |
---|
| 715 | + |
---|
| 716 | + config_item_to_comm(item)->mark = mark; |
---|
| 717 | + return len; |
---|
| 718 | +} |
---|
| 719 | + |
---|
677 | 720 | CONFIGFS_ATTR(comm_, nodeid); |
---|
678 | 721 | CONFIGFS_ATTR(comm_, local); |
---|
| 722 | +CONFIGFS_ATTR(comm_, mark); |
---|
679 | 723 | CONFIGFS_ATTR_WO(comm_, addr); |
---|
680 | 724 | CONFIGFS_ATTR_RO(comm_, addr_list); |
---|
681 | 725 | |
---|
.. | .. |
---|
684 | 728 | [COMM_ATTR_LOCAL] = &comm_attr_local, |
---|
685 | 729 | [COMM_ATTR_ADDR] = &comm_attr_addr, |
---|
686 | 730 | [COMM_ATTR_ADDR_LIST] = &comm_attr_addr_list, |
---|
| 731 | + [COMM_ATTR_MARK] = &comm_attr_mark, |
---|
687 | 732 | NULL, |
---|
688 | 733 | }; |
---|
689 | 734 | |
---|
.. | .. |
---|
843 | 888 | return 0; |
---|
844 | 889 | } |
---|
845 | 890 | |
---|
| 891 | +void dlm_comm_mark(int nodeid, unsigned int *mark) |
---|
| 892 | +{ |
---|
| 893 | + struct dlm_comm *cm; |
---|
| 894 | + |
---|
| 895 | + cm = get_comm(nodeid); |
---|
| 896 | + if (!cm) { |
---|
| 897 | + *mark = dlm_config.ci_mark; |
---|
| 898 | + return; |
---|
| 899 | + } |
---|
| 900 | + |
---|
| 901 | + if (cm->mark) |
---|
| 902 | + *mark = cm->mark; |
---|
| 903 | + else |
---|
| 904 | + *mark = dlm_config.ci_mark; |
---|
| 905 | + |
---|
| 906 | + put_comm(cm); |
---|
| 907 | +} |
---|
| 908 | + |
---|
846 | 909 | int dlm_our_nodeid(void) |
---|
847 | 910 | { |
---|
848 | 911 | return local_comm ? local_comm->nodeid : 0; |
---|
.. | .. |
---|
861 | 924 | |
---|
862 | 925 | /* Config file defaults */ |
---|
863 | 926 | #define DEFAULT_TCP_PORT 21064 |
---|
864 | | -#define DEFAULT_BUFFER_SIZE 4096 |
---|
865 | 927 | #define DEFAULT_RSBTBL_SIZE 1024 |
---|
866 | 928 | #define DEFAULT_RECOVER_TIMER 5 |
---|
867 | 929 | #define DEFAULT_TOSS_SECS 10 |
---|
.. | .. |
---|
869 | 931 | #define DEFAULT_LOG_DEBUG 0 |
---|
870 | 932 | #define DEFAULT_LOG_INFO 1 |
---|
871 | 933 | #define DEFAULT_PROTOCOL 0 |
---|
| 934 | +#define DEFAULT_MARK 0 |
---|
872 | 935 | #define DEFAULT_TIMEWARN_CS 500 /* 5 sec = 500 centiseconds */ |
---|
873 | 936 | #define DEFAULT_WAITWARN_US 0 |
---|
874 | 937 | #define DEFAULT_NEW_RSB_COUNT 128 |
---|
.. | .. |
---|
885 | 948 | .ci_log_debug = DEFAULT_LOG_DEBUG, |
---|
886 | 949 | .ci_log_info = DEFAULT_LOG_INFO, |
---|
887 | 950 | .ci_protocol = DEFAULT_PROTOCOL, |
---|
| 951 | + .ci_mark = DEFAULT_MARK, |
---|
888 | 952 | .ci_timewarn_cs = DEFAULT_TIMEWARN_CS, |
---|
889 | 953 | .ci_waitwarn_us = DEFAULT_WAITWARN_US, |
---|
890 | 954 | .ci_new_rsb_count = DEFAULT_NEW_RSB_COUNT, |
---|