Blame view

fs/gfs2/ops_fstype.c 35.2 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>
b3b94faa5   David Teigland   [GFS2] The core o...
24
25
  
  #include "gfs2.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
26
  #include "incore.h"
da6dd40d5   Bob Peterson   [GFS2] Journal ex...
27
  #include "bmap.h"
b3b94faa5   David Teigland   [GFS2] The core o...
28
29
30
  #include "glock.h"
  #include "glops.h"
  #include "inode.h"
b3b94faa5   David Teigland   [GFS2] The core o...
31
32
33
  #include "recovery.h"
  #include "rgrp.h"
  #include "super.h"
b3b94faa5   David Teigland   [GFS2] The core o...
34
  #include "sys.h"
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
35
  #include "util.h"
bb3b0e3df   Steven Whitehouse   [GFS2] Clean up i...
36
  #include "log.h"
9ac1b4d9b   Steven Whitehouse   GFS2: Move gfs2_r...
37
  #include "quota.h"
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
38
  #include "dir.h"
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
39
  #include "meta_io.h"
63997775b   Steven Whitehouse   GFS2: Add tracepo...
40
  #include "trace_gfs2.h"
b3b94faa5   David Teigland   [GFS2] The core o...
41
42
43
  
  #define DO 0
  #define UNDO 1
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
44
45
46
47
48
49
50
51
52
  /**
   * 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 ...
53
54
55
  	gt->gt_quota_warn_period = 10;
  	gt->gt_quota_scale_num = 1;
  	gt->gt_quota_scale_den = 1;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
56
57
  	gt->gt_new_files_jdata = 0;
  	gt->gt_max_readahead = 1 << 18;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
58
  	gt->gt_complain_secs = 10;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
59
  }
b3b94faa5   David Teigland   [GFS2] The core o...
60
61
62
  static struct gfs2_sbd *init_sbd(struct super_block *sb)
  {
  	struct gfs2_sbd *sdp;
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
63
  	struct address_space *mapping;
b3b94faa5   David Teigland   [GFS2] The core o...
64

85d1da67f   Steven Whitehouse   [GFS2] Move glock...
65
  	sdp = kzalloc(sizeof(struct gfs2_sbd), GFP_KERNEL);
b3b94faa5   David Teigland   [GFS2] The core o...
66
67
  	if (!sdp)
  		return NULL;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
68
  	sb->s_fs_info = sdp;
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;
  	}
ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
75
  	set_bit(SDF_NOJOURNALID, &sdp->sd_flags);
b3b94faa5   David Teigland   [GFS2] The core o...
76
  	gfs2_tune_init(&sdp->sd_tune);
e402746a9   Steven Whitehouse   GFS2: Wait for un...
77
78
  	init_waitqueue_head(&sdp->sd_glock_wait);
  	atomic_set(&sdp->sd_glock_disposal, 0);
3942ae531   Steven Whitehouse   GFS2: Fix race du...
79
  	init_completion(&sdp->sd_locking_init);
fd95e81cb   Steven Whitehouse   GFS2: Reinstate w...
80
  	init_completion(&sdp->sd_wdack);
b3b94faa5   David Teigland   [GFS2] The core o...
81
  	spin_lock_init(&sdp->sd_statfs_spin);
b3b94faa5   David Teigland   [GFS2] The core o...
82
83
  
  	spin_lock_init(&sdp->sd_rindex_spin);
7c9ca6211   Bob Peterson   GFS2: Use rbtree ...
84
  	sdp->sd_rindex_tree.rb_node = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
85
86
87
  
  	INIT_LIST_HEAD(&sdp->sd_jindex_list);
  	spin_lock_init(&sdp->sd_jindex_spin);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
88
  	mutex_init(&sdp->sd_jindex_mutex);
0e48e055a   Bob Peterson   GFS2: Prevent rec...
89
  	init_completion(&sdp->sd_journal_ready);
b3b94faa5   David Teigland   [GFS2] The core o...
90

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

70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
99
  	mapping = &sdp->sd_aspace;
39849d694   Steven Whitehouse   GFS2: Add initial...
100
  	address_space_init_once(mapping);
1b2ad4121   Steven Whitehouse   GFS2: Fix address...
101
  	mapping->a_ops = &gfs2_rgrp_aops;
70d4ee94b   Steven Whitehouse   GFS2: Use only a ...
102
103
104
105
  	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 ...
106
  	mapping->writeback_index = 0;
b3b94faa5   David Teigland   [GFS2] The core o...
107
  	spin_lock_init(&sdp->sd_log_lock);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
108
  	atomic_set(&sdp->sd_log_pinned, 0);
b3b94faa5   David Teigland   [GFS2] The core o...
109
  	INIT_LIST_HEAD(&sdp->sd_log_le_revoke);
d7b616e25   Steven Whitehouse   [GFS2] Clean up o...
110
  	INIT_LIST_HEAD(&sdp->sd_log_le_ordered);
451389909   Steven Whitehouse   GFS2: Use ->write...
111
  	spin_lock_init(&sdp->sd_ordered_lock);
b3b94faa5   David Teigland   [GFS2] The core o...
112

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

b3b94faa5   David Teigland   [GFS2] The core o...
126
127
  	return sdp;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
128

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
129
130
131
132
133
134
135
136
137
138
  /**
   * 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...
139
  static int gfs2_check_sb(struct gfs2_sbd *sdp, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
140
  {
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
141
  	struct gfs2_sb_host *sb = &sdp->sd_sb;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
142
143
144
  	if (sb->sb_magic != GFS2_MAGIC ||
  	    sb->sb_type != GFS2_METATYPE_SB) {
  		if (!silent)
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
145
146
  			pr_warn("not a GFS2 filesystem
  ");
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
147
148
149
150
151
152
153
154
  		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...
155
156
  	fs_warn(sdp, "Unknown on-disk format, unable to mount
  ");
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
157

c80dbb58f   Steven Whitehouse   GFS2: Remove upgr...
158
  	return -EINVAL;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
159
  }
4246a0b63   Christoph Hellwig   block: add a bi_e...
160
  static void end_bio_io_page(struct bio *bio)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
161
162
  {
  	struct page *page = bio->bi_private;
4246a0b63   Christoph Hellwig   block: add a bi_e...
163
  	if (!bio->bi_error)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
164
165
  		SetPageUptodate(page);
  	else
4246a0b63   Christoph Hellwig   block: add a bi_e...
166
167
  		pr_warn("error %d reading superblock
  ", bio->bi_error);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
168
169
  	unlock_page(page);
  }
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
170
  static void gfs2_sb_in(struct gfs2_sbd *sdp, const void *buf)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
171
  {
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
172
173
  	struct gfs2_sb_host *sb = &sdp->sd_sb;
  	struct super_block *s = sdp->sd_vfs;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
  	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);
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
190
  	memcpy(s->s_uuid, str->sb_uuid, 16);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  }
  
  /**
   * 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...
211
  static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
212
213
214
215
216
217
218
219
  {
  	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...
220
  		return -ENOMEM;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
221
222
223
224
225
226
  
  	ClearPageUptodate(page);
  	ClearPageDirty(page);
  	lock_page(page);
  
  	bio = bio_alloc(GFP_NOFS, 1);
4f024f379   Kent Overstreet   block: Abstract o...
227
  	bio->bi_iter.bi_sector = sector * (sb->s_blocksize >> 9);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
228
229
230
231
232
  	bio->bi_bdev = sb->s_bdev;
  	bio_add_page(bio, page, PAGE_SIZE, 0);
  
  	bio->bi_end_io = end_bio_io_page;
  	bio->bi_private = page;
20ed0535d   Steven Whitehouse   GFS2: Fix up REQ ...
233
  	submit_bio(READ_SYNC | REQ_META, bio);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
234
235
236
237
238
239
240
  	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...
241
  	gfs2_sb_in(sdp, p);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
242
243
  	kunmap(page);
  	__free_page(page);
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
244
  	return gfs2_check_sb(sdp, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
245
  }
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
246

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
247
248
249
  /**
   * gfs2_read_sb - Read super block
   * @sdp: The GFS2 superblock
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
250
251
252
   * @silent: Don't print message if mount fails
   *
   */
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
253
  static int gfs2_read_sb(struct gfs2_sbd *sdp, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
254
255
256
257
258
  {
  	u32 hash_blocks, ind_blocks, leaf_blocks;
  	u32 tmp_blocks;
  	unsigned int x;
  	int error;
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
259
  	error = gfs2_read_super(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
260
261
262
263
264
265
  	if (error) {
  		if (!silent)
  			fs_err(sdp, "can't read superblock
  ");
  		return error;
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
266
267
268
269
270
271
272
273
274
275
276
277
278
279
  	sdp->sd_fsb2bb_shift = sdp->sd_sb.sb_bsize_shift -
  			       GFS2_BASIC_BLOCK_SHIFT;
  	sdp->sd_fsb2bb = 1 << sdp->sd_fsb2bb_shift;
  	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...
280
281
282
  	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 ...
283
284
285
286
287
288
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
  
  	/* Compute maximum reservation required to add a entry to a directory */
  
  	hash_blocks = DIV_ROUND_UP(sizeof(u64) * (1 << GFS2_DIR_MAX_DEPTH),
  			     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...
336
337
338
  	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 ...
339
340
  	return 0;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
341
342
  static int init_names(struct gfs2_sbd *sdp, int silent)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
343
344
345
346
347
348
349
350
351
  	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...
352
  		error = gfs2_read_super(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift, silent);
bb8d8a6f5   Steven Whitehouse   [GFS2] Fix sign p...
353
354
  		if (error)
  			return error;
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
355

b3b94faa5   David Teigland   [GFS2] The core o...
356
  		if (!proto[0])
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
357
  			proto = sdp->sd_sb.sb_lockproto;
b3b94faa5   David Teigland   [GFS2] The core o...
358
  		if (!table[0])
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
359
  			table = sdp->sd_sb.sb_locktable;
b3b94faa5   David Teigland   [GFS2] The core o...
360
361
362
363
  	}
  
  	if (!table[0])
  		table = sdp->sd_vfs->s_id;
00377d8e3   Jean Delvare   [GFS2] Prefer str...
364
365
  	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...
366

5d35e31f4   Denis Cheng   [GFS2] better cod...
367
368
  	table = sdp->sd_table_name;
  	while ((table = strchr(table, '/')))
b35997d44   Robert Peterson   [GFS2] Can't moun...
369
  		*table = '_';
b3b94faa5   David Teigland   [GFS2] The core o...
370
371
372
373
374
375
  	return error;
  }
  
  static int init_locking(struct gfs2_sbd *sdp, struct gfs2_holder *mount_gh,
  			int undo)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
376
377
378
379
  	int error = 0;
  
  	if (undo)
  		goto fail_trans;
b3b94faa5   David Teigland   [GFS2] The core o...
380
381
382
383
384
385
386
387
388
389
390
391
392
  	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_...
393
  				  LM_FLAG_NOEXP | GL_EXACT,
b3b94faa5   David Teigland   [GFS2] The core o...
394
395
396
397
398
399
400
401
402
403
404
405
406
407
  				  &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...
408
409
  	error = gfs2_glock_get(sdp, GFS2_FREEZE_LOCK, &gfs2_freeze_glops,
  			       CREATE, &sdp->sd_freeze_gl);
b3b94faa5   David Teigland   [GFS2] The core o...
410
411
412
413
414
  	if (error) {
  		fs_err(sdp, "can't create transaction glock: %d
  ", error);
  		goto fail_rename;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
415
416
  
  	return 0;
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
417
  fail_trans:
24972557b   Benjamin Marzinski   GFS2: remove tran...
418
  	gfs2_glock_put(sdp->sd_freeze_gl);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
419
  fail_rename:
b3b94faa5   David Teigland   [GFS2] The core o...
420
  	gfs2_glock_put(sdp->sd_rename_gl);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
421
  fail_live:
b3b94faa5   David Teigland   [GFS2] The core o...
422
  	gfs2_glock_dq_uninit(&sdp->sd_live_gh);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
423
  fail_mount:
b3b94faa5   David Teigland   [GFS2] The core o...
424
  	gfs2_glock_dq_uninit(mount_gh);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
425
  fail:
b3b94faa5   David Teigland   [GFS2] The core o...
426
427
  	return error;
  }
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
428
429
  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...
430
  {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
431
432
433
  	struct gfs2_sbd *sdp = sb->s_fs_info;
  	struct dentry *dentry;
  	struct inode *inode;
73b462d28   Bob Peterson   GFS2: Eliminate p...
434
  	inode = gfs2_inode_lookup(sb, DT_DIR, no_addr, 0);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
435
436
437
438
439
  	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...
440
  	dentry = d_make_root(inode);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
441
442
443
  	if (!dentry) {
  		fs_err(sdp, "can't alloc %s dentry
  ", name);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
444
445
  		return -ENOMEM;
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
446
447
  	*dptr = dentry;
  	return 0;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
448
  }
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
449
  static int init_sb(struct gfs2_sbd *sdp, int silent)
b3b94faa5   David Teigland   [GFS2] The core o...
450
451
452
  {
  	struct super_block *sb = sdp->sd_vfs;
  	struct gfs2_holder sb_gh;
dbb7cae2a   Steven Whitehouse   [GFS2] Clean up i...
453
  	u64 no_addr;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
454
  	int ret;
b3b94faa5   David Teigland   [GFS2] The core o...
455

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
456
457
458
459
460
461
  	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...
462
  	}
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
463

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

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
495
496
497
498
499
500
501
502
  	/* 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...
503
  out:
b3b94faa5   David Teigland   [GFS2] The core o...
504
  	gfs2_glock_dq_uninit(&sb_gh);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
505
  	return ret;
b3b94faa5   David Teigland   [GFS2] The core o...
506
  }
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
507
  static void gfs2_others_may_mount(struct gfs2_sbd *sdp)
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
508
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
509
510
  	char *message = "FIRSTMOUNT=Done";
  	char *envp[] = { message, NULL };
e0c2a9aa1   David Teigland   GFS2: dlm based r...
511
512
513
514
515
516
  
  	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_...
517
  	kobject_uevent_env(&sdp->sd_kobj, KOBJ_CHANGE, envp);
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
518
  }
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
519
520
521
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
  /**
   * 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...
564
  		INIT_LIST_HEAD(&jd->jd_revoke_list);
6ecd7c2dd   Tejun Heo   gfs2: use workque...
565
  		INIT_WORK(&jd->jd_work, gfs2_recover_func);
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
  		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 ...
586
587
588
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
  /**
   * 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...
631
632
  static int init_journal(struct gfs2_sbd *sdp, int undo)
  {
2b0143b5c   David Howells   VFS: normal files...
633
  	struct inode *master = d_inode(sdp->sd_master_dir);
b3b94faa5   David Teigland   [GFS2] The core o...
634
  	struct gfs2_holder ji_gh;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
635
  	struct gfs2_inode *ip;
b3b94faa5   David Teigland   [GFS2] The core o...
636
637
638
639
640
  	int jindex = 1;
  	int error = 0;
  
  	if (undo) {
  		jindex = 0;
fe64d517d   Steven Whitehouse   GFS2: Umount reco...
641
  		goto fail_jinode_gh;
b3b94faa5   David Teigland   [GFS2] The core o...
642
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
643
  	sdp->sd_jindex = gfs2_lookup_simple(master, "jindex");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
644
  	if (IS_ERR(sdp->sd_jindex)) {
b3b94faa5   David Teigland   [GFS2] The core o...
645
646
  		fs_err(sdp, "can't lookup journal index: %d
  ", error);
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
647
  		return PTR_ERR(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
648
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
649
650
651
652
653
654
655
656
657
  
  	/* 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
658
  	error = -EUSERS;
b3b94faa5   David Teigland   [GFS2] The core o...
659
660
661
  	if (!gfs2_jindex_size(sdp)) {
  		fs_err(sdp, "no journals!
  ");
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
662
  		goto fail_jindex;
b3b94faa5   David Teigland   [GFS2] The core o...
663
664
665
666
  	}
  
  	if (sdp->sd_args.ar_spectator) {
  		sdp->sd_jdesc = gfs2_jdesc_find(sdp, 0);
fd041f0b4   Steven Whitehouse   [GFS2] Use atomic...
667
  		atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
668
669
  		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...
670
671
672
673
674
675
676
677
678
679
680
681
  	} 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...
682
  		error = gfs2_glock_nq_num(sdp, sdp->sd_lockstruct.ls_jid,
b3b94faa5   David Teigland   [GFS2] The core o...
683
684
685
686
687
688
689
690
  					  &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...
691
692
  		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...
693
  					   LM_FLAG_NOEXP | GL_EXACT | GL_NOCACHE,
b3b94faa5   David Teigland   [GFS2] The core o...
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
  					   &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...
709
  		atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
710
711
  		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...
712
713
  
  		/* Map the extents for this journal's blocks */
b50f227bd   Steven Whitehouse   GFS2: Clean up jo...
714
  		gfs2_map_journal_extents(sdp, sdp->sd_jdesc);
b3b94faa5   David Teigland   [GFS2] The core o...
715
  	}
63997775b   Steven Whitehouse   GFS2: Add tracepo...
716
  	trace_gfs2_log_blocks(sdp, atomic_read(&sdp->sd_log_blks_free));
b3b94faa5   David Teigland   [GFS2] The core o...
717
718
719
720
  
  	if (sdp->sd_lockstruct.ls_first) {
  		unsigned int x;
  		for (x = 0; x < sdp->sd_journals; x++) {
1d12d175e   Bob Peterson   GFS2: Don't flag ...
721
722
723
724
725
726
727
728
729
  			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...
730
731
732
733
734
735
736
  			if (error) {
  				fs_err(sdp, "error recovering journal %u: %d
  ",
  				       x, error);
  				goto fail_jinode_gh;
  			}
  		}
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
737
  		gfs2_others_may_mount(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
738
  	} else if (!sdp->sd_args.ar_spectator) {
6ecd7c2dd   Tejun Heo   gfs2: use workque...
739
  		error = gfs2_recover_journal(sdp->sd_jdesc, true);
b3b94faa5   David Teigland   [GFS2] The core o...
740
741
742
743
744
745
  		if (error) {
  			fs_err(sdp, "error recovering my journal: %d
  ", error);
  			goto fail_jinode_gh;
  		}
  	}
086cc672e   Benjamin Marzinski   GFS2: mark the jo...
746
  	sdp->sd_log_idle = 1;
b3b94faa5   David Teigland   [GFS2] The core o...
747
748
749
  	set_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags);
  	gfs2_glock_dq_uninit(&ji_gh);
  	jindex = 0;
2e60d7683   Benjamin Marzinski   GFS2: update free...
750
  	INIT_WORK(&sdp->sd_freeze_work, gfs2_freeze_func);
b3b94faa5   David Teigland   [GFS2] The core o...
751
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
752
  fail_jinode_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
753
754
  	if (!sdp->sd_args.ar_spectator)
  		gfs2_glock_dq_uninit(&sdp->sd_jinode_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
755
  fail_journal_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
756
757
  	if (!sdp->sd_args.ar_spectator)
  		gfs2_glock_dq_uninit(&sdp->sd_journal_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
758
  fail_jindex:
b3b94faa5   David Teigland   [GFS2] The core o...
759
760
761
  	gfs2_jindex_free(sdp);
  	if (jindex)
  		gfs2_glock_dq_uninit(&ji_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
762
  fail:
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
763
  	iput(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
764
765
  	return error;
  }
56aa72d0f   Jan Kara   GFS2: Get rid of ...
766
  static struct lock_class_key gfs2_quota_imutex_key;
b3b94faa5   David Teigland   [GFS2] The core o...
767
768
769
  
  static int init_inodes(struct gfs2_sbd *sdp, int undo)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
770
  	int error = 0;
2b0143b5c   David Howells   VFS: normal files...
771
  	struct inode *master = d_inode(sdp->sd_master_dir);
b3b94faa5   David Teigland   [GFS2] The core o...
772
773
  
  	if (undo)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
774
  		goto fail_qinode;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
775
  	error = init_journal(sdp, undo);
0e48e055a   Bob Peterson   GFS2: Prevent rec...
776
  	complete_all(&sdp->sd_journal_ready);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
777
  	if (error)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
778
  		goto fail;
b3b94faa5   David Teigland   [GFS2] The core o...
779

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

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
929
930
931
  	if (!strcmp("lock_nolock", proto)) {
  		lm = &nolock_ops;
  		sdp->sd_args.ar_localflocks = 1;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
932
933
934
935
936
  #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...
937
938
  		pr_info("can't find protocol %s
  ", proto);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
939
940
  		return -ENOENT;
  	}
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
941
942
943
  
  	fs_info(sdp, "Trying to join cluster \"%s\", \"%s\"
  ", proto, table);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
944
945
  	ls->ls_ops = lm;
  	ls->ls_first = 1;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
946

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
947
948
949
950
951
952
953
954
955
956
957
958
959
  	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...
960
961
  			if (test_and_clear_bit(SDF_NOJOURNALID, &sdp->sd_flags))
  				ls->ls_jid = option;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
962
963
  			break;
  		case Opt_id:
4875647a0   David Teigland   dlm: fixes for no...
964
  		case Opt_nodir:
2b88f7c53   Steven Whitehouse   GFS2: Remove unus...
965
  			/* Obsolete, but left for backward compat purposes */
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
966
967
968
969
970
971
972
  			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_...
973
974
975
976
977
978
979
  		case Opt_err:
  		default:
  hostdata_error:
  			fs_info(sdp, "unknown hostdata (%s)
  ", o);
  			return -EINVAL;
  		}
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
980
  	}
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
981
982
983
  	if (lm->lm_mount == NULL) {
  		fs_info(sdp, "Now mounting FS...
  ");
192370399   Steven Whitehouse   GFS2: Fix mount h...
984
  		complete_all(&sdp->sd_locking_init);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
985
  		return 0;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
986
  	}
e0c2a9aa1   David Teigland   GFS2: dlm based r...
987
  	ret = lm->lm_mount(sdp, table);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
988
989
990
  	if (ret == 0)
  		fs_info(sdp, "Joined cluster. Now mounting FS...
  ");
192370399   Steven Whitehouse   GFS2: Fix mount h...
991
  	complete_all(&sdp->sd_locking_init);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
992
  	return ret;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
993
994
995
996
  }
  
  void gfs2_lm_unmount(struct gfs2_sbd *sdp)
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
997
998
999
1000
  	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....
1001
  }
b3b94faa5   David Teigland   [GFS2] The core o...
1002

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1003
1004
  static int wait_on_journal(struct gfs2_sbd *sdp)
  {
ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1005
1006
  	if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
  		return 0;
743162013   NeilBrown   sched: Remove pro...
1007
1008
  	return wait_on_bit(&sdp->sd_flags, SDF_NOJOURNALID, TASK_INTERRUPTIBLE)
  		? -EINTR : 0;
ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1009
  }
8633ecfab   Steven Whitehouse   GFS2: Add online ...
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
  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 };
  	sprintf(ro, "RDONLY=%d", (sb->s_flags & MS_RDONLY) ? 1 : 0);
  	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...
1020
1021
1022
1023
1024
1025
1026
1027
  /**
   * 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...
1028
  static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent)
b3b94faa5   David Teigland   [GFS2] The core o...
1029
1030
1031
1032
1033
1034
1035
  {
  	struct gfs2_sbd *sdp;
  	struct gfs2_holder mount_gh;
  	int error;
  
  	sdp = init_sbd(sb);
  	if (!sdp) {
d77d1b58a   Joe Perches   GFS2: Use pr_<lev...
1036
1037
  		pr_warn("can't alloc struct gfs2_sbd
  ");
b3b94faa5   David Teigland   [GFS2] The core o...
1038
1039
  		return -ENOMEM;
  	}
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1040
  	sdp->sd_args = *args;
b3b94faa5   David Teigland   [GFS2] The core o...
1041

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

9964afbb7   Steven Whitehouse   GFS2: Add S_NOSEC...
1051
  	sb->s_flags |= MS_NOSEC;
719ee3446   Steven Whitehouse   GFS2: high time t...
1052
1053
  	sb->s_magic = GFS2_MAGIC;
  	sb->s_op = &gfs2_super_ops;
41ced6dcf   Al Viro   switch gfs2, clos...
1054
  	sb->s_d_op = &gfs2_dops;
719ee3446   Steven Whitehouse   GFS2: high time t...
1055
  	sb->s_export_op = &gfs2_export_ops;
40b78a322   Steven Whitehouse   GFS2: Clean up of...
1056
  	sb->s_xattr = gfs2_xattr_handlers;
cc632e7f9   Steven Whitehouse   GFS2: Hook gfs2_q...
1057
  	sb->s_qcop = &gfs2_quotactl_ops;
de3b08d3e   Jan Kara   gfs2: Set allowed...
1058
  	sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
cc632e7f9   Steven Whitehouse   GFS2: Hook gfs2_q...
1059
  	sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
719ee3446   Steven Whitehouse   GFS2: high time t...
1060
1061
  	sb->s_time_gran = 1;
  	sb->s_maxbytes = MAX_LFS_FILESIZE;
419c93e0b   Steven Whitehouse   [GFS2] Add gfs2me...
1062
1063
1064
1065
1066
1067
1068
1069
  
  	/* 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;
  	sdp->sd_fsb2bb = 1 << sdp->sd_fsb2bb_shift;
b3b94faa5   David Teigland   [GFS2] The core o...
1070

5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
1071
  	sdp->sd_tune.gt_logd_secs = sdp->sd_args.ar_commit;
3d3c10f2c   Benjamin Marzinski   GFS2: Improve sta...
1072
1073
1074
1075
  	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...
1076
  	} else {
3d3c10f2c   Benjamin Marzinski   GFS2: Improve sta...
1077
1078
1079
  		sdp->sd_tune.gt_statfs_slow = 1;
  		sdp->sd_tune.gt_statfs_quantum = 30;
  	}
48c2b6136   Steven Whitehouse   GFS2: Add commit=...
1080

b3b94faa5   David Teigland   [GFS2] The core o...
1081
  	error = init_names(sdp, silent);
0d515210b   Bob Peterson   GFS2: Add kobject...
1082
1083
1084
1085
1086
1087
1088
1089
  	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...
1090

e0c2a9aa1   David Teigland   GFS2: dlm based r...
1091
  	snprintf(sdp->sd_fsname, GFS2_FSNAME_LEN, "%s", sdp->sd_table_name);
b3b94faa5   David Teigland   [GFS2] The core o...
1092
  	error = gfs2_sys_fs_add(sdp);
0d515210b   Bob Peterson   GFS2: Add kobject...
1093
1094
1095
1096
1097
1098
1099
  	/*
  	 * 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...
1100
  	if (error)
0d515210b   Bob Peterson   GFS2: Add kobject...
1101
1102
1103
  		return error;
  
  	gfs2_create_debugfs_file(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1104
1105
1106
  
  	error = gfs2_lm_mount(sdp, silent);
  	if (error)
0d515210b   Bob Peterson   GFS2: Add kobject...
1107
  		goto fail_debug;
b3b94faa5   David Teigland   [GFS2] The core o...
1108
1109
1110
1111
  
  	error = init_locking(sdp, &mount_gh, DO);
  	if (error)
  		goto fail_lm;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1112
  	error = init_sb(sdp, silent);
b3b94faa5   David Teigland   [GFS2] The core o...
1113
1114
  	if (error)
  		goto fail_locking;
b3b94faa5   David Teigland   [GFS2] The core o...
1115

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1116
1117
1118
  	error = wait_on_journal(sdp);
  	if (error)
  		goto fail_sb;
feb47ca93   Steven Whitehouse   GFS2: Improve jou...
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
  	/*
  	 * 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...
1132
1133
1134
1135
1136
1137
  	if (sdp->sd_args.ar_spectator)
  		snprintf(sdp->sd_fsname, GFS2_FSNAME_LEN, "%s.s",
  			 sdp->sd_table_name);
  	else
  		snprintf(sdp->sd_fsname, GFS2_FSNAME_LEN, "%s.%u",
  			 sdp->sd_table_name, sdp->sd_lockstruct.ls_jid);
b3b94faa5   David Teigland   [GFS2] The core o...
1138
1139
  	error = init_inodes(sdp, DO);
  	if (error)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
1140
  		goto fail_sb;
b3b94faa5   David Teigland   [GFS2] The core o...
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
  
  	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;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
1152
1153
1154
1155
1156
  	if (!(sb->s_flags & MS_RDONLY)) {
  		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...
1157
  			goto fail_per_node;
b3b94faa5   David Teigland   [GFS2] The core o...
1158
1159
1160
1161
  		}
  	}
  
  	gfs2_glock_dq_uninit(&mount_gh);
8633ecfab   Steven Whitehouse   GFS2: Add online ...
1162
  	gfs2_online_uevent(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1163
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1164
  fail_per_node:
b3b94faa5   David Teigland   [GFS2] The core o...
1165
  	init_per_node(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1166
  fail_inodes:
b3b94faa5   David Teigland   [GFS2] The core o...
1167
  	init_inodes(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1168
  fail_sb:
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1169
1170
1171
1172
  	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...
1173
1174
  	if (sb->s_root)
  		dput(sb->s_root);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1175
  	sb->s_root = NULL;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1176
  fail_locking:
b3b94faa5   David Teigland   [GFS2] The core o...
1177
  	init_locking(sdp, &mount_gh, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1178
  fail_lm:
0e48e055a   Bob Peterson   GFS2: Prevent rec...
1179
  	complete_all(&sdp->sd_journal_ready);
fefc03bfe   Steven Whitehouse   Revert "GFS2: Fix...
1180
  	gfs2_gl_hash_clear(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1181
  	gfs2_lm_unmount(sdp);
0d515210b   Bob Peterson   GFS2: Add kobject...
1182
  fail_debug:
5f8820960   Robert Peterson   [GFS2] lockdump i...
1183
  	gfs2_delete_debugfs_file(sdp);
a245769f2   Steven Whitehouse   GFS2: glock stati...
1184
  	free_percpu(sdp->sd_lkstats);
0d515210b   Bob Peterson   GFS2: Add kobject...
1185
1186
1187
  	/* 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...
1188
  	sb->s_fs_info = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
1189
1190
  	return error;
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1191
  static int set_gfs2_super(struct super_block *s, void *data)
b3b94faa5   David Teigland   [GFS2] The core o...
1192
  {
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1193
1194
1195
1196
1197
1198
1199
1200
1201
  	s->s_bdev = data;
  	s->s_dev = s->s_bdev->bd_dev;
  
  	/*
  	 * We set the bdi here to the queue backing, file systems can
  	 * overwrite this in ->fill_super()
  	 */
  	s->s_bdi = &bdev_get_queue(s->s_bdev)->backing_dev_info;
  	return 0;
863846054   Abhijith Das   [GFS2] Allow moun...
1202
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1203
  static int test_gfs2_super(struct super_block *s, void *ptr)
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1204
1205
1206
1207
  {
  	struct block_device *bdev = ptr;
  	return (bdev == s->s_bdev);
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1208
  /**
8bcbbf000   Al Viro   convert gfs2
1209
   * gfs2_mount - Get the GFS2 superblock
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1210
1211
1212
1213
   * @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...
1214
1215
1216
1217
1218
1219
1220
   *
   * 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
1221
1222
  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...
1223
1224
1225
  {
  	struct block_device *bdev;
  	struct super_block *s;
d4d776299   Tejun Heo   block: clean up b...
1226
  	fmode_t mode = FMODE_READ | FMODE_EXCL;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1227
1228
1229
1230
1231
1232
  	int error;
  	struct gfs2_args args;
  	struct gfs2_sbd *sdp;
  
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
d4d776299   Tejun Heo   block: clean up b...
1233
  	bdev = blkdev_get_by_path(dev_name, mode, fs_type);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1234
  	if (IS_ERR(bdev))
8bcbbf000   Al Viro   convert gfs2
1235
  		return ERR_CAST(bdev);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
  
  	/*
  	 * 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...
1248
  	s = sget(fs_type, test_gfs2_super, set_gfs2_super, flags, bdev);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1249
1250
1251
1252
  	mutex_unlock(&bdev->bd_fsfreeze_mutex);
  	error = PTR_ERR(s);
  	if (IS_ERR(s))
  		goto error_bdev;
dfe5b9ad8   Steven Whitehouse   GFS2: don't hold ...
1253
1254
1255
1256
1257
1258
1259
1260
1261
  	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...
1262
  		blkdev_put(bdev, mode);
dfe5b9ad8   Steven Whitehouse   GFS2: don't hold ...
1263
  		down_write(&s->s_umount);
6de20eb0d   Andrew Price   GFS2: Set s_mode ...
1264
1265
1266
  	} else {
  		/* s_mode must be set before deactivate_locked_super calls */
  		s->s_mode = mode;
dfe5b9ad8   Steven Whitehouse   GFS2: don't hold ...
1267
  	}
8bcbbf000   Al Viro   convert gfs2
1268

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

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

24972557b   Benjamin Marzinski   GFS2: remove tran...
1354
  	gfs2_log_flush(sdp, NULL, SYNC_FLUSH);
88a19ad06   Steven Whitehouse   GFS2: Fix use-aft...
1355
1356
1357
1358
  	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...
1359
  	shrink_dcache_sb(sb);
88a19ad06   Steven Whitehouse   GFS2: Fix use-aft...
1360
  	gfs2_delete_debugfs_file(sdp);
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");