super.c 32.4 KB
Newer Older
J
Jaegeuk Kim 已提交
1
/*
J
Jaegeuk Kim 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 * fs/f2fs/super.c
 *
 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
 *             http://www.samsung.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/statfs.h>
#include <linux/buffer_head.h>
#include <linux/backing-dev.h>
#include <linux/kthread.h>
#include <linux/parser.h>
#include <linux/mount.h>
#include <linux/seq_file.h>
21
#include <linux/proc_fs.h>
J
Jaegeuk Kim 已提交
22 23
#include <linux/random.h>
#include <linux/exportfs.h>
24
#include <linux/blkdev.h>
J
Jaegeuk Kim 已提交
25
#include <linux/f2fs_fs.h>
26
#include <linux/sysfs.h>
J
Jaegeuk Kim 已提交
27 28 29

#include "f2fs.h"
#include "node.h"
30
#include "segment.h"
J
Jaegeuk Kim 已提交
31
#include "xattr.h"
32
#include "gc.h"
J
Jaegeuk Kim 已提交
33
#include "trace.h"
J
Jaegeuk Kim 已提交
34

35 36 37
#define CREATE_TRACE_POINTS
#include <trace/events/f2fs.h>

38
static struct proc_dir_entry *f2fs_proc_root;
J
Jaegeuk Kim 已提交
39
static struct kmem_cache *f2fs_inode_cachep;
40
static struct kset *f2fs_kset;
J
Jaegeuk Kim 已提交
41 42

enum {
43
	Opt_gc_background,
J
Jaegeuk Kim 已提交
44
	Opt_disable_roll_forward,
45
	Opt_norecovery,
J
Jaegeuk Kim 已提交
46 47
	Opt_discard,
	Opt_noheap,
48
	Opt_user_xattr,
J
Jaegeuk Kim 已提交
49
	Opt_nouser_xattr,
50
	Opt_acl,
J
Jaegeuk Kim 已提交
51 52 53
	Opt_noacl,
	Opt_active_logs,
	Opt_disable_ext_identify,
J
Jaegeuk Kim 已提交
54
	Opt_inline_xattr,
55
	Opt_inline_data,
56
	Opt_inline_dentry,
57
	Opt_flush_merge,
J
Jaegeuk Kim 已提交
58
	Opt_nobarrier,
59
	Opt_fastboot,
J
Jaegeuk Kim 已提交
60 61 62 63
	Opt_err,
};

static match_table_t f2fs_tokens = {
64
	{Opt_gc_background, "background_gc=%s"},
J
Jaegeuk Kim 已提交
65
	{Opt_disable_roll_forward, "disable_roll_forward"},
66
	{Opt_norecovery, "norecovery"},
J
Jaegeuk Kim 已提交
67 68
	{Opt_discard, "discard"},
	{Opt_noheap, "no_heap"},
69
	{Opt_user_xattr, "user_xattr"},
J
Jaegeuk Kim 已提交
70
	{Opt_nouser_xattr, "nouser_xattr"},
71
	{Opt_acl, "acl"},
J
Jaegeuk Kim 已提交
72 73 74
	{Opt_noacl, "noacl"},
	{Opt_active_logs, "active_logs=%u"},
	{Opt_disable_ext_identify, "disable_ext_identify"},
J
Jaegeuk Kim 已提交
75
	{Opt_inline_xattr, "inline_xattr"},
76
	{Opt_inline_data, "inline_data"},
77
	{Opt_inline_dentry, "inline_dentry"},
78
	{Opt_flush_merge, "flush_merge"},
J
Jaegeuk Kim 已提交
79
	{Opt_nobarrier, "nobarrier"},
80
	{Opt_fastboot, "fastboot"},
J
Jaegeuk Kim 已提交
81 82 83
	{Opt_err, NULL},
};

84
/* Sysfs support for f2fs */
85 86 87
enum {
	GC_THREAD,	/* struct f2fs_gc_thread */
	SM_INFO,	/* struct f2fs_sm_info */
88
	NM_INFO,	/* struct f2fs_nm_info */
89
	F2FS_SBI,	/* struct f2fs_sb_info */
90 91
};

92 93 94 95 96
struct f2fs_attr {
	struct attribute attr;
	ssize_t (*show)(struct f2fs_attr *, struct f2fs_sb_info *, char *);
	ssize_t (*store)(struct f2fs_attr *, struct f2fs_sb_info *,
			 const char *, size_t);
97
	int struct_type;
98 99 100
	int offset;
};

101 102 103 104 105 106
static unsigned char *__struct_ptr(struct f2fs_sb_info *sbi, int struct_type)
{
	if (struct_type == GC_THREAD)
		return (unsigned char *)sbi->gc_thread;
	else if (struct_type == SM_INFO)
		return (unsigned char *)SM_I(sbi);
107 108
	else if (struct_type == NM_INFO)
		return (unsigned char *)NM_I(sbi);
109 110
	else if (struct_type == F2FS_SBI)
		return (unsigned char *)sbi;
111 112 113
	return NULL;
}

114 115 116
static ssize_t f2fs_sbi_show(struct f2fs_attr *a,
			struct f2fs_sb_info *sbi, char *buf)
{
117
	unsigned char *ptr = NULL;
118 119
	unsigned int *ui;

120 121
	ptr = __struct_ptr(sbi, a->struct_type);
	if (!ptr)
122 123
		return -EINVAL;

124
	ui = (unsigned int *)(ptr + a->offset);
125 126 127 128 129 130 131 132

	return snprintf(buf, PAGE_SIZE, "%u\n", *ui);
}

static ssize_t f2fs_sbi_store(struct f2fs_attr *a,
			struct f2fs_sb_info *sbi,
			const char *buf, size_t count)
{
133
	unsigned char *ptr;
134 135 136 137
	unsigned long t;
	unsigned int *ui;
	ssize_t ret;

138 139
	ptr = __struct_ptr(sbi, a->struct_type);
	if (!ptr)
140 141
		return -EINVAL;

142
	ui = (unsigned int *)(ptr + a->offset);
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177

	ret = kstrtoul(skip_spaces(buf), 0, &t);
	if (ret < 0)
		return ret;
	*ui = t;
	return count;
}

static ssize_t f2fs_attr_show(struct kobject *kobj,
				struct attribute *attr, char *buf)
{
	struct f2fs_sb_info *sbi = container_of(kobj, struct f2fs_sb_info,
								s_kobj);
	struct f2fs_attr *a = container_of(attr, struct f2fs_attr, attr);

	return a->show ? a->show(a, sbi, buf) : 0;
}

static ssize_t f2fs_attr_store(struct kobject *kobj, struct attribute *attr,
						const char *buf, size_t len)
{
	struct f2fs_sb_info *sbi = container_of(kobj, struct f2fs_sb_info,
									s_kobj);
	struct f2fs_attr *a = container_of(attr, struct f2fs_attr, attr);

	return a->store ? a->store(a, sbi, buf, len) : 0;
}

static void f2fs_sb_release(struct kobject *kobj)
{
	struct f2fs_sb_info *sbi = container_of(kobj, struct f2fs_sb_info,
								s_kobj);
	complete(&sbi->s_kobj_unregister);
}

178
#define F2FS_ATTR_OFFSET(_struct_type, _name, _mode, _show, _store, _offset) \
179 180 181 182
static struct f2fs_attr f2fs_attr_##_name = {			\
	.attr = {.name = __stringify(_name), .mode = _mode },	\
	.show	= _show,					\
	.store	= _store,					\
183 184
	.struct_type = _struct_type,				\
	.offset = _offset					\
185 186
}

187 188 189 190
#define F2FS_RW_ATTR(struct_type, struct_name, name, elname)	\
	F2FS_ATTR_OFFSET(struct_type, name, 0644,		\
		f2fs_sbi_show, f2fs_sbi_store,			\
		offsetof(struct struct_name, elname))
191

192 193 194 195 196
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_min_sleep_time, min_sleep_time);
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_max_sleep_time, max_sleep_time);
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_no_gc_sleep_time, no_gc_sleep_time);
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_idle, gc_idle);
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments);
197
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, max_small_discards, max_discards);
198 199
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, ipu_policy, ipu_policy);
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, min_ipu_util, min_ipu_util);
200
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, min_fsync_blocks, min_fsync_blocks);
201
F2FS_RW_ATTR(NM_INFO, f2fs_nm_info, ram_thresh, ram_thresh);
202
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, max_victim_search, max_victim_search);
203
F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, dir_level, dir_level);
204 205 206 207 208 209

#define ATTR_LIST(name) (&f2fs_attr_##name.attr)
static struct attribute *f2fs_attrs[] = {
	ATTR_LIST(gc_min_sleep_time),
	ATTR_LIST(gc_max_sleep_time),
	ATTR_LIST(gc_no_gc_sleep_time),
210
	ATTR_LIST(gc_idle),
211
	ATTR_LIST(reclaim_segments),
212
	ATTR_LIST(max_small_discards),
213 214
	ATTR_LIST(ipu_policy),
	ATTR_LIST(min_ipu_util),
215
	ATTR_LIST(min_fsync_blocks),
216
	ATTR_LIST(max_victim_search),
217
	ATTR_LIST(dir_level),
218
	ATTR_LIST(ram_thresh),
219 220 221 222 223 224 225 226 227 228 229 230 231 232
	NULL,
};

static const struct sysfs_ops f2fs_attr_ops = {
	.show	= f2fs_attr_show,
	.store	= f2fs_attr_store,
};

static struct kobj_type f2fs_ktype = {
	.default_attrs	= f2fs_attrs,
	.sysfs_ops	= &f2fs_attr_ops,
	.release	= f2fs_sb_release,
};

233 234 235 236 237 238 239 240 241 242 243 244
void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...)
{
	struct va_format vaf;
	va_list args;

	va_start(args, fmt);
	vaf.fmt = fmt;
	vaf.va = &args;
	printk("%sF2FS-fs (%s): %pV\n", level, sb->s_id, &vaf);
	va_end(args);
}

J
Jaegeuk Kim 已提交
245 246 247 248 249 250 251
static void init_once(void *foo)
{
	struct f2fs_inode_info *fi = (struct f2fs_inode_info *) foo;

	inode_init_once(&fi->vfs_inode);
}

252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
static int parse_options(struct super_block *sb, char *options)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	substring_t args[MAX_OPT_ARGS];
	char *p, *name;
	int arg = 0;

	if (!options)
		return 0;

	while ((p = strsep(&options, ",")) != NULL) {
		int token;
		if (!*p)
			continue;
		/*
		 * Initialize args struct so we know whether arg was
		 * found; some options take optional arguments.
		 */
		args[0].to = args[0].from = NULL;
		token = match_token(p, f2fs_tokens, args);

		switch (token) {
		case Opt_gc_background:
			name = match_strdup(&args[0]);

			if (!name)
				return -ENOMEM;
279
			if (strlen(name) == 2 && !strncmp(name, "on", 2))
280
				set_opt(sbi, BG_GC);
281
			else if (strlen(name) == 3 && !strncmp(name, "off", 3))
282 283 284 285 286 287 288 289 290 291
				clear_opt(sbi, BG_GC);
			else {
				kfree(name);
				return -EINVAL;
			}
			kfree(name);
			break;
		case Opt_disable_roll_forward:
			set_opt(sbi, DISABLE_ROLL_FORWARD);
			break;
292 293 294 295 296 297
		case Opt_norecovery:
			/* this option mounts f2fs with ro */
			set_opt(sbi, DISABLE_ROLL_FORWARD);
			if (!f2fs_readonly(sb))
				return -EINVAL;
			break;
298 299 300 301 302 303 304
		case Opt_discard:
			set_opt(sbi, DISCARD);
			break;
		case Opt_noheap:
			set_opt(sbi, NOHEAP);
			break;
#ifdef CONFIG_F2FS_FS_XATTR
305 306 307
		case Opt_user_xattr:
			set_opt(sbi, XATTR_USER);
			break;
308 309 310
		case Opt_nouser_xattr:
			clear_opt(sbi, XATTR_USER);
			break;
J
Jaegeuk Kim 已提交
311 312 313
		case Opt_inline_xattr:
			set_opt(sbi, INLINE_XATTR);
			break;
314
#else
315 316 317 318
		case Opt_user_xattr:
			f2fs_msg(sb, KERN_INFO,
				"user_xattr options not supported");
			break;
319 320 321 322
		case Opt_nouser_xattr:
			f2fs_msg(sb, KERN_INFO,
				"nouser_xattr options not supported");
			break;
J
Jaegeuk Kim 已提交
323 324 325 326
		case Opt_inline_xattr:
			f2fs_msg(sb, KERN_INFO,
				"inline_xattr options not supported");
			break;
327 328
#endif
#ifdef CONFIG_F2FS_FS_POSIX_ACL
329 330 331
		case Opt_acl:
			set_opt(sbi, POSIX_ACL);
			break;
332 333 334 335
		case Opt_noacl:
			clear_opt(sbi, POSIX_ACL);
			break;
#else
336 337 338
		case Opt_acl:
			f2fs_msg(sb, KERN_INFO, "acl options not supported");
			break;
339 340 341 342 343 344 345 346 347 348 349 350 351 352
		case Opt_noacl:
			f2fs_msg(sb, KERN_INFO, "noacl options not supported");
			break;
#endif
		case Opt_active_logs:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			if (arg != 2 && arg != 4 && arg != NR_CURSEG_TYPE)
				return -EINVAL;
			sbi->active_logs = arg;
			break;
		case Opt_disable_ext_identify:
			set_opt(sbi, DISABLE_EXT_IDENTIFY);
			break;
353 354 355
		case Opt_inline_data:
			set_opt(sbi, INLINE_DATA);
			break;
356 357 358
		case Opt_inline_dentry:
			set_opt(sbi, INLINE_DENTRY);
			break;
359 360 361
		case Opt_flush_merge:
			set_opt(sbi, FLUSH_MERGE);
			break;
J
Jaegeuk Kim 已提交
362 363 364
		case Opt_nobarrier:
			set_opt(sbi, NOBARRIER);
			break;
365 366 367
		case Opt_fastboot:
			set_opt(sbi, FASTBOOT);
			break;
368 369 370 371 372 373 374 375 376 377
		default:
			f2fs_msg(sb, KERN_ERR,
				"Unrecognized mount option \"%s\" or missing value",
				p);
			return -EINVAL;
		}
	}
	return 0;
}

J
Jaegeuk Kim 已提交
378 379 380 381
static struct inode *f2fs_alloc_inode(struct super_block *sb)
{
	struct f2fs_inode_info *fi;

382
	fi = kmem_cache_alloc(f2fs_inode_cachep, GFP_F2FS_ZERO);
J
Jaegeuk Kim 已提交
383 384 385 386 387
	if (!fi)
		return NULL;

	init_once((void *) fi);

M
Masanari Iida 已提交
388
	/* Initialize f2fs-specific inode info */
J
Jaegeuk Kim 已提交
389
	fi->vfs_inode.i_version = 1;
390
	atomic_set(&fi->dirty_pages, 0);
J
Jaegeuk Kim 已提交
391 392 393
	fi->i_current_depth = 1;
	fi->i_advise = 0;
	rwlock_init(&fi->ext.ext_lock);
394
	init_rwsem(&fi->i_sem);
395
	INIT_RADIX_TREE(&fi->inmem_root, GFP_NOFS);
J
Jaegeuk Kim 已提交
396 397
	INIT_LIST_HEAD(&fi->inmem_pages);
	mutex_init(&fi->inmem_lock);
J
Jaegeuk Kim 已提交
398 399 400

	set_inode_flag(fi, FI_NEW_INODE);

J
Jaegeuk Kim 已提交
401 402 403
	if (test_opt(F2FS_SB(sb), INLINE_XATTR))
		set_inode_flag(fi, FI_INLINE_XATTR);

404 405 406
	/* Will be used by directory only */
	fi->i_dir_level = F2FS_SB(sb)->dir_level;

J
Jaegeuk Kim 已提交
407 408 409
	return &fi->vfs_inode;
}

410 411 412 413 414 415 416 417 418 419 420 421 422 423
static int f2fs_drop_inode(struct inode *inode)
{
	/*
	 * This is to avoid a deadlock condition like below.
	 * writeback_single_inode(inode)
	 *  - f2fs_write_data_page
	 *    - f2fs_gc -> iput -> evict
	 *       - inode_wait_for_writeback(inode)
	 */
	if (!inode_unhashed(inode) && inode->i_state & I_SYNC)
		return 0;
	return generic_drop_inode(inode);
}

424 425 426 427 428 429 430 431 432 433
/*
 * f2fs_dirty_inode() is called from __mark_inode_dirty()
 *
 * We should call set_dirty_inode to write the dirty inode through write_inode.
 */
static void f2fs_dirty_inode(struct inode *inode, int flags)
{
	set_inode_flag(F2FS_I(inode), FI_DIRTY_INODE);
}

J
Jaegeuk Kim 已提交
434 435 436 437 438 439
static void f2fs_i_callback(struct rcu_head *head)
{
	struct inode *inode = container_of(head, struct inode, i_rcu);
	kmem_cache_free(f2fs_inode_cachep, F2FS_I(inode));
}

440
static void f2fs_destroy_inode(struct inode *inode)
J
Jaegeuk Kim 已提交
441 442 443 444 445 446 447 448
{
	call_rcu(&inode->i_rcu, f2fs_i_callback);
}

static void f2fs_put_super(struct super_block *sb)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);

449 450 451 452
	if (sbi->s_proc) {
		remove_proc_entry("segment_info", sbi->s_proc);
		remove_proc_entry(sb->s_id, f2fs_proc_root);
	}
453
	kobject_del(&sbi->s_kobj);
454

J
Jaegeuk Kim 已提交
455 456 457
	f2fs_destroy_stats(sbi);
	stop_gc_thread(sbi);

458 459 460 461 462
	/*
	 * We don't need to do checkpoint when superblock is clean.
	 * But, the previous checkpoint was not done by umount, it needs to do
	 * clean checkpoint again.
	 */
463
	if (is_sbi_flag_set(sbi, SBI_IS_DIRTY) ||
464
			!is_set_ckpt_flags(F2FS_CKPT(sbi), CP_UMOUNT_FLAG)) {
465 466 467 468 469
		struct cp_control cpc = {
			.reason = CP_UMOUNT,
		};
		write_checkpoint(sbi, &cpc);
	}
J
Jaegeuk Kim 已提交
470

471 472 473 474
	/*
	 * normally superblock is clean, so we need to release this.
	 * In addition, EIO will skip do checkpoint, we need this as well.
	 */
475
	release_dirty_inode(sbi);
476
	release_discard_addrs(sbi);
477

J
Jaegeuk Kim 已提交
478 479 480 481 482 483 484 485
	iput(sbi->node_inode);
	iput(sbi->meta_inode);

	/* destroy f2fs internal modules */
	destroy_node_manager(sbi);
	destroy_segment_manager(sbi);

	kfree(sbi->ckpt);
486 487
	kobject_put(&sbi->s_kobj);
	wait_for_completion(&sbi->s_kobj_unregister);
J
Jaegeuk Kim 已提交
488 489 490 491 492 493 494 495 496 497

	sb->s_fs_info = NULL;
	brelse(sbi->raw_super_buf);
	kfree(sbi);
}

int f2fs_sync_fs(struct super_block *sb, int sync)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);

498 499
	trace_f2fs_sync_fs(sb, sync);

500
	if (sync) {
501 502
		struct cp_control cpc;

503 504 505
		cpc.reason = (test_opt(sbi, FASTBOOT) ||
					is_sbi_flag_set(sbi, SBI_IS_CLOSE)) ?
						CP_UMOUNT : CP_SYNC;
506
		mutex_lock(&sbi->gc_mutex);
507
		write_checkpoint(sbi, &cpc);
508 509
		mutex_unlock(&sbi->gc_mutex);
	} else {
510
		f2fs_balance_fs(sbi);
511
	}
J
Jaegeuk Kim 已提交
512
	f2fs_trace_ios(NULL, NULL, 1);
J
Jaegeuk Kim 已提交
513

514
	return 0;
J
Jaegeuk Kim 已提交
515 516
}

517 518 519 520
static int f2fs_freeze(struct super_block *sb)
{
	int err;

J
Jaegeuk Kim 已提交
521
	if (f2fs_readonly(sb))
522 523 524 525 526 527 528 529 530 531 532
		return 0;

	err = f2fs_sync_fs(sb, 1);
	return err;
}

static int f2fs_unfreeze(struct super_block *sb)
{
	return 0;
}

J
Jaegeuk Kim 已提交
533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
	struct super_block *sb = dentry->d_sb;
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
	block_t total_count, user_block_count, start_count, ovp_count;

	total_count = le64_to_cpu(sbi->raw_super->block_count);
	user_block_count = sbi->user_block_count;
	start_count = le32_to_cpu(sbi->raw_super->segment0_blkaddr);
	ovp_count = SM_I(sbi)->ovp_segments << sbi->log_blocks_per_seg;
	buf->f_type = F2FS_SUPER_MAGIC;
	buf->f_bsize = sbi->blocksize;

	buf->f_blocks = total_count - start_count;
	buf->f_bfree = buf->f_blocks - valid_user_blocks(sbi) - ovp_count;
	buf->f_bavail = user_block_count - valid_user_blocks(sbi);

551 552
	buf->f_files = sbi->total_node_count - F2FS_RESERVED_NODE_NUM;
	buf->f_ffree = buf->f_files - valid_inode_count(sbi);
J
Jaegeuk Kim 已提交
553

554
	buf->f_namelen = F2FS_NAME_LEN;
J
Jaegeuk Kim 已提交
555 556 557 558 559 560 561 562 563 564
	buf->f_fsid.val[0] = (u32)id;
	buf->f_fsid.val[1] = (u32)(id >> 32);

	return 0;
}

static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
{
	struct f2fs_sb_info *sbi = F2FS_SB(root->d_sb);

565
	if (!f2fs_readonly(sbi->sb) && test_opt(sbi, BG_GC))
566
		seq_printf(seq, ",background_gc=%s", "on");
J
Jaegeuk Kim 已提交
567
	else
568
		seq_printf(seq, ",background_gc=%s", "off");
J
Jaegeuk Kim 已提交
569 570 571 572 573 574 575 576 577 578 579
	if (test_opt(sbi, DISABLE_ROLL_FORWARD))
		seq_puts(seq, ",disable_roll_forward");
	if (test_opt(sbi, DISCARD))
		seq_puts(seq, ",discard");
	if (test_opt(sbi, NOHEAP))
		seq_puts(seq, ",no_heap_alloc");
#ifdef CONFIG_F2FS_FS_XATTR
	if (test_opt(sbi, XATTR_USER))
		seq_puts(seq, ",user_xattr");
	else
		seq_puts(seq, ",nouser_xattr");
J
Jaegeuk Kim 已提交
580 581
	if (test_opt(sbi, INLINE_XATTR))
		seq_puts(seq, ",inline_xattr");
J
Jaegeuk Kim 已提交
582 583 584 585 586 587 588 589
#endif
#ifdef CONFIG_F2FS_FS_POSIX_ACL
	if (test_opt(sbi, POSIX_ACL))
		seq_puts(seq, ",acl");
	else
		seq_puts(seq, ",noacl");
#endif
	if (test_opt(sbi, DISABLE_EXT_IDENTIFY))
590
		seq_puts(seq, ",disable_ext_identify");
591 592
	if (test_opt(sbi, INLINE_DATA))
		seq_puts(seq, ",inline_data");
593 594
	if (test_opt(sbi, INLINE_DENTRY))
		seq_puts(seq, ",inline_dentry");
595
	if (!f2fs_readonly(sbi->sb) && test_opt(sbi, FLUSH_MERGE))
596
		seq_puts(seq, ",flush_merge");
J
Jaegeuk Kim 已提交
597 598
	if (test_opt(sbi, NOBARRIER))
		seq_puts(seq, ",nobarrier");
599 600
	if (test_opt(sbi, FASTBOOT))
		seq_puts(seq, ",fastboot");
J
Jaegeuk Kim 已提交
601 602 603 604 605
	seq_printf(seq, ",active_logs=%u", sbi->active_logs);

	return 0;
}

606 607 608 609
static int segment_info_seq_show(struct seq_file *seq, void *offset)
{
	struct super_block *sb = seq->private;
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
C
Chris Fries 已提交
610 611
	unsigned int total_segs =
			le32_to_cpu(sbi->raw_super->segment_count_main);
612 613
	int i;

614 615 616
	seq_puts(seq, "format: segment_type|valid_blocks\n"
		"segment_type(0:HD, 1:WD, 2:CD, 3:HN, 4:WN, 5:CN)\n");

617
	for (i = 0; i < total_segs; i++) {
618 619 620 621 622 623
		struct seg_entry *se = get_seg_entry(sbi, i);

		if ((i % 10) == 0)
			seq_printf(seq, "%-5d", i);
		seq_printf(seq, "%d|%-3u", se->type,
					get_valid_blocks(sbi, i, 1));
624 625
		if ((i % 10) == 9 || i == (total_segs - 1))
			seq_putc(seq, '\n');
626
		else
627
			seq_putc(seq, ' ');
628
	}
629

630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
	return 0;
}

static int segment_info_open_fs(struct inode *inode, struct file *file)
{
	return single_open(file, segment_info_seq_show, PDE_DATA(inode));
}

static const struct file_operations f2fs_seq_segment_info_fops = {
	.owner = THIS_MODULE,
	.open = segment_info_open_fs,
	.read = seq_read,
	.llseek = seq_lseek,
	.release = single_release,
};

646 647 648 649 650
static int f2fs_remount(struct super_block *sb, int *flags, char *data)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	struct f2fs_mount_info org_mount_opt;
	int err, active_logs;
651 652
	bool need_restart_gc = false;
	bool need_stop_gc = false;
653

654 655
	sync_filesystem(sb);

656 657 658 659 660 661 662
	/*
	 * Save the old mount options in case we
	 * need to restore them.
	 */
	org_mount_opt = sbi->mount_opt;
	active_logs = sbi->active_logs;

663 664 665
	sbi->mount_opt.opt = 0;
	sbi->active_logs = NR_CURSEG_TYPE;

666 667 668 669 670 671 672
	/* parse mount options */
	err = parse_options(sb, data);
	if (err)
		goto restore_opts;

	/*
	 * Previous and new state of filesystem is RO,
673
	 * so skip checking GC and FLUSH_MERGE conditions.
674
	 */
675
	if (f2fs_readonly(sb) && (*flags & MS_RDONLY))
676 677 678 679 680 681 682 683 684 685 686
		goto skip;

	/*
	 * We stop the GC thread if FS is mounted as RO
	 * or if background_gc = off is passed in mount
	 * option. Also sync the filesystem.
	 */
	if ((*flags & MS_RDONLY) || !test_opt(sbi, BG_GC)) {
		if (sbi->gc_thread) {
			stop_gc_thread(sbi);
			f2fs_sync_fs(sb, 1);
687
			need_restart_gc = true;
688
		}
689
	} else if (!sbi->gc_thread) {
690 691 692
		err = start_gc_thread(sbi);
		if (err)
			goto restore_opts;
693 694 695 696 697 698 699 700
		need_stop_gc = true;
	}

	/*
	 * We stop issue flush thread if FS is mounted as RO
	 * or if flush_merge is not passed in mount option.
	 */
	if ((*flags & MS_RDONLY) || !test_opt(sbi, FLUSH_MERGE)) {
701
		destroy_flush_cmd_control(sbi);
702
	} else if (!SM_I(sbi)->cmd_control_info) {
703 704
		err = create_flush_cmd_control(sbi);
		if (err)
705
			goto restore_gc;
706 707 708 709 710 711
	}
skip:
	/* Update the POSIXACL Flag */
	 sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
		(test_opt(sbi, POSIX_ACL) ? MS_POSIXACL : 0);
	return 0;
712 713 714 715
restore_gc:
	if (need_restart_gc) {
		if (start_gc_thread(sbi))
			f2fs_msg(sbi->sb, KERN_WARNING,
A
arter97 已提交
716
				"background gc thread has stopped");
717 718 719
	} else if (need_stop_gc) {
		stop_gc_thread(sbi);
	}
720 721 722 723 724 725
restore_opts:
	sbi->mount_opt = org_mount_opt;
	sbi->active_logs = active_logs;
	return err;
}

J
Jaegeuk Kim 已提交
726 727
static struct super_operations f2fs_sops = {
	.alloc_inode	= f2fs_alloc_inode,
728
	.drop_inode	= f2fs_drop_inode,
J
Jaegeuk Kim 已提交
729 730
	.destroy_inode	= f2fs_destroy_inode,
	.write_inode	= f2fs_write_inode,
731
	.dirty_inode	= f2fs_dirty_inode,
J
Jaegeuk Kim 已提交
732 733 734 735
	.show_options	= f2fs_show_options,
	.evict_inode	= f2fs_evict_inode,
	.put_super	= f2fs_put_super,
	.sync_fs	= f2fs_sync_fs,
736 737
	.freeze_fs	= f2fs_freeze,
	.unfreeze_fs	= f2fs_unfreeze,
J
Jaegeuk Kim 已提交
738
	.statfs		= f2fs_statfs,
739
	.remount_fs	= f2fs_remount,
J
Jaegeuk Kim 已提交
740 741 742 743 744 745 746 747
};

static struct inode *f2fs_nfs_get_inode(struct super_block *sb,
		u64 ino, u32 generation)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	struct inode *inode;

748
	if (check_nid_range(sbi, ino))
749
		return ERR_PTR(-ESTALE);
J
Jaegeuk Kim 已提交
750 751 752 753 754 755 756 757 758

	/*
	 * f2fs_iget isn't quite right if the inode is currently unallocated!
	 * However f2fs_iget currently does appropriate checks to handle stale
	 * inodes so everything is OK.
	 */
	inode = f2fs_iget(sb, ino);
	if (IS_ERR(inode))
		return ERR_CAST(inode);
759
	if (unlikely(generation && inode->i_generation != generation)) {
J
Jaegeuk Kim 已提交
760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
		/* we didn't find the right inode.. */
		iput(inode);
		return ERR_PTR(-ESTALE);
	}
	return inode;
}

static struct dentry *f2fs_fh_to_dentry(struct super_block *sb, struct fid *fid,
		int fh_len, int fh_type)
{
	return generic_fh_to_dentry(sb, fid, fh_len, fh_type,
				    f2fs_nfs_get_inode);
}

static struct dentry *f2fs_fh_to_parent(struct super_block *sb, struct fid *fid,
		int fh_len, int fh_type)
{
	return generic_fh_to_parent(sb, fid, fh_len, fh_type,
				    f2fs_nfs_get_inode);
}

static const struct export_operations f2fs_export_ops = {
	.fh_to_dentry = f2fs_fh_to_dentry,
	.fh_to_parent = f2fs_fh_to_parent,
	.get_parent = f2fs_get_parent,
};

static loff_t max_file_size(unsigned bits)
{
789
	loff_t result = (DEF_ADDRS_PER_INODE - F2FS_INLINE_XATTR_ADDRS);
J
Jaegeuk Kim 已提交
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806
	loff_t leaf_count = ADDRS_PER_BLOCK;

	/* two direct node blocks */
	result += (leaf_count * 2);

	/* two indirect node blocks */
	leaf_count *= NIDS_PER_BLOCK;
	result += (leaf_count * 2);

	/* one double indirect node block */
	leaf_count *= NIDS_PER_BLOCK;
	result += leaf_count;

	result <<= bits;
	return result;
}

807 808
static int sanity_check_raw_super(struct super_block *sb,
			struct f2fs_super_block *raw_super)
J
Jaegeuk Kim 已提交
809 810 811
{
	unsigned int blocksize;

812 813 814 815
	if (F2FS_SUPER_MAGIC != le32_to_cpu(raw_super->magic)) {
		f2fs_msg(sb, KERN_INFO,
			"Magic Mismatch, valid(0x%x) - read(0x%x)",
			F2FS_SUPER_MAGIC, le32_to_cpu(raw_super->magic));
J
Jaegeuk Kim 已提交
816
		return 1;
817
	}
J
Jaegeuk Kim 已提交
818

819 820 821
	/* Currently, support only 4KB page cache size */
	if (F2FS_BLKSIZE != PAGE_CACHE_SIZE) {
		f2fs_msg(sb, KERN_INFO,
822
			"Invalid page_cache_size (%lu), supports only 4KB\n",
823 824 825 826
			PAGE_CACHE_SIZE);
		return 1;
	}

J
Jaegeuk Kim 已提交
827 828
	/* Currently, support only 4KB block size */
	blocksize = 1 << le32_to_cpu(raw_super->log_blocksize);
829
	if (blocksize != F2FS_BLKSIZE) {
830 831 832
		f2fs_msg(sb, KERN_INFO,
			"Invalid blocksize (%u), supports only 4KB\n",
			blocksize);
J
Jaegeuk Kim 已提交
833
		return 1;
834
	}
835

C
Chao Yu 已提交
836 837 838 839 840 841 842
	/* Currently, support 512/1024/2048/4096 bytes sector size */
	if (le32_to_cpu(raw_super->log_sectorsize) >
				F2FS_MAX_LOG_SECTOR_SIZE ||
		le32_to_cpu(raw_super->log_sectorsize) <
				F2FS_MIN_LOG_SECTOR_SIZE) {
		f2fs_msg(sb, KERN_INFO, "Invalid log sectorsize (%u)",
			le32_to_cpu(raw_super->log_sectorsize));
J
Jaegeuk Kim 已提交
843
		return 1;
844
	}
C
Chao Yu 已提交
845 846 847 848 849 850 851
	if (le32_to_cpu(raw_super->log_sectors_per_block) +
		le32_to_cpu(raw_super->log_sectorsize) !=
			F2FS_MAX_LOG_SECTOR_SIZE) {
		f2fs_msg(sb, KERN_INFO,
			"Invalid log sectors per block(%u) log sectorsize(%u)",
			le32_to_cpu(raw_super->log_sectors_per_block),
			le32_to_cpu(raw_super->log_sectorsize));
J
Jaegeuk Kim 已提交
852
		return 1;
853
	}
J
Jaegeuk Kim 已提交
854 855 856
	return 0;
}

857
static int sanity_check_ckpt(struct f2fs_sb_info *sbi)
J
Jaegeuk Kim 已提交
858 859
{
	unsigned int total, fsmeta;
860 861
	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
J
Jaegeuk Kim 已提交
862 863 864 865 866 867 868 869

	total = le32_to_cpu(raw_super->segment_count);
	fsmeta = le32_to_cpu(raw_super->segment_count_ckpt);
	fsmeta += le32_to_cpu(raw_super->segment_count_sit);
	fsmeta += le32_to_cpu(raw_super->segment_count_nat);
	fsmeta += le32_to_cpu(ckpt->rsvd_segment_count);
	fsmeta += le32_to_cpu(raw_super->segment_count_ssa);

870
	if (unlikely(fsmeta >= total))
J
Jaegeuk Kim 已提交
871
		return 1;
872

873
	if (unlikely(f2fs_cp_error(sbi))) {
874 875 876
		f2fs_msg(sbi->sb, KERN_ERR, "A bug case: need to run fsck");
		return 1;
	}
J
Jaegeuk Kim 已提交
877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899
	return 0;
}

static void init_sb_info(struct f2fs_sb_info *sbi)
{
	struct f2fs_super_block *raw_super = sbi->raw_super;
	int i;

	sbi->log_sectors_per_block =
		le32_to_cpu(raw_super->log_sectors_per_block);
	sbi->log_blocksize = le32_to_cpu(raw_super->log_blocksize);
	sbi->blocksize = 1 << sbi->log_blocksize;
	sbi->log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
	sbi->blocks_per_seg = 1 << sbi->log_blocks_per_seg;
	sbi->segs_per_sec = le32_to_cpu(raw_super->segs_per_sec);
	sbi->secs_per_zone = le32_to_cpu(raw_super->secs_per_zone);
	sbi->total_sections = le32_to_cpu(raw_super->section_count);
	sbi->total_node_count =
		(le32_to_cpu(raw_super->segment_count_nat) / 2)
			* sbi->blocks_per_seg * NAT_ENTRY_PER_BLOCK;
	sbi->root_ino_num = le32_to_cpu(raw_super->root_ino);
	sbi->node_ino_num = le32_to_cpu(raw_super->node_ino);
	sbi->meta_ino_num = le32_to_cpu(raw_super->meta_ino);
900
	sbi->cur_victim_sec = NULL_SECNO;
901
	sbi->max_victim_search = DEF_MAX_VICTIM_SEARCH;
J
Jaegeuk Kim 已提交
902 903 904

	for (i = 0; i < NR_COUNT_TYPE; i++)
		atomic_set(&sbi->nr_pages[i], 0);
905 906

	sbi->dir_level = DEF_DIR_LEVEL;
907
	clear_sbi_flag(sbi, SBI_NEED_FSCK);
J
Jaegeuk Kim 已提交
908 909
}

910 911 912 913 914 915 916 917
/*
 * Read f2fs raw super block.
 * Because we have two copies of super block, so read the first one at first,
 * if the first one is invalid, move to read the second one.
 */
static int read_raw_super_block(struct super_block *sb,
			struct f2fs_super_block **raw_super,
			struct buffer_head **raw_super_buf)
918
{
919
	int block = 0;
920

921
retry:
922 923
	*raw_super_buf = sb_bread(sb, block);
	if (!*raw_super_buf) {
924 925 926 927 928 929 930 931
		f2fs_msg(sb, KERN_ERR, "Unable to read %dth superblock",
				block + 1);
		if (block == 0) {
			block++;
			goto retry;
		} else {
			return -EIO;
		}
932 933 934 935 936 937
	}

	*raw_super = (struct f2fs_super_block *)
		((char *)(*raw_super_buf)->b_data + F2FS_SUPER_OFFSET);

	/* sanity checking of raw super */
938 939
	if (sanity_check_raw_super(sb, *raw_super)) {
		brelse(*raw_super_buf);
C
Chris Fries 已提交
940 941 942
		f2fs_msg(sb, KERN_ERR,
			"Can't find valid F2FS filesystem in %dth superblock",
								block + 1);
943
		if (block == 0) {
944 945 946 947 948 949
			block++;
			goto retry;
		} else {
			return -EINVAL;
		}
	}
950

951
	return 0;
952 953
}

J
Jaegeuk Kim 已提交
954 955 956
static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
{
	struct f2fs_sb_info *sbi;
957
	struct f2fs_super_block *raw_super = NULL;
J
Jaegeuk Kim 已提交
958 959 960
	struct buffer_head *raw_super_buf;
	struct inode *root;
	long err = -EINVAL;
961
	bool retry = true;
962
	char *options = NULL;
963
	int i;
J
Jaegeuk Kim 已提交
964

965
try_onemore:
J
Jaegeuk Kim 已提交
966 967 968 969 970
	/* allocate memory for f2fs-specific super block info */
	sbi = kzalloc(sizeof(struct f2fs_sb_info), GFP_KERNEL);
	if (!sbi)
		return -ENOMEM;

971
	/* set a block size */
972
	if (unlikely(!sb_set_blocksize(sb, F2FS_BLKSIZE))) {
973
		f2fs_msg(sb, KERN_ERR, "unable to set blocksize");
J
Jaegeuk Kim 已提交
974
		goto free_sbi;
975
	}
J
Jaegeuk Kim 已提交
976

977 978 979 980
	err = read_raw_super_block(sb, &raw_super, &raw_super_buf);
	if (err)
		goto free_sbi;

981
	sb->s_fs_info = sbi;
J
Jaegeuk Kim 已提交
982 983 984 985 986 987 988 989 990 991 992 993
	/* init some FS parameters */
	sbi->active_logs = NR_CURSEG_TYPE;

	set_opt(sbi, BG_GC);

#ifdef CONFIG_F2FS_FS_XATTR
	set_opt(sbi, XATTR_USER);
#endif
#ifdef CONFIG_F2FS_FS_POSIX_ACL
	set_opt(sbi, POSIX_ACL);
#endif
	/* parse mount options */
994 995 996
	options = kstrdup((const char *)data, GFP_KERNEL);
	if (data && !options) {
		err = -ENOMEM;
J
Jaegeuk Kim 已提交
997
		goto free_sb_buf;
998 999 1000 1001 1002
	}

	err = parse_options(sb, options);
	if (err)
		goto free_options;
J
Jaegeuk Kim 已提交
1003

1004
	sb->s_maxbytes = max_file_size(le32_to_cpu(raw_super->log_blocksize));
J
Jaegeuk Kim 已提交
1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
	sb->s_max_links = F2FS_LINK_MAX;
	get_random_bytes(&sbi->s_next_generation, sizeof(u32));

	sb->s_op = &f2fs_sops;
	sb->s_xattr = f2fs_xattr_handlers;
	sb->s_export_op = &f2fs_export_ops;
	sb->s_magic = F2FS_SUPER_MAGIC;
	sb->s_time_gran = 1;
	sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
		(test_opt(sbi, POSIX_ACL) ? MS_POSIXACL : 0);
	memcpy(sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));

	/* init f2fs-specific super block info */
	sbi->sb = sb;
	sbi->raw_super = raw_super;
	sbi->raw_super_buf = raw_super_buf;
	mutex_init(&sbi->gc_mutex);
	mutex_init(&sbi->writepages);
	mutex_init(&sbi->cp_mutex);
1024
	init_rwsem(&sbi->node_write);
1025
	clear_sbi_flag(sbi, SBI_POR_DOING);
J
Jaegeuk Kim 已提交
1026
	spin_lock_init(&sbi->stat_lock);
1027

1028
	init_rwsem(&sbi->read_io.io_rwsem);
J
Jaegeuk Kim 已提交
1029 1030 1031
	sbi->read_io.sbi = sbi;
	sbi->read_io.bio = NULL;
	for (i = 0; i < NR_PAGE_TYPE; i++) {
1032
		init_rwsem(&sbi->write_io[i].io_rwsem);
J
Jaegeuk Kim 已提交
1033 1034 1035
		sbi->write_io[i].sbi = sbi;
		sbi->write_io[i].bio = NULL;
	}
1036

1037
	init_rwsem(&sbi->cp_rwsem);
1038
	init_waitqueue_head(&sbi->cp_wait);
J
Jaegeuk Kim 已提交
1039 1040 1041 1042 1043
	init_sb_info(sbi);

	/* get an inode for meta space */
	sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi));
	if (IS_ERR(sbi->meta_inode)) {
1044
		f2fs_msg(sb, KERN_ERR, "Failed to read F2FS meta data inode");
J
Jaegeuk Kim 已提交
1045
		err = PTR_ERR(sbi->meta_inode);
1046
		goto free_options;
J
Jaegeuk Kim 已提交
1047 1048 1049
	}

	err = get_valid_checkpoint(sbi);
1050 1051
	if (err) {
		f2fs_msg(sb, KERN_ERR, "Failed to get valid F2FS checkpoint");
J
Jaegeuk Kim 已提交
1052
		goto free_meta_inode;
1053
	}
J
Jaegeuk Kim 已提交
1054 1055 1056

	/* sanity checking of checkpoint */
	err = -EINVAL;
1057
	if (sanity_check_ckpt(sbi)) {
1058
		f2fs_msg(sb, KERN_ERR, "Invalid F2FS checkpoint");
J
Jaegeuk Kim 已提交
1059
		goto free_cp;
1060
	}
J
Jaegeuk Kim 已提交
1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073

	sbi->total_valid_node_count =
				le32_to_cpu(sbi->ckpt->valid_node_count);
	sbi->total_valid_inode_count =
				le32_to_cpu(sbi->ckpt->valid_inode_count);
	sbi->user_block_count = le64_to_cpu(sbi->ckpt->user_block_count);
	sbi->total_valid_block_count =
				le64_to_cpu(sbi->ckpt->valid_block_count);
	sbi->last_valid_block_count = sbi->total_valid_block_count;
	sbi->alloc_valid_block_count = 0;
	INIT_LIST_HEAD(&sbi->dir_inode_list);
	spin_lock_init(&sbi->dir_inode_lock);

J
Jaegeuk Kim 已提交
1074
	init_ino_entry_info(sbi);
J
Jaegeuk Kim 已提交
1075 1076 1077

	/* setup f2fs internal modules */
	err = build_segment_manager(sbi);
1078 1079 1080
	if (err) {
		f2fs_msg(sb, KERN_ERR,
			"Failed to initialize F2FS segment manager");
J
Jaegeuk Kim 已提交
1081
		goto free_sm;
1082
	}
J
Jaegeuk Kim 已提交
1083
	err = build_node_manager(sbi);
1084 1085 1086
	if (err) {
		f2fs_msg(sb, KERN_ERR,
			"Failed to initialize F2FS node manager");
J
Jaegeuk Kim 已提交
1087
		goto free_nm;
1088
	}
J
Jaegeuk Kim 已提交
1089 1090 1091 1092 1093 1094

	build_gc_manager(sbi);

	/* get an inode for node space */
	sbi->node_inode = f2fs_iget(sb, F2FS_NODE_INO(sbi));
	if (IS_ERR(sbi->node_inode)) {
1095
		f2fs_msg(sb, KERN_ERR, "Failed to read node inode");
J
Jaegeuk Kim 已提交
1096 1097 1098 1099 1100
		err = PTR_ERR(sbi->node_inode);
		goto free_nm;
	}

	/* if there are nt orphan nodes free them */
1101
	recover_orphan_inodes(sbi);
J
Jaegeuk Kim 已提交
1102 1103 1104 1105

	/* read root inode and dentry */
	root = f2fs_iget(sb, F2FS_ROOT_INO(sbi));
	if (IS_ERR(root)) {
1106
		f2fs_msg(sb, KERN_ERR, "Failed to read root inode");
J
Jaegeuk Kim 已提交
1107 1108 1109
		err = PTR_ERR(root);
		goto free_node_inode;
	}
1110
	if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
1111
		iput(root);
1112
		err = -EINVAL;
1113
		goto free_node_inode;
1114
	}
J
Jaegeuk Kim 已提交
1115 1116 1117 1118 1119 1120 1121 1122 1123

	sb->s_root = d_make_root(root); /* allocate root dentry */
	if (!sb->s_root) {
		err = -ENOMEM;
		goto free_root_inode;
	}

	err = f2fs_build_stats(sbi);
	if (err)
1124
		goto free_root_inode;
J
Jaegeuk Kim 已提交
1125

1126 1127 1128 1129 1130 1131 1132
	if (f2fs_proc_root)
		sbi->s_proc = proc_mkdir(sb->s_id, f2fs_proc_root);

	if (sbi->s_proc)
		proc_create_data("segment_info", S_IRUGO, sbi->s_proc,
				 &f2fs_seq_segment_info_fops, sb);

1133 1134 1135 1136 1137 1138 1139 1140
	if (test_opt(sbi, DISCARD)) {
		struct request_queue *q = bdev_get_queue(sb->s_bdev);
		if (!blk_queue_discard(q))
			f2fs_msg(sb, KERN_WARNING,
					"mounting with \"discard\" option, but "
					"the device does not support discard");
	}

1141 1142 1143 1144 1145
	sbi->s_kobj.kset = f2fs_kset;
	init_completion(&sbi->s_kobj_unregister);
	err = kobject_init_and_add(&sbi->s_kobj, &f2fs_ktype, NULL,
							"%s", sb->s_id);
	if (err)
1146
		goto free_proc;
1147

1148
	if (!retry)
1149
		set_sbi_flag(sbi, SBI_NEED_FSCK);
1150

1151 1152 1153
	/* recover fsynced data */
	if (!test_opt(sbi, DISABLE_ROLL_FORWARD)) {
		err = recover_fsync_data(sbi);
1154
		if (err) {
1155 1156
			f2fs_msg(sb, KERN_ERR,
				"Cannot recover all fsync data errno=%ld", err);
1157 1158
			goto free_kobj;
		}
1159
	}
1160

1161 1162 1163 1164
	/*
	 * If filesystem is not mounted as read-only then
	 * do start the gc_thread.
	 */
1165
	if (test_opt(sbi, BG_GC) && !f2fs_readonly(sb)) {
1166 1167 1168 1169 1170
		/* After POR, we can run background GC thread.*/
		err = start_gc_thread(sbi);
		if (err)
			goto free_kobj;
	}
1171
	kfree(options);
J
Jaegeuk Kim 已提交
1172
	return 0;
1173 1174 1175 1176

free_kobj:
	kobject_del(&sbi->s_kobj);
free_proc:
1177 1178 1179 1180 1181
	if (sbi->s_proc) {
		remove_proc_entry("segment_info", sbi->s_proc);
		remove_proc_entry(sb->s_id, f2fs_proc_root);
	}
	f2fs_destroy_stats(sbi);
J
Jaegeuk Kim 已提交
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195
free_root_inode:
	dput(sb->s_root);
	sb->s_root = NULL;
free_node_inode:
	iput(sbi->node_inode);
free_nm:
	destroy_node_manager(sbi);
free_sm:
	destroy_segment_manager(sbi);
free_cp:
	kfree(sbi->ckpt);
free_meta_inode:
	make_bad_inode(sbi->meta_inode);
	iput(sbi->meta_inode);
1196 1197
free_options:
	kfree(options);
J
Jaegeuk Kim 已提交
1198 1199 1200 1201
free_sb_buf:
	brelse(raw_super_buf);
free_sbi:
	kfree(sbi);
1202 1203 1204

	/* give only one another chance */
	if (retry) {
1205
		retry = 0;
1206 1207 1208
		shrink_dcache_sb(sb);
		goto try_onemore;
	}
J
Jaegeuk Kim 已提交
1209 1210 1211 1212 1213 1214 1215 1216 1217
	return err;
}

static struct dentry *f2fs_mount(struct file_system_type *fs_type, int flags,
			const char *dev_name, void *data)
{
	return mount_bdev(fs_type, flags, dev_name, data, f2fs_fill_super);
}

1218 1219 1220
static void kill_f2fs_super(struct super_block *sb)
{
	if (sb->s_root)
1221
		set_sbi_flag(F2FS_SB(sb), SBI_IS_CLOSE);
1222 1223 1224
	kill_block_super(sb);
}

J
Jaegeuk Kim 已提交
1225 1226 1227 1228
static struct file_system_type f2fs_fs_type = {
	.owner		= THIS_MODULE,
	.name		= "f2fs",
	.mount		= f2fs_mount,
1229
	.kill_sb	= kill_f2fs_super,
J
Jaegeuk Kim 已提交
1230 1231
	.fs_flags	= FS_REQUIRES_DEV,
};
1232
MODULE_ALIAS_FS("f2fs");
J
Jaegeuk Kim 已提交
1233

1234
static int __init init_inodecache(void)
J
Jaegeuk Kim 已提交
1235 1236
{
	f2fs_inode_cachep = f2fs_kmem_cache_create("f2fs_inode_cache",
1237
			sizeof(struct f2fs_inode_info));
1238
	if (!f2fs_inode_cachep)
J
Jaegeuk Kim 已提交
1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256
		return -ENOMEM;
	return 0;
}

static void destroy_inodecache(void)
{
	/*
	 * Make sure all delayed rcu free inodes are flushed before we
	 * destroy cache.
	 */
	rcu_barrier();
	kmem_cache_destroy(f2fs_inode_cachep);
}

static int __init init_f2fs_fs(void)
{
	int err;

1257 1258
	f2fs_build_trace_ios();

J
Jaegeuk Kim 已提交
1259 1260 1261 1262 1263
	err = init_inodecache();
	if (err)
		goto fail;
	err = create_node_manager_caches();
	if (err)
1264
		goto free_inodecache;
1265
	err = create_segment_manager_caches();
J
Jaegeuk Kim 已提交
1266
	if (err)
1267
		goto free_node_manager_caches;
J
Jaegeuk Kim 已提交
1268 1269
	err = create_checkpoint_caches();
	if (err)
1270
		goto free_segment_manager_caches;
1271
	f2fs_kset = kset_create_and_add("f2fs", NULL, fs_kobj);
1272 1273
	if (!f2fs_kset) {
		err = -ENOMEM;
1274
		goto free_checkpoint_caches;
1275
	}
1276 1277
	err = register_filesystem(&f2fs_fs_type);
	if (err)
1278
		goto free_kset;
1279
	f2fs_create_root_stats();
1280
	f2fs_proc_root = proc_mkdir("fs/f2fs", NULL);
1281 1282 1283 1284 1285 1286
	return 0;

free_kset:
	kset_unregister(f2fs_kset);
free_checkpoint_caches:
	destroy_checkpoint_caches();
1287 1288
free_segment_manager_caches:
	destroy_segment_manager_caches();
1289 1290 1291 1292
free_node_manager_caches:
	destroy_node_manager_caches();
free_inodecache:
	destroy_inodecache();
J
Jaegeuk Kim 已提交
1293 1294 1295 1296 1297 1298
fail:
	return err;
}

static void __exit exit_f2fs_fs(void)
{
1299
	remove_proc_entry("fs/f2fs", NULL);
1300
	f2fs_destroy_root_stats();
J
Jaegeuk Kim 已提交
1301 1302
	unregister_filesystem(&f2fs_fs_type);
	destroy_checkpoint_caches();
1303
	destroy_segment_manager_caches();
J
Jaegeuk Kim 已提交
1304 1305
	destroy_node_manager_caches();
	destroy_inodecache();
1306
	kset_unregister(f2fs_kset);
1307
	f2fs_destroy_trace_ios();
J
Jaegeuk Kim 已提交
1308 1309 1310 1311 1312 1313 1314 1315
}

module_init(init_f2fs_fs)
module_exit(exit_f2fs_fs)

MODULE_AUTHOR("Samsung Electronics's Praesto Team");
MODULE_DESCRIPTION("Flash Friendly File System");
MODULE_LICENSE("GPL");