super.c 101.0 KB
Newer Older
C
Chao Yu 已提交
1
// SPDX-License-Identifier: GPL-2.0
J
Jaegeuk Kim 已提交
2
/*
J
Jaegeuk Kim 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 * fs/f2fs/super.c
 *
 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
 *             http://www.samsung.com/
 */
#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>
18
#include <linux/proc_fs.h>
J
Jaegeuk Kim 已提交
19 20
#include <linux/random.h>
#include <linux/exportfs.h>
21
#include <linux/blkdev.h>
C
Chao Yu 已提交
22
#include <linux/quotaops.h>
J
Jaegeuk Kim 已提交
23
#include <linux/f2fs_fs.h>
24
#include <linux/sysfs.h>
C
Chao Yu 已提交
25
#include <linux/quota.h>
26
#include <linux/unicode.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>

J
Jaegeuk Kim 已提交
38 39
static struct kmem_cache *f2fs_inode_cachep;

40
#ifdef CONFIG_F2FS_FAULT_INJECTION
J
Jaegeuk Kim 已提交
41

42
const char *f2fs_fault_name[FAULT_MAX] = {
J
Jaegeuk Kim 已提交
43
	[FAULT_KMALLOC]		= "kmalloc",
C
Chao Yu 已提交
44
	[FAULT_KVMALLOC]	= "kvmalloc",
45
	[FAULT_PAGE_ALLOC]	= "page alloc",
C
Chao Yu 已提交
46
	[FAULT_PAGE_GET]	= "page get",
47
	[FAULT_ALLOC_BIO]	= "alloc bio",
J
Jaegeuk Kim 已提交
48 49 50 51
	[FAULT_ALLOC_NID]	= "alloc nid",
	[FAULT_ORPHAN]		= "orphan",
	[FAULT_BLOCK]		= "no more block",
	[FAULT_DIR_DEPTH]	= "too big dir depth",
52
	[FAULT_EVICT_INODE]	= "evict_inode fail",
53
	[FAULT_TRUNCATE]	= "truncate fail",
54
	[FAULT_READ_IO]		= "read IO error",
55
	[FAULT_CHECKPOINT]	= "checkpoint error",
56
	[FAULT_DISCARD]		= "discard error",
57
	[FAULT_WRITE_IO]	= "write IO error",
J
Jaegeuk Kim 已提交
58
};
S
Sheng Yong 已提交
59

C
Chao Yu 已提交
60 61
void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
							unsigned int type)
S
Sheng Yong 已提交
62
{
63
	struct f2fs_fault_info *ffi = &F2FS_OPTION(sbi).fault_info;
64

S
Sheng Yong 已提交
65
	if (rate) {
66 67
		atomic_set(&ffi->inject_ops, 0);
		ffi->inject_rate = rate;
S
Sheng Yong 已提交
68
	}
C
Chao Yu 已提交
69 70 71 72 73 74

	if (type)
		ffi->inject_type = type;

	if (!rate && !type)
		memset(ffi, 0, sizeof(struct f2fs_fault_info));
S
Sheng Yong 已提交
75
}
76 77
#endif

78 79 80 81 82 83 84
/* f2fs-wide shrinker description */
static struct shrinker f2fs_shrinker_info = {
	.scan_objects = f2fs_shrink_scan,
	.count_objects = f2fs_shrink_count,
	.seeks = DEFAULT_SEEKS,
};

J
Jaegeuk Kim 已提交
85
enum {
86
	Opt_gc_background,
J
Jaegeuk Kim 已提交
87
	Opt_disable_roll_forward,
88
	Opt_norecovery,
J
Jaegeuk Kim 已提交
89
	Opt_discard,
C
Chao Yu 已提交
90
	Opt_nodiscard,
J
Jaegeuk Kim 已提交
91
	Opt_noheap,
92
	Opt_heap,
93
	Opt_user_xattr,
J
Jaegeuk Kim 已提交
94
	Opt_nouser_xattr,
95
	Opt_acl,
J
Jaegeuk Kim 已提交
96 97 98
	Opt_noacl,
	Opt_active_logs,
	Opt_disable_ext_identify,
J
Jaegeuk Kim 已提交
99
	Opt_inline_xattr,
100
	Opt_noinline_xattr,
C
Chao Yu 已提交
101
	Opt_inline_xattr_size,
102
	Opt_inline_data,
103
	Opt_inline_dentry,
104
	Opt_noinline_dentry,
105
	Opt_flush_merge,
J
Jaegeuk Kim 已提交
106
	Opt_noflush_merge,
J
Jaegeuk Kim 已提交
107
	Opt_nobarrier,
108
	Opt_fastboot,
109
	Opt_extent_cache,
110
	Opt_noextent_cache,
W
Wanpeng Li 已提交
111
	Opt_noinline_data,
112
	Opt_data_flush,
113
	Opt_reserve_root,
114 115
	Opt_resgid,
	Opt_resuid,
116
	Opt_mode,
117
	Opt_io_size_bits,
118
	Opt_fault_injection,
C
Chao Yu 已提交
119
	Opt_fault_type,
J
Jaegeuk Kim 已提交
120 121
	Opt_lazytime,
	Opt_nolazytime,
C
Chao Yu 已提交
122 123
	Opt_quota,
	Opt_noquota,
C
Chao Yu 已提交
124 125
	Opt_usrquota,
	Opt_grpquota,
C
Chao Yu 已提交
126
	Opt_prjquota,
C
Chao Yu 已提交
127 128 129 130 131 132 133 134 135
	Opt_usrjquota,
	Opt_grpjquota,
	Opt_prjjquota,
	Opt_offusrjquota,
	Opt_offgrpjquota,
	Opt_offprjjquota,
	Opt_jqfmt_vfsold,
	Opt_jqfmt_vfsv0,
	Opt_jqfmt_vfsv1,
136
	Opt_whint,
137
	Opt_alloc,
138
	Opt_fsync,
139
	Opt_test_dummy_encryption,
140 141 142 143
	Opt_checkpoint_disable,
	Opt_checkpoint_disable_cap,
	Opt_checkpoint_disable_cap_perc,
	Opt_checkpoint_enable,
C
Chao Yu 已提交
144 145 146
	Opt_compress_algorithm,
	Opt_compress_log_size,
	Opt_compress_extension,
J
Jaegeuk Kim 已提交
147 148 149 150
	Opt_err,
};

static match_table_t f2fs_tokens = {
151
	{Opt_gc_background, "background_gc=%s"},
J
Jaegeuk Kim 已提交
152
	{Opt_disable_roll_forward, "disable_roll_forward"},
153
	{Opt_norecovery, "norecovery"},
J
Jaegeuk Kim 已提交
154
	{Opt_discard, "discard"},
C
Chao Yu 已提交
155
	{Opt_nodiscard, "nodiscard"},
J
Jaegeuk Kim 已提交
156
	{Opt_noheap, "no_heap"},
157
	{Opt_heap, "heap"},
158
	{Opt_user_xattr, "user_xattr"},
J
Jaegeuk Kim 已提交
159
	{Opt_nouser_xattr, "nouser_xattr"},
160
	{Opt_acl, "acl"},
J
Jaegeuk Kim 已提交
161 162 163
	{Opt_noacl, "noacl"},
	{Opt_active_logs, "active_logs=%u"},
	{Opt_disable_ext_identify, "disable_ext_identify"},
J
Jaegeuk Kim 已提交
164
	{Opt_inline_xattr, "inline_xattr"},
165
	{Opt_noinline_xattr, "noinline_xattr"},
C
Chao Yu 已提交
166
	{Opt_inline_xattr_size, "inline_xattr_size=%u"},
167
	{Opt_inline_data, "inline_data"},
168
	{Opt_inline_dentry, "inline_dentry"},
169
	{Opt_noinline_dentry, "noinline_dentry"},
170
	{Opt_flush_merge, "flush_merge"},
J
Jaegeuk Kim 已提交
171
	{Opt_noflush_merge, "noflush_merge"},
J
Jaegeuk Kim 已提交
172
	{Opt_nobarrier, "nobarrier"},
173
	{Opt_fastboot, "fastboot"},
174
	{Opt_extent_cache, "extent_cache"},
175
	{Opt_noextent_cache, "noextent_cache"},
W
Wanpeng Li 已提交
176
	{Opt_noinline_data, "noinline_data"},
177
	{Opt_data_flush, "data_flush"},
178
	{Opt_reserve_root, "reserve_root=%u"},
179 180
	{Opt_resgid, "resgid=%u"},
	{Opt_resuid, "resuid=%u"},
181
	{Opt_mode, "mode=%s"},
182
	{Opt_io_size_bits, "io_bits=%u"},
183
	{Opt_fault_injection, "fault_injection=%u"},
C
Chao Yu 已提交
184
	{Opt_fault_type, "fault_type=%u"},
J
Jaegeuk Kim 已提交
185 186
	{Opt_lazytime, "lazytime"},
	{Opt_nolazytime, "nolazytime"},
C
Chao Yu 已提交
187 188
	{Opt_quota, "quota"},
	{Opt_noquota, "noquota"},
C
Chao Yu 已提交
189 190
	{Opt_usrquota, "usrquota"},
	{Opt_grpquota, "grpquota"},
C
Chao Yu 已提交
191
	{Opt_prjquota, "prjquota"},
C
Chao Yu 已提交
192 193 194 195 196 197 198 199 200
	{Opt_usrjquota, "usrjquota=%s"},
	{Opt_grpjquota, "grpjquota=%s"},
	{Opt_prjjquota, "prjjquota=%s"},
	{Opt_offusrjquota, "usrjquota="},
	{Opt_offgrpjquota, "grpjquota="},
	{Opt_offprjjquota, "prjjquota="},
	{Opt_jqfmt_vfsold, "jqfmt=vfsold"},
	{Opt_jqfmt_vfsv0, "jqfmt=vfsv0"},
	{Opt_jqfmt_vfsv1, "jqfmt=vfsv1"},
201
	{Opt_whint, "whint_mode=%s"},
202
	{Opt_alloc, "alloc_mode=%s"},
203
	{Opt_fsync, "fsync_mode=%s"},
204
	{Opt_test_dummy_encryption, "test_dummy_encryption"},
205 206 207 208
	{Opt_checkpoint_disable, "checkpoint=disable"},
	{Opt_checkpoint_disable_cap, "checkpoint=disable:%u"},
	{Opt_checkpoint_disable_cap_perc, "checkpoint=disable:%u%%"},
	{Opt_checkpoint_enable, "checkpoint=enable"},
C
Chao Yu 已提交
209 210 211
	{Opt_compress_algorithm, "compress_algorithm=%s"},
	{Opt_compress_log_size, "compress_log_size=%u"},
	{Opt_compress_extension, "compress_extension=%s"},
J
Jaegeuk Kim 已提交
212 213 214
	{Opt_err, NULL},
};

215
void f2fs_printk(struct f2fs_sb_info *sbi, const char *fmt, ...)
216 217 218
{
	struct va_format vaf;
	va_list args;
219
	int level;
220 221

	va_start(args, fmt);
222 223 224

	level = printk_get_level(fmt);
	vaf.fmt = printk_skip_level(fmt);
225
	vaf.va = &args;
226 227 228
	printk("%c%cF2FS-fs (%s): %pV\n",
	       KERN_SOH_ASCII, level, sbi->sb->s_id, &vaf);

229 230 231
	va_end(args);
}

232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
#ifdef CONFIG_UNICODE
static const struct f2fs_sb_encodings {
	__u16 magic;
	char *name;
	char *version;
} f2fs_sb_encoding_map[] = {
	{F2FS_ENC_UTF8_12_1, "utf8", "12.1.0"},
};

static int f2fs_sb_read_encoding(const struct f2fs_super_block *sb,
				 const struct f2fs_sb_encodings **encoding,
				 __u16 *flags)
{
	__u16 magic = le16_to_cpu(sb->s_encoding);
	int i;

	for (i = 0; i < ARRAY_SIZE(f2fs_sb_encoding_map); i++)
		if (magic == f2fs_sb_encoding_map[i].magic)
			break;

	if (i >= ARRAY_SIZE(f2fs_sb_encoding_map))
		return -EINVAL;

	*encoding = &f2fs_sb_encoding_map[i];
	*flags = le16_to_cpu(sb->s_encoding_flags);

	return 0;
}
#endif

262 263
static inline void limit_reserve_root(struct f2fs_sb_info *sbi)
{
264 265
	block_t limit = min((sbi->user_block_count << 1) / 1000,
			sbi->user_block_count - sbi->reserved_blocks);
266 267

	/* limit is 0.2% */
268 269 270
	if (test_opt(sbi, RESERVE_ROOT) &&
			F2FS_OPTION(sbi).root_reserved_blocks > limit) {
		F2FS_OPTION(sbi).root_reserved_blocks = limit;
271 272
		f2fs_info(sbi, "Reduce reserved blocks for root = %u",
			  F2FS_OPTION(sbi).root_reserved_blocks);
273
	}
274
	if (!test_opt(sbi, RESERVE_ROOT) &&
275
		(!uid_eq(F2FS_OPTION(sbi).s_resuid,
276
				make_kuid(&init_user_ns, F2FS_DEF_RESUID)) ||
277
		!gid_eq(F2FS_OPTION(sbi).s_resgid,
278
				make_kgid(&init_user_ns, F2FS_DEF_RESGID))))
279 280 281 282 283
		f2fs_info(sbi, "Ignore s_resuid=%u, s_resgid=%u w/o reserve_root",
			  from_kuid_munged(&init_user_ns,
					   F2FS_OPTION(sbi).s_resuid),
			  from_kgid_munged(&init_user_ns,
					   F2FS_OPTION(sbi).s_resgid));
284 285
}

J
Jaegeuk Kim 已提交
286 287 288 289 290 291 292
static void init_once(void *foo)
{
	struct f2fs_inode_info *fi = (struct f2fs_inode_info *) foo;

	inode_init_once(&fi->vfs_inode);
}

C
Chao Yu 已提交
293 294 295 296 297 298 299 300 301 302
#ifdef CONFIG_QUOTA
static const char * const quotatypes[] = INITQFNAMES;
#define QTYPE2NAME(t) (quotatypes[t])
static int f2fs_set_qf_name(struct super_block *sb, int qtype,
							substring_t *args)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	char *qname;
	int ret = -EINVAL;

303
	if (sb_any_quota_loaded(sb) && !F2FS_OPTION(sbi).s_qf_names[qtype]) {
304
		f2fs_err(sbi, "Cannot change journaled quota options when quota turned on");
C
Chao Yu 已提交
305 306
		return -EINVAL;
	}
307
	if (f2fs_sb_has_quota_ino(sbi)) {
308
		f2fs_info(sbi, "QUOTA feature is enabled, so ignore qf_name");
J
Jaegeuk Kim 已提交
309 310 311
		return 0;
	}

C
Chao Yu 已提交
312 313
	qname = match_strdup(args);
	if (!qname) {
314
		f2fs_err(sbi, "Not enough memory for storing quotafile name");
315
		return -ENOMEM;
C
Chao Yu 已提交
316
	}
317 318
	if (F2FS_OPTION(sbi).s_qf_names[qtype]) {
		if (strcmp(F2FS_OPTION(sbi).s_qf_names[qtype], qname) == 0)
C
Chao Yu 已提交
319 320
			ret = 0;
		else
321
			f2fs_err(sbi, "%s quota file already specified",
C
Chao Yu 已提交
322 323 324 325
				 QTYPE2NAME(qtype));
		goto errout;
	}
	if (strchr(qname, '/')) {
326
		f2fs_err(sbi, "quotafile must be on filesystem root");
C
Chao Yu 已提交
327 328
		goto errout;
	}
329
	F2FS_OPTION(sbi).s_qf_names[qtype] = qname;
C
Chao Yu 已提交
330 331 332
	set_opt(sbi, QUOTA);
	return 0;
errout:
333
	kvfree(qname);
C
Chao Yu 已提交
334 335 336 337 338 339 340
	return ret;
}

static int f2fs_clear_qf_name(struct super_block *sb, int qtype)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);

341
	if (sb_any_quota_loaded(sb) && F2FS_OPTION(sbi).s_qf_names[qtype]) {
342
		f2fs_err(sbi, "Cannot change journaled quota options when quota turned on");
C
Chao Yu 已提交
343 344
		return -EINVAL;
	}
345
	kvfree(F2FS_OPTION(sbi).s_qf_names[qtype]);
346
	F2FS_OPTION(sbi).s_qf_names[qtype] = NULL;
C
Chao Yu 已提交
347 348 349 350 351 352 353 354 355 356
	return 0;
}

static int f2fs_check_quota_options(struct f2fs_sb_info *sbi)
{
	/*
	 * We do the test below only for project quotas. 'usrquota' and
	 * 'grpquota' mount options are allowed even without quota feature
	 * to support legacy quotas in quota files.
	 */
357
	if (test_opt(sbi, PRJQUOTA) && !f2fs_sb_has_project_quota(sbi)) {
358
		f2fs_err(sbi, "Project quota feature not enabled. Cannot enable project quota enforcement.");
C
Chao Yu 已提交
359 360
		return -1;
	}
361 362 363 364 365
	if (F2FS_OPTION(sbi).s_qf_names[USRQUOTA] ||
			F2FS_OPTION(sbi).s_qf_names[GRPQUOTA] ||
			F2FS_OPTION(sbi).s_qf_names[PRJQUOTA]) {
		if (test_opt(sbi, USRQUOTA) &&
				F2FS_OPTION(sbi).s_qf_names[USRQUOTA])
C
Chao Yu 已提交
366 367
			clear_opt(sbi, USRQUOTA);

368 369
		if (test_opt(sbi, GRPQUOTA) &&
				F2FS_OPTION(sbi).s_qf_names[GRPQUOTA])
C
Chao Yu 已提交
370 371
			clear_opt(sbi, GRPQUOTA);

372 373
		if (test_opt(sbi, PRJQUOTA) &&
				F2FS_OPTION(sbi).s_qf_names[PRJQUOTA])
C
Chao Yu 已提交
374 375 376 377
			clear_opt(sbi, PRJQUOTA);

		if (test_opt(sbi, GRPQUOTA) || test_opt(sbi, USRQUOTA) ||
				test_opt(sbi, PRJQUOTA)) {
378
			f2fs_err(sbi, "old and new quota format mixing");
C
Chao Yu 已提交
379 380 381
			return -1;
		}

382
		if (!F2FS_OPTION(sbi).s_jquota_fmt) {
383
			f2fs_err(sbi, "journaled quota format not specified");
C
Chao Yu 已提交
384 385 386
			return -1;
		}
	}
J
Jaegeuk Kim 已提交
387

388
	if (f2fs_sb_has_quota_ino(sbi) && F2FS_OPTION(sbi).s_jquota_fmt) {
389
		f2fs_info(sbi, "QUOTA feature is enabled, so ignore jquota_fmt");
390
		F2FS_OPTION(sbi).s_jquota_fmt = 0;
J
Jaegeuk Kim 已提交
391
	}
C
Chao Yu 已提交
392 393 394 395
	return 0;
}
#endif

396 397 398 399
static int parse_options(struct super_block *sb, char *options)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	substring_t args[MAX_OPT_ARGS];
C
Chao Yu 已提交
400
	unsigned char (*ext)[F2FS_EXTENSION_LEN];
401
	char *p, *name;
C
Chao Yu 已提交
402
	int arg = 0, ext_cnt;
403 404
	kuid_t uid;
	kgid_t gid;
C
Chao Yu 已提交
405 406 407
#ifdef CONFIG_QUOTA
	int ret;
#endif
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428

	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;
429
			if (strlen(name) == 2 && !strncmp(name, "on", 2)) {
430
				set_opt(sbi, BG_GC);
431 432
				clear_opt(sbi, FORCE_FG_GC);
			} else if (strlen(name) == 3 && !strncmp(name, "off", 3)) {
433
				clear_opt(sbi, BG_GC);
434 435 436 437 438
				clear_opt(sbi, FORCE_FG_GC);
			} else if (strlen(name) == 4 && !strncmp(name, "sync", 4)) {
				set_opt(sbi, BG_GC);
				set_opt(sbi, FORCE_FG_GC);
			} else {
439
				kvfree(name);
440 441
				return -EINVAL;
			}
442
			kvfree(name);
443 444 445 446
			break;
		case Opt_disable_roll_forward:
			set_opt(sbi, DISABLE_ROLL_FORWARD);
			break;
447 448
		case Opt_norecovery:
			/* this option mounts f2fs with ro */
449
			set_opt(sbi, NORECOVERY);
450 451 452
			if (!f2fs_readonly(sb))
				return -EINVAL;
			break;
453
		case Opt_discard:
454
			set_opt(sbi, DISCARD);
455
			break;
C
Chao Yu 已提交
456
		case Opt_nodiscard:
457
			if (f2fs_sb_has_blkzoned(sbi)) {
458
				f2fs_warn(sbi, "discard is required for zoned block devices");
459 460
				return -EINVAL;
			}
C
Chao Yu 已提交
461
			clear_opt(sbi, DISCARD);
462
			break;
463 464 465
		case Opt_noheap:
			set_opt(sbi, NOHEAP);
			break;
466 467 468
		case Opt_heap:
			clear_opt(sbi, NOHEAP);
			break;
469
#ifdef CONFIG_F2FS_FS_XATTR
470 471 472
		case Opt_user_xattr:
			set_opt(sbi, XATTR_USER);
			break;
473 474 475
		case Opt_nouser_xattr:
			clear_opt(sbi, XATTR_USER);
			break;
J
Jaegeuk Kim 已提交
476 477 478
		case Opt_inline_xattr:
			set_opt(sbi, INLINE_XATTR);
			break;
479 480 481
		case Opt_noinline_xattr:
			clear_opt(sbi, INLINE_XATTR);
			break;
C
Chao Yu 已提交
482 483 484 485
		case Opt_inline_xattr_size:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			set_opt(sbi, INLINE_XATTR_SIZE);
486
			F2FS_OPTION(sbi).inline_xattr_size = arg;
C
Chao Yu 已提交
487
			break;
488
#else
489
		case Opt_user_xattr:
490
			f2fs_info(sbi, "user_xattr options not supported");
491
			break;
492
		case Opt_nouser_xattr:
493
			f2fs_info(sbi, "nouser_xattr options not supported");
494
			break;
J
Jaegeuk Kim 已提交
495
		case Opt_inline_xattr:
496
			f2fs_info(sbi, "inline_xattr options not supported");
J
Jaegeuk Kim 已提交
497
			break;
498
		case Opt_noinline_xattr:
499
			f2fs_info(sbi, "noinline_xattr options not supported");
500
			break;
501 502
#endif
#ifdef CONFIG_F2FS_FS_POSIX_ACL
503 504 505
		case Opt_acl:
			set_opt(sbi, POSIX_ACL);
			break;
506 507 508 509
		case Opt_noacl:
			clear_opt(sbi, POSIX_ACL);
			break;
#else
510
		case Opt_acl:
511
			f2fs_info(sbi, "acl options not supported");
512
			break;
513
		case Opt_noacl:
514
			f2fs_info(sbi, "noacl options not supported");
515 516 517 518 519 520 521
			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;
522
			F2FS_OPTION(sbi).active_logs = arg;
523 524 525 526
			break;
		case Opt_disable_ext_identify:
			set_opt(sbi, DISABLE_EXT_IDENTIFY);
			break;
527 528 529
		case Opt_inline_data:
			set_opt(sbi, INLINE_DATA);
			break;
530 531 532
		case Opt_inline_dentry:
			set_opt(sbi, INLINE_DENTRY);
			break;
533 534 535
		case Opt_noinline_dentry:
			clear_opt(sbi, INLINE_DENTRY);
			break;
536 537 538
		case Opt_flush_merge:
			set_opt(sbi, FLUSH_MERGE);
			break;
J
Jaegeuk Kim 已提交
539 540 541
		case Opt_noflush_merge:
			clear_opt(sbi, FLUSH_MERGE);
			break;
J
Jaegeuk Kim 已提交
542 543 544
		case Opt_nobarrier:
			set_opt(sbi, NOBARRIER);
			break;
545 546 547
		case Opt_fastboot:
			set_opt(sbi, FASTBOOT);
			break;
548 549 550
		case Opt_extent_cache:
			set_opt(sbi, EXTENT_CACHE);
			break;
551 552 553
		case Opt_noextent_cache:
			clear_opt(sbi, EXTENT_CACHE);
			break;
W
Wanpeng Li 已提交
554 555 556
		case Opt_noinline_data:
			clear_opt(sbi, INLINE_DATA);
			break;
557 558 559
		case Opt_data_flush:
			set_opt(sbi, DATA_FLUSH);
			break;
560 561 562 563
		case Opt_reserve_root:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			if (test_opt(sbi, RESERVE_ROOT)) {
564 565
				f2fs_info(sbi, "Preserve previous reserve_root=%u",
					  F2FS_OPTION(sbi).root_reserved_blocks);
566
			} else {
567
				F2FS_OPTION(sbi).root_reserved_blocks = arg;
568 569 570
				set_opt(sbi, RESERVE_ROOT);
			}
			break;
571 572 573 574 575
		case Opt_resuid:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			uid = make_kuid(current_user_ns(), arg);
			if (!uid_valid(uid)) {
576
				f2fs_err(sbi, "Invalid uid value %d", arg);
577 578
				return -EINVAL;
			}
579
			F2FS_OPTION(sbi).s_resuid = uid;
580 581 582 583 584 585
			break;
		case Opt_resgid:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			gid = make_kgid(current_user_ns(), arg);
			if (!gid_valid(gid)) {
586
				f2fs_err(sbi, "Invalid gid value %d", arg);
587 588
				return -EINVAL;
			}
589
			F2FS_OPTION(sbi).s_resgid = gid;
590
			break;
591 592 593 594 595 596 597
		case Opt_mode:
			name = match_strdup(&args[0]);

			if (!name)
				return -ENOMEM;
			if (strlen(name) == 8 &&
					!strncmp(name, "adaptive", 8)) {
598
				if (f2fs_sb_has_blkzoned(sbi)) {
599
					f2fs_warn(sbi, "adaptive mode is not allowed with zoned block device feature");
600
					kvfree(name);
601 602
					return -EINVAL;
				}
603
				F2FS_OPTION(sbi).fs_mode = FS_MODE_ADAPTIVE;
604 605
			} else if (strlen(name) == 3 &&
					!strncmp(name, "lfs", 3)) {
606
				F2FS_OPTION(sbi).fs_mode = FS_MODE_LFS;
607
			} else {
608
				kvfree(name);
609 610
				return -EINVAL;
			}
611
			kvfree(name);
612
			break;
613 614 615
		case Opt_io_size_bits:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
616
			if (arg <= 0 || arg > __ilog2_u32(BIO_MAX_PAGES)) {
617 618
				f2fs_warn(sbi, "Not support %d, larger than %d",
					  1 << arg, BIO_MAX_PAGES);
619 620
				return -EINVAL;
			}
621
			F2FS_OPTION(sbi).write_io_size_bits = arg;
622
			break;
623
#ifdef CONFIG_F2FS_FAULT_INJECTION
624 625 626
		case Opt_fault_injection:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
C
Chao Yu 已提交
627 628 629
			f2fs_build_fault_attr(sbi, arg, F2FS_ALL_FAULT_TYPE);
			set_opt(sbi, FAULT_INJECTION);
			break;
630

C
Chao Yu 已提交
631 632 633 634
		case Opt_fault_type:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			f2fs_build_fault_attr(sbi, 0, arg);
635
			set_opt(sbi, FAULT_INJECTION);
636
			break;
637
#else
638
		case Opt_fault_injection:
639
			f2fs_info(sbi, "fault_injection options not supported");
640
			break;
641 642

		case Opt_fault_type:
643
			f2fs_info(sbi, "fault_type options not supported");
644 645
			break;
#endif
J
Jaegeuk Kim 已提交
646
		case Opt_lazytime:
647
			sb->s_flags |= SB_LAZYTIME;
J
Jaegeuk Kim 已提交
648 649
			break;
		case Opt_nolazytime:
650
			sb->s_flags &= ~SB_LAZYTIME;
J
Jaegeuk Kim 已提交
651
			break;
C
Chao Yu 已提交
652
#ifdef CONFIG_QUOTA
C
Chao Yu 已提交
653
		case Opt_quota:
C
Chao Yu 已提交
654 655 656 657 658 659
		case Opt_usrquota:
			set_opt(sbi, USRQUOTA);
			break;
		case Opt_grpquota:
			set_opt(sbi, GRPQUOTA);
			break;
C
Chao Yu 已提交
660 661 662
		case Opt_prjquota:
			set_opt(sbi, PRJQUOTA);
			break;
C
Chao Yu 已提交
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
		case Opt_usrjquota:
			ret = f2fs_set_qf_name(sb, USRQUOTA, &args[0]);
			if (ret)
				return ret;
			break;
		case Opt_grpjquota:
			ret = f2fs_set_qf_name(sb, GRPQUOTA, &args[0]);
			if (ret)
				return ret;
			break;
		case Opt_prjjquota:
			ret = f2fs_set_qf_name(sb, PRJQUOTA, &args[0]);
			if (ret)
				return ret;
			break;
		case Opt_offusrjquota:
			ret = f2fs_clear_qf_name(sb, USRQUOTA);
			if (ret)
				return ret;
			break;
		case Opt_offgrpjquota:
			ret = f2fs_clear_qf_name(sb, GRPQUOTA);
			if (ret)
				return ret;
			break;
		case Opt_offprjjquota:
			ret = f2fs_clear_qf_name(sb, PRJQUOTA);
			if (ret)
				return ret;
			break;
		case Opt_jqfmt_vfsold:
694
			F2FS_OPTION(sbi).s_jquota_fmt = QFMT_VFS_OLD;
C
Chao Yu 已提交
695 696
			break;
		case Opt_jqfmt_vfsv0:
697
			F2FS_OPTION(sbi).s_jquota_fmt = QFMT_VFS_V0;
C
Chao Yu 已提交
698 699
			break;
		case Opt_jqfmt_vfsv1:
700
			F2FS_OPTION(sbi).s_jquota_fmt = QFMT_VFS_V1;
C
Chao Yu 已提交
701 702 703 704 705 706 707
			break;
		case Opt_noquota:
			clear_opt(sbi, QUOTA);
			clear_opt(sbi, USRQUOTA);
			clear_opt(sbi, GRPQUOTA);
			clear_opt(sbi, PRJQUOTA);
			break;
C
Chao Yu 已提交
708
#else
C
Chao Yu 已提交
709
		case Opt_quota:
C
Chao Yu 已提交
710 711
		case Opt_usrquota:
		case Opt_grpquota:
C
Chao Yu 已提交
712
		case Opt_prjquota:
C
Chao Yu 已提交
713 714 715 716 717 718 719 720 721 722
		case Opt_usrjquota:
		case Opt_grpjquota:
		case Opt_prjjquota:
		case Opt_offusrjquota:
		case Opt_offgrpjquota:
		case Opt_offprjjquota:
		case Opt_jqfmt_vfsold:
		case Opt_jqfmt_vfsv0:
		case Opt_jqfmt_vfsv1:
		case Opt_noquota:
723
			f2fs_info(sbi, "quota operations not supported");
C
Chao Yu 已提交
724 725
			break;
#endif
726 727 728 729 730 731
		case Opt_whint:
			name = match_strdup(&args[0]);
			if (!name)
				return -ENOMEM;
			if (strlen(name) == 10 &&
					!strncmp(name, "user-based", 10)) {
732
				F2FS_OPTION(sbi).whint_mode = WHINT_MODE_USER;
733 734
			} else if (strlen(name) == 3 &&
					!strncmp(name, "off", 3)) {
735
				F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF;
736 737
			} else if (strlen(name) == 8 &&
					!strncmp(name, "fs-based", 8)) {
738
				F2FS_OPTION(sbi).whint_mode = WHINT_MODE_FS;
739
			} else {
740
				kvfree(name);
741 742
				return -EINVAL;
			}
743
			kvfree(name);
744
			break;
745 746 747 748 749 750 751
		case Opt_alloc:
			name = match_strdup(&args[0]);
			if (!name)
				return -ENOMEM;

			if (strlen(name) == 7 &&
					!strncmp(name, "default", 7)) {
752
				F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_DEFAULT;
753 754
			} else if (strlen(name) == 5 &&
					!strncmp(name, "reuse", 5)) {
755
				F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_REUSE;
756
			} else {
757
				kvfree(name);
758 759
				return -EINVAL;
			}
760
			kvfree(name);
761
			break;
762 763 764 765 766 767
		case Opt_fsync:
			name = match_strdup(&args[0]);
			if (!name)
				return -ENOMEM;
			if (strlen(name) == 5 &&
					!strncmp(name, "posix", 5)) {
768
				F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_POSIX;
769 770
			} else if (strlen(name) == 6 &&
					!strncmp(name, "strict", 6)) {
771
				F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_STRICT;
772 773 774 775
			} else if (strlen(name) == 9 &&
					!strncmp(name, "nobarrier", 9)) {
				F2FS_OPTION(sbi).fsync_mode =
							FSYNC_MODE_NOBARRIER;
776
			} else {
777
				kvfree(name);
778 779
				return -EINVAL;
			}
780
			kvfree(name);
781
			break;
782
		case Opt_test_dummy_encryption:
783
#ifdef CONFIG_FS_ENCRYPTION
784
			if (!f2fs_sb_has_encrypt(sbi)) {
785
				f2fs_err(sbi, "Encrypt feature is off");
786 787 788 789
				return -EINVAL;
			}

			F2FS_OPTION(sbi).test_dummy_encryption = true;
790
			f2fs_info(sbi, "Test dummy encryption mode enabled");
791
#else
792
			f2fs_info(sbi, "Test dummy encryption mount option ignored");
793 794
#endif
			break;
795 796
		case Opt_checkpoint_disable_cap_perc:
			if (args->from && match_int(args, &arg))
D
Daniel Rosenberg 已提交
797
				return -EINVAL;
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818
			if (arg < 0 || arg > 100)
				return -EINVAL;
			if (arg == 100)
				F2FS_OPTION(sbi).unusable_cap =
					sbi->user_block_count;
			else
				F2FS_OPTION(sbi).unusable_cap =
					(sbi->user_block_count / 100) *	arg;
			set_opt(sbi, DISABLE_CHECKPOINT);
			break;
		case Opt_checkpoint_disable_cap:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			F2FS_OPTION(sbi).unusable_cap = arg;
			set_opt(sbi, DISABLE_CHECKPOINT);
			break;
		case Opt_checkpoint_disable:
			set_opt(sbi, DISABLE_CHECKPOINT);
			break;
		case Opt_checkpoint_enable:
			clear_opt(sbi, DISABLE_CHECKPOINT);
D
Daniel Rosenberg 已提交
819
			break;
C
Chao Yu 已提交
820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
		case Opt_compress_algorithm:
			if (!f2fs_sb_has_compression(sbi)) {
				f2fs_err(sbi, "Compression feature if off");
				return -EINVAL;
			}
			name = match_strdup(&args[0]);
			if (!name)
				return -ENOMEM;
			if (strlen(name) == 3 && !strcmp(name, "lzo")) {
				F2FS_OPTION(sbi).compress_algorithm =
								COMPRESS_LZO;
			} else if (strlen(name) == 3 &&
					!strcmp(name, "lz4")) {
				F2FS_OPTION(sbi).compress_algorithm =
								COMPRESS_LZ4;
			} else {
				kfree(name);
				return -EINVAL;
			}
			kfree(name);
			break;
		case Opt_compress_log_size:
			if (!f2fs_sb_has_compression(sbi)) {
				f2fs_err(sbi, "Compression feature is off");
				return -EINVAL;
			}
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			if (arg < MIN_COMPRESS_LOG_SIZE ||
				arg > MAX_COMPRESS_LOG_SIZE) {
				f2fs_err(sbi,
					"Compress cluster log size is out of range");
				return -EINVAL;
			}
			F2FS_OPTION(sbi).compress_log_size = arg;
			break;
		case Opt_compress_extension:
			if (!f2fs_sb_has_compression(sbi)) {
				f2fs_err(sbi, "Compression feature is off");
				return -EINVAL;
			}
			name = match_strdup(&args[0]);
			if (!name)
				return -ENOMEM;

			ext = F2FS_OPTION(sbi).extensions;
			ext_cnt = F2FS_OPTION(sbi).compress_ext_cnt;

			if (strlen(name) >= F2FS_EXTENSION_LEN ||
				ext_cnt >= COMPRESS_EXT_NUM) {
				f2fs_err(sbi,
					"invalid extension length/number");
				kfree(name);
				return -EINVAL;
			}

			strcpy(ext[ext_cnt], name);
			F2FS_OPTION(sbi).compress_ext_cnt++;
			kfree(name);
			break;
880
		default:
881 882
			f2fs_err(sbi, "Unrecognized mount option \"%s\" or missing value",
				 p);
883 884 885
			return -EINVAL;
		}
	}
C
Chao Yu 已提交
886 887 888
#ifdef CONFIG_QUOTA
	if (f2fs_check_quota_options(sbi))
		return -EINVAL;
889
#else
890
	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sbi->sb)) {
891
		f2fs_info(sbi, "Filesystem with quota feature cannot be mounted RDWR without CONFIG_QUOTA");
892 893
		return -EINVAL;
	}
894
	if (f2fs_sb_has_project_quota(sbi) && !f2fs_readonly(sbi->sb)) {
895
		f2fs_err(sbi, "Filesystem with project quota feature cannot be mounted RDWR without CONFIG_QUOTA");
896 897
		return -EINVAL;
	}
C
Chao Yu 已提交
898
#endif
899 900 901 902 903 904 905
#ifndef CONFIG_UNICODE
	if (f2fs_sb_has_casefold(sbi)) {
		f2fs_err(sbi,
			"Filesystem with casefold feature cannot be mounted without CONFIG_UNICODE");
		return -EINVAL;
	}
#endif
906

907
	if (F2FS_IO_SIZE_BITS(sbi) && !f2fs_lfs_mode(sbi)) {
908 909
		f2fs_err(sbi, "Should set mode=lfs with %uKB-sized IO",
			 F2FS_IO_SIZE_KB(sbi));
910 911
		return -EINVAL;
	}
C
Chao Yu 已提交
912 913

	if (test_opt(sbi, INLINE_XATTR_SIZE)) {
914 915
		int min_size, max_size;

916 917
		if (!f2fs_sb_has_extra_attr(sbi) ||
			!f2fs_sb_has_flexible_inline_xattr(sbi)) {
918
			f2fs_err(sbi, "extra_attr or flexible_inline_xattr feature is off");
919 920
			return -EINVAL;
		}
C
Chao Yu 已提交
921
		if (!test_opt(sbi, INLINE_XATTR)) {
922
			f2fs_err(sbi, "inline_xattr_size option should be set with inline_xattr option");
C
Chao Yu 已提交
923 924
			return -EINVAL;
		}
925 926

		min_size = sizeof(struct f2fs_xattr_header) / sizeof(__le32);
927
		max_size = MAX_INLINE_XATTR_SIZE;
928 929 930

		if (F2FS_OPTION(sbi).inline_xattr_size < min_size ||
				F2FS_OPTION(sbi).inline_xattr_size > max_size) {
931 932
			f2fs_err(sbi, "inline xattr size is out of range: %d ~ %d",
				 min_size, max_size);
C
Chao Yu 已提交
933 934 935
			return -EINVAL;
		}
	}
936

937
	if (test_opt(sbi, DISABLE_CHECKPOINT) && f2fs_lfs_mode(sbi)) {
938
		f2fs_err(sbi, "LFS not compatible with checkpoint=disable\n");
D
Daniel Rosenberg 已提交
939 940 941
		return -EINVAL;
	}

942 943 944
	/* Not pass down write hints if the number of active logs is lesser
	 * than NR_CURSEG_TYPE.
	 */
945 946
	if (F2FS_OPTION(sbi).active_logs != NR_CURSEG_TYPE)
		F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF;
947 948 949
	return 0;
}

J
Jaegeuk Kim 已提交
950 951 952 953
static struct inode *f2fs_alloc_inode(struct super_block *sb)
{
	struct f2fs_inode_info *fi;

954
	fi = kmem_cache_alloc(f2fs_inode_cachep, GFP_F2FS_ZERO);
J
Jaegeuk Kim 已提交
955 956 957 958 959
	if (!fi)
		return NULL;

	init_once((void *) fi);

M
Masanari Iida 已提交
960
	/* Initialize f2fs-specific inode info */
961
	atomic_set(&fi->dirty_pages, 0);
962
	init_rwsem(&fi->i_sem);
963
	spin_lock_init(&fi->i_size_lock);
964
	INIT_LIST_HEAD(&fi->dirty_list);
965
	INIT_LIST_HEAD(&fi->gdirty_list);
J
Jaegeuk Kim 已提交
966
	INIT_LIST_HEAD(&fi->inmem_ilist);
J
Jaegeuk Kim 已提交
967 968
	INIT_LIST_HEAD(&fi->inmem_pages);
	mutex_init(&fi->inmem_lock);
C
Chao Yu 已提交
969 970
	init_rwsem(&fi->i_gc_rwsem[READ]);
	init_rwsem(&fi->i_gc_rwsem[WRITE]);
971
	init_rwsem(&fi->i_mmap_sem);
972
	init_rwsem(&fi->i_xattr_sem);
J
Jaegeuk Kim 已提交
973

974 975
	/* Will be used by directory only */
	fi->i_dir_level = F2FS_SB(sb)->dir_level;
C
Chao Yu 已提交
976

J
Jaegeuk Kim 已提交
977 978 979
	return &fi->vfs_inode;
}

980 981
static int f2fs_drop_inode(struct inode *inode)
{
982
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
983
	int ret;
984 985 986 987 988 989 990 991 992 993 994 995 996

	/*
	 * during filesystem shutdown, if checkpoint is disabled,
	 * drop useless meta/node dirty pages.
	 */
	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) {
		if (inode->i_ino == F2FS_NODE_INO(sbi) ||
			inode->i_ino == F2FS_META_INO(sbi)) {
			trace_f2fs_drop_inode(inode, 1);
			return 1;
		}
	}

997 998 999 1000 1001 1002 1003
	/*
	 * 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)
	 */
1004
	if ((!inode_unhashed(inode) && inode->i_state & I_SYNC)) {
1005
		if (!inode->i_nlink && !is_bad_inode(inode)) {
J
Jaegeuk Kim 已提交
1006 1007
			/* to avoid evict_inode call simultaneously */
			atomic_inc(&inode->i_count);
1008 1009 1010 1011
			spin_unlock(&inode->i_lock);

			/* some remained atomic pages should discarded */
			if (f2fs_is_atomic_file(inode))
C
Chao Yu 已提交
1012
				f2fs_drop_inmem_pages(inode);
1013

J
Jaegeuk Kim 已提交
1014 1015 1016
			/* should remain fi->extent_tree for writepage */
			f2fs_destroy_extent_node(inode);

1017
			sb_start_intwrite(inode->i_sb);
1018
			f2fs_i_size_write(inode, 0);
1019

1020 1021 1022 1023
			f2fs_submit_merged_write_cond(F2FS_I_SB(inode),
					inode, NULL, 0, DATA);
			truncate_inode_pages_final(inode->i_mapping);

1024
			if (F2FS_HAS_BLOCKS(inode))
1025
				f2fs_truncate(inode);
1026 1027 1028 1029

			sb_end_intwrite(inode->i_sb);

			spin_lock(&inode->i_lock);
J
Jaegeuk Kim 已提交
1030
			atomic_dec(&inode->i_count);
1031
		}
1032
		trace_f2fs_drop_inode(inode, 0);
1033
		return 0;
1034
	}
1035
	ret = generic_drop_inode(inode);
E
Eric Biggers 已提交
1036 1037
	if (!ret)
		ret = fscrypt_drop_inode(inode);
1038 1039
	trace_f2fs_drop_inode(inode, ret);
	return ret;
1040 1041
}

1042
int f2fs_inode_dirtied(struct inode *inode, bool sync)
1043
{
1044
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1045
	int ret = 0;
1046 1047 1048

	spin_lock(&sbi->inode_lock[DIRTY_META]);
	if (is_inode_flag_set(inode, FI_DIRTY_INODE)) {
1049 1050 1051 1052
		ret = 1;
	} else {
		set_inode_flag(inode, FI_DIRTY_INODE);
		stat_inc_dirty_inode(sbi, DIRTY_META);
1053
	}
1054 1055
	if (sync && list_empty(&F2FS_I(inode)->gdirty_list)) {
		list_add_tail(&F2FS_I(inode)->gdirty_list,
1056
				&sbi->inode_list[DIRTY_META]);
1057 1058
		inc_page_count(sbi, F2FS_DIRTY_IMETA);
	}
1059
	spin_unlock(&sbi->inode_lock[DIRTY_META]);
1060
	return ret;
1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071
}

void f2fs_inode_synced(struct inode *inode)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

	spin_lock(&sbi->inode_lock[DIRTY_META]);
	if (!is_inode_flag_set(inode, FI_DIRTY_INODE)) {
		spin_unlock(&sbi->inode_lock[DIRTY_META]);
		return;
	}
1072 1073 1074 1075
	if (!list_empty(&F2FS_I(inode)->gdirty_list)) {
		list_del_init(&F2FS_I(inode)->gdirty_list);
		dec_page_count(sbi, F2FS_DIRTY_IMETA);
	}
1076
	clear_inode_flag(inode, FI_DIRTY_INODE);
1077
	clear_inode_flag(inode, FI_AUTO_RECOVER);
1078
	stat_dec_dirty_inode(F2FS_I_SB(inode), DIRTY_META);
1079
	spin_unlock(&sbi->inode_lock[DIRTY_META]);
1080 1081
}

J
Jaegeuk Kim 已提交
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
/*
 * 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)
{
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

	if (inode->i_ino == F2FS_NODE_INO(sbi) ||
			inode->i_ino == F2FS_META_INO(sbi))
		return;

	if (flags == I_DIRTY_TIME)
		return;

	if (is_inode_flag_set(inode, FI_AUTO_RECOVER))
		clear_inode_flag(inode, FI_AUTO_RECOVER);

1101
	f2fs_inode_dirtied(inode, false);
J
Jaegeuk Kim 已提交
1102 1103
}

A
Al Viro 已提交
1104
static void f2fs_free_inode(struct inode *inode)
J
Jaegeuk Kim 已提交
1105
{
1106
	fscrypt_free_inode(inode);
J
Jaegeuk Kim 已提交
1107 1108 1109
	kmem_cache_free(f2fs_inode_cachep, F2FS_I(inode));
}

1110 1111
static void destroy_percpu_info(struct f2fs_sb_info *sbi)
{
1112
	percpu_counter_destroy(&sbi->alloc_valid_block_count);
1113
	percpu_counter_destroy(&sbi->total_valid_inode_count);
1114 1115
}

J
Jaegeuk Kim 已提交
1116 1117 1118 1119 1120 1121 1122
static void destroy_device_list(struct f2fs_sb_info *sbi)
{
	int i;

	for (i = 0; i < sbi->s_ndevs; i++) {
		blkdev_put(FDEV(i).bdev, FMODE_EXCL);
#ifdef CONFIG_BLK_DEV_ZONED
1123
		kvfree(FDEV(i).blkz_seq);
J
Jaegeuk Kim 已提交
1124 1125
#endif
	}
1126
	kvfree(sbi->devs);
J
Jaegeuk Kim 已提交
1127 1128
}

J
Jaegeuk Kim 已提交
1129 1130 1131
static void f2fs_put_super(struct super_block *sb)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
C
Chao Yu 已提交
1132
	int i;
1133
	bool dropped;
J
Jaegeuk Kim 已提交
1134

C
Chao Yu 已提交
1135
	f2fs_quota_off_umount(sb);
J
Jaegeuk Kim 已提交
1136

1137 1138 1139
	/* prevent remaining shrinker jobs */
	mutex_lock(&sbi->umount_mutex);

1140 1141 1142 1143 1144
	/*
	 * 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.
	 */
D
Daniel Rosenberg 已提交
1145 1146
	if ((is_sbi_flag_set(sbi, SBI_IS_DIRTY) ||
			!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG))) {
1147 1148 1149
		struct cp_control cpc = {
			.reason = CP_UMOUNT,
		};
C
Chao Yu 已提交
1150
		f2fs_write_checkpoint(sbi, &cpc);
1151
	}
J
Jaegeuk Kim 已提交
1152

1153
	/* be sure to wait for any on-going discard commands */
1154
	dropped = f2fs_issue_discard_timeout(sbi);
1155

1156 1157
	if ((f2fs_hw_support_discard(sbi) || f2fs_hw_should_discard(sbi)) &&
					!sbi->discard_blks && !dropped) {
1158 1159 1160
		struct cp_control cpc = {
			.reason = CP_UMOUNT | CP_TRIMMED,
		};
C
Chao Yu 已提交
1161
		f2fs_write_checkpoint(sbi, &cpc);
1162 1163
	}

1164 1165 1166 1167
	/*
	 * normally superblock is clean, so we need to release this.
	 * In addition, EIO will skip do checkpoint, we need this as well.
	 */
C
Chao Yu 已提交
1168
	f2fs_release_ino_entry(sbi, true);
1169

1170 1171 1172
	f2fs_leave_shrinker(sbi);
	mutex_unlock(&sbi->umount_mutex);

1173
	/* our cp_error case, we can wait for any writeback page */
1174
	f2fs_flush_merged_writes(sbi);
1175

1176
	f2fs_wait_on_all_pages(sbi, F2FS_WB_CP_DATA);
1177 1178 1179

	f2fs_bug_on(sbi, sbi->fsync_node_num);

J
Jaegeuk Kim 已提交
1180
	iput(sbi->node_inode);
1181 1182
	sbi->node_inode = NULL;

J
Jaegeuk Kim 已提交
1183
	iput(sbi->meta_inode);
1184
	sbi->meta_inode = NULL;
J
Jaegeuk Kim 已提交
1185

1186 1187 1188 1189 1190 1191
	/*
	 * iput() can update stat information, if f2fs_write_checkpoint()
	 * above failed with error.
	 */
	f2fs_destroy_stats(sbi);

J
Jaegeuk Kim 已提交
1192
	/* destroy f2fs internal modules */
C
Chao Yu 已提交
1193 1194
	f2fs_destroy_node_manager(sbi);
	f2fs_destroy_segment_manager(sbi);
J
Jaegeuk Kim 已提交
1195

C
Chao Yu 已提交
1196 1197
	f2fs_destroy_post_read_wq(sbi);

1198
	kvfree(sbi->ckpt);
C
Chao Yu 已提交
1199

1200
	f2fs_unregister_sysfs(sbi);
J
Jaegeuk Kim 已提交
1201 1202

	sb->s_fs_info = NULL;
K
Keith Mok 已提交
1203 1204
	if (sbi->s_chksum_driver)
		crypto_free_shash(sbi->s_chksum_driver);
1205
	kvfree(sbi->raw_super);
1206

J
Jaegeuk Kim 已提交
1207
	destroy_device_list(sbi);
1208
	mempool_destroy(sbi->write_io_dummy);
C
Chao Yu 已提交
1209 1210
#ifdef CONFIG_QUOTA
	for (i = 0; i < MAXQUOTAS; i++)
1211
		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
C
Chao Yu 已提交
1212
#endif
1213
	destroy_percpu_info(sbi);
J
Jaegeuk Kim 已提交
1214
	for (i = 0; i < NR_PAGE_TYPE; i++)
1215
		kvfree(sbi->write_io[i]);
1216 1217 1218
#ifdef CONFIG_UNICODE
	utf8_unload(sbi->s_encoding);
#endif
1219
	kvfree(sbi);
J
Jaegeuk Kim 已提交
1220 1221 1222 1223 1224
}

int f2fs_sync_fs(struct super_block *sb, int sync)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
C
Chao Yu 已提交
1225
	int err = 0;
J
Jaegeuk Kim 已提交
1226

1227 1228
	if (unlikely(f2fs_cp_error(sbi)))
		return 0;
D
Daniel Rosenberg 已提交
1229 1230
	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
		return 0;
1231

1232 1233
	trace_f2fs_sync_fs(sb, sync);

C
Chao Yu 已提交
1234 1235 1236
	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
		return -EAGAIN;

1237
	if (sync) {
1238 1239
		struct cp_control cpc;

1240 1241
		cpc.reason = __get_cp_reason(sbi);

C
Chao Yu 已提交
1242
		down_write(&sbi->gc_lock);
C
Chao Yu 已提交
1243
		err = f2fs_write_checkpoint(sbi, &cpc);
C
Chao Yu 已提交
1244
		up_write(&sbi->gc_lock);
1245
	}
1246
	f2fs_trace_ios(NULL, 1);
J
Jaegeuk Kim 已提交
1247

C
Chao Yu 已提交
1248
	return err;
J
Jaegeuk Kim 已提交
1249 1250
}

1251 1252
static int f2fs_freeze(struct super_block *sb)
{
J
Jaegeuk Kim 已提交
1253
	if (f2fs_readonly(sb))
1254 1255
		return 0;

1256 1257 1258 1259 1260 1261 1262 1263
	/* IO error happened before */
	if (unlikely(f2fs_cp_error(F2FS_SB(sb))))
		return -EIO;

	/* must be clean, since sync_filesystem() was already called */
	if (is_sbi_flag_set(F2FS_SB(sb), SBI_IS_DIRTY))
		return -EINVAL;
	return 0;
1264 1265 1266 1267 1268 1269 1270
}

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

C
Chao Yu 已提交
1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
#ifdef CONFIG_QUOTA
static int f2fs_statfs_project(struct super_block *sb,
				kprojid_t projid, struct kstatfs *buf)
{
	struct kqid qid;
	struct dquot *dquot;
	u64 limit;
	u64 curblock;

	qid = make_kqid_projid(projid);
	dquot = dqget(sb, qid);
	if (IS_ERR(dquot))
		return PTR_ERR(dquot);
1284
	spin_lock(&dquot->dq_dqb_lock);
C
Chao Yu 已提交
1285

1286 1287
	limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit,
					dquot->dq_dqb.dqb_bhardlimit);
1288 1289
	if (limit)
		limit >>= sb->s_blocksize_bits;
1290

C
Chao Yu 已提交
1291 1292 1293 1294 1295 1296 1297 1298
	if (limit && buf->f_blocks > limit) {
		curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits;
		buf->f_blocks = limit;
		buf->f_bfree = buf->f_bavail =
			(buf->f_blocks > curblock) ?
			 (buf->f_blocks - curblock) : 0;
	}

1299 1300
	limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit,
					dquot->dq_dqb.dqb_ihardlimit);
1301

C
Chao Yu 已提交
1302 1303 1304 1305 1306 1307 1308
	if (limit && buf->f_files > limit) {
		buf->f_files = limit;
		buf->f_ffree =
			(buf->f_files > dquot->dq_dqb.dqb_curinodes) ?
			 (buf->f_files - dquot->dq_dqb.dqb_curinodes) : 0;
	}

1309
	spin_unlock(&dquot->dq_dqb_lock);
C
Chao Yu 已提交
1310 1311 1312 1313 1314
	dqput(dquot);
	return 0;
}
#endif

J
Jaegeuk Kim 已提交
1315 1316 1317 1318 1319
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);
1320
	block_t total_count, user_block_count, start_count;
1321
	u64 avail_node_count;
J
Jaegeuk Kim 已提交
1322 1323 1324 1325 1326 1327 1328 1329

	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);
	buf->f_type = F2FS_SUPER_MAGIC;
	buf->f_bsize = sbi->blocksize;

	buf->f_blocks = total_count - start_count;
1330
	buf->f_bfree = user_block_count - valid_user_blocks(sbi) -
1331
						sbi->current_reserved_blocks;
1332 1333

	spin_lock(&sbi->stat_lock);
D
Daniel Rosenberg 已提交
1334 1335 1336 1337
	if (unlikely(buf->f_bfree <= sbi->unusable_block_count))
		buf->f_bfree = 0;
	else
		buf->f_bfree -= sbi->unusable_block_count;
1338
	spin_unlock(&sbi->stat_lock);
D
Daniel Rosenberg 已提交
1339

1340 1341 1342
	if (buf->f_bfree > F2FS_OPTION(sbi).root_reserved_blocks)
		buf->f_bavail = buf->f_bfree -
				F2FS_OPTION(sbi).root_reserved_blocks;
1343 1344
	else
		buf->f_bavail = 0;
J
Jaegeuk Kim 已提交
1345

1346
	avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM;
1347 1348 1349 1350 1351 1352 1353 1354 1355

	if (avail_node_count > user_block_count) {
		buf->f_files = user_block_count;
		buf->f_ffree = buf->f_bavail;
	} else {
		buf->f_files = avail_node_count;
		buf->f_ffree = min(avail_node_count - valid_node_count(sbi),
					buf->f_bavail);
	}
J
Jaegeuk Kim 已提交
1356

1357
	buf->f_namelen = F2FS_NAME_LEN;
J
Jaegeuk Kim 已提交
1358 1359 1360
	buf->f_fsid.val[0] = (u32)id;
	buf->f_fsid.val[1] = (u32)(id >> 32);

C
Chao Yu 已提交
1361 1362 1363 1364 1365 1366
#ifdef CONFIG_QUOTA
	if (is_inode_flag_set(dentry->d_inode, FI_PROJ_INHERIT) &&
			sb_has_quota_limits_enabled(sb, PRJQUOTA)) {
		f2fs_statfs_project(sb, F2FS_I(dentry->d_inode)->i_projid, buf);
	}
#endif
J
Jaegeuk Kim 已提交
1367 1368 1369
	return 0;
}

C
Chao Yu 已提交
1370 1371 1372 1373 1374 1375
static inline void f2fs_show_quota_options(struct seq_file *seq,
					   struct super_block *sb)
{
#ifdef CONFIG_QUOTA
	struct f2fs_sb_info *sbi = F2FS_SB(sb);

1376
	if (F2FS_OPTION(sbi).s_jquota_fmt) {
C
Chao Yu 已提交
1377 1378
		char *fmtname = "";

1379
		switch (F2FS_OPTION(sbi).s_jquota_fmt) {
C
Chao Yu 已提交
1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392
		case QFMT_VFS_OLD:
			fmtname = "vfsold";
			break;
		case QFMT_VFS_V0:
			fmtname = "vfsv0";
			break;
		case QFMT_VFS_V1:
			fmtname = "vfsv1";
			break;
		}
		seq_printf(seq, ",jqfmt=%s", fmtname);
	}

1393 1394 1395
	if (F2FS_OPTION(sbi).s_qf_names[USRQUOTA])
		seq_show_option(seq, "usrjquota",
			F2FS_OPTION(sbi).s_qf_names[USRQUOTA]);
C
Chao Yu 已提交
1396

1397 1398 1399
	if (F2FS_OPTION(sbi).s_qf_names[GRPQUOTA])
		seq_show_option(seq, "grpjquota",
			F2FS_OPTION(sbi).s_qf_names[GRPQUOTA]);
C
Chao Yu 已提交
1400

1401 1402 1403
	if (F2FS_OPTION(sbi).s_qf_names[PRJQUOTA])
		seq_show_option(seq, "prjjquota",
			F2FS_OPTION(sbi).s_qf_names[PRJQUOTA]);
C
Chao Yu 已提交
1404 1405 1406
#endif
}

C
Chao Yu 已提交
1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
static inline void f2fs_show_compress_options(struct seq_file *seq,
							struct super_block *sb)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	char *algtype = "";
	int i;

	if (!f2fs_sb_has_compression(sbi))
		return;

	switch (F2FS_OPTION(sbi).compress_algorithm) {
	case COMPRESS_LZO:
		algtype = "lzo";
		break;
	case COMPRESS_LZ4:
		algtype = "lz4";
		break;
	}
	seq_printf(seq, ",compress_algorithm=%s", algtype);

	seq_printf(seq, ",compress_log_size=%u",
			F2FS_OPTION(sbi).compress_log_size);

	for (i = 0; i < F2FS_OPTION(sbi).compress_ext_cnt; i++) {
		seq_printf(seq, ",compress_extension=%s",
			F2FS_OPTION(sbi).extensions[i]);
	}
}

J
Jaegeuk Kim 已提交
1436 1437 1438 1439
static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
{
	struct f2fs_sb_info *sbi = F2FS_SB(root->d_sb);

1440 1441 1442 1443 1444 1445
	if (!f2fs_readonly(sbi->sb) && test_opt(sbi, BG_GC)) {
		if (test_opt(sbi, FORCE_FG_GC))
			seq_printf(seq, ",background_gc=%s", "sync");
		else
			seq_printf(seq, ",background_gc=%s", "on");
	} else {
1446
		seq_printf(seq, ",background_gc=%s", "off");
1447
	}
J
Jaegeuk Kim 已提交
1448 1449
	if (test_opt(sbi, DISABLE_ROLL_FORWARD))
		seq_puts(seq, ",disable_roll_forward");
1450 1451
	if (test_opt(sbi, NORECOVERY))
		seq_puts(seq, ",norecovery");
J
Jaegeuk Kim 已提交
1452 1453
	if (test_opt(sbi, DISCARD))
		seq_puts(seq, ",discard");
1454 1455
	else
		seq_puts(seq, ",nodiscard");
J
Jaegeuk Kim 已提交
1456
	if (test_opt(sbi, NOHEAP))
1457 1458 1459
		seq_puts(seq, ",no_heap");
	else
		seq_puts(seq, ",heap");
J
Jaegeuk Kim 已提交
1460 1461 1462 1463 1464
#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 已提交
1465 1466
	if (test_opt(sbi, INLINE_XATTR))
		seq_puts(seq, ",inline_xattr");
1467 1468
	else
		seq_puts(seq, ",noinline_xattr");
C
Chao Yu 已提交
1469 1470
	if (test_opt(sbi, INLINE_XATTR_SIZE))
		seq_printf(seq, ",inline_xattr_size=%u",
1471
					F2FS_OPTION(sbi).inline_xattr_size);
J
Jaegeuk Kim 已提交
1472 1473 1474 1475 1476 1477 1478 1479
#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))
1480
		seq_puts(seq, ",disable_ext_identify");
1481 1482
	if (test_opt(sbi, INLINE_DATA))
		seq_puts(seq, ",inline_data");
W
Wanpeng Li 已提交
1483 1484
	else
		seq_puts(seq, ",noinline_data");
1485 1486
	if (test_opt(sbi, INLINE_DENTRY))
		seq_puts(seq, ",inline_dentry");
1487 1488
	else
		seq_puts(seq, ",noinline_dentry");
1489
	if (!f2fs_readonly(sbi->sb) && test_opt(sbi, FLUSH_MERGE))
1490
		seq_puts(seq, ",flush_merge");
J
Jaegeuk Kim 已提交
1491 1492
	if (test_opt(sbi, NOBARRIER))
		seq_puts(seq, ",nobarrier");
1493 1494
	if (test_opt(sbi, FASTBOOT))
		seq_puts(seq, ",fastboot");
1495 1496
	if (test_opt(sbi, EXTENT_CACHE))
		seq_puts(seq, ",extent_cache");
1497 1498
	else
		seq_puts(seq, ",noextent_cache");
1499 1500
	if (test_opt(sbi, DATA_FLUSH))
		seq_puts(seq, ",data_flush");
1501 1502

	seq_puts(seq, ",mode=");
1503
	if (F2FS_OPTION(sbi).fs_mode == FS_MODE_ADAPTIVE)
1504
		seq_puts(seq, "adaptive");
1505
	else if (F2FS_OPTION(sbi).fs_mode == FS_MODE_LFS)
1506
		seq_puts(seq, "lfs");
1507
	seq_printf(seq, ",active_logs=%u", F2FS_OPTION(sbi).active_logs);
1508
	if (test_opt(sbi, RESERVE_ROOT))
1509
		seq_printf(seq, ",reserve_root=%u,resuid=%u,resgid=%u",
1510 1511 1512 1513 1514
				F2FS_OPTION(sbi).root_reserved_blocks,
				from_kuid_munged(&init_user_ns,
					F2FS_OPTION(sbi).s_resuid),
				from_kgid_munged(&init_user_ns,
					F2FS_OPTION(sbi).s_resgid));
1515
	if (F2FS_IO_SIZE_BITS(sbi))
1516 1517
		seq_printf(seq, ",io_bits=%u",
				F2FS_OPTION(sbi).write_io_size_bits);
1518
#ifdef CONFIG_F2FS_FAULT_INJECTION
C
Chao Yu 已提交
1519
	if (test_opt(sbi, FAULT_INJECTION)) {
1520
		seq_printf(seq, ",fault_injection=%u",
1521
				F2FS_OPTION(sbi).fault_info.inject_rate);
C
Chao Yu 已提交
1522 1523 1524
		seq_printf(seq, ",fault_type=%u",
				F2FS_OPTION(sbi).fault_info.inject_type);
	}
1525
#endif
C
Chao Yu 已提交
1526
#ifdef CONFIG_QUOTA
C
Chao Yu 已提交
1527 1528
	if (test_opt(sbi, QUOTA))
		seq_puts(seq, ",quota");
C
Chao Yu 已提交
1529 1530 1531 1532
	if (test_opt(sbi, USRQUOTA))
		seq_puts(seq, ",usrquota");
	if (test_opt(sbi, GRPQUOTA))
		seq_puts(seq, ",grpquota");
C
Chao Yu 已提交
1533 1534
	if (test_opt(sbi, PRJQUOTA))
		seq_puts(seq, ",prjquota");
1535
#endif
C
Chao Yu 已提交
1536
	f2fs_show_quota_options(seq, sbi->sb);
1537
	if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_USER)
1538
		seq_printf(seq, ",whint_mode=%s", "user-based");
1539
	else if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_FS)
1540
		seq_printf(seq, ",whint_mode=%s", "fs-based");
1541
#ifdef CONFIG_FS_ENCRYPTION
1542 1543 1544
	if (F2FS_OPTION(sbi).test_dummy_encryption)
		seq_puts(seq, ",test_dummy_encryption");
#endif
J
Jaegeuk Kim 已提交
1545

1546
	if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_DEFAULT)
1547
		seq_printf(seq, ",alloc_mode=%s", "default");
1548
	else if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_REUSE)
1549
		seq_printf(seq, ",alloc_mode=%s", "reuse");
1550

D
Daniel Rosenberg 已提交
1551
	if (test_opt(sbi, DISABLE_CHECKPOINT))
1552 1553
		seq_printf(seq, ",checkpoint=disable:%u",
				F2FS_OPTION(sbi).unusable_cap);
1554
	if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_POSIX)
1555
		seq_printf(seq, ",fsync_mode=%s", "posix");
1556
	else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT)
1557
		seq_printf(seq, ",fsync_mode=%s", "strict");
1558 1559
	else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_NOBARRIER)
		seq_printf(seq, ",fsync_mode=%s", "nobarrier");
C
Chao Yu 已提交
1560 1561

	f2fs_show_compress_options(seq, sbi->sb);
J
Jaegeuk Kim 已提交
1562 1563 1564
	return 0;
}

1565 1566 1567
static void default_options(struct f2fs_sb_info *sbi)
{
	/* init some FS parameters */
1568 1569 1570 1571 1572
	F2FS_OPTION(sbi).active_logs = NR_CURSEG_TYPE;
	F2FS_OPTION(sbi).inline_xattr_size = DEFAULT_INLINE_XATTR_ADDRS;
	F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF;
	F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_DEFAULT;
	F2FS_OPTION(sbi).fsync_mode = FSYNC_MODE_POSIX;
1573
	F2FS_OPTION(sbi).test_dummy_encryption = false;
1574 1575
	F2FS_OPTION(sbi).s_resuid = make_kuid(&init_user_ns, F2FS_DEF_RESUID);
	F2FS_OPTION(sbi).s_resgid = make_kgid(&init_user_ns, F2FS_DEF_RESGID);
C
Chao Yu 已提交
1576 1577 1578
	F2FS_OPTION(sbi).compress_algorithm = COMPRESS_LZO;
	F2FS_OPTION(sbi).compress_log_size = MIN_COMPRESS_LOG_SIZE;
	F2FS_OPTION(sbi).compress_ext_cnt = 0;
1579 1580

	set_opt(sbi, BG_GC);
C
Chao Yu 已提交
1581
	set_opt(sbi, INLINE_XATTR);
1582
	set_opt(sbi, INLINE_DATA);
1583
	set_opt(sbi, INLINE_DENTRY);
J
Jaegeuk Kim 已提交
1584
	set_opt(sbi, EXTENT_CACHE);
1585
	set_opt(sbi, NOHEAP);
D
Daniel Rosenberg 已提交
1586
	clear_opt(sbi, DISABLE_CHECKPOINT);
1587
	F2FS_OPTION(sbi).unusable_cap = 0;
1588
	sbi->sb->s_flags |= SB_LAZYTIME;
J
Jaegeuk Kim 已提交
1589
	set_opt(sbi, FLUSH_MERGE);
1590
	set_opt(sbi, DISCARD);
1591
	if (f2fs_sb_has_blkzoned(sbi))
1592
		F2FS_OPTION(sbi).fs_mode = FS_MODE_LFS;
1593
	else
1594
		F2FS_OPTION(sbi).fs_mode = FS_MODE_ADAPTIVE;
1595 1596 1597 1598 1599 1600 1601

#ifdef CONFIG_F2FS_FS_XATTR
	set_opt(sbi, XATTR_USER);
#endif
#ifdef CONFIG_F2FS_FS_POSIX_ACL
	set_opt(sbi, POSIX_ACL);
#endif
1602

C
Chao Yu 已提交
1603
	f2fs_build_fault_attr(sbi, 0, 0);
1604 1605
}

J
Jaegeuk Kim 已提交
1606 1607 1608
#ifdef CONFIG_QUOTA
static int f2fs_enable_quotas(struct super_block *sb);
#endif
D
Daniel Rosenberg 已提交
1609 1610 1611

static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
{
1612
	unsigned int s_flags = sbi->sb->s_flags;
D
Daniel Rosenberg 已提交
1613
	struct cp_control cpc;
1614 1615
	int err = 0;
	int ret;
1616
	block_t unusable;
D
Daniel Rosenberg 已提交
1617

1618
	if (s_flags & SB_RDONLY) {
1619
		f2fs_err(sbi, "checkpoint=disable on readonly fs");
1620 1621
		return -EINVAL;
	}
D
Daniel Rosenberg 已提交
1622 1623 1624 1625 1626
	sbi->sb->s_flags |= SB_ACTIVE;

	f2fs_update_time(sbi, DISABLE_TIME);

	while (!f2fs_time_over(sbi, DISABLE_TIME)) {
C
Chao Yu 已提交
1627
		down_write(&sbi->gc_lock);
D
Daniel Rosenberg 已提交
1628
		err = f2fs_gc(sbi, true, false, NULL_SEGNO);
1629 1630
		if (err == -ENODATA) {
			err = 0;
D
Daniel Rosenberg 已提交
1631
			break;
1632
		}
1633
		if (err && err != -EAGAIN)
1634
			break;
D
Daniel Rosenberg 已提交
1635 1636
	}

1637 1638 1639 1640 1641
	ret = sync_filesystem(sbi->sb);
	if (ret || err) {
		err = ret ? ret: err;
		goto restore_flag;
	}
D
Daniel Rosenberg 已提交
1642

1643 1644
	unusable = f2fs_get_unusable_blocks(sbi);
	if (f2fs_disable_cp_again(sbi, unusable)) {
1645 1646 1647
		err = -EAGAIN;
		goto restore_flag;
	}
D
Daniel Rosenberg 已提交
1648

C
Chao Yu 已提交
1649
	down_write(&sbi->gc_lock);
D
Daniel Rosenberg 已提交
1650 1651
	cpc.reason = CP_PAUSE;
	set_sbi_flag(sbi, SBI_CP_DISABLED);
1652 1653 1654
	err = f2fs_write_checkpoint(sbi, &cpc);
	if (err)
		goto out_unlock;
D
Daniel Rosenberg 已提交
1655

1656
	spin_lock(&sbi->stat_lock);
1657
	sbi->unusable_block_count = unusable;
1658 1659
	spin_unlock(&sbi->stat_lock);

1660
out_unlock:
C
Chao Yu 已提交
1661
	up_write(&sbi->gc_lock);
1662
restore_flag:
C
Chao Yu 已提交
1663
	sbi->sb->s_flags = s_flags;	/* Restore SB_RDONLY status */
1664
	return err;
D
Daniel Rosenberg 已提交
1665 1666 1667 1668
}

static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
{
C
Chao Yu 已提交
1669
	down_write(&sbi->gc_lock);
D
Daniel Rosenberg 已提交
1670 1671 1672 1673
	f2fs_dirty_to_prefree(sbi);

	clear_sbi_flag(sbi, SBI_CP_DISABLED);
	set_sbi_flag(sbi, SBI_IS_DIRTY);
C
Chao Yu 已提交
1674
	up_write(&sbi->gc_lock);
D
Daniel Rosenberg 已提交
1675 1676 1677 1678

	f2fs_sync_fs(sbi->sb, 1);
}

1679 1680 1681 1682
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;
C
Chao Yu 已提交
1683
	unsigned long old_sb_flags;
1684
	int err;
1685 1686
	bool need_restart_gc = false;
	bool need_stop_gc = false;
1687
	bool no_extent_cache = !test_opt(sbi, EXTENT_CACHE);
D
Daniel Rosenberg 已提交
1688
	bool disable_checkpoint = test_opt(sbi, DISABLE_CHECKPOINT);
1689
	bool no_io_align = !F2FS_IO_ALIGNED(sbi);
D
Daniel Rosenberg 已提交
1690
	bool checkpoint_changed;
C
Chao Yu 已提交
1691 1692 1693
#ifdef CONFIG_QUOTA
	int i, j;
#endif
1694 1695 1696 1697 1698 1699

	/*
	 * Save the old mount options in case we
	 * need to restore them.
	 */
	org_mount_opt = sbi->mount_opt;
C
Chao Yu 已提交
1700
	old_sb_flags = sb->s_flags;
1701

C
Chao Yu 已提交
1702
#ifdef CONFIG_QUOTA
1703
	org_mount_opt.s_jquota_fmt = F2FS_OPTION(sbi).s_jquota_fmt;
C
Chao Yu 已提交
1704
	for (i = 0; i < MAXQUOTAS; i++) {
1705 1706 1707 1708 1709
		if (F2FS_OPTION(sbi).s_qf_names[i]) {
			org_mount_opt.s_qf_names[i] =
				kstrdup(F2FS_OPTION(sbi).s_qf_names[i],
				GFP_KERNEL);
			if (!org_mount_opt.s_qf_names[i]) {
C
Chao Yu 已提交
1710
				for (j = 0; j < i; j++)
1711
					kvfree(org_mount_opt.s_qf_names[j]);
C
Chao Yu 已提交
1712 1713 1714
				return -ENOMEM;
			}
		} else {
1715
			org_mount_opt.s_qf_names[i] = NULL;
C
Chao Yu 已提交
1716 1717 1718 1719
		}
	}
#endif

1720
	/* recover superblocks we couldn't write due to previous RO mount */
1721
	if (!(*flags & SB_RDONLY) && is_sbi_flag_set(sbi, SBI_NEED_SB_WRITE)) {
1722
		err = f2fs_commit_super(sbi, false);
1723 1724
		f2fs_info(sbi, "Try to recover all the superblocks, ret: %d",
			  err);
1725 1726 1727 1728
		if (!err)
			clear_sbi_flag(sbi, SBI_NEED_SB_WRITE);
	}

1729
	default_options(sbi);
1730

1731 1732 1733 1734
	/* parse mount options */
	err = parse_options(sb, data);
	if (err)
		goto restore_opts;
D
Daniel Rosenberg 已提交
1735 1736
	checkpoint_changed =
			disable_checkpoint != test_opt(sbi, DISABLE_CHECKPOINT);
1737 1738 1739

	/*
	 * Previous and new state of filesystem is RO,
1740
	 * so skip checking GC and FLUSH_MERGE conditions.
1741
	 */
1742
	if (f2fs_readonly(sb) && (*flags & SB_RDONLY))
1743 1744
		goto skip;

J
Jaegeuk Kim 已提交
1745
#ifdef CONFIG_QUOTA
1746
	if (!f2fs_readonly(sb) && (*flags & SB_RDONLY)) {
C
Chao Yu 已提交
1747 1748 1749
		err = dquot_suspend(sb, -1);
		if (err < 0)
			goto restore_opts;
D
Daniel Rosenberg 已提交
1750
	} else if (f2fs_readonly(sb) && !(*flags & SB_RDONLY)) {
C
Chao Yu 已提交
1751
		/* dquot_resume needs RW */
1752
		sb->s_flags &= ~SB_RDONLY;
J
Jaegeuk Kim 已提交
1753 1754
		if (sb_any_quota_suspended(sb)) {
			dquot_resume(sb, -1);
1755
		} else if (f2fs_sb_has_quota_ino(sbi)) {
J
Jaegeuk Kim 已提交
1756 1757 1758 1759
			err = f2fs_enable_quotas(sb);
			if (err)
				goto restore_opts;
		}
C
Chao Yu 已提交
1760
	}
J
Jaegeuk Kim 已提交
1761
#endif
1762 1763 1764
	/* disallow enable/disable extent_cache dynamically */
	if (no_extent_cache == !!test_opt(sbi, EXTENT_CACHE)) {
		err = -EINVAL;
1765
		f2fs_warn(sbi, "switch extent_cache option is not allowed");
1766 1767 1768
		goto restore_opts;
	}

1769 1770 1771 1772 1773 1774
	if (no_io_align == !!F2FS_IO_ALIGNED(sbi)) {
		err = -EINVAL;
		f2fs_warn(sbi, "switch io_bits option is not allowed");
		goto restore_opts;
	}

D
Daniel Rosenberg 已提交
1775 1776
	if ((*flags & SB_RDONLY) && test_opt(sbi, DISABLE_CHECKPOINT)) {
		err = -EINVAL;
1777
		f2fs_warn(sbi, "disabling checkpoint not compatible with read-only");
D
Daniel Rosenberg 已提交
1778 1779 1780
		goto restore_opts;
	}

1781 1782 1783 1784 1785
	/*
	 * 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.
	 */
1786
	if ((*flags & SB_RDONLY) || !test_opt(sbi, BG_GC)) {
1787
		if (sbi->gc_thread) {
C
Chao Yu 已提交
1788
			f2fs_stop_gc_thread(sbi);
1789
			need_restart_gc = true;
1790
		}
1791
	} else if (!sbi->gc_thread) {
C
Chao Yu 已提交
1792
		err = f2fs_start_gc_thread(sbi);
1793 1794
		if (err)
			goto restore_opts;
1795 1796 1797
		need_stop_gc = true;
	}

1798 1799
	if (*flags & SB_RDONLY ||
		F2FS_OPTION(sbi).whint_mode != org_mount_opt.whint_mode) {
1800 1801 1802 1803 1804 1805 1806 1807 1808
		writeback_inodes_sb(sb, WB_REASON_SYNC);
		sync_inodes_sb(sb);

		set_sbi_flag(sbi, SBI_IS_DIRTY);
		set_sbi_flag(sbi, SBI_IS_CLOSE);
		f2fs_sync_fs(sb, 1);
		clear_sbi_flag(sbi, SBI_IS_CLOSE);
	}

D
Daniel Rosenberg 已提交
1809 1810 1811 1812 1813 1814 1815 1816 1817 1818
	if (checkpoint_changed) {
		if (test_opt(sbi, DISABLE_CHECKPOINT)) {
			err = f2fs_disable_checkpoint(sbi);
			if (err)
				goto restore_gc;
		} else {
			f2fs_enable_checkpoint(sbi);
		}
	}

1819 1820 1821 1822
	/*
	 * We stop issue flush thread if FS is mounted as RO
	 * or if flush_merge is not passed in mount option.
	 */
1823
	if ((*flags & SB_RDONLY) || !test_opt(sbi, FLUSH_MERGE)) {
1824
		clear_opt(sbi, FLUSH_MERGE);
C
Chao Yu 已提交
1825
		f2fs_destroy_flush_cmd_control(sbi, false);
1826
	} else {
C
Chao Yu 已提交
1827
		err = f2fs_create_flush_cmd_control(sbi);
1828
		if (err)
1829
			goto restore_gc;
1830 1831
	}
skip:
C
Chao Yu 已提交
1832 1833 1834
#ifdef CONFIG_QUOTA
	/* Release old quota file names */
	for (i = 0; i < MAXQUOTAS; i++)
1835
		kvfree(org_mount_opt.s_qf_names[i]);
C
Chao Yu 已提交
1836
#endif
1837
	/* Update the POSIXACL Flag */
1838 1839
	sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
		(test_opt(sbi, POSIX_ACL) ? SB_POSIXACL : 0);
1840

1841
	limit_reserve_root(sbi);
J
Jaegeuk Kim 已提交
1842
	*flags = (*flags & ~SB_LAZYTIME) | (sb->s_flags & SB_LAZYTIME);
1843
	return 0;
1844 1845
restore_gc:
	if (need_restart_gc) {
C
Chao Yu 已提交
1846
		if (f2fs_start_gc_thread(sbi))
1847
			f2fs_warn(sbi, "background gc thread has stopped");
1848
	} else if (need_stop_gc) {
C
Chao Yu 已提交
1849
		f2fs_stop_gc_thread(sbi);
1850
	}
1851
restore_opts:
C
Chao Yu 已提交
1852
#ifdef CONFIG_QUOTA
1853
	F2FS_OPTION(sbi).s_jquota_fmt = org_mount_opt.s_jquota_fmt;
C
Chao Yu 已提交
1854
	for (i = 0; i < MAXQUOTAS; i++) {
1855
		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
1856
		F2FS_OPTION(sbi).s_qf_names[i] = org_mount_opt.s_qf_names[i];
C
Chao Yu 已提交
1857 1858
	}
#endif
1859
	sbi->mount_opt = org_mount_opt;
C
Chao Yu 已提交
1860
	sb->s_flags = old_sb_flags;
1861 1862 1863
	return err;
}

C
Chao Yu 已提交
1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887
#ifdef CONFIG_QUOTA
/* Read data from quotafile */
static ssize_t f2fs_quota_read(struct super_block *sb, int type, char *data,
			       size_t len, loff_t off)
{
	struct inode *inode = sb_dqopt(sb)->files[type];
	struct address_space *mapping = inode->i_mapping;
	block_t blkidx = F2FS_BYTES_TO_BLK(off);
	int offset = off & (sb->s_blocksize - 1);
	int tocopy;
	size_t toread;
	loff_t i_size = i_size_read(inode);
	struct page *page;
	char *kaddr;

	if (off > i_size)
		return 0;

	if (off + len > i_size)
		len = i_size - off;
	toread = len;
	while (toread > 0) {
		tocopy = min_t(unsigned long, sb->s_blocksize - offset, toread);
repeat:
1888
		page = read_cache_page_gfp(mapping, blkidx, GFP_NOFS);
1889 1890 1891 1892 1893
		if (IS_ERR(page)) {
			if (PTR_ERR(page) == -ENOMEM) {
				congestion_wait(BLK_RW_ASYNC, HZ/50);
				goto repeat;
			}
1894
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
C
Chao Yu 已提交
1895
			return PTR_ERR(page);
1896
		}
C
Chao Yu 已提交
1897 1898 1899 1900 1901 1902 1903 1904 1905

		lock_page(page);

		if (unlikely(page->mapping != mapping)) {
			f2fs_put_page(page, 1);
			goto repeat;
		}
		if (unlikely(!PageUptodate(page))) {
			f2fs_put_page(page, 1);
1906
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
C
Chao Yu 已提交
1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939
			return -EIO;
		}

		kaddr = kmap_atomic(page);
		memcpy(data, kaddr + offset, tocopy);
		kunmap_atomic(kaddr);
		f2fs_put_page(page, 1);

		offset = 0;
		toread -= tocopy;
		data += tocopy;
		blkidx++;
	}
	return len;
}

/* Write to quotafile */
static ssize_t f2fs_quota_write(struct super_block *sb, int type,
				const char *data, size_t len, loff_t off)
{
	struct inode *inode = sb_dqopt(sb)->files[type];
	struct address_space *mapping = inode->i_mapping;
	const struct address_space_operations *a_ops = mapping->a_ops;
	int offset = off & (sb->s_blocksize - 1);
	size_t towrite = len;
	struct page *page;
	char *kaddr;
	int err = 0;
	int tocopy;

	while (towrite > 0) {
		tocopy = min_t(unsigned long, sb->s_blocksize - offset,
								towrite);
1940
retry:
C
Chao Yu 已提交
1941 1942
		err = a_ops->write_begin(NULL, mapping, off, tocopy, 0,
							&page, NULL);
1943 1944 1945 1946 1947
		if (unlikely(err)) {
			if (err == -ENOMEM) {
				congestion_wait(BLK_RW_ASYNC, HZ/50);
				goto retry;
			}
1948
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
C
Chao Yu 已提交
1949
			break;
1950
		}
C
Chao Yu 已提交
1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966

		kaddr = kmap_atomic(page);
		memcpy(kaddr + offset, data, tocopy);
		kunmap_atomic(kaddr);
		flush_dcache_page(page);

		a_ops->write_end(NULL, mapping, off, tocopy, tocopy,
						page, NULL);
		offset = 0;
		towrite -= tocopy;
		off += tocopy;
		data += tocopy;
		cond_resched();
	}

	if (len == towrite)
1967
		return err;
C
Chao Yu 已提交
1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982
	inode->i_mtime = inode->i_ctime = current_time(inode);
	f2fs_mark_inode_dirty_sync(inode, false);
	return len - towrite;
}

static struct dquot **f2fs_get_dquots(struct inode *inode)
{
	return F2FS_I(inode)->i_dquot;
}

static qsize_t *f2fs_get_reserved_space(struct inode *inode)
{
	return &F2FS_I(inode)->i_reserved_quota;
}

C
Chao Yu 已提交
1983 1984
static int f2fs_quota_on_mount(struct f2fs_sb_info *sbi, int type)
{
1985
	if (is_set_ckpt_flags(sbi, CP_QUOTA_NEED_FSCK_FLAG)) {
1986
		f2fs_err(sbi, "quota sysfile may be corrupted, skip loading it");
1987 1988 1989
		return 0;
	}

1990 1991
	return dquot_quota_on_mount(sbi->sb, F2FS_OPTION(sbi).s_qf_names[type],
					F2FS_OPTION(sbi).s_jquota_fmt, type);
C
Chao Yu 已提交
1992 1993
}

J
Jaegeuk Kim 已提交
1994
int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly)
C
Chao Yu 已提交
1995
{
J
Jaegeuk Kim 已提交
1996 1997 1998
	int enabled = 0;
	int i, err;

1999
	if (f2fs_sb_has_quota_ino(sbi) && rdonly) {
J
Jaegeuk Kim 已提交
2000 2001
		err = f2fs_enable_quotas(sbi->sb);
		if (err) {
2002
			f2fs_err(sbi, "Cannot turn on quota_ino: %d", err);
J
Jaegeuk Kim 已提交
2003 2004 2005 2006
			return 0;
		}
		return 1;
	}
C
Chao Yu 已提交
2007 2008

	for (i = 0; i < MAXQUOTAS; i++) {
2009
		if (F2FS_OPTION(sbi).s_qf_names[i]) {
J
Jaegeuk Kim 已提交
2010 2011 2012 2013 2014
			err = f2fs_quota_on_mount(sbi, i);
			if (!err) {
				enabled = 1;
				continue;
			}
2015 2016
			f2fs_err(sbi, "Cannot turn on quotas: %d on %d",
				 err, i);
C
Chao Yu 已提交
2017 2018
		}
	}
J
Jaegeuk Kim 已提交
2019 2020 2021 2022 2023 2024 2025 2026 2027 2028
	return enabled;
}

static int f2fs_quota_enable(struct super_block *sb, int type, int format_id,
			     unsigned int flags)
{
	struct inode *qf_inode;
	unsigned long qf_inum;
	int err;

2029
	BUG_ON(!f2fs_sb_has_quota_ino(F2FS_SB(sb)));
J
Jaegeuk Kim 已提交
2030 2031 2032 2033 2034 2035 2036

	qf_inum = f2fs_qf_ino(sb, type);
	if (!qf_inum)
		return -EPERM;

	qf_inode = f2fs_iget(sb, qf_inum);
	if (IS_ERR(qf_inode)) {
2037
		f2fs_err(F2FS_SB(sb), "Bad quota inode %u:%lu", type, qf_inum);
J
Jaegeuk Kim 已提交
2038 2039 2040 2041 2042
		return PTR_ERR(qf_inode);
	}

	/* Don't account quota for quota files to avoid recursion */
	qf_inode->i_flags |= S_NOQUOTA;
2043
	err = dquot_load_quota_inode(qf_inode, type, format_id, flags);
J
Jaegeuk Kim 已提交
2044 2045 2046 2047 2048 2049
	iput(qf_inode);
	return err;
}

static int f2fs_enable_quotas(struct super_block *sb)
{
2050
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
J
Jaegeuk Kim 已提交
2051 2052 2053
	int type, err = 0;
	unsigned long qf_inum;
	bool quota_mopt[MAXQUOTAS] = {
2054 2055 2056
		test_opt(sbi, USRQUOTA),
		test_opt(sbi, GRPQUOTA),
		test_opt(sbi, PRJQUOTA),
J
Jaegeuk Kim 已提交
2057 2058
	};

2059
	if (is_set_ckpt_flags(F2FS_SB(sb), CP_QUOTA_NEED_FSCK_FLAG)) {
2060
		f2fs_err(sbi, "quota file may be corrupted, skip loading it");
2061 2062 2063 2064 2065
		return 0;
	}

	sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;

J
Jaegeuk Kim 已提交
2066 2067 2068 2069 2070 2071 2072
	for (type = 0; type < MAXQUOTAS; type++) {
		qf_inum = f2fs_qf_ino(sb, type);
		if (qf_inum) {
			err = f2fs_quota_enable(sb, type, QFMT_VFS_V1,
				DQUOT_USAGE_ENABLED |
				(quota_mopt[type] ? DQUOT_LIMITS_ENABLED : 0));
			if (err) {
2073 2074
				f2fs_err(sbi, "Failed to enable quota tracking (type=%d, err=%d). Please run fsck to fix.",
					 type, err);
J
Jaegeuk Kim 已提交
2075 2076
				for (type--; type >= 0; type--)
					dquot_quota_off(sb, type);
2077 2078
				set_sbi_flag(F2FS_SB(sb),
						SBI_QUOTA_NEED_REPAIR);
J
Jaegeuk Kim 已提交
2079 2080
				return err;
			}
C
Chao Yu 已提交
2081 2082
		}
	}
J
Jaegeuk Kim 已提交
2083
	return 0;
C
Chao Yu 已提交
2084 2085
}

2086
int f2fs_quota_sync(struct super_block *sb, int type)
C
Chao Yu 已提交
2087
{
2088
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
C
Chao Yu 已提交
2089 2090 2091 2092
	struct quota_info *dqopt = sb_dqopt(sb);
	int cnt;
	int ret;

2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104
	/*
	 * do_quotactl
	 *  f2fs_quota_sync
	 *  down_read(quota_sem)
	 *  dquot_writeback_dquots()
	 *  f2fs_dquot_commit
	 *                            block_operation
	 *                            down_read(quota_sem)
	 */
	f2fs_lock_op(sbi);

	down_read(&sbi->quota_sem);
C
Chao Yu 已提交
2105 2106
	ret = dquot_writeback_dquots(sb, type);
	if (ret)
2107
		goto out;
C
Chao Yu 已提交
2108 2109 2110 2111 2112 2113

	/*
	 * Now when everything is written we can discard the pagecache so
	 * that userspace sees the changes.
	 */
	for (cnt = 0; cnt < MAXQUOTAS; cnt++) {
2114 2115
		struct address_space *mapping;

C
Chao Yu 已提交
2116 2117 2118 2119 2120
		if (type != -1 && cnt != type)
			continue;
		if (!sb_has_quota_active(sb, cnt))
			continue;

2121 2122 2123
		mapping = dqopt->files[cnt]->i_mapping;

		ret = filemap_fdatawrite(mapping);
C
Chao Yu 已提交
2124
		if (ret)
2125 2126 2127 2128 2129 2130 2131 2132 2133
			goto out;

		/* if we are using journalled quota */
		if (is_journalled_quota(sbi))
			continue;

		ret = filemap_fdatawait(mapping);
		if (ret)
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
C
Chao Yu 已提交
2134 2135 2136 2137 2138

		inode_lock(dqopt->files[cnt]);
		truncate_inode_pages(&dqopt->files[cnt]->i_data, 0);
		inode_unlock(dqopt->files[cnt]);
	}
2139 2140 2141
out:
	if (ret)
		set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
2142 2143
	up_read(&sbi->quota_sem);
	f2fs_unlock_op(sbi);
2144
	return ret;
C
Chao Yu 已提交
2145 2146 2147 2148 2149 2150 2151 2152
}

static int f2fs_quota_on(struct super_block *sb, int type, int format_id,
							const struct path *path)
{
	struct inode *inode;
	int err;

2153 2154 2155 2156 2157 2158
	/* if quota sysfile exists, deny enabling quota with specific file */
	if (f2fs_sb_has_quota_ino(F2FS_SB(sb))) {
		f2fs_err(F2FS_SB(sb), "quota sysfile already exists");
		return -EBUSY;
	}

2159
	err = f2fs_quota_sync(sb, type);
C
Chao Yu 已提交
2160 2161 2162 2163 2164 2165 2166 2167 2168 2169
	if (err)
		return err;

	err = dquot_quota_on(sb, type, format_id, path);
	if (err)
		return err;

	inode = d_inode(path->dentry);

	inode_lock(inode);
2170
	F2FS_I(inode)->i_flags |= F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL;
C
Chao Yu 已提交
2171
	f2fs_set_inode_flags(inode);
C
Chao Yu 已提交
2172 2173 2174 2175 2176 2177
	inode_unlock(inode);
	f2fs_mark_inode_dirty_sync(inode, false);

	return 0;
}

2178
static int __f2fs_quota_off(struct super_block *sb, int type)
C
Chao Yu 已提交
2179 2180 2181 2182 2183 2184 2185
{
	struct inode *inode = sb_dqopt(sb)->files[type];
	int err;

	if (!inode || !igrab(inode))
		return dquot_quota_off(sb, type);

2186 2187 2188
	err = f2fs_quota_sync(sb, type);
	if (err)
		goto out_put;
C
Chao Yu 已提交
2189 2190

	err = dquot_quota_off(sb, type);
2191
	if (err || f2fs_sb_has_quota_ino(F2FS_SB(sb)))
C
Chao Yu 已提交
2192 2193 2194
		goto out_put;

	inode_lock(inode);
2195
	F2FS_I(inode)->i_flags &= ~(F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL);
C
Chao Yu 已提交
2196
	f2fs_set_inode_flags(inode);
C
Chao Yu 已提交
2197 2198 2199 2200 2201 2202 2203
	inode_unlock(inode);
	f2fs_mark_inode_dirty_sync(inode, false);
out_put:
	iput(inode);
	return err;
}

2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220
static int f2fs_quota_off(struct super_block *sb, int type)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
	int err;

	err = __f2fs_quota_off(sb, type);

	/*
	 * quotactl can shutdown journalled quota, result in inconsistence
	 * between quota record and fs data by following updates, tag the
	 * flag to let fsck be aware of it.
	 */
	if (is_journalled_quota(sbi))
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	return err;
}

C
Chao Yu 已提交
2221
void f2fs_quota_off_umount(struct super_block *sb)
C
Chao Yu 已提交
2222 2223
{
	int type;
2224 2225 2226
	int err;

	for (type = 0; type < MAXQUOTAS; type++) {
2227
		err = __f2fs_quota_off(sb, type);
2228 2229
		if (err) {
			int ret = dquot_quota_off(sb, type);
C
Chao Yu 已提交
2230

2231 2232
			f2fs_err(F2FS_SB(sb), "Fail to turn off disk quota (type: %d, err: %d, ret:%d), Please run fsck to fix it.",
				 type, err, ret);
2233
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
2234 2235
		}
	}
2236 2237 2238 2239 2240 2241
	/*
	 * In case of checkpoint=disable, we must flush quota blocks.
	 * This can cause NULL exception for node_inode in end_io, since
	 * put_super already dropped it.
	 */
	sync_filesystem(sb);
C
Chao Yu 已提交
2242 2243
}

2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255
static void f2fs_truncate_quota_inode_pages(struct super_block *sb)
{
	struct quota_info *dqopt = sb_dqopt(sb);
	int type;

	for (type = 0; type < MAXQUOTAS; type++) {
		if (!dqopt->files[type])
			continue;
		f2fs_inode_synced(dqopt->files[type]);
	}
}

2256 2257
static int f2fs_dquot_commit(struct dquot *dquot)
{
2258
	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
2259 2260
	int ret;

2261
	down_read_nested(&sbi->quota_sem, SINGLE_DEPTH_NESTING);
2262 2263
	ret = dquot_commit(dquot);
	if (ret < 0)
2264 2265
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	up_read(&sbi->quota_sem);
2266 2267 2268 2269 2270
	return ret;
}

static int f2fs_dquot_acquire(struct dquot *dquot)
{
2271
	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
2272 2273
	int ret;

2274
	down_read(&sbi->quota_sem);
2275 2276
	ret = dquot_acquire(dquot);
	if (ret < 0)
2277 2278
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	up_read(&sbi->quota_sem);
2279 2280 2281 2282 2283
	return ret;
}

static int f2fs_dquot_release(struct dquot *dquot)
{
2284
	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
2285
	int ret = dquot_release(dquot);
2286 2287

	if (ret < 0)
2288
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
2289 2290 2291 2292 2293 2294 2295
	return ret;
}

static int f2fs_dquot_mark_dquot_dirty(struct dquot *dquot)
{
	struct super_block *sb = dquot->dq_sb;
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
2296
	int ret = dquot_mark_dquot_dirty(dquot);
2297 2298 2299 2300 2301 2302 2303 2304 2305 2306

	/* if we are using journalled quota */
	if (is_journalled_quota(sbi))
		set_sbi_flag(sbi, SBI_QUOTA_NEED_FLUSH);

	return ret;
}

static int f2fs_dquot_commit_info(struct super_block *sb, int type)
{
2307
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
2308
	int ret = dquot_commit_info(sb, type);
2309 2310

	if (ret < 0)
2311
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
2312 2313
	return ret;
}
2314

W
Wei Yongjun 已提交
2315
static int f2fs_get_projid(struct inode *inode, kprojid_t *projid)
C
Chao Yu 已提交
2316 2317 2318 2319 2320
{
	*projid = F2FS_I(inode)->i_projid;
	return 0;
}

C
Chao Yu 已提交
2321 2322
static const struct dquot_operations f2fs_quota_operations = {
	.get_reserved_space = f2fs_get_reserved_space,
2323 2324 2325 2326 2327
	.write_dquot	= f2fs_dquot_commit,
	.acquire_dquot	= f2fs_dquot_acquire,
	.release_dquot	= f2fs_dquot_release,
	.mark_dirty	= f2fs_dquot_mark_dquot_dirty,
	.write_info	= f2fs_dquot_commit_info,
C
Chao Yu 已提交
2328 2329
	.alloc_dquot	= dquot_alloc,
	.destroy_dquot	= dquot_destroy,
C
Chao Yu 已提交
2330
	.get_projid	= f2fs_get_projid,
C
Chao Yu 已提交
2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344
	.get_next_id	= dquot_get_next_id,
};

static const struct quotactl_ops f2fs_quotactl_ops = {
	.quota_on	= f2fs_quota_on,
	.quota_off	= f2fs_quota_off,
	.quota_sync	= f2fs_quota_sync,
	.get_state	= dquot_get_state,
	.set_info	= dquot_set_dqinfo,
	.get_dqblk	= dquot_get_dqblk,
	.set_dqblk	= dquot_set_dqblk,
	.get_nextdqblk	= dquot_get_next_dqblk,
};
#else
2345 2346 2347 2348 2349
int f2fs_quota_sync(struct super_block *sb, int type)
{
	return 0;
}

C
Chao Yu 已提交
2350
void f2fs_quota_off_umount(struct super_block *sb)
C
Chao Yu 已提交
2351 2352 2353 2354
{
}
#endif

A
Arvind Yadav 已提交
2355
static const struct super_operations f2fs_sops = {
J
Jaegeuk Kim 已提交
2356
	.alloc_inode	= f2fs_alloc_inode,
A
Al Viro 已提交
2357
	.free_inode	= f2fs_free_inode,
2358
	.drop_inode	= f2fs_drop_inode,
J
Jaegeuk Kim 已提交
2359
	.write_inode	= f2fs_write_inode,
2360
	.dirty_inode	= f2fs_dirty_inode,
J
Jaegeuk Kim 已提交
2361
	.show_options	= f2fs_show_options,
C
Chao Yu 已提交
2362 2363 2364 2365 2366
#ifdef CONFIG_QUOTA
	.quota_read	= f2fs_quota_read,
	.quota_write	= f2fs_quota_write,
	.get_dquots	= f2fs_get_dquots,
#endif
J
Jaegeuk Kim 已提交
2367 2368 2369
	.evict_inode	= f2fs_evict_inode,
	.put_super	= f2fs_put_super,
	.sync_fs	= f2fs_sync_fs,
2370 2371
	.freeze_fs	= f2fs_freeze,
	.unfreeze_fs	= f2fs_unfreeze,
J
Jaegeuk Kim 已提交
2372
	.statfs		= f2fs_statfs,
2373
	.remount_fs	= f2fs_remount,
J
Jaegeuk Kim 已提交
2374 2375
};

2376
#ifdef CONFIG_FS_ENCRYPTION
2377 2378 2379 2380 2381 2382 2383 2384 2385 2386
static int f2fs_get_context(struct inode *inode, void *ctx, size_t len)
{
	return f2fs_getxattr(inode, F2FS_XATTR_INDEX_ENCRYPTION,
				F2FS_XATTR_NAME_ENCRYPTION_CONTEXT,
				ctx, len, NULL);
}

static int f2fs_set_context(struct inode *inode, const void *ctx, size_t len,
							void *fs_data)
{
2387 2388 2389 2390 2391 2392 2393 2394
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);

	/*
	 * Encrypting the root directory is not allowed because fsck
	 * expects lost+found directory to exist and remain unencrypted
	 * if LOST_FOUND feature is enabled.
	 *
	 */
2395
	if (f2fs_sb_has_lost_found(sbi) &&
2396 2397 2398
			inode->i_ino == F2FS_ROOT_INO(sbi))
		return -EPERM;

2399 2400 2401 2402 2403
	return f2fs_setxattr(inode, F2FS_XATTR_INDEX_ENCRYPTION,
				F2FS_XATTR_NAME_ENCRYPTION_CONTEXT,
				ctx, len, fs_data, XATTR_CREATE);
}

2404 2405 2406 2407 2408
static bool f2fs_dummy_context(struct inode *inode)
{
	return DUMMY_ENCRYPTION_ENABLED(F2FS_I_SB(inode));
}

2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420
static bool f2fs_has_stable_inodes(struct super_block *sb)
{
	return true;
}

static void f2fs_get_ino_and_lblk_bits(struct super_block *sb,
				       int *ino_bits_ret, int *lblk_bits_ret)
{
	*ino_bits_ret = 8 * sizeof(nid_t);
	*lblk_bits_ret = 8 * sizeof(block_t);
}

2421
static const struct fscrypt_operations f2fs_cryptops = {
2422 2423 2424 2425 2426 2427 2428 2429
	.key_prefix		= "f2fs:",
	.get_context		= f2fs_get_context,
	.set_context		= f2fs_set_context,
	.dummy_context		= f2fs_dummy_context,
	.empty_dir		= f2fs_empty_dir,
	.max_namelen		= F2FS_NAME_LEN,
	.has_stable_inodes	= f2fs_has_stable_inodes,
	.get_ino_and_lblk_bits	= f2fs_get_ino_and_lblk_bits,
2430 2431 2432
};
#endif

J
Jaegeuk Kim 已提交
2433 2434 2435 2436 2437 2438
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;

C
Chao Yu 已提交
2439
	if (f2fs_check_nid_range(sbi, ino))
2440
		return ERR_PTR(-ESTALE);
J
Jaegeuk Kim 已提交
2441 2442 2443 2444 2445 2446 2447 2448 2449

	/*
	 * 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);
2450
	if (unlikely(generation && inode->i_generation != generation)) {
J
Jaegeuk Kim 已提交
2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477
		/* 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,
};

C
Chao Yu 已提交
2478
static loff_t max_file_blocks(void)
J
Jaegeuk Kim 已提交
2479
{
2480
	loff_t result = 0;
2481
	loff_t leaf_count = DEF_ADDRS_PER_BLOCK;
J
Jaegeuk Kim 已提交
2482

2483 2484
	/*
	 * note: previously, result is equal to (DEF_ADDRS_PER_INODE -
C
Chao Yu 已提交
2485
	 * DEFAULT_INLINE_XATTR_ADDRS), but now f2fs try to reserve more
2486 2487 2488 2489
	 * space in inode.i_addr, it will be more safe to reassign
	 * result as zero.
	 */

J
Jaegeuk Kim 已提交
2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503
	/* 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;

	return result;
}

2504 2505 2506 2507 2508 2509 2510 2511 2512 2513
static int __f2fs_commit_super(struct buffer_head *bh,
			struct f2fs_super_block *super)
{
	lock_buffer(bh);
	if (super)
		memcpy(bh->b_data + F2FS_SUPER_OFFSET, super, sizeof(*super));
	set_buffer_dirty(bh);
	unlock_buffer(bh);

	/* it's rare case, we can do fua all the time */
2514
	return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
2515 2516
}

2517
static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
2518
					struct buffer_head *bh)
2519
{
2520 2521
	struct f2fs_super_block *raw_super = (struct f2fs_super_block *)
					(bh->b_data + F2FS_SUPER_OFFSET);
2522
	struct super_block *sb = sbi->sb;
2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535
	u32 segment0_blkaddr = le32_to_cpu(raw_super->segment0_blkaddr);
	u32 cp_blkaddr = le32_to_cpu(raw_super->cp_blkaddr);
	u32 sit_blkaddr = le32_to_cpu(raw_super->sit_blkaddr);
	u32 nat_blkaddr = le32_to_cpu(raw_super->nat_blkaddr);
	u32 ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
	u32 main_blkaddr = le32_to_cpu(raw_super->main_blkaddr);
	u32 segment_count_ckpt = le32_to_cpu(raw_super->segment_count_ckpt);
	u32 segment_count_sit = le32_to_cpu(raw_super->segment_count_sit);
	u32 segment_count_nat = le32_to_cpu(raw_super->segment_count_nat);
	u32 segment_count_ssa = le32_to_cpu(raw_super->segment_count_ssa);
	u32 segment_count_main = le32_to_cpu(raw_super->segment_count_main);
	u32 segment_count = le32_to_cpu(raw_super->segment_count);
	u32 log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
2536 2537 2538 2539
	u64 main_end_blkaddr = main_blkaddr +
				(segment_count_main << log_blocks_per_seg);
	u64 seg_end_blkaddr = segment0_blkaddr +
				(segment_count << log_blocks_per_seg);
2540 2541

	if (segment0_blkaddr != cp_blkaddr) {
2542 2543
		f2fs_info(sbi, "Mismatch start address, segment0(%u) cp_blkaddr(%u)",
			  segment0_blkaddr, cp_blkaddr);
2544 2545 2546 2547 2548
		return true;
	}

	if (cp_blkaddr + (segment_count_ckpt << log_blocks_per_seg) !=
							sit_blkaddr) {
2549 2550 2551
		f2fs_info(sbi, "Wrong CP boundary, start(%u) end(%u) blocks(%u)",
			  cp_blkaddr, sit_blkaddr,
			  segment_count_ckpt << log_blocks_per_seg);
2552 2553 2554 2555 2556
		return true;
	}

	if (sit_blkaddr + (segment_count_sit << log_blocks_per_seg) !=
							nat_blkaddr) {
2557 2558 2559
		f2fs_info(sbi, "Wrong SIT boundary, start(%u) end(%u) blocks(%u)",
			  sit_blkaddr, nat_blkaddr,
			  segment_count_sit << log_blocks_per_seg);
2560 2561 2562 2563 2564
		return true;
	}

	if (nat_blkaddr + (segment_count_nat << log_blocks_per_seg) !=
							ssa_blkaddr) {
2565 2566 2567
		f2fs_info(sbi, "Wrong NAT boundary, start(%u) end(%u) blocks(%u)",
			  nat_blkaddr, ssa_blkaddr,
			  segment_count_nat << log_blocks_per_seg);
2568 2569 2570 2571 2572
		return true;
	}

	if (ssa_blkaddr + (segment_count_ssa << log_blocks_per_seg) !=
							main_blkaddr) {
2573 2574 2575
		f2fs_info(sbi, "Wrong SSA boundary, start(%u) end(%u) blocks(%u)",
			  ssa_blkaddr, main_blkaddr,
			  segment_count_ssa << log_blocks_per_seg);
2576 2577 2578
		return true;
	}

2579
	if (main_end_blkaddr > seg_end_blkaddr) {
2580 2581 2582 2583 2584
		f2fs_info(sbi, "Wrong MAIN_AREA boundary, start(%u) end(%u) block(%u)",
			  main_blkaddr,
			  segment0_blkaddr +
			  (segment_count << log_blocks_per_seg),
			  segment_count_main << log_blocks_per_seg);
2585
		return true;
2586 2587 2588 2589 2590 2591 2592 2593 2594
	} else if (main_end_blkaddr < seg_end_blkaddr) {
		int err = 0;
		char *res;

		/* fix in-memory information all the time */
		raw_super->segment_count = cpu_to_le32((main_end_blkaddr -
				segment0_blkaddr) >> log_blocks_per_seg);

		if (f2fs_readonly(sb) || bdev_read_only(sb->s_bdev)) {
2595
			set_sbi_flag(sbi, SBI_NEED_SB_WRITE);
2596 2597 2598 2599 2600
			res = "internally";
		} else {
			err = __f2fs_commit_super(bh, NULL);
			res = err ? "failed" : "done";
		}
2601 2602 2603 2604 2605
		f2fs_info(sbi, "Fix alignment : %s, start(%u) end(%u) block(%u)",
			  res, main_blkaddr,
			  segment0_blkaddr +
			  (segment_count << log_blocks_per_seg),
			  segment_count_main << log_blocks_per_seg);
2606 2607
		if (err)
			return true;
2608 2609 2610 2611
	}
	return false;
}

2612
static int sanity_check_raw_super(struct f2fs_sb_info *sbi,
2613
				struct buffer_head *bh)
J
Jaegeuk Kim 已提交
2614
{
2615 2616
	block_t segment_count, segs_per_sec, secs_per_zone;
	block_t total_sections, blocks_per_seg;
2617 2618
	struct f2fs_super_block *raw_super = (struct f2fs_super_block *)
					(bh->b_data + F2FS_SUPER_OFFSET);
J
Jaegeuk Kim 已提交
2619
	unsigned int blocksize;
2620 2621 2622
	size_t crc_offset = 0;
	__u32 crc = 0;

2623 2624 2625 2626 2627 2628
	if (le32_to_cpu(raw_super->magic) != F2FS_SUPER_MAGIC) {
		f2fs_info(sbi, "Magic Mismatch, valid(0x%x) - read(0x%x)",
			  F2FS_SUPER_MAGIC, le32_to_cpu(raw_super->magic));
		return -EINVAL;
	}

2629
	/* Check checksum_offset and crc in superblock */
2630
	if (__F2FS_HAS_FEATURE(raw_super, F2FS_FEATURE_SB_CHKSUM)) {
2631 2632 2633
		crc_offset = le32_to_cpu(raw_super->checksum_offset);
		if (crc_offset !=
			offsetof(struct f2fs_super_block, crc)) {
2634 2635
			f2fs_info(sbi, "Invalid SB checksum offset: %zu",
				  crc_offset);
2636
			return -EFSCORRUPTED;
2637 2638 2639
		}
		crc = le32_to_cpu(raw_super->crc);
		if (!f2fs_crc_valid(sbi, crc, raw_super, crc_offset)) {
2640
			f2fs_info(sbi, "Invalid SB checksum value: %u", crc);
2641
			return -EFSCORRUPTED;
2642 2643
		}
	}
J
Jaegeuk Kim 已提交
2644

2645
	/* Currently, support only 4KB page cache size */
2646
	if (F2FS_BLKSIZE != PAGE_SIZE) {
2647 2648
		f2fs_info(sbi, "Invalid page_cache_size (%lu), supports only 4KB",
			  PAGE_SIZE);
2649
		return -EFSCORRUPTED;
2650 2651
	}

J
Jaegeuk Kim 已提交
2652 2653
	/* Currently, support only 4KB block size */
	blocksize = 1 << le32_to_cpu(raw_super->log_blocksize);
2654
	if (blocksize != F2FS_BLKSIZE) {
2655 2656
		f2fs_info(sbi, "Invalid blocksize (%u), supports only 4KB",
			  blocksize);
2657
		return -EFSCORRUPTED;
2658
	}
2659

2660 2661
	/* check log blocks per segment */
	if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) {
2662 2663
		f2fs_info(sbi, "Invalid log blocks per segment (%u)",
			  le32_to_cpu(raw_super->log_blocks_per_seg));
2664
		return -EFSCORRUPTED;
2665 2666
	}

C
Chao Yu 已提交
2667 2668 2669 2670 2671
	/* 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) {
2672 2673
		f2fs_info(sbi, "Invalid log sectorsize (%u)",
			  le32_to_cpu(raw_super->log_sectorsize));
2674
		return -EFSCORRUPTED;
2675
	}
C
Chao Yu 已提交
2676 2677 2678
	if (le32_to_cpu(raw_super->log_sectors_per_block) +
		le32_to_cpu(raw_super->log_sectorsize) !=
			F2FS_MAX_LOG_SECTOR_SIZE) {
2679 2680 2681
		f2fs_info(sbi, "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));
2682
		return -EFSCORRUPTED;
2683
	}
2684

2685 2686 2687 2688 2689 2690 2691 2692 2693 2694
	segment_count = le32_to_cpu(raw_super->segment_count);
	segs_per_sec = le32_to_cpu(raw_super->segs_per_sec);
	secs_per_zone = le32_to_cpu(raw_super->secs_per_zone);
	total_sections = le32_to_cpu(raw_super->section_count);

	/* blocks_per_seg should be 512, given the above check */
	blocks_per_seg = 1 << le32_to_cpu(raw_super->log_blocks_per_seg);

	if (segment_count > F2FS_MAX_SEGMENT ||
				segment_count < F2FS_MIN_SEGMENTS) {
2695
		f2fs_info(sbi, "Invalid segment count (%u)", segment_count);
2696
		return -EFSCORRUPTED;
2697 2698 2699 2700 2701
	}

	if (total_sections > segment_count ||
			total_sections < F2FS_MIN_SEGMENTS ||
			segs_per_sec > segment_count || !segs_per_sec) {
2702 2703
		f2fs_info(sbi, "Invalid segment/section count (%u, %u x %u)",
			  segment_count, total_sections, segs_per_sec);
2704
		return -EFSCORRUPTED;
2705 2706 2707
	}

	if ((segment_count / segs_per_sec) < total_sections) {
2708 2709
		f2fs_info(sbi, "Small segment_count (%u < %u * %u)",
			  segment_count, segs_per_sec, total_sections);
2710
		return -EFSCORRUPTED;
2711 2712
	}

2713
	if (segment_count > (le64_to_cpu(raw_super->block_count) >> 9)) {
2714 2715
		f2fs_info(sbi, "Wrong segment_count / block_count (%u > %llu)",
			  segment_count, le64_to_cpu(raw_super->block_count));
2716
		return -EFSCORRUPTED;
2717 2718
	}

2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733
	if (RDEV(0).path[0]) {
		block_t dev_seg_count = le32_to_cpu(RDEV(0).total_segments);
		int i = 1;

		while (i < MAX_DEVICES && RDEV(i).path[0]) {
			dev_seg_count += le32_to_cpu(RDEV(i).total_segments);
			i++;
		}
		if (segment_count != dev_seg_count) {
			f2fs_info(sbi, "Segment count (%u) mismatch with total segments from devices (%u)",
					segment_count, dev_seg_count);
			return -EFSCORRUPTED;
		}
	}

2734
	if (secs_per_zone > total_sections || !secs_per_zone) {
2735 2736
		f2fs_info(sbi, "Wrong secs_per_zone / total_sections (%u, %u)",
			  secs_per_zone, total_sections);
2737
		return -EFSCORRUPTED;
2738 2739 2740 2741 2742
	}
	if (le32_to_cpu(raw_super->extension_count) > F2FS_MAX_EXTENSION ||
			raw_super->hot_ext_count > F2FS_MAX_EXTENSION ||
			(le32_to_cpu(raw_super->extension_count) +
			raw_super->hot_ext_count) > F2FS_MAX_EXTENSION) {
2743 2744 2745 2746
		f2fs_info(sbi, "Corrupted extension count (%u + %u > %u)",
			  le32_to_cpu(raw_super->extension_count),
			  raw_super->hot_ext_count,
			  F2FS_MAX_EXTENSION);
2747
		return -EFSCORRUPTED;
2748 2749 2750 2751
	}

	if (le32_to_cpu(raw_super->cp_payload) >
				(blocks_per_seg - F2FS_CP_PACKS)) {
2752 2753 2754
		f2fs_info(sbi, "Insane cp_payload (%u > %u)",
			  le32_to_cpu(raw_super->cp_payload),
			  blocks_per_seg - F2FS_CP_PACKS);
2755
		return -EFSCORRUPTED;
2756 2757
	}

2758 2759 2760 2761
	/* check reserved ino info */
	if (le32_to_cpu(raw_super->node_ino) != 1 ||
		le32_to_cpu(raw_super->meta_ino) != 2 ||
		le32_to_cpu(raw_super->root_ino) != 3) {
2762 2763 2764 2765
		f2fs_info(sbi, "Invalid Fs Meta Ino: node(%u) meta(%u) root(%u)",
			  le32_to_cpu(raw_super->node_ino),
			  le32_to_cpu(raw_super->meta_ino),
			  le32_to_cpu(raw_super->root_ino));
2766
		return -EFSCORRUPTED;
2767 2768 2769
	}

	/* check CP/SIT/NAT/SSA/MAIN_AREA area boundary */
2770
	if (sanity_check_area_boundary(sbi, bh))
2771
		return -EFSCORRUPTED;
2772

J
Jaegeuk Kim 已提交
2773 2774 2775
	return 0;
}

C
Chao Yu 已提交
2776
int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi)
J
Jaegeuk Kim 已提交
2777 2778
{
	unsigned int total, fsmeta;
2779 2780
	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
J
Jaegeuk Kim 已提交
2781
	unsigned int ovp_segments, reserved_segments;
2782
	unsigned int main_segs, blocks_per_seg;
2783 2784 2785
	unsigned int sit_segs, nat_segs;
	unsigned int sit_bitmap_size, nat_bitmap_size;
	unsigned int log_blocks_per_seg;
2786
	unsigned int segment_count_main;
2787
	unsigned int cp_pack_start_sum, cp_payload;
2788 2789
	block_t user_block_count, valid_user_blocks;
	block_t avail_node_count, valid_node_count;
2790
	int i, j;
J
Jaegeuk Kim 已提交
2791 2792 2793

	total = le32_to_cpu(raw_super->segment_count);
	fsmeta = le32_to_cpu(raw_super->segment_count_ckpt);
2794 2795 2796 2797
	sit_segs = le32_to_cpu(raw_super->segment_count_sit);
	fsmeta += sit_segs;
	nat_segs = le32_to_cpu(raw_super->segment_count_nat);
	fsmeta += nat_segs;
J
Jaegeuk Kim 已提交
2798 2799 2800
	fsmeta += le32_to_cpu(ckpt->rsvd_segment_count);
	fsmeta += le32_to_cpu(raw_super->segment_count_ssa);

2801
	if (unlikely(fsmeta >= total))
J
Jaegeuk Kim 已提交
2802
		return 1;
2803

J
Jaegeuk Kim 已提交
2804 2805 2806 2807 2808
	ovp_segments = le32_to_cpu(ckpt->overprov_segment_count);
	reserved_segments = le32_to_cpu(ckpt->rsvd_segment_count);

	if (unlikely(fsmeta < F2FS_MIN_SEGMENTS ||
			ovp_segments == 0 || reserved_segments == 0)) {
2809
		f2fs_err(sbi, "Wrong layout: check mkfs.f2fs version");
J
Jaegeuk Kim 已提交
2810 2811 2812
		return 1;
	}

2813 2814 2815 2816 2817
	user_block_count = le64_to_cpu(ckpt->user_block_count);
	segment_count_main = le32_to_cpu(raw_super->segment_count_main);
	log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
	if (!user_block_count || user_block_count >=
			segment_count_main << log_blocks_per_seg) {
2818 2819
		f2fs_err(sbi, "Wrong user_block_count: %u",
			 user_block_count);
2820 2821 2822
		return 1;
	}

2823 2824
	valid_user_blocks = le64_to_cpu(ckpt->valid_block_count);
	if (valid_user_blocks > user_block_count) {
2825 2826
		f2fs_err(sbi, "Wrong valid_user_blocks: %u, user_block_count: %u",
			 valid_user_blocks, user_block_count);
2827 2828 2829 2830
		return 1;
	}

	valid_node_count = le32_to_cpu(ckpt->valid_node_count);
2831
	avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM;
2832
	if (valid_node_count > avail_node_count) {
2833 2834
		f2fs_err(sbi, "Wrong valid_node_count: %u, avail_node_count: %u",
			 valid_node_count, avail_node_count);
2835 2836 2837
		return 1;
	}

2838 2839 2840 2841 2842 2843 2844
	main_segs = le32_to_cpu(raw_super->segment_count_main);
	blocks_per_seg = sbi->blocks_per_seg;

	for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
		if (le32_to_cpu(ckpt->cur_node_segno[i]) >= main_segs ||
			le16_to_cpu(ckpt->cur_node_blkoff[i]) >= blocks_per_seg)
			return 1;
2845 2846 2847
		for (j = i + 1; j < NR_CURSEG_NODE_TYPE; j++) {
			if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
				le32_to_cpu(ckpt->cur_node_segno[j])) {
2848 2849 2850
				f2fs_err(sbi, "Node segment (%u, %u) has the same segno: %u",
					 i, j,
					 le32_to_cpu(ckpt->cur_node_segno[i]));
2851 2852 2853
				return 1;
			}
		}
2854 2855 2856 2857 2858
	}
	for (i = 0; i < NR_CURSEG_DATA_TYPE; i++) {
		if (le32_to_cpu(ckpt->cur_data_segno[i]) >= main_segs ||
			le16_to_cpu(ckpt->cur_data_blkoff[i]) >= blocks_per_seg)
			return 1;
2859 2860 2861
		for (j = i + 1; j < NR_CURSEG_DATA_TYPE; j++) {
			if (le32_to_cpu(ckpt->cur_data_segno[i]) ==
				le32_to_cpu(ckpt->cur_data_segno[j])) {
2862 2863 2864
				f2fs_err(sbi, "Data segment (%u, %u) has the same segno: %u",
					 i, j,
					 le32_to_cpu(ckpt->cur_data_segno[i]));
2865 2866 2867 2868 2869
				return 1;
			}
		}
	}
	for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
2870
		for (j = 0; j < NR_CURSEG_DATA_TYPE; j++) {
2871 2872
			if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
				le32_to_cpu(ckpt->cur_data_segno[j])) {
2873
				f2fs_err(sbi, "Node segment (%u) and Data segment (%u) has the same segno: %u",
2874 2875
					 i, j,
					 le32_to_cpu(ckpt->cur_node_segno[i]));
2876 2877 2878
				return 1;
			}
		}
2879 2880
	}

2881 2882 2883 2884 2885
	sit_bitmap_size = le32_to_cpu(ckpt->sit_ver_bitmap_bytesize);
	nat_bitmap_size = le32_to_cpu(ckpt->nat_ver_bitmap_bytesize);

	if (sit_bitmap_size != ((sit_segs / 2) << log_blocks_per_seg) / 8 ||
		nat_bitmap_size != ((nat_segs / 2) << log_blocks_per_seg) / 8) {
2886 2887
		f2fs_err(sbi, "Wrong bitmap size: sit: %u, nat:%u",
			 sit_bitmap_size, nat_bitmap_size);
2888 2889
		return 1;
	}
2890 2891 2892 2893 2894 2895

	cp_pack_start_sum = __start_sum_addr(sbi);
	cp_payload = __cp_payload(sbi);
	if (cp_pack_start_sum < cp_payload + 1 ||
		cp_pack_start_sum > blocks_per_seg - 1 -
			NR_CURSEG_TYPE) {
2896 2897
		f2fs_err(sbi, "Wrong cp_pack_start_sum: %u",
			 cp_pack_start_sum);
2898 2899
		return 1;
	}
2900

2901 2902
	if (__is_set_ckpt_flags(ckpt, CP_LARGE_NAT_BITMAP_FLAG) &&
		le32_to_cpu(ckpt->checksum_offset) != CP_MIN_CHKSUM_OFFSET) {
2903 2904 2905
		f2fs_warn(sbi, "using deprecated layout of large_nat_bitmap, "
			  "please run fsck v1.13.0 or higher to repair, chksum_offset: %u, "
			  "fixed with patch: \"f2fs-tools: relocate chksum_offset for large_nat_bitmap feature\"",
2906
			  le32_to_cpu(ckpt->checksum_offset));
2907 2908 2909
		return 1;
	}

2910
	if (unlikely(f2fs_cp_error(sbi))) {
2911
		f2fs_err(sbi, "A bug case: need to run fsck");
2912 2913
		return 1;
	}
J
Jaegeuk Kim 已提交
2914 2915 2916 2917 2918 2919
	return 0;
}

static void init_sb_info(struct f2fs_sb_info *sbi)
{
	struct f2fs_super_block *raw_super = sbi->raw_super;
2920
	int i;
J
Jaegeuk Kim 已提交
2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936

	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);
2937
	sbi->cur_victim_sec = NULL_SECNO;
2938 2939
	sbi->next_victim_seg[BG_GC] = NULL_SEGNO;
	sbi->next_victim_seg[FG_GC] = NULL_SEGNO;
2940
	sbi->max_victim_search = DEF_MAX_VICTIM_SEARCH;
2941
	sbi->migration_granularity = sbi->segs_per_sec;
J
Jaegeuk Kim 已提交
2942

2943
	sbi->dir_level = DEF_DIR_LEVEL;
2944
	sbi->interval_time[CP_TIME] = DEF_CP_INTERVAL;
2945
	sbi->interval_time[REQ_TIME] = DEF_IDLE_INTERVAL;
2946 2947
	sbi->interval_time[DISCARD_TIME] = DEF_IDLE_INTERVAL;
	sbi->interval_time[GC_TIME] = DEF_IDLE_INTERVAL;
D
Daniel Rosenberg 已提交
2948
	sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_INTERVAL;
2949 2950
	sbi->interval_time[UMOUNT_DISCARD_TIMEOUT] =
				DEF_UMOUNT_DISCARD_TIMEOUT;
2951
	clear_sbi_flag(sbi, SBI_NEED_FSCK);
2952

2953 2954 2955
	for (i = 0; i < NR_COUNT_TYPE; i++)
		atomic_set(&sbi->nr_pages[i], 0);

2956 2957
	for (i = 0; i < META; i++)
		atomic_set(&sbi->wb_sync_req[i], 0);
2958

2959 2960
	INIT_LIST_HEAD(&sbi->s_list);
	mutex_init(&sbi->umount_mutex);
2961
	init_rwsem(&sbi->io_order_lock);
2962
	spin_lock_init(&sbi->cp_lock);
2963 2964 2965

	sbi->dirty_device = 0;
	spin_lock_init(&sbi->dev_lock);
2966

2967
	init_rwsem(&sbi->sb_lock);
J
Jaegeuk Kim 已提交
2968
	init_rwsem(&sbi->pin_sem);
J
Jaegeuk Kim 已提交
2969 2970
}

2971 2972
static int init_percpu_info(struct f2fs_sb_info *sbi)
{
2973
	int err;
2974

2975 2976 2977 2978
	err = percpu_counter_init(&sbi->alloc_valid_block_count, 0, GFP_KERNEL);
	if (err)
		return err;

2979
	err = percpu_counter_init(&sbi->total_valid_inode_count, 0,
2980
								GFP_KERNEL);
2981 2982 2983 2984
	if (err)
		percpu_counter_destroy(&sbi->alloc_valid_block_count);

	return err;
2985 2986
}

2987
#ifdef CONFIG_BLK_DEV_ZONED
C
Christoph Hellwig 已提交
2988 2989 2990 2991 2992 2993 2994 2995 2996 2997
static int f2fs_report_zone_cb(struct blk_zone *zone, unsigned int idx,
			       void *data)
{
	struct f2fs_dev_info *dev = data;

	if (zone->type != BLK_ZONE_TYPE_CONVENTIONAL)
		set_bit(idx, dev->blkz_seq);
	return 0;
}

J
Jaegeuk Kim 已提交
2998
static int init_blkz_info(struct f2fs_sb_info *sbi, int devi)
2999
{
J
Jaegeuk Kim 已提交
3000
	struct block_device *bdev = FDEV(devi).bdev;
3001
	sector_t nr_sectors = bdev->bd_part->nr_sects;
C
Christoph Hellwig 已提交
3002
	int ret;
3003

3004
	if (!f2fs_sb_has_blkzoned(sbi))
3005 3006
		return 0;

J
Jaegeuk Kim 已提交
3007
	if (sbi->blocks_per_blkz && sbi->blocks_per_blkz !=
3008
				SECTOR_TO_BLOCK(bdev_zone_sectors(bdev)))
J
Jaegeuk Kim 已提交
3009
		return -EINVAL;
3010
	sbi->blocks_per_blkz = SECTOR_TO_BLOCK(bdev_zone_sectors(bdev));
J
Jaegeuk Kim 已提交
3011 3012 3013
	if (sbi->log_blocks_per_blkz && sbi->log_blocks_per_blkz !=
				__ilog2_u32(sbi->blocks_per_blkz))
		return -EINVAL;
3014
	sbi->log_blocks_per_blkz = __ilog2_u32(sbi->blocks_per_blkz);
J
Jaegeuk Kim 已提交
3015 3016
	FDEV(devi).nr_blkz = SECTOR_TO_BLOCK(nr_sectors) >>
					sbi->log_blocks_per_blkz;
3017
	if (nr_sectors & (bdev_zone_sectors(bdev) - 1))
J
Jaegeuk Kim 已提交
3018
		FDEV(devi).nr_blkz++;
3019

3020 3021 3022 3023 3024
	FDEV(devi).blkz_seq = f2fs_kzalloc(sbi,
					BITS_TO_LONGS(FDEV(devi).nr_blkz)
					* sizeof(unsigned long),
					GFP_KERNEL);
	if (!FDEV(devi).blkz_seq)
3025 3026 3027
		return -ENOMEM;

	/* Get block zones type */
C
Christoph Hellwig 已提交
3028 3029 3030 3031
	ret = blkdev_report_zones(bdev, 0, BLK_ALL_ZONES, f2fs_report_zone_cb,
				  &FDEV(devi));
	if (ret < 0)
		return ret;
3032

C
Christoph Hellwig 已提交
3033
	return 0;
3034 3035 3036
}
#endif

3037 3038
/*
 * Read f2fs raw super block.
3039 3040 3041
 * Because we have two copies of super block, so read both of them
 * to get the first valid one. If any one of them is broken, we pass
 * them recovery flag back to the caller.
3042
 */
3043
static int read_raw_super_block(struct f2fs_sb_info *sbi,
3044
			struct f2fs_super_block **raw_super,
3045
			int *valid_super_block, int *recovery)
3046
{
3047
	struct super_block *sb = sbi->sb;
3048
	int block;
3049
	struct buffer_head *bh;
3050
	struct f2fs_super_block *super;
3051
	int err = 0;
3052

Y
Yunlei He 已提交
3053 3054 3055
	super = kzalloc(sizeof(struct f2fs_super_block), GFP_KERNEL);
	if (!super)
		return -ENOMEM;
3056 3057 3058 3059

	for (block = 0; block < 2; block++) {
		bh = sb_bread(sb, block);
		if (!bh) {
3060 3061
			f2fs_err(sbi, "Unable to read %dth superblock",
				 block + 1);
3062
			err = -EIO;
3063
			*recovery = 1;
3064 3065
			continue;
		}
3066

3067
		/* sanity checking of raw super */
3068 3069
		err = sanity_check_raw_super(sbi, bh);
		if (err) {
3070 3071
			f2fs_err(sbi, "Can't find valid F2FS filesystem in %dth superblock",
				 block + 1);
3072
			brelse(bh);
3073
			*recovery = 1;
3074 3075
			continue;
		}
3076

3077
		if (!*raw_super) {
3078 3079
			memcpy(super, bh->b_data + F2FS_SUPER_OFFSET,
							sizeof(*super));
3080 3081 3082 3083
			*valid_super_block = block;
			*raw_super = super;
		}
		brelse(bh);
3084 3085 3086
	}

	/* No valid superblock */
3087
	if (!*raw_super)
3088
		kvfree(super);
3089 3090
	else
		err = 0;
3091

3092
	return err;
3093 3094
}

3095
int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
J
Jaegeuk Kim 已提交
3096
{
J
Jaegeuk Kim 已提交
3097
	struct buffer_head *bh;
3098
	__u32 crc = 0;
J
Jaegeuk Kim 已提交
3099 3100
	int err;

3101 3102 3103
	if ((recover && f2fs_readonly(sbi->sb)) ||
				bdev_read_only(sbi->sb->s_bdev)) {
		set_sbi_flag(sbi, SBI_NEED_SB_WRITE);
3104
		return -EROFS;
3105
	}
3106

3107
	/* we should update superblock crc here */
3108
	if (!recover && f2fs_sb_has_sb_chksum(sbi)) {
3109 3110 3111 3112 3113
		crc = f2fs_crc32(sbi, F2FS_RAW_SUPER(sbi),
				offsetof(struct f2fs_super_block, crc));
		F2FS_RAW_SUPER(sbi)->crc = cpu_to_le32(crc);
	}

3114
	/* write back-up superblock first */
3115
	bh = sb_bread(sbi->sb, sbi->valid_super_block ? 0 : 1);
J
Jaegeuk Kim 已提交
3116 3117
	if (!bh)
		return -EIO;
3118
	err = __f2fs_commit_super(bh, F2FS_RAW_SUPER(sbi));
J
Jaegeuk Kim 已提交
3119
	brelse(bh);
C
Chao Yu 已提交
3120 3121 3122

	/* if we are in recovery path, skip writing valid superblock */
	if (recover || err)
J
Jaegeuk Kim 已提交
3123
		return err;
J
Jaegeuk Kim 已提交
3124 3125

	/* write current valid superblock */
3126
	bh = sb_bread(sbi->sb, sbi->valid_super_block);
3127 3128 3129 3130 3131
	if (!bh)
		return -EIO;
	err = __f2fs_commit_super(bh, F2FS_RAW_SUPER(sbi));
	brelse(bh);
	return err;
J
Jaegeuk Kim 已提交
3132 3133
}

J
Jaegeuk Kim 已提交
3134 3135 3136
static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
{
	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
3137
	unsigned int max_devices = MAX_DEVICES;
J
Jaegeuk Kim 已提交
3138 3139
	int i;

3140 3141 3142
	/* Initialize single device information */
	if (!RDEV(0).path[0]) {
		if (!bdev_is_zoned(sbi->sb->s_bdev))
J
Jaegeuk Kim 已提交
3143
			return 0;
3144 3145
		max_devices = 1;
	}
J
Jaegeuk Kim 已提交
3146

3147 3148 3149 3150
	/*
	 * Initialize multiple devices information, or single
	 * zoned block device information.
	 */
3151 3152 3153 3154
	sbi->devs = f2fs_kzalloc(sbi,
				 array_size(max_devices,
					    sizeof(struct f2fs_dev_info)),
				 GFP_KERNEL);
3155 3156
	if (!sbi->devs)
		return -ENOMEM;
J
Jaegeuk Kim 已提交
3157

3158
	for (i = 0; i < max_devices; i++) {
J
Jaegeuk Kim 已提交
3159

3160 3161 3162 3163 3164 3165 3166
		if (i > 0 && !RDEV(i).path[0])
			break;

		if (max_devices == 1) {
			/* Single zoned block device mount */
			FDEV(0).bdev =
				blkdev_get_by_dev(sbi->sb->s_bdev->bd_dev,
J
Jaegeuk Kim 已提交
3167
					sbi->sb->s_mode, sbi->sb->s_type);
3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185
		} else {
			/* Multi-device mount */
			memcpy(FDEV(i).path, RDEV(i).path, MAX_PATH_LEN);
			FDEV(i).total_segments =
				le32_to_cpu(RDEV(i).total_segments);
			if (i == 0) {
				FDEV(i).start_blk = 0;
				FDEV(i).end_blk = FDEV(i).start_blk +
				    (FDEV(i).total_segments <<
				    sbi->log_blocks_per_seg) - 1 +
				    le32_to_cpu(raw_super->segment0_blkaddr);
			} else {
				FDEV(i).start_blk = FDEV(i - 1).end_blk + 1;
				FDEV(i).end_blk = FDEV(i).start_blk +
					(FDEV(i).total_segments <<
					sbi->log_blocks_per_seg) - 1;
			}
			FDEV(i).bdev = blkdev_get_by_path(FDEV(i).path,
J
Jaegeuk Kim 已提交
3186
					sbi->sb->s_mode, sbi->sb->s_type);
3187
		}
J
Jaegeuk Kim 已提交
3188 3189 3190 3191 3192 3193 3194 3195
		if (IS_ERR(FDEV(i).bdev))
			return PTR_ERR(FDEV(i).bdev);

		/* to release errored devices */
		sbi->s_ndevs = i + 1;

#ifdef CONFIG_BLK_DEV_ZONED
		if (bdev_zoned_model(FDEV(i).bdev) == BLK_ZONED_HM &&
3196
				!f2fs_sb_has_blkzoned(sbi)) {
3197
			f2fs_err(sbi, "Zoned block device feature not enabled\n");
J
Jaegeuk Kim 已提交
3198 3199 3200 3201
			return -EINVAL;
		}
		if (bdev_zoned_model(FDEV(i).bdev) != BLK_ZONED_NONE) {
			if (init_blkz_info(sbi, i)) {
3202
				f2fs_err(sbi, "Failed to initialize F2FS blkzone information");
J
Jaegeuk Kim 已提交
3203 3204
				return -EINVAL;
			}
3205 3206
			if (max_devices == 1)
				break;
3207 3208 3209 3210 3211 3212
			f2fs_info(sbi, "Mount Device [%2d]: %20s, %8u, %8x - %8x (zone: %s)",
				  i, FDEV(i).path,
				  FDEV(i).total_segments,
				  FDEV(i).start_blk, FDEV(i).end_blk,
				  bdev_zoned_model(FDEV(i).bdev) == BLK_ZONED_HA ?
				  "Host-aware" : "Host-managed");
J
Jaegeuk Kim 已提交
3213 3214 3215
			continue;
		}
#endif
3216 3217 3218 3219 3220 3221 3222
		f2fs_info(sbi, "Mount Device [%2d]: %20s, %8u, %8x - %8x",
			  i, FDEV(i).path,
			  FDEV(i).total_segments,
			  FDEV(i).start_blk, FDEV(i).end_blk);
	}
	f2fs_info(sbi,
		  "IO Block Size: %8d KB", F2FS_IO_SIZE_KB(sbi));
J
Jaegeuk Kim 已提交
3223 3224 3225
	return 0;
}

3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261
static int f2fs_setup_casefold(struct f2fs_sb_info *sbi)
{
#ifdef CONFIG_UNICODE
	if (f2fs_sb_has_casefold(sbi) && !sbi->s_encoding) {
		const struct f2fs_sb_encodings *encoding_info;
		struct unicode_map *encoding;
		__u16 encoding_flags;

		if (f2fs_sb_has_encrypt(sbi)) {
			f2fs_err(sbi,
				"Can't mount with encoding and encryption");
			return -EINVAL;
		}

		if (f2fs_sb_read_encoding(sbi->raw_super, &encoding_info,
					  &encoding_flags)) {
			f2fs_err(sbi,
				 "Encoding requested by superblock is unknown");
			return -EINVAL;
		}

		encoding = utf8_load(encoding_info->version);
		if (IS_ERR(encoding)) {
			f2fs_err(sbi,
				 "can't mount with superblock charset: %s-%s "
				 "not supported by the kernel. flags: 0x%x.",
				 encoding_info->name, encoding_info->version,
				 encoding_flags);
			return PTR_ERR(encoding);
		}
		f2fs_info(sbi, "Using encoding defined by superblock: "
			 "%s-%s with flags 0x%hx", encoding_info->name,
			 encoding_info->version?:"\b", encoding_flags);

		sbi->s_encoding = encoding;
		sbi->s_encoding_flags = encoding_flags;
3262
		sbi->sb->s_d_op = &f2fs_dentry_ops;
3263 3264 3265 3266 3267 3268 3269 3270 3271 3272
	}
#else
	if (f2fs_sb_has_casefold(sbi)) {
		f2fs_err(sbi, "Filesystem with casefold feature cannot be mounted without CONFIG_UNICODE");
		return -EINVAL;
	}
#endif
	return 0;
}

3273 3274 3275 3276 3277 3278
static void f2fs_tuning_parameters(struct f2fs_sb_info *sbi)
{
	struct f2fs_sm_info *sm_i = SM_I(sbi);

	/* adjust parameters according to the volume size */
	if (sm_i->main_segments <= SMALL_VOLUME_SEGMENTS) {
3279
		F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_REUSE;
3280 3281 3282
		sm_i->dcc_info->discard_granularity = 1;
		sm_i->ipu_policy = 1 << F2FS_IPU_FORCE;
	}
3283 3284

	sbi->readdir_ra = 1;
3285 3286
}

J
Jaegeuk Kim 已提交
3287 3288 3289
static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
{
	struct f2fs_sb_info *sbi;
3290
	struct f2fs_super_block *raw_super;
J
Jaegeuk Kim 已提交
3291
	struct inode *root;
3292
	int err;
3293
	bool skip_recovery = false, need_fsck = false;
3294
	char *options = NULL;
3295
	int recovery, i, valid_super_block;
3296
	struct curseg_info *seg_i;
3297
	int retry_cnt = 1;
J
Jaegeuk Kim 已提交
3298

3299
try_onemore:
3300 3301
	err = -EINVAL;
	raw_super = NULL;
3302
	valid_super_block = -1;
3303 3304
	recovery = 0;

J
Jaegeuk Kim 已提交
3305 3306 3307 3308 3309
	/* allocate memory for f2fs-specific super block info */
	sbi = kzalloc(sizeof(struct f2fs_sb_info), GFP_KERNEL);
	if (!sbi)
		return -ENOMEM;

3310 3311
	sbi->sb = sb;

K
Keith Mok 已提交
3312 3313 3314
	/* Load the checksum driver */
	sbi->s_chksum_driver = crypto_alloc_shash("crc32", 0, 0);
	if (IS_ERR(sbi->s_chksum_driver)) {
3315
		f2fs_err(sbi, "Cannot load crc32 driver.");
K
Keith Mok 已提交
3316 3317 3318 3319 3320
		err = PTR_ERR(sbi->s_chksum_driver);
		sbi->s_chksum_driver = NULL;
		goto free_sbi;
	}

3321
	/* set a block size */
3322
	if (unlikely(!sb_set_blocksize(sb, F2FS_BLKSIZE))) {
3323
		f2fs_err(sbi, "unable to set blocksize");
J
Jaegeuk Kim 已提交
3324
		goto free_sbi;
3325
	}
J
Jaegeuk Kim 已提交
3326

3327
	err = read_raw_super_block(sbi, &raw_super, &valid_super_block,
3328
								&recovery);
3329 3330 3331
	if (err)
		goto free_sbi;

3332
	sb->s_fs_info = sbi;
3333 3334
	sbi->raw_super = raw_super;

C
Chao Yu 已提交
3335
	/* precompute checksum seed for metadata */
3336
	if (f2fs_sb_has_inode_chksum(sbi))
C
Chao Yu 已提交
3337 3338 3339
		sbi->s_chksum_seed = f2fs_chksum(sbi, ~0, raw_super->uuid,
						sizeof(raw_super->uuid));

3340 3341 3342 3343 3344 3345
	/*
	 * The BLKZONED feature indicates that the drive was formatted with
	 * zone alignment optimization. This is optional for host-aware
	 * devices, but mandatory for host-managed zoned block devices.
	 */
#ifndef CONFIG_BLK_DEV_ZONED
3346
	if (f2fs_sb_has_blkzoned(sbi)) {
3347
		f2fs_err(sbi, "Zoned block device support is not enabled");
3348
		err = -EOPNOTSUPP;
3349 3350 3351
		goto free_sb_buf;
	}
#endif
3352
	default_options(sbi);
J
Jaegeuk Kim 已提交
3353
	/* parse mount options */
3354 3355 3356
	options = kstrdup((const char *)data, GFP_KERNEL);
	if (data && !options) {
		err = -ENOMEM;
J
Jaegeuk Kim 已提交
3357
		goto free_sb_buf;
3358 3359 3360 3361 3362
	}

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

C
Chao Yu 已提交
3364 3365 3366
	sbi->max_file_blocks = max_file_blocks();
	sb->s_maxbytes = sbi->max_file_blocks <<
				le32_to_cpu(raw_super->log_blocksize);
J
Jaegeuk Kim 已提交
3367 3368
	sb->s_max_links = F2FS_LINK_MAX;

3369 3370 3371 3372
	err = f2fs_setup_casefold(sbi);
	if (err)
		goto free_options;

C
Chao Yu 已提交
3373 3374
#ifdef CONFIG_QUOTA
	sb->dq_op = &f2fs_quota_operations;
3375
	sb->s_qcop = &f2fs_quotactl_ops;
C
Chao Yu 已提交
3376
	sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
3377

3378
	if (f2fs_sb_has_quota_ino(sbi)) {
3379 3380 3381 3382 3383
		for (i = 0; i < MAXQUOTAS; i++) {
			if (f2fs_qf_ino(sbi->sb, i))
				sbi->nquota_files++;
		}
	}
C
Chao Yu 已提交
3384 3385
#endif

J
Jaegeuk Kim 已提交
3386
	sb->s_op = &f2fs_sops;
3387
#ifdef CONFIG_FS_ENCRYPTION
3388
	sb->s_cop = &f2fs_cryptops;
E
Eric Biggers 已提交
3389 3390 3391
#endif
#ifdef CONFIG_FS_VERITY
	sb->s_vop = &f2fs_verityops;
3392
#endif
J
Jaegeuk Kim 已提交
3393 3394 3395 3396
	sb->s_xattr = f2fs_xattr_handlers;
	sb->s_export_op = &f2fs_export_ops;
	sb->s_magic = F2FS_SUPER_MAGIC;
	sb->s_time_gran = 1;
3397 3398
	sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
		(test_opt(sbi, POSIX_ACL) ? SB_POSIXACL : 0);
3399
	memcpy(&sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
3400
	sb->s_iflags |= SB_I_CGROUPWB;
J
Jaegeuk Kim 已提交
3401 3402

	/* init f2fs-specific super block info */
3403
	sbi->valid_super_block = valid_super_block;
C
Chao Yu 已提交
3404
	init_rwsem(&sbi->gc_lock);
3405
	mutex_init(&sbi->writepages);
J
Jaegeuk Kim 已提交
3406
	mutex_init(&sbi->cp_mutex);
3407
	mutex_init(&sbi->resize_mutex);
3408
	init_rwsem(&sbi->node_write);
3409
	init_rwsem(&sbi->node_change);
3410 3411 3412

	/* disallow all the data/node/meta page writes */
	set_sbi_flag(sbi, SBI_POR_DOING);
J
Jaegeuk Kim 已提交
3413
	spin_lock_init(&sbi->stat_lock);
3414

C
Chao Yu 已提交
3415 3416 3417 3418
	/* init iostat info */
	spin_lock_init(&sbi->iostat_lock);
	sbi->iostat_enable = false;

J
Jaegeuk Kim 已提交
3419
	for (i = 0; i < NR_PAGE_TYPE; i++) {
J
Jaegeuk Kim 已提交
3420 3421 3422
		int n = (i == META) ? 1: NR_TEMP_TYPE;
		int j;

3423 3424 3425 3426 3427
		sbi->write_io[i] =
			f2fs_kmalloc(sbi,
				     array_size(n,
						sizeof(struct f2fs_bio_info)),
				     GFP_KERNEL);
3428 3429
		if (!sbi->write_io[i]) {
			err = -ENOMEM;
3430
			goto free_bio_info;
3431
		}
J
Jaegeuk Kim 已提交
3432 3433 3434 3435 3436

		for (j = HOT; j < n; j++) {
			init_rwsem(&sbi->write_io[i][j].io_rwsem);
			sbi->write_io[i][j].sbi = sbi;
			sbi->write_io[i][j].bio = NULL;
3437 3438
			spin_lock_init(&sbi->write_io[i][j].io_lock);
			INIT_LIST_HEAD(&sbi->write_io[i][j].io_list);
C
Chao Yu 已提交
3439 3440
			INIT_LIST_HEAD(&sbi->write_io[i][j].bio_list);
			init_rwsem(&sbi->write_io[i][j].bio_list_lock);
J
Jaegeuk Kim 已提交
3441
		}
J
Jaegeuk Kim 已提交
3442
	}
3443

3444
	init_rwsem(&sbi->cp_rwsem);
3445
	init_rwsem(&sbi->quota_sem);
3446
	init_waitqueue_head(&sbi->cp_wait);
J
Jaegeuk Kim 已提交
3447 3448
	init_sb_info(sbi);

3449 3450
	err = init_percpu_info(sbi);
	if (err)
3451
		goto free_bio_info;
3452

3453
	if (F2FS_IO_ALIGNED(sbi)) {
3454
		sbi->write_io_dummy =
3455
			mempool_create_page_pool(2 * (F2FS_IO_SIZE(sbi) - 1), 0);
3456 3457
		if (!sbi->write_io_dummy) {
			err = -ENOMEM;
3458
			goto free_percpu;
3459
		}
3460 3461
	}

J
Jaegeuk Kim 已提交
3462 3463 3464
	/* get an inode for meta space */
	sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi));
	if (IS_ERR(sbi->meta_inode)) {
3465
		f2fs_err(sbi, "Failed to read F2FS meta data inode");
J
Jaegeuk Kim 已提交
3466
		err = PTR_ERR(sbi->meta_inode);
3467
		goto free_io_dummy;
J
Jaegeuk Kim 已提交
3468 3469
	}

C
Chao Yu 已提交
3470
	err = f2fs_get_valid_checkpoint(sbi);
3471
	if (err) {
3472
		f2fs_err(sbi, "Failed to get valid F2FS checkpoint");
J
Jaegeuk Kim 已提交
3473
		goto free_meta_inode;
3474
	}
J
Jaegeuk Kim 已提交
3475

3476 3477
	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
3478 3479 3480 3481
	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_DISABLED_QUICK_FLAG)) {
		set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
		sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_QUICK_INTERVAL;
	}
3482

3483 3484 3485
	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_FSCK_FLAG))
		set_sbi_flag(sbi, SBI_NEED_FSCK);

J
Jaegeuk Kim 已提交
3486 3487 3488
	/* Initialize device list */
	err = f2fs_scan_devices(sbi);
	if (err) {
3489
		f2fs_err(sbi, "Failed to find devices");
J
Jaegeuk Kim 已提交
3490 3491 3492
		goto free_devices;
	}

C
Chao Yu 已提交
3493 3494 3495 3496 3497 3498
	err = f2fs_init_post_read_wq(sbi);
	if (err) {
		f2fs_err(sbi, "Failed to initialize post read workqueue");
		goto free_devices;
	}

J
Jaegeuk Kim 已提交
3499 3500
	sbi->total_valid_node_count =
				le32_to_cpu(sbi->ckpt->valid_node_count);
3501 3502
	percpu_counter_set(&sbi->total_valid_inode_count,
				le32_to_cpu(sbi->ckpt->valid_inode_count));
J
Jaegeuk Kim 已提交
3503 3504 3505 3506
	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;
3507
	sbi->reserved_blocks = 0;
3508
	sbi->current_reserved_blocks = 0;
3509
	limit_reserve_root(sbi);
3510

3511 3512 3513 3514
	for (i = 0; i < NR_INODE_TYPE; i++) {
		INIT_LIST_HEAD(&sbi->inode_list[i]);
		spin_lock_init(&sbi->inode_lock[i]);
	}
3515
	mutex_init(&sbi->flush_lock);
J
Jaegeuk Kim 已提交
3516

C
Chao Yu 已提交
3517
	f2fs_init_extent_cache_info(sbi);
C
Chao Yu 已提交
3518

C
Chao Yu 已提交
3519
	f2fs_init_ino_entry_info(sbi);
J
Jaegeuk Kim 已提交
3520

3521 3522
	f2fs_init_fsync_node_info(sbi);

J
Jaegeuk Kim 已提交
3523
	/* setup f2fs internal modules */
C
Chao Yu 已提交
3524
	err = f2fs_build_segment_manager(sbi);
3525
	if (err) {
3526 3527
		f2fs_err(sbi, "Failed to initialize F2FS segment manager (%d)",
			 err);
J
Jaegeuk Kim 已提交
3528
		goto free_sm;
3529
	}
C
Chao Yu 已提交
3530
	err = f2fs_build_node_manager(sbi);
3531
	if (err) {
3532 3533
		f2fs_err(sbi, "Failed to initialize F2FS node manager (%d)",
			 err);
J
Jaegeuk Kim 已提交
3534
		goto free_nm;
3535
	}
J
Jaegeuk Kim 已提交
3536

3537 3538 3539
	/* For write statistics */
	if (sb->s_bdev->bd_part)
		sbi->sectors_written_start =
3540 3541
			(u64)part_stat_read(sb->s_bdev->bd_part,
					    sectors[STAT_WRITE]);
3542 3543 3544 3545 3546

	/* Read accumulated write IO statistics if exists */
	seg_i = CURSEG_I(sbi, CURSEG_HOT_NODE);
	if (__exist_node_summaries(sbi))
		sbi->kbytes_written =
3547
			le64_to_cpu(seg_i->journal->info.kbytes_written);
3548

C
Chao Yu 已提交
3549
	f2fs_build_gc_manager(sbi);
J
Jaegeuk Kim 已提交
3550

3551 3552 3553 3554
	err = f2fs_build_stats(sbi);
	if (err)
		goto free_nm;

J
Jaegeuk Kim 已提交
3555 3556 3557
	/* get an inode for node space */
	sbi->node_inode = f2fs_iget(sb, F2FS_NODE_INO(sbi));
	if (IS_ERR(sbi->node_inode)) {
3558
		f2fs_err(sbi, "Failed to read node inode");
J
Jaegeuk Kim 已提交
3559
		err = PTR_ERR(sbi->node_inode);
3560
		goto free_stats;
J
Jaegeuk Kim 已提交
3561 3562 3563 3564 3565
	}

	/* read root inode and dentry */
	root = f2fs_iget(sb, F2FS_ROOT_INO(sbi));
	if (IS_ERR(root)) {
3566
		f2fs_err(sbi, "Failed to read root inode");
J
Jaegeuk Kim 已提交
3567
		err = PTR_ERR(root);
3568
		goto free_node_inode;
J
Jaegeuk Kim 已提交
3569
	}
3570 3571
	if (!S_ISDIR(root->i_mode) || !root->i_blocks ||
			!root->i_size || !root->i_nlink) {
3572
		iput(root);
3573
		err = -EINVAL;
3574
		goto free_node_inode;
3575
	}
J
Jaegeuk Kim 已提交
3576 3577 3578 3579

	sb->s_root = d_make_root(root); /* allocate root dentry */
	if (!sb->s_root) {
		err = -ENOMEM;
3580
		goto free_node_inode;
J
Jaegeuk Kim 已提交
3581 3582
	}

3583
	err = f2fs_register_sysfs(sbi);
3584
	if (err)
C
Chao Yu 已提交
3585
		goto free_root_inode;
3586

J
Jaegeuk Kim 已提交
3587
#ifdef CONFIG_QUOTA
S
Sheng Yong 已提交
3588
	/* Enable quota usage during mount */
3589
	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sb)) {
J
Jaegeuk Kim 已提交
3590
		err = f2fs_enable_quotas(sb);
3591
		if (err)
3592
			f2fs_err(sbi, "Cannot turn on quotas: error %d", err);
J
Jaegeuk Kim 已提交
3593 3594
	}
#endif
C
Chao Yu 已提交
3595
	/* if there are any orphan inodes, free them */
C
Chao Yu 已提交
3596
	err = f2fs_recover_orphan_inodes(sbi);
C
Chao Yu 已提交
3597
	if (err)
J
Jaegeuk Kim 已提交
3598
		goto free_meta;
C
Chao Yu 已提交
3599

D
Daniel Rosenberg 已提交
3600
	if (unlikely(is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)))
3601
		goto reset_checkpoint;
D
Daniel Rosenberg 已提交
3602

3603
	/* recover fsynced data */
3604 3605
	if (!test_opt(sbi, DISABLE_ROLL_FORWARD) &&
			!test_opt(sbi, NORECOVERY)) {
3606 3607 3608 3609
		/*
		 * mount should be failed, when device has readonly mode, and
		 * previous checkpoint was not done by clean system shutdown.
		 */
3610 3611 3612
		if (f2fs_hw_is_readonly(sbi)) {
			if (!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
				err = -EROFS;
3613
				f2fs_err(sbi, "Need to recover fsync data, but write access unavailable");
3614 3615
				goto free_meta;
			}
3616
			f2fs_info(sbi, "write access unavailable, skipping recovery");
3617
			goto reset_checkpoint;
3618
		}
3619 3620 3621 3622

		if (need_fsck)
			set_sbi_flag(sbi, SBI_NEED_FSCK);

3623 3624
		if (skip_recovery)
			goto reset_checkpoint;
3625

C
Chao Yu 已提交
3626
		err = f2fs_recover_fsync_data(sbi, false);
3627
		if (err < 0) {
3628 3629
			if (err != -ENOMEM)
				skip_recovery = true;
3630
			need_fsck = true;
3631 3632
			f2fs_err(sbi, "Cannot recover all fsync data errno=%d",
				 err);
C
Chao Yu 已提交
3633
			goto free_meta;
3634
		}
3635
	} else {
C
Chao Yu 已提交
3636
		err = f2fs_recover_fsync_data(sbi, true);
3637 3638 3639

		if (!f2fs_readonly(sb) && err > 0) {
			err = -EINVAL;
3640
			f2fs_err(sbi, "Need to recover fsync data");
J
Jaegeuk Kim 已提交
3641
			goto free_meta;
3642
		}
3643
	}
3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654

	/*
	 * If the f2fs is not readonly and fsync data recovery succeeds,
	 * check zoned block devices' write pointer consistency.
	 */
	if (!err && !f2fs_readonly(sb) && f2fs_sb_has_blkzoned(sbi)) {
		err = f2fs_check_write_pointer(sbi);
		if (err)
			goto free_meta;
	}

3655
reset_checkpoint:
C
Chao Yu 已提交
3656
	/* f2fs_recover_fsync_data() cleared this already */
3657
	clear_sbi_flag(sbi, SBI_POR_DOING);
3658

D
Daniel Rosenberg 已提交
3659 3660 3661
	if (test_opt(sbi, DISABLE_CHECKPOINT)) {
		err = f2fs_disable_checkpoint(sbi);
		if (err)
3662
			goto sync_free_meta;
D
Daniel Rosenberg 已提交
3663 3664 3665 3666
	} else if (is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)) {
		f2fs_enable_checkpoint(sbi);
	}

3667 3668 3669 3670
	/*
	 * If filesystem is not mounted as read-only then
	 * do start the gc_thread.
	 */
3671
	if (test_opt(sbi, BG_GC) && !f2fs_readonly(sb)) {
3672
		/* After POR, we can run background GC thread.*/
C
Chao Yu 已提交
3673
		err = f2fs_start_gc_thread(sbi);
3674
		if (err)
3675
			goto sync_free_meta;
3676
	}
3677
	kvfree(options);
3678 3679

	/* recover broken superblock */
3680
	if (recovery) {
3681
		err = f2fs_commit_super(sbi, true);
3682 3683
		f2fs_info(sbi, "Try to recover %dth superblock, ret: %d",
			  sbi->valid_super_block ? 1 : 2, err);
3684 3685
	}

C
Chao Yu 已提交
3686 3687
	f2fs_join_shrinker(sbi);

3688 3689
	f2fs_tuning_parameters(sbi);

3690 3691
	f2fs_notice(sbi, "Mounted with checkpoint version = %llx",
		    cur_cp_version(F2FS_CKPT(sbi)));
3692
	f2fs_update_time(sbi, CP_TIME);
3693
	f2fs_update_time(sbi, REQ_TIME);
3694
	clear_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
J
Jaegeuk Kim 已提交
3695
	return 0;
3696

3697 3698 3699
sync_free_meta:
	/* safe to flush all the data */
	sync_filesystem(sbi->sb);
3700
	retry_cnt = 0;
3701

C
Chao Yu 已提交
3702
free_meta:
J
Jaegeuk Kim 已提交
3703
#ifdef CONFIG_QUOTA
3704
	f2fs_truncate_quota_inode_pages(sb);
3705
	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sb))
J
Jaegeuk Kim 已提交
3706 3707
		f2fs_quota_off_umount(sbi->sb);
#endif
C
Chao Yu 已提交
3708
	/*
C
Chao Yu 已提交
3709
	 * Some dirty meta pages can be produced by f2fs_recover_orphan_inodes()
C
Chao Yu 已提交
3710
	 * failed by EIO. Then, iput(node_inode) can trigger balance_fs_bg()
C
Chao Yu 已提交
3711 3712
	 * followed by f2fs_write_checkpoint() through f2fs_write_node_pages(), which
	 * falls into an infinite loop in f2fs_sync_meta_pages().
C
Chao Yu 已提交
3713 3714
	 */
	truncate_inode_pages_final(META_MAPPING(sbi));
3715 3716
	/* evict some inodes being cached by GC */
	evict_inodes(sb);
3717
	f2fs_unregister_sysfs(sbi);
J
Jaegeuk Kim 已提交
3718 3719 3720 3721
free_root_inode:
	dput(sb->s_root);
	sb->s_root = NULL;
free_node_inode:
C
Chao Yu 已提交
3722
	f2fs_release_ino_entry(sbi, true);
C
Chao Yu 已提交
3723
	truncate_inode_pages_final(NODE_MAPPING(sbi));
J
Jaegeuk Kim 已提交
3724
	iput(sbi->node_inode);
3725
	sbi->node_inode = NULL;
3726 3727
free_stats:
	f2fs_destroy_stats(sbi);
J
Jaegeuk Kim 已提交
3728
free_nm:
C
Chao Yu 已提交
3729
	f2fs_destroy_node_manager(sbi);
J
Jaegeuk Kim 已提交
3730
free_sm:
C
Chao Yu 已提交
3731
	f2fs_destroy_segment_manager(sbi);
C
Chao Yu 已提交
3732
	f2fs_destroy_post_read_wq(sbi);
J
Jaegeuk Kim 已提交
3733 3734
free_devices:
	destroy_device_list(sbi);
3735
	kvfree(sbi->ckpt);
J
Jaegeuk Kim 已提交
3736 3737 3738
free_meta_inode:
	make_bad_inode(sbi->meta_inode);
	iput(sbi->meta_inode);
3739
	sbi->meta_inode = NULL;
3740 3741
free_io_dummy:
	mempool_destroy(sbi->write_io_dummy);
3742 3743 3744
free_percpu:
	destroy_percpu_info(sbi);
free_bio_info:
J
Jaegeuk Kim 已提交
3745
	for (i = 0; i < NR_PAGE_TYPE; i++)
3746
		kvfree(sbi->write_io[i]);
3747 3748 3749 3750

#ifdef CONFIG_UNICODE
	utf8_unload(sbi->s_encoding);
#endif
3751
free_options:
C
Chao Yu 已提交
3752 3753
#ifdef CONFIG_QUOTA
	for (i = 0; i < MAXQUOTAS; i++)
3754
		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
C
Chao Yu 已提交
3755
#endif
3756
	kvfree(options);
J
Jaegeuk Kim 已提交
3757
free_sb_buf:
3758
	kvfree(raw_super);
J
Jaegeuk Kim 已提交
3759
free_sbi:
K
Keith Mok 已提交
3760 3761
	if (sbi->s_chksum_driver)
		crypto_free_shash(sbi->s_chksum_driver);
3762
	kvfree(sbi);
3763 3764

	/* give only one another chance */
3765 3766
	if (retry_cnt > 0 && skip_recovery) {
		retry_cnt--;
3767 3768 3769
		shrink_dcache_sb(sb);
		goto try_onemore;
	}
J
Jaegeuk Kim 已提交
3770 3771 3772 3773 3774 3775 3776 3777 3778
	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);
}

3779 3780
static void kill_f2fs_super(struct super_block *sb)
{
3781
	if (sb->s_root) {
J
Jaegeuk Kim 已提交
3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794
		struct f2fs_sb_info *sbi = F2FS_SB(sb);

		set_sbi_flag(sbi, SBI_IS_CLOSE);
		f2fs_stop_gc_thread(sbi);
		f2fs_stop_discard_thread(sbi);

		if (is_sbi_flag_set(sbi, SBI_IS_DIRTY) ||
				!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
			struct cp_control cpc = {
				.reason = CP_UMOUNT,
			};
			f2fs_write_checkpoint(sbi, &cpc);
		}
3795 3796 3797

		if (is_sbi_flag_set(sbi, SBI_IS_RECOVERED) && f2fs_readonly(sb))
			sb->s_flags &= ~SB_RDONLY;
3798
	}
3799 3800 3801
	kill_block_super(sb);
}

J
Jaegeuk Kim 已提交
3802 3803 3804 3805
static struct file_system_type f2fs_fs_type = {
	.owner		= THIS_MODULE,
	.name		= "f2fs",
	.mount		= f2fs_mount,
3806
	.kill_sb	= kill_f2fs_super,
J
Jaegeuk Kim 已提交
3807 3808
	.fs_flags	= FS_REQUIRES_DEV,
};
3809
MODULE_ALIAS_FS("f2fs");
J
Jaegeuk Kim 已提交
3810

3811
static int __init init_inodecache(void)
J
Jaegeuk Kim 已提交
3812
{
3813 3814 3815
	f2fs_inode_cachep = kmem_cache_create("f2fs_inode_cache",
			sizeof(struct f2fs_inode_info), 0,
			SLAB_RECLAIM_ACCOUNT|SLAB_ACCOUNT, NULL);
3816
	if (!f2fs_inode_cachep)
J
Jaegeuk Kim 已提交
3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834
		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;

3835 3836 3837 3838 3839 3840
	if (PAGE_SIZE != F2FS_BLKSIZE) {
		printk("F2FS not supported on PAGE_SIZE(%lu) != %d\n",
				PAGE_SIZE, F2FS_BLKSIZE);
		return -EINVAL;
	}

3841 3842
	f2fs_build_trace_ios();

J
Jaegeuk Kim 已提交
3843 3844 3845
	err = init_inodecache();
	if (err)
		goto fail;
C
Chao Yu 已提交
3846
	err = f2fs_create_node_manager_caches();
J
Jaegeuk Kim 已提交
3847
	if (err)
3848
		goto free_inodecache;
C
Chao Yu 已提交
3849
	err = f2fs_create_segment_manager_caches();
J
Jaegeuk Kim 已提交
3850
	if (err)
3851
		goto free_node_manager_caches;
C
Chao Yu 已提交
3852
	err = f2fs_create_checkpoint_caches();
J
Jaegeuk Kim 已提交
3853
	if (err)
3854
		goto free_segment_manager_caches;
C
Chao Yu 已提交
3855
	err = f2fs_create_extent_cache();
C
Chao Yu 已提交
3856 3857
	if (err)
		goto free_checkpoint_caches;
3858
	err = f2fs_init_sysfs();
C
Chao Yu 已提交
3859
	if (err)
C
Chao Yu 已提交
3860
		goto free_extent_cache;
3861
	err = register_shrinker(&f2fs_shrinker_info);
3862
	if (err)
C
Chao Yu 已提交
3863
		goto free_sysfs;
3864 3865 3866
	err = register_filesystem(&f2fs_fs_type);
	if (err)
		goto free_shrinker;
3867
	f2fs_create_root_stats();
3868 3869 3870
	err = f2fs_init_post_read_processing();
	if (err)
		goto free_root_stats;
C
Chao Yu 已提交
3871 3872 3873
	err = f2fs_init_bio_entry_cache();
	if (err)
		goto free_post_read;
C
Chao Yu 已提交
3874 3875 3876
	err = f2fs_init_bioset();
	if (err)
		goto free_bio_enrty_cache;
3877
	return 0;
C
Chao Yu 已提交
3878 3879
free_bio_enrty_cache:
	f2fs_destroy_bio_entry_cache();
C
Chao Yu 已提交
3880 3881
free_post_read:
	f2fs_destroy_post_read_processing();
3882 3883
free_root_stats:
	f2fs_destroy_root_stats();
3884
	unregister_filesystem(&f2fs_fs_type);
3885 3886
free_shrinker:
	unregister_shrinker(&f2fs_shrinker_info);
C
Chao Yu 已提交
3887
free_sysfs:
3888
	f2fs_exit_sysfs();
C
Chao Yu 已提交
3889
free_extent_cache:
C
Chao Yu 已提交
3890
	f2fs_destroy_extent_cache();
3891
free_checkpoint_caches:
C
Chao Yu 已提交
3892
	f2fs_destroy_checkpoint_caches();
3893
free_segment_manager_caches:
C
Chao Yu 已提交
3894
	f2fs_destroy_segment_manager_caches();
3895
free_node_manager_caches:
C
Chao Yu 已提交
3896
	f2fs_destroy_node_manager_caches();
3897 3898
free_inodecache:
	destroy_inodecache();
J
Jaegeuk Kim 已提交
3899 3900 3901 3902 3903 3904
fail:
	return err;
}

static void __exit exit_f2fs_fs(void)
{
C
Chao Yu 已提交
3905
	f2fs_destroy_bioset();
C
Chao Yu 已提交
3906
	f2fs_destroy_bio_entry_cache();
3907
	f2fs_destroy_post_read_processing();
3908
	f2fs_destroy_root_stats();
J
Jaegeuk Kim 已提交
3909
	unregister_filesystem(&f2fs_fs_type);
T
Tiezhu Yang 已提交
3910
	unregister_shrinker(&f2fs_shrinker_info);
3911
	f2fs_exit_sysfs();
C
Chao Yu 已提交
3912 3913 3914 3915
	f2fs_destroy_extent_cache();
	f2fs_destroy_checkpoint_caches();
	f2fs_destroy_segment_manager_caches();
	f2fs_destroy_node_manager_caches();
J
Jaegeuk Kim 已提交
3916
	destroy_inodecache();
3917
	f2fs_destroy_trace_ios();
J
Jaegeuk Kim 已提交
3918 3919 3920 3921 3922 3923 3924 3925
}

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");
3926