Blame view

fs/gfs2/lops.c 19.3 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
12
13
14
   */
  
  #include <linux/sched.h>
  #include <linux/slab.h>
  #include <linux/spinlock.h>
  #include <linux/completion.h>
  #include <linux/buffer_head.h>
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
15
  #include <linux/gfs2_ondisk.h>
c969f58ca   Steven Whitehouse   GFS2: Update the ...
16
17
  #include <linux/bio.h>
  #include <linux/fs.h>
b3b94faa5   David Teigland   [GFS2] The core o...
18
19
  
  #include "gfs2.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
20
  #include "incore.h"
2332c4435   Robert Peterson   [GFS2] assertion ...
21
  #include "inode.h"
b3b94faa5   David Teigland   [GFS2] The core o...
22
23
24
25
26
27
28
  #include "glock.h"
  #include "log.h"
  #include "lops.h"
  #include "meta_io.h"
  #include "recovery.h"
  #include "rgrp.h"
  #include "trans.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
29
  #include "util.h"
63997775b   Steven Whitehouse   GFS2: Add tracepo...
30
  #include "trace_gfs2.h"
b3b94faa5   David Teigland   [GFS2] The core o...
31

9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
32
33
34
35
36
37
38
39
40
41
  /**
   * gfs2_pin - Pin a buffer in memory
   * @sdp: The superblock
   * @bh: The buffer to be pinned
   *
   * The log lock must be held when calling this function
   */
  static void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh)
  {
  	struct gfs2_bufdata *bd;
29687a2ac   Steven Whitehouse   GFS2: Alter point...
42
  	BUG_ON(!current->journal_info);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
43
44
45
46
47
48
49
50
51
52
  
  	clear_buffer_dirty(bh);
  	if (test_set_buffer_pinned(bh))
  		gfs2_assert_withdraw(sdp, 0);
  	if (!buffer_uptodate(bh))
  		gfs2_io_error_bh(sdp, bh);
  	bd = bh->b_private;
  	/* If this buffer is in the AIL and it has already been written
  	 * to in-place disk block, remove it from the AIL.
  	 */
c618e87a5   Steven Whitehouse   GFS2: Update to A...
53
  	spin_lock(&sdp->sd_ail_lock);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
54
55
  	if (bd->bd_ail)
  		list_move(&bd->bd_ail_st_list, &bd->bd_ail->ai_ail2_list);
c618e87a5   Steven Whitehouse   GFS2: Update to A...
56
  	spin_unlock(&sdp->sd_ail_lock);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
57
  	get_bh(bh);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
58
  	atomic_inc(&sdp->sd_log_pinned);
63997775b   Steven Whitehouse   GFS2: Add tracepo...
59
  	trace_gfs2_pin(bd, 1);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
60
  }
7c9ca6211   Bob Peterson   GFS2: Use rbtree ...
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  static bool buffer_is_rgrp(const struct gfs2_bufdata *bd)
  {
  	return bd->bd_gl->gl_name.ln_type == LM_TYPE_RGRP;
  }
  
  static void maybe_release_space(struct gfs2_bufdata *bd)
  {
  	struct gfs2_glock *gl = bd->bd_gl;
  	struct gfs2_sbd *sdp = gl->gl_sbd;
  	struct gfs2_rgrpd *rgd = gl->gl_object;
  	unsigned int index = bd->bd_bh->b_blocknr - gl->gl_name.ln_number;
  	struct gfs2_bitmap *bi = rgd->rd_bits + index;
  
  	if (bi->bi_clone == 0)
  		return;
  	if (sdp->sd_args.ar_discard)
  		gfs2_rgrp_send_discards(sdp, rgd->rd_data0, bd->bd_bh, bi);
  	memcpy(bi->bi_clone + bi->bi_offset,
  	       bd->bd_bh->b_data + bi->bi_offset, bi->bi_len);
  	clear_bit(GBF_FULL, &bi->bi_flags);
  	rgd->rd_free_clone = rgd->rd_free;
  }
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
83
84
85
86
87
  /**
   * gfs2_unpin - Unpin a buffer
   * @sdp: the filesystem the buffer belongs to
   * @bh: The buffer to unpin
   * @ai:
29687a2ac   Steven Whitehouse   GFS2: Alter point...
88
   * @flags: The inode dirty flags
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
89
90
91
92
93
94
95
   *
   */
  
  static void gfs2_unpin(struct gfs2_sbd *sdp, struct buffer_head *bh,
  		       struct gfs2_ail *ai)
  {
  	struct gfs2_bufdata *bd = bh->b_private;
29687a2ac   Steven Whitehouse   GFS2: Alter point...
96
97
  	BUG_ON(!buffer_uptodate(bh));
  	BUG_ON(!buffer_pinned(bh));
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
98
99
100
101
  
  	lock_buffer(bh);
  	mark_buffer_dirty(bh);
  	clear_buffer_pinned(bh);
7c9ca6211   Bob Peterson   GFS2: Use rbtree ...
102
103
  	if (buffer_is_rgrp(bd))
  		maybe_release_space(bd);
d6a079e82   Dave Chinner   GFS2: introduce A...
104
  	spin_lock(&sdp->sd_ail_lock);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
105
106
107
108
109
110
111
112
113
114
  	if (bd->bd_ail) {
  		list_del(&bd->bd_ail_st_list);
  		brelse(bh);
  	} else {
  		struct gfs2_glock *gl = bd->bd_gl;
  		list_add(&bd->bd_ail_gl_list, &gl->gl_ail_list);
  		atomic_inc(&gl->gl_ail_count);
  	}
  	bd->bd_ail = ai;
  	list_add(&bd->bd_ail_st_list, &ai->ai_ail1_list);
d6a079e82   Dave Chinner   GFS2: introduce A...
115
  	spin_unlock(&sdp->sd_ail_lock);
29687a2ac   Steven Whitehouse   GFS2: Alter point...
116
  	clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
63997775b   Steven Whitehouse   GFS2: Add tracepo...
117
  	trace_gfs2_pin(bd, 0);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
118
  	unlock_buffer(bh);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
119
  	atomic_dec(&sdp->sd_log_pinned);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
120
  }
16615be18   Steven Whitehouse   [GFS2] Clean up j...
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  
  static inline struct gfs2_log_descriptor *bh_log_desc(struct buffer_head *bh)
  {
  	return (struct gfs2_log_descriptor *)bh->b_data;
  }
  
  static inline __be64 *bh_log_ptr(struct buffer_head *bh)
  {
  	struct gfs2_log_descriptor *ld = bh_log_desc(bh);
  	return (__force __be64 *)(ld + 1);
  }
  
  static inline __be64 *bh_ptr_end(struct buffer_head *bh)
  {
  	return (__force __be64 *)(bh->b_data + bh->b_size);
  }
  
  
  static struct buffer_head *gfs2_get_log_desc(struct gfs2_sbd *sdp, u32 ld_type)
  {
  	struct buffer_head *bh = gfs2_log_get_buf(sdp);
  	struct gfs2_log_descriptor *ld = bh_log_desc(bh);
  	ld->ld_header.mh_magic = cpu_to_be32(GFS2_MAGIC);
  	ld->ld_header.mh_type = cpu_to_be32(GFS2_METATYPE_LD);
  	ld->ld_header.mh_format = cpu_to_be32(GFS2_FORMAT_LD);
  	ld->ld_type = cpu_to_be32(ld_type);
  	ld->ld_length = 0;
  	ld->ld_data1 = 0;
  	ld->ld_data2 = 0;
  	memset(ld->ld_reserved, 0, sizeof(ld->ld_reserved));
  	return bh;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
153
154
155
  static void buf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
  {
  	struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le);
0ab7d13fc   Steven Whitehouse   GFS2: Tag all met...
156
  	struct gfs2_meta_header *mh;
b3b94faa5   David Teigland   [GFS2] The core o...
157
  	struct gfs2_trans *tr;
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
158
  	lock_buffer(bd->bd_bh);
8bd957276   Steven Whitehouse   [GFS2] Fix list c...
159
  	gfs2_log_lock(sdp);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
160
161
  	if (!list_empty(&bd->bd_list_tr))
  		goto out;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
162
  	tr = current->journal_info;
b3b94faa5   David Teigland   [GFS2] The core o...
163
164
165
  	tr->tr_touched = 1;
  	tr->tr_num_buf++;
  	list_add(&bd->bd_list_tr, &tr->tr_list_buf);
b3b94faa5   David Teigland   [GFS2] The core o...
166
  	if (!list_empty(&le->le_list))
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
167
  		goto out;
2bcd610d2   Steven Whitehouse   [GFS2] Don't add ...
168
169
  	set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
  	set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags);
b3b94faa5   David Teigland   [GFS2] The core o...
170
  	gfs2_meta_check(sdp, bd->bd_bh);
a98ab2204   Steven Whitehouse   [GFS2] Rename gfs...
171
  	gfs2_pin(sdp, bd->bd_bh);
0ab7d13fc   Steven Whitehouse   GFS2: Tag all met...
172
173
174
  	mh = (struct gfs2_meta_header *)bd->bd_bh->b_data;
  	mh->__pad0 = cpu_to_be64(0);
  	mh->mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid);
b3b94faa5   David Teigland   [GFS2] The core o...
175
176
  	sdp->sd_log_num_buf++;
  	list_add(&le->le_list, &sdp->sd_log_le_buf);
b3b94faa5   David Teigland   [GFS2] The core o...
177
  	tr->tr_num_buf_new++;
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
178
179
180
  out:
  	gfs2_log_unlock(sdp);
  	unlock_buffer(bd->bd_bh);
b3b94faa5   David Teigland   [GFS2] The core o...
181
  }
b3b94faa5   David Teigland   [GFS2] The core o...
182
183
184
185
186
  static void buf_lo_before_commit(struct gfs2_sbd *sdp)
  {
  	struct buffer_head *bh;
  	struct gfs2_log_descriptor *ld;
  	struct gfs2_bufdata *bd1 = NULL, *bd2;
905d2aefa   Bob Peterson   [GFS2] Move some ...
187
  	unsigned int total;
b3b94faa5   David Teigland   [GFS2] The core o...
188
189
190
191
  	unsigned int limit;
  	unsigned int num;
  	unsigned n;
  	__be64 *ptr;
2332c4435   Robert Peterson   [GFS2] assertion ...
192
  	limit = buf_limit(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
193
  	/* for 4k blocks, limit = 503 */
905d2aefa   Bob Peterson   [GFS2] Move some ...
194
195
  	gfs2_log_lock(sdp);
  	total = sdp->sd_log_num_buf;
b3b94faa5   David Teigland   [GFS2] The core o...
196
197
198
199
200
  	bd1 = bd2 = list_prepare_entry(bd1, &sdp->sd_log_le_buf, bd_le.le_list);
  	while(total) {
  		num = total;
  		if (total > limit)
  			num = limit;
905d2aefa   Bob Peterson   [GFS2] Move some ...
201
  		gfs2_log_unlock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
202
  		bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_METADATA);
905d2aefa   Bob Peterson   [GFS2] Move some ...
203
  		gfs2_log_lock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
204
205
  		ld = bh_log_desc(bh);
  		ptr = bh_log_ptr(bh);
b3b94faa5   David Teigland   [GFS2] The core o...
206
207
  		ld->ld_length = cpu_to_be32(num + 1);
  		ld->ld_data1 = cpu_to_be32(num);
b3b94faa5   David Teigland   [GFS2] The core o...
208
209
  
  		n = 0;
568f4c965   Steven Whitehouse   [GFS2] 80 Column ...
210
211
  		list_for_each_entry_continue(bd1, &sdp->sd_log_le_buf,
  					     bd_le.le_list) {
b3b94faa5   David Teigland   [GFS2] The core o...
212
213
214
215
  			*ptr++ = cpu_to_be64(bd1->bd_bh->b_blocknr);
  			if (++n >= num)
  				break;
  		}
905d2aefa   Bob Peterson   [GFS2] Move some ...
216
  		gfs2_log_unlock(sdp);
721a9602e   Jens Axboe   block: kill off R...
217
  		submit_bh(WRITE_SYNC, bh);
905d2aefa   Bob Peterson   [GFS2] Move some ...
218
  		gfs2_log_lock(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
219
220
  
  		n = 0;
568f4c965   Steven Whitehouse   [GFS2] 80 Column ...
221
222
  		list_for_each_entry_continue(bd2, &sdp->sd_log_le_buf,
  					     bd_le.le_list) {
16615be18   Steven Whitehouse   [GFS2] Clean up j...
223
  			get_bh(bd2->bd_bh);
905d2aefa   Bob Peterson   [GFS2] Move some ...
224
  			gfs2_log_unlock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
225
  			lock_buffer(bd2->bd_bh);
b3b94faa5   David Teigland   [GFS2] The core o...
226
  			bh = gfs2_log_fake_buf(sdp, bd2->bd_bh);
721a9602e   Jens Axboe   block: kill off R...
227
  			submit_bh(WRITE_SYNC, bh);
905d2aefa   Bob Peterson   [GFS2] Move some ...
228
  			gfs2_log_lock(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
229
230
231
  			if (++n >= num)
  				break;
  		}
905d2aefa   Bob Peterson   [GFS2] Move some ...
232
  		BUG_ON(total < num);
b3b94faa5   David Teigland   [GFS2] The core o...
233
234
  		total -= num;
  	}
905d2aefa   Bob Peterson   [GFS2] Move some ...
235
  	gfs2_log_unlock(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
236
237
238
239
240
241
242
243
244
245
246
  }
  
  static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
  {
  	struct list_head *head = &sdp->sd_log_le_buf;
  	struct gfs2_bufdata *bd;
  
  	while (!list_empty(head)) {
  		bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list);
  		list_del_init(&bd->bd_le.le_list);
  		sdp->sd_log_num_buf--;
a98ab2204   Steven Whitehouse   [GFS2] Rename gfs...
247
  		gfs2_unpin(sdp, bd->bd_bh, ai);
b3b94faa5   David Teigland   [GFS2] The core o...
248
249
250
251
252
  	}
  	gfs2_assert_warn(sdp, !sdp->sd_log_num_buf);
  }
  
  static void buf_lo_before_scan(struct gfs2_jdesc *jd,
551676226   Al Viro   [GFS2] split and ...
253
  			       struct gfs2_log_header_host *head, int pass)
b3b94faa5   David Teigland   [GFS2] The core o...
254
  {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
255
  	struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
256
257
258
259
260
261
262
263
264
265
266
267
  
  	if (pass != 0)
  		return;
  
  	sdp->sd_found_blocks = 0;
  	sdp->sd_replayed_blocks = 0;
  }
  
  static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
  				struct gfs2_log_descriptor *ld, __be64 *ptr,
  				int pass)
  {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
268
269
  	struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
  	struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
270
  	struct gfs2_glock *gl = ip->i_gl;
b3b94faa5   David Teigland   [GFS2] The core o...
271
272
  	unsigned int blks = be32_to_cpu(ld->ld_data1);
  	struct buffer_head *bh_log, *bh_ip;
cd915493f   Steven Whitehouse   [GFS2] Change all...
273
  	u64 blkno;
b3b94faa5   David Teigland   [GFS2] The core o...
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
  	int error = 0;
  
  	if (pass != 1 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_METADATA)
  		return 0;
  
  	gfs2_replay_incr_blk(sdp, &start);
  
  	for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) {
  		blkno = be64_to_cpu(*ptr++);
  
  		sdp->sd_found_blocks++;
  
  		if (gfs2_revoke_check(sdp, blkno, start))
  			continue;
  
  		error = gfs2_replay_read_block(jd, start, &bh_log);
82ffa5163   Steven Whitehouse   [GFS2] More style...
290
291
  		if (error)
  			return error;
b3b94faa5   David Teigland   [GFS2] The core o...
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
  
  		bh_ip = gfs2_meta_new(gl, blkno);
  		memcpy(bh_ip->b_data, bh_log->b_data, bh_log->b_size);
  
  		if (gfs2_meta_check(sdp, bh_ip))
  			error = -EIO;
  		else
  			mark_buffer_dirty(bh_ip);
  
  		brelse(bh_log);
  		brelse(bh_ip);
  
  		if (error)
  			break;
  
  		sdp->sd_replayed_blocks++;
  	}
  
  	return error;
  }
  
  static void buf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
  {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
315
316
  	struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
  	struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
317
318
  
  	if (error) {
7276b3b0c   Steven Whitehouse   [GFS2] Tidy up me...
319
  		gfs2_meta_sync(ip->i_gl);
b3b94faa5   David Teigland   [GFS2] The core o...
320
321
322
323
  		return;
  	}
  	if (pass != 1)
  		return;
7276b3b0c   Steven Whitehouse   [GFS2] Tidy up me...
324
  	gfs2_meta_sync(ip->i_gl);
b3b94faa5   David Teigland   [GFS2] The core o...
325
326
327
328
329
330
331
332
  
  	fs_info(sdp, "jid=%u: Replayed %u of %u blocks
  ",
  	        jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks);
  }
  
  static void revoke_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
  {
f42ab0852   Steven Whitehouse   GFS2: Optimise gl...
333
334
  	struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le);
  	struct gfs2_glock *gl = bd->bd_gl;
b3b94faa5   David Teigland   [GFS2] The core o...
335
  	struct gfs2_trans *tr;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
336
  	tr = current->journal_info;
b3b94faa5   David Teigland   [GFS2] The core o...
337
338
  	tr->tr_touched = 1;
  	tr->tr_num_revoke++;
b3b94faa5   David Teigland   [GFS2] The core o...
339
  	sdp->sd_log_num_revoke++;
f42ab0852   Steven Whitehouse   GFS2: Optimise gl...
340
341
  	atomic_inc(&gl->gl_revokes);
  	set_bit(GLF_LFLUSH, &gl->gl_flags);
b3b94faa5   David Teigland   [GFS2] The core o...
342
  	list_add(&le->le_list, &sdp->sd_log_le_revoke);
b3b94faa5   David Teigland   [GFS2] The core o...
343
344
345
346
347
348
349
350
351
  }
  
  static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
  {
  	struct gfs2_log_descriptor *ld;
  	struct gfs2_meta_header *mh;
  	struct buffer_head *bh;
  	unsigned int offset;
  	struct list_head *head = &sdp->sd_log_le_revoke;
82e86087b   Steven Whitehouse   [GFS2] Replace re...
352
  	struct gfs2_bufdata *bd;
b3b94faa5   David Teigland   [GFS2] The core o...
353
354
355
  
  	if (!sdp->sd_log_num_revoke)
  		return;
16615be18   Steven Whitehouse   [GFS2] Clean up j...
356
357
  	bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_REVOKE);
  	ld = bh_log_desc(bh);
568f4c965   Steven Whitehouse   [GFS2] 80 Column ...
358
  	ld->ld_length = cpu_to_be32(gfs2_struct2blk(sdp, sdp->sd_log_num_revoke,
cd915493f   Steven Whitehouse   [GFS2] Change all...
359
  						    sizeof(u64)));
b3b94faa5   David Teigland   [GFS2] The core o...
360
  	ld->ld_data1 = cpu_to_be32(sdp->sd_log_num_revoke);
b3b94faa5   David Teigland   [GFS2] The core o...
361
  	offset = sizeof(struct gfs2_log_descriptor);
f42ab0852   Steven Whitehouse   GFS2: Optimise gl...
362
  	list_for_each_entry(bd, head, bd_le.le_list) {
b3b94faa5   David Teigland   [GFS2] The core o...
363
  		sdp->sd_log_num_revoke--;
cd915493f   Steven Whitehouse   [GFS2] Change all...
364
  		if (offset + sizeof(u64) > sdp->sd_sb.sb_bsize) {
721a9602e   Jens Axboe   block: kill off R...
365
  			submit_bh(WRITE_SYNC, bh);
b3b94faa5   David Teigland   [GFS2] The core o...
366
367
368
369
  
  			bh = gfs2_log_get_buf(sdp);
  			mh = (struct gfs2_meta_header *)bh->b_data;
  			mh->mh_magic = cpu_to_be32(GFS2_MAGIC);
e3167ded1   Steven Whitehouse   [GFS] Fix bug in ...
370
371
  			mh->mh_type = cpu_to_be32(GFS2_METATYPE_LB);
  			mh->mh_format = cpu_to_be32(GFS2_FORMAT_LB);
b3b94faa5   David Teigland   [GFS2] The core o...
372
373
  			offset = sizeof(struct gfs2_meta_header);
  		}
82e86087b   Steven Whitehouse   [GFS2] Replace re...
374
  		*(__be64 *)(bh->b_data + offset) = cpu_to_be64(bd->bd_blkno);
cd915493f   Steven Whitehouse   [GFS2] Change all...
375
  		offset += sizeof(u64);
b3b94faa5   David Teigland   [GFS2] The core o...
376
377
  	}
  	gfs2_assert_withdraw(sdp, !sdp->sd_log_num_revoke);
721a9602e   Jens Axboe   block: kill off R...
378
  	submit_bh(WRITE_SYNC, bh);
b3b94faa5   David Teigland   [GFS2] The core o...
379
  }
f42ab0852   Steven Whitehouse   GFS2: Optimise gl...
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
  static void revoke_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
  {
  	struct list_head *head = &sdp->sd_log_le_revoke;
  	struct gfs2_bufdata *bd;
  	struct gfs2_glock *gl;
  
  	while (!list_empty(head)) {
  		bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list);
  		list_del_init(&bd->bd_le.le_list);
  		gl = bd->bd_gl;
  		atomic_dec(&gl->gl_revokes);
  		clear_bit(GLF_LFLUSH, &gl->gl_flags);
  		kmem_cache_free(gfs2_bufdata_cachep, bd);
  	}
  }
b3b94faa5   David Teigland   [GFS2] The core o...
395
  static void revoke_lo_before_scan(struct gfs2_jdesc *jd,
551676226   Al Viro   [GFS2] split and ...
396
  				  struct gfs2_log_header_host *head, int pass)
b3b94faa5   David Teigland   [GFS2] The core o...
397
  {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
398
  	struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
399
400
401
402
403
404
405
406
407
408
409
410
  
  	if (pass != 0)
  		return;
  
  	sdp->sd_found_revokes = 0;
  	sdp->sd_replay_tail = head->lh_tail;
  }
  
  static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
  				   struct gfs2_log_descriptor *ld, __be64 *ptr,
  				   int pass)
  {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
411
  	struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
412
413
414
415
  	unsigned int blks = be32_to_cpu(ld->ld_length);
  	unsigned int revokes = be32_to_cpu(ld->ld_data1);
  	struct buffer_head *bh;
  	unsigned int offset;
cd915493f   Steven Whitehouse   [GFS2] Change all...
416
  	u64 blkno;
b3b94faa5   David Teigland   [GFS2] The core o...
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
  	int first = 1;
  	int error;
  
  	if (pass != 0 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_REVOKE)
  		return 0;
  
  	offset = sizeof(struct gfs2_log_descriptor);
  
  	for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) {
  		error = gfs2_replay_read_block(jd, start, &bh);
  		if (error)
  			return error;
  
  		if (!first)
  			gfs2_metatype_check(sdp, bh, GFS2_METATYPE_LB);
cd915493f   Steven Whitehouse   [GFS2] Change all...
432
  		while (offset + sizeof(u64) <= sdp->sd_sb.sb_bsize) {
b3b94faa5   David Teigland   [GFS2] The core o...
433
434
435
  			blkno = be64_to_cpu(*(__be64 *)(bh->b_data + offset));
  
  			error = gfs2_revoke_add(sdp, blkno, start);
3ad62e87c   Bob Peterson   [GFS2] Plug an un...
436
437
  			if (error < 0) {
  				brelse(bh);
b3b94faa5   David Teigland   [GFS2] The core o...
438
  				return error;
3ad62e87c   Bob Peterson   [GFS2] Plug an un...
439
  			}
b3b94faa5   David Teigland   [GFS2] The core o...
440
441
442
443
444
  			else if (error)
  				sdp->sd_found_revokes++;
  
  			if (!--revokes)
  				break;
cd915493f   Steven Whitehouse   [GFS2] Change all...
445
  			offset += sizeof(u64);
b3b94faa5   David Teigland   [GFS2] The core o...
446
447
448
449
450
451
452
453
454
455
456
457
  		}
  
  		brelse(bh);
  		offset = sizeof(struct gfs2_meta_header);
  		first = 0;
  	}
  
  	return 0;
  }
  
  static void revoke_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
  {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
458
  	struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
459
460
461
462
463
464
465
466
467
468
469
470
471
472
  
  	if (error) {
  		gfs2_revoke_clean(sdp);
  		return;
  	}
  	if (pass != 1)
  		return;
  
  	fs_info(sdp, "jid=%u: Found %u revoke tags
  ",
  	        jd->jd_jid, sdp->sd_found_revokes);
  
  	gfs2_revoke_clean(sdp);
  }
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
  /**
   * databuf_lo_add - Add a databuf to the transaction.
   *
   * This is used in two distinct cases:
   * i) In ordered write mode
   *    We put the data buffer on a list so that we can ensure that its
   *    synced to disk at the right time
   * ii) In journaled data mode
   *    We need to journal the data block in the same way as metadata in
   *    the functions above. The difference is that here we have a tag
   *    which is two __be64's being the block number (as per meta data)
   *    and a flag which says whether the data block needs escaping or
   *    not. This means we need a new log entry for each 251 or so data
   *    blocks, which isn't an enormous overhead but twice as much as
   *    for normal metadata blocks.
   */
b3b94faa5   David Teigland   [GFS2] The core o...
489
490
  static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
  {
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
491
  	struct gfs2_bufdata *bd = container_of(le, struct gfs2_bufdata, bd_le);
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
492
  	struct gfs2_trans *tr = current->journal_info;
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
493
  	struct address_space *mapping = bd->bd_bh->b_page->mapping;
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
494
  	struct gfs2_inode *ip = GFS2_I(mapping->host);
b3b94faa5   David Teigland   [GFS2] The core o...
495

9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
496
  	lock_buffer(bd->bd_bh);
8bd957276   Steven Whitehouse   [GFS2] Fix list c...
497
  	gfs2_log_lock(sdp);
9ff8ec32e   Steven Whitehouse   [GFS2] Split gfs2...
498
499
500
501
502
503
504
505
  	if (tr) {
  		if (!list_empty(&bd->bd_list_tr))
  			goto out;
  		tr->tr_touched = 1;
  		if (gfs2_is_jdata(ip)) {
  			tr->tr_num_buf++;
  			list_add(&bd->bd_list_tr, &tr->tr_list_buf);
  		}
773ed1a04   Robert Peterson   [GFS2] Addendum t...
506
  	}
2332c4435   Robert Peterson   [GFS2] assertion ...
507
  	if (!list_empty(&le->le_list))
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
508
  		goto out;
2332c4435   Robert Peterson   [GFS2] assertion ...
509

2bcd610d2   Steven Whitehouse   [GFS2] Don't add ...
510
511
  	set_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags);
  	set_bit(GLF_DIRTY, &bd->bd_gl->gl_flags);
2332c4435   Robert Peterson   [GFS2] assertion ...
512
  	if (gfs2_is_jdata(ip)) {
2332c4435   Robert Peterson   [GFS2] assertion ...
513
514
  		gfs2_pin(sdp, bd->bd_bh);
  		tr->tr_num_databuf_new++;
d7b616e25   Steven Whitehouse   [GFS2] Clean up o...
515
  		sdp->sd_log_num_databuf++;
e5884636d   Dave Chinner   GFS2: ordered wri...
516
  		list_add_tail(&le->le_list, &sdp->sd_log_le_databuf);
d7b616e25   Steven Whitehouse   [GFS2] Clean up o...
517
  	} else {
e5884636d   Dave Chinner   GFS2: ordered wri...
518
  		list_add_tail(&le->le_list, &sdp->sd_log_le_ordered);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
519
  	}
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
520
  out:
b3b94faa5   David Teigland   [GFS2] The core o...
521
  	gfs2_log_unlock(sdp);
9b9107a5a   Steven Whitehouse   [GFS2] Move pin/u...
522
  	unlock_buffer(bd->bd_bh);
b3b94faa5   David Teigland   [GFS2] The core o...
523
  }
16615be18   Steven Whitehouse   [GFS2] Clean up j...
524
  static void gfs2_check_magic(struct buffer_head *bh)
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
525
  {
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
526
527
  	void *kaddr;
  	__be32 *ptr;
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
528

16615be18   Steven Whitehouse   [GFS2] Clean up j...
529
530
  	clear_buffer_escaped(bh);
  	kaddr = kmap_atomic(bh->b_page, KM_USER0);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
531
532
  	ptr = kaddr + bh_offset(bh);
  	if (*ptr == cpu_to_be32(GFS2_MAGIC))
16615be18   Steven Whitehouse   [GFS2] Clean up j...
533
  		set_buffer_escaped(bh);
c312c4fdc   Russell Cattelan   [GFS2] Pass the c...
534
  	kunmap_atomic(kaddr, KM_USER0);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
535
  }
16615be18   Steven Whitehouse   [GFS2] Clean up j...
536
537
538
  static void gfs2_write_blocks(struct gfs2_sbd *sdp, struct buffer_head *bh,
  			      struct list_head *list, struct list_head *done,
  			      unsigned int n)
b3b94faa5   David Teigland   [GFS2] The core o...
539
  {
16615be18   Steven Whitehouse   [GFS2] Clean up j...
540
  	struct buffer_head *bh1;
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
541
  	struct gfs2_log_descriptor *ld;
16615be18   Steven Whitehouse   [GFS2] Clean up j...
542
543
  	struct gfs2_bufdata *bd;
  	__be64 *ptr;
d7b616e25   Steven Whitehouse   [GFS2] Clean up o...
544

16615be18   Steven Whitehouse   [GFS2] Clean up j...
545
546
  	if (!bh)
  		return;
b3b94faa5   David Teigland   [GFS2] The core o...
547

16615be18   Steven Whitehouse   [GFS2] Clean up j...
548
549
550
  	ld = bh_log_desc(bh);
  	ld->ld_length = cpu_to_be32(n + 1);
  	ld->ld_data1 = cpu_to_be32(n);
b3b94faa5   David Teigland   [GFS2] The core o...
551

16615be18   Steven Whitehouse   [GFS2] Clean up j...
552
553
554
  	ptr = bh_log_ptr(bh);
  	
  	get_bh(bh);
721a9602e   Jens Axboe   block: kill off R...
555
  	submit_bh(WRITE_SYNC, bh);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
556
  	gfs2_log_lock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
557
558
559
560
561
562
563
  	while(!list_empty(list)) {
  		bd = list_entry(list->next, struct gfs2_bufdata, bd_le.le_list);
  		list_move_tail(&bd->bd_le.le_list, done);
  		get_bh(bd->bd_bh);
  		while (be64_to_cpu(*ptr) != bd->bd_bh->b_blocknr) {
  			gfs2_log_incr_head(sdp);
  			ptr += 2;
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
564
  		}
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
565
  		gfs2_log_unlock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
566
567
568
569
570
571
572
573
574
575
576
577
578
579
  		lock_buffer(bd->bd_bh);
  		if (buffer_escaped(bd->bd_bh)) {
  			void *kaddr;
  			bh1 = gfs2_log_get_buf(sdp);
  			kaddr = kmap_atomic(bd->bd_bh->b_page, KM_USER0);
  			memcpy(bh1->b_data, kaddr + bh_offset(bd->bd_bh),
  			       bh1->b_size);
  			kunmap_atomic(kaddr, KM_USER0);
  			*(__be32 *)bh1->b_data = 0;
  			clear_buffer_escaped(bd->bd_bh);
  			unlock_buffer(bd->bd_bh);
  			brelse(bd->bd_bh);
  		} else {
  			bh1 = gfs2_log_fake_buf(sdp, bd->bd_bh);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
580
  		}
721a9602e   Jens Axboe   block: kill off R...
581
  		submit_bh(WRITE_SYNC, bh1);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
582
  		gfs2_log_lock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
  		ptr += 2;
  	}
  	gfs2_log_unlock(sdp);
  	brelse(bh);
  }
  
  /**
   * databuf_lo_before_commit - Scan the data buffers, writing as we go
   *
   */
  
  static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
  {
  	struct gfs2_bufdata *bd = NULL;
  	struct buffer_head *bh = NULL;
  	unsigned int n = 0;
  	__be64 *ptr = NULL, *end = NULL;
  	LIST_HEAD(processed);
  	LIST_HEAD(in_progress);
  
  	gfs2_log_lock(sdp);
  	while (!list_empty(&sdp->sd_log_le_databuf)) {
  		if (ptr == end) {
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
606
  			gfs2_log_unlock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
607
608
609
610
611
  			gfs2_write_blocks(sdp, bh, &in_progress, &processed, n);
  			n = 0;
  			bh = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_JDATA);
  			ptr = bh_log_ptr(bh);
  			end = bh_ptr_end(bh) - 1;
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
612
  			gfs2_log_lock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
613
  			continue;
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
614
  		}
16615be18   Steven Whitehouse   [GFS2] Clean up j...
615
616
617
618
619
620
  		bd = list_entry(sdp->sd_log_le_databuf.next, struct gfs2_bufdata, bd_le.le_list);
  		list_move_tail(&bd->bd_le.le_list, &in_progress);
  		gfs2_check_magic(bd->bd_bh);
  		*ptr++ = cpu_to_be64(bd->bd_bh->b_blocknr);
  		*ptr++ = cpu_to_be64(buffer_escaped(bh) ? 1 : 0);
  		n++;
b3b94faa5   David Teigland   [GFS2] The core o...
621
  	}
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
622
  	gfs2_log_unlock(sdp);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
623
624
625
626
  	gfs2_write_blocks(sdp, bh, &in_progress, &processed, n);
  	gfs2_log_lock(sdp);
  	list_splice(&processed, &sdp->sd_log_le_databuf);
  	gfs2_log_unlock(sdp);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
627
628
629
630
631
632
  }
  
  static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
  				    struct gfs2_log_descriptor *ld,
  				    __be64 *ptr, int pass)
  {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
633
634
  	struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
  	struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
635
  	struct gfs2_glock *gl = ip->i_gl;
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
636
637
  	unsigned int blks = be32_to_cpu(ld->ld_data1);
  	struct buffer_head *bh_log, *bh_ip;
cd915493f   Steven Whitehouse   [GFS2] Change all...
638
639
  	u64 blkno;
  	u64 esc;
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
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
665
666
667
668
669
670
  	int error = 0;
  
  	if (pass != 1 || be32_to_cpu(ld->ld_type) != GFS2_LOG_DESC_JDATA)
  		return 0;
  
  	gfs2_replay_incr_blk(sdp, &start);
  	for (; blks; gfs2_replay_incr_blk(sdp, &start), blks--) {
  		blkno = be64_to_cpu(*ptr++);
  		esc = be64_to_cpu(*ptr++);
  
  		sdp->sd_found_blocks++;
  
  		if (gfs2_revoke_check(sdp, blkno, start))
  			continue;
  
  		error = gfs2_replay_read_block(jd, start, &bh_log);
  		if (error)
  			return error;
  
  		bh_ip = gfs2_meta_new(gl, blkno);
  		memcpy(bh_ip->b_data, bh_log->b_data, bh_log->b_size);
  
  		/* Unescape */
  		if (esc) {
  			__be32 *eptr = (__be32 *)bh_ip->b_data;
  			*eptr = cpu_to_be32(GFS2_MAGIC);
  		}
  		mark_buffer_dirty(bh_ip);
  
  		brelse(bh_log);
  		brelse(bh_ip);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
671
672
673
674
675
676
677
678
679
680
681
  
  		sdp->sd_replayed_blocks++;
  	}
  
  	return error;
  }
  
  /* FIXME: sort out accounting for log blocks etc. */
  
  static void databuf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
  {
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
682
683
  	struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
  	struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
684
685
  
  	if (error) {
7276b3b0c   Steven Whitehouse   [GFS2] Tidy up me...
686
  		gfs2_meta_sync(ip->i_gl);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
687
688
689
690
691
692
  		return;
  	}
  	if (pass != 1)
  		return;
  
  	/* data sync? */
7276b3b0c   Steven Whitehouse   [GFS2] Tidy up me...
693
  	gfs2_meta_sync(ip->i_gl);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
694
695
696
697
698
699
700
701
702
703
704
705
706
  
  	fs_info(sdp, "jid=%u: Replayed %u of %u data blocks
  ",
  		jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks);
  }
  
  static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
  {
  	struct list_head *head = &sdp->sd_log_le_databuf;
  	struct gfs2_bufdata *bd;
  
  	while (!list_empty(head)) {
  		bd = list_entry(head->next, struct gfs2_bufdata, bd_le.le_list);
b8e1aabf2   Steven Whitehouse   [GFS2] Another li...
707
  		list_del_init(&bd->bd_le.le_list);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
708
  		sdp->sd_log_num_databuf--;
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
709
  		gfs2_unpin(sdp, bd->bd_bh, ai);
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
710
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
711
712
  	gfs2_assert_warn(sdp, !sdp->sd_log_num_databuf);
  }
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
713

b09e593d7   Steven Whitehouse   [GFS2] Fix a ref ...
714
  const struct gfs2_log_operations gfs2_buf_lops = {
b3b94faa5   David Teigland   [GFS2] The core o...
715
  	.lo_add = buf_lo_add,
b3b94faa5   David Teigland   [GFS2] The core o...
716
717
718
719
720
  	.lo_before_commit = buf_lo_before_commit,
  	.lo_after_commit = buf_lo_after_commit,
  	.lo_before_scan = buf_lo_before_scan,
  	.lo_scan_elements = buf_lo_scan_elements,
  	.lo_after_scan = buf_lo_after_scan,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
721
  	.lo_name = "buf",
b3b94faa5   David Teigland   [GFS2] The core o...
722
  };
b09e593d7   Steven Whitehouse   [GFS2] Fix a ref ...
723
  const struct gfs2_log_operations gfs2_revoke_lops = {
b3b94faa5   David Teigland   [GFS2] The core o...
724
725
  	.lo_add = revoke_lo_add,
  	.lo_before_commit = revoke_lo_before_commit,
f42ab0852   Steven Whitehouse   GFS2: Optimise gl...
726
  	.lo_after_commit = revoke_lo_after_commit,
b3b94faa5   David Teigland   [GFS2] The core o...
727
728
729
  	.lo_before_scan = revoke_lo_before_scan,
  	.lo_scan_elements = revoke_lo_scan_elements,
  	.lo_after_scan = revoke_lo_after_scan,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
730
  	.lo_name = "revoke",
b3b94faa5   David Teigland   [GFS2] The core o...
731
  };
b09e593d7   Steven Whitehouse   [GFS2] Fix a ref ...
732
  const struct gfs2_log_operations gfs2_rg_lops = {
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
733
  	.lo_name = "rg",
b3b94faa5   David Teigland   [GFS2] The core o...
734
  };
b09e593d7   Steven Whitehouse   [GFS2] Fix a ref ...
735
  const struct gfs2_log_operations gfs2_databuf_lops = {
b3b94faa5   David Teigland   [GFS2] The core o...
736
737
  	.lo_add = databuf_lo_add,
  	.lo_before_commit = databuf_lo_before_commit,
18ec7d5c3   Steven Whitehouse   [GFS2] Make journ...
738
739
740
  	.lo_after_commit = databuf_lo_after_commit,
  	.lo_scan_elements = databuf_lo_scan_elements,
  	.lo_after_scan = databuf_lo_after_scan,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
741
  	.lo_name = "databuf",
b3b94faa5   David Teigland   [GFS2] The core o...
742
  };
b09e593d7   Steven Whitehouse   [GFS2] Fix a ref ...
743
  const struct gfs2_log_operations *gfs2_log_ops[] = {
16615be18   Steven Whitehouse   [GFS2] Clean up j...
744
  	&gfs2_databuf_lops,
b3b94faa5   David Teigland   [GFS2] The core o...
745
  	&gfs2_buf_lops,
b3b94faa5   David Teigland   [GFS2] The core o...
746
  	&gfs2_rg_lops,
16615be18   Steven Whitehouse   [GFS2] Clean up j...
747
  	&gfs2_revoke_lops,
ea67eedb2   Steven Whitehouse   [GFS2] Fix end of...
748
  	NULL,
b3b94faa5   David Teigland   [GFS2] The core o...
749
  };