01 Feb, 2020

1 commit

  • commit a37f4958f7b63d2b3cd17a76151fdfc29ce1da5f upstream.

    When lockdown is enabled, debugfs_is_locked_down returns 1. It will then
    trigger the following:

    WARNING: CPU: 48 PID: 3747
    CPU: 48 PID: 3743 Comm: bash Not tainted 5.4.0-1946.x86_64 #1
    Hardware name: Oracle Corporation ORACLE SERVER X7-2/ASM, MB, X7-2, BIOS 41060400 05/20/2019
    RIP: 0010:do_dentry_open+0x343/0x3a0
    Code: 00 40 08 00 45 31 ff 48 c7 43 28 40 5b e7 89 e9 02 ff ff ff 48 8b 53 28 4c 8b 72 70 4d 85 f6 0f 84 10 fe ff ff e9 f5 fd ff ff 0b 41 bf ea ff ff ff e9 3b ff ff ff 41 bf e6 ff ff ff e9 b4 fe
    RSP: 0018:ffffb8740dde7ca0 EFLAGS: 00010202
    RAX: ffffffff89e88a40 RBX: ffff928c8e6b6f00 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: ffff928dbfd97778 RDI: ffff9285cff685c0
    RBP: ffffb8740dde7cc8 R08: 0000000000000821 R09: 0000000000000030
    R10: 0000000000000057 R11: ffffb8740dde7a98 R12: ffff926ec781c900
    R13: ffff928c8e6b6f10 R14: ffffffff8936e190 R15: 0000000000000001
    FS: 00007f45f6777740(0000) GS:ffff928dbfd80000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fff95e0d5d8 CR3: 0000001ece562006 CR4: 00000000007606e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    PKRU: 55555554
    Call Trace:
    vfs_open+0x2d/0x30
    path_openat+0x2d4/0x1680
    ? tty_mode_ioctl+0x298/0x4c0
    do_filp_open+0x93/0x100
    ? strncpy_from_user+0x57/0x1b0
    ? __alloc_fd+0x46/0x150
    do_sys_open+0x182/0x230
    __x64_sys_openat+0x20/0x30
    do_syscall_64+0x60/0x1b0
    entry_SYSCALL_64_after_hwframe+0x170/0x1d5
    RIP: 0033:0x7f45f5e5ce02
    Code: 25 00 00 41 00 3d 00 00 41 00 74 4c 48 8d 05 25 59 2d 00 8b 00 85 c0 75 6d 89 f2 b8 01 01 00 00 48 89 fe bf 9c ff ff ff 0f 05 3d 00 f0 ff ff 0f 87 a2 00 00 00 48 8b 4c 24 28 64 48 33 0c 25
    RSP: 002b:00007fff95e0d2e0 EFLAGS: 00000246 ORIG_RAX: 0000000000000101
    RAX: ffffffffffffffda RBX: 0000561178c069b0 RCX: 00007f45f5e5ce02
    RDX: 0000000000000241 RSI: 0000561178c08800 RDI: 00000000ffffff9c
    RBP: 00007fff95e0d3e0 R08: 0000000000000020 R09: 0000000000000005
    R10: 00000000000001b6 R11: 0000000000000246 R12: 0000000000000000
    R13: 0000000000000003 R14: 0000000000000001 R15: 0000561178c08800

    Change the return type to int and return -EPERM when lockdown is enabled
    to remove the warning above. Also rename debugfs_is_locked_down to
    debugfs_locked_down to make it sound less like it returns a boolean.

    Fixes: 5496197f9b08 ("debugfs: Restrict debugfs when the kernel is locked down")
    Signed-off-by: Eric Snowberg
    Reviewed-by: Matthew Wilcox (Oracle)
    Cc: stable
    Acked-by: James Morris
    Link: https://lore.kernel.org/r/20191207161603.35907-1-eric.snowberg@oracle.com
    Signed-off-by: Greg Kroah-Hartman

    Eric Snowberg
     

28 Sep, 2019

1 commit

  • Pull kernel lockdown mode from James Morris:
    "This is the latest iteration of the kernel lockdown patchset, from
    Matthew Garrett, David Howells and others.

    From the original description:

    This patchset introduces an optional kernel lockdown feature,
    intended to strengthen the boundary between UID 0 and the kernel.
    When enabled, various pieces of kernel functionality are restricted.
    Applications that rely on low-level access to either hardware or the
    kernel may cease working as a result - therefore this should not be
    enabled without appropriate evaluation beforehand.

    The majority of mainstream distributions have been carrying variants
    of this patchset for many years now, so there's value in providing a
    doesn't meet every distribution requirement, but gets us much closer
    to not requiring external patches.

    There are two major changes since this was last proposed for mainline:

    - Separating lockdown from EFI secure boot. Background discussion is
    covered here: https://lwn.net/Articles/751061/

    - Implementation as an LSM, with a default stackable lockdown LSM
    module. This allows the lockdown feature to be policy-driven,
    rather than encoding an implicit policy within the mechanism.

    The new locked_down LSM hook is provided to allow LSMs to make a
    policy decision around whether kernel functionality that would allow
    tampering with or examining the runtime state of the kernel should be
    permitted.

    The included lockdown LSM provides an implementation with a simple
    policy intended for general purpose use. This policy provides a coarse
    level of granularity, controllable via the kernel command line:

    lockdown={integrity|confidentiality}

    Enable the kernel lockdown feature. If set to integrity, kernel features
    that allow userland to modify the running kernel are disabled. If set to
    confidentiality, kernel features that allow userland to extract
    confidential information from the kernel are also disabled.

    This may also be controlled via /sys/kernel/security/lockdown and
    overriden by kernel configuration.

    New or existing LSMs may implement finer-grained controls of the
    lockdown features. Refer to the lockdown_reason documentation in
    include/linux/security.h for details.

    The lockdown feature has had signficant design feedback and review
    across many subsystems. This code has been in linux-next for some
    weeks, with a few fixes applied along the way.

    Stephen Rothwell noted that commit 9d1f8be5cf42 ("bpf: Restrict bpf
    when kernel lockdown is in confidentiality mode") is missing a
    Signed-off-by from its author. Matthew responded that he is providing
    this under category (c) of the DCO"

    * 'next-lockdown' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (31 commits)
    kexec: Fix file verification on S390
    security: constify some arrays in lockdown LSM
    lockdown: Print current->comm in restriction messages
    efi: Restrict efivar_ssdt_load when the kernel is locked down
    tracefs: Restrict tracefs when the kernel is locked down
    debugfs: Restrict debugfs when the kernel is locked down
    kexec: Allow kexec_file() with appropriate IMA policy when locked down
    lockdown: Lock down perf when in confidentiality mode
    bpf: Restrict bpf when kernel lockdown is in confidentiality mode
    lockdown: Lock down tracing and perf kprobes when in confidentiality mode
    lockdown: Lock down /proc/kcore
    x86/mmiotrace: Lock down the testmmiotrace module
    lockdown: Lock down module params that specify hardware parameters (eg. ioport)
    lockdown: Lock down TIOCSSERIAL
    lockdown: Prohibit PCMCIA CIS storage when the kernel is locked down
    acpi: Disable ACPI table override if the kernel is locked down
    acpi: Ignore acpi_rsdp kernel param when the kernel has been locked down
    ACPI: Limit access to custom_method when the kernel is locked down
    x86/msr: Restrict MSR access when the kernel is locked down
    x86: Lock down IO port access when the kernel is locked down
    ...

    Linus Torvalds
     

20 Aug, 2019

1 commit

  • Disallow opening of debugfs files that might be used to muck around when
    the kernel is locked down as various drivers give raw access to hardware
    through debugfs. Given the effort of auditing all 2000 or so files and
    manually fixing each one as necessary, I've chosen to apply a heuristic
    instead. The following changes are made:

    (1) chmod and chown are disallowed on debugfs objects (though the root dir
    can be modified by mount and remount, but I'm not worried about that).

    (2) When the kernel is locked down, only files with the following criteria
    are permitted to be opened:

    - The file must have mode 00444
    - The file must not have ioctl methods
    - The file must not have mmap

    (3) When the kernel is locked down, files may only be opened for reading.

    Normal device interaction should be done through configfs, sysfs or a
    miscdev, not debugfs.

    Note that this makes it unnecessary to specifically lock down show_dsts(),
    show_devs() and show_call() in the asus-wmi driver.

    I would actually prefer to lock down all files by default and have the
    the files unlocked by the creator. This is tricky to manage correctly,
    though, as there are 19 creation functions and ~1600 call sites (some of
    them in loops scanning tables).

    Signed-off-by: David Howells
    cc: Andy Shevchenko
    cc: acpi4asus-user@lists.sourceforge.net
    cc: platform-driver-x86@vger.kernel.org
    cc: Matthew Garrett
    cc: Thomas Gleixner
    Cc: Greg KH
    Cc: Rafael J. Wysocki
    Signed-off-by: Matthew Garrett
    Signed-off-by: James Morris

    David Howells
     

13 Jul, 2019

1 commit

  • Pull driver core and debugfs updates from Greg KH:
    "Here is the "big" driver core and debugfs changes for 5.3-rc1

    It's a lot of different patches, all across the tree due to some api
    changes and lots of debugfs cleanups.

    Other than the debugfs cleanups, in this set of changes we have:

    - bus iteration function cleanups

    - scripts/get_abi.pl tool to display and parse Documentation/ABI
    entries in a simple way

    - cleanups to Documenatation/ABI/ entries to make them parse easier
    due to typos and other minor things

    - default_attrs use for some ktype users

    - driver model documentation file conversions to .rst

    - compressed firmware file loading

    - deferred probe fixes

    All of these have been in linux-next for a while, with a bunch of
    merge issues that Stephen has been patient with me for"

    * tag 'driver-core-5.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (102 commits)
    debugfs: make error message a bit more verbose
    orangefs: fix build warning from debugfs cleanup patch
    ubifs: fix build warning after debugfs cleanup patch
    driver: core: Allow subsystems to continue deferring probe
    drivers: base: cacheinfo: Ensure cpu hotplug work is done before Intel RDT
    arch_topology: Remove error messages on out-of-memory conditions
    lib: notifier-error-inject: no need to check return value of debugfs_create functions
    swiotlb: no need to check return value of debugfs_create functions
    ceph: no need to check return value of debugfs_create functions
    sunrpc: no need to check return value of debugfs_create functions
    ubifs: no need to check return value of debugfs_create functions
    orangefs: no need to check return value of debugfs_create functions
    nfsd: no need to check return value of debugfs_create functions
    lib: 842: no need to check return value of debugfs_create functions
    debugfs: provide pr_fmt() macro
    debugfs: log errors when something goes wrong
    drivers: s390/cio: Fix compilation warning about const qualifiers
    drivers: Add generic helper to match by of_node
    driver_find_device: Unify the match function with class_find_device()
    bus_find_device: Unify the match callback with class_find_device
    ...

    Linus Torvalds
     

08 Jul, 2019

1 commit

  • When a file/directory is already present in debugfs, and it is attempted
    to be created again, be more specific about what file/directory is being
    created and where it is trying to be created to give a bit more help to
    developers to figure out the problem.

    Cc: Stephen Rothwell
    Cc: Rafael J. Wysocki
    Cc: Mark Brown
    Cc: Takashi Iwai
    Reviewed-by: Mark Brown
    Link: https://lore.kernel.org/r/20190706154256.GA2683@kroah.com
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

03 Jul, 2019

2 commits

  • Use a common "debugfs: " prefix for all pr_* calls in a single place.

    Cc: Mark Brown
    Reviewed-by: Takashi Iwai
    Reviewed-by: Rafael J. Wysocki
    Signed-off-by: Greg Kroah-Hartman
    Link: https://lore.kernel.org/r/20190703071653.2799-1-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     
  • As it is not recommended that debugfs calls be checked, it was pointed
    out that major errors should still be logged somewhere so that
    developers and users have a chance to figure out what went wrong. To
    help with this, error logging has been added to the debugfs core so that
    it is not needed to be present in every individual file that calls
    debugfs.

    Reported-by: Mark Brown
    Reported-by: Takashi Iwai
    Reviewed-by: Mark Brown
    Reviewed-by: Takashi Iwai
    Reviewed-by: Rafael J. Wysocki
    Signed-off-by: Greg Kroah-Hartman
    Link: https://lore.kernel.org/r/20190703071653.2799-2-gregkh@linuxfoundation.org
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

20 Jun, 2019

2 commits

  • This will allow generating fsnotify delete events after the
    fsnotify_nameremove() hook is removed from d_delete().

    Cc: Greg Kroah-Hartman
    Reviewed-by: Greg Kroah-Hartman
    Signed-off-by: Amir Goldstein
    Signed-off-by: Jan Kara

    Amir Goldstein
     
  • Move simple_unlink()+d_delete() from __debugfs_remove_file() into
    caller __debugfs_remove() and rename helper for post remove file to
    __debugfs_file_removed().

    This will simplify adding fsnotify_unlink() hook.

    Cc: Greg Kroah-Hartman
    Reviewed-by: Greg Kroah-Hartman
    Signed-off-by: Amir Goldstein
    Signed-off-by: Jan Kara

    Amir Goldstein
     

03 Jun, 2019

1 commit


21 May, 2019

1 commit


08 May, 2019

2 commits

  • Pull misc dcache updates from Al Viro:
    "Most of this pile is putting name length into struct name_snapshot and
    making use of it.

    The beginning of this series ("ovl_lookup_real_one(): don't bother
    with strlen()") ought to have been split in two (separate switch of
    name_snapshot to struct qstr from overlayfs reaping the trivial
    benefits of that), but I wanted to avoid a rebase - by the time I'd
    spotted that it was (a) in -next and (b) close to 5.1-final ;-/"

    * 'work.dcache' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    audit_compare_dname_path(): switch to const struct qstr *
    audit_update_watch(): switch to const struct qstr *
    inotify_handle_event(): don't bother with strlen()
    fsnotify: switch send_to_group() and ->handle_event to const struct qstr *
    fsnotify(): switch to passing const struct qstr * for file_name
    switch fsnotify_move() to passing const struct qstr * for old_name
    ovl_lookup_real_one(): don't bother with strlen()
    sysv: bury the broken "quietly truncate the long filenames" logics
    nsfs: unobfuscate
    unexport d_alloc_pseudo()

    Linus Torvalds
     
  • Pull driver core/kobject updates from Greg KH:
    "Here is the "big" set of driver core patches for 5.2-rc1

    There are a number of ACPI patches in here as well, as Rafael said
    they should go through this tree due to the driver core changes they
    required. They have all been acked by the ACPI developers.

    There are also a number of small subsystem-specific changes in here,
    due to some changes to the kobject core code. Those too have all been
    acked by the various subsystem maintainers.

    As for content, it's pretty boring outside of the ACPI changes:
    - spdx cleanups
    - kobject documentation updates
    - default attribute groups for kobjects
    - other minor kobject/driver core fixes

    All have been in linux-next for a while with no reported issues"

    * tag 'driver-core-5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (47 commits)
    kobject: clean up the kobject add documentation a bit more
    kobject: Fix kernel-doc comment first line
    kobject: Remove docstring reference to kset
    firmware_loader: Fix a typo ("syfs" -> "sysfs")
    kobject: fix dereference before null check on kobj
    Revert "driver core: platform: Fix the usage of platform device name(pdev->name)"
    init/config: Do not select BUILD_BIN2C for IKCONFIG
    Provide in-kernel headers to make extending kernel easier
    kobject: Improve doc clarity kobject_init_and_add()
    kobject: Improve docs for kobject_add/del
    driver core: platform: Fix the usage of platform device name(pdev->name)
    livepatch: Replace klp_ktype_patch's default_attrs with groups
    cpufreq: schedutil: Replace default_attrs field with groups
    padata: Replace padata_attr_type default_attrs field with groups
    irqdesc: Replace irq_kobj_type's default_attrs field with groups
    net-sysfs: Replace ktype default_attrs field with groups
    block: Replace all ktype default_attrs with groups
    samples/kobject: Replace foo_ktype's default_attrs field with groups
    kobject: Add support for default attribute groups to kobj_type
    driver core: Postpone DMA tear-down until after devres release for probe failure
    ...

    Linus Torvalds
     

02 May, 2019

1 commit


27 Apr, 2019

2 commits


25 Apr, 2019

1 commit


01 Apr, 2019

1 commit

  • symlink body shouldn't be freed without an RCU delay. Switch debugfs to
    ->destroy_inode() and use of call_rcu(); free both the inode and symlink
    body in the callback. Similar to solution for bpf, only here it's even
    more obvious that ->evict_inode() can be dropped.

    Signed-off-by: Al Viro

    Al Viro
     

11 Feb, 2019

1 commit


30 Jan, 2019

2 commits

  • Lots of callers of debugfs_lookup() were just checking NULL to see if
    the file/directory was found or not. By changing this in ff9fb72bc077
    ("debugfs: return error values, not NULL") we caused some subsystems to
    easily crash.

    Fixes: ff9fb72bc077 ("debugfs: return error values, not NULL")
    Reported-by: syzbot+b382ba6a802a3d242790@syzkaller.appspotmail.com
    Reported-by: Tetsuo Handa
    Cc: Omar Sandoval
    Cc: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     
  • When an error happens, debugfs should return an error pointer value, not
    NULL. This will prevent the totally theoretical error where a debugfs
    call fails due to lack of memory, returning NULL, and that dentry value
    is then passed to another debugfs call, which would end up succeeding,
    creating a file at the root of the debugfs tree, but would then be
    impossible to remove (because you can not remove the directory NULL).

    So, to make everyone happy, always return errors, this makes the users
    of debugfs much simpler (they do not have to ever check the return
    value), and everyone can rest easy.

    Reported-by: Gary R Hook
    Reported-by: Heiko Carstens
    Reported-by: Masami Hiramatsu
    Reported-by: Michal Hocko
    Reported-by: Sebastian Andrzej Siewior
    Reported-by: Ulf Hansson
    Reviewed-by: Masami Hiramatsu
    Reviewed-by: Sebastian Andrzej Siewior
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

25 Jan, 2019

1 commit

  • debugfs_rename() needs to check that the dentries passed into it really
    are valid, as sometimes they are not (i.e. if the return value of
    another debugfs call is passed into this one.) So fix this up by
    properly checking if the two parent directories are errors (they are
    allowed to be NULL), and if the dentry to rename is not NULL or an
    error.

    Cc: stable
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

22 Jan, 2019

1 commit


13 Jun, 2018

1 commit

  • This reverts commit 95cde3c59966f6371b6bcd9e4e2da2ba64ee9775.

    The commit had good intentions, but it breaks kvm-tool and qemu-kvm.

    With it in place, "lkvm run" just fails with

    Error: KVM_CREATE_VM ioctl
    Warning: Failed init: kvm__init

    which isn't a wonderful error message, but bisection pinpointed the
    problematic commit.

    The problem is almost certainly due to the special kvm debugfs entries
    created dynamically by kvm under /sys/kernel/debug/kvm/. See
    kvm_create_vm_debugfs()

    Bisected-and-reported-by: Linus Torvalds
    Cc: Wanpeng Li
    Cc: Greg Kroah-Hartman
    Cc: Thomas Richter
    Cc: Kees Cook
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

14 May, 2018

2 commits

  • Currently function debugfs_create_dir() creates a new
    directory in the debugfs (usually mounted /sys/kernel/debug)
    with permission rwxr-xr-x. This is hard coded.

    Change this to use the parent directory permission.

    Output before the patch:
    root@s8360047 ~]# tree -dp -L 1 /sys/kernel/debug/
    /sys/kernel/debug/
    ├── [drwxr-xr-x] bdi
    ├── [drwxr-xr-x] block
    ├── [drwxr-xr-x] dasd
    ├── [drwxr-xr-x] device_component
    ├── [drwxr-xr-x] extfrag
    ├── [drwxr-xr-x] hid
    ├── [drwxr-xr-x] kprobes
    ├── [drwxr-xr-x] kvm
    ├── [drwxr-xr-x] memblock
    ├── [drwxr-xr-x] pm_qos
    ├── [drwxr-xr-x] qdio
    ├── [drwxr-xr-x] s390
    ├── [drwxr-xr-x] s390dbf
    └── [drwx------] tracing

    14 directories
    [root@s8360047 linux]#

    Output after the patch:
    [root@s8360047 ~]# tree -dp -L 1 /sys/kernel/debug/
    sys/kernel/debug/
    ├── [drwx------] bdi
    ├── [drwx------] block
    ├── [drwx------] dasd
    ├── [drwx------] device_component
    ├── [drwx------] extfrag
    ├── [drwx------] hid
    ├── [drwx------] kprobes
    ├── [drwx------] kvm
    ├── [drwx------] memblock
    ├── [drwx------] pm_qos
    ├── [drwx------] qdio
    ├── [drwx------] s390
    ├── [drwx------] s390dbf
    └── [drwx------] tracing

    14 directories
    [root@s8360047 linux]#

    Here is the full diff output done with:
    [root@s8360047 ~]# diff -u treefull.before treefull.after |
    sed 's-^- # -' > treefull.diff
    # --- treefull.before 2018-04-27 13:22:04.532824564 +0200
    # +++ treefull.after 2018-04-27 13:24:12.106182062 +0200
    # @@ -1,55 +1,55 @@
    # /sys/kernel/debug/
    # -├── [drwxr-xr-x] bdi
    # -│   ├── [drwxr-xr-x] 1:0
    # -│   ├── [drwxr-xr-x] 1:1
    # -│   ├── [drwxr-xr-x] 1:10
    # -│   ├── [drwxr-xr-x] 1:11
    # -│   ├── [drwxr-xr-x] 1:12
    # -│   ├── [drwxr-xr-x] 1:13
    # -│   ├── [drwxr-xr-x] 1:14
    # -│   ├── [drwxr-xr-x] 1:15
    # -│   ├── [drwxr-xr-x] 1:2
    # -│   ├── [drwxr-xr-x] 1:3
    # -│   ├── [drwxr-xr-x] 1:4
    # -│   ├── [drwxr-xr-x] 1:5
    # -│   ├── [drwxr-xr-x] 1:6
    # -│   ├── [drwxr-xr-x] 1:7
    # -│   ├── [drwxr-xr-x] 1:8
    # -│   ├── [drwxr-xr-x] 1:9
    # -│   └── [drwxr-xr-x] 94:0
    # -├── [drwxr-xr-x] block
    # -├── [drwxr-xr-x] dasd
    # -│   ├── [drwxr-xr-x] 0.0.e18a
    # -│   ├── [drwxr-xr-x] dasda
    # -│   └── [drwxr-xr-x] global
    # -├── [drwxr-xr-x] device_component
    # -├── [drwxr-xr-x] extfrag
    # -├── [drwxr-xr-x] hid
    # -├── [drwxr-xr-x] kprobes
    # -├── [drwxr-xr-x] kvm
    # -├── [drwxr-xr-x] memblock
    # -├── [drwxr-xr-x] pm_qos
    # -├── [drwxr-xr-x] qdio
    # -│   └── [drwxr-xr-x] 0.0.f5f2
    # -├── [drwxr-xr-x] s390
    # -│   └── [drwxr-xr-x] stsi
    # -├── [drwxr-xr-x] s390dbf
    # -│   ├── [drwxr-xr-x] 0.0.e18a
    # -│   ├── [drwxr-xr-x] cio_crw
    # -│   ├── [drwxr-xr-x] cio_msg
    # -│   ├── [drwxr-xr-x] cio_trace
    # -│   ├── [drwxr-xr-x] dasd
    # -│   ├── [drwxr-xr-x] kvm-trace
    # -│   ├── [drwxr-xr-x] lgr
    # -│   ├── [drwxr-xr-x] qdio_0.0.f5f2
    # -│   ├── [drwxr-xr-x] qdio_error
    # -│   ├── [drwxr-xr-x] qdio_setup
    # -│   ├── [drwxr-xr-x] qeth_card_0.0.f5f0
    # -│   ├── [drwxr-xr-x] qeth_control
    # -│   ├── [drwxr-xr-x] qeth_msg
    # -│   ├── [drwxr-xr-x] qeth_setup
    # -│   ├── [drwxr-xr-x] vmcp
    # -│   └── [drwxr-xr-x] vmur
    # +├── [drwx------] bdi
    # +│   ├── [drwx------] 1:0
    # +│   ├── [drwx------] 1:1
    # +│   ├── [drwx------] 1:10
    # +│   ├── [drwx------] 1:11
    # +│   ├── [drwx------] 1:12
    # +│   ├── [drwx------] 1:13
    # +│   ├── [drwx------] 1:14
    # +│   ├── [drwx------] 1:15
    # +│   ├── [drwx------] 1:2
    # +│   ├── [drwx------] 1:3
    # +│   ├── [drwx------] 1:4
    # +│   ├── [drwx------] 1:5
    # +│   ├── [drwx------] 1:6
    # +│   ├── [drwx------] 1:7
    # +│   ├── [drwx------] 1:8
    # +│   ├── [drwx------] 1:9
    # +│   └── [drwx------] 94:0
    # +├── [drwx------] block
    # +├── [drwx------] dasd
    # +│   ├── [drwx------] 0.0.e18a
    # +│   ├── [drwx------] dasda
    # +│   └── [drwx------] global
    # +├── [drwx------] device_component
    # +├── [drwx------] extfrag
    # +├── [drwx------] hid
    # +├── [drwx------] kprobes
    # +├── [drwx------] kvm
    # +├── [drwx------] memblock
    # +├── [drwx------] pm_qos
    # +├── [drwx------] qdio
    # +│   └── [drwx------] 0.0.f5f2
    # +├── [drwx------] s390
    # +│   └── [drwx------] stsi
    # +├── [drwx------] s390dbf
    # +│   ├── [drwx------] 0.0.e18a
    # +│   ├── [drwx------] cio_crw
    # +│   ├── [drwx------] cio_msg
    # +│   ├── [drwx------] cio_trace
    # +│   ├── [drwx------] dasd
    # +│   ├── [drwx------] kvm-trace
    # +│   ├── [drwx------] lgr
    # +│   ├── [drwx------] qdio_0.0.f5f2
    # +│   ├── [drwx------] qdio_error
    # +│   ├── [drwx------] qdio_setup
    # +│   ├── [drwx------] qeth_card_0.0.f5f0
    # +│   ├── [drwx------] qeth_control
    # +│   ├── [drwx------] qeth_msg
    # +│   ├── [drwx------] qeth_setup
    # +│   ├── [drwx------] vmcp
    # +│   └── [drwx------] vmur
    # └── [drwx------] tracing
    # ├── [drwxr-xr-x] events
    # │   ├── [drwxr-xr-x] alarmtimer

    Fixes: edac65eaf8d5c ("debugfs: take mode-dependent parts of debugfs_get_inode() into callers")
    Signed-off-by: Thomas Richter
    Reviewed-by: Kees Cook
    Signed-off-by: Greg Kroah-Hartman

    Thomas Richter
     
  • Re-use kstrtobool_from_user() instead of open coded variant.

    Signed-off-by: Andy Shevchenko
    Signed-off-by: Greg Kroah-Hartman

    Andy Shevchenko
     

30 Mar, 2018

1 commit


12 Feb, 2018

1 commit

  • This is the mindless scripted replacement of kernel use of POLL*
    variables as described by Al, done by this script:

    for V in IN OUT PRI ERR RDNORM RDBAND WRNORM WRBAND HUP RDHUP NVAL MSG; do
    L=`git grep -l -w POLL$V | grep -v '^t' | grep -v /um/ | grep -v '^sa' | grep -v '/poll.h$'|grep -v '^D'`
    for f in $L; do sed -i "-es/^\([^\"]*\)\(\\)/\\1E\\2/" $f; done
    done

    with de-mangling cleanups yet to come.

    NOTE! On almost all architectures, the EPOLL* constants have the same
    values as the POLL* constants do. But they keyword here is "almost".
    For various bad reasons they aren't the same, and epoll() doesn't
    actually work quite correctly in some cases due to this on Sparc et al.

    The next patch from Al will sort out the final differences, and we
    should be all done.

    Scripted-by: Al Viro
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

02 Feb, 2018

1 commit

  • The only place that has any business including asm/poll.h
    is linux/poll.h. Fortunately, asm/poll.h had only been
    included in 3 places beyond that one, and all of them
    are trivial to switch to using linux/poll.h.

    Signed-off-by: Al Viro

    Al Viro
     

28 Nov, 2017

2 commits


08 Nov, 2017

9 commits

  • Now that the SPDX tag is in all debugfs files, that identifies the
    license in a specific and legally-defined manner. So the extra GPL text
    wording can be removed as it is no longer needed at all.

    This is done on a quest to remove the 700+ different ways that files in
    the kernel describe the GPL license text. And there's unneeded stuff
    like the address (sometimes incorrect) for the FSF which is never
    needed.

    No copyright headers or other non-license-description text was removed.

    Cc: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     
  • It's good to have SPDX identifiers in all files to make it easier to
    audit the kernel tree for correct licenses.

    Update the debugfs files files with the correct SPDX license identifier
    based on the license text in the file itself. The SPDX identifier is a
    legally binding shorthand, which can be used instead of the full boiler
    plate text.

    This work is based on a script and data from Thomas Gleixner, Philippe
    Ombredanne, and Kate Stewart.

    Cc: Thomas Gleixner
    Cc: Kate Stewart
    Cc: Philippe Ombredanne
    Cc: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     
  • Currently, __debugfs_create_file allocates one struct debugfs_fsdata
    instance for every file created. However, there are potentially many
    debugfs file around, most of which are never touched by userspace.

    Thus, defer the allocations to the first usage, i.e. to the first
    debugfs_file_get().

    A dentry's ->d_fsdata starts out to point to the "real", user provided
    fops. After a debugfs_fsdata instance has been allocated (and the real
    fops pointer has been moved over into its ->real_fops member),
    ->d_fsdata is changed to point to it from then on. The two cases are
    distinguished by setting BIT(0) for the real fops case.

    struct debugfs_fsdata's foremost purpose is to track active users and to
    make debugfs_remove() block until they are done. Since no debugfs_fsdata
    instance means no active users, make debugfs_remove() return immediately
    in this case.

    Take care of possible races between debugfs_file_get() and
    debugfs_remove(): either debugfs_remove() must see a debugfs_fsdata
    instance and thus wait for possible active users or debugfs_file_get() must
    see a dead dentry and return immediately.

    Make a dentry's ->d_release(), i.e. debugfs_release_dentry(), check whether
    ->d_fsdata is actually a debugfs_fsdata instance before kfree()ing it.

    Similarly, make debugfs_real_fops() check whether ->d_fsdata is actually
    a debugfs_fsdata instance before returning it, otherwise emit a warning.

    The set of possible error codes returned from debugfs_file_get() has grown
    from -EIO to -EIO and -ENOMEM. Make open_proxy_open() and full_proxy_open()
    pass the -ENOMEM onwards to their callers.

    Signed-off-by: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Nicolai Stange
     
  • The current implementation of debugfs_real_fops() relies on a
    debugfs_fsdata instance to be installed at ->d_fsdata.

    With future patches introducing lazy allocation of these, this requirement
    will be guaranteed to be fullfilled only inbetween a
    debugfs_file_get()/debugfs_file_put() pair.

    The full proxies' fops implemented by debugfs happen to be the only
    offenders. Fix them up by moving their debugfs_real_fops() calls past those
    to debugfs_file_get().

    full_proxy_release() is special as it doesn't invoke debugfs_file_get() at
    all. Leave it alone for now.

    Signed-off-by: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Nicolai Stange
     
  • Purge the SRCU based file removal race protection in favour of the new,
    refcount based debugfs_file_get()/debugfs_file_put() API.

    Fixes: 49d200deaa68 ("debugfs: prevent access to removed files' private data")
    Signed-off-by: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Nicolai Stange
     
  • Convert all calls to the now obsolete debugfs_use_file_start() and
    debugfs_use_file_finish() from the debugfs core itself to the new
    debugfs_file_get() and debugfs_file_put() API.

    Fixes: 49d200deaa68 ("debugfs: prevent access to removed files' private data")
    Signed-off-by: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Nicolai Stange
     
  • Currently, debugfs_real_fops() is annotated with a
    __must_hold(&debugfs_srcu) sparse annotation.

    With the conversion of the SRCU based protection of users against
    concurrent file removals to a per-file refcount based scheme, this becomes
    wrong.

    Drop this annotation.

    Signed-off-by: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Nicolai Stange
     
  • Since commit 49d200deaa68 ("debugfs: prevent access to removed files'
    private data"), accesses to a file's private data are protected from
    concurrent removal by covering all file_operations with a SRCU read section
    and sychronizing with those before returning from debugfs_remove() by means
    of synchronize_srcu().

    As pointed out by Johannes Berg, there are debugfs files with forever
    blocking file_operations. Their corresponding SRCU read side sections would
    block any debugfs_remove() forever as well, even unrelated ones. This
    results in a livelock. Because a remover can't cancel any indefinite
    blocking within foreign files, this is a problem.

    Resolve this by introducing support for more granular protection on a
    per-file basis.

    This is implemented by introducing an 'active_users' refcount_t to the
    per-file struct debugfs_fsdata state. At file creation time, it is set to
    one and a debugfs_remove() will drop that initial reference. The new
    debugfs_file_get() and debugfs_file_put(), intended to be used in place of
    former debugfs_use_file_start() and debugfs_use_file_finish(), increment
    and decrement it respectively. Once the count drops to zero,
    debugfs_file_put() will signal a completion which is possibly being waited
    for from debugfs_remove().
    Thus, as long as there is a debugfs_file_get() not yet matched by a
    corresponding debugfs_file_put() around, debugfs_remove() will block.

    Actual users of debugfs_use_file_start() and -finish() will get converted
    to the new debugfs_file_get() and debugfs_file_put() by followup patches.

    Fixes: 49d200deaa68 ("debugfs: prevent access to removed files' private data")
    Reported-by: Johannes Berg
    Signed-off-by: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Nicolai Stange
     
  • Currently, the user provided fops, "real_fops", are stored directly into
    ->d_fsdata.

    In order to be able to store more per-file state and thus prepare for more
    granular file removal protection, wrap the real_fops into a dynamically
    allocated container struct, debugfs_fsdata.

    A struct debugfs_fsdata gets allocated at file creation and freed from the
    newly intoduced ->d_release().

    Finally, move the implementation of debugfs_real_fops() out of the public
    debugfs header such that struct debugfs_fsdata's declaration can be kept
    private.

    Signed-off-by: Nicolai Stange
    Signed-off-by: Greg Kroah-Hartman

    Nicolai Stange