24 Aug, 2020

1 commit

  • Replace the existing /* fall through */ comments and its variants with
    the new pseudo-keyword macro fallthrough[1]. Also, remove unnecessary
    fall-through markings when it is the case.

    [1] https://www.kernel.org/doc/html/v5.7/process/deprecated.html?highlight=fallthrough#implicit-switch-case-fall-through

    Signed-off-by: Gustavo A. R. Silva

    Gustavo A. R. Silva
     

08 Feb, 2020

2 commits

  • ... turning it into struct p_log embedded into fs_context. Initialize
    the prefix with fs_type->name, turning fs_parse() into a trivial
    inline wrapper for __fs_parse().

    This makes fs_parameter_description->name completely unused.

    Signed-off-by: Al Viro

    Al Viro
     
  • Its behaviour is identical to that of fs_value_is_filename.
    It makes no sense, anyway - LOOKUP_EMPTY affects nothing
    whatsoever once the pathname has been imported from userland.
    And both fs_value_is_filename and fs_value_is_filename_empty
    carry an already imported pathname.

    Signed-off-by: Al Viro

    Al Viro
     

20 Jul, 2019

1 commit

  • Pull vfs mount updates from Al Viro:
    "The first part of mount updates.

    Convert filesystems to use the new mount API"

    * 'work.mount0' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits)
    mnt_init(): call shmem_init() unconditionally
    constify ksys_mount() string arguments
    don't bother with registering rootfs
    init_rootfs(): don't bother with init_ramfs_fs()
    vfs: Convert smackfs to use the new mount API
    vfs: Convert selinuxfs to use the new mount API
    vfs: Convert securityfs to use the new mount API
    vfs: Convert apparmorfs to use the new mount API
    vfs: Convert openpromfs to use the new mount API
    vfs: Convert xenfs to use the new mount API
    vfs: Convert gadgetfs to use the new mount API
    vfs: Convert oprofilefs to use the new mount API
    vfs: Convert ibmasmfs to use the new mount API
    vfs: Convert qib_fs/ipathfs to use the new mount API
    vfs: Convert efivarfs to use the new mount API
    vfs: Convert configfs to use the new mount API
    vfs: Convert binfmt_misc to use the new mount API
    convenience helper: get_tree_single()
    convenience helper get_tree_nodev()
    vfs: Kill sget_userns()
    ...

    Linus Torvalds
     

26 May, 2019

1 commit

  • Call graph of vfs_get_tree():
    vfs_fsconfig_locked() # neither kernmount, nor submount
    do_new_mount() # neither kernmount, nor submount
    fc_mount()
    afs_mntpt_do_automount() # submount
    mount_one_hugetlbfs() # kernmount
    pid_ns_prepare_proc() # kernmount
    mq_create_mount() # kernmount
    vfs_kern_mount()
    simple_pin_fs() # kernmount
    vfs_submount() # submount
    kern_mount() # kernmount
    init_mount_tree()
    btrfs_mount()
    nfs_do_root_mount()

    The first two need the check (unconditionally).
    init_mount_tree() is setting rootfs up; any capability
    checks make zero sense for that one. And btrfs_mount()/
    nfs_do_root_mount() have the checks already done in their
    callers.

    IOW, we can shift mount_capable() handling into
    the two callers - one in the normal case of mount(2),
    another - in fsconfig(2) handling of FSCONFIG_CMD_CREATE.
    I.e. the syscalls that set a new filesystem up.

    Signed-off-by: Al Viro

    Al Viro
     

24 May, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of the gnu general public licence as published by
    the free software foundation either version 2 of the licence or at
    your option any later version

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-or-later

    has been chosen to replace the boilerplate/reference in 114 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Kate Stewart
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190520170857.552531963@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

17 May, 2019

1 commit

  • Make the name of the anon inode fd "[fscontext]" instead of "fscontext".
    This is minor but most core-kernel anon inode fds already carry square
    brackets around their name:

    [eventfd]
    [eventpoll]
    [fanotify]
    [io_uring]
    [pidfd]
    [signalfd]
    [timerfd]
    [userfaultfd]

    For the sake of consistency lets do the same for the fscontext anon inode
    fd that comes with the new mount api.

    Signed-off-by: Christian Brauner
    Signed-off-by: David Howells
    Signed-off-by: Al Viro

    Christian Brauner
     

21 Mar, 2019

4 commits

  • Provide an fspick() system call that can be used to pick an existing
    mountpoint into an fs_context which can thereafter be used to reconfigure a
    superblock (equivalent of the superblock side of -o remount).

    This looks like:

    int fd = fspick(AT_FDCWD, "/mnt",
    FSPICK_CLOEXEC | FSPICK_NO_AUTOMOUNT);
    fsconfig(fd, FSCONFIG_SET_FLAG, "intr", NULL, 0);
    fsconfig(fd, FSCONFIG_SET_FLAG, "noac", NULL, 0);
    fsconfig(fd, FSCONFIG_CMD_RECONFIGURE, NULL, NULL, 0);

    At the point of fspick being called, the file descriptor referring to the
    filesystem context is in exactly the same state as the one that was created
    by fsopen() after fsmount() has been successfully called.

    Signed-off-by: David Howells
    cc: linux-api@vger.kernel.org
    Signed-off-by: Al Viro

    David Howells
     
  • Add a syscall for configuring a filesystem creation context and triggering
    actions upon it, to be used in conjunction with fsopen, fspick and fsmount.

    long fsconfig(int fs_fd, unsigned int cmd, const char *key,
    const void *value, int aux);

    Where fs_fd indicates the context, cmd indicates the action to take, key
    indicates the parameter name for parameter-setting actions and, if needed,
    value points to a buffer containing the value and aux can give more
    information for the value.

    The following command IDs are proposed:

    (*) FSCONFIG_SET_FLAG: No value is specified. The parameter must be
    boolean in nature. The key may be prefixed with "no" to invert the
    setting. value must be NULL and aux must be 0.

    (*) FSCONFIG_SET_STRING: A string value is specified. The parameter can
    be expecting boolean, integer, string or take a path. A conversion to
    an appropriate type will be attempted (which may include looking up as
    a path). value points to a NUL-terminated string and aux must be 0.

    (*) FSCONFIG_SET_BINARY: A binary blob is specified. value points to
    the blob and aux indicates its size. The parameter must be expecting
    a blob.

    (*) FSCONFIG_SET_PATH: A non-empty path is specified. The parameter must
    be expecting a path object. value points to a NUL-terminated string
    that is the path and aux is a file descriptor at which to start a
    relative lookup or AT_FDCWD.

    (*) FSCONFIG_SET_PATH_EMPTY: As fsconfig_set_path, but with AT_EMPTY_PATH
    implied.

    (*) FSCONFIG_SET_FD: An open file descriptor is specified. value must
    be NULL and aux indicates the file descriptor.

    (*) FSCONFIG_CMD_CREATE: Trigger superblock creation.

    (*) FSCONFIG_CMD_RECONFIGURE: Trigger superblock reconfiguration.

    For the "set" command IDs, the idea is that the file_system_type will point
    to a list of parameters and the types of value that those parameters expect
    to take. The core code can then do the parse and argument conversion and
    then give the LSM and FS a cooked option or array of options to use.

    Source specification is also done the same way same way, using special keys
    "source", "source1", "source2", etc..

    [!] Note that, for the moment, the key and value are just glued back
    together and handed to the filesystem. Every filesystem that uses options
    uses match_token() and co. to do this, and this will need to be changed -
    but not all at once.

    Example usage:

    fd = fsopen("ext4", FSOPEN_CLOEXEC);
    fsconfig(fd, fsconfig_set_path, "source", "/dev/sda1", AT_FDCWD);
    fsconfig(fd, fsconfig_set_path_empty, "journal_path", "", journal_fd);
    fsconfig(fd, fsconfig_set_fd, "journal_fd", "", journal_fd);
    fsconfig(fd, fsconfig_set_flag, "user_xattr", NULL, 0);
    fsconfig(fd, fsconfig_set_flag, "noacl", NULL, 0);
    fsconfig(fd, fsconfig_set_string, "sb", "1", 0);
    fsconfig(fd, fsconfig_set_string, "errors", "continue", 0);
    fsconfig(fd, fsconfig_set_string, "data", "journal", 0);
    fsconfig(fd, fsconfig_set_string, "context", "unconfined_u:...", 0);
    fsconfig(fd, fsconfig_cmd_create, NULL, NULL, 0);
    mfd = fsmount(fd, FSMOUNT_CLOEXEC, MS_NOEXEC);

    or:

    fd = fsopen("ext4", FSOPEN_CLOEXEC);
    fsconfig(fd, fsconfig_set_string, "source", "/dev/sda1", 0);
    fsconfig(fd, fsconfig_cmd_create, NULL, NULL, 0);
    mfd = fsmount(fd, FSMOUNT_CLOEXEC, MS_NOEXEC);

    or:

    fd = fsopen("afs", FSOPEN_CLOEXEC);
    fsconfig(fd, fsconfig_set_string, "source", "#grand.central.org:root.cell", 0);
    fsconfig(fd, fsconfig_cmd_create, NULL, NULL, 0);
    mfd = fsmount(fd, FSMOUNT_CLOEXEC, MS_NOEXEC);

    or:

    fd = fsopen("jffs2", FSOPEN_CLOEXEC);
    fsconfig(fd, fsconfig_set_string, "source", "mtd0", 0);
    fsconfig(fd, fsconfig_cmd_create, NULL, NULL, 0);
    mfd = fsmount(fd, FSMOUNT_CLOEXEC, MS_NOEXEC);

    Signed-off-by: David Howells
    cc: linux-api@vger.kernel.org
    Signed-off-by: Al Viro

    David Howells
     
  • Implement the ability for filesystems to log error, warning and
    informational messages through the fs_context. These can be extracted by
    userspace by reading from an fd created by fsopen().

    Error messages are prefixed with "e ", warnings with "w " and informational
    messages with "i ".

    Inside the kernel, formatted messages are malloc'd but unformatted messages
    are not copied if they're either in the core .rodata section or in the
    .rodata section of the filesystem module pinned by fs_context::fs_type.
    The messages are only good till the fs_type is released.

    Note that the logging object is shared between duplicated fs_context
    structures. This is so that such as NFS which do a mount within a mount
    can get at least some of the errors from the inner mount.

    Five logging functions are provided for this:

    (1) void logfc(struct fs_context *fc, const char *fmt, ...);

    This logs a message into the context. If the buffer is full, the
    earliest message is discarded.

    (2) void errorf(fc, fmt, ...);

    This wraps logfc() to log an error.

    (3) void invalf(fc, fmt, ...);

    This wraps errorf() and returns -EINVAL for convenience.

    (4) void warnf(fc, fmt, ...);

    This wraps logfc() to log a warning.

    (5) void infof(fc, fmt, ...);

    This wraps logfc() to log an informational message.

    Signed-off-by: David Howells
    Signed-off-by: Al Viro

    David Howells
     
  • Provide an fsopen() system call that starts the process of preparing to
    create a superblock that will then be mountable, using an fd as a context
    handle. fsopen() is given the name of the filesystem that will be used:

    int mfd = fsopen(const char *fsname, unsigned int flags);

    where flags can be 0 or FSOPEN_CLOEXEC.

    For example:

    sfd = fsopen("ext4", FSOPEN_CLOEXEC);
    fsconfig(sfd, FSCONFIG_SET_PATH, "source", "/dev/sda1", AT_FDCWD);
    fsconfig(sfd, FSCONFIG_SET_FLAG, "noatime", NULL, 0);
    fsconfig(sfd, FSCONFIG_SET_FLAG, "acl", NULL, 0);
    fsconfig(sfd, FSCONFIG_SET_FLAG, "user_xattr", NULL, 0);
    fsconfig(sfd, FSCONFIG_SET_STRING, "sb", "1", 0);
    fsconfig(sfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0);
    fsinfo(sfd, NULL, ...); // query new superblock attributes
    mfd = fsmount(sfd, FSMOUNT_CLOEXEC, MS_RELATIME);
    move_mount(mfd, "", sfd, AT_FDCWD, "/mnt", MOVE_MOUNT_F_EMPTY_PATH);

    sfd = fsopen("afs", -1);
    fsconfig(fd, FSCONFIG_SET_STRING, "source",
    "#grand.central.org:root.cell", 0);
    fsconfig(fd, FSCONFIG_CMD_CREATE, NULL, NULL, 0);
    mfd = fsmount(sfd, 0, MS_NODEV);
    move_mount(mfd, "", sfd, AT_FDCWD, "/mnt", MOVE_MOUNT_F_EMPTY_PATH);

    If an error is reported at any step, an error message may be available to be
    read() back (ENODATA will be reported if there isn't an error available) in
    the form:

    "e :"
    "e SELinux:Mount on mountpoint not permitted"

    Once fsmount() has been called, further fsconfig() calls will incur EBUSY,
    even if the fsmount() fails. read() is still possible to retrieve error
    information.

    The fsopen() syscall creates a mount context and hangs it of the fd that it
    returns.

    Netlink is not used because it is optional and would make the core VFS
    dependent on the networking layer and also potentially add network
    namespace issues.

    Note that, for the moment, the caller must have SYS_CAP_ADMIN to use
    fsopen().

    Signed-off-by: David Howells
    cc: linux-api@vger.kernel.org
    Signed-off-by: Al Viro

    David Howells