# Copyright 2018 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

include <linux/fs.h>

mount(src ptr[in, filename], dst ptr[in, filename], type ptr[in, string[filesystem]], flags flags[mount_flags], data buffer[in, opt])
umount2(path ptr[in, filename], flags flags[umount_flags])

mount$bpf(src const[0], dst ptr[in, filename], type ptr[in, string["bpf"]], flags flags[mount_flags], opts ptr[in, fs_options[bpf_options]])

filesystem = "sysfs", "rootfs", "ramfs", "tmpfs", "devtmpfs", "debugfs", "securityfs", "sockfs", "pipefs", "anon_inodefs", "devpts", "ext3", "ext2", "ext4", "hugetlbfs", "vfat", "ecryptfs", "fuseblk", "fuse", "rpc_pipefs", "nfs", "nfs4", "nfsd", "binfmt_misc", "autofs", "xfs", "jfs", "msdos", "ntfs", "minix", "hfs", "hfsplus", "qnx4", "ufs", "btrfs", "configfs", "ncpfs", "qnx6", "exofs", "befs", "vxfs", "gfs2", "gfs2meta", "fusectl", "bfs", "nsfs", "efs", "cifs", "efivarfs", "affs", "tracefs", "bdev", "ocfs2", "ocfs2_dlmfs", "hpfs", "proc", "afs", "reiserfs", "jffs2", "romfs", "aio", "sysv", "v7", "udf", "ceph", "pstore", "adfs", "9p", "hostfs", "squashfs", "cramfs", "iso9660", "coda", "nilfs2", "logfs", "overlay", "f2fs", "omfs", "ubifs", "openpromfs", "bpf", "cgroup", "cgroup2", "cpuset", "mqueue", "aufs", "selinuxfs"

syz_read_part_table(size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]])

syz_mount_image$vfat(fs ptr[in, string["vfat"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[vfat_options]])

syz_mount_image$msdos(fs ptr[in, string["msdos"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[msdos_options]])

syz_mount_image$bfs(fs ptr[in, string["bfs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts const[0])

syz_mount_image$xfs(fs ptr[in, string["xfs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[xfs_options]])

syz_mount_image$minix(fs ptr[in, string["minix"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts const[0])

syz_mount_image$reiserfs(fs ptr[in, string["reiserfs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[reiserfs_options]])

syz_mount_image$hfs(fs ptr[in, string["hfs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[hfs_options]])

syz_mount_image$hfsplus(fs ptr[in, string["hfsplus"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[hfsplus_options]])

syz_mount_image$iso9660(fs ptr[in, string["iso9660"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[iso9660_options]])

syz_mount_image$gfs2(fs ptr[in, string["gfs2"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[gfs2_options]])

syz_mount_image$jfs(fs ptr[in, string["jfs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[jfs_options]])

syz_mount_image$btrfs(fs ptr[in, string["btrfs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[btrfs_options]])

syz_mount_image$ntfs(fs ptr[in, string["ntfs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[ntfs_options]])

syz_mount_image$ext4(fs ptr[in, string[ext4_types]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[ext4_options]])

ext4_types = "ext4", "ext3", "ext2"

syz_mount_image$f2fs(fs ptr[in, string["f2fs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, fs_options[f2fs_options]])

syz_mount_image$ocfs2(fs ptr[in, string["ocfs2"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, string])

syz_mount_image$nfs(fs ptr[in, string["nfs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, string])

syz_mount_image$nfs4(fs ptr[in, string["nfs4"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, string])

syz_mount_image$cifs(fs ptr[in, string["cifs"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, string])

syz_mount_image$ceph(fs ptr[in, string["ceph"]], dir ptr[in, filename], size intptr, nsegs len[segments], segments ptr[in, array[fs_image_segment]], flags flags[mount_flags], opts ptr[in, string])

fs_image_segment {
	data	ptr[in, array[int8]]
	size	len[data, intptr]
	offset	intptr
}

type fs_options[ELEMS] {
	elems	array[fs_opt_elem[ELEMS]]
	null	const[0, int8]
} [packed]

type fs_opt_elem[ELEMS] {
	elem	ELEMS
	comma	const[',', int8]
} [packed]

type fs_opt[NAME, TYPE] {
	name	stringnoz[NAME]
	eq	const['=', int8]
	val	TYPE
} [packed]

type fs_opt_str[NAME] fs_opt[NAME, stringnoz]
type fs_opt_dec[NAME, VAL] fs_opt[NAME, fmt[dec, VAL]]
type fs_opt_hex[NAME, VAL] fs_opt[NAME, fmt[hex, VAL]]
type fs_opt_oct[NAME, VAL] fs_opt[NAME, fmt[oct, VAL]]
type fs_opt_dec_suffix[NAME] fs_opt[NAME, array[flags[fs_opt_digits_suffix, int8]]]
type fs_opt_filename[NAME] fs_opt[NAME, stringnoz[filename]]
type fs_opt_codepage[NAME] fs_opt[NAME, stringnoz[codepages_names]]
type fs_opt_cp_num[NAME] fs_opt[NAME, stringnoz[codepage_nums]]

fs_opt_digits_suffix = '-', 'x', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'k', 'm', 'g', 't', 'p', 'e'

msdos_options [
	fat	fat_options
	nodots	stringnoz["nodots"]
	dots	stringnoz["dots"]
] [varlen]

vfat_options [
	fat		fat_options
	iocharset	fs_opt_codepage["iocharset"]
	rodir		stringnoz["rodir"]
	utf8no		stringnoz["utf8=0"]
	utf8		stringnoz["utf8=1"]
	uni_xlateno	stringnoz["uni_xlate=0"]
	uni_xlate	stringnoz["uni_xlate=1"]
	numtail		stringnoz["nonumtail=0"]
	nonumtail	stringnoz["nnonumtail=1"]
	shortname_lower	stringnoz["shortname=lower"]
	shortname_win95	stringnoz["shortname=win95"]
	shortname_winnt	stringnoz["shortname=winnt"]
	shortname_mixed	stringnoz["shortname=mixed"]
] [varlen]

fat_options [
	check_relaxed	stringnoz["check=relaxed"]
	check_strict	stringnoz["check=strict"]
	check_normal	stringnoz["check=normal"]
	usefree		stringnoz["usefree"]
	nocase		stringnoz["nocase"]
	quiet		stringnoz["quiet"]
	showexec	stringnoz["showexec"]
	debug		stringnoz["debug"]
	sys_immutable	stringnoz["sys_immutable"]
	flush		stringnoz["flush"]
	tz_utc		stringnoz["tz=UTC"]
	errors_continue	stringnoz["errors=continue"]
	errors_remount	stringnoz["errors=remount-ro"]
	discard		stringnoz["discard"]
	nfs		stringnoz["nfs"]
	nfs_nostale_ro	stringnoz["nfs=nostale_ro"]
	dos1xfloppy	stringnoz["dos1xfloppy"]
	uid		fs_opt_hex["uid", uid]
	gid		fs_opt_hex["gid", gid]
	umask		fs_opt_oct["umask", int32]
	dmask		fs_opt_oct["dmask", int32]
	fmask		fs_opt_oct["fmask", int32]
	allow_utime	fs_opt_oct["allow_utime", int32]
	time_offset	fs_opt_hex["time_offset", int32[-1440:1440]]
	codepage	fs_opt_cp_num["codepage"]
] [varlen]

xfs_options [
	wsync		stringnoz["wsync"]
	noalign		stringnoz["noalign"]
	swalloc		stringnoz["swalloc"]
	nouuid		stringnoz["nouuid"]
	mtpt		stringnoz["mtpt"]
	grpid		stringnoz["grpid"]
	nogrpid		stringnoz["nogrpid"]
	bsdgroups	stringnoz["bsdgroups"]
	sysvgroups	stringnoz["sysvgroups"]
	norecovery	stringnoz["norecovery"]
	inode64		stringnoz["inode64"]
	inode32		stringnoz["inode32"]
	ikeep		stringnoz["ikeep"]
	noikeep		stringnoz["noikeep"]
	largeio		stringnoz["largeio"]
	nolargeio	stringnoz["nolargeio"]
	attr2		stringnoz["attr2"]
	noattr2		stringnoz["noattr2"]
	filestreams	stringnoz["filestreams"]
	quota		stringnoz["quota"]
	noquota		stringnoz["noquota"]
	lazytime	stringnoz["lazytime"]
	nolazytime	stringnoz["nolazytime"]
	usrquota	stringnoz["usrquota"]
	grpquota	stringnoz["grpquota"]
	prjquota	stringnoz["prjquota"]
	uquota		stringnoz["uquota"]
	gquota		stringnoz["gquota"]
	pquota		stringnoz["pquota"]
	uqnoenforce	stringnoz["uqnoenforce"]
	gqnoenforce	stringnoz["gqnoenforce"]
	pqnoenforce	stringnoz["pqnoenforce"]
	qnoenforce	stringnoz["qnoenforce"]
	discard		stringnoz["discard"]
	nodiscard	stringnoz["nodiscard"]
	dax		stringnoz["dax"]
	barrier		stringnoz["barrier"]
	nobarrier	stringnoz["nobarrier"]
	logbufs		fs_opt_dec["logbufs", int32[-1:8]]
	biosize		fs_opt_dec["biosize", int32]
	sunit		fs_opt_hex["sunit", int32]
	swidth		fs_opt_hex["swidth", int32]
	logbsize	fs_opt_dec_suffix["logbsize"]
	allocsize	fs_opt_dec_suffix["allocsize"]
	logdev		fs_opt_filename["logdev"]
	rtdev		fs_opt_filename["rtdev"]
] [varlen]

reiserfs_options [
	tails_on		stringnoz["tails=on"]
	tails_off		stringnoz["tails=off"]
	tails_small		stringnoz["tails=small"]
	notail			stringnoz["notail"]
	conv			stringnoz["conv"]
	noattrs			stringnoz["noattrs"]
	expose_privroot		stringnoz["expose_privroot"]
	user_xattr		stringnoz["user_xattr"]
	nouser_xattr		stringnoz["nouser_xattr"]
	acl			stringnoz["acl"]
	noacl			stringnoz["noacl"]
	replayonly		stringnoz["replayonly"]
	nolargeio		stringnoz["nolargeio"]
	usrquota		stringnoz["usrquota"]
	grpquota		stringnoz["grpquota"]
	noquota			stringnoz["noquota"]
	usrjquota		stringnoz["usrjquota"]
	usrjquota_file		stringnoz["usrjquota=syz"]
	grpjquota		stringnoz["grpjquota"]
	commit			fs_opt_hex["commit", int32]
	resize			fs_opt_hex["resize", int32]
	resize_auto		stringnoz["resize=auto"]
	jdev			fs_opt_filename["jdev"]
	jqfmt_vfsold		stringnoz["jqfmt=vfsold"]
	jqfmt_vfsv0		stringnoz["jqfmt=vfsv0"]
	hash_tea		stringnoz["hash=tea"]
	hash_rupasov		stringnoz["hash=rupasov"]
	hash_r5			stringnoz["hash=r5"]
	balloc_noborder		stringnoz["block-allocator=noborder"]
	balloc_border		stringnoz["block-allocator=border"]
	balloc_no_unhash_reloc	stringnoz["block-allocator=no_unhashed_relocation"]
	balloc_hashed_reloc	stringnoz["block-allocator=hashed_relocation"]
	balloc_test4		stringnoz["block-allocator=test4"]
	balloc_notest4		stringnoz["block-allocator=notest4"]
	barrier_none		stringnoz["barrier=none"]
	barrier_flush		stringnoz["barrier=flush"]
	data_ordered		stringnoz["data=ordered"]
	data_journal		stringnoz["data=journal"]
	data_writeback		stringnoz["data=writeback"]
	errors_continue		stringnoz["errors=continue"]
	errors_ro_remount	stringnoz["errors=ro-remount"]
] [varlen]

hfs_options [
	quiet		stringnoz["quiet"]
	umask		fs_opt_oct["umask", int32]
	file_umask	fs_opt_oct["file_umask", int32]
	dir_umask	fs_opt_oct["dir_umask", int32]
	uid		fs_opt_hex["uid", uid]
	gid		fs_opt_hex["gid", gid]
	part		fs_opt_hex["part", int32]
	session		fs_opt_hex["session", int32]
	type		fs_opt["type", array[int8, 4]]
	creator		fs_opt["creator", array[int8, 4]]
	codepage	fs_opt_codepage["codepage"]
	iocharset	fs_opt_codepage["iocharset"]
] [varlen]

hfsplus_options [
	decompose	stringnoz["decompose"]
	nodecompose	stringnoz["nodecompose"]
	barrier		stringnoz["barrier"]
	nobarrier	stringnoz["nobarrier"]
	force		stringnoz["force"]
	umask		fs_opt_oct["umask", int32]
	type		fs_opt["type", array[int8, 4]]
	creator		fs_opt["creator", array[int8, 4]]
	uid		fs_opt_hex["uid", uid]
	gid		fs_opt_hex["gid", gid]
	part		fs_opt_hex["part", int32]
	session		fs_opt_hex["session", int32]
	nls		fs_opt_codepage["nls"]
] [varlen]

iso9660_options [
	norock		stringnoz["norock"]
	nojoliet	stringnoz["nojoliet"]
	unhide		stringnoz["unhide"]
	hide		stringnoz["hide"]
	cruft		stringnoz["cruft"]
	utf8		stringnoz["utf8"]
	map_acorn	stringnoz["map=acorn"]
	map_normal	stringnoz["map=normal"]
	map_off		stringnoz["map=off"]
	check_relaxed	stringnoz["check=relaxed"]
	check_strict	stringnoz["check=strict"]
	overriderock	stringnoz["overriderockperm"]
	nocompress	stringnoz["nocompress"]
	session		fs_opt_hex["session", int32[0:98]]
	sbsector	fs_opt_hex["sbsector", int32]
	uid		fs_opt_hex["uid", uid]
	gid		fs_opt_hex["gid", gid]
	mode		fs_opt_hex["mode", int32]
	dmode		fs_opt_hex["dmode", int32]
	block		fs_opt_hex["block", flags[iso9660_blocks]]
	iocharset	fs_opt_codepage["iocharset"]
] [varlen]

iso9660_blocks = 512, 1024, 2048

gfs2_options [
	spectator		stringnoz["spectator"]
	norecovery		stringnoz["norecovery"]
	ignore_local_fs		stringnoz["ignore_local_fs"]
	localflocks		stringnoz["localflocks"]
	localcaching		stringnoz["localcaching"]
	upgrade			stringnoz["upgrade"]
	acl			stringnoz["acl"]
	noacl			stringnoz["noacl"]
	quota_off		stringnoz["quota=off"]
	quota_account		stringnoz["quota=account"]
	quota_on		stringnoz["quota=on"]
	quota			stringnoz["quota"]
	noquota			stringnoz["noquota"]
	suiddir			stringnoz["suiddir"]
	nosuiddir		stringnoz["nosuiddir"]
	data_writeback		stringnoz["data=writeback"]
	data_ordered		stringnoz["data=ordered"]
	meta			stringnoz["meta"]
	discard			stringnoz["discard"]
	nodiscard		stringnoz["nodiscard"]
	errors_withdraw		stringnoz["errors=withdraw"]
	barrier			stringnoz["barrier"]
	nobarrier		stringnoz["nobarrier"]
	rgrplvb			stringnoz["rgrplvb"]
	norgrplvb		stringnoz["norgrplvb"]
	loccookie		stringnoz["loccookie"]
	noloccookie		stringnoz["noloccookie"]
	commit			fs_opt_hex["commit", int32]
	statfs_quantum		fs_opt_hex["statfs_quantum", int32]
	statfs_percent		fs_opt_hex["statfs_percent", int32]
	quota_quantum		fs_opt_hex["quota_quantum", int32]
	lockproto_dlm		stringnoz["lockproto=dlm"]
	lockproto_nolock	stringnoz["lockproto=lock_nolock"]
	locktable		fs_opt_str["locktable"]
	hostdata		fs_opt_str["hostdata"]
] [varlen]

jfs_options [
	integrity	stringnoz["integrity"]
	nointegrity	stringnoz["nointegrity"]
	resize		stringnoz["resize"]
	noquota		stringnoz["noquota"]
	quota		stringnoz["quota"]
	usrquota	stringnoz["usrquota"]
	grpquota	stringnoz["grpquota"]
	discard		stringnoz["discard"]
	nodiscard	stringnoz["nodiscard"]
	iocharset	fs_opt_codepage["iocharset"]
	errors_continue	stringnoz["errors=continue"]
	errors_remount	stringnoz["errors=remount-ro"]
	resize_size	fs_opt_hex["resize", int32]
	uid		fs_opt_hex["uid", uid]
	gid		fs_opt_hex["gid", gid]
	umask		fs_opt_hex["umask", int32]
	discard_size	fs_opt_hex["discard", int32]
] [varlen]

btrfs_options [
	degraded		stringnoz["degraded"]
	nodatasum		stringnoz["nodatasum"]
	datasum			stringnoz["datasum"]
	nodatacow		stringnoz["nodatacow"]
	datacow			stringnoz["datacow"]
	nobarrier		stringnoz["nobarrier"]
	barrier			stringnoz["barrier"]
	compress		stringnoz["compress"]
	compress_force		stringnoz["compress-force"]
	ssd			stringnoz["ssd"]
	ssd_spread		stringnoz["ssd_spread"]
	nossd_spread		stringnoz["nossd_spread"]
	nossd			stringnoz["nossd"]
	acl			stringnoz["acl"]
	noacl			stringnoz["noacl"]
	notreelog		stringnoz["notreelog"]
	treelog			stringnoz["treelog"]
	flushoncommit		stringnoz["flushoncommit"]
	noflushoncommit		stringnoz["noflushoncommit"]
	discard			stringnoz["discard"]
	nodiscard		stringnoz["nodiscard"]
	space_cache		stringnoz["space_cache"]
	clear_cache		stringnoz["clear_cache"]
	user_subvol_rm		stringnoz["user_subvol_rm_allowed"]
	enospc_debug		stringnoz["enospc_debug"]
	noenospc_debug		stringnoz["noenospc_debug"]
	autodefrag		stringnoz["autodefrag"]
	noautodefrag		stringnoz["noautodefrag"]
	inode_cache		stringnoz["inode_cache"]
	noinode_cache		stringnoz["noinode_cache"]
	nospace_cache		stringnoz["nospace_cache"]
	usebackuproot		stringnoz["usebackuproot"]
	skip_balance		stringnoz["skip_balance"]
	check_int		stringnoz["check_int"]
	check_int_data		stringnoz["check_int_data"]
	rescan_uuid_tree	stringnoz["rescan_uuid_tree"]
	fragment_data		stringnoz["fragment=data"]
	fragment_metadata	stringnoz["fragment=metadata"]
	fragment_all		stringnoz["fragment=all"]
	ref_verify		stringnoz["ref_verify"]
	metadata_ratio		fs_opt_hex["metadata_ratio", int32]
	check_int_print_mask	fs_opt_hex["check_int_print_mask", int32]
	commit			fs_opt_hex["commit", int32]
	thread_pool		fs_opt_hex["thread_pool", int32]
	device			fs_opt_filename["device"]
	subvolid		fs_opt_hex["subvolid", int64]
	subvol			fs_opt_str["subvol"]
	max_inline		fs_opt_dec_suffix["max_inline"]
	compress_algo		fs_opt["compress", stringnoz[btrfs_compress_algos]]
	compress_force_algo	fs_opt["compress-force", stringnoz[btrfs_compress_algos]]
	space_cache_v1		stringnoz["space_cache=v1"]
	space_cache_v2		stringnoz["space_cache=v2"]
] [varlen]

btrfs_compress_algos = "zlib", "lzo", "zstd", "no"

ntfs_options [
	uid			fs_opt_hex["uid", uid]
	gid			fs_opt_hex["gid", gid]
	umask			fs_opt_oct["umask", int32]
	fmask			fs_opt_oct["fmask", int32]
	dmask			fs_opt_oct["dmask", int32]
	mft_zone_multiplier	fs_opt_hex["mft_zone_multiplier", int32[-1:4]]
	show_sys_files_no	stringnoz["show_sys_files=no"]
	show_sys_files_yes	stringnoz["show_sys_files=yes"]
	case_sensitive_no	stringnoz["case_sensitive=no"]
	case_sensitive_yes	stringnoz["case_sensitive=yes"]
	disable_sparse_no	stringnoz["disable_sparse=no"]
	disable_sparse_yes	stringnoz["disable_sparse=yes"]
	errors_remount		stringnoz["errors=remount-ro"]
	errors_continue		stringnoz["errors=continue"]
	errors_recover		stringnoz["errors=recover"]
	nls			fs_opt_codepage["nls"]
	utf8			stringnoz["utf8"]
] [varlen]

ext4_options [
	bsddf			stringnoz["bsddf"]
	minixdf			stringnoz["minixdf"]
	grpid			stringnoz["grpid"]
	bsdgroups		stringnoz["bsdgroups"]
	nogrpid			stringnoz["nogrpid"]
	sysvgroups		stringnoz["sysvgroups"]
	errors_continue		stringnoz["errors=continue"]
	errors_remount		stringnoz["errors=remount-ro"]
	nouid32			stringnoz["nouid32"]
	debug			stringnoz["debug"]
	oldalloc		stringnoz["oldalloc"]
	orlov			stringnoz["orlov"]
	user_xattr		stringnoz["user_xattr"]
	nouser_xattr		stringnoz["nouser_xattr"]
	acl			stringnoz["acl"]
	noacl			stringnoz["noacl"]
	norecovery		stringnoz["norecovery"]
	noload			stringnoz["noload"]
	nobh			stringnoz["nobh"]
	bh			stringnoz["bh"]
	journal_checksum	stringnoz["journal_checksum"]
	nojournal_checksum	stringnoz["nojournal_checksum"]
	journal_async_commit	stringnoz["journal_async_commit"]
	abort			stringnoz["abort"]
	data_journal		stringnoz["data=journal"]
	data_ordered		stringnoz["data=ordered"]
	data_writeback		stringnoz["data=writeback"]
	data_err_abort		stringnoz["data_err=abort"]
	data_err_ignore		stringnoz["data_err=ignore"]
	usrjquota		stringnoz["usrjquota="]
	grpjquota		stringnoz["grpjquota="]
	jqfmt_vfsold		stringnoz["jqfmt=vfsold"]
	jqfmt_vfsv0		stringnoz["jqfmt=vfsv0"]
	jqfmt_vfsv1		stringnoz["jqfmt=vfsv1"]
	grpquota		stringnoz["grpquota"]
	noquota			stringnoz["noquota"]
	quota			stringnoz["quota"]
	usrquota		stringnoz["usrquota"]
	prjquota		stringnoz["prjquota"]
	barrier			stringnoz["barrier"]
	nobarrier		stringnoz["nobarrier"]
	i_version		stringnoz["i_version"]
	dax			stringnoz["dax"]
	delalloc		stringnoz["delalloc"]
	lazytime		stringnoz["lazytime"]
	nolazytime		stringnoz["nolazytime"]
	nodelalloc		stringnoz["nodelalloc"]
	mblk_io_submit		stringnoz["mblk_io_submit"]
	nomblk_io_submit	stringnoz["nomblk_io_submit"]
	block_validity		stringnoz["block_validity"]
	noblock_validity	stringnoz["noblock_validity"]
	auto_da_alloc		stringnoz["auto_da_alloc"]
	noauto_da_alloc		stringnoz["noauto_da_alloc"]
	dioread_nolock		stringnoz["dioread_nolock"]
	dioread_lock		stringnoz["dioread_lock"]
	discard			stringnoz["discard"]
	nodiscard		stringnoz["nodiscard"]
	init_itable		stringnoz["init_itable"]
	noinit_itable		stringnoz["noinit_itable"]
	test_dummy_encryption	stringnoz["test_dummy_encryption"]
	nombcache		stringnoz["nombcache"]
	resgid			fs_opt_hex["resgid", gid]
	resuid			fs_opt_hex["resuid", uid]
	sb			fs_opt_hex["sb", int32]
	commit			fs_opt_hex["commit", int32]
	min_batch_time		fs_opt_hex["min_batch_time", int32]
	max_batch_time		fs_opt_hex["max_batch_time", int32]
	journal_dev		fs_opt_hex["journal_dev", int32]
	barrier_val		fs_opt_hex["barrier", int32]
	stripe			fs_opt_hex["stripe", int32]
	debug_want_extra_isize	fs_opt_hex["debug_want_extra_isize", int32]
	inode_readahead_blks	fs_opt_hex["inode_readahead_blks", flags[ext4_inode_readahead_blks]]
	journal_ioprio		fs_opt_hex["journal_ioprio", int32[0:7]]
	auto_da_alloc_val	fs_opt_hex["auto_da_alloc", int32]
	init_itable_val		fs_opt_hex["init_itable", int32]
	max_dir_size_kb		fs_opt_hex["max_dir_size_kb", int32]
	journal_path		fs_opt_filename["journal_path"]
	grpjquota_path		fs_opt_filename["grpjquota"]
	usrjquota_path		fs_opt_filename["usrjquota"]
] [varlen]

ext4_inode_readahead_blks = 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000

f2fs_options [
	background_gc_sync	stringnoz["background_gc=sync"]
	background_gc_off	stringnoz["background_gc=off"]
	background_gc_on	stringnoz["background_gc=on"]
	disable_roll_forward	stringnoz["disable_roll_forward"]
	norecovery		stringnoz["norecovery"]
	discard			stringnoz["discard"]
	nodiscard		stringnoz["nodiscard"]
	noheap			stringnoz["noheap"]
	heap			stringnoz["heap"]
	user_xattr		stringnoz["user_xattr"]
	nouser_xattr		stringnoz["nouser_xattr"]
	acl			stringnoz["acl"]
	noacl			stringnoz["noacl"]
	six_active_logs		stringnoz["active_logs=6"]
	four_active_logs	stringnoz["active_logs=4"]
	two_active_logs		stringnoz["active_logs=2"]
	disable_ext_identify	stringnoz["disable_ext_identify"]
	inline_xattr		stringnoz["inline_xattr"]
	noinline_xattr		stringnoz["noinline_xattr"]
	inline_xattr_size	fs_opt_hex["inline_xattr_size", int32]
	inline_data		stringnoz["inline_data"]
	noinline_data		stringnoz["noinline_data"]
	inline_dentry		stringnoz["inline_dentry"]
	noinline_dentry		stringnoz["noinline_dentry"]
	flush_merge		stringnoz["flush_merge"]
	noflush_merge		stringnoz["noflush_merge"]
	nobarrier		stringnoz["nobarrier"]
	fastboot		stringnoz["fastboot"]
	extent_cache		stringnoz["extent_cache"]
	noextent_cache		stringnoz["noextent_cache"]
	data_flush		stringnoz["data_flush"]
	adaptive_mode		stringnoz["mode=adaptive"]
	lfs_mode		stringnoz["mode=lfs"]
	resgid			fs_opt_hex["resgid", gid]
	resuid			fs_opt_hex["resuid", uid]
	lazytime		stringnoz["lazytime"]
	nolazytime		stringnoz["nolazytime"]
	quota			stringnoz["quota"]
	noquota			stringnoz["noquota"]
	usrquota		fs_opt_str["usrquota"]
	grpquota		fs_opt_str["grpquota"]
	prjquota		fs_opt_str["prjquota"]
	usrjquota		fs_opt_str["usrjquota"]
	grpjquota		fs_opt_str["grpjquota"]
	prjjquota		fs_opt_str["prjjquota"]
	jqfmt_vfsold		stringnoz["jqfmt=vfsold"]
	jqfmt_vfsv0		stringnoz["jqfmt=vfsv0"]
	jqfmt_vfsv1		stringnoz["jqfmt=vfsv1"]
	whint_mode_user		stringnoz["whint_mode=user-based"]
	whint_mode_off		stringnoz["whint_mode=off"]
	whint_mode_fs		stringnoz["whint_mode=fs-based"]
	alloc_mode_def		stringnoz["alloc_mode=default"]
	alloc_mode_reuse	stringnoz["alloc_mode=reuse"]
	fsync_mode_posix	stringnoz["fsync_mode=posix"]
	fsync_mode_strict	stringnoz["fsync_mode=strict"]
	test_dummy_encryption	stringnoz["test_dummy_encryption"]
] [varlen]

bpf_options [
	mode	fs_opt_oct["mode", int32]
] [varlen]

codepage_nums = "1250", "1251", "1255", "437", "737", "775", "850", "852", "855", "857", "860", "861", "862", "863", "864", "865", "866", "869", "874", "932", "936", "949", "950"
codepages_names = "macceltic", "maccenteuro", "maccroatian", "maccyrillic", "macgaelic", "macgreek", "maciceland", "macinuit", "macroman", "macromanian", "macturkish", "ascii", "default", "cp1250", "cp1251", "cp1255", "cp437", "cp737", "cp775", "cp850", "cp852", "cp855", "cp857", "cp860", "cp861", "cp862", "cp863", "cp864", "cp865", "cp866", "cp869", "cp874", "cp932", "cp936", "cp949", "cp950", "euc-jp", "iso8859-13", "iso8859-14", "iso8859-15", "iso8859-1", "iso8859-2", "iso8859-3", "iso8859-4", "iso8859-5", "iso8859-6", "iso8859-7", "iso8859-9", "koi8-r", "koi8-ru", "koi8-u", "utf8", "none"
mount_flags = MS_BIND, MS_DIRSYNC, MS_MANDLOCK, MS_MOVE, MS_NOATIME, MS_NODEV, MS_NODIRATIME, MS_NOEXEC, MS_NOSUID, MS_RDONLY, MS_RELATIME, MS_REMOUNT, MS_SILENT, MS_STRICTATIME, MS_SYNCHRONOUS, MS_REC, MS_POSIXACL, MS_UNBINDABLE, MS_PRIVATE, MS_SLAVE, MS_SHARED, MS_I_VERSION, MS_LAZYTIME
umount_flags = MNT_FORCE, MNT_DETACH, MNT_EXPIRE, UMOUNT_NOFOLLOW