| .. | .. |
|---|
| 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, |
|---|