Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dlm_internal.h
Go to the documentation of this file.
1 /******************************************************************************
2 *******************************************************************************
3 **
4 ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
5 ** Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
6 **
7 ** This copyrighted material is made available to anyone wishing to use,
8 ** modify, copy, or redistribute it subject to the terms and conditions
9 ** of the GNU General Public License v.2.
10 **
11 *******************************************************************************
12 ******************************************************************************/
13 
14 #ifndef __DLM_INTERNAL_DOT_H__
15 #define __DLM_INTERNAL_DOT_H__
16 
17 /*
18  * This is the main header file to be included in each DLM source file.
19  */
20 
21 #include <linux/module.h>
22 #include <linux/slab.h>
23 #include <linux/sched.h>
24 #include <linux/types.h>
25 #include <linux/ctype.h>
26 #include <linux/spinlock.h>
27 #include <linux/vmalloc.h>
28 #include <linux/list.h>
29 #include <linux/errno.h>
30 #include <linux/random.h>
31 #include <linux/delay.h>
32 #include <linux/socket.h>
33 #include <linux/kthread.h>
34 #include <linux/kobject.h>
35 #include <linux/kref.h>
36 #include <linux/kernel.h>
37 #include <linux/jhash.h>
38 #include <linux/miscdevice.h>
39 #include <linux/mutex.h>
40 #include <linux/idr.h>
41 #include <linux/ratelimit.h>
42 #include <asm/uaccess.h>
43 
44 #include <linux/dlm.h>
45 #include "config.h"
46 
47 /* Size of the temp buffer midcomms allocates on the stack.
48  We try to make this large enough so most messages fit.
49  FIXME: should sctp make this unnecessary? */
50 
51 #define DLM_INBUF_LEN 148
52 
53 struct dlm_ls;
54 struct dlm_lkb;
55 struct dlm_rsb;
56 struct dlm_member;
57 struct dlm_rsbtable;
58 struct dlm_recover;
59 struct dlm_header;
60 struct dlm_message;
61 struct dlm_rcom;
62 struct dlm_mhandle;
63 
64 #define log_print(fmt, args...) \
65  printk(KERN_ERR "dlm: "fmt"\n" , ##args)
66 #define log_error(ls, fmt, args...) \
67  printk(KERN_ERR "dlm: %s: " fmt "\n", (ls)->ls_name , ##args)
68 
69 #define log_debug(ls, fmt, args...) \
70 do { \
71  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_limit(ls, fmt, args...) \
77 do { \
78  if (dlm_config.ci_log_debug) \
79  printk_ratelimited(KERN_DEBUG "dlm: %s: " fmt "\n", \
80  (ls)->ls_name , ##args); \
81 } while (0)
82 
83 #define DLM_ASSERT(x, do) \
84 { \
85  if (!(x)) \
86  { \
87  printk(KERN_ERR "\nDLM: Assertion failed on line %d of file %s\n" \
88  "DLM: assertion: \"%s\"\n" \
89  "DLM: time = %lu\n", \
90  __LINE__, __FILE__, #x, jiffies); \
91  {do} \
92  printk("\n"); \
93  BUG(); \
94  panic("DLM: Record message above and reboot.\n"); \
95  } \
96 }
97 
98 
99 struct dlm_rsbtable {
100  struct rb_root keep;
101  struct rb_root toss;
103 };
104 
105 
106 /*
107  * Lockspace member (per node in a ls)
108  */
109 
110 struct dlm_member {
111  struct list_head list;
112  int nodeid;
113  int weight;
114  int slot;
116  int comm_seq;
118 };
119 
120 /*
121  * Save and manage recovery state for a lockspace.
122  */
123 
124 struct dlm_recover {
125  struct list_head list;
129 };
130 
131 /*
132  * Pass input args to second stage locking function.
133  */
134 
135 struct dlm_args {
137  void (*astfn) (void *astparam);
138  void *astparam;
139  void (*bastfn) (void *astparam, int mode);
140  int mode;
141  struct dlm_lksb *lksb;
142  unsigned long timeout;
143 };
144 
145 
146 /*
147  * Lock block
148  *
149  * A lock can be one of three types:
150  *
151  * local copy lock is mastered locally
152  * (lkb_nodeid is zero and DLM_LKF_MSTCPY is not set)
153  * process copy lock is mastered on a remote node
154  * (lkb_nodeid is non-zero and DLM_LKF_MSTCPY is not set)
155  * master copy master node's copy of a lock owned by remote node
156  * (lkb_nodeid is non-zero and DLM_LKF_MSTCPY is set)
157  *
158  * lkb_exflags: a copy of the most recent flags arg provided to dlm_lock or
159  * dlm_unlock. The dlm does not modify these or use any private flags in
160  * this field; it only contains DLM_LKF_ flags from dlm.h. These flags
161  * are sent as-is to the remote master when the lock is remote.
162  *
163  * lkb_flags: internal dlm flags (DLM_IFL_ prefix) from dlm_internal.h.
164  * Some internal flags are shared between the master and process nodes;
165  * these shared flags are kept in the lower two bytes. One of these
166  * flags set on the master copy will be propagated to the process copy
167  * and v.v. Other internal flags are private to the master or process
168  * node (e.g. DLM_IFL_MSTCPY). These are kept in the high two bytes.
169  *
170  * lkb_sbflags: status block flags. These flags are copied directly into
171  * the caller's lksb.sb_flags prior to the dlm_lock/dlm_unlock completion
172  * ast. All defined in dlm.h with DLM_SBF_ prefix.
173  *
174  * lkb_status: the lock status indicates which rsb queue the lock is
175  * on, grant, convert, or wait. DLM_LKSTS_ WAITING/GRANTED/CONVERT
176  *
177  * lkb_wait_type: the dlm message type (DLM_MSG_ prefix) for which a
178  * reply is needed. Only set when the lkb is on the lockspace waiters
179  * list awaiting a reply from a remote node.
180  *
181  * lkb_nodeid: when the lkb is a local copy, nodeid is 0; when the lkb
182  * is a master copy, nodeid specifies the remote lock holder, when the
183  * lkb is a process copy, the nodeid specifies the lock master.
184  */
185 
186 /* lkb_status */
187 
188 #define DLM_LKSTS_WAITING 1
189 #define DLM_LKSTS_GRANTED 2
190 #define DLM_LKSTS_CONVERT 3
191 
192 /* lkb_flags */
193 
194 #define DLM_IFL_MSTCPY 0x00010000
195 #define DLM_IFL_RESEND 0x00020000
196 #define DLM_IFL_DEAD 0x00040000
197 #define DLM_IFL_OVERLAP_UNLOCK 0x00080000
198 #define DLM_IFL_OVERLAP_CANCEL 0x00100000
199 #define DLM_IFL_ENDOFLIFE 0x00200000
200 #define DLM_IFL_WATCH_TIMEWARN 0x00400000
201 #define DLM_IFL_TIMEOUT_CANCEL 0x00800000
202 #define DLM_IFL_DEADLOCK_CANCEL 0x01000000
203 #define DLM_IFL_STUB_MS 0x02000000 /* magic number for m_flags */
204 #define DLM_IFL_USER 0x00000001
205 #define DLM_IFL_ORPHAN 0x00000002
206 
207 #define DLM_CALLBACKS_SIZE 6
208 
209 #define DLM_CB_CAST 0x00000001
210 #define DLM_CB_BAST 0x00000002
211 #define DLM_CB_SKIP 0x00000004
212 
213 struct dlm_callback {
215  uint32_t flags; /* DLM_CBF_ */
216  int sb_status; /* copy to lksb status */
217  uint8_t sb_flags; /* copy to lksb flags */
218  int8_t mode; /* rq mode of bast, gr mode of cast */
219 };
220 
221 struct dlm_lkb {
222  struct dlm_rsb *lkb_resource; /* the rsb */
223  struct kref lkb_ref;
224  int lkb_nodeid; /* copied from rsb */
225  int lkb_ownpid; /* pid of lock owner */
226  uint32_t lkb_id; /* our lock ID */
227  uint32_t lkb_remid; /* lock ID on remote partner */
228  uint32_t lkb_exflags; /* external flags from caller */
229  uint32_t lkb_sbflags; /* lksb flags */
230  uint32_t lkb_flags; /* internal flags */
231  uint32_t lkb_lvbseq; /* lvb sequence number */
232 
233  int8_t lkb_status; /* granted, waiting, convert */
234  int8_t lkb_rqmode; /* requested lock mode */
235  int8_t lkb_grmode; /* granted lock mode */
236  int8_t lkb_highbast; /* highest mode bast sent for */
237 
238  int8_t lkb_wait_type; /* type of reply waiting for */
240  int lkb_wait_nodeid; /* for debugging */
241 
242  struct list_head lkb_statequeue; /* rsb g/c/w list */
243  struct list_head lkb_rsb_lookup; /* waiting for rsb lookup */
244  struct list_head lkb_wait_reply; /* waiting for remote reply */
245  struct list_head lkb_ownqueue; /* list of locks for a process */
249  unsigned long lkb_timeout_cs;
250 
253  struct list_head lkb_cb_list; /* for ls_cb_delay or proc->asts */
257  ktime_t lkb_last_cast_time; /* for debugging */
258  ktime_t lkb_last_bast_time; /* for debugging */
259 
260  uint64_t lkb_recover_seq; /* from ls_recover_seq */
261 
262  char *lkb_lvbptr;
263  struct dlm_lksb *lkb_lksb; /* caller's status block */
264  void (*lkb_astfn) (void *astparam);
265  void (*lkb_bastfn) (void *astparam, int mode);
266  union {
267  void *lkb_astparam; /* caller's ast arg */
269  };
270 };
271 
272 /*
273  * res_master_nodeid is "normal": 0 is unset/invalid, non-zero is the real
274  * nodeid, even when nodeid is our_nodeid.
275  *
276  * res_nodeid is "odd": -1 is unset/invalid, zero means our_nodeid,
277  * greater than zero when another nodeid.
278  *
279  * (TODO: remove res_nodeid and only use res_master_nodeid)
280  */
281 
282 struct dlm_rsb {
283  struct dlm_ls *res_ls; /* the lockspace */
284  struct kref res_ref;
285  struct mutex res_mutex;
286  unsigned long res_flags;
287  int res_length; /* length of rsb name */
291  int res_id; /* for ls_recover_idr */
294  uint32_t res_bucket; /* rsbtbl */
295  unsigned long res_toss_time;
297  struct list_head res_lookup; /* lkbs waiting on first */
298  union {
300  struct rb_node res_hashnode; /* rsbtbl */
301  };
305 
306  struct list_head res_root_list; /* used for recovery */
307  struct list_head res_recover_list; /* used for recovery */
309 
310  char *res_lvbptr;
312 };
313 
314 /* dlm_master_lookup() flags */
315 
316 #define DLM_LU_RECOVER_DIR 1
317 #define DLM_LU_RECOVER_MASTER 2
318 
319 /* dlm_master_lookup() results */
320 
321 #define DLM_LU_MATCH 1
322 #define DLM_LU_ADD 2
323 
324 /* find_rsb() flags */
325 
326 #define R_REQUEST 0x00000001
327 #define R_RECEIVE_REQUEST 0x00000002
328 #define R_RECEIVE_RECOVER 0x00000004
329 
330 /* rsb_flags */
331 
332 enum rsb_flags {
340 };
341 
342 static inline void rsb_set_flag(struct dlm_rsb *r, enum rsb_flags flag)
343 {
344  __set_bit(flag, &r->res_flags);
345 }
346 
347 static inline void rsb_clear_flag(struct dlm_rsb *r, enum rsb_flags flag)
348 {
349  __clear_bit(flag, &r->res_flags);
350 }
351 
352 static inline int rsb_flag(struct dlm_rsb *r, enum rsb_flags flag)
353 {
354  return test_bit(flag, &r->res_flags);
355 }
356 
357 
358 /* dlm_header is first element of all structs sent between nodes */
359 
360 #define DLM_HEADER_MAJOR 0x00030000
361 #define DLM_HEADER_MINOR 0x00000001
362 
363 #define DLM_HEADER_SLOTS 0x00000001
364 
365 #define DLM_MSG 1
366 #define DLM_RCOM 2
367 
368 struct dlm_header {
371  uint32_t h_nodeid; /* nodeid of sender */
373  uint8_t h_cmd; /* DLM_MSG, DLM_RCOM */
375 };
376 
377 
378 #define DLM_MSG_REQUEST 1
379 #define DLM_MSG_CONVERT 2
380 #define DLM_MSG_UNLOCK 3
381 #define DLM_MSG_CANCEL 4
382 #define DLM_MSG_REQUEST_REPLY 5
383 #define DLM_MSG_CONVERT_REPLY 6
384 #define DLM_MSG_UNLOCK_REPLY 7
385 #define DLM_MSG_CANCEL_REPLY 8
386 #define DLM_MSG_GRANT 9
387 #define DLM_MSG_BAST 10
388 #define DLM_MSG_LOOKUP 11
389 #define DLM_MSG_REMOVE 12
390 #define DLM_MSG_LOOKUP_REPLY 13
391 #define DLM_MSG_PURGE 14
392 
393 struct dlm_message {
395  uint32_t m_type; /* DLM_MSG_ */
398  uint32_t m_lkid; /* lkid on sender */
399  uint32_t m_remid; /* lkid on receiver */
407  int m_status;
408  int m_grmode;
409  int m_rqmode;
411  int m_asts;
412  int m_result; /* 0 or -EXXX */
413  char m_extra[0]; /* name or lvb */
414 };
415 
416 
417 #define DLM_RS_NODES 0x00000001
418 #define DLM_RS_NODES_ALL 0x00000002
419 #define DLM_RS_DIR 0x00000004
420 #define DLM_RS_DIR_ALL 0x00000008
421 #define DLM_RS_LOCKS 0x00000010
422 #define DLM_RS_LOCKS_ALL 0x00000020
423 #define DLM_RS_DONE 0x00000040
424 #define DLM_RS_DONE_ALL 0x00000080
425 
426 #define DLM_RCOM_STATUS 1
427 #define DLM_RCOM_NAMES 2
428 #define DLM_RCOM_LOOKUP 3
429 #define DLM_RCOM_LOCK 4
430 #define DLM_RCOM_STATUS_REPLY 5
431 #define DLM_RCOM_NAMES_REPLY 6
432 #define DLM_RCOM_LOOKUP_REPLY 7
433 #define DLM_RCOM_LOCK_REPLY 8
434 
435 struct dlm_rcom {
437  uint32_t rc_type; /* DLM_RCOM_ */
438  int rc_result; /* multi-purpose */
439  uint64_t rc_id; /* match reply with request */
440  uint64_t rc_seq; /* sender's ls_recover_seq */
441  uint64_t rc_seq_reply; /* remote ls_recover_seq */
442  char rc_buf[0];
443 };
444 
445 union dlm_packet {
446  struct dlm_header header; /* common to other two */
448  struct dlm_rcom rcom;
449 };
450 
451 #define DLM_RSF_NEED_SLOTS 0x00000001
452 
453 /* RCOM_STATUS data */
454 struct rcom_status {
458 };
459 
460 /* RCOM_STATUS_REPLY data */
461 struct rcom_config {
464 
465  /* DLM_HEADER_SLOTS adds: */
472 };
473 
474 struct rcom_slot {
479 };
480 
481 struct rcom_lock {
498  char rl_lvb[0];
499 };
500 
501 /*
502  * The max number of resources per rsbtbl bucket that shrink will attempt
503  * to remove in each iteration.
504  */
505 
506 #define DLM_REMOVE_NAMES_MAX 8
507 
508 struct dlm_ls {
509  struct list_head ls_list; /* list of lockspaces */
511  uint32_t ls_global_id; /* global unique lockspace ID */
515  int ls_count; /* refcount of processes in
516  the dlm using this ls */
517  int ls_create_count; /* create/release refcount */
518  unsigned long ls_flags; /* LSFL_ */
519  unsigned long ls_scan_time;
520  struct kobject ls_kobj;
521 
522  struct idr ls_lkbidr;
524 
527 
529  struct list_head ls_waiters; /* lkbs needing a reply */
530 
533 
536 
539  struct list_head ls_new_rsb; /* new rsb structs */
540 
546 
547  struct list_head ls_nodes; /* current nodes in ls */
548  struct list_head ls_nodes_gone; /* dead node list, recovery */
549  int ls_num_nodes; /* number of nodes in ls */
553 
554  int ls_slot;
558 
559  struct dlm_rsb ls_stub_rsb; /* for returning errors */
560  struct dlm_lkb ls_stub_lkb; /* for returning errors */
561  struct dlm_message ls_stub_ms; /* for faking a reply */
562 
563  struct dentry *ls_debug_rsb_dentry; /* debugfs */
564  struct dentry *ls_debug_waiters_dentry; /* debugfs */
565  struct dentry *ls_debug_locks_dentry; /* debugfs */
566  struct dentry *ls_debug_all_dentry; /* debugfs */
567  struct dentry *ls_debug_toss_dentry; /* debugfs */
568 
569  wait_queue_head_t ls_uevent_wait; /* user part of join/leave */
573 
575 
577 
578  /* recovery related */
579 
581  struct list_head ls_cb_delay; /* save for queue_work later */
586  unsigned long ls_recover_begin; /* jiffies timestamp */
590  struct rw_semaphore ls_in_recovery; /* block local requests */
591  struct rw_semaphore ls_recv_active; /* block dlm_recv */
592  struct list_head ls_requestqueue;/* queue remote requests */
595  int ls_recover_nodeid; /* for debugging */
596  unsigned int ls_recover_dir_sent_res; /* for log info */
597  unsigned int ls_recover_dir_sent_msg; /* for log info */
598  unsigned int ls_recover_locks_in; /* for log info */
609 
610  struct list_head ls_root_list; /* root resources */
611  struct rw_semaphore ls_root_sem; /* protect root_list */
612 
613  const struct dlm_lockspace_ops *ls_ops;
614  void *ls_ops_arg;
615 
617  char ls_name[1];
618 };
619 
620 /*
621  * LSFL_RECOVER_STOP - dlm_ls_stop() sets this to tell dlm recovery routines
622  * that they should abort what they're doing so new recovery can be started.
623  *
624  * LSFL_RECOVER_DOWN - dlm_ls_stop() sets this to tell dlm_recoverd that it
625  * should do down_write() on the in_recovery rw_semaphore. (doing down_write
626  * within dlm_ls_stop causes complaints about the lock acquired/released
627  * in different contexts.)
628  *
629  * LSFL_RECOVER_LOCK - dlm_recoverd holds the in_recovery rw_semaphore.
630  * It sets this after it is done with down_write() on the in_recovery
631  * rw_semaphore and clears it after it has released the rw_semaphore.
632  *
633  * LSFL_RECOVER_WORK - dlm_ls_start() sets this to tell dlm_recoverd that it
634  * should begin recovery of the lockspace.
635  *
636  * LSFL_RUNNING - set when normal locking activity is enabled.
637  * dlm_ls_stop() clears this to tell dlm locking routines that they should
638  * quit what they are doing so recovery can run. dlm_recoverd sets
639  * this after recovery is finished.
640  */
641 
642 #define LSFL_RECOVER_STOP 0
643 #define LSFL_RECOVER_DOWN 1
644 #define LSFL_RECOVER_LOCK 2
645 #define LSFL_RECOVER_WORK 3
646 #define LSFL_RUNNING 4
647 
648 #define LSFL_RCOM_READY 5
649 #define LSFL_RCOM_WAIT 6
650 #define LSFL_UEVENT_WAIT 7
651 #define LSFL_TIMEWARN 8
652 #define LSFL_CB_DELAY 9
653 #define LSFL_NODIR 10
654 
655 /* much of this is just saving user space pointers associated with the
656  lock that we pass back to the user lib with an ast */
657 
659  struct dlm_user_proc *proc; /* each process that opens the lockspace
660  device has private data
661  (dlm_user_proc) on the struct file,
662  the process's locks point back to it*/
663  struct dlm_lksb lksb;
670 };
671 
672 #define DLM_PROC_FLAGS_CLOSING 1
673 #define DLM_PROC_FLAGS_COMPAT 2
674 
675 /* locks list is kept so we can remove all a process's locks when it
676  exits (or orphan those that are persistent) */
677 
680  unsigned long flags; /* DLM_PROC_FLAGS */
681  struct list_head asts;
683  struct list_head locks;
687 };
688 
689 static inline int dlm_locking_stopped(struct dlm_ls *ls)
690 {
691  return !test_bit(LSFL_RUNNING, &ls->ls_flags);
692 }
693 
694 static inline int dlm_recovery_stopped(struct dlm_ls *ls)
695 {
696  return test_bit(LSFL_RECOVER_STOP, &ls->ls_flags);
697 }
698 
699 static inline int dlm_no_directory(struct dlm_ls *ls)
700 {
701  return test_bit(LSFL_NODIR, &ls->ls_flags);
702 }
703 
704 int dlm_netlink_init(void);
705 void dlm_netlink_exit(void);
706 void dlm_timeout_warn(struct dlm_lkb *lkb);
707 int dlm_plock_init(void);
708 void dlm_plock_exit(void);
709 
710 #ifdef CONFIG_DLM_DEBUG
711 int dlm_register_debugfs(void);
712 void dlm_unregister_debugfs(void);
713 int dlm_create_debug_file(struct dlm_ls *ls);
714 void dlm_delete_debug_file(struct dlm_ls *ls);
715 #else
716 static inline int dlm_register_debugfs(void) { return 0; }
717 static inline void dlm_unregister_debugfs(void) { }
718 static inline int dlm_create_debug_file(struct dlm_ls *ls) { return 0; }
719 static inline void dlm_delete_debug_file(struct dlm_ls *ls) { }
720 #endif
721 
722 #endif /* __DLM_INTERNAL_DOT_H__ */
723