hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/dlm/config.c
....@@ -1,12 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /******************************************************************************
23 *******************************************************************************
34 **
45 ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
56 ** Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
67 **
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.
108 **
119 *******************************************************************************
1210 ******************************************************************************/
....@@ -75,6 +73,7 @@
7573 unsigned int cl_log_debug;
7674 unsigned int cl_log_info;
7775 unsigned int cl_protocol;
76
+ unsigned int cl_mark;
7877 unsigned int cl_timewarn_cs;
7978 unsigned int cl_waitwarn_us;
8079 unsigned int cl_new_rsb_count;
....@@ -101,6 +100,7 @@
101100 CLUSTER_ATTR_LOG_DEBUG,
102101 CLUSTER_ATTR_LOG_INFO,
103102 CLUSTER_ATTR_PROTOCOL,
103
+ CLUSTER_ATTR_MARK,
104104 CLUSTER_ATTR_TIMEWARN_CS,
105105 CLUSTER_ATTR_WAITWARN_US,
106106 CLUSTER_ATTR_NEW_RSB_COUNT,
....@@ -128,7 +128,7 @@
128128 CONFIGFS_ATTR(cluster_, cluster_name);
129129
130130 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),
132132 const char *buf, size_t len)
133133 {
134134 unsigned int x;
....@@ -140,8 +140,11 @@
140140 if (rc)
141141 return rc;
142142
143
- if (check_zero && !x)
144
- return -EINVAL;
143
+ if (check_cb) {
144
+ rc = check_cb(x);
145
+ if (rc)
146
+ return rc;
147
+ }
145148
146149 *cl_field = x;
147150 *info_field = x;
....@@ -149,13 +152,13 @@
149152 return len;
150153 }
151154
152
-#define CLUSTER_ATTR(name, check_zero) \
155
+#define CLUSTER_ATTR(name, check_cb) \
153156 static ssize_t cluster_##name##_store(struct config_item *item, \
154157 const char *buf, size_t len) \
155158 { \
156159 struct dlm_cluster *cl = config_item_to_cluster(item); \
157160 return cluster_set(cl, &cl->cl_##name, &dlm_config.ci_##name, \
158
- check_zero, buf, len); \
161
+ check_cb, buf, len); \
159162 } \
160163 static ssize_t cluster_##name##_show(struct config_item *item, char *buf) \
161164 { \
....@@ -164,19 +167,36 @@
164167 } \
165168 CONFIGFS_ATTR(cluster_, name);
166169
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);
180200
181201 static struct configfs_attribute *cluster_attrs[] = {
182202 [CLUSTER_ATTR_TCP_PORT] = &cluster_attr_tcp_port,
....@@ -188,6 +208,7 @@
188208 [CLUSTER_ATTR_LOG_DEBUG] = &cluster_attr_log_debug,
189209 [CLUSTER_ATTR_LOG_INFO] = &cluster_attr_log_info,
190210 [CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol,
211
+ [CLUSTER_ATTR_MARK] = &cluster_attr_mark,
191212 [CLUSTER_ATTR_TIMEWARN_CS] = &cluster_attr_timewarn_cs,
192213 [CLUSTER_ATTR_WAITWARN_US] = &cluster_attr_waitwarn_us,
193214 [CLUSTER_ATTR_NEW_RSB_COUNT] = &cluster_attr_new_rsb_count,
....@@ -201,6 +222,7 @@
201222 COMM_ATTR_LOCAL,
202223 COMM_ATTR_ADDR,
203224 COMM_ATTR_ADDR_LIST,
225
+ COMM_ATTR_MARK,
204226 };
205227
206228 enum {
....@@ -234,6 +256,7 @@
234256 int nodeid;
235257 int local;
236258 int addr_count;
259
+ unsigned int mark;
237260 struct sockaddr_storage *addr[DLM_MAX_ADDR_COUNT];
238261 };
239262
....@@ -479,6 +502,7 @@
479502 cm->nodeid = -1;
480503 cm->local = 0;
481504 cm->addr_count = 0;
505
+ cm->mark = 0;
482506 return &cm->item;
483507 }
484508
....@@ -674,8 +698,28 @@
674698 return 4096 - allowance;
675699 }
676700
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
+
677720 CONFIGFS_ATTR(comm_, nodeid);
678721 CONFIGFS_ATTR(comm_, local);
722
+CONFIGFS_ATTR(comm_, mark);
679723 CONFIGFS_ATTR_WO(comm_, addr);
680724 CONFIGFS_ATTR_RO(comm_, addr_list);
681725
....@@ -684,6 +728,7 @@
684728 [COMM_ATTR_LOCAL] = &comm_attr_local,
685729 [COMM_ATTR_ADDR] = &comm_attr_addr,
686730 [COMM_ATTR_ADDR_LIST] = &comm_attr_addr_list,
731
+ [COMM_ATTR_MARK] = &comm_attr_mark,
687732 NULL,
688733 };
689734
....@@ -843,6 +888,24 @@
843888 return 0;
844889 }
845890
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
+
846909 int dlm_our_nodeid(void)
847910 {
848911 return local_comm ? local_comm->nodeid : 0;
....@@ -861,7 +924,6 @@
861924
862925 /* Config file defaults */
863926 #define DEFAULT_TCP_PORT 21064
864
-#define DEFAULT_BUFFER_SIZE 4096
865927 #define DEFAULT_RSBTBL_SIZE 1024
866928 #define DEFAULT_RECOVER_TIMER 5
867929 #define DEFAULT_TOSS_SECS 10
....@@ -869,6 +931,7 @@
869931 #define DEFAULT_LOG_DEBUG 0
870932 #define DEFAULT_LOG_INFO 1
871933 #define DEFAULT_PROTOCOL 0
934
+#define DEFAULT_MARK 0
872935 #define DEFAULT_TIMEWARN_CS 500 /* 5 sec = 500 centiseconds */
873936 #define DEFAULT_WAITWARN_US 0
874937 #define DEFAULT_NEW_RSB_COUNT 128
....@@ -885,6 +948,7 @@
885948 .ci_log_debug = DEFAULT_LOG_DEBUG,
886949 .ci_log_info = DEFAULT_LOG_INFO,
887950 .ci_protocol = DEFAULT_PROTOCOL,
951
+ .ci_mark = DEFAULT_MARK,
888952 .ci_timewarn_cs = DEFAULT_TIMEWARN_CS,
889953 .ci_waitwarn_us = DEFAULT_WAITWARN_US,
890954 .ci_new_rsb_count = DEFAULT_NEW_RSB_COUNT,