1 /* SPDX-License-Identifier: GPL-2.0-only */ !! 1 /* -*- mode: c; c-basic-offset: 8; -*- 2 /* !! 2 * vim: noexpandtab sw=8 ts=8 sts=0: >> 3 * 3 * stackglue.h 4 * stackglue.h 4 * 5 * 5 * Glue to the underlying cluster stack. 6 * Glue to the underlying cluster stack. 6 * 7 * 7 * Copyright (C) 2007 Oracle. All rights rese 8 * Copyright (C) 2007 Oracle. All rights reserved. >> 9 * >> 10 * This program is free software; you can redistribute it and/or >> 11 * modify it under the terms of the GNU General Public >> 12 * License as published by the Free Software Foundation, version 2. >> 13 * >> 14 * This program is distributed in the hope that it will be useful, >> 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of >> 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> 17 * General Public License for more details. 8 */ 18 */ 9 19 10 20 11 #ifndef STACKGLUE_H 21 #ifndef STACKGLUE_H 12 #define STACKGLUE_H 22 #define STACKGLUE_H 13 23 14 #include <linux/types.h> 24 #include <linux/types.h> 15 #include <linux/list.h> 25 #include <linux/list.h> 16 #include <linux/dlmconstants.h> 26 #include <linux/dlmconstants.h> 17 27 18 #include "dlm/dlmapi.h" 28 #include "dlm/dlmapi.h" 19 #include <linux/dlm.h> 29 #include <linux/dlm.h> 20 30 21 /* Needed for plock-related prototypes */ 31 /* Needed for plock-related prototypes */ 22 struct file; 32 struct file; 23 struct file_lock; 33 struct file_lock; 24 34 25 /* 35 /* 26 * dlmconstants.h does not have a LOCAL flag. 36 * dlmconstants.h does not have a LOCAL flag. We hope to remove it 27 * some day, but right now we need it. Let's 37 * some day, but right now we need it. Let's fake it. This value is larger 28 * than any flag in dlmconstants.h. 38 * than any flag in dlmconstants.h. 29 */ 39 */ 30 #define DLM_LKF_LOCAL 0x00100000 40 #define DLM_LKF_LOCAL 0x00100000 31 41 32 /* 42 /* 33 * This shadows DLM_LOCKSPACE_LEN in fs/dlm/dl 43 * This shadows DLM_LOCKSPACE_LEN in fs/dlm/dlm_internal.h. That probably 34 * wants to be in a public header. 44 * wants to be in a public header. 35 */ 45 */ 36 #define GROUP_NAME_MAX 64 46 #define GROUP_NAME_MAX 64 37 47 38 /* This shadows OCFS2_CLUSTER_NAME_LEN */ 48 /* This shadows OCFS2_CLUSTER_NAME_LEN */ 39 #define CLUSTER_NAME_MAX 16 49 #define CLUSTER_NAME_MAX 16 40 50 41 51 42 /* 52 /* 43 * ocfs2_protocol_version changes when ocfs2 d 53 * ocfs2_protocol_version changes when ocfs2 does something different in 44 * its inter-node behavior. See dlmglue.c for 54 * its inter-node behavior. See dlmglue.c for more information. 45 */ 55 */ 46 struct ocfs2_protocol_version { 56 struct ocfs2_protocol_version { 47 u8 pv_major; 57 u8 pv_major; 48 u8 pv_minor; 58 u8 pv_minor; 49 }; 59 }; 50 60 51 /* 61 /* 52 * The dlm_lockstatus struct includes lvb spac 62 * The dlm_lockstatus struct includes lvb space, but the dlm_lksb struct only 53 * has a pointer to separately allocated lvb s 63 * has a pointer to separately allocated lvb space. This struct exists only to 54 * include in the lksb union to make space for 64 * include in the lksb union to make space for a combined dlm_lksb and lvb. 55 */ 65 */ 56 struct fsdlm_lksb_plus_lvb { 66 struct fsdlm_lksb_plus_lvb { 57 struct dlm_lksb lksb; 67 struct dlm_lksb lksb; 58 char lvb[DLM_LVB_LEN]; 68 char lvb[DLM_LVB_LEN]; 59 }; 69 }; 60 70 61 /* 71 /* 62 * A union of all lock status structures. We 72 * A union of all lock status structures. We define it here so that the 63 * size of the union is known. Lock status st 73 * size of the union is known. Lock status structures are embedded in 64 * ocfs2 inodes. 74 * ocfs2 inodes. 65 */ 75 */ 66 struct ocfs2_cluster_connection; 76 struct ocfs2_cluster_connection; 67 struct ocfs2_dlm_lksb { 77 struct ocfs2_dlm_lksb { 68 union { 78 union { 69 struct dlm_lockstatus lksb_o2 79 struct dlm_lockstatus lksb_o2dlm; 70 struct dlm_lksb lksb_fsdlm; 80 struct dlm_lksb lksb_fsdlm; 71 struct fsdlm_lksb_plus_lvb pa 81 struct fsdlm_lksb_plus_lvb padding; 72 }; 82 }; 73 struct ocfs2_cluster_connection *lksb 83 struct ocfs2_cluster_connection *lksb_conn; 74 }; 84 }; 75 85 76 /* 86 /* 77 * The ocfs2_locking_protocol defines the hand 87 * The ocfs2_locking_protocol defines the handlers called on ocfs2's behalf. 78 */ 88 */ 79 struct ocfs2_locking_protocol { 89 struct ocfs2_locking_protocol { 80 struct ocfs2_protocol_version lp_max_v 90 struct ocfs2_protocol_version lp_max_version; 81 void (*lp_lock_ast)(struct ocfs2_dlm_l 91 void (*lp_lock_ast)(struct ocfs2_dlm_lksb *lksb); 82 void (*lp_blocking_ast)(struct ocfs2_d 92 void (*lp_blocking_ast)(struct ocfs2_dlm_lksb *lksb, int level); 83 void (*lp_unlock_ast)(struct ocfs2_dlm 93 void (*lp_unlock_ast)(struct ocfs2_dlm_lksb *lksb, int error); 84 }; 94 }; 85 95 86 96 87 /* 97 /* 88 * A cluster connection. Mostly opaque to ocf 98 * A cluster connection. Mostly opaque to ocfs2, the connection holds 89 * state for the underlying stack. ocfs2 does 99 * state for the underlying stack. ocfs2 does use cc_version to determine 90 * locking compatibility. 100 * locking compatibility. 91 */ 101 */ 92 struct ocfs2_cluster_connection { 102 struct ocfs2_cluster_connection { 93 char cc_name[GROUP_NAME_MAX + 1]; 103 char cc_name[GROUP_NAME_MAX + 1]; 94 int cc_namelen; 104 int cc_namelen; 95 char cc_cluster_name[CLUSTER_NAME_MAX 105 char cc_cluster_name[CLUSTER_NAME_MAX + 1]; 96 int cc_cluster_name_len; 106 int cc_cluster_name_len; 97 struct ocfs2_protocol_version cc_versi 107 struct ocfs2_protocol_version cc_version; 98 struct ocfs2_locking_protocol *cc_prot 108 struct ocfs2_locking_protocol *cc_proto; 99 void (*cc_recovery_handler)(int node_n 109 void (*cc_recovery_handler)(int node_num, void *recovery_data); 100 void *cc_recovery_data; 110 void *cc_recovery_data; 101 void *cc_lockspace; 111 void *cc_lockspace; 102 void *cc_private; 112 void *cc_private; 103 }; 113 }; 104 114 105 /* 115 /* 106 * Each cluster stack implements the stack ope 116 * Each cluster stack implements the stack operations structure. Not used 107 * in the ocfs2 code, the stackglue code trans 117 * in the ocfs2 code, the stackglue code translates generic cluster calls 108 * into stack operations. 118 * into stack operations. 109 */ 119 */ 110 struct ocfs2_stack_operations { 120 struct ocfs2_stack_operations { 111 /* 121 /* 112 * The fs code calls ocfs2_cluster_con 122 * The fs code calls ocfs2_cluster_connect() to attach a new 113 * filesystem to the cluster stack. T 123 * filesystem to the cluster stack. The ->connect() op is passed 114 * an ocfs2_cluster_connection with th 124 * an ocfs2_cluster_connection with the name and recovery field 115 * filled in. 125 * filled in. 116 * 126 * 117 * The stack must set up any notificat 127 * The stack must set up any notification mechanisms and create 118 * the filesystem lockspace in the DLM 128 * the filesystem lockspace in the DLM. The lockspace should be 119 * stored on cc_lockspace. Any other 129 * stored on cc_lockspace. Any other information can be stored on 120 * cc_private. 130 * cc_private. 121 * 131 * 122 * ->connect() must not return until i 132 * ->connect() must not return until it is guaranteed that 123 * 133 * 124 * - Node down notifications for the 134 * - Node down notifications for the filesystem will be received 125 * and passed to conn->cc_recovery_ 135 * and passed to conn->cc_recovery_handler(). 126 * - Locking requests for the filesys 136 * - Locking requests for the filesystem will be processed. 127 */ 137 */ 128 int (*connect)(struct ocfs2_cluster_co 138 int (*connect)(struct ocfs2_cluster_connection *conn); 129 139 130 /* 140 /* 131 * The fs code calls ocfs2_cluster_dis 141 * The fs code calls ocfs2_cluster_disconnect() when a filesystem 132 * no longer needs cluster services. 142 * no longer needs cluster services. All DLM locks have been 133 * dropped, and recovery notification 143 * dropped, and recovery notification is being ignored by the 134 * fs code. The stack must disengage 144 * fs code. The stack must disengage from the DLM and discontinue 135 * recovery notification. 145 * recovery notification. 136 * 146 * 137 * Once ->disconnect() has returned, t 147 * Once ->disconnect() has returned, the connection structure will 138 * be freed. Thus, a stack must not r 148 * be freed. Thus, a stack must not return from ->disconnect() 139 * until it will no longer reference t 149 * until it will no longer reference the conn pointer. 140 * 150 * 141 * Once this call returns, the stack g 151 * Once this call returns, the stack glue will be dropping this 142 * connection's reference on the modul 152 * connection's reference on the module. 143 */ 153 */ 144 int (*disconnect)(struct ocfs2_cluster 154 int (*disconnect)(struct ocfs2_cluster_connection *conn); 145 155 146 /* 156 /* 147 * ->this_node() returns the cluster's 157 * ->this_node() returns the cluster's unique identifier for the 148 * local node. 158 * local node. 149 */ 159 */ 150 int (*this_node)(struct ocfs2_cluster_ 160 int (*this_node)(struct ocfs2_cluster_connection *conn, 151 unsigned int *node); 161 unsigned int *node); 152 162 153 /* 163 /* 154 * Call the underlying dlm lock functi 164 * Call the underlying dlm lock function. The ->dlm_lock() 155 * callback should convert the flags a 165 * callback should convert the flags and mode as appropriate. 156 * 166 * 157 * ast and bast functions are not part 167 * ast and bast functions are not part of the call because the 158 * stack will likely want to wrap ast 168 * stack will likely want to wrap ast and bast calls before passing 159 * them to stack->sp_proto. There is 169 * them to stack->sp_proto. There is no astarg. The lksb will 160 * be passed back to the ast and bast 170 * be passed back to the ast and bast functions. The caller can 161 * use this to find their object. 171 * use this to find their object. 162 */ 172 */ 163 int (*dlm_lock)(struct ocfs2_cluster_c 173 int (*dlm_lock)(struct ocfs2_cluster_connection *conn, 164 int mode, 174 int mode, 165 struct ocfs2_dlm_lksb 175 struct ocfs2_dlm_lksb *lksb, 166 u32 flags, 176 u32 flags, 167 void *name, 177 void *name, 168 unsigned int namelen); 178 unsigned int namelen); 169 179 170 /* 180 /* 171 * Call the underlying dlm unlock func 181 * Call the underlying dlm unlock function. The ->dlm_unlock() 172 * function should convert the flags a 182 * function should convert the flags as appropriate. 173 * 183 * 174 * The unlock ast is not passed, as th 184 * The unlock ast is not passed, as the stack will want to wrap 175 * it before calling stack->sp_proto-> 185 * it before calling stack->sp_proto->lp_unlock_ast(). There is 176 * no astarg. The lksb will be passed 186 * no astarg. The lksb will be passed back to the unlock ast 177 * function. The caller can use this 187 * function. The caller can use this to find their object. 178 */ 188 */ 179 int (*dlm_unlock)(struct ocfs2_cluster 189 int (*dlm_unlock)(struct ocfs2_cluster_connection *conn, 180 struct ocfs2_dlm_lks 190 struct ocfs2_dlm_lksb *lksb, 181 u32 flags); 191 u32 flags); 182 192 183 /* 193 /* 184 * Return the status of the current lo 194 * Return the status of the current lock status block. The fs 185 * code should never dereference the u 195 * code should never dereference the union. The ->lock_status() 186 * callback pulls out the stack-specif 196 * callback pulls out the stack-specific lksb, converts the status 187 * to a proper errno, and returns it. 197 * to a proper errno, and returns it. 188 */ 198 */ 189 int (*lock_status)(struct ocfs2_dlm_lk 199 int (*lock_status)(struct ocfs2_dlm_lksb *lksb); 190 200 191 /* 201 /* 192 * Return non-zero if the LVB is valid 202 * Return non-zero if the LVB is valid. 193 */ 203 */ 194 int (*lvb_valid)(struct ocfs2_dlm_lksb 204 int (*lvb_valid)(struct ocfs2_dlm_lksb *lksb); 195 205 196 /* 206 /* 197 * Pull the lvb pointer off of the sta 207 * Pull the lvb pointer off of the stack-specific lksb. 198 */ 208 */ 199 void *(*lock_lvb)(struct ocfs2_dlm_lks 209 void *(*lock_lvb)(struct ocfs2_dlm_lksb *lksb); 200 210 201 /* 211 /* 202 * Cluster-aware posix locks 212 * Cluster-aware posix locks 203 * 213 * 204 * This is NULL for stacks which do no 214 * This is NULL for stacks which do not support posix locks. 205 */ 215 */ 206 int (*plock)(struct ocfs2_cluster_conn 216 int (*plock)(struct ocfs2_cluster_connection *conn, 207 u64 ino, 217 u64 ino, 208 struct file *file, 218 struct file *file, 209 int cmd, 219 int cmd, 210 struct file_lock *fl); 220 struct file_lock *fl); 211 221 212 /* 222 /* 213 * This is an optoinal debugging hook. 223 * This is an optoinal debugging hook. If provided, the 214 * stack can dump debugging informatio 224 * stack can dump debugging information about this lock. 215 */ 225 */ 216 void (*dump_lksb)(struct ocfs2_dlm_lks 226 void (*dump_lksb)(struct ocfs2_dlm_lksb *lksb); 217 }; 227 }; 218 228 219 /* 229 /* 220 * Each stack plugin must describe itself by r 230 * Each stack plugin must describe itself by registering a 221 * ocfs2_stack_plugin structure. This is only 231 * ocfs2_stack_plugin structure. This is only seen by stackglue and the 222 * stack driver. 232 * stack driver. 223 */ 233 */ 224 struct ocfs2_stack_plugin { 234 struct ocfs2_stack_plugin { 225 char *sp_name; 235 char *sp_name; 226 const struct ocfs2_stack_operations *s !! 236 struct ocfs2_stack_operations *sp_ops; 227 struct module *sp_owner; 237 struct module *sp_owner; 228 238 229 /* These are managed by the stackglue 239 /* These are managed by the stackglue code. */ 230 struct list_head sp_list; 240 struct list_head sp_list; 231 unsigned int sp_count; 241 unsigned int sp_count; 232 struct ocfs2_protocol_version sp_max_p 242 struct ocfs2_protocol_version sp_max_proto; 233 }; 243 }; 234 244 235 245 236 /* Used by the filesystem */ 246 /* Used by the filesystem */ 237 int ocfs2_cluster_connect(const char *stack_na 247 int ocfs2_cluster_connect(const char *stack_name, 238 const char *cluster_ 248 const char *cluster_name, 239 int cluster_name_len 249 int cluster_name_len, 240 const char *group, 250 const char *group, 241 int grouplen, 251 int grouplen, 242 struct ocfs2_locking 252 struct ocfs2_locking_protocol *lproto, 243 void (*recovery_hand 253 void (*recovery_handler)(int node_num, 244 254 void *recovery_data), 245 void *recovery_data, 255 void *recovery_data, 246 struct ocfs2_cluster 256 struct ocfs2_cluster_connection **conn); 247 /* 257 /* 248 * Used by callers that don't store their stac 258 * Used by callers that don't store their stack name. They must ensure 249 * all nodes have the same stack. 259 * all nodes have the same stack. 250 */ 260 */ 251 int ocfs2_cluster_connect_agnostic(const char 261 int ocfs2_cluster_connect_agnostic(const char *group, 252 int grouple 262 int grouplen, 253 struct ocfs 263 struct ocfs2_locking_protocol *lproto, 254 void (*reco 264 void (*recovery_handler)(int node_num, 255 265 void *recovery_data), 256 void *recov 266 void *recovery_data, 257 struct ocfs 267 struct ocfs2_cluster_connection **conn); 258 int ocfs2_cluster_disconnect(struct ocfs2_clus 268 int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn, 259 int hangup_pendin 269 int hangup_pending); 260 void ocfs2_cluster_hangup(const char *group, i 270 void ocfs2_cluster_hangup(const char *group, int grouplen); 261 int ocfs2_cluster_this_node(struct ocfs2_clust 271 int ocfs2_cluster_this_node(struct ocfs2_cluster_connection *conn, 262 unsigned int *node 272 unsigned int *node); 263 273 264 struct ocfs2_lock_res; 274 struct ocfs2_lock_res; 265 int ocfs2_dlm_lock(struct ocfs2_cluster_connec 275 int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn, 266 int mode, 276 int mode, 267 struct ocfs2_dlm_lksb *lksb 277 struct ocfs2_dlm_lksb *lksb, 268 u32 flags, 278 u32 flags, 269 void *name, 279 void *name, 270 unsigned int namelen); 280 unsigned int namelen); 271 int ocfs2_dlm_unlock(struct ocfs2_cluster_conn 281 int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn, 272 struct ocfs2_dlm_lksb *lk 282 struct ocfs2_dlm_lksb *lksb, 273 u32 flags); 283 u32 flags); 274 284 275 int ocfs2_dlm_lock_status(struct ocfs2_dlm_lks 285 int ocfs2_dlm_lock_status(struct ocfs2_dlm_lksb *lksb); 276 int ocfs2_dlm_lvb_valid(struct ocfs2_dlm_lksb 286 int ocfs2_dlm_lvb_valid(struct ocfs2_dlm_lksb *lksb); 277 void *ocfs2_dlm_lvb(struct ocfs2_dlm_lksb *lks 287 void *ocfs2_dlm_lvb(struct ocfs2_dlm_lksb *lksb); 278 void ocfs2_dlm_dump_lksb(struct ocfs2_dlm_lksb 288 void ocfs2_dlm_dump_lksb(struct ocfs2_dlm_lksb *lksb); 279 289 280 int ocfs2_stack_supports_plocks(void); 290 int ocfs2_stack_supports_plocks(void); 281 int ocfs2_plock(struct ocfs2_cluster_connectio 291 int ocfs2_plock(struct ocfs2_cluster_connection *conn, u64 ino, 282 struct file *file, int cmd, st 292 struct file *file, int cmd, struct file_lock *fl); 283 293 284 void ocfs2_stack_glue_set_max_proto_version(st 294 void ocfs2_stack_glue_set_max_proto_version(struct ocfs2_protocol_version *max_proto); 285 295 286 296 287 /* Used by stack plugins */ 297 /* Used by stack plugins */ 288 int ocfs2_stack_glue_register(struct ocfs2_sta 298 int ocfs2_stack_glue_register(struct ocfs2_stack_plugin *plugin); 289 void ocfs2_stack_glue_unregister(struct ocfs2_ 299 void ocfs2_stack_glue_unregister(struct ocfs2_stack_plugin *plugin); 290 << 291 extern struct kset *ocfs2_kset; << 292 300 293 #endif /* STACKGLUE_H */ 301 #endif /* STACKGLUE_H */ 294 302
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.