xref: /openbmc/linux/fs/ocfs2/dlm/dlmcommon.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1328970deSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2fa60ce2cSMasahiro Yamada /*
36714d8e8SKurt Hackel  * dlmcommon.h
46714d8e8SKurt Hackel  *
56714d8e8SKurt Hackel  * Copyright (C) 2004 Oracle.  All rights reserved.
66714d8e8SKurt Hackel  */
76714d8e8SKurt Hackel 
86714d8e8SKurt Hackel #ifndef DLMCOMMON_H
96714d8e8SKurt Hackel #define DLMCOMMON_H
106714d8e8SKurt Hackel 
116714d8e8SKurt Hackel #include <linux/kref.h>
126714d8e8SKurt Hackel 
136714d8e8SKurt Hackel #define DLM_HB_NODE_DOWN_PRI     (0xf000000)
146714d8e8SKurt Hackel #define DLM_HB_NODE_UP_PRI       (0x8000000)
156714d8e8SKurt Hackel 
166714d8e8SKurt Hackel #define DLM_LOCKID_NAME_MAX    32
176714d8e8SKurt Hackel 
186714d8e8SKurt Hackel #define DLM_LOCK_RES_OWNER_UNKNOWN     O2NM_MAX_NODES
196714d8e8SKurt Hackel 
200467ae95SSunil Mushran #define DLM_HASH_SIZE_DEFAULT	(1 << 17)
21c8f33b6eSJoel Becker #if DLM_HASH_SIZE_DEFAULT < PAGE_SIZE
22c8f33b6eSJoel Becker # define DLM_HASH_PAGES		1
23c8f33b6eSJoel Becker #else
24c8f33b6eSJoel Becker # define DLM_HASH_PAGES		(DLM_HASH_SIZE_DEFAULT / PAGE_SIZE)
25c8f33b6eSJoel Becker #endif
2603d864c0SDaniel Phillips #define DLM_BUCKETS_PER_PAGE	(PAGE_SIZE / sizeof(struct hlist_head))
2703d864c0SDaniel Phillips #define DLM_HASH_BUCKETS	(DLM_HASH_PAGES * DLM_BUCKETS_PER_PAGE)
286714d8e8SKurt Hackel 
29a3d33291SMark Fasheh /* Intended to make it easier for us to switch out hash functions */
308387ff25SLinus Torvalds #define dlm_lockid_hash(_n, _l) full_name_hash(NULL, _n, _l)
31a3d33291SMark Fasheh 
32751155a9SSunil Mushran enum dlm_mle_type {
33079ffb74SSunil Mushran 	DLM_MLE_BLOCK = 0,
34079ffb74SSunil Mushran 	DLM_MLE_MASTER = 1,
35079ffb74SSunil Mushran 	DLM_MLE_MIGRATION = 2,
36079ffb74SSunil Mushran 	DLM_MLE_NUM_TYPES = 3,
37751155a9SSunil Mushran };
38751155a9SSunil Mushran 
39751155a9SSunil Mushran struct dlm_master_list_entry {
402ed6c750SSunil Mushran 	struct hlist_node master_hash_node;
41751155a9SSunil Mushran 	struct list_head hb_events;
42751155a9SSunil Mushran 	struct dlm_ctxt *dlm;
43751155a9SSunil Mushran 	spinlock_t spinlock;
44751155a9SSunil Mushran 	wait_queue_head_t wq;
45751155a9SSunil Mushran 	atomic_t woken;
46751155a9SSunil Mushran 	struct kref mle_refs;
47751155a9SSunil Mushran 	int inuse;
48751155a9SSunil Mushran 	unsigned long maybe_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
49751155a9SSunil Mushran 	unsigned long vote_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
50751155a9SSunil Mushran 	unsigned long response_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
51751155a9SSunil Mushran 	unsigned long node_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
52751155a9SSunil Mushran 	u8 master;
53751155a9SSunil Mushran 	u8 new_master;
54751155a9SSunil Mushran 	enum dlm_mle_type type;
55751155a9SSunil Mushran 	struct o2hb_callback_func mle_hb_up;
56751155a9SSunil Mushran 	struct o2hb_callback_func mle_hb_down;
57f77a9a78SSunil Mushran 	struct dlm_lock_resource *mleres;
587141514bSSunil Mushran 	unsigned char mname[DLM_LOCKID_NAME_MAX];
597141514bSSunil Mushran 	unsigned int mnamelen;
607141514bSSunil Mushran 	unsigned int mnamehash;
61751155a9SSunil Mushran };
62751155a9SSunil Mushran 
636714d8e8SKurt Hackel enum dlm_ast_type {
646714d8e8SKurt Hackel 	DLM_AST = 0,
65079ffb74SSunil Mushran 	DLM_BAST = 1,
66079ffb74SSunil Mushran 	DLM_ASTUNLOCK = 2,
676714d8e8SKurt Hackel };
686714d8e8SKurt Hackel 
696714d8e8SKurt Hackel 
706714d8e8SKurt Hackel #define LKM_VALID_FLAGS (LKM_VALBLK | LKM_CONVERT | LKM_UNLOCK | \
716714d8e8SKurt Hackel 			 LKM_CANCEL | LKM_INVVALBLK | LKM_FORCE | \
726714d8e8SKurt Hackel 			 LKM_RECOVERY | LKM_LOCAL | LKM_NOQUEUE)
736714d8e8SKurt Hackel 
746714d8e8SKurt Hackel #define DLM_RECOVERY_LOCK_NAME       "$RECOVERY"
756714d8e8SKurt Hackel #define DLM_RECOVERY_LOCK_NAME_LEN   9
766714d8e8SKurt Hackel 
dlm_is_recovery_lock(const char * lock_name,int name_len)776714d8e8SKurt Hackel static inline int dlm_is_recovery_lock(const char *lock_name, int name_len)
786714d8e8SKurt Hackel {
796714d8e8SKurt Hackel 	if (name_len == DLM_RECOVERY_LOCK_NAME_LEN &&
806714d8e8SKurt Hackel 	    memcmp(lock_name, DLM_RECOVERY_LOCK_NAME, name_len)==0)
816714d8e8SKurt Hackel 		return 1;
826714d8e8SKurt Hackel 	return 0;
836714d8e8SKurt Hackel }
846714d8e8SKurt Hackel 
856714d8e8SKurt Hackel #define DLM_RECO_STATE_ACTIVE    0x0001
86466d1a45SKurt Hackel #define DLM_RECO_STATE_FINALIZE  0x0002
876714d8e8SKurt Hackel 
886714d8e8SKurt Hackel struct dlm_recovery_ctxt
896714d8e8SKurt Hackel {
906714d8e8SKurt Hackel 	struct list_head resources;
916714d8e8SKurt Hackel 	struct list_head node_data;
926714d8e8SKurt Hackel 	u8  new_master;
936714d8e8SKurt Hackel 	u8  dead_node;
946714d8e8SKurt Hackel 	u16 state;
956714d8e8SKurt Hackel 	unsigned long node_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
966714d8e8SKurt Hackel 	wait_queue_head_t event;
976714d8e8SKurt Hackel };
986714d8e8SKurt Hackel 
996714d8e8SKurt Hackel enum dlm_ctxt_state {
1006714d8e8SKurt Hackel 	DLM_CTXT_NEW = 0,
101079ffb74SSunil Mushran 	DLM_CTXT_JOINED = 1,
102079ffb74SSunil Mushran 	DLM_CTXT_IN_SHUTDOWN = 2,
103079ffb74SSunil Mushran 	DLM_CTXT_LEAVING = 3,
1046714d8e8SKurt Hackel };
1056714d8e8SKurt Hackel 
1066714d8e8SKurt Hackel struct dlm_ctxt
1076714d8e8SKurt Hackel {
1086714d8e8SKurt Hackel 	struct list_head list;
10903d864c0SDaniel Phillips 	struct hlist_head **lockres_hash;
1106714d8e8SKurt Hackel 	struct list_head dirty_list;
1116714d8e8SKurt Hackel 	struct list_head purge_list;
1126714d8e8SKurt Hackel 	struct list_head pending_asts;
1136714d8e8SKurt Hackel 	struct list_head pending_basts;
11429576f8bSSunil Mushran 	struct list_head tracking_list;
1156714d8e8SKurt Hackel 	unsigned int purge_count;
1166714d8e8SKurt Hackel 	spinlock_t spinlock;
1176714d8e8SKurt Hackel 	spinlock_t ast_lock;
118b0d4f817SSunil Mushran 	spinlock_t track_lock;
1196714d8e8SKurt Hackel 	char *name;
1206714d8e8SKurt Hackel 	u8 node_num;
1216714d8e8SKurt Hackel 	u32 key;
1226714d8e8SKurt Hackel 	u8  joining_node;
12360c7ec9eSpiaojun 	u8 migrate_done; /* set to 1 means node has migrated all lock resources */
1246714d8e8SKurt Hackel 	wait_queue_head_t dlm_join_events;
1256714d8e8SKurt Hackel 	unsigned long live_nodes_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
1266714d8e8SKurt Hackel 	unsigned long domain_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
127bddefdeeSSunil Mushran 	unsigned long exit_domain_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
1286714d8e8SKurt Hackel 	unsigned long recovery_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
1296714d8e8SKurt Hackel 	struct dlm_recovery_ctxt reco;
1306714d8e8SKurt Hackel 	spinlock_t master_lock;
131e2b66ddcSSunil Mushran 	struct hlist_head **master_hash;
1326714d8e8SKurt Hackel 	struct list_head mle_hb_events;
1336714d8e8SKurt Hackel 
1346714d8e8SKurt Hackel 	/* these give a really vague idea of the system load */
1352041d8fdSSunil Mushran 	atomic_t mle_tot_count[DLM_MLE_NUM_TYPES];
1362041d8fdSSunil Mushran 	atomic_t mle_cur_count[DLM_MLE_NUM_TYPES];
1376800791aSSunil Mushran 	atomic_t res_tot_count;
1386800791aSSunil Mushran 	atomic_t res_cur_count;
1396714d8e8SKurt Hackel 
1406325b4a2SSunil Mushran 	struct dentry *dlm_debugfs_subroot;
1416325b4a2SSunil Mushran 
1426714d8e8SKurt Hackel 	/* NOTE: Next three are protected by dlm_domain_lock */
1436714d8e8SKurt Hackel 	struct kref dlm_refs;
1446714d8e8SKurt Hackel 	enum dlm_ctxt_state dlm_state;
1456714d8e8SKurt Hackel 	unsigned int num_joins;
1466714d8e8SKurt Hackel 
1476714d8e8SKurt Hackel 	struct o2hb_callback_func dlm_hb_up;
1486714d8e8SKurt Hackel 	struct o2hb_callback_func dlm_hb_down;
1496714d8e8SKurt Hackel 	struct task_struct *dlm_thread_task;
1506714d8e8SKurt Hackel 	struct task_struct *dlm_reco_thread_task;
1513156d267SKurt Hackel 	struct workqueue_struct *dlm_worker;
1526714d8e8SKurt Hackel 	wait_queue_head_t dlm_thread_wq;
1536714d8e8SKurt Hackel 	wait_queue_head_t dlm_reco_thread_wq;
1546714d8e8SKurt Hackel 	wait_queue_head_t ast_wq;
1556714d8e8SKurt Hackel 	wait_queue_head_t migration_wq;
1566714d8e8SKurt Hackel 
1576714d8e8SKurt Hackel 	struct work_struct dispatched_work;
1586714d8e8SKurt Hackel 	struct list_head work_list;
1596714d8e8SKurt Hackel 	spinlock_t work_lock;
1606714d8e8SKurt Hackel 	struct list_head dlm_domain_handlers;
1616714d8e8SKurt Hackel 	struct list_head	dlm_eviction_callbacks;
162d24fbcdaSJoel Becker 
163d24fbcdaSJoel Becker 	/* The filesystem specifies this at domain registration.  We
164d24fbcdaSJoel Becker 	 * cache it here to know what to tell other nodes. */
165d24fbcdaSJoel Becker 	struct dlm_protocol_version fs_locking_proto;
166d24fbcdaSJoel Becker 	/* This is the inter-dlm communication version */
167d24fbcdaSJoel Becker 	struct dlm_protocol_version dlm_locking_proto;
1686714d8e8SKurt Hackel };
1696714d8e8SKurt Hackel 
dlm_lockres_hash(struct dlm_ctxt * dlm,unsigned i)17003d864c0SDaniel Phillips static inline struct hlist_head *dlm_lockres_hash(struct dlm_ctxt *dlm, unsigned i)
17103d864c0SDaniel Phillips {
17203d864c0SDaniel Phillips 	return dlm->lockres_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] + (i % DLM_BUCKETS_PER_PAGE);
17303d864c0SDaniel Phillips }
17403d864c0SDaniel Phillips 
dlm_master_hash(struct dlm_ctxt * dlm,unsigned i)175e2b66ddcSSunil Mushran static inline struct hlist_head *dlm_master_hash(struct dlm_ctxt *dlm,
176e2b66ddcSSunil Mushran 						 unsigned i)
177e2b66ddcSSunil Mushran {
178e2b66ddcSSunil Mushran 	return dlm->master_hash[(i / DLM_BUCKETS_PER_PAGE) % DLM_HASH_PAGES] +
179e2b66ddcSSunil Mushran 			(i % DLM_BUCKETS_PER_PAGE);
180e2b66ddcSSunil Mushran }
181e2b66ddcSSunil Mushran 
1826714d8e8SKurt Hackel /* these keventd work queue items are for less-frequently
1836714d8e8SKurt Hackel  * called functions that cannot be directly called from the
1846714d8e8SKurt Hackel  * net message handlers for some reason, usually because
1856714d8e8SKurt Hackel  * they need to send net messages of their own. */
186c4028958SDavid Howells void dlm_dispatch_work(struct work_struct *work);
1876714d8e8SKurt Hackel 
1886714d8e8SKurt Hackel struct dlm_lock_resource;
1896714d8e8SKurt Hackel struct dlm_work_item;
1906714d8e8SKurt Hackel 
1916714d8e8SKurt Hackel typedef void (dlm_workfunc_t)(struct dlm_work_item *, void *);
1926714d8e8SKurt Hackel 
1936714d8e8SKurt Hackel struct dlm_request_all_locks_priv
1946714d8e8SKurt Hackel {
1956714d8e8SKurt Hackel 	u8 reco_master;
1966714d8e8SKurt Hackel 	u8 dead_node;
1976714d8e8SKurt Hackel };
1986714d8e8SKurt Hackel 
1996714d8e8SKurt Hackel struct dlm_mig_lockres_priv
2006714d8e8SKurt Hackel {
2016714d8e8SKurt Hackel 	struct dlm_lock_resource *lockres;
2026714d8e8SKurt Hackel 	u8 real_master;
20352987e2aSSunil Mushran 	u8 extra_ref;
2046714d8e8SKurt Hackel };
2056714d8e8SKurt Hackel 
2066714d8e8SKurt Hackel struct dlm_assert_master_priv
2076714d8e8SKurt Hackel {
2086714d8e8SKurt Hackel 	struct dlm_lock_resource *lockres;
2096714d8e8SKurt Hackel 	u8 request_from;
2106714d8e8SKurt Hackel 	u32 flags;
2116714d8e8SKurt Hackel 	unsigned ignore_higher:1;
2126714d8e8SKurt Hackel };
2136714d8e8SKurt Hackel 
214f3f85464SSunil Mushran struct dlm_deref_lockres_priv
215f3f85464SSunil Mushran {
216f3f85464SSunil Mushran 	struct dlm_lock_resource *deref_res;
217f3f85464SSunil Mushran 	u8 deref_node;
218f3f85464SSunil Mushran };
2196714d8e8SKurt Hackel 
2206714d8e8SKurt Hackel struct dlm_work_item
2216714d8e8SKurt Hackel {
2226714d8e8SKurt Hackel 	struct list_head list;
2236714d8e8SKurt Hackel 	dlm_workfunc_t *func;
2246714d8e8SKurt Hackel 	struct dlm_ctxt *dlm;
2256714d8e8SKurt Hackel 	void *data;
2266714d8e8SKurt Hackel 	union {
2276714d8e8SKurt Hackel 		struct dlm_request_all_locks_priv ral;
2286714d8e8SKurt Hackel 		struct dlm_mig_lockres_priv ml;
2296714d8e8SKurt Hackel 		struct dlm_assert_master_priv am;
230f3f85464SSunil Mushran 		struct dlm_deref_lockres_priv dl;
2316714d8e8SKurt Hackel 	} u;
2326714d8e8SKurt Hackel };
2336714d8e8SKurt Hackel 
dlm_init_work_item(struct dlm_ctxt * dlm,struct dlm_work_item * i,dlm_workfunc_t * f,void * data)2346714d8e8SKurt Hackel static inline void dlm_init_work_item(struct dlm_ctxt *dlm,
2356714d8e8SKurt Hackel 				      struct dlm_work_item *i,
2366714d8e8SKurt Hackel 				      dlm_workfunc_t *f, void *data)
2376714d8e8SKurt Hackel {
2386714d8e8SKurt Hackel 	memset(i, 0, sizeof(*i));
2396714d8e8SKurt Hackel 	i->func = f;
2406714d8e8SKurt Hackel 	INIT_LIST_HEAD(&i->list);
2416714d8e8SKurt Hackel 	i->data = data;
2426714d8e8SKurt Hackel 	i->dlm = dlm;  /* must have already done a dlm_grab on this! */
2436714d8e8SKurt Hackel }
2446714d8e8SKurt Hackel 
2456714d8e8SKurt Hackel 
2466714d8e8SKurt Hackel 
__dlm_set_joining_node(struct dlm_ctxt * dlm,u8 node)2476714d8e8SKurt Hackel static inline void __dlm_set_joining_node(struct dlm_ctxt *dlm,
2486714d8e8SKurt Hackel 					  u8 node)
2496714d8e8SKurt Hackel {
2506714d8e8SKurt Hackel 	assert_spin_locked(&dlm->spinlock);
2516714d8e8SKurt Hackel 
2526714d8e8SKurt Hackel 	dlm->joining_node = node;
2536714d8e8SKurt Hackel 	wake_up(&dlm->dlm_join_events);
2546714d8e8SKurt Hackel }
2556714d8e8SKurt Hackel 
2566714d8e8SKurt Hackel #define DLM_LOCK_RES_UNINITED             0x00000001
2576714d8e8SKurt Hackel #define DLM_LOCK_RES_RECOVERING           0x00000002
2586714d8e8SKurt Hackel #define DLM_LOCK_RES_READY                0x00000004
2596714d8e8SKurt Hackel #define DLM_LOCK_RES_DIRTY                0x00000008
2606714d8e8SKurt Hackel #define DLM_LOCK_RES_IN_PROGRESS          0x00000010
2616714d8e8SKurt Hackel #define DLM_LOCK_RES_MIGRATING            0x00000020
262ba2bf218SKurt Hackel #define DLM_LOCK_RES_DROPPING_REF         0x00000040
263ddc09c8dSKurt Hackel #define DLM_LOCK_RES_BLOCK_DIRTY          0x00001000
2643b8118cfSKurt Hackel #define DLM_LOCK_RES_SETREF_INPROG        0x00002000
265814ce694SJiufei Xue #define DLM_LOCK_RES_RECOVERY_WAITING     0x00004000
2666714d8e8SKurt Hackel 
26744465a7dSKurt Hackel /* max milliseconds to wait to sync up a network failure with a node death */
26844465a7dSKurt Hackel #define DLM_NODE_DEATH_WAIT_MAX (5 * 1000)
26944465a7dSKurt Hackel 
2706714d8e8SKurt Hackel #define DLM_PURGE_INTERVAL_MS   (8 * 1000)
2716714d8e8SKurt Hackel 
2726714d8e8SKurt Hackel struct dlm_lock_resource
2736714d8e8SKurt Hackel {
2746714d8e8SKurt Hackel 	/* WARNING: Please see the comment in dlm_init_lockres before
2756714d8e8SKurt Hackel 	 * adding fields here. */
27681f2094aSMark Fasheh 	struct hlist_node hash_node;
27765c491d8SMark Fasheh 	struct qstr lockname;
2786714d8e8SKurt Hackel 	struct kref      refs;
2796714d8e8SKurt Hackel 
2806ff06a93SKurt Hackel 	/*
2816ff06a93SKurt Hackel 	 * Please keep granted, converting, and blocked in this order,
2826ff06a93SKurt Hackel 	 * as some funcs want to iterate over all lists.
2836ff06a93SKurt Hackel 	 *
2846ff06a93SKurt Hackel 	 * All four lists are protected by the hash's reference.
2856ff06a93SKurt Hackel 	 */
2866714d8e8SKurt Hackel 	struct list_head granted;
2876714d8e8SKurt Hackel 	struct list_head converting;
2886714d8e8SKurt Hackel 	struct list_head blocked;
2896ff06a93SKurt Hackel 	struct list_head purge;
2906714d8e8SKurt Hackel 
2916ff06a93SKurt Hackel 	/*
2926ff06a93SKurt Hackel 	 * These two lists require you to hold an additional reference
2936ff06a93SKurt Hackel 	 * while they are on the list.
2946ff06a93SKurt Hackel 	 */
2956714d8e8SKurt Hackel 	struct list_head dirty;
2966714d8e8SKurt Hackel 	struct list_head recovering; // dlm_recovery_ctxt.resources list
2976714d8e8SKurt Hackel 
29829576f8bSSunil Mushran 	/* Added during init and removed during release */
29929576f8bSSunil Mushran 	struct list_head tracking;	/* dlm->tracking_list */
30029576f8bSSunil Mushran 
3016714d8e8SKurt Hackel 	/* unused lock resources have their last_used stamped and are
3026714d8e8SKurt Hackel 	 * put on a list for the dlm thread to run. */
3036714d8e8SKurt Hackel 	unsigned long    last_used;
3046714d8e8SKurt Hackel 
305b0d4f817SSunil Mushran 	struct dlm_ctxt *dlm;
306b0d4f817SSunil Mushran 
3076714d8e8SKurt Hackel 	unsigned migration_pending:1;
3086714d8e8SKurt Hackel 	atomic_t asts_reserved;
3096714d8e8SKurt Hackel 	spinlock_t spinlock;
3106714d8e8SKurt Hackel 	wait_queue_head_t wq;
3116714d8e8SKurt Hackel 	u8  owner;              //node which owns the lock resource, or unknown
3126714d8e8SKurt Hackel 	u16 state;
3136714d8e8SKurt Hackel 	char lvb[DLM_LVB_LEN];
314ba2bf218SKurt Hackel 	unsigned int inflight_locks;
315ac4fef4dSXue jiufei 	unsigned int inflight_assert_workers;
316ba2bf218SKurt Hackel 	unsigned long refmap[BITS_TO_LONGS(O2NM_MAX_NODES)];
3176714d8e8SKurt Hackel };
3186714d8e8SKurt Hackel 
3196714d8e8SKurt Hackel struct dlm_migratable_lock
3206714d8e8SKurt Hackel {
3216714d8e8SKurt Hackel 	__be64 cookie;
3226714d8e8SKurt Hackel 
3236714d8e8SKurt Hackel 	/* these 3 are just padding for the in-memory structure, but
3246714d8e8SKurt Hackel 	 * list and flags are actually used when sent over the wire */
3256714d8e8SKurt Hackel 	__be16 pad1;
3266714d8e8SKurt Hackel 	u8 list;  // 0=granted, 1=converting, 2=blocked
3276714d8e8SKurt Hackel 	u8 flags;
3286714d8e8SKurt Hackel 
3296714d8e8SKurt Hackel 	s8 type;
3306714d8e8SKurt Hackel 	s8 convert_type;
3316714d8e8SKurt Hackel 	s8 highest_blocked;
3326714d8e8SKurt Hackel 	u8 node;
3336714d8e8SKurt Hackel };  // 16 bytes
3346714d8e8SKurt Hackel 
3356714d8e8SKurt Hackel struct dlm_lock
3366714d8e8SKurt Hackel {
3376714d8e8SKurt Hackel 	struct dlm_migratable_lock ml;
3386714d8e8SKurt Hackel 
3396714d8e8SKurt Hackel 	struct list_head list;
3406714d8e8SKurt Hackel 	struct list_head ast_list;
3416714d8e8SKurt Hackel 	struct list_head bast_list;
3426714d8e8SKurt Hackel 	struct dlm_lock_resource *lockres;
3436714d8e8SKurt Hackel 	spinlock_t spinlock;
3446714d8e8SKurt Hackel 	struct kref lock_refs;
3456714d8e8SKurt Hackel 
3466714d8e8SKurt Hackel 	// ast and bast must be callable while holding a spinlock!
3476714d8e8SKurt Hackel 	dlm_astlockfunc_t *ast;
3486714d8e8SKurt Hackel 	dlm_bastlockfunc_t *bast;
3496714d8e8SKurt Hackel 	void *astdata;
3506714d8e8SKurt Hackel 	struct dlm_lockstatus *lksb;
3516714d8e8SKurt Hackel 	unsigned ast_pending:1,
3526714d8e8SKurt Hackel 		 bast_pending:1,
3536714d8e8SKurt Hackel 		 convert_pending:1,
3546714d8e8SKurt Hackel 		 lock_pending:1,
3556714d8e8SKurt Hackel 		 cancel_pending:1,
3566714d8e8SKurt Hackel 		 unlock_pending:1,
3576714d8e8SKurt Hackel 		 lksb_kernel_allocated:1;
3586714d8e8SKurt Hackel };
3596714d8e8SKurt Hackel 
3606714d8e8SKurt Hackel enum dlm_lockres_list {
3616714d8e8SKurt Hackel 	DLM_GRANTED_LIST = 0,
362079ffb74SSunil Mushran 	DLM_CONVERTING_LIST = 1,
363079ffb74SSunil Mushran 	DLM_BLOCKED_LIST = 2,
3646714d8e8SKurt Hackel };
3656714d8e8SKurt Hackel 
dlm_lvb_is_empty(char * lvb)3668bc674cbSKurt Hackel static inline int dlm_lvb_is_empty(char *lvb)
3678bc674cbSKurt Hackel {
3688bc674cbSKurt Hackel 	int i;
3698bc674cbSKurt Hackel 	for (i=0; i<DLM_LVB_LEN; i++)
3708bc674cbSKurt Hackel 		if (lvb[i])
3718bc674cbSKurt Hackel 			return 0;
3728bc674cbSKurt Hackel 	return 1;
3738bc674cbSKurt Hackel }
3748bc674cbSKurt Hackel 
dlm_list_in_text(enum dlm_lockres_list idx)3759f62e960SSunil Mushran static inline char *dlm_list_in_text(enum dlm_lockres_list idx)
3769f62e960SSunil Mushran {
3779f62e960SSunil Mushran 	if (idx == DLM_GRANTED_LIST)
3789f62e960SSunil Mushran 		return "granted";
3799f62e960SSunil Mushran 	else if (idx == DLM_CONVERTING_LIST)
3809f62e960SSunil Mushran 		return "converting";
3819f62e960SSunil Mushran 	else if (idx == DLM_BLOCKED_LIST)
3829f62e960SSunil Mushran 		return "blocked";
3839f62e960SSunil Mushran 	else
3849f62e960SSunil Mushran 		return "unknown";
3859f62e960SSunil Mushran }
3869f62e960SSunil Mushran 
3876714d8e8SKurt Hackel static inline struct list_head *
dlm_list_idx_to_ptr(struct dlm_lock_resource * res,enum dlm_lockres_list idx)3886714d8e8SKurt Hackel dlm_list_idx_to_ptr(struct dlm_lock_resource *res, enum dlm_lockres_list idx)
3896714d8e8SKurt Hackel {
3906714d8e8SKurt Hackel 	struct list_head *ret = NULL;
3916714d8e8SKurt Hackel 	if (idx == DLM_GRANTED_LIST)
3926714d8e8SKurt Hackel 		ret = &res->granted;
3936714d8e8SKurt Hackel 	else if (idx == DLM_CONVERTING_LIST)
3946714d8e8SKurt Hackel 		ret = &res->converting;
3956714d8e8SKurt Hackel 	else if (idx == DLM_BLOCKED_LIST)
3966714d8e8SKurt Hackel 		ret = &res->blocked;
3976714d8e8SKurt Hackel 	else
3986714d8e8SKurt Hackel 		BUG();
3996714d8e8SKurt Hackel 	return ret;
4006714d8e8SKurt Hackel }
4016714d8e8SKurt Hackel 
4026714d8e8SKurt Hackel 
4036714d8e8SKurt Hackel 
4046714d8e8SKurt Hackel 
4056714d8e8SKurt Hackel struct dlm_node_iter
4066714d8e8SKurt Hackel {
4076714d8e8SKurt Hackel 	unsigned long node_map[BITS_TO_LONGS(O2NM_MAX_NODES)];
4086714d8e8SKurt Hackel 	int curnode;
4096714d8e8SKurt Hackel };
4106714d8e8SKurt Hackel 
4116714d8e8SKurt Hackel 
4126714d8e8SKurt Hackel enum {
4136714d8e8SKurt Hackel 	DLM_MASTER_REQUEST_MSG		= 500,
414079ffb74SSunil Mushran 	DLM_UNUSED_MSG1			= 501,
415079ffb74SSunil Mushran 	DLM_ASSERT_MASTER_MSG		= 502,
416079ffb74SSunil Mushran 	DLM_CREATE_LOCK_MSG		= 503,
417079ffb74SSunil Mushran 	DLM_CONVERT_LOCK_MSG		= 504,
418079ffb74SSunil Mushran 	DLM_PROXY_AST_MSG		= 505,
419079ffb74SSunil Mushran 	DLM_UNLOCK_LOCK_MSG		= 506,
420079ffb74SSunil Mushran 	DLM_DEREF_LOCKRES_MSG		= 507,
421079ffb74SSunil Mushran 	DLM_MIGRATE_REQUEST_MSG		= 508,
422079ffb74SSunil Mushran 	DLM_MIG_LOCKRES_MSG		= 509,
423079ffb74SSunil Mushran 	DLM_QUERY_JOIN_MSG		= 510,
424079ffb74SSunil Mushran 	DLM_ASSERT_JOINED_MSG		= 511,
425079ffb74SSunil Mushran 	DLM_CANCEL_JOIN_MSG		= 512,
426079ffb74SSunil Mushran 	DLM_EXIT_DOMAIN_MSG		= 513,
427079ffb74SSunil Mushran 	DLM_MASTER_REQUERY_MSG		= 514,
428079ffb74SSunil Mushran 	DLM_LOCK_REQUEST_MSG		= 515,
429079ffb74SSunil Mushran 	DLM_RECO_DATA_DONE_MSG		= 516,
430079ffb74SSunil Mushran 	DLM_BEGIN_RECO_MSG		= 517,
431079ffb74SSunil Mushran 	DLM_FINALIZE_RECO_MSG		= 518,
432079ffb74SSunil Mushran 	DLM_QUERY_REGION		= 519,
433079ffb74SSunil Mushran 	DLM_QUERY_NODEINFO		= 520,
434bddefdeeSSunil Mushran 	DLM_BEGIN_EXIT_DOMAIN_MSG	= 521,
43560d663cbSxuejiufei 	DLM_DEREF_LOCKRES_DONE		= 522,
4366714d8e8SKurt Hackel };
4376714d8e8SKurt Hackel 
4386714d8e8SKurt Hackel struct dlm_reco_node_data
4396714d8e8SKurt Hackel {
4406714d8e8SKurt Hackel 	int state;
4416714d8e8SKurt Hackel 	u8 node_num;
4426714d8e8SKurt Hackel 	struct list_head list;
4436714d8e8SKurt Hackel };
4446714d8e8SKurt Hackel 
4456714d8e8SKurt Hackel enum {
4466714d8e8SKurt Hackel 	DLM_RECO_NODE_DATA_DEAD = -1,
4476714d8e8SKurt Hackel 	DLM_RECO_NODE_DATA_INIT = 0,
448079ffb74SSunil Mushran 	DLM_RECO_NODE_DATA_REQUESTING = 1,
449079ffb74SSunil Mushran 	DLM_RECO_NODE_DATA_REQUESTED = 2,
450079ffb74SSunil Mushran 	DLM_RECO_NODE_DATA_RECEIVING = 3,
451079ffb74SSunil Mushran 	DLM_RECO_NODE_DATA_DONE = 4,
452079ffb74SSunil Mushran 	DLM_RECO_NODE_DATA_FINALIZE_SENT = 5,
4536714d8e8SKurt Hackel };
4546714d8e8SKurt Hackel 
4556714d8e8SKurt Hackel 
4566714d8e8SKurt Hackel enum {
4576714d8e8SKurt Hackel 	DLM_MASTER_RESP_NO = 0,
458079ffb74SSunil Mushran 	DLM_MASTER_RESP_YES = 1,
459079ffb74SSunil Mushran 	DLM_MASTER_RESP_MAYBE = 2,
460079ffb74SSunil Mushran 	DLM_MASTER_RESP_ERROR = 3,
4616714d8e8SKurt Hackel };
4626714d8e8SKurt Hackel 
4636714d8e8SKurt Hackel 
4646714d8e8SKurt Hackel struct dlm_master_request
4656714d8e8SKurt Hackel {
4666714d8e8SKurt Hackel 	u8 node_idx;
4676714d8e8SKurt Hackel 	u8 namelen;
4686714d8e8SKurt Hackel 	__be16 pad1;
4696714d8e8SKurt Hackel 	__be32 flags;
4706714d8e8SKurt Hackel 
4716714d8e8SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
4726714d8e8SKurt Hackel };
4736714d8e8SKurt Hackel 
474ba2bf218SKurt Hackel #define DLM_ASSERT_RESPONSE_REASSERT       0x00000001
475ba2bf218SKurt Hackel #define DLM_ASSERT_RESPONSE_MASTERY_REF    0x00000002
476ba2bf218SKurt Hackel 
4776714d8e8SKurt Hackel #define DLM_ASSERT_MASTER_MLE_CLEANUP      0x00000001
4786714d8e8SKurt Hackel #define DLM_ASSERT_MASTER_REQUERY          0x00000002
4796714d8e8SKurt Hackel #define DLM_ASSERT_MASTER_FINISH_MIGRATION 0x00000004
4806714d8e8SKurt Hackel struct dlm_assert_master
4816714d8e8SKurt Hackel {
4826714d8e8SKurt Hackel 	u8 node_idx;
4836714d8e8SKurt Hackel 	u8 namelen;
4846714d8e8SKurt Hackel 	__be16 pad1;
4856714d8e8SKurt Hackel 	__be32 flags;
4866714d8e8SKurt Hackel 
4876714d8e8SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
4886714d8e8SKurt Hackel };
4896714d8e8SKurt Hackel 
490ba2bf218SKurt Hackel #define DLM_MIGRATE_RESPONSE_MASTERY_REF   0x00000001
491ba2bf218SKurt Hackel 
4926714d8e8SKurt Hackel struct dlm_migrate_request
4936714d8e8SKurt Hackel {
4946714d8e8SKurt Hackel 	u8 master;
4956714d8e8SKurt Hackel 	u8 new_master;
4966714d8e8SKurt Hackel 	u8 namelen;
4976714d8e8SKurt Hackel 	u8 pad1;
4986714d8e8SKurt Hackel 	__be32 pad2;
4996714d8e8SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
5006714d8e8SKurt Hackel };
5016714d8e8SKurt Hackel 
5026714d8e8SKurt Hackel struct dlm_master_requery
5036714d8e8SKurt Hackel {
5046714d8e8SKurt Hackel 	u8 pad1;
5056714d8e8SKurt Hackel 	u8 pad2;
5066714d8e8SKurt Hackel 	u8 node_idx;
5076714d8e8SKurt Hackel 	u8 namelen;
5086714d8e8SKurt Hackel 	__be32 pad3;
5096714d8e8SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
5106714d8e8SKurt Hackel };
5116714d8e8SKurt Hackel 
5126714d8e8SKurt Hackel #define DLM_MRES_RECOVERY   0x01
5136714d8e8SKurt Hackel #define DLM_MRES_MIGRATION  0x02
5146714d8e8SKurt Hackel #define DLM_MRES_ALL_DONE   0x04
5156714d8e8SKurt Hackel 
5166714d8e8SKurt Hackel /*
5176714d8e8SKurt Hackel  * We would like to get one whole lockres into a single network
5186714d8e8SKurt Hackel  * message whenever possible.  Generally speaking, there will be
5196714d8e8SKurt Hackel  * at most one dlm_lock on a lockres for each node in the cluster,
5206714d8e8SKurt Hackel  * plus (infrequently) any additional locks coming in from userdlm.
5216714d8e8SKurt Hackel  *
5226714d8e8SKurt Hackel  * struct _dlm_lockres_page
5236714d8e8SKurt Hackel  * {
5246714d8e8SKurt Hackel  * 	dlm_migratable_lockres mres;
5256714d8e8SKurt Hackel  * 	dlm_migratable_lock ml[DLM_MAX_MIGRATABLE_LOCKS];
5266714d8e8SKurt Hackel  * 	u8 pad[DLM_MIG_LOCKRES_RESERVED];
5276714d8e8SKurt Hackel  * };
5286714d8e8SKurt Hackel  *
5296714d8e8SKurt Hackel  * from ../cluster/tcp.h
53039b29af0SJoseph Qi  *    O2NET_MAX_PAYLOAD_BYTES  (4096 - sizeof(net_msg))
5316714d8e8SKurt Hackel  *    (roughly 4080 bytes)
5326714d8e8SKurt Hackel  * and sizeof(dlm_migratable_lockres) = 112 bytes
5336714d8e8SKurt Hackel  * and sizeof(dlm_migratable_lock) = 16 bytes
5346714d8e8SKurt Hackel  *
5356714d8e8SKurt Hackel  * Choosing DLM_MAX_MIGRATABLE_LOCKS=240 and
5366714d8e8SKurt Hackel  * DLM_MIG_LOCKRES_RESERVED=128 means we have this:
5376714d8e8SKurt Hackel  *
5386714d8e8SKurt Hackel  *  (DLM_MAX_MIGRATABLE_LOCKS * sizeof(dlm_migratable_lock)) +
5396714d8e8SKurt Hackel  *     sizeof(dlm_migratable_lockres) + DLM_MIG_LOCKRES_RESERVED =
5406714d8e8SKurt Hackel  *        NET_MAX_PAYLOAD_BYTES
5416714d8e8SKurt Hackel  *  (240 * 16) + 112 + 128 = 4080
5426714d8e8SKurt Hackel  *
5436714d8e8SKurt Hackel  * So a lockres would need more than 240 locks before it would
5446714d8e8SKurt Hackel  * use more than one network packet to recover.  Not too bad.
5456714d8e8SKurt Hackel  */
5466714d8e8SKurt Hackel #define DLM_MAX_MIGRATABLE_LOCKS   240
5476714d8e8SKurt Hackel 
5486714d8e8SKurt Hackel struct dlm_migratable_lockres
5496714d8e8SKurt Hackel {
5506714d8e8SKurt Hackel 	u8 master;
5516714d8e8SKurt Hackel 	u8 lockname_len;
5526714d8e8SKurt Hackel 	u8 num_locks;    // locks sent in this structure
5536714d8e8SKurt Hackel 	u8 flags;
5546714d8e8SKurt Hackel 	__be32 total_locks; // locks to be sent for this migration cookie
5556714d8e8SKurt Hackel 	__be64 mig_cookie;  // cookie for this lockres migration
5566714d8e8SKurt Hackel 			 // or zero if not needed
5576714d8e8SKurt Hackel 	// 16 bytes
5586714d8e8SKurt Hackel 	u8 lockname[DLM_LOCKID_NAME_MAX];
5596714d8e8SKurt Hackel 	// 48 bytes
5606714d8e8SKurt Hackel 	u8 lvb[DLM_LVB_LEN];
5616714d8e8SKurt Hackel 	// 112 bytes
5628cb92435SGustavo A. R. Silva 	struct dlm_migratable_lock ml[];  // 16 bytes each, begins at byte 112
5636714d8e8SKurt Hackel };
5646714d8e8SKurt Hackel #define DLM_MIG_LOCKRES_MAX_LEN  \
5656714d8e8SKurt Hackel 	(sizeof(struct dlm_migratable_lockres) + \
5666714d8e8SKurt Hackel 	 (sizeof(struct dlm_migratable_lock) * \
5676714d8e8SKurt Hackel 	  DLM_MAX_MIGRATABLE_LOCKS) )
5686714d8e8SKurt Hackel 
5696714d8e8SKurt Hackel /* from above, 128 bytes
5706714d8e8SKurt Hackel  * for some undetermined future use */
57139b29af0SJoseph Qi #define DLM_MIG_LOCKRES_RESERVED   (O2NET_MAX_PAYLOAD_BYTES - \
5726714d8e8SKurt Hackel 				    DLM_MIG_LOCKRES_MAX_LEN)
5736714d8e8SKurt Hackel 
5746714d8e8SKurt Hackel struct dlm_create_lock
5756714d8e8SKurt Hackel {
5766714d8e8SKurt Hackel 	__be64 cookie;
5776714d8e8SKurt Hackel 
5786714d8e8SKurt Hackel 	__be32 flags;
5796714d8e8SKurt Hackel 	u8 pad1;
5806714d8e8SKurt Hackel 	u8 node_idx;
5816714d8e8SKurt Hackel 	s8 requested_type;
5826714d8e8SKurt Hackel 	u8 namelen;
5836714d8e8SKurt Hackel 
5846714d8e8SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
5856714d8e8SKurt Hackel };
5866714d8e8SKurt Hackel 
5876714d8e8SKurt Hackel struct dlm_convert_lock
5886714d8e8SKurt Hackel {
5896714d8e8SKurt Hackel 	__be64 cookie;
5906714d8e8SKurt Hackel 
5916714d8e8SKurt Hackel 	__be32 flags;
5926714d8e8SKurt Hackel 	u8 pad1;
5936714d8e8SKurt Hackel 	u8 node_idx;
5946714d8e8SKurt Hackel 	s8 requested_type;
5956714d8e8SKurt Hackel 	u8 namelen;
5966714d8e8SKurt Hackel 
5976714d8e8SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
5986714d8e8SKurt Hackel 
5998cb92435SGustavo A. R. Silva 	s8 lvb[];
6006714d8e8SKurt Hackel };
6016714d8e8SKurt Hackel #define DLM_CONVERT_LOCK_MAX_LEN  (sizeof(struct dlm_convert_lock)+DLM_LVB_LEN)
6026714d8e8SKurt Hackel 
6036714d8e8SKurt Hackel struct dlm_unlock_lock
6046714d8e8SKurt Hackel {
6056714d8e8SKurt Hackel 	__be64 cookie;
6066714d8e8SKurt Hackel 
6076714d8e8SKurt Hackel 	__be32 flags;
6086714d8e8SKurt Hackel 	__be16 pad1;
6096714d8e8SKurt Hackel 	u8 node_idx;
6106714d8e8SKurt Hackel 	u8 namelen;
6116714d8e8SKurt Hackel 
6126714d8e8SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
6136714d8e8SKurt Hackel 
6148cb92435SGustavo A. R. Silva 	s8 lvb[];
6156714d8e8SKurt Hackel };
6166714d8e8SKurt Hackel #define DLM_UNLOCK_LOCK_MAX_LEN  (sizeof(struct dlm_unlock_lock)+DLM_LVB_LEN)
6176714d8e8SKurt Hackel 
6186714d8e8SKurt Hackel struct dlm_proxy_ast
6196714d8e8SKurt Hackel {
6206714d8e8SKurt Hackel 	__be64 cookie;
6216714d8e8SKurt Hackel 
6226714d8e8SKurt Hackel 	__be32 flags;
6236714d8e8SKurt Hackel 	u8 node_idx;
6246714d8e8SKurt Hackel 	u8 type;
6256714d8e8SKurt Hackel 	u8 blocked_type;
6266714d8e8SKurt Hackel 	u8 namelen;
6276714d8e8SKurt Hackel 
6286714d8e8SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
6296714d8e8SKurt Hackel 
6308cb92435SGustavo A. R. Silva 	s8 lvb[];
6316714d8e8SKurt Hackel };
6326714d8e8SKurt Hackel #define DLM_PROXY_AST_MAX_LEN  (sizeof(struct dlm_proxy_ast)+DLM_LVB_LEN)
6336714d8e8SKurt Hackel 
6346714d8e8SKurt Hackel #define DLM_MOD_KEY (0x666c6172)
635d24fbcdaSJoel Becker enum dlm_query_join_response_code {
6366714d8e8SKurt Hackel 	JOIN_DISALLOW = 0,
637079ffb74SSunil Mushran 	JOIN_OK = 1,
638079ffb74SSunil Mushran 	JOIN_OK_NO_MAP = 2,
639079ffb74SSunil Mushran 	JOIN_PROTOCOL_MISMATCH = 3,
640d24fbcdaSJoel Becker };
641d24fbcdaSJoel Becker 
6420f71b7b4SJoel Becker struct dlm_query_join_packet {
643d24fbcdaSJoel Becker 	u8 code;	/* Response code.  dlm_minor and fs_minor
644d24fbcdaSJoel Becker 			   are only valid if this is JOIN_OK */
645d24fbcdaSJoel Becker 	u8 dlm_minor;	/* The minor version of the protocol the
646d24fbcdaSJoel Becker 			   dlm is speaking. */
647d24fbcdaSJoel Becker 	u8 fs_minor;	/* The minor version of the protocol the
648d24fbcdaSJoel Becker 			   filesystem is speaking. */
649d24fbcdaSJoel Becker 	u8 reserved;
6500f71b7b4SJoel Becker };
6510f71b7b4SJoel Becker 
6520f71b7b4SJoel Becker union dlm_query_join_response {
65385158410SAl Viro 	__be32 intval;
6540f71b7b4SJoel Becker 	struct dlm_query_join_packet packet;
6556714d8e8SKurt Hackel };
6566714d8e8SKurt Hackel 
6576714d8e8SKurt Hackel struct dlm_lock_request
6586714d8e8SKurt Hackel {
6596714d8e8SKurt Hackel 	u8 node_idx;
6606714d8e8SKurt Hackel 	u8 dead_node;
6616714d8e8SKurt Hackel 	__be16 pad1;
6626714d8e8SKurt Hackel 	__be32 pad2;
6636714d8e8SKurt Hackel };
6646714d8e8SKurt Hackel 
6656714d8e8SKurt Hackel struct dlm_reco_data_done
6666714d8e8SKurt Hackel {
6676714d8e8SKurt Hackel 	u8 node_idx;
6686714d8e8SKurt Hackel 	u8 dead_node;
6696714d8e8SKurt Hackel 	__be16 pad1;
6706714d8e8SKurt Hackel 	__be32 pad2;
6716714d8e8SKurt Hackel 
6726714d8e8SKurt Hackel 	/* unused for now */
6736714d8e8SKurt Hackel 	/* eventually we can use this to attempt
6746714d8e8SKurt Hackel 	 * lvb recovery based on each node's info */
6756714d8e8SKurt Hackel 	u8 reco_lvb[DLM_LVB_LEN];
6766714d8e8SKurt Hackel };
6776714d8e8SKurt Hackel 
6786714d8e8SKurt Hackel struct dlm_begin_reco
6796714d8e8SKurt Hackel {
6806714d8e8SKurt Hackel 	u8 node_idx;
6816714d8e8SKurt Hackel 	u8 dead_node;
6826714d8e8SKurt Hackel 	__be16 pad1;
6836714d8e8SKurt Hackel 	__be32 pad2;
6846714d8e8SKurt Hackel };
6856714d8e8SKurt Hackel 
6866714d8e8SKurt Hackel struct dlm_query_join_request
6876714d8e8SKurt Hackel {
6886714d8e8SKurt Hackel 	u8 node_idx;
6896714d8e8SKurt Hackel 	u8 pad1[2];
6906714d8e8SKurt Hackel 	u8 name_len;
691d24fbcdaSJoel Becker 	struct dlm_protocol_version dlm_proto;
692d24fbcdaSJoel Becker 	struct dlm_protocol_version fs_proto;
6936714d8e8SKurt Hackel 	u8 domain[O2NM_MAX_NAME_LEN];
6941faf2894SSrinivas Eeda 	u8 node_map[BITS_TO_BYTES(O2NM_MAX_NODES)];
6956714d8e8SKurt Hackel };
6966714d8e8SKurt Hackel 
6976714d8e8SKurt Hackel struct dlm_assert_joined
6986714d8e8SKurt Hackel {
6996714d8e8SKurt Hackel 	u8 node_idx;
7006714d8e8SKurt Hackel 	u8 pad1[2];
7016714d8e8SKurt Hackel 	u8 name_len;
7026714d8e8SKurt Hackel 	u8 domain[O2NM_MAX_NAME_LEN];
7036714d8e8SKurt Hackel };
7046714d8e8SKurt Hackel 
7056714d8e8SKurt Hackel struct dlm_cancel_join
7066714d8e8SKurt Hackel {
7076714d8e8SKurt Hackel 	u8 node_idx;
7086714d8e8SKurt Hackel 	u8 pad1[2];
7096714d8e8SKurt Hackel 	u8 name_len;
7106714d8e8SKurt Hackel 	u8 domain[O2NM_MAX_NAME_LEN];
7116714d8e8SKurt Hackel };
7126714d8e8SKurt Hackel 
713ea203441SSunil Mushran struct dlm_query_region {
714ea203441SSunil Mushran 	u8 qr_node;
715ea203441SSunil Mushran 	u8 qr_numregions;
716ea203441SSunil Mushran 	u8 qr_namelen;
717ea203441SSunil Mushran 	u8 pad1;
718ea203441SSunil Mushran 	u8 qr_domain[O2NM_MAX_NAME_LEN];
719ea203441SSunil Mushran 	u8 qr_regions[O2HB_MAX_REGION_NAME_LEN * O2NM_MAX_REGIONS];
720ea203441SSunil Mushran };
721ea203441SSunil Mushran 
72218cfdf1bSSunil Mushran struct dlm_node_info {
72318cfdf1bSSunil Mushran 	u8 ni_nodenum;
72418cfdf1bSSunil Mushran 	u8 pad1;
72585158410SAl Viro 	__be16 ni_ipv4_port;
72685158410SAl Viro 	__be32 ni_ipv4_address;
72718cfdf1bSSunil Mushran };
72818cfdf1bSSunil Mushran 
72918cfdf1bSSunil Mushran struct dlm_query_nodeinfo {
73018cfdf1bSSunil Mushran 	u8 qn_nodenum;
73118cfdf1bSSunil Mushran 	u8 qn_numnodes;
73218cfdf1bSSunil Mushran 	u8 qn_namelen;
73318cfdf1bSSunil Mushran 	u8 pad1;
73418cfdf1bSSunil Mushran 	u8 qn_domain[O2NM_MAX_NAME_LEN];
73518cfdf1bSSunil Mushran 	struct dlm_node_info qn_nodes[O2NM_MAX_NODES];
73618cfdf1bSSunil Mushran };
73718cfdf1bSSunil Mushran 
7386714d8e8SKurt Hackel struct dlm_exit_domain
7396714d8e8SKurt Hackel {
7406714d8e8SKurt Hackel 	u8 node_idx;
7416714d8e8SKurt Hackel 	u8 pad1[3];
7426714d8e8SKurt Hackel };
7436714d8e8SKurt Hackel 
7446714d8e8SKurt Hackel struct dlm_finalize_reco
7456714d8e8SKurt Hackel {
7466714d8e8SKurt Hackel 	u8 node_idx;
7476714d8e8SKurt Hackel 	u8 dead_node;
748466d1a45SKurt Hackel 	u8 flags;
749466d1a45SKurt Hackel 	u8 pad1;
7506714d8e8SKurt Hackel 	__be32 pad2;
7516714d8e8SKurt Hackel };
7526714d8e8SKurt Hackel 
753ba2bf218SKurt Hackel struct dlm_deref_lockres
754ba2bf218SKurt Hackel {
755ba2bf218SKurt Hackel 	u32 pad1;
756ba2bf218SKurt Hackel 	u16 pad2;
757ba2bf218SKurt Hackel 	u8 node_idx;
758ba2bf218SKurt Hackel 	u8 namelen;
759ba2bf218SKurt Hackel 
760ba2bf218SKurt Hackel 	u8 name[O2NM_MAX_NAME_LEN];
761ba2bf218SKurt Hackel };
762ba2bf218SKurt Hackel 
763842b90b6Sxuejiufei enum {
764842b90b6Sxuejiufei 	DLM_DEREF_RESPONSE_DONE = 0,
765842b90b6Sxuejiufei 	DLM_DEREF_RESPONSE_INPROG = 1,
766842b90b6Sxuejiufei };
767842b90b6Sxuejiufei 
76860d663cbSxuejiufei struct dlm_deref_lockres_done {
76960d663cbSxuejiufei 	u32 pad1;
77060d663cbSxuejiufei 	u16 pad2;
77160d663cbSxuejiufei 	u8 node_idx;
77260d663cbSxuejiufei 	u8 namelen;
77360d663cbSxuejiufei 
77460d663cbSxuejiufei 	u8 name[O2NM_MAX_NAME_LEN];
77560d663cbSxuejiufei };
77660d663cbSxuejiufei 
7776714d8e8SKurt Hackel static inline enum dlm_status
__dlm_lockres_state_to_status(struct dlm_lock_resource * res)7786714d8e8SKurt Hackel __dlm_lockres_state_to_status(struct dlm_lock_resource *res)
7796714d8e8SKurt Hackel {
7806714d8e8SKurt Hackel 	enum dlm_status status = DLM_NORMAL;
7816714d8e8SKurt Hackel 
7826714d8e8SKurt Hackel 	assert_spin_locked(&res->spinlock);
7836714d8e8SKurt Hackel 
784814ce694SJiufei Xue 	if (res->state & (DLM_LOCK_RES_RECOVERING|
785814ce694SJiufei Xue 			DLM_LOCK_RES_RECOVERY_WAITING))
7866714d8e8SKurt Hackel 		status = DLM_RECOVERING;
7876714d8e8SKurt Hackel 	else if (res->state & DLM_LOCK_RES_MIGRATING)
7886714d8e8SKurt Hackel 		status = DLM_MIGRATING;
7896714d8e8SKurt Hackel 	else if (res->state & DLM_LOCK_RES_IN_PROGRESS)
7906714d8e8SKurt Hackel 		status = DLM_FORWARD;
7916714d8e8SKurt Hackel 
7926714d8e8SKurt Hackel 	return status;
7936714d8e8SKurt Hackel }
7946714d8e8SKurt Hackel 
dlm_get_lock_cookie_node(u64 cookie)79529004858SKurt Hackel static inline u8 dlm_get_lock_cookie_node(u64 cookie)
79629004858SKurt Hackel {
79729004858SKurt Hackel 	u8 ret;
79829004858SKurt Hackel 	cookie >>= 56;
79929004858SKurt Hackel 	ret = (u8)(cookie & 0xffULL);
80029004858SKurt Hackel 	return ret;
80129004858SKurt Hackel }
80229004858SKurt Hackel 
dlm_get_lock_cookie_seq(u64 cookie)80329004858SKurt Hackel static inline unsigned long long dlm_get_lock_cookie_seq(u64 cookie)
80429004858SKurt Hackel {
80529004858SKurt Hackel 	unsigned long long ret;
80629004858SKurt Hackel 	ret = ((unsigned long long)cookie) & 0x00ffffffffffffffULL;
80729004858SKurt Hackel 	return ret;
80829004858SKurt Hackel }
80929004858SKurt Hackel 
8106714d8e8SKurt Hackel struct dlm_lock * dlm_new_lock(int type, u8 node, u64 cookie,
8116714d8e8SKurt Hackel 			       struct dlm_lockstatus *lksb);
8126714d8e8SKurt Hackel void dlm_lock_get(struct dlm_lock *lock);
8136714d8e8SKurt Hackel void dlm_lock_put(struct dlm_lock *lock);
8146714d8e8SKurt Hackel 
8156714d8e8SKurt Hackel void dlm_lock_attach_lockres(struct dlm_lock *lock,
8166714d8e8SKurt Hackel 			     struct dlm_lock_resource *res);
8176714d8e8SKurt Hackel 
818d74c9803SKurt Hackel int dlm_create_lock_handler(struct o2net_msg *msg, u32 len, void *data,
819d74c9803SKurt Hackel 			    void **ret_data);
820d74c9803SKurt Hackel int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data,
821d74c9803SKurt Hackel 			     void **ret_data);
822d74c9803SKurt Hackel int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data,
823d74c9803SKurt Hackel 			  void **ret_data);
8246714d8e8SKurt Hackel 
8256714d8e8SKurt Hackel void dlm_revert_pending_convert(struct dlm_lock_resource *res,
8266714d8e8SKurt Hackel 				struct dlm_lock *lock);
8276714d8e8SKurt Hackel void dlm_revert_pending_lock(struct dlm_lock_resource *res,
8286714d8e8SKurt Hackel 			     struct dlm_lock *lock);
8296714d8e8SKurt Hackel 
830d74c9803SKurt Hackel int dlm_unlock_lock_handler(struct o2net_msg *msg, u32 len, void *data,
831d74c9803SKurt Hackel 			    void **ret_data);
8326714d8e8SKurt Hackel void dlm_commit_pending_cancel(struct dlm_lock_resource *res,
8336714d8e8SKurt Hackel 			       struct dlm_lock *lock);
8346714d8e8SKurt Hackel void dlm_commit_pending_unlock(struct dlm_lock_resource *res,
8356714d8e8SKurt Hackel 			       struct dlm_lock *lock);
8366714d8e8SKurt Hackel 
8376714d8e8SKurt Hackel int dlm_launch_thread(struct dlm_ctxt *dlm);
8386714d8e8SKurt Hackel void dlm_complete_thread(struct dlm_ctxt *dlm);
8396714d8e8SKurt Hackel int dlm_launch_recovery_thread(struct dlm_ctxt *dlm);
8406714d8e8SKurt Hackel void dlm_complete_recovery_thread(struct dlm_ctxt *dlm);
8416714d8e8SKurt Hackel void dlm_wait_for_recovery(struct dlm_ctxt *dlm);
842c03872f5SKurt Hackel void dlm_kick_recovery_thread(struct dlm_ctxt *dlm);
843e2faea4cSKurt Hackel int dlm_is_node_dead(struct dlm_ctxt *dlm, u8 node);
844ed8625c6SSunil Mushran void dlm_wait_for_node_death(struct dlm_ctxt *dlm, u8 node, int timeout);
845ed8625c6SSunil Mushran void dlm_wait_for_node_recovery(struct dlm_ctxt *dlm, u8 node, int timeout);
8466714d8e8SKurt Hackel 
8476714d8e8SKurt Hackel void dlm_put(struct dlm_ctxt *dlm);
8486714d8e8SKurt Hackel struct dlm_ctxt *dlm_grab(struct dlm_ctxt *dlm);
8496714d8e8SKurt Hackel int dlm_domain_fully_joined(struct dlm_ctxt *dlm);
8506714d8e8SKurt Hackel 
8516714d8e8SKurt Hackel void __dlm_lockres_calc_usage(struct dlm_ctxt *dlm,
8526714d8e8SKurt Hackel 			      struct dlm_lock_resource *res);
8536714d8e8SKurt Hackel void dlm_lockres_calc_usage(struct dlm_ctxt *dlm,
8546714d8e8SKurt Hackel 			    struct dlm_lock_resource *res);
dlm_lockres_get(struct dlm_lock_resource * res)85595c4f581SMark Fasheh static inline void dlm_lockres_get(struct dlm_lock_resource *res)
85695c4f581SMark Fasheh {
85795c4f581SMark Fasheh 	/* This is called on every lookup, so it might be worth
85895c4f581SMark Fasheh 	 * inlining. */
85995c4f581SMark Fasheh 	kref_get(&res->refs);
86095c4f581SMark Fasheh }
8616714d8e8SKurt Hackel void dlm_lockres_put(struct dlm_lock_resource *res);
862e9f0b6a6SSunil Mushran void __dlm_unhash_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
863e9f0b6a6SSunil Mushran void __dlm_insert_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
864ba2bf218SKurt Hackel struct dlm_lock_resource * __dlm_lookup_lockres_full(struct dlm_ctxt *dlm,
865ba2bf218SKurt Hackel 						     const char *name,
866ba2bf218SKurt Hackel 						     unsigned int len,
867ba2bf218SKurt Hackel 						     unsigned int hash);
8686714d8e8SKurt Hackel struct dlm_lock_resource * __dlm_lookup_lockres(struct dlm_ctxt *dlm,
8696714d8e8SKurt Hackel 						const char *name,
870a3d33291SMark Fasheh 						unsigned int len,
871a3d33291SMark Fasheh 						unsigned int hash);
8726714d8e8SKurt Hackel struct dlm_lock_resource * dlm_lookup_lockres(struct dlm_ctxt *dlm,
8736714d8e8SKurt Hackel 					      const char *name,
8746714d8e8SKurt Hackel 					      unsigned int len);
8756714d8e8SKurt Hackel 
8766714d8e8SKurt Hackel int dlm_is_host_down(int errno);
8777d62a978SSunil Mushran 
8786714d8e8SKurt Hackel struct dlm_lock_resource * dlm_get_lock_resource(struct dlm_ctxt *dlm,
8796714d8e8SKurt Hackel 						 const char *lockid,
8803384f3dfSMark Fasheh 						 int namelen,
8816714d8e8SKurt Hackel 						 int flags);
8826714d8e8SKurt Hackel struct dlm_lock_resource *dlm_new_lockres(struct dlm_ctxt *dlm,
8836714d8e8SKurt Hackel 					  const char *name,
8846714d8e8SKurt Hackel 					  unsigned int namelen);
8856714d8e8SKurt Hackel 
8868d400b81SSunil Mushran void dlm_lockres_set_refmap_bit(struct dlm_ctxt *dlm,
8878d400b81SSunil Mushran 				struct dlm_lock_resource *res, int bit);
8888d400b81SSunil Mushran void dlm_lockres_clear_refmap_bit(struct dlm_ctxt *dlm,
8898d400b81SSunil Mushran 				  struct dlm_lock_resource *res, int bit);
890ba2bf218SKurt Hackel 
8918d400b81SSunil Mushran void dlm_lockres_drop_inflight_ref(struct dlm_ctxt *dlm,
8928d400b81SSunil Mushran 				   struct dlm_lock_resource *res);
8938d400b81SSunil Mushran void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm,
8948d400b81SSunil Mushran 				   struct dlm_lock_resource *res);
895ba2bf218SKurt Hackel 
896ac4fef4dSXue jiufei void __dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm,
897ac4fef4dSXue jiufei 		struct dlm_lock_resource *res);
898ac4fef4dSXue jiufei 
8996714d8e8SKurt Hackel void dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock);
900d9ef7522SWengang Wang void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock);
901d9ef7522SWengang Wang void __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock);
9026714d8e8SKurt Hackel void dlm_do_local_ast(struct dlm_ctxt *dlm,
9036714d8e8SKurt Hackel 		      struct dlm_lock_resource *res,
9046714d8e8SKurt Hackel 		      struct dlm_lock *lock);
9056714d8e8SKurt Hackel int dlm_do_remote_ast(struct dlm_ctxt *dlm,
9066714d8e8SKurt Hackel 		      struct dlm_lock_resource *res,
9076714d8e8SKurt Hackel 		      struct dlm_lock *lock);
9086714d8e8SKurt Hackel void dlm_do_local_bast(struct dlm_ctxt *dlm,
9096714d8e8SKurt Hackel 		       struct dlm_lock_resource *res,
9106714d8e8SKurt Hackel 		       struct dlm_lock *lock,
9116714d8e8SKurt Hackel 		       int blocked_type);
9126714d8e8SKurt Hackel int dlm_send_proxy_ast_msg(struct dlm_ctxt *dlm,
9136714d8e8SKurt Hackel 			   struct dlm_lock_resource *res,
9146714d8e8SKurt Hackel 			   struct dlm_lock *lock,
9156714d8e8SKurt Hackel 			   int msg_type,
9166714d8e8SKurt Hackel 			   int blocked_type, int flags);
dlm_send_proxy_bast(struct dlm_ctxt * dlm,struct dlm_lock_resource * res,struct dlm_lock * lock,int blocked_type)9176714d8e8SKurt Hackel static inline int dlm_send_proxy_bast(struct dlm_ctxt *dlm,
9186714d8e8SKurt Hackel 				      struct dlm_lock_resource *res,
9196714d8e8SKurt Hackel 				      struct dlm_lock *lock,
9206714d8e8SKurt Hackel 				      int blocked_type)
9216714d8e8SKurt Hackel {
9226714d8e8SKurt Hackel 	return dlm_send_proxy_ast_msg(dlm, res, lock, DLM_BAST,
9236714d8e8SKurt Hackel 				      blocked_type, 0);
9246714d8e8SKurt Hackel }
9256714d8e8SKurt Hackel 
dlm_send_proxy_ast(struct dlm_ctxt * dlm,struct dlm_lock_resource * res,struct dlm_lock * lock,int flags)9266714d8e8SKurt Hackel static inline int dlm_send_proxy_ast(struct dlm_ctxt *dlm,
9276714d8e8SKurt Hackel 				     struct dlm_lock_resource *res,
9286714d8e8SKurt Hackel 				     struct dlm_lock *lock,
9296714d8e8SKurt Hackel 				     int flags)
9306714d8e8SKurt Hackel {
9316714d8e8SKurt Hackel 	return dlm_send_proxy_ast_msg(dlm, res, lock, DLM_AST,
9326714d8e8SKurt Hackel 				      0, flags);
9336714d8e8SKurt Hackel }
9346714d8e8SKurt Hackel 
9356714d8e8SKurt Hackel void dlm_print_one_lock_resource(struct dlm_lock_resource *res);
9366714d8e8SKurt Hackel void __dlm_print_one_lock_resource(struct dlm_lock_resource *res);
9376714d8e8SKurt Hackel 
9386714d8e8SKurt Hackel void dlm_kick_thread(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
9396714d8e8SKurt Hackel void __dlm_dirty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
9406714d8e8SKurt Hackel 
9416714d8e8SKurt Hackel 
9426714d8e8SKurt Hackel void dlm_hb_node_down_cb(struct o2nm_node *node, int idx, void *data);
9436714d8e8SKurt Hackel void dlm_hb_node_up_cb(struct o2nm_node *node, int idx, void *data);
9446714d8e8SKurt Hackel 
945ba2bf218SKurt Hackel int dlm_empty_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res);
9466714d8e8SKurt Hackel int dlm_finish_migration(struct dlm_ctxt *dlm,
9476714d8e8SKurt Hackel 			 struct dlm_lock_resource *res,
9486714d8e8SKurt Hackel 			 u8 old_master);
9496714d8e8SKurt Hackel void dlm_lockres_release_ast(struct dlm_ctxt *dlm,
9506714d8e8SKurt Hackel 			     struct dlm_lock_resource *res);
9516714d8e8SKurt Hackel void __dlm_lockres_reserve_ast(struct dlm_lock_resource *res);
9526714d8e8SKurt Hackel 
953d74c9803SKurt Hackel int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data,
954d74c9803SKurt Hackel 			       void **ret_data);
955d74c9803SKurt Hackel int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
956d74c9803SKurt Hackel 			      void **ret_data);
9573b8118cfSKurt Hackel void dlm_assert_master_post_handler(int status, void *data, void *ret_data);
958d74c9803SKurt Hackel int dlm_deref_lockres_handler(struct o2net_msg *msg, u32 len, void *data,
959d74c9803SKurt Hackel 			      void **ret_data);
96060d663cbSxuejiufei int dlm_deref_lockres_done_handler(struct o2net_msg *msg, u32 len, void *data,
96160d663cbSxuejiufei 			      void **ret_data);
962d74c9803SKurt Hackel int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data,
963d74c9803SKurt Hackel 				void **ret_data);
964d74c9803SKurt Hackel int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data,
965d74c9803SKurt Hackel 			    void **ret_data);
966d74c9803SKurt Hackel int dlm_master_requery_handler(struct o2net_msg *msg, u32 len, void *data,
967d74c9803SKurt Hackel 			       void **ret_data);
968d74c9803SKurt Hackel int dlm_request_all_locks_handler(struct o2net_msg *msg, u32 len, void *data,
969d74c9803SKurt Hackel 				  void **ret_data);
970d74c9803SKurt Hackel int dlm_reco_data_done_handler(struct o2net_msg *msg, u32 len, void *data,
971d74c9803SKurt Hackel 			       void **ret_data);
972d74c9803SKurt Hackel int dlm_begin_reco_handler(struct o2net_msg *msg, u32 len, void *data,
973d74c9803SKurt Hackel 			   void **ret_data);
974d74c9803SKurt Hackel int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data,
975d74c9803SKurt Hackel 			      void **ret_data);
976c03872f5SKurt Hackel int dlm_do_master_requery(struct dlm_ctxt *dlm, struct dlm_lock_resource *res,
977c03872f5SKurt Hackel 			  u8 nodenum, u8 *real_master);
978c03872f5SKurt Hackel 
979ee8f7fcbSpiaojun void __dlm_do_purge_lockres(struct dlm_ctxt *dlm,
980ee8f7fcbSpiaojun 		struct dlm_lock_resource *res);
9816714d8e8SKurt Hackel 
9826714d8e8SKurt Hackel int dlm_dispatch_assert_master(struct dlm_ctxt *dlm,
9836714d8e8SKurt Hackel 			       struct dlm_lock_resource *res,
9846714d8e8SKurt Hackel 			       int ignore_higher,
9856714d8e8SKurt Hackel 			       u8 request_from,
9866714d8e8SKurt Hackel 			       u32 flags);
9876714d8e8SKurt Hackel 
9886714d8e8SKurt Hackel 
9896714d8e8SKurt Hackel int dlm_send_one_lockres(struct dlm_ctxt *dlm,
9906714d8e8SKurt Hackel 			 struct dlm_lock_resource *res,
9916714d8e8SKurt Hackel 			 struct dlm_migratable_lockres *mres,
9926714d8e8SKurt Hackel 			 u8 send_to,
9936714d8e8SKurt Hackel 			 u8 flags);
9946714d8e8SKurt Hackel void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm,
9956714d8e8SKurt Hackel 				       struct dlm_lock_resource *res);
9966714d8e8SKurt Hackel 
9976714d8e8SKurt Hackel /* will exit holding res->spinlock, but may drop in function */
9986714d8e8SKurt Hackel void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags);
9996714d8e8SKurt Hackel 
10006714d8e8SKurt Hackel /* will exit holding res->spinlock, but may drop in function */
__dlm_wait_on_lockres(struct dlm_lock_resource * res)10016714d8e8SKurt Hackel static inline void __dlm_wait_on_lockres(struct dlm_lock_resource *res)
10026714d8e8SKurt Hackel {
10036714d8e8SKurt Hackel 	__dlm_wait_on_lockres_flags(res, (DLM_LOCK_RES_IN_PROGRESS|
10046714d8e8SKurt Hackel 				    	  DLM_LOCK_RES_RECOVERING|
1005814ce694SJiufei Xue 					  DLM_LOCK_RES_RECOVERY_WAITING|
10066714d8e8SKurt Hackel 					  DLM_LOCK_RES_MIGRATING));
10076714d8e8SKurt Hackel }
10086714d8e8SKurt Hackel 
10091c084577SSunil Mushran void __dlm_unlink_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle);
10101c084577SSunil Mushran void __dlm_insert_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle);
10111c084577SSunil Mushran 
1012724bdca9SSunil Mushran /* create/destroy slab caches */
1013724bdca9SSunil Mushran int dlm_init_master_caches(void);
1014724bdca9SSunil Mushran void dlm_destroy_master_caches(void);
1015724bdca9SSunil Mushran 
1016724bdca9SSunil Mushran int dlm_init_lock_cache(void);
1017724bdca9SSunil Mushran void dlm_destroy_lock_cache(void);
10186714d8e8SKurt Hackel 
10196714d8e8SKurt Hackel int dlm_init_mle_cache(void);
10206714d8e8SKurt Hackel void dlm_destroy_mle_cache(void);
1021724bdca9SSunil Mushran 
10226714d8e8SKurt Hackel void dlm_hb_event_notify_attached(struct dlm_ctxt *dlm, int idx, int node_up);
1023ba2bf218SKurt Hackel int dlm_drop_lockres_ref(struct dlm_ctxt *dlm,
1024ba2bf218SKurt Hackel 			 struct dlm_lock_resource *res);
10256714d8e8SKurt Hackel void dlm_clean_master_list(struct dlm_ctxt *dlm,
10266714d8e8SKurt Hackel 			   u8 dead_node);
10275dad6c39SSrinivas Eeda void dlm_force_free_mles(struct dlm_ctxt *dlm);
10286714d8e8SKurt Hackel int dlm_lock_basts_flushed(struct dlm_ctxt *dlm, struct dlm_lock *lock);
1029ba2bf218SKurt Hackel int __dlm_lockres_has_locks(struct dlm_lock_resource *res);
103069d72b06SKurt Hackel int __dlm_lockres_unused(struct dlm_lock_resource *res);
10316714d8e8SKurt Hackel 
dlm_lock_mode_name(int mode)10326714d8e8SKurt Hackel static inline const char * dlm_lock_mode_name(int mode)
10336714d8e8SKurt Hackel {
10346714d8e8SKurt Hackel 	switch (mode) {
10356714d8e8SKurt Hackel 		case LKM_EXMODE:
10366714d8e8SKurt Hackel 			return "EX";
10376714d8e8SKurt Hackel 		case LKM_PRMODE:
10386714d8e8SKurt Hackel 			return "PR";
10396714d8e8SKurt Hackel 		case LKM_NLMODE:
10406714d8e8SKurt Hackel 			return "NL";
10416714d8e8SKurt Hackel 	}
10426714d8e8SKurt Hackel 	return "UNKNOWN";
10436714d8e8SKurt Hackel }
10446714d8e8SKurt Hackel 
10456714d8e8SKurt Hackel 
dlm_lock_compatible(int existing,int request)10466714d8e8SKurt Hackel static inline int dlm_lock_compatible(int existing, int request)
10476714d8e8SKurt Hackel {
10486714d8e8SKurt Hackel 	/* NO_LOCK compatible with all */
10496714d8e8SKurt Hackel 	if (request == LKM_NLMODE ||
10506714d8e8SKurt Hackel 	    existing == LKM_NLMODE)
10516714d8e8SKurt Hackel 		return 1;
10526714d8e8SKurt Hackel 
10536714d8e8SKurt Hackel 	/* EX incompatible with all non-NO_LOCK */
10546714d8e8SKurt Hackel 	if (request == LKM_EXMODE)
10556714d8e8SKurt Hackel 		return 0;
10566714d8e8SKurt Hackel 
10576714d8e8SKurt Hackel 	/* request must be PR, which is compatible with PR */
10586714d8e8SKurt Hackel 	if (existing == LKM_PRMODE)
10596714d8e8SKurt Hackel 		return 1;
10606714d8e8SKurt Hackel 
10616714d8e8SKurt Hackel 	return 0;
10626714d8e8SKurt Hackel }
10636714d8e8SKurt Hackel 
dlm_lock_on_list(struct list_head * head,struct dlm_lock * lock)10646714d8e8SKurt Hackel static inline int dlm_lock_on_list(struct list_head *head,
10656714d8e8SKurt Hackel 				   struct dlm_lock *lock)
10666714d8e8SKurt Hackel {
10676714d8e8SKurt Hackel 	struct dlm_lock *tmplock;
10686714d8e8SKurt Hackel 
1069df53cd3bSDong Fang 	list_for_each_entry(tmplock, head, list) {
10706714d8e8SKurt Hackel 		if (tmplock == lock)
10716714d8e8SKurt Hackel 			return 1;
10726714d8e8SKurt Hackel 	}
10736714d8e8SKurt Hackel 	return 0;
10746714d8e8SKurt Hackel }
10756714d8e8SKurt Hackel 
10766714d8e8SKurt Hackel 
dlm_err_to_dlm_status(int err)10776714d8e8SKurt Hackel static inline enum dlm_status dlm_err_to_dlm_status(int err)
10786714d8e8SKurt Hackel {
10796714d8e8SKurt Hackel 	enum dlm_status ret;
10806714d8e8SKurt Hackel 	if (err == -ENOMEM)
10816714d8e8SKurt Hackel 		ret = DLM_SYSERR;
10826714d8e8SKurt Hackel 	else if (err == -ETIMEDOUT || o2net_link_down(err, NULL))
10836714d8e8SKurt Hackel 		ret = DLM_NOLOCKMGR;
10846714d8e8SKurt Hackel 	else if (err == -EINVAL)
10856714d8e8SKurt Hackel 		ret = DLM_BADPARAM;
10866714d8e8SKurt Hackel 	else if (err == -ENAMETOOLONG)
10876714d8e8SKurt Hackel 		ret = DLM_IVBUFLEN;
10886714d8e8SKurt Hackel 	else
10896714d8e8SKurt Hackel 		ret = DLM_BADARGS;
10906714d8e8SKurt Hackel 	return ret;
10916714d8e8SKurt Hackel }
10926714d8e8SKurt Hackel 
10936714d8e8SKurt Hackel 
dlm_node_iter_init(unsigned long * map,struct dlm_node_iter * iter)10946714d8e8SKurt Hackel static inline void dlm_node_iter_init(unsigned long *map,
10956714d8e8SKurt Hackel 				      struct dlm_node_iter *iter)
10966714d8e8SKurt Hackel {
1097*b270f492SJoseph Qi 	bitmap_copy(iter->node_map, map, O2NM_MAX_NODES);
10986714d8e8SKurt Hackel 	iter->curnode = -1;
10996714d8e8SKurt Hackel }
11006714d8e8SKurt Hackel 
dlm_node_iter_next(struct dlm_node_iter * iter)11016714d8e8SKurt Hackel static inline int dlm_node_iter_next(struct dlm_node_iter *iter)
11026714d8e8SKurt Hackel {
11036714d8e8SKurt Hackel 	int bit;
11046714d8e8SKurt Hackel 	bit = find_next_bit(iter->node_map, O2NM_MAX_NODES, iter->curnode+1);
11056714d8e8SKurt Hackel 	if (bit >= O2NM_MAX_NODES) {
11066714d8e8SKurt Hackel 		iter->curnode = O2NM_MAX_NODES;
11076714d8e8SKurt Hackel 		return -ENOENT;
11086714d8e8SKurt Hackel 	}
11096714d8e8SKurt Hackel 	iter->curnode = bit;
11106714d8e8SKurt Hackel 	return bit;
11116714d8e8SKurt Hackel }
11126714d8e8SKurt Hackel 
dlm_set_lockres_owner(struct dlm_ctxt * dlm,struct dlm_lock_resource * res,u8 owner)11137d62a978SSunil Mushran static inline void dlm_set_lockres_owner(struct dlm_ctxt *dlm,
11147d62a978SSunil Mushran 					 struct dlm_lock_resource *res,
11157d62a978SSunil Mushran 					 u8 owner)
11167d62a978SSunil Mushran {
11177d62a978SSunil Mushran 	assert_spin_locked(&res->spinlock);
11186714d8e8SKurt Hackel 
11197d62a978SSunil Mushran 	res->owner = owner;
11207d62a978SSunil Mushran }
11217d62a978SSunil Mushran 
dlm_change_lockres_owner(struct dlm_ctxt * dlm,struct dlm_lock_resource * res,u8 owner)11227d62a978SSunil Mushran static inline void dlm_change_lockres_owner(struct dlm_ctxt *dlm,
11237d62a978SSunil Mushran 					    struct dlm_lock_resource *res,
11247d62a978SSunil Mushran 					    u8 owner)
11257d62a978SSunil Mushran {
11267d62a978SSunil Mushran 	assert_spin_locked(&res->spinlock);
11277d62a978SSunil Mushran 
11287d62a978SSunil Mushran 	if (owner != res->owner)
11297d62a978SSunil Mushran 		dlm_set_lockres_owner(dlm, res, owner);
11307d62a978SSunil Mushran }
11316714d8e8SKurt Hackel 
11326714d8e8SKurt Hackel #endif /* DLMCOMMON_H */
1133