+++ /dev/null
-#!/usr/bin/env bash
-# SPDX-License-Identifier: LGPL-2.1-or-later
-set -eu
-set -o pipefail
-
-cpp="${1:?}"
-filesystems_gperf="${2:?}"
-shift 2
-
-error=false
-
-# shellcheck disable=SC2086
-for fs in $($cpp -dM -include linux/magic.h "$@" - </dev/null | \
- grep -E '_MAGIC' | \
- grep -vE 'LINUX_MAGIC' | \
- awk '/^#define[ \t]+[A-Z0-9_]+MAGIC[ \t]+/ { print $2; }'); do
- if ! grep -E "\{.*$fs.*\}" "$filesystems_gperf" >/dev/null; then
- # STACK_END_MAGIC doesn't refer to a filesystem
- # mtd_inode was removed in 2015
- # futexfs was removed in 2018
- if [[ "$fs" =~ ^(STACK_END_MAGIC|MTD_INODE_FS_MAGIC|FUTEXFS_SUPER_MAGIC)$ ]]; then
- continue
- fi
- echo "Filesystem found in kernel header but not in $(basename "$filesystems_gperf"): $fs";
- error=true
- fi
-done
-
-if $error; then
- exit 1
-fi
--- /dev/null
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+import os
+import subprocess
+import sys
+
+NAME_TO_MAGIC = {
+ 'apparmorfs': ['AAFS_MAGIC'],
+ 'adfs': ['ADFS_SUPER_MAGIC'],
+ 'affs': ['AFFS_SUPER_MAGIC'],
+ 'afs': ['AFS_FS_MAGIC',
+ 'AFS_SUPER_MAGIC'],
+ 'anon_inodefs': ['ANON_INODE_FS_MAGIC'],
+ 'autofs': ['AUTOFS_SUPER_MAGIC'],
+ 'balloon-kvm': ['BALLOON_KVM_MAGIC'],
+ 'bcachefs': ['BCACHEFS_SUPER_MAGIC'],
+ 'bdev': ['BDEVFS_MAGIC'],
+ 'binder': ['BINDERFS_SUPER_MAGIC'],
+ 'binfmt_misc': ['BINFMTFS_MAGIC'],
+ 'bpf': ['BPF_FS_MAGIC'],
+ 'btrfs': ['BTRFS_SUPER_MAGIC'],
+ 'btrfs_test_fs': ['BTRFS_TEST_MAGIC'],
+ # cpuset's magic got reassigned to cgroupfs
+ 'cpuset': ['CGROUP_SUPER_MAGIC'],
+ 'ceph': ['CEPH_SUPER_MAGIC'],
+ 'cgroup2': ['CGROUP2_SUPER_MAGIC'],
+ # note that the cgroupfs magic got reassigned from cpuset
+ 'cgroup': ['CGROUP_SUPER_MAGIC'],
+ 'cifs': ['CIFS_SUPER_MAGIC',
+ 'SMB2_SUPER_MAGIC'],
+ 'coda': ['CODA_SUPER_MAGIC'],
+ 'configfs': ['CONFIGFS_MAGIC'],
+ 'cramfs': ['CRAMFS_MAGIC'],
+ 'dax': ['DAXFS_MAGIC'],
+ 'debugfs': ['DEBUGFS_MAGIC'],
+ 'devmem': ['DEVMEM_MAGIC'],
+ 'devpts': ['DEVPTS_SUPER_MAGIC'],
+ # devtmpfs is just a special instance of tmpfs, hence it reports its magic
+ 'devtmpfs': ['TMPFS_MAGIC'],
+ 'dmabuf': ['DMA_BUF_MAGIC'],
+ 'ecryptfs': ['ECRYPTFS_SUPER_MAGIC'],
+ 'efivarfs': ['EFIVARFS_MAGIC'],
+ 'efs': ['EFS_SUPER_MAGIC'],
+ 'erofs': ['EROFS_SUPER_MAGIC_V1'],
+ # ext2 + ext3 + ext4 use the same magic
+ 'ext2': ['EXT2_SUPER_MAGIC'],
+ 'ext3': ['EXT3_SUPER_MAGIC'],
+ 'ext4': ['EXT4_SUPER_MAGIC'],
+ 'exfat': ['EXFAT_SUPER_MAGIC'],
+ 'f2fs': ['F2FS_SUPER_MAGIC'],
+ # fuseblk is so closely related to fuse that it shares the same magic
+ 'fuseblk': ['FUSE_SUPER_MAGIC'],
+ 'fuse': ['FUSE_SUPER_MAGIC'],
+ 'fusectl': ['FUSE_CTL_SUPER_MAGIC'],
+ # gfs is an old version of gfs2 and reuses the magic
+ 'gfs': ['GFS2_MAGIC'],
+ 'gfs2': ['GFS2_MAGIC'],
+ 'hostfs': ['HOSTFS_SUPER_MAGIC'],
+ 'hpfs': ['HPFS_SUPER_MAGIC'],
+ 'hugetlbfs': ['HUGETLBFS_MAGIC'],
+ 'iso9660': ['ISOFS_SUPER_MAGIC'],
+ 'jffs2': ['JFFS2_SUPER_MAGIC'],
+ 'minix': ['MINIX_SUPER_MAGIC',
+ 'MINIX_SUPER_MAGIC2',
+ 'MINIX2_SUPER_MAGIC',
+ 'MINIX2_SUPER_MAGIC2',
+ 'MINIX3_SUPER_MAGIC'],
+ 'mqueue': ['MQUEUE_MAGIC'],
+ # msdos is an older legacy version of vfat, shares the magic
+ 'msdos': ['MSDOS_SUPER_MAGIC'],
+ # ncp/ncpfs have been removed from the kernel, but ncpfs was the official name
+ 'ncp': ['NCP_SUPER_MAGIC'],
+ 'ncpfs': ['NCP_SUPER_MAGIC'],
+ # nfs is the old version of nfs4, and they share the same magic
+ 'nfs': ['NFS_SUPER_MAGIC'],
+ 'nfs4': ['NFS_SUPER_MAGIC'],
+ 'nilfs2': ['NILFS_SUPER_MAGIC'],
+ 'nsfs': ['NSFS_MAGIC'],
+ 'ntfs': ['NTFS_SB_MAGIC'],
+ 'ntfs3': ['NTFS3_SUPER_MAGIC'],
+ 'ocfs2': ['OCFS2_SUPER_MAGIC'],
+ 'openpromfs': ['OPENPROM_SUPER_MAGIC'],
+ 'orangefs': ['ORANGEFS_DEVREQ_MAGIC'],
+ 'overlay': ['OVERLAYFS_SUPER_MAGIC'],
+ 'pidfs': ['PID_FS_MAGIC'],
+ 'pipefs': ['PIPEFS_MAGIC'],
+ 'ppc-cmm': ['PPC_CMM_MAGIC'],
+ 'proc': ['PROC_SUPER_MAGIC'],
+ 'pstore': ['PSTOREFS_MAGIC'],
+ # pvfs2 is the old version of orangefs
+ 'pvfs2': ['ORANGEFS_DEVREQ_MAGIC'],
+ 'qnx4': ['QNX4_SUPER_MAGIC'],
+ 'qnx6': ['QNX6_SUPER_MAGIC'],
+ 'ramfs': ['RAMFS_MAGIC'],
+ 'resctrl': ['RDTGROUP_SUPER_MAGIC'],
+ 'reiserfs': ['REISERFS_SUPER_MAGIC'],
+ 'rpc_pipefs': ['RPC_PIPEFS_SUPER_MAGIC'],
+ 'secretmem': ['SECRETMEM_MAGIC'],
+ 'securityfs': ['SECURITYFS_MAGIC'],
+ 'selinuxfs': ['SELINUX_MAGIC'],
+ 'shiftfs': ['SHIFTFS_MAGIC'],
+ 'smackfs': ['SMACK_MAGIC'],
+ # smb3 is an alias for cifs
+ 'smb3': ['CIFS_SUPER_MAGIC'],
+ # smbfs was removed from the kernel in 2010, the magic remains
+ 'smbfs': ['SMB_SUPER_MAGIC'],
+ 'sockfs': ['SOCKFS_MAGIC'],
+ 'squashfs': ['SQUASHFS_MAGIC'],
+ 'sysfs': ['SYSFS_MAGIC'],
+ # note that devtmpfs shares the same magic with tmpfs, given it is just a special named instance of it.
+ 'tmpfs': ['TMPFS_MAGIC'],
+ 'tracefs': ['TRACEFS_MAGIC'],
+ 'udf': ['UDF_SUPER_MAGIC'],
+ 'usbdevfs': ['USBDEVICE_SUPER_MAGIC'],
+ 'vboxsf': ['VBOXSF_SUPER_MAGIC'],
+ # note that msdos shares the same magic (and is the older version)
+ 'vfat': ['MSDOS_SUPER_MAGIC'],
+ 'v9fs': ['V9FS_MAGIC'],
+ 'xenfs': ['XENFS_SUPER_MAGIC'],
+ 'xfs': ['XFS_SUPER_MAGIC'],
+ 'z3fold': ['Z3FOLD_MAGIC'],
+ 'zonefs': ['ZONEFS_MAGIC'],
+ 'zsmalloc': ['ZSMALLOC_MAGIC'],
+}
+
+# System magics are sometimes not unique, because file systems got new
+# revisions or got renamed. Let's prefer newer over older here, and thus ignore
+# the old names.
+OBSOLETE_NAMES = {
+ 'cpuset', # magic taken over by cgroupfs
+ 'devtmpfs', # not a file system of its own, but just a "named superblock" of tmpfs
+ 'ext2', # ext4 is the newest revision of ext2 + ext3
+ 'ext3',
+ 'fuseblk', # closely related to fuse; they share a single magic, but the latter is more common
+ 'gfs', # magic taken over by gfs2
+ 'msdos', # vfat is the newest revision of msdos
+ 'ncp', # ncpfs (not ncp) was the last name of the netware 'file_system_type'
+ # name before it was removed in 2018
+ 'nfs', # nfs4 is the newest revision of nfs
+ 'pvfs2', # orangefs is the new name of pvfs2
+ 'smb3', # smb3 is an alias for cifs
+}
+
+FILESYSTEM_SETS = [
+ (
+ "@basic-api",
+ "Basic filesystem API",
+ "cgroup",
+ "cgroup2",
+ "devpts",
+ "devtmpfs",
+ "mqueue",
+ "proc",
+ "sysfs",
+ ),
+ (
+ "@anonymous",
+ "Anonymous inodes",
+ "anon_inodefs",
+ "pipefs",
+ "sockfs",
+ ),
+ (
+ "@application",
+ "Application virtual filesystems",
+ "autofs",
+ "fuse",
+ "overlay",
+ ),
+ (
+ "@auxiliary-api",
+ "Auxiliary filesystem API",
+ "binfmt_misc",
+ "configfs",
+ "efivarfs",
+ "fusectl",
+ "hugetlbfs",
+ "rpc_pipefs",
+ "securityfs",
+ ),
+ (
+ "@common-block",
+ "Common block device filesystems",
+ "btrfs",
+ "erofs",
+ "exfat",
+ "ext4",
+ "f2fs",
+ "iso9660",
+ "ntfs3",
+ "squashfs",
+ "udf",
+ "vfat",
+ "xfs",
+ ),
+ (
+ "@historical-block",
+ "Historical block device filesystems",
+ "ext2",
+ "ext3",
+ "minix",
+ ),
+ (
+ "@network",
+ "Well-known network filesystems",
+ "afs",
+ "ceph",
+ "cifs",
+ "gfs",
+ "gfs2",
+ "ncp",
+ "ncpfs",
+ "nfs",
+ "nfs4",
+ "ocfs2",
+ "orangefs",
+ "pvfs2",
+ "smb3",
+ "smbfs",
+ ),
+ (
+ "@privileged-api",
+ "Privileged filesystem API",
+ "bpf",
+ "debugfs",
+ "pstore",
+ "tracefs",
+ ),
+ (
+ "@security",
+ "Security/MAC API VFS",
+ "apparmorfs",
+ "selinuxfs",
+ "smackfs",
+ ),
+ (
+ "@temporary",
+ "Temporary filesystems",
+ "ramfs",
+ "tmpfs",
+ ),
+ (
+ "@known",
+ "All known filesystems declared in the kernel",
+ *NAME_TO_MAGIC.keys(),
+ ),
+]
+
+def generate_gperf():
+ print("""\
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+%{
+#if __GNUC__ >= 15
+_Pragma("GCC diagnostic ignored \\"-Wzero-as-null-pointer-constant\\"")
+#endif
+#include <linux/magic.h>
+
+#include "filesystems.h"
+#include "stat-util.h"
+
+struct FilesystemMagic {
+ const char *name;
+ statfs_f_type_t magic[FILESYSTEM_MAGIC_MAX];
+};
+%}
+struct FilesystemMagic;
+%language=ANSI-C
+%define hash-function-name filesystems_gperf_hash
+%define lookup-function-name filesystems_gperf_lookup
+%define slot-name name
+%readonly-tables
+%omit-struct-type
+%struct-type
+%includes
+%%""")
+ for name, magics in NAME_TO_MAGIC.items():
+ print(f"{name + ',':16} {{{', '.join(magics)}}}")
+
+def generate_fs_type_to_string():
+ print("""\
+#include <linux/magic.h>
+#include "filesystems.h"
+
+const char* fs_type_to_string(statfs_f_type_t magic) {
+ switch (magic) {""")
+
+ for name, magics in NAME_TO_MAGIC.items():
+ if name in OBSOLETE_NAMES:
+ continue
+ for magic in magics:
+ print(f' case (statfs_f_type_t) {magic}:')
+ print(f' return "{name}";')
+
+ print("""\
+ }
+ return NULL;
+}""")
+
+def generate_filesystem_sets():
+ print('const FilesystemSet filesystem_sets[_FILESYSTEM_SET_MAX] = {')
+
+ for name, desc, *filesystems in FILESYSTEM_SETS:
+ enum = 'FILESYSTEM_SET_' + name[1:].upper().replace('-', '_')
+
+ print(f' [{enum}] = {{')
+ print(f' .name = "{name}",')
+ print(f' .help = "{desc}",')
+ print(f' .value =')
+ for filesystem in filesystems:
+ print(f' "{filesystem}\\0"')
+ print(' },')
+
+ print('};')
+
+def magic_defines():
+ cpp = os.environ['CPP'].split()
+ out = subprocess.check_output(
+ [*cpp, '-dM', '-include', 'linux/magic.h', '-'],
+ stdin=subprocess.DEVNULL,
+ text=True)
+ for line in out.splitlines():
+ _, name, *rest = line.split()
+ if ('_MAGIC' in name
+ and rest and rest[0].startswith('0x')
+ and name not in {
+ 'STACK_END_MAGIC',
+ 'MTD_INODE_FS_MAGIC',
+ 'FUTEXFS_SUPER_MAGIC',
+ 'CRAMFS_MAGIC_WEND',
+ }):
+ yield name
+
+def check():
+ kernel_magics = set(magic_defines())
+ our_magics = set(sum(NAME_TO_MAGIC.values(), start=[]))
+ extra = kernel_magics - our_magics
+ if extra:
+ sys.exit(f"kernel knows additional filesystem magics: {', '.join(sorted(extra))}")
+
+if __name__ == '__main__':
+ for arg in sys.argv[1:]:
+ if arg == 'gperf':
+ generate_gperf()
+ elif arg == 'fs-type-to-string':
+ generate_fs_type_to_string()
+ elif arg == 'filesystem-sets':
+ generate_filesystem_sets()
+ elif arg == 'check':
+ check()
+ else:
+ raise ValueError
+++ /dev/null
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-%{
-#if __GNUC__ >= 15
-_Pragma("GCC diagnostic ignored \"-Wzero-as-null-pointer-constant\"")
-#endif
-#include <linux/magic.h>
-
-#include "filesystems.h"
-#include "stat-util.h"
-
-struct FilesystemMagic {
- const char *name;
- statfs_f_type_t magic[FILESYSTEM_MAGIC_MAX];
-};
-%}
-struct FilesystemMagic;
-%language=ANSI-C
-%define hash-function-name filesystems_gperf_hash
-%define lookup-function-name filesystems_gperf_lookup
-%define slot-name name
-%readonly-tables
-%omit-struct-type
-%struct-type
-%includes
-%%
-apparmorfs, {AAFS_MAGIC}
-adfs, {ADFS_SUPER_MAGIC}
-affs, {AFFS_SUPER_MAGIC}
-afs, {AFS_FS_MAGIC, AFS_SUPER_MAGIC}
-anon_inodefs, {ANON_INODE_FS_MAGIC}
-autofs, {AUTOFS_SUPER_MAGIC}
-balloon-kvm, {BALLOON_KVM_MAGIC}
-bcachefs, {BCACHEFS_SUPER_MAGIC}
-bdev, {BDEVFS_MAGIC}
-binder, {BINDERFS_SUPER_MAGIC}
-binfmt_misc, {BINFMTFS_MAGIC}
-bpf, {BPF_FS_MAGIC}
-btrfs, {BTRFS_SUPER_MAGIC}
-btrfs_test_fs, {BTRFS_TEST_MAGIC}
-# cpuset's magic got reassigned to cgroupfs
-cpuset, {CGROUP_SUPER_MAGIC}
-ceph, {CEPH_SUPER_MAGIC}
-cgroup2, {CGROUP2_SUPER_MAGIC}
-# note that the cgroupfs magic got reassigned from cpuset
-cgroup, {CGROUP_SUPER_MAGIC}
-cifs, {CIFS_SUPER_MAGIC, SMB2_SUPER_MAGIC}
-coda, {CODA_SUPER_MAGIC}
-configfs, {CONFIGFS_MAGIC}
-cramfs, {CRAMFS_MAGIC}
-dax, {DAXFS_MAGIC}
-debugfs, {DEBUGFS_MAGIC}
-devmem, {DEVMEM_MAGIC}
-devpts, {DEVPTS_SUPER_MAGIC}
-# devtmpfs is just a special instance of tmpfs, hence it reports its magic
-devtmpfs, {TMPFS_MAGIC}
-dmabuf, {DMA_BUF_MAGIC}
-ecryptfs, {ECRYPTFS_SUPER_MAGIC}
-efivarfs, {EFIVARFS_MAGIC}
-efs, {EFS_SUPER_MAGIC}
-erofs, {EROFS_SUPER_MAGIC_V1}
-# ext2 + ext3 + ext4 use the same magic
-ext2, {EXT2_SUPER_MAGIC}
-ext3, {EXT3_SUPER_MAGIC}
-ext4, {EXT4_SUPER_MAGIC}
-exfat, {EXFAT_SUPER_MAGIC}
-f2fs, {F2FS_SUPER_MAGIC}
-# fuseblk is so closely related to fuse that it shares the same magic
-fuseblk, {FUSE_SUPER_MAGIC}
-fuse, {FUSE_SUPER_MAGIC}
-fusectl, {FUSE_CTL_SUPER_MAGIC}
-# gfs is an old version of gfs2 and reuses the magic
-gfs, {GFS2_MAGIC}
-gfs2, {GFS2_MAGIC}
-hostfs, {HOSTFS_SUPER_MAGIC}
-hpfs, {HPFS_SUPER_MAGIC}
-hugetlbfs, {HUGETLBFS_MAGIC}
-iso9660, {ISOFS_SUPER_MAGIC}
-jffs2, {JFFS2_SUPER_MAGIC}
-minix, {MINIX_SUPER_MAGIC, MINIX_SUPER_MAGIC2, MINIX2_SUPER_MAGIC, MINIX2_SUPER_MAGIC2, MINIX3_SUPER_MAGIC}
-mqueue, {MQUEUE_MAGIC}
-# msdos is an older legacy version of vfat, shares the magic
-msdos, {MSDOS_SUPER_MAGIC}
-# ncp/ncpfs have been removed from the kernel, but ncpfs was the official name
-ncp, {NCP_SUPER_MAGIC}
-ncpfs, {NCP_SUPER_MAGIC}
-# nfs is the old version of nfs4, and they share the same magic
-nfs, {NFS_SUPER_MAGIC}
-nfs4, {NFS_SUPER_MAGIC}
-nilfs2, {NILFS_SUPER_MAGIC}
-nsfs, {NSFS_MAGIC}
-ntfs, {NTFS_SB_MAGIC}
-ntfs3, {NTFS3_SUPER_MAGIC}
-ocfs2, {OCFS2_SUPER_MAGIC}
-openpromfs, {OPENPROM_SUPER_MAGIC}
-orangefs, {ORANGEFS_DEVREQ_MAGIC}
-overlay, {OVERLAYFS_SUPER_MAGIC}
-pidfs, {PID_FS_MAGIC}
-pipefs, {PIPEFS_MAGIC}
-ppc-cmm, {PPC_CMM_MAGIC}
-proc, {PROC_SUPER_MAGIC}
-pstore, {PSTOREFS_MAGIC}
-# pvfs2 is the old version of orangefs
-pvfs2, {ORANGEFS_DEVREQ_MAGIC}
-qnx4, {QNX4_SUPER_MAGIC}
-qnx6, {QNX6_SUPER_MAGIC}
-ramfs, {RAMFS_MAGIC}
-resctrl, {RDTGROUP_SUPER_MAGIC}
-reiserfs, {REISERFS_SUPER_MAGIC}
-rpc_pipefs, {RPC_PIPEFS_SUPER_MAGIC}
-secretmem, {SECRETMEM_MAGIC}
-securityfs, {SECURITYFS_MAGIC}
-selinuxfs, {SELINUX_MAGIC}
-shiftfs, {SHIFTFS_MAGIC}
-smackfs, {SMACK_MAGIC}
-# smb3 is an alias for cifs
-smb3, {CIFS_SUPER_MAGIC}
-# smbfs was removed from the kernel in 2010, the magic remains
-smbfs, {SMB_SUPER_MAGIC}
-sockfs, {SOCKFS_MAGIC}
-squashfs, {SQUASHFS_MAGIC}
-sysfs, {SYSFS_MAGIC}
-# note that devtmpfs shares the same magic with tmpfs, given it is just a special named instance of it.
-tmpfs, {TMPFS_MAGIC}
-tracefs, {TRACEFS_MAGIC}
-udf, {UDF_SUPER_MAGIC}
-usbdevfs, {USBDEVICE_SUPER_MAGIC}
-vboxsf, {VBOXSF_SUPER_MAGIC}
-# note that msdos shares the same magic (and is the older version)
-vfat, {MSDOS_SUPER_MAGIC}
-v9fs, {V9FS_MAGIC}
-xenfs, {XENFS_SUPER_MAGIC}
-xfs, {XFS_SUPER_MAGIC}
-z3fold, {Z3FOLD_MAGIC}
-zonefs, {ZONEFS_MAGIC}
-zsmalloc, {ZSMALLOC_MAGIC}
#include "stat-util.h"
#include "string-util.h"
-const char* fs_type_to_string(statfs_f_type_t magic) {
-
- switch (magic) {
-#include "filesystem-switch-case.inc"
- }
-
- return NULL;
-}
-
int fs_type_from_string(const char *name, const statfs_f_type_t **ret) {
const struct FilesystemMagic *fs_magic;
return false;
}
-const FilesystemSet filesystem_sets[_FILESYSTEM_SET_MAX] = {
- [FILESYSTEM_SET_BASIC_API] = {
- .name = "@basic-api",
- .help = "Basic filesystem API",
- .value =
- "cgroup\0"
- "cgroup2\0"
- "devpts\0"
- "devtmpfs\0"
- "mqueue\0"
- "proc\0"
- "sysfs\0"
- },
- [FILESYSTEM_SET_ANONYMOUS] = {
- .name = "@anonymous",
- .help = "Anonymous inodes",
- .value =
- "anon_inodefs\0"
- "pipefs\0"
- "sockfs\0"
- },
- [FILESYSTEM_SET_APPLICATION] = {
- .name = "@application",
- .help = "Application virtual filesystems",
- .value =
- "autofs\0"
- "fuse\0"
- "overlay\0"
- },
- [FILESYSTEM_SET_AUXILIARY_API] = {
- .name = "@auxiliary-api",
- .help = "Auxiliary filesystem API",
- .value =
- "binfmt_misc\0"
- "configfs\0"
- "efivarfs\0"
- "fusectl\0"
- "hugetlbfs\0"
- "rpc_pipefs\0"
- "securityfs\0"
- },
- [FILESYSTEM_SET_COMMON_BLOCK] = {
- .name = "@common-block",
- .help = "Common block device filesystems",
- .value =
- "btrfs\0"
- "erofs\0"
- "exfat\0"
- "ext4\0"
- "f2fs\0"
- "iso9660\0"
- "ntfs3\0"
- "squashfs\0"
- "udf\0"
- "vfat\0"
- "xfs\0"
- },
- [FILESYSTEM_SET_HISTORICAL_BLOCK] = {
- .name = "@historical-block",
- .help = "Historical block device filesystems",
- .value =
- "ext2\0"
- "ext3\0"
- "minix\0"
- },
- [FILESYSTEM_SET_NETWORK] = {
- .name = "@network",
- .help = "Well-known network filesystems",
- .value =
- "afs\0"
- "ceph\0"
- "cifs\0"
- "gfs\0"
- "gfs2\0"
- "ncp\0"
- "ncpfs\0"
- "nfs\0"
- "nfs4\0"
- "ocfs2\0"
- "orangefs\0"
- "pvfs2\0"
- "smb3\0"
- "smbfs\0"
- },
- [FILESYSTEM_SET_PRIVILEGED_API] = {
- .name = "@privileged-api",
- .help = "Privileged filesystem API",
- .value =
- "bpf\0"
- "debugfs\0"
- "pstore\0"
- "tracefs\0"
- },
- [FILESYSTEM_SET_SECURITY] = {
- .name = "@security",
- .help = "Security/MAC API VFS",
- .value =
- "apparmorfs\0"
- "selinuxfs\0"
- "smackfs\0"
- },
- [FILESYSTEM_SET_TEMPORARY] = {
- .name = "@temporary",
- .help = "Temporary filesystems",
- .value =
- "ramfs\0"
- "tmpfs\0"
- },
- [FILESYSTEM_SET_KNOWN] = {
- .name = "@known",
- .help = "All known filesystems declared in the kernel",
- .value =
-#include "filesystem-list.inc"
- },
-};
-
-const FilesystemSet *filesystem_set_find(const char *name) {
+const FilesystemSet* filesystem_set_find(const char *name) {
if (isempty(name) || name[0] != '@')
return NULL;
+++ /dev/null
-#!/usr/bin/env python3
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-import sys
-
-keywords_section = False
-
-for line in open(sys.argv[1]):
- if line[0] == '#':
- continue
-
- if keywords_section:
- print('"{}\\0"'.format(line.split(',')[0].strip()))
- elif line.startswith('%%'):
- keywords_section = True
+++ /dev/null
-#!/usr/bin/env python3
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-import sys
-
-
-def filter_fsname(name):
- # File system magics are sometimes not unique, because file systems got new
- # revisions or got renamed. Let's prefer newer over older here, and thus
- # ignore the old names.
-
- return name in {
- "cpuset", # magic taken over by cgroupfs
- "devtmpfs", # not a file system of its own, but just a "named superblock" of tmpfs
- "ext2", # ext4 is the newest revision of ext2 + ext3
- "ext3",
- "fuseblk", # closely related to fuse; they share a single magic, but the latter is more common
- "gfs", # magic taken over by gfs2
- "msdos", # vfat is the newest revision of msdos
- "ncp", # ncpfs (not ncp) was the last name of the netware `file_system_type`
- # name before it was removed in 2018
- "nfs", # nfs4 is the newest revision of nfs
- "pvfs2", # orangefs is the new name of pvfs2
- "smb3", # smb3 is an alias for cifs
- }
-
-
-gperf_file = sys.argv[1]
-keywords_section = False
-
-for line in open(gperf_file):
- if line[0] == "#":
- continue
-
- if keywords_section:
- name, ids = line.split(",", 1)
-
- name = name.strip()
- if filter_fsname(name):
- continue
-
- ids = ids.strip()
- assert ids[0] == "{"
- assert ids[-1] == "}"
- ids = ids[1:-1]
-
- for id in ids.split(","):
- print(f"case (statfs_f_type_t) {id.strip()}:")
-
- print(f' return "{name}";')
-
- if line.startswith("%%"):
- keywords_section = True
############################################################
-r = run_command(
- [
- 'env', '--chdir', meson.project_build_root(),
- files('check-filesystems.sh'),
- cpp,
- files('filesystems-gperf.gperf'),
- system_include_args,
- ],
- check: false,
-)
-if r.returncode() != 0
- warning('Unknown filesystems defined in kernel headers:\n\n' + r.stdout())
-endif
+filesystem_sets_py = files('filesystem-sets.py')
+filesystem_sets_c = custom_target(
+ output : 'filesystem-sets.c',
+ command : [filesystem_sets_py,
+ 'fs-type-to-string',
+ 'filesystem-sets'],
+ capture : true)
+
+filesystems_gperf_gperf = custom_target(
+ output : 'filesystems-gperf.gperf',
+ command : [filesystem_sets_py,
+ 'gperf'],
+ capture : true)
filesystems_gperf_h = custom_target(
- input : 'filesystems-gperf.gperf',
+ input : filesystems_gperf_gperf,
output : 'filesystems-gperf.h',
command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@'])
-filesystem_list_inc = custom_target(
- input : 'filesystems-gperf.gperf',
- output : 'filesystem-list.inc',
- command : [files('generate-filesystem-list.py'),
- '@INPUT@'],
- capture : true)
-
-filesystem_switch_case_inc = custom_target(
- input : 'filesystems-gperf.gperf',
- output : 'filesystem-switch-case.inc',
- command : [files('generate-filesystem-switch-case.py'),
- '@INPUT@'],
- capture : true)
+generated_sources += [filesystem_sets_c, filesystems_gperf_gperf, filesystems_gperf_h]
+basic_sources += [filesystem_sets_c, filesystems_gperf_h]
-generated_sources += [filesystem_list_inc, filesystem_switch_case_inc, filesystems_gperf_h]
-basic_sources += [filesystem_list_inc, filesystem_switch_case_inc, filesystems_gperf_h]
+test('kernel-filesystem-magics',
+ filesystem_sets_py,
+ args : ['check'],
+ env : ['CPP=@0@'.format(cpp)])
libbasic_static = static_library(
'basic',