Skip to content
Snippets Groups Projects
  1. Jan 04, 2023
    • Greg Kroah-Hartman's avatar
    • Marco Elver's avatar
      kcsan: Instrument memcpy/memset/memmove with newer Clang · 6a0ef732
      Marco Elver authored
      
      commit 7c201739 upstream.
      
      With Clang version 16+, -fsanitize=thread will turn
      memcpy/memset/memmove calls in instrumented functions into
      __tsan_memcpy/__tsan_memset/__tsan_memmove calls respectively.
      
      Add these functions to the core KCSAN runtime, so that we (a) catch data
      races with mem* functions, and (b) won't run into linker errors with
      such newer compilers.
      
      Cc: stable@vger.kernel.org # v5.10+
      Signed-off-by: default avatarMarco Elver <elver@google.com>
      Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6a0ef732
    • Chuck Lever's avatar
      SUNRPC: Don't leak netobj memory when gss_read_proxy_verf() fails · c9ded831
      Chuck Lever authored
      
      commit da522b5f upstream.
      
      Fixes: 030d794b ("SUNRPC: Use gssproxy upcall for server RPCGSS authentication.")
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Cc: <stable@vger.kernel.org>
      Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c9ded831
    • Hanjun Guo's avatar
      tpm: tpm_tis: Add the missed acpi_put_table() to fix memory leak · e60fa800
      Hanjun Guo authored
      
      commit db9622f7 upstream.
      
      In check_acpi_tpm2(), we get the TPM2 table just to make
      sure the table is there, not used after the init, so the
      acpi_put_table() should be added to release the ACPI memory.
      
      Fixes: 4cb586a1 ("tpm_tis: Consolidate the platform and acpi probe flow")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarHanjun Guo <guohanjun@huawei.com>
      Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e60fa800
    • Hanjun Guo's avatar
      tpm: tpm_crb: Add the missed acpi_put_table() to fix memory leak · b0785eda
      Hanjun Guo authored
      
      commit 37e90c37 upstream.
      
      In crb_acpi_add(), we get the TPM2 table to retrieve information
      like start method, and then assign them to the priv data, so the
      TPM2 table is not used after the init, should be freed, call
      acpi_put_table() to fix the memory leak.
      
      Fixes: 30fc8d13 ("tpm: TPM 2.0 CRB Interface")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarHanjun Guo <guohanjun@huawei.com>
      Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b0785eda
    • Hanjun Guo's avatar
      tpm: acpi: Call acpi_put_table() to fix memory leak · bf31e3f8
      Hanjun Guo authored
      
      commit 8740a12c upstream.
      
      The start and length of the event log area are obtained from
      TPM2 or TCPA table, so we call acpi_get_table() to get the
      ACPI information, but the acpi_get_table() should be coupled with
      acpi_put_table() to release the ACPI memory, add the acpi_put_table()
      properly to fix the memory leak.
      
      While we are at it, remove the redundant empty line at the
      end of the tpm_read_log_acpi().
      
      Fixes: 0bfb2374 ("tpm: Move eventlog files to a subdirectory")
      Fixes: 85467f63 ("tpm: Add support for event log pointer found in TPM2 ACPI table")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarHanjun Guo <guohanjun@huawei.com>
      Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bf31e3f8
    • Deren Wu's avatar
      mmc: vub300: fix warning - do not call blocking ops when !TASK_RUNNING · ba2e7d07
      Deren Wu authored
      
      commit 4a44cd24 upstream.
      
      vub300_enable_sdio_irq() works with mutex and need TASK_RUNNING here.
      Ensure that we mark current as TASK_RUNNING for sleepable context.
      
      [   77.554641] do not call blocking ops when !TASK_RUNNING; state=1 set at [<ffffffff92a72c1d>] sdio_irq_thread+0x17d/0x5b0
      [   77.554652] WARNING: CPU: 2 PID: 1983 at kernel/sched/core.c:9813 __might_sleep+0x116/0x160
      [   77.554905] CPU: 2 PID: 1983 Comm: ksdioirqd/mmc1 Tainted: G           OE      6.1.0-rc5 #1
      [   77.554910] Hardware name: Intel(R) Client Systems NUC8i7BEH/NUC8BEB, BIOS BECFL357.86A.0081.2020.0504.1834 05/04/2020
      [   77.554912] RIP: 0010:__might_sleep+0x116/0x160
      [   77.554920] RSP: 0018:ffff888107b7fdb8 EFLAGS: 00010282
      [   77.554923] RAX: 0000000000000000 RBX: ffff888118c1b740 RCX: 0000000000000000
      [   77.554926] RDX: 0000000000000001 RSI: 0000000000000004 RDI: ffffed1020f6ffa9
      [   77.554928] RBP: ffff888107b7fde0 R08: 0000000000000001 R09: ffffed1043ea60ba
      [   77.554930] R10: ffff88821f5305cb R11: ffffed1043ea60b9 R12: ffffffff93aa3a60
      [   77.554932] R13: 000000000000011b R14: 7fffffffffffffff R15: ffffffffc0558660
      [   77.554934] FS:  0000000000000000(0000) GS:ffff88821f500000(0000) knlGS:0000000000000000
      [   77.554937] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [   77.554939] CR2: 00007f8a44010d68 CR3: 000000024421a003 CR4: 00000000003706e0
      [   77.554942] Call Trace:
      [   77.554944]  <TASK>
      [   77.554952]  mutex_lock+0x78/0xf0
      [   77.554973]  vub300_enable_sdio_irq+0x103/0x3c0 [vub300]
      [   77.554981]  sdio_irq_thread+0x25c/0x5b0
      [   77.555006]  kthread+0x2b8/0x370
      [   77.555017]  ret_from_fork+0x1f/0x30
      [   77.555023]  </TASK>
      [   77.555025] ---[ end trace 0000000000000000 ]---
      
      Fixes: 88095e7b ("mmc: Add new VUB300 USB-to-SD/SDIO/MMC driver")
      Signed-off-by: default avatarDeren Wu <deren.wu@mediatek.com>
      Cc: stable@vger.kernel.org
      Link: https://lore.kernel.org/r/87dc45b122d26d63c80532976813c9365d7160b3.1670140888.git.deren.wu@mediatek.com
      
      
      Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ba2e7d07
    • Jan Kara's avatar
      block: Do not reread partition table on exclusively open device · a35b4bcb
      Jan Kara authored
      commit 36369f46 upstream.
      
      Since commit 10c70d95 ("block: remove the bd_openers checks in
      blk_drop_partitions") we allow rereading of partition table although
      there are users of the block device. This has an undesirable consequence
      that e.g. if sda and sdb are assembled to a RAID1 device md0 with
      partitions, BLKRRPART ioctl on sda will rescan partition table and
      create sda1 device. This partition device under a raid device confuses
      some programs (such as libstorage-ng used for initial partitioning for
      distribution installation) leading to failures.
      
      Fix the problem refusing to rescan partitions if there is another user
      that has the block device exclusively open.
      
      Cc: stable@vger.kernel.org
      Link: https://lore.kernel.org/all/20221130135344.2ul4cyfstfs3znxg@quack3
      
      
      Fixes: 10c70d95 ("block: remove the bd_openers checks in blk_drop_partitions")
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      Link: https://lore.kernel.org/r/20221130175653.24299-1-jack@suse.cz
      
      
      [axboe: fold in followup fix]
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a35b4bcb
    • Jaegeuk Kim's avatar
      f2fs: allow to read node block after shutdown · 01bb4857
      Jaegeuk Kim authored
      
      commit e6ecb142 upstream.
      
      If block address is still alive, we should give a valid node block even after
      shutdown. Otherwise, we can see zero data when reading out a file.
      
      Cc: stable@vger.kernel.org
      Fixes: 83a3bfdb ("f2fs: indicate shutdown f2fs to allow unmount successfully")
      Reviewed-by: default avatarChao Yu <chao@kernel.org>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      01bb4857
    • Pavel Machek's avatar
      f2fs: should put a page when checking the summary info · 6028ec01
      Pavel Machek authored
      
      commit c3db3c2f upstream.
      
      The commit introduces another bug.
      
      Cc: stable@vger.kernel.org
      Fixes: c6ad7fd1 ("f2fs: fix to do sanity check on summary info")
      Signed-off-by: default avatarPavel Machek <pavel@denx.de>
      Reviewed-by: default avatarChao Yu <chao@kernel.org>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6028ec01
    • NARIBAYASHI Akira's avatar
      mm, compaction: fix fast_isolate_around() to stay within boundaries · b3b32127
      NARIBAYASHI Akira authored
      commit be21b32a upstream.
      
      Depending on the memory configuration, isolate_freepages_block() may scan
      pages out of the target range and causes panic.
      
      Panic can occur on systems with multiple zones in a single pageblock.
      
      The reason it is rare is that it only happens in special
      configurations.  Depending on how many similar systems there are, it
      may be a good idea to fix this problem for older kernels as well.
      
      The problem is that pfn as argument of fast_isolate_around() could be out
      of the target range.  Therefore we should consider the case where pfn <
      start_pfn, and also the case where end_pfn < pfn.
      
      This problem should have been addressd by the commit 6e2b7044 ("mm,
      compaction: make fast_isolate_freepages() stay within zone") but there was
      an oversight.
      
       Case1: pfn < start_pfn
      
        <at memory compaction for node Y>
        |  node X's zone  | node Y's zone
        +-----------------+------------------------------...
         pageblock    ^   ^     ^
        +-----------+-----------+-----------+-----------+...
                      ^   ^     ^
                      ^   ^      end_pfn
                      ^    start_pfn = cc->zone->zone_start_pfn
                       pfn
                      <---------> scanned range by "Scan After"
      
       Case2: end_pfn < pfn
      
        <at memory compaction for node X>
        |  node X's zone  | node Y's zone
        +-----------------+------------------------------...
         pageblock  ^     ^   ^
        +-----------+-----------+-----------+-----------+...
                    ^     ^   ^
                    ^     ^    pfn
                    ^      end_pfn
                     start_pfn
                    <---------> scanned range by "Scan Before"
      
      It seems that there is no good reason to skip nr_isolated pages just after
      given pfn.  So let perform simple scan from start to end instead of
      dividing the scan into "Before" and "After".
      
      Link: https://lkml.kernel.org/r/20221026112438.236336-1-a.naribayashi@fujitsu.com
      
      
      Fixes: 6e2b7044 ("mm, compaction: make fast_isolate_freepages() stay within zone").
      Signed-off-by: default avatarNARIBAYASHI Akira <a.naribayashi@fujitsu.com>
      Cc: David Rientjes <rientjes@google.com>
      Cc: Mel Gorman <mgorman@techsingularity.net>
      Cc: Vlastimil Babka <vbabka@suse.cz>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b3b32127
    • Mikulas Patocka's avatar
      md: fix a crash in mempool_free · 97ce9998
      Mikulas Patocka authored
      
      commit 341097ee upstream.
      
      There's a crash in mempool_free when running the lvm test
      shell/lvchange-rebuild-raid.sh.
      
      The reason for the crash is this:
      * super_written calls atomic_dec_and_test(&mddev->pending_writes) and
        wake_up(&mddev->sb_wait). Then it calls rdev_dec_pending(rdev, mddev)
        and bio_put(bio).
      * so, the process that waited on sb_wait and that is woken up is racing
        with bio_put(bio).
      * if the process wins the race, it calls bioset_exit before bio_put(bio)
        is executed.
      * bio_put(bio) attempts to free a bio into a destroyed bio set - causing
        a crash in mempool_free.
      
      We fix this bug by moving bio_put before atomic_dec_and_test.
      
      We also move rdev_dec_pending before atomic_dec_and_test as suggested by
      Neil Brown.
      
      The function md_end_flush has a similar bug - we must call bio_put before
      we decrement the number of in-progress bios.
      
       BUG: kernel NULL pointer dereference, address: 0000000000000000
       #PF: supervisor write access in kernel mode
       #PF: error_code(0x0002) - not-present page
       PGD 11557f0067 P4D 11557f0067 PUD 0
       Oops: 0002 [#1] PREEMPT SMP
       CPU: 0 PID: 73 Comm: kworker/0:1 Not tainted 6.1.0-rc3 #5
       Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
       Workqueue: kdelayd flush_expired_bios [dm_delay]
       RIP: 0010:mempool_free+0x47/0x80
       Code: 48 89 ef 5b 5d ff e0 f3 c3 48 89 f7 e8 32 45 3f 00 48 63 53 08 48 89 c6 3b 53 04 7d 2d 48 8b 43 10 8d 4a 01 48 89 df 89 4b 08 <48> 89 2c d0 e8 b0 45 3f 00 48 8d 7b 30 5b 5d 31 c9 ba 01 00 00 00
       RSP: 0018:ffff88910036bda8 EFLAGS: 00010093
       RAX: 0000000000000000 RBX: ffff8891037b65d8 RCX: 0000000000000001
       RDX: 0000000000000000 RSI: 0000000000000202 RDI: ffff8891037b65d8
       RBP: ffff8891447ba240 R08: 0000000000012908 R09: 00000000003d0900
       R10: 0000000000000000 R11: 0000000000173544 R12: ffff889101a14000
       R13: ffff8891562ac300 R14: ffff889102b41440 R15: ffffe8ffffa00d05
       FS:  0000000000000000(0000) GS:ffff88942fa00000(0000) knlGS:0000000000000000
       CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
       CR2: 0000000000000000 CR3: 0000001102e99000 CR4: 00000000000006b0
       Call Trace:
        <TASK>
        clone_endio+0xf4/0x1c0 [dm_mod]
        clone_endio+0xf4/0x1c0 [dm_mod]
        __submit_bio+0x76/0x120
        submit_bio_noacct_nocheck+0xb6/0x2a0
        flush_expired_bios+0x28/0x2f [dm_delay]
        process_one_work+0x1b4/0x300
        worker_thread+0x45/0x3e0
        ? rescuer_thread+0x380/0x380
        kthread+0xc2/0x100
        ? kthread_complete_and_exit+0x20/0x20
        ret_from_fork+0x1f/0x30
        </TASK>
       Modules linked in: brd dm_delay dm_raid dm_mod af_packet uvesafb cfbfillrect cfbimgblt cn cfbcopyarea fb font fbdev tun autofs4 binfmt_misc configfs ipv6 virtio_rng virtio_balloon rng_core virtio_net pcspkr net_failover failover qemu_fw_cfg button mousedev raid10 raid456 libcrc32c async_raid6_recov async_memcpy async_pq raid6_pq async_xor xor async_tx raid1 raid0 md_mod sd_mod t10_pi crc64_rocksoft crc64 virtio_scsi scsi_mod evdev psmouse bsg scsi_common [last unloaded: brd]
       CR2: 0000000000000000
       ---[ end trace 0000000000000000 ]---
      
      Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarSong Liu <song@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      97ce9998
    • ChiYuan Huang's avatar
      mfd: mt6360: Add bounds checking in Regmap read/write call-backs · e9d055b8
      ChiYuan Huang authored
      commit 5f4f94e9 upstream.
      
      Fix the potential risk of OOB read if bank index is over the maximum.
      
      Refer to the discussion list for the experiment result on mt6370.
      https://lore.kernel.org/all/20220914013345.GA5802@cyhuang-hp-elitebook-840-g3.rt/
      
      
      If not to check the bound, there is the same issue on mt6360.
      
      Cc: stable@vger.kernel.org
      Fixes: 3b085044 (mfd: mt6360: Merge different sub-devices I2C read/write)
      Signed-off-by: default avatarChiYuan Huang <cy_huang@richtek.com>
      Signed-off-by: default avatarLee Jones <lee@kernel.org>
      Link: https://lore.kernel.org/r/1664416817-31590-1-git-send-email-u0084500@gmail.com
      
      
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e9d055b8
    • Christian Brauner's avatar
      pnode: terminate at peers of source · 784a4f99
      Christian Brauner authored
      
      commit 11933cf1 upstream.
      
      The propagate_mnt() function handles mount propagation when creating
      mounts and propagates the source mount tree @source_mnt to all
      applicable nodes of the destination propagation mount tree headed by
      @dest_mnt.
      
      Unfortunately it contains a bug where it fails to terminate at peers of
      @source_mnt when looking up copies of the source mount that become
      masters for copies of the source mount tree mounted on top of slaves in
      the destination propagation tree causing a NULL dereference.
      
      Once the mechanics of the bug are understood it's easy to trigger.
      Because of unprivileged user namespaces it is available to unprivileged
      users.
      
      While fixing this bug we've gotten confused multiple times due to
      unclear terminology or missing concepts. So let's start this with some
      clarifications:
      
      * The terms "master" or "peer" denote a shared mount. A shared mount
        belongs to a peer group.
      
      * A peer group is a set of shared mounts that propagate to each other.
        They are identified by a peer group id. The peer group id is available
        in @shared_mnt->mnt_group_id.
        Shared mounts within the same peer group have the same peer group id.
        The peers in a peer group can be reached via @shared_mnt->mnt_share.
      
      * The terms "slave mount" or "dependent mount" denote a mount that
        receives propagation from a peer in a peer group. IOW, shared mounts
        may have slave mounts and slave mounts have shared mounts as their
        master. Slave mounts of a given peer in a peer group are listed on
        that peers slave list available at @shared_mnt->mnt_slave_list.
      
      * The term "master mount" denotes a mount in a peer group. IOW, it
        denotes a shared mount or a peer mount in a peer group. The term
        "master mount" - or "master" for short - is mostly used when talking
        in the context of slave mounts that receive propagation from a master
        mount. A master mount of a slave identifies the closest peer group a
        slave mount receives propagation from. The master mount of a slave can
        be identified via @slave_mount->mnt_master. Different slaves may point
        to different masters in the same peer group.
      
      * Multiple peers in a peer group can have non-empty ->mnt_slave_lists.
        Non-empty ->mnt_slave_lists of peers don't intersect. Consequently, to
        ensure all slave mounts of a peer group are visited the
        ->mnt_slave_lists of all peers in a peer group have to be walked.
      
      * Slave mounts point to a peer in the closest peer group they receive
        propagation from via @slave_mnt->mnt_master (see above). Together with
        these peers they form a propagation group (see below). The closest
        peer group can thus be identified through the peer group id
        @slave_mnt->mnt_master->mnt_group_id of the peer/master that a slave
        mount receives propagation from.
      
      * A shared-slave mount is a slave mount to a peer group pg1 while also
        a peer in another peer group pg2. IOW, a peer group may receive
        propagation from another peer group.
      
        If a peer group pg1 is a slave to another peer group pg2 then all
        peers in peer group pg1 point to the same peer in peer group pg2 via
        ->mnt_master. IOW, all peers in peer group pg1 appear on the same
        ->mnt_slave_list. IOW, they cannot be slaves to different peer groups.
      
      * A pure slave mount is a slave mount that is a slave to a peer group
        but is not a peer in another peer group.
      
      * A propagation group denotes the set of mounts consisting of a single
        peer group pg1 and all slave mounts and shared-slave mounts that point
        to a peer in that peer group via ->mnt_master. IOW, all slave mounts
        such that @slave_mnt->mnt_master->mnt_group_id is equal to
        @shared_mnt->mnt_group_id.
      
        The concept of a propagation group makes it easier to talk about a
        single propagation level in a propagation tree.
      
        For example, in propagate_mnt() the immediate peers of @dest_mnt and
        all slaves of @dest_mnt's peer group form a propagation group propg1.
        So a shared-slave mount that is a slave in propg1 and that is a peer
        in another peer group pg2 forms another propagation group propg2
        together with all slaves that point to that shared-slave mount in
        their ->mnt_master.
      
      * A propagation tree refers to all mounts that receive propagation
        starting from a specific shared mount.
      
        For example, for propagate_mnt() @dest_mnt is the start of a
        propagation tree. The propagation tree ecompasses all mounts that
        receive propagation from @dest_mnt's peer group down to the leafs.
      
      With that out of the way let's get to the actual algorithm.
      
      We know that @dest_mnt is guaranteed to be a pure shared mount or a
      shared-slave mount. This is guaranteed by a check in
      attach_recursive_mnt(). So propagate_mnt() will first propagate the
      source mount tree to all peers in @dest_mnt's peer group:
      
      for (n = next_peer(dest_mnt); n != dest_mnt; n = next_peer(n)) {
              ret = propagate_one(n);
              if (ret)
                     goto out;
      }
      
      Notice, that the peer propagation loop of propagate_mnt() doesn't
      propagate @dest_mnt itself. @dest_mnt is mounted directly in
      attach_recursive_mnt() after we propagated to the destination
      propagation tree.
      
      The mount that will be mounted on top of @dest_mnt is @source_mnt. This
      copy was created earlier even before we entered attach_recursive_mnt()
      and doesn't concern us a lot here.
      
      It's just important to notice that when propagate_mnt() is called
      @source_mnt will not yet have been mounted on top of @dest_mnt. Thus,
      @source_mnt->mnt_parent will either still point to @source_mnt or - in
      the case @source_mnt is moved and thus already attached - still to its
      former parent.
      
      For each peer @m in @dest_mnt's peer group propagate_one() will create a
      new copy of the source mount tree and mount that copy @child on @m such
      that @child->mnt_parent points to @m after propagate_one() returns.
      
      propagate_one() will stash the last destination propagation node @m in
      @last_dest and the last copy it created for the source mount tree in
      @last_source.
      
      Hence, if we call into propagate_one() again for the next destination
      propagation node @m, @last_dest will point to the previous destination
      propagation node and @last_source will point to the previous copy of the
      source mount tree and mounted on @last_dest.
      
      Each new copy of the source mount tree is created from the previous copy
      of the source mount tree. This will become important later.
      
      The peer loop in propagate_mnt() is straightforward. We iterate through
      the peers copying and updating @last_source and @last_dest as we go
      through them and mount each copy of the source mount tree @child on a
      peer @m in @dest_mnt's peer group.
      
      After propagate_mnt() handled the peers in @dest_mnt's peer group
      propagate_mnt() will propagate the source mount tree down the
      propagation tree that @dest_mnt's peer group propagates to:
      
      for (m = next_group(dest_mnt, dest_mnt); m;
                      m = next_group(m, dest_mnt)) {
              /* everything in that slave group */
              n = m;
              do {
                      ret = propagate_one(n);
                      if (ret)
                              goto out;
                      n = next_peer(n);
              } while (n != m);
      }
      
      The next_group() helper will recursively walk the destination
      propagation tree, descending into each propagation group of the
      propagation tree.
      
      The important part is that it takes care to propagate the source mount
      tree to all peers in the peer group of a propagation group before it
      propagates to the slaves to those peers in the propagation group. IOW,
      it creates and mounts copies of the source mount tree that become
      masters before it creates and mounts copies of the source mount tree
      that become slaves to these masters.
      
      It is important to remember that propagating the source mount tree to
      each mount @m in the destination propagation tree simply means that we
      create and mount new copies @child of the source mount tree on @m such
      that @child->mnt_parent points to @m.
      
      Since we know that each node @m in the destination propagation tree
      headed by @dest_mnt's peer group will be overmounted with a copy of the
      source mount tree and since we know that the propagation properties of
      each copy of the source mount tree we create and mount at @m will mostly
      mirror the propagation properties of @m. We can use that information to
      create and mount the copies of the source mount tree that become masters
      before their slaves.
      
      The easy case is always when @m and @last_dest are peers in a peer group
      of a given propagation group. In that case we know that we can simply
      copy @last_source without having to figure out what the master for the
      new copy @child of the source mount tree needs to be as we've done that
      in a previous call to propagate_one().
      
      The hard case is when we're dealing with a slave mount or a shared-slave
      mount @m in a destination propagation group that we need to create and
      mount a copy of the source mount tree on.
      
      For each propagation group in the destination propagation tree we
      propagate the source mount tree to we want to make sure that the copies
      @child of the source mount tree we create and mount on slaves @m pick an
      ealier copy of the source mount tree that we mounted on a master @m of
      the destination propagation group as their master. This is a mouthful
      but as far as we can tell that's the core of it all.
      
      But, if we keep track of the masters in the destination propagation tree
      @m we can use the information to find the correct master for each copy
      of the source mount tree we create and mount at the slaves in the
      destination propagation tree @m.
      
      Let's walk through the base case as that's still fairly easy to grasp.
      
      If we're dealing with the first slave in the propagation group that
      @dest_mnt is in then we don't yet have marked any masters in the
      destination propagation tree.
      
      We know the master for the first slave to @dest_mnt's peer group is
      simple @dest_mnt. So we expect this algorithm to yield a copy of the
      source mount tree that was mounted on a peer in @dest_mnt's peer group
      as the master for the copy of the source mount tree we want to mount at
      the first slave @m:
      
      for (n = m; ; n = p) {
              p = n->mnt_master;
              if (p == dest_master || IS_MNT_MARKED(p))
                      break;
      }
      
      For the first slave we walk the destination propagation tree all the way
      up to a peer in @dest_mnt's peer group. IOW, the propagation hierarchy
      can be walked by walking up the @mnt->mnt_master hierarchy of the
      destination propagation tree @m. We will ultimately find a peer in
      @dest_mnt's peer group and thus ultimately @dest_mnt->mnt_master.
      
      Btw, here the assumption we listed at the beginning becomes important.
      Namely, that peers in a peer group pg1 that are slaves in another peer
      group pg2 appear on the same ->mnt_slave_list. IOW, all slaves who are
      peers in peer group pg1 point to the same peer in peer group pg2 via
      their ->mnt_master. Otherwise the termination condition in the code
      above would be wrong and next_group() would be broken too.
      
      So the first iteration sets:
      
      n = m;
      p = n->mnt_master;
      
      such that @p now points to a peer or @dest_mnt itself. We walk up one
      more level since we don't have any marked mounts. So we end up with:
      
      n = dest_mnt;
      p = dest_mnt->mnt_master;
      
      If @dest_mnt's peer group is not slave to another peer group then @p is
      now NULL. If @dest_mnt's peer group is a slave to another peer group
      then @p now points to @dest_mnt->mnt_master points which is a master
      outside the propagation tree we're dealing with.
      
      Now we need to figure out the master for the copy of the source mount
      tree we're about to create and mount on the first slave of @dest_mnt's
      peer group:
      
      do {
              struct mount *parent = last_source->mnt_parent;
              if (last_source == first_source)
                      break;
              done = parent->mnt_master == p;
              if (done && peers(n, parent))
                      break;
              last_source = last_source->mnt_master;
      } while (!done);
      
      We know that @last_source->mnt_parent points to @last_dest and
      @last_dest is the last peer in @dest_mnt's peer group we propagated to
      in the peer loop in propagate_mnt().
      
      Consequently, @last_source is the last copy we created and mount on that
      last peer in @dest_mnt's peer group. So @last_source is the master we
      want to pick.
      
      We know that @last_source->mnt_parent->mnt_master points to
      @last_dest->mnt_master. We also know that @last_dest->mnt_master is
      either NULL or points to a master outside of the destination propagation
      tree and so does @p. Hence:
      
      done = parent->mnt_master == p;
      
      is trivially true in the base condition.
      
      We also know that for the first slave mount of @dest_mnt's peer group
      that @last_dest either points @dest_mnt itself because it was
      initialized to:
      
      last_dest = dest_mnt;
      
      at the beginning of propagate_mnt() or it will point to a peer of
      @dest_mnt in its peer group. In both cases it is guaranteed that on the
      first iteration @n and @parent are peers (Please note the check for
      peers here as that's important.):
      
      if (done && peers(n, parent))
              break;
      
      So, as we expected, we select @last_source, which referes to the last
      copy of the source mount tree we mounted on the last peer in @dest_mnt's
      peer group, as the master of the first slave in @dest_mnt's peer group.
      The rest is taken care of by clone_mnt(last_source, ...). We'll skip
      over that part otherwise this becomes a blogpost.
      
      At the end of propagate_mnt() we now mark @m->mnt_master as the first
      master in the destination propagation tree that is distinct from
      @dest_mnt->mnt_master. IOW, we mark @dest_mnt itself as a master.
      
      By marking @dest_mnt or one of it's peers we are able to easily find it
      again when we later lookup masters for other copies of the source mount
      tree we mount copies of the source mount tree on slaves @m to
      @dest_mnt's peer group. This, in turn allows us to find the master we
      selected for the copies of the source mount tree we mounted on master in
      the destination propagation tree again.
      
      The important part is to realize that the code makes use of the fact
      that the last copy of the source mount tree stashed in @last_source was
      mounted on top of the previous destination propagation node @last_dest.
      What this means is that @last_source allows us to walk the destination
      propagation hierarchy the same way each destination propagation node @m
      does.
      
      If we take @last_source, which is the copy of @source_mnt we have
      mounted on @last_dest in the previous iteration of propagate_one(), then
      we know @last_source->mnt_parent points to @last_dest but we also know
      that as we walk through the destination propagation tree that
      @last_source->mnt_master will point to an earlier copy of the source
      mount tree we mounted one an earlier destination propagation node @m.
      
      IOW, @last_source->mnt_parent will be our hook into the destination
      propagation tree and each consecutive @last_source->mnt_master will lead
      us to an earlier propagation node @m via
      @last_source->mnt_master->mnt_parent.
      
      Hence, by walking up @last_source->mnt_master, each of which is mounted
      on a node that is a master @m in the destination propagation tree we can
      also walk up the destination propagation hierarchy.
      
      So, for each new destination propagation node @m we use the previous
      copy of @last_source and the fact it's mounted on the previous
      propagation node @last_dest via @last_source->mnt_master->mnt_parent to
      determine what the master of the new copy of @last_source needs to be.
      
      The goal is to find the _closest_ master that the new copy of the source
      mount tree we are about to create and mount on a slave @m in the
      destination propagation tree needs to pick. IOW, we want to find a
      suitable master in the propagation group.
      
      As the propagation structure of the source mount propagation tree we
      create mirrors the propagation structure of the destination propagation
      tree we can find @m's closest master - i.e., a marked master - which is
      a peer in the closest peer group that @m receives propagation from. We
      store that closest master of @m in @p as before and record the slave to
      that master in @n
      
      We then search for this master @p via @last_source by walking up the
      master hierarchy starting from the last copy of the source mount tree
      stored in @last_source that we created and mounted on the previous
      destination propagation node @m.
      
      We will try to find the master by walking @last_source->mnt_master and
      by comparing @last_source->mnt_master->mnt_parent->mnt_master to @p. If
      we find @p then we can figure out what earlier copy of the source mount
      tree needs to be the master for the new copy of the source mount tree
      we're about to create and mount at the current destination propagation
      node @m.
      
      If @last_source->mnt_master->mnt_parent and @n are peers then we know
      that the closest master they receive propagation from is
      @last_source->mnt_master->mnt_parent->mnt_master. If not then the
      closest immediate peer group that they receive propagation from must be
      one level higher up.
      
      This builds on the earlier clarification at the beginning that all peers
      in a peer group which are slaves of other peer groups all point to the
      same ->mnt_master, i.e., appear on the same ->mnt_slave_list, of the
      closest peer group that they receive propagation from.
      
      However, terminating the walk has corner cases.
      
      If the closest marked master for a given destination node @m cannot be
      found by walking up the master hierarchy via @last_source->mnt_master
      then we need to terminate the walk when we encounter @source_mnt again.
      
      This isn't an arbitrary termination. It simply means that the new copy
      of the source mount tree we're about to create has a copy of the source
      mount tree we created and mounted on a peer in @dest_mnt's peer group as
      its master. IOW, @source_mnt is the peer in the closest peer group that
      the new copy of the source mount tree receives propagation from.
      
      We absolutely have to stop @source_mnt because @last_source->mnt_master
      either points outside the propagation hierarchy we're dealing with or it
      is NULL because @source_mnt isn't a shared-slave.
      
      So continuing the walk past @source_mnt would cause a NULL dereference
      via @last_source->mnt_master->mnt_parent. And so we have to stop the
      walk when we encounter @source_mnt again.
      
      One scenario where this can happen is when we first handled a series of
      slaves of @dest_mnt's peer group and then encounter peers in a new peer
      group that is a slave to @dest_mnt's peer group. We handle them and then
      we encounter another slave mount to @dest_mnt that is a pure slave to
      @dest_mnt's peer group. That pure slave will have a peer in @dest_mnt's
      peer group as its master. Consequently, the new copy of the source mount
      tree will need to have @source_mnt as it's master. So we walk the
      propagation hierarchy all the way up to @source_mnt based on
      @last_source->mnt_master.
      
      So terminate on @source_mnt, easy peasy. Except, that the check misses
      something that the rest of the algorithm already handles.
      
      If @dest_mnt has peers in it's peer group the peer loop in
      propagate_mnt():
      
      for (n = next_peer(dest_mnt); n != dest_mnt; n = next_peer(n)) {
              ret = propagate_one(n);
              if (ret)
                      goto out;
      }
      
      will consecutively update @last_source with each previous copy of the
      source mount tree we created and mounted at the previous peer in
      @dest_mnt's peer group. So after that loop terminates @last_source will
      point to whatever copy of the source mount tree was created and mounted
      on the last peer in @dest_mnt's peer group.
      
      Furthermore, if there is even a single additional peer in @dest_mnt's
      peer group then @last_source will __not__ point to @source_mnt anymore.
      Because, as we mentioned above, @dest_mnt isn't even handled in this
      loop but directly in attach_recursive_mnt(). So it can't even accidently
      come last in that peer loop.
      
      So the first time we handle a slave mount @m of @dest_mnt's peer group
      the copy of the source mount tree we create will make the __last copy of
      the source mount tree we created and mounted on the last peer in
      @dest_mnt's peer group the master of the new copy of the source mount
      tree we create and mount on the first slave of @dest_mnt's peer group__.
      
      But this means that the termination condition that checks for
      @source_mnt is wrong. The @source_mnt cannot be found anymore by
      propagate_one(). Instead it will find the last copy of the source mount
      tree we created and mounted for the last peer of @dest_mnt's peer group
      again. And that is a peer of @source_mnt not @source_mnt itself.
      
      IOW, we fail to terminate the loop correctly and ultimately dereference
      @last_source->mnt_master->mnt_parent. When @source_mnt's peer group
      isn't slave to another peer group then @last_source->mnt_master is NULL
      causing the splat below.
      
      For example, assume @dest_mnt is a pure shared mount and has three peers
      in its peer group:
      
      ===================================================================================
                                               mount-id   mount-parent-id   peer-group-id
      ===================================================================================
      (@dest_mnt) mnt_master[216]              309        297               shared:216
          \
           (@source_mnt) mnt_master[218]:      609        609               shared:218
      
      (1) mnt_master[216]:                     607        605               shared:216
          \
           (P1) mnt_master[218]:               624        607               shared:218
      
      (2) mnt_master[216]:                     576        574               shared:216
          \
           (P2) mnt_master[218]:               625        576               shared:218
      
      (3) mnt_master[216]:                     545        543               shared:216
          \
           (P3) mnt_master[218]:               626        545               shared:218
      
      After this sequence has been processed @last_source will point to (P3),
      the copy generated for the third peer in @dest_mnt's peer group we
      handled. So the copy of the source mount tree (P4) we create and mount
      on the first slave of @dest_mnt's peer group:
      
      ===================================================================================
                                               mount-id   mount-parent-id   peer-group-id
      ===================================================================================
          mnt_master[216]                      309        297               shared:216
         /
        /
      (S0) mnt_slave                           483        481               master:216
        \
         \    (P3) mnt_master[218]             626        545               shared:218
          \  /
           \/
          (P4) mnt_slave                       627        483               master:218
      
      will pick the last copy of the source mount tree (P3) as master, not (S0).
      
      When walking the propagation hierarchy via @last_source's master
      hierarchy we encounter (P3) but not (S0), i.e., @source_mnt.
      
      We can fix this in multiple ways:
      
      (1) By setting @last_source to @source_mnt after we processed the peers
          in @dest_mnt's peer group right after the peer loop in
          propagate_mnt().
      
      (2) By changing the termination condition that relies on finding exactly
          @source_mnt to finding a peer of @source_mnt.
      
      (3) By only moving @last_source when we actually venture into a new peer
          group or some clever variant thereof.
      
      The first two options are minimally invasive and what we want as a fix.
      The third option is more intrusive but something we'd like to explore in
      the near future.
      
      This passes all LTP tests and specifically the mount propagation
      testsuite part of it. It also holds up against all known reproducers of
      this issues.
      
      Final words.
      First, this is a clever but __worringly__ underdocumented algorithm.
      There isn't a single detailed comment to be found in next_group(),
      propagate_one() or anywhere else in that file for that matter. This has
      been a giant pain to understand and work through and a bug like this is
      insanely difficult to fix without a detailed understanding of what's
      happening. Let's not talk about the amount of time that was sunk into
      fixing this.
      
      Second, all the cool kids with access to
      unshare --mount --user --map-root --propagation=unchanged
      are going to have a lot of fun. IOW, triggerable by unprivileged users
      while namespace_lock() lock is held.
      
      [  115.848393] BUG: kernel NULL pointer dereference, address: 0000000000000010
      [  115.848967] #PF: supervisor read access in kernel mode
      [  115.849386] #PF: error_code(0x0000) - not-present page
      [  115.849803] PGD 0 P4D 0
      [  115.850012] Oops: 0000 [#1] PREEMPT SMP PTI
      [  115.850354] CPU: 0 PID: 15591 Comm: mount Not tainted 6.1.0-rc7 #3
      [  115.850851] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS
      VirtualBox 12/01/2006
      [  115.851510] RIP: 0010:propagate_one.part.0+0x7f/0x1a0
      [  115.851924] Code: 75 eb 4c 8b 05 c2 25 37 02 4c 89 ca 48 8b 4a 10
      49 39 d0 74 1e 48 3b 81 e0 00 00 00 74 26 48 8b 92 e0 00 00 00 be 01
      00 00 00 <48> 8b 4a 10 49 39 d0 75 e2 40 84 f6 74 38 4c 89 05 84 25 37
      02 4d
      [  115.853441] RSP: 0018:ffffb8d5443d7d50 EFLAGS: 00010282
      [  115.853865] RAX: ffff8e4d87c41c80 RBX: ffff8e4d88ded780 RCX: ffff8e4da4333a00
      [  115.854458] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8e4d88ded780
      [  115.855044] RBP: ffff8e4d88ded780 R08: ffff8e4da4338000 R09: ffff8e4da43388c0
      [  115.855693] R10: 0000000000000002 R11: ffffb8d540158000 R12: ffffb8d5443d7da8
      [  115.856304] R13: ffff8e4d88ded780 R14: 0000000000000000 R15: 0000000000000000
      [  115.856859] FS:  00007f92c90c9800(0000) GS:ffff8e4dfdc00000(0000)
      knlGS:0000000000000000
      [  115.857531] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  115.858006] CR2: 0000000000000010 CR3: 0000000022f4c002 CR4: 00000000000706f0
      [  115.858598] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  115.859393] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [  115.860099] Call Trace:
      [  115.860358]  <TASK>
      [  115.860535]  propagate_mnt+0x14d/0x190
      [  115.860848]  attach_recursive_mnt+0x274/0x3e0
      [  115.861212]  path_mount+0x8c8/0xa60
      [  115.861503]  __x64_sys_mount+0xf6/0x140
      [  115.861819]  do_syscall_64+0x5b/0x80
      [  115.862117]  ? do_faccessat+0x123/0x250
      [  115.862435]  ? syscall_exit_to_user_mode+0x17/0x40
      [  115.862826]  ? do_syscall_64+0x67/0x80
      [  115.863133]  ? syscall_exit_to_user_mode+0x17/0x40
      [  115.863527]  ? do_syscall_64+0x67/0x80
      [  115.863835]  ? do_syscall_64+0x67/0x80
      [  115.864144]  ? do_syscall_64+0x67/0x80
      [  115.864452]  ? exc_page_fault+0x70/0x170
      [  115.864775]  entry_SYSCALL_64_after_hwframe+0x63/0xcd
      [  115.865187] RIP: 0033:0x7f92c92b0ebe
      [  115.865480] Code: 48 8b 0d 75 4f 0c 00 f7 d8 64 89 01 48 83 c8 ff
      c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 49 89 ca b8 a5 00 00
      00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 42 4f 0c 00 f7 d8 64 89
      01 48
      [  115.866984] RSP: 002b:00007fff000aa728 EFLAGS: 00000246 ORIG_RAX:
      00000000000000a5
      [  115.867607] RAX: ffffffffffffffda RBX: 000055a77888d6b0 RCX: 00007f92c92b0ebe
      [  115.868240] RDX: 000055a77888d8e0 RSI: 000055a77888e6e0 RDI: 000055a77888e620
      [  115.868823] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000001
      [  115.869403] R10: 0000000000001000 R11: 0000000000000246 R12: 000055a77888e620
      [  115.869994] R13: 000055a77888d8e0 R14: 00000000ffffffff R15: 00007f92c93e4076
      [  115.870581]  </TASK>
      [  115.870763] Modules linked in: nft_fib_inet nft_fib_ipv4
      nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6
      nft_reject nft_ct nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6
      nf_defrag_ipv4 ip_set rfkill nf_tables nfnetlink qrtr snd_intel8x0
      sunrpc snd_ac97_codec ac97_bus snd_pcm snd_timer intel_rapl_msr
      intel_rapl_common snd vboxguest intel_powerclamp video rapl joydev
      soundcore i2c_piix4 wmi fuse zram xfs vmwgfx crct10dif_pclmul
      crc32_pclmul crc32c_intel polyval_clmulni polyval_generic
      drm_ttm_helper ttm e1000 ghash_clmulni_intel serio_raw ata_generic
      pata_acpi scsi_dh_rdac scsi_dh_emc scsi_dh_alua dm_multipath
      [  115.875288] CR2: 0000000000000010
      [  115.875641] ---[ end trace 0000000000000000 ]---
      [  115.876135] RIP: 0010:propagate_one.part.0+0x7f/0x1a0
      [  115.876551] Code: 75 eb 4c 8b 05 c2 25 37 02 4c 89 ca 48 8b 4a 10
      49 39 d0 74 1e 48 3b 81 e0 00 00 00 74 26 48 8b 92 e0 00 00 00 be 01
      00 00 00 <48> 8b 4a 10 49 39 d0 75 e2 40 84 f6 74 38 4c 89 05 84 25 37
      02 4d
      [  115.878086] RSP: 0018:ffffb8d5443d7d50 EFLAGS: 00010282
      [  115.878511] RAX: ffff8e4d87c41c80 RBX: ffff8e4d88ded780 RCX: ffff8e4da4333a00
      [  115.879128] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8e4d88ded780
      [  115.879715] RBP: ffff8e4d88ded780 R08: ffff8e4da4338000 R09: ffff8e4da43388c0
      [  115.880359] R10: 0000000000000002 R11: ffffb8d540158000 R12: ffffb8d5443d7da8
      [  115.880962] R13: ffff8e4d88ded780 R14: 0000000000000000 R15: 0000000000000000
      [  115.881548] FS:  00007f92c90c9800(0000) GS:ffff8e4dfdc00000(0000)
      knlGS:0000000000000000
      [  115.882234] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [  115.882713] CR2: 0000000000000010 CR3: 0000000022f4c002 CR4: 00000000000706f0
      [  115.883314] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  115.883966] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      
      Fixes: f2ebb3a9 ("smarter propagate_mnt()")
      Fixes: 5ec0811d ("propogate_mnt: Handle the first propogated copy being a slave")
      Cc: <stable@vger.kernel.org>
      Reported-by: default avatarDitang Chen <ditang.c@gmail.com>
      Signed-off-by: default avatarSeth Forshee (Digital Ocean) <sforshee@kernel.org>
      Signed-off-by: default avatarChristian Brauner (Microsoft) <brauner@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      784a4f99
    • Takashi Iwai's avatar
      ALSA: hda/hdmi: Static PCM mapping again with AMD HDMI codecs · f9aafff5
      Takashi Iwai authored
      commit 090ddad4 upstream.
      
      The recent code refactoring for HD-audio HDMI codec driver caused a
      regression on AMD/ATI HDMI codecs; namely, PulseAudioand pipewire
      don't recognize HDMI outputs any longer while the direct output via
      ALSA raw access still works.
      
      The problem turned out that, after the code refactoring, the driver
      assumes only the dynamic PCM assignment, and when a PCM stream that
      still isn't assigned to any pin gets opened, the driver tries to
      assign any free converter to the PCM stream.  This behavior is OK for
      Intel and other codecs, as they have arbitrary connections between
      pins and converters.  OTOH, on AMD chips that have a 1:1 mapping
      between pins and converters, this may end up with blocking the open of
      the next PCM stream for the pin that is tied with the formerly taken
      converter.
      
      Also, with the code refactoring, more PCM streams are exposed than
      necessary as we assume all converters can be used, while this isn't
      true for AMD case.  This may change the PCM stream assignment and
      confuse users as well.
      
      This patch fixes those problems by:
      
      - Introducing a flag spec->static_pcm_mapping, and if it's set, the
        driver applies the static mapping between pins and converters at the
        probe time
      - Limiting the number of PCM streams per pins, too; this avoids the
        superfluous PCM streams
      
      Fixes: ef6f5494 ("ALSA: hda/hdmi: Use only dynamic PCM device allocation")
      Cc: <stable@vger.kernel.org>
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216836
      
      
      Co-developed-by: default avatarJaroslav Kysela <perex@perex.cz>
      Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
      Link: https://lore.kernel.org/r/20221228125714.16329-1-tiwai@suse.de
      
      
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f9aafff5
    • Artem Egorkine's avatar
      ALSA: line6: fix stack overflow in line6_midi_transmit · 389d34c2
      Artem Egorkine authored
      
      commit b8800d32 upstream.
      
      Correctly calculate available space including the size of the chunk
      buffer. This fixes a buffer overflow when multiple MIDI sysex
      messages are sent to a PODxt device.
      
      Signed-off-by: default avatarArtem Egorkine <arteme@gmail.com>
      Cc: <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20221225105728.1153989-2-arteme@gmail.com
      
      
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      389d34c2
    • Artem Egorkine's avatar
      ALSA: line6: correct midi status byte when receiving data from podxt · e58d1d2e
      Artem Egorkine authored
      
      commit 8508fa2e upstream.
      
      A PODxt device sends 0xb2, 0xc2 or 0xf2 as a status byte for MIDI
      messages over USB that should otherwise have a 0xb0, 0xc0 or 0xf0
      status byte. This is usually corrected by the driver on other OSes.
      
      This fixes MIDI sysex messages sent by PODxt.
      
      [ tiwai: fixed white spaces ]
      
      Signed-off-by: default avatarArtem Egorkine <arteme@gmail.com>
      Cc: <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20221225105728.1153989-1-arteme@gmail.com
      
      
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e58d1d2e
    • Al Viro's avatar
      ovl: update ->f_iocb_flags when ovl_change_flags() modifies ->f_flags · bc2e0c5b
      Al Viro authored
      
      commit 456b59e7 upstream.
      
      ovl_change_flags() is an open-coded variant of fs/fcntl.c:setfl() and it
      got missed by commit 164f4064 ("keep iocb_flags() result cached in
      struct file"); the same change applies there.
      
      Reported-by: default avatarPierre Labastie <pierre.labastie@neuf.fr>
      Fixes: 164f4064 ("keep iocb_flags() result cached in struct file")
      Cc: <stable@vger.kernel.org> # v6.0
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216738
      
      
      Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bc2e0c5b
    • Zhang Tianci's avatar
      ovl: Use ovl mounter's fsuid and fsgid in ovl_link() · d84a696c
      Zhang Tianci authored
      commit 5b0db512 upstream.
      
      There is a wrong case of link() on overlay:
        $ mkdir /lower /fuse /merge
        $ mount -t fuse /fuse
        $ mkdir /fuse/upper /fuse/work
        $ mount -t overlay /merge -o lowerdir=/lower,upperdir=/fuse/upper,\
          workdir=work
        $ touch /merge/file
        $ chown bin.bin /merge/file // the file's caller becomes "bin"
        $ ln /merge/file /merge/lnkfile
      
      Then we will get an error(EACCES) because fuse daemon checks the link()'s
      caller is "bin", it denied this request.
      
      In the changing history of ovl_link(), there are two key commits:
      
      The first is commit bb0d2b8a ("ovl: fix sgid on directory") which
      overrides the cred's fsuid/fsgid using the new inode. The new inode's
      owner is initialized by inode_init_owner(), and inode->fsuid is
      assigned to the current user. So the override fsuid becomes the
      current user. We know link() is actually modifying the directory, so
      the caller must have the MAY_WRITE permission on the directory. The
      current caller may should have this permission. This is acceptable
      to use the caller's fsuid.
      
      The second is commit 51f7e52d ("ovl: share inode for hard link")
      which removed the inode creation in ovl_link(). This commit move
      inode_init_owner() into ovl_create_object(), so the ovl_link() just
      give the old inode to ovl_create_or_link(). Then the override fsuid
      becomes the old inode's fsuid, neither the caller nor the overlay's
      mounter! So this is incorrect.
      
      Fix this bug by using ovl mounter's fsuid/fsgid to do underlying
      fs's link().
      
      Link: https://lore.kernel.org/all/20220817102952.xnvesg3a7rbv576x@wittgenstein/T
      Link: https://lore.kernel.org/lkml/20220825130552.29587-1-zhangtianci.1997@bytedance.com/t
      
      
      Signed-off-by: default avatarZhang Tianci <zhangtianci.1997@bytedance.com>
      Signed-off-by: default avatarJiachen Zhang <zhangjiachen.jaycee@bytedance.com>
      Reviewed-by: default avatarChristian Brauner (Microsoft) <brauner@kernel.org>
      Fixes: 51f7e52d ("ovl: share inode for hard link")
      Cc: <stable@vger.kernel.org> # v4.8
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d84a696c
    • Wang Yufen's avatar
      binfmt: Fix error return code in load_elf_fdpic_binary() · 703fd753
      Wang Yufen authored
      
      commit e7f703ff upstream.
      
      Fix to return a negative error code from create_elf_fdpic_tables()
      instead of 0.
      
      Fixes: 1da177e4 ("Linux-2.6.12-rc2")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarWang Yufen <wangyufen@huawei.com>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Link: https://lore.kernel.org/r/1669945261-30271-1-git-send-email-wangyufen@huawei.com
      
      
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      703fd753
    • Mario Limonciello's avatar
      ACPI: x86: s2idle: Stop using AMD specific codepath for Rembrandt+ · e6d180a3
      Mario Limonciello authored
      
      commit e555c857 upstream.
      
      After we introduced a module parameter and quirk infrastructure for
      picking the Microsoft GUID over the SOC vendor GUID we discovered
      that lots and lots of systems are getting this wrong.
      
      The table continues to grow, and is becoming unwieldy.
      
      We don't really have any benefit to forcing vendors to populate the
      AMD GUID. This is just extra work, and more and more vendors seem
      to mess it up.  As the Microsoft GUID is used by Windows as well,
      it's very likely that it won't be messed up like this.
      
      So drop all the quirks forcing it and the Rembrandt behavior. This
      means that Cezanne or later effectively only run the Microsoft GUID
      codepath with the exception of HP Elitebook 8*5 G9.
      
      Fixes: fd894f05 ("ACPI: x86: s2idle: If a new AMD _HID is missing assume Rembrandt")
      Cc: stable@vger.kernel.org # 6.1
      Reported-by: default avatarBenjamin Cheng <ben@bcheng.me>
      Reported-by: default avatar <bilkow@tutanota.com>
      Reported-by: default avatarPaul <paul@zogpog.com>
      Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2292
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216768
      
      
      Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
      Reviewed-by: default avatarPhilipp Zabel <philipp.zabel@gmail.com>
      Tested-by: default avatarPhilipp Zabel <philipp.zabel@gmail.com>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e6d180a3
    • Mario Limonciello's avatar
      ACPI: x86: s2idle: Force AMD GUID/_REV 2 on HP Elitebook 865 · 577821f7
      Mario Limonciello authored
      
      commit 3ea45390 upstream.
      
      HP Elitebook 865 supports both the AMD GUID w/ _REV 2 and Microsoft
      GUID with _REV 0. Both have very similar code but the AMD GUID
      has a special workaround that is specific to a problem with
      spurious wakeups on systems with Qualcomm WLAN.
      
      This is believed to be a bug in the Qualcomm WLAN F/W (it doesn't
      affect any other WLAN H/W). If this WLAN firmware is fixed this
      quirk can be dropped.
      
      Cc: stable@vger.kernel.org # 6.1
      Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      577821f7
    • Aditya Garg's avatar
      hfsplus: fix bug causing custom uid and gid being unable to be assigned with mount · 0478b94c
      Aditya Garg authored
      commit 9f2b5deb upstream.
      
      Despite specifying UID and GID in mount command, the specified UID and GID
      were not being assigned. This patch fixes this issue.
      
      Link: https://lkml.kernel.org/r/C0264BF5-059C-45CF-B8DA-3A3BD2C803A2@live.com
      
      
      Signed-off-by: default avatarAditya Garg <gargaditya08@live.com>
      Reviewed-by: default avatarViacheslav Dubeyko <slava@dubeyko.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0478b94c
    • Qiujun Huang's avatar
      pstore/zone: Use GFP_ATOMIC to allocate zone buffer · 23ac2a31
      Qiujun Huang authored
      
      commit 99b3b837 upstream.
      
      There is a case found when triggering a panic_on_oom, pstore fails to dump
      kmsg. Because psz_kmsg_write_record can't get the new buffer.
      
      Handle this by using GFP_ATOMIC to allocate a buffer at lower watermark.
      
      Signed-off-by: default avatarQiujun Huang <hqjagain@gmail.com>
      Fixes: 335426c6 ("pstore/zone: Provide way to skip "broken" zone for MTD devices")
      Cc: WeiXiong Liao <gmpy.liaowx@gmail.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Link: https://lore.kernel.org/r/CAJRQjofRCF7wjrYmw3D7zd5QZnwHQq+F8U-mJDJ6NZ4bddYdLA@mail.gmail.com
      
      
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      23ac2a31
    • Luca Stefani's avatar
      pstore: Properly assign mem_type property · 5c3a4cdc
      Luca Stefani authored
      
      commit beca3e31 upstream.
      
      If mem-type is specified in the device tree
      it would end up overriding the record_size
      field instead of populating mem_type.
      
      As record_size is currently parsed after the
      improper assignment with default size 0 it
      continued to work as expected regardless of the
      value found in the device tree.
      
      Simply changing the target field of the struct
      is enough to get mem-type working as expected.
      
      Fixes: 9d843e8f ("pstore: Add mem_type property DT parsing support")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarLuca Stefani <luca@osomprivacy.com>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Link: https://lore.kernel.org/r/20221222131049.286288-1-luca@osomprivacy.com
      
      
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5c3a4cdc
    • Arnd Bergmann's avatar
      kmsan: include linux/vmalloc.h · 2cec280c
      Arnd Bergmann authored
      commit aaa746ad upstream.
      
      This is needed for the vmap/vunmap declarations:
      
      mm/kmsan/kmsan_test.c:316:9: error: implicit declaration of function 'vmap' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
              vbuf = vmap(pages, npages, VM_MAP, PAGE_KERNEL);
                     ^
      mm/kmsan/kmsan_test.c:316:29: error: use of undeclared identifier 'VM_MAP'
              vbuf = vmap(pages, npages, VM_MAP, PAGE_KERNEL);
                                         ^
      mm/kmsan/kmsan_test.c:322:3: error: implicit declaration of function 'vunmap' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
                      vunmap(vbuf);
                      ^
      
      Link: https://lkml.kernel.org/r/20221215163046.4079767-1-arnd@kernel.org
      
      
      Fixes: 8ed691b0 ("kmsan: add tests for KMSAN")
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Reviewed-by: default avatarAlexander Potapenko <glider@google.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Marco Elver <elver@google.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2cec280c
    • Arnd Bergmann's avatar
      kmsan: export kmsan_handle_urb · dace33a1
      Arnd Bergmann authored
      commit 7ba594d7 upstream.
      
      USB support can be in a loadable module, and this causes a link failure
      with KMSAN:
      
      ERROR: modpost: "kmsan_handle_urb" [drivers/usb/core/usbcore.ko] undefined!
      
      Export the symbol so it can be used by this module.
      
      Link: https://lkml.kernel.org/r/20221215162710.3802378-1-arnd@kernel.org
      
      
      Fixes: 553a8018 ("kmsan: handle memory sent to/from USB")
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Reviewed-by: default avatarAlexander Potapenko <glider@google.com>
      Cc: Dmitry Vyukov <dvyukov@google.com>
      Cc: Marco Elver <elver@google.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      dace33a1
    • Mathieu Desnoyers's avatar
      mm/mempolicy: fix memory leak in set_mempolicy_home_node system call · 0ce4cc6d
      Mathieu Desnoyers authored
      commit 38ce7c9b upstream.
      
      When encountering any vma in the range with policy other than MPOL_BIND or
      MPOL_PREFERRED_MANY, an error is returned without issuing a mpol_put on
      the policy just allocated with mpol_dup().
      
      This allows arbitrary users to leak kernel memory.
      
      Link: https://lkml.kernel.org/r/20221215194621.202816-1-mathieu.desnoyers@efficios.com
      
      
      Fixes: c6018b4b ("mm/mempolicy: add set_mempolicy_home_node syscall")
      Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Reviewed-by: default avatarRandy Dunlap <rdunlap@infradead.org>
      Reviewed-by: default avatar"Huang, Ying" <ying.huang@intel.com>
      Reviewed-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
      Acked-by: default avatarMichal Hocko <mhocko@suse.com>
      Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
      Cc: Dave Hansen <dave.hansen@linux.intel.com>
      Cc: Feng Tang <feng.tang@intel.com>
      Cc: Michal Hocko <mhocko@kernel.org>
      Cc: Andrea Arcangeli <aarcange@redhat.com>
      Cc: Mel Gorman <mgorman@techsingularity.net>
      Cc: Mike Kravetz <mike.kravetz@oracle.com>
      Cc: Randy Dunlap <rdunlap@infradead.org>
      Cc: Vlastimil Babka <vbabka@suse.cz>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Dan Williams <dan.j.williams@intel.com>
      Cc: Huang Ying <ying.huang@intel.com>
      Cc: <stable@vger.kernel.org>	[5.17+]
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0ce4cc6d
    • Vlastimil Babka's avatar
      mm, mremap: fix mremap() expanding vma with addr inside vma · 4d528dab
      Vlastimil Babka authored
      commit 6f12be79 upstream.
      
      Since 6.1 we have noticed random rpm install failures that were tracked to
      mremap() returning -ENOMEM and to commit ca3d76b0 ("mm: add merging
      after mremap resize").
      
      The problem occurs when mremap() expands a VMA in place, but using an
      starting address that's not vma->vm_start, but somewhere in the middle.
      The extension_pgoff calculation introduced by the commit is wrong in that
      case, so vma_merge() fails due to pgoffs not being compatible.  Fix the
      calculation.
      
      By the way it seems that the situations, where rpm now expands a vma from
      the middle, were made possible also due to that commit, thanks to the
      improved vma merging.  Yet it should work just fine, except for the buggy
      calculation.
      
      Link: https://lkml.kernel.org/r/20221216163227.24648-1-vbabka@suse.cz
      
      
      Reported-by: default avatarJiri Slaby <jirislaby@kernel.org>
        Link: https://bugzilla.suse.com/show_bug.cgi?id=1206359
      
      
      Fixes: ca3d76b0 ("mm: add merging after mremap resize")
      Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
      Cc: Jakub Matěna <matenajakub@gmail.com>
      Cc: "Kirill A . Shutemov" <kirill@shutemov.name>
      Cc: Liam Howlett <liam.howlett@oracle.com>
      Cc: Matthew Wilcox <willy@infradead.org>
      Cc: Mel Gorman <mgorman@techsingularity.net>
      Cc: Michal Hocko <mhocko@kernel.org>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4d528dab
    • Mel Gorman's avatar
      rtmutex: Add acquire semantics for rtmutex lock acquisition slow path · 97e14ae0
      Mel Gorman authored
      
      commit 1c0908d8 upstream.
      
      Jan Kara reported the following bug triggering on 6.0.5-rt14 running dbench
      on XFS on arm64.
      
       kernel BUG at fs/inode.c:625!
       Internal error: Oops - BUG: 0 [#1] PREEMPT_RT SMP
       CPU: 11 PID: 6611 Comm: dbench Tainted: G            E   6.0.0-rt14-rt+ #1
       pc : clear_inode+0xa0/0xc0
       lr : clear_inode+0x38/0xc0
       Call trace:
        clear_inode+0xa0/0xc0
        evict+0x160/0x180
        iput+0x154/0x240
        do_unlinkat+0x184/0x300
        __arm64_sys_unlinkat+0x48/0xc0
        el0_svc_common.constprop.4+0xe4/0x2c0
        do_el0_svc+0xac/0x100
        el0_svc+0x78/0x200
        el0t_64_sync_handler+0x9c/0xc0
        el0t_64_sync+0x19c/0x1a0
      
      It also affects 6.1-rc7-rt5 and affects a preempt-rt fork of 5.14 so this
      is likely a bug that existed forever and only became visible when ARM
      support was added to preempt-rt. The same problem does not occur on x86-64
      and he also reported that converting sb->s_inode_wblist_lock to
      raw_spinlock_t makes the problem disappear indicating that the RT spinlock
      variant is the problem.
      
      Which in turn means that RT mutexes on ARM64 and any other weakly ordered
      architecture are affected by this independent of RT.
      
      Will Deacon observed:
      
        "I'd be more inclined to be suspicious of the slowpath tbh, as we need to
         make sure that we have acquire semantics on all paths where the lock can
         be taken. Looking at the rtmutex code, this really isn't obvious to me
         -- for example, try_to_take_rt_mutex() appears to be able to return via
         the 'takeit' label without acquire semantics and it looks like we might
         be relying on the caller's subsequent _unlock_ of the wait_lock for
         ordering, but that will give us release semantics which aren't correct."
      
      Sebastian Andrzej Siewior prototyped a fix that does work based on that
      comment but it was a little bit overkill and added some fences that should
      not be necessary.
      
      The lock owner is updated with an IRQ-safe raw spinlock held, but the
      spin_unlock does not provide acquire semantics which are needed when
      acquiring a mutex.
      
      Adds the necessary acquire semantics for lock owner updates in the slow path
      acquisition and the waiter bit logic.
      
      It successfully completed 10 iterations of the dbench workload while the
      vanilla kernel fails on the first iteration.
      
      [ bigeasy@linutronix.de: Initial prototype fix ]
      
      Fixes: 700318d1 ("locking/rtmutex: Use acquire/release semantics")
      Fixes: 23f78d4a ("[PATCH] pi-futex: rt mutex core")
      Reported-by: default avatarJan Kara <jack@suse.cz>
      Signed-off-by: default avatarMel Gorman <mgorman@techsingularity.net>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: stable@vger.kernel.org
      Link: https://lore.kernel.org/r/20221202100223.6mevpbl7i6x5udfd@techsingularity.net
      
      
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      97e14ae0
    • Mathieu Desnoyers's avatar
      futex: Fix futex_waitv() hrtimer debug object leak on kcalloc error · 09727bc3
      Mathieu Desnoyers authored
      
      commit 94cd8fa0 upstream.
      
      In a scenario where kcalloc() fails to allocate memory, the futex_waitv
      system call immediately returns -ENOMEM without invoking
      destroy_hrtimer_on_stack(). When CONFIG_DEBUG_OBJECTS_TIMERS=y, this
      results in leaking a timer debug object.
      
      Fixes: bf69bad3 ("futex: Implement sys_futex_waitv()")
      Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Reviewed-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
      Cc: stable@vger.kernel.org
      Cc: stable@vger.kernel.org # v5.16+
      Link: https://lore.kernel.org/r/20221214222008.200393-1-mathieu.desnoyers@efficios.com
      
      
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      09727bc3
    • Terry Junge's avatar
      HID: plantronics: Additional PIDs for double volume key presses quirk · c86c5cf6
      Terry Junge authored
      
      [ Upstream commit 3d57f36c ]
      
      I no longer work for Plantronics (aka Poly, aka HP) and do not have
      access to the headsets in order to test. However, as noted by Maxim,
      the other 32xx models that share the same base code set as the 3220
      would need the same quirk. This patch adds the PIDs for the rest of
      the Blackwire 32XX product family that require the quirk.
      
      Plantronics Blackwire 3210 Series (047f:c055)
      Plantronics Blackwire 3215 Series (047f:c057)
      Plantronics Blackwire 3225 Series (047f:c058)
      
      Quote from previous patch by Maxim Mikityanskiy
      Plantronics Blackwire 3220 Series (047f:c056) sends HID reports twice
      for each volume key press. This patch adds a quirk to hid-plantronics
      for this product ID, which will ignore the second volume key press if
      it happens within 5 ms from the last one that was handled.
      
      The patch was tested on the mentioned model only, it shouldn't affect
      other models, however, this quirk might be needed for them too.
      Auto-repeat (when a key is held pressed) is not affected, because the
      rate is about 3 times per second, which is far less frequent than once
      in 5 ms.
      End quote
      
      Signed-off-by: default avatarTerry Junge <linuxhid@cosmicgizmosystems.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c86c5cf6
    • José Expósito's avatar
      HID: multitouch: fix Asus ExpertBook P2 P2451FA trackpoint · 79f9b467
      José Expósito authored
      [ Upstream commit 4eab1c2f ]
      
      The HID descriptor of this device contains two mouse collections, one
      for mouse emulation and the other for the trackpoint.
      
      Both collections get merged and, because the first one defines X and Y,
      the movemenent events reported by the trackpoint collection are
      ignored.
      
      Set the MT_CLS_WIN_8_FORCE_MULTI_INPUT class for this device to be able
      to receive its reports.
      
      This fix is similar to/based on commit 40d5bb87 ("HID: multitouch:
      enable multi-input as a quirk for some devices").
      
      Link: https://gitlab.freedesktop.org/libinput/libinput/-/issues/825
      
      
      Reported-by: default avatarAkito <the@akito.ooo>
      Tested-by: default avatarAkito <the@akito.ooo>
      Signed-off-by: default avatarJosé Expósito <jose.exposito89@gmail.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      79f9b467
    • wuqiang's avatar
      kprobes: kretprobe events missing on 2-core KVM guest · d465fa2a
      wuqiang authored
      [ Upstream commit 3b7ddab8 ]
      
      Default value of maxactive is set as num_possible_cpus() for nonpreemptable
      systems. For a 2-core system, only 2 kretprobe instances would be allocated
      in default, then these 2 instances for execve kretprobe are very likely to
      be used up with a pipelined command.
      
      Here's the testcase: a shell script was added to crontab, and the content
      of the script is:
      
        #!/bin/sh
        do_something_magic `tr -dc a-z < /dev/urandom | head -c 10`
      
      cron will trigger a series of program executions (4 times every hour). Then
      events loss would be noticed normally after 3-4 hours of testings.
      
      The issue is caused by a burst of series of execve requests. The best number
      of kretprobe instances could be different case by case, and should be user's
      duty to determine, but num_possible_cpus() as the default value is inadequate
      especially for systems with small number of cpus.
      
      This patch enables the logic for preemption as default, thus increases the
      minimum of maxactive to 10 for nonpreemptable systems.
      
      Link: https://lore.kernel.org/all/20221110081502.492289-1-wuqiang.matt@bytedance.com/
      
      
      
      Signed-off-by: default avatarwuqiang <wuqiang.matt@bytedance.com>
      Reviewed-by: default avatarSolar Designer <solar@openwall.com>
      Acked-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
      Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d465fa2a
    • Dai Ngo's avatar
      NFSD: fix use-after-free in __nfs42_ssc_open() · 650b69b1
      Dai Ngo authored
      
      [ Upstream commit 75333d48 ]
      
      Problem caused by source's vfsmount being unmounted but remains
      on the delayed unmount list. This happens when nfs42_ssc_open()
      return errors.
      
      Fixed by removing nfsd4_interssc_connect(), leave the vfsmount
      for the laundromat to unmount when idle time expires.
      
      We don't need to call nfs_do_sb_deactive when nfs42_ssc_open
      return errors since the file was not opened so nfs_server->active
      was not incremented. Same as in nfsd4_copy, if we fail to
      launch nfsd4_do_async_copy thread then there's no need to
      call nfs_do_sb_deactive
      
      Reported-by: default avatarXingyuan Mo <hdthky0@gmail.com>
      Signed-off-by: default avatarDai Ngo <dai.ngo@oracle.com>
      Tested-by: default avatarXingyuan Mo <hdthky0@gmail.com>
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      650b69b1
    • Kees Cook's avatar
      rtc: msc313: Fix function prototype mismatch in msc313_rtc_probe() · ba50fee6
      Kees Cook authored
      
      [ Upstream commit 21b8a1dd ]
      
      With clang's kernel control flow integrity (kCFI, CONFIG_CFI_CLANG),
      indirect call targets are validated against the expected function
      pointer prototype to make sure the call target is valid to help mitigate
      ROP attacks. If they are not identical, there is a failure at run time,
      which manifests as either a kernel panic or thread getting killed.
      
      msc313_rtc_probe() was passing clk_disable_unprepare() directly, which
      did not have matching prototypes for devm_add_action_or_reset()'s
      callback argument. Refactor to use devm_clk_get_enabled() instead.
      
      This was found as a result of Clang's new -Wcast-function-type-strict
      flag, which is more sensitive than the simpler -Wcast-function-type,
      which only checks for type width mismatches.
      
      Reported-by: default avatarkernel test robot <lkp@intel.com>
      Link: https://lore.kernel.org/lkml/202211041527.HD8TLSE1-lkp@intel.com
      
      
      Suggested-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
      Cc: Daniel Palmer <daniel@thingy.jp>
      Cc: Romain Perier <romain.perier@gmail.com>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-rtc@vger.kernel.org
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Reviewed-by: default avatarDaniel Palmer <daniel@thingy.jp>
      Tested-by: default avatarDaniel Palmer <daniel@thingy.jp>
      Link: https://lore.kernel.org/r/20221202184525.gonna.423-kees@kernel.org
      
      
      Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ba50fee6
    • Nathan Lynch's avatar
      powerpc/rtas: avoid scheduling in rtas_os_term() · 482d990a
      Nathan Lynch authored
      
      [ Upstream commit 6c606e57 ]
      
      It's unsafe to use rtas_busy_delay() to handle a busy status from
      the ibm,os-term RTAS function in rtas_os_term():
      
      Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
      BUG: sleeping function called from invalid context at arch/powerpc/kernel/rtas.c:618
      in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 1, name: swapper/0
      preempt_count: 2, expected: 0
      CPU: 7 PID: 1 Comm: swapper/0 Tainted: G      D            6.0.0-rc5-02182-gf8553a572277-dirty #9
      Call Trace:
      [c000000007b8f000] [c000000001337110] dump_stack_lvl+0xb4/0x110 (unreliable)
      [c000000007b8f040] [c0000000002440e4] __might_resched+0x394/0x3c0
      [c000000007b8f0e0] [c00000000004f680] rtas_busy_delay+0x120/0x1b0
      [c000000007b8f100] [c000000000052d04] rtas_os_term+0xb8/0xf4
      [c000000007b8f180] [c0000000001150fc] pseries_panic+0x50/0x68
      [c000000007b8f1f0] [c000000000036354] ppc_panic_platform_handler+0x34/0x50
      [c000000007b8f210] [c0000000002303c4] notifier_call_chain+0xd4/0x1c0
      [c000000007b8f2b0] [c0000000002306cc] atomic_notifier_call_chain+0xac/0x1c0
      [c000000007b8f2f0] [c0000000001d62b8] panic+0x228/0x4d0
      [c000000007b8f390] [c0000000001e573c] do_exit+0x140c/0x1420
      [c000000007b8f480] [c0000000001e586c] make_task_dead+0xdc/0x200
      
      Use rtas_busy_delay_time() instead, which signals without side effects
      whether to attempt the ibm,os-term RTAS call again.
      
      Signed-off-by: default avatarNathan Lynch <nathanl@linux.ibm.com>
      Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
      Reviewed-by: default avatarAndrew Donnellan <ajd@linux.ibm.com>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://lore.kernel.org/r/20221118150751.469393-5-nathanl@linux.ibm.com
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      482d990a
    • Nathan Lynch's avatar
      powerpc/rtas: avoid device tree lookups in rtas_os_term() · 464d10e8
      Nathan Lynch authored
      
      [ Upstream commit ed2213bf ]
      
      rtas_os_term() is called during panic. Its behavior depends on a couple
      of conditions in the /rtas node of the device tree, the traversal of
      which entails locking and local IRQ state changes. If the kernel panics
      while devtree_lock is held, rtas_os_term() as currently written could
      hang.
      
      Instead of discovering the relevant characteristics at panic time,
      cache them in file-static variables at boot. Note the lookup for
      "ibm,extended-os-term" is converted to of_property_read_bool() since it
      is a boolean property, not an RTAS function token.
      
      Signed-off-by: default avatarNathan Lynch <nathanl@linux.ibm.com>
      Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
      Reviewed-by: default avatarAndrew Donnellan <ajd@linux.ibm.com>
      [mpe: Incorporate suggested change from Nick]
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://lore.kernel.org/r/20221118150751.469393-4-nathanl@linux.ibm.com
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      464d10e8
    • Ricardo Ribalda's avatar
      iommu/mediatek: Fix crash on isr after kexec() · 85cc8a18
      Ricardo Ribalda authored
      
      [ Upstream commit 00ef8885 ]
      
      If the system is rebooted via isr(), the IRQ handler might
      be triggered before the domain is initialized. Resulting on
      an invalid memory access error.
      
      Fix:
      [    0.500930] Unable to handle kernel read from unreadable memory at virtual address 0000000000000070
      [    0.501166] Call trace:
      [    0.501174]  report_iommu_fault+0x28/0xfc
      [    0.501180]  mtk_iommu_isr+0x10c/0x1c0
      
      Signed-off-by: default avatarRicardo Ribalda <ribalda@chromium.org>
      Reviewed-by: default avatarAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
      Reviewed-by: default avatarRobin Murphy <robin.murphy@arm.com>
      Link: https://lore.kernel.org/r/20221125-mtk-iommu-v2-0-e168dff7d43e@chromium.org
      
      
      [ joro: Fixed spelling in commit message ]
      Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      85cc8a18
    • Christophe Leroy's avatar
      objtool: Fix SEGFAULT · fcee8a2d
      Christophe Leroy authored
      
      [ Upstream commit efb11fdb ]
      
      find_insn() will return NULL in case of failure. Check insn in order
      to avoid a kernel Oops for NULL pointer dereference.
      
      Tested-by: default avatarNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
      Reviewed-by: default avatarNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
      Acked-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
      Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://lore.kernel.org/r/20221114175754.1131267-9-sv@linux.ibm.com
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      fcee8a2d
Loading