diff options
Diffstat (limited to 'fs/ocfs2/stackglue.h')
| -rw-r--r-- | fs/ocfs2/stackglue.h | 95 | 
1 files changed, 56 insertions, 39 deletions
| diff --git a/fs/ocfs2/stackglue.h b/fs/ocfs2/stackglue.h index 03a44d60eac9..8ce7398ae1d2 100644 --- a/fs/ocfs2/stackglue.h +++ b/fs/ocfs2/stackglue.h | |||
| @@ -56,17 +56,6 @@ struct ocfs2_protocol_version { | |||
| 56 | }; | 56 | }; | 
| 57 | 57 | ||
| 58 | /* | 58 | /* | 
| 59 | * The ocfs2_locking_protocol defines the handlers called on ocfs2's behalf. | ||
| 60 | */ | ||
| 61 | struct ocfs2_locking_protocol { | ||
| 62 | struct ocfs2_protocol_version lp_max_version; | ||
| 63 | void (*lp_lock_ast)(void *astarg); | ||
| 64 | void (*lp_blocking_ast)(void *astarg, int level); | ||
| 65 | void (*lp_unlock_ast)(void *astarg, int error); | ||
| 66 | }; | ||
| 67 | |||
| 68 | |||
| 69 | /* | ||
| 70 | * The dlm_lockstatus struct includes lvb space, but the dlm_lksb struct only | 59 | * The dlm_lockstatus struct includes lvb space, but the dlm_lksb struct only | 
| 71 | * has a pointer to separately allocated lvb space. This struct exists only to | 60 | * has a pointer to separately allocated lvb space. This struct exists only to | 
| 72 | * include in the lksb union to make space for a combined dlm_lksb and lvb. | 61 | * include in the lksb union to make space for a combined dlm_lksb and lvb. | 
| @@ -81,12 +70,27 @@ struct fsdlm_lksb_plus_lvb { | |||
| 81 | * size of the union is known. Lock status structures are embedded in | 70 | * size of the union is known. Lock status structures are embedded in | 
| 82 | * ocfs2 inodes. | 71 | * ocfs2 inodes. | 
| 83 | */ | 72 | */ | 
| 84 | union ocfs2_dlm_lksb { | 73 | struct ocfs2_cluster_connection; | 
| 85 | struct dlm_lockstatus lksb_o2dlm; | 74 | struct ocfs2_dlm_lksb { | 
| 86 | struct dlm_lksb lksb_fsdlm; | 75 | union { | 
| 87 | struct fsdlm_lksb_plus_lvb padding; | 76 | struct dlm_lockstatus lksb_o2dlm; | 
| 77 | struct dlm_lksb lksb_fsdlm; | ||
| 78 | struct fsdlm_lksb_plus_lvb padding; | ||
| 79 | }; | ||
| 80 | struct ocfs2_cluster_connection *lksb_conn; | ||
| 81 | }; | ||
| 82 | |||
| 83 | /* | ||
| 84 | * The ocfs2_locking_protocol defines the handlers called on ocfs2's behalf. | ||
| 85 | */ | ||
| 86 | struct ocfs2_locking_protocol { | ||
| 87 | struct ocfs2_protocol_version lp_max_version; | ||
| 88 | void (*lp_lock_ast)(struct ocfs2_dlm_lksb *lksb); | ||
| 89 | void (*lp_blocking_ast)(struct ocfs2_dlm_lksb *lksb, int level); | ||
| 90 | void (*lp_unlock_ast)(struct ocfs2_dlm_lksb *lksb, int error); | ||
| 88 | }; | 91 | }; | 
| 89 | 92 | ||
| 93 | |||
| 90 | /* | 94 | /* | 
| 91 | * A cluster connection. Mostly opaque to ocfs2, the connection holds | 95 | * A cluster connection. Mostly opaque to ocfs2, the connection holds | 
| 92 | * state for the underlying stack. ocfs2 does use cc_version to determine | 96 | * state for the underlying stack. ocfs2 does use cc_version to determine | 
| @@ -96,6 +100,7 @@ struct ocfs2_cluster_connection { | |||
| 96 | char cc_name[GROUP_NAME_MAX]; | 100 | char cc_name[GROUP_NAME_MAX]; | 
| 97 | int cc_namelen; | 101 | int cc_namelen; | 
| 98 | struct ocfs2_protocol_version cc_version; | 102 | struct ocfs2_protocol_version cc_version; | 
| 103 | struct ocfs2_locking_protocol *cc_proto; | ||
| 99 | void (*cc_recovery_handler)(int node_num, void *recovery_data); | 104 | void (*cc_recovery_handler)(int node_num, void *recovery_data); | 
| 100 | void *cc_recovery_data; | 105 | void *cc_recovery_data; | 
| 101 | void *cc_lockspace; | 106 | void *cc_lockspace; | 
| @@ -155,27 +160,29 @@ struct ocfs2_stack_operations { | |||
| 155 | * | 160 | * | 
| 156 | * ast and bast functions are not part of the call because the | 161 | * ast and bast functions are not part of the call because the | 
| 157 | * stack will likely want to wrap ast and bast calls before passing | 162 | * stack will likely want to wrap ast and bast calls before passing | 
| 158 | * them to stack->sp_proto. | 163 | * them to stack->sp_proto. There is no astarg. The lksb will | 
| 164 | * be passed back to the ast and bast functions. The caller can | ||
| 165 | * use this to find their object. | ||
| 159 | */ | 166 | */ | 
| 160 | int (*dlm_lock)(struct ocfs2_cluster_connection *conn, | 167 | int (*dlm_lock)(struct ocfs2_cluster_connection *conn, | 
| 161 | int mode, | 168 | int mode, | 
| 162 | union ocfs2_dlm_lksb *lksb, | 169 | struct ocfs2_dlm_lksb *lksb, | 
| 163 | u32 flags, | 170 | u32 flags, | 
| 164 | void *name, | 171 | void *name, | 
| 165 | unsigned int namelen, | 172 | unsigned int namelen); | 
| 166 | void *astarg); | ||
| 167 | 173 | ||
| 168 | /* | 174 | /* | 
| 169 | * Call the underlying dlm unlock function. The ->dlm_unlock() | 175 | * Call the underlying dlm unlock function. The ->dlm_unlock() | 
| 170 | * function should convert the flags as appropriate. | 176 | * function should convert the flags as appropriate. | 
| 171 | * | 177 | * | 
| 172 | * The unlock ast is not passed, as the stack will want to wrap | 178 | * The unlock ast is not passed, as the stack will want to wrap | 
| 173 | * it before calling stack->sp_proto->lp_unlock_ast(). | 179 | * it before calling stack->sp_proto->lp_unlock_ast(). There is | 
| 180 | * no astarg. The lksb will be passed back to the unlock ast | ||
| 181 | * function. The caller can use this to find their object. | ||
| 174 | */ | 182 | */ | 
| 175 | int (*dlm_unlock)(struct ocfs2_cluster_connection *conn, | 183 | int (*dlm_unlock)(struct ocfs2_cluster_connection *conn, | 
| 176 | union ocfs2_dlm_lksb *lksb, | 184 | struct ocfs2_dlm_lksb *lksb, | 
| 177 | u32 flags, | 185 | u32 flags); | 
| 178 | void *astarg); | ||
| 179 | 186 | ||
| 180 | /* | 187 | /* | 
| 181 | * Return the status of the current lock status block. The fs | 188 | * Return the status of the current lock status block. The fs | 
| @@ -183,17 +190,17 @@ struct ocfs2_stack_operations { | |||
| 183 | * callback pulls out the stack-specific lksb, converts the status | 190 | * callback pulls out the stack-specific lksb, converts the status | 
| 184 | * to a proper errno, and returns it. | 191 | * to a proper errno, and returns it. | 
| 185 | */ | 192 | */ | 
| 186 | int (*lock_status)(union ocfs2_dlm_lksb *lksb); | 193 | int (*lock_status)(struct ocfs2_dlm_lksb *lksb); | 
| 187 | 194 | ||
| 188 | /* | 195 | /* | 
| 189 | * Return non-zero if the LVB is valid. | 196 | * Return non-zero if the LVB is valid. | 
| 190 | */ | 197 | */ | 
| 191 | int (*lvb_valid)(union ocfs2_dlm_lksb *lksb); | 198 | int (*lvb_valid)(struct ocfs2_dlm_lksb *lksb); | 
| 192 | 199 | ||
| 193 | /* | 200 | /* | 
| 194 | * Pull the lvb pointer off of the stack-specific lksb. | 201 | * Pull the lvb pointer off of the stack-specific lksb. | 
| 195 | */ | 202 | */ | 
| 196 | void *(*lock_lvb)(union ocfs2_dlm_lksb *lksb); | 203 | void *(*lock_lvb)(struct ocfs2_dlm_lksb *lksb); | 
| 197 | 204 | ||
| 198 | /* | 205 | /* | 
| 199 | * Cluster-aware posix locks | 206 | * Cluster-aware posix locks | 
| @@ -210,7 +217,7 @@ struct ocfs2_stack_operations { | |||
| 210 | * This is an optoinal debugging hook. If provided, the | 217 | * This is an optoinal debugging hook. If provided, the | 
| 211 | * stack can dump debugging information about this lock. | 218 | * stack can dump debugging information about this lock. | 
| 212 | */ | 219 | */ | 
| 213 | void (*dump_lksb)(union ocfs2_dlm_lksb *lksb); | 220 | void (*dump_lksb)(struct ocfs2_dlm_lksb *lksb); | 
| 214 | }; | 221 | }; | 
| 215 | 222 | ||
| 216 | /* | 223 | /* | 
| @@ -226,7 +233,7 @@ struct ocfs2_stack_plugin { | |||
| 226 | /* These are managed by the stackglue code. */ | 233 | /* These are managed by the stackglue code. */ | 
| 227 | struct list_head sp_list; | 234 | struct list_head sp_list; | 
| 228 | unsigned int sp_count; | 235 | unsigned int sp_count; | 
| 229 | struct ocfs2_locking_protocol *sp_proto; | 236 | struct ocfs2_protocol_version sp_max_proto; | 
| 230 | }; | 237 | }; | 
| 231 | 238 | ||
| 232 | 239 | ||
| @@ -234,10 +241,22 @@ struct ocfs2_stack_plugin { | |||
| 234 | int ocfs2_cluster_connect(const char *stack_name, | 241 | int ocfs2_cluster_connect(const char *stack_name, | 
| 235 | const char *group, | 242 | const char *group, | 
| 236 | int grouplen, | 243 | int grouplen, | 
| 244 | struct ocfs2_locking_protocol *lproto, | ||
| 237 | void (*recovery_handler)(int node_num, | 245 | void (*recovery_handler)(int node_num, | 
| 238 | void *recovery_data), | 246 | void *recovery_data), | 
| 239 | void *recovery_data, | 247 | void *recovery_data, | 
| 240 | struct ocfs2_cluster_connection **conn); | 248 | struct ocfs2_cluster_connection **conn); | 
| 249 | /* | ||
| 250 | * Used by callers that don't store their stack name. They must ensure | ||
| 251 | * all nodes have the same stack. | ||
| 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); | ||
| 241 | int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn, | 260 | int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn, | 
| 242 | int hangup_pending); | 261 | int hangup_pending); | 
| 243 | void ocfs2_cluster_hangup(const char *group, int grouplen); | 262 | void ocfs2_cluster_hangup(const char *group, int grouplen); | 
| @@ -246,26 +265,24 @@ int ocfs2_cluster_this_node(unsigned int *node); | |||
| 246 | struct ocfs2_lock_res; | 265 | struct ocfs2_lock_res; | 
| 247 | int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn, | 266 | int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn, | 
| 248 | int mode, | 267 | int mode, | 
| 249 | union ocfs2_dlm_lksb *lksb, | 268 | struct ocfs2_dlm_lksb *lksb, | 
| 250 | u32 flags, | 269 | u32 flags, | 
| 251 | void *name, | 270 | void *name, | 
| 252 | unsigned int namelen, | 271 | unsigned int namelen); | 
| 253 | struct ocfs2_lock_res *astarg); | ||
| 254 | int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn, | 272 | int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn, | 
| 255 | union ocfs2_dlm_lksb *lksb, | 273 | struct ocfs2_dlm_lksb *lksb, | 
| 256 | u32 flags, | 274 | u32 flags); | 
| 257 | struct ocfs2_lock_res *astarg); | ||
| 258 | 275 | ||
| 259 | int ocfs2_dlm_lock_status(union ocfs2_dlm_lksb *lksb); | 276 | int ocfs2_dlm_lock_status(struct ocfs2_dlm_lksb *lksb); | 
| 260 | int ocfs2_dlm_lvb_valid(union ocfs2_dlm_lksb *lksb); | 277 | int ocfs2_dlm_lvb_valid(struct ocfs2_dlm_lksb *lksb); | 
| 261 | void *ocfs2_dlm_lvb(union ocfs2_dlm_lksb *lksb); | 278 | void *ocfs2_dlm_lvb(struct ocfs2_dlm_lksb *lksb); | 
| 262 | void ocfs2_dlm_dump_lksb(union ocfs2_dlm_lksb *lksb); | 279 | void ocfs2_dlm_dump_lksb(struct ocfs2_dlm_lksb *lksb); | 
| 263 | 280 | ||
| 264 | int ocfs2_stack_supports_plocks(void); | 281 | int ocfs2_stack_supports_plocks(void); | 
| 265 | int ocfs2_plock(struct ocfs2_cluster_connection *conn, u64 ino, | 282 | int ocfs2_plock(struct ocfs2_cluster_connection *conn, u64 ino, | 
| 266 | struct file *file, int cmd, struct file_lock *fl); | 283 | struct file *file, int cmd, struct file_lock *fl); | 
| 267 | 284 | ||
| 268 | void ocfs2_stack_glue_set_locking_protocol(struct ocfs2_locking_protocol *proto); | 285 | void ocfs2_stack_glue_set_max_proto_version(struct ocfs2_protocol_version *max_proto); | 
| 269 | 286 | ||
| 270 | 287 | ||
| 271 | /* Used by stack plugins */ | 288 | /* Used by stack plugins */ | 
