08 Feb, 2020

6 commits


26 Sep, 2019

1 commit

  • Pull fuse updates from Miklos Szeredi:

    - Continue separating the transport (user/kernel communication) and the
    filesystem layers of fuse. Getting rid of most layering violations
    will allow for easier cleanup and optimization later on.

    - Prepare for the addition of the virtio-fs filesystem. The actual
    filesystem will be introduced by a separate pull request.

    - Convert to new mount API.

    - Various fixes, optimizations and cleanups.

    * tag 'fuse-update-5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse: (55 commits)
    fuse: Make fuse_args_to_req static
    fuse: fix memleak in cuse_channel_open
    fuse: fix beyond-end-of-page access in fuse_parse_cache()
    fuse: unexport fuse_put_request
    fuse: kmemcg account fs data
    fuse: on 64-bit store time in d_fsdata directly
    fuse: fix missing unlock_page in fuse_writepage()
    fuse: reserve byteswapped init opcodes
    fuse: allow skipping control interface and forced unmount
    fuse: dissociate DESTROY from fuseblk
    fuse: delete dentry if timeout is zero
    fuse: separate fuse device allocation and installation in fuse_conn
    fuse: add fuse_iqueue_ops callbacks
    fuse: extract fuse_fill_super_common()
    fuse: export fuse_dequeue_forget() function
    fuse: export fuse_get_unique()
    fuse: export fuse_send_init_request()
    fuse: export fuse_len_args()
    fuse: export fuse_end_request()
    fuse: fix request limit
    ...

    Linus Torvalds
     

07 Sep, 2019

1 commit

  • The unused vfs code can be removed. Don't pass empty subtype (same as if
    ->parse callback isn't called).

    The bits that are left involve determining whether it's permitted to split the
    filesystem type string passed in to mount(2). Consequently, this means that we
    cannot get rid of the FS_HAS_SUBTYPE flag unless we define that a type string
    with a dot in it always indicates a subtype specification.

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

    David Howells
     

06 Sep, 2019

3 commits


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
     

05 Jul, 2019

2 commits


15 Jun, 2019

1 commit


09 Jun, 2019

1 commit

  • Mostly due to x86 and acpi conversion, several documentation
    links are still pointing to the old file. Fix them.

    Signed-off-by: Mauro Carvalho Chehab
    Reviewed-by: Wolfram Sang
    Reviewed-by: Sven Van Asbroeck
    Reviewed-by: Bhupesh Sharma
    Acked-by: Mark Brown
    Signed-off-by: Jonathan Corbet

    Mauro Carvalho Chehab
     

26 May, 2019

1 commit


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
     

21 Mar, 2019

2 commits

  • 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
     

28 Feb, 2019

6 commits

  • Implement the ability for filesystems to log error, warning and
    informational messages through the fs_context. In the future, these will
    be extractable by userspace by reading from an fd created by the fsopen()
    syscall.

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

    In the future, inside the kernel, formatted messages will be malloc'd but
    unformatted messages will 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 will only be good till the fs_type is
    released.

    Note that the logging object will be 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
     
  • new primitive: vfs_dup_fs_context(). Comes with fs_context
    method (->dup()) for copying the filesystem-specific parts
    of fs_context, along with LSM one (->fs_context_dup()) for
    doing the same to LSM parts.

    [needs better commit message, and change of Author:, anyway]

    Signed-off-by: Al Viro

    Al Viro
     
  • the former is an analogue of mount_{single,nodev} for use in
    ->get_tree() instances, the latter - analogue of sget() for the
    same.

    These are fairly similar to the originals, but the callback signature
    for sget_fc() is different from sget() ones, so getting bits and
    pieces shared would be too convoluted; we might get around to that
    later, but for now let's just remember to keep them in sync. They
    do live next to each other, and changes in either won't be hard
    to spot.

    Signed-off-by: Al Viro

    Al Viro
     
  • [AV - unfuck kern_mount_data(); we want non-NULL ->mnt_ns on long-living
    mounts]
    [AV - reordering fs/namespace.c is badly overdue, but let's keep it
    separate from that series]
    [AV - drop simple_pin_fs() change]
    [AV - clean vfs_kern_mount() failure exits up]

    Implement a filesystem context concept to be used during superblock
    creation for mount and superblock reconfiguration for remount.

    The mounting procedure then becomes:

    (1) Allocate new fs_context context.

    (2) Configure the context.

    (3) Create superblock.

    (4) Query the superblock.

    (5) Create a mount for the superblock.

    (6) Destroy the context.

    Rather than calling fs_type->mount(), an fs_context struct is created and
    fs_type->init_fs_context() is called to set it up. Pointers exist for the
    filesystem and LSM to hang their private data off.

    A set of operations has to be set by ->init_fs_context() to provide
    freeing, duplication, option parsing, binary data parsing, validation,
    mounting and superblock filling.

    Legacy filesystems are supported by the provision of a set of legacy
    fs_context operations that build up a list of mount options and then invoke
    fs_type->mount() from within the fs_context ->get_tree() operation. This
    allows all filesystems to be accessed using fs_context.

    It should be noted that, whilst this patch adds a lot of lines of code,
    there is quite a bit of duplication with existing code that can be
    eliminated should all filesystems be converted over.

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

    David Howells
     
  • Put security flags, such as SECURITY_LSM_NATIVE_LABELS, into the filesystem
    context so that the filesystem can communicate them to the LSM more easily.

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

    David Howells
     
  • Because the new API passes in key,value parameters, match_token() cannot be
    used with it. Instead, provide three new helpers to aid with parsing:

    (1) fs_parse(). This takes a parameter and a simple static description of
    all the parameters and maps the key name to an ID. It returns 1 on a
    match, 0 on no match if unknowns should be ignored and some other
    negative error code on a parse error.

    The parameter description includes a list of key names to IDs, desired
    parameter types and a list of enumeration name -> ID mappings.

    [!] Note that for the moment I've required that the key->ID mapping
    array is expected to be sorted and unterminated. The size of the
    array is noted in the fsconfig_parser struct. This allows me to use
    bsearch(), but I'm not sure any performance gain is worth the hassle
    of requiring people to keep the array sorted.

    The parameter type array is sized according to the number of parameter
    IDs and is indexed directly. The optional enum mapping array is an
    unterminated, unsorted list and the size goes into the fsconfig_parser
    struct.

    The function can do some additional things:

    (a) If it's not ambiguous and no value is given, the prefix "no" on
    a key name is permitted to indicate that the parameter should
    be considered negatory.

    (b) If the desired type is a single simple integer, it will perform
    an appropriate conversion and store the result in a union in
    the parse result.

    (c) If the desired type is an enumeration, {key ID, name} will be
    looked up in the enumeration list and the matching value will
    be stored in the parse result union.

    (d) Optionally generate an error if the key is unrecognised.

    This is called something like:

    enum rdt_param {
    Opt_cdp,
    Opt_cdpl2,
    Opt_mba_mpbs,
    nr__rdt_params
    };

    const struct fs_parameter_spec rdt_param_specs[nr__rdt_params] = {
    [Opt_cdp] = { fs_param_is_bool },
    [Opt_cdpl2] = { fs_param_is_bool },
    [Opt_mba_mpbs] = { fs_param_is_bool },
    };

    const const char *const rdt_param_keys[nr__rdt_params] = {
    [Opt_cdp] = "cdp",
    [Opt_cdpl2] = "cdpl2",
    [Opt_mba_mpbs] = "mba_mbps",
    };

    const struct fs_parameter_description rdt_parser = {
    .name = "rdt",
    .nr_params = nr__rdt_params,
    .keys = rdt_param_keys,
    .specs = rdt_param_specs,
    .no_source = true,
    };

    int rdt_parse_param(struct fs_context *fc,
    struct fs_parameter *param)
    {
    struct fs_parse_result parse;
    struct rdt_fs_context *ctx = rdt_fc2context(fc);
    int ret;

    ret = fs_parse(fc, &rdt_parser, param, &parse);
    if (ret < 0)
    return ret;

    switch (parse.key) {
    case Opt_cdp:
    ctx->enable_cdpl3 = true;
    return 0;
    case Opt_cdpl2:
    ctx->enable_cdpl2 = true;
    return 0;
    case Opt_mba_mpbs:
    ctx->enable_mba_mbps = true;
    return 0;
    }

    return -EINVAL;
    }

    (2) fs_lookup_param(). This takes a { dirfd, path, LOOKUP_EMPTY? } or
    string value and performs an appropriate path lookup to convert it
    into a path object, which it will then return.

    If the desired type was a blockdev, the type of the looked up inode
    will be checked to make sure it is one.

    This can be used like:

    enum foo_param {
    Opt_source,
    nr__foo_params
    };

    const struct fs_parameter_spec foo_param_specs[nr__foo_params] = {
    [Opt_source] = { fs_param_is_blockdev },
    };

    const char *char foo_param_keys[nr__foo_params] = {
    [Opt_source] = "source",
    };

    const struct constant_table foo_param_alt_keys[] = {
    { "device", Opt_source },
    };

    const struct fs_parameter_description foo_parser = {
    .name = "foo",
    .nr_params = nr__foo_params,
    .nr_alt_keys = ARRAY_SIZE(foo_param_alt_keys),
    .keys = foo_param_keys,
    .alt_keys = foo_param_alt_keys,
    .specs = foo_param_specs,
    };

    int foo_parse_param(struct fs_context *fc,
    struct fs_parameter *param)
    {
    struct fs_parse_result parse;
    struct foo_fs_context *ctx = foo_fc2context(fc);
    int ret;

    ret = fs_parse(fc, &foo_parser, param, &parse);
    if (ret < 0)
    return ret;

    switch (parse.key) {
    case Opt_source:
    return fs_lookup_param(fc, &foo_parser, param,
    &parse, &ctx->source);
    default:
    return -EINVAL;
    }
    }

    (3) lookup_constant(). This takes a table of named constants and looks up
    the given name within it. The table is expected to be sorted such
    that bsearch() be used upon it.

    Possibly I should require the table be terminated and just use a
    for-loop to scan it instead of using bsearch() to reduce hassle.

    Tables look something like:

    static const struct constant_table bool_names[] = {
    { "0", false },
    { "1", true },
    { "false", false },
    { "no", false },
    { "true", true },
    { "yes", true },
    };

    and a lookup is done with something like:

    b = lookup_constant(bool_names, param->string, -1);

    Additionally, optional validation routines for the parameter description
    are provided that can be enabled at compile time. A later patch will
    invoke these when a filesystem is registered.

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

    David Howells
     

31 Jan, 2019

5 commits

  • Introduce a set of logging functions through which informational messages,
    warnings and error messages incurred by the mount procedure can be logged
    and, in a future patch, passed to userspace instead by way of the
    filesystem configuration context file descriptor.

    There are four functions:

    (1) infof(const char *fmt, ...);

    Logs an informational message.

    (2) warnf(const char *fmt, ...);

    Logs a warning message.

    (3) errorf(const char *fmt, ...);

    Logs an error message.

    (4) invalf(const char *fmt, ...);

    As errof(), but returns -EINVAL so can be used on a return statement.

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

    David Howells
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • This is an eventual replacement for vfs_submount() uses. Unlike the
    "mount" and "remount" cases, the users of that thing are not in VFS -
    they are buried in various ->d_automount() instances and rather than
    converting them all at once we introduce the (thankfully small and
    simple) infrastructure here and deal with the prospective users in
    afs, nfs, etc. parts of the series.

    Here we just introduce a new constructor (fs_context_for_submount())
    along with the corresponding enum constant to be put into fc->purpose
    for those.

    Signed-off-by: Al Viro

    Al Viro
     
  • Replace do_remount_sb() with a function, reconfigure_super(), that's
    fs_context aware. The fs_context is expected to be parameterised already
    and have ->root pointing to the superblock to be reconfigured.

    A legacy wrapper is provided that is intended to be called from the
    fs_context ops when those appear, but for now is called directly from
    reconfigure_super(). This wrapper invokes the ->remount_fs() superblock op
    for the moment. It is intended that the remount_fs() op will be phased
    out.

    The fs_context->purpose is set to FS_CONTEXT_FOR_RECONFIGURE to indicate
    that the context is being used for reconfiguration.

    do_umount_root() is provided to consolidate remount-to-R/O for umount and
    emergency remount by creating a context and invoking reconfiguration.

    do_remount(), do_umount() and do_emergency_remount_callback() are switched
    to use the new process.

    [AV -- fold UMOUNT and EMERGENCY_REMOUNT in; fixes the
    umount / bug, gets rid of pointless complexity]
    [AV -- set ->net_ns in all cases; nfs remount will need that]
    [AV -- shift security_sb_remount() call into reconfigure_super(); the callers
    that didn't do security_sb_remount() have NULL fc->security anyway, so it's
    a no-op for them]

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

    David Howells
     
  • Introduce a filesystem context concept to be used during superblock
    creation for mount and superblock reconfiguration for remount. This is
    allocated at the beginning of the mount procedure and into it is placed:

    (1) Filesystem type.

    (2) Namespaces.

    (3) Source/Device names (there may be multiple).

    (4) Superblock flags (SB_*).

    (5) Security details.

    (6) Filesystem-specific data, as set by the mount options.

    Accessor functions are then provided to set up a context, parameterise it
    from monolithic mount data (the data page passed to mount(2)) and tear it
    down again.

    A legacy wrapper is provided that implements what will be the basic
    operations, wrapping access to filesystems that aren't yet aware of the
    fs_context.

    Finally, vfs_kern_mount() is changed to make use of the fs_context and
    mount_fs() is replaced by vfs_get_tree(), called from vfs_kern_mount().
    [AV -- add missing kstrdup()]
    [AV -- put_cred() can be unconditional - fc->cred can't be NULL]
    [AV -- take legacy_validate() contents into legacy_parse_monolithic()]
    [AV -- merge KERNEL_MOUNT and USER_MOUNT]
    [AV -- don't unlock superblock on success return from vfs_get_tree()]
    [AV -- kill 'reference' argument of init_fs_context()]

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

    David Howells