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