Blame view

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

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

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

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

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

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

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
230
231
232
  /**
   * gfs2_read_sb - Read super block
   * @sdp: The GFS2 superblock
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
233
234
235
   * @silent: Don't print message if mount fails
   *
   */
6bac243f0   Steven Whitehouse   GFS2: Clean up of...
236
  static int gfs2_read_sb(struct gfs2_sbd *sdp, int silent)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
237
238
239
240
241
  {
  	u32 hash_blocks, ind_blocks, leaf_blocks;
  	u32 tmp_blocks;
  	unsigned int x;
  	int error;
32e471ef1   Steven Whitehouse   GFS2: Use UUID fi...
242
  	error = gfs2_read_super(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift, silent);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
243
244
245
246
247
248
  	if (error) {
  		if (!silent)
  			fs_err(sdp, "can't read superblock
  ");
  		return error;
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
249
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
  	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...
319
320
  static int init_names(struct gfs2_sbd *sdp, int silent)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
321
322
323
324
325
326
327
328
329
  	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...
330
  		error = gfs2_read_super(sdp, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift, silent);
bb8d8a6f5   Steven Whitehouse   [GFS2] Fix sign p...
331
332
  		if (error)
  			return error;
3cf1e7bed   Steven Whitehouse   [GFS2] Remove dup...
333

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

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

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

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

9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
475
476
477
478
479
480
481
482
  	/* 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...
483
  out:
b3b94faa5   David Teigland   [GFS2] The core o...
484
  	gfs2_glock_dq_uninit(&sb_gh);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
485
  	return ret;
b3b94faa5   David Teigland   [GFS2] The core o...
486
  }
da6dd40d5   Bob Peterson   [GFS2] Journal ex...
487
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
  /**
   * 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...
513
  	prev_db = 0;
a2e0f7993   Steven Whitehouse   GFS2: Remove i_di...
514
  	for (lb = 0; lb < i_size_read(jd->jd_inode) >> sdp->sd_sb.sb_bsize_shift; lb++) {
da6dd40d5   Bob Peterson   [GFS2] Journal ex...
515
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
  		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_...
547
  static void gfs2_others_may_mount(struct gfs2_sbd *sdp)
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
548
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
549
550
551
552
553
  	char *message = "FIRSTMOUNT=Done";
  	char *envp[] = { message, NULL };
  	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
  	ls->ls_first_done = 1;
  	kobject_uevent_env(&sdp->sd_kobj, KOBJ_CHANGE, envp);
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
554
  }
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
555
556
557
558
559
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
  /**
   * 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...
600
  		INIT_WORK(&jd->jd_work, gfs2_recover_func);
b52896813   Steven Whitehouse   GFS2: Fix bug in ...
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
  		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...
621
622
  static int init_journal(struct gfs2_sbd *sdp, int undo)
  {
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
623
  	struct inode *master = sdp->sd_master_dir->d_inode;
b3b94faa5   David Teigland   [GFS2] The core o...
624
  	struct gfs2_holder ji_gh;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
625
  	struct gfs2_inode *ip;
b3b94faa5   David Teigland   [GFS2] The core o...
626
627
628
629
630
  	int jindex = 1;
  	int error = 0;
  
  	if (undo) {
  		jindex = 0;
fe64d517d   Steven Whitehouse   GFS2: Umount reco...
631
  		goto fail_jinode_gh;
b3b94faa5   David Teigland   [GFS2] The core o...
632
  	}
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
633
  	sdp->sd_jindex = gfs2_lookup_simple(master, "jindex");
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
634
  	if (IS_ERR(sdp->sd_jindex)) {
b3b94faa5   David Teigland   [GFS2] The core o...
635
636
  		fs_err(sdp, "can't lookup journal index: %d
  ", error);
c752666c1   Steven Whitehouse   [GFS2] Fix bug in...
637
  		return PTR_ERR(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
638
  	}
feaa7bba0   Steven Whitehouse   [GFS2] Fix unlink...
639
  	ip = GFS2_I(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
640
641
642
643
644
645
646
647
648
  
  	/* 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
649
  	error = -EUSERS;
b3b94faa5   David Teigland   [GFS2] The core o...
650
651
652
  	if (!gfs2_jindex_size(sdp)) {
  		fs_err(sdp, "no journals!
  ");
907b9bceb   Steven Whitehouse   [GFS2/DLM] Fix tr...
653
  		goto fail_jindex;
b3b94faa5   David Teigland   [GFS2] The core o...
654
655
656
657
  	}
  
  	if (sdp->sd_args.ar_spectator) {
  		sdp->sd_jdesc = gfs2_jdesc_find(sdp, 0);
fd041f0b4   Steven Whitehouse   [GFS2] Use atomic...
658
  		atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
659
660
  		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...
661
662
663
664
665
666
667
668
669
670
671
672
  	} 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...
673
  		error = gfs2_glock_nq_num(sdp, sdp->sd_lockstruct.ls_jid,
b3b94faa5   David Teigland   [GFS2] The core o...
674
675
676
677
678
679
680
681
  					  &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...
682
683
  		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...
684
  					   LM_FLAG_NOEXP | GL_EXACT | GL_NOCACHE,
b3b94faa5   David Teigland   [GFS2] The core o...
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
  					   &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...
700
  		atomic_set(&sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks);
5e687eac1   Benjamin Marzinski   GFS2: Various gfs...
701
702
  		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...
703
704
705
  
  		/* Map the extents for this journal's blocks */
  		map_journal_extents(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
706
  	}
63997775b   Steven Whitehouse   GFS2: Add tracepo...
707
  	trace_gfs2_log_blocks(sdp, atomic_read(&sdp->sd_log_blks_free));
b3b94faa5   David Teigland   [GFS2] The core o...
708
709
710
711
  
  	if (sdp->sd_lockstruct.ls_first) {
  		unsigned int x;
  		for (x = 0; x < sdp->sd_journals; x++) {
6ecd7c2dd   Tejun Heo   gfs2: use workque...
712
713
  			error = gfs2_recover_journal(gfs2_jdesc_find(sdp, x),
  						     true);
b3b94faa5   David Teigland   [GFS2] The core o...
714
715
716
717
718
719
720
  			if (error) {
  				fs_err(sdp, "error recovering journal %u: %d
  ",
  				       x, error);
  				goto fail_jinode_gh;
  			}
  		}
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
721
  		gfs2_others_may_mount(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
722
  	} else if (!sdp->sd_args.ar_spectator) {
6ecd7c2dd   Tejun Heo   gfs2: use workque...
723
  		error = gfs2_recover_journal(sdp->sd_jdesc, true);
b3b94faa5   David Teigland   [GFS2] The core o...
724
725
726
727
728
729
730
731
732
733
  		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...
734
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
735
  fail_jinode_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
736
737
  	if (!sdp->sd_args.ar_spectator)
  		gfs2_glock_dq_uninit(&sdp->sd_jinode_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
738
  fail_journal_gh:
b3b94faa5   David Teigland   [GFS2] The core o...
739
740
  	if (!sdp->sd_args.ar_spectator)
  		gfs2_glock_dq_uninit(&sdp->sd_journal_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
741
  fail_jindex:
b3b94faa5   David Teigland   [GFS2] The core o...
742
743
744
  	gfs2_jindex_free(sdp);
  	if (jindex)
  		gfs2_glock_dq_uninit(&ji_gh);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
745
  fail:
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
746
  	iput(sdp->sd_jindex);
b3b94faa5   David Teigland   [GFS2] The core o...
747
748
  	return error;
  }
b3b94faa5   David Teigland   [GFS2] The core o...
749
750
751
  
  static int init_inodes(struct gfs2_sbd *sdp, int undo)
  {
b3b94faa5   David Teigland   [GFS2] The core o...
752
  	int error = 0;
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
753
  	struct gfs2_inode *ip;
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
754
  	struct inode *master = sdp->sd_master_dir->d_inode;
b3b94faa5   David Teigland   [GFS2] The core o...
755
756
  
  	if (undo)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
757
  		goto fail_qinode;
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
758
759
  	error = init_journal(sdp, undo);
  	if (error)
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
760
  		goto fail;
b3b94faa5   David Teigland   [GFS2] The core o...
761

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

b3b94faa5   David Teigland   [GFS2] The core o...
882
883
884
885
886
887
888
889
  	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...
890
891
892
893
894
895
896
897
  	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...
898
  	return 0;
b3b94faa5   David Teigland   [GFS2] The core o...
899

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

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

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
938
939
940
  	if (!strcmp("lock_nolock", proto)) {
  		lm = &nolock_ops;
  		sdp->sd_args.ar_localflocks = 1;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
941
942
943
944
945
946
947
948
949
  #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....
950
951
952
  
  	fs_info(sdp, "Trying to join cluster \"%s\", \"%s\"
  ", proto, table);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
953
954
  	ls->ls_ops = lm;
  	ls->ls_first = 1;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
955

f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
956
957
958
959
960
961
962
963
964
965
966
967
968
  	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...
969
970
  			if (test_and_clear_bit(SDF_NOJOURNALID, &sdp->sd_flags))
  				ls->ls_jid = option;
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
971
972
  			break;
  		case Opt_id:
2b88f7c53   Steven Whitehouse   GFS2: Remove unus...
973
  			/* Obsolete, but left for backward compat purposes */
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
  			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....
994
995
996
997
998
999
1000
  	}
  
  	if (sdp->sd_args.ar_spectator)
  		snprintf(sdp->sd_fsname, GFS2_FSNAME_LEN, "%s.s", table);
  	else
  		snprintf(sdp->sd_fsname, GFS2_FSNAME_LEN, "%s.%u", table,
  			 sdp->sd_lockstruct.ls_jid);
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
1001
1002
1003
1004
1005
1006
1007
  	fsname = strchr(table, ':');
  	if (fsname)
  		fsname++;
  	if (lm->lm_mount == NULL) {
  		fs_info(sdp, "Now mounting FS...
  ");
  		return 0;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
1008
  	}
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
1009
1010
1011
1012
1013
  	ret = lm->lm_mount(sdp, fsname);
  	if (ret == 0)
  		fs_info(sdp, "Joined cluster. Now mounting FS...
  ");
  	return ret;
da755fdb4   Steven Whitehouse   [GFS2] Remove lm....
1014
1015
1016
1017
  }
  
  void gfs2_lm_unmount(struct gfs2_sbd *sdp)
  {
f057f6cdf   Steven Whitehouse   GFS2: Merge lock_...
1018
1019
1020
1021
  	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....
1022
  }
b3b94faa5   David Teigland   [GFS2] The core o...
1023

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
  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...
1034
1035
1036
1037
1038
  	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 ...
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
  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...
1049
1050
1051
1052
1053
1054
1055
1056
  /**
   * 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...
1057
  static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent)
b3b94faa5   David Teigland   [GFS2] The core o...
1058
1059
1060
1061
1062
1063
1064
  {
  	struct gfs2_sbd *sdp;
  	struct gfs2_holder mount_gh;
  	int error;
  
  	sdp = init_sbd(sb);
  	if (!sdp) {
d92a8d480   Steven Whitehouse   [GFS2] Audit prin...
1065
1066
  		printk(KERN_WARNING "GFS2: can't alloc struct gfs2_sbd
  ");
b3b94faa5   David Teigland   [GFS2] The core o...
1067
1068
  		return -ENOMEM;
  	}
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1069
  	sdp->sd_args = *args;
b3b94faa5   David Teigland   [GFS2] The core o...
1070

fe64d517d   Steven Whitehouse   GFS2: Umount reco...
1071
  	if (sdp->sd_args.ar_spectator) {
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1072
                  sb->s_flags |= MS_RDONLY;
fe64d517d   Steven Whitehouse   GFS2: Umount reco...
1073
1074
  		set_bit(SDF_NORECOVERY, &sdp->sd_flags);
  	}
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1075
1076
  	if (sdp->sd_args.ar_posix_acl)
  		sb->s_flags |= MS_POSIXACL;
f25934c5f   Christoph Hellwig   GFS2: add barrier...
1077
1078
  	if (sdp->sd_args.ar_nobarrier)
  		set_bit(SDF_NOBARRIERS, &sdp->sd_flags);
6f04c1c7f   Steven Whitehouse   GFS2: Fix remount...
1079

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

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

b3b94faa5   David Teigland   [GFS2] The core o...
1108
1109
1110
  	error = init_names(sdp, silent);
  	if (error)
  		goto fail;
7c52b166c   Robert Peterson   [GFS2] Add gfs2_t...
1111
  	gfs2_create_debugfs_file(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
  	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 ...
1123
  	error = init_sb(sdp, silent);
b3b94faa5   David Teigland   [GFS2] The core o...
1124
1125
  	if (error)
  		goto fail_locking;
b3b94faa5   David Teigland   [GFS2] The core o...
1126

ba6e93645   Steven Whitehouse   GFS2: Wait for jo...
1127
1128
1129
  	error = wait_on_journal(sdp);
  	if (error)
  		goto fail_sb;
feb47ca93   Steven Whitehouse   GFS2: Improve jou...
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
  	/*
  	 * 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;
  	}
b3b94faa5   David Teigland   [GFS2] The core o...
1143
1144
  	error = init_inodes(sdp, DO);
  	if (error)
f42faf4fa   Steven Whitehouse   [GFS2] Add gfs2_i...
1145
  		goto fail_sb;
b3b94faa5   David Teigland   [GFS2] The core o...
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
  
  	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 ...
1172
  	gfs2_online_uevent(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1173
  	return 0;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1174
  fail_threads:
b3b94faa5   David Teigland   [GFS2] The core o...
1175
  	init_threads(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1176
  fail_per_node:
b3b94faa5   David Teigland   [GFS2] The core o...
1177
  	init_per_node(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1178
  fail_inodes:
b3b94faa5   David Teigland   [GFS2] The core o...
1179
  	init_inodes(sdp, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1180
  fail_sb:
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1181
1182
1183
1184
  	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...
1185
1186
  	if (sb->s_root)
  		dput(sb->s_root);
9b8df98fc   Steven Whitehouse   GFS2: Fix metafs ...
1187
  	sb->s_root = NULL;
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1188
  fail_locking:
b3b94faa5   David Teigland   [GFS2] The core o...
1189
  	init_locking(sdp, &mount_gh, UNDO);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1190
  fail_lm:
fefc03bfe   Steven Whitehouse   Revert "GFS2: Fix...
1191
  	gfs2_gl_hash_clear(sdp);
b3b94faa5   David Teigland   [GFS2] The core o...
1192
  	gfs2_lm_unmount(sdp);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1193
  fail_sys:
b3b94faa5   David Teigland   [GFS2] The core o...
1194
  	gfs2_sys_fs_del(sdp);
a91ea69ff   Steven Whitehouse   [GFS2] Align all ...
1195
  fail:
5f8820960   Robert Peterson   [GFS2] lockdump i...
1196
  	gfs2_delete_debugfs_file(sdp);
a2c458079   Steven Whitehouse   [GFS2] vfree shou...
1197
  	kfree(sdp);
5c676f6d3   Steven Whitehouse   [GFS2] Macros rem...
1198
  	sb->s_fs_info = NULL;
b3b94faa5   David Teigland   [GFS2] The core o...
1199
1200
  	return error;
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1201
  static int set_gfs2_super(struct super_block *s, void *data)
b3b94faa5   David Teigland   [GFS2] The core o...
1202
  {
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1203
1204
1205
1206
1207
1208
1209
1210
1211
  	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...
1212
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1213
  static int test_gfs2_super(struct super_block *s, void *ptr)
f6d03139d   Steven Whitehouse   GFS2: Fix locking...
1214
1215
1216
1217
  {
  	struct block_device *bdev = ptr;
  	return (bdev == s->s_bdev);
  }
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1218
  /**
8bcbbf000   Al Viro   convert gfs2
1219
   * gfs2_mount - Get the GFS2 superblock
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1220
1221
1222
1223
   * @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...
1224
1225
1226
1227
1228
1229
1230
   *
   * 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
1231
1232
  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...
1233
1234
1235
  {
  	struct block_device *bdev;
  	struct super_block *s;
d4d776299   Tejun Heo   block: clean up b...
1236
  	fmode_t mode = FMODE_READ | FMODE_EXCL;
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1237
1238
1239
1240
1241
1242
  	int error;
  	struct gfs2_args args;
  	struct gfs2_sbd *sdp;
  
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
d4d776299   Tejun Heo   block: clean up b...
1243
  	bdev = blkdev_get_by_path(dev_name, mode, fs_type);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1244
  	if (IS_ERR(bdev))
8bcbbf000   Al Viro   convert gfs2
1245
  		return ERR_CAST(bdev);
f55073ff1   Steven Whitehouse   GFS2: Fix -o meta...
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
  
  	/*
  	 * 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
1263
  	if (s->s_root)
d4d776299   Tejun Heo   block: clean up b...
1264
  		blkdev_put(bdev, mode);
8bcbbf000   Al Viro   convert gfs2
1265

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

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