blob: 3c98e7c6f93bb50b3a71b3cb6d11dd91aa9d1d56 [file] [log] [blame]
David Teigland869d81d2006-01-17 08:47:12 +00001/*
2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3 * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
4 *
5 * This copyrighted material is made available to anyone wishing to use,
6 * modify, copy, or redistribute it subject to the terms and conditions
Steven Whitehousee9fc2aa2006-09-01 11:05:15 -04007 * of the GNU General Public License version 2.
David Teigland869d81d2006-01-17 08:47:12 +00008 */
9
10#ifndef LOCK_DLM_DOT_H
11#define LOCK_DLM_DOT_H
12
13#include <linux/module.h>
14#include <linux/slab.h>
15#include <linux/spinlock.h>
David Teigland869d81d2006-01-17 08:47:12 +000016#include <linux/types.h>
17#include <linux/string.h>
18#include <linux/list.h>
19#include <linux/socket.h>
20#include <linux/delay.h>
21#include <linux/kthread.h>
22#include <linux/kobject.h>
23#include <linux/fcntl.h>
24#include <linux/wait.h>
25#include <net/sock.h>
26
27#include <linux/dlm.h>
David Teigland24022112008-03-14 15:09:15 -050028#include <linux/dlm_plock.h>
Fabio Massimo Di Nitto7d308592006-09-19 07:56:29 +020029#include <linux/lm_interface.h>
David Teigland869d81d2006-01-17 08:47:12 +000030
31/*
32 * Internally, we prefix things with gdlm_ and GDLM_ (for gfs-dlm) since a
33 * prefix of lock_dlm_ gets awkward. Externally, GFS refers to this module
34 * as "lock_dlm".
35 */
36
37#define GDLM_STRNAME_BYTES 24
38#define GDLM_LVB_SIZE 32
Steven Whitehousef01963f2007-04-02 10:03:24 +010039#define GDLM_DROP_COUNT 0
David Teigland869d81d2006-01-17 08:47:12 +000040#define GDLM_DROP_PERIOD 60
41#define GDLM_NAME_LEN 128
42
43/* GFS uses 12 bytes to identify a resource (32 bit type + 64 bit number).
44 We sprintf these numbers into a 24 byte string of hex values to make them
45 human-readable (to make debugging simpler.) */
46
47struct gdlm_strname {
48 unsigned char name[GDLM_STRNAME_BYTES];
49 unsigned short namelen;
50};
51
52enum {
53 DFL_BLOCK_LOCKS = 0,
54 DFL_SPECTATOR = 1,
55 DFL_WITHDRAW = 2,
56};
57
58struct gdlm_ls {
Steven Whitehousecd915492006-09-04 12:49:07 -040059 u32 id;
David Teigland869d81d2006-01-17 08:47:12 +000060 int jid;
61 int first;
62 int first_done;
63 unsigned long flags;
64 struct kobject kobj;
65 char clustername[GDLM_NAME_LEN];
66 char fsname[GDLM_NAME_LEN];
67 int fsflags;
68 dlm_lockspace_t *dlm_lockspace;
69 lm_callback_t fscb;
Steven Whitehouse1c089c32006-09-07 15:50:20 -040070 struct gfs2_sbd *sdp;
David Teigland869d81d2006-01-17 08:47:12 +000071 int recover_jid;
72 int recover_jid_done;
David Teigland6bd70ab2006-04-26 15:56:35 -040073 int recover_jid_status;
David Teigland869d81d2006-01-17 08:47:12 +000074 spinlock_t async_lock;
David Teigland869d81d2006-01-17 08:47:12 +000075 struct list_head delayed;
76 struct list_head submit;
Steven Whitehousecd915492006-09-04 12:49:07 -040077 u32 all_locks_count;
David Teigland869d81d2006-01-17 08:47:12 +000078 wait_queue_head_t wait_control;
Steven Whitehousef3c9d382008-05-21 17:21:42 +010079 struct task_struct *thread;
David Teigland869d81d2006-01-17 08:47:12 +000080 wait_queue_head_t thread_wait;
David Teigland869d81d2006-01-17 08:47:12 +000081};
82
83enum {
84 LFL_NOBLOCK = 0,
85 LFL_NOCACHE = 1,
86 LFL_DLM_UNLOCK = 2,
87 LFL_DLM_CANCEL = 3,
88 LFL_SYNC_LVB = 4,
89 LFL_FORCE_PROMOTE = 5,
90 LFL_REREQUEST = 6,
91 LFL_ACTIVE = 7,
92 LFL_INLOCK = 8,
93 LFL_CANCEL = 9,
94 LFL_NOBAST = 10,
95 LFL_HEADQUE = 11,
96 LFL_UNLOCK_DELETE = 12,
Steven Whitehouse41d7db02007-05-14 17:43:26 +010097 LFL_AST_WAIT = 13,
David Teigland869d81d2006-01-17 08:47:12 +000098};
99
100struct gdlm_lock {
101 struct gdlm_ls *ls;
102 struct lm_lockname lockname;
Steven Whitehousef35ac342007-03-18 17:04:15 +0000103 struct gdlm_strname strname;
David Teigland869d81d2006-01-17 08:47:12 +0000104 char *lvb;
105 struct dlm_lksb lksb;
106
Steven Whitehousecd915492006-09-04 12:49:07 -0400107 s16 cur;
108 s16 req;
109 s16 prev_req;
Steven Whitehouse9b47c112006-09-08 10:17:58 -0400110 u32 lkf; /* dlm flags DLM_LKF_ */
David Teigland869d81d2006-01-17 08:47:12 +0000111 unsigned long flags; /* lock_dlm flags LFL_ */
112
David Teigland869d81d2006-01-17 08:47:12 +0000113 struct list_head delay_list; /* delayed */
David Teigland869d81d2006-01-17 08:47:12 +0000114 struct gdlm_lock *hold_null; /* NL lock for hold_lvb */
115};
116
117#define gdlm_assert(assertion, fmt, args...) \
118do { \
119 if (unlikely(!(assertion))) { \
120 printk(KERN_EMERG "lock_dlm: fatal assertion failed \"%s\"\n" \
121 "lock_dlm: " fmt "\n", \
122 #assertion, ##args); \
123 BUG(); \
124 } \
125} while (0)
126
127#define log_print(lev, fmt, arg...) printk(lev "lock_dlm: " fmt "\n" , ## arg)
128#define log_info(fmt, arg...) log_print(KERN_INFO , fmt , ## arg)
129#define log_error(fmt, arg...) log_print(KERN_ERR , fmt , ## arg)
130#ifdef LOCK_DLM_LOG_DEBUG
131#define log_debug(fmt, arg...) log_print(KERN_DEBUG , fmt , ## arg)
132#else
133#define log_debug(fmt, arg...)
134#endif
135
136/* sysfs.c */
137
138int gdlm_sysfs_init(void);
139void gdlm_sysfs_exit(void);
140int gdlm_kobject_setup(struct gdlm_ls *, struct kobject *);
141void gdlm_kobject_release(struct gdlm_ls *);
142
143/* thread.c */
144
145int gdlm_init_threads(struct gdlm_ls *);
146void gdlm_release_threads(struct gdlm_ls *);
147
148/* lock.c */
149
David Teigland869d81d2006-01-17 08:47:12 +0000150void gdlm_submit_delayed(struct gdlm_ls *);
David Teigland8d3b35a2006-02-23 10:00:56 +0000151unsigned int gdlm_do_lock(struct gdlm_lock *);
David Teigland869d81d2006-01-17 08:47:12 +0000152
Steven Whitehouse9b47c112006-09-08 10:17:58 -0400153int gdlm_get_lock(void *, struct lm_lockname *, void **);
154void gdlm_put_lock(void *);
155unsigned int gdlm_lock(void *, unsigned int, unsigned int, unsigned int);
156unsigned int gdlm_unlock(void *, unsigned int);
157void gdlm_cancel(void *);
158int gdlm_hold_lvb(void *, char **);
159void gdlm_unhold_lvb(void *, char *);
David Teigland869d81d2006-01-17 08:47:12 +0000160
Adrian Bunk60b779c2008-02-17 10:20:34 +0200161/* mount.c */
162
163extern const struct lm_lockops gdlm_ops;
164
David Teigland869d81d2006-01-17 08:47:12 +0000165#endif
166