super.c 97.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,
J
Jaegeuk Kim 已提交
144 145 146 147
	Opt_err,
};

static match_table_t f2fs_tokens = {
148
	{Opt_gc_background, "background_gc=%s"},
J
Jaegeuk Kim 已提交
149
	{Opt_disable_roll_forward, "disable_roll_forward"},
150
	{Opt_norecovery, "norecovery"},
J
Jaegeuk Kim 已提交
151
	{Opt_discard, "discard"},
C
Chao Yu 已提交
152
	{Opt_nodiscard, "nodiscard"},
J
Jaegeuk Kim 已提交
153
	{Opt_noheap, "no_heap"},
154
	{Opt_heap, "heap"},
155
	{Opt_user_xattr, "user_xattr"},
J
Jaegeuk Kim 已提交
156
	{Opt_nouser_xattr, "nouser_xattr"},
157
	{Opt_acl, "acl"},
J
Jaegeuk Kim 已提交
158 159 160
	{Opt_noacl, "noacl"},
	{Opt_active_logs, "active_logs=%u"},
	{Opt_disable_ext_identify, "disable_ext_identify"},
J
Jaegeuk Kim 已提交
161
	{Opt_inline_xattr, "inline_xattr"},
162
	{Opt_noinline_xattr, "noinline_xattr"},
C
Chao Yu 已提交
163
	{Opt_inline_xattr_size, "inline_xattr_size=%u"},
164
	{Opt_inline_data, "inline_data"},
165
	{Opt_inline_dentry, "inline_dentry"},
166
	{Opt_noinline_dentry, "noinline_dentry"},
167
	{Opt_flush_merge, "flush_merge"},
J
Jaegeuk Kim 已提交
168
	{Opt_noflush_merge, "noflush_merge"},
J
Jaegeuk Kim 已提交
169
	{Opt_nobarrier, "nobarrier"},
170
	{Opt_fastboot, "fastboot"},
171
	{Opt_extent_cache, "extent_cache"},
172
	{Opt_noextent_cache, "noextent_cache"},
W
Wanpeng Li 已提交
173
	{Opt_noinline_data, "noinline_data"},
174
	{Opt_data_flush, "data_flush"},
175
	{Opt_reserve_root, "reserve_root=%u"},
176 177
	{Opt_resgid, "resgid=%u"},
	{Opt_resuid, "resuid=%u"},
178
	{Opt_mode, "mode=%s"},
179
	{Opt_io_size_bits, "io_bits=%u"},
180
	{Opt_fault_injection, "fault_injection=%u"},
C
Chao Yu 已提交
181
	{Opt_fault_type, "fault_type=%u"},
J
Jaegeuk Kim 已提交
182 183
	{Opt_lazytime, "lazytime"},
	{Opt_nolazytime, "nolazytime"},
C
Chao Yu 已提交
184 185
	{Opt_quota, "quota"},
	{Opt_noquota, "noquota"},
C
Chao Yu 已提交
186 187
	{Opt_usrquota, "usrquota"},
	{Opt_grpquota, "grpquota"},
C
Chao Yu 已提交
188
	{Opt_prjquota, "prjquota"},
C
Chao Yu 已提交
189 190 191 192 193 194 195 196 197
	{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"},
198
	{Opt_whint, "whint_mode=%s"},
199
	{Opt_alloc, "alloc_mode=%s"},
200
	{Opt_fsync, "fsync_mode=%s"},
201
	{Opt_test_dummy_encryption, "test_dummy_encryption"},
202 203 204 205
	{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"},
J
Jaegeuk Kim 已提交
206 207 208
	{Opt_err, NULL},
};

209
void f2fs_printk(struct f2fs_sb_info *sbi, const char *fmt, ...)
210 211 212
{
	struct va_format vaf;
	va_list args;
213
	int level;
214 215

	va_start(args, fmt);
216 217 218

	level = printk_get_level(fmt);
	vaf.fmt = printk_skip_level(fmt);
219
	vaf.va = &args;
220 221 222
	printk("%c%cF2FS-fs (%s): %pV\n",
	       KERN_SOH_ASCII, level, sbi->sb->s_id, &vaf);

223 224 225
	va_end(args);
}

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
#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

256 257
static inline void limit_reserve_root(struct f2fs_sb_info *sbi)
{
258 259
	block_t limit = min((sbi->user_block_count << 1) / 1000,
			sbi->user_block_count - sbi->reserved_blocks);
260 261

	/* limit is 0.2% */
262 263 264
	if (test_opt(sbi, RESERVE_ROOT) &&
			F2FS_OPTION(sbi).root_reserved_blocks > limit) {
		F2FS_OPTION(sbi).root_reserved_blocks = limit;
265 266
		f2fs_info(sbi, "Reduce reserved blocks for root = %u",
			  F2FS_OPTION(sbi).root_reserved_blocks);
267
	}
268
	if (!test_opt(sbi, RESERVE_ROOT) &&
269
		(!uid_eq(F2FS_OPTION(sbi).s_resuid,
270
				make_kuid(&init_user_ns, F2FS_DEF_RESUID)) ||
271
		!gid_eq(F2FS_OPTION(sbi).s_resgid,
272
				make_kgid(&init_user_ns, F2FS_DEF_RESGID))))
273 274 275 276 277
		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));
278 279
}

J
Jaegeuk Kim 已提交
280 281 282 283 284 285 286
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 已提交
287 288 289 290 291 292 293 294 295 296
#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;

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

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

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

335
	if (sb_any_quota_loaded(sb) && F2FS_OPTION(sbi).s_qf_names[qtype]) {
336
		f2fs_err(sbi, "Cannot change journaled quota options when quota turned on");
C
Chao Yu 已提交
337 338
		return -EINVAL;
	}
339
	kvfree(F2FS_OPTION(sbi).s_qf_names[qtype]);
340
	F2FS_OPTION(sbi).s_qf_names[qtype] = NULL;
C
Chao Yu 已提交
341 342 343 344 345 346 347 348 349 350
	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.
	 */
351
	if (test_opt(sbi, PRJQUOTA) && !f2fs_sb_has_project_quota(sbi)) {
352
		f2fs_err(sbi, "Project quota feature not enabled. Cannot enable project quota enforcement.");
C
Chao Yu 已提交
353 354
		return -1;
	}
355 356 357 358 359
	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 已提交
360 361
			clear_opt(sbi, USRQUOTA);

362 363
		if (test_opt(sbi, GRPQUOTA) &&
				F2FS_OPTION(sbi).s_qf_names[GRPQUOTA])
C
Chao Yu 已提交
364 365
			clear_opt(sbi, GRPQUOTA);

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

		if (test_opt(sbi, GRPQUOTA) || test_opt(sbi, USRQUOTA) ||
				test_opt(sbi, PRJQUOTA)) {
372
			f2fs_err(sbi, "old and new quota format mixing");
C
Chao Yu 已提交
373 374 375
			return -1;
		}

376
		if (!F2FS_OPTION(sbi).s_jquota_fmt) {
377
			f2fs_err(sbi, "journaled quota format not specified");
C
Chao Yu 已提交
378 379 380
			return -1;
		}
	}
J
Jaegeuk Kim 已提交
381

382
	if (f2fs_sb_has_quota_ino(sbi) && F2FS_OPTION(sbi).s_jquota_fmt) {
383
		f2fs_info(sbi, "QUOTA feature is enabled, so ignore jquota_fmt");
384
		F2FS_OPTION(sbi).s_jquota_fmt = 0;
J
Jaegeuk Kim 已提交
385
	}
C
Chao Yu 已提交
386 387 388 389
	return 0;
}
#endif

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

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

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

C
Chao Yu 已提交
624 625 626 627
		case Opt_fault_type:
			if (args->from && match_int(args, &arg))
				return -EINVAL;
			f2fs_build_fault_attr(sbi, 0, arg);
628
			set_opt(sbi, FAULT_INJECTION);
629
			break;
630
#else
631
		case Opt_fault_injection:
632
			f2fs_info(sbi, "fault_injection options not supported");
633
			break;
634 635

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

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

			F2FS_OPTION(sbi).test_dummy_encryption = true;
783
			f2fs_info(sbi, "Test dummy encryption mode enabled");
784
#else
785
			f2fs_info(sbi, "Test dummy encryption mount option ignored");
786 787
#endif
			break;
788 789
		case Opt_checkpoint_disable_cap_perc:
			if (args->from && match_int(args, &arg))
D
Daniel Rosenberg 已提交
790
				return -EINVAL;
791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811
			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 已提交
812
			break;
813
		default:
814 815
			f2fs_err(sbi, "Unrecognized mount option \"%s\" or missing value",
				 p);
816 817 818
			return -EINVAL;
		}
	}
C
Chao Yu 已提交
819 820 821
#ifdef CONFIG_QUOTA
	if (f2fs_check_quota_options(sbi))
		return -EINVAL;
822
#else
823
	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sbi->sb)) {
824
		f2fs_info(sbi, "Filesystem with quota feature cannot be mounted RDWR without CONFIG_QUOTA");
825 826
		return -EINVAL;
	}
827
	if (f2fs_sb_has_project_quota(sbi) && !f2fs_readonly(sbi->sb)) {
828
		f2fs_err(sbi, "Filesystem with project quota feature cannot be mounted RDWR without CONFIG_QUOTA");
829 830
		return -EINVAL;
	}
C
Chao Yu 已提交
831
#endif
832 833 834 835 836 837 838
#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
839 840

	if (F2FS_IO_SIZE_BITS(sbi) && !test_opt(sbi, LFS)) {
841 842
		f2fs_err(sbi, "Should set mode=lfs with %uKB-sized IO",
			 F2FS_IO_SIZE_KB(sbi));
843 844
		return -EINVAL;
	}
C
Chao Yu 已提交
845 846

	if (test_opt(sbi, INLINE_XATTR_SIZE)) {
847 848
		int min_size, max_size;

849 850
		if (!f2fs_sb_has_extra_attr(sbi) ||
			!f2fs_sb_has_flexible_inline_xattr(sbi)) {
851
			f2fs_err(sbi, "extra_attr or flexible_inline_xattr feature is off");
852 853
			return -EINVAL;
		}
C
Chao Yu 已提交
854
		if (!test_opt(sbi, INLINE_XATTR)) {
855
			f2fs_err(sbi, "inline_xattr_size option should be set with inline_xattr option");
C
Chao Yu 已提交
856 857
			return -EINVAL;
		}
858 859

		min_size = sizeof(struct f2fs_xattr_header) / sizeof(__le32);
860
		max_size = MAX_INLINE_XATTR_SIZE;
861 862 863

		if (F2FS_OPTION(sbi).inline_xattr_size < min_size ||
				F2FS_OPTION(sbi).inline_xattr_size > max_size) {
864 865
			f2fs_err(sbi, "inline xattr size is out of range: %d ~ %d",
				 min_size, max_size);
C
Chao Yu 已提交
866 867 868
			return -EINVAL;
		}
	}
869

D
Daniel Rosenberg 已提交
870
	if (test_opt(sbi, DISABLE_CHECKPOINT) && test_opt(sbi, LFS)) {
871
		f2fs_err(sbi, "LFS not compatible with checkpoint=disable\n");
D
Daniel Rosenberg 已提交
872 873 874
		return -EINVAL;
	}

875 876 877
	/* Not pass down write hints if the number of active logs is lesser
	 * than NR_CURSEG_TYPE.
	 */
878 879
	if (F2FS_OPTION(sbi).active_logs != NR_CURSEG_TYPE)
		F2FS_OPTION(sbi).whint_mode = WHINT_MODE_OFF;
880 881 882
	return 0;
}

J
Jaegeuk Kim 已提交
883 884 885 886
static struct inode *f2fs_alloc_inode(struct super_block *sb)
{
	struct f2fs_inode_info *fi;

887
	fi = kmem_cache_alloc(f2fs_inode_cachep, GFP_F2FS_ZERO);
J
Jaegeuk Kim 已提交
888 889 890 891 892
	if (!fi)
		return NULL;

	init_once((void *) fi);

M
Masanari Iida 已提交
893
	/* Initialize f2fs-specific inode info */
894
	atomic_set(&fi->dirty_pages, 0);
895
	init_rwsem(&fi->i_sem);
896
	INIT_LIST_HEAD(&fi->dirty_list);
897
	INIT_LIST_HEAD(&fi->gdirty_list);
J
Jaegeuk Kim 已提交
898
	INIT_LIST_HEAD(&fi->inmem_ilist);
J
Jaegeuk Kim 已提交
899 900
	INIT_LIST_HEAD(&fi->inmem_pages);
	mutex_init(&fi->inmem_lock);
C
Chao Yu 已提交
901 902
	init_rwsem(&fi->i_gc_rwsem[READ]);
	init_rwsem(&fi->i_gc_rwsem[WRITE]);
903
	init_rwsem(&fi->i_mmap_sem);
904
	init_rwsem(&fi->i_xattr_sem);
J
Jaegeuk Kim 已提交
905

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

J
Jaegeuk Kim 已提交
909 910 911
	return &fi->vfs_inode;
}

912 913
static int f2fs_drop_inode(struct inode *inode)
{
914
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
915
	int ret;
916 917 918 919 920 921 922 923 924 925 926 927 928

	/*
	 * 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;
		}
	}

929 930 931 932 933 934 935
	/*
	 * 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)
	 */
936
	if ((!inode_unhashed(inode) && inode->i_state & I_SYNC)) {
937
		if (!inode->i_nlink && !is_bad_inode(inode)) {
J
Jaegeuk Kim 已提交
938 939
			/* to avoid evict_inode call simultaneously */
			atomic_inc(&inode->i_count);
940 941 942 943
			spin_unlock(&inode->i_lock);

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

J
Jaegeuk Kim 已提交
946 947 948
			/* should remain fi->extent_tree for writepage */
			f2fs_destroy_extent_node(inode);

949
			sb_start_intwrite(inode->i_sb);
950
			f2fs_i_size_write(inode, 0);
951

952 953 954 955
			f2fs_submit_merged_write_cond(F2FS_I_SB(inode),
					inode, NULL, 0, DATA);
			truncate_inode_pages_final(inode->i_mapping);

956
			if (F2FS_HAS_BLOCKS(inode))
957
				f2fs_truncate(inode);
958 959 960 961

			sb_end_intwrite(inode->i_sb);

			spin_lock(&inode->i_lock);
J
Jaegeuk Kim 已提交
962
			atomic_dec(&inode->i_count);
963
		}
964
		trace_f2fs_drop_inode(inode, 0);
965
		return 0;
966
	}
967 968 969
	ret = generic_drop_inode(inode);
	trace_f2fs_drop_inode(inode, ret);
	return ret;
970 971
}

972
int f2fs_inode_dirtied(struct inode *inode, bool sync)
973
{
974
	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
975
	int ret = 0;
976 977 978

	spin_lock(&sbi->inode_lock[DIRTY_META]);
	if (is_inode_flag_set(inode, FI_DIRTY_INODE)) {
979 980 981 982
		ret = 1;
	} else {
		set_inode_flag(inode, FI_DIRTY_INODE);
		stat_inc_dirty_inode(sbi, DIRTY_META);
983
	}
984 985
	if (sync && list_empty(&F2FS_I(inode)->gdirty_list)) {
		list_add_tail(&F2FS_I(inode)->gdirty_list,
986
				&sbi->inode_list[DIRTY_META]);
987 988
		inc_page_count(sbi, F2FS_DIRTY_IMETA);
	}
989
	spin_unlock(&sbi->inode_lock[DIRTY_META]);
990
	return ret;
991 992 993 994 995 996 997 998 999 1000 1001
}

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;
	}
1002 1003 1004 1005
	if (!list_empty(&F2FS_I(inode)->gdirty_list)) {
		list_del_init(&F2FS_I(inode)->gdirty_list);
		dec_page_count(sbi, F2FS_DIRTY_IMETA);
	}
1006
	clear_inode_flag(inode, FI_DIRTY_INODE);
1007
	clear_inode_flag(inode, FI_AUTO_RECOVER);
1008
	stat_dec_dirty_inode(F2FS_I_SB(inode), DIRTY_META);
1009
	spin_unlock(&sbi->inode_lock[DIRTY_META]);
1010 1011
}

J
Jaegeuk Kim 已提交
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
/*
 * 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);

1031
	f2fs_inode_dirtied(inode, false);
J
Jaegeuk Kim 已提交
1032 1033
}

A
Al Viro 已提交
1034
static void f2fs_free_inode(struct inode *inode)
J
Jaegeuk Kim 已提交
1035
{
1036
	fscrypt_free_inode(inode);
J
Jaegeuk Kim 已提交
1037 1038 1039
	kmem_cache_free(f2fs_inode_cachep, F2FS_I(inode));
}

1040 1041
static void destroy_percpu_info(struct f2fs_sb_info *sbi)
{
1042
	percpu_counter_destroy(&sbi->alloc_valid_block_count);
1043
	percpu_counter_destroy(&sbi->total_valid_inode_count);
1044 1045
}

J
Jaegeuk Kim 已提交
1046 1047 1048 1049 1050 1051 1052
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
1053
		kvfree(FDEV(i).blkz_seq);
J
Jaegeuk Kim 已提交
1054 1055
#endif
	}
1056
	kvfree(sbi->devs);
J
Jaegeuk Kim 已提交
1057 1058
}

J
Jaegeuk Kim 已提交
1059 1060 1061
static void f2fs_put_super(struct super_block *sb)
{
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
C
Chao Yu 已提交
1062
	int i;
1063
	bool dropped;
J
Jaegeuk Kim 已提交
1064

C
Chao Yu 已提交
1065
	f2fs_quota_off_umount(sb);
J
Jaegeuk Kim 已提交
1066

1067 1068 1069
	/* prevent remaining shrinker jobs */
	mutex_lock(&sbi->umount_mutex);

1070 1071 1072 1073 1074
	/*
	 * 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 已提交
1075 1076
	if ((is_sbi_flag_set(sbi, SBI_IS_DIRTY) ||
			!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG))) {
1077 1078 1079
		struct cp_control cpc = {
			.reason = CP_UMOUNT,
		};
C
Chao Yu 已提交
1080
		f2fs_write_checkpoint(sbi, &cpc);
1081
	}
J
Jaegeuk Kim 已提交
1082

1083
	/* be sure to wait for any on-going discard commands */
1084
	dropped = f2fs_issue_discard_timeout(sbi);
1085

1086 1087
	if ((f2fs_hw_support_discard(sbi) || f2fs_hw_should_discard(sbi)) &&
					!sbi->discard_blks && !dropped) {
1088 1089 1090
		struct cp_control cpc = {
			.reason = CP_UMOUNT | CP_TRIMMED,
		};
C
Chao Yu 已提交
1091
		f2fs_write_checkpoint(sbi, &cpc);
1092 1093
	}

1094 1095 1096 1097
	/*
	 * 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 已提交
1098
	f2fs_release_ino_entry(sbi, true);
1099

1100 1101 1102
	f2fs_leave_shrinker(sbi);
	mutex_unlock(&sbi->umount_mutex);

1103
	/* our cp_error case, we can wait for any writeback page */
1104
	f2fs_flush_merged_writes(sbi);
1105

1106 1107 1108 1109
	f2fs_wait_on_all_pages_writeback(sbi);

	f2fs_bug_on(sbi, sbi->fsync_node_num);

J
Jaegeuk Kim 已提交
1110
	iput(sbi->node_inode);
1111 1112
	sbi->node_inode = NULL;

J
Jaegeuk Kim 已提交
1113
	iput(sbi->meta_inode);
1114
	sbi->meta_inode = NULL;
J
Jaegeuk Kim 已提交
1115

1116 1117 1118 1119 1120 1121
	/*
	 * iput() can update stat information, if f2fs_write_checkpoint()
	 * above failed with error.
	 */
	f2fs_destroy_stats(sbi);

J
Jaegeuk Kim 已提交
1122
	/* destroy f2fs internal modules */
C
Chao Yu 已提交
1123 1124
	f2fs_destroy_node_manager(sbi);
	f2fs_destroy_segment_manager(sbi);
J
Jaegeuk Kim 已提交
1125

1126
	kvfree(sbi->ckpt);
C
Chao Yu 已提交
1127

1128
	f2fs_unregister_sysfs(sbi);
J
Jaegeuk Kim 已提交
1129 1130

	sb->s_fs_info = NULL;
K
Keith Mok 已提交
1131 1132
	if (sbi->s_chksum_driver)
		crypto_free_shash(sbi->s_chksum_driver);
1133
	kvfree(sbi->raw_super);
1134

J
Jaegeuk Kim 已提交
1135
	destroy_device_list(sbi);
1136
	mempool_destroy(sbi->write_io_dummy);
C
Chao Yu 已提交
1137 1138
#ifdef CONFIG_QUOTA
	for (i = 0; i < MAXQUOTAS; i++)
1139
		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
C
Chao Yu 已提交
1140
#endif
1141
	destroy_percpu_info(sbi);
J
Jaegeuk Kim 已提交
1142
	for (i = 0; i < NR_PAGE_TYPE; i++)
1143
		kvfree(sbi->write_io[i]);
1144 1145 1146
#ifdef CONFIG_UNICODE
	utf8_unload(sbi->s_encoding);
#endif
1147
	kvfree(sbi);
J
Jaegeuk Kim 已提交
1148 1149 1150 1151 1152
}

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

1155 1156
	if (unlikely(f2fs_cp_error(sbi)))
		return 0;
D
Daniel Rosenberg 已提交
1157 1158
	if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
		return 0;
1159

1160 1161
	trace_f2fs_sync_fs(sb, sync);

C
Chao Yu 已提交
1162 1163 1164
	if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
		return -EAGAIN;

1165
	if (sync) {
1166 1167
		struct cp_control cpc;

1168 1169
		cpc.reason = __get_cp_reason(sbi);

1170
		mutex_lock(&sbi->gc_mutex);
C
Chao Yu 已提交
1171
		err = f2fs_write_checkpoint(sbi, &cpc);
1172 1173
		mutex_unlock(&sbi->gc_mutex);
	}
1174
	f2fs_trace_ios(NULL, 1);
J
Jaegeuk Kim 已提交
1175

C
Chao Yu 已提交
1176
	return err;
J
Jaegeuk Kim 已提交
1177 1178
}

1179 1180
static int f2fs_freeze(struct super_block *sb)
{
J
Jaegeuk Kim 已提交
1181
	if (f2fs_readonly(sb))
1182 1183
		return 0;

1184 1185 1186 1187 1188 1189 1190 1191
	/* 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;
1192 1193 1194 1195 1196 1197 1198
}

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

C
Chao Yu 已提交
1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211
#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);
1212
	spin_lock(&dquot->dq_dqb_lock);
C
Chao Yu 已提交
1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234

	limit = (dquot->dq_dqb.dqb_bsoftlimit ?
		 dquot->dq_dqb.dqb_bsoftlimit :
		 dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits;
	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;
	}

	limit = dquot->dq_dqb.dqb_isoftlimit ?
		dquot->dq_dqb.dqb_isoftlimit :
		dquot->dq_dqb.dqb_ihardlimit;
	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;
	}

1235
	spin_unlock(&dquot->dq_dqb_lock);
C
Chao Yu 已提交
1236 1237 1238 1239 1240
	dqput(dquot);
	return 0;
}
#endif

J
Jaegeuk Kim 已提交
1241 1242 1243 1244 1245
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);
1246
	block_t total_count, user_block_count, start_count;
1247
	u64 avail_node_count;
J
Jaegeuk Kim 已提交
1248 1249 1250 1251 1252 1253 1254 1255

	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;
1256
	buf->f_bfree = user_block_count - valid_user_blocks(sbi) -
1257
						sbi->current_reserved_blocks;
1258 1259

	spin_lock(&sbi->stat_lock);
D
Daniel Rosenberg 已提交
1260 1261 1262 1263
	if (unlikely(buf->f_bfree <= sbi->unusable_block_count))
		buf->f_bfree = 0;
	else
		buf->f_bfree -= sbi->unusable_block_count;
1264
	spin_unlock(&sbi->stat_lock);
D
Daniel Rosenberg 已提交
1265

1266 1267 1268
	if (buf->f_bfree > F2FS_OPTION(sbi).root_reserved_blocks)
		buf->f_bavail = buf->f_bfree -
				F2FS_OPTION(sbi).root_reserved_blocks;
1269 1270
	else
		buf->f_bavail = 0;
J
Jaegeuk Kim 已提交
1271

1272 1273
	avail_node_count = sbi->total_node_count - sbi->nquota_files -
						F2FS_RESERVED_NODE_NUM;
1274 1275 1276 1277 1278 1279 1280 1281 1282

	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 已提交
1283

1284
	buf->f_namelen = F2FS_NAME_LEN;
J
Jaegeuk Kim 已提交
1285 1286 1287
	buf->f_fsid.val[0] = (u32)id;
	buf->f_fsid.val[1] = (u32)(id >> 32);

C
Chao Yu 已提交
1288 1289 1290 1291 1292 1293
#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 已提交
1294 1295 1296
	return 0;
}

C
Chao Yu 已提交
1297 1298 1299 1300 1301 1302
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);

1303
	if (F2FS_OPTION(sbi).s_jquota_fmt) {
C
Chao Yu 已提交
1304 1305
		char *fmtname = "";

1306
		switch (F2FS_OPTION(sbi).s_jquota_fmt) {
C
Chao Yu 已提交
1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319
		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);
	}

1320 1321 1322
	if (F2FS_OPTION(sbi).s_qf_names[USRQUOTA])
		seq_show_option(seq, "usrjquota",
			F2FS_OPTION(sbi).s_qf_names[USRQUOTA]);
C
Chao Yu 已提交
1323

1324 1325 1326
	if (F2FS_OPTION(sbi).s_qf_names[GRPQUOTA])
		seq_show_option(seq, "grpjquota",
			F2FS_OPTION(sbi).s_qf_names[GRPQUOTA]);
C
Chao Yu 已提交
1327

1328 1329 1330
	if (F2FS_OPTION(sbi).s_qf_names[PRJQUOTA])
		seq_show_option(seq, "prjjquota",
			F2FS_OPTION(sbi).s_qf_names[PRJQUOTA]);
C
Chao Yu 已提交
1331 1332 1333
#endif
}

J
Jaegeuk Kim 已提交
1334 1335 1336 1337
static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
{
	struct f2fs_sb_info *sbi = F2FS_SB(root->d_sb);

1338 1339 1340 1341 1342 1343
	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 {
1344
		seq_printf(seq, ",background_gc=%s", "off");
1345
	}
J
Jaegeuk Kim 已提交
1346 1347 1348 1349
	if (test_opt(sbi, DISABLE_ROLL_FORWARD))
		seq_puts(seq, ",disable_roll_forward");
	if (test_opt(sbi, DISCARD))
		seq_puts(seq, ",discard");
1350 1351
	else
		seq_puts(seq, ",nodiscard");
J
Jaegeuk Kim 已提交
1352
	if (test_opt(sbi, NOHEAP))
1353 1354 1355
		seq_puts(seq, ",no_heap");
	else
		seq_puts(seq, ",heap");
J
Jaegeuk Kim 已提交
1356 1357 1358 1359 1360
#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 已提交
1361 1362
	if (test_opt(sbi, INLINE_XATTR))
		seq_puts(seq, ",inline_xattr");
1363 1364
	else
		seq_puts(seq, ",noinline_xattr");
C
Chao Yu 已提交
1365 1366
	if (test_opt(sbi, INLINE_XATTR_SIZE))
		seq_printf(seq, ",inline_xattr_size=%u",
1367
					F2FS_OPTION(sbi).inline_xattr_size);
J
Jaegeuk Kim 已提交
1368 1369 1370 1371 1372 1373 1374 1375
#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))
1376
		seq_puts(seq, ",disable_ext_identify");
1377 1378
	if (test_opt(sbi, INLINE_DATA))
		seq_puts(seq, ",inline_data");
W
Wanpeng Li 已提交
1379 1380
	else
		seq_puts(seq, ",noinline_data");
1381 1382
	if (test_opt(sbi, INLINE_DENTRY))
		seq_puts(seq, ",inline_dentry");
1383 1384
	else
		seq_puts(seq, ",noinline_dentry");
1385
	if (!f2fs_readonly(sbi->sb) && test_opt(sbi, FLUSH_MERGE))
1386
		seq_puts(seq, ",flush_merge");
J
Jaegeuk Kim 已提交
1387 1388
	if (test_opt(sbi, NOBARRIER))
		seq_puts(seq, ",nobarrier");
1389 1390
	if (test_opt(sbi, FASTBOOT))
		seq_puts(seq, ",fastboot");
1391 1392
	if (test_opt(sbi, EXTENT_CACHE))
		seq_puts(seq, ",extent_cache");
1393 1394
	else
		seq_puts(seq, ",noextent_cache");
1395 1396
	if (test_opt(sbi, DATA_FLUSH))
		seq_puts(seq, ",data_flush");
1397 1398 1399 1400 1401 1402

	seq_puts(seq, ",mode=");
	if (test_opt(sbi, ADAPTIVE))
		seq_puts(seq, "adaptive");
	else if (test_opt(sbi, LFS))
		seq_puts(seq, "lfs");
1403
	seq_printf(seq, ",active_logs=%u", F2FS_OPTION(sbi).active_logs);
1404
	if (test_opt(sbi, RESERVE_ROOT))
1405
		seq_printf(seq, ",reserve_root=%u,resuid=%u,resgid=%u",
1406 1407 1408 1409 1410
				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));
1411
	if (F2FS_IO_SIZE_BITS(sbi))
1412 1413
		seq_printf(seq, ",io_bits=%u",
				F2FS_OPTION(sbi).write_io_size_bits);
1414
#ifdef CONFIG_F2FS_FAULT_INJECTION
C
Chao Yu 已提交
1415
	if (test_opt(sbi, FAULT_INJECTION)) {
1416
		seq_printf(seq, ",fault_injection=%u",
1417
				F2FS_OPTION(sbi).fault_info.inject_rate);
C
Chao Yu 已提交
1418 1419 1420
		seq_printf(seq, ",fault_type=%u",
				F2FS_OPTION(sbi).fault_info.inject_type);
	}
1421
#endif
C
Chao Yu 已提交
1422
#ifdef CONFIG_QUOTA
C
Chao Yu 已提交
1423 1424
	if (test_opt(sbi, QUOTA))
		seq_puts(seq, ",quota");
C
Chao Yu 已提交
1425 1426 1427 1428
	if (test_opt(sbi, USRQUOTA))
		seq_puts(seq, ",usrquota");
	if (test_opt(sbi, GRPQUOTA))
		seq_puts(seq, ",grpquota");
C
Chao Yu 已提交
1429 1430
	if (test_opt(sbi, PRJQUOTA))
		seq_puts(seq, ",prjquota");
1431
#endif
C
Chao Yu 已提交
1432
	f2fs_show_quota_options(seq, sbi->sb);
1433
	if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_USER)
1434
		seq_printf(seq, ",whint_mode=%s", "user-based");
1435
	else if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_FS)
1436
		seq_printf(seq, ",whint_mode=%s", "fs-based");
1437
#ifdef CONFIG_FS_ENCRYPTION
1438 1439 1440
	if (F2FS_OPTION(sbi).test_dummy_encryption)
		seq_puts(seq, ",test_dummy_encryption");
#endif
J
Jaegeuk Kim 已提交
1441

1442
	if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_DEFAULT)
1443
		seq_printf(seq, ",alloc_mode=%s", "default");
1444
	else if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_REUSE)
1445
		seq_printf(seq, ",alloc_mode=%s", "reuse");
1446

D
Daniel Rosenberg 已提交
1447
	if (test_opt(sbi, DISABLE_CHECKPOINT))
1448 1449
		seq_printf(seq, ",checkpoint=disable:%u",
				F2FS_OPTION(sbi).unusable_cap);
1450
	if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_POSIX)
1451
		seq_printf(seq, ",fsync_mode=%s", "posix");
1452
	else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_STRICT)
1453
		seq_printf(seq, ",fsync_mode=%s", "strict");
1454 1455
	else if (F2FS_OPTION(sbi).fsync_mode == FSYNC_MODE_NOBARRIER)
		seq_printf(seq, ",fsync_mode=%s", "nobarrier");
J
Jaegeuk Kim 已提交
1456 1457 1458
	return 0;
}

1459 1460 1461
static void default_options(struct f2fs_sb_info *sbi)
{
	/* init some FS parameters */
1462 1463 1464 1465 1466
	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;
1467
	F2FS_OPTION(sbi).test_dummy_encryption = false;
1468 1469
	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);
1470 1471

	set_opt(sbi, BG_GC);
C
Chao Yu 已提交
1472
	set_opt(sbi, INLINE_XATTR);
1473
	set_opt(sbi, INLINE_DATA);
1474
	set_opt(sbi, INLINE_DENTRY);
J
Jaegeuk Kim 已提交
1475
	set_opt(sbi, EXTENT_CACHE);
1476
	set_opt(sbi, NOHEAP);
D
Daniel Rosenberg 已提交
1477
	clear_opt(sbi, DISABLE_CHECKPOINT);
1478
	F2FS_OPTION(sbi).unusable_cap = 0;
1479
	sbi->sb->s_flags |= SB_LAZYTIME;
J
Jaegeuk Kim 已提交
1480
	set_opt(sbi, FLUSH_MERGE);
1481
	set_opt(sbi, DISCARD);
1482
	if (f2fs_sb_has_blkzoned(sbi))
1483 1484
		set_opt_mode(sbi, F2FS_MOUNT_LFS);
	else
1485
		set_opt_mode(sbi, F2FS_MOUNT_ADAPTIVE);
1486 1487 1488 1489 1490 1491 1492

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

C
Chao Yu 已提交
1494
	f2fs_build_fault_attr(sbi, 0, 0);
1495 1496
}

J
Jaegeuk Kim 已提交
1497 1498 1499
#ifdef CONFIG_QUOTA
static int f2fs_enable_quotas(struct super_block *sb);
#endif
D
Daniel Rosenberg 已提交
1500 1501 1502

static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
{
1503
	unsigned int s_flags = sbi->sb->s_flags;
D
Daniel Rosenberg 已提交
1504
	struct cp_control cpc;
1505 1506
	int err = 0;
	int ret;
1507
	block_t unusable;
D
Daniel Rosenberg 已提交
1508

1509
	if (s_flags & SB_RDONLY) {
1510
		f2fs_err(sbi, "checkpoint=disable on readonly fs");
1511 1512
		return -EINVAL;
	}
D
Daniel Rosenberg 已提交
1513 1514 1515 1516 1517
	sbi->sb->s_flags |= SB_ACTIVE;

	f2fs_update_time(sbi, DISABLE_TIME);

	while (!f2fs_time_over(sbi, DISABLE_TIME)) {
1518
		mutex_lock(&sbi->gc_mutex);
D
Daniel Rosenberg 已提交
1519
		err = f2fs_gc(sbi, true, false, NULL_SEGNO);
1520 1521
		if (err == -ENODATA) {
			err = 0;
D
Daniel Rosenberg 已提交
1522
			break;
1523
		}
1524
		if (err && err != -EAGAIN)
1525
			break;
D
Daniel Rosenberg 已提交
1526 1527
	}

1528 1529 1530 1531 1532
	ret = sync_filesystem(sbi->sb);
	if (ret || err) {
		err = ret ? ret: err;
		goto restore_flag;
	}
D
Daniel Rosenberg 已提交
1533

1534 1535
	unusable = f2fs_get_unusable_blocks(sbi);
	if (f2fs_disable_cp_again(sbi, unusable)) {
1536 1537 1538
		err = -EAGAIN;
		goto restore_flag;
	}
D
Daniel Rosenberg 已提交
1539 1540 1541 1542

	mutex_lock(&sbi->gc_mutex);
	cpc.reason = CP_PAUSE;
	set_sbi_flag(sbi, SBI_CP_DISABLED);
1543 1544 1545
	err = f2fs_write_checkpoint(sbi, &cpc);
	if (err)
		goto out_unlock;
D
Daniel Rosenberg 已提交
1546

1547
	spin_lock(&sbi->stat_lock);
1548
	sbi->unusable_block_count = unusable;
1549 1550
	spin_unlock(&sbi->stat_lock);

1551
out_unlock:
D
Daniel Rosenberg 已提交
1552
	mutex_unlock(&sbi->gc_mutex);
1553 1554 1555
restore_flag:
	sbi->sb->s_flags = s_flags;	/* Restore MS_RDONLY status */
	return err;
D
Daniel Rosenberg 已提交
1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569
}

static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
{
	mutex_lock(&sbi->gc_mutex);
	f2fs_dirty_to_prefree(sbi);

	clear_sbi_flag(sbi, SBI_CP_DISABLED);
	set_sbi_flag(sbi, SBI_IS_DIRTY);
	mutex_unlock(&sbi->gc_mutex);

	f2fs_sync_fs(sbi->sb, 1);
}

1570 1571 1572 1573
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 已提交
1574
	unsigned long old_sb_flags;
1575
	int err;
1576 1577
	bool need_restart_gc = false;
	bool need_stop_gc = false;
1578
	bool no_extent_cache = !test_opt(sbi, EXTENT_CACHE);
D
Daniel Rosenberg 已提交
1579
	bool disable_checkpoint = test_opt(sbi, DISABLE_CHECKPOINT);
1580
	bool no_io_align = !F2FS_IO_ALIGNED(sbi);
D
Daniel Rosenberg 已提交
1581
	bool checkpoint_changed;
C
Chao Yu 已提交
1582 1583 1584
#ifdef CONFIG_QUOTA
	int i, j;
#endif
1585 1586 1587 1588 1589 1590

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

C
Chao Yu 已提交
1593
#ifdef CONFIG_QUOTA
1594
	org_mount_opt.s_jquota_fmt = F2FS_OPTION(sbi).s_jquota_fmt;
C
Chao Yu 已提交
1595
	for (i = 0; i < MAXQUOTAS; i++) {
1596 1597 1598 1599 1600
		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 已提交
1601
				for (j = 0; j < i; j++)
1602
					kvfree(org_mount_opt.s_qf_names[j]);
C
Chao Yu 已提交
1603 1604 1605
				return -ENOMEM;
			}
		} else {
1606
			org_mount_opt.s_qf_names[i] = NULL;
C
Chao Yu 已提交
1607 1608 1609 1610
		}
	}
#endif

1611
	/* recover superblocks we couldn't write due to previous RO mount */
1612
	if (!(*flags & SB_RDONLY) && is_sbi_flag_set(sbi, SBI_NEED_SB_WRITE)) {
1613
		err = f2fs_commit_super(sbi, false);
1614 1615
		f2fs_info(sbi, "Try to recover all the superblocks, ret: %d",
			  err);
1616 1617 1618 1619
		if (!err)
			clear_sbi_flag(sbi, SBI_NEED_SB_WRITE);
	}

1620
	default_options(sbi);
1621

1622 1623 1624 1625
	/* parse mount options */
	err = parse_options(sb, data);
	if (err)
		goto restore_opts;
D
Daniel Rosenberg 已提交
1626 1627
	checkpoint_changed =
			disable_checkpoint != test_opt(sbi, DISABLE_CHECKPOINT);
1628 1629 1630

	/*
	 * Previous and new state of filesystem is RO,
1631
	 * so skip checking GC and FLUSH_MERGE conditions.
1632
	 */
1633
	if (f2fs_readonly(sb) && (*flags & SB_RDONLY))
1634 1635
		goto skip;

J
Jaegeuk Kim 已提交
1636
#ifdef CONFIG_QUOTA
1637
	if (!f2fs_readonly(sb) && (*flags & SB_RDONLY)) {
C
Chao Yu 已提交
1638 1639 1640
		err = dquot_suspend(sb, -1);
		if (err < 0)
			goto restore_opts;
D
Daniel Rosenberg 已提交
1641
	} else if (f2fs_readonly(sb) && !(*flags & SB_RDONLY)) {
C
Chao Yu 已提交
1642
		/* dquot_resume needs RW */
1643
		sb->s_flags &= ~SB_RDONLY;
J
Jaegeuk Kim 已提交
1644 1645
		if (sb_any_quota_suspended(sb)) {
			dquot_resume(sb, -1);
1646
		} else if (f2fs_sb_has_quota_ino(sbi)) {
J
Jaegeuk Kim 已提交
1647 1648 1649 1650
			err = f2fs_enable_quotas(sb);
			if (err)
				goto restore_opts;
		}
C
Chao Yu 已提交
1651
	}
J
Jaegeuk Kim 已提交
1652
#endif
1653 1654 1655
	/* disallow enable/disable extent_cache dynamically */
	if (no_extent_cache == !!test_opt(sbi, EXTENT_CACHE)) {
		err = -EINVAL;
1656
		f2fs_warn(sbi, "switch extent_cache option is not allowed");
1657 1658 1659
		goto restore_opts;
	}

1660 1661 1662 1663 1664 1665
	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 已提交
1666 1667
	if ((*flags & SB_RDONLY) && test_opt(sbi, DISABLE_CHECKPOINT)) {
		err = -EINVAL;
1668
		f2fs_warn(sbi, "disabling checkpoint not compatible with read-only");
D
Daniel Rosenberg 已提交
1669 1670 1671
		goto restore_opts;
	}

1672 1673 1674 1675 1676
	/*
	 * 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.
	 */
1677
	if ((*flags & SB_RDONLY) || !test_opt(sbi, BG_GC)) {
1678
		if (sbi->gc_thread) {
C
Chao Yu 已提交
1679
			f2fs_stop_gc_thread(sbi);
1680
			need_restart_gc = true;
1681
		}
1682
	} else if (!sbi->gc_thread) {
C
Chao Yu 已提交
1683
		err = f2fs_start_gc_thread(sbi);
1684 1685
		if (err)
			goto restore_opts;
1686 1687 1688
		need_stop_gc = true;
	}

1689 1690
	if (*flags & SB_RDONLY ||
		F2FS_OPTION(sbi).whint_mode != org_mount_opt.whint_mode) {
1691 1692 1693 1694 1695 1696 1697 1698 1699
		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 已提交
1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
	if (checkpoint_changed) {
		if (test_opt(sbi, DISABLE_CHECKPOINT)) {
			err = f2fs_disable_checkpoint(sbi);
			if (err)
				goto restore_gc;
		} else {
			f2fs_enable_checkpoint(sbi);
		}
	}

1710 1711 1712 1713
	/*
	 * We stop issue flush thread if FS is mounted as RO
	 * or if flush_merge is not passed in mount option.
	 */
1714
	if ((*flags & SB_RDONLY) || !test_opt(sbi, FLUSH_MERGE)) {
1715
		clear_opt(sbi, FLUSH_MERGE);
C
Chao Yu 已提交
1716
		f2fs_destroy_flush_cmd_control(sbi, false);
1717
	} else {
C
Chao Yu 已提交
1718
		err = f2fs_create_flush_cmd_control(sbi);
1719
		if (err)
1720
			goto restore_gc;
1721 1722
	}
skip:
C
Chao Yu 已提交
1723 1724 1725
#ifdef CONFIG_QUOTA
	/* Release old quota file names */
	for (i = 0; i < MAXQUOTAS; i++)
1726
		kvfree(org_mount_opt.s_qf_names[i]);
C
Chao Yu 已提交
1727
#endif
1728
	/* Update the POSIXACL Flag */
1729 1730
	sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
		(test_opt(sbi, POSIX_ACL) ? SB_POSIXACL : 0);
1731

1732
	limit_reserve_root(sbi);
J
Jaegeuk Kim 已提交
1733
	*flags = (*flags & ~SB_LAZYTIME) | (sb->s_flags & SB_LAZYTIME);
1734
	return 0;
1735 1736
restore_gc:
	if (need_restart_gc) {
C
Chao Yu 已提交
1737
		if (f2fs_start_gc_thread(sbi))
1738
			f2fs_warn(sbi, "background gc thread has stopped");
1739
	} else if (need_stop_gc) {
C
Chao Yu 已提交
1740
		f2fs_stop_gc_thread(sbi);
1741
	}
1742
restore_opts:
C
Chao Yu 已提交
1743
#ifdef CONFIG_QUOTA
1744
	F2FS_OPTION(sbi).s_jquota_fmt = org_mount_opt.s_jquota_fmt;
C
Chao Yu 已提交
1745
	for (i = 0; i < MAXQUOTAS; i++) {
1746
		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
1747
		F2FS_OPTION(sbi).s_qf_names[i] = org_mount_opt.s_qf_names[i];
C
Chao Yu 已提交
1748 1749
	}
#endif
1750
	sbi->mount_opt = org_mount_opt;
C
Chao Yu 已提交
1751
	sb->s_flags = old_sb_flags;
1752 1753 1754
	return err;
}

C
Chao Yu 已提交
1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778
#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:
1779
		page = read_cache_page_gfp(mapping, blkidx, GFP_NOFS);
1780 1781 1782 1783 1784
		if (IS_ERR(page)) {
			if (PTR_ERR(page) == -ENOMEM) {
				congestion_wait(BLK_RW_ASYNC, HZ/50);
				goto repeat;
			}
1785
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
C
Chao Yu 已提交
1786
			return PTR_ERR(page);
1787
		}
C
Chao Yu 已提交
1788 1789 1790 1791 1792 1793 1794 1795 1796

		lock_page(page);

		if (unlikely(page->mapping != mapping)) {
			f2fs_put_page(page, 1);
			goto repeat;
		}
		if (unlikely(!PageUptodate(page))) {
			f2fs_put_page(page, 1);
1797
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
C
Chao Yu 已提交
1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830
			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);
1831
retry:
C
Chao Yu 已提交
1832 1833
		err = a_ops->write_begin(NULL, mapping, off, tocopy, 0,
							&page, NULL);
1834 1835 1836 1837 1838
		if (unlikely(err)) {
			if (err == -ENOMEM) {
				congestion_wait(BLK_RW_ASYNC, HZ/50);
				goto retry;
			}
1839
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
C
Chao Yu 已提交
1840
			break;
1841
		}
C
Chao Yu 已提交
1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857

		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)
1858
		return err;
C
Chao Yu 已提交
1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873
	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 已提交
1874 1875
static int f2fs_quota_on_mount(struct f2fs_sb_info *sbi, int type)
{
1876
	if (is_set_ckpt_flags(sbi, CP_QUOTA_NEED_FSCK_FLAG)) {
1877
		f2fs_err(sbi, "quota sysfile may be corrupted, skip loading it");
1878 1879 1880
		return 0;
	}

1881 1882
	return dquot_quota_on_mount(sbi->sb, F2FS_OPTION(sbi).s_qf_names[type],
					F2FS_OPTION(sbi).s_jquota_fmt, type);
C
Chao Yu 已提交
1883 1884
}

J
Jaegeuk Kim 已提交
1885
int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly)
C
Chao Yu 已提交
1886
{
J
Jaegeuk Kim 已提交
1887 1888 1889
	int enabled = 0;
	int i, err;

1890
	if (f2fs_sb_has_quota_ino(sbi) && rdonly) {
J
Jaegeuk Kim 已提交
1891 1892
		err = f2fs_enable_quotas(sbi->sb);
		if (err) {
1893
			f2fs_err(sbi, "Cannot turn on quota_ino: %d", err);
J
Jaegeuk Kim 已提交
1894 1895 1896 1897
			return 0;
		}
		return 1;
	}
C
Chao Yu 已提交
1898 1899

	for (i = 0; i < MAXQUOTAS; i++) {
1900
		if (F2FS_OPTION(sbi).s_qf_names[i]) {
J
Jaegeuk Kim 已提交
1901 1902 1903 1904 1905
			err = f2fs_quota_on_mount(sbi, i);
			if (!err) {
				enabled = 1;
				continue;
			}
1906 1907
			f2fs_err(sbi, "Cannot turn on quotas: %d on %d",
				 err, i);
C
Chao Yu 已提交
1908 1909
		}
	}
J
Jaegeuk Kim 已提交
1910 1911 1912 1913 1914 1915 1916 1917 1918 1919
	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;

1920
	BUG_ON(!f2fs_sb_has_quota_ino(F2FS_SB(sb)));
J
Jaegeuk Kim 已提交
1921 1922 1923 1924 1925 1926 1927

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

	qf_inode = f2fs_iget(sb, qf_inum);
	if (IS_ERR(qf_inode)) {
1928
		f2fs_err(F2FS_SB(sb), "Bad quota inode %u:%lu", type, qf_inum);
J
Jaegeuk Kim 已提交
1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940
		return PTR_ERR(qf_inode);
	}

	/* Don't account quota for quota files to avoid recursion */
	qf_inode->i_flags |= S_NOQUOTA;
	err = dquot_enable(qf_inode, type, format_id, flags);
	iput(qf_inode);
	return err;
}

static int f2fs_enable_quotas(struct super_block *sb)
{
1941
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
J
Jaegeuk Kim 已提交
1942 1943 1944
	int type, err = 0;
	unsigned long qf_inum;
	bool quota_mopt[MAXQUOTAS] = {
1945 1946 1947
		test_opt(sbi, USRQUOTA),
		test_opt(sbi, GRPQUOTA),
		test_opt(sbi, PRJQUOTA),
J
Jaegeuk Kim 已提交
1948 1949
	};

1950
	if (is_set_ckpt_flags(F2FS_SB(sb), CP_QUOTA_NEED_FSCK_FLAG)) {
1951
		f2fs_err(sbi, "quota file may be corrupted, skip loading it");
1952 1953 1954 1955 1956
		return 0;
	}

	sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;

J
Jaegeuk Kim 已提交
1957 1958 1959 1960 1961 1962 1963
	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) {
1964 1965
				f2fs_err(sbi, "Failed to enable quota tracking (type=%d, err=%d). Please run fsck to fix.",
					 type, err);
J
Jaegeuk Kim 已提交
1966 1967
				for (type--; type >= 0; type--)
					dquot_quota_off(sb, type);
1968 1969
				set_sbi_flag(F2FS_SB(sb),
						SBI_QUOTA_NEED_REPAIR);
J
Jaegeuk Kim 已提交
1970 1971
				return err;
			}
C
Chao Yu 已提交
1972 1973
		}
	}
J
Jaegeuk Kim 已提交
1974
	return 0;
C
Chao Yu 已提交
1975 1976
}

1977
int f2fs_quota_sync(struct super_block *sb, int type)
C
Chao Yu 已提交
1978
{
1979
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
C
Chao Yu 已提交
1980 1981 1982 1983
	struct quota_info *dqopt = sb_dqopt(sb);
	int cnt;
	int ret;

1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995
	/*
	 * 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 已提交
1996 1997
	ret = dquot_writeback_dquots(sb, type);
	if (ret)
1998
		goto out;
C
Chao Yu 已提交
1999 2000 2001 2002 2003 2004

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

C
Chao Yu 已提交
2007 2008 2009 2010 2011
		if (type != -1 && cnt != type)
			continue;
		if (!sb_has_quota_active(sb, cnt))
			continue;

2012 2013 2014
		mapping = dqopt->files[cnt]->i_mapping;

		ret = filemap_fdatawrite(mapping);
C
Chao Yu 已提交
2015
		if (ret)
2016 2017 2018 2019 2020 2021 2022 2023 2024
			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 已提交
2025 2026 2027 2028 2029

		inode_lock(dqopt->files[cnt]);
		truncate_inode_pages(&dqopt->files[cnt]->i_data, 0);
		inode_unlock(dqopt->files[cnt]);
	}
2030 2031 2032
out:
	if (ret)
		set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
2033 2034
	up_read(&sbi->quota_sem);
	f2fs_unlock_op(sbi);
2035
	return ret;
C
Chao Yu 已提交
2036 2037 2038 2039 2040 2041 2042 2043
}

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

2044 2045 2046 2047 2048 2049
	/* 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;
	}

2050
	err = f2fs_quota_sync(sb, type);
C
Chao Yu 已提交
2051 2052 2053 2054 2055 2056 2057 2058 2059 2060
	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);
2061
	F2FS_I(inode)->i_flags |= F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL;
C
Chao Yu 已提交
2062
	f2fs_set_inode_flags(inode);
C
Chao Yu 已提交
2063 2064 2065 2066 2067 2068
	inode_unlock(inode);
	f2fs_mark_inode_dirty_sync(inode, false);

	return 0;
}

2069
static int __f2fs_quota_off(struct super_block *sb, int type)
C
Chao Yu 已提交
2070 2071 2072 2073 2074 2075 2076
{
	struct inode *inode = sb_dqopt(sb)->files[type];
	int err;

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

2077 2078 2079
	err = f2fs_quota_sync(sb, type);
	if (err)
		goto out_put;
C
Chao Yu 已提交
2080 2081

	err = dquot_quota_off(sb, type);
2082
	if (err || f2fs_sb_has_quota_ino(F2FS_SB(sb)))
C
Chao Yu 已提交
2083 2084 2085
		goto out_put;

	inode_lock(inode);
2086
	F2FS_I(inode)->i_flags &= ~(F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL);
C
Chao Yu 已提交
2087
	f2fs_set_inode_flags(inode);
C
Chao Yu 已提交
2088 2089 2090 2091 2092 2093 2094
	inode_unlock(inode);
	f2fs_mark_inode_dirty_sync(inode, false);
out_put:
	iput(inode);
	return err;
}

2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111
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 已提交
2112
void f2fs_quota_off_umount(struct super_block *sb)
C
Chao Yu 已提交
2113 2114
{
	int type;
2115 2116 2117
	int err;

	for (type = 0; type < MAXQUOTAS; type++) {
2118
		err = __f2fs_quota_off(sb, type);
2119 2120
		if (err) {
			int ret = dquot_quota_off(sb, type);
C
Chao Yu 已提交
2121

2122 2123
			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);
2124
			set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR);
2125 2126
		}
	}
2127 2128 2129 2130 2131 2132
	/*
	 * 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 已提交
2133 2134
}

2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146
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]);
	}
}

2147 2148
static int f2fs_dquot_commit(struct dquot *dquot)
{
2149
	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
2150 2151
	int ret;

2152
	down_read(&sbi->quota_sem);
2153 2154
	ret = dquot_commit(dquot);
	if (ret < 0)
2155 2156
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	up_read(&sbi->quota_sem);
2157 2158 2159 2160 2161
	return ret;
}

static int f2fs_dquot_acquire(struct dquot *dquot)
{
2162
	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
2163 2164
	int ret;

2165
	down_read(&sbi->quota_sem);
2166 2167
	ret = dquot_acquire(dquot);
	if (ret < 0)
2168 2169
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	up_read(&sbi->quota_sem);
2170 2171 2172 2173 2174
	return ret;
}

static int f2fs_dquot_release(struct dquot *dquot)
{
2175
	struct f2fs_sb_info *sbi = F2FS_SB(dquot->dq_sb);
2176 2177
	int ret;

2178
	down_read(&sbi->quota_sem);
2179 2180
	ret = dquot_release(dquot);
	if (ret < 0)
2181 2182
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	up_read(&sbi->quota_sem);
2183 2184 2185 2186 2187 2188 2189 2190 2191
	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);
	int ret;

2192
	down_read(&sbi->quota_sem);
2193 2194 2195 2196 2197 2198
	ret = dquot_mark_dquot_dirty(dquot);

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

2199
	up_read(&sbi->quota_sem);
2200 2201 2202 2203 2204
	return ret;
}

static int f2fs_dquot_commit_info(struct super_block *sb, int type)
{
2205
	struct f2fs_sb_info *sbi = F2FS_SB(sb);
2206 2207
	int ret;

2208
	down_read(&sbi->quota_sem);
2209 2210
	ret = dquot_commit_info(sb, type);
	if (ret < 0)
2211 2212
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	up_read(&sbi->quota_sem);
2213 2214
	return ret;
}
2215

W
Wei Yongjun 已提交
2216
static int f2fs_get_projid(struct inode *inode, kprojid_t *projid)
C
Chao Yu 已提交
2217 2218 2219 2220 2221
{
	*projid = F2FS_I(inode)->i_projid;
	return 0;
}

C
Chao Yu 已提交
2222 2223
static const struct dquot_operations f2fs_quota_operations = {
	.get_reserved_space = f2fs_get_reserved_space,
2224 2225 2226 2227 2228
	.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 已提交
2229 2230
	.alloc_dquot	= dquot_alloc,
	.destroy_dquot	= dquot_destroy,
C
Chao Yu 已提交
2231
	.get_projid	= f2fs_get_projid,
C
Chao Yu 已提交
2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245
	.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
2246 2247 2248 2249 2250
int f2fs_quota_sync(struct super_block *sb, int type)
{
	return 0;
}

C
Chao Yu 已提交
2251
void f2fs_quota_off_umount(struct super_block *sb)
C
Chao Yu 已提交
2252 2253 2254 2255
{
}
#endif

A
Arvind Yadav 已提交
2256
static const struct super_operations f2fs_sops = {
J
Jaegeuk Kim 已提交
2257
	.alloc_inode	= f2fs_alloc_inode,
A
Al Viro 已提交
2258
	.free_inode	= f2fs_free_inode,
2259
	.drop_inode	= f2fs_drop_inode,
J
Jaegeuk Kim 已提交
2260
	.write_inode	= f2fs_write_inode,
2261
	.dirty_inode	= f2fs_dirty_inode,
J
Jaegeuk Kim 已提交
2262
	.show_options	= f2fs_show_options,
C
Chao Yu 已提交
2263 2264 2265 2266 2267
#ifdef CONFIG_QUOTA
	.quota_read	= f2fs_quota_read,
	.quota_write	= f2fs_quota_write,
	.get_dquots	= f2fs_get_dquots,
#endif
J
Jaegeuk Kim 已提交
2268 2269 2270
	.evict_inode	= f2fs_evict_inode,
	.put_super	= f2fs_put_super,
	.sync_fs	= f2fs_sync_fs,
2271 2272
	.freeze_fs	= f2fs_freeze,
	.unfreeze_fs	= f2fs_unfreeze,
J
Jaegeuk Kim 已提交
2273
	.statfs		= f2fs_statfs,
2274
	.remount_fs	= f2fs_remount,
J
Jaegeuk Kim 已提交
2275 2276
};

2277
#ifdef CONFIG_FS_ENCRYPTION
2278 2279 2280 2281 2282 2283 2284 2285 2286 2287
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)
{
2288 2289 2290 2291 2292 2293 2294 2295
	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.
	 *
	 */
2296
	if (f2fs_sb_has_lost_found(sbi) &&
2297 2298 2299
			inode->i_ino == F2FS_ROOT_INO(sbi))
		return -EPERM;

2300 2301 2302 2303 2304
	return f2fs_setxattr(inode, F2FS_XATTR_INDEX_ENCRYPTION,
				F2FS_XATTR_NAME_ENCRYPTION_CONTEXT,
				ctx, len, fs_data, XATTR_CREATE);
}

2305 2306 2307 2308 2309
static bool f2fs_dummy_context(struct inode *inode)
{
	return DUMMY_ENCRYPTION_ENABLED(F2FS_I_SB(inode));
}

2310
static const struct fscrypt_operations f2fs_cryptops = {
2311
	.key_prefix	= "f2fs:",
2312 2313
	.get_context	= f2fs_get_context,
	.set_context	= f2fs_set_context,
2314
	.dummy_context	= f2fs_dummy_context,
2315
	.empty_dir	= f2fs_empty_dir,
2316
	.max_namelen	= F2FS_NAME_LEN,
2317 2318 2319
};
#endif

J
Jaegeuk Kim 已提交
2320 2321 2322 2323 2324 2325
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 已提交
2326
	if (f2fs_check_nid_range(sbi, ino))
2327
		return ERR_PTR(-ESTALE);
J
Jaegeuk Kim 已提交
2328 2329 2330 2331 2332 2333 2334 2335 2336

	/*
	 * 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);
2337
	if (unlikely(generation && inode->i_generation != generation)) {
J
Jaegeuk Kim 已提交
2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364
		/* 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 已提交
2365
static loff_t max_file_blocks(void)
J
Jaegeuk Kim 已提交
2366
{
2367
	loff_t result = 0;
2368
	loff_t leaf_count = DEF_ADDRS_PER_BLOCK;
J
Jaegeuk Kim 已提交
2369

2370 2371
	/*
	 * note: previously, result is equal to (DEF_ADDRS_PER_INODE -
C
Chao Yu 已提交
2372
	 * DEFAULT_INLINE_XATTR_ADDRS), but now f2fs try to reserve more
2373 2374 2375 2376
	 * space in inode.i_addr, it will be more safe to reassign
	 * result as zero.
	 */

J
Jaegeuk Kim 已提交
2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390
	/* 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;
}

2391 2392 2393 2394 2395 2396 2397 2398 2399 2400
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 */
2401
	return __sync_dirty_buffer(bh, REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
2402 2403
}

2404
static inline bool sanity_check_area_boundary(struct f2fs_sb_info *sbi,
2405
					struct buffer_head *bh)
2406
{
2407 2408
	struct f2fs_super_block *raw_super = (struct f2fs_super_block *)
					(bh->b_data + F2FS_SUPER_OFFSET);
2409
	struct super_block *sb = sbi->sb;
2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422
	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);
2423 2424 2425 2426
	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);
2427 2428

	if (segment0_blkaddr != cp_blkaddr) {
2429 2430
		f2fs_info(sbi, "Mismatch start address, segment0(%u) cp_blkaddr(%u)",
			  segment0_blkaddr, cp_blkaddr);
2431 2432 2433 2434 2435
		return true;
	}

	if (cp_blkaddr + (segment_count_ckpt << log_blocks_per_seg) !=
							sit_blkaddr) {
2436 2437 2438
		f2fs_info(sbi, "Wrong CP boundary, start(%u) end(%u) blocks(%u)",
			  cp_blkaddr, sit_blkaddr,
			  segment_count_ckpt << log_blocks_per_seg);
2439 2440 2441 2442 2443
		return true;
	}

	if (sit_blkaddr + (segment_count_sit << log_blocks_per_seg) !=
							nat_blkaddr) {
2444 2445 2446
		f2fs_info(sbi, "Wrong SIT boundary, start(%u) end(%u) blocks(%u)",
			  sit_blkaddr, nat_blkaddr,
			  segment_count_sit << log_blocks_per_seg);
2447 2448 2449 2450 2451
		return true;
	}

	if (nat_blkaddr + (segment_count_nat << log_blocks_per_seg) !=
							ssa_blkaddr) {
2452 2453 2454
		f2fs_info(sbi, "Wrong NAT boundary, start(%u) end(%u) blocks(%u)",
			  nat_blkaddr, ssa_blkaddr,
			  segment_count_nat << log_blocks_per_seg);
2455 2456 2457 2458 2459
		return true;
	}

	if (ssa_blkaddr + (segment_count_ssa << log_blocks_per_seg) !=
							main_blkaddr) {
2460 2461 2462
		f2fs_info(sbi, "Wrong SSA boundary, start(%u) end(%u) blocks(%u)",
			  ssa_blkaddr, main_blkaddr,
			  segment_count_ssa << log_blocks_per_seg);
2463 2464 2465
		return true;
	}

2466
	if (main_end_blkaddr > seg_end_blkaddr) {
2467 2468 2469 2470 2471
		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);
2472
		return true;
2473 2474 2475 2476 2477 2478 2479 2480 2481
	} 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)) {
2482
			set_sbi_flag(sbi, SBI_NEED_SB_WRITE);
2483 2484 2485 2486 2487
			res = "internally";
		} else {
			err = __f2fs_commit_super(bh, NULL);
			res = err ? "failed" : "done";
		}
2488 2489 2490 2491 2492
		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);
2493 2494
		if (err)
			return true;
2495 2496 2497 2498
	}
	return false;
}

2499
static int sanity_check_raw_super(struct f2fs_sb_info *sbi,
2500
				struct buffer_head *bh)
J
Jaegeuk Kim 已提交
2501
{
2502 2503
	block_t segment_count, segs_per_sec, secs_per_zone;
	block_t total_sections, blocks_per_seg;
2504 2505
	struct f2fs_super_block *raw_super = (struct f2fs_super_block *)
					(bh->b_data + F2FS_SUPER_OFFSET);
J
Jaegeuk Kim 已提交
2506
	unsigned int blocksize;
2507 2508 2509
	size_t crc_offset = 0;
	__u32 crc = 0;

2510 2511 2512 2513 2514 2515
	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;
	}

2516
	/* Check checksum_offset and crc in superblock */
2517
	if (__F2FS_HAS_FEATURE(raw_super, F2FS_FEATURE_SB_CHKSUM)) {
2518 2519 2520
		crc_offset = le32_to_cpu(raw_super->checksum_offset);
		if (crc_offset !=
			offsetof(struct f2fs_super_block, crc)) {
2521 2522
			f2fs_info(sbi, "Invalid SB checksum offset: %zu",
				  crc_offset);
2523
			return -EFSCORRUPTED;
2524 2525 2526
		}
		crc = le32_to_cpu(raw_super->crc);
		if (!f2fs_crc_valid(sbi, crc, raw_super, crc_offset)) {
2527
			f2fs_info(sbi, "Invalid SB checksum value: %u", crc);
2528
			return -EFSCORRUPTED;
2529 2530
		}
	}
J
Jaegeuk Kim 已提交
2531

2532
	/* Currently, support only 4KB page cache size */
2533
	if (F2FS_BLKSIZE != PAGE_SIZE) {
2534 2535
		f2fs_info(sbi, "Invalid page_cache_size (%lu), supports only 4KB",
			  PAGE_SIZE);
2536
		return -EFSCORRUPTED;
2537 2538
	}

J
Jaegeuk Kim 已提交
2539 2540
	/* Currently, support only 4KB block size */
	blocksize = 1 << le32_to_cpu(raw_super->log_blocksize);
2541
	if (blocksize != F2FS_BLKSIZE) {
2542 2543
		f2fs_info(sbi, "Invalid blocksize (%u), supports only 4KB",
			  blocksize);
2544
		return -EFSCORRUPTED;
2545
	}
2546

2547 2548
	/* check log blocks per segment */
	if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) {
2549 2550
		f2fs_info(sbi, "Invalid log blocks per segment (%u)",
			  le32_to_cpu(raw_super->log_blocks_per_seg));
2551
		return -EFSCORRUPTED;
2552 2553
	}

C
Chao Yu 已提交
2554 2555 2556 2557 2558
	/* 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) {
2559 2560
		f2fs_info(sbi, "Invalid log sectorsize (%u)",
			  le32_to_cpu(raw_super->log_sectorsize));
2561
		return -EFSCORRUPTED;
2562
	}
C
Chao Yu 已提交
2563 2564 2565
	if (le32_to_cpu(raw_super->log_sectors_per_block) +
		le32_to_cpu(raw_super->log_sectorsize) !=
			F2FS_MAX_LOG_SECTOR_SIZE) {
2566 2567 2568
		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));
2569
		return -EFSCORRUPTED;
2570
	}
2571

2572 2573 2574 2575 2576 2577 2578 2579 2580 2581
	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) {
2582
		f2fs_info(sbi, "Invalid segment count (%u)", segment_count);
2583
		return -EFSCORRUPTED;
2584 2585 2586 2587 2588
	}

	if (total_sections > segment_count ||
			total_sections < F2FS_MIN_SEGMENTS ||
			segs_per_sec > segment_count || !segs_per_sec) {
2589 2590
		f2fs_info(sbi, "Invalid segment/section count (%u, %u x %u)",
			  segment_count, total_sections, segs_per_sec);
2591
		return -EFSCORRUPTED;
2592 2593 2594
	}

	if ((segment_count / segs_per_sec) < total_sections) {
2595 2596
		f2fs_info(sbi, "Small segment_count (%u < %u * %u)",
			  segment_count, segs_per_sec, total_sections);
2597
		return -EFSCORRUPTED;
2598 2599
	}

2600
	if (segment_count > (le64_to_cpu(raw_super->block_count) >> 9)) {
2601 2602
		f2fs_info(sbi, "Wrong segment_count / block_count (%u > %llu)",
			  segment_count, le64_to_cpu(raw_super->block_count));
2603
		return -EFSCORRUPTED;
2604 2605
	}

2606
	if (secs_per_zone > total_sections || !secs_per_zone) {
2607 2608
		f2fs_info(sbi, "Wrong secs_per_zone / total_sections (%u, %u)",
			  secs_per_zone, total_sections);
2609
		return -EFSCORRUPTED;
2610 2611 2612 2613 2614
	}
	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) {
2615 2616 2617 2618
		f2fs_info(sbi, "Corrupted extension count (%u + %u > %u)",
			  le32_to_cpu(raw_super->extension_count),
			  raw_super->hot_ext_count,
			  F2FS_MAX_EXTENSION);
2619
		return -EFSCORRUPTED;
2620 2621 2622 2623
	}

	if (le32_to_cpu(raw_super->cp_payload) >
				(blocks_per_seg - F2FS_CP_PACKS)) {
2624 2625 2626
		f2fs_info(sbi, "Insane cp_payload (%u > %u)",
			  le32_to_cpu(raw_super->cp_payload),
			  blocks_per_seg - F2FS_CP_PACKS);
2627
		return -EFSCORRUPTED;
2628 2629
	}

2630 2631 2632 2633
	/* 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) {
2634 2635 2636 2637
		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));
2638
		return -EFSCORRUPTED;
2639 2640 2641
	}

	/* check CP/SIT/NAT/SSA/MAIN_AREA area boundary */
2642
	if (sanity_check_area_boundary(sbi, bh))
2643
		return -EFSCORRUPTED;
2644

J
Jaegeuk Kim 已提交
2645 2646 2647
	return 0;
}

C
Chao Yu 已提交
2648
int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi)
J
Jaegeuk Kim 已提交
2649 2650
{
	unsigned int total, fsmeta;
2651 2652
	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
J
Jaegeuk Kim 已提交
2653
	unsigned int ovp_segments, reserved_segments;
2654
	unsigned int main_segs, blocks_per_seg;
2655 2656 2657
	unsigned int sit_segs, nat_segs;
	unsigned int sit_bitmap_size, nat_bitmap_size;
	unsigned int log_blocks_per_seg;
2658
	unsigned int segment_count_main;
2659
	unsigned int cp_pack_start_sum, cp_payload;
2660 2661
	block_t user_block_count, valid_user_blocks;
	block_t avail_node_count, valid_node_count;
2662
	int i, j;
J
Jaegeuk Kim 已提交
2663 2664 2665

	total = le32_to_cpu(raw_super->segment_count);
	fsmeta = le32_to_cpu(raw_super->segment_count_ckpt);
2666 2667 2668 2669
	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 已提交
2670 2671 2672
	fsmeta += le32_to_cpu(ckpt->rsvd_segment_count);
	fsmeta += le32_to_cpu(raw_super->segment_count_ssa);

2673
	if (unlikely(fsmeta >= total))
J
Jaegeuk Kim 已提交
2674
		return 1;
2675

J
Jaegeuk Kim 已提交
2676 2677 2678 2679 2680
	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)) {
2681
		f2fs_err(sbi, "Wrong layout: check mkfs.f2fs version");
J
Jaegeuk Kim 已提交
2682 2683 2684
		return 1;
	}

2685 2686 2687 2688 2689
	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) {
2690 2691
		f2fs_err(sbi, "Wrong user_block_count: %u",
			 user_block_count);
2692 2693 2694
		return 1;
	}

2695 2696
	valid_user_blocks = le64_to_cpu(ckpt->valid_block_count);
	if (valid_user_blocks > user_block_count) {
2697 2698
		f2fs_err(sbi, "Wrong valid_user_blocks: %u, user_block_count: %u",
			 valid_user_blocks, user_block_count);
2699 2700 2701 2702 2703 2704 2705
		return 1;
	}

	valid_node_count = le32_to_cpu(ckpt->valid_node_count);
	avail_node_count = sbi->total_node_count - sbi->nquota_files -
						F2FS_RESERVED_NODE_NUM;
	if (valid_node_count > avail_node_count) {
2706 2707
		f2fs_err(sbi, "Wrong valid_node_count: %u, avail_node_count: %u",
			 valid_node_count, avail_node_count);
2708 2709 2710
		return 1;
	}

2711 2712 2713 2714 2715 2716 2717
	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;
2718 2719 2720
		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])) {
2721 2722 2723
				f2fs_err(sbi, "Node segment (%u, %u) has the same segno: %u",
					 i, j,
					 le32_to_cpu(ckpt->cur_node_segno[i]));
2724 2725 2726
				return 1;
			}
		}
2727 2728 2729 2730 2731
	}
	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;
2732 2733 2734
		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])) {
2735 2736 2737
				f2fs_err(sbi, "Data segment (%u, %u) has the same segno: %u",
					 i, j,
					 le32_to_cpu(ckpt->cur_data_segno[i]));
2738 2739 2740 2741 2742 2743 2744 2745
				return 1;
			}
		}
	}
	for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
		for (j = i; j < NR_CURSEG_DATA_TYPE; j++) {
			if (le32_to_cpu(ckpt->cur_node_segno[i]) ==
				le32_to_cpu(ckpt->cur_data_segno[j])) {
2746 2747 2748
				f2fs_err(sbi, "Data segment (%u) and Data segment (%u) has the same segno: %u",
					 i, j,
					 le32_to_cpu(ckpt->cur_node_segno[i]));
2749 2750 2751
				return 1;
			}
		}
2752 2753
	}

2754 2755 2756 2757 2758
	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) {
2759 2760
		f2fs_err(sbi, "Wrong bitmap size: sit: %u, nat:%u",
			 sit_bitmap_size, nat_bitmap_size);
2761 2762
		return 1;
	}
2763 2764 2765 2766 2767 2768

	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) {
2769 2770
		f2fs_err(sbi, "Wrong cp_pack_start_sum: %u",
			 cp_pack_start_sum);
2771 2772
		return 1;
	}
2773

2774 2775
	if (__is_set_ckpt_flags(ckpt, CP_LARGE_NAT_BITMAP_FLAG) &&
		le32_to_cpu(ckpt->checksum_offset) != CP_MIN_CHKSUM_OFFSET) {
2776 2777 2778
		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\"",
2779
			  le32_to_cpu(ckpt->checksum_offset));
2780 2781 2782
		return 1;
	}

2783
	if (unlikely(f2fs_cp_error(sbi))) {
2784
		f2fs_err(sbi, "A bug case: need to run fsck");
2785 2786
		return 1;
	}
J
Jaegeuk Kim 已提交
2787 2788 2789 2790 2791 2792
	return 0;
}

static void init_sb_info(struct f2fs_sb_info *sbi)
{
	struct f2fs_super_block *raw_super = sbi->raw_super;
2793
	int i;
J
Jaegeuk Kim 已提交
2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809

	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);
2810
	sbi->cur_victim_sec = NULL_SECNO;
2811 2812
	sbi->next_victim_seg[BG_GC] = NULL_SEGNO;
	sbi->next_victim_seg[FG_GC] = NULL_SEGNO;
2813
	sbi->max_victim_search = DEF_MAX_VICTIM_SEARCH;
2814
	sbi->migration_granularity = sbi->segs_per_sec;
J
Jaegeuk Kim 已提交
2815

2816
	sbi->dir_level = DEF_DIR_LEVEL;
2817
	sbi->interval_time[CP_TIME] = DEF_CP_INTERVAL;
2818
	sbi->interval_time[REQ_TIME] = DEF_IDLE_INTERVAL;
2819 2820
	sbi->interval_time[DISCARD_TIME] = DEF_IDLE_INTERVAL;
	sbi->interval_time[GC_TIME] = DEF_IDLE_INTERVAL;
D
Daniel Rosenberg 已提交
2821
	sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_INTERVAL;
2822 2823
	sbi->interval_time[UMOUNT_DISCARD_TIMEOUT] =
				DEF_UMOUNT_DISCARD_TIMEOUT;
2824
	clear_sbi_flag(sbi, SBI_NEED_FSCK);
2825

2826 2827 2828
	for (i = 0; i < NR_COUNT_TYPE; i++)
		atomic_set(&sbi->nr_pages[i], 0);

2829 2830
	for (i = 0; i < META; i++)
		atomic_set(&sbi->wb_sync_req[i], 0);
2831

2832 2833
	INIT_LIST_HEAD(&sbi->s_list);
	mutex_init(&sbi->umount_mutex);
2834
	init_rwsem(&sbi->io_order_lock);
2835
	spin_lock_init(&sbi->cp_lock);
2836 2837 2838

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

2840
	init_rwsem(&sbi->sb_lock);
J
Jaegeuk Kim 已提交
2841 2842
}

2843 2844
static int init_percpu_info(struct f2fs_sb_info *sbi)
{
2845
	int err;
2846

2847 2848 2849 2850
	err = percpu_counter_init(&sbi->alloc_valid_block_count, 0, GFP_KERNEL);
	if (err)
		return err;

2851
	err = percpu_counter_init(&sbi->total_valid_inode_count, 0,
2852
								GFP_KERNEL);
2853 2854 2855 2856
	if (err)
		percpu_counter_destroy(&sbi->alloc_valid_block_count);

	return err;
2857 2858
}

2859
#ifdef CONFIG_BLK_DEV_ZONED
J
Jaegeuk Kim 已提交
2860
static int init_blkz_info(struct f2fs_sb_info *sbi, int devi)
2861
{
J
Jaegeuk Kim 已提交
2862
	struct block_device *bdev = FDEV(devi).bdev;
2863 2864 2865 2866 2867 2868 2869
	sector_t nr_sectors = bdev->bd_part->nr_sects;
	sector_t sector = 0;
	struct blk_zone *zones;
	unsigned int i, nr_zones;
	unsigned int n = 0;
	int err = -EIO;

2870
	if (!f2fs_sb_has_blkzoned(sbi))
2871 2872
		return 0;

J
Jaegeuk Kim 已提交
2873
	if (sbi->blocks_per_blkz && sbi->blocks_per_blkz !=
2874
				SECTOR_TO_BLOCK(bdev_zone_sectors(bdev)))
J
Jaegeuk Kim 已提交
2875
		return -EINVAL;
2876
	sbi->blocks_per_blkz = SECTOR_TO_BLOCK(bdev_zone_sectors(bdev));
J
Jaegeuk Kim 已提交
2877 2878 2879
	if (sbi->log_blocks_per_blkz && sbi->log_blocks_per_blkz !=
				__ilog2_u32(sbi->blocks_per_blkz))
		return -EINVAL;
2880
	sbi->log_blocks_per_blkz = __ilog2_u32(sbi->blocks_per_blkz);
J
Jaegeuk Kim 已提交
2881 2882
	FDEV(devi).nr_blkz = SECTOR_TO_BLOCK(nr_sectors) >>
					sbi->log_blocks_per_blkz;
2883
	if (nr_sectors & (bdev_zone_sectors(bdev) - 1))
J
Jaegeuk Kim 已提交
2884
		FDEV(devi).nr_blkz++;
2885

2886 2887 2888 2889 2890
	FDEV(devi).blkz_seq = f2fs_kzalloc(sbi,
					BITS_TO_LONGS(FDEV(devi).nr_blkz)
					* sizeof(unsigned long),
					GFP_KERNEL);
	if (!FDEV(devi).blkz_seq)
2891 2892 2893 2894
		return -ENOMEM;

#define F2FS_REPORT_NR_ZONES   4096

2895 2896 2897 2898
	zones = f2fs_kzalloc(sbi,
			     array_size(F2FS_REPORT_NR_ZONES,
					sizeof(struct blk_zone)),
			     GFP_KERNEL);
2899 2900 2901 2902 2903 2904 2905
	if (!zones)
		return -ENOMEM;

	/* Get block zones type */
	while (zones && sector < nr_sectors) {

		nr_zones = F2FS_REPORT_NR_ZONES;
2906
		err = blkdev_report_zones(bdev, sector, zones, &nr_zones);
2907 2908 2909 2910 2911 2912 2913 2914
		if (err)
			break;
		if (!nr_zones) {
			err = -EIO;
			break;
		}

		for (i = 0; i < nr_zones; i++) {
2915 2916
			if (zones[i].type != BLK_ZONE_TYPE_CONVENTIONAL)
				set_bit(n, FDEV(devi).blkz_seq);
2917 2918 2919 2920 2921
			sector += zones[i].len;
			n++;
		}
	}

2922
	kvfree(zones);
2923 2924 2925 2926 2927

	return err;
}
#endif

2928 2929
/*
 * Read f2fs raw super block.
2930 2931 2932
 * 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.
2933
 */
2934
static int read_raw_super_block(struct f2fs_sb_info *sbi,
2935
			struct f2fs_super_block **raw_super,
2936
			int *valid_super_block, int *recovery)
2937
{
2938
	struct super_block *sb = sbi->sb;
2939
	int block;
2940
	struct buffer_head *bh;
2941
	struct f2fs_super_block *super;
2942
	int err = 0;
2943

Y
Yunlei He 已提交
2944 2945 2946
	super = kzalloc(sizeof(struct f2fs_super_block), GFP_KERNEL);
	if (!super)
		return -ENOMEM;
2947 2948 2949 2950

	for (block = 0; block < 2; block++) {
		bh = sb_bread(sb, block);
		if (!bh) {
2951 2952
			f2fs_err(sbi, "Unable to read %dth superblock",
				 block + 1);
2953 2954 2955
			err = -EIO;
			continue;
		}
2956

2957
		/* sanity checking of raw super */
2958 2959
		err = sanity_check_raw_super(sbi, bh);
		if (err) {
2960 2961
			f2fs_err(sbi, "Can't find valid F2FS filesystem in %dth superblock",
				 block + 1);
2962 2963 2964
			brelse(bh);
			continue;
		}
2965

2966
		if (!*raw_super) {
2967 2968
			memcpy(super, bh->b_data + F2FS_SUPER_OFFSET,
							sizeof(*super));
2969 2970 2971 2972
			*valid_super_block = block;
			*raw_super = super;
		}
		brelse(bh);
2973 2974
	}

2975 2976 2977
	/* Fail to read any one of the superblocks*/
	if (err < 0)
		*recovery = 1;
2978 2979

	/* No valid superblock */
2980
	if (!*raw_super)
2981
		kvfree(super);
2982 2983
	else
		err = 0;
2984

2985
	return err;
2986 2987
}

2988
int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
J
Jaegeuk Kim 已提交
2989
{
J
Jaegeuk Kim 已提交
2990
	struct buffer_head *bh;
2991
	__u32 crc = 0;
J
Jaegeuk Kim 已提交
2992 2993
	int err;

2994 2995 2996
	if ((recover && f2fs_readonly(sbi->sb)) ||
				bdev_read_only(sbi->sb->s_bdev)) {
		set_sbi_flag(sbi, SBI_NEED_SB_WRITE);
2997
		return -EROFS;
2998
	}
2999

3000
	/* we should update superblock crc here */
3001
	if (!recover && f2fs_sb_has_sb_chksum(sbi)) {
3002 3003 3004 3005 3006
		crc = f2fs_crc32(sbi, F2FS_RAW_SUPER(sbi),
				offsetof(struct f2fs_super_block, crc));
		F2FS_RAW_SUPER(sbi)->crc = cpu_to_le32(crc);
	}

3007
	/* write back-up superblock first */
3008
	bh = sb_bread(sbi->sb, sbi->valid_super_block ? 0 : 1);
J
Jaegeuk Kim 已提交
3009 3010
	if (!bh)
		return -EIO;
3011
	err = __f2fs_commit_super(bh, F2FS_RAW_SUPER(sbi));
J
Jaegeuk Kim 已提交
3012
	brelse(bh);
C
Chao Yu 已提交
3013 3014 3015

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

	/* write current valid superblock */
3019
	bh = sb_bread(sbi->sb, sbi->valid_super_block);
3020 3021 3022 3023 3024
	if (!bh)
		return -EIO;
	err = __f2fs_commit_super(bh, F2FS_RAW_SUPER(sbi));
	brelse(bh);
	return err;
J
Jaegeuk Kim 已提交
3025 3026
}

J
Jaegeuk Kim 已提交
3027 3028 3029
static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
{
	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
3030
	unsigned int max_devices = MAX_DEVICES;
J
Jaegeuk Kim 已提交
3031 3032
	int i;

3033 3034 3035
	/* Initialize single device information */
	if (!RDEV(0).path[0]) {
		if (!bdev_is_zoned(sbi->sb->s_bdev))
J
Jaegeuk Kim 已提交
3036
			return 0;
3037 3038
		max_devices = 1;
	}
J
Jaegeuk Kim 已提交
3039

3040 3041 3042 3043
	/*
	 * Initialize multiple devices information, or single
	 * zoned block device information.
	 */
3044 3045 3046 3047
	sbi->devs = f2fs_kzalloc(sbi,
				 array_size(max_devices,
					    sizeof(struct f2fs_dev_info)),
				 GFP_KERNEL);
3048 3049
	if (!sbi->devs)
		return -ENOMEM;
J
Jaegeuk Kim 已提交
3050

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

3053 3054 3055 3056 3057 3058 3059
		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 已提交
3060
					sbi->sb->s_mode, sbi->sb->s_type);
3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078
		} 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 已提交
3079
					sbi->sb->s_mode, sbi->sb->s_type);
3080
		}
J
Jaegeuk Kim 已提交
3081 3082 3083 3084 3085 3086 3087 3088
		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 &&
3089
				!f2fs_sb_has_blkzoned(sbi)) {
3090
			f2fs_err(sbi, "Zoned block device feature not enabled\n");
J
Jaegeuk Kim 已提交
3091 3092 3093 3094
			return -EINVAL;
		}
		if (bdev_zoned_model(FDEV(i).bdev) != BLK_ZONED_NONE) {
			if (init_blkz_info(sbi, i)) {
3095
				f2fs_err(sbi, "Failed to initialize F2FS blkzone information");
J
Jaegeuk Kim 已提交
3096 3097
				return -EINVAL;
			}
3098 3099
			if (max_devices == 1)
				break;
3100 3101 3102 3103 3104 3105
			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 已提交
3106 3107 3108
			continue;
		}
#endif
3109 3110 3111 3112 3113 3114 3115
		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 已提交
3116 3117 3118
	return 0;
}

3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154
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;
3155
		sbi->sb->s_d_op = &f2fs_dentry_ops;
3156 3157 3158 3159 3160 3161 3162 3163 3164 3165
	}
#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;
}

3166 3167 3168 3169 3170 3171
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) {
3172
		F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_REUSE;
3173 3174 3175
		sm_i->dcc_info->discard_granularity = 1;
		sm_i->ipu_policy = 1 << F2FS_IPU_FORCE;
	}
3176 3177

	sbi->readdir_ra = 1;
3178 3179
}

J
Jaegeuk Kim 已提交
3180 3181 3182
static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
{
	struct f2fs_sb_info *sbi;
3183
	struct f2fs_super_block *raw_super;
J
Jaegeuk Kim 已提交
3184
	struct inode *root;
3185
	int err;
3186
	bool skip_recovery = false, need_fsck = false;
3187
	char *options = NULL;
3188
	int recovery, i, valid_super_block;
3189
	struct curseg_info *seg_i;
3190
	int retry_cnt = 1;
J
Jaegeuk Kim 已提交
3191

3192
try_onemore:
3193 3194
	err = -EINVAL;
	raw_super = NULL;
3195
	valid_super_block = -1;
3196 3197
	recovery = 0;

J
Jaegeuk Kim 已提交
3198 3199 3200 3201 3202
	/* allocate memory for f2fs-specific super block info */
	sbi = kzalloc(sizeof(struct f2fs_sb_info), GFP_KERNEL);
	if (!sbi)
		return -ENOMEM;

3203 3204
	sbi->sb = sb;

K
Keith Mok 已提交
3205 3206 3207
	/* Load the checksum driver */
	sbi->s_chksum_driver = crypto_alloc_shash("crc32", 0, 0);
	if (IS_ERR(sbi->s_chksum_driver)) {
3208
		f2fs_err(sbi, "Cannot load crc32 driver.");
K
Keith Mok 已提交
3209 3210 3211 3212 3213
		err = PTR_ERR(sbi->s_chksum_driver);
		sbi->s_chksum_driver = NULL;
		goto free_sbi;
	}

3214
	/* set a block size */
3215
	if (unlikely(!sb_set_blocksize(sb, F2FS_BLKSIZE))) {
3216
		f2fs_err(sbi, "unable to set blocksize");
J
Jaegeuk Kim 已提交
3217
		goto free_sbi;
3218
	}
J
Jaegeuk Kim 已提交
3219

3220
	err = read_raw_super_block(sbi, &raw_super, &valid_super_block,
3221
								&recovery);
3222 3223 3224
	if (err)
		goto free_sbi;

3225
	sb->s_fs_info = sbi;
3226 3227
	sbi->raw_super = raw_super;

C
Chao Yu 已提交
3228
	/* precompute checksum seed for metadata */
3229
	if (f2fs_sb_has_inode_chksum(sbi))
C
Chao Yu 已提交
3230 3231 3232
		sbi->s_chksum_seed = f2fs_chksum(sbi, ~0, raw_super->uuid,
						sizeof(raw_super->uuid));

3233 3234 3235 3236 3237 3238
	/*
	 * 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
3239
	if (f2fs_sb_has_blkzoned(sbi)) {
3240
		f2fs_err(sbi, "Zoned block device support is not enabled");
3241
		err = -EOPNOTSUPP;
3242 3243 3244
		goto free_sb_buf;
	}
#endif
3245
	default_options(sbi);
J
Jaegeuk Kim 已提交
3246
	/* parse mount options */
3247 3248 3249
	options = kstrdup((const char *)data, GFP_KERNEL);
	if (data && !options) {
		err = -ENOMEM;
J
Jaegeuk Kim 已提交
3250
		goto free_sb_buf;
3251 3252 3253 3254 3255
	}

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

C
Chao Yu 已提交
3257 3258 3259
	sbi->max_file_blocks = max_file_blocks();
	sb->s_maxbytes = sbi->max_file_blocks <<
				le32_to_cpu(raw_super->log_blocksize);
J
Jaegeuk Kim 已提交
3260 3261
	sb->s_max_links = F2FS_LINK_MAX;

3262 3263 3264 3265
	err = f2fs_setup_casefold(sbi);
	if (err)
		goto free_options;

C
Chao Yu 已提交
3266 3267
#ifdef CONFIG_QUOTA
	sb->dq_op = &f2fs_quota_operations;
3268
	sb->s_qcop = &f2fs_quotactl_ops;
C
Chao Yu 已提交
3269
	sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
3270

3271
	if (f2fs_sb_has_quota_ino(sbi)) {
3272 3273 3274 3275 3276
		for (i = 0; i < MAXQUOTAS; i++) {
			if (f2fs_qf_ino(sbi->sb, i))
				sbi->nquota_files++;
		}
	}
C
Chao Yu 已提交
3277 3278
#endif

J
Jaegeuk Kim 已提交
3279
	sb->s_op = &f2fs_sops;
3280
#ifdef CONFIG_FS_ENCRYPTION
3281
	sb->s_cop = &f2fs_cryptops;
3282
#endif
J
Jaegeuk Kim 已提交
3283 3284 3285 3286
	sb->s_xattr = f2fs_xattr_handlers;
	sb->s_export_op = &f2fs_export_ops;
	sb->s_magic = F2FS_SUPER_MAGIC;
	sb->s_time_gran = 1;
3287 3288
	sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
		(test_opt(sbi, POSIX_ACL) ? SB_POSIXACL : 0);
3289
	memcpy(&sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
3290
	sb->s_iflags |= SB_I_CGROUPWB;
J
Jaegeuk Kim 已提交
3291 3292

	/* init f2fs-specific super block info */
3293
	sbi->valid_super_block = valid_super_block;
J
Jaegeuk Kim 已提交
3294
	mutex_init(&sbi->gc_mutex);
3295
	mutex_init(&sbi->writepages);
J
Jaegeuk Kim 已提交
3296
	mutex_init(&sbi->cp_mutex);
3297
	mutex_init(&sbi->resize_mutex);
3298
	init_rwsem(&sbi->node_write);
3299
	init_rwsem(&sbi->node_change);
3300 3301 3302

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

C
Chao Yu 已提交
3305 3306 3307 3308
	/* init iostat info */
	spin_lock_init(&sbi->iostat_lock);
	sbi->iostat_enable = false;

J
Jaegeuk Kim 已提交
3309
	for (i = 0; i < NR_PAGE_TYPE; i++) {
J
Jaegeuk Kim 已提交
3310 3311 3312
		int n = (i == META) ? 1: NR_TEMP_TYPE;
		int j;

3313 3314 3315 3316 3317
		sbi->write_io[i] =
			f2fs_kmalloc(sbi,
				     array_size(n,
						sizeof(struct f2fs_bio_info)),
				     GFP_KERNEL);
3318 3319
		if (!sbi->write_io[i]) {
			err = -ENOMEM;
3320
			goto free_bio_info;
3321
		}
J
Jaegeuk Kim 已提交
3322 3323 3324 3325 3326

		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;
3327 3328
			spin_lock_init(&sbi->write_io[i][j].io_lock);
			INIT_LIST_HEAD(&sbi->write_io[i][j].io_list);
J
Jaegeuk Kim 已提交
3329
		}
J
Jaegeuk Kim 已提交
3330
	}
3331

3332
	init_rwsem(&sbi->cp_rwsem);
3333
	init_rwsem(&sbi->quota_sem);
3334
	init_waitqueue_head(&sbi->cp_wait);
J
Jaegeuk Kim 已提交
3335 3336
	init_sb_info(sbi);

3337 3338
	err = init_percpu_info(sbi);
	if (err)
3339
		goto free_bio_info;
3340

3341
	if (F2FS_IO_ALIGNED(sbi)) {
3342
		sbi->write_io_dummy =
3343
			mempool_create_page_pool(2 * (F2FS_IO_SIZE(sbi) - 1), 0);
3344 3345
		if (!sbi->write_io_dummy) {
			err = -ENOMEM;
3346
			goto free_percpu;
3347
		}
3348 3349
	}

J
Jaegeuk Kim 已提交
3350 3351 3352
	/* get an inode for meta space */
	sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi));
	if (IS_ERR(sbi->meta_inode)) {
3353
		f2fs_err(sbi, "Failed to read F2FS meta data inode");
J
Jaegeuk Kim 已提交
3354
		err = PTR_ERR(sbi->meta_inode);
3355
		goto free_io_dummy;
J
Jaegeuk Kim 已提交
3356 3357
	}

C
Chao Yu 已提交
3358
	err = f2fs_get_valid_checkpoint(sbi);
3359
	if (err) {
3360
		f2fs_err(sbi, "Failed to get valid F2FS checkpoint");
J
Jaegeuk Kim 已提交
3361
		goto free_meta_inode;
3362
	}
J
Jaegeuk Kim 已提交
3363

3364 3365
	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
3366 3367 3368 3369
	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;
	}
3370

3371 3372 3373
	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_FSCK_FLAG))
		set_sbi_flag(sbi, SBI_NEED_FSCK);

J
Jaegeuk Kim 已提交
3374 3375 3376
	/* Initialize device list */
	err = f2fs_scan_devices(sbi);
	if (err) {
3377
		f2fs_err(sbi, "Failed to find devices");
J
Jaegeuk Kim 已提交
3378 3379 3380
		goto free_devices;
	}

J
Jaegeuk Kim 已提交
3381 3382
	sbi->total_valid_node_count =
				le32_to_cpu(sbi->ckpt->valid_node_count);
3383 3384
	percpu_counter_set(&sbi->total_valid_inode_count,
				le32_to_cpu(sbi->ckpt->valid_inode_count));
J
Jaegeuk Kim 已提交
3385 3386 3387 3388
	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;
3389
	sbi->reserved_blocks = 0;
3390
	sbi->current_reserved_blocks = 0;
3391
	limit_reserve_root(sbi);
3392

3393 3394 3395 3396
	for (i = 0; i < NR_INODE_TYPE; i++) {
		INIT_LIST_HEAD(&sbi->inode_list[i]);
		spin_lock_init(&sbi->inode_lock[i]);
	}
3397
	mutex_init(&sbi->flush_lock);
J
Jaegeuk Kim 已提交
3398

C
Chao Yu 已提交
3399
	f2fs_init_extent_cache_info(sbi);
C
Chao Yu 已提交
3400

C
Chao Yu 已提交
3401
	f2fs_init_ino_entry_info(sbi);
J
Jaegeuk Kim 已提交
3402

3403 3404
	f2fs_init_fsync_node_info(sbi);

J
Jaegeuk Kim 已提交
3405
	/* setup f2fs internal modules */
C
Chao Yu 已提交
3406
	err = f2fs_build_segment_manager(sbi);
3407
	if (err) {
3408 3409
		f2fs_err(sbi, "Failed to initialize F2FS segment manager (%d)",
			 err);
J
Jaegeuk Kim 已提交
3410
		goto free_sm;
3411
	}
C
Chao Yu 已提交
3412
	err = f2fs_build_node_manager(sbi);
3413
	if (err) {
3414 3415
		f2fs_err(sbi, "Failed to initialize F2FS node manager (%d)",
			 err);
J
Jaegeuk Kim 已提交
3416
		goto free_nm;
3417
	}
J
Jaegeuk Kim 已提交
3418

3419 3420 3421
	/* For write statistics */
	if (sb->s_bdev->bd_part)
		sbi->sectors_written_start =
3422 3423
			(u64)part_stat_read(sb->s_bdev->bd_part,
					    sectors[STAT_WRITE]);
3424 3425 3426 3427 3428

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

C
Chao Yu 已提交
3431
	f2fs_build_gc_manager(sbi);
J
Jaegeuk Kim 已提交
3432

3433 3434 3435 3436
	err = f2fs_build_stats(sbi);
	if (err)
		goto free_nm;

J
Jaegeuk Kim 已提交
3437 3438 3439
	/* get an inode for node space */
	sbi->node_inode = f2fs_iget(sb, F2FS_NODE_INO(sbi));
	if (IS_ERR(sbi->node_inode)) {
3440
		f2fs_err(sbi, "Failed to read node inode");
J
Jaegeuk Kim 已提交
3441
		err = PTR_ERR(sbi->node_inode);
3442
		goto free_stats;
J
Jaegeuk Kim 已提交
3443 3444 3445 3446 3447
	}

	/* read root inode and dentry */
	root = f2fs_iget(sb, F2FS_ROOT_INO(sbi));
	if (IS_ERR(root)) {
3448
		f2fs_err(sbi, "Failed to read root inode");
J
Jaegeuk Kim 已提交
3449
		err = PTR_ERR(root);
3450
		goto free_node_inode;
J
Jaegeuk Kim 已提交
3451
	}
3452 3453
	if (!S_ISDIR(root->i_mode) || !root->i_blocks ||
			!root->i_size || !root->i_nlink) {
3454
		iput(root);
3455
		err = -EINVAL;
3456
		goto free_node_inode;
3457
	}
J
Jaegeuk Kim 已提交
3458 3459 3460 3461

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

3465
	err = f2fs_register_sysfs(sbi);
3466
	if (err)
C
Chao Yu 已提交
3467
		goto free_root_inode;
3468

J
Jaegeuk Kim 已提交
3469
#ifdef CONFIG_QUOTA
S
Sheng Yong 已提交
3470
	/* Enable quota usage during mount */
3471
	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sb)) {
J
Jaegeuk Kim 已提交
3472
		err = f2fs_enable_quotas(sb);
3473
		if (err)
3474
			f2fs_err(sbi, "Cannot turn on quotas: error %d", err);
J
Jaegeuk Kim 已提交
3475 3476
	}
#endif
C
Chao Yu 已提交
3477
	/* if there are nt orphan nodes free them */
C
Chao Yu 已提交
3478
	err = f2fs_recover_orphan_inodes(sbi);
C
Chao Yu 已提交
3479
	if (err)
J
Jaegeuk Kim 已提交
3480
		goto free_meta;
C
Chao Yu 已提交
3481

D
Daniel Rosenberg 已提交
3482
	if (unlikely(is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)))
3483
		goto reset_checkpoint;
D
Daniel Rosenberg 已提交
3484

3485 3486
	/* recover fsynced data */
	if (!test_opt(sbi, DISABLE_ROLL_FORWARD)) {
3487 3488 3489 3490
		/*
		 * mount should be failed, when device has readonly mode, and
		 * previous checkpoint was not done by clean system shutdown.
		 */
3491 3492 3493
		if (f2fs_hw_is_readonly(sbi)) {
			if (!is_set_ckpt_flags(sbi, CP_UMOUNT_FLAG)) {
				err = -EROFS;
3494
				f2fs_err(sbi, "Need to recover fsync data, but write access unavailable");
3495 3496
				goto free_meta;
			}
3497
			f2fs_info(sbi, "write access unavailable, skipping recovery");
3498
			goto reset_checkpoint;
3499
		}
3500 3501 3502 3503

		if (need_fsck)
			set_sbi_flag(sbi, SBI_NEED_FSCK);

3504 3505
		if (skip_recovery)
			goto reset_checkpoint;
3506

C
Chao Yu 已提交
3507
		err = f2fs_recover_fsync_data(sbi, false);
3508
		if (err < 0) {
3509 3510
			if (err != -ENOMEM)
				skip_recovery = true;
3511
			need_fsck = true;
3512 3513
			f2fs_err(sbi, "Cannot recover all fsync data errno=%d",
				 err);
C
Chao Yu 已提交
3514
			goto free_meta;
3515
		}
3516
	} else {
C
Chao Yu 已提交
3517
		err = f2fs_recover_fsync_data(sbi, true);
3518 3519 3520

		if (!f2fs_readonly(sb) && err > 0) {
			err = -EINVAL;
3521
			f2fs_err(sbi, "Need to recover fsync data");
J
Jaegeuk Kim 已提交
3522
			goto free_meta;
3523
		}
3524
	}
3525
reset_checkpoint:
C
Chao Yu 已提交
3526
	/* f2fs_recover_fsync_data() cleared this already */
3527
	clear_sbi_flag(sbi, SBI_POR_DOING);
3528

D
Daniel Rosenberg 已提交
3529 3530 3531
	if (test_opt(sbi, DISABLE_CHECKPOINT)) {
		err = f2fs_disable_checkpoint(sbi);
		if (err)
3532
			goto sync_free_meta;
D
Daniel Rosenberg 已提交
3533 3534 3535 3536
	} else if (is_set_ckpt_flags(sbi, CP_DISABLED_FLAG)) {
		f2fs_enable_checkpoint(sbi);
	}

3537 3538 3539 3540
	/*
	 * If filesystem is not mounted as read-only then
	 * do start the gc_thread.
	 */
3541
	if (test_opt(sbi, BG_GC) && !f2fs_readonly(sb)) {
3542
		/* After POR, we can run background GC thread.*/
C
Chao Yu 已提交
3543
		err = f2fs_start_gc_thread(sbi);
3544
		if (err)
3545
			goto sync_free_meta;
3546
	}
3547
	kvfree(options);
3548 3549

	/* recover broken superblock */
3550
	if (recovery) {
3551
		err = f2fs_commit_super(sbi, true);
3552 3553
		f2fs_info(sbi, "Try to recover %dth superblock, ret: %d",
			  sbi->valid_super_block ? 1 : 2, err);
3554 3555
	}

C
Chao Yu 已提交
3556 3557
	f2fs_join_shrinker(sbi);

3558 3559
	f2fs_tuning_parameters(sbi);

3560 3561
	f2fs_notice(sbi, "Mounted with checkpoint version = %llx",
		    cur_cp_version(F2FS_CKPT(sbi)));
3562
	f2fs_update_time(sbi, CP_TIME);
3563
	f2fs_update_time(sbi, REQ_TIME);
3564
	clear_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
J
Jaegeuk Kim 已提交
3565
	return 0;
3566

3567 3568 3569
sync_free_meta:
	/* safe to flush all the data */
	sync_filesystem(sbi->sb);
3570
	retry_cnt = 0;
3571

C
Chao Yu 已提交
3572
free_meta:
J
Jaegeuk Kim 已提交
3573
#ifdef CONFIG_QUOTA
3574
	f2fs_truncate_quota_inode_pages(sb);
3575
	if (f2fs_sb_has_quota_ino(sbi) && !f2fs_readonly(sb))
J
Jaegeuk Kim 已提交
3576 3577
		f2fs_quota_off_umount(sbi->sb);
#endif
C
Chao Yu 已提交
3578
	/*
C
Chao Yu 已提交
3579
	 * Some dirty meta pages can be produced by f2fs_recover_orphan_inodes()
C
Chao Yu 已提交
3580
	 * failed by EIO. Then, iput(node_inode) can trigger balance_fs_bg()
C
Chao Yu 已提交
3581 3582
	 * followed by f2fs_write_checkpoint() through f2fs_write_node_pages(), which
	 * falls into an infinite loop in f2fs_sync_meta_pages().
C
Chao Yu 已提交
3583 3584
	 */
	truncate_inode_pages_final(META_MAPPING(sbi));
3585 3586
	/* evict some inodes being cached by GC */
	evict_inodes(sb);
3587
	f2fs_unregister_sysfs(sbi);
J
Jaegeuk Kim 已提交
3588 3589 3590 3591
free_root_inode:
	dput(sb->s_root);
	sb->s_root = NULL;
free_node_inode:
C
Chao Yu 已提交
3592
	f2fs_release_ino_entry(sbi, true);
C
Chao Yu 已提交
3593
	truncate_inode_pages_final(NODE_MAPPING(sbi));
J
Jaegeuk Kim 已提交
3594
	iput(sbi->node_inode);
3595
	sbi->node_inode = NULL;
3596 3597
free_stats:
	f2fs_destroy_stats(sbi);
J
Jaegeuk Kim 已提交
3598
free_nm:
C
Chao Yu 已提交
3599
	f2fs_destroy_node_manager(sbi);
J
Jaegeuk Kim 已提交
3600
free_sm:
C
Chao Yu 已提交
3601
	f2fs_destroy_segment_manager(sbi);
J
Jaegeuk Kim 已提交
3602 3603
free_devices:
	destroy_device_list(sbi);
3604
	kvfree(sbi->ckpt);
J
Jaegeuk Kim 已提交
3605 3606 3607
free_meta_inode:
	make_bad_inode(sbi->meta_inode);
	iput(sbi->meta_inode);
3608
	sbi->meta_inode = NULL;
3609 3610
free_io_dummy:
	mempool_destroy(sbi->write_io_dummy);
3611 3612 3613
free_percpu:
	destroy_percpu_info(sbi);
free_bio_info:
J
Jaegeuk Kim 已提交
3614
	for (i = 0; i < NR_PAGE_TYPE; i++)
3615
		kvfree(sbi->write_io[i]);
3616 3617 3618 3619

#ifdef CONFIG_UNICODE
	utf8_unload(sbi->s_encoding);
#endif
3620
free_options:
C
Chao Yu 已提交
3621 3622
#ifdef CONFIG_QUOTA
	for (i = 0; i < MAXQUOTAS; i++)
3623
		kvfree(F2FS_OPTION(sbi).s_qf_names[i]);
C
Chao Yu 已提交
3624
#endif
3625
	kvfree(options);
J
Jaegeuk Kim 已提交
3626
free_sb_buf:
3627
	kvfree(raw_super);
J
Jaegeuk Kim 已提交
3628
free_sbi:
K
Keith Mok 已提交
3629 3630
	if (sbi->s_chksum_driver)
		crypto_free_shash(sbi->s_chksum_driver);
3631
	kvfree(sbi);
3632 3633

	/* give only one another chance */
3634 3635
	if (retry_cnt > 0 && skip_recovery) {
		retry_cnt--;
3636 3637 3638
		shrink_dcache_sb(sb);
		goto try_onemore;
	}
J
Jaegeuk Kim 已提交
3639 3640 3641 3642 3643 3644 3645 3646 3647
	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);
}

3648 3649
static void kill_f2fs_super(struct super_block *sb)
{
3650
	if (sb->s_root) {
J
Jaegeuk Kim 已提交
3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663
		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);
		}
3664 3665 3666

		if (is_sbi_flag_set(sbi, SBI_IS_RECOVERED) && f2fs_readonly(sb))
			sb->s_flags &= ~SB_RDONLY;
3667
	}
3668 3669 3670
	kill_block_super(sb);
}

J
Jaegeuk Kim 已提交
3671 3672 3673 3674
static struct file_system_type f2fs_fs_type = {
	.owner		= THIS_MODULE,
	.name		= "f2fs",
	.mount		= f2fs_mount,
3675
	.kill_sb	= kill_f2fs_super,
J
Jaegeuk Kim 已提交
3676 3677
	.fs_flags	= FS_REQUIRES_DEV,
};
3678
MODULE_ALIAS_FS("f2fs");
J
Jaegeuk Kim 已提交
3679

3680
static int __init init_inodecache(void)
J
Jaegeuk Kim 已提交
3681
{
3682 3683 3684
	f2fs_inode_cachep = kmem_cache_create("f2fs_inode_cache",
			sizeof(struct f2fs_inode_info), 0,
			SLAB_RECLAIM_ACCOUNT|SLAB_ACCOUNT, NULL);
3685
	if (!f2fs_inode_cachep)
J
Jaegeuk Kim 已提交
3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703
		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;

3704 3705 3706 3707 3708 3709
	if (PAGE_SIZE != F2FS_BLKSIZE) {
		printk("F2FS not supported on PAGE_SIZE(%lu) != %d\n",
				PAGE_SIZE, F2FS_BLKSIZE);
		return -EINVAL;
	}

3710 3711
	f2fs_build_trace_ios();

J
Jaegeuk Kim 已提交
3712 3713 3714
	err = init_inodecache();
	if (err)
		goto fail;
C
Chao Yu 已提交
3715
	err = f2fs_create_node_manager_caches();
J
Jaegeuk Kim 已提交
3716
	if (err)
3717
		goto free_inodecache;
C
Chao Yu 已提交
3718
	err = f2fs_create_segment_manager_caches();
J
Jaegeuk Kim 已提交
3719
	if (err)
3720
		goto free_node_manager_caches;
C
Chao Yu 已提交
3721
	err = f2fs_create_checkpoint_caches();
J
Jaegeuk Kim 已提交
3722
	if (err)
3723
		goto free_segment_manager_caches;
C
Chao Yu 已提交
3724
	err = f2fs_create_extent_cache();
C
Chao Yu 已提交
3725 3726
	if (err)
		goto free_checkpoint_caches;
3727
	err = f2fs_init_sysfs();
C
Chao Yu 已提交
3728
	if (err)
C
Chao Yu 已提交
3729
		goto free_extent_cache;
3730
	err = register_shrinker(&f2fs_shrinker_info);
3731
	if (err)
C
Chao Yu 已提交
3732
		goto free_sysfs;
3733 3734 3735
	err = register_filesystem(&f2fs_fs_type);
	if (err)
		goto free_shrinker;
3736
	f2fs_create_root_stats();
3737 3738 3739
	err = f2fs_init_post_read_processing();
	if (err)
		goto free_root_stats;
3740 3741
	return 0;

3742 3743
free_root_stats:
	f2fs_destroy_root_stats();
3744
	unregister_filesystem(&f2fs_fs_type);
3745 3746
free_shrinker:
	unregister_shrinker(&f2fs_shrinker_info);
C
Chao Yu 已提交
3747
free_sysfs:
3748
	f2fs_exit_sysfs();
C
Chao Yu 已提交
3749
free_extent_cache:
C
Chao Yu 已提交
3750
	f2fs_destroy_extent_cache();
3751
free_checkpoint_caches:
C
Chao Yu 已提交
3752
	f2fs_destroy_checkpoint_caches();
3753
free_segment_manager_caches:
C
Chao Yu 已提交
3754
	f2fs_destroy_segment_manager_caches();
3755
free_node_manager_caches:
C
Chao Yu 已提交
3756
	f2fs_destroy_node_manager_caches();
3757 3758
free_inodecache:
	destroy_inodecache();
J
Jaegeuk Kim 已提交
3759 3760 3761 3762 3763 3764
fail:
	return err;
}

static void __exit exit_f2fs_fs(void)
{
3765
	f2fs_destroy_post_read_processing();
3766
	f2fs_destroy_root_stats();
J
Jaegeuk Kim 已提交
3767
	unregister_filesystem(&f2fs_fs_type);
T
Tiezhu Yang 已提交
3768
	unregister_shrinker(&f2fs_shrinker_info);
3769
	f2fs_exit_sysfs();
C
Chao Yu 已提交
3770 3771 3772 3773
	f2fs_destroy_extent_cache();
	f2fs_destroy_checkpoint_caches();
	f2fs_destroy_segment_manager_caches();
	f2fs_destroy_node_manager_caches();
J
Jaegeuk Kim 已提交
3774
	destroy_inodecache();
3775
	f2fs_destroy_trace_ios();
J
Jaegeuk Kim 已提交
3776 3777 3778 3779 3780 3781 3782 3783
}

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