📄 dlmcommon.h
字号:
{ u8 master; u8 lockname_len; u8 num_locks; // locks sent in this structure u8 flags; __be32 total_locks; // locks to be sent for this migration cookie __be64 mig_cookie; // cookie for this lockres migration // or zero if not needed // 16 bytes u8 lockname[DLM_LOCKID_NAME_MAX]; // 48 bytes u8 lvb[DLM_LVB_LEN]; // 112 bytes struct dlm_migratable_lock ml[0]; // 16 bytes each, begins at byte 112};#define DLM_MIG_LOCKRES_MAX_LEN \ (sizeof(struct dlm_migratable_lockres) + \ (sizeof(struct dlm_migratable_lock) * \ DLM_MAX_MIGRATABLE_LOCKS) )/* from above, 128 bytes * for some undetermined future use */#define DLM_MIG_LOCKRES_RESERVED (NET_MAX_PAYLOAD_BYTES - \ DLM_MIG_LOCKRES_MAX_LEN)struct dlm_create_lock{ __be64 cookie; __be32 flags; u8 pad1; u8 node_idx; s8 requested_type; u8 namelen; u8 name[O2NM_MAX_NAME_LEN];};struct dlm_convert_lock{ __be64 cookie; __be32 flags; u8 pad1; u8 node_idx; s8 requested_type; u8 namelen; u8 name[O2NM_MAX_NAME_LEN]; s8 lvb[0];};#define DLM_CONVERT_LOCK_MAX_LEN (sizeof(struct dlm_convert_lock)+DLM_LVB_LEN)struct dlm_unlock_lock{ __be64 cookie; __be32 flags; __be16 pad1; u8 node_idx; u8 namelen; u8 name[O2NM_MAX_NAME_LEN]; s8 lvb[0];};#define DLM_UNLOCK_LOCK_MAX_LEN (sizeof(struct dlm_unlock_lock)+DLM_LVB_LEN)struct dlm_proxy_ast{ __be64 cookie; __be32 flags; u8 node_idx; u8 type; u8 blocked_type; u8 namelen; u8 name[O2NM_MAX_NAME_LEN]; s8 lvb[0];};#define DLM_PROXY_AST_MAX_LEN (sizeof(struct dlm_proxy_ast)+DLM_LVB_LEN)#define DLM_MOD_KEY (0x666c6172)enum dlm_query_join_response { JOIN_DISALLOW = 0, JOIN_OK, JOIN_OK_NO_MAP,};struct dlm_lock_request{ u8 node_idx; u8 dead_node; __be16 pad1; __be32 pad2;};struct dlm_reco_data_done{ u8 node_idx; u8 dead_node; __be16 pad1; __be32 pad2; /* unused for now */ /* eventually we can use this to attempt * lvb recovery based on each node's info */ u8 reco_lvb[DLM_LVB_LEN];};struct dlm_begin_reco{ u8 node_idx; u8 dead_node; __be16 pad1; __be32 pad2;};struct dlm_query_join_request{ u8 node_idx; u8 pad1[2]; u8 name_len; u8 domain[O2NM_MAX_NAME_LEN];};struct dlm_assert_joined{ u8 node_idx; u8 pad1[2]; u8 name_len; u8 domain[O2NM_MAX_NAME_LEN];};struct dlm_cancel_join{ u8 node_idx; u8 pad1[2]; u8 name_len; u8 domain[O2NM_MAX_NAME_LEN];};struct dlm_exit_domain{ u8 node_idx; u8 pad1[3];};struct dlm_finalize_reco{ u8 node_idx; u8 dead_node; __be16 pad1; __be32 pad2;};static inline enum dlm_status__dlm_lockres_state_to_status(struct dlm_lock_resource *res){ enum dlm_status status = DLM_NORMAL; assert_spin_locked(&res->spinlock); if (res->state & DLM_LOCK_RES_RECOVERING) status = DLM_RECOVERING; else if (res->state & DLM_LOCK_RES_MIGRATING) status = DLM_MIGRATING; else if (res->state & DLM_LOCK_RES_IN_PROGRESS) status = DLM_FORWARD; return status;}static inline u8 dlm_get_lock_cookie_node(u64 cookie){ u8 ret; cookie >>= 56; ret = (u8)(cookie & 0xffULL); return ret;}static inline unsigned long long dlm_get_lock_cookie_seq(u64 cookie){ unsigned long long ret; ret = ((unsigned long long)cookie) & 0x00ffffffffffffffULL; return ret;}struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie, struct dlm_lockstatus *lksb);void dlm_lock_get(struct dlm_lock *lock);void dlm_lock_put(struct dlm_lock *lock);void dlm_lock_attach_lockres(struct dlm_lock *lock, struct dlm_lock_resource *res);int dlm_create_lock_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data);void dlm_revert_pending_convert(struct dlm_lock_resource *res, struct dlm_lock *lock);void dlm_revert_pending_lock(struct dlm_lock_resource *res, struct dlm_lock *lock);int dlm_unlock_lock_handler(struct o2net_msg *msg, u32 len, void *data);void dlm_commit_pending_cancel(struct dlm_lock_resource *res, struct dlm_lock *lock);void dlm_commit_pending_unlock(struct dlm_lock_resource *res, struct dlm_lock *lock);int dlm_launch_thread(struct dlm_ctxt *dlm);void dlm_complete_thread(struct dlm_ctxt *dlm);int dlm_launch_recovery_thread(struct dlm_ctxt *dlm);void dlm_complete_recovery_thread(struct dlm_ctxt *dlm);void dlm_wait_for_recovery(struct dlm_ctxt *dlm);void dlm_kick_recovery_thread(struct dlm_ctxt *dlm);int dlm_is_node_dead(struct dlm_ctxt *dlm, u8 node);int dlm_wait_for_node_death(struct dlm_ctxt *dlm, u8 node, int timeout);void dlm_put(struct dlm_ctxt *dlm);struct dlm_ctxt *dlm_grab(struct dlm_ctxt *dlm);int dlm_domain_fully_joined(struct dlm_ctxt *dlm);void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);void dlm_lockres_calc_usage(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);void dlm_purge_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *lockres);void dlm_lockres_get(struct dlm_lock_resource *res);void dlm_lockres_put(struct dlm_lock_resource *res);void __dlm_unhash_lockres(struct dlm_lock_resource *res);void __dlm_insert_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm, const char *name, unsigned int len);struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm, const char *name, unsigned int len);int dlm_is_host_down(int errno);void dlm_change_lockres_owner(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, u8 owner);struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm, const char *lockid, int flags);struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm, const char *name, unsigned int namelen);void dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock);void dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock);void dlm_do_local_ast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, struct dlm_lock *lock);int dlm_do_remote_ast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, struct dlm_lock *lock);void dlm_do_local_bast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, struct dlm_lock *lock, int blocked_type);int dlm_send_proxy_ast_msg(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, struct dlm_lock *lock, int msg_type, int blocked_type, int flags);static inline int dlm_send_proxy_bast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, struct dlm_lock *lock, int blocked_type){ return dlm_send_proxy_ast_msg(dlm, res, lock, DLM_BAST, blocked_type, 0);}static inline int dlm_send_proxy_ast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, struct dlm_lock *lock, int flags){ return dlm_send_proxy_ast_msg(dlm, res, lock, DLM_AST, 0, flags);}void dlm_print_one_lock_resource(struct dlm_lock_resource *res);void __dlm_print_one_lock_resource(struct dlm_lock_resource *res);u8 dlm_nm_this_node(struct dlm_ctxt *dlm);void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);int dlm_nm_init(struct dlm_ctxt *dlm);int dlm_heartbeat_init(struct dlm_ctxt *dlm);void dlm_hb_node_down_cb(struct o2nm_node *node, int idx, void *data);void dlm_hb_node_up_cb(struct o2nm_node *node, int idx, void *data);int dlm_lockres_is_dirty(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);int dlm_migrate_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, u8 target);int dlm_finish_migration(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, u8 old_master);void dlm_lockres_release_ast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);void __dlm_lockres_reserve_ast(struct dlm_lock_resource *res);int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_master_requery_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_request_all_locks_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_reco_data_done_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_begin_reco_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data);int dlm_do_master_requery(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, u8 nodenum, u8 *real_master);int dlm_lockres_master_requery(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, u8 *real_master);int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, int ignore_higher, u8 request_from, u32 flags);int dlm_send_one_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, struct dlm_migratable_lockres *mres, u8 send_to, u8 flags);void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);/* will exit holding res->spinlock, but may drop in function */void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags);void __dlm_wait_on_lockres_flags_set(struct dlm_lock_resource *res, int flags);/* will exit holding res->spinlock, but may drop in function */static inline void __dlm_wait_on_lockres(struct dlm_lock_resource *res){ __dlm_wait_on_lockres_flags(res, (DLM_LOCK_RES_IN_PROGRESS| DLM_LOCK_RES_RECOVERING| DLM_LOCK_RES_MIGRATING));}int dlm_init_mle_cache(void);void dlm_destroy_mle_cache(void);void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up);void dlm_clean_master_list(struct dlm_ctxt *dlm, u8 dead_node);int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock);static inline const char * dlm_lock_mode_name(int mode){ switch (mode) { case LKM_EXMODE: return "EX"; case LKM_PRMODE: return "PR"; case LKM_NLMODE: return "NL"; } return "UNKNOWN";}static inline int dlm_lock_compatible(int existing, int request){ /* NO_LOCK compatible with all */ if (request == LKM_NLMODE || existing == LKM_NLMODE) return 1; /* EX incompatible with all non-NO_LOCK */ if (request == LKM_EXMODE) return 0; /* request must be PR, which is compatible with PR */ if (existing == LKM_PRMODE) return 1; return 0;}static inline int dlm_lock_on_list(struct list_head *head, struct dlm_lock *lock){ struct list_head *iter; struct dlm_lock *tmplock; list_for_each(iter, head) { tmplock = list_entry(iter, struct dlm_lock, list); if (tmplock == lock) return 1; } return 0;}static inline enum dlm_status dlm_err_to_dlm_status(int err){ enum dlm_status ret; if (err == -ENOMEM) ret = DLM_SYSERR; else if (err == -ETIMEDOUT || o2net_link_down(err, NULL)) ret = DLM_NOLOCKMGR; else if (err == -EINVAL) ret = DLM_BADPARAM; else if (err == -ENAMETOOLONG) ret = DLM_IVBUFLEN; else ret = DLM_BADARGS; return ret;}static inline void dlm_node_iter_init(unsigned long *map, struct dlm_node_iter *iter){ memcpy(iter->node_map, map, sizeof(iter->node_map)); iter->curnode = -1;}static inline int dlm_node_iter_next(struct dlm_node_iter *iter){ int bit; bit = find_next_bit(iter->node_map, O2NM_MAX_NODES, iter->curnode+1); if (bit >= O2NM_MAX_NODES) { iter->curnode = O2NM_MAX_NODES; return -ENOENT; } iter->curnode = bit; return bit;}#endif /* DLMCOMMON_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -