This source file includes following definitions.
- rsb_set_flag
- rsb_clear_flag
- rsb_flag
- dlm_locking_stopped
- dlm_recovery_stopped
- dlm_no_directory
- dlm_register_debugfs
- dlm_unregister_debugfs
- dlm_create_debug_file
- dlm_delete_debug_file
1
2
3
4
5
6
7
8
9
10
11
12 #ifndef __DLM_INTERNAL_DOT_H__
13 #define __DLM_INTERNAL_DOT_H__
14
15
16
17
18
19 #include <linux/slab.h>
20 #include <linux/sched.h>
21 #include <linux/types.h>
22 #include <linux/ctype.h>
23 #include <linux/spinlock.h>
24 #include <linux/vmalloc.h>
25 #include <linux/list.h>
26 #include <linux/errno.h>
27 #include <linux/random.h>
28 #include <linux/delay.h>
29 #include <linux/socket.h>
30 #include <linux/kthread.h>
31 #include <linux/kobject.h>
32 #include <linux/kref.h>
33 #include <linux/kernel.h>
34 #include <linux/jhash.h>
35 #include <linux/miscdevice.h>
36 #include <linux/mutex.h>
37 #include <linux/idr.h>
38 #include <linux/ratelimit.h>
39 #include <linux/uaccess.h>
40
41 #include <linux/dlm.h>
42 #include "config.h"
43
44
45
46
47
48 #define DLM_INBUF_LEN 148
49
50 struct dlm_ls;
51 struct dlm_lkb;
52 struct dlm_rsb;
53 struct dlm_member;
54 struct dlm_rsbtable;
55 struct dlm_recover;
56 struct dlm_header;
57 struct dlm_message;
58 struct dlm_rcom;
59 struct dlm_mhandle;
60
61 #define log_print(fmt, args...) \
62 printk(KERN_ERR "dlm: "fmt"\n" , ##args)
63 #define log_error(ls, fmt, args...) \
64 printk(KERN_ERR "dlm: %s: " fmt "\n", (ls)->ls_name , ##args)
65
66 #define log_rinfo(ls, fmt, args...) \
67 do { \
68 if (dlm_config.ci_log_info) \
69 printk(KERN_INFO "dlm: %s: " fmt "\n", \
70 (ls)->ls_name, ##args); \
71 else if (dlm_config.ci_log_debug) \
72 printk(KERN_DEBUG "dlm: %s: " fmt "\n", \
73 (ls)->ls_name , ##args); \
74 } while (0)
75
76 #define log_debug(ls, fmt, args...) \
77 do { \
78 if (dlm_config.ci_log_debug) \
79 printk(KERN_DEBUG "dlm: %s: " fmt "\n", \
80 (ls)->ls_name , ##args); \
81 } while (0)
82
83 #define log_limit(ls, fmt, args...) \
84 do { \
85 if (dlm_config.ci_log_debug) \
86 printk_ratelimited(KERN_DEBUG "dlm: %s: " fmt "\n", \
87 (ls)->ls_name , ##args); \
88 } while (0)
89
90 #define DLM_ASSERT(x, do) \
91 { \
92 if (!(x)) \
93 { \
94 printk(KERN_ERR "\nDLM: Assertion failed on line %d of file %s\n" \
95 "DLM: assertion: \"%s\"\n" \
96 "DLM: time = %lu\n", \
97 __LINE__, __FILE__, #x, jiffies); \
98 {do} \
99 printk("\n"); \
100 BUG(); \
101 panic("DLM: Record message above and reboot.\n"); \
102 } \
103 }
104
105
106 #define DLM_RTF_SHRINK 0x00000001
107
108 struct dlm_rsbtable {
109 struct rb_root keep;
110 struct rb_root toss;
111 spinlock_t lock;
112 uint32_t flags;
113 };
114
115
116
117
118
119
120 struct dlm_member {
121 struct list_head list;
122 int nodeid;
123 int weight;
124 int slot;
125 int slot_prev;
126 int comm_seq;
127 uint32_t generation;
128 };
129
130
131
132
133
134 struct dlm_recover {
135 struct list_head list;
136 struct dlm_config_node *nodes;
137 int nodes_count;
138 uint64_t seq;
139 };
140
141
142
143
144
145 struct dlm_args {
146 uint32_t flags;
147 void (*astfn) (void *astparam);
148 void *astparam;
149 void (*bastfn) (void *astparam, int mode);
150 int mode;
151 struct dlm_lksb *lksb;
152 unsigned long timeout;
153 };
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198 #define DLM_LKSTS_WAITING 1
199 #define DLM_LKSTS_GRANTED 2
200 #define DLM_LKSTS_CONVERT 3
201
202
203
204 #define DLM_IFL_MSTCPY 0x00010000
205 #define DLM_IFL_RESEND 0x00020000
206 #define DLM_IFL_DEAD 0x00040000
207 #define DLM_IFL_OVERLAP_UNLOCK 0x00080000
208 #define DLM_IFL_OVERLAP_CANCEL 0x00100000
209 #define DLM_IFL_ENDOFLIFE 0x00200000
210 #define DLM_IFL_WATCH_TIMEWARN 0x00400000
211 #define DLM_IFL_TIMEOUT_CANCEL 0x00800000
212 #define DLM_IFL_DEADLOCK_CANCEL 0x01000000
213 #define DLM_IFL_STUB_MS 0x02000000
214 #define DLM_IFL_USER 0x00000001
215 #define DLM_IFL_ORPHAN 0x00000002
216
217 #define DLM_CALLBACKS_SIZE 6
218
219 #define DLM_CB_CAST 0x00000001
220 #define DLM_CB_BAST 0x00000002
221 #define DLM_CB_SKIP 0x00000004
222
223 struct dlm_callback {
224 uint64_t seq;
225 uint32_t flags;
226 int sb_status;
227 uint8_t sb_flags;
228 int8_t mode;
229 };
230
231 struct dlm_lkb {
232 struct dlm_rsb *lkb_resource;
233 struct kref lkb_ref;
234 int lkb_nodeid;
235 int lkb_ownpid;
236 uint32_t lkb_id;
237 uint32_t lkb_remid;
238 uint32_t lkb_exflags;
239 uint32_t lkb_sbflags;
240 uint32_t lkb_flags;
241 uint32_t lkb_lvbseq;
242
243 int8_t lkb_status;
244 int8_t lkb_rqmode;
245 int8_t lkb_grmode;
246 int8_t lkb_highbast;
247
248 int8_t lkb_wait_type;
249 int8_t lkb_wait_count;
250 int lkb_wait_nodeid;
251
252 struct list_head lkb_statequeue;
253 struct list_head lkb_rsb_lookup;
254 struct list_head lkb_wait_reply;
255 struct list_head lkb_ownqueue;
256 struct list_head lkb_time_list;
257 ktime_t lkb_timestamp;
258 ktime_t lkb_wait_time;
259 unsigned long lkb_timeout_cs;
260
261 struct mutex lkb_cb_mutex;
262 struct work_struct lkb_cb_work;
263 struct list_head lkb_cb_list;
264 struct dlm_callback lkb_callbacks[DLM_CALLBACKS_SIZE];
265 struct dlm_callback lkb_last_cast;
266 struct dlm_callback lkb_last_bast;
267 ktime_t lkb_last_cast_time;
268 ktime_t lkb_last_bast_time;
269
270 uint64_t lkb_recover_seq;
271
272 char *lkb_lvbptr;
273 struct dlm_lksb *lkb_lksb;
274 void (*lkb_astfn) (void *astparam);
275 void (*lkb_bastfn) (void *astparam, int mode);
276 union {
277 void *lkb_astparam;
278 struct dlm_user_args *lkb_ua;
279 };
280 };
281
282
283
284
285
286
287
288
289
290
291
292 struct dlm_rsb {
293 struct dlm_ls *res_ls;
294 struct kref res_ref;
295 struct mutex res_mutex;
296 unsigned long res_flags;
297 int res_length;
298 int res_nodeid;
299 int res_master_nodeid;
300 int res_dir_nodeid;
301 int res_id;
302 uint32_t res_lvbseq;
303 uint32_t res_hash;
304 uint32_t res_bucket;
305 unsigned long res_toss_time;
306 uint32_t res_first_lkid;
307 struct list_head res_lookup;
308 union {
309 struct list_head res_hashchain;
310 struct rb_node res_hashnode;
311 };
312 struct list_head res_grantqueue;
313 struct list_head res_convertqueue;
314 struct list_head res_waitqueue;
315
316 struct list_head res_root_list;
317 struct list_head res_recover_list;
318 int res_recover_locks_count;
319
320 char *res_lvbptr;
321 char res_name[DLM_RESNAME_MAXLEN+1];
322 };
323
324
325
326 #define DLM_LU_RECOVER_DIR 1
327 #define DLM_LU_RECOVER_MASTER 2
328
329
330
331 #define DLM_LU_MATCH 1
332 #define DLM_LU_ADD 2
333
334
335
336 #define R_REQUEST 0x00000001
337 #define R_RECEIVE_REQUEST 0x00000002
338 #define R_RECEIVE_RECOVER 0x00000004
339
340
341
342 enum rsb_flags {
343 RSB_MASTER_UNCERTAIN,
344 RSB_VALNOTVALID,
345 RSB_VALNOTVALID_PREV,
346 RSB_NEW_MASTER,
347 RSB_NEW_MASTER2,
348 RSB_RECOVER_CONVERT,
349 RSB_RECOVER_GRANT,
350 RSB_RECOVER_LVB_INVAL,
351 };
352
353 static inline void rsb_set_flag(struct dlm_rsb *r, enum rsb_flags flag)
354 {
355 __set_bit(flag, &r->res_flags);
356 }
357
358 static inline void rsb_clear_flag(struct dlm_rsb *r, enum rsb_flags flag)
359 {
360 __clear_bit(flag, &r->res_flags);
361 }
362
363 static inline int rsb_flag(struct dlm_rsb *r, enum rsb_flags flag)
364 {
365 return test_bit(flag, &r->res_flags);
366 }
367
368
369
370
371 #define DLM_HEADER_MAJOR 0x00030000
372 #define DLM_HEADER_MINOR 0x00000001
373
374 #define DLM_HEADER_SLOTS 0x00000001
375
376 #define DLM_MSG 1
377 #define DLM_RCOM 2
378
379 struct dlm_header {
380 uint32_t h_version;
381 uint32_t h_lockspace;
382 uint32_t h_nodeid;
383 uint16_t h_length;
384 uint8_t h_cmd;
385 uint8_t h_pad;
386 };
387
388
389 #define DLM_MSG_REQUEST 1
390 #define DLM_MSG_CONVERT 2
391 #define DLM_MSG_UNLOCK 3
392 #define DLM_MSG_CANCEL 4
393 #define DLM_MSG_REQUEST_REPLY 5
394 #define DLM_MSG_CONVERT_REPLY 6
395 #define DLM_MSG_UNLOCK_REPLY 7
396 #define DLM_MSG_CANCEL_REPLY 8
397 #define DLM_MSG_GRANT 9
398 #define DLM_MSG_BAST 10
399 #define DLM_MSG_LOOKUP 11
400 #define DLM_MSG_REMOVE 12
401 #define DLM_MSG_LOOKUP_REPLY 13
402 #define DLM_MSG_PURGE 14
403
404 struct dlm_message {
405 struct dlm_header m_header;
406 uint32_t m_type;
407 uint32_t m_nodeid;
408 uint32_t m_pid;
409 uint32_t m_lkid;
410 uint32_t m_remid;
411 uint32_t m_parent_lkid;
412 uint32_t m_parent_remid;
413 uint32_t m_exflags;
414 uint32_t m_sbflags;
415 uint32_t m_flags;
416 uint32_t m_lvbseq;
417 uint32_t m_hash;
418 int m_status;
419 int m_grmode;
420 int m_rqmode;
421 int m_bastmode;
422 int m_asts;
423 int m_result;
424 char m_extra[0];
425 };
426
427
428 #define DLM_RS_NODES 0x00000001
429 #define DLM_RS_NODES_ALL 0x00000002
430 #define DLM_RS_DIR 0x00000004
431 #define DLM_RS_DIR_ALL 0x00000008
432 #define DLM_RS_LOCKS 0x00000010
433 #define DLM_RS_LOCKS_ALL 0x00000020
434 #define DLM_RS_DONE 0x00000040
435 #define DLM_RS_DONE_ALL 0x00000080
436
437 #define DLM_RCOM_STATUS 1
438 #define DLM_RCOM_NAMES 2
439 #define DLM_RCOM_LOOKUP 3
440 #define DLM_RCOM_LOCK 4
441 #define DLM_RCOM_STATUS_REPLY 5
442 #define DLM_RCOM_NAMES_REPLY 6
443 #define DLM_RCOM_LOOKUP_REPLY 7
444 #define DLM_RCOM_LOCK_REPLY 8
445
446 struct dlm_rcom {
447 struct dlm_header rc_header;
448 uint32_t rc_type;
449 int rc_result;
450 uint64_t rc_id;
451 uint64_t rc_seq;
452 uint64_t rc_seq_reply;
453 char rc_buf[0];
454 };
455
456 union dlm_packet {
457 struct dlm_header header;
458 struct dlm_message message;
459 struct dlm_rcom rcom;
460 };
461
462 #define DLM_RSF_NEED_SLOTS 0x00000001
463
464
465 struct rcom_status {
466 __le32 rs_flags;
467 __le32 rs_unused1;
468 __le64 rs_unused2;
469 };
470
471
472 struct rcom_config {
473 __le32 rf_lvblen;
474 __le32 rf_lsflags;
475
476
477 __le32 rf_flags;
478 __le16 rf_our_slot;
479 __le16 rf_num_slots;
480 __le32 rf_generation;
481 __le32 rf_unused1;
482 __le64 rf_unused2;
483 };
484
485 struct rcom_slot {
486 __le32 ro_nodeid;
487 __le16 ro_slot;
488 __le16 ro_unused1;
489 __le64 ro_unused2;
490 };
491
492 struct rcom_lock {
493 __le32 rl_ownpid;
494 __le32 rl_lkid;
495 __le32 rl_remid;
496 __le32 rl_parent_lkid;
497 __le32 rl_parent_remid;
498 __le32 rl_exflags;
499 __le32 rl_flags;
500 __le32 rl_lvbseq;
501 __le32 rl_result;
502 int8_t rl_rqmode;
503 int8_t rl_grmode;
504 int8_t rl_status;
505 int8_t rl_asts;
506 __le16 rl_wait_type;
507 __le16 rl_namelen;
508 char rl_name[DLM_RESNAME_MAXLEN];
509 char rl_lvb[0];
510 };
511
512
513
514
515
516
517 #define DLM_REMOVE_NAMES_MAX 8
518
519 struct dlm_ls {
520 struct list_head ls_list;
521 dlm_lockspace_t *ls_local_handle;
522 uint32_t ls_global_id;
523 uint32_t ls_generation;
524 uint32_t ls_exflags;
525 int ls_lvblen;
526 int ls_count;
527
528 int ls_create_count;
529 unsigned long ls_flags;
530 unsigned long ls_scan_time;
531 struct kobject ls_kobj;
532
533 struct idr ls_lkbidr;
534 spinlock_t ls_lkbidr_spin;
535
536 struct dlm_rsbtable *ls_rsbtbl;
537 uint32_t ls_rsbtbl_size;
538
539 struct mutex ls_waiters_mutex;
540 struct list_head ls_waiters;
541
542 struct mutex ls_orphans_mutex;
543 struct list_head ls_orphans;
544
545 struct mutex ls_timeout_mutex;
546 struct list_head ls_timeout;
547
548 spinlock_t ls_new_rsb_spin;
549 int ls_new_rsb_count;
550 struct list_head ls_new_rsb;
551
552 spinlock_t ls_remove_spin;
553 char ls_remove_name[DLM_RESNAME_MAXLEN+1];
554 char *ls_remove_names[DLM_REMOVE_NAMES_MAX];
555 int ls_remove_len;
556 int ls_remove_lens[DLM_REMOVE_NAMES_MAX];
557
558 struct list_head ls_nodes;
559 struct list_head ls_nodes_gone;
560 int ls_num_nodes;
561 int ls_low_nodeid;
562 int ls_total_weight;
563 int *ls_node_array;
564
565 int ls_slot;
566 int ls_num_slots;
567 int ls_slots_size;
568 struct dlm_slot *ls_slots;
569
570 struct dlm_rsb ls_stub_rsb;
571 struct dlm_lkb ls_stub_lkb;
572 struct dlm_message ls_stub_ms;
573
574 struct dentry *ls_debug_rsb_dentry;
575 struct dentry *ls_debug_waiters_dentry;
576 struct dentry *ls_debug_locks_dentry;
577 struct dentry *ls_debug_all_dentry;
578 struct dentry *ls_debug_toss_dentry;
579
580 wait_queue_head_t ls_uevent_wait;
581 int ls_uevent_result;
582 struct completion ls_members_done;
583 int ls_members_result;
584
585 struct miscdevice ls_device;
586
587 struct workqueue_struct *ls_callback_wq;
588
589
590
591 struct mutex ls_cb_mutex;
592 struct list_head ls_cb_delay;
593 struct timer_list ls_timer;
594 struct task_struct *ls_recoverd_task;
595 struct mutex ls_recoverd_active;
596 spinlock_t ls_recover_lock;
597 unsigned long ls_recover_begin;
598 uint32_t ls_recover_status;
599 uint64_t ls_recover_seq;
600 struct dlm_recover *ls_recover_args;
601 struct rw_semaphore ls_in_recovery;
602 struct rw_semaphore ls_recv_active;
603 struct list_head ls_requestqueue;
604 struct mutex ls_requestqueue_mutex;
605 struct dlm_rcom *ls_recover_buf;
606 int ls_recover_nodeid;
607 unsigned int ls_recover_dir_sent_res;
608 unsigned int ls_recover_dir_sent_msg;
609 unsigned int ls_recover_locks_in;
610 uint64_t ls_rcom_seq;
611 spinlock_t ls_rcom_spin;
612 struct list_head ls_recover_list;
613 spinlock_t ls_recover_list_lock;
614 int ls_recover_list_count;
615 struct idr ls_recover_idr;
616 spinlock_t ls_recover_idr_lock;
617 wait_queue_head_t ls_wait_general;
618 wait_queue_head_t ls_recover_lock_wait;
619 struct mutex ls_clear_proc_locks;
620
621 struct list_head ls_root_list;
622 struct rw_semaphore ls_root_sem;
623
624 const struct dlm_lockspace_ops *ls_ops;
625 void *ls_ops_arg;
626
627 int ls_namelen;
628 char ls_name[1];
629 };
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653 #define LSFL_RECOVER_STOP 0
654 #define LSFL_RECOVER_DOWN 1
655 #define LSFL_RECOVER_LOCK 2
656 #define LSFL_RECOVER_WORK 3
657 #define LSFL_RUNNING 4
658
659 #define LSFL_RCOM_READY 5
660 #define LSFL_RCOM_WAIT 6
661 #define LSFL_UEVENT_WAIT 7
662 #define LSFL_TIMEWARN 8
663 #define LSFL_CB_DELAY 9
664 #define LSFL_NODIR 10
665
666
667
668
669 struct dlm_user_args {
670 struct dlm_user_proc *proc;
671
672
673
674 struct dlm_lksb lksb;
675 struct dlm_lksb __user *user_lksb;
676 void __user *castparam;
677 void __user *castaddr;
678 void __user *bastparam;
679 void __user *bastaddr;
680 uint64_t xid;
681 };
682
683 #define DLM_PROC_FLAGS_CLOSING 1
684 #define DLM_PROC_FLAGS_COMPAT 2
685
686
687
688
689 struct dlm_user_proc {
690 dlm_lockspace_t *lockspace;
691 unsigned long flags;
692 struct list_head asts;
693 spinlock_t asts_spin;
694 struct list_head locks;
695 spinlock_t locks_spin;
696 struct list_head unlocking;
697 wait_queue_head_t wait;
698 };
699
700 static inline int dlm_locking_stopped(struct dlm_ls *ls)
701 {
702 return !test_bit(LSFL_RUNNING, &ls->ls_flags);
703 }
704
705 static inline int dlm_recovery_stopped(struct dlm_ls *ls)
706 {
707 return test_bit(LSFL_RECOVER_STOP, &ls->ls_flags);
708 }
709
710 static inline int dlm_no_directory(struct dlm_ls *ls)
711 {
712 return test_bit(LSFL_NODIR, &ls->ls_flags);
713 }
714
715 int dlm_netlink_init(void);
716 void dlm_netlink_exit(void);
717 void dlm_timeout_warn(struct dlm_lkb *lkb);
718 int dlm_plock_init(void);
719 void dlm_plock_exit(void);
720
721 #ifdef CONFIG_DLM_DEBUG
722 void dlm_register_debugfs(void);
723 void dlm_unregister_debugfs(void);
724 void dlm_create_debug_file(struct dlm_ls *ls);
725 void dlm_delete_debug_file(struct dlm_ls *ls);
726 #else
727 static inline void dlm_register_debugfs(void) { }
728 static inline void dlm_unregister_debugfs(void) { }
729 static inline void dlm_create_debug_file(struct dlm_ls *ls) { }
730 static inline void dlm_delete_debug_file(struct dlm_ls *ls) { }
731 #endif
732
733 #endif
734