fsconfig is a very powerful configuration mechanism except that it only works for filesystems with superblocks. This patch series generalises the useful concept of a multiple step configurational mechanism carried by a file descriptor. The object of this patch series is to get bind mounts to be configurable in the same way that superblock based ones are, but it should have utility beyond the filesytem realm. Patch 4 also reimplements fsconfig in terms of configfd, but that's not a strictly necessary patch, it is merely a useful demonstration that configfd is a superset of the properties of fsconfig. in v3, I swept up Al's prefix generalisation of the log that he expanded to use with ceph and rbd, because it's a nice extension to the original fsconfig log. The main reason I'm strongly pushing this, is that by my background I dislike abstractions that aren't abstract enough (have unnecessary ties to concrete features like fsconfig does to the superblock), so the physicist in me likes to make them as abstract as possible. The objection, in the email replies to v2 is that making something so powerful too abstract is going to encourage incorrect reuse and thus cause problems because using an interface of huge power on something that doesn't need it damages the API confinement and makes unintended and unexpected uses easy. I still think this is a wrongheaded argument because we do have subsystems that need powerful config interfaces and we should have the taste to ensure the full power is only used there, but I think it's a useful debate to have. For instance, I think the entire annoying keyctl API could usefully deploy this. Note: v1 of this patch series was originally sent as an rfc in reply to a thread about feature bugs with the new mount API: https://lore.kernel.org/linux-fsdevel/1574295100.17153.25.camel@xxxxxxxxxxxxxxxxxxxxx/ James --- James Bottomley (6): logger: add a limited buffer logging facility configfd: add generic file descriptor based configuration parser configfd: syscall: wire up configfd syscalls fs: implement fsconfig via configfd fs: expose internal interfaces open_detached_copy and do_reconfigure_mount fs: bind: add configfs type for bind mounts arch/alpha/kernel/syscalls/syscall.tbl | 2 + arch/arm/tools/syscall.tbl | 2 + arch/arm64/include/asm/unistd.h | 2 +- arch/arm64/include/asm/unistd32.h | 4 + arch/ia64/kernel/syscalls/syscall.tbl | 2 + arch/m68k/kernel/syscalls/syscall.tbl | 2 + arch/microblaze/kernel/syscalls/syscall.tbl | 2 + arch/mips/kernel/syscalls/syscall_n32.tbl | 2 + arch/mips/kernel/syscalls/syscall_n64.tbl | 2 + arch/mips/kernel/syscalls/syscall_o32.tbl | 2 + arch/parisc/kernel/syscalls/syscall.tbl | 2 + arch/powerpc/kernel/syscalls/syscall.tbl | 2 + arch/s390/kernel/syscalls/syscall.tbl | 2 + arch/sh/kernel/syscalls/syscall.tbl | 2 + arch/sparc/kernel/syscalls/syscall.tbl | 2 + arch/x86/entry/syscalls/syscall_32.tbl | 2 + arch/x86/entry/syscalls/syscall_64.tbl | 2 + arch/xtensa/kernel/syscalls/syscall.tbl | 2 + drivers/block/rbd.c | 2 +- fs/Makefile | 3 +- fs/bind.c | 232 ++++++++++++ fs/ceph/super.c | 4 +- fs/configfd.c | 451 ++++++++++++++++++++++++ fs/filesystems.c | 8 +- fs/fs_context.c | 97 +---- fs/fs_parser.c | 24 +- fs/fsopen.c | 529 ++++++++++++++-------------- fs/internal.h | 7 + fs/namespace.c | 115 +++--- include/linux/ceph/libceph.h | 5 +- include/linux/configfd.h | 61 ++++ include/linux/fs.h | 2 + include/linux/fs_context.h | 58 ++- include/linux/fs_parser.h | 9 +- include/linux/logger.h | 45 +++ include/linux/syscalls.h | 5 + include/uapi/asm-generic/unistd.h | 9 +- include/uapi/linux/configfd.h | 20 ++ lib/Makefile | 3 +- lib/logger.c | 190 ++++++++++ net/ceph/ceph_common.c | 26 +- 41 files changed, 1457 insertions(+), 486 deletions(-) create mode 100644 fs/bind.c create mode 100644 fs/configfd.c create mode 100644 include/linux/configfd.h create mode 100644 include/linux/logger.h create mode 100644 include/uapi/linux/configfd.h create mode 100644 lib/logger.c -- 2.16.4