Blame view

fs/gfs2/glops.c 20.1 KB
7336d0e65   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
b3b94faa5   David Teigland   [GFS2] The core o...
2
3
  /*
   * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
cf45b752c   Bob Peterson   [GFS2] Remove rgr...
4
   * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
b3b94faa5   David Teigland   [GFS2] The core o...
5
   */
b3b94faa5   David Teigland   [GFS2] The core o...
6
7
8
  #include <linux/spinlock.h>
  #include <linux/completion.h>
  #include <linux/buffer_head.h>
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
9
  #include <linux/gfs2_ondisk.h>
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
10
  #include <linux/bio.h>
c65f7fb53   Steven Whitehouse   GFS2: Use forget_...
11
  #include <linux/posix_acl.h>
f39814f60   Andreas Gruenbacher   gfs2: Invalid sec...
12
  #include <linux/security.h>
b3b94faa5   David Teigland   [GFS2] The core o...
13
14
  
  #include "gfs2.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
15
  #include "incore.h"
b3b94faa5   David Teigland   [GFS2] The core o...
16
17
18
19
20
21
  #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...
22
23
  #include "recovery.h"
  #include "rgrp.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
24
  #include "util.h"
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
25
  #include "trans.h"
17d539f04   Steven Whitehouse   GFS2: Cache dir h...
26
  #include "dir.h"
f4686c26e   Abhi Das   gfs2: read journa...
27
  #include "lops.h"
b3b94faa5   David Teigland   [GFS2] The core o...
28

2e60d7683   Benjamin Marzinski   GFS2: update free...
29
  struct workqueue_struct *gfs2_freeze_wq;
601ef0d52   Bob Peterson   gfs2: Force withd...
30
  extern struct workqueue_struct *gfs2_control_wq;
75549186e   Steven Whitehouse   GFS2: Fix bug-tra...
31
32
  static void gfs2_ail_error(struct gfs2_glock *gl, const struct buffer_head *bh)
  {
15562c439   Bob Peterson   GFS2: Move glock ...
33
34
35
36
  	fs_err(gl->gl_name.ln_sbd,
  	       "AIL buffer %p: blocknr %llu state 0x%08lx mapping %p page "
  	       "state 0x%lx
  ",
75549186e   Steven Whitehouse   GFS2: Fix bug-tra...
37
38
  	       bh, (unsigned long long)bh->b_blocknr, bh->b_state,
  	       bh->b_page->mapping, bh->b_page->flags);
15562c439   Bob Peterson   GFS2: Move glock ...
39
40
  	fs_err(gl->gl_name.ln_sbd, "AIL glock %u:%llu mapping %p
  ",
75549186e   Steven Whitehouse   GFS2: Fix bug-tra...
41
42
  	       gl->gl_name.ln_type, gl->gl_name.ln_number,
  	       gfs2_glock2aspace(gl));
badb55ec2   Andreas Gruenbacher   gfs2: Split gfs2_...
43
44
45
  	gfs2_lm(gl->gl_name.ln_sbd, "AIL error
  ");
  	gfs2_withdraw(gl->gl_name.ln_sbd);
75549186e   Steven Whitehouse   GFS2: Fix bug-tra...
46
  }
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
47
  /**
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
48
   * __gfs2_ail_flush - remove all buffers for a given lock from the AIL
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
49
   * @gl: the glock
b5b24d7ae   Steven Whitehouse   GFS2: Fix AIL flu...
50
   * @fsync: set when called from fsync (not all buffers will be clean)
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
51
52
53
   *
   * None of the buffers should be dirty, locked, or pinned.
   */
1bc333f4c   Benjamin Marzinski   GFS2: don't overr...
54
55
  static void __gfs2_ail_flush(struct gfs2_glock *gl, bool fsync,
  			     unsigned int nr_revokes)
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
56
  {
15562c439   Bob Peterson   GFS2: Move glock ...
57
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
58
  	struct list_head *head = &gl->gl_ail_list;
b5b24d7ae   Steven Whitehouse   GFS2: Fix AIL flu...
59
  	struct gfs2_bufdata *bd, *tmp;
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
60
  	struct buffer_head *bh;
b5b24d7ae   Steven Whitehouse   GFS2: Fix AIL flu...
61
  	const unsigned long b_state = (1UL << BH_Dirty)|(1UL << BH_Pinned)|(1UL << BH_Lock);
d8348de06   Steven Whitehouse   GFS2: Fix deadloc...
62

b5b24d7ae   Steven Whitehouse   GFS2: Fix AIL flu...
63
  	gfs2_log_lock(sdp);
d6a079e82   Dave Chinner   GFS2: introduce A...
64
  	spin_lock(&sdp->sd_ail_lock);
1bc333f4c   Benjamin Marzinski   GFS2: don't overr...
65
66
67
  	list_for_each_entry_safe_reverse(bd, tmp, head, bd_ail_gl_list) {
  		if (nr_revokes == 0)
  			break;
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
68
  		bh = bd->bd_bh;
b5b24d7ae   Steven Whitehouse   GFS2: Fix AIL flu...
69
70
71
  		if (bh->b_state & b_state) {
  			if (fsync)
  				continue;
75549186e   Steven Whitehouse   GFS2: Fix bug-tra...
72
  			gfs2_ail_error(gl, bh);
b5b24d7ae   Steven Whitehouse   GFS2: Fix AIL flu...
73
  		}
1ad38c437   Steven Whitehouse   [GFS2] Clean up g...
74
  		gfs2_trans_add_revoke(sdp, bd);
1bc333f4c   Benjamin Marzinski   GFS2: don't overr...
75
  		nr_revokes--;
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
76
  	}
8eae1ca00   Steven Whitehouse   GFS2: Review bug ...
77
  	GLOCK_BUG_ON(gl, !fsync && atomic_read(&gl->gl_ail_count));
d6a079e82   Dave Chinner   GFS2: introduce A...
78
  	spin_unlock(&sdp->sd_ail_lock);
b5b24d7ae   Steven Whitehouse   GFS2: Fix AIL flu...
79
  	gfs2_log_unlock(sdp);
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
80
  }
1c634f94c   Bob Peterson   gfs2: Do proper e...
81
  static int gfs2_ail_empty_gl(struct gfs2_glock *gl)
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
82
  {
15562c439   Bob Peterson   GFS2: Move glock ...
83
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
84
  	struct gfs2_trans tr;
1c634f94c   Bob Peterson   gfs2: Do proper e...
85
  	int ret;
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
86
87
  
  	memset(&tr, 0, sizeof(tr));
d69a3c656   Steven Whitehouse   GFS2: Move log bu...
88
89
  	INIT_LIST_HEAD(&tr.tr_buf);
  	INIT_LIST_HEAD(&tr.tr_databuf);
cbcc89b63   Bob Peterson   gfs2: initialize ...
90
91
  	INIT_LIST_HEAD(&tr.tr_ail1_list);
  	INIT_LIST_HEAD(&tr.tr_ail2_list);
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
92
  	tr.tr_revokes = atomic_read(&gl->gl_ail_count);
9ff782893   Bob Peterson   gfs2: Do log_flus...
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  	if (!tr.tr_revokes) {
  		bool have_revokes;
  		bool log_in_flight;
  
  		/*
  		 * We have nothing on the ail, but there could be revokes on
  		 * the sdp revoke queue, in which case, we still want to flush
  		 * the log and wait for it to finish.
  		 *
  		 * If the sdp revoke list is empty too, we might still have an
  		 * io outstanding for writing revokes, so we should wait for
  		 * it before returning.
  		 *
  		 * If none of these conditions are true, our revokes are all
  		 * flushed and we can return.
  		 */
  		gfs2_log_lock(sdp);
  		have_revokes = !list_empty(&sdp->sd_log_revokes);
  		log_in_flight = atomic_read(&sdp->sd_log_in_flight);
  		gfs2_log_unlock(sdp);
  		if (have_revokes)
  			goto flush;
  		if (log_in_flight)
  			log_flush_wait(sdp);
1c634f94c   Bob Peterson   gfs2: Do proper e...
117
  		return 0;
9ff782893   Bob Peterson   gfs2: Do log_flus...
118
  	}
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
119

24972557b   Benjamin Marzinski   GFS2: remove tran...
120
121
122
  	/* A shortened, inline version of gfs2_trans_begin()
           * tr->alloced is not set since the transaction structure is
           * on the stack */
2e9eeaa11   Bob Peterson   gfs2: eliminate s...
123
  	tr.tr_reserved = 1 + gfs2_struct2blk(sdp, tr.tr_revokes);
d29c0afe4   Fabian Frederick   GFS2: use _RET_IP...
124
  	tr.tr_ip = _RET_IP_;
1c634f94c   Bob Peterson   gfs2: Do proper e...
125
126
127
  	ret = gfs2_log_reserve(sdp, tr.tr_reserved);
  	if (ret < 0)
  		return ret;
8eae1ca00   Steven Whitehouse   GFS2: Review bug ...
128
  	WARN_ON_ONCE(current->journal_info);
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
129
  	current->journal_info = &tr;
1bc333f4c   Benjamin Marzinski   GFS2: don't overr...
130
  	__gfs2_ail_flush(gl, 0, tr.tr_revokes);
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
131
132
  
  	gfs2_trans_end(sdp);
9ff782893   Bob Peterson   gfs2: Do log_flus...
133
  flush:
805c09075   Bob Peterson   GFS2: Log the rea...
134
135
  	gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_NORMAL |
  		       GFS2_LFC_AIL_EMPTY_GL);
1c634f94c   Bob Peterson   gfs2: Do proper e...
136
  	return 0;
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
137
  }
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
138

b5b24d7ae   Steven Whitehouse   GFS2: Fix AIL flu...
139
  void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
140
  {
15562c439   Bob Peterson   GFS2: Move glock ...
141
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
142
  	unsigned int revokes = atomic_read(&gl->gl_ail_count);
1bc333f4c   Benjamin Marzinski   GFS2: don't overr...
143
  	unsigned int max_revokes = (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_log_descriptor)) / sizeof(u64);
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
144
145
146
147
  	int ret;
  
  	if (!revokes)
  		return;
1bc333f4c   Benjamin Marzinski   GFS2: don't overr...
148
149
150
151
  	while (revokes > max_revokes)
  		max_revokes += (sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header)) / sizeof(u64);
  
  	ret = gfs2_trans_begin(sdp, 0, max_revokes);
dba898b02   Steven Whitehouse   GFS2: Clean up fs...
152
153
  	if (ret)
  		return;
1bc333f4c   Benjamin Marzinski   GFS2: don't overr...
154
  	__gfs2_ail_flush(gl, fsync, max_revokes);
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
155
  	gfs2_trans_end(sdp);
805c09075   Bob Peterson   GFS2: Log the rea...
156
157
  	gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_NORMAL |
  		       GFS2_LFC_AIL_FLUSH);
ddacfaf76   Steven Whitehouse   [GFS2] Move loggi...
158
  }
ba7f72901   Steven Whitehouse   [GFS2] Remove pag...
159
160
  
  /**
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
161
   * rgrp_go_sync - sync out the metadata for this glock
b3b94faa5   David Teigland   [GFS2] The core o...
162
   * @gl: the glock
b3b94faa5   David Teigland   [GFS2] The core o...
163
164
165
   *
   * Called when demoting or unlocking an EX glock.  We must flush
   * to disk all dirty buffers/pages relating to this glock, and must not
6f6597baa   Andreas Gruenbacher   gfs2: Protect gl-...
166
   * return to caller to demote/unlock the glock until I/O is complete.
b3b94faa5   David Teigland   [GFS2] The core o...
167
   */
1c634f94c   Bob Peterson   gfs2: Do proper e...
168
  static int rgrp_go_sync(struct gfs2_glock *gl)
b3b94faa5   David Teigland   [GFS2] The core o...
169
  {
15562c439   Bob Peterson   GFS2: Move glock ...
170
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
171
  	struct address_space *mapping = &sdp->sd_aspace;
b3422cacd   Bob Peterson   gfs2: Rework how ...
172
  	struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(gl);
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
173
174
175
  	int error;
  
  	if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags))
1c634f94c   Bob Peterson   gfs2: Do proper e...
176
  		return 0;
8eae1ca00   Steven Whitehouse   GFS2: Review bug ...
177
  	GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE);
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
178

805c09075   Bob Peterson   GFS2: Log the rea...
179
180
  	gfs2_log_flush(sdp, gl, GFS2_LOG_HEAD_FLUSH_NORMAL |
  		       GFS2_LFC_RGRP_GO_SYNC);
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
181
182
  	filemap_fdatawrite_range(mapping, gl->gl_vm.start, gl->gl_vm.end);
  	error = filemap_fdatawait_range(mapping, gl->gl_vm.start, gl->gl_vm.end);
1c634f94c   Bob Peterson   gfs2: Do proper e...
183
  	WARN_ON_ONCE(error);
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
184
  	mapping_set_error(mapping, error);
1c634f94c   Bob Peterson   gfs2: Do proper e...
185
186
  	if (!error)
  		error = gfs2_ail_empty_gl(gl);
7c9ca6211   Bob Peterson   GFS2: Use rbtree ...
187

f3dd16491   Andreas Gruenbacher   gfs2: Remove gl_s...
188
  	spin_lock(&gl->gl_lockref.lock);
8339ee543   Steven Whitehouse   GFS2: Make resour...
189
190
191
  	rgd = gl->gl_object;
  	if (rgd)
  		gfs2_free_clones(rgd);
f3dd16491   Andreas Gruenbacher   gfs2: Remove gl_s...
192
  	spin_unlock(&gl->gl_lockref.lock);
1c634f94c   Bob Peterson   gfs2: Do proper e...
193
  	return error;
b3b94faa5   David Teigland   [GFS2] The core o...
194
195
196
  }
  
  /**
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
197
   * rgrp_go_inval - invalidate the metadata for this glock
b3b94faa5   David Teigland   [GFS2] The core o...
198
199
200
   * @gl: the glock
   * @flags:
   *
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
201
202
203
   * We never used LM_ST_DEFERRED with resource groups, so that we
   * should always see the metadata flag set here.
   *
b3b94faa5   David Teigland   [GFS2] The core o...
204
   */
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
205
  static void rgrp_go_inval(struct gfs2_glock *gl, int flags)
b3b94faa5   David Teigland   [GFS2] The core o...
206
  {
15562c439   Bob Peterson   GFS2: Move glock ...
207
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
208
  	struct address_space *mapping = &sdp->sd_aspace;
6f6597baa   Andreas Gruenbacher   gfs2: Protect gl-...
209
  	struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(gl);
39b0f1e92   Bob Peterson   GFS2: Don't brels...
210
211
212
  
  	if (rgd)
  		gfs2_rgrp_brelse(rgd);
b3b94faa5   David Teigland   [GFS2] The core o...
213

8eae1ca00   Steven Whitehouse   GFS2: Review bug ...
214
  	WARN_ON_ONCE(!(flags & DIO_METADATA));
7005c3e4a   Steven Whitehouse   GFS2: Use range b...
215
  	truncate_inode_pages_range(mapping, gl->gl_vm.start, gl->gl_vm.end);
cf45b752c   Bob Peterson   [GFS2] Remove rgr...
216

39b0f1e92   Bob Peterson   GFS2: Don't brels...
217
  	if (rgd)
cf45b752c   Bob Peterson   [GFS2] Remove rgr...
218
  		rgd->rd_flags &= ~GFS2_RDF_UPTODATE;
b3b94faa5   David Teigland   [GFS2] The core o...
219
  }
4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
220
221
222
223
224
225
226
227
228
229
230
  static struct gfs2_inode *gfs2_glock2inode(struct gfs2_glock *gl)
  {
  	struct gfs2_inode *ip;
  
  	spin_lock(&gl->gl_lockref.lock);
  	ip = gl->gl_object;
  	if (ip)
  		set_bit(GIF_GLOP_PENDING, &ip->i_flags);
  	spin_unlock(&gl->gl_lockref.lock);
  	return ip;
  }
6f6597baa   Andreas Gruenbacher   gfs2: Protect gl-...
231
232
233
234
235
236
237
238
239
240
  struct gfs2_rgrpd *gfs2_glock2rgrp(struct gfs2_glock *gl)
  {
  	struct gfs2_rgrpd *rgd;
  
  	spin_lock(&gl->gl_lockref.lock);
  	rgd = gl->gl_object;
  	spin_unlock(&gl->gl_lockref.lock);
  
  	return rgd;
  }
4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
241
242
243
244
245
246
247
248
  static void gfs2_clear_glop_pending(struct gfs2_inode *ip)
  {
  	if (!ip)
  		return;
  
  	clear_bit_unlock(GIF_GLOP_PENDING, &ip->i_flags);
  	wake_up_bit(&ip->i_flags, GIF_GLOP_PENDING);
  }
b3b94faa5   David Teigland   [GFS2] The core o...
249
  /**
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
250
251
252
253
   * inode_go_sync - Sync the dirty data and/or metadata for an inode glock
   * @gl: the glock protecting the inode
   *
   */
1c634f94c   Bob Peterson   gfs2: Do proper e...
254
  static int inode_go_sync(struct gfs2_glock *gl)
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
255
  {
4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
256
257
  	struct gfs2_inode *ip = gfs2_glock2inode(gl);
  	int isreg = ip && S_ISREG(ip->i_inode.i_mode);
009d85183   Steven Whitehouse   GFS2: Metadata ad...
258
  	struct address_space *metamapping = gfs2_glock2aspace(gl);
bbae10fac   Bob Peterson   gfs2: Don't ignor...
259
  	int error = 0, ret;
3042a2ccd   Steven Whitehouse   [GFS2] Reorder wr...
260

4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
261
  	if (isreg) {
582d2f7ae   Steven Whitehouse   GFS2: Wait for as...
262
263
264
265
  		if (test_and_clear_bit(GIF_SW_PAGED, &ip->i_flags))
  			unmap_shared_mapping_range(ip->i_inode.i_mapping, 0, 0);
  		inode_dio_wait(&ip->i_inode);
  	}
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
266
  	if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags))
4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
267
  		goto out;
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
268

8eae1ca00   Steven Whitehouse   GFS2: Review bug ...
269
  	GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE);
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
270

805c09075   Bob Peterson   GFS2: Log the rea...
271
272
  	gfs2_log_flush(gl->gl_name.ln_sbd, gl, GFS2_LOG_HEAD_FLUSH_NORMAL |
  		       GFS2_LFC_INODE_GO_SYNC);
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
273
  	filemap_fdatawrite(metamapping);
4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
274
  	if (isreg) {
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
275
276
277
278
  		struct address_space *mapping = ip->i_inode.i_mapping;
  		filemap_fdatawrite(mapping);
  		error = filemap_fdatawait(mapping);
  		mapping_set_error(mapping, error);
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
279
  	}
bbae10fac   Bob Peterson   gfs2: Don't ignor...
280
281
282
283
  	ret = filemap_fdatawait(metamapping);
  	mapping_set_error(metamapping, ret);
  	if (!error)
  		error = ret;
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
284
  	gfs2_ail_empty_gl(gl);
52fcd11c0   Steven Whitehouse   GFS2: Clear dirty...
285
286
287
288
  	/*
  	 * Writeback of the data mapping may cause the dirty flag to be set
  	 * so we have to clear it again here.
  	 */
4e857c58e   Peter Zijlstra   arch: Mass conver...
289
  	smp_mb__before_atomic();
52fcd11c0   Steven Whitehouse   GFS2: Clear dirty...
290
  	clear_bit(GLF_DIRTY, &gl->gl_flags);
4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
291
292
293
  
  out:
  	gfs2_clear_glop_pending(ip);
1c634f94c   Bob Peterson   gfs2: Do proper e...
294
  	return error;
b5d32bead   Steven Whitehouse   [GFS2] Tidy up gl...
295
296
297
  }
  
  /**
b3b94faa5   David Teigland   [GFS2] The core o...
298
299
300
   * inode_go_inval - prepare a inode glock to be released
   * @gl: the glock
   * @flags:
6b49d1d9c   Geert Uytterhoeven   GFS2: memcontrol:...
301
302
   *
   * Normally we invalidate everything, but if we are moving into
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
303
304
   * LM_ST_DEFERRED from LM_ST_SHARED or LM_ST_EXCLUSIVE then we
   * can keep hold of the metadata, since it won't have changed.
b3b94faa5   David Teigland   [GFS2] The core o...
305
306
307
308
309
   *
   */
  
  static void inode_go_inval(struct gfs2_glock *gl, int flags)
  {
4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
310
  	struct gfs2_inode *ip = gfs2_glock2inode(gl);
b3b94faa5   David Teigland   [GFS2] The core o...
311

6bac243f0   Steven Whitehouse   GFS2: Clean up of...
312
  	if (flags & DIO_METADATA) {
009d85183   Steven Whitehouse   GFS2: Metadata ad...
313
  		struct address_space *mapping = gfs2_glock2aspace(gl);
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
314
  		truncate_inode_pages(mapping, 0);
c65f7fb53   Steven Whitehouse   GFS2: Use forget_...
315
  		if (ip) {
b004157ab   Steven Whitehouse   [GFS2] Fix journa...
316
  			set_bit(GIF_INVALID, &ip->i_flags);
c65f7fb53   Steven Whitehouse   GFS2: Use forget_...
317
  			forget_all_cached_acls(&ip->i_inode);
f39814f60   Andreas Gruenbacher   gfs2: Invalid sec...
318
  			security_inode_invalidate_secctx(&ip->i_inode);
17d539f04   Steven Whitehouse   GFS2: Cache dir h...
319
  			gfs2_dir_hash_inval(ip);
c65f7fb53   Steven Whitehouse   GFS2: Use forget_...
320
  		}
b004157ab   Steven Whitehouse   [GFS2] Fix journa...
321
  	}
15562c439   Bob Peterson   GFS2: Move glock ...
322
  	if (ip == GFS2_I(gl->gl_name.ln_sbd->sd_rindex)) {
c1696fb85   Bob Peterson   GFS2: Introduce n...
323
  		gfs2_log_flush(gl->gl_name.ln_sbd, NULL,
805c09075   Bob Peterson   GFS2: Log the rea...
324
325
  			       GFS2_LOG_HEAD_FLUSH_NORMAL |
  			       GFS2_LFC_INODE_GO_INVAL);
15562c439   Bob Peterson   GFS2: Move glock ...
326
  		gl->gl_name.ln_sbd->sd_rindex_uptodate = 0;
1ce533686   Benjamin Marzinski   GFS2: force a log...
327
  	}
3cc3f710c   Steven Whitehouse   [GFS2] Use ->page...
328
  	if (ip && S_ISREG(ip->i_inode.i_mode))
b004157ab   Steven Whitehouse   [GFS2] Fix journa...
329
  		truncate_inode_pages(ip->i_inode.i_mapping, 0);
4fd1a5795   Andreas Gruenbacher   gfs2: Get rid of ...
330
331
  
  	gfs2_clear_glop_pending(ip);
b3b94faa5   David Teigland   [GFS2] The core o...
332
333
334
335
336
337
338
339
  }
  
  /**
   * 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
   */
97cc1025b   Steven Whitehouse   GFS2: Kill two da...
340
  static int inode_go_demote_ok(const struct gfs2_glock *gl)
b3b94faa5   David Teigland   [GFS2] The core o...
341
  {
15562c439   Bob Peterson   GFS2: Move glock ...
342
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
bc015cb84   Steven Whitehouse   GFS2: Use RCU for...
343

97cc1025b   Steven Whitehouse   GFS2: Kill two da...
344
345
  	if (sdp->sd_jindex == gl->gl_object || sdp->sd_rindex == gl->gl_object)
  		return 0;
bc015cb84   Steven Whitehouse   GFS2: Use RCU for...
346

97cc1025b   Steven Whitehouse   GFS2: Kill two da...
347
  	return 1;
b3b94faa5   David Teigland   [GFS2] The core o...
348
  }
d4b2cf1b0   Steven Whitehouse   GFS2: Move gfs2_r...
349
350
351
  static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
  {
  	const struct gfs2_dinode *str = buf;
95582b008   Deepa Dinamani   vfs: change inode...
352
  	struct timespec64 atime;
d4b2cf1b0   Steven Whitehouse   GFS2: Move gfs2_r...
353
354
355
356
357
358
359
360
361
362
363
364
365
  	u16 height, depth;
  
  	if (unlikely(ip->i_no_addr != be64_to_cpu(str->di_num.no_addr)))
  		goto corrupt;
  	ip->i_no_formal_ino = be64_to_cpu(str->di_num.no_formal_ino);
  	ip->i_inode.i_mode = be32_to_cpu(str->di_mode);
  	ip->i_inode.i_rdev = 0;
  	switch (ip->i_inode.i_mode & S_IFMT) {
  	case S_IFBLK:
  	case S_IFCHR:
  		ip->i_inode.i_rdev = MKDEV(be32_to_cpu(str->di_major),
  					   be32_to_cpu(str->di_minor));
  		break;
098b9c145   Aliasgar Surti   gfs2: removed unn...
366
  	}
d4b2cf1b0   Steven Whitehouse   GFS2: Move gfs2_r...
367

d05464264   Eric W. Biederman   gfs2: Convert uid...
368
369
  	i_uid_write(&ip->i_inode, be32_to_cpu(str->di_uid));
  	i_gid_write(&ip->i_inode, be32_to_cpu(str->di_gid));
eebd2e813   Andreas Gruenbacher   gfs2: Get rid of ...
370
  	set_nlink(&ip->i_inode, be32_to_cpu(str->di_nlink));
d4b2cf1b0   Steven Whitehouse   GFS2: Move gfs2_r...
371
372
373
374
  	i_size_write(&ip->i_inode, be64_to_cpu(str->di_size));
  	gfs2_set_inode_blocks(&ip->i_inode, be64_to_cpu(str->di_blocks));
  	atime.tv_sec = be64_to_cpu(str->di_atime);
  	atime.tv_nsec = be32_to_cpu(str->di_atime_nsec);
95582b008   Deepa Dinamani   vfs: change inode...
375
  	if (timespec64_compare(&ip->i_inode.i_atime, &atime) < 0)
d4b2cf1b0   Steven Whitehouse   GFS2: Move gfs2_r...
376
377
378
379
380
381
382
383
384
385
  		ip->i_inode.i_atime = atime;
  	ip->i_inode.i_mtime.tv_sec = be64_to_cpu(str->di_mtime);
  	ip->i_inode.i_mtime.tv_nsec = be32_to_cpu(str->di_mtime_nsec);
  	ip->i_inode.i_ctime.tv_sec = be64_to_cpu(str->di_ctime);
  	ip->i_inode.i_ctime.tv_nsec = be32_to_cpu(str->di_ctime_nsec);
  
  	ip->i_goal = be64_to_cpu(str->di_goal_meta);
  	ip->i_generation = be64_to_cpu(str->di_generation);
  
  	ip->i_diskflags = be32_to_cpu(str->di_flags);
9964afbb7   Steven Whitehouse   GFS2: Add S_NOSEC...
386
387
  	ip->i_eattr = be64_to_cpu(str->di_eattr);
  	/* i_diskflags and i_eattr must be set before gfs2_set_inode_flags() */
d4b2cf1b0   Steven Whitehouse   GFS2: Move gfs2_r...
388
389
390
391
392
393
394
395
396
397
398
  	gfs2_set_inode_flags(&ip->i_inode);
  	height = be16_to_cpu(str->di_height);
  	if (unlikely(height > GFS2_MAX_META_HEIGHT))
  		goto corrupt;
  	ip->i_height = (u8)height;
  
  	depth = be16_to_cpu(str->di_depth);
  	if (unlikely(depth > GFS2_DIR_MAX_DEPTH))
  		goto corrupt;
  	ip->i_depth = (u8)depth;
  	ip->i_entries = be32_to_cpu(str->di_entries);
d4b2cf1b0   Steven Whitehouse   GFS2: Move gfs2_r...
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
  	if (S_ISREG(ip->i_inode.i_mode))
  		gfs2_set_aops(&ip->i_inode);
  
  	return 0;
  corrupt:
  	gfs2_consist_inode(ip);
  	return -EIO;
  }
  
  /**
   * gfs2_inode_refresh - Refresh the incore copy of the dinode
   * @ip: The GFS2 inode
   *
   * Returns: errno
   */
  
  int gfs2_inode_refresh(struct gfs2_inode *ip)
  {
  	struct buffer_head *dibh;
  	int error;
  
  	error = gfs2_meta_inode_buffer(ip, &dibh);
  	if (error)
  		return error;
d4b2cf1b0   Steven Whitehouse   GFS2: Move gfs2_r...
423
424
425
426
427
428
429
430
  	error = gfs2_dinode_in(ip, dibh->b_data);
  	brelse(dibh);
  	clear_bit(GIF_INVALID, &ip->i_flags);
  
  	return error;
  }
  
  /**
b3b94faa5   David Teigland   [GFS2] The core o...
431
432
433
434
435
436
437
438
439
440
   * 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;
15562c439   Bob Peterson   GFS2: Move glock ...
441
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
442
  	struct gfs2_inode *ip = gl->gl_object;
b3b94faa5   David Teigland   [GFS2] The core o...
443
  	int error = 0;
091806edd   Bob Peterson   [GFS2] filesystem...
444
  	if (!ip || (gh->gh_flags & GL_SKIP))
b3b94faa5   David Teigland   [GFS2] The core o...
445
  		return 0;
bfded27ba   Steven Whitehouse   [GFS2] Shrink gfs...
446
  	if (test_bit(GIF_INVALID, &ip->i_flags)) {
b3b94faa5   David Teigland   [GFS2] The core o...
447
448
449
  		error = gfs2_inode_refresh(ip);
  		if (error)
  			return error;
b3b94faa5   David Teigland   [GFS2] The core o...
450
  	}
582d2f7ae   Steven Whitehouse   GFS2: Wait for as...
451
452
  	if (gh->gh_state != LM_ST_DEFERRED)
  		inode_dio_wait(&ip->i_inode);
383f01fbf   Steven Whitehouse   GFS2: Banish stru...
453
  	if ((ip->i_diskflags & GFS2_DIF_TRUNC_IN_PROG) &&
b3b94faa5   David Teigland   [GFS2] The core o...
454
  	    (gl->gl_state == LM_ST_EXCLUSIVE) &&
813e0c46c   Steven Whitehouse   GFS2: Fix "trunca...
455
456
457
  	    (gh->gh_state == LM_ST_EXCLUSIVE)) {
  		spin_lock(&sdp->sd_trunc_lock);
  		if (list_empty(&ip->i_trunc_list))
e7cb550d7   Wang Xibo   GFS2: fix code pa...
458
  			list_add(&ip->i_trunc_list, &sdp->sd_trunc_list);
813e0c46c   Steven Whitehouse   GFS2: Fix "trunca...
459
460
461
462
  		spin_unlock(&sdp->sd_trunc_lock);
  		wake_up(&sdp->sd_quota_wait);
  		return 1;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
463
464
465
466
467
  
  	return error;
  }
  
  /**
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
468
469
470
   * inode_go_dump - print information about an inode
   * @seq: The iterator
   * @ip: the inode
3792ce973   Bob Peterson   gfs2: dump fsid w...
471
   * @fs_id_buf: file system id (may be empty)
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
472
   *
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
473
   */
3792ce973   Bob Peterson   gfs2: dump fsid w...
474
475
  static void inode_go_dump(struct seq_file *seq, struct gfs2_glock *gl,
  			  const char *fs_id_buf)
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
476
  {
27a2660f1   Bob Peterson   gfs2: Dump nrpage...
477
478
479
  	struct gfs2_inode *ip = gl->gl_object;
  	struct inode *inode = &ip->i_inode;
  	unsigned long nrpages;
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
480
  	if (ip == NULL)
ac3beb6a5   Steven Whitehouse   GFS2: Don't use E...
481
  		return;
27a2660f1   Bob Peterson   gfs2: Dump nrpage...
482
483
484
485
  
  	xa_lock_irq(&inode->i_data.i_pages);
  	nrpages = inode->i_data.nrpages;
  	xa_unlock_irq(&inode->i_data.i_pages);
3792ce973   Bob Peterson   gfs2: dump fsid w...
486
487
488
  	gfs2_print_dbg(seq, "%s I: n:%llu/%llu t:%u f:0x%02lx d:0x%08x s:%llu "
  		       "p:%lu
  ", fs_id_buf,
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
489
490
  		  (unsigned long long)ip->i_no_formal_ino,
  		  (unsigned long long)ip->i_no_addr,
fa75cedc3   Steven Whitehouse   GFS2: Add more de...
491
492
  		  IF2DT(ip->i_inode.i_mode), ip->i_flags,
  		  (unsigned int)ip->i_diskflags,
27a2660f1   Bob Peterson   gfs2: Dump nrpage...
493
  		  (unsigned long long)i_size_read(inode), nrpages);
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
494
495
496
  }
  
  /**
24972557b   Benjamin Marzinski   GFS2: remove tran...
497
   * freeze_go_sync - promote/demote the freeze glock
b3b94faa5   David Teigland   [GFS2] The core o...
498
499
500
501
502
   * @gl: the glock
   * @state: the requested state
   * @flags:
   *
   */
1c634f94c   Bob Peterson   gfs2: Do proper e...
503
  static int freeze_go_sync(struct gfs2_glock *gl)
b3b94faa5   David Teigland   [GFS2] The core o...
504
  {
2e60d7683   Benjamin Marzinski   GFS2: update free...
505
  	int error = 0;
15562c439   Bob Peterson   GFS2: Move glock ...
506
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
b3b94faa5   David Teigland   [GFS2] The core o...
507

541656d3a   Bob Peterson   gfs2: freeze shou...
508
  	if (gl->gl_req == LM_ST_EXCLUSIVE && !gfs2_withdrawn(sdp)) {
2e60d7683   Benjamin Marzinski   GFS2: update free...
509
510
511
  		atomic_set(&sdp->sd_freeze_state, SFS_STARTING_FREEZE);
  		error = freeze_super(sdp->sd_vfs);
  		if (error) {
f29e62eed   Bob Peterson   gfs2: replace mor...
512
513
514
  			fs_info(sdp, "GFS2: couldn't freeze filesystem: %d
  ",
  				error);
601ef0d52   Bob Peterson   gfs2: Force withd...
515
516
  			if (gfs2_withdrawn(sdp)) {
  				atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
1c634f94c   Bob Peterson   gfs2: Do proper e...
517
  				return 0;
601ef0d52   Bob Peterson   gfs2: Force withd...
518
  			}
2e60d7683   Benjamin Marzinski   GFS2: update free...
519
520
521
  			gfs2_assert_withdraw(sdp, 0);
  		}
  		queue_work(gfs2_freeze_wq, &sdp->sd_freeze_work);
541656d3a   Bob Peterson   gfs2: freeze shou...
522
523
524
525
526
  		if (test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))
  			gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_FREEZE |
  				       GFS2_LFC_FREEZE_GO_SYNC);
  		else /* read-only mounts */
  			atomic_set(&sdp->sd_freeze_state, SFS_FROZEN);
b3b94faa5   David Teigland   [GFS2] The core o...
527
  	}
1c634f94c   Bob Peterson   gfs2: Do proper e...
528
  	return 0;
b3b94faa5   David Teigland   [GFS2] The core o...
529
530
531
  }
  
  /**
24972557b   Benjamin Marzinski   GFS2: remove tran...
532
   * freeze_go_xmote_bh - After promoting/demoting the freeze glock
b3b94faa5   David Teigland   [GFS2] The core o...
533
534
535
   * @gl: the glock
   *
   */
24972557b   Benjamin Marzinski   GFS2: remove tran...
536
  static int freeze_go_xmote_bh(struct gfs2_glock *gl, struct gfs2_holder *gh)
b3b94faa5   David Teigland   [GFS2] The core o...
537
  {
15562c439   Bob Peterson   GFS2: Move glock ...
538
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
539
  	struct gfs2_inode *ip = GFS2_I(sdp->sd_jdesc->jd_inode);
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
540
  	struct gfs2_glock *j_gl = ip->i_gl;
551676226   Al Viro   [GFS2] split and ...
541
  	struct gfs2_log_header_host head;
b3b94faa5   David Teigland   [GFS2] The core o...
542
  	int error;
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
543
  	if (test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
1a14d3a68   Steven Whitehouse   [GFS2] Simplify g...
544
  		j_gl->gl_ops->go_inval(j_gl, DIO_METADATA);
b3b94faa5   David Teigland   [GFS2] The core o...
545

f4686c26e   Abhi Das   gfs2: read journa...
546
  		error = gfs2_find_jhead(sdp->sd_jdesc, &head, false);
b3b94faa5   David Teigland   [GFS2] The core o...
547
548
549
550
551
552
  		if (error)
  			gfs2_consist(sdp);
  		if (!(head.lh_flags & GFS2_LOG_HEAD_UNMOUNT))
  			gfs2_consist(sdp);
  
  		/*  Initialize some head of the log stuff  */
eb43e660c   Bob Peterson   gfs2: Introduce f...
553
  		if (!gfs2_withdrawn(sdp)) {
b3b94faa5   David Teigland   [GFS2] The core o...
554
555
556
557
  			sdp->sd_log_sequence = head.lh_sequence + 1;
  			gfs2_log_pointers_init(sdp, head.lh_blkno);
  		}
  	}
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
558
  	return 0;
b3b94faa5   David Teigland   [GFS2] The core o...
559
560
561
  }
  
  /**
97cc1025b   Steven Whitehouse   GFS2: Kill two da...
562
563
564
565
566
   * trans_go_demote_ok
   * @gl: the glock
   *
   * Always returns 0
   */
24972557b   Benjamin Marzinski   GFS2: remove tran...
567
  static int freeze_go_demote_ok(const struct gfs2_glock *gl)
97cc1025b   Steven Whitehouse   GFS2: Kill two da...
568
569
570
  {
  	return 0;
  }
b94a170e9   Benjamin Marzinski   GFS2: remove dcac...
571
572
573
574
  /**
   * iopen_go_callback - schedule the dcache entry for the inode to be deleted
   * @gl: the glock
   *
f3dd16491   Andreas Gruenbacher   gfs2: Remove gl_s...
575
   * gl_lockref.lock lock is held while calling this
b94a170e9   Benjamin Marzinski   GFS2: remove dcac...
576
   */
81ffbf654   Steven Whitehouse   GFS2: Add origin ...
577
  static void iopen_go_callback(struct gfs2_glock *gl, bool remote)
b94a170e9   Benjamin Marzinski   GFS2: remove dcac...
578
  {
6f6597baa   Andreas Gruenbacher   gfs2: Protect gl-...
579
  	struct gfs2_inode *ip = gl->gl_object;
15562c439   Bob Peterson   GFS2: Move glock ...
580
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
001e8e8df   Steven Whitehouse   GFS2: Don't try t...
581

bc98a42c1   David Howells   VFS: Convert sb->...
582
  	if (!remote || sb_rdonly(sdp->sd_vfs))
001e8e8df   Steven Whitehouse   GFS2: Don't try t...
583
  		return;
b94a170e9   Benjamin Marzinski   GFS2: remove dcac...
584
585
  
  	if (gl->gl_demote_state == LM_ST_UNLOCKED &&
009d85183   Steven Whitehouse   GFS2: Metadata ad...
586
  	    gl->gl_state == LM_ST_SHARED && ip) {
e66cf1610   Steven Whitehouse   GFS2: Use lockref...
587
  		gl->gl_lockref.count++;
a0e3cc65f   Andreas Gruenbacher   gfs2: Turn gl_del...
588
589
  		if (!queue_delayed_work(gfs2_delete_workqueue,
  					&gl->gl_delete, 0))
e66cf1610   Steven Whitehouse   GFS2: Use lockref...
590
  			gl->gl_lockref.count--;
b94a170e9   Benjamin Marzinski   GFS2: remove dcac...
591
592
  	}
  }
a0e3cc65f   Andreas Gruenbacher   gfs2: Turn gl_del...
593
594
595
596
  static int iopen_go_demote_ok(const struct gfs2_glock *gl)
  {
         return !gfs2_delete_work_queued(gl);
  }
601ef0d52   Bob Peterson   gfs2: Force withd...
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
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
654
655
656
657
658
659
660
661
662
663
664
  /**
   * inode_go_free - wake up anyone waiting for dlm's unlock ast to free it
   * @gl: glock being freed
   *
   * For now, this is only used for the journal inode glock. In withdraw
   * situations, we need to wait for the glock to be freed so that we know
   * other nodes may proceed with recovery / journal replay.
   */
  static void inode_go_free(struct gfs2_glock *gl)
  {
  	/* Note that we cannot reference gl_object because it's already set
  	 * to NULL by this point in its lifecycle. */
  	if (!test_bit(GLF_FREEING, &gl->gl_flags))
  		return;
  	clear_bit_unlock(GLF_FREEING, &gl->gl_flags);
  	wake_up_bit(&gl->gl_flags, GLF_FREEING);
  }
  
  /**
   * nondisk_go_callback - used to signal when a node did a withdraw
   * @gl: the nondisk glock
   * @remote: true if this came from a different cluster node
   *
   */
  static void nondisk_go_callback(struct gfs2_glock *gl, bool remote)
  {
  	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
  
  	/* Ignore the callback unless it's from another node, and it's the
  	   live lock. */
  	if (!remote || gl->gl_name.ln_number != GFS2_LIVE_LOCK)
  		return;
  
  	/* First order of business is to cancel the demote request. We don't
  	 * really want to demote a nondisk glock. At best it's just to inform
  	 * us of another node's withdraw. We'll keep it in SH mode. */
  	clear_bit(GLF_DEMOTE, &gl->gl_flags);
  	clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags);
  
  	/* Ignore the unlock if we're withdrawn, unmounting, or in recovery. */
  	if (test_bit(SDF_NORECOVERY, &sdp->sd_flags) ||
  	    test_bit(SDF_WITHDRAWN, &sdp->sd_flags) ||
  	    test_bit(SDF_REMOTE_WITHDRAW, &sdp->sd_flags))
  		return;
  
  	/* We only care when a node wants us to unlock, because that means
  	 * they want a journal recovered. */
  	if (gl->gl_demote_state != LM_ST_UNLOCKED)
  		return;
  
  	if (sdp->sd_args.ar_spectator) {
  		fs_warn(sdp, "Spectator node cannot recover journals.
  ");
  		return;
  	}
  
  	fs_warn(sdp, "Some node has withdrawn; checking for recovery.
  ");
  	set_bit(SDF_REMOTE_WITHDRAW, &sdp->sd_flags);
  	/*
  	 * We can't call remote_withdraw directly here or gfs2_recover_journal
  	 * because this is called from the glock unlock function and the
  	 * remote_withdraw needs to enqueue and dequeue the same "live" glock
  	 * we were called from. So we queue it to the control work queue in
  	 * lock_dlm.
  	 */
  	queue_delayed_work(gfs2_control_wq, &sdp->sd_control_work, 0);
  }
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
665
  const struct gfs2_glock_operations gfs2_meta_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
666
  	.go_type = LM_TYPE_META,
a72d2401f   Bob Peterson   gfs2: Allow some ...
667
  	.go_flags = GLOF_NONDISK,
b3b94faa5   David Teigland   [GFS2] The core o...
668
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
669
  const struct gfs2_glock_operations gfs2_inode_glops = {
06dfc3064   Bob Peterson   GFS2: Rename glop...
670
  	.go_sync = inode_go_sync,
b3b94faa5   David Teigland   [GFS2] The core o...
671
672
673
  	.go_inval = inode_go_inval,
  	.go_demote_ok = inode_go_demote_ok,
  	.go_lock = inode_go_lock,
6802e3400   Steven Whitehouse   [GFS2] Clean up t...
674
  	.go_dump = inode_go_dump,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
675
  	.go_type = LM_TYPE_INODE,
f286d627e   Andreas Gruenbacher   gfs2: Keep track ...
676
  	.go_flags = GLOF_ASPACE | GLOF_LRU | GLOF_LVB,
601ef0d52   Bob Peterson   gfs2: Force withd...
677
  	.go_free = inode_go_free,
b3b94faa5   David Teigland   [GFS2] The core o...
678
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
679
  const struct gfs2_glock_operations gfs2_rgrp_glops = {
06dfc3064   Bob Peterson   GFS2: Rename glop...
680
  	.go_sync = rgrp_go_sync,
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
681
  	.go_inval = rgrp_go_inval,
7c9ca6211   Bob Peterson   GFS2: Use rbtree ...
682
  	.go_lock = gfs2_rgrp_go_lock,
090109783   Steven Whitehouse   GFS2: Improve res...
683
  	.go_dump = gfs2_rgrp_dump,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
684
  	.go_type = LM_TYPE_RGRP,
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
685
  	.go_flags = GLOF_LVB,
b3b94faa5   David Teigland   [GFS2] The core o...
686
  };
24972557b   Benjamin Marzinski   GFS2: remove tran...
687
688
689
690
  const struct gfs2_glock_operations gfs2_freeze_glops = {
  	.go_sync = freeze_go_sync,
  	.go_xmote_bh = freeze_go_xmote_bh,
  	.go_demote_ok = freeze_go_demote_ok,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
691
  	.go_type = LM_TYPE_NONDISK,
a72d2401f   Bob Peterson   gfs2: Allow some ...
692
  	.go_flags = GLOF_NONDISK,
b3b94faa5   David Teigland   [GFS2] The core o...
693
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
694
  const struct gfs2_glock_operations gfs2_iopen_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
695
  	.go_type = LM_TYPE_IOPEN,
b94a170e9   Benjamin Marzinski   GFS2: remove dcac...
696
  	.go_callback = iopen_go_callback,
a0e3cc65f   Andreas Gruenbacher   gfs2: Turn gl_del...
697
  	.go_demote_ok = iopen_go_demote_ok,
a72d2401f   Bob Peterson   gfs2: Allow some ...
698
  	.go_flags = GLOF_LRU | GLOF_NONDISK,
b3b94faa5   David Teigland   [GFS2] The core o...
699
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
700
  const struct gfs2_glock_operations gfs2_flock_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
701
  	.go_type = LM_TYPE_FLOCK,
a72d2401f   Bob Peterson   gfs2: Allow some ...
702
  	.go_flags = GLOF_LRU | GLOF_NONDISK,
b3b94faa5   David Teigland   [GFS2] The core o...
703
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
704
  const struct gfs2_glock_operations gfs2_nondisk_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
705
  	.go_type = LM_TYPE_NONDISK,
a72d2401f   Bob Peterson   gfs2: Allow some ...
706
  	.go_flags = GLOF_NONDISK,
601ef0d52   Bob Peterson   gfs2: Force withd...
707
  	.go_callback = nondisk_go_callback,
b3b94faa5   David Teigland   [GFS2] The core o...
708
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
709
  const struct gfs2_glock_operations gfs2_quota_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
710
  	.go_type = LM_TYPE_QUOTA,
a72d2401f   Bob Peterson   gfs2: Allow some ...
711
  	.go_flags = GLOF_LVB | GLOF_LRU | GLOF_NONDISK,
b3b94faa5   David Teigland   [GFS2] The core o...
712
  };
8fb4b536e   Steven Whitehouse   [GFS2] Make glock...
713
  const struct gfs2_glock_operations gfs2_journal_glops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
714
  	.go_type = LM_TYPE_JOURNAL,
a72d2401f   Bob Peterson   gfs2: Allow some ...
715
  	.go_flags = GLOF_NONDISK,
b3b94faa5   David Teigland   [GFS2] The core o...
716
  };
64d576ba2   Steven Whitehouse   GFS2: Add a "demo...
717
718
719
720
  const struct gfs2_glock_operations *gfs2_glops_list[] = {
  	[LM_TYPE_META] = &gfs2_meta_glops,
  	[LM_TYPE_INODE] = &gfs2_inode_glops,
  	[LM_TYPE_RGRP] = &gfs2_rgrp_glops,
64d576ba2   Steven Whitehouse   GFS2: Add a "demo...
721
722
723
724
725
726
  	[LM_TYPE_IOPEN] = &gfs2_iopen_glops,
  	[LM_TYPE_FLOCK] = &gfs2_flock_glops,
  	[LM_TYPE_NONDISK] = &gfs2_nondisk_glops,
  	[LM_TYPE_QUOTA] = &gfs2_quota_glops,
  	[LM_TYPE_JOURNAL] = &gfs2_journal_glops,
  };