xref: /openbmc/linux/fs/nilfs2/super.c (revision 783f61843e9d14724f5f79ae955a28c27e300467)
1*783f6184SRyusuke Konishi /*
2*783f6184SRyusuke Konishi  * super.c - NILFS module and super block management.
3*783f6184SRyusuke Konishi  *
4*783f6184SRyusuke Konishi  * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
5*783f6184SRyusuke Konishi  *
6*783f6184SRyusuke Konishi  * This program is free software; you can redistribute it and/or modify
7*783f6184SRyusuke Konishi  * it under the terms of the GNU General Public License as published by
8*783f6184SRyusuke Konishi  * the Free Software Foundation; either version 2 of the License, or
9*783f6184SRyusuke Konishi  * (at your option) any later version.
10*783f6184SRyusuke Konishi  *
11*783f6184SRyusuke Konishi  * This program is distributed in the hope that it will be useful,
12*783f6184SRyusuke Konishi  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*783f6184SRyusuke Konishi  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*783f6184SRyusuke Konishi  * GNU General Public License for more details.
15*783f6184SRyusuke Konishi  *
16*783f6184SRyusuke Konishi  * You should have received a copy of the GNU General Public License
17*783f6184SRyusuke Konishi  * along with this program; if not, write to the Free Software
18*783f6184SRyusuke Konishi  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19*783f6184SRyusuke Konishi  *
20*783f6184SRyusuke Konishi  * Written by Ryusuke Konishi <ryusuke@osrg.net>
21*783f6184SRyusuke Konishi  */
22*783f6184SRyusuke Konishi /*
23*783f6184SRyusuke Konishi  *  linux/fs/ext2/super.c
24*783f6184SRyusuke Konishi  *
25*783f6184SRyusuke Konishi  * Copyright (C) 1992, 1993, 1994, 1995
26*783f6184SRyusuke Konishi  * Remy Card (card@masi.ibp.fr)
27*783f6184SRyusuke Konishi  * Laboratoire MASI - Institut Blaise Pascal
28*783f6184SRyusuke Konishi  * Universite Pierre et Marie Curie (Paris VI)
29*783f6184SRyusuke Konishi  *
30*783f6184SRyusuke Konishi  *  from
31*783f6184SRyusuke Konishi  *
32*783f6184SRyusuke Konishi  *  linux/fs/minix/inode.c
33*783f6184SRyusuke Konishi  *
34*783f6184SRyusuke Konishi  *  Copyright (C) 1991, 1992  Linus Torvalds
35*783f6184SRyusuke Konishi  *
36*783f6184SRyusuke Konishi  *  Big-endian to little-endian byte-swapping/bitmaps by
37*783f6184SRyusuke Konishi  *        David S. Miller (davem@caip.rutgers.edu), 1995
38*783f6184SRyusuke Konishi  */
39*783f6184SRyusuke Konishi 
40*783f6184SRyusuke Konishi #include <linux/module.h>
41*783f6184SRyusuke Konishi #include <linux/string.h>
42*783f6184SRyusuke Konishi #include <linux/slab.h>
43*783f6184SRyusuke Konishi #include <linux/init.h>
44*783f6184SRyusuke Konishi #include <linux/blkdev.h>
45*783f6184SRyusuke Konishi #include <linux/parser.h>
46*783f6184SRyusuke Konishi #include <linux/random.h>
47*783f6184SRyusuke Konishi #include <linux/crc32.h>
48*783f6184SRyusuke Konishi #include <linux/smp_lock.h>
49*783f6184SRyusuke Konishi #include <linux/vfs.h>
50*783f6184SRyusuke Konishi #include <linux/writeback.h>
51*783f6184SRyusuke Konishi #include <linux/kobject.h>
52*783f6184SRyusuke Konishi #include <linux/exportfs.h>
53*783f6184SRyusuke Konishi #include "nilfs.h"
54*783f6184SRyusuke Konishi #include "mdt.h"
55*783f6184SRyusuke Konishi #include "alloc.h"
56*783f6184SRyusuke Konishi #include "page.h"
57*783f6184SRyusuke Konishi #include "cpfile.h"
58*783f6184SRyusuke Konishi #include "ifile.h"
59*783f6184SRyusuke Konishi #include "dat.h"
60*783f6184SRyusuke Konishi #include "segment.h"
61*783f6184SRyusuke Konishi #include "segbuf.h"
62*783f6184SRyusuke Konishi 
63*783f6184SRyusuke Konishi MODULE_AUTHOR("NTT Corp.");
64*783f6184SRyusuke Konishi MODULE_DESCRIPTION("A New Implementation of the Log-structured Filesystem "
65*783f6184SRyusuke Konishi 		   "(NILFS)");
66*783f6184SRyusuke Konishi MODULE_VERSION(NILFS_VERSION);
67*783f6184SRyusuke Konishi MODULE_LICENSE("GPL");
68*783f6184SRyusuke Konishi 
69*783f6184SRyusuke Konishi static int nilfs_remount(struct super_block *sb, int *flags, char *data);
70*783f6184SRyusuke Konishi static int test_exclusive_mount(struct file_system_type *fs_type,
71*783f6184SRyusuke Konishi 				struct block_device *bdev, int flags);
72*783f6184SRyusuke Konishi 
73*783f6184SRyusuke Konishi /**
74*783f6184SRyusuke Konishi  * nilfs_error() - report failure condition on a filesystem
75*783f6184SRyusuke Konishi  *
76*783f6184SRyusuke Konishi  * nilfs_error() sets an ERROR_FS flag on the superblock as well as
77*783f6184SRyusuke Konishi  * reporting an error message.  It should be called when NILFS detects
78*783f6184SRyusuke Konishi  * incoherences or defects of meta data on disk.  As for sustainable
79*783f6184SRyusuke Konishi  * errors such as a single-shot I/O error, nilfs_warning() or the printk()
80*783f6184SRyusuke Konishi  * function should be used instead.
81*783f6184SRyusuke Konishi  *
82*783f6184SRyusuke Konishi  * The segment constructor must not call this function because it can
83*783f6184SRyusuke Konishi  * kill itself.
84*783f6184SRyusuke Konishi  */
85*783f6184SRyusuke Konishi void nilfs_error(struct super_block *sb, const char *function,
86*783f6184SRyusuke Konishi 		 const char *fmt, ...)
87*783f6184SRyusuke Konishi {
88*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
89*783f6184SRyusuke Konishi 	va_list args;
90*783f6184SRyusuke Konishi 
91*783f6184SRyusuke Konishi 	va_start(args, fmt);
92*783f6184SRyusuke Konishi 	printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function);
93*783f6184SRyusuke Konishi 	vprintk(fmt, args);
94*783f6184SRyusuke Konishi 	printk("\n");
95*783f6184SRyusuke Konishi 	va_end(args);
96*783f6184SRyusuke Konishi 
97*783f6184SRyusuke Konishi 	if (!(sb->s_flags & MS_RDONLY)) {
98*783f6184SRyusuke Konishi 		struct the_nilfs *nilfs = sbi->s_nilfs;
99*783f6184SRyusuke Konishi 
100*783f6184SRyusuke Konishi 		if (!nilfs_test_opt(sbi, ERRORS_CONT))
101*783f6184SRyusuke Konishi 			nilfs_detach_segment_constructor(sbi);
102*783f6184SRyusuke Konishi 
103*783f6184SRyusuke Konishi 		down_write(&nilfs->ns_sem);
104*783f6184SRyusuke Konishi 		if (!(nilfs->ns_mount_state & NILFS_ERROR_FS)) {
105*783f6184SRyusuke Konishi 			nilfs->ns_mount_state |= NILFS_ERROR_FS;
106*783f6184SRyusuke Konishi 			nilfs->ns_sbp->s_state |= cpu_to_le16(NILFS_ERROR_FS);
107*783f6184SRyusuke Konishi 			nilfs_commit_super(sbi);
108*783f6184SRyusuke Konishi 		}
109*783f6184SRyusuke Konishi 		up_write(&nilfs->ns_sem);
110*783f6184SRyusuke Konishi 
111*783f6184SRyusuke Konishi 		if (nilfs_test_opt(sbi, ERRORS_RO)) {
112*783f6184SRyusuke Konishi 			printk(KERN_CRIT "Remounting filesystem read-only\n");
113*783f6184SRyusuke Konishi 			sb->s_flags |= MS_RDONLY;
114*783f6184SRyusuke Konishi 		}
115*783f6184SRyusuke Konishi 	}
116*783f6184SRyusuke Konishi 
117*783f6184SRyusuke Konishi 	if (nilfs_test_opt(sbi, ERRORS_PANIC))
118*783f6184SRyusuke Konishi 		panic("NILFS (device %s): panic forced after error\n",
119*783f6184SRyusuke Konishi 		      sb->s_id);
120*783f6184SRyusuke Konishi }
121*783f6184SRyusuke Konishi 
122*783f6184SRyusuke Konishi void nilfs_warning(struct super_block *sb, const char *function,
123*783f6184SRyusuke Konishi 		   const char *fmt, ...)
124*783f6184SRyusuke Konishi {
125*783f6184SRyusuke Konishi 	va_list args;
126*783f6184SRyusuke Konishi 
127*783f6184SRyusuke Konishi 	va_start(args, fmt);
128*783f6184SRyusuke Konishi 	printk(KERN_WARNING "NILFS warning (device %s): %s: ",
129*783f6184SRyusuke Konishi 	       sb->s_id, function);
130*783f6184SRyusuke Konishi 	vprintk(fmt, args);
131*783f6184SRyusuke Konishi 	printk("\n");
132*783f6184SRyusuke Konishi 	va_end(args);
133*783f6184SRyusuke Konishi }
134*783f6184SRyusuke Konishi 
135*783f6184SRyusuke Konishi static struct kmem_cache *nilfs_inode_cachep;
136*783f6184SRyusuke Konishi 
137*783f6184SRyusuke Konishi struct inode *nilfs_alloc_inode(struct super_block *sb)
138*783f6184SRyusuke Konishi {
139*783f6184SRyusuke Konishi 	struct nilfs_inode_info *ii;
140*783f6184SRyusuke Konishi 
141*783f6184SRyusuke Konishi 	ii = kmem_cache_alloc(nilfs_inode_cachep, GFP_NOFS);
142*783f6184SRyusuke Konishi 	if (!ii)
143*783f6184SRyusuke Konishi 		return NULL;
144*783f6184SRyusuke Konishi 	ii->i_bh = NULL;
145*783f6184SRyusuke Konishi 	ii->i_state = 0;
146*783f6184SRyusuke Konishi 	ii->vfs_inode.i_version = 1;
147*783f6184SRyusuke Konishi 	nilfs_btnode_cache_init(&ii->i_btnode_cache);
148*783f6184SRyusuke Konishi 	return &ii->vfs_inode;
149*783f6184SRyusuke Konishi }
150*783f6184SRyusuke Konishi 
151*783f6184SRyusuke Konishi void nilfs_destroy_inode(struct inode *inode)
152*783f6184SRyusuke Konishi {
153*783f6184SRyusuke Konishi 	kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode));
154*783f6184SRyusuke Konishi }
155*783f6184SRyusuke Konishi 
156*783f6184SRyusuke Konishi static void init_once(void *obj)
157*783f6184SRyusuke Konishi {
158*783f6184SRyusuke Konishi 	struct nilfs_inode_info *ii = obj;
159*783f6184SRyusuke Konishi 
160*783f6184SRyusuke Konishi 	INIT_LIST_HEAD(&ii->i_dirty);
161*783f6184SRyusuke Konishi #ifdef CONFIG_NILFS_XATTR
162*783f6184SRyusuke Konishi 	init_rwsem(&ii->xattr_sem);
163*783f6184SRyusuke Konishi #endif
164*783f6184SRyusuke Konishi 	nilfs_btnode_cache_init_once(&ii->i_btnode_cache);
165*783f6184SRyusuke Konishi 	ii->i_bmap = (struct nilfs_bmap *)&ii->i_bmap_union;
166*783f6184SRyusuke Konishi 	inode_init_once(&ii->vfs_inode);
167*783f6184SRyusuke Konishi }
168*783f6184SRyusuke Konishi 
169*783f6184SRyusuke Konishi static int nilfs_init_inode_cache(void)
170*783f6184SRyusuke Konishi {
171*783f6184SRyusuke Konishi 	nilfs_inode_cachep = kmem_cache_create("nilfs2_inode_cache",
172*783f6184SRyusuke Konishi 					       sizeof(struct nilfs_inode_info),
173*783f6184SRyusuke Konishi 					       0, SLAB_RECLAIM_ACCOUNT,
174*783f6184SRyusuke Konishi 					       init_once);
175*783f6184SRyusuke Konishi 
176*783f6184SRyusuke Konishi 	return (nilfs_inode_cachep == NULL) ? -ENOMEM : 0;
177*783f6184SRyusuke Konishi }
178*783f6184SRyusuke Konishi 
179*783f6184SRyusuke Konishi static inline void nilfs_destroy_inode_cache(void)
180*783f6184SRyusuke Konishi {
181*783f6184SRyusuke Konishi 	kmem_cache_destroy(nilfs_inode_cachep);
182*783f6184SRyusuke Konishi }
183*783f6184SRyusuke Konishi 
184*783f6184SRyusuke Konishi static void nilfs_clear_inode(struct inode *inode)
185*783f6184SRyusuke Konishi {
186*783f6184SRyusuke Konishi 	struct nilfs_inode_info *ii = NILFS_I(inode);
187*783f6184SRyusuke Konishi 	struct nilfs_transaction_info ti;
188*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
189*783f6184SRyusuke Konishi 
190*783f6184SRyusuke Konishi #ifdef CONFIG_NILFS_POSIX_ACL
191*783f6184SRyusuke Konishi 	if (ii->i_acl && ii->i_acl != NILFS_ACL_NOT_CACHED) {
192*783f6184SRyusuke Konishi 		posix_acl_release(ii->i_acl);
193*783f6184SRyusuke Konishi 		ii->i_acl = NILFS_ACL_NOT_CACHED;
194*783f6184SRyusuke Konishi 	}
195*783f6184SRyusuke Konishi 	if (ii->i_default_acl && ii->i_default_acl != NILFS_ACL_NOT_CACHED) {
196*783f6184SRyusuke Konishi 		posix_acl_release(ii->i_default_acl);
197*783f6184SRyusuke Konishi 		ii->i_default_acl = NILFS_ACL_NOT_CACHED;
198*783f6184SRyusuke Konishi 	}
199*783f6184SRyusuke Konishi #endif
200*783f6184SRyusuke Konishi 	/*
201*783f6184SRyusuke Konishi 	 * Free resources allocated in nilfs_read_inode(), here.
202*783f6184SRyusuke Konishi 	 */
203*783f6184SRyusuke Konishi 	nilfs_transaction_begin(inode->i_sb, &ti, 0);
204*783f6184SRyusuke Konishi 
205*783f6184SRyusuke Konishi 	spin_lock(&sbi->s_inode_lock);
206*783f6184SRyusuke Konishi 	if (!list_empty(&ii->i_dirty))
207*783f6184SRyusuke Konishi 		list_del_init(&ii->i_dirty);
208*783f6184SRyusuke Konishi 	brelse(ii->i_bh);
209*783f6184SRyusuke Konishi 	ii->i_bh = NULL;
210*783f6184SRyusuke Konishi 	spin_unlock(&sbi->s_inode_lock);
211*783f6184SRyusuke Konishi 
212*783f6184SRyusuke Konishi 	if (test_bit(NILFS_I_BMAP, &ii->i_state))
213*783f6184SRyusuke Konishi 		nilfs_bmap_clear(ii->i_bmap);
214*783f6184SRyusuke Konishi 
215*783f6184SRyusuke Konishi 	nilfs_btnode_cache_clear(&ii->i_btnode_cache);
216*783f6184SRyusuke Konishi 
217*783f6184SRyusuke Konishi 	nilfs_transaction_end(inode->i_sb, 0);
218*783f6184SRyusuke Konishi }
219*783f6184SRyusuke Konishi 
220*783f6184SRyusuke Konishi /**
221*783f6184SRyusuke Konishi  * nilfs_update_last_segment - change pointer to the latest segment
222*783f6184SRyusuke Konishi  * @sbi: nilfs_sb_info
223*783f6184SRyusuke Konishi  * @update_cno: flag whether to update checkpoint number.
224*783f6184SRyusuke Konishi  *
225*783f6184SRyusuke Konishi  * nilfs_update_last_segment() changes information in the super block
226*783f6184SRyusuke Konishi  * after a partial segment is written out successfully. The super
227*783f6184SRyusuke Konishi  * block is marked dirty. It will be written out at the next VFS sync
228*783f6184SRyusuke Konishi  * operations such as sync_supers() and generic_shutdown_super().
229*783f6184SRyusuke Konishi  */
230*783f6184SRyusuke Konishi void nilfs_update_last_segment(struct nilfs_sb_info *sbi, int update_cno)
231*783f6184SRyusuke Konishi {
232*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
233*783f6184SRyusuke Konishi 	struct nilfs_super_block *sbp = nilfs->ns_sbp;
234*783f6184SRyusuke Konishi 
235*783f6184SRyusuke Konishi 	/* nilfs->sem must be locked by the caller. */
236*783f6184SRyusuke Konishi 	spin_lock(&nilfs->ns_last_segment_lock);
237*783f6184SRyusuke Konishi 	if (update_cno)
238*783f6184SRyusuke Konishi 		nilfs->ns_last_cno = nilfs->ns_cno++;
239*783f6184SRyusuke Konishi 	sbp->s_last_seq = cpu_to_le64(nilfs->ns_last_seq);
240*783f6184SRyusuke Konishi 	sbp->s_last_pseg = cpu_to_le64(nilfs->ns_last_pseg);
241*783f6184SRyusuke Konishi 	sbp->s_last_cno = cpu_to_le64(nilfs->ns_last_cno);
242*783f6184SRyusuke Konishi 	spin_unlock(&nilfs->ns_last_segment_lock);
243*783f6184SRyusuke Konishi 
244*783f6184SRyusuke Konishi 	sbi->s_super->s_dirt = 1; /* must be set if delaying the call of
245*783f6184SRyusuke Konishi 				     nilfs_commit_super() */
246*783f6184SRyusuke Konishi }
247*783f6184SRyusuke Konishi 
248*783f6184SRyusuke Konishi static int nilfs_sync_super(struct nilfs_sb_info *sbi)
249*783f6184SRyusuke Konishi {
250*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
251*783f6184SRyusuke Konishi 	int err;
252*783f6184SRyusuke Konishi 	int barrier_done = 0;
253*783f6184SRyusuke Konishi 
254*783f6184SRyusuke Konishi 	if (nilfs_test_opt(sbi, BARRIER)) {
255*783f6184SRyusuke Konishi 		set_buffer_ordered(nilfs->ns_sbh);
256*783f6184SRyusuke Konishi 		barrier_done = 1;
257*783f6184SRyusuke Konishi 	}
258*783f6184SRyusuke Konishi  retry:
259*783f6184SRyusuke Konishi 	set_buffer_dirty(nilfs->ns_sbh);
260*783f6184SRyusuke Konishi 	err = sync_dirty_buffer(nilfs->ns_sbh);
261*783f6184SRyusuke Konishi 	if (err == -EOPNOTSUPP && barrier_done) {
262*783f6184SRyusuke Konishi 		nilfs_warning(sbi->s_super, __func__,
263*783f6184SRyusuke Konishi 			      "barrier-based sync failed. "
264*783f6184SRyusuke Konishi 			      "disabling barriers\n");
265*783f6184SRyusuke Konishi 		nilfs_clear_opt(sbi, BARRIER);
266*783f6184SRyusuke Konishi 		barrier_done = 0;
267*783f6184SRyusuke Konishi 		clear_buffer_ordered(nilfs->ns_sbh);
268*783f6184SRyusuke Konishi 		goto retry;
269*783f6184SRyusuke Konishi 	}
270*783f6184SRyusuke Konishi 	if (unlikely(err))
271*783f6184SRyusuke Konishi 		printk(KERN_ERR
272*783f6184SRyusuke Konishi 		       "NILFS: unable to write superblock (err=%d)\n", err);
273*783f6184SRyusuke Konishi 	else {
274*783f6184SRyusuke Konishi 		nilfs_dispose_used_segments(nilfs);
275*783f6184SRyusuke Konishi 		clear_nilfs_discontinued(nilfs);
276*783f6184SRyusuke Konishi 	}
277*783f6184SRyusuke Konishi 
278*783f6184SRyusuke Konishi 	return err;
279*783f6184SRyusuke Konishi }
280*783f6184SRyusuke Konishi 
281*783f6184SRyusuke Konishi int nilfs_commit_super(struct nilfs_sb_info *sbi)
282*783f6184SRyusuke Konishi {
283*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
284*783f6184SRyusuke Konishi 	struct nilfs_super_block *sbp = nilfs->ns_sbp;
285*783f6184SRyusuke Konishi 	sector_t nfreeblocks;
286*783f6184SRyusuke Konishi 	int err;
287*783f6184SRyusuke Konishi 
288*783f6184SRyusuke Konishi 	/* nilfs->sem must be locked by the caller. */
289*783f6184SRyusuke Konishi 	err = nilfs_count_free_blocks(nilfs, &nfreeblocks);
290*783f6184SRyusuke Konishi 	if (unlikely(err)) {
291*783f6184SRyusuke Konishi 		printk(KERN_ERR "NILFS: failed to count free blocks\n");
292*783f6184SRyusuke Konishi 		return err;
293*783f6184SRyusuke Konishi 	}
294*783f6184SRyusuke Konishi 	sbp->s_free_blocks_count = cpu_to_le64(nfreeblocks);
295*783f6184SRyusuke Konishi 	sbp->s_wtime = cpu_to_le64(get_seconds());
296*783f6184SRyusuke Konishi 	sbp->s_sum = 0;
297*783f6184SRyusuke Konishi 	sbp->s_sum = crc32_le(nilfs->ns_crc_seed, (unsigned char *)sbp,
298*783f6184SRyusuke Konishi 			      le16_to_cpu(sbp->s_bytes));
299*783f6184SRyusuke Konishi 
300*783f6184SRyusuke Konishi 	sbi->s_super->s_dirt = 0;
301*783f6184SRyusuke Konishi 	return nilfs_sync_super(sbi);
302*783f6184SRyusuke Konishi }
303*783f6184SRyusuke Konishi 
304*783f6184SRyusuke Konishi static void nilfs_put_super(struct super_block *sb)
305*783f6184SRyusuke Konishi {
306*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
307*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
308*783f6184SRyusuke Konishi 
309*783f6184SRyusuke Konishi 	nilfs_detach_segment_constructor(sbi);
310*783f6184SRyusuke Konishi 
311*783f6184SRyusuke Konishi 	if (!(sb->s_flags & MS_RDONLY)) {
312*783f6184SRyusuke Konishi 		down_write(&nilfs->ns_sem);
313*783f6184SRyusuke Konishi 		nilfs->ns_sbp->s_state = cpu_to_le16(nilfs->ns_mount_state);
314*783f6184SRyusuke Konishi 		nilfs_commit_super(sbi);
315*783f6184SRyusuke Konishi 		up_write(&nilfs->ns_sem);
316*783f6184SRyusuke Konishi 	}
317*783f6184SRyusuke Konishi 
318*783f6184SRyusuke Konishi 	nilfs_detach_checkpoint(sbi);
319*783f6184SRyusuke Konishi 	put_nilfs(sbi->s_nilfs);
320*783f6184SRyusuke Konishi 	sbi->s_super = NULL;
321*783f6184SRyusuke Konishi 	sb->s_fs_info = NULL;
322*783f6184SRyusuke Konishi 	kfree(sbi);
323*783f6184SRyusuke Konishi }
324*783f6184SRyusuke Konishi 
325*783f6184SRyusuke Konishi /**
326*783f6184SRyusuke Konishi  * nilfs_write_super - write super block(s) of NILFS
327*783f6184SRyusuke Konishi  * @sb: super_block
328*783f6184SRyusuke Konishi  *
329*783f6184SRyusuke Konishi  * nilfs_write_super() gets a fs-dependent lock, writes super block(s), and
330*783f6184SRyusuke Konishi  * clears s_dirt.  This function is called in the section protected by
331*783f6184SRyusuke Konishi  * lock_super().
332*783f6184SRyusuke Konishi  *
333*783f6184SRyusuke Konishi  * The s_dirt flag is managed by each filesystem and we protect it by ns_sem
334*783f6184SRyusuke Konishi  * of the struct the_nilfs.  Lock order must be as follows:
335*783f6184SRyusuke Konishi  *
336*783f6184SRyusuke Konishi  *   1. lock_super()
337*783f6184SRyusuke Konishi  *   2.    down_write(&nilfs->ns_sem)
338*783f6184SRyusuke Konishi  *
339*783f6184SRyusuke Konishi  * Inside NILFS, locking ns_sem is enough to protect s_dirt and the buffer
340*783f6184SRyusuke Konishi  * of the super block (nilfs->ns_sbp).
341*783f6184SRyusuke Konishi  *
342*783f6184SRyusuke Konishi  * In most cases, VFS functions call lock_super() before calling these
343*783f6184SRyusuke Konishi  * methods.  So we must be careful not to bring on deadlocks when using
344*783f6184SRyusuke Konishi  * lock_super();  see generic_shutdown_super(), write_super(), and so on.
345*783f6184SRyusuke Konishi  *
346*783f6184SRyusuke Konishi  * Note that order of lock_kernel() and lock_super() depends on contexts
347*783f6184SRyusuke Konishi  * of VFS.  We should also note that lock_kernel() can be used in its
348*783f6184SRyusuke Konishi  * protective section and only the outermost one has an effect.
349*783f6184SRyusuke Konishi  */
350*783f6184SRyusuke Konishi static void nilfs_write_super(struct super_block *sb)
351*783f6184SRyusuke Konishi {
352*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
353*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
354*783f6184SRyusuke Konishi 
355*783f6184SRyusuke Konishi 	down_write(&nilfs->ns_sem);
356*783f6184SRyusuke Konishi 	if (!(sb->s_flags & MS_RDONLY))
357*783f6184SRyusuke Konishi 		nilfs_commit_super(sbi);
358*783f6184SRyusuke Konishi 	sb->s_dirt = 0;
359*783f6184SRyusuke Konishi 	up_write(&nilfs->ns_sem);
360*783f6184SRyusuke Konishi }
361*783f6184SRyusuke Konishi 
362*783f6184SRyusuke Konishi static int nilfs_sync_fs(struct super_block *sb, int wait)
363*783f6184SRyusuke Konishi {
364*783f6184SRyusuke Konishi 	int err = 0;
365*783f6184SRyusuke Konishi 
366*783f6184SRyusuke Konishi 	/* This function is called when super block should be written back */
367*783f6184SRyusuke Konishi 	if (wait)
368*783f6184SRyusuke Konishi 		err = nilfs_construct_segment(sb);
369*783f6184SRyusuke Konishi 	return err;
370*783f6184SRyusuke Konishi }
371*783f6184SRyusuke Konishi 
372*783f6184SRyusuke Konishi int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno)
373*783f6184SRyusuke Konishi {
374*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
375*783f6184SRyusuke Konishi 	struct nilfs_checkpoint *raw_cp;
376*783f6184SRyusuke Konishi 	struct buffer_head *bh_cp;
377*783f6184SRyusuke Konishi 	int err;
378*783f6184SRyusuke Konishi 
379*783f6184SRyusuke Konishi 	down_write(&nilfs->ns_sem);
380*783f6184SRyusuke Konishi 	list_add(&sbi->s_list, &nilfs->ns_supers);
381*783f6184SRyusuke Konishi 	up_write(&nilfs->ns_sem);
382*783f6184SRyusuke Konishi 
383*783f6184SRyusuke Konishi 	sbi->s_ifile = nilfs_mdt_new(
384*783f6184SRyusuke Konishi 		nilfs, sbi->s_super, NILFS_IFILE_INO, NILFS_IFILE_GFP);
385*783f6184SRyusuke Konishi 	if (!sbi->s_ifile)
386*783f6184SRyusuke Konishi 		return -ENOMEM;
387*783f6184SRyusuke Konishi 
388*783f6184SRyusuke Konishi 	err = nilfs_palloc_init_blockgroup(sbi->s_ifile, nilfs->ns_inode_size);
389*783f6184SRyusuke Konishi 	if (unlikely(err))
390*783f6184SRyusuke Konishi 		goto failed;
391*783f6184SRyusuke Konishi 
392*783f6184SRyusuke Konishi 	err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, cno, 0, &raw_cp,
393*783f6184SRyusuke Konishi 					  &bh_cp);
394*783f6184SRyusuke Konishi 	if (unlikely(err)) {
395*783f6184SRyusuke Konishi 		if (err == -ENOENT || err == -EINVAL) {
396*783f6184SRyusuke Konishi 			printk(KERN_ERR
397*783f6184SRyusuke Konishi 			       "NILFS: Invalid checkpoint "
398*783f6184SRyusuke Konishi 			       "(checkpoint number=%llu)\n",
399*783f6184SRyusuke Konishi 			       (unsigned long long)cno);
400*783f6184SRyusuke Konishi 			err = -EINVAL;
401*783f6184SRyusuke Konishi 		}
402*783f6184SRyusuke Konishi 		goto failed;
403*783f6184SRyusuke Konishi 	}
404*783f6184SRyusuke Konishi 	err = nilfs_read_inode_common(sbi->s_ifile, &raw_cp->cp_ifile_inode);
405*783f6184SRyusuke Konishi 	if (unlikely(err))
406*783f6184SRyusuke Konishi 		goto failed_bh;
407*783f6184SRyusuke Konishi 	atomic_set(&sbi->s_inodes_count, le64_to_cpu(raw_cp->cp_inodes_count));
408*783f6184SRyusuke Konishi 	atomic_set(&sbi->s_blocks_count, le64_to_cpu(raw_cp->cp_blocks_count));
409*783f6184SRyusuke Konishi 
410*783f6184SRyusuke Konishi 	nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp);
411*783f6184SRyusuke Konishi 	return 0;
412*783f6184SRyusuke Konishi 
413*783f6184SRyusuke Konishi  failed_bh:
414*783f6184SRyusuke Konishi 	nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp);
415*783f6184SRyusuke Konishi  failed:
416*783f6184SRyusuke Konishi 	nilfs_mdt_destroy(sbi->s_ifile);
417*783f6184SRyusuke Konishi 	sbi->s_ifile = NULL;
418*783f6184SRyusuke Konishi 
419*783f6184SRyusuke Konishi 	down_write(&nilfs->ns_sem);
420*783f6184SRyusuke Konishi 	list_del_init(&sbi->s_list);
421*783f6184SRyusuke Konishi 	up_write(&nilfs->ns_sem);
422*783f6184SRyusuke Konishi 
423*783f6184SRyusuke Konishi 	return err;
424*783f6184SRyusuke Konishi }
425*783f6184SRyusuke Konishi 
426*783f6184SRyusuke Konishi void nilfs_detach_checkpoint(struct nilfs_sb_info *sbi)
427*783f6184SRyusuke Konishi {
428*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
429*783f6184SRyusuke Konishi 
430*783f6184SRyusuke Konishi 	nilfs_mdt_clear(sbi->s_ifile);
431*783f6184SRyusuke Konishi 	nilfs_mdt_destroy(sbi->s_ifile);
432*783f6184SRyusuke Konishi 	sbi->s_ifile = NULL;
433*783f6184SRyusuke Konishi 	down_write(&nilfs->ns_sem);
434*783f6184SRyusuke Konishi 	list_del_init(&sbi->s_list);
435*783f6184SRyusuke Konishi 	up_write(&nilfs->ns_sem);
436*783f6184SRyusuke Konishi }
437*783f6184SRyusuke Konishi 
438*783f6184SRyusuke Konishi static int nilfs_mark_recovery_complete(struct nilfs_sb_info *sbi)
439*783f6184SRyusuke Konishi {
440*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
441*783f6184SRyusuke Konishi 	int err = 0;
442*783f6184SRyusuke Konishi 
443*783f6184SRyusuke Konishi 	down_write(&nilfs->ns_sem);
444*783f6184SRyusuke Konishi 	if (!(nilfs->ns_mount_state & NILFS_VALID_FS)) {
445*783f6184SRyusuke Konishi 		nilfs->ns_mount_state |= NILFS_VALID_FS;
446*783f6184SRyusuke Konishi 		err = nilfs_commit_super(sbi);
447*783f6184SRyusuke Konishi 		if (likely(!err))
448*783f6184SRyusuke Konishi 			printk(KERN_INFO "NILFS: recovery complete.\n");
449*783f6184SRyusuke Konishi 	}
450*783f6184SRyusuke Konishi 	up_write(&nilfs->ns_sem);
451*783f6184SRyusuke Konishi 	return err;
452*783f6184SRyusuke Konishi }
453*783f6184SRyusuke Konishi 
454*783f6184SRyusuke Konishi static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf)
455*783f6184SRyusuke Konishi {
456*783f6184SRyusuke Konishi 	struct super_block *sb = dentry->d_sb;
457*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
458*783f6184SRyusuke Konishi 	unsigned long long blocks;
459*783f6184SRyusuke Konishi 	unsigned long overhead;
460*783f6184SRyusuke Konishi 	unsigned long nrsvblocks;
461*783f6184SRyusuke Konishi 	sector_t nfreeblocks;
462*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
463*783f6184SRyusuke Konishi 	int err;
464*783f6184SRyusuke Konishi 
465*783f6184SRyusuke Konishi 	/*
466*783f6184SRyusuke Konishi 	 * Compute all of the segment blocks
467*783f6184SRyusuke Konishi 	 *
468*783f6184SRyusuke Konishi 	 * The blocks before first segment and after last segment
469*783f6184SRyusuke Konishi 	 * are excluded.
470*783f6184SRyusuke Konishi 	 */
471*783f6184SRyusuke Konishi 	blocks = nilfs->ns_blocks_per_segment * nilfs->ns_nsegments
472*783f6184SRyusuke Konishi 		- nilfs->ns_first_data_block;
473*783f6184SRyusuke Konishi 	nrsvblocks = nilfs->ns_nrsvsegs * nilfs->ns_blocks_per_segment;
474*783f6184SRyusuke Konishi 
475*783f6184SRyusuke Konishi 	/*
476*783f6184SRyusuke Konishi 	 * Compute the overhead
477*783f6184SRyusuke Konishi 	 *
478*783f6184SRyusuke Konishi 	 * When distributing meta data blocks outside semgent structure,
479*783f6184SRyusuke Konishi 	 * We must count them as the overhead.
480*783f6184SRyusuke Konishi 	 */
481*783f6184SRyusuke Konishi 	overhead = 0;
482*783f6184SRyusuke Konishi 
483*783f6184SRyusuke Konishi 	err = nilfs_count_free_blocks(nilfs, &nfreeblocks);
484*783f6184SRyusuke Konishi 	if (unlikely(err))
485*783f6184SRyusuke Konishi 		return err;
486*783f6184SRyusuke Konishi 
487*783f6184SRyusuke Konishi 	buf->f_type = NILFS_SUPER_MAGIC;
488*783f6184SRyusuke Konishi 	buf->f_bsize = sb->s_blocksize;
489*783f6184SRyusuke Konishi 	buf->f_blocks = blocks - overhead;
490*783f6184SRyusuke Konishi 	buf->f_bfree = nfreeblocks;
491*783f6184SRyusuke Konishi 	buf->f_bavail = (buf->f_bfree >= nrsvblocks) ?
492*783f6184SRyusuke Konishi 		(buf->f_bfree - nrsvblocks) : 0;
493*783f6184SRyusuke Konishi 	buf->f_files = atomic_read(&sbi->s_inodes_count);
494*783f6184SRyusuke Konishi 	buf->f_ffree = 0; /* nilfs_count_free_inodes(sb); */
495*783f6184SRyusuke Konishi 	buf->f_namelen = NILFS_NAME_LEN;
496*783f6184SRyusuke Konishi 	return 0;
497*783f6184SRyusuke Konishi }
498*783f6184SRyusuke Konishi 
499*783f6184SRyusuke Konishi static struct super_operations nilfs_sops = {
500*783f6184SRyusuke Konishi 	.alloc_inode    = nilfs_alloc_inode,
501*783f6184SRyusuke Konishi 	.destroy_inode  = nilfs_destroy_inode,
502*783f6184SRyusuke Konishi 	.dirty_inode    = nilfs_dirty_inode,
503*783f6184SRyusuke Konishi 	/* .write_inode    = nilfs_write_inode, */
504*783f6184SRyusuke Konishi 	/* .put_inode      = nilfs_put_inode, */
505*783f6184SRyusuke Konishi 	/* .drop_inode	  = nilfs_drop_inode, */
506*783f6184SRyusuke Konishi 	.delete_inode   = nilfs_delete_inode,
507*783f6184SRyusuke Konishi 	.put_super      = nilfs_put_super,
508*783f6184SRyusuke Konishi 	.write_super    = nilfs_write_super,
509*783f6184SRyusuke Konishi 	.sync_fs        = nilfs_sync_fs,
510*783f6184SRyusuke Konishi 	/* .write_super_lockfs */
511*783f6184SRyusuke Konishi 	/* .unlockfs */
512*783f6184SRyusuke Konishi 	.statfs         = nilfs_statfs,
513*783f6184SRyusuke Konishi 	.remount_fs     = nilfs_remount,
514*783f6184SRyusuke Konishi 	.clear_inode    = nilfs_clear_inode,
515*783f6184SRyusuke Konishi 	/* .umount_begin */
516*783f6184SRyusuke Konishi 	/* .show_options */
517*783f6184SRyusuke Konishi };
518*783f6184SRyusuke Konishi 
519*783f6184SRyusuke Konishi static struct inode *
520*783f6184SRyusuke Konishi nilfs_nfs_get_inode(struct super_block *sb, u64 ino, u32 generation)
521*783f6184SRyusuke Konishi {
522*783f6184SRyusuke Konishi 	struct inode *inode;
523*783f6184SRyusuke Konishi 
524*783f6184SRyusuke Konishi 	if (ino < NILFS_FIRST_INO(sb) && ino != NILFS_ROOT_INO &&
525*783f6184SRyusuke Konishi 	    ino != NILFS_SKETCH_INO)
526*783f6184SRyusuke Konishi 		return ERR_PTR(-ESTALE);
527*783f6184SRyusuke Konishi 
528*783f6184SRyusuke Konishi 	inode = nilfs_iget(sb, ino);
529*783f6184SRyusuke Konishi 	if (IS_ERR(inode))
530*783f6184SRyusuke Konishi 		return ERR_CAST(inode);
531*783f6184SRyusuke Konishi 	if (generation && inode->i_generation != generation) {
532*783f6184SRyusuke Konishi 		iput(inode);
533*783f6184SRyusuke Konishi 		return ERR_PTR(-ESTALE);
534*783f6184SRyusuke Konishi 	}
535*783f6184SRyusuke Konishi 
536*783f6184SRyusuke Konishi 	return inode;
537*783f6184SRyusuke Konishi }
538*783f6184SRyusuke Konishi 
539*783f6184SRyusuke Konishi static struct dentry *
540*783f6184SRyusuke Konishi nilfs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len,
541*783f6184SRyusuke Konishi 		   int fh_type)
542*783f6184SRyusuke Konishi {
543*783f6184SRyusuke Konishi 	return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
544*783f6184SRyusuke Konishi 				    nilfs_nfs_get_inode);
545*783f6184SRyusuke Konishi }
546*783f6184SRyusuke Konishi 
547*783f6184SRyusuke Konishi static struct dentry *
548*783f6184SRyusuke Konishi nilfs_fh_to_parent(struct super_block *sb, struct fid *fid, int fh_len,
549*783f6184SRyusuke Konishi 		   int fh_type)
550*783f6184SRyusuke Konishi {
551*783f6184SRyusuke Konishi 	return generic_fh_to_parent(sb, fid, fh_len, fh_type,
552*783f6184SRyusuke Konishi 				    nilfs_nfs_get_inode);
553*783f6184SRyusuke Konishi }
554*783f6184SRyusuke Konishi 
555*783f6184SRyusuke Konishi static struct export_operations nilfs_export_ops = {
556*783f6184SRyusuke Konishi 	.fh_to_dentry = nilfs_fh_to_dentry,
557*783f6184SRyusuke Konishi 	.fh_to_parent = nilfs_fh_to_parent,
558*783f6184SRyusuke Konishi 	.get_parent = nilfs_get_parent,
559*783f6184SRyusuke Konishi };
560*783f6184SRyusuke Konishi 
561*783f6184SRyusuke Konishi enum {
562*783f6184SRyusuke Konishi 	Opt_err_cont, Opt_err_panic, Opt_err_ro,
563*783f6184SRyusuke Konishi 	Opt_barrier, Opt_snapshot, Opt_order,
564*783f6184SRyusuke Konishi 	Opt_err,
565*783f6184SRyusuke Konishi };
566*783f6184SRyusuke Konishi 
567*783f6184SRyusuke Konishi static match_table_t tokens = {
568*783f6184SRyusuke Konishi 	{Opt_err_cont, "errors=continue"},
569*783f6184SRyusuke Konishi 	{Opt_err_panic, "errors=panic"},
570*783f6184SRyusuke Konishi 	{Opt_err_ro, "errors=remount-ro"},
571*783f6184SRyusuke Konishi 	{Opt_barrier, "barrier=%s"},
572*783f6184SRyusuke Konishi 	{Opt_snapshot, "cp=%u"},
573*783f6184SRyusuke Konishi 	{Opt_order, "order=%s"},
574*783f6184SRyusuke Konishi 	{Opt_err, NULL}
575*783f6184SRyusuke Konishi };
576*783f6184SRyusuke Konishi 
577*783f6184SRyusuke Konishi static int match_bool(substring_t *s, int *result)
578*783f6184SRyusuke Konishi {
579*783f6184SRyusuke Konishi 	int len = s->to - s->from;
580*783f6184SRyusuke Konishi 
581*783f6184SRyusuke Konishi 	if (strncmp(s->from, "on", len) == 0)
582*783f6184SRyusuke Konishi 		*result = 1;
583*783f6184SRyusuke Konishi 	else if (strncmp(s->from, "off", len) == 0)
584*783f6184SRyusuke Konishi 		*result = 0;
585*783f6184SRyusuke Konishi 	else
586*783f6184SRyusuke Konishi 		return 1;
587*783f6184SRyusuke Konishi 	return 0;
588*783f6184SRyusuke Konishi }
589*783f6184SRyusuke Konishi 
590*783f6184SRyusuke Konishi static int parse_options(char *options, struct super_block *sb)
591*783f6184SRyusuke Konishi {
592*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
593*783f6184SRyusuke Konishi 	char *p;
594*783f6184SRyusuke Konishi 	substring_t args[MAX_OPT_ARGS];
595*783f6184SRyusuke Konishi 	int option;
596*783f6184SRyusuke Konishi 
597*783f6184SRyusuke Konishi 	if (!options)
598*783f6184SRyusuke Konishi 		return 1;
599*783f6184SRyusuke Konishi 
600*783f6184SRyusuke Konishi 	while ((p = strsep(&options, ",")) != NULL) {
601*783f6184SRyusuke Konishi 		int token;
602*783f6184SRyusuke Konishi 		if (!*p)
603*783f6184SRyusuke Konishi 			continue;
604*783f6184SRyusuke Konishi 
605*783f6184SRyusuke Konishi 		token = match_token(p, tokens, args);
606*783f6184SRyusuke Konishi 		switch (token) {
607*783f6184SRyusuke Konishi 		case Opt_barrier:
608*783f6184SRyusuke Konishi 			if (match_bool(&args[0], &option))
609*783f6184SRyusuke Konishi 				return 0;
610*783f6184SRyusuke Konishi 			if (option)
611*783f6184SRyusuke Konishi 				nilfs_set_opt(sbi, BARRIER);
612*783f6184SRyusuke Konishi 			else
613*783f6184SRyusuke Konishi 				nilfs_clear_opt(sbi, BARRIER);
614*783f6184SRyusuke Konishi 			break;
615*783f6184SRyusuke Konishi 		case Opt_order:
616*783f6184SRyusuke Konishi 			if (strcmp(args[0].from, "relaxed") == 0)
617*783f6184SRyusuke Konishi 				/* Ordered data semantics */
618*783f6184SRyusuke Konishi 				nilfs_clear_opt(sbi, STRICT_ORDER);
619*783f6184SRyusuke Konishi 			else if (strcmp(args[0].from, "strict") == 0)
620*783f6184SRyusuke Konishi 				/* Strict in-order semantics */
621*783f6184SRyusuke Konishi 				nilfs_set_opt(sbi, STRICT_ORDER);
622*783f6184SRyusuke Konishi 			else
623*783f6184SRyusuke Konishi 				return 0;
624*783f6184SRyusuke Konishi 			break;
625*783f6184SRyusuke Konishi 		case Opt_err_panic:
626*783f6184SRyusuke Konishi 			nilfs_write_opt(sbi, ERROR_MODE, ERRORS_PANIC);
627*783f6184SRyusuke Konishi 			break;
628*783f6184SRyusuke Konishi 		case Opt_err_ro:
629*783f6184SRyusuke Konishi 			nilfs_write_opt(sbi, ERROR_MODE, ERRORS_RO);
630*783f6184SRyusuke Konishi 			break;
631*783f6184SRyusuke Konishi 		case Opt_err_cont:
632*783f6184SRyusuke Konishi 			nilfs_write_opt(sbi, ERROR_MODE, ERRORS_CONT);
633*783f6184SRyusuke Konishi 			break;
634*783f6184SRyusuke Konishi 		case Opt_snapshot:
635*783f6184SRyusuke Konishi 			if (match_int(&args[0], &option) || option <= 0)
636*783f6184SRyusuke Konishi 				return 0;
637*783f6184SRyusuke Konishi 			if (!(sb->s_flags & MS_RDONLY))
638*783f6184SRyusuke Konishi 				return 0;
639*783f6184SRyusuke Konishi 			sbi->s_snapshot_cno = option;
640*783f6184SRyusuke Konishi 			nilfs_set_opt(sbi, SNAPSHOT);
641*783f6184SRyusuke Konishi 			break;
642*783f6184SRyusuke Konishi 		default:
643*783f6184SRyusuke Konishi 			printk(KERN_ERR
644*783f6184SRyusuke Konishi 			       "NILFS: Unrecognized mount option \"%s\"\n", p);
645*783f6184SRyusuke Konishi 			return 0;
646*783f6184SRyusuke Konishi 		}
647*783f6184SRyusuke Konishi 	}
648*783f6184SRyusuke Konishi 	return 1;
649*783f6184SRyusuke Konishi }
650*783f6184SRyusuke Konishi 
651*783f6184SRyusuke Konishi static inline void
652*783f6184SRyusuke Konishi nilfs_set_default_options(struct nilfs_sb_info *sbi,
653*783f6184SRyusuke Konishi 			  struct nilfs_super_block *sbp)
654*783f6184SRyusuke Konishi {
655*783f6184SRyusuke Konishi 	sbi->s_mount_opt =
656*783f6184SRyusuke Konishi 		NILFS_MOUNT_ERRORS_CONT | NILFS_MOUNT_BARRIER;
657*783f6184SRyusuke Konishi }
658*783f6184SRyusuke Konishi 
659*783f6184SRyusuke Konishi static int nilfs_setup_super(struct nilfs_sb_info *sbi)
660*783f6184SRyusuke Konishi {
661*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
662*783f6184SRyusuke Konishi 	struct nilfs_super_block *sbp = nilfs->ns_sbp;
663*783f6184SRyusuke Konishi 	int max_mnt_count = le16_to_cpu(sbp->s_max_mnt_count);
664*783f6184SRyusuke Konishi 	int mnt_count = le16_to_cpu(sbp->s_mnt_count);
665*783f6184SRyusuke Konishi 
666*783f6184SRyusuke Konishi 	/* nilfs->sem must be locked by the caller. */
667*783f6184SRyusuke Konishi 	if (!(nilfs->ns_mount_state & NILFS_VALID_FS)) {
668*783f6184SRyusuke Konishi 		printk(KERN_WARNING "NILFS warning: mounting unchecked fs\n");
669*783f6184SRyusuke Konishi 	} else if (nilfs->ns_mount_state & NILFS_ERROR_FS) {
670*783f6184SRyusuke Konishi 		printk(KERN_WARNING
671*783f6184SRyusuke Konishi 		       "NILFS warning: mounting fs with errors\n");
672*783f6184SRyusuke Konishi #if 0
673*783f6184SRyusuke Konishi 	} else if (max_mnt_count >= 0 && mnt_count >= max_mnt_count) {
674*783f6184SRyusuke Konishi 		printk(KERN_WARNING
675*783f6184SRyusuke Konishi 		       "NILFS warning: maximal mount count reached\n");
676*783f6184SRyusuke Konishi #endif
677*783f6184SRyusuke Konishi 	}
678*783f6184SRyusuke Konishi 	if (!max_mnt_count)
679*783f6184SRyusuke Konishi 		sbp->s_max_mnt_count = cpu_to_le16(NILFS_DFL_MAX_MNT_COUNT);
680*783f6184SRyusuke Konishi 
681*783f6184SRyusuke Konishi 	sbp->s_mnt_count = cpu_to_le16(mnt_count + 1);
682*783f6184SRyusuke Konishi 	sbp->s_state = cpu_to_le16(le16_to_cpu(sbp->s_state) & ~NILFS_VALID_FS);
683*783f6184SRyusuke Konishi 	sbp->s_mtime = cpu_to_le64(get_seconds());
684*783f6184SRyusuke Konishi 	return nilfs_commit_super(sbi);
685*783f6184SRyusuke Konishi }
686*783f6184SRyusuke Konishi 
687*783f6184SRyusuke Konishi struct nilfs_super_block *
688*783f6184SRyusuke Konishi nilfs_load_super_block(struct super_block *sb, struct buffer_head **pbh)
689*783f6184SRyusuke Konishi {
690*783f6184SRyusuke Konishi 	int blocksize;
691*783f6184SRyusuke Konishi 	unsigned long offset, sb_index;
692*783f6184SRyusuke Konishi 
693*783f6184SRyusuke Konishi 	/*
694*783f6184SRyusuke Konishi 	 * Adjusting block size
695*783f6184SRyusuke Konishi 	 * Blocksize will be enlarged when it is smaller than hardware
696*783f6184SRyusuke Konishi 	 * sector size.
697*783f6184SRyusuke Konishi 	 * Disk format of superblock does not change.
698*783f6184SRyusuke Konishi 	 */
699*783f6184SRyusuke Konishi 	blocksize = sb_min_blocksize(sb, BLOCK_SIZE);
700*783f6184SRyusuke Konishi 	if (!blocksize) {
701*783f6184SRyusuke Konishi 		printk(KERN_ERR
702*783f6184SRyusuke Konishi 		       "NILFS: unable to set blocksize of superblock\n");
703*783f6184SRyusuke Konishi 		return NULL;
704*783f6184SRyusuke Konishi 	}
705*783f6184SRyusuke Konishi 	sb_index = NILFS_SB_OFFSET_BYTES / blocksize;
706*783f6184SRyusuke Konishi 	offset = NILFS_SB_OFFSET_BYTES % blocksize;
707*783f6184SRyusuke Konishi 
708*783f6184SRyusuke Konishi 	*pbh = sb_bread(sb, sb_index);
709*783f6184SRyusuke Konishi 	if (!*pbh) {
710*783f6184SRyusuke Konishi 		printk(KERN_ERR "NILFS: unable to read superblock\n");
711*783f6184SRyusuke Konishi 		return NULL;
712*783f6184SRyusuke Konishi 	}
713*783f6184SRyusuke Konishi 	return (struct nilfs_super_block *)((char *)(*pbh)->b_data + offset);
714*783f6184SRyusuke Konishi }
715*783f6184SRyusuke Konishi 
716*783f6184SRyusuke Konishi struct nilfs_super_block *
717*783f6184SRyusuke Konishi nilfs_reload_super_block(struct super_block *sb, struct buffer_head **pbh,
718*783f6184SRyusuke Konishi 			 int blocksize)
719*783f6184SRyusuke Konishi {
720*783f6184SRyusuke Konishi 	struct nilfs_super_block *sbp;
721*783f6184SRyusuke Konishi 	unsigned long offset, sb_index;
722*783f6184SRyusuke Konishi 	int hw_blocksize = bdev_hardsect_size(sb->s_bdev);
723*783f6184SRyusuke Konishi 
724*783f6184SRyusuke Konishi 	if (blocksize < hw_blocksize) {
725*783f6184SRyusuke Konishi 		printk(KERN_ERR
726*783f6184SRyusuke Konishi 		       "NILFS: blocksize %d too small for device "
727*783f6184SRyusuke Konishi 		       "(sector-size = %d).\n",
728*783f6184SRyusuke Konishi 		       blocksize, hw_blocksize);
729*783f6184SRyusuke Konishi 		goto failed_sbh;
730*783f6184SRyusuke Konishi 	}
731*783f6184SRyusuke Konishi 	brelse(*pbh);
732*783f6184SRyusuke Konishi 	sb_set_blocksize(sb, blocksize);
733*783f6184SRyusuke Konishi 
734*783f6184SRyusuke Konishi 	sb_index = NILFS_SB_OFFSET_BYTES / blocksize;
735*783f6184SRyusuke Konishi 	offset = NILFS_SB_OFFSET_BYTES % blocksize;
736*783f6184SRyusuke Konishi 
737*783f6184SRyusuke Konishi 	*pbh = sb_bread(sb, sb_index);
738*783f6184SRyusuke Konishi 	if (!*pbh) {
739*783f6184SRyusuke Konishi 		printk(KERN_ERR
740*783f6184SRyusuke Konishi 		       "NILFS: cannot read superblock on 2nd try.\n");
741*783f6184SRyusuke Konishi 		goto failed;
742*783f6184SRyusuke Konishi 	}
743*783f6184SRyusuke Konishi 
744*783f6184SRyusuke Konishi 	sbp = (struct nilfs_super_block *)((char *)(*pbh)->b_data + offset);
745*783f6184SRyusuke Konishi 	if (sbp->s_magic != cpu_to_le16(NILFS_SUPER_MAGIC)) {
746*783f6184SRyusuke Konishi 		printk(KERN_ERR
747*783f6184SRyusuke Konishi 		       "NILFS: !? Magic mismatch on 2nd try.\n");
748*783f6184SRyusuke Konishi 		goto failed_sbh;
749*783f6184SRyusuke Konishi 	}
750*783f6184SRyusuke Konishi 	return sbp;
751*783f6184SRyusuke Konishi 
752*783f6184SRyusuke Konishi  failed_sbh:
753*783f6184SRyusuke Konishi 	brelse(*pbh);
754*783f6184SRyusuke Konishi 
755*783f6184SRyusuke Konishi  failed:
756*783f6184SRyusuke Konishi 	return NULL;
757*783f6184SRyusuke Konishi }
758*783f6184SRyusuke Konishi 
759*783f6184SRyusuke Konishi int nilfs_store_magic_and_option(struct super_block *sb,
760*783f6184SRyusuke Konishi 				 struct nilfs_super_block *sbp,
761*783f6184SRyusuke Konishi 				 char *data)
762*783f6184SRyusuke Konishi {
763*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
764*783f6184SRyusuke Konishi 
765*783f6184SRyusuke Konishi 	/* trying to fill super (1st stage) */
766*783f6184SRyusuke Konishi 	sb->s_magic = le16_to_cpu(sbp->s_magic);
767*783f6184SRyusuke Konishi 
768*783f6184SRyusuke Konishi 	/* FS independent flags */
769*783f6184SRyusuke Konishi #ifdef NILFS_ATIME_DISABLE
770*783f6184SRyusuke Konishi 	sb->s_flags |= MS_NOATIME;
771*783f6184SRyusuke Konishi #endif
772*783f6184SRyusuke Konishi 
773*783f6184SRyusuke Konishi 	if (sb->s_magic != NILFS_SUPER_MAGIC) {
774*783f6184SRyusuke Konishi 		printk("NILFS: Can't find nilfs on dev %s.\n", sb->s_id);
775*783f6184SRyusuke Konishi 		return -EINVAL;
776*783f6184SRyusuke Konishi 	}
777*783f6184SRyusuke Konishi 
778*783f6184SRyusuke Konishi 	nilfs_set_default_options(sbi, sbp);
779*783f6184SRyusuke Konishi 
780*783f6184SRyusuke Konishi 	sbi->s_resuid = le16_to_cpu(sbp->s_def_resuid);
781*783f6184SRyusuke Konishi 	sbi->s_resgid = le16_to_cpu(sbp->s_def_resgid);
782*783f6184SRyusuke Konishi 	sbi->s_interval = le32_to_cpu(sbp->s_c_interval);
783*783f6184SRyusuke Konishi 	sbi->s_watermark = le32_to_cpu(sbp->s_c_block_max);
784*783f6184SRyusuke Konishi 
785*783f6184SRyusuke Konishi 	if (!parse_options(data, sb))
786*783f6184SRyusuke Konishi 		return -EINVAL;
787*783f6184SRyusuke Konishi 
788*783f6184SRyusuke Konishi 	return 0;
789*783f6184SRyusuke Konishi }
790*783f6184SRyusuke Konishi 
791*783f6184SRyusuke Konishi /**
792*783f6184SRyusuke Konishi  * nilfs_fill_super() - initialize a super block instance
793*783f6184SRyusuke Konishi  * @sb: super_block
794*783f6184SRyusuke Konishi  * @data: mount options
795*783f6184SRyusuke Konishi  * @silent: silent mode flag
796*783f6184SRyusuke Konishi  * @nilfs: the_nilfs struct
797*783f6184SRyusuke Konishi  *
798*783f6184SRyusuke Konishi  * This function is called exclusively by bd_mount_mutex.
799*783f6184SRyusuke Konishi  * So, the recovery process is protected from other simultaneous mounts.
800*783f6184SRyusuke Konishi  */
801*783f6184SRyusuke Konishi static int
802*783f6184SRyusuke Konishi nilfs_fill_super(struct super_block *sb, void *data, int silent,
803*783f6184SRyusuke Konishi 		 struct the_nilfs *nilfs)
804*783f6184SRyusuke Konishi {
805*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi;
806*783f6184SRyusuke Konishi 	struct inode *root;
807*783f6184SRyusuke Konishi 	__u64 cno;
808*783f6184SRyusuke Konishi 	int err;
809*783f6184SRyusuke Konishi 
810*783f6184SRyusuke Konishi 	sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
811*783f6184SRyusuke Konishi 	if (!sbi)
812*783f6184SRyusuke Konishi 		return -ENOMEM;
813*783f6184SRyusuke Konishi 
814*783f6184SRyusuke Konishi 	sb->s_fs_info = sbi;
815*783f6184SRyusuke Konishi 
816*783f6184SRyusuke Konishi 	get_nilfs(nilfs);
817*783f6184SRyusuke Konishi 	sbi->s_nilfs = nilfs;
818*783f6184SRyusuke Konishi 	sbi->s_super = sb;
819*783f6184SRyusuke Konishi 
820*783f6184SRyusuke Konishi 	err = init_nilfs(nilfs, sbi, (char *)data);
821*783f6184SRyusuke Konishi 	if (err)
822*783f6184SRyusuke Konishi 		goto failed_sbi;
823*783f6184SRyusuke Konishi 
824*783f6184SRyusuke Konishi 	spin_lock_init(&sbi->s_inode_lock);
825*783f6184SRyusuke Konishi 	INIT_LIST_HEAD(&sbi->s_dirty_files);
826*783f6184SRyusuke Konishi 	INIT_LIST_HEAD(&sbi->s_list);
827*783f6184SRyusuke Konishi 
828*783f6184SRyusuke Konishi 	/*
829*783f6184SRyusuke Konishi 	 * Following initialization is overlapped because
830*783f6184SRyusuke Konishi 	 * nilfs_sb_info structure has been cleared at the beginning.
831*783f6184SRyusuke Konishi 	 * But we reserve them to keep our interest and make ready
832*783f6184SRyusuke Konishi 	 * for the future change.
833*783f6184SRyusuke Konishi 	 */
834*783f6184SRyusuke Konishi 	get_random_bytes(&sbi->s_next_generation,
835*783f6184SRyusuke Konishi 			 sizeof(sbi->s_next_generation));
836*783f6184SRyusuke Konishi 	spin_lock_init(&sbi->s_next_gen_lock);
837*783f6184SRyusuke Konishi 
838*783f6184SRyusuke Konishi 	sb->s_op = &nilfs_sops;
839*783f6184SRyusuke Konishi 	sb->s_export_op = &nilfs_export_ops;
840*783f6184SRyusuke Konishi 	sb->s_root = NULL;
841*783f6184SRyusuke Konishi 
842*783f6184SRyusuke Konishi 	if (!nilfs_loaded(nilfs)) {
843*783f6184SRyusuke Konishi 		err = load_nilfs(nilfs, sbi);
844*783f6184SRyusuke Konishi 		if (err)
845*783f6184SRyusuke Konishi 			goto failed_sbi;
846*783f6184SRyusuke Konishi 	}
847*783f6184SRyusuke Konishi 	cno = nilfs_last_cno(nilfs);
848*783f6184SRyusuke Konishi 
849*783f6184SRyusuke Konishi 	if (sb->s_flags & MS_RDONLY) {
850*783f6184SRyusuke Konishi 		if (nilfs_test_opt(sbi, SNAPSHOT)) {
851*783f6184SRyusuke Konishi 			if (!nilfs_cpfile_is_snapshot(nilfs->ns_cpfile,
852*783f6184SRyusuke Konishi 						      sbi->s_snapshot_cno)) {
853*783f6184SRyusuke Konishi 				printk(KERN_ERR
854*783f6184SRyusuke Konishi 				       "NILFS: The specified checkpoint is "
855*783f6184SRyusuke Konishi 				       "not a snapshot "
856*783f6184SRyusuke Konishi 				       "(checkpoint number=%llu).\n",
857*783f6184SRyusuke Konishi 				       (unsigned long long)sbi->s_snapshot_cno);
858*783f6184SRyusuke Konishi 				err = -EINVAL;
859*783f6184SRyusuke Konishi 				goto failed_sbi;
860*783f6184SRyusuke Konishi 			}
861*783f6184SRyusuke Konishi 			cno = sbi->s_snapshot_cno;
862*783f6184SRyusuke Konishi 		} else
863*783f6184SRyusuke Konishi 			/* Read-only mount */
864*783f6184SRyusuke Konishi 			sbi->s_snapshot_cno = cno;
865*783f6184SRyusuke Konishi 	}
866*783f6184SRyusuke Konishi 
867*783f6184SRyusuke Konishi 	err = nilfs_attach_checkpoint(sbi, cno);
868*783f6184SRyusuke Konishi 	if (err) {
869*783f6184SRyusuke Konishi 		printk(KERN_ERR "NILFS: error loading a checkpoint"
870*783f6184SRyusuke Konishi 		       " (checkpoint number=%llu).\n", (unsigned long long)cno);
871*783f6184SRyusuke Konishi 		goto failed_sbi;
872*783f6184SRyusuke Konishi 	}
873*783f6184SRyusuke Konishi 
874*783f6184SRyusuke Konishi 	if (!(sb->s_flags & MS_RDONLY)) {
875*783f6184SRyusuke Konishi 		err = nilfs_attach_segment_constructor(sbi, NULL);
876*783f6184SRyusuke Konishi 		if (err)
877*783f6184SRyusuke Konishi 			goto failed_checkpoint;
878*783f6184SRyusuke Konishi 	}
879*783f6184SRyusuke Konishi 
880*783f6184SRyusuke Konishi 	root = nilfs_iget(sb, NILFS_ROOT_INO);
881*783f6184SRyusuke Konishi 	if (IS_ERR(root)) {
882*783f6184SRyusuke Konishi 		printk(KERN_ERR "NILFS: get root inode failed\n");
883*783f6184SRyusuke Konishi 		err = PTR_ERR(root);
884*783f6184SRyusuke Konishi 		goto failed_segctor;
885*783f6184SRyusuke Konishi 	}
886*783f6184SRyusuke Konishi 	if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
887*783f6184SRyusuke Konishi 		iput(root);
888*783f6184SRyusuke Konishi 		printk(KERN_ERR "NILFS: corrupt root inode.\n");
889*783f6184SRyusuke Konishi 		err = -EINVAL;
890*783f6184SRyusuke Konishi 		goto failed_segctor;
891*783f6184SRyusuke Konishi 	}
892*783f6184SRyusuke Konishi 	sb->s_root = d_alloc_root(root);
893*783f6184SRyusuke Konishi 	if (!sb->s_root) {
894*783f6184SRyusuke Konishi 		iput(root);
895*783f6184SRyusuke Konishi 		printk(KERN_ERR "NILFS: get root dentry failed\n");
896*783f6184SRyusuke Konishi 		err = -ENOMEM;
897*783f6184SRyusuke Konishi 		goto failed_segctor;
898*783f6184SRyusuke Konishi 	}
899*783f6184SRyusuke Konishi 
900*783f6184SRyusuke Konishi 	if (!(sb->s_flags & MS_RDONLY)) {
901*783f6184SRyusuke Konishi 		down_write(&nilfs->ns_sem);
902*783f6184SRyusuke Konishi 		nilfs_setup_super(sbi);
903*783f6184SRyusuke Konishi 		up_write(&nilfs->ns_sem);
904*783f6184SRyusuke Konishi 	}
905*783f6184SRyusuke Konishi 
906*783f6184SRyusuke Konishi 	err = nilfs_mark_recovery_complete(sbi);
907*783f6184SRyusuke Konishi 	if (unlikely(err)) {
908*783f6184SRyusuke Konishi 		printk(KERN_ERR "NILFS: recovery failed.\n");
909*783f6184SRyusuke Konishi 		goto failed_root;
910*783f6184SRyusuke Konishi 	}
911*783f6184SRyusuke Konishi 
912*783f6184SRyusuke Konishi 	return 0;
913*783f6184SRyusuke Konishi 
914*783f6184SRyusuke Konishi  failed_root:
915*783f6184SRyusuke Konishi 	dput(sb->s_root);
916*783f6184SRyusuke Konishi 	sb->s_root = NULL;
917*783f6184SRyusuke Konishi 
918*783f6184SRyusuke Konishi  failed_segctor:
919*783f6184SRyusuke Konishi 	nilfs_detach_segment_constructor(sbi);
920*783f6184SRyusuke Konishi 
921*783f6184SRyusuke Konishi  failed_checkpoint:
922*783f6184SRyusuke Konishi 	nilfs_detach_checkpoint(sbi);
923*783f6184SRyusuke Konishi 
924*783f6184SRyusuke Konishi  failed_sbi:
925*783f6184SRyusuke Konishi 	put_nilfs(nilfs);
926*783f6184SRyusuke Konishi 	sb->s_fs_info = NULL;
927*783f6184SRyusuke Konishi 	kfree(sbi);
928*783f6184SRyusuke Konishi 	return err;
929*783f6184SRyusuke Konishi }
930*783f6184SRyusuke Konishi 
931*783f6184SRyusuke Konishi static int nilfs_remount(struct super_block *sb, int *flags, char *data)
932*783f6184SRyusuke Konishi {
933*783f6184SRyusuke Konishi 	struct nilfs_sb_info *sbi = NILFS_SB(sb);
934*783f6184SRyusuke Konishi 	struct nilfs_super_block *sbp;
935*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = sbi->s_nilfs;
936*783f6184SRyusuke Konishi 	unsigned long old_sb_flags;
937*783f6184SRyusuke Konishi 	struct nilfs_mount_options old_opts;
938*783f6184SRyusuke Konishi 	int err;
939*783f6184SRyusuke Konishi 
940*783f6184SRyusuke Konishi 	old_sb_flags = sb->s_flags;
941*783f6184SRyusuke Konishi 	old_opts.mount_opt = sbi->s_mount_opt;
942*783f6184SRyusuke Konishi 	old_opts.snapshot_cno = sbi->s_snapshot_cno;
943*783f6184SRyusuke Konishi 
944*783f6184SRyusuke Konishi 	if (!parse_options(data, sb)) {
945*783f6184SRyusuke Konishi 		err = -EINVAL;
946*783f6184SRyusuke Konishi 		goto restore_opts;
947*783f6184SRyusuke Konishi 	}
948*783f6184SRyusuke Konishi 	sb->s_flags = (sb->s_flags & ~MS_POSIXACL);
949*783f6184SRyusuke Konishi 
950*783f6184SRyusuke Konishi 	if ((*flags & MS_RDONLY) &&
951*783f6184SRyusuke Konishi 	    sbi->s_snapshot_cno != old_opts.snapshot_cno) {
952*783f6184SRyusuke Konishi 		printk(KERN_WARNING "NILFS (device %s): couldn't "
953*783f6184SRyusuke Konishi 		       "remount to a different snapshot. \n",
954*783f6184SRyusuke Konishi 		       sb->s_id);
955*783f6184SRyusuke Konishi 		err = -EINVAL;
956*783f6184SRyusuke Konishi 		goto restore_opts;
957*783f6184SRyusuke Konishi 	}
958*783f6184SRyusuke Konishi 
959*783f6184SRyusuke Konishi 	if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
960*783f6184SRyusuke Konishi 		goto out;
961*783f6184SRyusuke Konishi 	if (*flags & MS_RDONLY) {
962*783f6184SRyusuke Konishi 		/* Shutting down the segment constructor */
963*783f6184SRyusuke Konishi 		nilfs_detach_segment_constructor(sbi);
964*783f6184SRyusuke Konishi 		sb->s_flags |= MS_RDONLY;
965*783f6184SRyusuke Konishi 
966*783f6184SRyusuke Konishi 		sbi->s_snapshot_cno = nilfs_last_cno(nilfs);
967*783f6184SRyusuke Konishi 		/* nilfs_set_opt(sbi, SNAPSHOT); */
968*783f6184SRyusuke Konishi 
969*783f6184SRyusuke Konishi 		/*
970*783f6184SRyusuke Konishi 		 * Remounting a valid RW partition RDONLY, so set
971*783f6184SRyusuke Konishi 		 * the RDONLY flag and then mark the partition as valid again.
972*783f6184SRyusuke Konishi 		 */
973*783f6184SRyusuke Konishi 		down_write(&nilfs->ns_sem);
974*783f6184SRyusuke Konishi 		sbp = nilfs->ns_sbp;
975*783f6184SRyusuke Konishi 		if (!(sbp->s_state & le16_to_cpu(NILFS_VALID_FS)) &&
976*783f6184SRyusuke Konishi 		    (nilfs->ns_mount_state & NILFS_VALID_FS))
977*783f6184SRyusuke Konishi 			sbp->s_state = cpu_to_le16(nilfs->ns_mount_state);
978*783f6184SRyusuke Konishi 		sbp->s_mtime = cpu_to_le64(get_seconds());
979*783f6184SRyusuke Konishi 		nilfs_commit_super(sbi);
980*783f6184SRyusuke Konishi 		up_write(&nilfs->ns_sem);
981*783f6184SRyusuke Konishi 	} else {
982*783f6184SRyusuke Konishi 		/*
983*783f6184SRyusuke Konishi 		 * Mounting a RDONLY partition read-write, so reread and
984*783f6184SRyusuke Konishi 		 * store the current valid flag.  (It may have been changed
985*783f6184SRyusuke Konishi 		 * by fsck since we originally mounted the partition.)
986*783f6184SRyusuke Konishi 		 */
987*783f6184SRyusuke Konishi 		down(&sb->s_bdev->bd_mount_sem);
988*783f6184SRyusuke Konishi 		/* Check existing RW-mount */
989*783f6184SRyusuke Konishi 		if (test_exclusive_mount(sb->s_type, sb->s_bdev, 0)) {
990*783f6184SRyusuke Konishi 			printk(KERN_WARNING "NILFS (device %s): couldn't "
991*783f6184SRyusuke Konishi 			       "remount because a RW-mount exists.\n",
992*783f6184SRyusuke Konishi 			       sb->s_id);
993*783f6184SRyusuke Konishi 			err = -EBUSY;
994*783f6184SRyusuke Konishi 			goto rw_remount_failed;
995*783f6184SRyusuke Konishi 		}
996*783f6184SRyusuke Konishi 		if (sbi->s_snapshot_cno != nilfs_last_cno(nilfs)) {
997*783f6184SRyusuke Konishi 			printk(KERN_WARNING "NILFS (device %s): couldn't "
998*783f6184SRyusuke Konishi 			       "remount because the current RO-mount is not "
999*783f6184SRyusuke Konishi 			       "the latest one.\n",
1000*783f6184SRyusuke Konishi 			       sb->s_id);
1001*783f6184SRyusuke Konishi 			err = -EINVAL;
1002*783f6184SRyusuke Konishi 			goto rw_remount_failed;
1003*783f6184SRyusuke Konishi 		}
1004*783f6184SRyusuke Konishi 		sb->s_flags &= ~MS_RDONLY;
1005*783f6184SRyusuke Konishi 		nilfs_clear_opt(sbi, SNAPSHOT);
1006*783f6184SRyusuke Konishi 		sbi->s_snapshot_cno = 0;
1007*783f6184SRyusuke Konishi 
1008*783f6184SRyusuke Konishi 		err = nilfs_attach_segment_constructor(sbi, NULL);
1009*783f6184SRyusuke Konishi 		if (err)
1010*783f6184SRyusuke Konishi 			goto rw_remount_failed;
1011*783f6184SRyusuke Konishi 
1012*783f6184SRyusuke Konishi 		down_write(&nilfs->ns_sem);
1013*783f6184SRyusuke Konishi 		nilfs_setup_super(sbi);
1014*783f6184SRyusuke Konishi 		up_write(&nilfs->ns_sem);
1015*783f6184SRyusuke Konishi 
1016*783f6184SRyusuke Konishi 		up(&sb->s_bdev->bd_mount_sem);
1017*783f6184SRyusuke Konishi 	}
1018*783f6184SRyusuke Konishi  out:
1019*783f6184SRyusuke Konishi 	return 0;
1020*783f6184SRyusuke Konishi 
1021*783f6184SRyusuke Konishi  rw_remount_failed:
1022*783f6184SRyusuke Konishi 	up(&sb->s_bdev->bd_mount_sem);
1023*783f6184SRyusuke Konishi  restore_opts:
1024*783f6184SRyusuke Konishi 	sb->s_flags = old_sb_flags;
1025*783f6184SRyusuke Konishi 	sbi->s_mount_opt = old_opts.mount_opt;
1026*783f6184SRyusuke Konishi 	sbi->s_snapshot_cno = old_opts.snapshot_cno;
1027*783f6184SRyusuke Konishi 	return err;
1028*783f6184SRyusuke Konishi }
1029*783f6184SRyusuke Konishi 
1030*783f6184SRyusuke Konishi struct nilfs_super_data {
1031*783f6184SRyusuke Konishi 	struct block_device *bdev;
1032*783f6184SRyusuke Konishi 	__u64 cno;
1033*783f6184SRyusuke Konishi 	int flags;
1034*783f6184SRyusuke Konishi };
1035*783f6184SRyusuke Konishi 
1036*783f6184SRyusuke Konishi /**
1037*783f6184SRyusuke Konishi  * nilfs_identify - pre-read mount options needed to identify mount instance
1038*783f6184SRyusuke Konishi  * @data: mount options
1039*783f6184SRyusuke Konishi  * @sd: nilfs_super_data
1040*783f6184SRyusuke Konishi  */
1041*783f6184SRyusuke Konishi static int nilfs_identify(char *data, struct nilfs_super_data *sd)
1042*783f6184SRyusuke Konishi {
1043*783f6184SRyusuke Konishi 	char *p, *options = data;
1044*783f6184SRyusuke Konishi 	substring_t args[MAX_OPT_ARGS];
1045*783f6184SRyusuke Konishi 	int option, token;
1046*783f6184SRyusuke Konishi 	int ret = 0;
1047*783f6184SRyusuke Konishi 
1048*783f6184SRyusuke Konishi 	do {
1049*783f6184SRyusuke Konishi 		p = strsep(&options, ",");
1050*783f6184SRyusuke Konishi 		if (p != NULL && *p) {
1051*783f6184SRyusuke Konishi 			token = match_token(p, tokens, args);
1052*783f6184SRyusuke Konishi 			if (token == Opt_snapshot) {
1053*783f6184SRyusuke Konishi 				if (!(sd->flags & MS_RDONLY))
1054*783f6184SRyusuke Konishi 					ret++;
1055*783f6184SRyusuke Konishi 				else {
1056*783f6184SRyusuke Konishi 					ret = match_int(&args[0], &option);
1057*783f6184SRyusuke Konishi 					if (!ret) {
1058*783f6184SRyusuke Konishi 						if (option > 0)
1059*783f6184SRyusuke Konishi 							sd->cno = option;
1060*783f6184SRyusuke Konishi 						else
1061*783f6184SRyusuke Konishi 							ret++;
1062*783f6184SRyusuke Konishi 					}
1063*783f6184SRyusuke Konishi 				}
1064*783f6184SRyusuke Konishi 			}
1065*783f6184SRyusuke Konishi 			if (ret)
1066*783f6184SRyusuke Konishi 				printk(KERN_ERR
1067*783f6184SRyusuke Konishi 				       "NILFS: invalid mount option: %s\n", p);
1068*783f6184SRyusuke Konishi 		}
1069*783f6184SRyusuke Konishi 		if (!options)
1070*783f6184SRyusuke Konishi 			break;
1071*783f6184SRyusuke Konishi 		BUG_ON(options == data);
1072*783f6184SRyusuke Konishi 		*(options - 1) = ',';
1073*783f6184SRyusuke Konishi 	} while (!ret);
1074*783f6184SRyusuke Konishi 	return ret;
1075*783f6184SRyusuke Konishi }
1076*783f6184SRyusuke Konishi 
1077*783f6184SRyusuke Konishi static int nilfs_set_bdev_super(struct super_block *s, void *data)
1078*783f6184SRyusuke Konishi {
1079*783f6184SRyusuke Konishi 	struct nilfs_super_data *sd = data;
1080*783f6184SRyusuke Konishi 
1081*783f6184SRyusuke Konishi 	s->s_bdev = sd->bdev;
1082*783f6184SRyusuke Konishi 	s->s_dev = s->s_bdev->bd_dev;
1083*783f6184SRyusuke Konishi 	return 0;
1084*783f6184SRyusuke Konishi }
1085*783f6184SRyusuke Konishi 
1086*783f6184SRyusuke Konishi static int nilfs_test_bdev_super(struct super_block *s, void *data)
1087*783f6184SRyusuke Konishi {
1088*783f6184SRyusuke Konishi 	struct nilfs_super_data *sd = data;
1089*783f6184SRyusuke Konishi 
1090*783f6184SRyusuke Konishi 	return s->s_bdev == sd->bdev;
1091*783f6184SRyusuke Konishi }
1092*783f6184SRyusuke Konishi 
1093*783f6184SRyusuke Konishi static int nilfs_test_bdev_super2(struct super_block *s, void *data)
1094*783f6184SRyusuke Konishi {
1095*783f6184SRyusuke Konishi 	struct nilfs_super_data *sd = data;
1096*783f6184SRyusuke Konishi 	int ret;
1097*783f6184SRyusuke Konishi 
1098*783f6184SRyusuke Konishi 	if (s->s_bdev != sd->bdev)
1099*783f6184SRyusuke Konishi 		return 0;
1100*783f6184SRyusuke Konishi 
1101*783f6184SRyusuke Konishi 	if (!((s->s_flags | sd->flags) & MS_RDONLY))
1102*783f6184SRyusuke Konishi 		return 1; /* Reuse an old R/W-mode super_block */
1103*783f6184SRyusuke Konishi 
1104*783f6184SRyusuke Konishi 	if (s->s_flags & sd->flags & MS_RDONLY) {
1105*783f6184SRyusuke Konishi 		if (down_read_trylock(&s->s_umount)) {
1106*783f6184SRyusuke Konishi 			ret = s->s_root &&
1107*783f6184SRyusuke Konishi 				(sd->cno == NILFS_SB(s)->s_snapshot_cno);
1108*783f6184SRyusuke Konishi 			up_read(&s->s_umount);
1109*783f6184SRyusuke Konishi 			/*
1110*783f6184SRyusuke Konishi 			 * This path is locked with sb_lock by sget().
1111*783f6184SRyusuke Konishi 			 * So, drop_super() causes deadlock.
1112*783f6184SRyusuke Konishi 			 */
1113*783f6184SRyusuke Konishi 			return ret;
1114*783f6184SRyusuke Konishi 		}
1115*783f6184SRyusuke Konishi 	}
1116*783f6184SRyusuke Konishi 	return 0;
1117*783f6184SRyusuke Konishi }
1118*783f6184SRyusuke Konishi 
1119*783f6184SRyusuke Konishi static int
1120*783f6184SRyusuke Konishi nilfs_get_sb(struct file_system_type *fs_type, int flags,
1121*783f6184SRyusuke Konishi 	     const char *dev_name, void *data, struct vfsmount *mnt)
1122*783f6184SRyusuke Konishi {
1123*783f6184SRyusuke Konishi 	struct nilfs_super_data sd;
1124*783f6184SRyusuke Konishi 	struct super_block *s, *s2;
1125*783f6184SRyusuke Konishi 	struct the_nilfs *nilfs = NULL;
1126*783f6184SRyusuke Konishi 	int err, need_to_close = 1;
1127*783f6184SRyusuke Konishi 
1128*783f6184SRyusuke Konishi 	sd.bdev = open_bdev_exclusive(dev_name, flags, fs_type);
1129*783f6184SRyusuke Konishi 	if (IS_ERR(sd.bdev))
1130*783f6184SRyusuke Konishi 		return PTR_ERR(sd.bdev);
1131*783f6184SRyusuke Konishi 
1132*783f6184SRyusuke Konishi 	/*
1133*783f6184SRyusuke Konishi 	 * To get mount instance using sget() vfs-routine, NILFS needs
1134*783f6184SRyusuke Konishi 	 * much more information than normal filesystems to identify mount
1135*783f6184SRyusuke Konishi 	 * instance.  For snapshot mounts, not only a mount type (ro-mount
1136*783f6184SRyusuke Konishi 	 * or rw-mount) but also a checkpoint number is required.
1137*783f6184SRyusuke Konishi 	 * The results are passed in sget() using nilfs_super_data.
1138*783f6184SRyusuke Konishi 	 */
1139*783f6184SRyusuke Konishi 	sd.cno = 0;
1140*783f6184SRyusuke Konishi 	sd.flags = flags;
1141*783f6184SRyusuke Konishi 	if (nilfs_identify((char *)data, &sd)) {
1142*783f6184SRyusuke Konishi 		err = -EINVAL;
1143*783f6184SRyusuke Konishi 		goto failed;
1144*783f6184SRyusuke Konishi 	}
1145*783f6184SRyusuke Konishi 
1146*783f6184SRyusuke Konishi 	/*
1147*783f6184SRyusuke Konishi 	 * once the super is inserted into the list by sget, s_umount
1148*783f6184SRyusuke Konishi 	 * will protect the lockfs code from trying to start a snapshot
1149*783f6184SRyusuke Konishi 	 * while we are mounting
1150*783f6184SRyusuke Konishi 	 */
1151*783f6184SRyusuke Konishi 	down(&sd.bdev->bd_mount_sem);
1152*783f6184SRyusuke Konishi 	if (!sd.cno &&
1153*783f6184SRyusuke Konishi 	    (err = test_exclusive_mount(fs_type, sd.bdev, flags ^ MS_RDONLY))) {
1154*783f6184SRyusuke Konishi 		err = (err < 0) ? : -EBUSY;
1155*783f6184SRyusuke Konishi 		goto failed_unlock;
1156*783f6184SRyusuke Konishi 	}
1157*783f6184SRyusuke Konishi 
1158*783f6184SRyusuke Konishi 	/*
1159*783f6184SRyusuke Konishi 	 * Phase-1: search any existent instance and get the_nilfs
1160*783f6184SRyusuke Konishi 	 */
1161*783f6184SRyusuke Konishi 	s = sget(fs_type, nilfs_test_bdev_super, nilfs_set_bdev_super, &sd);
1162*783f6184SRyusuke Konishi 	if (IS_ERR(s))
1163*783f6184SRyusuke Konishi 		goto error_s;
1164*783f6184SRyusuke Konishi 
1165*783f6184SRyusuke Konishi 	if (!s->s_root) {
1166*783f6184SRyusuke Konishi 		err = -ENOMEM;
1167*783f6184SRyusuke Konishi 		nilfs = alloc_nilfs(sd.bdev);
1168*783f6184SRyusuke Konishi 		if (!nilfs)
1169*783f6184SRyusuke Konishi 			goto cancel_new;
1170*783f6184SRyusuke Konishi 	} else {
1171*783f6184SRyusuke Konishi 		struct nilfs_sb_info *sbi = NILFS_SB(s);
1172*783f6184SRyusuke Konishi 
1173*783f6184SRyusuke Konishi 		BUG_ON(!sbi || !sbi->s_nilfs);
1174*783f6184SRyusuke Konishi 		/*
1175*783f6184SRyusuke Konishi 		 * s_umount protects super_block from unmount process;
1176*783f6184SRyusuke Konishi 		 * It covers pointers of nilfs_sb_info and the_nilfs.
1177*783f6184SRyusuke Konishi 		 */
1178*783f6184SRyusuke Konishi 		nilfs = sbi->s_nilfs;
1179*783f6184SRyusuke Konishi 		get_nilfs(nilfs);
1180*783f6184SRyusuke Konishi 		up_write(&s->s_umount);
1181*783f6184SRyusuke Konishi 
1182*783f6184SRyusuke Konishi 		/*
1183*783f6184SRyusuke Konishi 		 * Phase-2: search specified snapshot or R/W mode super_block
1184*783f6184SRyusuke Konishi 		 */
1185*783f6184SRyusuke Konishi 		if (!sd.cno)
1186*783f6184SRyusuke Konishi 			/* trying to get the latest checkpoint.  */
1187*783f6184SRyusuke Konishi 			sd.cno = nilfs_last_cno(nilfs);
1188*783f6184SRyusuke Konishi 
1189*783f6184SRyusuke Konishi 		s2 = sget(fs_type, nilfs_test_bdev_super2,
1190*783f6184SRyusuke Konishi 			  nilfs_set_bdev_super, &sd);
1191*783f6184SRyusuke Konishi 		deactivate_super(s);
1192*783f6184SRyusuke Konishi 		/*
1193*783f6184SRyusuke Konishi 		 * Although deactivate_super() invokes close_bdev_exclusive() at
1194*783f6184SRyusuke Konishi 		 * kill_block_super().  Here, s is an existent mount; we need
1195*783f6184SRyusuke Konishi 		 * one more close_bdev_exclusive() call.
1196*783f6184SRyusuke Konishi 		 */
1197*783f6184SRyusuke Konishi 		s = s2;
1198*783f6184SRyusuke Konishi 		if (IS_ERR(s))
1199*783f6184SRyusuke Konishi 			goto error_s;
1200*783f6184SRyusuke Konishi 	}
1201*783f6184SRyusuke Konishi 
1202*783f6184SRyusuke Konishi 	if (!s->s_root) {
1203*783f6184SRyusuke Konishi 		char b[BDEVNAME_SIZE];
1204*783f6184SRyusuke Konishi 
1205*783f6184SRyusuke Konishi 		s->s_flags = flags;
1206*783f6184SRyusuke Konishi 		strlcpy(s->s_id, bdevname(sd.bdev, b), sizeof(s->s_id));
1207*783f6184SRyusuke Konishi 		sb_set_blocksize(s, block_size(sd.bdev));
1208*783f6184SRyusuke Konishi 
1209*783f6184SRyusuke Konishi 		err = nilfs_fill_super(s, data, flags & MS_VERBOSE, nilfs);
1210*783f6184SRyusuke Konishi 		if (err)
1211*783f6184SRyusuke Konishi 			goto cancel_new;
1212*783f6184SRyusuke Konishi 
1213*783f6184SRyusuke Konishi 		s->s_flags |= MS_ACTIVE;
1214*783f6184SRyusuke Konishi 		need_to_close = 0;
1215*783f6184SRyusuke Konishi 	} else if (!(s->s_flags & MS_RDONLY)) {
1216*783f6184SRyusuke Konishi 		err = -EBUSY;
1217*783f6184SRyusuke Konishi 	}
1218*783f6184SRyusuke Konishi 
1219*783f6184SRyusuke Konishi 	up(&sd.bdev->bd_mount_sem);
1220*783f6184SRyusuke Konishi 	put_nilfs(nilfs);
1221*783f6184SRyusuke Konishi 	if (need_to_close)
1222*783f6184SRyusuke Konishi 		close_bdev_exclusive(sd.bdev, flags);
1223*783f6184SRyusuke Konishi 	simple_set_mnt(mnt, s);
1224*783f6184SRyusuke Konishi 	return 0;
1225*783f6184SRyusuke Konishi 
1226*783f6184SRyusuke Konishi  error_s:
1227*783f6184SRyusuke Konishi 	up(&sd.bdev->bd_mount_sem);
1228*783f6184SRyusuke Konishi 	if (nilfs)
1229*783f6184SRyusuke Konishi 		put_nilfs(nilfs);
1230*783f6184SRyusuke Konishi 	close_bdev_exclusive(sd.bdev, flags);
1231*783f6184SRyusuke Konishi 	return PTR_ERR(s);
1232*783f6184SRyusuke Konishi 
1233*783f6184SRyusuke Konishi  failed_unlock:
1234*783f6184SRyusuke Konishi 	up(&sd.bdev->bd_mount_sem);
1235*783f6184SRyusuke Konishi  failed:
1236*783f6184SRyusuke Konishi 	close_bdev_exclusive(sd.bdev, flags);
1237*783f6184SRyusuke Konishi 
1238*783f6184SRyusuke Konishi 	return err;
1239*783f6184SRyusuke Konishi 
1240*783f6184SRyusuke Konishi  cancel_new:
1241*783f6184SRyusuke Konishi 	/* Abandoning the newly allocated superblock */
1242*783f6184SRyusuke Konishi 	up(&sd.bdev->bd_mount_sem);
1243*783f6184SRyusuke Konishi 	if (nilfs)
1244*783f6184SRyusuke Konishi 		put_nilfs(nilfs);
1245*783f6184SRyusuke Konishi 	up_write(&s->s_umount);
1246*783f6184SRyusuke Konishi 	deactivate_super(s);
1247*783f6184SRyusuke Konishi 	/*
1248*783f6184SRyusuke Konishi 	 * deactivate_super() invokes close_bdev_exclusive().
1249*783f6184SRyusuke Konishi 	 * We must finish all post-cleaning before this call;
1250*783f6184SRyusuke Konishi 	 * put_nilfs() and unlocking bd_mount_sem need the block device.
1251*783f6184SRyusuke Konishi 	 */
1252*783f6184SRyusuke Konishi 	return err;
1253*783f6184SRyusuke Konishi }
1254*783f6184SRyusuke Konishi 
1255*783f6184SRyusuke Konishi static int nilfs_test_bdev_super3(struct super_block *s, void *data)
1256*783f6184SRyusuke Konishi {
1257*783f6184SRyusuke Konishi 	struct nilfs_super_data *sd = data;
1258*783f6184SRyusuke Konishi 	int ret;
1259*783f6184SRyusuke Konishi 
1260*783f6184SRyusuke Konishi 	if (s->s_bdev != sd->bdev)
1261*783f6184SRyusuke Konishi 		return 0;
1262*783f6184SRyusuke Konishi 	if (down_read_trylock(&s->s_umount)) {
1263*783f6184SRyusuke Konishi 		ret = (s->s_flags & MS_RDONLY) && s->s_root &&
1264*783f6184SRyusuke Konishi 			nilfs_test_opt(NILFS_SB(s), SNAPSHOT);
1265*783f6184SRyusuke Konishi 		up_read(&s->s_umount);
1266*783f6184SRyusuke Konishi 		if (ret)
1267*783f6184SRyusuke Konishi 			return 0; /* ignore snapshot mounts */
1268*783f6184SRyusuke Konishi 	}
1269*783f6184SRyusuke Konishi 	return !((sd->flags ^ s->s_flags) & MS_RDONLY);
1270*783f6184SRyusuke Konishi }
1271*783f6184SRyusuke Konishi 
1272*783f6184SRyusuke Konishi static int __false_bdev_super(struct super_block *s, void *data)
1273*783f6184SRyusuke Konishi {
1274*783f6184SRyusuke Konishi #if 0 /* XXX: workaround for lock debug. This is not good idea */
1275*783f6184SRyusuke Konishi 	up_write(&s->s_umount);
1276*783f6184SRyusuke Konishi #endif
1277*783f6184SRyusuke Konishi 	return -EFAULT;
1278*783f6184SRyusuke Konishi }
1279*783f6184SRyusuke Konishi 
1280*783f6184SRyusuke Konishi /**
1281*783f6184SRyusuke Konishi  * test_exclusive_mount - check whether an exclusive RW/RO mount exists or not.
1282*783f6184SRyusuke Konishi  * fs_type: filesystem type
1283*783f6184SRyusuke Konishi  * bdev: block device
1284*783f6184SRyusuke Konishi  * flag: 0 (check rw-mount) or MS_RDONLY (check ro-mount)
1285*783f6184SRyusuke Konishi  * res: pointer to an integer to store result
1286*783f6184SRyusuke Konishi  *
1287*783f6184SRyusuke Konishi  * This function must be called within a section protected by bd_mount_mutex.
1288*783f6184SRyusuke Konishi  */
1289*783f6184SRyusuke Konishi static int test_exclusive_mount(struct file_system_type *fs_type,
1290*783f6184SRyusuke Konishi 				struct block_device *bdev, int flags)
1291*783f6184SRyusuke Konishi {
1292*783f6184SRyusuke Konishi 	struct super_block *s;
1293*783f6184SRyusuke Konishi 	struct nilfs_super_data sd = { .flags = flags, .bdev = bdev };
1294*783f6184SRyusuke Konishi 
1295*783f6184SRyusuke Konishi 	s = sget(fs_type, nilfs_test_bdev_super3, __false_bdev_super, &sd);
1296*783f6184SRyusuke Konishi 	if (IS_ERR(s)) {
1297*783f6184SRyusuke Konishi 		if (PTR_ERR(s) != -EFAULT)
1298*783f6184SRyusuke Konishi 			return PTR_ERR(s);
1299*783f6184SRyusuke Konishi 		return 0;  /* Not found */
1300*783f6184SRyusuke Konishi 	}
1301*783f6184SRyusuke Konishi 	up_write(&s->s_umount);
1302*783f6184SRyusuke Konishi 	deactivate_super(s);
1303*783f6184SRyusuke Konishi 	return 1;  /* Found */
1304*783f6184SRyusuke Konishi }
1305*783f6184SRyusuke Konishi 
1306*783f6184SRyusuke Konishi struct file_system_type nilfs_fs_type = {
1307*783f6184SRyusuke Konishi 	.owner    = THIS_MODULE,
1308*783f6184SRyusuke Konishi 	.name     = "nilfs2",
1309*783f6184SRyusuke Konishi 	.get_sb   = nilfs_get_sb,
1310*783f6184SRyusuke Konishi 	.kill_sb  = kill_block_super,
1311*783f6184SRyusuke Konishi 	.fs_flags = FS_REQUIRES_DEV,
1312*783f6184SRyusuke Konishi };
1313*783f6184SRyusuke Konishi 
1314*783f6184SRyusuke Konishi static int __init init_nilfs_fs(void)
1315*783f6184SRyusuke Konishi {
1316*783f6184SRyusuke Konishi 	int err;
1317*783f6184SRyusuke Konishi 
1318*783f6184SRyusuke Konishi 	err = nilfs_init_inode_cache();
1319*783f6184SRyusuke Konishi 	if (err)
1320*783f6184SRyusuke Konishi 		goto failed;
1321*783f6184SRyusuke Konishi 
1322*783f6184SRyusuke Konishi 	err = nilfs_init_transaction_cache();
1323*783f6184SRyusuke Konishi 	if (err)
1324*783f6184SRyusuke Konishi 		goto failed_inode_cache;
1325*783f6184SRyusuke Konishi 
1326*783f6184SRyusuke Konishi 	err = nilfs_init_segbuf_cache();
1327*783f6184SRyusuke Konishi 	if (err)
1328*783f6184SRyusuke Konishi 		goto failed_transaction_cache;
1329*783f6184SRyusuke Konishi 
1330*783f6184SRyusuke Konishi 	err = nilfs_btree_path_cache_init();
1331*783f6184SRyusuke Konishi 	if (err)
1332*783f6184SRyusuke Konishi 		goto failed_segbuf_cache;
1333*783f6184SRyusuke Konishi 
1334*783f6184SRyusuke Konishi 	err = register_filesystem(&nilfs_fs_type);
1335*783f6184SRyusuke Konishi 	if (err)
1336*783f6184SRyusuke Konishi 		goto failed_btree_path_cache;
1337*783f6184SRyusuke Konishi 
1338*783f6184SRyusuke Konishi 	return 0;
1339*783f6184SRyusuke Konishi 
1340*783f6184SRyusuke Konishi  failed_btree_path_cache:
1341*783f6184SRyusuke Konishi 	nilfs_btree_path_cache_destroy();
1342*783f6184SRyusuke Konishi 
1343*783f6184SRyusuke Konishi  failed_segbuf_cache:
1344*783f6184SRyusuke Konishi 	nilfs_destroy_segbuf_cache();
1345*783f6184SRyusuke Konishi 
1346*783f6184SRyusuke Konishi  failed_transaction_cache:
1347*783f6184SRyusuke Konishi 	nilfs_destroy_transaction_cache();
1348*783f6184SRyusuke Konishi 
1349*783f6184SRyusuke Konishi  failed_inode_cache:
1350*783f6184SRyusuke Konishi 	nilfs_destroy_inode_cache();
1351*783f6184SRyusuke Konishi 
1352*783f6184SRyusuke Konishi  failed:
1353*783f6184SRyusuke Konishi 	return err;
1354*783f6184SRyusuke Konishi }
1355*783f6184SRyusuke Konishi 
1356*783f6184SRyusuke Konishi static void __exit exit_nilfs_fs(void)
1357*783f6184SRyusuke Konishi {
1358*783f6184SRyusuke Konishi 	nilfs_destroy_segbuf_cache();
1359*783f6184SRyusuke Konishi 	nilfs_destroy_transaction_cache();
1360*783f6184SRyusuke Konishi 	nilfs_destroy_inode_cache();
1361*783f6184SRyusuke Konishi 	nilfs_btree_path_cache_destroy();
1362*783f6184SRyusuke Konishi 	unregister_filesystem(&nilfs_fs_type);
1363*783f6184SRyusuke Konishi }
1364*783f6184SRyusuke Konishi 
1365*783f6184SRyusuke Konishi module_init(init_nilfs_fs)
1366*783f6184SRyusuke Konishi module_exit(exit_nilfs_fs)
1367