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
24struct file;
25struct 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
48struct ocfs2_protocol_version {
49 u8 pv_major;
50 u8 pv_minor;
51};
52
53
54
55
56
57
58struct fsdlm_lksb_plus_lvb {
59 struct dlm_lksb lksb;
60 char lvb[DLM_LVB_LEN];
61};
62
63
64
65
66
67
68struct ocfs2_cluster_connection;
69struct 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
81struct 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
94struct 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
112struct 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
226struct 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
239int 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
253int 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);
260int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn,
261 int hangup_pending);
262void ocfs2_cluster_hangup(const char *group, int grouplen);
263int ocfs2_cluster_this_node(struct ocfs2_cluster_connection *conn,
264 unsigned int *node);
265
266struct ocfs2_lock_res;
267int 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);
273int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn,
274 struct ocfs2_dlm_lksb *lksb,
275 u32 flags);
276
277int ocfs2_dlm_lock_status(struct ocfs2_dlm_lksb *lksb);
278int ocfs2_dlm_lvb_valid(struct ocfs2_dlm_lksb *lksb);
279void *ocfs2_dlm_lvb(struct ocfs2_dlm_lksb *lksb);
280void ocfs2_dlm_dump_lksb(struct ocfs2_dlm_lksb *lksb);
281
282int ocfs2_stack_supports_plocks(void);
283int ocfs2_plock(struct ocfs2_cluster_connection *conn, u64 ino,
284 struct file *file, int cmd, struct file_lock *fl);
285
286void ocfs2_stack_glue_set_max_proto_version(struct ocfs2_protocol_version *max_proto);
287
288
289
290int ocfs2_stack_glue_register(struct ocfs2_stack_plugin *plugin);
291void ocfs2_stack_glue_unregister(struct ocfs2_stack_plugin *plugin);
292
293extern struct kset *ocfs2_kset;
294
295#endif
296