Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /* -*- mode: c; c-basic-offset: 8; -*-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * vim: noexpandtab sw=8 ts=8 sts=0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * dlmcommon.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  * Copyright (C) 2004 Oracle.  All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #ifndef DLMCOMMON_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #define DLMCOMMON_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/kref.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #define DLM_HB_NODE_DOWN_PRI     (0xf000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #define DLM_HB_NODE_UP_PRI       (0x8000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #define DLM_LOCKID_NAME_MAX    32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #define DLM_DOMAIN_NAME_MAX_LEN    255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #define DLM_LOCK_RES_OWNER_UNKNOWN     O2NM_MAX_NODES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #define DLM_THREAD_SHUFFLE_INTERVAL    5     // flush everything every 5 passes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #define DLM_THREAD_MS                  200   // flush at least every 200 ms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #define DLM_HASH_SIZE_DEFAULT	(1 << 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) #if DLM_HASH_SIZE_DEFAULT < PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) # define DLM_HASH_PAGES		1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) # define DLM_HASH_PAGES		(DLM_HASH_SIZE_DEFAULT / PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #define DLM_BUCKETS_PER_PAGE	(PAGE_SIZE / sizeof(struct hlist_head))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #define DLM_HASH_BUCKETS	(DLM_HASH_PAGES * DLM_BUCKETS_PER_PAGE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) /* Intended to make it easier for us to switch out hash functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) #define dlm_lockid_hash(_n, _l) full_name_hash(NULL, _n, _l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) enum dlm_mle_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 	DLM_MLE_BLOCK = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 	DLM_MLE_MASTER = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 	DLM_MLE_MIGRATION = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 	DLM_MLE_NUM_TYPES = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) struct dlm_master_list_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) 	struct hlist_node master_hash_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) 	struct list_head hb_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 	struct dlm_ctxt *dlm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 	spinlock_t spinlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 	wait_queue_head_t wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) 	atomic_t woken;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) 	struct kref mle_refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) 	int inuse;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) 	unsigned long maybe_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 	unsigned long vote_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 	unsigned long response_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) 	unsigned long node_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 	u8 master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	u8 new_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	enum dlm_mle_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	struct o2hb_callback_func mle_hb_up;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	struct o2hb_callback_func mle_hb_down;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 	struct dlm_lock_resource *mleres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	unsigned char mname[DLM_LOCKID_NAME_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	unsigned int mnamelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	unsigned int mnamehash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) enum dlm_ast_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	DLM_AST = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 	DLM_BAST = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	DLM_ASTUNLOCK = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) #define LKM_VALID_FLAGS (LKM_VALBLK | LKM_CONVERT | LKM_UNLOCK | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 			 LKM_CANCEL | LKM_INVVALBLK | LKM_FORCE | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 			 LKM_RECOVERY | LKM_LOCAL | LKM_NOQUEUE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) #define DLM_RECOVERY_LOCK_NAME       "$RECOVERY"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) #define DLM_RECOVERY_LOCK_NAME_LEN   9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) static inline int dlm_is_recovery_lock(const char *lock_name, int name_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	if (name_len == DLM_RECOVERY_LOCK_NAME_LEN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	    memcmp(lock_name, DLM_RECOVERY_LOCK_NAME, name_len)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) #define DLM_RECO_STATE_ACTIVE    0x0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) #define DLM_RECO_STATE_FINALIZE  0x0002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) struct dlm_recovery_ctxt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	struct list_head resources;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	struct list_head node_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 	u8  new_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 	u8  dead_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 	u16 state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 	unsigned long node_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 	wait_queue_head_t event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) enum dlm_ctxt_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 	DLM_CTXT_NEW = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	DLM_CTXT_JOINED = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	DLM_CTXT_IN_SHUTDOWN = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 	DLM_CTXT_LEAVING = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) struct dlm_ctxt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 	struct hlist_head **lockres_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 	struct list_head dirty_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 	struct list_head purge_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	struct list_head pending_asts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 	struct list_head pending_basts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	struct list_head tracking_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 	unsigned int purge_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 	spinlock_t spinlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 	spinlock_t ast_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 	spinlock_t track_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	u8 node_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 	u32 key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	u8  joining_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	u8 migrate_done; /* set to 1 means node has migrated all lock resources */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 	wait_queue_head_t dlm_join_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	unsigned long live_nodes_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	unsigned long domain_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	unsigned long exit_domain_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	unsigned long recovery_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	struct dlm_recovery_ctxt reco;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	spinlock_t master_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	struct hlist_head **master_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 	struct list_head mle_hb_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 	/* these give a really vague idea of the system load */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 	atomic_t mle_tot_count[DLM_MLE_NUM_TYPES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 	atomic_t mle_cur_count[DLM_MLE_NUM_TYPES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	atomic_t res_tot_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 	atomic_t res_cur_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	struct dentry *dlm_debugfs_subroot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 	/* NOTE: Next three are protected by dlm_domain_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	struct kref dlm_refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	enum dlm_ctxt_state dlm_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	unsigned int num_joins;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	struct o2hb_callback_func dlm_hb_up;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 	struct o2hb_callback_func dlm_hb_down;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	struct task_struct *dlm_thread_task;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	struct task_struct *dlm_reco_thread_task;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	struct workqueue_struct *dlm_worker;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	wait_queue_head_t dlm_thread_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	wait_queue_head_t dlm_reco_thread_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	wait_queue_head_t ast_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	wait_queue_head_t migration_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	struct work_struct dispatched_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	struct list_head work_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	spinlock_t work_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	struct list_head dlm_domain_handlers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	struct list_head	dlm_eviction_callbacks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	/* The filesystem specifies this at domain registration.  We
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 	 * cache it here to know what to tell other nodes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 	struct dlm_protocol_version fs_locking_proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	/* This is the inter-dlm communication version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	struct dlm_protocol_version dlm_locking_proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) static inline struct hlist_head *dlm_lockres_hash(struct dlm_ctxt *dlm, unsigned i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	return dlm->lockres_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + (i % DLM_BUCKETS_PER_PAGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) static inline struct hlist_head *dlm_master_hash(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 						 unsigned i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	return dlm->master_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 			(i % DLM_BUCKETS_PER_PAGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) /* these keventd work queue items are for less-frequently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188)  * called functions that cannot be directly called from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189)  * net message handlers for some reason, usually because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190)  * they need to send net messages of their own. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) void dlm_dispatch_work(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) struct dlm_lock_resource;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) struct dlm_work_item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) typedef void (dlm_workfunc_t)(struct dlm_work_item *, void *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) struct dlm_request_all_locks_priv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	u8 reco_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	u8 dead_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) struct dlm_mig_lockres_priv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	struct dlm_lock_resource *lockres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	u8 real_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	u8 extra_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) struct dlm_assert_master_priv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 	struct dlm_lock_resource *lockres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	u8 request_from;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	u32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 	unsigned ignore_higher:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) struct dlm_deref_lockres_priv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	struct dlm_lock_resource *deref_res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 	u8 deref_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) struct dlm_work_item
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	dlm_workfunc_t *func;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 	struct dlm_ctxt *dlm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	void *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 		struct dlm_request_all_locks_priv ral;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 		struct dlm_mig_lockres_priv ml;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 		struct dlm_assert_master_priv am;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 		struct dlm_deref_lockres_priv dl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 	} u;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) static inline void dlm_init_work_item(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 				      struct dlm_work_item *i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 				      dlm_workfunc_t *f, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 	memset(i, 0, sizeof(*i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 	i->func = f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 	INIT_LIST_HEAD(&i->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	i->data = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 	i->dlm = dlm;  /* must have already done a dlm_grab on this! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) static inline void __dlm_set_joining_node(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 					  u8 node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	assert_spin_locked(&dlm->spinlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	dlm->joining_node = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 	wake_up(&dlm->dlm_join_events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) #define DLM_LOCK_RES_UNINITED             0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) #define DLM_LOCK_RES_RECOVERING           0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) #define DLM_LOCK_RES_READY                0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) #define DLM_LOCK_RES_DIRTY                0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) #define DLM_LOCK_RES_IN_PROGRESS          0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) #define DLM_LOCK_RES_MIGRATING            0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) #define DLM_LOCK_RES_DROPPING_REF         0x00000040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) #define DLM_LOCK_RES_BLOCK_DIRTY          0x00001000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) #define DLM_LOCK_RES_SETREF_INPROG        0x00002000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) #define DLM_LOCK_RES_RECOVERY_WAITING     0x00004000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) /* max milliseconds to wait to sync up a network failure with a node death */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) #define DLM_NODE_DEATH_WAIT_MAX (5 * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) #define DLM_PURGE_INTERVAL_MS   (8 * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) struct dlm_lock_resource
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	/* WARNING: Please see the comment in dlm_init_lockres before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	 * adding fields here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 	struct hlist_node hash_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	struct qstr lockname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	struct kref      refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	 * Please keep granted, converting, and blocked in this order,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	 * as some funcs want to iterate over all lists.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	 * All four lists are protected by the hash's reference.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	struct list_head granted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	struct list_head converting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	struct list_head blocked;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	struct list_head purge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	 * These two lists require you to hold an additional reference
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	 * while they are on the list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	struct list_head dirty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 	struct list_head recovering; // dlm_recovery_ctxt.resources list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 	/* Added during init and removed during release */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	struct list_head tracking;	/* dlm->tracking_list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 	/* unused lock resources have their last_used stamped and are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 	 * put on a list for the dlm thread to run. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 	unsigned long    last_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	struct dlm_ctxt *dlm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	unsigned migration_pending:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	atomic_t asts_reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	spinlock_t spinlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	wait_queue_head_t wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	u8  owner;              //node which owns the lock resource, or unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	u16 state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	char lvb[DLM_LVB_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	unsigned int inflight_locks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	unsigned int inflight_assert_workers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 	unsigned long refmap[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) struct dlm_migratable_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	__be64 cookie;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	/* these 3 are just padding for the in-memory structure, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	 * list and flags are actually used when sent over the wire */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	__be16 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	u8 list;  // 0=granted, 1=converting, 2=blocked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 	u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 	s8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	s8 convert_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	s8 highest_blocked;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	u8 node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) };  // 16 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) struct dlm_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 	struct dlm_migratable_lock ml;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	struct list_head ast_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	struct list_head bast_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 	struct dlm_lock_resource *lockres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	spinlock_t spinlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	struct kref lock_refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	// ast and bast must be callable while holding a spinlock!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	dlm_astlockfunc_t *ast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	dlm_bastlockfunc_t *bast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	void *astdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	struct dlm_lockstatus *lksb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	unsigned ast_pending:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 		 bast_pending:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 		 convert_pending:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 		 lock_pending:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 		 cancel_pending:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 		 unlock_pending:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 		 lksb_kernel_allocated:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) enum dlm_lockres_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	DLM_GRANTED_LIST = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	DLM_CONVERTING_LIST = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 	DLM_BLOCKED_LIST = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) static inline int dlm_lvb_is_empty(char *lvb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	for (i=0; i<DLM_LVB_LEN; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 		if (lvb[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) static inline char *dlm_list_in_text(enum dlm_lockres_list idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 	if (idx == DLM_GRANTED_LIST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 		return "granted";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	else if (idx == DLM_CONVERTING_LIST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 		return "converting";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	else if (idx == DLM_BLOCKED_LIST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 		return "blocked";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 		return "unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) static inline struct list_head *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) dlm_list_idx_to_ptr(struct dlm_lock_resource *res, enum dlm_lockres_list idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	struct list_head *ret = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	if (idx == DLM_GRANTED_LIST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 		ret = &res->granted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	else if (idx == DLM_CONVERTING_LIST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 		ret = &res->converting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	else if (idx == DLM_BLOCKED_LIST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 		ret = &res->blocked;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 		BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) struct dlm_node_iter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	unsigned long node_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	int curnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 	DLM_MASTER_REQUEST_MSG		= 500,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 	DLM_UNUSED_MSG1			= 501,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	DLM_ASSERT_MASTER_MSG		= 502,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	DLM_CREATE_LOCK_MSG		= 503,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	DLM_CONVERT_LOCK_MSG		= 504,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	DLM_PROXY_AST_MSG		= 505,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	DLM_UNLOCK_LOCK_MSG		= 506,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	DLM_DEREF_LOCKRES_MSG		= 507,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 	DLM_MIGRATE_REQUEST_MSG		= 508,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	DLM_MIG_LOCKRES_MSG		= 509,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	DLM_QUERY_JOIN_MSG		= 510,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 	DLM_ASSERT_JOINED_MSG		= 511,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 	DLM_CANCEL_JOIN_MSG		= 512,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	DLM_EXIT_DOMAIN_MSG		= 513,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 	DLM_MASTER_REQUERY_MSG		= 514,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	DLM_LOCK_REQUEST_MSG		= 515,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 	DLM_RECO_DATA_DONE_MSG		= 516,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 	DLM_BEGIN_RECO_MSG		= 517,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	DLM_FINALIZE_RECO_MSG		= 518,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 	DLM_QUERY_REGION		= 519,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	DLM_QUERY_NODEINFO		= 520,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	DLM_BEGIN_EXIT_DOMAIN_MSG	= 521,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 	DLM_DEREF_LOCKRES_DONE		= 522,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) struct dlm_reco_node_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	int state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 	u8 node_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	DLM_RECO_NODE_DATA_DEAD = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	DLM_RECO_NODE_DATA_INIT = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	DLM_RECO_NODE_DATA_REQUESTING = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	DLM_RECO_NODE_DATA_REQUESTED = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	DLM_RECO_NODE_DATA_RECEIVING = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 	DLM_RECO_NODE_DATA_DONE = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	DLM_RECO_NODE_DATA_FINALIZE_SENT = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	DLM_MASTER_RESP_NO = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	DLM_MASTER_RESP_YES = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	DLM_MASTER_RESP_MAYBE = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	DLM_MASTER_RESP_ERROR = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) struct dlm_master_request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 	__be16 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	__be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) #define DLM_ASSERT_RESPONSE_REASSERT       0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) #define DLM_ASSERT_RESPONSE_MASTERY_REF    0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) #define DLM_ASSERT_MASTER_MLE_CLEANUP      0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) #define DLM_ASSERT_MASTER_REQUERY          0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) #define DLM_ASSERT_MASTER_FINISH_MIGRATION 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) struct dlm_assert_master
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	__be16 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	__be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) #define DLM_MIGRATE_RESPONSE_MASTERY_REF   0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) struct dlm_migrate_request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	u8 master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	u8 new_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 	u8 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	__be32 pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) struct dlm_master_requery
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	u8 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	u8 pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 	__be32 pad3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) #define DLM_MRES_RECOVERY   0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) #define DLM_MRES_MIGRATION  0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) #define DLM_MRES_ALL_DONE   0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522)  * We would like to get one whole lockres into a single network
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523)  * message whenever possible.  Generally speaking, there will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524)  * at most one dlm_lock on a lockres for each node in the cluster,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525)  * plus (infrequently) any additional locks coming in from userdlm.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527)  * struct _dlm_lockres_page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528)  * {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529)  * 	dlm_migratable_lockres mres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530)  * 	dlm_migratable_lock ml[DLM_MAX_MIGRATABLE_LOCKS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531)  * 	u8 pad[DLM_MIG_LOCKRES_RESERVED];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532)  * };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534)  * from ../cluster/tcp.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535)  *    O2NET_MAX_PAYLOAD_BYTES  (4096 - sizeof(net_msg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536)  *    (roughly 4080 bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537)  * and sizeof(dlm_migratable_lockres) = 112 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538)  * and sizeof(dlm_migratable_lock) = 16 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540)  * Choosing DLM_MAX_MIGRATABLE_LOCKS=240 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541)  * DLM_MIG_LOCKRES_RESERVED=128 means we have this:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543)  *  (DLM_MAX_MIGRATABLE_LOCKS * sizeof(dlm_migratable_lock)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544)  *     sizeof(dlm_migratable_lockres) + DLM_MIG_LOCKRES_RESERVED =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545)  *        NET_MAX_PAYLOAD_BYTES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546)  *  (240 * 16) + 112 + 128 = 4080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548)  * So a lockres would need more than 240 locks before it would
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549)  * use more than one network packet to recover.  Not too bad.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) #define DLM_MAX_MIGRATABLE_LOCKS   240
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) struct dlm_migratable_lockres
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	u8 master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	u8 lockname_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	u8 num_locks;    // locks sent in this structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 	__be32 total_locks; // locks to be sent for this migration cookie
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	__be64 mig_cookie;  // cookie for this lockres migration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 			 // or zero if not needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	// 16 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	u8 lockname[DLM_LOCKID_NAME_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	// 48 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 	u8 lvb[DLM_LVB_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 	// 112 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	struct dlm_migratable_lock ml[];  // 16 bytes each, begins at byte 112
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) #define DLM_MIG_LOCKRES_MAX_LEN  \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	(sizeof(struct dlm_migratable_lockres) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	 (sizeof(struct dlm_migratable_lock) * \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	  DLM_MAX_MIGRATABLE_LOCKS) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) /* from above, 128 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575)  * for some undetermined future use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) #define DLM_MIG_LOCKRES_RESERVED   (O2NET_MAX_PAYLOAD_BYTES - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 				    DLM_MIG_LOCKRES_MAX_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) struct dlm_create_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 	__be64 cookie;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	__be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	u8 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	s8 requested_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) struct dlm_convert_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	__be64 cookie;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	__be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	u8 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 	s8 requested_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	s8 lvb[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) #define DLM_CONVERT_LOCK_MAX_LEN  (sizeof(struct dlm_convert_lock)+DLM_LVB_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) struct dlm_unlock_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	__be64 cookie;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	__be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	__be16 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	s8 lvb[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) #define DLM_UNLOCK_LOCK_MAX_LEN  (sizeof(struct dlm_unlock_lock)+DLM_LVB_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) struct dlm_proxy_ast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	__be64 cookie;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	__be32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 	u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 	u8 blocked_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	s8 lvb[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) #define DLM_PROXY_AST_MAX_LEN  (sizeof(struct dlm_proxy_ast)+DLM_LVB_LEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) #define DLM_MOD_KEY (0x666c6172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) enum dlm_query_join_response_code {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	JOIN_DISALLOW = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	JOIN_OK = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	JOIN_OK_NO_MAP = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	JOIN_PROTOCOL_MISMATCH = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) struct dlm_query_join_packet {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	u8 code;	/* Response code.  dlm_minor and fs_minor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 			   are only valid if this is JOIN_OK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	u8 dlm_minor;	/* The minor version of the protocol the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 			   dlm is speaking. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	u8 fs_minor;	/* The minor version of the protocol the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 			   filesystem is speaking. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	u8 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) union dlm_query_join_response {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	__be32 intval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 	struct dlm_query_join_packet packet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) struct dlm_lock_request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	u8 dead_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 	__be16 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	__be32 pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) struct dlm_reco_data_done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 	u8 dead_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 	__be16 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 	__be32 pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	/* unused for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 	/* eventually we can use this to attempt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 	 * lvb recovery based on each node's info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	u8 reco_lvb[DLM_LVB_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) struct dlm_begin_reco
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	u8 dead_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	__be16 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	__be32 pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) struct dlm_query_join_request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 	u8 pad1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	u8 name_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	struct dlm_protocol_version dlm_proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	struct dlm_protocol_version fs_proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	u8 domain[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 	u8 node_map[BITS_TO_BYTES(O2NM_MAX_NODES)];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) struct dlm_assert_joined
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	u8 pad1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 	u8 name_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	u8 domain[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) struct dlm_cancel_join
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	u8 pad1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	u8 name_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	u8 domain[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) struct dlm_query_region {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	u8 qr_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 	u8 qr_numregions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	u8 qr_namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 	u8 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 	u8 qr_domain[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 	u8 qr_regions[O2HB_MAX_REGION_NAME_LEN * O2NM_MAX_REGIONS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) struct dlm_node_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	u8 ni_nodenum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 	u8 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	__be16 ni_ipv4_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	__be32 ni_ipv4_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) struct dlm_query_nodeinfo {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	u8 qn_nodenum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 	u8 qn_numnodes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	u8 qn_namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 	u8 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 	u8 qn_domain[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 	struct dlm_node_info qn_nodes[O2NM_MAX_NODES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) struct dlm_exit_domain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	u8 pad1[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) struct dlm_finalize_reco
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 	u8 dead_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 	u8 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	__be32 pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) struct dlm_deref_lockres
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 	u32 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	u16 pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 	DLM_DEREF_RESPONSE_DONE = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	DLM_DEREF_RESPONSE_INPROG = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) struct dlm_deref_lockres_done {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	u32 pad1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 	u16 pad2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 	u8 node_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 	u8 namelen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	u8 name[O2NM_MAX_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) static inline enum dlm_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) __dlm_lockres_state_to_status(struct dlm_lock_resource *res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 	enum dlm_status status = DLM_NORMAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 	assert_spin_locked(&res->spinlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 	if (res->state & (DLM_LOCK_RES_RECOVERING|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 			DLM_LOCK_RES_RECOVERY_WAITING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 		status = DLM_RECOVERING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 	else if (res->state & DLM_LOCK_RES_MIGRATING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 		status = DLM_MIGRATING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 	else if (res->state & DLM_LOCK_RES_IN_PROGRESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 		status = DLM_FORWARD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 	return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) static inline u8 dlm_get_lock_cookie_node(u64 cookie)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	u8 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	cookie >>= 56;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	ret = (u8)(cookie & 0xffULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) static inline unsigned long long dlm_get_lock_cookie_seq(u64 cookie)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	unsigned long long ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	ret = ((unsigned long long)cookie) & 0x00ffffffffffffffULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 			       struct dlm_lockstatus *lksb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) void dlm_lock_get(struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) void dlm_lock_put(struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) void dlm_lock_attach_lockres(struct dlm_lock *lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 			     struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) int dlm_create_lock_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 			    void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 			     void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 			  void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) void dlm_revert_pending_convert(struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 				struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) void dlm_revert_pending_lock(struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 			     struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) int dlm_unlock_lock_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 			    void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) void dlm_commit_pending_cancel(struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 			       struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) void dlm_commit_pending_unlock(struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 			       struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) int dlm_launch_thread(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) void dlm_complete_thread(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) int dlm_launch_recovery_thread(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) void dlm_complete_recovery_thread(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) void dlm_wait_for_recovery(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) void dlm_kick_recovery_thread(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) int dlm_is_node_dead(struct dlm_ctxt *dlm, u8 node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) void dlm_wait_for_node_death(struct dlm_ctxt *dlm, u8 node, int timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) void dlm_wait_for_node_recovery(struct dlm_ctxt *dlm, u8 node, int timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) void dlm_put(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) struct dlm_ctxt *dlm_grab(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) int dlm_domain_fully_joined(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 			      struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) void dlm_lockres_calc_usage(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 			    struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) static inline void dlm_lockres_get(struct dlm_lock_resource *res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	/* This is called on every lookup, so it might be worth
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 	 * inlining. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 	kref_get(&res->refs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) void dlm_lockres_put(struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) void __dlm_unhash_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) void __dlm_insert_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) struct dlm_lock_resource * __dlm_lookup_lockres_full(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 						     const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 						     unsigned int len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 						     unsigned int hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 						const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 						unsigned int len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 						unsigned int hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 					      const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 					      unsigned int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) int dlm_is_host_down(int errno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 						 const char *lockid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 						 int namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 						 int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 					  const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 					  unsigned int namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) void dlm_lockres_set_refmap_bit(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 				struct dlm_lock_resource *res, int bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) void dlm_lockres_clear_refmap_bit(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 				  struct dlm_lock_resource *res, int bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) void dlm_lockres_drop_inflight_ref(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 				   struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 				   struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) void __dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 		struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) void dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) void dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) void __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) void dlm_do_local_ast(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 		      struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 		      struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) int dlm_do_remote_ast(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 		      struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 		      struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) void dlm_do_local_bast(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 		       struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 		       struct dlm_lock *lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 		       int blocked_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) int dlm_send_proxy_ast_msg(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 			   struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 			   struct dlm_lock *lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 			   int msg_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 			   int blocked_type, int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) static inline int dlm_send_proxy_bast(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 				      struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 				      struct dlm_lock *lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 				      int blocked_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 	return dlm_send_proxy_ast_msg(dlm, res, lock, DLM_BAST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 				      blocked_type, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) static inline int dlm_send_proxy_ast(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 				     struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 				     struct dlm_lock *lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 				     int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	return dlm_send_proxy_ast_msg(dlm, res, lock, DLM_AST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 				      0, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) void dlm_print_one_lock_resource(struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) void __dlm_print_one_lock_resource(struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) void dlm_hb_node_down_cb(struct o2nm_node *node, int idx, void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) void dlm_hb_node_up_cb(struct o2nm_node *node, int idx, void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) int dlm_finish_migration(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 			 struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 			 u8 old_master);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) void dlm_lockres_release_ast(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 			     struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) void __dlm_lockres_reserve_ast(struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 			       void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 			      void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) void dlm_assert_master_post_handler(int status, void *data, void *ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) int dlm_deref_lockres_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 			      void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) int dlm_deref_lockres_done_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 			      void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 				void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 			    void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) int dlm_master_requery_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 			       void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) int dlm_request_all_locks_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 				  void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) int dlm_reco_data_done_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 			       void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) int dlm_begin_reco_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 			   void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 			      void **ret_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) int dlm_do_master_requery(struct dlm_ctxt *dlm, struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 			  u8 nodenum, u8 *real_master);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) void __dlm_do_purge_lockres(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 		struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) int dlm_dispatch_assert_master(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 			       struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 			       int ignore_higher,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 			       u8 request_from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 			       u32 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) int dlm_send_one_lockres(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 			 struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 			 struct dlm_migratable_lockres *mres,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 			 u8 send_to,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 			 u8 flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 				       struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) /* will exit holding res->spinlock, but may drop in function */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) /* will exit holding res->spinlock, but may drop in function */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) static inline void __dlm_wait_on_lockres(struct dlm_lock_resource *res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	__dlm_wait_on_lockres_flags(res, (DLM_LOCK_RES_IN_PROGRESS|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 				    	  DLM_LOCK_RES_RECOVERING|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 					  DLM_LOCK_RES_RECOVERY_WAITING|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 					  DLM_LOCK_RES_MIGRATING));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) void __dlm_unlink_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) void __dlm_insert_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) /* create/destroy slab caches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) int dlm_init_master_caches(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) void dlm_destroy_master_caches(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) int dlm_init_lock_cache(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) void dlm_destroy_lock_cache(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) int dlm_init_mle_cache(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) void dlm_destroy_mle_cache(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) int dlm_drop_lockres_ref(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 			 struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) void dlm_clean_master_list(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 			   u8 dead_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) void dlm_force_free_mles(struct dlm_ctxt *dlm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) int __dlm_lockres_has_locks(struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) int __dlm_lockres_unused(struct dlm_lock_resource *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) static inline const char * dlm_lock_mode_name(int mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	switch (mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		case LKM_EXMODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 			return "EX";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 		case LKM_PRMODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 			return "PR";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 		case LKM_NLMODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 			return "NL";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	return "UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) static inline int dlm_lock_compatible(int existing, int request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 	/* NO_LOCK compatible with all */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	if (request == LKM_NLMODE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	    existing == LKM_NLMODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 	/* EX incompatible with all non-NO_LOCK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	if (request == LKM_EXMODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 	/* request must be PR, which is compatible with PR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	if (existing == LKM_PRMODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) static inline int dlm_lock_on_list(struct list_head *head,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 				   struct dlm_lock *lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 	struct dlm_lock *tmplock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 	list_for_each_entry(tmplock, head, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 		if (tmplock == lock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) static inline enum dlm_status dlm_err_to_dlm_status(int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	enum dlm_status ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 	if (err == -ENOMEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 		ret = DLM_SYSERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	else if (err == -ETIMEDOUT || o2net_link_down(err, NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 		ret = DLM_NOLOCKMGR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	else if (err == -EINVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 		ret = DLM_BADPARAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	else if (err == -ENAMETOOLONG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 		ret = DLM_IVBUFLEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 		ret = DLM_BADARGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) static inline void dlm_node_iter_init(unsigned long *map,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 				      struct dlm_node_iter *iter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	memcpy(iter->node_map, map, sizeof(iter->node_map));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	iter->curnode = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) static inline int dlm_node_iter_next(struct dlm_node_iter *iter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	int bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	bit = find_next_bit(iter->node_map, O2NM_MAX_NODES, iter->curnode+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 	if (bit >= O2NM_MAX_NODES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 		iter->curnode = O2NM_MAX_NODES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 		return -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	iter->curnode = bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	return bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) static inline void dlm_set_lockres_owner(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 					 struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 					 u8 owner)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 	assert_spin_locked(&res->spinlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	res->owner = owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) static inline void dlm_change_lockres_owner(struct dlm_ctxt *dlm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 					    struct dlm_lock_resource *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 					    u8 owner)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	assert_spin_locked(&res->spinlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	if (owner != res->owner)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 		dlm_set_lockres_owner(dlm, res, owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) #endif /* DLMCOMMON_H */