Blame view

fs/ocfs2/stackglue.h 9.28 KB
24ef1815e   Joel Becker   ocfs2: Separate o...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  /* -*- mode: c; c-basic-offset: 8; -*-
   * vim: noexpandtab sw=8 ts=8 sts=0:
   *
   * stackglue.h
   *
   * Glue to the underlying cluster stack.
   *
   * Copyright (C) 2007 Oracle.  All rights reserved.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public
   * License as published by the Free Software Foundation, version 2.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * General Public License for more details.
   */
  
  
  #ifndef STACKGLUE_H
  #define STACKGLUE_H
bd3e76105   Joel Becker   ocfs2: Use global...
23
24
25
  #include <linux/types.h>
  #include <linux/list.h>
  #include <linux/dlmconstants.h>
e3dad42bf   Joel Becker   ocfs2: Create ocf...
26
  #include "dlm/dlmapi.h"
cf4d8d75d   David Teigland   ocfs2: add fsdlm ...
27
  #include <linux/dlm.h>
e3dad42bf   Joel Becker   ocfs2: Create ocf...
28

53da4939f   Mark Fasheh   ocfs2: POSIX file...
29
30
31
  /* Needed for plock-related prototypes */
  struct file;
  struct file_lock;
bd3e76105   Joel Becker   ocfs2: Use global...
32
33
34
35
36
37
  /*
   * dlmconstants.h does not have a LOCAL flag.  We hope to remove it
   * some day, but right now we need it.  Let's fake it.  This value is larger
   * than any flag in dlmconstants.h.
   */
  #define DLM_LKF_LOCAL		0x00100000
4670c46de   Joel Becker   ocfs2: Introduce ...
38
39
40
41
42
  /*
   * This shadows DLM_LOCKSPACE_LEN in fs/dlm/dlm_internal.h.  That probably
   * wants to be in a public header.
   */
  #define GROUP_NAME_MAX		64
c74a3bdd9   Goldwyn Rodrigues   ocfs2: add cluste...
43
44
  /* This shadows  OCFS2_CLUSTER_NAME_LEN */
  #define CLUSTER_NAME_MAX	16
4670c46de   Joel Becker   ocfs2: Introduce ...
45

e3dad42bf   Joel Becker   ocfs2: Create ocf...
46
47
48
49
  /*
   * ocfs2_protocol_version changes when ocfs2 does something different in
   * its inter-node behavior.  See dlmglue.c for more information.
   */
4670c46de   Joel Becker   ocfs2: Introduce ...
50
51
52
53
  struct ocfs2_protocol_version {
  	u8 pv_major;
  	u8 pv_minor;
  };
e3dad42bf   Joel Becker   ocfs2: Create ocf...
54
  /*
cf4d8d75d   David Teigland   ocfs2: add fsdlm ...
55
56
57
58
59
60
61
62
   * The dlm_lockstatus struct includes lvb space, but the dlm_lksb struct only
   * has a pointer to separately allocated lvb space.  This struct exists only to
   * include in the lksb union to make space for a combined dlm_lksb and lvb.
   */
  struct fsdlm_lksb_plus_lvb {
  	struct dlm_lksb lksb;
  	char lvb[DLM_LVB_LEN];
  };
e3dad42bf   Joel Becker   ocfs2: Create ocf...
63
64
65
66
67
  /*
   * A union of all lock status structures.  We define it here so that the
   * size of the union is known.  Lock status structures are embedded in
   * ocfs2 inodes.
   */
c0e413385   Joel Becker   ocfs2: Attach the...
68
69
70
71
72
73
74
75
  struct ocfs2_cluster_connection;
  struct ocfs2_dlm_lksb {
  	 union {
  		 struct dlm_lockstatus lksb_o2dlm;
  		 struct dlm_lksb lksb_fsdlm;
  		 struct fsdlm_lksb_plus_lvb padding;
  	 };
  	 struct ocfs2_cluster_connection *lksb_conn;
8f2c9c1b1   Joel Becker   ocfs2: Create the...
76
  };
e3dad42bf   Joel Becker   ocfs2: Create ocf...
77
  /*
a796d2862   Joel Becker   ocfs2: Pass lksbs...
78
79
80
81
   * The ocfs2_locking_protocol defines the handlers called on ocfs2's behalf.
   */
  struct ocfs2_locking_protocol {
  	struct ocfs2_protocol_version lp_max_version;
c0e413385   Joel Becker   ocfs2: Attach the...
82
83
84
  	void (*lp_lock_ast)(struct ocfs2_dlm_lksb *lksb);
  	void (*lp_blocking_ast)(struct ocfs2_dlm_lksb *lksb, int level);
  	void (*lp_unlock_ast)(struct ocfs2_dlm_lksb *lksb, int error);
a796d2862   Joel Becker   ocfs2: Pass lksbs...
85
86
87
88
  };
  
  
  /*
e3dad42bf   Joel Becker   ocfs2: Create ocf...
89
90
91
92
   * A cluster connection.  Mostly opaque to ocfs2, the connection holds
   * state for the underlying stack.  ocfs2 does use cc_version to determine
   * locking compatibility.
   */
4670c46de   Joel Becker   ocfs2: Introduce ...
93
  struct ocfs2_cluster_connection {
c74a3bdd9   Goldwyn Rodrigues   ocfs2: add cluste...
94
  	char cc_name[GROUP_NAME_MAX + 1];
4670c46de   Joel Becker   ocfs2: Introduce ...
95
  	int cc_namelen;
c74a3bdd9   Goldwyn Rodrigues   ocfs2: add cluste...
96
97
  	char cc_cluster_name[CLUSTER_NAME_MAX + 1];
  	int cc_cluster_name_len;
4670c46de   Joel Becker   ocfs2: Introduce ...
98
  	struct ocfs2_protocol_version cc_version;
110946c8f   Joel Becker   ocfs2: Hang the l...
99
  	struct ocfs2_locking_protocol *cc_proto;
4670c46de   Joel Becker   ocfs2: Introduce ...
100
101
102
103
104
  	void (*cc_recovery_handler)(int node_num, void *recovery_data);
  	void *cc_recovery_data;
  	void *cc_lockspace;
  	void *cc_private;
  };
e3dad42bf   Joel Becker   ocfs2: Create ocf...
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  /*
   * Each cluster stack implements the stack operations structure.  Not used
   * in the ocfs2 code, the stackglue code translates generic cluster calls
   * into stack operations.
   */
  struct ocfs2_stack_operations {
  	/*
  	 * The fs code calls ocfs2_cluster_connect() to attach a new
  	 * filesystem to the cluster stack.  The ->connect() op is passed
  	 * an ocfs2_cluster_connection with the name and recovery field
  	 * filled in.
  	 *
  	 * The stack must set up any notification mechanisms and create
  	 * the filesystem lockspace in the DLM.  The lockspace should be
  	 * stored on cc_lockspace.  Any other information can be stored on
  	 * cc_private.
  	 *
  	 * ->connect() must not return until it is guaranteed that
  	 *
25985edce   Lucas De Marchi   Fix common misspe...
124
  	 *  - Node down notifications for the filesystem will be received
e3dad42bf   Joel Becker   ocfs2: Create ocf...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  	 *    and passed to conn->cc_recovery_handler().
  	 *  - Locking requests for the filesystem will be processed.
  	 */
  	int (*connect)(struct ocfs2_cluster_connection *conn);
  
  	/*
  	 * The fs code calls ocfs2_cluster_disconnect() when a filesystem
  	 * no longer needs cluster services.  All DLM locks have been
  	 * dropped, and recovery notification is being ignored by the
  	 * fs code.  The stack must disengage from the DLM and discontinue
  	 * recovery notification.
  	 *
  	 * Once ->disconnect() has returned, the connection structure will
  	 * be freed.  Thus, a stack must not return from ->disconnect()
  	 * until it will no longer reference the conn pointer.
286eaa95c   Joel Becker   ocfs2: Break out ...
140
  	 *
2c39450b3   Joel Becker   ocfs2: Remove ->h...
141
142
  	 * Once this call returns, the stack glue will be dropping this
  	 * connection's reference on the module.
e3dad42bf   Joel Becker   ocfs2: Create ocf...
143
  	 */
2c39450b3   Joel Becker   ocfs2: Remove ->h...
144
  	int (*disconnect)(struct ocfs2_cluster_connection *conn);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
145
146
147
148
149
  
  	/*
  	 * ->this_node() returns the cluster's unique identifier for the
  	 * local node.
  	 */
3e8341516   Goldwyn Rodrigues   ocfs2: pass ocfs2...
150
151
  	int (*this_node)(struct ocfs2_cluster_connection *conn,
  			 unsigned int *node);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
152
153
154
155
156
157
158
  
  	/*
  	 * Call the underlying dlm lock function.  The ->dlm_lock()
  	 * callback should convert the flags and mode as appropriate.
  	 *
  	 * ast and bast functions are not part of the call because the
  	 * stack will likely want to wrap ast and bast calls before passing
a796d2862   Joel Becker   ocfs2: Pass lksbs...
159
160
161
  	 * them to stack->sp_proto.  There is no astarg.  The lksb will
  	 * be passed back to the ast and bast functions.  The caller can
  	 * use this to find their object.
e3dad42bf   Joel Becker   ocfs2: Create ocf...
162
163
164
  	 */
  	int (*dlm_lock)(struct ocfs2_cluster_connection *conn,
  			int mode,
c0e413385   Joel Becker   ocfs2: Attach the...
165
  			struct ocfs2_dlm_lksb *lksb,
e3dad42bf   Joel Becker   ocfs2: Create ocf...
166
167
  			u32 flags,
  			void *name,
a796d2862   Joel Becker   ocfs2: Pass lksbs...
168
  			unsigned int namelen);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
169
170
171
172
173
174
  
  	/*
  	 * Call the underlying dlm unlock function.  The ->dlm_unlock()
  	 * function should convert the flags as appropriate.
  	 *
  	 * The unlock ast is not passed, as the stack will want to wrap
a796d2862   Joel Becker   ocfs2: Pass lksbs...
175
176
177
  	 * it before calling stack->sp_proto->lp_unlock_ast().  There is
  	 * no astarg.  The lksb will be passed back to the unlock ast
  	 * function.  The caller can use this to find their object.
e3dad42bf   Joel Becker   ocfs2: Create ocf...
178
179
  	 */
  	int (*dlm_unlock)(struct ocfs2_cluster_connection *conn,
c0e413385   Joel Becker   ocfs2: Attach the...
180
  			  struct ocfs2_dlm_lksb *lksb,
a796d2862   Joel Becker   ocfs2: Pass lksbs...
181
  			  u32 flags);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
182
183
184
185
186
187
188
  
  	/*
  	 * Return the status of the current lock status block.  The fs
  	 * code should never dereference the union.  The ->lock_status()
  	 * callback pulls out the stack-specific lksb, converts the status
  	 * to a proper errno, and returns it.
  	 */
c0e413385   Joel Becker   ocfs2: Attach the...
189
  	int (*lock_status)(struct ocfs2_dlm_lksb *lksb);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
190
191
  
  	/*
1c520dfbf   Joel Becker   ocfs2: Provide th...
192
193
  	 * Return non-zero if the LVB is valid.
  	 */
c0e413385   Joel Becker   ocfs2: Attach the...
194
  	int (*lvb_valid)(struct ocfs2_dlm_lksb *lksb);
1c520dfbf   Joel Becker   ocfs2: Provide th...
195
196
  
  	/*
e3dad42bf   Joel Becker   ocfs2: Create ocf...
197
198
  	 * Pull the lvb pointer off of the stack-specific lksb.
  	 */
c0e413385   Joel Becker   ocfs2: Attach the...
199
  	void *(*lock_lvb)(struct ocfs2_dlm_lksb *lksb);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
200
201
  
  	/*
53da4939f   Mark Fasheh   ocfs2: POSIX file...
202
203
204
205
206
207
208
209
210
211
212
  	 * Cluster-aware posix locks
  	 *
  	 * This is NULL for stacks which do not support posix locks.
  	 */
  	int (*plock)(struct ocfs2_cluster_connection *conn,
  		     u64 ino,
  		     struct file *file,
  		     int cmd,
  		     struct file_lock *fl);
  
  	/*
e3dad42bf   Joel Becker   ocfs2: Create ocf...
213
214
215
  	 * This is an optoinal debugging hook.  If provided, the
  	 * stack can dump debugging information about this lock.
  	 */
c0e413385   Joel Becker   ocfs2: Attach the...
216
  	void (*dump_lksb)(struct ocfs2_dlm_lksb *lksb);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
217
  };
286eaa95c   Joel Becker   ocfs2: Break out ...
218
219
220
221
222
223
224
225
226
227
228
229
230
  /*
   * Each stack plugin must describe itself by registering a
   * ocfs2_stack_plugin structure.  This is only seen by stackglue and the
   * stack driver.
   */
  struct ocfs2_stack_plugin {
  	char *sp_name;
  	struct ocfs2_stack_operations *sp_ops;
  	struct module *sp_owner;
  
  	/* These are managed by the stackglue code. */
  	struct list_head sp_list;
  	unsigned int sp_count;
e603cfb07   Joel Becker   ocfs2: Remove the...
231
  	struct ocfs2_protocol_version sp_max_proto;
286eaa95c   Joel Becker   ocfs2: Break out ...
232
233
234
235
  };
  
  
  /* Used by the filesystem */
9c6c877c0   Joel Becker   ocfs2: Add the 'c...
236
  int ocfs2_cluster_connect(const char *stack_name,
c74a3bdd9   Goldwyn Rodrigues   ocfs2: add cluste...
237
238
  			  const char *cluster_name,
  			  int cluster_name_len,
9c6c877c0   Joel Becker   ocfs2: Add the 'c...
239
  			  const char *group,
4670c46de   Joel Becker   ocfs2: Introduce ...
240
  			  int grouplen,
553b5eb91   Joel Becker   ocfs2: Pass the l...
241
  			  struct ocfs2_locking_protocol *lproto,
4670c46de   Joel Becker   ocfs2: Introduce ...
242
243
244
245
  			  void (*recovery_handler)(int node_num,
  						   void *recovery_data),
  			  void *recovery_data,
  			  struct ocfs2_cluster_connection **conn);
cbe0e331f   Joel Becker   ocfs2_dlmfs: Enab...
246
247
248
249
250
251
252
253
254
255
256
  /*
   * Used by callers that don't store their stack name.  They must ensure
   * all nodes have the same stack.
   */
  int ocfs2_cluster_connect_agnostic(const char *group,
  				   int grouplen,
  				   struct ocfs2_locking_protocol *lproto,
  				   void (*recovery_handler)(int node_num,
  							    void *recovery_data),
  				   void *recovery_data,
  				   struct ocfs2_cluster_connection **conn);
286eaa95c   Joel Becker   ocfs2: Break out ...
257
258
  int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn,
  			     int hangup_pending);
6953b4c00   Joel Becker   ocfs2: Move o2hb ...
259
  void ocfs2_cluster_hangup(const char *group, int grouplen);
3e8341516   Goldwyn Rodrigues   ocfs2: pass ocfs2...
260
261
  int ocfs2_cluster_this_node(struct ocfs2_cluster_connection *conn,
  			    unsigned int *node);
4670c46de   Joel Becker   ocfs2: Introduce ...
262

cf4d8d75d   David Teigland   ocfs2: add fsdlm ...
263
  struct ocfs2_lock_res;
4670c46de   Joel Becker   ocfs2: Introduce ...
264
  int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn,
24ef1815e   Joel Becker   ocfs2: Separate o...
265
  		   int mode,
c0e413385   Joel Becker   ocfs2: Attach the...
266
  		   struct ocfs2_dlm_lksb *lksb,
24ef1815e   Joel Becker   ocfs2: Separate o...
267
268
  		   u32 flags,
  		   void *name,
a796d2862   Joel Becker   ocfs2: Pass lksbs...
269
  		   unsigned int namelen);
4670c46de   Joel Becker   ocfs2: Introduce ...
270
  int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn,
c0e413385   Joel Becker   ocfs2: Attach the...
271
  		     struct ocfs2_dlm_lksb *lksb,
a796d2862   Joel Becker   ocfs2: Pass lksbs...
272
  		     u32 flags);
24ef1815e   Joel Becker   ocfs2: Separate o...
273

c0e413385   Joel Becker   ocfs2: Attach the...
274
275
276
277
  int ocfs2_dlm_lock_status(struct ocfs2_dlm_lksb *lksb);
  int ocfs2_dlm_lvb_valid(struct ocfs2_dlm_lksb *lksb);
  void *ocfs2_dlm_lvb(struct ocfs2_dlm_lksb *lksb);
  void ocfs2_dlm_dump_lksb(struct ocfs2_dlm_lksb *lksb);
8f2c9c1b1   Joel Becker   ocfs2: Create the...
278

53da4939f   Mark Fasheh   ocfs2: POSIX file...
279
280
281
  int ocfs2_stack_supports_plocks(void);
  int ocfs2_plock(struct ocfs2_cluster_connection *conn, u64 ino,
  		struct file *file, int cmd, struct file_lock *fl);
553b5eb91   Joel Becker   ocfs2: Pass the l...
282
  void ocfs2_stack_glue_set_max_proto_version(struct ocfs2_protocol_version *max_proto);
24ef1815e   Joel Becker   ocfs2: Separate o...
283

286eaa95c   Joel Becker   ocfs2: Break out ...
284
285
286
287
  
  /* Used by stack plugins */
  int ocfs2_stack_glue_register(struct ocfs2_stack_plugin *plugin);
  void ocfs2_stack_glue_unregister(struct ocfs2_stack_plugin *plugin);
3878f110f   Joel Becker   ocfs2: Move the h...
288

e7ee2c089   Eric Ren   ocfs2: fix crash ...
289
290
  /* In ocfs2_downconvert_lock(), we need to know which stack we are using */
  int ocfs2_is_o2cb_active(void);
9dde5e4f3   Gang He   ocfs2: export ocf...
291
  extern struct kset *ocfs2_kset;
24ef1815e   Joel Becker   ocfs2: Separate o...
292
  #endif  /* STACKGLUE_H */