Blame view

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

85d1da67f   Steven Whitehouse   [GFS2] Move glock...
62
  	sdp = kzalloc(sizeof(struct gfs2_sbd), GFP_KERNEL);
b3b94faa5   David Teigland   [GFS2] The core o...
63
64
  	if (!sdp)
  		return NULL;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
65
  	sb->s_fs_info = sdp;
b3b94faa5   David Teigland   [GFS2] The core o...
66
  	sdp->sd_vfs = sb;
ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
67
  	set_bit(SDF_NOJOURNALID, &sdp->sd_flags);
b3b94faa5   David Teigland   [GFS2] The core o...
68
  	gfs2_tune_init(&sdp->sd_tune);
e402746a9   Steven Whitehouse   GFS2: Wait for un...
69
70
  	init_waitqueue_head(&sdp->sd_glock_wait);
  	atomic_set(&sdp->sd_glock_disposal, 0);
3942ae531   Steven Whitehouse   GFS2: Fix race du...
71
  	init_completion(&sdp->sd_locking_init);
b3b94faa5   David Teigland   [GFS2] The core o...
72
  	spin_lock_init(&sdp->sd_statfs_spin);
b3b94faa5   David Teigland   [GFS2] The core o...
73
74
  
  	spin_lock_init(&sdp->sd_rindex_spin);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
75
  	mutex_init(&sdp->sd_rindex_mutex);
7c9ca6211   Bob Peterson   GFS2: Use rbtree ...
76
  	sdp->sd_rindex_tree.rb_node = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
77
78
79
  
  	INIT_LIST_HEAD(&sdp->sd_jindex_list);
  	spin_lock_init(&sdp->sd_jindex_spin);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
80
  	mutex_init(&sdp->sd_jindex_mutex);
b3b94faa5   David Teigland   [GFS2] The core o...
81

b3b94faa5   David Teigland   [GFS2] The core o...
82
  	INIT_LIST_HEAD(&sdp->sd_quota_list);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
83
  	mutex_init(&sdp->sd_quota_mutex);
37b2c8377   Steven Whitehouse   GFS2: Clean up & ...
84
  	init_waitqueue_head(&sdp->sd_quota_wait);
813e0c46c   Steven Whitehouse   GFS2: Fix "trunca...
85
86
  	INIT_LIST_HEAD(&sdp->sd_trunc_list);
  	spin_lock_init(&sdp->sd_trunc_lock);
b3b94faa5   David Teigland   [GFS2] The core o...
87
88
  
  	spin_lock_init(&sdp->sd_log_lock);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
89
  	atomic_set(&sdp->sd_log_pinned, 0);
b3b94faa5   David Teigland   [GFS2] The core o...
90
91
92
93
  	INIT_LIST_HEAD(&sdp->sd_log_le_buf);
  	INIT_LIST_HEAD(&sdp->sd_log_le_revoke);
  	INIT_LIST_HEAD(&sdp->sd_log_le_rg);
  	INIT_LIST_HEAD(&sdp->sd_log_le_databuf);
d7b616e25   Steven Whitehouse   [GFS2] Clean up o...
94
  	INIT_LIST_HEAD(&sdp->sd_log_le_ordered);
b3b94faa5   David Teigland   [GFS2] The core o...
95

5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
96
97
  	init_waitqueue_head(&sdp->sd_log_waitq);
  	init_waitqueue_head(&sdp->sd_logd_waitq);
d6a079e82   Dave Chinner   GFS2: introduce A...
98
  	spin_lock_init(&sdp->sd_ail_lock);
b3b94faa5   David Teigland   [GFS2] The core o...
99
100
  	INIT_LIST_HEAD(&sdp->sd_ail1_list);
  	INIT_LIST_HEAD(&sdp->sd_ail2_list);
484adff8a   Steven Whitehouse   [GFS2] Update loc...
101
  	init_rwsem(&sdp->sd_log_flush_lock);
16615be18   Steven Whitehouse   [GFS2] Clean up j...
102
103
  	atomic_set(&sdp->sd_log_in_flight, 0);
  	init_waitqueue_head(&sdp->sd_log_flush_wait);
b3b94faa5   David Teigland   [GFS2] The core o...
104
105
  
  	INIT_LIST_HEAD(&sdp->sd_revoke_list);
f55ab26a8   Steven Whitehouse   [GFS2] Use mutice...
106
  	mutex_init(&sdp->sd_freeze_lock);
b3b94faa5   David Teigland   [GFS2] The core o...
107
108
109
  
  	return sdp;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
110

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
111
112
113
114
115
116
117
118
119
120
  /**
   * 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...
121
  static int gfs2_check_sb(struct gfs2_sbd *sdp, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
122
  {
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
123
  	struct gfs2_sb_host *sb = &sdp->sd_sb;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
124
125
126
127
128
129
130
131
132
133
134
135
136
  	if (sb->sb_magic != GFS2_MAGIC ||
  	    sb->sb_type != GFS2_METATYPE_SB) {
  		if (!silent)
  			printk(KERN_WARNING "GFS2: not a GFS2 filesystem
  ");
  		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...
137
138
  	fs_warn(sdp, "Unknown on-disk format, unable to mount
  ");
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
139

c80dbb58f   Steven Whitehouse   GFS2: Remove upgr...
140
  	return -EINVAL;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
141
142
143
144
145
146
147
148
149
150
151
152
153
  }
  
  static void end_bio_io_page(struct bio *bio, int error)
  {
  	struct page *page = bio->bi_private;
  
  	if (!error)
  		SetPageUptodate(page);
  	else
  		printk(KERN_WARNING "gfs2: error %d reading superblock
  ", error);
  	unlock_page(page);
  }
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
154
  static void gfs2_sb_in(struct gfs2_sbd *sdp, const void *buf)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
155
  {
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
156
157
  	struct gfs2_sb_host *sb = &sdp->sd_sb;
  	struct super_block *s = sdp->sd_vfs;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
  	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...
174
  	memcpy(s->s_uuid, str->sb_uuid, 16);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  }
  
  /**
   * 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...
195
  static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  {
  	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))
  		return -ENOBUFS;
  
  	ClearPageUptodate(page);
  	ClearPageDirty(page);
  	lock_page(page);
  
  	bio = bio_alloc(GFP_NOFS, 1);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
211
212
213
214
215
216
  	bio->bi_sector = sector * (sb->s_blocksize >> 9);
  	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 ...
217
  	submit_bio(READ_SYNC | REQ_META, bio);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
218
219
220
221
222
223
224
  	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...
225
  	gfs2_sb_in(sdp, p);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
226
227
  	kunmap(page);
  	__free_page(page);
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
228
  	return gfs2_check_sb(sdp, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
229
  }
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
230

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
231
232
233
  /**
   * gfs2_read_sb - Read super block
   * @sdp: The GFS2 superblock
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
234
235
236
   * @silent: Don't print message if mount fails
   *
   */
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
237
  static int gfs2_read_sb(struct gfs2_sbd *sdp, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
238
239
240
241
242
  {
  	u32 hash_blocks, ind_blocks, leaf_blocks;
  	u32 tmp_blocks;
  	unsigned int x;
  	int error;
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
243
  	error = gfs2_read_super(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
244
245
246
247
248
249
  	if (error) {
  		if (!silent)
  			fs_err(sdp, "can't read superblock
  ");
  		return error;
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
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
  	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);
  
  	/* 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);
  
  	return 0;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
320
321
  static int init_names(struct gfs2_sbd *sdp, int silent)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
322
323
324
325
326
327
328
329
330
  	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...
331
  		error = gfs2_read_super(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift, silent);
bb8d8a6f5   Steven Whitehouse   [GFS2] Fix sign p...
332
333
  		if (error)
  			return error;
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
334

b3b94faa5   David Teigland   [GFS2] The core o...
335
  		if (!proto[0])
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
336
  			proto = sdp->sd_sb.sb_lockproto;
b3b94faa5   David Teigland   [GFS2] The core o...
337
  		if (!table[0])
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
338
  			table = sdp->sd_sb.sb_locktable;
b3b94faa5   David Teigland   [GFS2] The core o...
339
340
341
342
  	}
  
  	if (!table[0])
  		table = sdp->sd_vfs->s_id;
00377d8e3   Jean Delvare   [GFS2] Prefer str...
343
344
  	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...
345

5d35e31f4   Denis Cheng   [GFS2] better cod...
346
347
  	table = sdp->sd_table_name;
  	while ((table = strchr(table, '/')))
b35997d44   Robert Peterson   [GFS2] Can't moun...
348
  		*table = '_';
b3b94faa5   David Teigland   [GFS2] The core o...
349
350
351
352
353
354
  	return error;
  }
  
  static int init_locking(struct gfs2_sbd *sdp, struct gfs2_holder *mount_gh,
  			int undo)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
355
356
357
358
  	int error = 0;
  
  	if (undo)
  		goto fail_trans;
b3b94faa5   David Teigland   [GFS2] The core o...
359
360
361
362
363
364
365
366
367
368
369
370
371
  	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_...
372
  				  LM_FLAG_NOEXP | GL_EXACT,
b3b94faa5   David Teigland   [GFS2] The core o...
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
  				  &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;
  	}
  
  	error = gfs2_glock_get(sdp, GFS2_TRANS_LOCK, &gfs2_trans_glops,
  			       CREATE, &sdp->sd_trans_gl);
  	if (error) {
  		fs_err(sdp, "can't create transaction glock: %d
  ", error);
  		goto fail_rename;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
395
396
  
  	return 0;
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
397
  fail_trans:
b3b94faa5   David Teigland   [GFS2] The core o...
398
  	gfs2_glock_put(sdp->sd_trans_gl);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
399
  fail_rename:
b3b94faa5   David Teigland   [GFS2] The core o...
400
  	gfs2_glock_put(sdp->sd_rename_gl);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
401
  fail_live:
b3b94faa5   David Teigland   [GFS2] The core o...
402
  	gfs2_glock_dq_uninit(&sdp->sd_live_gh);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
403
  fail_mount:
b3b94faa5   David Teigland   [GFS2] The core o...
404
  	gfs2_glock_dq_uninit(mount_gh);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
405
  fail:
b3b94faa5   David Teigland   [GFS2] The core o...
406
407
  	return error;
  }
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
408
409
  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...
410
  {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
411
412
413
  	struct gfs2_sbd *sdp = sb->s_fs_info;
  	struct dentry *dentry;
  	struct inode *inode;
44ad37d69   Bob Peterson   GFS2: filesystem ...
414
  	inode = gfs2_inode_lookup(sb, DT_DIR, no_addr, 0, 0);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
415
416
417
418
419
420
421
422
423
424
425
426
  	if (IS_ERR(inode)) {
  		fs_err(sdp, "can't read in %s inode: %ld
  ", name, PTR_ERR(inode));
  		return PTR_ERR(inode);
  	}
  	dentry = d_alloc_root(inode);
  	if (!dentry) {
  		fs_err(sdp, "can't alloc %s dentry
  ", name);
  		iput(inode);
  		return -ENOMEM;
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
427
428
  	*dptr = dentry;
  	return 0;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
429
  }
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
430
  static int init_sb(struct gfs2_sbd *sdp, int silent)
b3b94faa5   David Teigland   [GFS2] The core o...
431
432
433
  {
  	struct super_block *sb = sdp->sd_vfs;
  	struct gfs2_holder sb_gh;
dbb7cae2a   Steven Whitehouse   [GFS2] Clean up i...
434
  	u64 no_addr;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
435
  	int ret;
b3b94faa5   David Teigland   [GFS2] The core o...
436

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
437
438
439
440
441
442
  	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...
443
  	}
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
444

6bac243f0   Steven Whitehouse   GFS2: Clean up of...
445
  	ret = gfs2_read_sb(sdp, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
446
447
448
  	if (ret) {
  		fs_err(sdp, "can't read superblock: %d
  ", ret);
b3b94faa5   David Teigland   [GFS2] The core o...
449
450
451
452
  		goto out;
  	}
  
  	/* Set up the buffer cache and SB for real */
e1defc4ff   Martin K. Petersen   block: Do away wi...
453
  	if (sdp->sd_sb.sb_bsize < bdev_logical_block_size(sb->s_bdev)) {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
454
  		ret = -EINVAL;
b3b94faa5   David Teigland   [GFS2] The core o...
455
456
457
  		fs_err(sdp, "FS block size (%u) is too small for device "
  		       "block size (%u)
  ",
e1defc4ff   Martin K. Petersen   block: Do away wi...
458
  		       sdp->sd_sb.sb_bsize, bdev_logical_block_size(sb->s_bdev));
b3b94faa5   David Teigland   [GFS2] The core o...
459
460
461
  		goto out;
  	}
  	if (sdp->sd_sb.sb_bsize > PAGE_SIZE) {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
462
  		ret = -EINVAL;
b3b94faa5   David Teigland   [GFS2] The core o...
463
464
465
466
467
468
  		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...
469
  	sb_set_blocksize(sb, sdp->sd_sb.sb_bsize);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
470
  	/* Get the root inode */
dbb7cae2a   Steven Whitehouse   [GFS2] Clean up i...
471
  	no_addr = sdp->sd_sb.sb_root_dir.no_addr;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
472
473
  	ret = gfs2_lookup_root(sb, &sdp->sd_root_dir, no_addr, "root");
  	if (ret)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
474
  		goto out;
b3b94faa5   David Teigland   [GFS2] The core o...
475

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
476
477
478
479
480
481
482
483
  	/* 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...
484
  out:
b3b94faa5   David Teigland   [GFS2] The core o...
485
  	gfs2_glock_dq_uninit(&sb_gh);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
486
  	return ret;
b3b94faa5   David Teigland   [GFS2] The core o...
487
  }
da6dd40d5   Bob Peterson   [GFS2] Journal ex...
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
  /**
   * map_journal_extents - create a reusable "extent" mapping from all logical
   * blocks to all physical blocks for the given journal.  This will save
   * us time when writing journal blocks.  Most journals will have only one
   * extent that maps all their logical blocks.  That's because gfs2.mkfs
   * arranges the journal blocks sequentially to maximize performance.
   * So the extent would map the first block for the entire file length.
   * However, gfs2_jadd can happen while file activity is happening, so
   * those journals may not be sequential.  Less likely is the case where
   * the users created their own journals by mounting the metafs and
   * laying it out.  But it's still possible.  These journals might have
   * several extents.
   *
   * TODO: This should be done in bigger chunks rather than one block at a time,
   *       but since it's only done at mount time, I'm not worried about the
   *       time it takes.
   */
  static int map_journal_extents(struct gfs2_sbd *sdp)
  {
  	struct gfs2_jdesc *jd = sdp->sd_jdesc;
  	unsigned int lb;
  	u64 db, prev_db; /* logical block, disk block, prev disk block */
  	struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
  	struct gfs2_journal_extent *jext = NULL;
  	struct buffer_head bh;
  	int rc = 0;
da6dd40d5   Bob Peterson   [GFS2] Journal ex...
514
  	prev_db = 0;
a2e0f7993   Steven Whitehouse   GFS2: Remove i_di...
515
  	for (lb = 0; lb < i_size_read(jd->jd_inode) >> sdp->sd_sb.sb_bsize_shift; lb++) {
da6dd40d5   Bob Peterson   [GFS2] Journal ex...
516
517
518
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
  		bh.b_state = 0;
  		bh.b_blocknr = 0;
  		bh.b_size = 1 << ip->i_inode.i_blkbits;
  		rc = gfs2_block_map(jd->jd_inode, lb, &bh, 0);
  		db = bh.b_blocknr;
  		if (rc || !db) {
  			printk(KERN_INFO "GFS2 journal mapping error %d: lb="
  			       "%u db=%llu
  ", rc, lb, (unsigned long long)db);
  			break;
  		}
  		if (!prev_db || db != prev_db + 1) {
  			jext = kzalloc(sizeof(struct gfs2_journal_extent),
  				       GFP_KERNEL);
  			if (!jext) {
  				printk(KERN_INFO "GFS2 error: out of memory "
  				       "mapping journal extents.
  ");
  				rc = -ENOMEM;
  				break;
  			}
  			jext->dblock = db;
  			jext->lblock = lb;
  			jext->blocks = 1;
  			list_add_tail(&jext->extent_list, &jd->extent_list);
  		} else {
  			jext->blocks++;
  		}
  		prev_db = db;
  	}
  	return rc;
  }
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
548
  static void gfs2_others_may_mount(struct gfs2_sbd *sdp)
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
549
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
550
551
  	char *message = "FIRSTMOUNT=Done";
  	char *envp[] = { message, NULL };
e0c2a9aa1   David Teigland   GFS2: dlm based r...
552
553
554
555
556
557
  
  	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_...
558
  	kobject_uevent_env(&sdp->sd_kobj, KOBJ_CHANGE, envp);
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
559
  }
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
  /**
   * 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);
6ecd7c2dd   Tejun Heo   gfs2: use workque...
605
  		INIT_WORK(&jd->jd_work, gfs2_recover_func);
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
  		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;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
626
627
  static int init_journal(struct gfs2_sbd *sdp, int undo)
  {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
628
  	struct inode *master = sdp->sd_master_dir->d_inode;
b3b94faa5   David Teigland   [GFS2] The core o...
629
  	struct gfs2_holder ji_gh;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
630
  	struct gfs2_inode *ip;
b3b94faa5   David Teigland   [GFS2] The core o...
631
632
633
634
635
  	int jindex = 1;
  	int error = 0;
  
  	if (undo) {
  		jindex = 0;
fe64d517d   Steven Whitehouse   GFS2: Umount reco...
636
  		goto fail_jinode_gh;
b3b94faa5   David Teigland   [GFS2] The core o...
637
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
638
  	sdp->sd_jindex = gfs2_lookup_simple(master, "jindex");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
639
  	if (IS_ERR(sdp->sd_jindex)) {
b3b94faa5   David Teigland   [GFS2] The core o...
640
641
  		fs_err(sdp, "can't lookup journal index: %d
  ", error);
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
642
  		return PTR_ERR(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
643
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
644
645
646
647
648
649
650
651
652
  
  	/* 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
653
  	error = -EUSERS;
b3b94faa5   David Teigland   [GFS2] The core o...
654
655
656
  	if (!gfs2_jindex_size(sdp)) {
  		fs_err(sdp, "no journals!
  ");
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
657
  		goto fail_jindex;
b3b94faa5   David Teigland   [GFS2] The core o...
658
659
660
661
  	}
  
  	if (sdp->sd_args.ar_spectator) {
  		sdp->sd_jdesc = gfs2_jdesc_find(sdp, 0);
fd041f0b4   Steven Whitehouse   [GFS2] Use atomic...
662
  		atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
663
664
  		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...
665
666
667
668
669
670
671
672
673
674
675
676
  	} 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...
677
  		error = gfs2_glock_nq_num(sdp, sdp->sd_lockstruct.ls_jid,
b3b94faa5   David Teigland   [GFS2] The core o...
678
679
680
681
682
683
684
685
  					  &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...
686
687
  		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...
688
  					   LM_FLAG_NOEXP | GL_EXACT | GL_NOCACHE,
b3b94faa5   David Teigland   [GFS2] The core o...
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
  					   &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...
704
  		atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
705
706
  		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...
707
708
709
  
  		/* Map the extents for this journal's blocks */
  		map_journal_extents(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
710
  	}
63997775b   Steven Whitehouse   GFS2: Add tracepo...
711
  	trace_gfs2_log_blocks(sdp, atomic_read(&sdp->sd_log_blks_free));
b3b94faa5   David Teigland   [GFS2] The core o...
712
713
714
715
  
  	if (sdp->sd_lockstruct.ls_first) {
  		unsigned int x;
  		for (x = 0; x < sdp->sd_journals; x++) {
6ecd7c2dd   Tejun Heo   gfs2: use workque...
716
717
  			error = gfs2_recover_journal(gfs2_jdesc_find(sdp, x),
  						     true);
b3b94faa5   David Teigland   [GFS2] The core o...
718
719
720
721
722
723
724
  			if (error) {
  				fs_err(sdp, "error recovering journal %u: %d
  ",
  				       x, error);
  				goto fail_jinode_gh;
  			}
  		}
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
725
  		gfs2_others_may_mount(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
726
  	} else if (!sdp->sd_args.ar_spectator) {
6ecd7c2dd   Tejun Heo   gfs2: use workque...
727
  		error = gfs2_recover_journal(sdp->sd_jdesc, true);
b3b94faa5   David Teigland   [GFS2] The core o...
728
729
730
731
732
733
734
735
736
737
  		if (error) {
  			fs_err(sdp, "error recovering my journal: %d
  ", error);
  			goto fail_jinode_gh;
  		}
  	}
  
  	set_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags);
  	gfs2_glock_dq_uninit(&ji_gh);
  	jindex = 0;
b3b94faa5   David Teigland   [GFS2] The core o...
738
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
739
  fail_jinode_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
740
741
  	if (!sdp->sd_args.ar_spectator)
  		gfs2_glock_dq_uninit(&sdp->sd_jinode_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
742
  fail_journal_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
743
744
  	if (!sdp->sd_args.ar_spectator)
  		gfs2_glock_dq_uninit(&sdp->sd_journal_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
745
  fail_jindex:
b3b94faa5   David Teigland   [GFS2] The core o...
746
747
748
  	gfs2_jindex_free(sdp);
  	if (jindex)
  		gfs2_glock_dq_uninit(&ji_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
749
  fail:
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
750
  	iput(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
751
752
  	return error;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
753
754
755
  
  static int init_inodes(struct gfs2_sbd *sdp, int undo)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
756
  	int error = 0;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
757
  	struct inode *master = sdp->sd_master_dir->d_inode;
b3b94faa5   David Teigland   [GFS2] The core o...
758
759
  
  	if (undo)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
760
  		goto fail_qinode;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
761
762
  	error = init_journal(sdp, undo);
  	if (error)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
763
  		goto fail;
b3b94faa5   David Teigland   [GFS2] The core o...
764

b3b94faa5   David Teigland   [GFS2] The core o...
765
  	/* Read in the master statfs inode */
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
766
  	sdp->sd_statfs_inode = gfs2_lookup_simple(master, "statfs");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
767
768
  	if (IS_ERR(sdp->sd_statfs_inode)) {
  		error = PTR_ERR(sdp->sd_statfs_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
769
770
  		fs_err(sdp, "can't read in statfs inode: %d
  ", error);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
771
  		goto fail_journal;
b3b94faa5   David Teigland   [GFS2] The core o...
772
773
774
  	}
  
  	/* Read in the resource index inode */
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
775
  	sdp->sd_rindex = gfs2_lookup_simple(master, "rindex");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
776
777
  	if (IS_ERR(sdp->sd_rindex)) {
  		error = PTR_ERR(sdp->sd_rindex);
b3b94faa5   David Teigland   [GFS2] The core o...
778
779
780
781
  		fs_err(sdp, "can't get resource index inode: %d
  ", error);
  		goto fail_statfs;
  	}
cf45b752c   Bob Peterson   [GFS2] Remove rgr...
782
  	sdp->sd_rindex_uptodate = 0;
b3b94faa5   David Teigland   [GFS2] The core o...
783
784
  
  	/* Read in the quota inode */
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
785
  	sdp->sd_quota_inode = gfs2_lookup_simple(master, "quota");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
786
787
  	if (IS_ERR(sdp->sd_quota_inode)) {
  		error = PTR_ERR(sdp->sd_quota_inode);
b3b94faa5   David Teigland   [GFS2] The core o...
788
789
790
791
  		fs_err(sdp, "can't get quota file inode: %d
  ", error);
  		goto fail_rindex;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
792
  	return 0;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
793
794
  fail_qinode:
  	iput(sdp->sd_quota_inode);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
795
  fail_rindex:
b3b94faa5   David Teigland   [GFS2] The core o...
796
  	gfs2_clear_rgrpd(sdp);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
797
  	iput(sdp->sd_rindex);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
798
799
  fail_statfs:
  	iput(sdp->sd_statfs_inode);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
800
801
  fail_journal:
  	init_journal(sdp, UNDO);
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
802
  fail:
b3b94faa5   David Teigland   [GFS2] The core o...
803
804
805
806
807
  	return error;
  }
  
  static int init_per_node(struct gfs2_sbd *sdp, int undo)
  {
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
808
  	struct inode *pn = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
809
810
  	char buf[30];
  	int error = 0;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
811
  	struct gfs2_inode *ip;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
812
  	struct inode *master = sdp->sd_master_dir->d_inode;
b3b94faa5   David Teigland   [GFS2] The core o...
813
814
815
816
817
818
  
  	if (sdp->sd_args.ar_spectator)
  		return 0;
  
  	if (undo)
  		goto fail_qc_gh;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
819
  	pn = gfs2_lookup_simple(master, "per_node");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
820
821
  	if (IS_ERR(pn)) {
  		error = PTR_ERR(pn);
b3b94faa5   David Teigland   [GFS2] The core o...
822
823
824
825
  		fs_err(sdp, "can't find per_node directory: %d
  ", error);
  		return error;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
826
  	sprintf(buf, "statfs_change%u", sdp->sd_jdesc->jd_jid);
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
827
828
829
  	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...
830
831
  		fs_err(sdp, "can't find local \"sc\" file: %d
  ", error);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
832
  		goto fail;
b3b94faa5   David Teigland   [GFS2] The core o...
833
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
834
  	sprintf(buf, "quota_change%u", sdp->sd_jdesc->jd_jid);
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
835
836
837
  	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...
838
839
840
841
  		fs_err(sdp, "can't find local \"qc\" file: %d
  ", error);
  		goto fail_ut_i;
  	}
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
842
  	iput(pn);
b3b94faa5   David Teigland   [GFS2] The core o...
843
  	pn = NULL;
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
844
  	ip = GFS2_I(sdp->sd_sc_inode);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
845
  	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0,
b3b94faa5   David Teigland   [GFS2] The core o...
846
847
848
849
  				   &sdp->sd_sc_gh);
  	if (error) {
  		fs_err(sdp, "can't lock local \"sc\" file: %d
  ", error);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
850
  		goto fail_qc_i;
b3b94faa5   David Teigland   [GFS2] The core o...
851
  	}
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
852
  	ip = GFS2_I(sdp->sd_qc_inode);
8d8291ae9   Steven Whitehouse   GFS2: Remove no_f...
853
  	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0,
b3b94faa5   David Teigland   [GFS2] The core o...
854
855
856
857
858
859
860
861
  				   &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 ...
862
  fail_qc_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
863
  	gfs2_glock_dq_uninit(&sdp->sd_qc_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
864
  fail_ut_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
865
  	gfs2_glock_dq_uninit(&sdp->sd_sc_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
866
  fail_qc_i:
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
867
  	iput(sdp->sd_qc_inode);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
868
  fail_ut_i:
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
869
  	iput(sdp->sd_sc_inode);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
870
  fail:
b3b94faa5   David Teigland   [GFS2] The core o...
871
  	if (pn)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
872
  		iput(pn);
b3b94faa5   David Teigland   [GFS2] The core o...
873
874
875
876
877
878
879
880
881
  	return error;
  }
  
  static int init_threads(struct gfs2_sbd *sdp, int undo)
  {
  	struct task_struct *p;
  	int error = 0;
  
  	if (undo)
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
882
  		goto fail_quotad;
b3b94faa5   David Teigland   [GFS2] The core o...
883

b3b94faa5   David Teigland   [GFS2] The core o...
884
885
886
887
888
889
890
891
  	p = kthread_run(gfs2_logd, sdp, "gfs2_logd");
  	error = IS_ERR(p);
  	if (error) {
  		fs_err(sdp, "can't start logd thread: %d
  ", error);
  		return error;
  	}
  	sdp->sd_logd_process = p;
b3b94faa5   David Teigland   [GFS2] The core o...
892
893
894
895
896
897
898
899
  	p = kthread_run(gfs2_quotad, sdp, "gfs2_quotad");
  	error = IS_ERR(p);
  	if (error) {
  		fs_err(sdp, "can't start quotad thread: %d
  ", error);
  		goto fail;
  	}
  	sdp->sd_quotad_process = p;
b3b94faa5   David Teigland   [GFS2] The core o...
900
  	return 0;
b3b94faa5   David Teigland   [GFS2] The core o...
901

feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
902
  fail_quotad:
b3b94faa5   David Teigland   [GFS2] The core o...
903
  	kthread_stop(sdp->sd_quotad_process);
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
904
  fail:
b3b94faa5   David Teigland   [GFS2] The core o...
905
  	kthread_stop(sdp->sd_logd_process);
b3b94faa5   David Teigland   [GFS2] The core o...
906
907
  	return error;
  }
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
908

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
909
910
911
912
913
914
915
916
  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...
917
  	.lm_put_lock = gfs2_glock_free,
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
918
919
  	.lm_tokens = &nolock_tokens,
  };
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
920
921
922
  /**
   * gfs2_lm_mount - mount a locking protocol
   * @sdp: the filesystem
3ad2f3fbb   Daniel Mack   tree-wide: Assort...
923
   * @args: mount arguments
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
924
925
926
927
928
929
930
   * @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_...
931
932
933
934
935
  	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_...
936
937
  	char *o, *options;
  	int ret;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
938

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
939
940
941
  	if (!strcmp("lock_nolock", proto)) {
  		lm = &nolock_ops;
  		sdp->sd_args.ar_localflocks = 1;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
942
943
944
945
946
947
948
949
950
  #ifdef CONFIG_GFS2_FS_LOCKING_DLM
  	} else if (!strcmp("lock_dlm", proto)) {
  		lm = &gfs2_dlm_ops;
  #endif
  	} else {
  		printk(KERN_INFO "GFS2: can't find protocol %s
  ", proto);
  		return -ENOENT;
  	}
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
951
952
953
  
  	fs_info(sdp, "Trying to join cluster \"%s\", \"%s\"
  ", proto, table);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
954
955
  	ls->ls_ops = lm;
  	ls->ls_first = 1;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
956

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
957
958
959
960
961
962
963
964
965
966
967
968
969
  	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...
970
971
  			if (test_and_clear_bit(SDF_NOJOURNALID, &sdp->sd_flags))
  				ls->ls_jid = option;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
972
973
  			break;
  		case Opt_id:
2b88f7c53   Steven Whitehouse   GFS2: Remove unus...
974
  			/* Obsolete, but left for backward compat purposes */
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
  			break;
  		case Opt_first:
  			ret = match_int(&tmp[0], &option);
  			if (ret || (option != 0 && option != 1))
  				goto hostdata_error;
  			ls->ls_first = option;
  			break;
  		case Opt_nodir:
  			ret = match_int(&tmp[0], &option);
  			if (ret || (option != 0 && option != 1))
  				goto hostdata_error;
  			ls->ls_nodir = option;
  			break;
  		case Opt_err:
  		default:
  hostdata_error:
  			fs_info(sdp, "unknown hostdata (%s)
  ", o);
  			return -EINVAL;
  		}
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
995
  	}
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
996
997
998
  	if (lm->lm_mount == NULL) {
  		fs_info(sdp, "Now mounting FS...
  ");
192370399   Steven Whitehouse   GFS2: Fix mount h...
999
  		complete_all(&sdp->sd_locking_init);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
1000
  		return 0;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
1001
  	}
e0c2a9aa1   David Teigland   GFS2: dlm based r...
1002
  	ret = lm->lm_mount(sdp, table);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
1003
1004
1005
  	if (ret == 0)
  		fs_info(sdp, "Joined cluster. Now mounting FS...
  ");
192370399   Steven Whitehouse   GFS2: Fix mount h...
1006
  	complete_all(&sdp->sd_locking_init);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
1007
  	return ret;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
1008
1009
1010
1011
  }
  
  void gfs2_lm_unmount(struct gfs2_sbd *sdp)
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
1012
1013
1014
1015
  	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....
1016
  }
b3b94faa5   David Teigland   [GFS2] The core o...
1017

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
  static int gfs2_journalid_wait(void *word)
  {
  	if (signal_pending(current))
  		return -EINTR;
  	schedule();
  	return 0;
  }
  
  static int wait_on_journal(struct gfs2_sbd *sdp)
  {
ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1028
1029
1030
1031
1032
  	if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
  		return 0;
  
  	return wait_on_bit(&sdp->sd_flags, SDF_NOJOURNALID, gfs2_journalid_wait, TASK_INTERRUPTIBLE);
  }
8633ecfab   Steven Whitehouse   GFS2: Add online ...
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
  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...
1043
1044
1045
1046
1047
1048
1049
1050
  /**
   * 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...
1051
  static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent)
b3b94faa5   David Teigland   [GFS2] The core o...
1052
1053
1054
1055
1056
1057
1058
  {
  	struct gfs2_sbd *sdp;
  	struct gfs2_holder mount_gh;
  	int error;
  
  	sdp = init_sbd(sb);
  	if (!sdp) {
d92a8d480   Steven Whitehouse   [GFS2] Audit prin...
1059
1060
  		printk(KERN_WARNING "GFS2: can't alloc struct gfs2_sbd
  ");
b3b94faa5   David Teigland   [GFS2] The core o...
1061
1062
  		return -ENOMEM;
  	}
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1063
  	sdp->sd_args = *args;
b3b94faa5   David Teigland   [GFS2] The core o...
1064

fe64d517d   Steven Whitehouse   GFS2: Umount reco...
1065
  	if (sdp->sd_args.ar_spectator) {
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1066
                  sb->s_flags |= MS_RDONLY;
e8ca5cc57   David Teigland   GFS2: let spectat...
1067
  		set_bit(SDF_RORECOVERY, &sdp->sd_flags);
fe64d517d   Steven Whitehouse   GFS2: Umount reco...
1068
  	}
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1069
1070
  	if (sdp->sd_args.ar_posix_acl)
  		sb->s_flags |= MS_POSIXACL;
f25934c5f   Christoph Hellwig   GFS2: add barrier...
1071
1072
  	if (sdp->sd_args.ar_nobarrier)
  		set_bit(SDF_NOBARRIERS, &sdp->sd_flags);
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1073

9964afbb7   Steven Whitehouse   GFS2: Add S_NOSEC...
1074
  	sb->s_flags |= MS_NOSEC;
719ee3446   Steven Whitehouse   GFS2: high time t...
1075
1076
  	sb->s_magic = GFS2_MAGIC;
  	sb->s_op = &gfs2_super_ops;
41ced6dcf   Al Viro   switch gfs2, clos...
1077
  	sb->s_d_op = &gfs2_dops;
719ee3446   Steven Whitehouse   GFS2: high time t...
1078
  	sb->s_export_op = &gfs2_export_ops;
40b78a322   Steven Whitehouse   GFS2: Clean up of...
1079
  	sb->s_xattr = gfs2_xattr_handlers;
cc632e7f9   Steven Whitehouse   GFS2: Hook gfs2_q...
1080
1081
  	sb->s_qcop = &gfs2_quotactl_ops;
  	sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
719ee3446   Steven Whitehouse   GFS2: high time t...
1082
1083
  	sb->s_time_gran = 1;
  	sb->s_maxbytes = MAX_LFS_FILESIZE;
419c93e0b   Steven Whitehouse   [GFS2] Add gfs2me...
1084
1085
1086
1087
1088
1089
1090
1091
  
  	/* 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...
1092

5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
1093
  	sdp->sd_tune.gt_logd_secs = sdp->sd_args.ar_commit;
3d3c10f2c   Benjamin Marzinski   GFS2: Improve sta...
1094
1095
1096
1097
  	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...
1098
  	} else {
3d3c10f2c   Benjamin Marzinski   GFS2: Improve sta...
1099
1100
1101
  		sdp->sd_tune.gt_statfs_slow = 1;
  		sdp->sd_tune.gt_statfs_quantum = 30;
  	}
48c2b6136   Steven Whitehouse   GFS2: Add commit=...
1102

b3b94faa5   David Teigland   [GFS2] The core o...
1103
1104
1105
  	error = init_names(sdp, silent);
  	if (error)
  		goto fail;
e0c2a9aa1   David Teigland   GFS2: dlm based r...
1106
  	snprintf(sdp->sd_fsname, GFS2_FSNAME_LEN, "%s", sdp->sd_table_name);
7c52b166c   Robert Peterson   [GFS2] Add gfs2_t...
1107
  	gfs2_create_debugfs_file(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
  	error = gfs2_sys_fs_add(sdp);
  	if (error)
  		goto fail;
  
  	error = gfs2_lm_mount(sdp, silent);
  	if (error)
  		goto fail_sys;
  
  	error = init_locking(sdp, &mount_gh, DO);
  	if (error)
  		goto fail_lm;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1119
  	error = init_sb(sdp, silent);
b3b94faa5   David Teigland   [GFS2] The core o...
1120
1121
  	if (error)
  		goto fail_locking;
b3b94faa5   David Teigland   [GFS2] The core o...
1122

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1123
1124
1125
  	error = wait_on_journal(sdp);
  	if (error)
  		goto fail_sb;
feb47ca93   Steven Whitehouse   GFS2: Improve jou...
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
  	/*
  	 * 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...
1139
1140
1141
1142
1143
1144
  	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...
1145
1146
  	error = init_inodes(sdp, DO);
  	if (error)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
1147
  		goto fail_sb;
b3b94faa5   David Teigland   [GFS2] The core o...
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
  
  	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;
  	}
  
  	error = init_threads(sdp, DO);
  	if (error)
  		goto fail_per_node;
  
  	if (!(sb->s_flags & MS_RDONLY)) {
  		error = gfs2_make_fs_rw(sdp);
  		if (error) {
  			fs_err(sdp, "can't make FS RW: %d
  ", error);
  			goto fail_threads;
  		}
  	}
  
  	gfs2_glock_dq_uninit(&mount_gh);
8633ecfab   Steven Whitehouse   GFS2: Add online ...
1174
  	gfs2_online_uevent(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1175
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1176
  fail_threads:
b3b94faa5   David Teigland   [GFS2] The core o...
1177
  	init_threads(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1178
  fail_per_node:
b3b94faa5   David Teigland   [GFS2] The core o...
1179
  	init_per_node(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1180
  fail_inodes:
b3b94faa5   David Teigland   [GFS2] The core o...
1181
  	init_inodes(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1182
  fail_sb:
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1183
1184
1185
1186
  	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...
1187
1188
  	if (sb->s_root)
  		dput(sb->s_root);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1189
  	sb->s_root = NULL;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1190
  fail_locking:
b3b94faa5   David Teigland   [GFS2] The core o...
1191
  	init_locking(sdp, &mount_gh, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1192
  fail_lm:
fefc03bfe   Steven Whitehouse   Revert "GFS2: Fix...
1193
  	gfs2_gl_hash_clear(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1194
  	gfs2_lm_unmount(sdp);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1195
  fail_sys:
b3b94faa5   David Teigland   [GFS2] The core o...
1196
  	gfs2_sys_fs_del(sdp);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1197
  fail:
5f8820960   Robert Peterson   [GFS2] lockdump i...
1198
  	gfs2_delete_debugfs_file(sdp);
a2c458079   Steven Whitehouse   [GFS2] vfree shou...
1199
  	kfree(sdp);
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
1200
  	sb->s_fs_info = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
1201
1202
  	return error;
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1203
  static int set_gfs2_super(struct super_block *s, void *data)
b3b94faa5   David Teigland   [GFS2] The core o...
1204
  {
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1205
1206
1207
1208
1209
1210
1211
1212
1213
  	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...
1214
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1215
  static int test_gfs2_super(struct super_block *s, void *ptr)
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1216
1217
1218
1219
  {
  	struct block_device *bdev = ptr;
  	return (bdev == s->s_bdev);
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1220
  /**
8bcbbf000   Al Viro   convert gfs2
1221
   * gfs2_mount - Get the GFS2 superblock
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1222
1223
1224
1225
   * @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...
1226
1227
1228
1229
1230
1231
1232
   *
   * 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
1233
1234
  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...
1235
1236
1237
  {
  	struct block_device *bdev;
  	struct super_block *s;
d4d776299   Tejun Heo   block: clean up b...
1238
  	fmode_t mode = FMODE_READ | FMODE_EXCL;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1239
1240
1241
1242
1243
1244
  	int error;
  	struct gfs2_args args;
  	struct gfs2_sbd *sdp;
  
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
d4d776299   Tejun Heo   block: clean up b...
1245
  	bdev = blkdev_get_by_path(dev_name, mode, fs_type);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1246
  	if (IS_ERR(bdev))
8bcbbf000   Al Viro   convert gfs2
1247
  		return ERR_CAST(bdev);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
  
  	/*
  	 * 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;
  	}
  	s = sget(fs_type, test_gfs2_super, set_gfs2_super, bdev);
  	mutex_unlock(&bdev->bd_fsfreeze_mutex);
  	error = PTR_ERR(s);
  	if (IS_ERR(s))
  		goto error_bdev;
8bcbbf000   Al Viro   convert gfs2
1265
  	if (s->s_root)
d4d776299   Tejun Heo   block: clean up b...
1266
  		blkdev_put(bdev, mode);
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
1278
1279
  	args.ar_errors = GFS2_ERRORS_DEFAULT;
  
  	error = gfs2_mount_args(&args, data);
  	if (error) {
  		printk(KERN_WARNING "GFS2: 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
1288
1289
1290
1291
1292
1293
1294
  	} else {
  		char b[BDEVNAME_SIZE];
  
  		s->s_flags = flags;
  		s->s_mode = mode;
  		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
  		sb_set_blocksize(s, block_size(bdev));
  		error = fill_super(s, &args, flags & MS_SILENT ? 1 : 0);
8bcbbf000   Al Viro   convert gfs2
1295
1296
  		if (error)
  			goto error_super;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1297
1298
1299
1300
1301
  		s->s_flags |= MS_ACTIVE;
  		bdev->bd_super = s;
  	}
  
  	sdp = s->s_fs_info;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1302
  	if (args.ar_meta)
8bcbbf000   Al Viro   convert gfs2
1303
  		return dget(sdp->sd_master_dir);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1304
  	else
8bcbbf000   Al Viro   convert gfs2
1305
  		return dget(sdp->sd_root_dir);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1306
1307
1308
  
  error_super:
  	deactivate_locked_super(s);
8bcbbf000   Al Viro   convert gfs2
1309
  	return ERR_PTR(error);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1310
  error_bdev:
d4d776299   Tejun Heo   block: clean up b...
1311
  	blkdev_put(bdev, mode);
8bcbbf000   Al Viro   convert gfs2
1312
  	return ERR_PTR(error);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1313
  }
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1314
1315
1316
1317
  static int set_meta_super(struct super_block *s, void *ptr)
  {
  	return -EINVAL;
  }
8bcbbf000   Al Viro   convert gfs2
1318
1319
  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...
1320
  {
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1321
  	struct super_block *s;
003dec891   Steven Whitehouse   GFS2: Merge gfs2_...
1322
  	struct gfs2_sbd *sdp;
e24977d45   Al Viro   Reduce path_looku...
1323
  	struct path path;
863846054   Abhijith Das   [GFS2] Allow moun...
1324
  	int error;
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
1325

e24977d45   Al Viro   Reduce path_looku...
1326
  	error = kern_path(dev_name, LOOKUP_FOLLOW, &path);
863846054   Abhijith Das   [GFS2] Allow moun...
1327
  	if (error) {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1328
1329
1330
  		printk(KERN_WARNING "GFS2: path_lookup on %s returned error %d
  ",
  		       dev_name, error);
8bcbbf000   Al Viro   convert gfs2
1331
  		return ERR_PTR(error);
863846054   Abhijith Das   [GFS2] Allow moun...
1332
  	}
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1333
  	s = sget(&gfs2_fs_type, test_gfs2_super, set_meta_super,
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1334
  		 path.dentry->d_inode->i_sb->s_bdev);
e24977d45   Al Viro   Reduce path_looku...
1335
  	path_put(&path);
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1336
  	if (IS_ERR(s)) {
863846054   Abhijith Das   [GFS2] Allow moun...
1337
1338
  		printk(KERN_WARNING "GFS2: gfs2 mount does not exist
  ");
8bcbbf000   Al Viro   convert gfs2
1339
  		return ERR_CAST(s);
863846054   Abhijith Das   [GFS2] Allow moun...
1340
  	}
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1341
1342
  	if ((flags ^ s->s_flags) & MS_RDONLY) {
  		deactivate_locked_super(s);
8bcbbf000   Al Viro   convert gfs2
1343
  		return ERR_PTR(-EBUSY);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1344
  	}
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1345
  	sdp = s->s_fs_info;
8bcbbf000   Al Viro   convert gfs2
1346
  	return dget(sdp->sd_master_dir);
b3b94faa5   David Teigland   [GFS2] The core o...
1347
  }
419c93e0b   Steven Whitehouse   [GFS2] Add gfs2me...
1348
1349
  static void gfs2_kill_sb(struct super_block *sb)
  {
863846054   Abhijith Das   [GFS2] Allow moun...
1350
  	struct gfs2_sbd *sdp = sb->s_fs_info;
88a19ad06   Steven Whitehouse   GFS2: Fix use-aft...
1351
1352
1353
1354
  
  	if (sdp == NULL) {
  		kill_block_super(sb);
  		return;
3af165ac4   Steven Whitehouse   GFS2: Fix use-aft...
1355
  	}
88a19ad06   Steven Whitehouse   GFS2: Fix use-aft...
1356
1357
1358
1359
1360
1361
  
  	gfs2_meta_syncfs(sdp);
  	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...
1362
  	shrink_dcache_sb(sb);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1363
  	kill_block_super(sb);
88a19ad06   Steven Whitehouse   GFS2: Fix use-aft...
1364
1365
  	gfs2_delete_debugfs_file(sdp);
  	kfree(sdp);
863846054   Abhijith Das   [GFS2] Allow moun...
1366
  }
b3b94faa5   David Teigland   [GFS2] The core o...
1367
1368
1369
  struct file_system_type gfs2_fs_type = {
  	.name = "gfs2",
  	.fs_flags = FS_REQUIRES_DEV,
8bcbbf000   Al Viro   convert gfs2
1370
  	.mount = gfs2_mount,
419c93e0b   Steven Whitehouse   [GFS2] Add gfs2me...
1371
1372
1373
1374
1375
1376
1377
  	.kill_sb = gfs2_kill_sb,
  	.owner = THIS_MODULE,
  };
  
  struct file_system_type gfs2meta_fs_type = {
  	.name = "gfs2meta",
  	.fs_flags = FS_REQUIRES_DEV,
8bcbbf000   Al Viro   convert gfs2
1378
  	.mount = gfs2_mount_meta,
b3b94faa5   David Teigland   [GFS2] The core o...
1379
1380
  	.owner = THIS_MODULE,
  };