1
2
3
4
5
6
7
8
9
10
11
12
13 #ifndef STACKGLUE_H
14 #define STACKGLUE_H
15
16 #include <linux/types.h>
17 #include <linux/list.h>
18 #include <linux/dlmconstants.h>
19
20 #include "dlm/dlmapi.h"
21 #include <linux/dlm.h>
22
23
24 struct file;
25 struct file_lock;
26
27
28
29
30
31
32 #define DLM_LKF_LOCAL 0x00100000
33
34
35
36
37
38 #define GROUP_NAME_MAX 64
39
40
41 #define CLUSTER_NAME_MAX 16
42
43
44
45
46
47
48 struct ocfs2_protocol_version {
49 u8 pv_major;
50 u8 pv_minor;
51 };
52
53
54
55
56
57
58 struct fsdlm_lksb_plus_lvb {
59 struct dlm_lksb lksb;
60 char lvb[DLM_LVB_LEN];
61 };
62
63
64
65
66
67
68 struct ocfs2_cluster_connection;
69 struct ocfs2_dlm_lksb {
70 union {
71 struct dlm_lockstatus lksb_o2dlm;
72 struct dlm_lksb lksb_fsdlm;
73 struct fsdlm_lksb_plus_lvb padding;
74 };
75 struct ocfs2_cluster_connection *lksb_conn;
76 };
77
78
79
80
81 struct ocfs2_locking_protocol {
82 struct ocfs2_protocol_version lp_max_version;
83 void (*lp_lock_ast)(struct ocfs2_dlm_lksb *lksb);
84 void (*lp_blocking_ast)(struct ocfs2_dlm_lksb *lksb, int level);
85 void (*lp_unlock_ast)(struct ocfs2_dlm_lksb *lksb, int error);
86 };
87
88
89
90
91
92
93
94 struct ocfs2_cluster_connection {
95 char cc_name[GROUP_NAME_MAX + 1];
96 int cc_namelen;
97 char cc_cluster_name[CLUSTER_NAME_MAX + 1];
98 int cc_cluster_name_len;
99 struct ocfs2_protocol_version cc_version;
100 struct ocfs2_locking_protocol *cc_proto;
101 void (*cc_recovery_handler)(int node_num, void *recovery_data);
102 void *cc_recovery_data;
103 void *cc_lockspace;
104 void *cc_private;
105 };
106
107
108
109
110
111
112 struct ocfs2_stack_operations {
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130 int (*connect)(struct ocfs2_cluster_connection *conn);
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146 int (*disconnect)(struct ocfs2_cluster_connection *conn);
147
148
149
150
151
152 int (*this_node)(struct ocfs2_cluster_connection *conn,
153 unsigned int *node);
154
155
156
157
158
159
160
161
162
163
164
165 int (*dlm_lock)(struct ocfs2_cluster_connection *conn,
166 int mode,
167 struct ocfs2_dlm_lksb *lksb,
168 u32 flags,
169 void *name,
170 unsigned int namelen);
171
172
173
174
175
176
177
178
179
180
181 int (*dlm_unlock)(struct ocfs2_cluster_connection *conn,
182 struct ocfs2_dlm_lksb *lksb,
183 u32 flags);
184
185
186
187
188
189
190
191 int (*lock_status)(struct ocfs2_dlm_lksb *lksb);
192
193
194
195
196 int (*lvb_valid)(struct ocfs2_dlm_lksb *lksb);
197
198
199
200
201 void *(*lock_lvb)(struct ocfs2_dlm_lksb *lksb);
202
203
204
205
206
207
208 int (*plock)(struct ocfs2_cluster_connection *conn,
209 u64 ino,
210 struct file *file,
211 int cmd,
212 struct file_lock *fl);
213
214
215
216
217
218 void (*dump_lksb)(struct ocfs2_dlm_lksb *lksb);
219 };
220
221
222
223
224
225
226 struct ocfs2_stack_plugin {
227 char *sp_name;
228 struct ocfs2_stack_operations *sp_ops;
229 struct module *sp_owner;
230
231
232 struct list_head sp_list;
233 unsigned int sp_count;
234 struct ocfs2_protocol_version sp_max_proto;
235 };
236
237
238
239 int ocfs2_cluster_connect(const char *stack_name,
240 const char *cluster_name,
241 int cluster_name_len,
242 const char *group,
243 int grouplen,
244 struct ocfs2_locking_protocol *lproto,
245 void (*recovery_handler)(int node_num,
246 void *recovery_data),
247 void *recovery_data,
248 struct ocfs2_cluster_connection **conn);
249
250
251
252
253 int ocfs2_cluster_connect_agnostic(const char *group,
254 int grouplen,
255 struct ocfs2_locking_protocol *lproto,
256 void (*recovery_handler)(int node_num,
257 void *recovery_data),
258 void *recovery_data,
259 struct ocfs2_cluster_connection **conn);
260 int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn,
261 int hangup_pending);
262 void ocfs2_cluster_hangup(const char *group, int grouplen);
263 int ocfs2_cluster_this_node(struct ocfs2_cluster_connection *conn,
264 unsigned int *node);
265
266 struct ocfs2_lock_res;
267 int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn,
268 int mode,
269 struct ocfs2_dlm_lksb *lksb,
270 u32 flags,
271 void *name,
272 unsigned int namelen);
273 int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn,
274 struct ocfs2_dlm_lksb *lksb,
275 u32 flags);
276
277 int ocfs2_dlm_lock_status(struct ocfs2_dlm_lksb *lksb);
278 int ocfs2_dlm_lvb_valid(struct ocfs2_dlm_lksb *lksb);
279 void *ocfs2_dlm_lvb(struct ocfs2_dlm_lksb *lksb);
280 void ocfs2_dlm_dump_lksb(struct ocfs2_dlm_lksb *lksb);
281
282 int ocfs2_stack_supports_plocks(void);
283 int ocfs2_plock(struct ocfs2_cluster_connection *conn, u64 ino,
284 struct file *file, int cmd, struct file_lock *fl);
285
286 void ocfs2_stack_glue_set_max_proto_version(struct ocfs2_protocol_version *max_proto);
287
288
289
290 int ocfs2_stack_glue_register(struct ocfs2_stack_plugin *plugin);
291 void ocfs2_stack_glue_unregister(struct ocfs2_stack_plugin *plugin);
292
293 extern struct kset *ocfs2_kset;
294
295 #endif