24
24
#include "lowcomms.h"
25
25
26
26
/*
27
- * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/nodeid
27
+ * /config/dlm/<cluster>/spaces/<space>/nodes/<node>/nodeid (refers to <node>)
28
28
* /config/dlm/<cluster>/spaces/<space>/nodes/<node>/weight
29
- * /config/dlm/<cluster>/comms/<comm>/nodeid
29
+ * /config/dlm/<cluster>/comms/<comm>/nodeid (refers to <comm>)
30
30
* /config/dlm/<cluster>/comms/<comm>/local
31
31
* /config/dlm/<cluster>/comms/<comm>/addr (write only)
32
32
* /config/dlm/<cluster>/comms/<comm>/addr_list (read only)
@@ -73,20 +73,6 @@ const struct rhashtable_params dlm_rhash_rsb_params = {
73
73
74
74
struct dlm_cluster {
75
75
struct config_group group ;
76
- unsigned int cl_tcp_port ;
77
- unsigned int cl_buffer_size ;
78
- unsigned int cl_rsbtbl_size ;
79
- unsigned int cl_recover_timer ;
80
- unsigned int cl_toss_secs ;
81
- unsigned int cl_scan_secs ;
82
- unsigned int cl_log_debug ;
83
- unsigned int cl_log_info ;
84
- unsigned int cl_protocol ;
85
- unsigned int cl_mark ;
86
- unsigned int cl_new_rsb_count ;
87
- unsigned int cl_recover_callbacks ;
88
- char cl_cluster_name [DLM_LOCKSPACE_LEN ];
89
-
90
76
struct dlm_spaces * sps ;
91
77
struct dlm_comms * cms ;
92
78
};
@@ -115,25 +101,60 @@ enum {
115
101
116
102
static ssize_t cluster_cluster_name_show (struct config_item * item , char * buf )
117
103
{
118
- struct dlm_cluster * cl = config_item_to_cluster (item );
119
- return sprintf (buf , "%s\n" , cl -> cl_cluster_name );
104
+ return sprintf (buf , "%s\n" , dlm_config .ci_cluster_name );
120
105
}
121
106
122
107
static ssize_t cluster_cluster_name_store (struct config_item * item ,
123
108
const char * buf , size_t len )
124
109
{
125
- struct dlm_cluster * cl = config_item_to_cluster (item );
126
-
127
110
strscpy (dlm_config .ci_cluster_name , buf ,
128
- sizeof (dlm_config .ci_cluster_name ));
129
- strscpy (cl -> cl_cluster_name , buf , sizeof (cl -> cl_cluster_name ));
111
+ sizeof (dlm_config .ci_cluster_name ));
130
112
return len ;
131
113
}
132
114
133
115
CONFIGFS_ATTR (cluster_ , cluster_name );
134
116
135
- static ssize_t cluster_set (struct dlm_cluster * cl , unsigned int * cl_field ,
136
- int * info_field , int (* check_cb )(unsigned int x ),
117
+ static ssize_t cluster_tcp_port_show (struct config_item * item , char * buf )
118
+ {
119
+ return sprintf (buf , "%u\n" , be16_to_cpu (dlm_config .ci_tcp_port ));
120
+ }
121
+
122
+ static int dlm_check_zero_and_dlm_running (unsigned int x )
123
+ {
124
+ if (!x )
125
+ return - EINVAL ;
126
+
127
+ if (dlm_lowcomms_is_running ())
128
+ return - EBUSY ;
129
+
130
+ return 0 ;
131
+ }
132
+
133
+ static ssize_t cluster_tcp_port_store (struct config_item * item ,
134
+ const char * buf , size_t len )
135
+ {
136
+ int rc ;
137
+ u16 x ;
138
+
139
+ if (!capable (CAP_SYS_ADMIN ))
140
+ return - EPERM ;
141
+
142
+ rc = kstrtou16 (buf , 0 , & x );
143
+ if (rc )
144
+ return rc ;
145
+
146
+ rc = dlm_check_zero_and_dlm_running (x );
147
+ if (rc )
148
+ return rc ;
149
+
150
+ dlm_config .ci_tcp_port = cpu_to_be16 (x );
151
+ return len ;
152
+ }
153
+
154
+ CONFIGFS_ATTR (cluster_ , tcp_port );
155
+
156
+ static ssize_t cluster_set (unsigned int * info_field ,
157
+ int (* check_cb )(unsigned int x ),
137
158
const char * buf , size_t len )
138
159
{
139
160
unsigned int x ;
@@ -151,7 +172,6 @@ static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field,
151
172
return rc ;
152
173
}
153
174
154
- * cl_field = x ;
155
175
* info_field = x ;
156
176
157
177
return len ;
@@ -161,14 +181,11 @@ static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field,
161
181
static ssize_t cluster_##name##_store(struct config_item *item, \
162
182
const char *buf, size_t len) \
163
183
{ \
164
- struct dlm_cluster *cl = config_item_to_cluster(item); \
165
- return cluster_set(cl, &cl->cl_##name, &dlm_config.ci_##name, \
166
- check_cb, buf, len); \
184
+ return cluster_set(&dlm_config.ci_##name, check_cb, buf, len); \
167
185
} \
168
186
static ssize_t cluster_##name##_show(struct config_item *item, char *buf) \
169
187
{ \
170
- struct dlm_cluster *cl = config_item_to_cluster(item); \
171
- return snprintf(buf, PAGE_SIZE, "%u\n", cl->cl_##name); \
188
+ return snprintf(buf, PAGE_SIZE, "%u\n", dlm_config.ci_##name); \
172
189
} \
173
190
CONFIGFS_ATTR(cluster_, name);
174
191
@@ -191,17 +208,6 @@ static int dlm_check_protocol_and_dlm_running(unsigned int x)
191
208
return 0 ;
192
209
}
193
210
194
- static int dlm_check_zero_and_dlm_running (unsigned int x )
195
- {
196
- if (!x )
197
- return - EINVAL ;
198
-
199
- if (dlm_lowcomms_is_running ())
200
- return - EBUSY ;
201
-
202
- return 0 ;
203
- }
204
-
205
211
static int dlm_check_zero (unsigned int x )
206
212
{
207
213
if (!x )
@@ -218,7 +224,6 @@ static int dlm_check_buffer_size(unsigned int x)
218
224
return 0 ;
219
225
}
220
226
221
- CLUSTER_ATTR (tcp_port , dlm_check_zero_and_dlm_running );
222
227
CLUSTER_ATTR (buffer_size , dlm_check_buffer_size );
223
228
CLUSTER_ATTR (rsbtbl_size , dlm_check_zero );
224
229
CLUSTER_ATTR (recover_timer , dlm_check_zero );
@@ -423,20 +428,6 @@ static struct config_group *make_cluster(struct config_group *g,
423
428
configfs_add_default_group (& sps -> ss_group , & cl -> group );
424
429
configfs_add_default_group (& cms -> cs_group , & cl -> group );
425
430
426
- cl -> cl_tcp_port = dlm_config .ci_tcp_port ;
427
- cl -> cl_buffer_size = dlm_config .ci_buffer_size ;
428
- cl -> cl_rsbtbl_size = dlm_config .ci_rsbtbl_size ;
429
- cl -> cl_recover_timer = dlm_config .ci_recover_timer ;
430
- cl -> cl_toss_secs = dlm_config .ci_toss_secs ;
431
- cl -> cl_scan_secs = dlm_config .ci_scan_secs ;
432
- cl -> cl_log_debug = dlm_config .ci_log_debug ;
433
- cl -> cl_log_info = dlm_config .ci_log_info ;
434
- cl -> cl_protocol = dlm_config .ci_protocol ;
435
- cl -> cl_new_rsb_count = dlm_config .ci_new_rsb_count ;
436
- cl -> cl_recover_callbacks = dlm_config .ci_recover_callbacks ;
437
- memcpy (cl -> cl_cluster_name , dlm_config .ci_cluster_name ,
438
- DLM_LOCKSPACE_LEN );
439
-
440
431
space_list = & sps -> ss_group ;
441
432
comm_list = & cms -> cs_group ;
442
433
return & cl -> group ;
@@ -517,6 +508,12 @@ static void release_space(struct config_item *i)
517
508
static struct config_item * make_comm (struct config_group * g , const char * name )
518
509
{
519
510
struct dlm_comm * cm ;
511
+ unsigned int nodeid ;
512
+ int rv ;
513
+
514
+ rv = kstrtouint (name , 0 , & nodeid );
515
+ if (rv )
516
+ return ERR_PTR (rv );
520
517
521
518
cm = kzalloc (sizeof (struct dlm_comm ), GFP_NOFS );
522
519
if (!cm )
@@ -528,7 +525,7 @@ static struct config_item *make_comm(struct config_group *g, const char *name)
528
525
if (!cm -> seq )
529
526
cm -> seq = dlm_comm_count ++ ;
530
527
531
- cm -> nodeid = -1 ;
528
+ cm -> nodeid = nodeid ;
532
529
cm -> local = 0 ;
533
530
cm -> addr_count = 0 ;
534
531
cm -> mark = 0 ;
@@ -555,16 +552,25 @@ static void release_comm(struct config_item *i)
555
552
static struct config_item * make_node (struct config_group * g , const char * name )
556
553
{
557
554
struct dlm_space * sp = config_item_to_space (g -> cg_item .ci_parent );
555
+ unsigned int nodeid ;
558
556
struct dlm_node * nd ;
557
+ uint32_t seq = 0 ;
558
+ int rv ;
559
+
560
+ rv = kstrtouint (name , 0 , & nodeid );
561
+ if (rv )
562
+ return ERR_PTR (rv );
559
563
560
564
nd = kzalloc (sizeof (struct dlm_node ), GFP_NOFS );
561
565
if (!nd )
562
566
return ERR_PTR (- ENOMEM );
563
567
564
568
config_item_init_type_name (& nd -> item , name , & node_type );
565
- nd -> nodeid = -1 ;
569
+ nd -> nodeid = nodeid ;
566
570
nd -> weight = 1 ; /* default weight of 1 if none is set */
567
571
nd -> new = 1 ; /* set to 0 once it's been read by dlm_nodeid_list() */
572
+ dlm_comm_seq (nodeid , & seq , true);
573
+ nd -> comm_seq = seq ;
568
574
569
575
mutex_lock (& sp -> members_lock );
570
576
list_add (& nd -> list , & sp -> members );
@@ -622,16 +628,19 @@ void dlm_config_exit(void)
622
628
623
629
static ssize_t comm_nodeid_show (struct config_item * item , char * buf )
624
630
{
625
- return sprintf (buf , "%d\n" , config_item_to_comm (item )-> nodeid );
631
+ unsigned int nodeid ;
632
+ int rv ;
633
+
634
+ rv = kstrtouint (config_item_name (item ), 0 , & nodeid );
635
+ if (WARN_ON (rv ))
636
+ return rv ;
637
+
638
+ return sprintf (buf , "%u\n" , nodeid );
626
639
}
627
640
628
641
static ssize_t comm_nodeid_store (struct config_item * item , const char * buf ,
629
642
size_t len )
630
643
{
631
- int rc = kstrtoint (buf , 0 , & config_item_to_comm (item )-> nodeid );
632
-
633
- if (rc )
634
- return rc ;
635
644
return len ;
636
645
}
637
646
@@ -772,20 +781,19 @@ static struct configfs_attribute *comm_attrs[] = {
772
781
773
782
static ssize_t node_nodeid_show (struct config_item * item , char * buf )
774
783
{
775
- return sprintf (buf , "%d\n" , config_item_to_node (item )-> nodeid );
784
+ unsigned int nodeid ;
785
+ int rv ;
786
+
787
+ rv = kstrtouint (config_item_name (item ), 0 , & nodeid );
788
+ if (WARN_ON (rv ))
789
+ return rv ;
790
+
791
+ return sprintf (buf , "%u\n" , nodeid );
776
792
}
777
793
778
794
static ssize_t node_nodeid_store (struct config_item * item , const char * buf ,
779
795
size_t len )
780
796
{
781
- struct dlm_node * nd = config_item_to_node (item );
782
- uint32_t seq = 0 ;
783
- int rc = kstrtoint (buf , 0 , & nd -> nodeid );
784
-
785
- if (rc )
786
- return rc ;
787
- dlm_comm_seq (nd -> nodeid , & seq );
788
- nd -> comm_seq = seq ;
789
797
return len ;
790
798
}
791
799
@@ -845,7 +853,7 @@ static struct dlm_comm *get_comm(int nodeid)
845
853
if (!comm_list )
846
854
return NULL ;
847
855
848
- mutex_lock ( & clusters_root .subsys .su_mutex );
856
+ WARN_ON_ONCE (! mutex_is_locked ( & clusters_root .subsys .su_mutex ) );
849
857
850
858
list_for_each_entry (i , & comm_list -> cg_children , ci_entry ) {
851
859
cm = config_item_to_comm (i );
@@ -856,7 +864,6 @@ static struct dlm_comm *get_comm(int nodeid)
856
864
config_item_get (i );
857
865
break ;
858
866
}
859
- mutex_unlock (& clusters_root .subsys .su_mutex );
860
867
861
868
if (!found )
862
869
cm = NULL ;
@@ -916,11 +923,20 @@ int dlm_config_nodes(char *lsname, struct dlm_config_node **nodes_out,
916
923
return rv ;
917
924
}
918
925
919
- int dlm_comm_seq (int nodeid , uint32_t * seq )
926
+ int dlm_comm_seq (int nodeid , uint32_t * seq , bool locked )
920
927
{
921
- struct dlm_comm * cm = get_comm (nodeid );
928
+ struct dlm_comm * cm ;
929
+
930
+ if (locked ) {
931
+ cm = get_comm (nodeid );
932
+ } else {
933
+ mutex_lock (& clusters_root .subsys .su_mutex );
934
+ cm = get_comm (nodeid );
935
+ mutex_unlock (& clusters_root .subsys .su_mutex );
936
+ }
922
937
if (!cm )
923
938
return - EEXIST ;
939
+
924
940
* seq = cm -> seq ;
925
941
put_comm (cm );
926
942
return 0 ;
@@ -957,7 +973,7 @@ int dlm_our_addr(struct sockaddr_storage *addr, int num)
957
973
#define DEFAULT_CLUSTER_NAME ""
958
974
959
975
struct dlm_config_info dlm_config = {
960
- .ci_tcp_port = DEFAULT_TCP_PORT ,
976
+ .ci_tcp_port = cpu_to_be16 ( DEFAULT_TCP_PORT ) ,
961
977
.ci_buffer_size = DLM_MAX_SOCKET_BUFSIZE ,
962
978
.ci_rsbtbl_size = DEFAULT_RSBTBL_SIZE ,
963
979
.ci_recover_timer = DEFAULT_RECOVER_TIMER ,
0 commit comments