Blame view

fs/gfs2/glock.h 7.15 KB
b3b94faa5   David Teigland   [GFS2] The core o...
1
2
  /*
   * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
3a8a9a103   Steven Whitehouse   [GFS2] Update cop...
3
   * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
b3b94faa5   David Teigland   [GFS2] The core o...
4
5
6
   *
   * This copyrighted material is made available to anyone wishing to use,
   * modify, copy, or redistribute it subject to the terms and conditions
e9fc2aa09   Steven Whitehouse   [GFS2] Update cop...
7
   * of the GNU General Public License version 2.
b3b94faa5   David Teigland   [GFS2] The core o...
8
9
10
11
   */
  
  #ifndef __GLOCK_DOT_H__
  #define __GLOCK_DOT_H__
e8edc6e03   Alexey Dobriyan   Detach sched.h fr...
12
  #include <linux/sched.h>
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
13
  #include <linux/parser.h>
f2f7ba523   Steven Whitehouse   [GFS2] Make heade...
14
  #include "incore.h"
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  /* Options for hostdata parser */
  
  enum {
  	Opt_jid,
  	Opt_id,
  	Opt_first,
  	Opt_nodir,
  	Opt_err,
  };
  
  /*
   * lm_lockname types
   */
  
  #define LM_TYPE_RESERVED	0x00
  #define LM_TYPE_NONDISK		0x01
  #define LM_TYPE_INODE		0x02
  #define LM_TYPE_RGRP		0x03
  #define LM_TYPE_META		0x04
  #define LM_TYPE_IOPEN		0x05
  #define LM_TYPE_FLOCK		0x06
  #define LM_TYPE_PLOCK		0x07
  #define LM_TYPE_QUOTA		0x08
  #define LM_TYPE_JOURNAL		0x09
  
  /*
   * lm_lock() states
   *
   * SHARED is compatible with SHARED, not with DEFERRED or EX.
   * DEFERRED is compatible with DEFERRED, not with SHARED or EX.
   */
  
  #define LM_ST_UNLOCKED		0
  #define LM_ST_EXCLUSIVE		1
  #define LM_ST_DEFERRED		2
  #define LM_ST_SHARED		3
  
  /*
   * lm_lock() flags
   *
   * LM_FLAG_TRY
   * Don't wait to acquire the lock if it can't be granted immediately.
   *
   * LM_FLAG_TRY_1CB
   * Send one blocking callback if TRY is set and the lock is not granted.
   *
   * LM_FLAG_NOEXP
   * GFS sets this flag on lock requests it makes while doing journal recovery.
   * These special requests should not be blocked due to the recovery like
   * ordinary locks would be.
   *
   * LM_FLAG_ANY
   * A SHARED request may also be granted in DEFERRED, or a DEFERRED request may
   * also be granted in SHARED.  The preferred state is whichever is compatible
   * with other granted locks, or the specified state if no other locks exist.
   *
   * LM_FLAG_PRIORITY
   * Override fairness considerations.  Suppose a lock is held in a shared state
   * and there is a pending request for the deferred state.  A shared lock
   * request with the priority flag would be allowed to bypass the deferred
   * request and directly join the other shared lock.  A shared lock request
   * without the priority flag might be forced to wait until the deferred
   * requested had acquired and released the lock.
   */
b3b94faa5   David Teigland   [GFS2] The core o...
79
80
81
82
  #define LM_FLAG_TRY		0x00000001
  #define LM_FLAG_TRY_1CB		0x00000002
  #define LM_FLAG_NOEXP		0x00000004
  #define LM_FLAG_ANY		0x00000008
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
83
84
85
86
  #define LM_FLAG_PRIORITY	0x00000010
  #define GL_ASYNC		0x00000040
  #define GL_EXACT		0x00000080
  #define GL_SKIP			0x00000100
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
87
88
89
  #define GL_NOCACHE		0x00000400
    
  /*
921169ca2   Steven Whitehouse   GFS2: Clean up of...
90
   * lm_async_cb return flags
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
91
92
93
94
95
96
97
   *
   * LM_OUT_ST_MASK
   * Masks the lower two bits of lock state in the returned value.
   *
   * LM_OUT_CANCELED
   * The lock request was canceled.
   *
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
98
99
100
101
   */
  
  #define LM_OUT_ST_MASK		0x00000003
  #define LM_OUT_CANCELED		0x00000008
921169ca2   Steven Whitehouse   GFS2: Clean up of...
102
  #define LM_OUT_ERROR		0x00000004
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
103
104
105
106
107
108
109
110
111
  
  /*
   * lm_recovery_done() messages
   */
  
  #define LM_RD_GAVEUP		308
  #define LM_RD_SUCCESS		309
  
  #define GLR_TRYFAILED		13
7cf8dcd3b   Bob Peterson   GFS2: Automatical...
112
113
114
115
116
  #define GL_GLOCK_MAX_HOLD        (long)(HZ / 5)
  #define GL_GLOCK_DFT_HOLD        (long)(HZ / 5)
  #define GL_GLOCK_MIN_HOLD        (long)(10)
  #define GL_GLOCK_HOLD_INCR       (long)(HZ / 20)
  #define GL_GLOCK_HOLD_DECR       (long)(HZ / 40)
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
117
118
  struct lm_lockops {
  	const char *lm_proto_name;
e0c2a9aa1   David Teigland   GFS2: dlm based r...
119
120
121
122
123
  	int (*lm_mount) (struct gfs2_sbd *sdp, const char *table);
  	void (*lm_first_done) (struct gfs2_sbd *sdp);
  	void (*lm_recovery_result) (struct gfs2_sbd *sdp, unsigned int jid,
  				    unsigned int result);
  	void (*lm_unmount) (struct gfs2_sbd *sdp);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
124
  	void (*lm_withdraw) (struct gfs2_sbd *sdp);
bc015cb84   Steven Whitehouse   GFS2: Use RCU for...
125
  	void (*lm_put_lock) (struct gfs2_glock *gl);
921169ca2   Steven Whitehouse   GFS2: Clean up of...
126
127
  	int (*lm_lock) (struct gfs2_glock *gl, unsigned int req_state,
  			unsigned int flags);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
128
129
130
  	void (*lm_cancel) (struct gfs2_glock *gl);
  	const match_table_t *lm_tokens;
  };
b94a170e9   Benjamin Marzinski   GFS2: remove dcac...
131
  extern struct workqueue_struct *gfs2_delete_workqueue;
7afd88d91   Steven Whitehouse   [GFS2] Fix a page...
132
  static inline struct gfs2_holder *gfs2_glock_is_locked_by_me(struct gfs2_glock *gl)
b3b94faa5   David Teigland   [GFS2] The core o...
133
134
  {
  	struct gfs2_holder *gh;
b1e058da5   Pavel Emelyanov   gfs2: make gfs2_h...
135
  	struct pid *pid;
b3b94faa5   David Teigland   [GFS2] The core o...
136
137
138
  
  	/* Look in glock's list of holders for one with current task as owner */
  	spin_lock(&gl->gl_spin);
b1e058da5   Pavel Emelyanov   gfs2: make gfs2_h...
139
  	pid = task_pid(current);
b3b94faa5   David Teigland   [GFS2] The core o...
140
  	list_for_each_entry(gh, &gl->gl_holders, gh_list) {
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
141
142
  		if (!test_bit(HIF_HOLDER, &gh->gh_iflags))
  			break;
7afd88d91   Steven Whitehouse   [GFS2] Fix a page...
143
144
  		if (gh->gh_owner_pid == pid)
  			goto out;
b3b94faa5   David Teigland   [GFS2] The core o...
145
  	}
7afd88d91   Steven Whitehouse   [GFS2] Fix a page...
146
147
  	gh = NULL;
  out:
b3b94faa5   David Teigland   [GFS2] The core o...
148
  	spin_unlock(&gl->gl_spin);
7afd88d91   Steven Whitehouse   [GFS2] Fix a page...
149
  	return gh;
b3b94faa5   David Teigland   [GFS2] The core o...
150
151
152
153
  }
  
  static inline int gfs2_glock_is_held_excl(struct gfs2_glock *gl)
  {
502999654   Steven Whitehouse   [GFS2] Tidy up lo...
154
  	return gl->gl_state == LM_ST_EXCLUSIVE;
b3b94faa5   David Teigland   [GFS2] The core o...
155
156
157
158
  }
  
  static inline int gfs2_glock_is_held_dfrd(struct gfs2_glock *gl)
  {
502999654   Steven Whitehouse   [GFS2] Tidy up lo...
159
  	return gl->gl_state == LM_ST_DEFERRED;
b3b94faa5   David Teigland   [GFS2] The core o...
160
161
162
163
  }
  
  static inline int gfs2_glock_is_held_shrd(struct gfs2_glock *gl)
  {
502999654   Steven Whitehouse   [GFS2] Tidy up lo...
164
  	return gl->gl_state == LM_ST_SHARED;
b3b94faa5   David Teigland   [GFS2] The core o...
165
  }
009d85183   Steven Whitehouse   GFS2: Metadata ad...
166
167
168
169
170
171
  static inline struct address_space *gfs2_glock2aspace(struct gfs2_glock *gl)
  {
  	if (gl->gl_ops->go_flags & GLOF_ASPACE)
  		return (struct address_space *)(gl + 1);
  	return NULL;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
172
  int gfs2_glock_get(struct gfs2_sbd *sdp,
cd915493f   Steven Whitehouse   [GFS2] Change all...
173
  		   u64 number, const struct gfs2_glock_operations *glops,
b3b94faa5   David Teigland   [GFS2] The core o...
174
  		   int create, struct gfs2_glock **glp);
b94a170e9   Benjamin Marzinski   GFS2: remove dcac...
175
176
  void gfs2_glock_hold(struct gfs2_glock *gl);
  void gfs2_glock_put_nolock(struct gfs2_glock *gl);
bc015cb84   Steven Whitehouse   GFS2: Use RCU for...
177
  void gfs2_glock_put(struct gfs2_glock *gl);
190562bd8   Steven Whitehouse   [GFS2] Fix a bug:...
178
  void gfs2_holder_init(struct gfs2_glock *gl, unsigned int state, unsigned flags,
b3b94faa5   David Teigland   [GFS2] The core o...
179
  		      struct gfs2_holder *gh);
190562bd8   Steven Whitehouse   [GFS2] Fix a bug:...
180
181
  void gfs2_holder_reinit(unsigned int state, unsigned flags,
  			struct gfs2_holder *gh);
b3b94faa5   David Teigland   [GFS2] The core o...
182
  void gfs2_holder_uninit(struct gfs2_holder *gh);
b3b94faa5   David Teigland   [GFS2] The core o...
183
184
185
186
  int gfs2_glock_nq(struct gfs2_holder *gh);
  int gfs2_glock_poll(struct gfs2_holder *gh);
  int gfs2_glock_wait(struct gfs2_holder *gh);
  void gfs2_glock_dq(struct gfs2_holder *gh);
d93cfa988   Abhijith Das   [GFS2] Fix deallo...
187
  void gfs2_glock_dq_wait(struct gfs2_holder *gh);
b3b94faa5   David Teigland   [GFS2] The core o...
188

b3b94faa5   David Teigland   [GFS2] The core o...
189
190
  void gfs2_glock_dq_uninit(struct gfs2_holder *gh);
  int gfs2_glock_nq_num(struct gfs2_sbd *sdp,
cd915493f   Steven Whitehouse   [GFS2] Change all...
191
  		      u64 number, const struct gfs2_glock_operations *glops,
b3b94faa5   David Teigland   [GFS2] The core o...
192
193
194
195
196
  		      unsigned int state, int flags, struct gfs2_holder *gh);
  
  int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs);
  void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs);
  void gfs2_glock_dq_uninit_m(unsigned int num_gh, struct gfs2_holder *ghs);
edc221d00   Joe Perches   GFS2: fs/gfs2/glo...
197

b9075fa96   Joe Perches   treewide: use __p...
198
  __printf(2, 3)
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
199
  void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...);
b3b94faa5   David Teigland   [GFS2] The core o...
200

d0dc80dba   Steven Whitehouse   [GFS2] Update deb...
201
  /**
33027af63   Andrea Gelmini   GFS2: fixed typo
202
   * gfs2_glock_nq_init - initialize a holder and enqueue it on a glock
d0dc80dba   Steven Whitehouse   [GFS2] Update deb...
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
   * @gl: the glock
   * @state: the state we're requesting
   * @flags: the modifier flags
   * @gh: the holder structure
   *
   * Returns: 0, GLR_*, or errno
   */
  
  static inline int gfs2_glock_nq_init(struct gfs2_glock *gl,
  				     unsigned int state, int flags,
  				     struct gfs2_holder *gh)
  {
  	int error;
  
  	gfs2_holder_init(gl, state, flags, gh);
  
  	error = gfs2_glock_nq(gh);
  	if (error)
  		gfs2_holder_uninit(gh);
  
  	return error;
  }
bc015cb84   Steven Whitehouse   GFS2: Use RCU for...
225
226
  extern void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state);
  extern void gfs2_glock_complete(struct gfs2_glock *gl, int ret);
bc015cb84   Steven Whitehouse   GFS2: Use RCU for...
227
228
229
  extern void gfs2_gl_hash_clear(struct gfs2_sbd *sdp);
  extern void gfs2_glock_finish_truncate(struct gfs2_inode *ip);
  extern void gfs2_glock_thaw(struct gfs2_sbd *sdp);
29687a2ac   Steven Whitehouse   GFS2: Alter point...
230
  extern void gfs2_glock_add_to_lru(struct gfs2_glock *gl);
fc0e38dae   Steven Whitehouse   GFS2: Fix glock d...
231
  extern void gfs2_glock_free(struct gfs2_glock *gl);
bc015cb84   Steven Whitehouse   GFS2: Use RCU for...
232
233
234
235
236
237
238
239
  
  extern int __init gfs2_glock_init(void);
  extern void gfs2_glock_exit(void);
  
  extern int gfs2_create_debugfs_file(struct gfs2_sbd *sdp);
  extern void gfs2_delete_debugfs_file(struct gfs2_sbd *sdp);
  extern int gfs2_register_debugfs(void);
  extern void gfs2_unregister_debugfs(void);
85d1da67f   Steven Whitehouse   [GFS2] Move glock...
240

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
241
  extern const struct lm_lockops gfs2_dlm_ops;
b3b94faa5   David Teigland   [GFS2] The core o...
242
  #endif /* __GLOCK_DOT_H__ */