Commit f2091cc1 authored by Hongbo Li's avatar Hongbo Li Committed by Jaegeuk Kim
Browse files

f2fs: Add fs parameter specifications for mount options



Use an array of `fs_parameter_spec` called f2fs_param_specs to
hold the mount option specifications for the new mount api.

Add constant_table structures for several options to facilitate
parsing.

Signed-off-by: default avatarHongbo Li <lihongbo22@huawei.com>
[sandeen: forward port, minor fixes and updates, more fsparam_enum]
Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 56619985
Loading
Loading
Loading
Loading
+122 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <linux/part_stat.h>
#include <linux/zstd.h>
#include <linux/lz4.h>
#include <linux/fs_parser.h>

#include "f2fs.h"
#include "node.h"
@@ -196,9 +197,130 @@ enum {
	Opt_age_extent_cache,
	Opt_errors,
	Opt_nat_bits,
	Opt_jqfmt,
	Opt_checkpoint,
	Opt_err,
};

static const struct constant_table f2fs_param_background_gc[] = {
	{"on",		BGGC_MODE_ON},
	{"off",		BGGC_MODE_OFF},
	{"sync",	BGGC_MODE_SYNC},
	{}
};

static const struct constant_table f2fs_param_mode[] = {
	{"adaptive",		FS_MODE_ADAPTIVE},
	{"lfs",			FS_MODE_LFS},
	{"fragment:segment",	FS_MODE_FRAGMENT_SEG},
	{"fragment:block",	FS_MODE_FRAGMENT_BLK},
	{}
};

static const struct constant_table f2fs_param_jqfmt[] = {
	{"vfsold",	QFMT_VFS_OLD},
	{"vfsv0",	QFMT_VFS_V0},
	{"vfsv1",	QFMT_VFS_V1},
	{}
};

static const struct constant_table f2fs_param_alloc_mode[] = {
	{"default",	ALLOC_MODE_DEFAULT},
	{"reuse",	ALLOC_MODE_REUSE},
	{}
};
static const struct constant_table f2fs_param_fsync_mode[] = {
	{"posix",	FSYNC_MODE_POSIX},
	{"strict",	FSYNC_MODE_STRICT},
	{"nobarrier",	FSYNC_MODE_NOBARRIER},
	{}
};

static const struct constant_table f2fs_param_compress_mode[] = {
	{"fs",		COMPR_MODE_FS},
	{"user",	COMPR_MODE_USER},
	{}
};

static const struct constant_table f2fs_param_discard_unit[] = {
	{"block",	DISCARD_UNIT_BLOCK},
	{"segment",	DISCARD_UNIT_SEGMENT},
	{"section",	DISCARD_UNIT_SECTION},
	{}
};

static const struct constant_table f2fs_param_memory_mode[] = {
	{"normal",	MEMORY_MODE_NORMAL},
	{"low",		MEMORY_MODE_LOW},
	{}
};

static const struct constant_table f2fs_param_errors[] = {
	{"remount-ro",	MOUNT_ERRORS_READONLY},
	{"continue",	MOUNT_ERRORS_CONTINUE},
	{"panic",	MOUNT_ERRORS_PANIC},
	{}
};

static const struct fs_parameter_spec f2fs_param_specs[] = {
	fsparam_enum("background_gc", Opt_gc_background, f2fs_param_background_gc),
	fsparam_flag("disable_roll_forward", Opt_disable_roll_forward),
	fsparam_flag("norecovery", Opt_norecovery),
	fsparam_flag_no("discard", Opt_discard),
	fsparam_flag("no_heap", Opt_noheap),
	fsparam_flag("heap", Opt_heap),
	fsparam_flag_no("user_xattr", Opt_user_xattr),
	fsparam_flag_no("acl", Opt_acl),
	fsparam_s32("active_logs", Opt_active_logs),
	fsparam_flag("disable_ext_identify", Opt_disable_ext_identify),
	fsparam_flag_no("inline_xattr", Opt_inline_xattr),
	fsparam_s32("inline_xattr_size", Opt_inline_xattr_size),
	fsparam_flag_no("inline_data", Opt_inline_data),
	fsparam_flag_no("inline_dentry", Opt_inline_dentry),
	fsparam_flag_no("flush_merge", Opt_flush_merge),
	fsparam_flag_no("barrier", Opt_barrier),
	fsparam_flag("fastboot", Opt_fastboot),
	fsparam_flag_no("extent_cache", Opt_extent_cache),
	fsparam_flag("data_flush", Opt_data_flush),
	fsparam_u32("reserve_root", Opt_reserve_root),
	fsparam_gid("resgid", Opt_resgid),
	fsparam_uid("resuid", Opt_resuid),
	fsparam_enum("mode", Opt_mode, f2fs_param_mode),
	fsparam_s32("fault_injection", Opt_fault_injection),
	fsparam_u32("fault_type", Opt_fault_type),
	fsparam_flag_no("lazytime", Opt_lazytime),
	fsparam_flag_no("quota", Opt_quota),
	fsparam_flag("usrquota", Opt_usrquota),
	fsparam_flag("grpquota", Opt_grpquota),
	fsparam_flag("prjquota", Opt_prjquota),
	fsparam_string_empty("usrjquota", Opt_usrjquota),
	fsparam_string_empty("grpjquota", Opt_grpjquota),
	fsparam_string_empty("prjjquota", Opt_prjjquota),
	fsparam_flag("nat_bits", Opt_nat_bits),
	fsparam_enum("jqfmt", Opt_jqfmt, f2fs_param_jqfmt),
	fsparam_enum("alloc_mode", Opt_alloc, f2fs_param_alloc_mode),
	fsparam_enum("fsync_mode", Opt_fsync, f2fs_param_fsync_mode),
	fsparam_string("test_dummy_encryption", Opt_test_dummy_encryption),
	fsparam_flag("test_dummy_encryption", Opt_test_dummy_encryption),
	fsparam_flag("inlinecrypt", Opt_inlinecrypt),
	fsparam_string("checkpoint", Opt_checkpoint),
	fsparam_flag_no("checkpoint_merge", Opt_checkpoint_merge),
	fsparam_string("compress_algorithm", Opt_compress_algorithm),
	fsparam_u32("compress_log_size", Opt_compress_log_size),
	fsparam_string("compress_extension", Opt_compress_extension),
	fsparam_string("nocompress_extension", Opt_nocompress_extension),
	fsparam_flag("compress_chksum", Opt_compress_chksum),
	fsparam_enum("compress_mode", Opt_compress_mode, f2fs_param_compress_mode),
	fsparam_flag("compress_cache", Opt_compress_cache),
	fsparam_flag("atgc", Opt_atgc),
	fsparam_flag_no("gc_merge", Opt_gc_merge),
	fsparam_enum("discard_unit", Opt_discard_unit, f2fs_param_discard_unit),
	fsparam_enum("memory", Opt_memory_mode, f2fs_param_memory_mode),
	fsparam_flag("age_extent_cache", Opt_age_extent_cache),
	fsparam_enum("errors", Opt_errors, f2fs_param_errors),
	{}
};

static match_table_t f2fs_tokens = {
	{Opt_gc_background, "background_gc=%s"},
	{Opt_disable_roll_forward, "disable_roll_forward"},