blob: f5140bdc1027b4a35786f3a67eba2f9b4119aef1 [file] [log] [blame]
David Teiglandb3b94fa2006-01-16 16:50:04 +00001/*
2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
Steven Whitehouse3a8a9a12006-05-18 15:09:15 -04003 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
David Teiglandb3b94fa2006-01-16 16:50:04 +00004 *
5 * This copyrighted material is made available to anyone wishing to use,
6 * modify, copy, or redistribute it subject to the terms and conditions
Steven Whitehousee9fc2aa2006-09-01 11:05:15 -04007 * of the GNU General Public License version 2.
David Teiglandb3b94fa2006-01-16 16:50:04 +00008 */
9
10#include <linux/sched.h>
11#include <linux/slab.h>
12#include <linux/spinlock.h>
13#include <linux/completion.h>
14#include <linux/buffer_head.h>
15#include <linux/vmalloc.h>
16#include <linux/blkdev.h>
17#include <linux/kthread.h>
Abhijith Das86384602006-08-25 11:13:37 -050018#include <linux/namei.h>
19#include <linux/mount.h>
Steven Whitehouse5c676f62006-02-27 17:23:27 -050020#include <linux/gfs2_ondisk.h>
David Teiglandb3b94fa2006-01-16 16:50:04 +000021
22#include "gfs2.h"
Steven Whitehouse5c676f62006-02-27 17:23:27 -050023#include "lm_interface.h"
24#include "incore.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000025#include "daemon.h"
26#include "glock.h"
27#include "glops.h"
28#include "inode.h"
29#include "lm.h"
30#include "mount.h"
31#include "ops_export.h"
32#include "ops_fstype.h"
33#include "ops_super.h"
34#include "recovery.h"
35#include "rgrp.h"
36#include "super.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000037#include "sys.h"
Steven Whitehouse5c676f62006-02-27 17:23:27 -050038#include "util.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000039
40#define DO 0
41#define UNDO 1
42
Robert S Peterson5bb76af2006-05-05 16:29:50 -040043extern struct dentry_operations gfs2_dops;
44
David Teiglandb3b94fa2006-01-16 16:50:04 +000045static struct gfs2_sbd *init_sbd(struct super_block *sb)
46{
47 struct gfs2_sbd *sdp;
David Teiglandb3b94fa2006-01-16 16:50:04 +000048
Steven Whitehouse85d1da62006-09-07 14:40:21 -040049 sdp = kzalloc(sizeof(struct gfs2_sbd), GFP_KERNEL);
David Teiglandb3b94fa2006-01-16 16:50:04 +000050 if (!sdp)
51 return NULL;
52
Steven Whitehouse5c676f62006-02-27 17:23:27 -050053 sb->s_fs_info = sdp;
David Teiglandb3b94fa2006-01-16 16:50:04 +000054 sdp->sd_vfs = sb;
55
56 gfs2_tune_init(&sdp->sd_tune);
57
David Teiglandb3b94fa2006-01-16 16:50:04 +000058 INIT_LIST_HEAD(&sdp->sd_reclaim_list);
59 spin_lock_init(&sdp->sd_reclaim_lock);
60 init_waitqueue_head(&sdp->sd_reclaim_wq);
David Teiglandb3b94fa2006-01-16 16:50:04 +000061
Steven Whitehousef55ab262006-02-21 12:51:39 +000062 mutex_init(&sdp->sd_inum_mutex);
David Teiglandb3b94fa2006-01-16 16:50:04 +000063 spin_lock_init(&sdp->sd_statfs_spin);
Steven Whitehousef55ab262006-02-21 12:51:39 +000064 mutex_init(&sdp->sd_statfs_mutex);
David Teiglandb3b94fa2006-01-16 16:50:04 +000065
66 spin_lock_init(&sdp->sd_rindex_spin);
Steven Whitehousef55ab262006-02-21 12:51:39 +000067 mutex_init(&sdp->sd_rindex_mutex);
David Teiglandb3b94fa2006-01-16 16:50:04 +000068 INIT_LIST_HEAD(&sdp->sd_rindex_list);
69 INIT_LIST_HEAD(&sdp->sd_rindex_mru_list);
70 INIT_LIST_HEAD(&sdp->sd_rindex_recent_list);
71
72 INIT_LIST_HEAD(&sdp->sd_jindex_list);
73 spin_lock_init(&sdp->sd_jindex_spin);
Steven Whitehousef55ab262006-02-21 12:51:39 +000074 mutex_init(&sdp->sd_jindex_mutex);
David Teiglandb3b94fa2006-01-16 16:50:04 +000075
David Teiglandb3b94fa2006-01-16 16:50:04 +000076 INIT_LIST_HEAD(&sdp->sd_quota_list);
77 spin_lock_init(&sdp->sd_quota_spin);
Steven Whitehousef55ab262006-02-21 12:51:39 +000078 mutex_init(&sdp->sd_quota_mutex);
David Teiglandb3b94fa2006-01-16 16:50:04 +000079
80 spin_lock_init(&sdp->sd_log_lock);
David Teiglandb3b94fa2006-01-16 16:50:04 +000081
82 INIT_LIST_HEAD(&sdp->sd_log_le_gl);
83 INIT_LIST_HEAD(&sdp->sd_log_le_buf);
84 INIT_LIST_HEAD(&sdp->sd_log_le_revoke);
85 INIT_LIST_HEAD(&sdp->sd_log_le_rg);
86 INIT_LIST_HEAD(&sdp->sd_log_le_databuf);
87
Steven Whitehouse71b86f52006-03-28 14:14:04 -050088 mutex_init(&sdp->sd_log_reserve_mutex);
David Teiglandb3b94fa2006-01-16 16:50:04 +000089 INIT_LIST_HEAD(&sdp->sd_ail1_list);
90 INIT_LIST_HEAD(&sdp->sd_ail2_list);
91
Steven Whitehouse484adff2006-03-29 09:12:12 -050092 init_rwsem(&sdp->sd_log_flush_lock);
David Teiglandb3b94fa2006-01-16 16:50:04 +000093 INIT_LIST_HEAD(&sdp->sd_log_flush_list);
94
95 INIT_LIST_HEAD(&sdp->sd_revoke_list);
96
Steven Whitehousef55ab262006-02-21 12:51:39 +000097 mutex_init(&sdp->sd_freeze_lock);
David Teiglandb3b94fa2006-01-16 16:50:04 +000098
99 return sdp;
100}
101
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500102static void init_vfs(struct super_block *sb, unsigned noatime)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000103{
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500104 struct gfs2_sbd *sdp = sb->s_fs_info;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000105
106 sb->s_magic = GFS2_MAGIC;
107 sb->s_op = &gfs2_super_ops;
108 sb->s_export_op = &gfs2_export_ops;
109 sb->s_maxbytes = MAX_LFS_FILESIZE;
110
111 if (sb->s_flags & (MS_NOATIME | MS_NODIRATIME))
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500112 set_bit(noatime, &sdp->sd_flags);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000113
114 /* Don't let the VFS update atimes. GFS2 handles this itself. */
115 sb->s_flags |= MS_NOATIME | MS_NODIRATIME;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000116}
117
118static int init_names(struct gfs2_sbd *sdp, int silent)
119{
120 struct gfs2_sb *sb = NULL;
121 char *proto, *table;
122 int error = 0;
123
124 proto = sdp->sd_args.ar_lockproto;
125 table = sdp->sd_args.ar_locktable;
126
127 /* Try to autodetect */
128
129 if (!proto[0] || !table[0]) {
130 struct buffer_head *bh;
131 bh = sb_getblk(sdp->sd_vfs,
132 GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift);
133 lock_buffer(bh);
134 clear_buffer_uptodate(bh);
135 clear_buffer_dirty(bh);
136 unlock_buffer(bh);
137 ll_rw_block(READ, 1, &bh);
138 wait_on_buffer(bh);
139
140 if (!buffer_uptodate(bh)) {
141 brelse(bh);
142 return -EIO;
143 }
144
145 sb = kmalloc(sizeof(struct gfs2_sb), GFP_KERNEL);
146 if (!sb) {
147 brelse(bh);
148 return -ENOMEM;
149 }
150 gfs2_sb_in(sb, bh->b_data);
151 brelse(bh);
152
153 error = gfs2_check_sb(sdp, sb, silent);
154 if (error)
155 goto out;
156
157 if (!proto[0])
158 proto = sb->sb_lockproto;
159 if (!table[0])
160 table = sb->sb_locktable;
161 }
162
163 if (!table[0])
164 table = sdp->sd_vfs->s_id;
165
166 snprintf(sdp->sd_proto_name, GFS2_FSNAME_LEN, "%s", proto);
167 snprintf(sdp->sd_table_name, GFS2_FSNAME_LEN, "%s", table);
168
Steven Whitehousea91ea692006-09-04 12:04:26 -0400169out:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000170 kfree(sb);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000171 return error;
172}
173
174static int init_locking(struct gfs2_sbd *sdp, struct gfs2_holder *mount_gh,
175 int undo)
176{
177 struct task_struct *p;
178 int error = 0;
179
180 if (undo)
181 goto fail_trans;
182
183 p = kthread_run(gfs2_scand, sdp, "gfs2_scand");
184 error = IS_ERR(p);
185 if (error) {
186 fs_err(sdp, "can't start scand thread: %d\n", error);
187 return error;
188 }
189 sdp->sd_scand_process = p;
190
191 for (sdp->sd_glockd_num = 0;
192 sdp->sd_glockd_num < sdp->sd_args.ar_num_glockd;
193 sdp->sd_glockd_num++) {
194 p = kthread_run(gfs2_glockd, sdp, "gfs2_glockd");
195 error = IS_ERR(p);
196 if (error) {
197 fs_err(sdp, "can't start glockd thread: %d\n", error);
198 goto fail;
199 }
200 sdp->sd_glockd_process[sdp->sd_glockd_num] = p;
201 }
202
203 error = gfs2_glock_nq_num(sdp,
204 GFS2_MOUNT_LOCK, &gfs2_nondisk_glops,
205 LM_ST_EXCLUSIVE, LM_FLAG_NOEXP | GL_NOCACHE,
206 mount_gh);
207 if (error) {
208 fs_err(sdp, "can't acquire mount glock: %d\n", error);
209 goto fail;
210 }
211
212 error = gfs2_glock_nq_num(sdp,
213 GFS2_LIVE_LOCK, &gfs2_nondisk_glops,
214 LM_ST_SHARED,
Steven Whitehouse579b78a2006-04-26 14:58:26 -0400215 LM_FLAG_NOEXP | GL_EXACT,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000216 &sdp->sd_live_gh);
217 if (error) {
218 fs_err(sdp, "can't acquire live glock: %d\n", error);
219 goto fail_mount;
220 }
221
222 error = gfs2_glock_get(sdp, GFS2_RENAME_LOCK, &gfs2_nondisk_glops,
223 CREATE, &sdp->sd_rename_gl);
224 if (error) {
225 fs_err(sdp, "can't create rename glock: %d\n", error);
226 goto fail_live;
227 }
228
229 error = gfs2_glock_get(sdp, GFS2_TRANS_LOCK, &gfs2_trans_glops,
230 CREATE, &sdp->sd_trans_gl);
231 if (error) {
232 fs_err(sdp, "can't create transaction glock: %d\n", error);
233 goto fail_rename;
234 }
235 set_bit(GLF_STICKY, &sdp->sd_trans_gl->gl_flags);
236
237 return 0;
238
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400239fail_trans:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000240 gfs2_glock_put(sdp->sd_trans_gl);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400241fail_rename:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000242 gfs2_glock_put(sdp->sd_rename_gl);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400243fail_live:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000244 gfs2_glock_dq_uninit(&sdp->sd_live_gh);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400245fail_mount:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000246 gfs2_glock_dq_uninit(mount_gh);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400247fail:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000248 while (sdp->sd_glockd_num--)
249 kthread_stop(sdp->sd_glockd_process[sdp->sd_glockd_num]);
250
251 kthread_stop(sdp->sd_scand_process);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000252 return error;
253}
254
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400255static struct inode *gfs2_lookup_root(struct super_block *sb,
256 struct gfs2_inum *inum)
Steven Whitehousef42faf42006-01-30 18:34:10 +0000257{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400258 return gfs2_inode_lookup(sb, inum, DT_DIR);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000259}
260
David Teiglandb3b94fa2006-01-16 16:50:04 +0000261static int init_sb(struct gfs2_sbd *sdp, int silent, int undo)
262{
263 struct super_block *sb = sdp->sd_vfs;
264 struct gfs2_holder sb_gh;
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500265 struct gfs2_inum *inum;
Steven Whitehousef42faf42006-01-30 18:34:10 +0000266 struct inode *inode;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000267 int error = 0;
268
269 if (undo) {
Russell Cattelan88721872006-08-10 11:08:40 -0500270 if (sb->s_root) {
271 dput(sb->s_root);
272 sb->s_root = NULL;
273 }
David Teiglandb3b94fa2006-01-16 16:50:04 +0000274 return 0;
275 }
276
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400277 error = gfs2_glock_nq_num(sdp, GFS2_SB_LOCK, &gfs2_meta_glops,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000278 LM_ST_SHARED, 0, &sb_gh);
279 if (error) {
280 fs_err(sdp, "can't acquire superblock glock: %d\n", error);
281 return error;
282 }
283
284 error = gfs2_read_sb(sdp, sb_gh.gh_gl, silent);
285 if (error) {
286 fs_err(sdp, "can't read superblock: %d\n", error);
287 goto out;
288 }
289
290 /* Set up the buffer cache and SB for real */
David Teiglandb3b94fa2006-01-16 16:50:04 +0000291 if (sdp->sd_sb.sb_bsize < bdev_hardsect_size(sb->s_bdev)) {
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500292 error = -EINVAL;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000293 fs_err(sdp, "FS block size (%u) is too small for device "
294 "block size (%u)\n",
295 sdp->sd_sb.sb_bsize, bdev_hardsect_size(sb->s_bdev));
296 goto out;
297 }
298 if (sdp->sd_sb.sb_bsize > PAGE_SIZE) {
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500299 error = -EINVAL;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000300 fs_err(sdp, "FS block size (%u) is too big for machine "
301 "page size (%u)\n",
302 sdp->sd_sb.sb_bsize, (unsigned int)PAGE_SIZE);
303 goto out;
304 }
David Teiglandb3b94fa2006-01-16 16:50:04 +0000305 sb_set_blocksize(sb, sdp->sd_sb.sb_bsize);
306
Steven Whitehousef42faf42006-01-30 18:34:10 +0000307 /* Get the root inode */
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500308 inum = &sdp->sd_sb.sb_root_dir;
309 if (sb->s_type == &gfs2meta_fs_type)
310 inum = &sdp->sd_sb.sb_master_dir;
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400311 inode = gfs2_lookup_root(sb, inum);
Steven Whitehousec9fd4302006-03-01 15:31:02 -0500312 if (IS_ERR(inode)) {
313 error = PTR_ERR(inode);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000314 fs_err(sdp, "can't read in root inode: %d\n", error);
315 goto out;
316 }
David Teiglandb3b94fa2006-01-16 16:50:04 +0000317
Steven Whitehousef42faf42006-01-30 18:34:10 +0000318 sb->s_root = d_alloc_root(inode);
319 if (!sb->s_root) {
320 fs_err(sdp, "can't get root dentry\n");
321 error = -ENOMEM;
Steven Whitehousec9fd4302006-03-01 15:31:02 -0500322 iput(inode);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000323 }
Robert S Peterson5bb76af2006-05-05 16:29:50 -0400324 sb->s_root->d_op = &gfs2_dops;
Steven Whitehousef42faf42006-01-30 18:34:10 +0000325out:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000326 gfs2_glock_dq_uninit(&sb_gh);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000327 return error;
328}
329
330static int init_journal(struct gfs2_sbd *sdp, int undo)
331{
332 struct gfs2_holder ji_gh;
333 struct task_struct *p;
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500334 struct gfs2_inode *ip;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000335 int jindex = 1;
336 int error = 0;
337
338 if (undo) {
339 jindex = 0;
340 goto fail_recoverd;
341 }
342
Steven Whitehousec7526662006-03-20 12:30:04 -0500343 sdp->sd_jindex = gfs2_lookup_simple(sdp->sd_master_dir, "jindex");
344 if (IS_ERR(sdp->sd_jindex)) {
David Teiglandb3b94fa2006-01-16 16:50:04 +0000345 fs_err(sdp, "can't lookup journal index: %d\n", error);
Steven Whitehousec7526662006-03-20 12:30:04 -0500346 return PTR_ERR(sdp->sd_jindex);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000347 }
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400348 ip = GFS2_I(sdp->sd_jindex);
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500349 set_bit(GLF_STICKY, &ip->i_gl->gl_flags);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000350
351 /* Load in the journal index special file */
352
353 error = gfs2_jindex_hold(sdp, &ji_gh);
354 if (error) {
355 fs_err(sdp, "can't read journal index: %d\n", error);
356 goto fail;
357 }
358
359 error = -EINVAL;
360 if (!gfs2_jindex_size(sdp)) {
361 fs_err(sdp, "no journals!\n");
362 goto fail_jindex;
363 }
364
365 if (sdp->sd_args.ar_spectator) {
366 sdp->sd_jdesc = gfs2_jdesc_find(sdp, 0);
367 sdp->sd_log_blks_free = sdp->sd_jdesc->jd_blocks;
368 } else {
369 if (sdp->sd_lockstruct.ls_jid >= gfs2_jindex_size(sdp)) {
370 fs_err(sdp, "can't mount journal #%u\n",
371 sdp->sd_lockstruct.ls_jid);
372 fs_err(sdp, "there are only %u journals (0 - %u)\n",
373 gfs2_jindex_size(sdp),
374 gfs2_jindex_size(sdp) - 1);
375 goto fail_jindex;
376 }
377 sdp->sd_jdesc = gfs2_jdesc_find(sdp, sdp->sd_lockstruct.ls_jid);
378
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400379 error = gfs2_glock_nq_num(sdp, sdp->sd_lockstruct.ls_jid,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000380 &gfs2_journal_glops,
381 LM_ST_EXCLUSIVE, LM_FLAG_NOEXP,
382 &sdp->sd_journal_gh);
383 if (error) {
384 fs_err(sdp, "can't acquire journal glock: %d\n", error);
385 goto fail_jindex;
386 }
387
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400388 ip = GFS2_I(sdp->sd_jdesc->jd_inode);
389 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000390 LM_FLAG_NOEXP | GL_EXACT,
391 &sdp->sd_jinode_gh);
392 if (error) {
393 fs_err(sdp, "can't acquire journal inode glock: %d\n",
394 error);
395 goto fail_journal_gh;
396 }
397
398 error = gfs2_jdesc_check(sdp->sd_jdesc);
399 if (error) {
400 fs_err(sdp, "my journal (%u) is bad: %d\n",
401 sdp->sd_jdesc->jd_jid, error);
402 goto fail_jinode_gh;
403 }
404 sdp->sd_log_blks_free = sdp->sd_jdesc->jd_blocks;
405 }
406
407 if (sdp->sd_lockstruct.ls_first) {
408 unsigned int x;
409 for (x = 0; x < sdp->sd_journals; x++) {
David Teiglandc63e31c2006-04-20 17:03:48 -0400410 error = gfs2_recover_journal(gfs2_jdesc_find(sdp, x));
David Teiglandb3b94fa2006-01-16 16:50:04 +0000411 if (error) {
412 fs_err(sdp, "error recovering journal %u: %d\n",
413 x, error);
414 goto fail_jinode_gh;
415 }
416 }
417
418 gfs2_lm_others_may_mount(sdp);
419 } else if (!sdp->sd_args.ar_spectator) {
David Teiglandc63e31c2006-04-20 17:03:48 -0400420 error = gfs2_recover_journal(sdp->sd_jdesc);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000421 if (error) {
422 fs_err(sdp, "error recovering my journal: %d\n", error);
423 goto fail_jinode_gh;
424 }
425 }
426
427 set_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags);
428 gfs2_glock_dq_uninit(&ji_gh);
429 jindex = 0;
430
David Teiglandb3b94fa2006-01-16 16:50:04 +0000431 p = kthread_run(gfs2_recoverd, sdp, "gfs2_recoverd");
432 error = IS_ERR(p);
433 if (error) {
434 fs_err(sdp, "can't start recoverd thread: %d\n", error);
435 goto fail_jinode_gh;
436 }
437 sdp->sd_recoverd_process = p;
438
439 return 0;
440
Steven Whitehousea91ea692006-09-04 12:04:26 -0400441fail_recoverd:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000442 kthread_stop(sdp->sd_recoverd_process);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400443fail_jinode_gh:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000444 if (!sdp->sd_args.ar_spectator)
445 gfs2_glock_dq_uninit(&sdp->sd_jinode_gh);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400446fail_journal_gh:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000447 if (!sdp->sd_args.ar_spectator)
448 gfs2_glock_dq_uninit(&sdp->sd_journal_gh);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400449fail_jindex:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000450 gfs2_jindex_free(sdp);
451 if (jindex)
452 gfs2_glock_dq_uninit(&ji_gh);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400453fail:
Steven Whitehousef42faf42006-01-30 18:34:10 +0000454 iput(sdp->sd_jindex);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000455 return error;
456}
457
David Teiglandb3b94fa2006-01-16 16:50:04 +0000458
459static int init_inodes(struct gfs2_sbd *sdp, int undo)
460{
David Teiglandb3b94fa2006-01-16 16:50:04 +0000461 int error = 0;
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500462 struct gfs2_inode *ip;
Steven Whitehousec9fd4302006-03-01 15:31:02 -0500463 struct inode *inode;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000464
465 if (undo)
Steven Whitehousef42faf42006-01-30 18:34:10 +0000466 goto fail_qinode;
467
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400468 inode = gfs2_lookup_root(sdp->sd_vfs, &sdp->sd_sb.sb_master_dir);
Steven Whitehousec9fd4302006-03-01 15:31:02 -0500469 if (IS_ERR(inode)) {
470 error = PTR_ERR(inode);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000471 fs_err(sdp, "can't read in master directory: %d\n", error);
472 goto fail;
473 }
Steven Whitehousec9fd4302006-03-01 15:31:02 -0500474 sdp->sd_master_dir = inode;
Steven Whitehousef42faf42006-01-30 18:34:10 +0000475
476 error = init_journal(sdp, undo);
477 if (error)
478 goto fail_master;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000479
480 /* Read in the master inode number inode */
Steven Whitehousec7526662006-03-20 12:30:04 -0500481 sdp->sd_inum_inode = gfs2_lookup_simple(sdp->sd_master_dir, "inum");
482 if (IS_ERR(sdp->sd_inum_inode)) {
483 error = PTR_ERR(sdp->sd_inum_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000484 fs_err(sdp, "can't read in inum inode: %d\n", error);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000485 goto fail_journal;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000486 }
487
Steven Whitehousef42faf42006-01-30 18:34:10 +0000488
David Teiglandb3b94fa2006-01-16 16:50:04 +0000489 /* Read in the master statfs inode */
Steven Whitehousec7526662006-03-20 12:30:04 -0500490 sdp->sd_statfs_inode = gfs2_lookup_simple(sdp->sd_master_dir, "statfs");
491 if (IS_ERR(sdp->sd_statfs_inode)) {
492 error = PTR_ERR(sdp->sd_statfs_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000493 fs_err(sdp, "can't read in statfs inode: %d\n", error);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000494 goto fail_inum;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000495 }
496
497 /* Read in the resource index inode */
Steven Whitehousec7526662006-03-20 12:30:04 -0500498 sdp->sd_rindex = gfs2_lookup_simple(sdp->sd_master_dir, "rindex");
499 if (IS_ERR(sdp->sd_rindex)) {
500 error = PTR_ERR(sdp->sd_rindex);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000501 fs_err(sdp, "can't get resource index inode: %d\n", error);
502 goto fail_statfs;
503 }
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400504 ip = GFS2_I(sdp->sd_rindex);
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500505 set_bit(GLF_STICKY, &ip->i_gl->gl_flags);
506 sdp->sd_rindex_vn = ip->i_gl->gl_vn - 1;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000507
508 /* Read in the quota inode */
Steven Whitehousec7526662006-03-20 12:30:04 -0500509 sdp->sd_quota_inode = gfs2_lookup_simple(sdp->sd_master_dir, "quota");
510 if (IS_ERR(sdp->sd_quota_inode)) {
511 error = PTR_ERR(sdp->sd_quota_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000512 fs_err(sdp, "can't get quota file inode: %d\n", error);
513 goto fail_rindex;
514 }
David Teiglandb3b94fa2006-01-16 16:50:04 +0000515 return 0;
516
Steven Whitehousef42faf42006-01-30 18:34:10 +0000517fail_qinode:
518 iput(sdp->sd_quota_inode);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000519fail_rindex:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000520 gfs2_clear_rgrpd(sdp);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000521 iput(sdp->sd_rindex);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000522fail_statfs:
523 iput(sdp->sd_statfs_inode);
Steven Whitehousef42faf42006-01-30 18:34:10 +0000524fail_inum:
525 iput(sdp->sd_inum_inode);
526fail_journal:
527 init_journal(sdp, UNDO);
528fail_master:
529 iput(sdp->sd_master_dir);
530fail:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000531 return error;
532}
533
534static int init_per_node(struct gfs2_sbd *sdp, int undo)
535{
Steven Whitehousef42faf42006-01-30 18:34:10 +0000536 struct inode *pn = NULL;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000537 char buf[30];
538 int error = 0;
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500539 struct gfs2_inode *ip;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000540
541 if (sdp->sd_args.ar_spectator)
542 return 0;
543
544 if (undo)
545 goto fail_qc_gh;
546
Steven Whitehousec7526662006-03-20 12:30:04 -0500547 pn = gfs2_lookup_simple(sdp->sd_master_dir, "per_node");
548 if (IS_ERR(pn)) {
549 error = PTR_ERR(pn);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000550 fs_err(sdp, "can't find per_node directory: %d\n", error);
551 return error;
552 }
553
554 sprintf(buf, "inum_range%u", sdp->sd_jdesc->jd_jid);
Steven Whitehousec7526662006-03-20 12:30:04 -0500555 sdp->sd_ir_inode = gfs2_lookup_simple(pn, buf);
556 if (IS_ERR(sdp->sd_ir_inode)) {
557 error = PTR_ERR(sdp->sd_ir_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000558 fs_err(sdp, "can't find local \"ir\" file: %d\n", error);
559 goto fail;
560 }
561
562 sprintf(buf, "statfs_change%u", sdp->sd_jdesc->jd_jid);
Steven Whitehousec7526662006-03-20 12:30:04 -0500563 sdp->sd_sc_inode = gfs2_lookup_simple(pn, buf);
564 if (IS_ERR(sdp->sd_sc_inode)) {
565 error = PTR_ERR(sdp->sd_sc_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000566 fs_err(sdp, "can't find local \"sc\" file: %d\n", error);
567 goto fail_ir_i;
568 }
569
David Teiglandb3b94fa2006-01-16 16:50:04 +0000570 sprintf(buf, "quota_change%u", sdp->sd_jdesc->jd_jid);
Steven Whitehousec7526662006-03-20 12:30:04 -0500571 sdp->sd_qc_inode = gfs2_lookup_simple(pn, buf);
572 if (IS_ERR(sdp->sd_qc_inode)) {
573 error = PTR_ERR(sdp->sd_qc_inode);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000574 fs_err(sdp, "can't find local \"qc\" file: %d\n", error);
575 goto fail_ut_i;
576 }
577
Steven Whitehousef42faf42006-01-30 18:34:10 +0000578 iput(pn);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000579 pn = NULL;
580
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400581 ip = GFS2_I(sdp->sd_ir_inode);
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500582 error = gfs2_glock_nq_init(ip->i_gl,
Steven Whitehouse579b78a2006-04-26 14:58:26 -0400583 LM_ST_EXCLUSIVE, 0,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000584 &sdp->sd_ir_gh);
585 if (error) {
586 fs_err(sdp, "can't lock local \"ir\" file: %d\n", error);
587 goto fail_qc_i;
588 }
589
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400590 ip = GFS2_I(sdp->sd_sc_inode);
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500591 error = gfs2_glock_nq_init(ip->i_gl,
Steven Whitehouse579b78a2006-04-26 14:58:26 -0400592 LM_ST_EXCLUSIVE, 0,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000593 &sdp->sd_sc_gh);
594 if (error) {
595 fs_err(sdp, "can't lock local \"sc\" file: %d\n", error);
596 goto fail_ir_gh;
597 }
598
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400599 ip = GFS2_I(sdp->sd_qc_inode);
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500600 error = gfs2_glock_nq_init(ip->i_gl,
Steven Whitehouse579b78a2006-04-26 14:58:26 -0400601 LM_ST_EXCLUSIVE, 0,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000602 &sdp->sd_qc_gh);
603 if (error) {
604 fs_err(sdp, "can't lock local \"qc\" file: %d\n", error);
605 goto fail_ut_gh;
606 }
607
608 return 0;
609
Steven Whitehousea91ea692006-09-04 12:04:26 -0400610fail_qc_gh:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000611 gfs2_glock_dq_uninit(&sdp->sd_qc_gh);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400612fail_ut_gh:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000613 gfs2_glock_dq_uninit(&sdp->sd_sc_gh);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400614fail_ir_gh:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000615 gfs2_glock_dq_uninit(&sdp->sd_ir_gh);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400616fail_qc_i:
Steven Whitehousef42faf42006-01-30 18:34:10 +0000617 iput(sdp->sd_qc_inode);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400618fail_ut_i:
Steven Whitehousef42faf42006-01-30 18:34:10 +0000619 iput(sdp->sd_sc_inode);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400620fail_ir_i:
Steven Whitehousef42faf42006-01-30 18:34:10 +0000621 iput(sdp->sd_ir_inode);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400622fail:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000623 if (pn)
Steven Whitehousef42faf42006-01-30 18:34:10 +0000624 iput(pn);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000625 return error;
626}
627
628static int init_threads(struct gfs2_sbd *sdp, int undo)
629{
630 struct task_struct *p;
631 int error = 0;
632
633 if (undo)
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400634 goto fail_quotad;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000635
636 sdp->sd_log_flush_time = jiffies;
637 sdp->sd_jindex_refresh_time = jiffies;
638
639 p = kthread_run(gfs2_logd, sdp, "gfs2_logd");
640 error = IS_ERR(p);
641 if (error) {
642 fs_err(sdp, "can't start logd thread: %d\n", error);
643 return error;
644 }
645 sdp->sd_logd_process = p;
646
647 sdp->sd_statfs_sync_time = jiffies;
648 sdp->sd_quota_sync_time = jiffies;
649
650 p = kthread_run(gfs2_quotad, sdp, "gfs2_quotad");
651 error = IS_ERR(p);
652 if (error) {
653 fs_err(sdp, "can't start quotad thread: %d\n", error);
654 goto fail;
655 }
656 sdp->sd_quotad_process = p;
657
David Teiglandb3b94fa2006-01-16 16:50:04 +0000658 return 0;
659
David Teiglandb3b94fa2006-01-16 16:50:04 +0000660
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400661fail_quotad:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000662 kthread_stop(sdp->sd_quotad_process);
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400663fail:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000664 kthread_stop(sdp->sd_logd_process);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000665 return error;
666}
667
668/**
669 * fill_super - Read in superblock
670 * @sb: The VFS superblock
671 * @data: Mount options
672 * @silent: Don't complain if it's not a GFS2 filesystem
673 *
674 * Returns: errno
675 */
676
677static int fill_super(struct super_block *sb, void *data, int silent)
678{
679 struct gfs2_sbd *sdp;
680 struct gfs2_holder mount_gh;
681 int error;
682
683 sdp = init_sbd(sb);
684 if (!sdp) {
Steven Whitehoused92a8d42006-02-27 10:57:14 -0500685 printk(KERN_WARNING "GFS2: can't alloc struct gfs2_sbd\n");
David Teiglandb3b94fa2006-01-16 16:50:04 +0000686 return -ENOMEM;
687 }
688
689 error = gfs2_mount_args(sdp, (char *)data, 0);
690 if (error) {
Steven Whitehoused92a8d42006-02-27 10:57:14 -0500691 printk(KERN_WARNING "GFS2: can't parse mount arguments\n");
David Teiglandb3b94fa2006-01-16 16:50:04 +0000692 goto fail;
693 }
694
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500695 init_vfs(sb, SDF_NOATIME);
696
697 /* Set up the buffer cache and fill in some fake block size values
698 to allow us to read-in the on-disk superblock. */
699 sdp->sd_sb.sb_bsize = sb_min_blocksize(sb, GFS2_BASIC_BLOCK);
700 sdp->sd_sb.sb_bsize_shift = sb->s_blocksize_bits;
701 sdp->sd_fsb2bb_shift = sdp->sd_sb.sb_bsize_shift -
702 GFS2_BASIC_BLOCK_SHIFT;
703 sdp->sd_fsb2bb = 1 << sdp->sd_fsb2bb_shift;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000704
705 error = init_names(sdp, silent);
706 if (error)
707 goto fail;
708
709 error = gfs2_sys_fs_add(sdp);
710 if (error)
711 goto fail;
712
713 error = gfs2_lm_mount(sdp, silent);
714 if (error)
715 goto fail_sys;
716
717 error = init_locking(sdp, &mount_gh, DO);
718 if (error)
719 goto fail_lm;
720
721 error = init_sb(sdp, silent, DO);
722 if (error)
723 goto fail_locking;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000724
725 error = init_inodes(sdp, DO);
726 if (error)
Steven Whitehousef42faf42006-01-30 18:34:10 +0000727 goto fail_sb;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000728
729 error = init_per_node(sdp, DO);
730 if (error)
731 goto fail_inodes;
732
733 error = gfs2_statfs_init(sdp);
734 if (error) {
735 fs_err(sdp, "can't initialize statfs subsystem: %d\n", error);
736 goto fail_per_node;
737 }
738
739 error = init_threads(sdp, DO);
740 if (error)
741 goto fail_per_node;
742
743 if (!(sb->s_flags & MS_RDONLY)) {
744 error = gfs2_make_fs_rw(sdp);
745 if (error) {
746 fs_err(sdp, "can't make FS RW: %d\n", error);
747 goto fail_threads;
748 }
749 }
750
751 gfs2_glock_dq_uninit(&mount_gh);
752
753 return 0;
754
Steven Whitehousea91ea692006-09-04 12:04:26 -0400755fail_threads:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000756 init_threads(sdp, UNDO);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400757fail_per_node:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000758 init_per_node(sdp, UNDO);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400759fail_inodes:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000760 init_inodes(sdp, UNDO);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400761fail_sb:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000762 init_sb(sdp, 0, UNDO);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400763fail_locking:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000764 init_locking(sdp, &mount_gh, UNDO);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400765fail_lm:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000766 gfs2_gl_hash_clear(sdp, WAIT);
767 gfs2_lm_unmount(sdp);
768 while (invalidate_inodes(sb))
769 yield();
Steven Whitehousea91ea692006-09-04 12:04:26 -0400770fail_sys:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000771 gfs2_sys_fs_del(sdp);
Steven Whitehousea91ea692006-09-04 12:04:26 -0400772fail:
David Teiglandb3b94fa2006-01-16 16:50:04 +0000773 vfree(sdp);
Steven Whitehouse5c676f62006-02-27 17:23:27 -0500774 sb->s_fs_info = NULL;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000775 return error;
776}
777
Andrew Mortonccd6efd2006-06-30 02:16:34 -0700778static int gfs2_get_sb(struct file_system_type *fs_type, int flags,
779 const char *dev_name, void *data, struct vfsmount *mnt)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000780{
Abhijith Das86384602006-08-25 11:13:37 -0500781 struct super_block *sb;
782 struct gfs2_sbd *sdp;
783 int error = get_sb_bdev(fs_type, flags, dev_name, data, fill_super, mnt);
784 if (error)
785 goto out;
786 sb = mnt->mnt_sb;
Steven Whitehouse26c1a572006-09-04 15:32:10 -0400787 sdp = sb->s_fs_info;
Abhijith Das86384602006-08-25 11:13:37 -0500788 sdp->sd_gfs2mnt = mnt;
789out:
790 return error;
791}
792
793static int fill_super_meta(struct super_block *sb, struct super_block *new,
794 void *data, int silent)
795{
796 struct gfs2_sbd *sdp = sb->s_fs_info;
797 struct inode *inode;
798 int error = 0;
799
800 new->s_fs_info = sdp;
801 sdp->sd_vfs_meta = sb;
802
803 init_vfs(new, SDF_NOATIME);
804
805 /* Get the master inode */
806 inode = igrab(sdp->sd_master_dir);
807
808 new->s_root = d_alloc_root(inode);
809 if (!new->s_root) {
810 fs_err(sdp, "can't get root dentry\n");
811 error = -ENOMEM;
812 iput(inode);
813 }
814 new->s_root->d_op = &gfs2_dops;
815
816 return error;
817}
Steven Whitehousea91ea692006-09-04 12:04:26 -0400818
Abhijith Das86384602006-08-25 11:13:37 -0500819static int set_bdev_super(struct super_block *s, void *data)
820{
821 s->s_bdev = data;
822 s->s_dev = s->s_bdev->bd_dev;
823 return 0;
824}
825
826static int test_bdev_super(struct super_block *s, void *data)
827{
Steven Whitehouse26c1a572006-09-04 15:32:10 -0400828 return s->s_bdev == data;
Abhijith Das86384602006-08-25 11:13:37 -0500829}
830
831static struct super_block* get_gfs2_sb(const char *dev_name)
832{
833 struct kstat stat;
834 struct nameidata nd;
835 struct file_system_type *fstype;
836 struct super_block *sb = NULL, *s;
837 struct list_head *l;
838 int error;
839
840 error = path_lookup(dev_name, LOOKUP_FOLLOW, &nd);
841 if (error) {
842 printk(KERN_WARNING "GFS2: path_lookup on %s returned error\n",
843 dev_name);
844 goto out;
845 }
846 error = vfs_getattr(nd.mnt, nd.dentry, &stat);
847
848 fstype = get_fs_type("gfs2");
849 list_for_each(l, &fstype->fs_supers) {
850 s = list_entry(l, struct super_block, s_instances);
851 if ((S_ISBLK(stat.mode) && s->s_dev == stat.rdev) ||
852 (S_ISDIR(stat.mode) && s == nd.dentry->d_inode->i_sb)) {
853 sb = s;
854 goto free_nd;
855 }
856 }
857
858 printk(KERN_WARNING "GFS2: Unrecognized block device or "
859 "mount point %s", dev_name);
860
861free_nd:
862 path_release(&nd);
863out:
864 return sb;
865}
866
867static int gfs2_get_sb_meta(struct file_system_type *fs_type, int flags,
868 const char *dev_name, void *data, struct vfsmount *mnt)
869{
870 int error = 0;
871 struct super_block *sb = NULL, *new;
872 struct gfs2_sbd *sdp;
873 char *gfs2mnt = NULL;
874
875 sb = get_gfs2_sb(dev_name);
876 if (!sb) {
877 printk(KERN_WARNING "GFS2: gfs2 mount does not exist\n");
878 error = -ENOENT;
879 goto error;
880 }
881 sdp = (struct gfs2_sbd*) sb->s_fs_info;
882 if (sdp->sd_vfs_meta) {
883 printk(KERN_WARNING "GFS2: gfs2meta mount already exists\n");
884 error = -EBUSY;
885 goto error;
886 }
887 mutex_lock(&sb->s_bdev->bd_mount_mutex);
888 new = sget(fs_type, test_bdev_super, set_bdev_super, sb->s_bdev);
889 mutex_unlock(&sb->s_bdev->bd_mount_mutex);
890 if (IS_ERR(new)) {
891 error = PTR_ERR(new);
892 goto error;
893 }
894 module_put(fs_type->owner);
895 new->s_flags = flags;
896 strlcpy(new->s_id, sb->s_id, sizeof(new->s_id));
897 sb_set_blocksize(new, sb->s_blocksize);
898 error = fill_super_meta(sb, new, data, flags & MS_SILENT ? 1 : 0);
899 if (error) {
900 up_write(&new->s_umount);
901 deactivate_super(new);
902 goto error;
903 }
904
905 new->s_flags |= MS_ACTIVE;
906
907 /* Grab a reference to the gfs2 mount point */
908 atomic_inc(&sdp->sd_gfs2mnt->mnt_count);
909 return simple_set_mnt(mnt, new);
910error:
911 if (gfs2mnt)
912 kfree(gfs2mnt);
913 return error;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000914}
915
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500916static void gfs2_kill_sb(struct super_block *sb)
917{
918 kill_block_super(sb);
919}
920
Abhijith Das86384602006-08-25 11:13:37 -0500921static void gfs2_kill_sb_meta(struct super_block *sb)
922{
923 struct gfs2_sbd *sdp = sb->s_fs_info;
924 generic_shutdown_super(sb);
925 sdp->sd_vfs_meta = NULL;
926 atomic_dec(&sdp->sd_gfs2mnt->mnt_count);
927}
928
David Teiglandb3b94fa2006-01-16 16:50:04 +0000929struct file_system_type gfs2_fs_type = {
930 .name = "gfs2",
931 .fs_flags = FS_REQUIRES_DEV,
932 .get_sb = gfs2_get_sb,
Steven Whitehouse419c93e2006-03-02 16:33:41 -0500933 .kill_sb = gfs2_kill_sb,
934 .owner = THIS_MODULE,
935};
936
937struct file_system_type gfs2meta_fs_type = {
938 .name = "gfs2meta",
939 .fs_flags = FS_REQUIRES_DEV,
Abhijith Das86384602006-08-25 11:13:37 -0500940 .get_sb = gfs2_get_sb_meta,
941 .kill_sb = gfs2_kill_sb_meta,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000942 .owner = THIS_MODULE,
943};
944