Blame view

fs/dlm/config.c 21.5 KB
2522fe45a   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
e7fd41792   David Teigland   [DLM] The core of...
2
3
4
5
  /******************************************************************************
  *******************************************************************************
  **
  **  Copyright (C) Sistina Software, Inc.  1997-2003  All rights reserved.
60f98d183   David Teigland   dlm: add recovery...
6
  **  Copyright (C) 2004-2011 Red Hat, Inc.  All rights reserved.
e7fd41792   David Teigland   [DLM] The core of...
7
  **
e7fd41792   David Teigland   [DLM] The core of...
8
9
10
11
12
  **
  *******************************************************************************
  ******************************************************************************/
  
  #include <linux/kernel.h>
7963b8a59   Paul Gortmaker   dlm: audit and re...
13
  #include <linux/init.h>
e7fd41792   David Teigland   [DLM] The core of...
14
  #include <linux/configfs.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
15
  #include <linux/slab.h>
44be6fdf1   David Teigland   dlm: fix address ...
16
17
  #include <linux/in.h>
  #include <linux/in6.h>
60f98d183   David Teigland   dlm: add recovery...
18
  #include <linux/dlmconstants.h>
44be6fdf1   David Teigland   dlm: fix address ...
19
  #include <net/ipv6.h>
e7fd41792   David Teigland   [DLM] The core of...
20
21
22
  #include <net/sock.h>
  
  #include "config.h"
1c032c031   David Teigland   [DLM] PATCH 2/3 d...
23
  #include "lowcomms.h"
e7fd41792   David Teigland   [DLM] The core of...
24
25
26
27
28
29
  
  /*
   * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/nodeid
   * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/weight
   * /config/dlm/<cluster>/comms/<comm>/nodeid
   * /config/dlm/<cluster>/comms/<comm>/local
55b3286d3   Masatake YAMATO   dlm: show address...
30
31
   * /config/dlm/<cluster>/comms/<comm>/addr      (write only)
   * /config/dlm/<cluster>/comms/<comm>/addr_list (read only)
e7fd41792   David Teigland   [DLM] The core of...
32
33
34
35
36
   * The <cluster> level is useless, but I haven't figured out how to avoid it.
   */
  
  static struct config_group *space_list;
  static struct config_group *comm_list;
51409340d   David Teigland   dlm: rename structs
37
  static struct dlm_comm *local_comm;
60f98d183   David Teigland   dlm: add recovery...
38
  static uint32_t dlm_comm_count;
e7fd41792   David Teigland   [DLM] The core of...
39

51409340d   David Teigland   dlm: rename structs
40
41
42
43
44
45
46
47
  struct dlm_clusters;
  struct dlm_cluster;
  struct dlm_spaces;
  struct dlm_space;
  struct dlm_comms;
  struct dlm_comm;
  struct dlm_nodes;
  struct dlm_node;
e7fd41792   David Teigland   [DLM] The core of...
48

f89ab8619   Joel Becker   Revert "configfs:...
49
  static struct config_group *make_cluster(struct config_group *, const char *);
e7fd41792   David Teigland   [DLM] The core of...
50
51
  static void drop_cluster(struct config_group *, struct config_item *);
  static void release_cluster(struct config_item *);
f89ab8619   Joel Becker   Revert "configfs:...
52
  static struct config_group *make_space(struct config_group *, const char *);
e7fd41792   David Teigland   [DLM] The core of...
53
54
  static void drop_space(struct config_group *, struct config_item *);
  static void release_space(struct config_item *);
f89ab8619   Joel Becker   Revert "configfs:...
55
  static struct config_item *make_comm(struct config_group *, const char *);
e7fd41792   David Teigland   [DLM] The core of...
56
57
  static void drop_comm(struct config_group *, struct config_item *);
  static void release_comm(struct config_item *);
f89ab8619   Joel Becker   Revert "configfs:...
58
  static struct config_item *make_node(struct config_group *, const char *);
e7fd41792   David Teigland   [DLM] The core of...
59
60
  static void drop_node(struct config_group *, struct config_item *);
  static void release_node(struct config_item *);
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
61
62
  static struct configfs_attribute *comm_attrs[];
  static struct configfs_attribute *node_attrs[];
51409340d   David Teigland   dlm: rename structs
63
64
  
  struct dlm_cluster {
d200778e1   David Teigland   [DLM] expose dlm_...
65
66
67
68
  	struct config_group group;
  	unsigned int cl_tcp_port;
  	unsigned int cl_buffer_size;
  	unsigned int cl_rsbtbl_size;
d200778e1   David Teigland   [DLM] expose dlm_...
69
70
71
72
  	unsigned int cl_recover_timer;
  	unsigned int cl_toss_secs;
  	unsigned int cl_scan_secs;
  	unsigned int cl_log_debug;
505ee5283   Zhilong Liu   dlm: add log_info...
73
  	unsigned int cl_log_info;
6ed7257b4   Patrick Caulfield   [DLM] Consolidate...
74
  	unsigned int cl_protocol;
3ae1acf93   David Teigland   [DLM] add lock ti...
75
  	unsigned int cl_timewarn_cs;
c6ff669ba   David Teigland   dlm: delayed repl...
76
  	unsigned int cl_waitwarn_us;
3881ac04e   David Teigland   dlm: improve rsb ...
77
  	unsigned int cl_new_rsb_count;
60f98d183   David Teigland   dlm: add recovery...
78
79
  	unsigned int cl_recover_callbacks;
  	char cl_cluster_name[DLM_LOCKSPACE_LEN];
d200778e1   David Teigland   [DLM] expose dlm_...
80
  };
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
81
82
83
84
85
  static struct dlm_cluster *config_item_to_cluster(struct config_item *i)
  {
  	return i ? container_of(to_config_group(i), struct dlm_cluster, group) :
  		   NULL;
  }
d200778e1   David Teigland   [DLM] expose dlm_...
86
87
88
89
  enum {
  	CLUSTER_ATTR_TCP_PORT = 0,
  	CLUSTER_ATTR_BUFFER_SIZE,
  	CLUSTER_ATTR_RSBTBL_SIZE,
d200778e1   David Teigland   [DLM] expose dlm_...
90
91
92
93
  	CLUSTER_ATTR_RECOVER_TIMER,
  	CLUSTER_ATTR_TOSS_SECS,
  	CLUSTER_ATTR_SCAN_SECS,
  	CLUSTER_ATTR_LOG_DEBUG,
505ee5283   Zhilong Liu   dlm: add log_info...
94
  	CLUSTER_ATTR_LOG_INFO,
6ed7257b4   Patrick Caulfield   [DLM] Consolidate...
95
  	CLUSTER_ATTR_PROTOCOL,
3ae1acf93   David Teigland   [DLM] add lock ti...
96
  	CLUSTER_ATTR_TIMEWARN_CS,
c6ff669ba   David Teigland   dlm: delayed repl...
97
  	CLUSTER_ATTR_WAITWARN_US,
3881ac04e   David Teigland   dlm: improve rsb ...
98
  	CLUSTER_ATTR_NEW_RSB_COUNT,
60f98d183   David Teigland   dlm: add recovery...
99
100
  	CLUSTER_ATTR_RECOVER_CALLBACKS,
  	CLUSTER_ATTR_CLUSTER_NAME,
d200778e1   David Teigland   [DLM] expose dlm_...
101
  };
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
102
  static ssize_t cluster_cluster_name_show(struct config_item *item, char *buf)
60f98d183   David Teigland   dlm: add recovery...
103
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
104
  	struct dlm_cluster *cl = config_item_to_cluster(item);
60f98d183   David Teigland   dlm: add recovery...
105
106
107
  	return sprintf(buf, "%s
  ", cl->cl_cluster_name);
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
108
  static ssize_t cluster_cluster_name_store(struct config_item *item,
60f98d183   David Teigland   dlm: add recovery...
109
110
  					  const char *buf, size_t len)
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
111
  	struct dlm_cluster *cl = config_item_to_cluster(item);
ad917e7f8   Zhao Hongjiang   dlm: config: usin...
112
113
114
  	strlcpy(dlm_config.ci_cluster_name, buf,
  				sizeof(dlm_config.ci_cluster_name));
  	strlcpy(cl->cl_cluster_name, buf, sizeof(cl->cl_cluster_name));
60f98d183   David Teigland   dlm: add recovery...
115
116
  	return len;
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
117
  CONFIGFS_ATTR(cluster_, cluster_name);
60f98d183   David Teigland   dlm: add recovery...
118

51409340d   David Teigland   dlm: rename structs
119
  static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field,
5416b704a   Harvey Harrison   dlm: match signed...
120
  			   int *info_field, int check_zero,
d200778e1   David Teigland   [DLM] expose dlm_...
121
122
123
  			   const char *buf, size_t len)
  {
  	unsigned int x;
4f4c337fb   Fabian Frederick   fs/dlm/config.c: ...
124
  	int rc;
d200778e1   David Teigland   [DLM] expose dlm_...
125
126
  
  	if (!capable(CAP_SYS_ADMIN))
417358187   Zhao Hongjiang   fs: change return...
127
  		return -EPERM;
4f4c337fb   Fabian Frederick   fs/dlm/config.c: ...
128
129
130
  	rc = kstrtouint(buf, 0, &x);
  	if (rc)
  		return rc;
d200778e1   David Teigland   [DLM] expose dlm_...
131
132
133
134
135
136
137
138
139
  
  	if (check_zero && !x)
  		return -EINVAL;
  
  	*cl_field = x;
  	*info_field = x;
  
  	return len;
  }
d200778e1   David Teigland   [DLM] expose dlm_...
140
  #define CLUSTER_ATTR(name, check_zero)                                        \
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
141
142
  static ssize_t cluster_##name##_store(struct config_item *item, \
  		const char *buf, size_t len) \
d200778e1   David Teigland   [DLM] expose dlm_...
143
  {                                                                             \
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
144
  	struct dlm_cluster *cl = config_item_to_cluster(item);		      \
d200778e1   David Teigland   [DLM] expose dlm_...
145
146
147
  	return cluster_set(cl, &cl->cl_##name, &dlm_config.ci_##name,         \
  			   check_zero, buf, len);                             \
  }                                                                             \
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
148
  static ssize_t cluster_##name##_show(struct config_item *item, char *buf)     \
d200778e1   David Teigland   [DLM] expose dlm_...
149
  {                                                                             \
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
150
  	struct dlm_cluster *cl = config_item_to_cluster(item);		      \
d200778e1   David Teigland   [DLM] expose dlm_...
151
152
153
  	return snprintf(buf, PAGE_SIZE, "%u
  ", cl->cl_##name);               \
  }                                                                             \
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
154
  CONFIGFS_ATTR(cluster_, name);
d200778e1   David Teigland   [DLM] expose dlm_...
155
156
157
158
  
  CLUSTER_ATTR(tcp_port, 1);
  CLUSTER_ATTR(buffer_size, 1);
  CLUSTER_ATTR(rsbtbl_size, 1);
d200778e1   David Teigland   [DLM] expose dlm_...
159
160
161
162
  CLUSTER_ATTR(recover_timer, 1);
  CLUSTER_ATTR(toss_secs, 1);
  CLUSTER_ATTR(scan_secs, 1);
  CLUSTER_ATTR(log_debug, 0);
505ee5283   Zhilong Liu   dlm: add log_info...
163
  CLUSTER_ATTR(log_info, 0);
6ed7257b4   Patrick Caulfield   [DLM] Consolidate...
164
  CLUSTER_ATTR(protocol, 0);
3ae1acf93   David Teigland   [DLM] add lock ti...
165
  CLUSTER_ATTR(timewarn_cs, 1);
c6ff669ba   David Teigland   dlm: delayed repl...
166
  CLUSTER_ATTR(waitwarn_us, 0);
3881ac04e   David Teigland   dlm: improve rsb ...
167
  CLUSTER_ATTR(new_rsb_count, 0);
60f98d183   David Teigland   dlm: add recovery...
168
  CLUSTER_ATTR(recover_callbacks, 0);
d200778e1   David Teigland   [DLM] expose dlm_...
169
170
  
  static struct configfs_attribute *cluster_attrs[] = {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
171
172
173
174
175
176
177
  	[CLUSTER_ATTR_TCP_PORT] = &cluster_attr_tcp_port,
  	[CLUSTER_ATTR_BUFFER_SIZE] = &cluster_attr_buffer_size,
  	[CLUSTER_ATTR_RSBTBL_SIZE] = &cluster_attr_rsbtbl_size,
  	[CLUSTER_ATTR_RECOVER_TIMER] = &cluster_attr_recover_timer,
  	[CLUSTER_ATTR_TOSS_SECS] = &cluster_attr_toss_secs,
  	[CLUSTER_ATTR_SCAN_SECS] = &cluster_attr_scan_secs,
  	[CLUSTER_ATTR_LOG_DEBUG] = &cluster_attr_log_debug,
505ee5283   Zhilong Liu   dlm: add log_info...
178
  	[CLUSTER_ATTR_LOG_INFO] = &cluster_attr_log_info,
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
179
180
181
182
183
184
  	[CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol,
  	[CLUSTER_ATTR_TIMEWARN_CS] = &cluster_attr_timewarn_cs,
  	[CLUSTER_ATTR_WAITWARN_US] = &cluster_attr_waitwarn_us,
  	[CLUSTER_ATTR_NEW_RSB_COUNT] = &cluster_attr_new_rsb_count,
  	[CLUSTER_ATTR_RECOVER_CALLBACKS] = &cluster_attr_recover_callbacks,
  	[CLUSTER_ATTR_CLUSTER_NAME] = &cluster_attr_cluster_name,
d200778e1   David Teigland   [DLM] expose dlm_...
185
186
  	NULL,
  };
e7fd41792   David Teigland   [DLM] The core of...
187
188
189
190
  enum {
  	COMM_ATTR_NODEID = 0,
  	COMM_ATTR_LOCAL,
  	COMM_ATTR_ADDR,
55b3286d3   Masatake YAMATO   dlm: show address...
191
  	COMM_ATTR_ADDR_LIST,
e7fd41792   David Teigland   [DLM] The core of...
192
  };
e7fd41792   David Teigland   [DLM] The core of...
193
194
195
196
  enum {
  	NODE_ATTR_NODEID = 0,
  	NODE_ATTR_WEIGHT,
  };
51409340d   David Teigland   dlm: rename structs
197
  struct dlm_clusters {
e7fd41792   David Teigland   [DLM] The core of...
198
199
  	struct configfs_subsystem subsys;
  };
51409340d   David Teigland   dlm: rename structs
200
  struct dlm_spaces {
e7fd41792   David Teigland   [DLM] The core of...
201
202
  	struct config_group ss_group;
  };
51409340d   David Teigland   dlm: rename structs
203
  struct dlm_space {
e7fd41792   David Teigland   [DLM] The core of...
204
205
  	struct config_group group;
  	struct list_head members;
901359256   David Teigland   [DLM] Update DLM ...
206
  	struct mutex members_lock;
e7fd41792   David Teigland   [DLM] The core of...
207
208
  	int members_count;
  };
51409340d   David Teigland   dlm: rename structs
209
  struct dlm_comms {
e7fd41792   David Teigland   [DLM] The core of...
210
211
  	struct config_group cs_group;
  };
51409340d   David Teigland   dlm: rename structs
212
  struct dlm_comm {
e7fd41792   David Teigland   [DLM] The core of...
213
  	struct config_item item;
60f98d183   David Teigland   dlm: add recovery...
214
  	int seq;
e7fd41792   David Teigland   [DLM] The core of...
215
216
217
218
219
  	int nodeid;
  	int local;
  	int addr_count;
  	struct sockaddr_storage *addr[DLM_MAX_ADDR_COUNT];
  };
51409340d   David Teigland   dlm: rename structs
220
  struct dlm_nodes {
e7fd41792   David Teigland   [DLM] The core of...
221
222
  	struct config_group ns_group;
  };
51409340d   David Teigland   dlm: rename structs
223
  struct dlm_node {
e7fd41792   David Teigland   [DLM] The core of...
224
225
226
227
  	struct config_item item;
  	struct list_head list; /* space->members */
  	int nodeid;
  	int weight;
d44e0fc70   David Teigland   dlm: recover node...
228
  	int new;
60f98d183   David Teigland   dlm: add recovery...
229
  	int comm_seq; /* copy of cm->seq when nd->nodeid is set */
e7fd41792   David Teigland   [DLM] The core of...
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
  };
  
  static struct configfs_group_operations clusters_ops = {
  	.make_group = make_cluster,
  	.drop_item = drop_cluster,
  };
  
  static struct configfs_item_operations cluster_ops = {
  	.release = release_cluster,
  };
  
  static struct configfs_group_operations spaces_ops = {
  	.make_group = make_space,
  	.drop_item = drop_space,
  };
  
  static struct configfs_item_operations space_ops = {
  	.release = release_space,
  };
  
  static struct configfs_group_operations comms_ops = {
  	.make_item = make_comm,
  	.drop_item = drop_comm,
  };
  
  static struct configfs_item_operations comm_ops = {
  	.release = release_comm,
e7fd41792   David Teigland   [DLM] The core of...
257
258
259
260
261
262
263
264
265
  };
  
  static struct configfs_group_operations nodes_ops = {
  	.make_item = make_node,
  	.drop_item = drop_node,
  };
  
  static struct configfs_item_operations node_ops = {
  	.release = release_node,
e7fd41792   David Teigland   [DLM] The core of...
266
  };
761594b74   Bhumika Goyal   dlm: make config_...
267
  static const struct config_item_type clusters_type = {
e7fd41792   David Teigland   [DLM] The core of...
268
269
270
  	.ct_group_ops = &clusters_ops,
  	.ct_owner = THIS_MODULE,
  };
761594b74   Bhumika Goyal   dlm: make config_...
271
  static const struct config_item_type cluster_type = {
e7fd41792   David Teigland   [DLM] The core of...
272
  	.ct_item_ops = &cluster_ops,
d200778e1   David Teigland   [DLM] expose dlm_...
273
  	.ct_attrs = cluster_attrs,
e7fd41792   David Teigland   [DLM] The core of...
274
275
  	.ct_owner = THIS_MODULE,
  };
761594b74   Bhumika Goyal   dlm: make config_...
276
  static const struct config_item_type spaces_type = {
e7fd41792   David Teigland   [DLM] The core of...
277
278
279
  	.ct_group_ops = &spaces_ops,
  	.ct_owner = THIS_MODULE,
  };
761594b74   Bhumika Goyal   dlm: make config_...
280
  static const struct config_item_type space_type = {
e7fd41792   David Teigland   [DLM] The core of...
281
282
283
  	.ct_item_ops = &space_ops,
  	.ct_owner = THIS_MODULE,
  };
761594b74   Bhumika Goyal   dlm: make config_...
284
  static const struct config_item_type comms_type = {
e7fd41792   David Teigland   [DLM] The core of...
285
286
287
  	.ct_group_ops = &comms_ops,
  	.ct_owner = THIS_MODULE,
  };
761594b74   Bhumika Goyal   dlm: make config_...
288
  static const struct config_item_type comm_type = {
e7fd41792   David Teigland   [DLM] The core of...
289
290
291
292
  	.ct_item_ops = &comm_ops,
  	.ct_attrs = comm_attrs,
  	.ct_owner = THIS_MODULE,
  };
761594b74   Bhumika Goyal   dlm: make config_...
293
  static const struct config_item_type nodes_type = {
e7fd41792   David Teigland   [DLM] The core of...
294
295
296
  	.ct_group_ops = &nodes_ops,
  	.ct_owner = THIS_MODULE,
  };
761594b74   Bhumika Goyal   dlm: make config_...
297
  static const struct config_item_type node_type = {
e7fd41792   David Teigland   [DLM] The core of...
298
299
300
301
  	.ct_item_ops = &node_ops,
  	.ct_attrs = node_attrs,
  	.ct_owner = THIS_MODULE,
  };
27eccf464   Andrew Morton   dlm: choose bette...
302
  static struct dlm_space *config_item_to_space(struct config_item *i)
e7fd41792   David Teigland   [DLM] The core of...
303
  {
51409340d   David Teigland   dlm: rename structs
304
305
  	return i ? container_of(to_config_group(i), struct dlm_space, group) :
  		   NULL;
e7fd41792   David Teigland   [DLM] The core of...
306
  }
27eccf464   Andrew Morton   dlm: choose bette...
307
  static struct dlm_comm *config_item_to_comm(struct config_item *i)
e7fd41792   David Teigland   [DLM] The core of...
308
  {
51409340d   David Teigland   dlm: rename structs
309
  	return i ? container_of(i, struct dlm_comm, item) : NULL;
e7fd41792   David Teigland   [DLM] The core of...
310
  }
27eccf464   Andrew Morton   dlm: choose bette...
311
  static struct dlm_node *config_item_to_node(struct config_item *i)
e7fd41792   David Teigland   [DLM] The core of...
312
  {
51409340d   David Teigland   dlm: rename structs
313
  	return i ? container_of(i, struct dlm_node, item) : NULL;
e7fd41792   David Teigland   [DLM] The core of...
314
  }
f89ab8619   Joel Becker   Revert "configfs:...
315
316
  static struct config_group *make_cluster(struct config_group *g,
  					 const char *name)
e7fd41792   David Teigland   [DLM] The core of...
317
  {
51409340d   David Teigland   dlm: rename structs
318
319
320
  	struct dlm_cluster *cl = NULL;
  	struct dlm_spaces *sps = NULL;
  	struct dlm_comms *cms = NULL;
e7fd41792   David Teigland   [DLM] The core of...
321

573c24c4a   David Teigland   dlm: always use G...
322
  	cl = kzalloc(sizeof(struct dlm_cluster), GFP_NOFS);
573c24c4a   David Teigland   dlm: always use G...
323
324
  	sps = kzalloc(sizeof(struct dlm_spaces), GFP_NOFS);
  	cms = kzalloc(sizeof(struct dlm_comms), GFP_NOFS);
e7fd41792   David Teigland   [DLM] The core of...
325

82c7d823c   Andrew Price   dlm: config: Fix ...
326
  	if (!cl || !sps || !cms)
e7fd41792   David Teigland   [DLM] The core of...
327
328
329
330
331
  		goto fail;
  
  	config_group_init_type_name(&cl->group, name, &cluster_type);
  	config_group_init_type_name(&sps->ss_group, "spaces", &spaces_type);
  	config_group_init_type_name(&cms->cs_group, "comms", &comms_type);
1ae1602de   Christoph Hellwig   configfs: switch ...
332
333
  	configfs_add_default_group(&sps->ss_group, &cl->group);
  	configfs_add_default_group(&cms->cs_group, &cl->group);
e7fd41792   David Teigland   [DLM] The core of...
334

d200778e1   David Teigland   [DLM] expose dlm_...
335
336
337
  	cl->cl_tcp_port = dlm_config.ci_tcp_port;
  	cl->cl_buffer_size = dlm_config.ci_buffer_size;
  	cl->cl_rsbtbl_size = dlm_config.ci_rsbtbl_size;
d200778e1   David Teigland   [DLM] expose dlm_...
338
339
340
341
  	cl->cl_recover_timer = dlm_config.ci_recover_timer;
  	cl->cl_toss_secs = dlm_config.ci_toss_secs;
  	cl->cl_scan_secs = dlm_config.ci_scan_secs;
  	cl->cl_log_debug = dlm_config.ci_log_debug;
505ee5283   Zhilong Liu   dlm: add log_info...
342
  	cl->cl_log_info = dlm_config.ci_log_info;
0b7cac0fb   David Teigland   [DLM] show defaul...
343
  	cl->cl_protocol = dlm_config.ci_protocol;
84d8cd69a   David Teigland   [DLM] timeout fixes
344
  	cl->cl_timewarn_cs = dlm_config.ci_timewarn_cs;
c6ff669ba   David Teigland   dlm: delayed repl...
345
  	cl->cl_waitwarn_us = dlm_config.ci_waitwarn_us;
3881ac04e   David Teigland   dlm: improve rsb ...
346
  	cl->cl_new_rsb_count = dlm_config.ci_new_rsb_count;
60f98d183   David Teigland   dlm: add recovery...
347
348
349
  	cl->cl_recover_callbacks = dlm_config.ci_recover_callbacks;
  	memcpy(cl->cl_cluster_name, dlm_config.ci_cluster_name,
  	       DLM_LOCKSPACE_LEN);
d200778e1   David Teigland   [DLM] expose dlm_...
350

e7fd41792   David Teigland   [DLM] The core of...
351
352
  	space_list = &sps->ss_group;
  	comm_list = &cms->cs_group;
f89ab8619   Joel Becker   Revert "configfs:...
353
  	return &cl->group;
e7fd41792   David Teigland   [DLM] The core of...
354
355
356
  
   fail:
  	kfree(cl);
e7fd41792   David Teigland   [DLM] The core of...
357
358
  	kfree(sps);
  	kfree(cms);
a6795e9eb   Joel Becker   configfs: Allow -...
359
  	return ERR_PTR(-ENOMEM);
e7fd41792   David Teigland   [DLM] The core of...
360
361
362
363
  }
  
  static void drop_cluster(struct config_group *g, struct config_item *i)
  {
27eccf464   Andrew Morton   dlm: choose bette...
364
  	struct dlm_cluster *cl = config_item_to_cluster(i);
e7fd41792   David Teigland   [DLM] The core of...
365

1ae1602de   Christoph Hellwig   configfs: switch ...
366
  	configfs_remove_default_groups(&cl->group);
e7fd41792   David Teigland   [DLM] The core of...
367
368
369
370
371
372
373
374
375
  
  	space_list = NULL;
  	comm_list = NULL;
  
  	config_item_put(i);
  }
  
  static void release_cluster(struct config_item *i)
  {
27eccf464   Andrew Morton   dlm: choose bette...
376
  	struct dlm_cluster *cl = config_item_to_cluster(i);
e7fd41792   David Teigland   [DLM] The core of...
377
378
  	kfree(cl);
  }
f89ab8619   Joel Becker   Revert "configfs:...
379
  static struct config_group *make_space(struct config_group *g, const char *name)
e7fd41792   David Teigland   [DLM] The core of...
380
  {
51409340d   David Teigland   dlm: rename structs
381
382
  	struct dlm_space *sp = NULL;
  	struct dlm_nodes *nds = NULL;
e7fd41792   David Teigland   [DLM] The core of...
383

573c24c4a   David Teigland   dlm: always use G...
384
  	sp = kzalloc(sizeof(struct dlm_space), GFP_NOFS);
573c24c4a   David Teigland   dlm: always use G...
385
  	nds = kzalloc(sizeof(struct dlm_nodes), GFP_NOFS);
e7fd41792   David Teigland   [DLM] The core of...
386

1ae1602de   Christoph Hellwig   configfs: switch ...
387
  	if (!sp || !nds)
e7fd41792   David Teigland   [DLM] The core of...
388
389
390
  		goto fail;
  
  	config_group_init_type_name(&sp->group, name, &space_type);
e7fd41792   David Teigland   [DLM] The core of...
391

1ae1602de   Christoph Hellwig   configfs: switch ...
392
393
  	config_group_init_type_name(&nds->ns_group, "nodes", &nodes_type);
  	configfs_add_default_group(&nds->ns_group, &sp->group);
e7fd41792   David Teigland   [DLM] The core of...
394
395
  
  	INIT_LIST_HEAD(&sp->members);
901359256   David Teigland   [DLM] Update DLM ...
396
  	mutex_init(&sp->members_lock);
e7fd41792   David Teigland   [DLM] The core of...
397
  	sp->members_count = 0;
f89ab8619   Joel Becker   Revert "configfs:...
398
  	return &sp->group;
e7fd41792   David Teigland   [DLM] The core of...
399
400
401
  
   fail:
  	kfree(sp);
e7fd41792   David Teigland   [DLM] The core of...
402
  	kfree(nds);
a6795e9eb   Joel Becker   configfs: Allow -...
403
  	return ERR_PTR(-ENOMEM);
e7fd41792   David Teigland   [DLM] The core of...
404
405
406
407
  }
  
  static void drop_space(struct config_group *g, struct config_item *i)
  {
27eccf464   Andrew Morton   dlm: choose bette...
408
  	struct dlm_space *sp = config_item_to_space(i);
e7fd41792   David Teigland   [DLM] The core of...
409
410
  
  	/* assert list_empty(&sp->members) */
1ae1602de   Christoph Hellwig   configfs: switch ...
411
  	configfs_remove_default_groups(&sp->group);
e7fd41792   David Teigland   [DLM] The core of...
412
413
414
415
416
  	config_item_put(i);
  }
  
  static void release_space(struct config_item *i)
  {
27eccf464   Andrew Morton   dlm: choose bette...
417
  	struct dlm_space *sp = config_item_to_space(i);
e7fd41792   David Teigland   [DLM] The core of...
418
419
  	kfree(sp);
  }
f89ab8619   Joel Becker   Revert "configfs:...
420
  static struct config_item *make_comm(struct config_group *g, const char *name)
e7fd41792   David Teigland   [DLM] The core of...
421
  {
51409340d   David Teigland   dlm: rename structs
422
  	struct dlm_comm *cm;
e7fd41792   David Teigland   [DLM] The core of...
423

573c24c4a   David Teigland   dlm: always use G...
424
  	cm = kzalloc(sizeof(struct dlm_comm), GFP_NOFS);
e7fd41792   David Teigland   [DLM] The core of...
425
  	if (!cm)
a6795e9eb   Joel Becker   configfs: Allow -...
426
  		return ERR_PTR(-ENOMEM);
e7fd41792   David Teigland   [DLM] The core of...
427
428
  
  	config_item_init_type_name(&cm->item, name, &comm_type);
60f98d183   David Teigland   dlm: add recovery...
429
430
431
432
  
  	cm->seq = dlm_comm_count++;
  	if (!cm->seq)
  		cm->seq = dlm_comm_count++;
e7fd41792   David Teigland   [DLM] The core of...
433
434
435
  	cm->nodeid = -1;
  	cm->local = 0;
  	cm->addr_count = 0;
f89ab8619   Joel Becker   Revert "configfs:...
436
  	return &cm->item;
e7fd41792   David Teigland   [DLM] The core of...
437
438
439
440
  }
  
  static void drop_comm(struct config_group *g, struct config_item *i)
  {
27eccf464   Andrew Morton   dlm: choose bette...
441
  	struct dlm_comm *cm = config_item_to_comm(i);
e7fd41792   David Teigland   [DLM] The core of...
442
443
  	if (local_comm == cm)
  		local_comm = NULL;
1c032c031   David Teigland   [DLM] PATCH 2/3 d...
444
  	dlm_lowcomms_close(cm->nodeid);
e7fd41792   David Teigland   [DLM] The core of...
445
446
447
448
449
450
451
  	while (cm->addr_count--)
  		kfree(cm->addr[cm->addr_count]);
  	config_item_put(i);
  }
  
  static void release_comm(struct config_item *i)
  {
27eccf464   Andrew Morton   dlm: choose bette...
452
  	struct dlm_comm *cm = config_item_to_comm(i);
e7fd41792   David Teigland   [DLM] The core of...
453
454
  	kfree(cm);
  }
f89ab8619   Joel Becker   Revert "configfs:...
455
  static struct config_item *make_node(struct config_group *g, const char *name)
e7fd41792   David Teigland   [DLM] The core of...
456
  {
27eccf464   Andrew Morton   dlm: choose bette...
457
  	struct dlm_space *sp = config_item_to_space(g->cg_item.ci_parent);
51409340d   David Teigland   dlm: rename structs
458
  	struct dlm_node *nd;
e7fd41792   David Teigland   [DLM] The core of...
459

573c24c4a   David Teigland   dlm: always use G...
460
  	nd = kzalloc(sizeof(struct dlm_node), GFP_NOFS);
e7fd41792   David Teigland   [DLM] The core of...
461
  	if (!nd)
a6795e9eb   Joel Becker   configfs: Allow -...
462
  		return ERR_PTR(-ENOMEM);
e7fd41792   David Teigland   [DLM] The core of...
463
464
465
466
  
  	config_item_init_type_name(&nd->item, name, &node_type);
  	nd->nodeid = -1;
  	nd->weight = 1;  /* default weight of 1 if none is set */
d44e0fc70   David Teigland   dlm: recover node...
467
  	nd->new = 1;     /* set to 0 once it's been read by dlm_nodeid_list() */
e7fd41792   David Teigland   [DLM] The core of...
468

901359256   David Teigland   [DLM] Update DLM ...
469
  	mutex_lock(&sp->members_lock);
e7fd41792   David Teigland   [DLM] The core of...
470
471
  	list_add(&nd->list, &sp->members);
  	sp->members_count++;
901359256   David Teigland   [DLM] Update DLM ...
472
  	mutex_unlock(&sp->members_lock);
e7fd41792   David Teigland   [DLM] The core of...
473

f89ab8619   Joel Becker   Revert "configfs:...
474
  	return &nd->item;
e7fd41792   David Teigland   [DLM] The core of...
475
476
477
478
  }
  
  static void drop_node(struct config_group *g, struct config_item *i)
  {
27eccf464   Andrew Morton   dlm: choose bette...
479
480
  	struct dlm_space *sp = config_item_to_space(g->cg_item.ci_parent);
  	struct dlm_node *nd = config_item_to_node(i);
e7fd41792   David Teigland   [DLM] The core of...
481

901359256   David Teigland   [DLM] Update DLM ...
482
  	mutex_lock(&sp->members_lock);
e7fd41792   David Teigland   [DLM] The core of...
483
484
  	list_del(&nd->list);
  	sp->members_count--;
901359256   David Teigland   [DLM] Update DLM ...
485
  	mutex_unlock(&sp->members_lock);
e7fd41792   David Teigland   [DLM] The core of...
486
487
488
489
490
491
  
  	config_item_put(i);
  }
  
  static void release_node(struct config_item *i)
  {
27eccf464   Andrew Morton   dlm: choose bette...
492
  	struct dlm_node *nd = config_item_to_node(i);
e7fd41792   David Teigland   [DLM] The core of...
493
494
  	kfree(nd);
  }
51409340d   David Teigland   dlm: rename structs
495
  static struct dlm_clusters clusters_root = {
e7fd41792   David Teigland   [DLM] The core of...
496
497
498
499
500
501
502
503
504
  	.subsys = {
  		.su_group = {
  			.cg_item = {
  				.ci_namebuf = "dlm",
  				.ci_type = &clusters_type,
  			},
  		},
  	},
  };
30727174b   Denis Cheng   dlm: add __init a...
505
  int __init dlm_config_init(void)
e7fd41792   David Teigland   [DLM] The core of...
506
507
  {
  	config_group_init(&clusters_root.subsys.su_group);
e6bd07aee   Joel Becker   configfs: Convert...
508
  	mutex_init(&clusters_root.subsys.su_mutex);
e7fd41792   David Teigland   [DLM] The core of...
509
510
511
512
513
514
515
516
517
518
519
  	return configfs_register_subsystem(&clusters_root.subsys);
  }
  
  void dlm_config_exit(void)
  {
  	configfs_unregister_subsystem(&clusters_root.subsys);
  }
  
  /*
   * Functions for user space to read/write attributes
   */
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
520
  static ssize_t comm_nodeid_show(struct config_item *item, char *buf)
d200778e1   David Teigland   [DLM] expose dlm_...
521
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
522
523
  	return sprintf(buf, "%d
  ", config_item_to_comm(item)->nodeid);
e7fd41792   David Teigland   [DLM] The core of...
524
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
525
  static ssize_t comm_nodeid_store(struct config_item *item, const char *buf,
51409340d   David Teigland   dlm: rename structs
526
  				 size_t len)
e7fd41792   David Teigland   [DLM] The core of...
527
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
528
  	int rc = kstrtoint(buf, 0, &config_item_to_comm(item)->nodeid);
4f4c337fb   Fabian Frederick   fs/dlm/config.c: ...
529
530
531
  
  	if (rc)
  		return rc;
e7fd41792   David Teigland   [DLM] The core of...
532
533
  	return len;
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
534
  static ssize_t comm_local_show(struct config_item *item, char *buf)
e7fd41792   David Teigland   [DLM] The core of...
535
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
536
537
  	return sprintf(buf, "%d
  ", config_item_to_comm(item)->local);
e7fd41792   David Teigland   [DLM] The core of...
538
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
539
  static ssize_t comm_local_store(struct config_item *item, const char *buf,
51409340d   David Teigland   dlm: rename structs
540
  				size_t len)
e7fd41792   David Teigland   [DLM] The core of...
541
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
542
  	struct dlm_comm *cm = config_item_to_comm(item);
4f4c337fb   Fabian Frederick   fs/dlm/config.c: ...
543
544
545
546
  	int rc = kstrtoint(buf, 0, &cm->local);
  
  	if (rc)
  		return rc;
e7fd41792   David Teigland   [DLM] The core of...
547
548
549
550
  	if (cm->local && !local_comm)
  		local_comm = cm;
  	return len;
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
551
552
  static ssize_t comm_addr_store(struct config_item *item, const char *buf,
  		size_t len)
e7fd41792   David Teigland   [DLM] The core of...
553
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
554
  	struct dlm_comm *cm = config_item_to_comm(item);
e7fd41792   David Teigland   [DLM] The core of...
555
  	struct sockaddr_storage *addr;
36b71a8bf   David Teigland   dlm: fix deadlock...
556
  	int rv;
e7fd41792   David Teigland   [DLM] The core of...
557
558
559
560
561
562
  
  	if (len != sizeof(struct sockaddr_storage))
  		return -EINVAL;
  
  	if (cm->addr_count >= DLM_MAX_ADDR_COUNT)
  		return -ENOSPC;
573c24c4a   David Teigland   dlm: always use G...
563
  	addr = kzalloc(sizeof(*addr), GFP_NOFS);
e7fd41792   David Teigland   [DLM] The core of...
564
565
566
567
  	if (!addr)
  		return -ENOMEM;
  
  	memcpy(addr, buf, len);
36b71a8bf   David Teigland   dlm: fix deadlock...
568
569
570
571
572
573
  
  	rv = dlm_lowcomms_addr(cm->nodeid, addr, len);
  	if (rv) {
  		kfree(addr);
  		return rv;
  	}
e7fd41792   David Teigland   [DLM] The core of...
574
575
576
  	cm->addr[cm->addr_count++] = addr;
  	return len;
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
577
  static ssize_t comm_addr_list_show(struct config_item *item, char *buf)
55b3286d3   Masatake YAMATO   dlm: show address...
578
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
579
  	struct dlm_comm *cm = config_item_to_comm(item);
55b3286d3   Masatake YAMATO   dlm: show address...
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
  	ssize_t s;
  	ssize_t allowance;
  	int i;
  	struct sockaddr_storage *addr;
  	struct sockaddr_in *addr_in;
  	struct sockaddr_in6 *addr_in6;
  	
  	/* Taken from ip6_addr_string() defined in lib/vsprintf.c */
  	char buf0[sizeof("AF_INET6	xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255
  ")];
  	
  
  	/* Derived from SIMPLE_ATTR_SIZE of fs/configfs/file.c */
  	allowance = 4096;
  	buf[0] = '\0';
  
  	for (i = 0; i < cm->addr_count; i++) {
  		addr = cm->addr[i];
  
  		switch(addr->ss_family) {
  		case AF_INET:
  			addr_in = (struct sockaddr_in *)addr;
  			s = sprintf(buf0, "AF_INET	%pI4
  ", &addr_in->sin_addr.s_addr);
  			break;
  		case AF_INET6:
  			addr_in6 = (struct sockaddr_in6 *)addr;
  			s = sprintf(buf0, "AF_INET6	%pI6
  ", &addr_in6->sin6_addr);
  			break;
  		default:
  			s = sprintf(buf0, "%s
  ", "<UNKNOWN>");
  			break;
  		}
  		allowance -= s;
  		if (allowance >= 0)
  			strcat(buf, buf0);
  		else {
  			allowance += s;
  			break;
  		}
  	}
  	return 4096 - allowance;
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
625
626
627
628
  CONFIGFS_ATTR(comm_, nodeid);
  CONFIGFS_ATTR(comm_, local);
  CONFIGFS_ATTR_WO(comm_, addr);
  CONFIGFS_ATTR_RO(comm_, addr_list);
e7fd41792   David Teigland   [DLM] The core of...
629

9ae0f367d   Christoph Hellwig   dlm: use per-attr...
630
631
632
633
634
635
636
  static struct configfs_attribute *comm_attrs[] = {
  	[COMM_ATTR_NODEID] = &comm_attr_nodeid,
  	[COMM_ATTR_LOCAL] = &comm_attr_local,
  	[COMM_ATTR_ADDR] = &comm_attr_addr,
  	[COMM_ATTR_ADDR_LIST] = &comm_attr_addr_list,
  	NULL,
  };
e7fd41792   David Teigland   [DLM] The core of...
637

9ae0f367d   Christoph Hellwig   dlm: use per-attr...
638
  static ssize_t node_nodeid_show(struct config_item *item, char *buf)
e7fd41792   David Teigland   [DLM] The core of...
639
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
640
641
  	return sprintf(buf, "%d
  ", config_item_to_node(item)->nodeid);
e7fd41792   David Teigland   [DLM] The core of...
642
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
643
  static ssize_t node_nodeid_store(struct config_item *item, const char *buf,
51409340d   David Teigland   dlm: rename structs
644
  				 size_t len)
e7fd41792   David Teigland   [DLM] The core of...
645
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
646
  	struct dlm_node *nd = config_item_to_node(item);
60f98d183   David Teigland   dlm: add recovery...
647
  	uint32_t seq = 0;
4f4c337fb   Fabian Frederick   fs/dlm/config.c: ...
648
649
650
651
  	int rc = kstrtoint(buf, 0, &nd->nodeid);
  
  	if (rc)
  		return rc;
60f98d183   David Teigland   dlm: add recovery...
652
653
  	dlm_comm_seq(nd->nodeid, &seq);
  	nd->comm_seq = seq;
e7fd41792   David Teigland   [DLM] The core of...
654
655
  	return len;
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
656
  static ssize_t node_weight_show(struct config_item *item, char *buf)
e7fd41792   David Teigland   [DLM] The core of...
657
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
658
659
  	return sprintf(buf, "%d
  ", config_item_to_node(item)->weight);
e7fd41792   David Teigland   [DLM] The core of...
660
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
661
  static ssize_t node_weight_store(struct config_item *item, const char *buf,
51409340d   David Teigland   dlm: rename structs
662
  				 size_t len)
e7fd41792   David Teigland   [DLM] The core of...
663
  {
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
664
  	int rc = kstrtoint(buf, 0, &config_item_to_node(item)->weight);
4f4c337fb   Fabian Frederick   fs/dlm/config.c: ...
665
666
667
  
  	if (rc)
  		return rc;
e7fd41792   David Teigland   [DLM] The core of...
668
669
  	return len;
  }
9ae0f367d   Christoph Hellwig   dlm: use per-attr...
670
671
672
673
674
675
676
677
  CONFIGFS_ATTR(node_, nodeid);
  CONFIGFS_ATTR(node_, weight);
  
  static struct configfs_attribute *node_attrs[] = {
  	[NODE_ATTR_NODEID] = &node_attr_nodeid,
  	[NODE_ATTR_WEIGHT] = &node_attr_weight,
  	NULL,
  };
e7fd41792   David Teigland   [DLM] The core of...
678
679
680
  /*
   * Functions for the dlm to get the info that's been configured
   */
51409340d   David Teigland   dlm: rename structs
681
  static struct dlm_space *get_space(char *name)
e7fd41792   David Teigland   [DLM] The core of...
682
  {
3168b0780   Satyam Sharma   [DLM] fix a coupl...
683
  	struct config_item *i;
e7fd41792   David Teigland   [DLM] The core of...
684
685
  	if (!space_list)
  		return NULL;
3168b0780   Satyam Sharma   [DLM] fix a coupl...
686

e6bd07aee   Joel Becker   configfs: Convert...
687
  	mutex_lock(&space_list->cg_subsys->su_mutex);
3fe6c5ce1   Satyam Sharma   [PATCH] configfs+...
688
  	i = config_group_find_item(space_list, name);
e6bd07aee   Joel Becker   configfs: Convert...
689
  	mutex_unlock(&space_list->cg_subsys->su_mutex);
3168b0780   Satyam Sharma   [DLM] fix a coupl...
690

27eccf464   Andrew Morton   dlm: choose bette...
691
  	return config_item_to_space(i);
e7fd41792   David Teigland   [DLM] The core of...
692
  }
51409340d   David Teigland   dlm: rename structs
693
  static void put_space(struct dlm_space *sp)
e7fd41792   David Teigland   [DLM] The core of...
694
695
696
  {
  	config_item_put(&sp->group.cg_item);
  }
36b71a8bf   David Teigland   dlm: fix deadlock...
697
  static struct dlm_comm *get_comm(int nodeid)
e7fd41792   David Teigland   [DLM] The core of...
698
699
  {
  	struct config_item *i;
51409340d   David Teigland   dlm: rename structs
700
  	struct dlm_comm *cm = NULL;
e7fd41792   David Teigland   [DLM] The core of...
701
702
703
704
  	int found = 0;
  
  	if (!comm_list)
  		return NULL;
e6bd07aee   Joel Becker   configfs: Convert...
705
  	mutex_lock(&clusters_root.subsys.su_mutex);
e7fd41792   David Teigland   [DLM] The core of...
706
707
  
  	list_for_each_entry(i, &comm_list->cg_children, ci_entry) {
27eccf464   Andrew Morton   dlm: choose bette...
708
  		cm = config_item_to_comm(i);
e7fd41792   David Teigland   [DLM] The core of...
709

36b71a8bf   David Teigland   dlm: fix deadlock...
710
711
712
713
714
  		if (cm->nodeid != nodeid)
  			continue;
  		found = 1;
  		config_item_get(i);
  		break;
e7fd41792   David Teigland   [DLM] The core of...
715
  	}
e6bd07aee   Joel Becker   configfs: Convert...
716
  	mutex_unlock(&clusters_root.subsys.su_mutex);
e7fd41792   David Teigland   [DLM] The core of...
717

3168b0780   Satyam Sharma   [DLM] fix a coupl...
718
  	if (!found)
e7fd41792   David Teigland   [DLM] The core of...
719
720
721
  		cm = NULL;
  	return cm;
  }
51409340d   David Teigland   dlm: rename structs
722
  static void put_comm(struct dlm_comm *cm)
e7fd41792   David Teigland   [DLM] The core of...
723
724
725
726
727
  {
  	config_item_put(&cm->item);
  }
  
  /* caller must free mem */
60f98d183   David Teigland   dlm: add recovery...
728
729
  int dlm_config_nodes(char *lsname, struct dlm_config_node **nodes_out,
  		     int *count_out)
e7fd41792   David Teigland   [DLM] The core of...
730
  {
51409340d   David Teigland   dlm: rename structs
731
732
  	struct dlm_space *sp;
  	struct dlm_node *nd;
60f98d183   David Teigland   dlm: add recovery...
733
734
  	struct dlm_config_node *nodes, *node;
  	int rv, count;
e7fd41792   David Teigland   [DLM] The core of...
735
736
737
738
  
  	sp = get_space(lsname);
  	if (!sp)
  		return -EEXIST;
901359256   David Teigland   [DLM] Update DLM ...
739
  	mutex_lock(&sp->members_lock);
e7fd41792   David Teigland   [DLM] The core of...
740
  	if (!sp->members_count) {
d44e0fc70   David Teigland   dlm: recover node...
741
742
743
  		rv = -EINVAL;
  		printk(KERN_ERR "dlm: zero members_count
  ");
e7fd41792   David Teigland   [DLM] The core of...
744
745
  		goto out;
  	}
60f98d183   David Teigland   dlm: add recovery...
746
  	count = sp->members_count;
d44e0fc70   David Teigland   dlm: recover node...
747

60f98d183   David Teigland   dlm: add recovery...
748
749
  	nodes = kcalloc(count, sizeof(struct dlm_config_node), GFP_NOFS);
  	if (!nodes) {
e7fd41792   David Teigland   [DLM] The core of...
750
751
752
  		rv = -ENOMEM;
  		goto out;
  	}
60f98d183   David Teigland   dlm: add recovery...
753
  	node = nodes;
d44e0fc70   David Teigland   dlm: recover node...
754
  	list_for_each_entry(nd, &sp->members, list) {
60f98d183   David Teigland   dlm: add recovery...
755
756
757
758
759
  		node->nodeid = nd->nodeid;
  		node->weight = nd->weight;
  		node->new = nd->new;
  		node->comm_seq = nd->comm_seq;
  		node++;
d44e0fc70   David Teigland   dlm: recover node...
760

60f98d183   David Teigland   dlm: add recovery...
761
  		nd->new = 0;
d44e0fc70   David Teigland   dlm: recover node...
762
  	}
e7fd41792   David Teigland   [DLM] The core of...
763

60f98d183   David Teigland   dlm: add recovery...
764
765
766
  	*count_out = count;
  	*nodes_out = nodes;
  	rv = 0;
e7fd41792   David Teigland   [DLM] The core of...
767
   out:
901359256   David Teigland   [DLM] Update DLM ...
768
  	mutex_unlock(&sp->members_lock);
e7fd41792   David Teigland   [DLM] The core of...
769
770
771
  	put_space(sp);
  	return rv;
  }
60f98d183   David Teigland   dlm: add recovery...
772
  int dlm_comm_seq(int nodeid, uint32_t *seq)
e7fd41792   David Teigland   [DLM] The core of...
773
  {
36b71a8bf   David Teigland   dlm: fix deadlock...
774
  	struct dlm_comm *cm = get_comm(nodeid);
60f98d183   David Teigland   dlm: add recovery...
775
776
777
778
779
  	if (!cm)
  		return -EEXIST;
  	*seq = cm->seq;
  	put_comm(cm);
  	return 0;
e7fd41792   David Teigland   [DLM] The core of...
780
  }
e7fd41792   David Teigland   [DLM] The core of...
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
  int dlm_our_nodeid(void)
  {
  	return local_comm ? local_comm->nodeid : 0;
  }
  
  /* num 0 is first addr, num 1 is second addr */
  int dlm_our_addr(struct sockaddr_storage *addr, int num)
  {
  	if (!local_comm)
  		return -1;
  	if (num + 1 > local_comm->addr_count)
  		return -1;
  	memcpy(addr, local_comm->addr[num], sizeof(*addr));
  	return 0;
  }
  
  /* Config file defaults */
  #define DEFAULT_TCP_PORT       21064
  #define DEFAULT_BUFFER_SIZE     4096
e3853a90e   David Teigland   dlm: increase def...
800
  #define DEFAULT_RSBTBL_SIZE     1024
e7fd41792   David Teigland   [DLM] The core of...
801
802
803
  #define DEFAULT_RECOVER_TIMER      5
  #define DEFAULT_TOSS_SECS         10
  #define DEFAULT_SCAN_SECS          5
99fc64874   David Teigland   [DLM] add config ...
804
  #define DEFAULT_LOG_DEBUG          0
505ee5283   Zhilong Liu   dlm: add log_info...
805
  #define DEFAULT_LOG_INFO           1
6ed7257b4   Patrick Caulfield   [DLM] Consolidate...
806
  #define DEFAULT_PROTOCOL           0
3ae1acf93   David Teigland   [DLM] add lock ti...
807
  #define DEFAULT_TIMEWARN_CS      500 /* 5 sec = 500 centiseconds */
c6ff669ba   David Teigland   dlm: delayed repl...
808
  #define DEFAULT_WAITWARN_US	   0
3881ac04e   David Teigland   dlm: improve rsb ...
809
  #define DEFAULT_NEW_RSB_COUNT    128
60f98d183   David Teigland   dlm: add recovery...
810
811
  #define DEFAULT_RECOVER_CALLBACKS  0
  #define DEFAULT_CLUSTER_NAME      ""
e7fd41792   David Teigland   [DLM] The core of...
812
813
  
  struct dlm_config_info dlm_config = {
68c817a1c   David Teigland   [DLM] rename dlm_...
814
815
816
  	.ci_tcp_port = DEFAULT_TCP_PORT,
  	.ci_buffer_size = DEFAULT_BUFFER_SIZE,
  	.ci_rsbtbl_size = DEFAULT_RSBTBL_SIZE,
68c817a1c   David Teigland   [DLM] rename dlm_...
817
818
  	.ci_recover_timer = DEFAULT_RECOVER_TIMER,
  	.ci_toss_secs = DEFAULT_TOSS_SECS,
99fc64874   David Teigland   [DLM] add config ...
819
  	.ci_scan_secs = DEFAULT_SCAN_SECS,
6ed7257b4   Patrick Caulfield   [DLM] Consolidate...
820
  	.ci_log_debug = DEFAULT_LOG_DEBUG,
505ee5283   Zhilong Liu   dlm: add log_info...
821
  	.ci_log_info = DEFAULT_LOG_INFO,
3ae1acf93   David Teigland   [DLM] add lock ti...
822
  	.ci_protocol = DEFAULT_PROTOCOL,
c6ff669ba   David Teigland   dlm: delayed repl...
823
  	.ci_timewarn_cs = DEFAULT_TIMEWARN_CS,
3881ac04e   David Teigland   dlm: improve rsb ...
824
  	.ci_waitwarn_us = DEFAULT_WAITWARN_US,
60f98d183   David Teigland   dlm: add recovery...
825
826
827
  	.ci_new_rsb_count = DEFAULT_NEW_RSB_COUNT,
  	.ci_recover_callbacks = DEFAULT_RECOVER_CALLBACKS,
  	.ci_cluster_name = DEFAULT_CLUSTER_NAME
e7fd41792   David Teigland   [DLM] The core of...
828
  };