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