new mount API series from Dave Howells To quote his cover letter, Here are a set of patches to create a filesystem context prior to setting up a new mount, populating it with the parsed options/binary data, creating the superblock and then effecting the mount. This is also used for remount since much of the parsing stuff is common in many filesystems. This allows namespaces and other information to be conveyed through the mount procedure. This also allows Miklós Szeredi's idea of doing: fd = fsopen("nfs"); fsconfig(fd, FSCONFIG_SET_STRING, "option", "val", 0); fsconfig(fd, FSCONFIG_CMD_CREATE, NULL, NULL, 0); mfd = fsmount(fd, MS_NODEV); move_mount(mfd, "", AT_FDCWD, "/mnt", MOVE_MOUNT_F_EMPTY_PATH); that he presented at LSF-2017 to be implemented (see the relevant patches in the series). I didn't use netlink as that would make the core kernel depend on CONFIG_NET and CONFIG_NETLINK and would introduce network namespacing issues. I've implemented filesystem context handling for procfs, nfs, mqueue, cpuset, kernfs, sysfs, cgroup and afs filesystems. Unconverted filesystems are handled by a legacy filesystem wrapper. One trivial conflict in fs/file_table.c:__fput(); resolved as if (unlikely(mode & FMODE_NEED_UNMOUNT)) dissolve_on_fput(mnt); dput(dentry); mntput(mnt); out: file_free(file); The following changes since commit 32206ab36553be8714d9253ce33f4085681d369c: x86/intel_rdt: Provide pseudo-locking hooks within rdt_mount (2018-06-23 12:53:19 +0200) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs.git work.mount for you to fetch changes up to 294fb3407bf29abf653fbe169af4bbb38a146db5: proc: Set correct userns for new proc super created by a new pid_namespace (2018-08-21 09:28:43 +0100) ---------------------------------------------------------------- Al Viro (2): vfs: syscall: Add open_tree(2) to reference or clone a mount teach move_mount(2) to work with OPEN_TREE_CLONE Andrei Vagin (1): proc: Set correct userns for new proc super created by a new pid_namespace David Howells (42): vfs: Require specification of size of mount data for internal mounts vfs: syscall: Add move_mount(2) to move mounts around vfs: Suppress MS_* flag defs within the kernel unless explicitly enabled vfs: Introduce the basic header for the new mount API's filesystem context vfs: Introduce logging functions vfs: Add configuration parser helpers vfs: Add LSM hooks for the new mount API selinux: Implement the new mount API LSM hooks smack: Implement filesystem context security hooks apparmor: Implement security hooks for the new mount API tomoyo: Implement security hooks for the new mount API vfs: Separate changing mount flags full remount vfs: Implement a filesystem superblock creation/configuration context vfs: Remove unused code after filesystem context changes procfs: Move proc_fill_super() to fs/proc/root.c proc: Add fs_context support to procfs ipc: Convert mqueue fs to fs_context cpuset: Use fs_context kernfs, sysfs, cgroup, intel_rdt: Support fs_context hugetlbfs: Convert to fs_context vfs: Remove kern_mount_data() vfs: Provide documentation for new mount API Make anon_inodes unconditional vfs: syscall: Add fsopen() to prepare for superblock creation vfs: Implement logging through fs_context vfs: Add some logging to the core users of the fs_context log vfs: syscall: Add fsconfig() for configuring and managing a context vfs: syscall: Add fsmount() to create a mount for a superblock vfs: syscall: Add fspick() to select a superblock for reconfiguration afs: Add fs_context support afs: Use fs_context to pass parameters over automount vfs: Add a sample program for the new mount API vfs: syscall: Add fsinfo() to query filesystem information afs: Add fsinfo support vfs: Allow fsinfo() to query what's in an fs_context vfs: Allow fsinfo() to be used to query an fs parameter description vfs: Implement parameter value retrieval with fsinfo() vfs: Fix vfs_dup_fs_context() vfs: Fix fs_context logging when there's no log afs: Move the source fs parameter to the first position vfs: Pass path info fsinfo and rename get_fsinfo sb op to fsinfo vfs: Adjust fsinfo sample output Documentation/filesystems/mount_api.txt | 706 ++++++++++++++++++++++++ arch/arc/kernel/setup.c | 1 + arch/arm/kernel/atags_parse.c | 1 + arch/arm/kvm/Kconfig | 1 - arch/arm64/kvm/Kconfig | 1 - arch/ia64/kernel/perfmon.c | 3 +- arch/mips/kvm/Kconfig | 1 - arch/powerpc/kvm/Kconfig | 1 - arch/powerpc/platforms/cell/spufs/inode.c | 6 +- arch/s390/hypfs/inode.c | 7 +- arch/s390/kvm/Kconfig | 1 - arch/sh/kernel/setup.c | 1 + arch/sparc/kernel/setup_32.c | 1 + arch/sparc/kernel/setup_64.c | 1 + arch/x86/Kconfig | 1 - arch/x86/entry/syscalls/syscall_32.tbl | 7 + arch/x86/entry/syscalls/syscall_64.tbl | 7 + arch/x86/kernel/cpu/intel_rdt.h | 15 + arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 184 ++++--- arch/x86/kernel/setup.c | 1 + arch/x86/kvm/Kconfig | 1 - drivers/base/Kconfig | 1 - drivers/base/devtmpfs.c | 7 +- drivers/char/tpm/Kconfig | 1 - drivers/dax/super.c | 2 +- drivers/dma-buf/Kconfig | 1 - drivers/gpio/Kconfig | 1 - drivers/gpu/drm/drm_drv.c | 3 +- drivers/gpu/drm/i915/i915_gemfs.c | 2 +- drivers/iio/Kconfig | 1 - drivers/infiniband/Kconfig | 1 - drivers/infiniband/hw/qib/qib_fs.c | 7 +- drivers/misc/cxl/api.c | 3 +- drivers/misc/ibmasm/ibmasmfs.c | 11 +- drivers/mtd/mtdsuper.c | 26 +- drivers/oprofile/oprofilefs.c | 8 +- drivers/scsi/cxlflash/ocxl_hw.c | 2 +- drivers/usb/gadget/function/f_fs.c | 7 +- drivers/usb/gadget/legacy/inode.c | 7 +- drivers/vfio/Kconfig | 1 - drivers/virtio/virtio_balloon.c | 2 +- drivers/xen/xenfs/super.c | 7 +- fs/9p/vfs_super.c | 2 +- fs/Kconfig | 7 + fs/Makefile | 5 +- fs/adfs/super.c | 9 +- fs/affs/super.c | 13 +- fs/afs/internal.h | 10 +- fs/afs/mntpt.c | 147 ++--- fs/afs/super.c | 634 +++++++++++++-------- fs/afs/volume.c | 4 +- fs/aio.c | 3 +- fs/anon_inodes.c | 3 +- fs/autofs/autofs_i.h | 2 +- fs/autofs/init.c | 4 +- fs/autofs/inode.c | 3 +- fs/befs/linuxvfs.c | 11 +- fs/bfs/inode.c | 8 +- fs/binfmt_misc.c | 7 +- fs/block_dev.c | 2 +- fs/btrfs/super.c | 30 +- fs/btrfs/tests/btrfs-tests.c | 2 +- fs/ceph/super.c | 3 +- fs/cifs/cifs_dfs_ref.c | 3 +- fs/cifs/cifsfs.c | 18 +- fs/coda/inode.c | 11 +- fs/configfs/mount.c | 7 +- fs/cramfs/inode.c | 17 +- fs/debugfs/inode.c | 14 +- fs/devpts/inode.c | 10 +- fs/ecryptfs/main.c | 2 +- fs/efivarfs/super.c | 9 +- fs/efs/super.c | 14 +- fs/exofs/super.c | 7 +- fs/ext2/super.c | 14 +- fs/ext4/super.c | 16 +- fs/f2fs/super.c | 13 +- fs/fat/inode.c | 3 +- fs/fat/namei_msdos.c | 8 +- fs/fat/namei_vfat.c | 8 +- fs/file_table.c | 9 +- fs/filesystems.c | 4 + fs/freevxfs/vxfs_super.c | 12 +- fs/fs_context.c | 779 ++++++++++++++++++++++++++ fs/fs_parser.c | 483 ++++++++++++++++ fs/fsopen.c | 491 +++++++++++++++++ fs/fuse/control.c | 9 +- fs/fuse/inode.c | 16 +- fs/gfs2/ops_fstype.c | 6 +- fs/gfs2/super.c | 4 +- fs/hfs/super.c | 12 +- fs/hfsplus/super.c | 12 +- fs/hostfs/hostfs_kern.c | 7 +- fs/hpfs/super.c | 11 +- fs/hugetlbfs/inode.c | 455 ++++++++++------ fs/internal.h | 13 +- fs/isofs/inode.c | 11 +- fs/jffs2/super.c | 10 +- fs/jfs/super.c | 11 +- fs/kernfs/mount.c | 102 ++-- fs/libfs.c | 19 +- fs/minix/inode.c | 14 +- fs/namei.c | 4 +- fs/namespace.c | 879 ++++++++++++++++++++++-------- fs/nfs/internal.h | 4 +- fs/nfs/namespace.c | 3 +- fs/nfs/nfs4namespace.c | 3 +- fs/nfs/nfs4super.c | 27 +- fs/nfs/super.c | 22 +- fs/nfsd/nfsctl.c | 8 +- fs/nilfs2/super.c | 10 +- fs/notify/fanotify/Kconfig | 1 - fs/notify/inotify/Kconfig | 1 - fs/nsfs.c | 3 +- fs/ntfs/super.c | 13 +- fs/ocfs2/dlmfs/dlmfs.c | 5 +- fs/ocfs2/super.c | 14 +- fs/omfs/inode.c | 9 +- fs/openpromfs/inode.c | 11 +- fs/orangefs/orangefs-kernel.h | 2 +- fs/orangefs/super.c | 5 +- fs/overlayfs/super.c | 11 +- fs/pipe.c | 3 +- fs/pnode.c | 1 + fs/proc/inode.c | 50 +- fs/proc/internal.h | 6 +- fs/proc/root.c | 247 ++++++--- fs/pstore/inode.c | 10 +- fs/qnx4/inode.c | 14 +- fs/qnx6/inode.c | 14 +- fs/ramfs/inode.c | 6 +- fs/reiserfs/super.c | 14 +- fs/romfs/super.c | 13 +- fs/squashfs/super.c | 12 +- fs/statfs.c | 571 +++++++++++++++++++ fs/super.c | 397 +++++++++++--- fs/sysfs/mount.c | 67 ++- fs/sysv/inode.c | 3 +- fs/sysv/super.c | 16 +- fs/tracefs/inode.c | 10 +- fs/ubifs/super.c | 5 +- fs/udf/super.c | 16 +- fs/ufs/super.c | 11 +- fs/xfs/xfs_super.c | 10 +- include/linux/cgroup.h | 3 +- include/linux/debugfs.h | 8 +- include/linux/fs.h | 50 +- include/linux/fs_context.h | 208 +++++++ include/linux/fs_parser.h | 117 ++++ include/linux/fsinfo.h | 41 ++ include/linux/kernfs.h | 41 +- include/linux/lsm_hooks.h | 79 ++- include/linux/module.h | 6 + include/linux/mount.h | 10 +- include/linux/mtd/super.h | 4 +- include/linux/ramfs.h | 4 +- include/linux/security.h | 72 ++- include/linux/shmem_fs.h | 3 +- include/linux/syscalls.h | 13 + include/uapi/linux/fcntl.h | 2 + include/uapi/linux/fs.h | 82 ++- include/uapi/linux/fsinfo.h | 302 ++++++++++ include/uapi/linux/mount.h | 75 +++ init/Kconfig | 10 - init/do_mounts.c | 5 +- init/do_mounts_initrd.c | 1 + ipc/mqueue.c | 120 +++- kernel/bpf/inode.c | 7 +- kernel/cgroup/cgroup-internal.h | 50 +- kernel/cgroup/cgroup-v1.c | 415 ++++++++------ kernel/cgroup/cgroup.c | 285 +++++++--- kernel/cgroup/cpuset.c | 67 ++- kernel/trace/trace.c | 7 +- mm/shmem.c | 10 +- mm/zsmalloc.c | 3 +- net/socket.c | 3 +- net/sunrpc/rpc_pipe.c | 7 +- samples/Kconfig | 6 + samples/Makefile | 2 +- samples/mount_api/Makefile | 7 + samples/mount_api/test-fsmount.c | 118 ++++ samples/statx/Makefile | 7 +- samples/statx/test-fs-query.c | 137 +++++ samples/statx/test-fsinfo.c | 584 ++++++++++++++++++++ security/apparmor/apparmorfs.c | 8 +- security/apparmor/include/mount.h | 11 +- security/apparmor/lsm.c | 111 +++- security/apparmor/mount.c | 47 ++ security/inode.c | 7 +- security/security.c | 65 ++- security/selinux/hooks.c | 320 ++++++++++- security/selinux/selinuxfs.c | 8 +- security/smack/smack.h | 11 +- security/smack/smack_lsm.c | 373 +++++++++++-- security/smack/smackfs.c | 9 +- security/tomoyo/common.h | 3 + security/tomoyo/mount.c | 46 ++ security/tomoyo/tomoyo.c | 19 +- 198 files changed, 9288 insertions(+), 1874 deletions(-) create mode 100644 Documentation/filesystems/mount_api.txt create mode 100644 fs/fs_context.c create mode 100644 fs/fs_parser.c create mode 100644 fs/fsopen.c create mode 100644 include/linux/fs_context.h create mode 100644 include/linux/fs_parser.h create mode 100644 include/linux/fsinfo.h create mode 100644 include/uapi/linux/fsinfo.h create mode 100644 include/uapi/linux/mount.h create mode 100644 samples/mount_api/Makefile create mode 100644 samples/mount_api/test-fsmount.c create mode 100644 samples/statx/test-fs-query.c create mode 100644 samples/statx/test-fsinfo.c