Blame view

fs/gfs2/glops.c 10.5 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
   */
b3b94faa5   David Teigland   [GFS2] The core o...
9
10
11
12
  #include <linux/slab.h>
  #include <linux/spinlock.h>
  #include <linux/completion.h>
  #include <linux/buffer_head.h>
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
13
  #include <linux/gfs2_ondisk.h>
7d308590a   Fabio Massimo Di Nitto   [GFS2] Export lm_...
14
  #include <linux/lm_interface.h>
b3b94faa5   David Teigland   [GFS2] The core o...
15
16
  
  #include "gfs2.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
17
  #include "incore.h"
b3b94faa5   David Teigland   [GFS2] The core o...
18
19
20
21
22
23
  #include "bmap.h"
  #include "glock.h"
  #include "glops.h"
  #include "inode.h"
  #include "log.h"
  #include "meta_io.h"
b3b94faa5   David Teigland   [GFS2] The core o...
24
25
  #include "recovery.h"
  #include "rgrp.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
26
  #include "util.h"
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
27
  #include "trans.h"
b3b94faa5   David Teigland   [GFS2] The core o...
28

ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
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
  /**
   * ail_empty_gl - remove all buffers for a given lock from the AIL
   * @gl: the glock
   *
   * None of the buffers should be dirty, locked, or pinned.
   */
  
  static void gfs2_ail_empty_gl(struct gfs2_glock *gl)
  {
  	struct gfs2_sbd *sdp = gl->gl_sbd;
  	unsigned int blocks;
  	struct list_head *head = &gl->gl_ail_list;
  	struct gfs2_bufdata *bd;
  	struct buffer_head *bh;
  	u64 blkno;
  	int error;
  
  	blocks = atomic_read(&gl->gl_ail_count);
  	if (!blocks)
  		return;
  
  	error = gfs2_trans_begin(sdp, 0, blocks);
  	if (gfs2_assert_withdraw(sdp, !error))
  		return;
  
  	gfs2_log_lock(sdp);
  	while (!list_empty(head)) {
  		bd = list_entry(head->next, struct gfs2_bufdata,
  				bd_ail_gl_list);
  		bh = bd->bd_bh;
  		blkno = bh->b_blocknr;
  		gfs2_assert_withdraw(sdp, !buffer_busy(bh));
  
  		bd->bd_ail = NULL;
  		list_del(&bd->bd_ail_st_list);
  		list_del(&bd->bd_ail_gl_list);
  		atomic_dec(&gl->gl_ail_count);
  		brelse(bh);
  		gfs2_log_unlock(sdp);
  
  		gfs2_trans_add_revoke(sdp, blkno);
  
  		gfs2_log_lock(sdp);
  	}
  	gfs2_assert_withdraw(sdp, !atomic_read(&gl->gl_ail_count));
  	gfs2_log_unlock(sdp);
  
  	gfs2_trans_end(sdp);
  	gfs2_log_flush(sdp, NULL);
  }
ba7f72901   Steven Whitehouse   [GFS2] Remove pag...
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  
  /**
   * gfs2_pte_inval - Sync and invalidate all PTEs associated with a glock
   * @gl: the glock
   *
   */
  
  static void gfs2_pte_inval(struct gfs2_glock *gl)
  {
  	struct gfs2_inode *ip;
  	struct inode *inode;
  
  	ip = gl->gl_object;
  	inode = &ip->i_inode;
b60623c23   Steven Whitehouse   [GFS2] Shrink gfs...
93
  	if (!ip || !S_ISREG(inode->i_mode))
ba7f72901   Steven Whitehouse   [GFS2] Remove pag...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  		return;
  
  	if (!test_bit(GIF_PAGED, &ip->i_flags))
  		return;
  
  	unmap_shared_mapping_range(inode->i_mapping, 0, 0);
  
  	if (test_bit(GIF_SW_PAGED, &ip->i_flags))
  		set_bit(GLF_DIRTY, &gl->gl_flags);
  
  	clear_bit(GIF_SW_PAGED, &ip->i_flags);
  }
  
  /**
b3b94faa5   David Teigland   [GFS2] The core o...
108
109
   * meta_go_sync - sync out the metadata for this glock
   * @gl: the glock
b3b94faa5   David Teigland   [GFS2] The core o...
110
111
112
113
114
   *
   * Called when demoting or unlocking an EX glock.  We must flush
   * to disk all dirty buffers/pages relating to this glock, and must not
   * not return to caller to demote/unlock the glock until I/O is complete.
   */
1a14d3a68   Steven Whitehouse   [GFS2] Simplify g...
115
  static void meta_go_sync(struct gfs2_glock *gl)
b3b94faa5   David Teigland   [GFS2] The core o...
116
  {
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
117
118
  	if (gl->gl_state != LM_ST_EXCLUSIVE)
  		return;
b3b94faa5   David Teigland   [GFS2] The core o...
119
  	if (test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) {
b09e593d7   Steven Whitehouse   [GFS2] Fix a ref ...
120
  		gfs2_log_flush(gl->gl_sbd, gl);
7276b3b0c   Steven Whitehouse   [GFS2] Tidy up me...
121
  		gfs2_meta_sync(gl);
1a14d3a68   Steven Whitehouse   [GFS2] Simplify g...
122
  		gfs2_ail_empty_gl(gl);
b3b94faa5   David Teigland   [GFS2] The core o...
123
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  }
  
  /**
   * meta_go_inval - invalidate the metadata for this glock
   * @gl: the glock
   * @flags:
   *
   */
  
  static void meta_go_inval(struct gfs2_glock *gl, int flags)
  {
  	if (!(flags & DIO_METADATA))
  		return;
  
  	gfs2_meta_inval(gl);
  	gl->gl_vn++;
  }
  
  /**
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
143
144
145
146
147
148
149
150
151
152
153
154
155
   * inode_go_sync - Sync the dirty data and/or metadata for an inode glock
   * @gl: the glock protecting the inode
   *
   */
  
  static void inode_go_sync(struct gfs2_glock *gl)
  {
  	struct gfs2_inode *ip = gl->gl_object;
  
  	if (ip && !S_ISREG(ip->i_inode.i_mode))
  		ip = NULL;
  
  	if (test_bit(GLF_DIRTY, &gl->gl_flags)) {
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
156
157
  		if (ip)
  			filemap_fdatawrite(ip->i_inode.i_mapping);
b524fe646   Benjamin Marzinski   [GFS2] flush the ...
158
  		gfs2_log_flush(gl->gl_sbd, gl);
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
159
160
161
162
  		gfs2_meta_sync(gl);
  		if (ip) {
  			struct address_space *mapping = ip->i_inode.i_mapping;
  			int error = filemap_fdatawait(mapping);
3e9f45bd1   Guillaume Chazarain   Factor outstandin...
163
  			mapping_set_error(mapping, error);
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
164
165
166
167
168
169
170
  		}
  		clear_bit(GLF_DIRTY, &gl->gl_flags);
  		gfs2_ail_empty_gl(gl);
  	}
  }
  
  /**
b3b94faa5   David Teigland   [GFS2] The core o...
171
172
173
174
175
176
   * inode_go_xmote_th - promote/demote a glock
   * @gl: the glock
   * @state: the requested state
   * @flags:
   *
   */
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
177
  static void inode_go_xmote_th(struct gfs2_glock *gl)
b3b94faa5   David Teigland   [GFS2] The core o...
178
179
180
  {
  	if (gl->gl_state != LM_ST_UNLOCKED)
  		gfs2_pte_inval(gl);
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
181
182
  	if (gl->gl_state == LM_ST_EXCLUSIVE)
  		inode_go_sync(gl);
b3b94faa5   David Teigland   [GFS2] The core o...
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
  }
  
  /**
   * inode_go_xmote_bh - After promoting/demoting a glock
   * @gl: the glock
   *
   */
  
  static void inode_go_xmote_bh(struct gfs2_glock *gl)
  {
  	struct gfs2_holder *gh = gl->gl_req_gh;
  	struct buffer_head *bh;
  	int error;
  
  	if (gl->gl_state != LM_ST_UNLOCKED &&
  	    (!gh || !(gh->gh_flags & GL_SKIP))) {
7276b3b0c   Steven Whitehouse   [GFS2] Tidy up me...
199
  		error = gfs2_meta_read(gl, gl->gl_name.ln_number, 0, &bh);
b3b94faa5   David Teigland   [GFS2] The core o...
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
  		if (!error)
  			brelse(bh);
  	}
  }
  
  /**
   * inode_go_drop_th - unlock a glock
   * @gl: the glock
   *
   * Invoked from rq_demote().
   * Another node needs the lock in EXCLUSIVE mode, or lock (unused for too long)
   * is being purged from our node's glock cache; we're dropping lock.
   */
  
  static void inode_go_drop_th(struct gfs2_glock *gl)
  {
  	gfs2_pte_inval(gl);
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
217
218
  	if (gl->gl_state == LM_ST_EXCLUSIVE)
  		inode_go_sync(gl);
b3b94faa5   David Teigland   [GFS2] The core o...
219
220
221
222
223
224
225
226
227
228
229
  }
  
  /**
   * inode_go_inval - prepare a inode glock to be released
   * @gl: the glock
   * @flags:
   *
   */
  
  static void inode_go_inval(struct gfs2_glock *gl, int flags)
  {
b004157ab   Steven Whitehouse   [GFS2] Fix journa...
230
  	struct gfs2_inode *ip = gl->gl_object;
b3b94faa5   David Teigland   [GFS2] The core o...
231
  	int meta = (flags & DIO_METADATA);
b3b94faa5   David Teigland   [GFS2] The core o...
232
233
234
  
  	if (meta) {
  		gfs2_meta_inval(gl);
b004157ab   Steven Whitehouse   [GFS2] Fix journa...
235
236
237
238
239
240
  		if (ip)
  			set_bit(GIF_INVALID, &ip->i_flags);
  	}
  
  	if (ip && S_ISREG(ip->i_inode.i_mode)) {
  		truncate_inode_pages(ip->i_inode.i_mapping, 0);
b004157ab   Steven Whitehouse   [GFS2] Fix journa...
241
  		clear_bit(GIF_PAGED, &ip->i_flags);
b3b94faa5   David Teigland   [GFS2] The core o...
242
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
243
244
245
246
247
248
249
250
251
252
253
254
255
  }
  
  /**
   * inode_go_demote_ok - Check to see if it's ok to unlock an inode glock
   * @gl: the glock
   *
   * Returns: 1 if it's ok
   */
  
  static int inode_go_demote_ok(struct gfs2_glock *gl)
  {
  	struct gfs2_sbd *sdp = gl->gl_sbd;
  	int demote = 0;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
256
  	if (!gl->gl_object && !gl->gl_aspace->i_mapping->nrpages)
b3b94faa5   David Teigland   [GFS2] The core o...
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
  		demote = 1;
  	else if (!sdp->sd_args.ar_localcaching &&
  		 time_after_eq(jiffies, gl->gl_stamp +
  			       gfs2_tune_get(sdp, gt_demote_secs) * HZ))
  		demote = 1;
  
  	return demote;
  }
  
  /**
   * inode_go_lock - operation done after an inode lock is locked by a process
   * @gl: the glock
   * @flags:
   *
   * Returns: errno
   */
  
  static int inode_go_lock(struct gfs2_holder *gh)
  {
  	struct gfs2_glock *gl = gh->gh_gl;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
277
  	struct gfs2_inode *ip = gl->gl_object;
b3b94faa5   David Teigland   [GFS2] The core o...
278
279
280
281
  	int error = 0;
  
  	if (!ip)
  		return 0;
bfded27ba   Steven Whitehouse   [GFS2] Shrink gfs...
282
  	if (test_bit(GIF_INVALID, &ip->i_flags)) {
b3b94faa5   David Teigland   [GFS2] The core o...
283
284
285
  		error = gfs2_inode_refresh(ip);
  		if (error)
  			return error;
b3b94faa5   David Teigland   [GFS2] The core o...
286
287
288
289
  	}
  
  	if ((ip->i_di.di_flags & GFS2_DIF_TRUNC_IN_PROG) &&
  	    (gl->gl_state == LM_ST_EXCLUSIVE) &&
1c0f4872d   Steven Whitehouse   [GFS2] Remove loc...
290
  	    (gh->gh_state == LM_ST_EXCLUSIVE))
b3b94faa5   David Teigland   [GFS2] The core o...
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
  		error = gfs2_truncatei_resume(ip);
  
  	return error;
  }
  
  /**
   * inode_go_unlock - operation done before an inode lock is unlocked by a
   *		     process
   * @gl: the glock
   * @flags:
   *
   */
  
  static void inode_go_unlock(struct gfs2_holder *gh)
  {
  	struct gfs2_glock *gl = gh->gh_gl;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
307
  	struct gfs2_inode *ip = gl->gl_object;
b3b94faa5   David Teigland   [GFS2] The core o...
308

9e2dbdac3   Steven Whitehouse   [GFS2] Remove gfs...
309
310
  	if (ip)
  		gfs2_meta_cache_flush(ip);
b3b94faa5   David Teigland   [GFS2] The core o...
311
312
313
  }
  
  /**
b3b94faa5   David Teigland   [GFS2] The core o...
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
   * rgrp_go_demote_ok - Check to see if it's ok to unlock a RG's glock
   * @gl: the glock
   *
   * Returns: 1 if it's ok
   */
  
  static int rgrp_go_demote_ok(struct gfs2_glock *gl)
  {
  	return !gl->gl_aspace->i_mapping->nrpages;
  }
  
  /**
   * rgrp_go_lock - operation done after an rgrp lock is locked by
   *    a first holder on this node.
   * @gl: the glock
   * @flags:
   *
   * Returns: errno
   */
  
  static int rgrp_go_lock(struct gfs2_holder *gh)
  {
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
336
  	return gfs2_rgrp_bh_get(gh->gh_gl->gl_object);
b3b94faa5   David Teigland   [GFS2] The core o...
337
338
339
340
341
342
343
344
345
346
347
348
  }
  
  /**
   * rgrp_go_unlock - operation done before an rgrp lock is unlocked by
   *    a last holder on this node.
   * @gl: the glock
   * @flags:
   *
   */
  
  static void rgrp_go_unlock(struct gfs2_holder *gh)
  {
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
349
  	gfs2_rgrp_bh_put(gh->gh_gl->gl_object);
b3b94faa5   David Teigland   [GFS2] The core o...
350
351
352
353
354
355
356
357
358
  }
  
  /**
   * trans_go_xmote_th - promote/demote the transaction glock
   * @gl: the glock
   * @state: the requested state
   * @flags:
   *
   */
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
359
  static void trans_go_xmote_th(struct gfs2_glock *gl)
b3b94faa5   David Teigland   [GFS2] The core o...
360
361
362
363
364
365
366
367
  {
  	struct gfs2_sbd *sdp = gl->gl_sbd;
  
  	if (gl->gl_state != LM_ST_UNLOCKED &&
  	    test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
  		gfs2_meta_syncfs(sdp);
  		gfs2_log_shutdown(sdp);
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
368
369
370
371
372
373
374
375
376
377
378
  }
  
  /**
   * trans_go_xmote_bh - After promoting/demoting the transaction glock
   * @gl: the glock
   *
   */
  
  static void trans_go_xmote_bh(struct gfs2_glock *gl)
  {
  	struct gfs2_sbd *sdp = gl->gl_sbd;
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
379
  	struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode);
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
380
  	struct gfs2_glock *j_gl = ip->i_gl;
551676226   Al Viro   [GFS2] split and ...
381
  	struct gfs2_log_header_host head;
b3b94faa5   David Teigland   [GFS2] The core o...
382
383
384
385
  	int error;
  
  	if (gl->gl_state != LM_ST_UNLOCKED &&
  	    test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
386
  		gfs2_meta_cache_flush(GFS2_I(sdp->sd_jdesc->jd_inode));
1a14d3a68   Steven Whitehouse   [GFS2] Simplify g...
387
  		j_gl->gl_ops->go_inval(j_gl, DIO_METADATA);
b3b94faa5   David Teigland   [GFS2] The core o...
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
  
  		error = gfs2_find_jhead(sdp->sd_jdesc, &head);
  		if (error)
  			gfs2_consist(sdp);
  		if (!(head.lh_flags & GFS2_LOG_HEAD_UNMOUNT))
  			gfs2_consist(sdp);
  
  		/*  Initialize some head of the log stuff  */
  		if (!test_bit(SDF_SHUTDOWN, &sdp->sd_flags)) {
  			sdp->sd_log_sequence = head.lh_sequence + 1;
  			gfs2_log_pointers_init(sdp, head.lh_blkno);
  		}
  	}
  }
  
  /**
   * trans_go_drop_th - unlock the transaction glock
   * @gl: the glock
   *
   * We want to sync the device even with localcaching.  Remember
   * that localcaching journal replay only marks buffers dirty.
   */
  
  static void trans_go_drop_th(struct gfs2_glock *gl)
  {
  	struct gfs2_sbd *sdp = gl->gl_sbd;
  
  	if (test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
  		gfs2_meta_syncfs(sdp);
  		gfs2_log_shutdown(sdp);
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
419
420
421
422
423
424
425
426
427
428
429
430
431
  }
  
  /**
   * quota_go_demote_ok - Check to see if it's ok to unlock a quota glock
   * @gl: the glock
   *
   * Returns: 1 if it's ok
   */
  
  static int quota_go_demote_ok(struct gfs2_glock *gl)
  {
  	return !atomic_read(&gl->gl_lvb_count);
  }
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
432
  const struct gfs2_glock_operations gfs2_meta_glops = {
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
433
434
  	.go_xmote_th = meta_go_sync,
  	.go_drop_th = meta_go_sync,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
435
  	.go_type = LM_TYPE_META,
b3b94faa5   David Teigland   [GFS2] The core o...
436
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
437
  const struct gfs2_glock_operations gfs2_inode_glops = {
b3b94faa5   David Teigland   [GFS2] The core o...
438
439
440
  	.go_xmote_th = inode_go_xmote_th,
  	.go_xmote_bh = inode_go_xmote_bh,
  	.go_drop_th = inode_go_drop_th,
b3b94faa5   David Teigland   [GFS2] The core o...
441
442
443
444
  	.go_inval = inode_go_inval,
  	.go_demote_ok = inode_go_demote_ok,
  	.go_lock = inode_go_lock,
  	.go_unlock = inode_go_unlock,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
445
  	.go_type = LM_TYPE_INODE,
b3b94faa5   David Teigland   [GFS2] The core o...
446
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
447
  const struct gfs2_glock_operations gfs2_rgrp_glops = {
cad5b9392   Steven Whitehouse   [GFS2] Fix bz 230...
448
449
  	.go_xmote_th = meta_go_sync,
  	.go_drop_th = meta_go_sync,
b3b94faa5   David Teigland   [GFS2] The core o...
450
451
452
453
  	.go_inval = meta_go_inval,
  	.go_demote_ok = rgrp_go_demote_ok,
  	.go_lock = rgrp_go_lock,
  	.go_unlock = rgrp_go_unlock,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
454
  	.go_type = LM_TYPE_RGRP,
b3b94faa5   David Teigland   [GFS2] The core o...
455
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
456
  const struct gfs2_glock_operations gfs2_trans_glops = {
b3b94faa5   David Teigland   [GFS2] The core o...
457
458
459
  	.go_xmote_th = trans_go_xmote_th,
  	.go_xmote_bh = trans_go_xmote_bh,
  	.go_drop_th = trans_go_drop_th,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
460
  	.go_type = LM_TYPE_NONDISK,
b3b94faa5   David Teigland   [GFS2] The core o...
461
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
462
  const struct gfs2_glock_operations gfs2_iopen_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
463
  	.go_type = LM_TYPE_IOPEN,
b3b94faa5   David Teigland   [GFS2] The core o...
464
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
465
  const struct gfs2_glock_operations gfs2_flock_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
466
  	.go_type = LM_TYPE_FLOCK,
b3b94faa5   David Teigland   [GFS2] The core o...
467
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
468
  const struct gfs2_glock_operations gfs2_nondisk_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
469
  	.go_type = LM_TYPE_NONDISK,
b3b94faa5   David Teigland   [GFS2] The core o...
470
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
471
  const struct gfs2_glock_operations gfs2_quota_glops = {
b3b94faa5   David Teigland   [GFS2] The core o...
472
  	.go_demote_ok = quota_go_demote_ok,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
473
  	.go_type = LM_TYPE_QUOTA,
b3b94faa5   David Teigland   [GFS2] The core o...
474
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
475
  const struct gfs2_glock_operations gfs2_journal_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
476
  	.go_type = LM_TYPE_JOURNAL,
b3b94faa5   David Teigland   [GFS2] The core o...
477
  };