Blame view

fs/gfs2/ops_fstype.c 35.3 KB
b3b94faa5   David Teigland   [GFS2] The core o...
1
2
  /*
   * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
cf45b752c   Bob Peterson   [GFS2] Remove rgr...
3
   * Copyright (C) 2004-2008 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
   */
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
9
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
b3b94faa5   David Teigland   [GFS2] The core o...
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>
b3b94faa5   David Teigland   [GFS2] The core o...
15
16
  #include <linux/blkdev.h>
  #include <linux/kthread.h>
afeacc8c1   Paul Gortmaker   fs: add export.h ...
17
  #include <linux/export.h>
863846054   Abhijith Das   [GFS2] Allow moun...
18
19
  #include <linux/namei.h>
  #include <linux/mount.h>
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
20
  #include <linux/gfs2_ondisk.h>
cc632e7f9   Steven Whitehouse   GFS2: Hook gfs2_q...
21
  #include <linux/quotaops.h>
56aa72d0f   Jan Kara   GFS2: Get rid of ...
22
  #include <linux/lockdep.h>
7f78e0351   Eric W. Biederman   fs: Limit sys_mou...
23
  #include <linux/module.h>
95fe66de9   Jan Kara   gfs2: Convert to ...
24
  #include <linux/backing-dev.h>
b3b94faa5   David Teigland   [GFS2] The core o...
25
26
  
  #include "gfs2.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
27
  #include "incore.h"
da6dd40d5   Bob Peterson   [GFS2] Journal ex...
28
  #include "bmap.h"
b3b94faa5   David Teigland   [GFS2] The core o...
29
30
31
  #include "glock.h"
  #include "glops.h"
  #include "inode.h"
b3b94faa5   David Teigland   [GFS2] The core o...
32
33
34
  #include "recovery.h"
  #include "rgrp.h"
  #include "super.h"
b3b94faa5   David Teigland   [GFS2] The core o...
35
  #include "sys.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
36
  #include "util.h"
bb3b0e3df   Steven Whitehouse   [GFS2] Clean up i...
37
  #include "log.h"
9ac1b4d9b   Steven Whitehouse   GFS2: Move gfs2_r...
38
  #include "quota.h"
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
39
  #include "dir.h"
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
40
  #include "meta_io.h"
63997775b   Steven Whitehouse   GFS2: Add tracepo...
41
  #include "trace_gfs2.h"
b3b94faa5   David Teigland   [GFS2] The core o...
42
43
44
  
  #define DO 0
  #define UNDO 1
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
45
46
47
48
49
50
51
52
53
  /**
   * gfs2_tune_init - Fill a gfs2_tune structure with default values
   * @gt: tune
   *
   */
  
  static void gfs2_tune_init(struct gfs2_tune *gt)
  {
  	spin_lock_init(&gt->gt_spin);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
54
55
56
  	gt->gt_quota_warn_period = 10;
  	gt->gt_quota_scale_num = 1;
  	gt->gt_quota_scale_den = 1;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
57
  	gt->gt_new_files_jdata = 0;
47a9a5279   Fabian Frederick   GFS2: use BIT() m...
58
  	gt->gt_max_readahead = BIT(18);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
59
  	gt->gt_complain_secs = 10;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
60
  }
b3b94faa5   David Teigland   [GFS2] The core o...
61
62
63
  static struct gfs2_sbd *init_sbd(struct super_block *sb)
  {
  	struct gfs2_sbd *sdp;
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
64
  	struct address_space *mapping;
b3b94faa5   David Teigland   [GFS2] The core o...
65

85d1da67f   Steven Whitehouse   [GFS2] Move glock...
66
  	sdp = kzalloc(sizeof(struct gfs2_sbd), GFP_KERNEL);
b3b94faa5   David Teigland   [GFS2] The core o...
67
68
  	if (!sdp)
  		return NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
69
  	sdp->sd_vfs = sb;
a245769f2   Steven Whitehouse   GFS2: glock stati...
70
71
72
73
74
  	sdp->sd_lkstats = alloc_percpu(struct gfs2_pcpu_lkstats);
  	if (!sdp->sd_lkstats) {
  		kfree(sdp);
  		return NULL;
  	}
49ee6220b   Andrew Price   gfs2: Don't leave...
75
  	sb->s_fs_info = sdp;
a245769f2   Steven Whitehouse   GFS2: glock stati...
76

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
77
  	set_bit(SDF_NOJOURNALID, &sdp->sd_flags);
b3b94faa5   David Teigland   [GFS2] The core o...
78
  	gfs2_tune_init(&sdp->sd_tune);
e402746a9   Steven Whitehouse   GFS2: Wait for un...
79
80
  	init_waitqueue_head(&sdp->sd_glock_wait);
  	atomic_set(&sdp->sd_glock_disposal, 0);
3942ae531   Steven Whitehouse   GFS2: Fix race du...
81
  	init_completion(&sdp->sd_locking_init);
fd95e81cb   Steven Whitehouse   GFS2: Reinstate w...
82
  	init_completion(&sdp->sd_wdack);
b3b94faa5   David Teigland   [GFS2] The core o...
83
  	spin_lock_init(&sdp->sd_statfs_spin);
b3b94faa5   David Teigland   [GFS2] The core o...
84
85
  
  	spin_lock_init(&sdp->sd_rindex_spin);
7c9ca6211   Bob Peterson   GFS2: Use rbtree ...
86
  	sdp->sd_rindex_tree.rb_node = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
87
88
89
  
  	INIT_LIST_HEAD(&sdp->sd_jindex_list);
  	spin_lock_init(&sdp->sd_jindex_spin);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
90
  	mutex_init(&sdp->sd_jindex_mutex);
0e48e055a   Bob Peterson   GFS2: Prevent rec...
91
  	init_completion(&sdp->sd_journal_ready);
b3b94faa5   David Teigland   [GFS2] The core o...
92

b3b94faa5   David Teigland   [GFS2] The core o...
93
  	INIT_LIST_HEAD(&sdp->sd_quota_list);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
94
  	mutex_init(&sdp->sd_quota_mutex);
e46c772db   Steven Whitehouse   GFS2: Protect quo...
95
  	mutex_init(&sdp->sd_quota_sync_mutex);
37b2c8377   Steven Whitehouse   GFS2: Clean up & ...
96
  	init_waitqueue_head(&sdp->sd_quota_wait);
813e0c46c   Steven Whitehouse   GFS2: Fix "trunca...
97
98
  	INIT_LIST_HEAD(&sdp->sd_trunc_list);
  	spin_lock_init(&sdp->sd_trunc_lock);
2d9e72303   Steven Whitehouse   GFS2: Move quota ...
99
  	spin_lock_init(&sdp->sd_bitmap_lock);
b3b94faa5   David Teigland   [GFS2] The core o...
100

70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
101
  	mapping = &sdp->sd_aspace;
39849d694   Steven Whitehouse   GFS2: Add initial...
102
  	address_space_init_once(mapping);
1b2ad4121   Steven Whitehouse   GFS2: Fix address...
103
  	mapping->a_ops = &gfs2_rgrp_aops;
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
104
105
106
107
  	mapping->host = sb->s_bdev->bd_inode;
  	mapping->flags = 0;
  	mapping_set_gfp_mask(mapping, GFP_NOFS);
  	mapping->private_data = NULL;
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
108
  	mapping->writeback_index = 0;
b3b94faa5   David Teigland   [GFS2] The core o...
109
  	spin_lock_init(&sdp->sd_log_lock);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
110
  	atomic_set(&sdp->sd_log_pinned, 0);
b3b94faa5   David Teigland   [GFS2] The core o...
111
  	INIT_LIST_HEAD(&sdp->sd_log_le_revoke);
d7b616e25   Steven Whitehouse   [GFS2] Clean up o...
112
  	INIT_LIST_HEAD(&sdp->sd_log_le_ordered);
451389909   Steven Whitehouse   GFS2: Use ->write...
113
  	spin_lock_init(&sdp->sd_ordered_lock);
b3b94faa5   David Teigland   [GFS2] The core o...
114

5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
115
116
  	init_waitqueue_head(&sdp->sd_log_waitq);
  	init_waitqueue_head(&sdp->sd_logd_waitq);
d6a079e82   Dave Chinner   GFS2: introduce A...
117
  	spin_lock_init(&sdp->sd_ail_lock);
b3b94faa5   David Teigland   [GFS2] The core o...
118
119
  	INIT_LIST_HEAD(&sdp->sd_ail1_list);
  	INIT_LIST_HEAD(&sdp->sd_ail2_list);
484adff8a   Steven Whitehouse   [GFS2] Update loc...
120
  	init_rwsem(&sdp->sd_log_flush_lock);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
121
  	atomic_set(&sdp->sd_log_in_flight, 0);
2e60d7683   Benjamin Marzinski   GFS2: update free...
122
123
  	atomic_set(&sdp->sd_reserving_log, 0);
  	init_waitqueue_head(&sdp->sd_reserving_log_wait);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
124
  	init_waitqueue_head(&sdp->sd_log_flush_wait);
2e60d7683   Benjamin Marzinski   GFS2: update free...
125
126
  	atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
  	mutex_init(&sdp->sd_freeze_mutex);
b3b94faa5   David Teigland   [GFS2] The core o...
127

b3b94faa5   David Teigland   [GFS2] The core o...
128
129
  	return sdp;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
130

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
131
132
133
134
135
136
137
138
139
140
  /**
   * gfs2_check_sb - Check superblock
   * @sdp: the filesystem
   * @sb: The superblock
   * @silent: Don't print a message if the check fails
   *
   * Checks the version code of the FS is one that we understand how to
   * read and that the sizes of the various on-disk structures have not
   * changed.
   */
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
141
  static int gfs2_check_sb(struct gfs2_sbd *sdp, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
142
  {
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
143
  	struct gfs2_sb_host *sb = &sdp->sd_sb;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
144
145
146
  	if (sb->sb_magic != GFS2_MAGIC ||
  	    sb->sb_type != GFS2_METATYPE_SB) {
  		if (!silent)
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
147
148
  			pr_warn("not a GFS2 filesystem
  ");
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
149
150
151
152
153
154
155
156
  		return -EINVAL;
  	}
  
  	/*  If format numbers match exactly, we're done.  */
  
  	if (sb->sb_fs_format == GFS2_FORMAT_FS &&
  	    sb->sb_multihost_format == GFS2_FORMAT_MULTI)
  		return 0;
c80dbb58f   Steven Whitehouse   GFS2: Remove upgr...
157
158
  	fs_warn(sdp, "Unknown on-disk format, unable to mount
  ");
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
159

c80dbb58f   Steven Whitehouse   GFS2: Remove upgr...
160
  	return -EINVAL;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
161
  }
4246a0b63   Christoph Hellwig   block: add a bi_e...
162
  static void end_bio_io_page(struct bio *bio)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
163
164
  {
  	struct page *page = bio->bi_private;
4e4cbee93   Christoph Hellwig   block: switch bio...
165
  	if (!bio->bi_status)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
166
167
  		SetPageUptodate(page);
  	else
4e4cbee93   Christoph Hellwig   block: switch bio...
168
169
  		pr_warn("error %d reading superblock
  ", bio->bi_status);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
170
171
  	unlock_page(page);
  }
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
172
  static void gfs2_sb_in(struct gfs2_sbd *sdp, const void *buf)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
173
  {
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
174
175
  	struct gfs2_sb_host *sb = &sdp->sd_sb;
  	struct super_block *s = sdp->sd_vfs;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
  	const struct gfs2_sb *str = buf;
  
  	sb->sb_magic = be32_to_cpu(str->sb_header.mh_magic);
  	sb->sb_type = be32_to_cpu(str->sb_header.mh_type);
  	sb->sb_format = be32_to_cpu(str->sb_header.mh_format);
  	sb->sb_fs_format = be32_to_cpu(str->sb_fs_format);
  	sb->sb_multihost_format = be32_to_cpu(str->sb_multihost_format);
  	sb->sb_bsize = be32_to_cpu(str->sb_bsize);
  	sb->sb_bsize_shift = be32_to_cpu(str->sb_bsize_shift);
  	sb->sb_master_dir.no_addr = be64_to_cpu(str->sb_master_dir.no_addr);
  	sb->sb_master_dir.no_formal_ino = be64_to_cpu(str->sb_master_dir.no_formal_ino);
  	sb->sb_root_dir.no_addr = be64_to_cpu(str->sb_root_dir.no_addr);
  	sb->sb_root_dir.no_formal_ino = be64_to_cpu(str->sb_root_dir.no_formal_ino);
  
  	memcpy(sb->sb_lockproto, str->sb_lockproto, GFS2_LOCKNAME_LEN);
  	memcpy(sb->sb_locktable, str->sb_locktable, GFS2_LOCKNAME_LEN);
85787090a   Christoph Hellwig   fs: switch ->s_uu...
192
  	memcpy(&s->s_uuid, str->sb_uuid, 16);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
  }
  
  /**
   * gfs2_read_super - Read the gfs2 super block from disk
   * @sdp: The GFS2 super block
   * @sector: The location of the super block
   * @error: The error code to return
   *
   * This uses the bio functions to read the super block from disk
   * because we want to be 100% sure that we never read cached data.
   * A super block is read twice only during each GFS2 mount and is
   * never written to by the filesystem. The first time its read no
   * locks are held, and the only details which are looked at are those
   * relating to the locking protocol. Once locking is up and working,
   * the sb is read again under the lock to establish the location of
   * the master directory (contains pointers to journals etc) and the
   * root directory.
   *
   * Returns: 0 on success or error
   */
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
213
  static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
214
215
216
217
218
219
220
221
  {
  	struct super_block *sb = sdp->sd_vfs;
  	struct gfs2_sb *p;
  	struct page *page;
  	struct bio *bio;
  
  	page = alloc_page(GFP_NOFS);
  	if (unlikely(!page))
ac3beb6a5   Steven Whitehouse   GFS2: Don't use E...
222
  		return -ENOMEM;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
223
224
225
226
227
228
  
  	ClearPageUptodate(page);
  	ClearPageDirty(page);
  	lock_page(page);
  
  	bio = bio_alloc(GFP_NOFS, 1);
4f024f379   Kent Overstreet   block: Abstract o...
229
  	bio->bi_iter.bi_sector = sector * (sb->s_blocksize >> 9);
74d46992e   Christoph Hellwig   block: replace bi...
230
  	bio_set_dev(bio, sb->s_bdev);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
231
232
233
234
  	bio_add_page(bio, page, PAGE_SIZE, 0);
  
  	bio->bi_end_io = end_bio_io_page;
  	bio->bi_private = page;
70fd76140   Christoph Hellwig   block,fs: use REQ...
235
  	bio_set_op_attrs(bio, REQ_OP_READ, REQ_META);
4e49ea4a3   Mike Christie   block/fs/drivers:...
236
  	submit_bio(bio);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
237
238
239
240
241
242
243
  	wait_on_page_locked(page);
  	bio_put(bio);
  	if (!PageUptodate(page)) {
  		__free_page(page);
  		return -EIO;
  	}
  	p = kmap(page);
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
244
  	gfs2_sb_in(sdp, p);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
245
246
  	kunmap(page);
  	__free_page(page);
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
247
  	return gfs2_check_sb(sdp, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
248
  }
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
249

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
250
251
252
  /**
   * gfs2_read_sb - Read super block
   * @sdp: The GFS2 superblock
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
253
254
255
   * @silent: Don't print message if mount fails
   *
   */
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
256
  static int gfs2_read_sb(struct gfs2_sbd *sdp, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
257
258
259
260
261
  {
  	u32 hash_blocks, ind_blocks, leaf_blocks;
  	u32 tmp_blocks;
  	unsigned int x;
  	int error;
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
262
  	error = gfs2_read_super(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
263
264
265
266
267
268
  	if (error) {
  		if (!silent)
  			fs_err(sdp, "can't read superblock
  ");
  		return error;
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
269
270
  	sdp->sd_fsb2bb_shift = sdp->sd_sb.sb_bsize_shift -
  			       GFS2_BASIC_BLOCK_SHIFT;
47a9a5279   Fabian Frederick   GFS2: use BIT() m...
271
  	sdp->sd_fsb2bb = BIT(sdp->sd_fsb2bb_shift);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
272
273
274
275
276
277
278
279
280
281
282
  	sdp->sd_diptrs = (sdp->sd_sb.sb_bsize -
  			  sizeof(struct gfs2_dinode)) / sizeof(u64);
  	sdp->sd_inptrs = (sdp->sd_sb.sb_bsize -
  			  sizeof(struct gfs2_meta_header)) / sizeof(u64);
  	sdp->sd_jbsize = sdp->sd_sb.sb_bsize - sizeof(struct gfs2_meta_header);
  	sdp->sd_hash_bsize = sdp->sd_sb.sb_bsize / 2;
  	sdp->sd_hash_bsize_shift = sdp->sd_sb.sb_bsize_shift - 1;
  	sdp->sd_hash_ptrs = sdp->sd_hash_bsize / sizeof(u64);
  	sdp->sd_qc_per_block = (sdp->sd_sb.sb_bsize -
  				sizeof(struct gfs2_meta_header)) /
  			        sizeof(struct gfs2_quota_change);
a68a0a352   Bob Peterson   GFS2: Speed up gf...
283
284
285
  	sdp->sd_blocks_per_bitmap = (sdp->sd_sb.sb_bsize -
  				     sizeof(struct gfs2_meta_header))
  		* GFS2_NBBY; /* not the rgrp bitmap, subsequent bitmaps only */
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
286
287
  
  	/* Compute maximum reservation required to add a entry to a directory */
47a9a5279   Fabian Frederick   GFS2: use BIT() m...
288
  	hash_blocks = DIV_ROUND_UP(sizeof(u64) * BIT(GFS2_DIR_MAX_DEPTH),
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
  			     sdp->sd_jbsize);
  
  	ind_blocks = 0;
  	for (tmp_blocks = hash_blocks; tmp_blocks > sdp->sd_diptrs;) {
  		tmp_blocks = DIV_ROUND_UP(tmp_blocks, sdp->sd_inptrs);
  		ind_blocks += tmp_blocks;
  	}
  
  	leaf_blocks = 2 + GFS2_DIR_MAX_DEPTH;
  
  	sdp->sd_max_dirres = hash_blocks + ind_blocks + leaf_blocks;
  
  	sdp->sd_heightsize[0] = sdp->sd_sb.sb_bsize -
  				sizeof(struct gfs2_dinode);
  	sdp->sd_heightsize[1] = sdp->sd_sb.sb_bsize * sdp->sd_diptrs;
  	for (x = 2;; x++) {
  		u64 space, d;
  		u32 m;
  
  		space = sdp->sd_heightsize[x - 1] * sdp->sd_inptrs;
  		d = space;
  		m = do_div(d, sdp->sd_inptrs);
  
  		if (d != sdp->sd_heightsize[x - 1] || m)
  			break;
  		sdp->sd_heightsize[x] = space;
  	}
  	sdp->sd_max_height = x;
  	sdp->sd_heightsize[x] = ~0;
  	gfs2_assert(sdp, sdp->sd_max_height <= GFS2_MAX_META_HEIGHT);
  
  	sdp->sd_jheightsize[0] = sdp->sd_sb.sb_bsize -
  				 sizeof(struct gfs2_dinode);
  	sdp->sd_jheightsize[1] = sdp->sd_jbsize * sdp->sd_diptrs;
  	for (x = 2;; x++) {
  		u64 space, d;
  		u32 m;
  
  		space = sdp->sd_jheightsize[x - 1] * sdp->sd_inptrs;
  		d = space;
  		m = do_div(d, sdp->sd_inptrs);
  
  		if (d != sdp->sd_jheightsize[x - 1] || m)
  			break;
  		sdp->sd_jheightsize[x] = space;
  	}
  	sdp->sd_max_jheight = x;
  	sdp->sd_jheightsize[x] = ~0;
  	gfs2_assert(sdp, sdp->sd_max_jheight <= GFS2_MAX_META_HEIGHT);
471f3db27   Benjamin Marzinski   gfs2: change gfs2...
338
339
340
  	sdp->sd_max_dents_per_leaf = (sdp->sd_sb.sb_bsize -
  				      sizeof(struct gfs2_leaf)) /
  				     GFS2_MIN_DIRENT_SIZE;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
341
342
  	return 0;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
343
344
  static int init_names(struct gfs2_sbd *sdp, int silent)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
345
346
347
348
349
350
351
352
353
  	char *proto, *table;
  	int error = 0;
  
  	proto = sdp->sd_args.ar_lockproto;
  	table = sdp->sd_args.ar_locktable;
  
  	/*  Try to autodetect  */
  
  	if (!proto[0] || !table[0]) {
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
354
  		error = gfs2_read_super(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift, silent);
bb8d8a6f5   Steven Whitehouse   [GFS2] Fix sign p...
355
356
  		if (error)
  			return error;
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
357

b3b94faa5   David Teigland   [GFS2] The core o...
358
  		if (!proto[0])
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
359
  			proto = sdp->sd_sb.sb_lockproto;
b3b94faa5   David Teigland   [GFS2] The core o...
360
  		if (!table[0])
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
361
  			table = sdp->sd_sb.sb_locktable;
b3b94faa5   David Teigland   [GFS2] The core o...
362
363
364
365
  	}
  
  	if (!table[0])
  		table = sdp->sd_vfs->s_id;
00377d8e3   Jean Delvare   [GFS2] Prefer str...
366
367
  	strlcpy(sdp->sd_proto_name, proto, GFS2_FSNAME_LEN);
  	strlcpy(sdp->sd_table_name, table, GFS2_FSNAME_LEN);
b3b94faa5   David Teigland   [GFS2] The core o...
368

5d35e31f4   Denis Cheng   [GFS2] better cod...
369
370
  	table = sdp->sd_table_name;
  	while ((table = strchr(table, '/')))
b35997d44   Robert Peterson   [GFS2] Can't moun...
371
  		*table = '_';
b3b94faa5   David Teigland   [GFS2] The core o...
372
373
374
375
376
377
  	return error;
  }
  
  static int init_locking(struct gfs2_sbd *sdp, struct gfs2_holder *mount_gh,
  			int undo)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
378
379
380
381
  	int error = 0;
  
  	if (undo)
  		goto fail_trans;
b3b94faa5   David Teigland   [GFS2] The core o...
382
383
384
385
386
387
388
389
390
391
392
393
394
  	error = gfs2_glock_nq_num(sdp,
  				  GFS2_MOUNT_LOCK, &gfs2_nondisk_glops,
  				  LM_ST_EXCLUSIVE, LM_FLAG_NOEXP | GL_NOCACHE,
  				  mount_gh);
  	if (error) {
  		fs_err(sdp, "can't acquire mount glock: %d
  ", error);
  		goto fail;
  	}
  
  	error = gfs2_glock_nq_num(sdp,
  				  GFS2_LIVE_LOCK, &gfs2_nondisk_glops,
  				  LM_ST_SHARED,
579b78a43   Steven Whitehouse   [GFS2] Remove GL_...
395
  				  LM_FLAG_NOEXP | GL_EXACT,
b3b94faa5   David Teigland   [GFS2] The core o...
396
397
398
399
400
401
402
403
404
405
406
407
408
409
  				  &sdp->sd_live_gh);
  	if (error) {
  		fs_err(sdp, "can't acquire live glock: %d
  ", error);
  		goto fail_mount;
  	}
  
  	error = gfs2_glock_get(sdp, GFS2_RENAME_LOCK, &gfs2_nondisk_glops,
  			       CREATE, &sdp->sd_rename_gl);
  	if (error) {
  		fs_err(sdp, "can't create rename glock: %d
  ", error);
  		goto fail_live;
  	}
24972557b   Benjamin Marzinski   GFS2: remove tran...
410
411
  	error = gfs2_glock_get(sdp, GFS2_FREEZE_LOCK, &gfs2_freeze_glops,
  			       CREATE, &sdp->sd_freeze_gl);
b3b94faa5   David Teigland   [GFS2] The core o...
412
413
414
415
416
  	if (error) {
  		fs_err(sdp, "can't create transaction glock: %d
  ", error);
  		goto fail_rename;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
417
418
  
  	return 0;
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
419
  fail_trans:
24972557b   Benjamin Marzinski   GFS2: remove tran...
420
  	gfs2_glock_put(sdp->sd_freeze_gl);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
421
  fail_rename:
b3b94faa5   David Teigland   [GFS2] The core o...
422
  	gfs2_glock_put(sdp->sd_rename_gl);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
423
  fail_live:
b3b94faa5   David Teigland   [GFS2] The core o...
424
  	gfs2_glock_dq_uninit(&sdp->sd_live_gh);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
425
  fail_mount:
b3b94faa5   David Teigland   [GFS2] The core o...
426
  	gfs2_glock_dq_uninit(mount_gh);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
427
  fail:
b3b94faa5   David Teigland   [GFS2] The core o...
428
429
  	return error;
  }
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
430
431
  static int gfs2_lookup_root(struct super_block *sb, struct dentry **dptr,
  			    u64 no_addr, const char *name)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
432
  {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
433
434
435
  	struct gfs2_sbd *sdp = sb->s_fs_info;
  	struct dentry *dentry;
  	struct inode *inode;
3ce37b2cb   Andreas Gruenbacher   gfs2: Fix gfs2_lo...
436
437
  	inode = gfs2_inode_lookup(sb, DT_DIR, no_addr, 0,
  				  GFS2_BLKST_FREE /* ignore */);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
438
439
440
441
442
  	if (IS_ERR(inode)) {
  		fs_err(sdp, "can't read in %s inode: %ld
  ", name, PTR_ERR(inode));
  		return PTR_ERR(inode);
  	}
48fde701a   Al Viro   switch open-coded...
443
  	dentry = d_make_root(inode);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
444
445
446
  	if (!dentry) {
  		fs_err(sdp, "can't alloc %s dentry
  ", name);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
447
448
  		return -ENOMEM;
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
449
450
  	*dptr = dentry;
  	return 0;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
451
  }
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
452
  static int init_sb(struct gfs2_sbd *sdp, int silent)
b3b94faa5   David Teigland   [GFS2] The core o...
453
454
455
  {
  	struct super_block *sb = sdp->sd_vfs;
  	struct gfs2_holder sb_gh;
dbb7cae2a   Steven Whitehouse   [GFS2] Clean up i...
456
  	u64 no_addr;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
457
  	int ret;
b3b94faa5   David Teigland   [GFS2] The core o...
458

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
459
460
461
462
463
464
  	ret = gfs2_glock_nq_num(sdp, GFS2_SB_LOCK, &gfs2_meta_glops,
  				LM_ST_SHARED, 0, &sb_gh);
  	if (ret) {
  		fs_err(sdp, "can't acquire superblock glock: %d
  ", ret);
  		return ret;
b3b94faa5   David Teigland   [GFS2] The core o...
465
  	}
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
466

6bac243f0   Steven Whitehouse   GFS2: Clean up of...
467
  	ret = gfs2_read_sb(sdp, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
468
469
470
  	if (ret) {
  		fs_err(sdp, "can't read superblock: %d
  ", ret);
b3b94faa5   David Teigland   [GFS2] The core o...
471
472
473
474
  		goto out;
  	}
  
  	/* Set up the buffer cache and SB for real */
e1defc4ff   Martin K. Petersen   block: Do away wi...
475
  	if (sdp->sd_sb.sb_bsize < bdev_logical_block_size(sb->s_bdev)) {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
476
  		ret = -EINVAL;
b3b94faa5   David Teigland   [GFS2] The core o...
477
478
479
  		fs_err(sdp, "FS block size (%u) is too small for device "
  		       "block size (%u)
  ",
e1defc4ff   Martin K. Petersen   block: Do away wi...
480
  		       sdp->sd_sb.sb_bsize, bdev_logical_block_size(sb->s_bdev));
b3b94faa5   David Teigland   [GFS2] The core o...
481
482
483
  		goto out;
  	}
  	if (sdp->sd_sb.sb_bsize > PAGE_SIZE) {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
484
  		ret = -EINVAL;
b3b94faa5   David Teigland   [GFS2] The core o...
485
486
487
488
489
490
  		fs_err(sdp, "FS block size (%u) is too big for machine "
  		       "page size (%u)
  ",
  		       sdp->sd_sb.sb_bsize, (unsigned int)PAGE_SIZE);
  		goto out;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
491
  	sb_set_blocksize(sb, sdp->sd_sb.sb_bsize);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
492
  	/* Get the root inode */
dbb7cae2a   Steven Whitehouse   [GFS2] Clean up i...
493
  	no_addr = sdp->sd_sb.sb_root_dir.no_addr;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
494
495
  	ret = gfs2_lookup_root(sb, &sdp->sd_root_dir, no_addr, "root");
  	if (ret)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
496
  		goto out;
b3b94faa5   David Teigland   [GFS2] The core o...
497

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
498
499
500
501
502
503
504
505
  	/* Get the master inode */
  	no_addr = sdp->sd_sb.sb_master_dir.no_addr;
  	ret = gfs2_lookup_root(sb, &sdp->sd_master_dir, no_addr, "master");
  	if (ret) {
  		dput(sdp->sd_root_dir);
  		goto out;
  	}
  	sb->s_root = dget(sdp->sd_args.ar_meta ? sdp->sd_master_dir : sdp->sd_root_dir);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
506
  out:
b3b94faa5   David Teigland   [GFS2] The core o...
507
  	gfs2_glock_dq_uninit(&sb_gh);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
508
  	return ret;
b3b94faa5   David Teigland   [GFS2] The core o...
509
  }
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
510
  static void gfs2_others_may_mount(struct gfs2_sbd *sdp)
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
511
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
512
513
  	char *message = "FIRSTMOUNT=Done";
  	char *envp[] = { message, NULL };
e0c2a9aa1   David Teigland   GFS2: dlm based r...
514
515
516
517
518
519
  
  	fs_info(sdp, "first mount done, others may mount
  ");
  
  	if (sdp->sd_lockstruct.ls_ops->lm_first_done)
  		sdp->sd_lockstruct.ls_ops->lm_first_done(sdp);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
520
  	kobject_uevent_env(&sdp->sd_kobj, KOBJ_CHANGE, envp);
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
521
  }
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
  /**
   * gfs2_jindex_hold - Grab a lock on the jindex
   * @sdp: The GFS2 superblock
   * @ji_gh: the holder for the jindex glock
   *
   * Returns: errno
   */
  
  static int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh)
  {
  	struct gfs2_inode *dip = GFS2_I(sdp->sd_jindex);
  	struct qstr name;
  	char buf[20];
  	struct gfs2_jdesc *jd;
  	int error;
  
  	name.name = buf;
  
  	mutex_lock(&sdp->sd_jindex_mutex);
  
  	for (;;) {
  		error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, ji_gh);
  		if (error)
  			break;
  
  		name.len = sprintf(buf, "journal%u", sdp->sd_journals);
  		name.hash = gfs2_disk_hash(name.name, name.len);
  
  		error = gfs2_dir_check(sdp->sd_jindex, &name, NULL);
  		if (error == -ENOENT) {
  			error = 0;
  			break;
  		}
  
  		gfs2_glock_dq_uninit(ji_gh);
  
  		if (error)
  			break;
  
  		error = -ENOMEM;
  		jd = kzalloc(sizeof(struct gfs2_jdesc), GFP_KERNEL);
  		if (!jd)
  			break;
  
  		INIT_LIST_HEAD(&jd->extent_list);
a17d758b6   Bob Peterson   GFS2: Move recove...
567
  		INIT_LIST_HEAD(&jd->jd_revoke_list);
6ecd7c2dd   Tejun Heo   gfs2: use workque...
568
  		INIT_WORK(&jd->jd_work, gfs2_recover_func);
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
  		jd->jd_inode = gfs2_lookupi(sdp->sd_jindex, &name, 1);
  		if (!jd->jd_inode || IS_ERR(jd->jd_inode)) {
  			if (!jd->jd_inode)
  				error = -ENOENT;
  			else
  				error = PTR_ERR(jd->jd_inode);
  			kfree(jd);
  			break;
  		}
  
  		spin_lock(&sdp->sd_jindex_spin);
  		jd->jd_jid = sdp->sd_journals++;
  		list_add_tail(&jd->jd_list, &sdp->sd_jindex_list);
  		spin_unlock(&sdp->sd_jindex_spin);
  	}
  
  	mutex_unlock(&sdp->sd_jindex_mutex);
  
  	return error;
  }
1d12d175e   Bob Peterson   GFS2: Don't flag ...
589
590
591
592
593
594
595
596
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
  /**
   * check_journal_clean - Make sure a journal is clean for a spectator mount
   * @sdp: The GFS2 superblock
   * @jd: The journal descriptor
   *
   * Returns: 0 if the journal is clean or locked, else an error
   */
  static int check_journal_clean(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd)
  {
  	int error;
  	struct gfs2_holder j_gh;
  	struct gfs2_log_header_host head;
  	struct gfs2_inode *ip;
  
  	ip = GFS2_I(jd->jd_inode);
  	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_NOEXP |
  				   GL_EXACT | GL_NOCACHE, &j_gh);
  	if (error) {
  		fs_err(sdp, "Error locking journal for spectator mount.
  ");
  		return -EPERM;
  	}
  	error = gfs2_jdesc_check(jd);
  	if (error) {
  		fs_err(sdp, "Error checking journal for spectator mount.
  ");
  		goto out_unlock;
  	}
  	error = gfs2_find_jhead(jd, &head);
  	if (error) {
  		fs_err(sdp, "Error parsing journal for spectator mount.
  ");
  		goto out_unlock;
  	}
  	if (!(head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)) {
  		error = -EPERM;
  		fs_err(sdp, "jid=%u: Journal is dirty, so the first mounter "
  		       "must not be a spectator.
  ", jd->jd_jid);
  	}
  
  out_unlock:
  	gfs2_glock_dq_uninit(&j_gh);
  	return error;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
634
635
  static int init_journal(struct gfs2_sbd *sdp, int undo)
  {
2b0143b5c   David Howells   VFS: normal files...
636
  	struct inode *master = d_inode(sdp->sd_master_dir);
b3b94faa5   David Teigland   [GFS2] The core o...
637
  	struct gfs2_holder ji_gh;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
638
  	struct gfs2_inode *ip;
b3b94faa5   David Teigland   [GFS2] The core o...
639
640
641
642
643
  	int jindex = 1;
  	int error = 0;
  
  	if (undo) {
  		jindex = 0;
fe64d517d   Steven Whitehouse   GFS2: Umount reco...
644
  		goto fail_jinode_gh;
b3b94faa5   David Teigland   [GFS2] The core o...
645
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
646
  	sdp->sd_jindex = gfs2_lookup_simple(master, "jindex");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
647
  	if (IS_ERR(sdp->sd_jindex)) {
b3b94faa5   David Teigland   [GFS2] The core o...
648
649
  		fs_err(sdp, "can't lookup journal index: %d
  ", error);
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
650
  		return PTR_ERR(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
651
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
652
653
654
655
656
657
658
659
660
  
  	/* Load in the journal index special file */
  
  	error = gfs2_jindex_hold(sdp, &ji_gh);
  	if (error) {
  		fs_err(sdp, "can't read journal index: %d
  ", error);
  		goto fail;
  	}
0e5a9fb04   Abhijith Das   GFS2: Fix error code
661
  	error = -EUSERS;
b3b94faa5   David Teigland   [GFS2] The core o...
662
663
664
  	if (!gfs2_jindex_size(sdp)) {
  		fs_err(sdp, "no journals!
  ");
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
665
  		goto fail_jindex;
b3b94faa5   David Teigland   [GFS2] The core o...
666
  	}
f07b35202   Bob Peterson   GFS2: Made logd d...
667
  	atomic_set(&sdp->sd_log_blks_needed, 0);
b3b94faa5   David Teigland   [GFS2] The core o...
668
669
  	if (sdp->sd_args.ar_spectator) {
  		sdp->sd_jdesc = gfs2_jdesc_find(sdp, 0);
fd041f0b4   Steven Whitehouse   [GFS2] Use atomic...
670
  		atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
671
672
  		atomic_set(&sdp->sd_log_thresh1, 2*sdp->sd_jdesc->jd_blocks/5);
  		atomic_set(&sdp->sd_log_thresh2, 4*sdp->sd_jdesc->jd_blocks/5);
b3b94faa5   David Teigland   [GFS2] The core o...
673
674
675
676
677
678
679
680
681
682
683
684
  	} else {
  		if (sdp->sd_lockstruct.ls_jid >= gfs2_jindex_size(sdp)) {
  			fs_err(sdp, "can't mount journal #%u
  ",
  			       sdp->sd_lockstruct.ls_jid);
  			fs_err(sdp, "there are only %u journals (0 - %u)
  ",
  			       gfs2_jindex_size(sdp),
  			       gfs2_jindex_size(sdp) - 1);
  			goto fail_jindex;
  		}
  		sdp->sd_jdesc = gfs2_jdesc_find(sdp, sdp->sd_lockstruct.ls_jid);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
685
  		error = gfs2_glock_nq_num(sdp, sdp->sd_lockstruct.ls_jid,
b3b94faa5   David Teigland   [GFS2] The core o...
686
687
688
689
690
691
692
693
  					  &gfs2_journal_glops,
  					  LM_ST_EXCLUSIVE, LM_FLAG_NOEXP,
  					  &sdp->sd_journal_gh);
  		if (error) {
  			fs_err(sdp, "can't acquire journal glock: %d
  ", error);
  			goto fail_jindex;
  		}
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
694
695
  		ip = GFS2_I(sdp->sd_jdesc->jd_inode);
  		error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED,
75be73a82   Bob Peterson   [GFS2] Ensure jou...
696
  					   LM_FLAG_NOEXP | GL_EXACT | GL_NOCACHE,
b3b94faa5   David Teigland   [GFS2] The core o...
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
  					   &sdp->sd_jinode_gh);
  		if (error) {
  			fs_err(sdp, "can't acquire journal inode glock: %d
  ",
  			       error);
  			goto fail_journal_gh;
  		}
  
  		error = gfs2_jdesc_check(sdp->sd_jdesc);
  		if (error) {
  			fs_err(sdp, "my journal (%u) is bad: %d
  ",
  			       sdp->sd_jdesc->jd_jid, error);
  			goto fail_jinode_gh;
  		}
fd041f0b4   Steven Whitehouse   [GFS2] Use atomic...
712
  		atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
713
714
  		atomic_set(&sdp->sd_log_thresh1, 2*sdp->sd_jdesc->jd_blocks/5);
  		atomic_set(&sdp->sd_log_thresh2, 4*sdp->sd_jdesc->jd_blocks/5);
da6dd40d5   Bob Peterson   [GFS2] Journal ex...
715
716
  
  		/* Map the extents for this journal's blocks */
b50f227bd   Steven Whitehouse   GFS2: Clean up jo...
717
  		gfs2_map_journal_extents(sdp, sdp->sd_jdesc);
b3b94faa5   David Teigland   [GFS2] The core o...
718
  	}
63997775b   Steven Whitehouse   GFS2: Add tracepo...
719
  	trace_gfs2_log_blocks(sdp, atomic_read(&sdp->sd_log_blks_free));
b3b94faa5   David Teigland   [GFS2] The core o...
720
721
722
723
  
  	if (sdp->sd_lockstruct.ls_first) {
  		unsigned int x;
  		for (x = 0; x < sdp->sd_journals; x++) {
1d12d175e   Bob Peterson   GFS2: Don't flag ...
724
725
726
727
728
729
730
731
732
  			struct gfs2_jdesc *jd = gfs2_jdesc_find(sdp, x);
  
  			if (sdp->sd_args.ar_spectator) {
  				error = check_journal_clean(sdp, jd);
  				if (error)
  					goto fail_jinode_gh;
  				continue;
  			}
  			error = gfs2_recover_journal(jd, true);
b3b94faa5   David Teigland   [GFS2] The core o...
733
734
735
736
737
738
739
  			if (error) {
  				fs_err(sdp, "error recovering journal %u: %d
  ",
  				       x, error);
  				goto fail_jinode_gh;
  			}
  		}
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
740
  		gfs2_others_may_mount(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
741
  	} else if (!sdp->sd_args.ar_spectator) {
6ecd7c2dd   Tejun Heo   gfs2: use workque...
742
  		error = gfs2_recover_journal(sdp->sd_jdesc, true);
b3b94faa5   David Teigland   [GFS2] The core o...
743
744
745
746
747
748
  		if (error) {
  			fs_err(sdp, "error recovering my journal: %d
  ", error);
  			goto fail_jinode_gh;
  		}
  	}
086cc672e   Benjamin Marzinski   GFS2: mark the jo...
749
  	sdp->sd_log_idle = 1;
b3b94faa5   David Teigland   [GFS2] The core o...
750
751
752
  	set_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags);
  	gfs2_glock_dq_uninit(&ji_gh);
  	jindex = 0;
2e60d7683   Benjamin Marzinski   GFS2: update free...
753
  	INIT_WORK(&sdp->sd_freeze_work, gfs2_freeze_func);
b3b94faa5   David Teigland   [GFS2] The core o...
754
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
755
  fail_jinode_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
756
757
  	if (!sdp->sd_args.ar_spectator)
  		gfs2_glock_dq_uninit(&sdp->sd_jinode_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
758
  fail_journal_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
759
760
  	if (!sdp->sd_args.ar_spectator)
  		gfs2_glock_dq_uninit(&sdp->sd_journal_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
761
  fail_jindex:
b3b94faa5   David Teigland   [GFS2] The core o...
762
763
764
  	gfs2_jindex_free(sdp);
  	if (jindex)
  		gfs2_glock_dq_uninit(&ji_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
765
  fail:
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
766
  	iput(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
767
768
  	return error;
  }
56aa72d0f   Jan Kara   GFS2: Get rid of ...
769
  static struct lock_class_key gfs2_quota_imutex_key;
b3b94faa5   David Teigland   [GFS2] The core o...
770
771
772
  
  static int init_inodes(struct gfs2_sbd *sdp, int undo)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
773
  	int error = 0;
2b0143b5c   David Howells   VFS: normal files...
774
  	struct inode *master = d_inode(sdp->sd_master_dir);
b3b94faa5   David Teigland   [GFS2] The core o...
775
776
  
  	if (undo)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
777
  		goto fail_qinode;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
778
  	error = init_journal(sdp, undo);
0e48e055a   Bob Peterson   GFS2: Prevent rec...
779
  	complete_all(&sdp->sd_journal_ready);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
780
  	if (error)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
781
  		goto fail;
b3b94faa5   David Teigland   [GFS2] The core o...
782

b3b94faa5   David Teigland   [GFS2] The core o...
783
  	/* Read in the master statfs inode */
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
784
  	sdp->sd_statfs_inode = gfs2_lookup_simple(master, "statfs");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
785
786
  	if (IS_ERR(sdp->sd_statfs_inode)) {
  		error = PTR_ERR(sdp->sd_statfs_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
787
788
  		fs_err(sdp, "can't read in statfs inode: %d
  ", error);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
789
  		goto fail_journal;
b3b94faa5   David Teigland   [GFS2] The core o...
790
791
792
  	}
  
  	/* Read in the resource index inode */
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
793
  	sdp->sd_rindex = gfs2_lookup_simple(master, "rindex");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
794
795
  	if (IS_ERR(sdp->sd_rindex)) {
  		error = PTR_ERR(sdp->sd_rindex);
b3b94faa5   David Teigland   [GFS2] The core o...
796
797
798
799
  		fs_err(sdp, "can't get resource index inode: %d
  ", error);
  		goto fail_statfs;
  	}
cf45b752c   Bob Peterson   [GFS2] Remove rgr...
800
  	sdp->sd_rindex_uptodate = 0;
b3b94faa5   David Teigland   [GFS2] The core o...
801
802
  
  	/* Read in the quota inode */
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
803
  	sdp->sd_quota_inode = gfs2_lookup_simple(master, "quota");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
804
805
  	if (IS_ERR(sdp->sd_quota_inode)) {
  		error = PTR_ERR(sdp->sd_quota_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
806
807
808
809
  		fs_err(sdp, "can't get quota file inode: %d
  ", error);
  		goto fail_rindex;
  	}
56aa72d0f   Jan Kara   GFS2: Get rid of ...
810
811
812
813
  	/*
  	 * i_mutex on quota files is special. Since this inode is hidden system
  	 * file, we are safe to define locking ourselves.
  	 */
9902af79c   Al Viro   parallel lookups:...
814
  	lockdep_set_class(&sdp->sd_quota_inode->i_rwsem,
56aa72d0f   Jan Kara   GFS2: Get rid of ...
815
  			  &gfs2_quota_imutex_key);
a365fbf35   Steven Whitehouse   GFS2: Read resour...
816
817
818
819
  
  	error = gfs2_rindex_update(sdp);
  	if (error)
  		goto fail_qinode;
b3b94faa5   David Teigland   [GFS2] The core o...
820
  	return 0;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
821
822
  fail_qinode:
  	iput(sdp->sd_quota_inode);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
823
  fail_rindex:
b3b94faa5   David Teigland   [GFS2] The core o...
824
  	gfs2_clear_rgrpd(sdp);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
825
  	iput(sdp->sd_rindex);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
826
827
  fail_statfs:
  	iput(sdp->sd_statfs_inode);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
828
829
  fail_journal:
  	init_journal(sdp, UNDO);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
830
  fail:
b3b94faa5   David Teigland   [GFS2] The core o...
831
832
833
834
835
  	return error;
  }
  
  static int init_per_node(struct gfs2_sbd *sdp, int undo)
  {
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
836
  	struct inode *pn = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
837
838
  	char buf[30];
  	int error = 0;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
839
  	struct gfs2_inode *ip;
2b0143b5c   David Howells   VFS: normal files...
840
  	struct inode *master = d_inode(sdp->sd_master_dir);
b3b94faa5   David Teigland   [GFS2] The core o...
841
842
843
844
845
846
  
  	if (sdp->sd_args.ar_spectator)
  		return 0;
  
  	if (undo)
  		goto fail_qc_gh;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
847
  	pn = gfs2_lookup_simple(master, "per_node");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
848
849
  	if (IS_ERR(pn)) {
  		error = PTR_ERR(pn);
b3b94faa5   David Teigland   [GFS2] The core o...
850
851
852
853
  		fs_err(sdp, "can't find per_node directory: %d
  ", error);
  		return error;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
854
  	sprintf(buf, "statfs_change%u", sdp->sd_jdesc->jd_jid);
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
855
856
857
  	sdp->sd_sc_inode = gfs2_lookup_simple(pn, buf);
  	if (IS_ERR(sdp->sd_sc_inode)) {
  		error = PTR_ERR(sdp->sd_sc_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
858
859
  		fs_err(sdp, "can't find local \"sc\" file: %d
  ", error);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
860
  		goto fail;
b3b94faa5   David Teigland   [GFS2] The core o...
861
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
862
  	sprintf(buf, "quota_change%u", sdp->sd_jdesc->jd_jid);
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
863
864
865
  	sdp->sd_qc_inode = gfs2_lookup_simple(pn, buf);
  	if (IS_ERR(sdp->sd_qc_inode)) {
  		error = PTR_ERR(sdp->sd_qc_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
866
867
868
869
  		fs_err(sdp, "can't find local \"qc\" file: %d
  ", error);
  		goto fail_ut_i;
  	}
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
870
  	iput(pn);
b3b94faa5   David Teigland   [GFS2] The core o...
871
  	pn = NULL;
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
872
  	ip = GFS2_I(sdp->sd_sc_inode);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
873
  	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0,
b3b94faa5   David Teigland   [GFS2] The core o...
874
875
876
877
  				   &sdp->sd_sc_gh);
  	if (error) {
  		fs_err(sdp, "can't lock local \"sc\" file: %d
  ", error);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
878
  		goto fail_qc_i;
b3b94faa5   David Teigland   [GFS2] The core o...
879
  	}
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
880
  	ip = GFS2_I(sdp->sd_qc_inode);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
881
  	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0,
b3b94faa5   David Teigland   [GFS2] The core o...
882
883
884
885
886
887
888
889
  				   &sdp->sd_qc_gh);
  	if (error) {
  		fs_err(sdp, "can't lock local \"qc\" file: %d
  ", error);
  		goto fail_ut_gh;
  	}
  
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
890
  fail_qc_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
891
  	gfs2_glock_dq_uninit(&sdp->sd_qc_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
892
  fail_ut_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
893
  	gfs2_glock_dq_uninit(&sdp->sd_sc_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
894
  fail_qc_i:
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
895
  	iput(sdp->sd_qc_inode);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
896
  fail_ut_i:
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
897
  	iput(sdp->sd_sc_inode);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
898
  fail:
6fde22426   Markus Elfring   GFS2: Delete an u...
899
  	iput(pn);
b3b94faa5   David Teigland   [GFS2] The core o...
900
901
  	return error;
  }
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
902
903
904
905
906
907
908
909
  static const match_table_t nolock_tokens = {
  	{ Opt_jid, "jid=%d
  ", },
  	{ Opt_err, NULL },
  };
  
  static const struct lm_lockops nolock_ops = {
  	.lm_proto_name = "lock_nolock",
fc0e38dae   Steven Whitehouse   GFS2: Fix glock d...
910
  	.lm_put_lock = gfs2_glock_free,
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
911
912
  	.lm_tokens = &nolock_tokens,
  };
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
913
914
915
  /**
   * gfs2_lm_mount - mount a locking protocol
   * @sdp: the filesystem
3ad2f3fbb   Daniel Mack   tree-wide: Assort...
916
   * @args: mount arguments
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
917
918
919
920
921
922
923
   * @silent: if 1, don't complain if the FS isn't a GFS2 fs
   *
   * Returns: errno
   */
  
  static int gfs2_lm_mount(struct gfs2_sbd *sdp, int silent)
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
924
925
926
927
928
  	const struct lm_lockops *lm;
  	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
  	struct gfs2_args *args = &sdp->sd_args;
  	const char *proto = sdp->sd_proto_name;
  	const char *table = sdp->sd_table_name;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
929
930
  	char *o, *options;
  	int ret;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
931

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
932
933
934
  	if (!strcmp("lock_nolock", proto)) {
  		lm = &nolock_ops;
  		sdp->sd_args.ar_localflocks = 1;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
935
936
937
938
939
  #ifdef CONFIG_GFS2_FS_LOCKING_DLM
  	} else if (!strcmp("lock_dlm", proto)) {
  		lm = &gfs2_dlm_ops;
  #endif
  	} else {
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
940
941
  		pr_info("can't find protocol %s
  ", proto);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
942
943
  		return -ENOENT;
  	}
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
944
945
946
  
  	fs_info(sdp, "Trying to join cluster \"%s\", \"%s\"
  ", proto, table);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
947
948
  	ls->ls_ops = lm;
  	ls->ls_first = 1;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
949

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
950
951
952
953
954
955
956
957
958
959
960
961
962
  	for (options = args->ar_hostdata; (o = strsep(&options, ":")); ) {
  		substring_t tmp[MAX_OPT_ARGS];
  		int token, option;
  
  		if (!o || !*o)
  			continue;
  
  		token = match_token(o, *lm->lm_tokens, tmp);
  		switch (token) {
  		case Opt_jid:
  			ret = match_int(&tmp[0], &option);
  			if (ret || option < 0) 
  				goto hostdata_error;
ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
963
964
  			if (test_and_clear_bit(SDF_NOJOURNALID, &sdp->sd_flags))
  				ls->ls_jid = option;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
965
966
  			break;
  		case Opt_id:
4875647a0   David Teigland   dlm: fixes for no...
967
  		case Opt_nodir:
2b88f7c53   Steven Whitehouse   GFS2: Remove unus...
968
  			/* Obsolete, but left for backward compat purposes */
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
969
970
971
972
973
974
975
  			break;
  		case Opt_first:
  			ret = match_int(&tmp[0], &option);
  			if (ret || (option != 0 && option != 1))
  				goto hostdata_error;
  			ls->ls_first = option;
  			break;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
976
977
978
979
980
981
982
  		case Opt_err:
  		default:
  hostdata_error:
  			fs_info(sdp, "unknown hostdata (%s)
  ", o);
  			return -EINVAL;
  		}
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
983
  	}
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
984
985
986
  	if (lm->lm_mount == NULL) {
  		fs_info(sdp, "Now mounting FS...
  ");
192370399   Steven Whitehouse   GFS2: Fix mount h...
987
  		complete_all(&sdp->sd_locking_init);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
988
  		return 0;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
989
  	}
e0c2a9aa1   David Teigland   GFS2: dlm based r...
990
  	ret = lm->lm_mount(sdp, table);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
991
992
993
  	if (ret == 0)
  		fs_info(sdp, "Joined cluster. Now mounting FS...
  ");
192370399   Steven Whitehouse   GFS2: Fix mount h...
994
  	complete_all(&sdp->sd_locking_init);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
995
  	return ret;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
996
997
998
999
  }
  
  void gfs2_lm_unmount(struct gfs2_sbd *sdp)
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
1000
1001
1002
1003
  	const struct lm_lockops *lm = sdp->sd_lockstruct.ls_ops;
  	if (likely(!test_bit(SDF_SHUTDOWN, &sdp->sd_flags)) &&
  	    lm->lm_unmount)
  		lm->lm_unmount(sdp);
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
1004
  }
b3b94faa5   David Teigland   [GFS2] The core o...
1005

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1006
1007
  static int wait_on_journal(struct gfs2_sbd *sdp)
  {
ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1008
1009
  	if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
  		return 0;
743162013   NeilBrown   sched: Remove pro...
1010
1011
  	return wait_on_bit(&sdp->sd_flags, SDF_NOJOURNALID, TASK_INTERRUPTIBLE)
  		? -EINTR : 0;
ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1012
  }
8633ecfab   Steven Whitehouse   GFS2: Add online ...
1013
1014
1015
1016
1017
1018
  void gfs2_online_uevent(struct gfs2_sbd *sdp)
  {
  	struct super_block *sb = sdp->sd_vfs;
  	char ro[20];
  	char spectator[20];
  	char *envp[] = { ro, spectator, NULL };
bc98a42c1   David Howells   VFS: Convert sb->...
1019
  	sprintf(ro, "RDONLY=%d", sb_rdonly(sb));
8633ecfab   Steven Whitehouse   GFS2: Add online ...
1020
1021
1022
  	sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
  	kobject_uevent_env(&sdp->sd_kobj, KOBJ_ONLINE, envp);
  }
b3b94faa5   David Teigland   [GFS2] The core o...
1023
1024
1025
1026
1027
1028
1029
1030
  /**
   * fill_super - Read in superblock
   * @sb: The VFS superblock
   * @data: Mount options
   * @silent: Don't complain if it's not a GFS2 filesystem
   *
   * Returns: errno
   */
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1031
  static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent)
b3b94faa5   David Teigland   [GFS2] The core o...
1032
1033
1034
1035
1036
1037
1038
  {
  	struct gfs2_sbd *sdp;
  	struct gfs2_holder mount_gh;
  	int error;
  
  	sdp = init_sbd(sb);
  	if (!sdp) {
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
1039
1040
  		pr_warn("can't alloc struct gfs2_sbd
  ");
b3b94faa5   David Teigland   [GFS2] The core o...
1041
1042
  		return -ENOMEM;
  	}
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1043
  	sdp->sd_args = *args;
b3b94faa5   David Teigland   [GFS2] The core o...
1044

fe64d517d   Steven Whitehouse   GFS2: Umount reco...
1045
  	if (sdp->sd_args.ar_spectator) {
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1046
                  sb->s_flags |= MS_RDONLY;
e8ca5cc57   David Teigland   GFS2: let spectat...
1047
  		set_bit(SDF_RORECOVERY, &sdp->sd_flags);
fe64d517d   Steven Whitehouse   GFS2: Umount reco...
1048
  	}
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1049
1050
  	if (sdp->sd_args.ar_posix_acl)
  		sb->s_flags |= MS_POSIXACL;
f25934c5f   Christoph Hellwig   GFS2: add barrier...
1051
1052
  	if (sdp->sd_args.ar_nobarrier)
  		set_bit(SDF_NOBARRIERS, &sdp->sd_flags);
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1053

9964afbb7   Steven Whitehouse   GFS2: Add S_NOSEC...
1054
  	sb->s_flags |= MS_NOSEC;
719ee3446   Steven Whitehouse   GFS2: high time t...
1055
1056
  	sb->s_magic = GFS2_MAGIC;
  	sb->s_op = &gfs2_super_ops;
41ced6dcf   Al Viro   switch gfs2, clos...
1057
  	sb->s_d_op = &gfs2_dops;
719ee3446   Steven Whitehouse   GFS2: high time t...
1058
  	sb->s_export_op = &gfs2_export_ops;
40b78a322   Steven Whitehouse   GFS2: Clean up of...
1059
  	sb->s_xattr = gfs2_xattr_handlers;
cc632e7f9   Steven Whitehouse   GFS2: Hook gfs2_q...
1060
  	sb->s_qcop = &gfs2_quotactl_ops;
de3b08d3e   Jan Kara   gfs2: Set allowed...
1061
  	sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
cc632e7f9   Steven Whitehouse   GFS2: Hook gfs2_q...
1062
  	sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
719ee3446   Steven Whitehouse   GFS2: high time t...
1063
1064
  	sb->s_time_gran = 1;
  	sb->s_maxbytes = MAX_LFS_FILESIZE;
419c93e0b   Steven Whitehouse   [GFS2] Add gfs2me...
1065
1066
1067
1068
1069
1070
1071
  
  	/* Set up the buffer cache and fill in some fake block size values
  	   to allow us to read-in the on-disk superblock. */
  	sdp->sd_sb.sb_bsize = sb_min_blocksize(sb, GFS2_BASIC_BLOCK);
  	sdp->sd_sb.sb_bsize_shift = sb->s_blocksize_bits;
  	sdp->sd_fsb2bb_shift = sdp->sd_sb.sb_bsize_shift -
                                 GFS2_BASIC_BLOCK_SHIFT;
47a9a5279   Fabian Frederick   GFS2: use BIT() m...
1072
  	sdp->sd_fsb2bb = BIT(sdp->sd_fsb2bb_shift);
b3b94faa5   David Teigland   [GFS2] The core o...
1073

5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
1074
  	sdp->sd_tune.gt_logd_secs = sdp->sd_args.ar_commit;
3d3c10f2c   Benjamin Marzinski   GFS2: Improve sta...
1075
1076
1077
1078
  	sdp->sd_tune.gt_quota_quantum = sdp->sd_args.ar_quota_quantum;
  	if (sdp->sd_args.ar_statfs_quantum) {
  		sdp->sd_tune.gt_statfs_slow = 0;
  		sdp->sd_tune.gt_statfs_quantum = sdp->sd_args.ar_statfs_quantum;
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
1079
  	} else {
3d3c10f2c   Benjamin Marzinski   GFS2: Improve sta...
1080
1081
1082
  		sdp->sd_tune.gt_statfs_slow = 1;
  		sdp->sd_tune.gt_statfs_quantum = 30;
  	}
48c2b6136   Steven Whitehouse   GFS2: Add commit=...
1083

b3b94faa5   David Teigland   [GFS2] The core o...
1084
  	error = init_names(sdp, silent);
0d515210b   Bob Peterson   GFS2: Add kobject...
1085
1086
1087
1088
1089
1090
1091
1092
  	if (error) {
  		/* In this case, we haven't initialized sysfs, so we have to
  		   manually free the sdp. */
  		free_percpu(sdp->sd_lkstats);
  		kfree(sdp);
  		sb->s_fs_info = NULL;
  		return error;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
1093

561b79698   Andreas Gruenbacher   gfs2: Silence gcc...
1094
  	snprintf(sdp->sd_fsname, sizeof(sdp->sd_fsname), "%s", sdp->sd_table_name);
e0c2a9aa1   David Teigland   GFS2: dlm based r...
1095

b3b94faa5   David Teigland   [GFS2] The core o...
1096
  	error = gfs2_sys_fs_add(sdp);
0d515210b   Bob Peterson   GFS2: Add kobject...
1097
1098
1099
1100
1101
1102
1103
  	/*
  	 * If we hit an error here, gfs2_sys_fs_add will have called function
  	 * kobject_put which causes the sysfs usage count to go to zero, which
  	 * causes sysfs to call function gfs2_sbd_release, which frees sdp.
  	 * Subsequent error paths here will call gfs2_sys_fs_del, which also
  	 * kobject_put to free sdp.
  	 */
b3b94faa5   David Teigland   [GFS2] The core o...
1104
  	if (error)
0d515210b   Bob Peterson   GFS2: Add kobject...
1105
1106
1107
  		return error;
  
  	gfs2_create_debugfs_file(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1108
1109
1110
  
  	error = gfs2_lm_mount(sdp, silent);
  	if (error)
0d515210b   Bob Peterson   GFS2: Add kobject...
1111
  		goto fail_debug;
b3b94faa5   David Teigland   [GFS2] The core o...
1112
1113
1114
1115
  
  	error = init_locking(sdp, &mount_gh, DO);
  	if (error)
  		goto fail_lm;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1116
  	error = init_sb(sdp, silent);
b3b94faa5   David Teigland   [GFS2] The core o...
1117
1118
  	if (error)
  		goto fail_locking;
b3b94faa5   David Teigland   [GFS2] The core o...
1119

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1120
1121
1122
  	error = wait_on_journal(sdp);
  	if (error)
  		goto fail_sb;
feb47ca93   Steven Whitehouse   GFS2: Improve jou...
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
  	/*
  	 * If user space has failed to join the cluster or some similar
  	 * failure has occurred, then the journal id will contain a
  	 * negative (error) number. This will then be returned to the
  	 * caller (of the mount syscall). We do this even for spectator
  	 * mounts (which just write a jid of 0 to indicate "ok" even though
  	 * the jid is unused in the spectator case)
  	 */
  	if (sdp->sd_lockstruct.ls_jid < 0) {
  		error = sdp->sd_lockstruct.ls_jid;
  		sdp->sd_lockstruct.ls_jid = 0;
  		goto fail_sb;
  	}
e0c2a9aa1   David Teigland   GFS2: dlm based r...
1136
  	if (sdp->sd_args.ar_spectator)
561b79698   Andreas Gruenbacher   gfs2: Silence gcc...
1137
  		snprintf(sdp->sd_fsname, sizeof(sdp->sd_fsname), "%s.s",
e0c2a9aa1   David Teigland   GFS2: dlm based r...
1138
1139
  			 sdp->sd_table_name);
  	else
561b79698   Andreas Gruenbacher   gfs2: Silence gcc...
1140
  		snprintf(sdp->sd_fsname, sizeof(sdp->sd_fsname), "%s.%u",
e0c2a9aa1   David Teigland   GFS2: dlm based r...
1141
  			 sdp->sd_table_name, sdp->sd_lockstruct.ls_jid);
b3b94faa5   David Teigland   [GFS2] The core o...
1142
1143
  	error = init_inodes(sdp, DO);
  	if (error)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
1144
  		goto fail_sb;
b3b94faa5   David Teigland   [GFS2] The core o...
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
  
  	error = init_per_node(sdp, DO);
  	if (error)
  		goto fail_inodes;
  
  	error = gfs2_statfs_init(sdp);
  	if (error) {
  		fs_err(sdp, "can't initialize statfs subsystem: %d
  ", error);
  		goto fail_per_node;
  	}
bc98a42c1   David Howells   VFS: Convert sb->...
1156
  	if (!sb_rdonly(sb)) {
b3b94faa5   David Teigland   [GFS2] The core o...
1157
1158
1159
1160
  		error = gfs2_make_fs_rw(sdp);
  		if (error) {
  			fs_err(sdp, "can't make FS RW: %d
  ", error);
8ad151c2a   Steven Whitehouse   GFS2: Only run lo...
1161
  			goto fail_per_node;
b3b94faa5   David Teigland   [GFS2] The core o...
1162
1163
1164
1165
  		}
  	}
  
  	gfs2_glock_dq_uninit(&mount_gh);
8633ecfab   Steven Whitehouse   GFS2: Add online ...
1166
  	gfs2_online_uevent(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1167
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1168
  fail_per_node:
b3b94faa5   David Teigland   [GFS2] The core o...
1169
  	init_per_node(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1170
  fail_inodes:
b3b94faa5   David Teigland   [GFS2] The core o...
1171
  	init_inodes(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1172
  fail_sb:
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1173
1174
1175
1176
  	if (sdp->sd_root_dir)
  		dput(sdp->sd_root_dir);
  	if (sdp->sd_master_dir)
  		dput(sdp->sd_master_dir);
e7c8707ea   Steven Whitehouse   GFS2: Fix error p...
1177
1178
  	if (sb->s_root)
  		dput(sb->s_root);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1179
  	sb->s_root = NULL;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1180
  fail_locking:
b3b94faa5   David Teigland   [GFS2] The core o...
1181
  	init_locking(sdp, &mount_gh, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1182
  fail_lm:
0e48e055a   Bob Peterson   GFS2: Prevent rec...
1183
  	complete_all(&sdp->sd_journal_ready);
fefc03bfe   Steven Whitehouse   Revert "GFS2: Fix...
1184
  	gfs2_gl_hash_clear(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1185
  	gfs2_lm_unmount(sdp);
0d515210b   Bob Peterson   GFS2: Add kobject...
1186
  fail_debug:
5f8820960   Robert Peterson   [GFS2] lockdump i...
1187
  	gfs2_delete_debugfs_file(sdp);
a245769f2   Steven Whitehouse   GFS2: glock stati...
1188
  	free_percpu(sdp->sd_lkstats);
0d515210b   Bob Peterson   GFS2: Add kobject...
1189
1190
1191
  	/* gfs2_sys_fs_del must be the last thing we do, since it causes
  	 * sysfs to call function gfs2_sbd_release, which frees sdp. */
  	gfs2_sys_fs_del(sdp);
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
1192
  	sb->s_fs_info = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
1193
1194
  	return error;
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1195
  static int set_gfs2_super(struct super_block *s, void *data)
b3b94faa5   David Teigland   [GFS2] The core o...
1196
  {
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1197
1198
  	s->s_bdev = data;
  	s->s_dev = s->s_bdev->bd_dev;
95fe66de9   Jan Kara   gfs2: Convert to ...
1199
  	s->s_bdi = bdi_get(s->s_bdev->bd_bdi);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1200
  	return 0;
863846054   Abhijith Das   [GFS2] Allow moun...
1201
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1202
  static int test_gfs2_super(struct super_block *s, void *ptr)
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1203
1204
1205
1206
  {
  	struct block_device *bdev = ptr;
  	return (bdev == s->s_bdev);
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1207
  /**
8bcbbf000   Al Viro   convert gfs2
1208
   * gfs2_mount - Get the GFS2 superblock
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1209
1210
1211
1212
   * @fs_type: The GFS2 filesystem type
   * @flags: Mount flags
   * @dev_name: The name of the device
   * @data: The mount arguments
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1213
1214
1215
1216
1217
1218
1219
   *
   * Q. Why not use get_sb_bdev() ?
   * A. We need to select one of two root directories to mount, independent
   *    of whether this is the initial, or subsequent, mount of this sb
   *
   * Returns: 0 or -ve on error
   */
8bcbbf000   Al Viro   convert gfs2
1220
1221
  static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags,
  		       const char *dev_name, void *data)
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1222
1223
1224
  {
  	struct block_device *bdev;
  	struct super_block *s;
d4d776299   Tejun Heo   block: clean up b...
1225
  	fmode_t mode = FMODE_READ | FMODE_EXCL;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1226
1227
1228
1229
1230
1231
  	int error;
  	struct gfs2_args args;
  	struct gfs2_sbd *sdp;
  
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
d4d776299   Tejun Heo   block: clean up b...
1232
  	bdev = blkdev_get_by_path(dev_name, mode, fs_type);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1233
  	if (IS_ERR(bdev))
8bcbbf000   Al Viro   convert gfs2
1234
  		return ERR_CAST(bdev);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
  
  	/*
  	 * once the super is inserted into the list by sget, s_umount
  	 * will protect the lockfs code from trying to start a snapshot
  	 * while we are mounting
  	 */
  	mutex_lock(&bdev->bd_fsfreeze_mutex);
  	if (bdev->bd_fsfreeze_count > 0) {
  		mutex_unlock(&bdev->bd_fsfreeze_mutex);
  		error = -EBUSY;
  		goto error_bdev;
  	}
9249e17fe   David Howells   VFS: Pass mount f...
1247
  	s = sget(fs_type, test_gfs2_super, set_gfs2_super, flags, bdev);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1248
1249
1250
1251
  	mutex_unlock(&bdev->bd_fsfreeze_mutex);
  	error = PTR_ERR(s);
  	if (IS_ERR(s))
  		goto error_bdev;
dfe5b9ad8   Steven Whitehouse   GFS2: don't hold ...
1252
1253
1254
1255
1256
1257
1258
1259
1260
  	if (s->s_root) {
  		/*
  		 * s_umount nests inside bd_mutex during
  		 * __invalidate_device().  blkdev_put() acquires
  		 * bd_mutex and can't be called under s_umount.  Drop
  		 * s_umount temporarily.  This is safe as we're
  		 * holding an active reference.
  		 */
  		up_write(&s->s_umount);
d4d776299   Tejun Heo   block: clean up b...
1261
  		blkdev_put(bdev, mode);
dfe5b9ad8   Steven Whitehouse   GFS2: don't hold ...
1262
  		down_write(&s->s_umount);
6de20eb0d   Andrew Price   GFS2: Set s_mode ...
1263
1264
1265
  	} else {
  		/* s_mode must be set before deactivate_locked_super calls */
  		s->s_mode = mode;
dfe5b9ad8   Steven Whitehouse   GFS2: don't hold ...
1266
  	}
8bcbbf000   Al Viro   convert gfs2
1267

f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1268
1269
1270
  	memset(&args, 0, sizeof(args));
  	args.ar_quota = GFS2_QUOTA_DEFAULT;
  	args.ar_data = GFS2_DATA_DEFAULT;
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
1271
  	args.ar_commit = 30;
3d3c10f2c   Benjamin Marzinski   GFS2: Improve sta...
1272
1273
  	args.ar_statfs_quantum = 30;
  	args.ar_quota_quantum = 60;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1274
1275
1276
1277
  	args.ar_errors = GFS2_ERRORS_DEFAULT;
  
  	error = gfs2_mount_args(&args, data);
  	if (error) {
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
1278
1279
  		pr_warn("can't parse mount arguments
  ");
8bcbbf000   Al Viro   convert gfs2
1280
  		goto error_super;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1281
1282
1283
1284
1285
1286
  	}
  
  	if (s->s_root) {
  		error = -EBUSY;
  		if ((flags ^ s->s_flags) & MS_RDONLY)
  			goto error_super;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1287
  	} else {
a1c6f0573   Dmitry Monakhov   fs: use block_dev...
1288
  		snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1289
1290
  		sb_set_blocksize(s, block_size(bdev));
  		error = fill_super(s, &args, flags & MS_SILENT ? 1 : 0);
8bcbbf000   Al Viro   convert gfs2
1291
1292
  		if (error)
  			goto error_super;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1293
1294
1295
1296
1297
  		s->s_flags |= MS_ACTIVE;
  		bdev->bd_super = s;
  	}
  
  	sdp = s->s_fs_info;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1298
  	if (args.ar_meta)
8bcbbf000   Al Viro   convert gfs2
1299
  		return dget(sdp->sd_master_dir);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1300
  	else
8bcbbf000   Al Viro   convert gfs2
1301
  		return dget(sdp->sd_root_dir);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1302
1303
1304
  
  error_super:
  	deactivate_locked_super(s);
8bcbbf000   Al Viro   convert gfs2
1305
  	return ERR_PTR(error);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1306
  error_bdev:
d4d776299   Tejun Heo   block: clean up b...
1307
  	blkdev_put(bdev, mode);
8bcbbf000   Al Viro   convert gfs2
1308
  	return ERR_PTR(error);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1309
  }
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1310
1311
1312
1313
  static int set_meta_super(struct super_block *s, void *ptr)
  {
  	return -EINVAL;
  }
8bcbbf000   Al Viro   convert gfs2
1314
1315
  static struct dentry *gfs2_mount_meta(struct file_system_type *fs_type,
  			int flags, const char *dev_name, void *data)
863846054   Abhijith Das   [GFS2] Allow moun...
1316
  {
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1317
  	struct super_block *s;
003dec891   Steven Whitehouse   GFS2: Merge gfs2_...
1318
  	struct gfs2_sbd *sdp;
e24977d45   Al Viro   Reduce path_looku...
1319
  	struct path path;
863846054   Abhijith Das   [GFS2] Allow moun...
1320
  	int error;
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
1321

63be2065b   Al Viro   gfs2_meta: ->moun...
1322
1323
  	if (!dev_name || !*dev_name)
  		return ERR_PTR(-EINVAL);
e24977d45   Al Viro   Reduce path_looku...
1324
  	error = kern_path(dev_name, LOOKUP_FOLLOW, &path);
863846054   Abhijith Das   [GFS2] Allow moun...
1325
  	if (error) {
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
1326
1327
1328
  		pr_warn("path_lookup on %s returned error %d
  ",
  			dev_name, error);
8bcbbf000   Al Viro   convert gfs2
1329
  		return ERR_PTR(error);
863846054   Abhijith Das   [GFS2] Allow moun...
1330
  	}
9249e17fe   David Howells   VFS: Pass mount f...
1331
  	s = sget(&gfs2_fs_type, test_gfs2_super, set_meta_super, flags,
fc64005c9   Al Viro   don't bother with...
1332
  		 path.dentry->d_sb->s_bdev);
e24977d45   Al Viro   Reduce path_looku...
1333
  	path_put(&path);
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1334
  	if (IS_ERR(s)) {
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
1335
1336
  		pr_warn("gfs2 mount does not exist
  ");
8bcbbf000   Al Viro   convert gfs2
1337
  		return ERR_CAST(s);
863846054   Abhijith Das   [GFS2] Allow moun...
1338
  	}
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1339
1340
  	if ((flags ^ s->s_flags) & MS_RDONLY) {
  		deactivate_locked_super(s);
8bcbbf000   Al Viro   convert gfs2
1341
  		return ERR_PTR(-EBUSY);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1342
  	}
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1343
  	sdp = s->s_fs_info;
8bcbbf000   Al Viro   convert gfs2
1344
  	return dget(sdp->sd_master_dir);
b3b94faa5   David Teigland   [GFS2] The core o...
1345
  }
419c93e0b   Steven Whitehouse   [GFS2] Add gfs2me...
1346
1347
  static void gfs2_kill_sb(struct super_block *sb)
  {
863846054   Abhijith Das   [GFS2] Allow moun...
1348
  	struct gfs2_sbd *sdp = sb->s_fs_info;
88a19ad06   Steven Whitehouse   GFS2: Fix use-aft...
1349
1350
1351
1352
  
  	if (sdp == NULL) {
  		kill_block_super(sb);
  		return;
3af165ac4   Steven Whitehouse   GFS2: Fix use-aft...
1353
  	}
88a19ad06   Steven Whitehouse   GFS2: Fix use-aft...
1354

24972557b   Benjamin Marzinski   GFS2: remove tran...
1355
  	gfs2_log_flush(sdp, NULL, SYNC_FLUSH);
88a19ad06   Steven Whitehouse   GFS2: Fix use-aft...
1356
1357
1358
1359
  	dput(sdp->sd_root_dir);
  	dput(sdp->sd_master_dir);
  	sdp->sd_root_dir = NULL;
  	sdp->sd_master_dir = NULL;
fefc03bfe   Steven Whitehouse   Revert "GFS2: Fix...
1360
  	shrink_dcache_sb(sb);
a245769f2   Steven Whitehouse   GFS2: glock stati...
1361
  	free_percpu(sdp->sd_lkstats);
0d515210b   Bob Peterson   GFS2: Add kobject...
1362
  	kill_block_super(sb);
863846054   Abhijith Das   [GFS2] Allow moun...
1363
  }
b3b94faa5   David Teigland   [GFS2] The core o...
1364
1365
1366
  struct file_system_type gfs2_fs_type = {
  	.name = "gfs2",
  	.fs_flags = FS_REQUIRES_DEV,
8bcbbf000   Al Viro   convert gfs2
1367
  	.mount = gfs2_mount,
419c93e0b   Steven Whitehouse   [GFS2] Add gfs2me...
1368
1369
1370
  	.kill_sb = gfs2_kill_sb,
  	.owner = THIS_MODULE,
  };
7f78e0351   Eric W. Biederman   fs: Limit sys_mou...
1371
  MODULE_ALIAS_FS("gfs2");
419c93e0b   Steven Whitehouse   [GFS2] Add gfs2me...
1372
1373
1374
1375
  
  struct file_system_type gfs2meta_fs_type = {
  	.name = "gfs2meta",
  	.fs_flags = FS_REQUIRES_DEV,
8bcbbf000   Al Viro   convert gfs2
1376
  	.mount = gfs2_mount_meta,
b3b94faa5   David Teigland   [GFS2] The core o...
1377
1378
  	.owner = THIS_MODULE,
  };
7f78e0351   Eric W. Biederman   fs: Limit sys_mou...
1379
  MODULE_ALIAS_FS("gfs2meta");