Blame view

fs/ocfs2/stackglue.h 8.85 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
e3dad42bf   Joel Becker   ocfs2: Create ocf...
43
44
45
46
  /*
   * 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 ...
47
48
49
50
  struct ocfs2_protocol_version {
  	u8 pv_major;
  	u8 pv_minor;
  };
e3dad42bf   Joel Becker   ocfs2: Create ocf...
51
  /*
cf4d8d75d   David Teigland   ocfs2: add fsdlm ...
52
53
54
55
56
57
58
59
   * 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...
60
61
62
63
64
  /*
   * 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...
65
66
67
68
69
70
71
72
  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...
73
  };
e3dad42bf   Joel Becker   ocfs2: Create ocf...
74
  /*
a796d2862   Joel Becker   ocfs2: Pass lksbs...
75
76
77
78
   * 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...
79
80
81
  	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...
82
83
84
85
  };
  
  
  /*
e3dad42bf   Joel Becker   ocfs2: Create ocf...
86
87
88
89
   * 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 ...
90
91
92
93
  struct ocfs2_cluster_connection {
  	char cc_name[GROUP_NAME_MAX];
  	int cc_namelen;
  	struct ocfs2_protocol_version cc_version;
110946c8f   Joel Becker   ocfs2: Hang the l...
94
  	struct ocfs2_locking_protocol *cc_proto;
4670c46de   Joel Becker   ocfs2: Introduce ...
95
96
97
98
99
  	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...
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  /*
   * 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...
119
  	 *  - Node down notifications for the filesystem will be received
e3dad42bf   Joel Becker   ocfs2: Create ocf...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  	 *    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 ...
135
  	 *
2c39450b3   Joel Becker   ocfs2: Remove ->h...
136
137
  	 * Once this call returns, the stack glue will be dropping this
  	 * connection's reference on the module.
e3dad42bf   Joel Becker   ocfs2: Create ocf...
138
  	 */
2c39450b3   Joel Becker   ocfs2: Remove ->h...
139
  	int (*disconnect)(struct ocfs2_cluster_connection *conn);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
140
141
142
143
144
145
146
147
148
149
150
151
152
  
  	/*
  	 * ->this_node() returns the cluster's unique identifier for the
  	 * local node.
  	 */
  	int (*this_node)(unsigned int *node);
  
  	/*
  	 * 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...
153
154
155
  	 * 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...
156
157
158
  	 */
  	int (*dlm_lock)(struct ocfs2_cluster_connection *conn,
  			int mode,
c0e413385   Joel Becker   ocfs2: Attach the...
159
  			struct ocfs2_dlm_lksb *lksb,
e3dad42bf   Joel Becker   ocfs2: Create ocf...
160
161
  			u32 flags,
  			void *name,
a796d2862   Joel Becker   ocfs2: Pass lksbs...
162
  			unsigned int namelen);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
163
164
165
166
167
168
  
  	/*
  	 * 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...
169
170
171
  	 * 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...
172
173
  	 */
  	int (*dlm_unlock)(struct ocfs2_cluster_connection *conn,
c0e413385   Joel Becker   ocfs2: Attach the...
174
  			  struct ocfs2_dlm_lksb *lksb,
a796d2862   Joel Becker   ocfs2: Pass lksbs...
175
  			  u32 flags);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
176
177
178
179
180
181
182
  
  	/*
  	 * 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...
183
  	int (*lock_status)(struct ocfs2_dlm_lksb *lksb);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
184
185
  
  	/*
1c520dfbf   Joel Becker   ocfs2: Provide th...
186
187
  	 * Return non-zero if the LVB is valid.
  	 */
c0e413385   Joel Becker   ocfs2: Attach the...
188
  	int (*lvb_valid)(struct ocfs2_dlm_lksb *lksb);
1c520dfbf   Joel Becker   ocfs2: Provide th...
189
190
  
  	/*
e3dad42bf   Joel Becker   ocfs2: Create ocf...
191
192
  	 * Pull the lvb pointer off of the stack-specific lksb.
  	 */
c0e413385   Joel Becker   ocfs2: Attach the...
193
  	void *(*lock_lvb)(struct ocfs2_dlm_lksb *lksb);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
194
195
  
  	/*
53da4939f   Mark Fasheh   ocfs2: POSIX file...
196
197
198
199
200
201
202
203
204
205
206
  	 * 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...
207
208
209
  	 * This is an optoinal debugging hook.  If provided, the
  	 * stack can dump debugging information about this lock.
  	 */
c0e413385   Joel Becker   ocfs2: Attach the...
210
  	void (*dump_lksb)(struct ocfs2_dlm_lksb *lksb);
e3dad42bf   Joel Becker   ocfs2: Create ocf...
211
  };
286eaa95c   Joel Becker   ocfs2: Break out ...
212
213
214
215
216
217
218
219
220
221
222
223
224
  /*
   * 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...
225
  	struct ocfs2_protocol_version sp_max_proto;
286eaa95c   Joel Becker   ocfs2: Break out ...
226
227
228
229
  };
  
  
  /* Used by the filesystem */
9c6c877c0   Joel Becker   ocfs2: Add the 'c...
230
231
  int ocfs2_cluster_connect(const char *stack_name,
  			  const char *group,
4670c46de   Joel Becker   ocfs2: Introduce ...
232
  			  int grouplen,
553b5eb91   Joel Becker   ocfs2: Pass the l...
233
  			  struct ocfs2_locking_protocol *lproto,
4670c46de   Joel Becker   ocfs2: Introduce ...
234
235
236
237
  			  void (*recovery_handler)(int node_num,
  						   void *recovery_data),
  			  void *recovery_data,
  			  struct ocfs2_cluster_connection **conn);
cbe0e331f   Joel Becker   ocfs2_dlmfs: Enab...
238
239
240
241
242
243
244
245
246
247
248
  /*
   * 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 ...
249
250
  int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn,
  			     int hangup_pending);
6953b4c00   Joel Becker   ocfs2: Move o2hb ...
251
  void ocfs2_cluster_hangup(const char *group, int grouplen);
19fdb624d   Joel Becker   ocfs2: Abstract o...
252
  int ocfs2_cluster_this_node(unsigned int *node);
4670c46de   Joel Becker   ocfs2: Introduce ...
253

cf4d8d75d   David Teigland   ocfs2: add fsdlm ...
254
  struct ocfs2_lock_res;
4670c46de   Joel Becker   ocfs2: Introduce ...
255
  int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn,
24ef1815e   Joel Becker   ocfs2: Separate o...
256
  		   int mode,
c0e413385   Joel Becker   ocfs2: Attach the...
257
  		   struct ocfs2_dlm_lksb *lksb,
24ef1815e   Joel Becker   ocfs2: Separate o...
258
259
  		   u32 flags,
  		   void *name,
a796d2862   Joel Becker   ocfs2: Pass lksbs...
260
  		   unsigned int namelen);
4670c46de   Joel Becker   ocfs2: Introduce ...
261
  int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn,
c0e413385   Joel Becker   ocfs2: Attach the...
262
  		     struct ocfs2_dlm_lksb *lksb,
a796d2862   Joel Becker   ocfs2: Pass lksbs...
263
  		     u32 flags);
24ef1815e   Joel Becker   ocfs2: Separate o...
264

c0e413385   Joel Becker   ocfs2: Attach the...
265
266
267
268
  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...
269

53da4939f   Mark Fasheh   ocfs2: POSIX file...
270
271
272
  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...
273
  void ocfs2_stack_glue_set_max_proto_version(struct ocfs2_protocol_version *max_proto);
24ef1815e   Joel Becker   ocfs2: Separate o...
274

286eaa95c   Joel Becker   ocfs2: Break out ...
275
276
277
278
  
  /* 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...
279

24ef1815e   Joel Becker   ocfs2: Separate o...
280
  #endif  /* STACKGLUE_H */