Changelog in Linux kernel 5.10.273

 
ALSA: caiaq: unregister the input device when probe fails [+ + +]
Author: Nguyen Ngoc Thang <[email protected]>
Date:   Sat Sep 26 00:07:17 2026 +0700

    ALSA: caiaq: unregister the input device when probe fails
    
    commit 0b7bd20f6379bc5e431fd74d866390f5b5b63f3c upstream.
    
    setup_card() registers the input device, whose name and phys point into
    struct snd_usb_caiaqdev, and then goes on to snd_card_register() and
    snd_usb_caiaq_control_init(). If either fails, snd_probe() calls
    snd_card_free(), which frees the device state but leaves the input
    device registered: card_free() only clears the pointer, and the input
    device is unregistered from snd_disconnect() alone. Reading its "uevent"
    attribute afterwards dereferences freed memory:
    
      BUG: KASAN: slab-use-after-free in string+0x4a9/0x4f0
      Read of size 1 at addr ffff8880208f5043 by task caiaq/4967
       add_uevent_var+0x183/0x3a0
       input_dev_uevent+0x162/0x900
       dev_uevent+0x2f1/0x870
       uevent_show+0x1ca/0x3a0
       ...
    
    Unregister the input device on the probe error path, as
    snd_disconnect() does. snd_usb_caiaq_input_disconnect() is a no-op when
    no input device was registered.
    
    Reproduced with a raw-gadget Audio Kontrol 1 and a temporary hack that
    makes snd_usb_caiaq_control_init() fail.
    
    Fixes: 28abd224db4a ("ALSA: caiaq: Handle probe errors properly")
    Cc: [email protected]
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=2a123f6269da57ffefaa
    Signed-off-by: Nguyen Ngoc Thang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ALSA: harmony: initialize locks before requesting IRQ [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Thu Sep 10 15:08:33 2026 -0400

    ALSA: harmony: initialize locks before requesting IRQ
    
    [ Upstream commit 33abb7491e89285a41565670945293dda841afc4 ]
    
    snd_harmony_create() registers the IRQ before initializing h->lock and
    h->mixer_lock. A pending interrupt can invoke the handler while these
    locks are uninitialized.
    
    Initialize both locks before requesting the IRQ so the handler always
    sees valid lock state.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Assisted-by: Codex:GPT-5
    Signed-off-by: Runyu Xiao <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: line6: reject oversized playback packets [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Fri Sep 18 16:40:14 2026 -0700

    ALSA: line6: reject oversized playback packets
    
    commit 61b0a5a114fa4552892da5c0ff2f42e63bf08c6b upstream.
    
    Each playback URB is handed a slice of out.buffer that is exactly
    LINE6_ISO_PACKETS * max_packet_size_out bytes, sized from the OUT
    endpoint, but the number of bytes written into that slice is never
    compared against it.
    
    submit_audio_out_urb() takes the frame count from prev_fsize, which
    audio_in_callback() derived from the *IN* endpoint's received packet
    length, and rescales it with the playback frame size; when prev_fsize is
    still zero it synthesizes a length from the sample rate instead.  On a
    device declaring a large IN wMaxPacketSize and a small OUT
    wMaxPacketSize, the resulting memcpy(), or the memset() when the
    playback stream is idle, runs past its slice and, as the reproducer
    below shows, beyond the allocation.
    
    usb_submit_urb() is not a backstop.  max_packet_size_out comes from
    usb_maxpacket(), which returns only the low 11 bits of wMaxPacketSize,
    while USB core validates a high-speed isochronous length against that
    base scaled by usb_endpoint_maxp_mult().  A length of up to three times
    the allocated slice is therefore accepted, and even a rejected URB is
    only rejected after the write.
    
    Reject a packet that does not fit the slice the driver allocated for it.
    Clamping it instead would silently shorten the capture-derived rate
    feedback and desynchronize the two streams.
    
      BUG: KASAN: slab-out-of-bounds in submit_audio_out_urb (sound/usb/line6/playback.c:229)
      Write of size 1024 at addr ffff888100bbd400 by task kworker/1:2/5002
      Workqueue: events line6_startup_work
      Call Trace:
       __asan_memcpy (mm/kasan/shadow.c:106)
       submit_audio_out_urb (sound/usb/line6/playback.c:229)
       line6_submit_audio_out_all_urbs (sound/usb/line6/playback.c:291)
       line6_stream_start (sound/usb/line6/pcm.c:194)
       line6_pcm_acquire (sound/usb/line6/pcm.c:337)
       line6_startup_work (sound/usb/line6/driver.c:728)
       process_one_work (kernel/workqueue.c:3396)
       worker_thread (kernel/workqueue.c:3479 kernel/workqueue.c:3560)
       kthread (kernel/kthread.c:436)
       ret_from_fork (arch/x86/kernel/process.c:158)
       ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
    
      The buggy address belongs to the object at ffff888100bbd400
       which belongs to the cache kmalloc-256 of size 256
      The buggy address is located 0 bytes inside of
       allocated 256-byte region [ffff888100bbd400, ffff888100bbd500)
    
    Cc: [email protected]
    Fixes: 7a0f55aeeb8f ("ALSA: line6: Support assymetrical in/out configurations")
    Reported-by: <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Xiang Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ALSA: parisc: Fix assignment in if condition [+ + +]
Author: Takashi Iwai <[email protected]>
Date:   Thu Sep 10 15:08:32 2026 -0400

    ALSA: parisc: Fix assignment in if condition
    
    [ Upstream commit 6ea9a2b84cc354ffd028195edb4e3d60d47f7bcb ]
    
    PARISC harmony driver code contains an assignment in if condition,
    which is a bad coding style that may confuse readers and occasionally
    lead to bugs.
    
    This patch is merely for coding-style fixes, no functional changes.
    
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Stable-dep-of: 33abb7491e89 ("ALSA: harmony: initialize locks before requesting IRQ")
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: pcxhr: initialize mutexes before requesting threaded IRQ [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Wed Sep 9 16:42:22 2026 -0400

    ALSA: pcxhr: initialize mutexes before requesting threaded IRQ
    
    [ Upstream commit 6c97817e20598e5473094e0e38d1f51f1cf4dfff ]
    
    pcxhr_probe() requests pcxhr_threaded_irq() before initializing
    mgr->lock, even though the threaded handler takes that mutex.
    
    Initialize the manager locks before request_threaded_irq() so an
    early interrupt cannot run against uninitialized mutex state during
    probe.
    
    Fixes: 9bef72bdb26e ("ALSA: pcxhr: Use nonatomic PCM ops")
    Cc: [email protected]
    Signed-off-by: Runyu Xiao <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: pcxhr: use __func__ to get funcion's name in an output message [+ + +]
Author: Jason Wang <[email protected]>
Date:   Wed Sep 9 16:42:21 2026 -0400

    ALSA: pcxhr: use __func__ to get funcion's name in an output message
    
    [ Upstream commit fac24b0f34c179c6ca863f5205fad42a676caf9a ]
    
    Prefer using '"%s...", __func__' to get current function's name in
    an output message.
    
    Signed-off-by: Jason Wang <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Stable-dep-of: 6c97817e2059 ("ALSA: pcxhr: initialize mutexes before requesting threaded IRQ")
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: seq: Clear variable event pointer on read [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Sat Jun 6 17:41:29 2026 -0700

    ALSA: seq: Clear variable event pointer on read
    
    commit 705dd6dcbc0ea87351c660c1a6443f85f1001c76 upstream.
    
    snd_seq_read() copies a queued variable-length event header to userspace
    before expanding the payload. Queued variable-length events use
    SNDRV_SEQ_EXT_CHAINED internally, and data.ext.ptr points at the first
    extension cell.
    
    The read side strips SNDRV_SEQ_EXT_* bits from data.ext.len before the
    copy, but it leaves data.ext.ptr untouched. A userspace sequencer client
    can therefore write a direct variable event to itself and read back the
    extension-cell kernel address from the returned header.
    
    Clear the temporary header pointer before copy_to_user(). The original
    queued event remains unchanged and is still passed to
    snd_seq_expand_var_event(), so payload expansion keeps using the
    internal chain.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Kyle Zeng <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Roman Demidov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ALSA: seq: Serialize compat port-info ioctls [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Mon Oct 5 20:30:26 2026 -0400

    ALSA: seq: Serialize compat port-info ioctls
    
    [ Upstream commit 95b2e0361c88753afa030c10698be0a1a5b67650 ]
    
    The native sequencer ioctl path serializes handler calls with
    client->ioctl_mutex, but the translated port-info compat path invokes the
    same handlers through snd_seq_kernel_client_ctl() without taking that
    mutex.
    
    This lets concurrent compat CREATE_PORT requests pass the port-count
    check before any request reaches the serialized insertion. The computed
    integer port index can then exceed the address field range and wrap to an
    existing index. Subsequent subscriber teardown can resolve the duplicate
    address to the wrong port and access a freed subscriber.
    
    Take ioctl_mutex while dispatching converted port-info requests, matching
    the native ioctl path. All translated port-info commands share this
    helper, so their accesses to the client port state are serialized as
    well.
    
    Fixes: b3defb791b26 ("ALSA: seq: Make ioctls race-free")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6-sol gpt-6-astra
    Signed-off-by: Kyle Zeng <[email protected]>
    Signed-off-by: Bruno Produit <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    [ sashal: Replaced scoped_guard() with explicit mutex_lock() and mutex_unlock() for GNU89 compatibility. ]
    Signed-off-by: Sasha Levin <[email protected]>

ALSA: ua101: reject mismatched capture/playback packet sizes [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Fri Sep 18 15:57:53 2026 -0700

    ALSA: ua101: reject mismatched capture/playback packet sizes
    
    commit 86f86e6fdedc33c5b8d38b9208b350f8accf57ee upstream.
    
    detect_usb_format() cross-checks bSubframeSize, bBitResolution and
    tSamFreq between the capture and playback interfaces, but never relates
    the two endpoints' wMaxPacketSize and bNrChannels.  Each playback URB
    gets a buffer of ua->playback.max_packet_bytes, while the number of
    bytes written into it is derived from the capture stream:
    capture_urb_complete() computes frames from the received capture packet
    and capture.frame_bytes, and start_usb_playback() and playback_work()
    multiply that by playback.frame_bytes.
    
    A device declaring a large capture wMaxPacketSize with few capture
    channels and a small playback wMaxPacketSize with many playback channels
    therefore memset()s and memcpy()s past the end of the playback buffer,
    in open() of the PCM node the driver registers during probe.
    usb_submit_urb() rejects the over-long iso_frame_desc[0].length with
    -EMSGSIZE, but only after the write.
    
    Reject such descriptors at probe time.  Genuine UA-101/UA-1000 hardware
    declares proportional packet sizes and is unaffected.
    
      BUG: KASAN: slab-out-of-bounds in start_usb_playback (sound/usb/misc/ua101.c:586)
      Write of size 2048 at addr ffff8881098f3c00 by task exploit/5021
      Call Trace:
       __asan_memset (mm/kasan/shadow.c:84)
       start_usb_playback (sound/usb/misc/ua101.c:586)
       playback_pcm_open (sound/usb/misc/ua101.c:679)
       snd_pcm_open_substream (sound/core/pcm_native.c:2829)
       snd_pcm_open (sound/core/pcm_native.c:2865 sound/core/pcm_native.c:2932)
       snd_pcm_playback_open (sound/core/pcm_native.c:2891)
       snd_open (sound/core/sound.c:166)
       chrdev_open (fs/char_dev.c:411)
       do_dentry_open (fs/open.c:996)
       vfs_open (fs/open.c:1101)
       path_openat (fs/namei.c:4837 fs/namei.c:5000)
       do_file_open (fs/namei.c:5029)
       do_sys_openat2 (fs/open.c:1417)
       __x64_sys_openat (fs/open.c:1423 fs/open.c:1439 fs/open.c:1434)
       do_syscall_64 (arch/x86/entry/syscall_64.c:61 arch/x86/entry/syscall_64.c:84)
       entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
    
      The buggy address belongs to the object at ffff8881098f3c00
       which belongs to the cache kmalloc-192 of size 192
      The buggy address is located 0 bytes inside of
       allocated 168-byte region [ffff8881098f3c00, ffff8881098f3ca8)
    
    Cc: [email protected]
    Fixes: 63978ab3e3e9 ("sound: add Edirol UA-101 support")
    Reported-by: <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Xiang Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Takashi Iwai <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
apparmor: fix out-of-bounds write when null terminating a label vec [+ + +]
Author: Hyunwoo Kim <[email protected]>
Date:   Fri Sep 4 07:09:42 2026 -0400

    apparmor: fix out-of-bounds write when null terminating a label vec
    
    [ Upstream commit 9f1e40193eef7f047e6b77cfb4b4cafdecd7a123 ]
    
    aa_vec_unique() null terminates at vec[n - dups] when VEC_FLAG_TERMINATE
    is passed. If the components are all distinct no duplicates are dropped,
    dups is 0 and the terminator goes to vec[n], so the caller has to provide
    room for n + 1 entries.
    
    aa_label_strn_parse() sets up its vector with vec_setup(profile, vec, len,
    gfp) and then calls aa_vec_unique(vec, len, VEC_FLAG_TERMINATE), but
    vec_setup() does not reserve the terminator entry. Up to LOCAL_VEC_ENTRIES
    it uses the local array of LOCAL_VEC_ENTRIES pointers, above that it
    allocates exactly len pointers. The terminator therefore lands one entry
    past the end of the local array when len is LOCAL_VEC_ENTRIES, and one
    entry past the end of the allocation when len is larger.
    
    len comes from the number of "//&" separated components in the label name
    and label_count_strn_entries() does not bound it. An unprivileged task
    reaches the parse by writing to /proc/self/attr/apparmor/current or through
    lsm_set_self_attr(2), both of which go through do_setattr(), and the name
    is parsed before the change_profile permission is checked.
    The query_label() path behind the securityfs .access file, which is
    mode 0666, performs no permission check at all. Every component has to
    resolve to a loaded profile, so a system with policy loaded is required.
    
    The other two VEC_FLAG_TERMINATE users work on a label vec that
    aa_label_alloc() has already sized with "+ 1 for null terminator entry on
    vec". Reserve the same entry in vec_setup() and DEFINE_VEC(). Passing
    len + 1 from the caller instead would move len == LOCAL_VEC_ENTRIES out of
    the local array and into kzalloc().
    
    Fixes: f1bd904175e8 ("apparmor: add the base fns() for domain labels")
    Cc: [email protected]
    Signed-off-by: Hyunwoo Kim <[email protected]>
    Signed-off-by: John Johansen <[email protected]>
    [ replaced unavailable kzalloc_objs() with equivalent kcalloc() allocation ]
    Signed-off-by: Sasha Levin <[email protected]>

 
arm64: dts: qcom: sdm845-db845c: Mark cont splash memory region as reserved [+ + +]
Author: Amit Pundir <[email protected]>
Date:   Wed Jul 26 18:57:19 2023 +0530

    arm64: dts: qcom: sdm845-db845c: Mark cont splash memory region as reserved
    
    [ Upstream commit 110e70fccce4f22b53986ae797d665ffb1950aa6 ]
    
    Adding a reserved memory region for the framebuffer memory
    (the splash memory region set up by the bootloader).
    
    It fixes a kernel panic (arm-smmu: Unhandled context fault
    at this particular memory region) reported on DB845c running
    v5.10.y.
    
    Cc: [email protected] # v5.10+
    Reviewed-by: Caleb Connolly <[email protected]>
    Signed-off-by: Amit Pundir <[email protected]>
    Acked-by: Krzysztof Kozlowski <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Bjorn Andersson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

arm64: errata: Add Cortex-A725 erratum 3821522 workaround [+ + +]
Author: Beata Michalska <[email protected]>
Date:   Tue Oct 6 13:54:36 2026 +0200

    arm64: errata: Add Cortex-A725 erratum 3821522 workaround
    
    [ Upstream commit 45f7304679875eb000d67e194090ee7abd05c89c ]
    
    Cortex-A725 erratum 3821522 affects the CNT_CYCLES event, which can
    incur a significant increment error when a CPU enters and subsequently
    exits WFE or WFI, and may no longer track the system counter
    frequency.
    
    The AMEVCNTR01_EL0 counter is used as the AMU constant counter for
    frequency invariance and CPPC FFH feedback counters. Wire the affected
    Cortex-A725 range into the shared broken AMU constant-counter capability
    so the affected counter is treated as unavailable by returning zero in
    the AMU counter paths. This prevents the broken counter from being used
    as a reference source.
    
    The erratum can also affect PMUv3 users of the CNT_CYCLES event,
    but this workaround intentionally does not change PMU event handling.
    Hiding or rejecting the PMU event from the erratum code would change
    the perf-visible PMU event interface, including raw event selection,
    and would need a separate PMU-specific approach rather than being
    folded into the AMU reference-counter workaround.
    
    Cc: [email protected]
    Signed-off-by: Beata Michalska <[email protected]>
    Reviewed-by: Vladimir Murzin <[email protected]>
    Signed-off-by: Will Deacon <[email protected]>
    [ Beata: Drop the changes to CPPC/FFH support as those are not available here. ]
    Signed-off-by: Beata Michalska <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

arm64: errata: Factor out broken AMU const counter cap [+ + +]
Author: Beata Michalska <[email protected]>
Date:   Tue Oct 6 13:54:35 2026 +0200

    arm64: errata: Factor out broken AMU const counter cap
    
    [ Upstream commit 573371caf7aea8582212da81dcead2c3f48fac4b ]
    
    Move the workaround from the erratum 2457168-specific cpucap to a generic
    broken AMU constant-counter one. This keeps the existing Cortex-A510
    handling unchanged while allowing other errata with similar AMU constant
    counter issue to share the capability bit and call sites.
    
    Signed-off-by: Beata Michalska <[email protected]>
    Reviewed-by: Vladimir Murzin <[email protected]>
    Signed-off-by: Will Deacon <[email protected]>
    
    Dropped changes related to CPPC/FFH as support for that is not available
    here. Additionally renamed define for WORKAROUND_2457168 to new one,
    WORKAROUND_BROKEN_AMU_CONSTCNT to reuse it as this kernel still relies
    on the cpucaps header file for the workaround/errata ids.
    
    [ Beata: Dropped changes related to CPPC/FFH as support for that is not available here. Additionally renamed define for WORKAROUND_2457168 to new one, WORKAROUND_BROKEN_AMU_CONSTCNT to reuse it as this kernel still relies on the cpucaps header file for the workaround/errata ids. ]
    Signed-off-by: Beata Michalska <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

arm64: mm: Fix the lockless page-table walk in show_pte() [+ + +]
Author: Karl Mehltretter <[email protected]>
Date:   Thu Sep 10 20:15:38 2026 -0400

    arm64: mm: Fix the lockless page-table walk in show_pte()
    
    [ Upstream commit a77644d009dece1104b6fcc6e322b0e4503db0d6 ]
    
    show_pte() walks page tables locklessly and can run with interrupts
    enabled. A concurrent teardown can free a table page while it is being
    walked. It can also clear a parent entry after show_pte() checked it; the
    regular pXd_offset() helpers then reread the cleared entry and can derive a
    bogus lower-level pointer and fault again.
    
    Use the lockless offset helpers with the saved parent entries, as
    gup_fast() does, and pass the saved PMD to pte_offset_map().
    
    For task page tables, arm64 selects MMU_GATHER_RCU_TABLE_FREE. Disable
    local interrupts around the walk to hold off RCU-deferred table frees and
    block the tlb_remove_table_sync_one() IPI until the walk is finished.
    
    Place the IRQ guard after the header print. This does not make the output a
    consistent snapshot, but prevents the task page-table walk from
    dereferencing a released table page or deriving a pointer from a different
    parent value.
    
    Fixes: 1d18c47c735e ("arm64: MMU fault handling and page table management")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Karl Mehltretter <[email protected]>
    Signed-off-by: Will Deacon <[email protected]>
    [ replaced guard(irqsave)() with explicit local_irq_save()/local_irq_restore() to avoid declaration-after-statement warnings. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ASoC: codecs: rt274: Fix format setting for 44100 rate [+ + +]
Author: Cezary Rojewski <[email protected]>
Date:   Fri Sep 18 13:17:45 2026 +0200

    ASoC: codecs: rt274: Fix format setting for 44100 rate
    
    [ Upstream commit 6eda8938a790f65bd24fcfaae7b40ad4613fb7a2 ]
    
    As per specification, Sample Base Rate (bit 14)
    shall be set to 1 for 44.1 kHz.
    
    Fixes: c7e79b2b2d2d ("ASoC: rt274: add rt274 codec driver")
    Signed-off-by: Amadeusz Sławiński <[email protected]>
    Signed-off-by: Cezary Rojewski <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: cs42l52: Fix the NG Type Switch bit [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:48 2026 +0900

    ASoC: cs42l52: Fix the NG Type Switch bit
    
    [ Upstream commit 8b08b98796d2da103f2432550c14a7c687e72080 ]
    
    The NG Type Switch enum selects between "Apply Specific" and "Apply
    All", which is the NGALL bit. The datasheet puts NGALL at bit 7 of the
    Noise Gate Control register. The enum uses bit 6, which is NG, the
    noise gate enable owned by the NG Enable Switch. cs42l52.h names it
    CS42L52_NG_ENABLE_SHIFT. cs42l56 has the same Noise Gate register and
    puts its NG All Switch at bit 7.
    
    So changing the noise gate type turns the noise gate on or off, and
    NGALL cannot be set.
    
    Use bit 7.
    
    Fixes: dfe0f98b8d2e ("ASoC: Add support for CS42L52 Codec")
    Link: https://statics.cirrus.com/pubs/proDatasheet/CS42L52_F2.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: cs42l56: Put the Limiter Cushion control on the limiter register [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:47 2026 +0900

    ASoC: cs42l56: Put the Limiter Cushion control on the limiter register
    
    [ Upstream commit 203436d2aeb7093290459e344e1912a418a6ebfd ]
    
    The Limiter Cushion control writes bits 4:2 of the ALC Thresholds
    register. Those bits are ALCMIN, which the ALC MIN control owns. The
    datasheet puts CUSH at bits 4:2 of the Limit Thresholds Control
    register, next to LMAX, which the Limiter MAX control already uses.
    
    So setting the limiter cushion changes the ALC minimum threshold, and
    the cushion itself cannot be set.
    
    Use CS42L56_LIM_THRESHOLD_CTL.
    
    Fixes: 272b5edd3b8f ("ASoC: Add support for CS42L56 CODEC")
    Link: https://statics.cirrus.com/pubs/proDatasheet/CS42L56_F2.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: max98371: Fix the Speaker DHT Min Volume bits [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:50 2026 +0900

    ASoC: max98371: Fix the Speaker DHT Min Volume bits
    
    [ Upstream commit f7934340c56a84fc1b246ebf6b2e806d775f3b54 ]
    
    Register 0x31 holds two 4-bit fields. The datasheet puts SPK_GAIN_MIN
    at bits 7:4 and DHT_VROT_PNT at bits 3:0. The Speaker DHT Min Volume
    and Speaker DHT Rotation Volume controls both use bits 3:0.
    
    So setting the minimum speaker gain changes the DHT rotation point, and
    SPK_GAIN_MIN cannot be set.
    
    Move Speaker DHT Min Volume to bits 7:4.
    
    Fixes: ca2cd6bc6663 ("ASoC: Add max98371 codec driver")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: nau8822: Fix the 128x oversampling switch bits [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:52 2026 +0900

    ASoC: nau8822: Fix the 128x oversampling switch bits
    
    [ Upstream commit 4db45fc1da3d62d0fa6e8f1e457ae92e8741ed07 ]
    
    The DAC and ADC 128x Oversampling Switches use bit 5 of R10 and R14.
    The NAU8822 datasheet register map puts DACOS and ADCOS at bit 3 of
    those registers.
    
    In R14, bit 5 is inside HPF[6:4], which the High Pass Cut Off control
    owns. So turning on ADC oversampling changes the high pass cut-off, and
    the oversampling bit cannot be set. In R10, bit 5 is reserved, so the
    DAC switch has no effect.
    
    Use bit 3 for both.
    
    Fixes: 1e3cb6c321be ("ASoC: nau8822: new codec driver")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: pcm3168a: Fix the DAC zero flag polarity bit [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:49 2026 +0900

    ASoC: pcm3168a: Fix the DAC zero flag polarity bit
    
    [ Upstream commit b26edc925c1cfa0184cd270ed81d4833db045ce0 ]
    
    The DAC Zero Flag Polarity enum uses PCM3168A_DAC_ATSPDA_SHIFT, which
    is bit 6 of register 70. That bit is ATSPDA, the attenuation speed,
    which the DAC Volume Rate Multiplier enum already owns. The datasheet
    puts ZREV, the zero flag polarity, at bit 0. The header defines
    PCM3168A_DAC_ZREV_SHIFT for it, but nothing uses it.
    
    So changing the zero flag polarity changes the attenuation speed, and
    ZREV cannot be set.
    
    Use PCM3168A_DAC_ZREV_SHIFT.
    
    Fixes: a9b17a638af5 ("ASoC: pcm3168a: Add driver for pcm3168a codec")
    Link: https://www.ti.com/lit/ds/symlink/pcm3168a.pdf
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Reviewed-by: Cezary Rojewski <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: samsung: i2s: enable op_clk in probe to balance runtime PM [+ + +]
Author: Marek Szyprowski <[email protected]>
Date:   Fri Oct 2 11:21:12 2026 +0200

    ASoC: samsung: i2s: enable op_clk in probe to balance runtime PM
    
    [ Upstream commit 7529254014764ae0b8c33d5c61a58f36c65b1a1c ]
    
    The probe function puts the device into the runtime PM active state with
    only the "iis" bus clock enabled, but it also sets priv->op_clk to the
    parent of the RCLK_SRC mux without enabling it. The runtime PM suspend
    callback disables both clocks, so the first runtime suspend after probe
    disables op_clk once more than it was enabled.
    
    On Exynos5250 Arndale both clocks resolve to the same EXYNOS_I2S_BUS gate,
    so this triggers the following warning during boot:
    
     WARNING: drivers/clk/clk.c:1270 at clk_core_disable+0xe4/0x23c, CPU#0: kworker/u8:3/45
     i2s_bus already disabled
     ...
     Workqueue: pm pm_runtime_work
     Call trace:
      ...
      clk_core_disable from clk_disable+0x28/0x34
      clk_disable from i2s_runtime_suspend+0x58/0x68 [snd_soc_i2s]
      i2s_runtime_suspend [snd_soc_i2s] from genpd_runtime_suspend+0xc4/0x298
      genpd_runtime_suspend from __rpm_callback+0x48/0x18c
      __rpm_callback from rpm_callback+0x4c/0x50
      rpm_callback from rpm_suspend+0xf4/0x718
      rpm_suspend from pm_runtime_work+0x9c/0xa0
      ...
    
    Fix this by enabling op_clk in probe right after getting it, so the clock
    state matches the runtime PM active state, and by disabling it in remove.
    
    Fixes: 48279c53fd1d ("ASoC: samsung: i2s: Prevent external abort on exynos5433 I2S1 access")
    Assisted-by: Claude Opus 5.5 <[email protected]>
    Signed-off-by: Marek Szyprowski <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: stm32: spdifrx: fix synchronization state check [+ + +]
Author: Avi Weiss <[email protected]>
Date:   Sun Oct 11 06:54:59 2026 +0300

    ASoC: stm32: spdifrx: fix synchronization state check
    
    [ Upstream commit 0936bbd35a247665c64886135835faa3c3f4f29f ]
    
    The interrupt handler uses a logical AND to check whether SPDIFRX
    was in the SYNC state before clearing errors. Since both SYNC (1)
    and ENABLE (3) are nonzero, this also treats ENABLE as SYNC (and
    any other non-zero value that might be added).
    
    The logical && basically just converts this to check for != 0.
    
    So errors occurring while SPDIFRX is enabled cause the driver
    to retry synch instead of disconnecting the PCM stream.
    
    Fix is to change the logical && to equality (==) and only retry
    when exactly in sync state.
    
    Fixes: 0c93c291321f2 ("ASoC: stm32: spdifrx: retry synchronization in sync state")
    Signed-off-by: Avi Weiss <[email protected]>
    Reviewed-by: Olivier Moysan <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: wm8903: Move the DRC QR threshold to the register that holds it [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Sun Sep 20 22:53:27 2026 +0900

    ASoC: wm8903: Move the DRC QR threshold to the register that holds it
    
    [ Upstream commit e31ae4aeb049983fe3be0cf1e12c8074811a7685 ]
    
    The DRC_THRESH_QR field is bits 7 and 6 of DRC_1, but the control sits on
    DRC_0. Its shift and max are right for the field, only the register is
    wrong.
    
    Those bits of DRC_0 belong to DRC_STARTUP_GAIN, which "DRC Startup
    Volume" claims as bits 10 to 6. So the two controls share bits 7 and 6.
    Writing either one moves the other, and the quick release threshold is
    never reached at all.
    
    The six fields of DRC_1 tile it exactly, so there is nowhere else the
    threshold could live. Point the control at DRC_1.
    
    Found by a sweep for two controls claiming the same bits of one
    register. No board with this codec was to hand, the register map is
    the driver's own wm8903.h.
    
    Fixes: f1c0a02f32f8 ("ALSA: ASoC: Add WM8903 CODEC driver")
    Signed-off-by: HyeongJun An <[email protected]>
    Assisted-by: Claude:claude-opus-5
    Reviewed-by: Charles Keepax <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ASoC: wm8978: Fix the 128x oversampling switch bits [+ + +]
Author: HyeongJun An <[email protected]>
Date:   Thu Oct 8 22:09:51 2026 +0900

    ASoC: wm8978: Fix the 128x oversampling switch bits
    
    [ Upstream commit d0567ca9a2faa33efbe5ae84ef7b86423a93bffd ]
    
    The DAC and ADC 128x Oversampling Switches use bit 5 of R10 and R14.
    Table 66 of the WM8978 datasheet puts DACOSR128 and ADCOSR128 at bit 3
    of those registers.
    
    In R14, bit 5 is inside HPFCUT[6:4], which the High Pass Cut Off
    control owns. So turning on ADC oversampling changes the high pass
    cut-off, and the oversampling bit cannot be set. In R10, bit 5 is
    reserved, so the DAC switch has no effect.
    
    Use bit 3 for both.
    
    Fixes: 823dba519122 ("ASoC: Fix broken bitfield definitions in WM8978")
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: HyeongJun An <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
audit: fix exe mark UAF in kill_rules() [+ + +]
Author: Jérémy Jean <[email protected]>
Date:   Tue Sep 22 20:27:35 2026 +0000

    audit: fix exe mark UAF in kill_rules()
    
    commit aa650d87a498844060eecb1d336f4d46f4d1b0b3 upstream.
    
    kill_rules() removes mixed AUDIT_DIR and AUDIT_EXE rules when an audit
    tree is pruned. It drops entry->rule.exe before removing the rule from
    the RCU-visible filter lists.
    
    After a rule has been installed with AUDIT_ADD_RULE, which requires
    CAP_AUDIT_CONTROL, removing the watched directory can race with another
    task that is still evaluating the rule. In that case, fsnotify can free
    the executable mark before the reader reaches audit_mark_compare(),
    causing a use-after-free.
    
    KASAN reports:
    
        BUG: KASAN: slab-use-after-free in audit_mark_compare+0x8d/0xa0
    
    Unlink the published rules from the RCU-visible lists and retain them
    on tree->rules for cleanup. If any rule has an executable mark, wait for
    a single RCU grace period before removing the marks and scheduling the
    entries for freeing. Otherwise, call_rcu() already provides the required
    deferred freeing without a synchronous wait.
    
    Cc: [email protected]
    Fixes: 34d99af52ad4 ("audit: implement audit by executable")
    Assisted-by: Codex:gpt-5
    Signed-off-by: Jérémy Jean <[email protected]>
    Reviewed-by: Ricardo Robaina <[email protected]>
    Tested-by: Ricardo Robaina <[email protected]>
    Reviewed-by: Bradley Morgan <[email protected]>
    Signed-off-by: Paul Moore <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
autofs: ignore notification errors from a replaced pipe [+ + +]
Author: Sung Byeongchan <[email protected]>
Date:   Thu Oct 8 02:35:42 2026 +0900

    autofs: ignore notification errors from a replaced pipe
    
    commit 65676cd4203c0e41a94caf54080a7f0a95434bda upstream.
    
    autofs_notify_daemon() takes a reference to the current notification
    pipe under wq_mutex, then drops the mutex before writing the request. The
    write can block while the daemon enters catatonic mode and installs a
    replacement pipe.
    
    If the old pipe's reader is then closed, the delayed write returns -EPIPE
    and the generic error path enters catatonic mode again. That transition
    acts on the current superblock state, closes the replacement pipe, and
    releases the new daemon generation's wait queues.
    
    Only enter catatonic mode when the pipe which failed is still the current
    pipe. Factor the already-locked transition so the identity check and state
    change are atomic with respect to another replacement.
    
    This was reproduced on v7.3-rc5-337-gff47652a4b66c in a local QEMU guest.
    An unprivileged UID 65534 lookup filled the old packet pipe before a
    normal CATATONIC/SETPIPEFD restart. On the unmodified kernel, the new pipe
    received HUP and both a pending victim lookup and a later lookup failed
    with ENOENT in two out of two fresh-mount runs.
    
    With this change, the new pipe remained active, received an intact
    304-byte request, and both victim lookups completed in two out of two
    runs. Normal lookup and restart-without-a-blocked-writer controls passed.
    No KASAN, oops, refcount, or lock diagnostic was observed. A source
    reproducer and complete local logs are available privately on request.
    
    The demonstrated impact is limited to denial of a shared autofs service
    during a legitimate daemon restart. No memory corruption, information leak,
    privilege escalation, or code execution primitive was observed.
    
    Fixes: 8d7b48e0bc5fa ("autofs4: add miscellaneous device for ioctls")
    Cc: [email protected]
    Signed-off-by: Sung Byeongchan <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Acked-by: Ian Kent <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Bluetooth: btintel: fix buffer over-read in btintel_hw_error() [+ + +]
Author: Chandrashekar Devegowda <[email protected]>
Date:   Tue Sep 22 12:10:20 2026 +0530

    Bluetooth: btintel: fix buffer over-read in btintel_hw_error()
    
    commit 40eb4b18ad167b63644c27fa67a7400ba050379a upstream.
    
    The "Exception info %s" print uses skb->data + 1, but the 12-byte
    payload is not guaranteed to be NUL-terminated and can be read past
    its end.
    
    Bound the print with "%.*s" and skb->len - 1.
    
    Fixes: 973bb97e5aee ("Bluetooth: btintel: Add generic function for handling hardware errors")
    Cc: [email protected]
    Signed-off-by: Chandrashekar Devegowda <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: btintel: validate DDC record lengths [+ + +]
Author: Sai Teja Aluvala <[email protected]>
Date:   Tue Sep 22 18:33:11 2026 +0530

    Bluetooth: btintel: validate DDC record lengths
    
    [ Upstream commit c9c15d4d8956df8c564f7c210e4dc5b9b820d97a ]
    
    Parse DDC record lengths in unsigned storage so 0xFF does not wrap.
    Reject records smaller than the mandatory three-byte header, records
    exceeding U8_MAX, and records exceeding remaining firmware bytes before
    issuing Intel_Write_DDC.
    
    This issue was reported by Claude Mythos.
    
    Fixes: 145f2368c5fd ("Bluetooth: btintel: Add Device Configuration support")
    Signed-off-by: Sai Teja Aluvala <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: btqcomsmd: Convert to platform remove callback returning void [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Wed Sep 16 15:43:36 2026 -0400

    Bluetooth: btqcomsmd: Convert to platform remove callback returning void
    
    [ Upstream commit 4a62832f565c950d645a4f7b199a0a7985815940 ]
    
    The .remove() callback for a platform driver returns an int which makes
    many driver authors wrongly assume it's possible to do error handling by
    returning an error code. However the value returned is ignored (apart
    from emitting a warning) and this typically results in resource leaks.
    
    To improve here there is a quest to make the remove callback return
    void. In the first step of this quest all drivers are converted to
    .remove_new(), which already returns void. Eventually after all drivers
    are converted, .remove_new() will be renamed to .remove().
    
    Trivially convert this driver from always returning zero in the remove
    callback to the void returning variant.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Stable-dep-of: f5a427b16e45 ("Bluetooth: btqcomsmd: destroy RPMsg endpoints before freeing hci_dev")
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: btqcomsmd: destroy RPMsg endpoints before freeing hci_dev [+ + +]
Author: Xu Rao <[email protected]>
Date:   Wed Sep 16 15:43:37 2026 -0400

    Bluetooth: btqcomsmd: destroy RPMsg endpoints before freeing hci_dev
    
    [ Upstream commit f5a427b16e45210dee656b0860728f3d496dee85 ]
    
    The command and ACL RPMsg endpoints store struct btqcomsmd as their
    callback private data. The receive callbacks dereference btq->hdev
    without taking an hci_dev reference.
    
    The current teardown order frees the hci_dev before destroying the RPMsg
    endpoints in both the hci_register_dev() error path and the driver remove
    path. If WCNSS delivers data in that window, the endpoint callback can
    run with an already freed hci_dev and pass it to the Bluetooth core.
    
    For qcom_smd endpoints, rpmsg_destroy_ept() closes the channel and clears
    the callback under the channel recv_lock. The receive path holds the same
    lock while invoking the callback, so destroying the endpoints first both
    prevents new callbacks and serializes with any callback already running.
    
    Destroy the command and ACL endpoints before hci_free_dev(). Keep
    hci_unregister_dev() first during remove so the HCI core stops issuing
    operations before the transport endpoints are shut down. In the full
    registration-error cleanup path, return directly after freeing the hci_dev
    to avoid falling through to the partial-construction labels and destroying
    the endpoints twice.
    
    Fixes: 5052de8deff5 ("soc: qcom: smd: Transition client drivers from smd to rpmsg")
    Fixes: 9a39a927be01 ("Bluetooth: btqcomsmd: Fix a resource leak in error handling paths in the probe function")
    Cc: [email protected]
    Acked-by: Bartosz Golaszewski <[email protected]>
    Reviewed-by: Dmitry Baryshkov <[email protected]>
    Signed-off-by: Xu Rao <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: btusb: Add IMC Networks QCA9377 to quirks table [+ + +]
Author: Tibor Harcsa <[email protected]>
Date:   Mon Jun 29 22:34:20 2026 +0200

    Bluetooth: btusb: Add IMC Networks QCA9377 to quirks table
    
    [ Upstream commit dc16388d45ecbd3be0d8c9424dbbaa2c81806578 ]
    
    Add the USB ID (13d3:3503) for the IMC Networks Qualcomm Atheros
    QCA9377 Bluetooth controller to the btusb quirks table. This device
    requires Qualcomm Rome firmware and wideband speech support to function
    properly; otherwise, BLE scanning fails with HCI unexpected event
    opcode 0x2005 errors.
    
    The device reports the following in /sys/kernel/debug/usb/devices:
    
    P:  Vendor=13d3 ProdID=3503 Rev= 0.01
    C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
    I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=81(I) Atr=03(Int.) MxPS=  16 Ivl=1ms
    E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
    E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
    I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=   0 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=   0 Ivl=1ms
    I:  If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=   9 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=   9 Ivl=1ms
    I:  If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=  17 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=  17 Ivl=1ms
    I:  If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=  25 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=  25 Ivl=1ms
    I:  If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=  33 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=  33 Ivl=1ms
    I:  If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
    E:  Ad=83(I) Atr=01(Isoc) MxPS=  49 Ivl=1ms
    E:  Ad=03(O) Atr=01(Isoc) MxPS=  49 Ivl=1ms
    
    Signed-off-by: Tibor Harcsa <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: hci_core: Fix inquiry cache timestamps on 64-bit systems [+ + +]
Author: Linmao Li <[email protected]>
Date:   Tue Sep 22 10:01:41 2026 +0800

    Bluetooth: hci_core: Fix inquiry cache timestamps on 64-bit systems
    
    commit 74847177eca5638827ab74cdf77f0b10fc40ca6c upstream.
    
    On 64-bit systems, outgoing BR/EDR connections always fall back to page
    scan repetition mode R2 with no clock offset once the system has been
    up for more than five minutes, even when inquiry found the peer only
    seconds earlier. This lengthens paging and can increase the risk of a
    Page Timeout.
    
    The inquiry cache stores jiffies in __u32 timestamps, but its age
    helpers subtract them from unsigned long jiffies. INITIAL_JIFFIES casts
    -300 * HZ through unsigned int, so jiffies crosses 2^32 five minutes
    after boot on 64-bit systems. Assigning it to __u32 then drops the upper
    32 bits. In one trace, a 7.6-second-old entry (HZ=1000) was reported as
    2^32 + 7620 ticks old and rejected by hci_acl_create_conn_sync().
    hci_inquiry() is affected by the same truncation when checking the whole
    cache. 32-bit systems are unaffected because unsigned long is 32 bits
    wide there.
    
    Use unsigned long for both timestamps so they have the same width as
    jiffies on 32-bit and 64-bit systems, and update the debugfs format
    specifier accordingly.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Signed-off-by: Linmao Li <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: hci_core: free the HCI ID if naming fails [+ + +]
Author: Sang-Hoon Choi <[email protected]>
Date:   Tue Sep 22 03:49:28 2026 +0900

    Bluetooth: hci_core: free the HCI ID if naming fails
    
    [ Upstream commit d1ac915fb4184faad1b62148be50f317de7c24b5 ]
    
    hci_register_dev() allocates an ID before calling dev_set_name().
    If naming fails, it returns without releasing that ID. The device has
    not been registered and hdev->id has not been assigned, so the normal
    unregister path cannot release it.
    
    Free the allocated ID before returning the naming error.
    
    Fixes: dcda165706b9 ("Bluetooth: hci_core: Fix build warnings")
    Reported-by: Changyul Lee <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Sang-Hoon Choi <[email protected]>
    Reported-by: Changyul Lee <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: hci_core: Serialize ACL scheduling with channel deletion [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Sun Sep 27 01:04:02 2026 +0800

    Bluetooth: hci_core: Serialize ACL scheduling with channel deletion
    
    commit f4845ab191a4f686a5da481fbba90ed73bb693b0 upstream.
    
    hci_chan_sent() selects a channel under RCU but drops the read lock before
    accessing chan->conn and returning the channel. The ACL and LE schedulers
    then use its packet queue and update its transmit counters without any
    protection against channel deletion.
    
    After TX selects a channel and releases RCU, a disconnect command timeout
    on the separate request workqueue can run hci_conn_failed() and
    l2cap_conn_del(). hci_chan_del() can then unlink the channel, complete
    synchronize_rcu(), purge its queue and free it before TX resumes. This
    causes use-after-free both in hci_chan_sent() and in its callers.
    
    KASAN reported:
    
      BUG: KASAN: slab-use-after-free in hci_chan_sent+0x892/0x9b0
      Workqueue: hci0 hci_tx_work
      Call Trace:
       hci_chan_sent+0x892/0x9b0
       hci_tx_work+0x5e6/0xb70
      Allocated by task 91:
       hci_chan_create+0xe3/0x350
       l2cap_conn_add.part.0+0x12/0xa30
       l2cap_chan_connect+0x110d/0x1b60
       l2cap_sock_connect+0x310/0x530
      Freed by task 99:
       hci_chan_del+0x11f/0x170
       l2cap_conn_del+0x4f1/0x800
       l2cap_connect_cfm+0x88c/0xd30
       hci_conn_failed+0x150/0x250
       hci_abort_conn_sync+0x3e3/0x800
       hci_cmd_sync_run+0x7e/0xc0
       hci_abort_conn+0x105/0x1f0
       disconnect_sync+0x157/0x290
       hci_cmd_sync_work+0x13c/0x290
    
    Hold the existing device mutex across channel selection and transmission
    in both schedulers to serialize them with channel teardown. Keep timeout
    handling outside the critical sections because hci_link_tx_to() acquires
    the same mutex. This also permits the transmit path to sleep, unlike
    extending the RCU read-side critical section across packet submission.
    
    Fixes: 3eff45eaf817 ("Bluetooth: convert tx_task to workqueue")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Chengfeng Ye <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: hci_sock: Serialize dead-device detachment [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Mon Oct 5 00:24:42 2026 +0800

    Bluetooth: hci_sock: Serialize dead-device detachment
    
    commit 381a0925c556a8d91a80a9b9e3e86651d60ffee3 upstream.
    
    Rebinding an HCI socket after its controller is unregistered can race
    monitor control replay and crash the kernel. hci_sock_bind() clears
    hci_pi(sk)->hdev and drops the device reference under only the socket
    lock, whereas send_monitor_control_replay() holds hci_sk_list.lock for
    reading.
    
    Replay can observe a non-NULL hdev, then bind can clear it and drop the
    last reference before create_monitor_ctrl_open() reads hdev->id. This
    can cause a NULL pointer dereference if the pointer is reloaded, or a
    use-after-free if the old pointer is retained.
    
    The kernel reported:
    
      KASAN: null-ptr-deref in range [0x0000000000000068-0x000000000000006f]
      RIP: 0010:create_monitor_ctrl_open+0x579/0x800
      Call Trace:
       hci_sock_bind+0xd96/0x1190
       __sys_bind+0x166/0x200
       __x64_sys_bind+0x6d/0xb0
       do_syscall_64+0xdd/0x4a0
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
    
    The same missing serialization lets hci_send_to_sock() select a socket
    for the old device and queue its frame after bind has detached the socket
    or installed a new binding.
    
    Take hci_sk_list.lock for writing when clearing the device pointer and
    resetting the socket state. This waits for existing replay and delivery
    readers to finish before detachment and prevents later readers from
    using the old binding. Keep hci_dev_put() outside the critical section
    because the final device release can sleep.
    
    Fixes: e04480920d1e ("Bluetooth: defer cleanup of resources in hci_unregister_dev()")
    Cc: [email protected]
    Assisted-by: GPT-6 Astra
    Signed-off-by: Chengfeng Ye <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: L2CAP: access chan->conn safely in get/setsockopt [+ + +]
Author: Pauli Virtanen <[email protected]>
Date:   Tue Oct 27 10:02:39 2026 +0000

    Bluetooth: L2CAP: access chan->conn safely in get/setsockopt
    
    [ Upstream commit ca2c4c26498643f421d35ffe258fafbd3ed461c3 ]
    
    Since commit b66774b48dd9 ("Bluetooth: L2CAP: Fix UAF in channel timeout by holding conn ref")
    l2cap_chan::conn has held reference and remains non-NULL also after the
    corresponding hci_conn is deleted.  In this state accessing various
    fields eg. hci_conn::hdev is invalid, which leads to KASAN crash in
    l2cap_sock_setsockopt() access of conn->hcon->hdev.
    
    Check l2cap_chan::conn.hcon corresponds to an alive hci_conn before
    trying to use it in l2cap_sock.c.  Hold l2cap_chan_lock() in
    getsockopt/setsockopt to ensure it stays alive, and to avoid data races
    in l2cap_chan fields.
    
    Fixes: b66774b48dd9 ("Bluetooth: L2CAP: Fix UAF in channel timeout by holding conn ref")
    Reported-by: [email protected]
    Link: https://syzkaller.appspot.com/bug?extid=b106284c2a0b7bc80cf9
    Signed-off-by: Pauli Virtanen <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    [Lee: Omit sockopt_t conversion from commit bf01627cc04b ("Bluetooth: L2CAP: convert to getsockopt_iter")]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: L2CAP: refuse __l2cap_chan_add if chan already has conn [+ + +]
Author: Pauli Virtanen <[email protected]>
Date:   Tue Oct 27 10:02:40 2026 +0000

    Bluetooth: L2CAP: refuse __l2cap_chan_add if chan already has conn
    
    [ Upstream commit 86b55991d3cd690e73c5ef8d20b75ae4905b357a ]
    
    l2cap_chan may be linked to l2cap_conn at most once. This is assumed in
    several places, eg l2cap_chan_del cleanup.
    
    There is a TOCTOU race where the invariant is violated:
    
        [Task 1]                          [Task 2]
        l2cap_chan_connect                l2cap_sock_bind
          l2cap_chan_lock                   lock_sock
          l2cap_state_change                if (sk->sk_state != BT_OPEN)
            chan->state = BT_CONNECT
            l2cap_sock_state_change_cb      chan->state = BT_BOUND
                                            sk->sk_state = BT_BOUND
              lock_sock <------------------ release_sock
              sk->sk_state = BT_CONNECT
    
    l2cap_sock_connect() does not check sk->sk_state, so since chan->state
    is now BT_BOUND, subsequent connect() ends up with second
    __l2cap_chan_add.
    
    Explicitly document and check the invariant in __l2cap_chan_add with
    WARN_ON_ONCE. The only callsite where it could be hit is
    l2cap_chan_connect, so add pre-check there to avoid relying on
    chan->state. chan->state read/write is not properly guarded currently so
    there can be other TOCTOUC problems.
    
    Add l2cap_lock_chan in l2cap_sock_bind() to guard chan->state write.
    
    Fixes: b66774b48dd9 ("Bluetooth: L2CAP: Fix UAF in channel timeout by holding conn ref")
    Assisted-by: deepseek-4-flash # finding the race condition
    Signed-off-by: Pauli Virtanen <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    [Lee: Resolve context conflict around mutex_lock(&conn->chan_lock) prior to commit 56c2b5831d39 ("Bluetooth: L2CAP: fix out-of-bounds write in l2cap_ecred_connect")]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: mgmt: fix race in read_unconf_index_list() [+ + +]
Author: Aldo Ariel Panzardo <[email protected]>
Date:   Wed Sep 30 19:14:03 2026 -0400

    Bluetooth: mgmt: fix race in read_unconf_index_list()
    
    [ Upstream commit b5dbb41b212c50c095a4dbee3017a84fe94f033b ]
    
    read_unconf_index_list() counts unconfigured controllers before allocating
    its response, then checks the device flags again while filling it.
    
    hci_dev_list_lock stabilizes list membership, but it does not serialize the
    per-device flags. During asynchronous controller setup, the worker can set
    HCI_UNCONFIGURED and clear HCI_SETUP between the two passes. A controller
    omitted from the allocation count can then become eligible for the fill
    pass, causing an out-of-bounds write to rp->index[].
    
    Allocate space for every device on hci_dev_list. Since list membership
    cannot change while hci_dev_list_lock is held, the response remains large
    enough regardless of flag transitions. The reported count and response
    length still include only eligible unconfigured controllers.
    
    Fixes: 73d1df2a7a10 ("Bluetooth: Add support for Read Unconfigured Index List command")
    Cc: [email protected]
    Signed-off-by: Aldo Ariel Panzardo <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    [ replaced unavailable list_count_nodes() with an unconditional device-counting loop. ]
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: RFCOMM: connect the session socket without rfcomm_mutex [+ + +]
Author: Mikhail Gavrilov <[email protected]>
Date:   Tue Oct 13 14:13:15 2026 -0400

    Bluetooth: RFCOMM: connect the session socket without rfcomm_mutex
    
    [ Upstream commit ac022970e9fb0a5f7e7d1f6c8e104c1ed924dd1c ]
    
    An RFCOMM connect() issued while a BR/EDR link is being authenticated
    makes lockdep report a circular dependency, and the reported cycle is a
    real AB/BA between rfcomm_mutex and hdev->lock.
    
    rfcomm_security_cfm() is called from the HCI event path, which already
    holds hdev->lock:
    
      hci_rx_work()
        hci_event_packet()
          hci_cc_read_enc_key_size()   [hdev->lock]
            hci_encrypt_cfm()          [hci_cb_list_lock]
              rfcomm_security_cfm()    [rfcomm_mutex]
    
    while an RFCOMM connect() from userspace takes the same two locks the
    other way round:
    
      rfcomm_sock_connect()
        rfcomm_dlc_open()              [rfcomm_mutex]
          __rfcomm_dlc_open()
            rfcomm_session_create()
              kernel_connect()
                l2cap_sock_connect()
                  l2cap_chan_connect() [hdev->lock]
    
      WARNING: possible circular locking dependency detected
      kworker/u131:1/1128 is trying to acquire lock:
      rfcomm_mutex, at: rfcomm_security_cfm+0x31/0x3e0 [rfcomm]
      but task is already holding lock:
      hci_cb_list_lock, at: hci_cc_read_enc_key_size+0x1d2/0xcc0
      Chain exists of:
        rfcomm_mutex --> &hdev->lock --> hci_cb_list_lock
    
    hci_auth_complete_evt() and hci_encrypt_change_evt() reach the callback
    the same way.
    
    Both orders have to be seen in the same boot, which is why a BR/EDR
    connection alone is not enough to show it: a session set up by the
    remote side is created by rfcomm_accept_connection() in krfcommd, which
    calls kernel_accept() and never takes hdev->lock under rfcomm_mutex.
    Connecting a device that authenticates and encrypts the link and then
    calling connect() on an RFCOMM socket towards any address - the connect
    does not have to succeed, the order is recorded before the page timeout
    - reports it every time.
    
    Only the session socket has to be connected with the lock held, and it
    does not: nothing else can see the socket before it is put on the
    session list.  So connect it first and take rfcomm_mutex afterwards,
    which removes the rfcomm_mutex -> hdev->lock order for good, rather
    than keeping the HCI event path out of rfcomm_mutex.
    
    rfcomm_session_create() becomes rfcomm_session_connect(), which returns
    the connected socket without touching the session list, and
    rfcomm_dlc_open() adds the session once it holds the lock again.  If
    another opener added a session for the same pair while this socket was
    connecting, that session is used and this socket is dropped.
    __rfcomm_dlc_open() now takes the session it should use, and its state
    check runs after the lock is re-acquired, so a DLC that was opened or
    closed in the meantime is still handled.
    
    Over an existing ACL link the connection can complete before the
    session reaches the list, and the wakeup from the socket callback is
    then lost, so krfcommd is woken once the session is visible.
    
    Connecting without the lock opens a window in which the socket can be
    closed.  The DLC is not on a session yet, so rfcomm_dlc_close() finds
    nothing to do and returns without touching it, and rfcomm_dlc_open()
    would then attach a DLC whose owner is gone.  rfcomm_dlc_close() now
    marks such a DLC with RFCOMM_CLOSED, and rfcomm_dlc_open() checks the
    mark once it holds rfcomm_mutex again and drops the socket instead of
    attaching the DLC.  The mark is cleared when an open starts, so a DLC
    that is reused is not affected.  This covers both callers of
    rfcomm_dlc_open(), the socket and the tty layer.
    
    Fixes: 759c185d0bbd ("Bluetooth: RFCOMM: serialize security confirmation handling")
    Suggested-by: Pauli Virtanen <[email protected]>
    Reported-by: Pauli Virtanen <[email protected]>
    Closes: https://lore.kernel.org/linux-bluetooth/[email protected]/
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/linux-bluetooth/[email protected]/
    Reported-by: Jiaming Zhang <[email protected]>
    Closes: https://lore.kernel.org/all/CANypQFabseTuRiyz2pGkc_Qj0moGDnY7KEp1qdTOqkw6gAL3hw@mail.gmail.com/
    Cc: [email protected]
    Signed-off-by: Mikhail Gavrilov <[email protected]>
    Tested-by: [email protected]
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    [ sashal: adjusted kernel_connect() context for the existing struct sockaddr cast instead of struct sockaddr_unsized ]
    Signed-off-by: Sasha Levin <[email protected]>

Bluetooth: RFCOMM: Fix initial port reference race [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Sun Sep 27 01:27:23 2026 +0800

    Bluetooth: RFCOMM: Fix initial port reference race
    
    commit 2d696c1ed3468dcb62578a3911e687110d463520 upstream.
    
    For RFCOMM_RELEASE_ONHUP devices, rfcomm_tty_install() and
    __rfcomm_release_dev() both use RFCOMM_TTY_OWNED to decide who drops the
    initial tty_port reference. The release path tests the bit separately
    from the install path setting it, so both can drop that reference.
    
    The synchronous hangup does not prevent this race: port->tty is not
    assigned until tty_port_open(), after installation. The following
    interleaving is possible:
    
      1. Install and release each obtain a reference with rfcomm_dev_get().
      2. Release observes RFCOMM_TTY_OWNED clear.
      3. Install sets RFCOMM_TTY_OWNED and drops the initial reference.
      4. Release drops the same initial reference again.
      5. TTY cleanup drops its reference and frees the device.
      6. Release performs its final tty_port_put() on the freed port.
    
    KASAN reported:
    
      BUG: KASAN: slab-use-after-free in tty_port_put+0x22/0x190
      Write of size 4 at addr ffff8881001d3d5c by task poc/92
    
      Call Trace:
       tty_port_put+0x22/0x190
       rfcomm_dev_ioctl+0x1d4/0x1930
       sock_do_ioctl+0x110/0x260
       sock_ioctl+0x380/0x590
       __x64_sys_ioctl+0x134/0x1c0
    
      Allocated by task 88:
       rfcomm_dev_ioctl+0x8f6/0x1930
       sock_do_ioctl+0x110/0x260
       sock_ioctl+0x380/0x590
       __x64_sys_ioctl+0x134/0x1c0
    
      Freed by task 65:
       kfree+0x131/0x3c0
       rfcomm_dev_destruct+0x23b/0x2f0
       release_one_tty+0xc1/0x370
       process_one_work+0x661/0x1090
    
    Use test_and_set_bit() in both paths so that only the caller that changes
    RFCOMM_TTY_OWNED from clear to set drops the initial reference. Each path
    keeps its own lookup reference until release or TTY cleanup, preserving
    the existing callback ordering and error handling.
    
    Fixes: 80ea73378af4 ("Bluetooth: Fix unreleased rfcomm_dev reference")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Chengfeng Ye <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: RFCOMM: Fix NULL tty_dev dereference in rfcomm_dev_shutdown [+ + +]
Author: Palla Raghunath <[email protected]>
Date:   Fri Oct 2 08:07:52 2026 +0100

    Bluetooth: RFCOMM: Fix NULL tty_dev dereference in rfcomm_dev_shutdown
    
    commit 08e90633377f1b2567ab5ad6810b74c552246a07 upstream.
    
    syzbot hit a NULL pointer dereference in rfcomm_dev_shutdown() when an
    RFCOMM tty is closed.
    
    rfcomm_dev_add() puts the new device on rfcomm_dev_list first and only
    then registers the tty device and saves it in dev->tty_dev. If that
    registration fails, dev->tty_dev is never set at all. The device can be
    looked up in the meantime, so an open() of /dev/rfcommN gets through
    rfcomm_tty_install() and attaches to it. When that tty is closed again,
    rfcomm_dev_shutdown() uses dev->tty_dev without checking it:
    
      Oops: general protection fault, probably for non-canonical address
      KASAN: null-ptr-deref in range [0x0000000000000040-0x0000000000000047]
      RIP: 0010:rfcomm_dev_shutdown+0x48/0xb0 net/bluetooth/rfcomm/tty.c:131
      Call Trace:
       tty_port_shutdown+0x1bf/0x220 drivers/tty/tty_port.c:372
       tty_port_close+0x4e/0x150 drivers/tty/tty_port.c:705
       tty_release+0x359/0x1670 drivers/tty/tty_io.c:1718
       __fput+0x418/0xa50 fs/file_table.c:512
    
    rfcomm_dev_destruct() already copes with a NULL dev->tty_dev. Add the
    same check to rfcomm_dev_shutdown(), so the tty device is only moved
    when it was actually registered.
    
    Fixes: cad348a17e17 ("Bluetooth: Implement .activate, .shutdown and .carrier_raised methods")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=4a807caf7680652d53b6
    Cc: [email protected]
    Signed-off-by: Palla Raghunath <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Bluetooth: RFCOMM: free the skb when the DLC has no owner [+ + +]
Author: Maxim Skokov <[email protected]>
Date:   Tue Sep 15 10:00:46 2026 +0300

    Bluetooth: RFCOMM: free the skb when the DLC has no owner
    
    commit 9d1afbf60ed53c5b051cd124153e0ae3078c8b93 upstream.
    
    rfcomm_recv_data() hands the skb to d->data_ready() and returns 0
    without freeing it, so the callback owns the skb from that point on.
    The tty implementation frees it when the DLC has been detached from its
    device:
    
      static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc,
                                        struct sk_buff *skb)
      {
              struct rfcomm_dev *dev = dlc->owner;
    
              if (!dev) {
                      kfree_skb(skb);
                      return;
              }
    
    The socket implementation returns without freeing it, and the skb is
    leaked.
    
    A connected DLC can have no owner: rfcomm_sock_destruct() clears
    d->owner, while the DLC itself stays on the session until it is closed.
    Data frames that arrive in that window still find d->state ==
    BT_CONNECTED in rfcomm_recv_data() and are handed to the callback, one
    leaked skb each.
    
    The leak does not stop on its own either.  The remote runs out of
    credits only once RFCOMM_RX_THROTTLED is set, and for a socket the only
    place that sets it is rfcomm_sk_data_ready() itself, below the return.
    rfcomm_process_dlcs() keeps granting credits, so the remote keeps
    sending and the leak keeps growing.
    
    Free the skb, as the tty side does.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Mikhail Gavrilov <[email protected]>
    Closes: https://lore.kernel.org/linux-bluetooth/CABXGCsPe5wykd8Aj-hm+SJ7SGQyb8yoGNnx3XDpPmBathj+EGg@mail.gmail.com/
    Cc: [email protected]
    Signed-off-by: Maxim Skokov <[email protected]>
    Assisted-by: Claude:claude-opus-5
    Reviewed-by: Mikhail Gavrilov <[email protected]>
    Signed-off-by: Luiz Augusto von Dentz <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
bnxt_en: fix DMA mapping length for padded small packets [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Fri Oct 9 09:30:03 2026 -0400

    bnxt_en: fix DMA mapping length for padded small packets
    
    [ Upstream commit a51d233ccd4889aadb71dace863525cc2b00271e ]
    
    Stefan Fleischmann reported Intel IOMMU DMA Read faults on BCM57412
    NetXtreme-E NICs when transmitting packets on VLAN/macvlan interfaces:
    
      DMAR: [DMA Read NO_PASID] Request device [18:00.0] fault addr 0xfc499000
            [fault reason 0x06] PTE Read access is not set
      bnxt_en 0000:18:00.0 eno1np0: Abandoning msg {0xb4 0x41a} len: 0 due to firmware status: 0x2000001
      ...
      NETDEV WATCHDOG: eno1np0 (bnxt_en): transmit queue 0 timed out
    
    The fault address (0xfc499000) is on an exact 4KB page boundary,
    pointing to a DMA read buffer overrun.
    
    In bnxt_start_xmit(), packets smaller than BNXT_MIN_PKT_SIZE (52 bytes),
    such as 42-byte untagged ARP frames, are padded:
    
        if (length < BNXT_MIN_PKT_SIZE) {
            pad = BNXT_MIN_PKT_SIZE - length;
            if (skb_pad(skb, pad))
                goto tx_kick_pending;
            length = BNXT_MIN_PKT_SIZE;
        }
    
        mapping = dma_map_single(&pdev->dev, skb->data, len, DMA_TO_DEVICE);
        ...
        dma_unmap_len_set(tx_buf, len, len);
    
    However, 'len' was initialized earlier to skb_headlen(skb) (e.g. 42 bytes)
    and is left unadjusted after padding. Consequently, dma_map_single() and
    dma_unmap_len_set() map and track only 42 bytes.
    
    Later, the hardware TX buffer descriptor is programmed with the padded length:
    
        txbd->tx_bd_len_flags_type =
            cpu_to_le32(((len + pad) << TX_BD_LEN_SHIFT) | flags |
                        TX_BD_FLAGS_PACKET_END);
    
    The NIC DMA engine is thus instructed to read 52 bytes from a region where
    only 42 bytes were DMA-mapped. If skb->data ends near the boundary of a 4KB
    page (within 'pad' bytes of the next page), the hardware DMA read overruns
    into the unmapped adjacent page, triggering an IOMMU fault.
    
    This issue was exposed after commit 447cbe95ebb9 ("vlan: fix skb_under_panic
    and races when toggling HW VLAN offload") because reserving extra VLAN
    headroom rounded LL_RESERVED_SPACE from 48 up to 64 bytes, shifting skb->data
    offsets and potentially causing small frames to land right against page
    boundaries.
    
    Fix this by using skb_put_padto(skb, BNXT_MIN_PKT_SIZE) in
    bnxt_start_xmit(), before skb_shinfo(skb)->nr_frags is sampled,
    because padding might linearize the skb.
    This ensures skb->len and skb_headlen(skb) reflect the padded size so
    that dma_map_single() maps the full buffer and the descriptor length is
    consistent. This also removes the temporary 'pad' variable and masking logic.
    
    The padding is done after the SW USO branch, otherwise
    bnxt_sw_udp_gso_xmit() would account the padding as UDP payload
    and send it in extra segments.
    
    Note that SW USO segments are still not padded: with IPv4, a segment
    carrying less than 10 bytes of UDP payload (small gso_size, or a short
    last segment) is sent as a frame shorter than BNXT_MIN_PKT_SIZE.
    This is a separate issue, left for a followup patch.
    
    Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
    Cc: [email protected]
    Reported-by: Stefan Fleischmann <[email protected]>
    Closes: https://lore.kernel.org/netdev/20261004122616.56714cbd@nargothrond/
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: Michael Chan <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
bpf: Do mark_chain_precision for ARG_CONST_ALLOC_SIZE_OR_ZERO [+ + +]
Author: Kumar Kartikeya Dwivedi <[email protected]>
Date:   Mon Oct 19 17:54:52 2026 +0200

    bpf: Do mark_chain_precision for ARG_CONST_ALLOC_SIZE_OR_ZERO
    
    [ Upstream commit 2fc31465c5373b5ca4edf2e5238558cb62902311 ]
    
    Precision markers need to be propagated whenever we have an ARG_CONST_*
    style argument, as the verifier cannot consider imprecise scalars to be
    equivalent for the purposes of states_equal check when such arguments
    refine the return value (in this case, set mem_size for PTR_TO_MEM). The
    resultant mem_size for the R0 is derived from the constant value, and if
    the verifier incorrectly prunes states considering them equivalent where
    such arguments exist (by seeing that both registers have reg->precise as
    false in regsafe), we can end up with invalid programs passing the
    verifier which can do access beyond what should have been the correct
    mem_size in that explored state.
    
    To show a concrete example of the problem:
    
    0000000000000000 <prog>:
           0:       r2 = *(u32 *)(r1 + 80)
           1:       r1 = *(u32 *)(r1 + 76)
           2:       r3 = r1
           3:       r3 += 4
           4:       if r3 > r2 goto +18 <LBB5_5>
           5:       w2 = 0
           6:       *(u32 *)(r1 + 0) = r2
           7:       r1 = *(u32 *)(r1 + 0)
           8:       r2 = 1
           9:       if w1 == 0 goto +1 <LBB5_3>
          10:       r2 = -1
    
    0000000000000058 <LBB5_3>:
          11:       r1 = 0 ll
          13:       r3 = 0
          14:       call bpf_ringbuf_reserve
          15:       if r0 == 0 goto +7 <LBB5_5>
          16:       r1 = r0
          17:       r1 += 16777215
          18:       w2 = 0
          19:       *(u8 *)(r1 + 0) = r2
          20:       r1 = r0
          21:       r2 = 0
          22:       call bpf_ringbuf_submit
    
    00000000000000b8 <LBB5_5>:
          23:       w0 = 0
          24:       exit
    
    For the first case, the single line execution's exploration will prune
    the search at insn 14 for the branch insn 9's second leg as it will be
    verified first using r2 = -1 (UINT_MAX), while as w1 at insn 9 will
    always be 0 so at runtime we don't get error for being greater than
    UINT_MAX/4 from bpf_ringbuf_reserve. The verifier during regsafe just
    sees reg->precise as false for both r2 registers in both states, hence
    considers them equal for purposes of states_equal.
    
    If we propagated precise markers using the backtracking support, we
    would use the precise marking to then ensure that old r2 (UINT_MAX) was
    within the new r2 (1) and this would never be true, so the verification
    would rightfully fail.
    
    The end result is that the out of bounds access at instruction 19 would
    be permitted without this fix.
    
    Note that reg->precise is always set to true when user does not have
    CAP_BPF (or when subprog count is greater than 1 (i.e. use of any static
    or global functions)), hence this is only a problem when precision marks
    need to be explicitly propagated (i.e. privileged users with CAP_BPF).
    
    A simplified test case has been included in the next patch to prevent
    future regressions.
    
    [ The context change is due to the commit 8ab4cdcf03d0
    ("bpf: Tidy up verifier check_func_arg()") in v6.0
    which is irrelevant to the logic of this patch. ]
    
    Fixes: 457f44363a88 ("bpf: Implement BPF ring buffer and verifier support for it")
    Signed-off-by: Kumar Kartikeya Dwivedi <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Alexei Starovoitov <[email protected]>
    Signed-off-by: Johnny Hao <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

bpf: fix potential 32-bit overflow when accessing ARRAY map element [+ + +]
Author: Andrii Nakryiko <[email protected]>
Date:   Mon Oct 19 17:20:45 2026 +0200

    bpf: fix potential 32-bit overflow when accessing ARRAY map element
    
    [ Upstream commit 87ac0d600943994444e24382a87aa19acc4cd3d4 ]
    
    If BPF array map is bigger than 4GB, element pointer calculation can
    overflow because both index and elem_size are u32. Fix this everywhere
    by forcing 64-bit multiplication. Extract this formula into separate
    small helper and use it consistently in various places.
    
    Speculative-preventing formula utilizing index_mask trick is left as is,
    but explicit u64 casts are added in both places.
    
    Fixes: c85d69135a91 ("bpf: move memory size checks to bpf_map_charge_init()")
    Signed-off-by: Andrii Nakryiko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Alexei Starovoitov <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    [removed the changes that applied to code not yet introduced]
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

bpf: Reject variable offset alu on PTR_TO_FLOW_KEYS [+ + +]
Author: Hao Sun <[email protected]>
Date:   Mon Oct 19 19:33:57 2026 +0200

    bpf: Reject variable offset alu on PTR_TO_FLOW_KEYS
    
    [ Upstream commit 22c7fa171a02d310e3a3f6ed46a698ca8a0060ed ]
    
    For PTR_TO_FLOW_KEYS, check_flow_keys_access() only uses fixed off
    for validation. However, variable offset ptr alu is not prohibited
    for this ptr kind. So the variable offset is not checked.
    
    The following prog is accepted:
    
      func#0 @0
      0: R1=ctx() R10=fp0
      0: (bf) r6 = r1                       ; R1=ctx() R6_w=ctx()
      1: (79) r7 = *(u64 *)(r6 +144)        ; R6_w=ctx() R7_w=flow_keys()
      2: (b7) r8 = 1024                     ; R8_w=1024
      3: (37) r8 /= 1                       ; R8_w=scalar()
      4: (57) r8 &= 1024                    ; R8_w=scalar(smin=smin32=0,
      smax=umax=smax32=umax32=1024,var_off=(0x0; 0x400))
      5: (0f) r7 += r8
      mark_precise: frame0: last_idx 5 first_idx 0 subseq_idx -1
      mark_precise: frame0: regs=r8 stack= before 4: (57) r8 &= 1024
      mark_precise: frame0: regs=r8 stack= before 3: (37) r8 /= 1
      mark_precise: frame0: regs=r8 stack= before 2: (b7) r8 = 1024
      6: R7_w=flow_keys(smin=smin32=0,smax=umax=smax32=umax32=1024,var_off
      =(0x0; 0x400)) R8_w=scalar(smin=smin32=0,smax=umax=smax32=umax32=1024,
      var_off=(0x0; 0x400))
      6: (79) r0 = *(u64 *)(r7 +0)          ; R0_w=scalar()
      7: (95) exit
    
    This prog loads flow_keys to r7, and adds the variable offset r8
    to r7, and finally causes out-of-bounds access:
    
      BUG: unable to handle page fault for address: ffffc90014c80038
      [...]
      Call Trace:
       <TASK>
       bpf_dispatcher_nop_func include/linux/bpf.h:1231 [inline]
       __bpf_prog_run include/linux/filter.h:651 [inline]
       bpf_prog_run include/linux/filter.h:658 [inline]
       bpf_prog_run_pin_on_cpu include/linux/filter.h:675 [inline]
       bpf_flow_dissect+0x15f/0x350 net/core/flow_dissector.c:991
       bpf_prog_test_run_flow_dissector+0x39d/0x620 net/bpf/test_run.c:1359
       bpf_prog_test_run kernel/bpf/syscall.c:4107 [inline]
       __sys_bpf+0xf8f/0x4560 kernel/bpf/syscall.c:5475
       __do_sys_bpf kernel/bpf/syscall.c:5561 [inline]
       __se_sys_bpf kernel/bpf/syscall.c:5559 [inline]
       __x64_sys_bpf+0x73/0xb0 kernel/bpf/syscall.c:5559
       do_syscall_x64 arch/x86/entry/common.c:52 [inline]
       do_syscall_64+0x3f/0x110 arch/x86/entry/common.c:83
       entry_SYSCALL_64_after_hwframe+0x63/0x6b
    
    Fix this by rejecting ptr alu with variable offset on flow_keys.
    Applying the patch rejects the program with "R7 pointer arithmetic
    on flow_keys prohibited".
    
    Fixes: d58e468b1112 ("flow_dissector: implements flow dissector BPF hook")
    Signed-off-by: Hao Sun <[email protected]>
    Signed-off-by: Daniel Borkmann <[email protected]>
    Acked-by: Yonghong Song <[email protected]>
    Link: https://lore.kernel.org/bpf/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
btrfs: scrub: fix local_root reference leak in scrub_print_warning_inode() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Wed Sep 16 17:16:10 2026 +0000

    btrfs: scrub: fix local_root reference leak in scrub_print_warning_inode()
    
    commit 1fd742c7479961da6d0bb794ef8ac6b7b9442847 upstream.
    
    When paths_from_inode() fails, scrub_print_warning_inode() jumps to err
    without dropping the reference taken by btrfs_get_fs_root(), leaking a
    reference to the root every time path resolution fails while printing
    scrub warnings.  Every other error and success path of the function
    drops the reference.
    
    Drop the reference on the paths_from_inode() failure path too.
    
    Fixes: 558540c17771 ("btrfs scrub: print paths of corrupted files")
    CC: [email protected]
    Reviewed-by: Qu Wenruo <[email protected]>
    Signed-off-by: Wentao Liang <[email protected]>
    Reviewed-by: David Sterba <[email protected]>
    Signed-off-by: David Sterba <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
can: fix unique skb identifier regression under RPS [+ + +]
Author: Oliver Hartkopp <[email protected]>
Date:   Tue Oct 13 09:41:12 2026 +0200

    can: fix unique skb identifier regression under RPS
    
    commit 7093c3b8314a4ef7405c4066a2521398c455efe7 upstream.
    
    Commit d4fb6514ff8e ("can: use skb hash instead of private variable in
    headroom") moved the per-skb unique identifier used for raw_rcv()
    duplicate detection into skb->hash.
    
    With RPS enabled, get_rps_cpu() calls skb_get_hash() before the frame
    reaches the CAN subsystem. Since CAN skbs have no L3/L4 headers, the
    flow dissector assigns every CAN frame the same non-zero software
    hash. can_set_skb_uid() only generated a new identifier when
    skb->hash was 0, so it kept this constant hash. When the SLAB
    allocator later reused the same skb address, raw_rcv() mistook the
    next legitimate frame for a duplicate and dropped it.
    
    Fix this by storing the CAN UID in the CAN skb extension
    (struct can_skb_ext::can_skb_uid) instead of skb->hash, decoupling it
    from any hash the network stack may compute. can_set_skb_uid() keeps
    its "assign only if unset" behaviour, which preserves UIDs set before
    transmission (e.g. by isotp to identify echo frames) across the local
    loopback path.
    
    Frames whose extension is shared with another clone (e.g. via tc mirred
    or netem duplicate) are given a private extension copy before the UID
    is assigned, so that independently received skb clones from real CAN
    interfaces (skbcnt = 0) don't end up with the same UID.
    The limitation that tc mirred/netem skb duplicates might be dropped in
    raw_rcv for looped back isotp echo frame skbs is accepted. There is no
    valid use-case for tc mirred or netem together with isotp which is not
    capable to operate on different CAN interfaces simultaneously.
    For routing and modifying CAN frames together with isotp use can-gw.
    
    can-gw and vxcan additionally clear the UID of forwarded/duplicated
    frames so each newly routed frame gets its own unique identifier.
    
    [ backport to 5.10: no CAN skb extensions available, so the UID is kept
      in struct can_skb_priv::skbcnt in the headroom (effectively reverting
      d4fb6514ff8e) and isotp is adapted accordingly. As skb clones share
      the headroom, the private extension copy for tc mirred/netem
      duplicates is not applicable. The UID resets in can-gw and vxcan are
      omitted, as writing to the shared headroom of cloned skbs would also
      alter the UID of the original skb. This keeps the pre-d4fb6514ff8e
      behaviour for routed and vxcan forwarded frames. ]
    
    Fixes: d4fb6514ff8e ("can: use skb hash instead of private variable in headroom")
    Reported-by: Joerg Willmann <[email protected]>
    Closes: https://lore.kernel.org/linux-can/[email protected]/
    Signed-off-by: Oliver Hartkopp <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ceph: bound copied dentry name length in NFS export get_name [+ + +]
Author: Michael Bommarito <[email protected]>
Date:   Sun Sep 6 11:03:39 2026 -0400

    ceph: bound copied dentry name length in NFS export get_name
    
    [ Upstream commit eff8013c5a8916613c742ae5a2cc341cb605c0ae ]
    
    ceph_get_name() copies the MDS-supplied name into the caller's
    NAME_MAX-sized buffer with memcpy(name, rinfo->dname, rinfo->dname_len)
    and then writes name[rinfo->dname_len] = 0, without checking dname_len
    against NAME_MAX. A malicious or buggy MDS that returns a LOOKUPNAME reply
    with dname_len > NAME_MAX overflows the buffer. __get_snap_name() copies
    rde->name / rde->name_len the same unchecked way.
    
    Impact: a malicious or compromised Ceph MDS overflows the NAME_MAX name
    buffer in a client's NFS-export get_name path, a slab out-of-bounds write
    reported by KASAN. Reachable when a CephFS mount is re-exported over NFS.
    
    Add ceph_export_copy_name(), which rejects lengths above NAME_MAX with
    -ENAMETOOLONG before the copy, and use it in both ceph_get_name() and
    __get_snap_name().
    
    Cc: [email protected]
    Fixes: 19913b4eac4a ("ceph: add get_name() NFS export callback")
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Michael Bommarito <[email protected]>
    Reviewed-by: Viacheslav Dubeyko <[email protected]>
    Signed-off-by: Ilya Dryomov <[email protected]>
    [ adapted the bounds check to the older ceph_get_name() flow without encrypted-name handling. ]
    Signed-off-by: Sasha Levin <[email protected]>

ceph: bound num_export_targets array for mds info v2/v3 [+ + +]
Author: Michael Bommarito <[email protected]>
Date:   Sun Sep 6 11:35:15 2026 -0400

    ceph: bound num_export_targets array for mds info v2/v3
    
    [ Upstream commit a3eb169ee297aa99670ba927c659990bd1e453f3 ]
    
    ceph_mdsmap_decode() in fs/ceph/mdsmap.c reads num_export_targets from
    each per-mds info record and advances the decode cursor by
    num_export_targets * sizeof(u32) without first checking that many bytes
    remain. The only upper-bound check that catches a runaway cursor
    (*p > info_end) is gated on info_v >= 4, because info_end is left NULL
    for info_v 2 and 3. When the monitor sends an MDS map whose per-mds
    info version is 2 or 3 with an oversized num_export_targets, the cursor
    moves past the message front buffer and the later export-targets loop
    calls the unchecked ceph_decode_32() on out-of-bounds memory.
    
    A kernel client processes CEPH_MSG_MDS_MAP from its monitor session
    (net/ceph/mon_client.c dispatches it; fs/ceph/super.c routes it to
    ceph_mdsc_handle_mdsmap(), which sets end to the front buffer bound and
    calls ceph_mdsmap_decode()). A malicious or compromised monitor, or an
    on-path attacker on an unsigned/unencrypted messenger session, can
    therefore drive an out-of-bounds read in the client kernel; on x86_64
    with KASAN it is reported as a slab-out-of-bounds read in
    ceph_mdsmap_decode(). The decoded values land in the internal
    info->export_targets[] array, so the consequence is a kernel
    out-of-bounds read, not an information leak to the attacker.
    
    Impact: a malicious or compromised Ceph monitor sending an MDS map with
    a per-mds info version of 2 or 3 and an oversized num_export_targets
    field triggers an out-of-bounds read in the CephFS client kernel.
    
    Add a ceph_decode_need() for the export-targets array before advancing
    the cursor, so the bound is enforced for every info_v >= 2, not only
    info_v >= 4. This mirrors the count-then-need idiom already used for
    m_data_pg_pools later in the same function.
    
    Compute the export-targets byte count with size_mul() and reuse that
    checked length when advancing the cursor, so the attacker-controlled
    num_export_targets multiplication fails closed on overflow rather than
    relying on the later kcalloc() guard.
    
    Cc: [email protected]
    Fixes: d463a43d69f4 ("ceph: CEPH_FEATURE_MDSENC support")
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Michael Bommarito <[email protected]>
    Reviewed-by: Viacheslav Dubeyko <[email protected]>
    Signed-off-by: Ilya Dryomov <[email protected]>
    [ omitted the newer-kernel-only adjacent `u32 target` local absent from Linux 5.10. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
cifs: add revalidation on FSCTL failure in smb2_duplicate_extents() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Thu Oct 22 18:05:27 2026 -0400

    cifs: add revalidation on FSCTL failure in smb2_duplicate_extents()
    
    [ Upstream commit 53676a5e28231186c9f56d87b7998b640699bc15 ]
    
    smb2_duplicate_extents() has no handling for
    FSCTL_DUPLICATE_EXTENTS_TO_FILE failure: when the FSCTL fails, local
    inode metadata may be stale from the pre-extension or from concurrent
    remote writes, but is never refreshed.
    
    Force revalidation on FSCTL failure and use i_size_read() for the
    pre-extension check.
    
    Fixes: cfc63fc8126a ("smb3: fix cached file size problems in duplicate extents (reflink)")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ sashal: replaced cifs_invalidate_cache() with fscache_invalidate() guarded by CONFIG_CIFS_FSCACHE ]
    Signed-off-by: Sasha Levin <[email protected]>

cifs: fix loff_t underflow in cifs_remap_file_range() when len == 0 [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Sun Sep 6 21:03:19 2026 -0400

    cifs: fix loff_t underflow in cifs_remap_file_range() when len == 0
    
    [ Upstream commit 6c322f5cf7476ded7a9a20f7be72462065a03c68 ]
    
    With len == 0 (clone to EOF), the effective length is computed as:
    
        len = src_inode->i_size - off;
    
    If off > i_size, this is a negative loff_t, corrupting the ByteCount
    in the FSCTL_DUPLICATE_EXTENTS_TO_FILE request and inverting the range
    in filemap_write_and_wait_range().  The existing off >= i_size check
    fires only after the ioctl has already been sent.
    
    Snapshot i_size_read() once for both the bounds check and the length
    calculation, eliminating the TOCTOU and 32-bit torn-read risk.  Reject
    off > src_size with -EINVAL.  Treat off == src_size as a no-op,
    consistent with __generic_remap_file_range_prep().
    
    Fixes: 04b38d601239 ("vfs: pull btrfs clone API to vfs layer")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ added the missing unlock label at the existing common unlock path ]
    Signed-off-by: Sasha Levin <[email protected]>

 
clone: add CLONE_AUTOREAP [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Thu Feb 26 14:50:59 2026 +0100

    clone: add CLONE_AUTOREAP
    
    [ Upstream commit 12ae2c81b21cfaa193db2faf035d495807edc3a7 ]
    
    Add a new clone3() flag CLONE_AUTOREAP that makes a child process
    auto-reap on exit without ever becoming a zombie. This is a per-process
    property in contrast to the existing auto-reap mechanism via
    SA_NOCLDWAIT or SIG_IGN for SIGCHLD which applies to all children of a
    given parent.
    
    Currently the only way to automatically reap children is to set
    SA_NOCLDWAIT or SIG_IGN on SIGCHLD. This is a parent-scoped property
    affecting all children which makes it unsuitable for libraries or
    applications that need selective auto-reaping of specific children while
    still being able to wait() on others.
    
    CLONE_AUTOREAP stores an autoreap flag in the child's signal_struct.
    When the child exits do_notify_parent() checks this flag and causes
    exit_notify() to transition the task directly to EXIT_DEAD. Since the
    flag lives on the child it survives reparenting: if the original parent
    exits and the child is reparented to a subreaper or init the child still
    auto-reaps when it eventually exits.
    
    CLONE_AUTOREAP can be combined with CLONE_PIDFD to allow the parent to
    monitor the child's exit via poll() and retrieve exit status via
    PIDFD_GET_INFO. Without CLONE_PIDFD it provides a fire-and-forget
    pattern where the parent simply doesn't care about the child's exit
    status. No exit signal is delivered so exit_signal must be zero.
    
    CLONE_AUTOREAP is rejected in combination with CLONE_PARENT. If a
    CLONE_AUTOREAP child were to clone(CLONE_PARENT) the new grandchild
    would inherit exit_signal == 0 from the autoreap parent's group leader
    but without signal->autoreap. This grandchild would become a zombie that
    never sends a signal and is never autoreaped - confusing and arguably
    broken behavior.
    
    The flag is not inherited by the autoreap process's own children. Each
    child that should be autoreaped must be explicitly created with
    CLONE_AUTOREAP.
    
    Link: https://github.com/uapi-group/kernel-features/issues/45
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Oleg Nesterov <[email protected]>
    Signed-off-by: Christian Brauner <[email protected]>
    Stable-dep-of: 28d2905d77bc ("exit: fix lost-update race on the child_subreaper bitfields")
    Signed-off-by: Sasha Levin <[email protected]>

 
coresight: etm3x: Fix cntr_val_show() to match cntr_val_store() behavior [+ + +]
Author: Kuan-Wei Chiu <[email protected]>
Date:   Tue Sep 8 09:11:59 2026 -0400

    coresight: etm3x: Fix cntr_val_show() to match cntr_val_store() behavior
    
    [ Upstream commit 41fb4e925528aefa4b7a5f76c7f81db99c0d0f38 ]
    
    The cntr_val_show() function was intended to print the values of all
    counters using a loop. However, due to a buffer overwrite issue with
    sprintf(), it effectively only displayed the value of the last counter.
    
    The companion function, cntr_val_store(), allows users to modify a
    specific counter selected by 'cntr_idx'. To maintain consistency
    between read and write operations and to align with the ETM4x driver
    behavior, modify cntr_val_show() to report only the value of the
    currently selected counter.
    
    This change removes the loop and the "counter %d:" prefix, printing
    only the hexadecimal value. It also adopts sysfs_emit() for standard
    sysfs output formatting.
    
    Fixes: a939fc5a71ad ("coresight-etm: add CoreSight ETM/PTM driver")
    Cc: [email protected]
    Signed-off-by: Kuan-Wei Chiu <[email protected]>
    Reviewed-by: James Clark <[email protected]>
    Signed-off-by: Suzuki K Poulose <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
crypto: drbg - Fix ineffective sanity check [+ + +]
Author: Eric Biggers <[email protected]>
Date:   Sat Oct 10 10:17:20 2026 +0200

    crypto: drbg - Fix ineffective sanity check
    
    commit 040ad83b0e8aa065fd2fc641cacba8491a8b186d upstream.
    
    Fix drbg_healthcheck_sanity() to correctly check the return value of
    drbg_generate().  drbg_generate() returns 0 on success, or a negative
    errno value on failure.  drbg_healthcheck_sanity() incorrectly assumed
    that it returned a positive value on success.
    
    This didn't make the sanity check fail, but it made it ineffective.
    
    Fixes: cde001e4c3c3 ("crypto: rng - RNGs must return 0 in success case")
    Cc: [email protected]
    Signed-off-by: Eric Biggers <[email protected]>
    Signed-off-by: Herbert Xu <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
cxgb4/ch_ktls: disable softirqs around tid_list erases [+ + +]
Author: Sang-Hoon Choi <[email protected]>
Date:   Wed Sep 30 02:37:34 2026 +0900

    cxgb4/ch_ktls: disable softirqs around tid_list erases
    
    [ Upstream commit 4c9dc0faca98084922caeb689579d338cf3e1c29 ]
    
    chcr_ktls_cpl_act_open_rpl() inserts into tid_list from the receive path
    using xa_insert_bh().  The array is shared by the adapter's connections
    and initialized with XA_FLAGS_LOCK_BH.  However, chcr_ktls_dev_del() and
    the chcr_ktls_dev_add() error path use xa_erase(), which takes the XArray
    lock without disabling softirqs.
    
    When cleanup runs with softirqs enabled, a receive softirq for another
    connection on the same CPU can interrupt the erase and spin on the lock
    held by the interrupted task.  Use xa_erase_bh() at both sites to match
    the insertion path.
    
    Fixes: 65e302a9bd57 ("cxgb4/ch_ktls: Clear resources when pf4 device is removed")
    Reported-by: Changyul Lee <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Sang-Hoon Choi <[email protected]>
    Reviewed-by: Ayush Sawal <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
dcache: don't put a mountpoint on a dentry that's being removed [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Wed Sep 30 15:32:07 2026 +0200

    dcache: don't put a mountpoint on a dentry that's being removed
    
    commit 75f4197f1e11d2eb75c2d6f916a7d4764db621e5 upstream.
    
    rmdir(), unlink() and rename() call dont_mount() on the victim and then
    detach_mounts() with the victim's inode locked. do_lock_mount() takes
    the inode lock of the mountpoint and checks cant_mount() so a mount
    can't show up after detach_mounts().
    
    But attach_recursive_mnt() makes a second mountpoint for the root of the
    source mount so that the mounts already located at the destination can
    be put on top of it. No inode is locked for that one and d_set_mounted()
    only refuses a dentry that is unlinked. Between detach_mounts() and
    d_delete() the victim is still hashed:
    
      rmrace: b passed dont_mount() and detach_mounts(), sleeping
      T2: move_mount(S, /tmp/plcant/x, BENEATH) = 0 errno 0 ()
      T1: rmdir(/tmp/plcant/d/b) = 0 errno 0
          109 107 0:61 /d/b//deleted /tmp/plcant/x rw,relatime - tmpfs tmpfs rw
          108 109 0:63 / /tmp/plcant/x rw,relatime - tmpfs T rw
    
    A bind mount of the directory that's being removed is moved beneath an
    existing mount while the rmdir() is located between the two calls. The
    mount ends up on the removed directory and nothing will ever detach it.
    
    Check cant_mount() in d_set_mounted() as well. dont_mount() raises the
    flag under d_lock before detach_mounts() runs so either the mountpoint
    is set first and detach_mounts() finds the mount or the flag is seen and
    the mount is refused.
    
    Fixes: 1064f874abc0 ("mnt: Tuck mounts under others instead of creating shadow/side mounts.")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
device property: Add cleanup.h based fwnode_handle_put() scope based cleanup. [+ + +]
Author: Jonathan Cameron <[email protected]>
Date:   Fri Sep 4 20:16:45 2026 -0400

    device property: Add cleanup.h based fwnode_handle_put() scope based cleanup.
    
    [ Upstream commit 59ed5e2d505bf5f9b4af64d0021cd0c96aec1f7c ]
    
    Useful where the fwnode_handle was obtained from a call such as
    fwnode_find_reference() as it will safely do nothing if IS_ERR() is true
    and will automatically release the reference on the variable leaving
    scope.
    
    Reviewed-by: Andy Shevchenko <[email protected]>
    Acked-by: Greg Kroah-Hartman <[email protected]>
    Reviewed-by: Sakari Ailus <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Stable-dep-of: 190069255582 ("device property: fix infinite loop in fwnode_for_each_child_node()")
    Signed-off-by: Sasha Levin <[email protected]>

device property: fix infinite loop in fwnode_for_each_child_node() [+ + +]
Author: Xu Yang <[email protected]>
Date:   Fri Sep 4 20:16:46 2026 -0400

    device property: fix infinite loop in fwnode_for_each_child_node()
    
    [ Upstream commit 1900692555826753adab8799a1a8d50bb1ee200c ]
    
    When iterate over children of a fwnode that has a secondary fwnode,
    fwnode_get_next_child_node() can enter an infinite loop if the secondary
    fwnode has more than one child.
    
                           Parent        Child
          (Primary fwnode)   FWa:   {FWa1, FWa2, FWa3}
        (Secondary fwnode)   FWb:   {FWb1, FWb2}
    
    In this case:
    
     ┌─> fwnode_get_next_child_node(FWa, FWa1)
     │    - fwnode_call_ptr_op(FWa, get_next_child_node, FWa1) returns FWa2
     │
     │   ...
     │
     │   fwnode_get_next_child_node(FWa, FWa3)
     │    - fwnode_call_ptr_op(FWa, get_next_child_node, FWa3) returns NULL
     │    - fwnode_call_ptr_op(FWb, get_next_child_node, FWa3) returns FWb1
     │
     │   fwnode_get_next_child_node(FWa, FWb1)
     │    - fwnode_call_ptr_op(FWa, get_next_child_node, FWb1) returns FWa1
     └────┘
    
    This cause fwnode_for_each_child_node() to loop indefinitely, reapeatedly
    output {FWa1, FWa2, FWa3, FWb1, FWa1, ...}.
    
    The root cause is that when the current child (FWb1) belongs to the
    secondary fwnode, calling get_next_child_node() on the parimary fwnode
    incorrectly returns the first child (FWa1) again instead of NULL.
    
    Fix this by dynamically checking the parent fwnode of the current child
    before calling get_next_child_node(). This approach follows the pattern
    established in commit b5b41ab6b0c1 ("device property: Check
    fwnode->secondary in fwnode_graph_get_next_endpoint()").
    
    Fixes: 2692c614f8f0 ("device property: Allow secondary lookup in fwnode_get_next_child_node()")
    Cc: [email protected]
    Signed-off-by: Xu Yang <[email protected]>
    Tested-by: Andy Shevchenko <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Tested-by: Xu Yang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
devm-helpers: Add resource managed version of work init [+ + +]
Author: Matti Vaittinen <[email protected]>
Date:   Wed Sep 16 22:18:43 2026 -0400

    devm-helpers: Add resource managed version of work init
    
    [ Upstream commit 7a2c4cc537fa9f05fe90812e7d789b9faf7eb869 ]
    
    A few drivers which need a work-queue must cancel work at driver detach.
    Some of those implement remove() solely for this purpose. Help drivers to
    avoid unnecessary remove and error-branch implementation by adding managed
    verision of work initialization. This will also help drivers to avoid
    mixing manual and devm based unwinding when other resources are handled by
    devm.
    
    Signed-off-by: Matti Vaittinen <[email protected]>
    Reviewed-by: Krzysztof Kozlowski <[email protected]>
    Reviewed-by: Hans de Goede <[email protected]>
    Link: https://lore.kernel.org/r/94ff4175e7f2ff134ed2fa7d6e7641005cc9784b.1623146580.git.matti.vaittinen@fi.rohmeurope.com
    Signed-off-by: Hans de Goede <[email protected]>
    Stable-dep-of: a2471ed17b0e ("hwmon: (gpio-fan) Fix use-after-free in alarm work")
    Signed-off-by: Sasha Levin <[email protected]>

devm-helpers: Fix devm_delayed_work_autocancel() kerneldoc [+ + +]
Author: Matti Vaittinen <[email protected]>
Date:   Wed Apr 21 21:11:32 2021 +0300

    devm-helpers: Fix devm_delayed_work_autocancel() kerneldoc
    
    [ Upstream commit a943d76352dbb4707a5e5537bbe696c00f5ddd36 ]
    
    The kerneldoc for devm_delayed_work_autocancel() contains invalid
    parameter description.
    
    Fix the parameter description. And while at it - make it more obvous that
    this function operates on delayed_work. That helps differentiating with
    resource-managed INIT_WORK description (which should follow in near future)
    
    Fixes: 0341ce544394 ("workqueue: Add resource managed version of delayed work init")
    Reviewed-by: Hans de Goede <[email protected]>
    Signed-off-by: Matti Vaittinen <[email protected]>
    Link: https://lore.kernel.org/r/db3a8b4b8899fdf109a0cc760807de12d3b4f09b.1619028482.git.matti.vaittinen@fi.rohmeurope.com
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
dm cache: fix demotion stats in passthrough mode [+ + +]
Author: Ming-Hung Tsai <[email protected]>
Date:   Tue Aug 18 18:05:47 2026 +0800

    dm cache: fix demotion stats in passthrough mode
    
    commit 2ccb8878c149443c6acf628b438c9c942c20abb2 upstream.
    
    The demotion counter is incremented per incoming write bio before the
    invalidation begins, causing the demotion count to exceed the actual
    number of cached blocks when multiple bios target the same cached
    block. Additionally, the counter is incremented unconditionally
    regardless of invalidation failure.
    
    Reproduce steps:
    
    1. Create a cache device consisting of 512 cache entries
    
    modprobe brd rd_size=262144
    dmsetup create cmeta --table "0 8192 linear /dev/ram0 0"
    dmsetup create cdata --table "0 65536 linear /dev/ram0 8192"
    dmsetup create corig --table "0 65536 linear /dev/ram0 262144"
    dd if=/dev/zero of=/dev/mapper/cmeta bs=4k count=1 oflag=direct
    dmsetup create cache --table "0 65536 cache /dev/mapper/cmeta \
    /dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 writethrough smq 0"
    
    2. Populate the cache, and record the number of cached blocks
    
    fio --name=populate --filename=/dev/mapper/cache --rw=randwrite --bs=4k \
    --direct=1 --ioengine=libaio --iodepth=32 --io_size=2048m
    nr_cached=$(dmsetup status cache | awk '{split($7, a, "/"); print a[1]}')
    
    3. Reload the cache into passthrough mode
    
    dmsetup suspend cache
    dmsetup reload cache --table "0 65536 cache /dev/mapper/cmeta \
    /dev/mapper/cdata /dev/mapper/corig 128 2 metadata2 passthrough smq 0"
    dmsetup resume cache
    
    4. Write to the passthrough cache with multiple jobs to trigger
       multiple bios hitting the same cached block.
    
    fio --filename=/dev/mapper/cache --name=test --rw=write --bs=4k \
    --direct=1 --ioengine=libaio --iodepth=32 --numjobs=4
    
    5. Check if demoted matches cached block count. These numbers should
       match but may differ due to overcounting per bio.
    
    nr_demoted=$(dmsetup status cache | awk '{print $12}')
    echo "$nr_cached, $nr_demoted"
    
    Fix by moving the demotion counter increment into invalidate_complete(),
    gated on the success flag.
    
    Reported-by: Ben Marzinski <[email protected]>
    Fixes: b29d4986d0da ("dm cache: significant rework to leverage dm-bio-prison-v2")
    Cc: [email protected]
    Signed-off-by: Ming-Hung Tsai <[email protected]>
    Reviewed-by: Benjamin Marzinski <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

dm cache: fix issue with background work locking [+ + +]
Author: Benjamin Marzinski <[email protected]>
Date:   Tue Aug 25 15:22:26 2026 -0400

    dm cache: fix issue with background work locking
    
    commit bc9781c0247de107876f32929f1637db93a42b34 upstream.
    
    dm cache used a rw_semaphore for background_work_lock. Write locks on
    rw_semaphores have strict owner semantics, but there was no guarantee
    that the process that locked background_work_lock was the same process
    that unlocked it. This can be easily seen using a kernel compiled with
    CONFIG_DEBUG_RWSEMS. Given a dm cache device <cache>, run: 'dmsetup
    suspend <cache> && dmsetup resume <cache>'. This will trigger a kernel
    warning:
    
    DEBUG_RWSEMS_WARN_ON((rwsem_owner(sem) != current) && !rwsem_test_oflags(sem, RWSEM_NONSPINNABLE))
    
    triggered by cache_resume(). To fix this, switch from a rw_semaphore to
    a spinlock and a wait queue. dm cache already has a wait queue and
    associated counter, migration_wait and nr_allocated_migrations, that was
    getting woken up when background work was getting completed, but wasn't
    actually used by anything. This is replaced by the background_work queue
    and counter.
    
    Fixes: b29d4986d0da ("dm cache: significant rework to leverage dm-bio-prison-v2")
    Cc: [email protected]
    Signed-off-by: Benjamin Marzinski <[email protected]>
    Reviewed-by: Matthew Sakai <[email protected]>
    Reviewed-by: Ming-Hung Tsai <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm ioctl: don't let data_start run past the buffer [+ + +]
Author: Palla Raghunath <[email protected]>
Date:   Sat Sep 19 00:43:39 2026 +0100

    dm ioctl: don't let data_start run past the buffer
    
    commit 9b3fcf519d370df94a56f3b272d9eddffffa5be8 upstream.
    
    struct dm_ioctl has seven bytes of trailing padding, so the smallest
    buffer userspace is allowed to ask for, offsetof(struct dm_ioctl, data),
    is seven bytes shorter than sizeof(struct dm_ioctl).
    
    get_result_buffer() sets data_start to sizeof(struct dm_ioctl) without
    looking at how big the buffer actually is. Ask for the minimum and
    data_start ends up seven bytes past the end. Callers add it to
    data_size, and ctl_ioctl() copies that much back to userspace:
    
      BUG: KASAN: slab-out-of-bounds in _copy_to_user+0xad/0xd0
      Read of size 312 at addr ffff8880169e4c00 by task repro-dm/140
       ctl_ioctl+0x5e3/0xcb0
       dm_ctl_ioctl+0x25/0x40
      allocated 305-byte region [ffff8880169e4c00, ffff8880169e4d31)
    
    A DM_LIST_DEVICES with data_size set to 305 is enough to hit it, and the
    seven bytes that leak are whatever sat next to the allocation.
    
    Clamp data_start to the buffer size.
    
    Note that this is not a security bug because the out-of-bounds read can
    only be triggered by root.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=48d935cf48a4a76be346
    Fixes: 76c072b48e39 ("dm ioctl: move compat code")
    Cc: [email protected]
    Signed-off-by: Palla Raghunath <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm-crypt: fix a tiny race condition in crypt_dec_pending [+ + +]
Author: Ben Cressey <[email protected]>
Date:   Wed Aug 26 00:25:33 2026 +0000

    dm-crypt: fix a tiny race condition in crypt_dec_pending
    
    commit 148845aa1921d95ef5dc851c76e6a284f6657df6 upstream.
    
    crypt_dec_pending reads io->error before calling atomic_dec_and_test.
    Another context, for example crypt_endio called from an interrupt, may
    set io->error and drop its reference between the read and the
    decrement. crypt_dec_pending then drops the last reference and completes
    the bio with the stale status - so a read that failed and was never
    decrypted, or a write that failed, is reported as successful.
    
    The read was placed before the decrement by commit b35f8caa0890 ("dm
    crypt: wait for endio to complete before destruction"), because that
    commit freed dm_crypt_io before calling bio_endio. This is no longer the
    case, dm_crypt_io lives in the per-bio data now.
    
    Read io->error after atomic_dec_and_test instead. atomic_dec_and_test is
    fully ordered, so no additional barrier is needed.
    
    Fixes: b35f8caa0890 ("dm crypt: wait for endio to complete before destruction")
    Cc: [email protected]
    Reviewed-by: Jose Fernandez (Anthropic) <[email protected]>
    Signed-off-by: Ben Cressey <[email protected]>
    Assisted-by: Claude:unspecified
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

dm-crypt: reject the lmk IV mode with AEAD ciphers [+ + +]
Author: Ben Cressey <[email protected]>
Date:   Tue Sep 15 00:39:10 2026 +0000

    dm-crypt: reject the lmk IV mode with AEAD ciphers
    
    commit 3195e0daf590683992edb4eed32269e569e04924 upstream.
    
    A "capi:" table line that pairs an AEAD cipher with the lmk IV mode,
    for example "capi:gcm(aes)-lmk" with the integrity:28:aead option,
    causes an oops when it is loaded. lmk sets tfms_count to 64, but
    crypt_alloc_tfms_aead only allocates one transform, so crypt_setkey
    reads past the end of the tfms_aead array and calls crypto_aead_setkey
    on the values it finds there.
    
    lmk exists for compatibility with Loop-AES, which uses CBC, so refuse
    it with an AEAD cipher rather than allocate 64 AEAD transforms. The
    check cannot go in crypt_iv_lmk_ctr with the other lmk checks, because
    the IV constructor runs after crypt_set_key.
    
    Note that this is not a security bug because the memory corruption can
    only be triggered by root.
    
    Fixes: 33d2f09fcb35 ("dm crypt: introduce new format of cipher with "capi:" prefix")
    Cc: [email protected]
    Signed-off-by: Ben Cressey <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm-ebs: fix incorrect device offset check in ebs_ctr() [+ + +]
Author: Genjian Zhang <[email protected]>
Date:   Fri Aug 7 23:57:15 2026 +0800

    dm-ebs: fix incorrect device offset check in ebs_ctr()
    
    commit 7ac81e2d2240f2c57bd073b0733e0b2abca38e82 upstream.
    
    <offset> is a backing-device sector offset; ti->len is the virtual
    target length. Comparing them rejects valid tables, e.g.:
    
      dmsetup create ebs0 --table "0 1048576 ebs /dev/sda 2097152 1 8"
      -> ebs: Invalid device offset sector (-EINVAL)
    
    Drop the check. Bounds against the backing device are already
    enforced later by device_area_is_invalid() via ebs_iterate_devices().
    
    Cc: [email protected]
    Fixes: d3c7b35c20d6 ("dm: add emulated block size target")
    Signed-off-by: Genjian Zhang <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm-integrity: fix infinite loop on discard with large tag size [+ + +]
Author: Ben Cressey <[email protected]>
Date:   Thu Oct 22 15:10:12 2026 -0400

    dm-integrity: fix infinite loop on discard with large tag size
    
    [ Upstream commit 18d80c77b4c7dd20699e81cedfbbff4e9d198f28 ]
    
    When integrity_metadata handles a discard, it fills a buffer with
    DISCARD_FILLER and writes it over the tags, max_blocks blocks at a
    time. If the kmalloc fails, the buffer is the on-stack array
    checksums_onstack and max_size is set to HASH_MAX_DIGESTSIZE. So if the
    tag size is larger than HASH_MAX_DIGESTSIZE, max_blocks is zero, bi_size
    is never decremented and the loop never terminates.
    
    Fix this by using sizeof(checksums_onstack) as max_size. The array has
    MAX_TAG_SIZE bytes since commit b93b6643e9b5 ("dm integrity: fix a
    crash with unusually large tag size"), so max_blocks is at least 1.
    
    Fixes: 84597a44a9d8 ("dm integrity: add optional discard support")
    Cc: [email protected]
    Reviewed-by: Jose Fernandez (Anthropic) <[email protected]>
    Signed-off-by: Ben Cressey <[email protected]>
    Assisted-by: Claude:unspecified
    Signed-off-by: Mikulas Patocka <[email protected]>
    [ sashal: adjusted context to match the discard handler without extra_space accounting ]
    Signed-off-by: Sasha Levin <[email protected]>

dm-integrity: require stable writes for internal hash modes [+ + +]
Author: Chen Cheng <[email protected]>
Date:   Thu Oct 22 18:03:39 2026 -0400

    dm-integrity: require stable writes for internal hash modes
    
    [ Upstream commit b2fd92f016e9d692fd3c8c08d0ee014e9212279d ]
    
    dm-integrity direct, bitmap and inline internal-hash modes compute
    integrity tags from the pages carried by the write bio.  The lower data
    write also uses those pages, so the tag and the data write depend on the
    same memory contents staying unchanged while writeback is in flight.
    
    Without stable writes, a buffered writer can modify a writeback folio
    after dm-integrity has submitted the data bio and before the lower device
    has consumed the data.  After a crash, this can leave data from the later
    contents with a tag calculated from the earlier contents, causing
    permanent checksum failures on read.
    
    Set BLK_FEAT_STABLE_WRITES for internal-hash D, B and I modes so
    filesystems wait for writeback folios to become stable before modifying
    them again.  Journal mode is left unchanged because it copies data into
    the journal before computing and persisting the tag.
    
    Tested using dm-delay over a virtio-blk test disk, dm-integrity
    internal_hash:crc32c and no-journal ext4.  The D and B reproducers both
    failed with checksum errors before this change and completed with
    READ_RC=0 and zero mismatches after it.
    
    Fixes: 7eada909bfd7 ("dm: add integrity target")
    Cc: [email protected]
    Reported-by: Sun Yangkai <[email protected]>
    Link: https://github.com/chencheng-fnnas/reproducer/blob/main/dm-integrity-writeback-race.py
    Signed-off-by: Chen Cheng <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    [ sashal: Replaced BLK_FEAT_STABLE_WRITES with a per-target needs_stable_writes bit propagated through the existing queue-flag machinery. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
dm-snap: reject the transient exception store for snapshot-merge [+ + +]
Author: Ma Xinmeng <[email protected]>
Date:   Fri Sep 25 11:05:39 2026 +0800

    dm-snap: reject the transient exception store for snapshot-merge
    
    commit fcbde6227fcc53c73f08c56b2539e462d545cac6 upstream.
    
    snapshot_merge_next_chunks() calls s->store->type->prepare_merge() without
    checking it. The transient store ("N") implements neither prepare_merge nor
    commit_merge, and snapshot_ctr() validates those callbacks only on the handover
    path (__validate_exception_handover()), so a directly constructed snapshot-merge
    calls a NULL prepare_merge on resume:
    
      snapshot_merge_resume -> snapshot_merge_next_chunks -> prepare_merge(...)
    
    commit_merge() is NULL for the same reason. Userspace only issues documented
    device-mapper ioctls (CAP_SYS_ADMIN); this is a misconfiguration the kernel must
    reject rather than oops on.
    
    Reject the combination in snapshot_ctr() at table-load time (-EINVAL), the same
    check the handover path already performs; this also covers the commit_merge()
    call site, which a guard local to the prepare_merge call would miss.
    
    Tested on Linux v6.6.157 KASAN: unpatched, the dmsetup reproducer oopses in
    snapshot_merge_next_chunks(); with this patch, the table load fails with -EINVAL
    and no oops. Also present on v6.6.145; still present on the linux-dm tree
    (555f3d7be91a) and on torvalds/linux master (62f4c998b297) as of 2026-09-22.
    
    Note that this is not a security bug because only root can trigger it.
    
    Signed-off-by: Ma Xinmeng <[email protected]>
    Signed-off-by: Mikulas Patocka <[email protected]>
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
dm: fix reading free memory in do_resume [+ + +]
Author: Mikulas Patocka <[email protected]>
Date:   Tue Oct 13 10:58:20 2026 -0400

    dm: fix reading free memory in do_resume
    
    [ Upstream commit c9417c1c5269e2bd0570fbe53e4ec03a8d31f008 ]
    
    When do_resume calls dm_table_get_mode(new_map), the call is done without
    holding any locks (it only holds a reference to the md). It may be
    possible that another concurrent ioctl on the same device will swap table
    after dm_swap_table and before dm_table_get_mode. In this case,
    dm_table_get_mode(new_map) reads freed memory.
    
    This race condition was triggered by syzbot.
    
    This commit fixes the race by reading mode of the new table before
    dm_swap_table. Note that new_map is also passed to dm_ima_need_measure,
    but this function doesn't attempt to dereference it, so this call should
    be safe.
    
    Note that this is not a security bug because only root can trigger it and
    the commonly used tools such as lvm or cryptsetup do not call the ioctls
    concurrently, so that they can't trigger it acceidentally.
    
    Signed-off-by: Mikulas Patocka <[email protected]>
    Reported-by: [email protected]
    Cc: [email protected]
    [ sashal: Replaced blk_mode_t/BLK_OPEN_WRITE with fmode_t/FMODE_WRITE to match the existing API. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
dmaengine: Add devm_dma_request_chan() [+ + +]
Author: Bence Csókás <[email protected]>
Date:   Wed Sep 9 07:03:52 2026 -0400

    dmaengine: Add devm_dma_request_chan()
    
    [ Upstream commit 08bf1663c21a3e815eda28fa242d84c945ca3b94 ]
    
    Expand the arsenal of devm functions for DMA devices, this time for
    requesting channels.
    
    Signed-off-by: Bence Csókás <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Vinod Koul <[email protected]>
    Stable-dep-of: 777979e62711 ("i2c: mxs: fix DMA channel leak on probe error")
    Signed-off-by: Sasha Levin <[email protected]>

 
Drivers: hv: Don't reset VMBus connection state on error/exit paths [+ + +]
Author: Michael Kelley <[email protected]>
Date:   Mon Aug 31 20:45:14 2026 -0700

    Drivers: hv: Don't reset VMBus connection state on error/exit paths
    
    [ Upstream commit ec31dc39e835ccde0930daccece8c492d28282fc ]
    
    In two places, current code forces vmbus_connection.conn_state to
    DISCONNECTED prior to calling vmbus_disconnect(). But vmbus_disconnect()
    calls vmbus_initiate_unload(), which unloads the VMBus connection
    only if the conn_state is CONNECTED. Consequently, the connection
    remains and the Hyper-V host might continue to send messages or post
    VMBus interrupts.
    
    The problem was introduced in commit 74347a99e73ae ("x86/Hyper-V:
    Unload vmbus channel in hv panic callback"), in that
    vmbus_initiate_unload() started checking the current connection
    state before doing the unload. This commit removed some occurrences
    where conn_state was forced to DISCONNECTED, but these two remained,
    apparently due to an oversight at the time.
    
    Fix this by not forcing conn_state to DISCONNECTED during VMBus exit,
    or if a failure occurs when establishing the connection in the first
    place. Whatever value conn_state has at the time is then read by
    vmbus_initiate_unload() to determine if there is a connection to
    be unloaded.
    
    Reported-by: Sashiko <[email protected]>
    Closes: https://lore.kernel.org/linux-hyperv/[email protected]/
    Fixes: 74347a99e73ae ("x86/Hyper-V: Unload vmbus channel in hv panic callback")
    Signed-off-by: Michael Kelley <[email protected]>
    Signed-off-by: Wei Liu <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amd/display: Don't replace a sink mode that shares the native totals [+ + +]
Author: Adrian Betschart <[email protected]>
Date:   Mon Oct 12 18:05:29 2026 +0200

    drm/amd/display: Don't replace a sink mode that shares the native totals
    
    commit 54c998c55fc9cbc391b350d67b86e0c2a0748f1a upstream.
    
    decide_crtc_timing_for_drm_display_mode() copies the native mode's CRTC
    timing into the requested mode when clock, htotal and vtotal match.
    That is meant for the modes amdgpu inserts itself:
    amdgpu_dm_create_common_mode() duplicates the native mode and changes
    only hdisplay and vdisplay, so those are sent with the native timing
    and scaled.
    
    A sink can also offer a real mode with the same clock and totals as
    its native mode. CTA-861 VIC 102 (4096x2160@60) and VIC 97
    (3840x2160@60) both use 594 MHz and 4400x2250. With 3840x2160@60 as
    the preferred mode, a 4096x2160@60 request goes out with the 3840x2160
    timing and the framebuffer scaled into it (dst 3840x2025 at y=67),
    while the AVI InfoFrame still carries VIC 102. A JVC projector then
    reports 3840x2160 and shows a corrupted right edge. 4096x2160@24,
    whose totals differ, is sent and displayed correctly.
    
    Inserted modes keep the native sync positions; a real mode with its
    own active width does not. Compare those too, so only inserted modes
    are patched.
    
    Fixes: 4562236b3bc0 ("drm/amd/dc: Add dc display driver (v2)")
    Signed-off-by: Adrian Betschart <[email protected]>
    Assisted-by: Claude-Code:claude-opus-5-5
    Tested-by: Dan Wheeler <[email protected]>
    Reviewed-by: Roman Li <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 22f9a2da101c37f821cd00954f81dc598754f4d5)
    Cc: [email protected]
    (cherry picked from commit 54c998c55fc9cbc391b350d67b86e0c2a0748f1a)
    [ Adrian: this tree keeps the function in amdgpu_dm.c, with the equal-totals
      case as its own else-if; added the sync checks there. Dropped the KUnit
      test, its file does not exist here. ]
    Signed-off-by: Adrian Betschart <[email protected]>
    Assisted-by: Claude-Code:claude-opus-5-5
    Signed-off-by: Sasha Levin <[email protected]>

drm/amd/display: Mark DCE 6.4 as not APU [+ + +]
Author: Timur Kristóf <[email protected]>
Date:   Mon Oct 5 10:41:08 2026 -0400

    drm/amd/display: Mark DCE 6.4 as not APU
    
    [ Upstream commit 3a52d587d1fc8e8bf94ba1b07374f7ec91aaffb4 ]
    
    DCE 6.4 is found in Oland chips, which were advertised
    as low-end gaming GPUs in 2013~2015 and then have been
    sold as low-end workstation GPUs until 2017~2019.
    
    These are not APUs.
    
    Fixes: 7c15fd86aaec ("drm/amd/display: dc/dce: add initial DCE6 support (v10)")
    Signed-off-by: Timur Kristóf <[email protected]>
    Reviewed-by: Mario Limonciello <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mario Limonciello <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 1072aa811ea1e61d5f763e4ec1bc6d24bb61f14a)
    Cc: [email protected]
    [ sashal: adjusted context in dce64_construct() due to missing debug and check_config initializations ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amd/pm/si: Check AMD_IS_MOBILITY flag for PPSMC_SYSTEMFLAG_GPIO_DC [+ + +]
Author: Timur Kristóf <[email protected]>
Date:   Mon Oct 5 06:56:47 2026 -0400

    drm/amd/pm/si: Check AMD_IS_MOBILITY flag for PPSMC_SYSTEMFLAG_GPIO_DC
    
    [ Upstream commit cd883d0a3937df82a5ea03709ba8ba623b868419 ]
    
    Unfortunately, some desktop boards eg. the FirePro D500
    have the HARDWAREDC platform flag set and also have
    a battery power state configured in their VBIOS.
    This makes no sense for a desktop GPU and results in
    incorrect behaviour: the clocks are stuck at lowest.
    
    We observed that the kernel driver can work around
    the issue in two possible ways:
    1. Set PPSMC_SWSTATE_FLAG_DC on all power states
    2. Clear PPSMC_SYSTEMFLAG_GPIO_DC
    
    We think that the PPSMC_SYSTEMFLAG_GPIO_DC flag
    makes the SMC assume it's running on battery even
    though this is a desktop machine with no battery,
    and that's why it doesn't do DPM on power states
    without PPSMC_SYSTEMFLAG_GPIO_DC.
    
    Issue was uncovered by "Fix updating clock limits from
    power states" because previously the limits for the
    battery state were not tracked separately. However,
    battery power state has lower frequencies and voltages,
    so the kernel doesn't set the DC flag on the current
    power state anymore. That causes the SMC to be stuck
    on the lowest clocks.
    
    Let's clear PPSMC_SYSTEMFLAG_GPIO_DC on desktop GPUs.
    We can use the AMD_IS_MOBILITY flag to determine that.
    
    Fixes: e6c5d36756e7 ("drm/amd/pm/si: Fix updating clock limits from power states")
    Closes: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/16352
    Signed-off-by: Timur Kristóf <[email protected]>
    Reviewed-by: Mario Limonciello <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mario Limonciello <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 58473c7c49ce9f5f5a4a1c24ffb9aa1d3c8771f4)
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amd/pm/si: Fix updating clock limits on AC/DC [+ + +]
Author: Timur Kristóf <[email protected]>
Date:   Mon Oct 5 09:49:12 2026 -0400

    drm/amd/pm/si: Fix updating clock limits on AC/DC
    
    [ Upstream commit 08c9100f65299c64439e22e6057d750ae0e6c660 ]
    
    Assume that the AC limits are the maximum of all power states,
    and the DC limits are the maximum of battery power states.
    This shouldn't make any difference in practice, but is
    cleaner and more robust against bogus information in the VBIOS.
    
    Fixes: e6c5d36756e7 ("drm/amd/pm/si: Fix updating clock limits from power states")
    Signed-off-by: Timur Kristóf <[email protected]>
    Reviewed-by: Mario Limonciello <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mario Limonciello <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit ef8cb9dcc7db7b7abcbdbe870a080cc81e4f0bf3)
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amd/powerplay: fix VoltageObjectInfo zero-stride loop and OOB read [+ + +]
Author: Asad Kamal <[email protected]>
Date:   Tue Jun 23 00:25:04 2026 +0800

    drm/amd/powerplay: fix VoltageObjectInfo zero-stride loop and OOB read
    
    [ Upstream commit 5d3cc8e388464f485d0944b87b8f9426e637d082 ]
    
    Reject voltage objects whose usSize is smaller than the header or would
    advance the cursor past the table end, preventing an infinite loop or
    heap OOB read when the VBIOS supplies a malformed VoltageObjectInfo table.
    
    Fixes: c82baa281843 ("drm/amd/powerplay: add Tonga dpm support (v3)")
    Fixes: 0d2c7569e196 ("drm/amdgpu: add new atomfirmware based helpers for powerplay")
    Signed-off-by: Asad Kamal <[email protected]>
    Reviewed-by: Lijo Lazar <[email protected]>
    Reviewed-by: Yang Wang <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amdgpu/gfx6: fix firmware leak on teardown [+ + +]
Author: Willian Oliveira <[email protected]>
Date:   Mon Oct 5 10:57:08 2026 -0400

    drm/amdgpu/gfx6: fix firmware leak on teardown
    
    [ Upstream commit cc172e177795c5f87bc2d71768d077e1c10633e8 ]
    
    The firmware requested in gfx_v6_0_init_microcode() is not released
    when the GFX block is torn down, leaking the firmware resources.
    
    Add gfx_v6_0_free_microcode() and call it from gfx_v6_0_sw_fini()
    to release the PFP, ME, CE and RLC firmware.
    
    Signed-off-by: Willian Oliveira <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 386e81346f95ab0be5a82c5535de932e7a456924)
    Cc: [email protected]
    [ sashal: Replaced unavailable amdgpu_ucode_release() calls with inline release_firmware() calls and NULL assignments. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/amdgpu/sdma3: Work around POLL_REGMEM / FENCE hang [+ + +]
Author: Timur Kristóf <[email protected]>
Date:   Wed Oct 7 00:02:52 2026 +0200

    drm/amdgpu/sdma3: Work around POLL_REGMEM / FENCE hang
    
    commit 752480ad62964edf0254e151110d3e53a7cb37de upstream.
    
    SDMA can randomly hang on Polaris 10. Hard to reproduce,
    but has been occurring sporadically in the Mesa CI
    on the RADV Polaris 10 job even when Mesa isn't using
    the SDMA engine.
    
    When Mesa actually uses the SDMA on Polaris, the hang
    becomes more frequent and the reproduction rate goes up
    significantly in the CI system.
    
    We don't know why the hangs occur, but it seems
    that inserting a single NOP packet before each
    POLL_REGMEM and FENCE packet works around it.
    At the moment it's unclear which GPUs are affected,
    so let's apply this to SDMA 3.x for now.
    
    Note that this issue is not documented or acknowledged by AMD.
    
    Reviewed-by: Alex Deucher <[email protected]>
    Signed-off-by: Timur Kristóf <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit c343a27ed90823d08de125f7c447d96d056b75d9)
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/amdgpu: don't drop the runtime PM reference twice in amdgpu_gpr [+ + +]
Author: Jesse Zhang <[email protected]>
Date:   Fri Oct 9 13:21:33 2026 +0800

    drm/amdgpu: don't drop the runtime PM reference twice in amdgpu_gpr
    
    commit de9f6bcdb44f0e410031002e2f103826ea6b6259 upstream.
    
    amdgpu_debugfs_gpr_read() drops its runtime PM reference right after
    reading the wave registers. When copying them to userspace fails, it
    jumps to the err label, which drops the reference a second time. A read
    into a bad buffer on Navi31 either steals a reference somebody else
    holds (power/runtime_usage goes from 1 to 0) or underflows the count:
    
      amdgpu 0000:03:00.0: Runtime PM usage count underflow!
    
    The registers are already in the kernel buffer at that point, so finish
    the hardware access first and copy the buffer with a single
    copy_to_user() instead of the put_user() loop with its own error path.
    
    Fixes: 9eee152aab56 ("drm/amdgpu/debugfs: fix ref count leak when pm_runtime_get_sync fails")
    Reviewed-by: Alex Deucher <[email protected]>
    Signed-off-by: Jesse Zhang <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 31035bbd74f7c3e10c163db875b8e67f8b50ee6a)
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

drm/amdgpu: fix ACP MFD device leak on init failure [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Mon Oct 5 10:30:12 2026 -0400

    drm/amdgpu: fix ACP MFD device leak on init failure
    
    [ Upstream commit f0013046151b7467e62c471c1c83d63ea255799c ]
    
    acp_hw_init() registers ACP child devices with mfd_add_devices() before
    attaching them to the ACP power domain and initializing the hardware.
    
    If attaching a child to the power domain fails, or if the ACP reset or
    clock enable operation times out, the failure path frees only the
    source cell, resource, and platform-data allocations. The child
    platform devices already registered by mfd_add_devices() remain
    registered and are never released.
    
    Remove the children from the power domain and unregister the MFD
    devices on failures that occur after mfd_add_devices() succeeds. Keep
    mfd_add_devices() failures on the existing cleanup path since the MFD
    core already rolls back partially registered children itself.
    
    The issue was identified by a static analysis tool I developed and
    confirmed by manual review.
    
    Fixes: 25030321ba28 ("drm/amd: add pm domain for ACP IP sub blocks")
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 63da68d6a2279ec945581c990c5a59a5ae8b5560)
    Cc: [email protected]
    [ sashal: adapted the error-path changes to the single device_for_each_child() call in acp_hw_init(). ]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: Fix runtime PM leak in amdgpu_debugfs_test_ib_show() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Tue Sep 29 12:41:05 2026 -0400

    drm/amdgpu: Fix runtime PM leak in amdgpu_debugfs_test_ib_show()
    
    [ Upstream commit 2b86ab1bd6673c525adda88819d7658ba9e784ec ]
    
    amdgpu_debugfs_test_ib_show() resumes the device with
    pm_runtime_get_sync() before taking the reset domain semaphore with
    down_write_killable().  If the write lock acquisition is interrupted,
    the function returns without calling pm_runtime_put_autosuspend(),
    leaking the runtime PM reference acquired for the device and keeping
    the GPU awake.
    
    Drop the runtime PM reference on the interrupted down_write_killable()
    error path before returning.
    
    Fixes: 6049db43d6dd ("drm/amdgpu: change reset lock from mutex to rw_semaphore")
    Signed-off-by: Wentao Liang <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit ec30a576c2d4c0364549e6c04218f50704ef56c8)
    Cc: [email protected]
    [ Adapted `down_write_killable(&adev->reset_domain->sem)` to `down_read_killable(&adev->reset_sem)`. ]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: Fix VCE 3 ring align_mask [+ + +]
Author: David Rosca <[email protected]>
Date:   Thu Aug 20 16:32:51 2026 +0200

    drm/amdgpu: Fix VCE 3 ring align_mask
    
    [ Upstream commit 2ee9836545e690c9e66ec203445d7705959fd7a8 ]
    
    The largest frame is 20 dwords, so 0xf mask is too small.
    This was always wrong, but we were lucky with the VCE_CMD_END
    commands inserted after fence and vm_flush.
    
    Fixes: 8897ea8c761b ("drm/amdgpu: Implement insert_end for VCE 3")
    Cc: [email protected]
    Acked-by: Alex Deucher <[email protected]>
    Signed-off-by: David Rosca <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: make Mac FB workaround generic [+ + +]
Author: Alex Deucher <[email protected]>
Date:   Fri Sep 25 09:16:26 2026 -0400

    drm/amdgpu: make Mac FB workaround generic
    
    commit c7f44ec5c4ec760e74351f1843dcb8322f67cbf6 upstream.
    
    Rather than adding a case of every chip where this is seen
    just check if the FB is at 0 and the ssid is apple.  This
    should cover all chips which fall into this case.
    
    Tested-by: Ayhan Çiçek <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit c54e4d10507722398dc90cf3c532e50b86cf425a)
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

drm/amdgpu: reset VI ASIC on MacBookPro14,3 [+ + +]
Author: Francisco Beltrán Millalén <[email protected]>
Date:   Mon Oct 5 11:02:01 2026 -0400

    drm/amdgpu: reset VI ASIC on MacBookPro14,3
    
    [ Upstream commit a22e5e4f2ebbdbb962cc3233094d189c4dfaa051 ]
    
    On a MacBookPro14,3 with a Radeon Pro 555 (Polaris11), the framebuffer
    is at MC address 0 when amdgpu loads after a cold boot, as the firmware
    leaves it (MC_VM_FB_LOCATION = 0x007f0000), while the VBIOS ASIC_Init
    table places it at 0xF4_0000_0000 (0xf47ff400).  amdgpu reads the
    location once, at init, so after a re-POST (S3 resume or GPU reset)
    the framebuffer has moved and the driver keeps programming the old
    one: the SMU is handed a table that was never written and the GPU
    does not come back, which leaves the internal panel black.
    
    Resetting the ASIC on load makes ASIC_Init run before the driver reads
    the location, so the driver uses the VBIOS placement from the start and
    every later re-POST puts the framebuffer back where it already is.
    
    Add the Radeon Pro 555 used in this machine to the existing VI reset
    quirk table.
    
    Tested on a MacBookPro14,3 on 6.18.49 with the quirk table backported
    (the kernel also carries unrelated local PCI and ACPI patches for this
    machine).  The framebuffer is at 0x000000F400000000 after both cold and
    warm boot, and the GPU survived 9 S3 cycles (lid close and rtcwake, one
    of them with the lid closed for about 7.5 minutes and a USB-C disk
    attached), each followed by a few minutes of 3D load; no ring timeouts
    or VM faults were reported.  The reset adds about 0.23 s to amdgpu init.
    
    Suggested-by: Christian König <[email protected]>
    Suggested-by: Alex Deucher <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Francisco Beltrán Millalén <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit b6b1d97218518003107d4446fac278fa3e0a19a0)
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

drm/amdgpu: reset VI ASIC on MacBookPro15,1 [+ + +]
Author: Andre Eikmeyer <[email protected]>
Date:   Mon Oct 5 11:02:00 2026 -0400

    drm/amdgpu: reset VI ASIC on MacBookPro15,1
    
    [ Upstream commit a5be7ad8f5f0e067613e9197638f216f46252946 ]
    
    After S3, reloading amdgpu on MacBookPro15,1 systems with a Radeon Pro
    555X or 560X fails while loading the SMU firmware. The existing SMC
    register check does not request a reset because the registers do not
    reliably reflect the stale SMU state on these machines.
    
    Frederick Morlock found that forcing a VI ASIC reset allows the driver to
    initialize again. This patch limits his workaround to the exact PCI
    device, Apple subsystem device and revision combinations used by these
    two GPUs, leaving other VI hardware unchanged.
    
    Suggested-by: Frederick Morlock <[email protected]>
    Signed-off-by: Andre Eikmeyer <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    Stable-dep-of: a22e5e4f2ebb ("drm/amdgpu: reset VI ASIC on MacBookPro14,3")
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/aspeed: Balance the display clock enable on teardown [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Sun Sep 13 18:30:19 2026 -0400

    drm/aspeed: Balance the display clock enable on teardown
    
    [ Upstream commit ecce445c6489895463b7ddec2af66338287fee4c ]
    
    aspeed_gfx_load() enables the display clock without checking the return
    value and never disables it on probe failure or removal. devm_clk_get()
    only releases the clock reference, leaving the enable unbalanced.
    
    Use devm_clk_get_enabled() to handle enable failures and automatically
    disable and unprepare the clock on probe failure or removal.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: 4f2a8f5898ec ("drm: Add ASPEED GFX driver")
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Assisted-by: OpenAI:GPT-5.6
    Reviewed-by: Thomas Zimmermann <[email protected]>
    Signed-off-by: Thomas Zimmermann <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/fb-helper: defer setup when fbdev_probe() fails, not just on -EAGAIN [+ + +]
Author: Nguyen Ngoc Thang <[email protected]>
Date:   Tue Oct 13 14:58:33 2026 -0400

    drm/fb-helper: defer setup when fbdev_probe() fails, not just on -EAGAIN
    
    [ Upstream commit 755c94d178b7e972bb766199d34e4ba4f63a89eb ]
    
    __drm_fb_helper_initial_config_and_unlock() calls
    drm_client_modeset_probe() first, which already fills in each
    mode_set->mode/num_connectors for every connected output, and only
    afterwards calls drm_fb_helper_single_fb_probe() to create
    fb_helper->fb and wire it into those mode_sets via
    drm_setup_crtcs_fb().
    
    If drm_fb_helper_single_fb_probe() fails with anything other than
    -EAGAIN (e.g. dev->driver->fbdev_probe() itself fails), the function
    bails out before drm_setup_crtcs_fb() runs and before setting
    fb_helper->deferred_setup. The client is left with mode_sets that
    have a mode and connectors but mode_set->fb == NULL, and nothing
    marks this fb_helper as needing a retry.
    
    __drm_fb_helper_restore_fbdev_mode_unlocked() only skips committing
    when fb_helper->deferred_setup is set, so a later .restore() call
    (drm_lastclose() on process exit, in this report) commits the stale
    mode_set through drm_client_modeset_commit() ->
    drm_client_modeset_commit_atomic() -> __drm_atomic_helper_set_config(),
    which hits WARN_ON(!set->fb).
    
    Mark fb_helper->deferred_setup on any drm_fb_helper_single_fb_probe()
    failure, not just -EAGAIN, so restore keeps skipping the commit until
    a later hotplug event successfully re-probes and re-populates
    mode_set->fb. The real error code is still returned to the caller
    unchanged.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=ca23c8570669ead78867
    Fixes: ca91a2758fce ("drm/fb-helper: Support deferred setup")
    Cc: [email protected]
    Signed-off-by: Nguyen Ngoc Thang <[email protected]>
    Signed-off-by: Thomas Zimmermann <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Link: https://patch.msgid.link/[email protected]
    [ sashal: adapted the error path to preserve the existing preferred_bpp = bpp_sel assignment. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/i915/dmc: Harden DMC firmware payload parsing [+ + +]
Author: Dibin Moolakadan Subrahmanian <[email protected]>
Date:   Thu Oct 22 12:26:53 2026 -0400

    drm/i915/dmc: Harden DMC firmware payload parsing
    
    [ Upstream commit 8bb1858db453cd4250e3b633f5d2d09206024ca6 ]
    
    Validate the conversion of the DMC firmware size from dwords to bytes
    using check_mul_overflow() before calculating the firmware payload size.
    
    Reject zero-length payloads and zero MMIO counts in the DMC firmware
    header so malformed firmware is caught early. Also set dmc_fw_size only
    after the payload allocation succeeds.
    
    Fixes: eb805623d8b1 ("drm/i915/skl: Add support to load SKL CSR firmware.")
    Cc: [email protected]
    Assisted-by: Claude-Code:Sonnet-5
    Signed-off-by: Dibin Moolakadan Subrahmanian <[email protected]>
    Reviewed-by: Mitul Golani<[email protected]>
    Signed-off-by: Ankit Nautiyal <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    (cherry picked from commit efde6601a1f1daedfe3dcc2816c934ddb44e3eef)
    Signed-off-by: Joonas Lahtinen <[email protected]>
    [ sashal: adapted parse_dmc_fw_header() changes to the existing parse_csr_fw_dmc() implementation ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/i915/gem: Prevent overstepping exec array boundary [+ + +]
Author: Krzysztof Karas <[email protected]>
Date:   Fri Sep 11 06:11:45 2026 +0000

    drm/i915/gem: Prevent overstepping exec array boundary
    
    commit ebe162db655881a38de43301151ff7ac940602b5 upstream.
    
    It is possible for eb_relocate_parse_slow() to call kvfree() on
    entries outside the original exec array during following
    scenario inside eb_relocate_parse_slow():
    
    1) eb_copy_relocations() allocates as many as eb->buffer_count
       copies for exec entries;
    2) eb_parse() appends up to two VMAs, right after incrementing
       eb->buffer_count;
    3) cleanup under "out" label uses this incremented buffer_count
       to release relocation pointers from exec array via kvfree(),
       not from VMA array.
    
    To amend this problem, ensure that relocation cleanup uses the
    original exec object count, excluding the VMAs appended by the
    command parser.
    
    Fixes: 8e4ba491b0ba ("drm/i915: Parse command buffer earlier in eb_relocate(slow)")
    Signed-off-by: Krzysztof Karas <[email protected]>
    Assisted-by: GitHub-Copilot:gpt-6-astra
    Cc: [email protected] # 5.10+
    Reviewed-by: Andi Shyti <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    (cherry picked from commit 2a0158925fb943c7ba8f3216e2734952128defc9)
    Signed-off-by: Jani Nikula <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/i915/gt: Unmask interrupts only when ACTIVE is true [+ + +]
Author: Krzysztof Karas <[email protected]>
Date:   Tue Oct 13 14:36:58 2026 -0400

    drm/i915/gt: Unmask interrupts only when ACTIVE is true
    
    [ Upstream commit 5346b1cec6afa4f9b4b49a9f84e3cfef95a3f7bb ]
    
    There is a small race window between intel_rps_boost() reading
    a stale ACTIVE state and queuing rps->work, where ACTIVE may be
    changed via asynchronous calls triggered by wakeref drop.
    This means that rps_work() could be triggered after the GT has
    been parked, so unmasking RPS PM interrupts would happen without
    holding PM wakelock. This sequence of events may be observed
    during live_rc6_ctx_wa() selftest:
    
    1) live_rc6_ctx_wa()
       -> intel_engine_pm_put()
          -> wakeref_put()
    
    ASYNC1) wakeref_put() callback
              -> __engine_park()
                 -> intel_gt_pm_put_async()
                    -> intel_gt_pm_put_async_untracked()
                       -> intel_wakeref_put_async()
    
    ASYNC2) wakeref_put_async() callback
              -> __gt_park()
                 -> intel_rps_park()
                    -> intel_rps_clear_active() [clear ACTIVE]
                    WITH INTERRUPTS:
                    -> rps_disable_interrupts()
                       -> cancel_work_sync(rps->work)
                       -> rps_reset_interrupts() [rps->pm_iir = 0]
                    WITHOUT INTERRUPTS (TIMER mode):
                    -> rps_stop_timer()
                       -> cancel_work_sync(rps->work)
    
    2) live_rc6_ctx_wa()
       -> intel_gt_wait_for_idle()
          -> intel_gt_retire_requests_timeout()
             -> dma_fence_wait_timeout()
                -> ops->wait() [i915_fence_wait()]
                   -> i915_request_wait_timeout()
                      -> intel_rps_boost()
                         -> intel_rps_is_active() [check ACTIVE]
                            [OPEN RACE WINDOW]
                         -> queue_work(rps->work)
             -> retire_requests()
                -> i915_request_retire()
                   -> intel_rps_dec_waiters() [from 1 to 0]
    
    If ASYNC1 and ASYNC2 would execute during [OPEN RACE WINDOW],
    then:
    
    3) rps_work() executes from the workqueue and may satisfy
       "(!pm_iir && !client_boost)" test (in TIMER mode rps->pm_iir
       is zeroed by an earlier rps_work() call or never gets a new
       value after previous intel_rps_unpark() event), so it jumps
       to "out" label, bypassing intel_rps_is_active() guard and
       executes gen6_gt_pm_unmask_irq();
    
    4) GT is parked and runtime PM wakelock is dropped, so only
       a raw reference in __gt_park() ->
       intel_display_power_put_async() remains for 100ms, then the
       MMIO write in gen6_gt_pm_unmask_irq() detects missing
       wakelock via assert_rpm_wakelock_held() and emits
       "RPM wakelock ref not held during HW access" tainting kernel.
    
    Commit 3e7abf814193 ("drm/i915: Extract GT render power state management")
    dropped the "if (rps->interrupts_enabled)" guard that
    gen6_pm_rps_work() had around this unmask in i915_irq.c.
    INTEL_RPS_ACTIVE brackets the same window, since it is set in
    intel_rps_unpark() before rps_enable_interrupts() and
    rps_start_timer() and cleared in intel_rps_park() before
    rps_stop_timer() and rps_disable_interrupts().
    
    Skip unmasking when RPS is no longer active (reaching unmask
    operation is independent of INTERRUPT mode). This does not
    prevent RPS operation from resuming on the next unpark.
    In interrupt mode, intel_rps_unpark() calls
    rps_enable_interrupts(), which enables and unmasks the PM
    interrupts. In timer mode, it calls rps_start_timer(),
    restarting periodic engine-busyness evaluation. The timer
    generates software RPS events and queues rps_work() directly,
    independently of PM interrupt delivery. Neither mode requires
    the late worker to unmask interrupts while the GT is parked
    
    Fixes: 3e7abf814193 ("drm/i915: Extract GT render power state management")
    Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/16562
    Cc: [email protected] # v5.5+
    Assisted-by: GitHub-Copilot:claude-opus-5
    Assisted-by: GitHub-Copilot:gpt-6-astra
    Signed-off-by: Krzysztof Karas <[email protected]>
    Reviewed-by: Andi Shyti <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    (cherry picked from commit ca4a6deadad15b91ee083afe445fa6bdbfb68206)
    Signed-off-by: Jani Nikula <[email protected]>
    [ sashal: adjusted locking context to use >->irq_lock instead of gt->irq_lock ]
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/msm/adreno: Assign msm_gpu->pdev earlier to avoid nullptrs [+ + +]
Author: Konrad Dybcio <[email protected]>
Date:   Tue Jul 9 13:15:40 2024 +0200

    drm/msm/adreno: Assign msm_gpu->pdev earlier to avoid nullptrs
    
    [ Upstream commit 16007768551d5bfe53426645401435ca8d2ef54f ]
    
    There are some cases, such as the one uncovered by Commit 46d4efcccc68
    ("drm/msm/a6xx: Avoid a nullptr dereference when speedbin setting fails")
    where
    
    msm_gpu_cleanup() : platform_set_drvdata(gpu->pdev, NULL);
    
    is called on gpu->pdev == NULL, as the GPU device has not been fully
    initialized yet.
    
    Turns out that there's more than just the aforementioned path that
    causes this to happen (e.g. the case when there's speedbin data in the
    catalog, but opp-supported-hw is missing in DT).
    
    Assigning msm_gpu->pdev earlier seems like the least painful solution
    to this, therefore do so.
    
    Signed-off-by: Konrad Dybcio <[email protected]>
    Patchwork: https://patchwork.freedesktop.org/patch/602742/
    Signed-off-by: Rob Clark <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/msm/dsi: do not enable PHYs when called for the slave DSI interface [+ + +]
Author: Dmitry Baryshkov <[email protected]>
Date:   Sat Sep 12 11:08:44 2026 -0400

    drm/msm/dsi: do not enable PHYs when called for the slave DSI interface
    
    [ Upstream commit a14440042fe8dac6b7c507a946f46a6f50c9c05d ]
    
    Move the call to dsi_mgr_phy_enable after checking whether the DSI
    interface is slave, so that PHY enablement happens together with the
    host enablement.
    
    Signed-off-by: Dmitry Baryshkov <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Rob Clark <[email protected]>
    Stable-dep-of: 6cd33b6f4155 ("drm/msm/dsi: round 6G byte clock rate to the PLL-achievable value")
    Signed-off-by: Sasha Levin <[email protected]>

drm/msm/dsi: rename dual DSI to bonded DSI [+ + +]
Author: Dmitry Baryshkov <[email protected]>
Date:   Sat Sep 12 11:08:45 2026 -0400

    drm/msm/dsi: rename dual DSI to bonded DSI
    
    [ Upstream commit 6183606da324b934166e7b47c3be6176fa86f9ff ]
    
    We are preparing to support two independent DSI hosts in the DSI/DPU
    code. To remove possible confusion (as both configurations can be
    referenced as dual DSI) let's rename old "dual DSI" (two DSI hosts
    driving single device, with clocks being locked) to "bonded DSI".
    
    Signed-off-by: Dmitry Baryshkov <[email protected]>
    Reviewed-by: Abhinav Kumar <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Bjorn Andersson <[email protected]>
    [DB: add one extra hunk added by one previous patches]
    Signed-off-by: Dmitry Baryshkov <[email protected]>
    Signed-off-by: Rob Clark <[email protected]>
    
    [5.10 dependency adaptation: keep the existing PHY/PLL interfaces and
    rename the stable-only source PLL selection to IS_BONDED_DSI(). Apply
    the 10nm, 14nm and 7nm PLL comment changes in dsi/pll/, where that code
    lives in this tree. Omit the test-pattern hunk and newer host declarations,
    which have no implementation here. No functions or clock behavior are
    added. The resulting host names let the target byte-clock rounding patch
    apply without further changes.]
    
    [ sashal: Reduced backport -- upstream 6183606da324b touches 8 file(s), this
      backport carries 8. Not backported here:
      drivers/gpu/drm/msm/dsi/phy/dsi_phy_10nm.c
      drivers/gpu/drm/msm/dsi/phy/dsi_phy_14nm.c
      drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c
      This note is generated from the file lists only; see the resolution record
      for the reasoning. ]
    
    Stable-dep-of: 6cd33b6f4155 ("drm/msm/dsi: round 6G byte clock rate to the PLL-achievable value")
    Signed-off-by: Sasha Levin <[email protected]>

drm/msm/dsi: round 6G byte clock rate to the PLL-achievable value [+ + +]
Author: Kavan Smith <[email protected]>
Date:   Sat Sep 12 11:08:46 2026 -0400

    drm/msm/dsi: round 6G byte clock rate to the PLL-achievable value
    
    [ Upstream commit 6cd33b6f4155efc20485929fd0b56bb704641db9 ]
    
    MSM8916 runtime DSI commands still go through
    msm_dsi_host_xfer_prepare(), which re-applies the link clock rate before
    enabling the link clocks. That is fine in principle, but on DSI 6G the
    requested byte clock rate often does not exactly match the DSI PHY PLL's
    realizable rate. For example, the driver can request 56250000 Hz while the
    PLL actually runs at 56246337 Hz.
    
    Because the requested and actual rates differ slightly, every later
    link_clk_set_rate() call is treated as a real clock change and re-locks
    the PLL. On a video-mode panel without an internal timing generator, such
    as samsung,s6d7aa0 / lsl080al03 on MSM8916, that live-clock glitch makes
    the panel lose pixel lock and visibly corrupts scanout on each runtime DCS
    command, including backlight writes.
    
    Fix this by rounding the computed 6G byte clock rate up front, before it is
    stored in msm_host->byte_clk_rate and reused by later transfers. Once the
    host carries the PLL-achievable rate instead of the idealized one,
    repeated link_clk_set_rate() calls become no-ops in the common clock
    framework and no longer re-lock the PLL.
    
    This keeps the normal transfer callback sequencing intact, preserves the
    OPP vote path in link_clk_set_rate(), and matches the fix direction
    suggested in the original 2018 discussion.
    
    Reported-by: Daniel Mack <[email protected]>
    Closes: https://lore.kernel.org/all/[email protected]/
    Fixes: 6b16f05aa39f ("drm/msm/dsi: Split clk rate setting and enable")
    Cc: [email protected]
    Signed-off-by: Kavan Smith <[email protected]>
    Reviewed-by: Dmitry Baryshkov <[email protected]>
    Patchwork: https://patchwork.freedesktop.org/patch/738234/
    Link: https://lore.kernel.org/r/[email protected]
    [DB: dropped extra chunk from the patch]
    Signed-off-by: Dmitry Baryshkov <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/nouveau: don't bump pin count on failed re-pin in nouveau_bo_pin_locked() [+ + +]
Author: Peiyang He <[email protected]>
Date:   Tue Sep 29 14:47:19 2026 -0400

    drm/nouveau: don't bump pin count on failed re-pin in nouveau_bo_pin_locked()
    
    [ Upstream commit 6a6870d3077faa501ca97760057ddca22b68418d ]
    
    nouveau_bo_pin_locked() checks whether an already pinned BO is in a
    memory domain compatible with a new pin request. When the domains are
    incompatible, it sets -EBUSY but still calls ttm_bo_pin() before
    returning.
    
    Callers treat a failed nouveau_bo_pin() as not having acquired a new pin,
    so the extra pin count is never decreased by a matching unpin.
    This triggers the warning in ttm_bo_release():
    
            WARN_ON_ONCE(bo->pin_count);
    
    Found when fuzzing the nouveau driver with a modified Syzkaller:
    
            WARNING: drivers/gpu/drm/ttm/ttm_bo.c:256 at ttm_bo_release+0x827/0x9e0 drivers/gpu/drm/ttm/ttm_bo.c:256, CPU#1: syz.3.24/2212
            Modules linked in:
            CPU: 1 UID: 0 PID: 2212 Comm: syz.3.24 Not tainted 7.2.0 #24 PREEMPT(lazy)
            nouveau 0000:01:00.0: gsp:msg fn:103 len:0x40/0x20 res:0x19 resp:0x19
            Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
            RIP: 0010:ttm_bo_release+0x827/0x9e0 drivers/gpu/drm/ttm/ttm_bo.c:256
            Code: 02 00 0f 85 51 01 00 00 48 8b 7b 08 e8 d2 20 01 00 e9 80 fd ff ff e8 d8 15 c0 fe 90 0f 0b 90 e9 e1 f8 ff ff e8 ca 15 c0 fe 90 <0f> 0b 90 e9 a4 f8 ff ff e8 bc 15 c0 fe be 03 00 00 00 4c 89 e7 e8
            msg: 00000000: 05 00 d0 c1 04 00 f0 f1 01 30 00 00 2d 90 00 00  .........0..-...
            RSP: 0018:ffffc9000f5cf710 EFLAGS: 00010293
            RAX: 0000000000000000 RBX: ffff888018e5d2a8 RCX: ffffffff82bb1b36
            RDX: ffff888017b68000 RSI: 0000000000000004 RDI: ffff888018e5d2a8
            msg: 00000010: 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
            RBP: ffff88801261c720 R08: 0000000000000001 R09: ffffed10031cba55
            R10: ffff888018e5d2ab R11: 00000000000000f3 R12: ffff888018e5d290
            R13: ffff888018e5d2d4 R14: ffff88801b219c18 R15: dffffc0000000000
            FS:  0000000000000000(0000) GS:ffff8880e0f6f000(0000) knlGS:0000000000000000
            CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
            CR2: 0000001b31223ffc CR3: 0000000028e00005 CR4: 0000000000770ef0
            PKRU: 80000000
            Call Trace:
            <TASK>
            kref_put include/linux/kref.h:65 [inline]
            ttm_bo_put drivers/gpu/drm/ttm/ttm_bo.c:325 [inline]
            ttm_bo_fini+0x55/0x80 drivers/gpu/drm/ttm/ttm_bo.c:330
            nouveau_gem_object_del+0xb2/0x1b0 drivers/gpu/drm/nouveau/nouveau_gem.c:90
            drm_gem_object_free+0x5f/0x90 drivers/gpu/drm/drm_gem.c:1165
            kref_put include/linux/kref.h:65 [inline]
            __drm_gem_object_put include/drm/drm_gem.h:562 [inline]
            drm_gem_object_put include/drm/drm_gem.h:575 [inline]
            nouveau_abi16_chan_fini.constprop.0+0x44f/0x5a0 drivers/gpu/drm/nouveau/nouveau_abi16.c:195
            nouveau 0000:01:00.0: syz.2.23[2209]: Unknown handle 0x00000000
            nouveau_abi16_fini+0x1d0/0x340 drivers/gpu/drm/nouveau/nouveau_abi16.c:225
            nouveau_drm_postclose+0x18b/0x3e0 drivers/gpu/drm/nouveau/nouveau_drm.c:1284
            nouveau 0000:01:00.0: syz.2.23[2209]: validate_init
            drm_file_free.part.0+0x6d6/0xb60 drivers/gpu/drm/drm_file.c:267
            drm_file_free drivers/gpu/drm/drm_file.c:237 [inline]
            drm_close_helper.isra.0+0x11a/0x160 drivers/gpu/drm/drm_file.c:290
            drm_release+0x1ab/0x330 drivers/gpu/drm/drm_file.c:438
            __fput+0x39c/0xa60 fs/file_table.c:512
            nouveau 0000:01:00.0: syz.2.23[2209]: validate: -2
            task_work_run+0x15a/0x230 kernel/task_work.c:233
            exit_task_work include/linux/task_work.h:40 [inline]
            do_exit+0x82b/0x25a0 kernel/exit.c:1009
            do_group_exit+0xc2/0x280 kernel/exit.c:1152
            get_signal+0x1d6e/0x1f30 kernel/signal.c:3046
            arch_do_signal_or_restart+0x7d/0x6e0 arch/x86/kernel/signal.c:337
            __exit_to_user_mode_loop kernel/entry/common.c:66 [inline]
            exit_to_user_mode_loop+0xdf/0x440 kernel/entry/common.c:101
            __exit_to_user_mode_prepare include/linux/irq-entry-common.h:207 [inline]
            syscall_exit_to_user_mode_prepare include/linux/irq-entry-common.h:230 [inline]
            syscall_exit_to_user_mode include/linux/entry-common.h:318 [inline]
            do_syscall_64+0x4f8/0x690 arch/x86/entry/syscall_64.c:100
            entry_SYSCALL_64_after_hwframe+0x77/0x7f
            RIP: 0033:0x7f12bac8594d
            Code: Unable to access opcode bytes at 0x7f12bac85923.
            RSP: 002b:00007f12b96e70d8 EFLAGS: 00000246 ORIG_RAX: 00000000000000ca
            RAX: 0000000000000001 RBX: 00007f12baf15fa8 RCX: 00007f12bac8594d
            RDX: 00000000000f4240 RSI: 0000000000000081 RDI: 00007f12baf15fac
            RBP: 00007f12baf15fa0 R08: 00007f12baee8000 R09: 0000000000000000
            R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
            R13: 00007f12baf16038 R14: 0000000000000006 R15: 00007ffe2ed394b0
            </TASK>
            irq event stamp: 47867
            hardirqs last  enabled at (47883): [<ffffffff815cafc6>] __up_console_sem+0x66/0x70 kernel/printk/printk.c:347
            hardirqs last disabled at (47892): [<ffffffff815cafab>] __up_console_sem+0x4b/0x70 kernel/printk/printk.c:345
            softirqs last  enabled at (47880): [<ffffffff81434277>] __do_softirq kernel/softirq.c:656 [inline]
            softirqs last  enabled at (47880): [<ffffffff81434277>] invoke_softirq kernel/softirq.c:496 [inline]
            softirqs last  enabled at (47880): [<ffffffff81434277>] __irq_exit_rcu+0x137/0x1c0 kernel/softirq.c:735
            softirqs last disabled at (47875): [<ffffffff81434277>] __do_softirq kernel/softirq.c:656 [inline]
            softirqs last disabled at (47875): [<ffffffff81434277>] invoke_softirq kernel/softirq.c:496 [inline]
            softirqs last disabled at (47875): [<ffffffff81434277>] __irq_exit_rcu+0x137/0x1c0 kernel/softirq.c:735
    
    Fix by calling ttm_bo_pin() only when the existing placement is compatible
    with the new pin request. This matches the correct behavior in other DRM
    drivers such as amdgpu_bo_pin() in amdgpu.
    
    Cc: [email protected]
    Fixes: ad76b3f7c7a0 ("drm/nouveau: teach nouveau_bo_pin() how to force a contig vram allocation")
    Signed-off-by: Peiyang He <[email protected]>
    Assisted-by: LLM
    Reviewed-by: Lyude Paul <[email protected]>
    Signed-off-by: Lyude Paul <[email protected]>
    Link: https://patch.msgid.link/EACEF2F4E098413F+20260918025312.2814889-1-peiyang_he@smail.nju.edu.cn
    Signed-off-by: Sasha Levin <[email protected]>

drm/nouveau: switch over to the new pin interface [+ + +]
Author: Christian König <[email protected]>
Date:   Tue Sep 29 14:47:18 2026 -0400

    drm/nouveau: switch over to the new pin interface
    
    [ Upstream commit 6797cea18d3982fce6a7d63e51b4cea0e3c8eb06 ]
    
    Stop using TTM_PL_FLAG_NO_EVICT.
    
    Signed-off-by: Christian König <[email protected]>
    Reviewed-by: Dave Airlie <[email protected]>
    Reviewed-by: Huang Rui <[email protected]>
    Link: https://patchwork.freedesktop.org/patch/391606/?series=81973&rev=1
    Stable-dep-of: 6a6870d3077f ("drm/nouveau: don't bump pin count on failed re-pin in nouveau_bo_pin_locked()")
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/radeon: Read the VRAM VBIOS signature with readb() [+ + +]
Author: Imre Kaloz <[email protected]>
Date:   Sun Sep 27 16:55:04 2026 +0200

    drm/radeon: Read the VRAM VBIOS signature with readb()
    
    commit de1eab13efef83fd2b76f4688de5bf672644596f upstream.
    
    igp_read_bios_from_vram() checked bios[0]/bios[1] with a plain
    __iomem load, which faults on sparc64 before the copy runs at all.
    radeon_read_bios() already reads its two signature bytes with
    readb() ahead of its own copy; use the same accessor here, keeping
    the check before the allocation.
    
    Fixes: b442962a9e82 ("drm/radeon/kms: add support for "Surround View"")
    Signed-off-by: Imre Kaloz <[email protected]>
    Signed-off-by: Alex Deucher <[email protected]>
    (cherry picked from commit 09155b8932e5013dbce0f5cdff7d75264a279ee5)
    Cc: [email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
drm/vc4: Free the BO cache size list on teardown [+ + +]
Author: Maíra Canal <[email protected]>
Date:   Wed Sep 30 16:06:50 2026 -0300

    drm/vc4: Free the BO cache size list on teardown
    
    [ Upstream commit b41ff8b529278216cba22a5dcdc93fea2a3a9619 ]
    
    vc4_bo_cache_destroy() purges the cached BOs but never frees the size
    list, leaking it on every unbind.
    
    Fixes: c826a6e10644 ("drm/vc4: Add a BO cache.")
    Assisted-by: LLM
    Reviewed-by: Thadeu Lima de Souza Cascardo <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Maíra Canal <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
drm/vmwgfx: validate pitch coming from userspace [+ + +]
Author: Zack Rusin <[email protected]>
Date:   Tue Oct 13 19:04:33 2026 -0400

    drm/vmwgfx: validate pitch coming from userspace
    
    [ Upstream commit 21bc51cb89ced74d6645a138cc2f21184bc75094 ]
    
    Validate the pitch, alongside the box dimensions before trying
    to copy data from the underlying surface. Fixes possible
    out of bounds reads with cursor snooping.
    
    Fixes: 2ac863719e51 ("vmwgfx: Snoop DMA transfers with non-covering sizes")
    Cc: [email protected]
    Reported-by: Youness HFA <[email protected]>
    Signed-off-by: Zack Rusin <[email protected]>
    Reviewed-by: Maaz Mombasawala <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [ sashal: Adapted cursor calculations to existing hard-coded 64-pixel dimensions and 4-byte pixels. ]
    [ sashal: Compare against bo->num_pages << PAGE_SHIFT, since bo->base.size is never set for vmwgfx buffer objects on 5.10. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
EDAC/amd64: Mask UMC chip select to the four implemented selects [+ + +]
Author: Vishal Badole <[email protected]>
Date:   Mon Oct 12 17:34:25 2026 -0400

    EDAC/amd64: Mask UMC chip select to the four implemented selects
    
    [ Upstream commit 7484bc43ba6b8e189b482db5b75e7842890a82b1 ]
    
    For DRAM ECC errors, the chip select value can be found in the
    MCA_SYND[ErrorInformation] field.
    
    ErrorInformation[2:0] was first documented in Zen1. The 3 bit field
    implied that up to 8 chip selects may be used.
    
    However, all Zen-based systems have only ever had up to 4 chip selects.
    So only bits [1:0] would contain a valid chip select value.
    
    Future systems are redefining the field to ErrorInformation[1:0]. This
    matches the existing 'up to 4 chip selects' implementations. And it
    frees up the extra bit for other decoding.
    
    Change the current chip select mask from 0x7 to 0x3 to prepare for the
    decode change.
    
    Fixes: 713ad54675fd ("EDAC, amd64: Define and register UMC error decode function")
    Suggested-by: Yazen Ghannam <[email protected]>
    Signed-off-by: Vishal Badole <[email protected]>
    Signed-off-by: Borislav Petkov (AMD) <[email protected]>
    Reviewed-by: Yazen Ghannam <[email protected]>
    Cc: <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [ sashal: adapted the change from umc_get_err_info() to the inline assignment in decode_umc_error() ]
    Signed-off-by: Sasha Levin <[email protected]>

 
exit: fix lost-update race on the child_subreaper bitfields [+ + +]
Author: Nickolai Zeldovich <[email protected]>
Date:   Sun Oct 11 08:34:39 2026 -0400

    exit: fix lost-update race on the child_subreaper bitfields
    
    [ Upstream commit 28d2905d77bc2e7c20260a6bc6b4179bdf95cb06 ]
    
    is_child_subreaper, has_child_subreaper, autoreap and, with
    CONFIG_POSIX_TIMERS=y, timer_create_restore_ids are 1-bit fields that
    share one memory location in struct signal_struct.  A store to any of
    them is a read-modify-write of the whole word, and three of the stores
    run without a common lock:
    
      - PR_SET_CHILD_SUBREAPER writes me->signal->is_child_subreaper with
        no lock held.
    
      - propagate_has_child_subreaper(), run by walk_process_tree() from
        the same prctl in an ancestor, writes p->signal->has_child_subreaper
        of every descendant p under read_lock(&tasklist_lock), which does
        not exclude the other writers.
    
      - PR_TIMER_CREATE_RESTORE_IDS writes
        current->signal->timer_create_restore_ids with no lock held.
    
    When a process calls prctl(PR_SET_CHILD_SUBREAPER, 1) while an
    ancestor's PR_SET_CHILD_SUBREAPER walk visits it, or while another
    thread of the same process calls prctl(PR_TIMER_CREATE_RESTORE_IDS),
    the read-modify-write sequences interleave and one of the bits is
    silently lost:
    
      - If has_child_subreaper is lost, the process's orphaned descendants
        are reparented straight to init when it exits: find_new_reaper()
        tests father->signal->has_child_subreaper first and never looks for
        the ancestor subreaper.  The service manager that registered as the
        subreaper never gets SIGCHLD for them and cannot wait() on them.
    
      - If is_child_subreaper is lost, the prctl returned 0 but the process
        is not a subreaper: orphans of its descendants skip it and are
        reparented to the next subreaper up or to init.
        PR_GET_CHILD_SUBREAPER reads back 0.
    
      - If timer_create_restore_ids is lost, the prctl returned 0 but
        timer_create() does not restore the requested timer ids (or keeps
        restoring them after _OFF), and _GET reads back the old value.
    
    Documentation/memory-barriers.txt requires all fields of one bitfield
    to be protected by one lock for exactly this reason.  No lock is taken
    or documented for these flags, and the prctls need no privilege, so any
    process can hit the race against its own ancestors or descendants, or
    between two of its own threads.
    
    Make is_child_subreaper and has_child_subreaper separate bool members.
    Each store then has its own memory location and no read-modify-write
    of a neighbour.  The readers and their locking are unchanged.
    
    autoreap stays a bit-field and so shares a memory location only with
    timer_create_restore_ids.  That pair is race-free: autoreap is stored
    exactly once, in copy_process() before the new signal_struct is
    reachable by any other task, and timer_create_restore_ids is only
    stored to the signal_struct of an already running process.
    
    Fixes: 749860ce2427 ("prctl: propagate has_child_subreaper flag to every descendant")
    Signed-off-by: Nickolai Zeldovich <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Acked-by: Oleg Nesterov <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
f2fs: embed f2fs_gc_kthread in f2fs_sb_info [+ + +]
Author: Chao Yu <[email protected]>
Date:   Sat Sep 12 16:59:04 2026 -0400

    f2fs: embed f2fs_gc_kthread in f2fs_sb_info
    
    [ Upstream commit 3d7bca9d583793bb7d0bac0d95a24ddd2e129eed ]
    
    Instead of allocating f2fs_gc_kthread dynamically, embed it in
    f2fs_sb_info. This simplifies lifetime management and prepares for
    fixing race conditions during teardown.
    
    - __sbi_store                   - remount|shutdown
                                     - f2fs_stop_gc_thread
     - access sbi->gc_thread
                                      - sbi->gc_thread = NULL
     - access sbi->gc_thread->f2fs_gc_task
    
    Fixes: 52190933c37a ("f2fs: sysfs: introduce critical_task_priority")
    Fixes: 7950e9ac638e ("f2fs: stop gc/discard thread after fs shutdown")
    Cc: [email protected]
    Signed-off-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ Omitted hunks for upstream GC features absent from Linux 5.10. ]
    Signed-off-by: Sasha Levin <[email protected]>

f2fs: limit recovery filename logging to stored length [+ + +]
Author: Wenjie Qi <[email protected]>
Date:   Fri Sep 11 21:49:16 2026 -0400

    f2fs: limit recovery filename logging to stored length
    
    [ Upstream commit 01027b2fcb74dade59fb833b51023f6593b6a9a2 ]
    
    F2FS stores recovery filenames as a length plus a fixed-size i_name
    buffer.  The buffer is not NUL-terminated, but recover_inode() and
    recover_dentry() print it with %s.
    
    For a 255-byte filename, recovery logging can read past i_name into the
    following raw inode fields.
    
    Print the name with a precision bounded by i_namelen and F2FS_NAME_LEN.
    
    Fixes: f356fe0cba0e ("f2fs: add debug msgs in the recovery routine")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.5
    Signed-off-by: Wenjie Qi <[email protected]>
    Reviewed-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ inlined recover_printable_name() logic into the existing page-based recovery functions. ]
    Signed-off-by: Sasha Levin <[email protected]>

f2fs: return writeback error from collapse range [+ + +]
Author: Wenjie Qi <[email protected]>
Date:   Fri Sep 11 17:15:48 2026 -0400

    f2fs: return writeback error from collapse range
    
    [ Upstream commit f8a4108800254d6f7b2755515fbbd9d0caac561e ]
    
    f2fs_collapse_range() writes back pages moved by f2fs_do_collapse(),
    but ignores the return value. If writeback fails, the ioctl can still
    truncate page cache, shrink blocks, and report success.
    
    Return the error before truncating page cache or updating the file size.
    
    Fixes: b4ace3370324 ("f2fs: support FALLOC_FL_COLLAPSE_RANGE")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.5
    Signed-off-by: Wenjie Qi <[email protected]>
    Reviewed-by: Chao Yu <[email protected]>
    Signed-off-by: Jaegeuk Kim <[email protected]>
    [ adjusted context to retain down_write()/up_write() on i_mmap_sem instead of filemap_invalidate_lock()/filemap_invalidate_unlock(). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
fcntl: refuse F_SET_RW_HINT on an immutable inode [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Wed Oct 14 07:05:31 2026 -0400

    fcntl: refuse F_SET_RW_HINT on an immutable inode
    
    [ Upstream commit b0d1022b9bdb1e98aa7fb3244fdd50a58c61766c ]
    
    An immutable inode is never written to so write hints are pointless.
    Refuse the hint on an immutable inode the way setattr(), fallocate() and
    etxattr() refuse their changes.
    
    Fixes: c75b1d9421f8 ("fs: add fcntl() interface for setting/getting write life time hints")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: Moved the check from fcntl_set_rw_hint() to the F_SET_RW_HINT case in fcntl_rw_hint(). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
flow_dissector: avoid u16 truncation of hlen in bpf_flow_dissect() [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Wed Oct 7 06:56:15 2026 +0200

    flow_dissector: avoid u16 truncation of hlen in bpf_flow_dissect()
    
    [ Upstream commit f202578efc738b883cfa04889eb97328914265a7 ]
    
    bpf_flow_dissect() sanitizes the offsets returned by the BPF program
    with clamp_t(u16, ..., hlen).
    
    If hlen is bigger than 65535, the upper bound is truncated before
    the comparison. For instance, with hlen == 65536, both nhoff and
    thoff are forced to zero, even if the program returned sane values.
    
    This is the same class of bug as the one fixed in commit 99bda1ecbd56
    ("flow_dissector: avoid u16 truncation of skb->len when computing
    thoff"). That fix does not cover the BPF path, because
    __skb_flow_dissect() returns early when a BPF flow dissector
    handles the packet.
    
    struct bpf_flow_keys stores nhoff and thoff as u16, so cap hlen
    to U16_MAX before clamping.
    
    Found by sashiko while reviewing the commit above.
    
    Fixes: d58e468b1112 ("flow_dissector: implements flow dissector BPF hook")
    Signed-off-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

flow_dissector: avoid u16 truncation of skb->len when computing thoff [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Thu Oct 1 19:11:38 2026 +0000

    flow_dissector: avoid u16 truncation of skb->len when computing thoff
    
    [ Upstream commit 99bda1ecbd56905f8bd934b9cdccd3bd251192b1 ]
    
    __skb_flow_dissect() computes key_control->thoff using:
    
      key_control->thoff = min_t(u16, nhoff, skb ? skb->len : hlen);
    
    min_t(u16, ...) casts both arguments to u16 before comparing them.
    Whenever skb->len (or hlen) modulo 65536 is smaller than nhoff, the
    truncated length wins and thoff is set to a bogus small value, even
    when the dissection succeeded. For example, an IPv4/TCP frame with
    skb->len == 65540 and nhoff == 34 gets thoff == 4, so callers such as
    skb_probe_transport_header() point the transport header inside the
    Ethernet header.
    
    Such skbs are not exotic:
    - At the time of commit d0c081b49137 ("flow_dissector: properly cap
      thoff field"), AF_PACKET with PACKET_VNET_HDR could already build GSO
      skbs larger than 64KB (MTU checks are skipped for GSO, and
      alloc_skb_with_frags() accepted up to MAX_SKB_FRAGS (17) order-0
      pages on top of the linear part).
    - BIG TCP now makes skbs larger than 64KB common.
    - The following patch makes tun_get_user() dissect IFF_TAP frames
      before eth_type_trans() pulls the Ethernet header, so a GSO frame
      carrying a 65522..65535 byte L3 packet will be dissected with
      skb->len in [65536, 65549].
    
    Compare as u32 instead. If the resulting offset cannot be represented
    in the u16 key_control->thoff, cap it to U16_MAX and report the
    dissection as failed rather than silently returning a wrong transport
    offset. thoff is still set on failure, as some callers (such as
    eth_get_headlen()) use it regardless of the return value.
    
    Fixes: d0c081b49137 ("flow_dissector: properly cap thoff field")
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
fs: Free any excess xarray nodes in clear_inode() [+ + +]
Author: Matthew Wilcox (Oracle) <[email protected]>
Date:   Tue Jun 23 20:28:48 2026 +0100

    fs: Free any excess xarray nodes in clear_inode()
    
    [ Upstream commit ee3f011250104129893d8e9599147e457d4d7280 ]
    
    For many years we've had a hard to hit leak of xarray nodes.  Hugh
    documented it well in commit 786b31121a2c.  Recently people and
    syzbot have found ways to force it to happen with madvise.  Rather
    than fix the leaks where they happen, just call xa_destroy() which
    has the side-effect of cycling the i_pages lock.
    
    Cc: Rik van Riel <[email protected]>
    Cc: Zi Yan <[email protected]>
    Cc: Jinjiang Tu <[email protected]>
    Cc: Dave Jones <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Matthew Wilcox (Oracle) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Rik van Riel <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

fs: refuse fspick() on internal superblocks [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Sat Sep 26 15:44:29 2026 +0200

    fs: refuse fspick() on internal superblocks
    
    commit 02587a4af82adccaef8e3b3624b4e7f1c401632d upstream.
    
    There's a few instances where a internal superblock is reachable by
    fspick(). Block that. graft_tree() and fsmount() already refuse them.
    fanotify refuses mount and superblock marks on them for the same reason.
    
    Fixes: cf3cba4a429b ("vfs: syscall: Add fspick() to select a superblock for reconfiguration")
    Cc: [email protected] # v5.2+
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
fsnotify: prevent mark additions during connector teardown [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Fri Oct 2 05:59:02 2026 +0000

    fsnotify: prevent mark additions during connector teardown
    
    commit 36ebddca56b9d8993d6dc984fdecc748ee1f5e06 upstream.
    
    fsnotify_destroy_marks() keeps a reference to its current mark while it
    drops conn->lock to destroy the mark. This stabilizes the forward-walk
    cursor, but does not prevent a new mark from being inserted before it.
    For example, an inotify watch re-added after IN_IGNORED sorts before the
    old, detached mark for the same group. The walk can miss the replacement
    and then detach the entire connector from the object.
    
    The replacement is still on its group's marks_list and, for inotify, in
    the watch IDR. The group mutex no longer protects the connector's object
    from disappearing. An unprivileged fdinfo read racing the final detach
    can consequently call igrab(NULL):
    
      BUG: KASAN: null-ptr-deref in igrab+0x24/0x100
      Write of size 4 at addr 0000000000000148
      Call Trace:
       igrab+0x24/0x100
       inotify_show_fdinfo+0x1dc/0x5e0
       seq_show+0x397/0x690
    
    Set a DESTROYING flag under conn->lock before starting the walk, and
    reject new marks on that connector with -ENOENT. The existing add-mark
    error paths undo the temporary group-list entry and the backend's watch
    allocation. Do not wait for teardown while holding the group mutex,
    which the destroyer needs. Once the old connector is detached, an add
    can install a fresh connector as before.
    
    This closes the insertion race for all object types using the common
    connector teardown, without changing the mark reference or SRCU lifetime
    rules.
    
    Fixes: 6b3f05d24d35 ("fsnotify: Detach mark from object list when last reference is dropped")
    Cc: [email protected]
    Signed-off-by: Kyle Zeng <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
fsverity: add dependency on 64K or smaller pages [+ + +]
Author: Eric Biggers <[email protected]>
Date:   Tue Oct 6 23:58:53 2026 +0200

    fsverity: add dependency on 64K or smaller pages
    
    commit a300000233a9ff842e2fb450fb9a79f7827a586d upstream.
    
    Currently, all filesystems that support fsverity (ext4, f2fs, and btrfs)
    cache the Merkle tree in the pagecache at a 64K aligned offset after the
    end of the file data.  This offset needs to be a multiple of the page
    size, which is guaranteed only when the page size is 64K or smaller.
    
    64K was chosen to be the "largest reasonable page size".  But it isn't
    the largest *possible* page size: the hexagon and powerpc ports of Linux
    support 256K pages, though that configuration is rarely used.
    
    For now, just disable support for FS_VERITY in these odd configurations
    to ensure it isn't used in cases where it would have incorrect behavior.
    
    Fixes: 671e67b47e9f ("fs-verity: add Kconfig and the helper functions for hashing")
    Reported-by: Christoph Hellwig <[email protected]>
    Closes: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Theodore Ts'o <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Eric Biggers <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ftrace: Synchronize the initialization of ftrace_ops [+ + +]
Author: Steven Rostedt <[email protected]>
Date:   Thu Sep 10 10:39:35 2026 -0400

    ftrace: Synchronize the initialization of ftrace_ops
    
    [ Upstream commit 4617721c502b2ddaa4e324e86da4997edf738fa5 ]
    
    There's some internal state that ftrace_ops needs to have set, but since
    it can be declared outside of the ftrace.c code, it calls
    ftrace_ops_init() on the ops in every global function. The issue is that
    if two tasks call it on the same ops at the same time it is possible to
    have the initialization of one corrupt the initialization of the other
    call.
    
    Create a ops_mutex to use to synchronize every initialization of the
    ftrace_ops. The mutex is taken within checking the ftrace_ops flag that
    states it was initializied but the flag is checked again after the mutex
    has been taken. Checking first outside the mutex allows it to shortcut
    having to take the mutex. But then the check needs to be done again after
    the mute is taken in case of races.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: f04f24fb7e48d ("ftrace, kprobes: Fix a deadlock on ftrace_regex_lock")
    Reported-by: [email protected]
    Close: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Steven Rostedt <[email protected]>
    [ adjusted INIT_OPS_HASH macro context for the missing subop_list member. ]
    Signed-off-by: Sasha Levin <[email protected]>

ftrace: Take trace_array reference before accessing its ftrace_ops [+ + +]
Author: Steven Rostedt <[email protected]>
Date:   Thu Sep 10 12:31:35 2026 -0400

    ftrace: Take trace_array reference before accessing its ftrace_ops
    
    [ Upstream commit 9100191e5acb2e5ea2313f436667bb5fce129f47 ]
    
    The trace instance files set_ftrace_filter and set_ftrace_notrace was
    updated to work with specific trace instances (trace_arrays). The issue is
    that when these files are opened, there is a small race window where it
    will use the ftrace_ops from the inode->private pointer to get a reference
    to the trace_array and then take its reference. The problem is that the
    ftrace_ops itself could be freed. If the rmdir on the instance happens at
    the same time the set_ftrace_filter file is opened, the rmdir could have
    also freed the ftrace_ops and referencing it will cause a use-after-free
    bug and crash the kernel.
    
    Instead, pass in the trace_array as the file private data (NULL for the
    top level instance), and then pass both the trace_array and the ftrace_ops
    to the ftrace_regex_open() function. If the trace_array is NULL, then it
    just uses the ftrace_ops without the need to take its reference (like
    normal). If the ftrace_ops is NULL, that is only the case for the top
    level instance and the global_ops can be used.
    
    This allows the trace_array to have its reference incremented before
    touching the ftrace_ops that could also be freed when the instance is.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/20260828223901.29e26edb@robin
    Fixes: 591dffdade9f0 ("ftrace: Allow for function tracing instance to filter functions")
    Reported-by: Breno Leitao <[email protected]>
    Tested-by: Breno Leitao <[email protected]>
    Closes: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Steven Rostedt <[email protected]>
    [ Replaced kzalloc_obj(*iter) with kzalloc(sizeof(*iter), GFP_KERNEL) for Linux 5.10. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
fuse: fix invalidate lock leak on open O_TRUNC DAX failure [+ + +]
Author: Baokun Li <[email protected]>
Date:   Mon Aug 31 14:00:15 2026 -0400

    fuse: fix invalidate lock leak on open O_TRUNC DAX failure
    
    [ Upstream commit a927f1867e61b78f39f9da0bbba3c98c2ca151fe ]
    
    fuse_open() takes filemap_invalidate_lock() for a DAX truncate
    (dax_truncate = true) and releases it before the out_inode_unlock
    label.  But when fuse_dax_break_layouts() fails, the goto
    out_inode_unlock skips the unlock and leaks the rwsem, so any later
    fault or truncate on the file stalls on the stale lock.
    
    fuse_dax_break_layouts() can fail with -ERESTARTSYS when a signal
    interrupts the wait for busy DAX pages to drain:
    
      open("file", O_RDWR | O_TRUNC)
      └─ fuse_open()
         ├─ filemap_invalidate_lock()        # dax_truncate
         └─ fuse_dax_break_layouts()
            └─ dax_break_layout()
               └─ wait_page_idle()           # TASK_INTERRUPTIBLE
                  └─ fuse_wait_dax_page()    # unlock, schedule, re-lock
                     └─ signal → -ERESTARTSYS
         goto out_inode_unlock               # <- lock leaked
    
    Fix this by moving filemap_invalidate_unlock() below the label so
    that all error paths release the lock, and rename the label to
    out_unlock as it now covers more than just the inode lock.
    
    Fixes: 2fdbb8dd0155 ("fuse: fix deadlock between atomic O_TRUNC and page invalidation")
    Cc: [email protected] # v6.0+
    Signed-off-by: Baokun Li <[email protected]>
    Signed-off-by: Miklos Szeredi <[email protected]>
    [ changed goto target from out_inode_unlock to out_unlock and relocated the out_unlock label before up_write() on i_mmap_sem, adapting the fix from filemap_invalidate_lock/unlock and fuse_open() to 5.10's i_mmap_sem/down_write/up_write and fuse_open_common() ]
    Signed-off-by: Sasha Levin <[email protected]>

fuse: fix invalidate lock leak on setattr writeback failure [+ + +]
Author: Baokun Li <[email protected]>
Date:   Mon Aug 31 17:09:46 2026 -0400

    fuse: fix invalidate lock leak on setattr writeback failure
    
    [ Upstream commit 9afeca0d569c9fc89d758fe7a9339d1e8afb1546 ]
    
    fuse_do_setattr() takes filemap_invalidate_lock() for a DAX truncate
    (fault_blocked = true) and releases it at the out:/error: labels.  But
    when a writeback flush is also needed, a write_inode_now() failure
    returns directly and leaks the lock, so any later fault or truncate on
    the file stalls on the stale rwsem.
    
    For example, truncate(2) on a setuid file reaches fuse_do_setattr()
    with both ATTR_SIZE and ATTR_MODE set:
    
      truncate(2)
      └─ do_truncate()
         ├─ dentry_needs_remove_privs()         # S_ISUID
         └─ notify_change()                     # KILL_SUID -> ATTR_MODE
            └─ fuse_setattr()                   # no killpriv:
               │                                #   ia_valid |= ATTR_MODE
               └─ fuse_do_setattr()
                  ├─ filemap_invalidate_lock()  # IS_DAX && is_truncate
                  └─ write_inode_now()          # is_wb && ATTR_MODE
                     └─ if (err)                # e.g. daemon -> -EIO
                        return err              # <- lock leaked
    
    Fix this by adding an unlock label that releases the lock before
    returning the error, and use it for the fuse_dax_break_layouts()
    failure path as well.
    
    Fixes: 6ae330cad6ef ("virtiofs: serialize truncate/punch_hole and dax fault path")
    Cc: [email protected] # v5.10+
    Signed-off-by: Baokun Li <[email protected]>
    Signed-off-by: Miklos Szeredi <[email protected]>
    [ replaced up_write(&fi->i_mmap_sem) locking and (inode, 0, 0) call site instead of the mainline filemap_invalidate_lock/(inode, 0, -1) forms ]
    Signed-off-by: Sasha Levin <[email protected]>

 
futex: Fix mm reuse handling for FUT_OFF_MMSHARED [+ + +]
Author: Jann Horn <[email protected]>
Date:   Thu Oct 22 10:11:00 2026 -0400

    futex: Fix mm reuse handling for FUT_OFF_MMSHARED
    
    [ Upstream commit 3267512ad1c2cc0c7768c5b014dc2cceb398a801 ]
    
    A FUT_OFF_MMSHARED futex is a shared futex that refers to an MM.
    It is possible for a process to wait on a shared futex with a different MM
    because a FUT_OFF_INODE waiter can be requeued onto a FUT_OFF_MMSHARED
    futex by another process.
    This can cause FUT_OFF_MMSHARED waiters on a freed MM to consume
    wakeups intended for a newly allocated MM at the same address.
    
    Fix it by keying FUT_OFF_MMSHARED using a unique 64-bit per-MM ID.
    Leave private futexes as before to avoid influencing the performance of the
    hotpath.
    
    (Multi-threaded processes typically implicitly use FUT_OFF_MMSHARED by
    setting clear_child_tid such that it points into anonymous memory, which
    causes mm_release() in a multi-threaded mm to perform FUTEX_WAKE.)
    
    Fixes: 222993395ed3 ("futex: Remove pointless mmgrap() + mmdrop()")
    Closes: https://lore.kernel.org/r/CAG48ez0dLBpc3QtbAhMMVNHwHL94iHh2G+h-=BVFR4dDuzZr1g@mail.gmail.com/
    Signed-off-by: Jann Horn <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    [ sashal: Moved futex unique-ID storage from futex_mm_data directly into mm_struct. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
genetlink: pin family module during policy dump [+ + +]
Author: XingWang Xiang <[email protected]>
Date:   Wed Sep 16 19:53:35 2026 -0400

    genetlink: pin family module during policy dump
    
    [ Upstream commit 6a1094c34d176827b2b173e163dcc964a13af93f ]
    
    The generic netlink controller's policy dump keeps pointers to the target
    family's operation and policy tables in its callback state.  A dump may be
    split across multiple skbs and remain pending after the initial request.
    
    Netlink pins the module which owns the dump callback, but in this case
    that is the controller's owner rather than the target family's owner.  The
    target family can consequently be unregistered and its module unloaded
    while a policy dump is pending.  Advancing the dump then dereferences
    policy memory from the unloaded module.
    
    Take a reference to the target family's module when the dump starts.
    Drop it from the error and done paths.  This matches the lifetime for which
    the dump context retains the family and policy pointers.
    
    Fixes: d07dcf9aadd6 ("netlink: add infrastructure to expose policies to userspace")
    Cc: [email protected]
    Signed-off-by: XingWang Xiang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adapted split-operation iterator handling to the older genl_ops and opidx interfaces. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
gtp: serialize PDP context updates [+ + +]
Author: Qing Ming <[email protected]>
Date:   Mon Aug 31 22:09:40 2026 -0400

    gtp: serialize PDP context updates
    
    [ Upstream commit 498386b6d402737db1e2eeed4c385acbf0ef9e34 ]
    
    PDP contexts can be deleted through GTP_CMD_DELPDP or while the GTP
    network device is being unregistered. The latter is serialized by RTNL,
    but the generic-netlink delete path only holds RCU.
    
    Running both paths concurrently can therefore make both paths delete the
    same PDP context. The issue was found through static analysis and
    reproduced on a KASAN-enabled kernel by a simple two-thread program
    racing GTP_CMD_DELPDP against RTM_DELLINK:
    
      Oops: general protection fault, probably for non-canonical address
      KASAN: maybe wild-memory-access in range
             [0xdead000000000120-0xdead000000000127]
      RIP: gtp_genl_del_pdp+0x1c1/0x420 [gtp]
      RBP: dead000000000122
    
    The second deletion dereferenced the poisoned hlist pprev pointer.
    
    Serialize gtp_pdp_add(), gtp_genl_del_pdp(), and gtp_dellink() with a
    shared mutex. Keep the mutex held until the final use of a PDP context in
    the NEWPDP path, and keep the RCU read-side section around the complete
    PDP context use in the DELPDP path.
    
    Fixes: 459aa660eb1d ("gtp: add initial driver for datapath of GPRS Tunneling Protocol (GTP-U)")
    Cc: [email protected]
    Signed-off-by: Qing Ming <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adapted the locking changes to the older IPv4-only PDP context API and omitted the absent IPv6 lookup hunk. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
HID: alps: unregister DualPoint Stick input device on remove [+ + +]
Author: Chen Changcheng <[email protected]>
Date:   Tue Sep 29 22:38:41 2026 -0400

    HID: alps: unregister DualPoint Stick input device on remove
    
    [ Upstream commit aa9dde93e05a837645fdfd577eea71f0733f0694 ]
    
    alps_input_configured() allocates a second input device ("DualPoint
    Stick") with input_allocate_device() and registers it, but the
    alps_driver struct has no .remove handler and input2 is not tracked in
    hdev->inputs.  The default remove path (hid_hw_stop -> hidinput_disconnect)
    only iterates hdev->inputs, so input2 is never unregistered and leaks
    on every device removal.
    
    Add a .remove handler that stops the device first (preventing URB
    callbacks from touching input2 during teardown) and then unregisters
    input2.
    
    Fixes: 2562756dde55 ("HID: add Alps I2C HID Touchpad-Stick support")
    Cc: [email protected]
    Signed-off-by: Chen Changcheng <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: core: introduce hid_safe_input_report() [+ + +]
Author: Benjamin Tissoires <[email protected]>
Date:   Sun Oct 11 10:39:09 2026 +0000

    HID: core: introduce hid_safe_input_report()
    
    [ Upstream commit 206342541fc887ae919774a43942dc883161fece ]
    
    hid_input_report() is used in too many places to have a commit that
    doesn't cross subsystem borders. Instead of changing the API, introduce
    a new one when things matters in the transport layers:
    - usbhid
    - i2chid
    
    This effectively revert to the old behavior for those two transport
    layers.
    
    Fixes: 0a3fe972a7cb ("HID: core: Mitigate potential OOB by removing bogus memset()")
    Cc: [email protected]
    Signed-off-by: Benjamin Tissoires <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    (cherry picked from commit a9527c32cc9d98252dc975d6fcb29f2013d0f63a)
    [Lee: Implement hid_safe_input_report() directly and wrap it from
          hid_input_report() as 67eccf151d76 ("HID: add source argument to
          HID low level functions") is not present.  Use int for report type
          and literal 2 in i2c_hid_get_input() as 56fc4f7bc114 and
          1bdbe0dcff2f are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: core: remove #ifdef CONFIG_PM from hid_driver [+ + +]
Author: Thomas Weißschuh <[email protected]>
Date:   Thu Oct 12 12:23:38 2023 +0200

    HID: core: remove #ifdef CONFIG_PM from hid_driver
    
    [ Upstream commit df8b030d82dd1224881acb4e778fa06c4824f72b ]
    
    Allow HID drivers to pass ->suspend, ->resume and ->reset_resume via
    pm_ptr().
    Through the usage of pm_ptr() the CONFIG_PM-dependent code will always be
    compiled, protecting against bitrot.
    The linker will then garbage-collect the unused function avoiding any overhead.
    
    The only overhead in the final kernel image and at runtime are a few
    extra bytes in 'struct hid_driver'.
    
    The same approach is chosen by 'struct usb_driver' and other subsystems.
    
    Signed-off-by: Thomas Weißschuh <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Benjamin Tissoires <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: hid-alps: use default remove for hid device [+ + +]
Author: Marcus Folkesson <[email protected]>
Date:   Tue Sep 29 22:38:39 2026 -0400

    HID: hid-alps: use default remove for hid device
    
    [ Upstream commit 989f7cc94f1174269282a4a46bb735c7f11527de ]
    
    hid_device_remove() will call hid_hw_stop() as default .remove function
    if no function is specified.
    
    Signed-off-by: Marcus Folkesson <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Stable-dep-of: aa9dde93e05a ("HID: alps: unregister DualPoint Stick input device on remove")
    Signed-off-by: Sasha Levin <[email protected]>

HID: hid-alps: Use pm_ptr instead of #ifdef CONFIG_PM [+ + +]
Author: Bastien Nocera <[email protected]>
Date:   Tue Sep 29 22:38:40 2026 -0400

    HID: hid-alps: Use pm_ptr instead of #ifdef CONFIG_PM
    
    [ Upstream commit 5e130f58629a2819c9d053507ad368160d25eb65 ]
    
    This increases build coverage and allows to drop an #ifdef.
    
    Signed-off-by: Bastien Nocera <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    Stable-dep-of: aa9dde93e05a ("HID: alps: unregister DualPoint Stick input device on remove")
    Signed-off-by: Sasha Levin <[email protected]>

HID: hid-steam: Fix cleanup in probe() [+ + +]
Author: Dan Carpenter <[email protected]>
Date:   Tue Oct 13 09:12:08 2026 +0000

    HID: hid-steam: Fix cleanup in probe()
    
    [ Upstream commit a9f1da09c69f13ef471db8b22107a28042d230ca ]
    
    There are a number of issues in this code.  First of all if
    steam_create_client_hid() fails then it leads to an error pointer
    dereference when we call hid_destroy_device(steam->client_hdev).
    
    Also there are a number of leaks.  hid_hw_stop() is not called if
    hid_hw_open() fails for example.  And it doesn't call steam_unregister()
    or hid_hw_close().
    
    Fixes: 691ead124a0c ("HID: hid-steam: Clean up locking")
    Signed-off-by: Dan Carpenter <[email protected]>
    Reviewed-by: Vicki Pfau <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Benjamin Tissoires <[email protected]>
    [Lee: Move client_hdev creation after steam_register() and omit
          mode_switch and rumble_work cancellation as 691ead124a0c and
          e133dc99fc07 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: hid-steam: Make client_opened a counter [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:09 2026 +0000

    HID: hid-steam: Make client_opened a counter
    
    [ Upstream commit 555b818adb97eca70210a49ba3f1d27882dde092 ]
    
    The client_opened variable was used to track if the hidraw was opened by any
    clients to silence keyboard/mouse events while opened. However, there was no
    counting of how many clients were opened, so opening two at the same time and
    then closing one would fool the driver into thinking it had no remaining opened
    clients.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Adapt steam_client_ll_open() and steam_client_ll_close() as
          691ead124a0c and e1147961b214 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: steam: Clean up locking [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:13 2026 +0000

    HID: steam: Clean up locking
    
    [ Upstream commit de1d341b9b3ec9655f31fb8b44f784cca5e670ad ]
    
    This cleans up several issues with locking behavior, including RCU accesses
    not being guarded behind a lock.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Use explicit lock/unlock calls instead of guard(), adapt to
          steam->mutex, and omit Steam Deck sensors, mode_switch,
          rumble_work, coalesce_rumble_work and Ibex changes as
          691ead124a0c, e133dc99fc07, a0fbd9437d7d, 1d4549fd1115,
          fcfa7db89f7a and 0a80b4e8ec6a are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: steam: Fully unregister controller when hidraw is opened [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:10 2026 +0000

    HID: steam: Fully unregister controller when hidraw is opened
    
    [ Upstream commit cd33a91d37eb4d7c6ce56aa7f4688066309808eb ]
    
    To avoid conflicts between anything touching the hidraw and the driver we
    had previously detached the evdev nodes when the hidraw is opened. However,
    this isn't sufficient to avoid FEATURE reports from conflicting, so we
    change to fully unregistering the controller internally, leaving only the
    hidraw active until it's closed.
    
    This also unifies the unregister and connect callbacks, as now the logic
    between these two callbacks is identical.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Convert steam_client_ll_open() and steam_client_ll_close() to
          schedule work_connect directly and omit sensors, rumble_work,
          mode_switch and unregister_work changes as e133dc99fc07,
          e1147961b214 and 1d4549fd1115 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: steam: Rearrange teardown sequence [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:11 2026 +0000

    HID: steam: Rearrange teardown sequence
    
    [ Upstream commit ddce9641ce924ed91ec8304577e463823a29ffaf ]
    
    This fixes a narrow window during the teardown sequence where callbacks
    could still be scheduled during cleanup that would then have a dangling
    pointer to the now-freed steam struct.
    
    This also puts work canceling for rumble and mode switch in
    steam_unregister, as that shouldn't persist while the client hdev is open.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Omit rumble_work, coalesce_rumble_work and mode_switch
          cancellation as e133dc99fc07 and 1d4549fd1115 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: steam: Refactor registration [+ + +]
Author: Vicki Pfau <[email protected]>
Date:   Tue Oct 13 09:12:12 2026 +0000

    HID: steam: Refactor registration
    
    [ Upstream commit 6f9b740c31ba7e061b2ebb330d9a3d63f1358f29 ]
    
    This refactors and simplifies the registration/unregistration flow. Since
    we now only perform registration when the client isn't opened anymore, the
    logic for handling that can be removed, and the rest of the function
    streamlined.
    
    We also remove the previous assumption that we have a serial number to show
    we're registered, replacing it with a single purpose boolean.
    
    In a previous refactor the code for unregistering a battery if later
    registration steps failed was accidentally left out. As a result, a
    lingering power_supply object could get left over after the steam object
    was torn down. This is also fixed here.
    
    Signed-off-by: Vicki Pfau <[email protected]>
    Signed-off-by: Jiri Kosina <[email protected]>
    [Lee: Omit sensors, steam_get_attributes(), rumble_work,
          coalesce_rumble_work and mode_switch changes as e133dc99fc07,
          a0fbd9437d7d and 1d4549fd1115 are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

HID: uhid: convert to hid_safe_input_report() [+ + +]
Author: Carlos Llamas <[email protected]>
Date:   Sun Oct 11 10:39:10 2026 +0000

    HID: uhid: convert to hid_safe_input_report()
    
    [ Upstream commit 63a694c51bf120a37550890b8e7736b4888985e9 ]
    
    Commit 0a3fe972a7cb ("HID: core: Mitigate potential OOB by removing
    bogus memset()"), added a check in hid_report_raw_event() to reject
    reports if the received data size is smaller than expected. This was
    intended to prevent OOB errors by no longer allowing zeroing-out of
    shorter reports due to the lack of buffer size information.
    
    However, this leads to regressions in hid_report_raw_event(), where
    shorter than expected reports are rejected, even though their buffers
    are sufficiently large to be zero-padded.
    
    To solve this issue, Benjamin introduced a safer alternative in commit
    206342541fc8 ("HID: core: introduce hid_safe_input_report()"), which
    forwards the buffer size and allows hid_report_raw_event() to safely
    zero-pad the data.
    
    Convert uhid to use hid_safe_input_report() and pass UHID_DATA_MAX as
    the buffer size. This prevents the reported regressions [1], allowing
    hid core to zero-pad the shorter reports safely as expected.
    
    Cc: [email protected]
    Fixes: 0a3fe972a7cb ("HID: core: Mitigate potential OOB by removing bogus memset()")
    Closes: https://lore.kernel.org/all/[email protected]/ [1]
    Signed-off-by: Carlos Llamas <[email protected]>
    Reviewed-by: Lee Jones <[email protected]>
    Closes: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Jiri Kosina <[email protected]>
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
highmem: round down the address passed to kunmap_flush_on_unmap() [+ + +]
Author: Matthew Wilcox (Oracle) <[email protected]>
Date:   Thu Oct 15 11:27:01 2026 +0000

    highmem: round down the address passed to kunmap_flush_on_unmap()
    
    commit 88d7b12068b95731c280af8ce88e8ee9561f96de upstream.
    
    We already round down the address in kunmap_local_indexed() which is the
    other implementation of __kunmap_local().  The only implementation of
    kunmap_flush_on_unmap() is PA-RISC which is expecting a page-aligned
    address.  This may be causing PA-RISC to be flushing the wrong addresses
    currently.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Signed-off-by: Matthew Wilcox (Oracle) <[email protected]>
    Fixes: 298fa1ad5571 ("highmem: Provide generic variant of kmap_atomic*")
    Reviewed-by: Ira Weiny <[email protected]>
    Cc: "Fabio M. De Francesco" <[email protected]>
    Cc: Al Viro <[email protected]>
    Cc: Thomas Gleixner <[email protected]>
    Cc: Helge Deller <[email protected]>
    Cc: Alexander Potapenko <[email protected]>
    Cc: Andrey Konovalov <[email protected]>
    Cc: Bagas Sanjaya <[email protected]>
    Cc: David Sterba <[email protected]>
    Cc: Kees Cook <[email protected]>
    Cc: Sebastian Andrzej Siewior <[email protected]>
    Cc: Tony Luck <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ 5.10 has no include/linux/highmem-internal.h and no
      kmap_local API, so __kunmap_local() does not exist. Therefore,
      I applied the __kunmap_atomic() hunk to include/linux/highmem.h ]
    Signed-off-by: Gyokhan Kochmarla <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
hsr: Remove WARN_ONCE() in hsr_addr_is_self(). [+ + +]
Author: Kuniyuki Iwashima <[email protected]>
Date:   Sat May 30 06:42:58 2026 +0000

    hsr: Remove WARN_ONCE() in hsr_addr_is_self().
    
    [ Upstream commit afd0f17ca46258cec3a5cc48b8df9327fe772490 ]
    
    syzbot reported the warning [0] in hsr_addr_is_self(),
    whose assumption is simply wrong.
    
    hsr->self_node is cleared in hsr_del_self_node(), which
    is called from hsr_dellink().
    
    Since dev->rtnl_link_ops->dellink() is called before
    unregister_netdevice_many(), there is a window when
    user can find the device but without hsr->self_node.
    
    Let's remove WARN_ONCE() in hsr_addr_is_self().
    
    [0]:
    HSR: No self node
    WARNING: net/hsr/hsr_framereg.c:39 at hsr_addr_is_self+0x211/0x3f0 net/hsr/hsr_framereg.c:39, CPU#0: syz.4.16848/17220
    Modules linked in:
    CPU: 0 UID: 0 PID: 17220 Comm: syz.4.16848 Tainted: G             L      syzkaller #0 PREEMPT_{RT,(full)}
    Tainted: [L]=SOFTLOCKUP
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 04/18/2026
    RIP: 0010:hsr_addr_is_self+0x211/0x3f0 net/hsr/hsr_framereg.c:39
    Code: 33 2f 41 0f b7 dd 89 ee 09 de 31 ff e8 c8 b4 c6 f6 09 dd 74 54 e8 0f b0 c6 f6 31 ed eb 53 e8 06 b0 c6 f6 48 8d 3d 2f 50 9c 04 <67> 48 0f b9 3a 31 ed eb 42 e8 c1 13 1f 00 89 c5 31 ff 89 c6 e8 96
    RSP: 0018:ffffc900041c70e0 EFLAGS: 00010283
    RAX: ffffffff8afdc6ca RBX: ffffffff8afdc4e6 RCX: 0000000000080000
    RDX: ffffc90010493000 RSI: 0000000000000948 RDI: ffffffff8f9a1700
    RBP: 0000000000000001 R08: 0000000000000000 R09: 0000000000000000
    R10: ffffc900041c71e8 R11: fffff52000838e3f R12: dffffc0000000000
    R13: ffff888041f9e3c0 R14: ffff888086ee3802 R15: 0000000000000000
    FS:  00007f6fe985d6c0(0000) GS:ffff888126176000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f80bd437dac CR3: 0000000025096000 CR4: 00000000003526f0
    DR0: ffffffffffffffff DR1: 00000000000001f8 DR2: 0000000000000002
    DR3: ffffffffefffff15 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Call Trace:
     <TASK>
     check_local_dest net/hsr/hsr_forward.c:592 [inline]
     fill_frame_info net/hsr/hsr_forward.c:728 [inline]
     hsr_forward_skb+0xa11/0x2a80 net/hsr/hsr_forward.c:739
     hsr_dev_xmit+0x253/0x370 net/hsr/hsr_device.c:236
     __netdev_start_xmit include/linux/netdevice.h:5368 [inline]
     netdev_start_xmit include/linux/netdevice.h:5377 [inline]
     xmit_one net/core/dev.c:3888 [inline]
     dev_hard_start_xmit+0x2df/0x860 net/core/dev.c:3904
     __dev_queue_xmit+0x1428/0x3900 net/core/dev.c:4870
     neigh_output include/net/neighbour.h:556 [inline]
     ip_finish_output2+0xcec/0x10b0 net/ipv4/ip_output.c:237
     ip_send_skb net/ipv4/ip_output.c:1510 [inline]
     ip_push_pending_frames+0x8b/0x110 net/ipv4/ip_output.c:1530
     raw_sendmsg+0x1547/0x1a50 net/ipv4/raw.c:659
     sock_sendmsg_nosec net/socket.c:787 [inline]
     __sock_sendmsg net/socket.c:802 [inline]
     ____sys_sendmsg+0x7da/0x9c0 net/socket.c:2698
     ___sys_sendmsg+0x2a5/0x360 net/socket.c:2752
     __sys_sendmsg net/socket.c:2784 [inline]
     __do_sys_sendmsg net/socket.c:2789 [inline]
     __se_sys_sendmsg net/socket.c:2787 [inline]
     __x64_sys_sendmsg+0x1c3/0x2a0 net/socket.c:2787
     do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline]
     do_syscall_64+0x15f/0xf80 arch/x86/entry/syscall_64.c:94
     entry_SYSCALL_64_after_hwframe+0x77/0x7f
    RIP: 0033:0x7f6feb62ce59
    Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 e8 ff ff ff f7 d8 64 89 01 48
    RSP: 002b:00007f6fe985d028 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007f6feb8a6090 RCX: 00007f6feb62ce59
    RDX: 0000000000000000 RSI: 0000200000000000 RDI: 0000000000000004
    RBP: 00007f6feb6c2d6f R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007f6feb8a6128 R14: 00007f6feb8a6090 R15: 00007ffcf01cc488
     </TASK>
    
    Fixes: f266a683a480 ("net/hsr: Better frame dispatch")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/netdev/[email protected]/
    Signed-off-by: Kuniyuki Iwashima <[email protected]>
    Reviewed-by: Fernando Fernandez Mancera <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
hwmon: (drivetemp) Fix driver producing garbage data when SCSI errors occur [+ + +]
Author: Daniil Stas <[email protected]>
Date:   Fri Oct 23 13:38:19 2026 +0900

    hwmon: (drivetemp) Fix driver producing garbage data when SCSI errors occur
    
    commit 82163d63ae7a4c36142cd252388737205bb7e4b9 upstream.
    
    scsi_execute_cmd() function can return both negative (linux codes) and
    positive (scsi_cmnd result field) error codes.
    
    Currently the driver just passes error codes of scsi_execute_cmd() to
    hwmon core, which is incorrect because hwmon only checks for negative
    error codes. This leads to hwmon reporting uninitialized data to
    userspace in case of SCSI errors (for example if the disk drive was
    disconnected).
    
    This patch checks scsi_execute_cmd() output and returns -EIO if it's
    error code is positive.
    
    Fixes: 5b46903d8bf37 ("hwmon: Driver for disk and solid state drives with temperature sensors")
    Signed-off-by: Daniil Stas <[email protected]>
    Cc: Guenter Roeck <[email protected]>
    Cc: Chris Healy <[email protected]>
    Cc: Linus Walleij <[email protected]>
    Cc: Martin K. Petersen <[email protected]>
    Cc: Bart Van Assche <[email protected]>
    Cc: [email protected]
    Cc: [email protected]
    Cc: [email protected]
    Cc: [email protected]
    Link: https://lore.kernel.org/r/[email protected]
    [groeck: Avoid inline variable declaration for portability]
    Signed-off-by: Guenter Roeck <[email protected]>
    Signed-off-by: Nobuhiro Iwamatsu (CIP) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

hwmon: (gpio-fan) Fix use-after-free in alarm work [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 16 22:18:44 2026 -0400

    hwmon: (gpio-fan) Fix use-after-free in alarm work
    
    [ Upstream commit a2471ed17b0e6ff7bfb6b2ea8e6e5b04c309d293 ]
    
    fan_alarm_irq_handler() queues fan_data->alarm_work, but nothing
    cancels it.  fan_alarm_notify() dereferences fan_data and its hwmon
    device.  On unbind, devres frees the interrupt, which only waits for
    the handler itself, and then releases the hwmon device and fan_data,
    so a pending fan_alarm_notify() can run after those frees.
    
    Replace INIT_WORK() with devm_work_autocancel(), registered before
    devm_request_irq().  The devres cleanup then frees the interrupt
    first, so no new work can be queued, and cancels the work while
    fan_data and the hwmon device are still alive.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: d6fe1360f42e ("hwmon: add generic GPIO fan driver")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Guenter Roeck <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
hwrng: stm32 - Fix runtime PM cleanup on registration failure [+ + +]
Author: Can Peng <[email protected]>
Date:   Wed Sep 9 16:06:51 2026 -0400

    hwrng: stm32 - Fix runtime PM cleanup on registration failure
    
    [ Upstream commit 1163a476a568f6c0f852d469c8e4c5a5f805adac ]
    
    stm32_rng_probe() enables autosuspend and runtime PM before registering the
    hwrng. If devm_hwrng_register() fails, probe returns with runtime PM left
    enabled and autosuspend still selected.
    
    The remove callback also only disables runtime PM and does not undo
    pm_runtime_use_autosuspend().
    
    Use devm_pm_runtime_enable() so runtime PM is unwound automatically on
    probe failure and driver detach. Since the managed cleanup also disables
    runtime PM,drop the remove callback.
    
    Fixes: c6a97c42e399 ("hwrng: stm32 - add support for STM32 HW RNG")
    Cc: [email protected]
    Signed-off-by: Can Peng <[email protected]>
    Reviewed-by: Linus Walleij <[email protected]>
    Signed-off-by: Herbert Xu <[email protected]>
    [ adapted to the older driver’s relocated int-returning remove callback and existing err variable. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
i2c: at91: release DMA channels when probe defers [+ + +]
Author: Hongjian Dai <[email protected]>
Date:   Wed Sep 30 00:43:40 2026 +0800

    i2c: at91: release DMA channels when probe defers
    
    [ Upstream commit c98bf3b86609a18ab16d067280257326e557c636 ]
    
    at91_twi_probe_master() can return -EPROBE_DEFER from
    at91_init_twi_recovery_info() after at91_twi_configure_dma() has already
    claimed the tx/rx DMA channels. at91_twi_probe() then returns without
    releasing them, and since dma_request_chan() is not devres-managed the
    channels leak on every deferred probe attempt.
    
    Release the channels before deferring the probe.
    
    Fixes: f7eeb1af8537 ("i2c: at91: release DMA channels on remove and probe error")
    Assisted-by: LLM
    Signed-off-by: Hongjian Dai <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/7D85C6CB6BF0A82E+20260929164340.41628-1-daihongjian@kylinsec.com.cn
    Signed-off-by: Sasha Levin <[email protected]>

i2c: core: Introduce i2c_client_get_device_id helper function [+ + +]
Author: Angel Iglesias <[email protected]>
Date:   Wed Sep 9 07:28:22 2026 -0400

    i2c: core: Introduce i2c_client_get_device_id helper function
    
    [ Upstream commit 662233731d66cf41e7494e532e702849c8ce18f3 ]
    
    Introduces new helper function to aid in .probe_new() refactors. In order
    to use existing i2c_get_device_id() on the probe callback, the device
    match table needs to be accessible in that function, which would require
    bigger refactors in some drivers using the deprecated .probe callback.
    
    This issue was discussed in more detail in the IIO mailing list.
    
    Link: https://lore.kernel.org/all/[email protected]/
    Suggested-by: Nuno Sá <[email protected]>
    Suggested-by: Andy Shevchenko <[email protected]>
    Suggested-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Angel Iglesias <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    Reviewed-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Wolfram Sang <[email protected]>
    Stable-dep-of: 4e4b9f5ce9df ("power: supply: max17040: drop incorrect I2C functionality check")
    Signed-off-by: Sasha Levin <[email protected]>

i2c: mxs: fix DMA channel leak on probe error [+ + +]
Author: Ruoyu Wang <[email protected]>
Date:   Wed Sep 9 07:03:53 2026 -0400

    i2c: mxs: fix DMA channel leak on probe error
    
    [ Upstream commit 777979e627115734052b323d2721cdb500e81dcf ]
    
    mxs_i2c_probe() requests an exclusive DMA channel before resetting the
    controller and registering the I2C adapter. If either later operation
    fails, probe returns without releasing the channel because the remove
    callback is not invoked after a failed probe.
    
    Use devm_dma_request_chan() so the device core releases the channel on
    probe failure and driver detach. Remove the manual release from the
    remove callback because the channel is now device-managed.
    
    This issue was found by a static analysis checker and confirmed by
    manual source review.
    
    Fixes: 62885f59a261 ("MXS: Implement DMA support into mxs-i2c")
    Assisted-by: unnamed:claude-opus-4.8 typestate
    Signed-off-by: Ruoyu Wang <[email protected]>
    Cc: <[email protected]> # v3.7+
    Reviewed-by: Frank Li <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

i2c: qcom-cci: Fix HALT_ACK reset request being dropped [+ + +]
Author: Loic Poulain <[email protected]>
Date:   Mon Oct 12 14:54:56 2026 +0200

    i2c: qcom-cci: Fix HALT_ACK reset request being dropped
    
    commit 195f3d74b5de98969dc4fad956393bb00787efd1 upstream.
    
    A HALT_ACK interrupt indicates that the corresponding I2C master has
    entered the halted state and must be reset before further operation.
    
    The M0 and M1 HALT_ACK status bits may be asserted simultaneously in a
    single interrupt. However, the interrupt handler currently overwrites
    the reset mask when processing each HALT_ACK condition, causing the
    first reset request to be lost if both events are reported together.
    
    Accumulate reset requests instead of overwriting them so that both
    masters are properly reset when M0 and M1 HALT_ACK events occur in the
    same interrupt.
    
    Fixes: e517526195de4 ("i2c: Add Qualcomm CCI I2C driver")
    Signed-off-by: Loic Poulain <[email protected]>
    Cc: <[email protected]> # v5.8+
    Reviewed-by: Konrad Dybcio <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

i2c: viai2c-wmt: Fix clock leak in wmt_i2c_probe() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Thu Oct 22 10:09:18 2026 -0400

    i2c: viai2c-wmt: Fix clock leak in wmt_i2c_probe()
    
    [ Upstream commit aaabefc79b0ff0018e8e3832169bbe359d0551fc ]
    
    In wmt_i2c_probe(), i2c->clk is acquired using of_clk_get(). If any
    subsequent operation fails or when the module is unloaded, the clock
    reference count is never decremented via clk_put(), leading to a
    resource leak.
    
    Switch to devm_clk_get() so that the clock is automatically managed
    and released.
    
    Fixes: 560746eb79d3 ("i2c: vt8500: Add support for I2C bus on Wondermedia SoCs")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Signed-off-by: Andi Shyti <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [ sashal: adapted i2c->clk references to i2c_dev->clk ]
    Signed-off-by: Sasha Levin <[email protected]>

 
i3c: master: Do not treat master device as a duplicate target [+ + +]
Author: Adrian Hunter <[email protected]>
Date:   Wed Sep 9 21:26:05 2026 -0400

    i3c: master: Do not treat master device as a duplicate target
    
    [ Upstream commit 4dc1b3eeba7991905a5b5b8129ebea51be7d87b7 ]
    
    i3c_master_search_i3c_dev_duplicate() searches the bus for another I3C
    device with the same PID as the reference device.  The search can match
    master->this, causing the controller itself to be returned as a
    duplicate.
    
    Since the controller is not a target device, it cannot be a duplicate of
    one.  Exclude master->this from matching so that the function only
    returns real duplicate target devices.
    
    Fixes: 3a379bbcea0a ("i3c: Add core I3C infrastructure")
    Cc: [email protected]
    Signed-off-by: Adrian Hunter <[email protected]>
    Reviewed-by: Frank Li <[email protected]>
    Acked-by: Mukesh Savaliya <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Alexandre Belloni <[email protected]>
    [ adjusted the duplicate-device comparison to match the older branch’s PID handling without nonzero-PID checks. ]
    Signed-off-by: Sasha Levin <[email protected]>

i3c: master: Fix use-after-free of master->this [+ + +]
Author: Adrian Hunter <[email protected]>
Date:   Wed Sep 9 21:29:26 2026 -0400

    i3c: master: Fix use-after-free of master->this
    
    [ Upstream commit feb0ed76601f3c2f91f08688c5a7d8b9d382f720 ]
    
    sysfs attribute callbacks for the master controller device dereference
    master->this.  However, master->this is freed in
    i3c_master_detach_free_devs() before the master device itself is
    released.
    
    As a result, sysfs accesses can dereference a freed master->this
    pointer, leading to a use-after-free.
    
    Keep master->this alive until i3c_masterdev_release(), which is called
    after the master device and its sysfs state are being torn down. Do not
    free master->this as part of the normal device detach path.
    
    On the error path in i3c_master_set_info(), reset master->this and
    bus.cur_master to NULL before freeing the allocated device.
    
    Fixes: 3a379bbcea0a ("i3c: Add core I3C infrastructure")
    Cc: [email protected]
    Signed-off-by: Adrian Hunter <[email protected]>
    Reviewed-by: Frank Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Alexandre Belloni <[email protected]>
    [ retained of_node_put(dev->of_node) instead of upstream’s fwnode_handle_put(dev->fwnode). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ibmveth: h_free logical LAN on open-fail after register [+ + +]
Author: Mingming Cao <[email protected]>
Date:   Fri Sep 25 11:05:29 2026 -0700

    ibmveth: h_free logical LAN on open-fail after register
    
    commit af0524bf4ce1a4cbd2946aa81751582951cfcab5 upstream.
    
    ibmveth_open() registers the logical LAN, then allocates the RX
    buffer pools. A pool failure jumps to out_free_buffer_pools without
    h_free_logical_lan(), so PHYP still owns the buffer-list page when
    it is unmapped. request_irq() failure already issued the hypercall
    before taking the same label.
    
    Move that h_free to the shared post-register unwind so both paths
    deregister before the buffer list is unmapped.
    
    Fixes: d43732ce021f ("ibmveth: properly unwind on init errors")
    Cc: [email protected]
    Signed-off-by: Mingming Cao <[email protected]>
    Reviewed-by: Dave Marquardt <[email protected]>
    Link: https://patch.msgid.link/7a56fbfb9e0674f011f4e310fbd7dfd8e67c30aa.1790357373.git.mmc@linux.ibm.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
iio: accel: kxcjk-1013: reject duplicate event disable [+ + +]
Author: Jiale Yao <[email protected]>
Date:   Fri Sep 25 22:09:43 2026 +0800

    iio: accel: kxcjk-1013: reject duplicate event disable
    
    commit dd30c10ff60d2b30386c23bb7c61cc97f2385c97 upstream.
    
    The IIO core does not filter duplicate writes to the event enable
    attribute. kxcjk1013_write_event_config() already ignores repeated
    enable requests, but a repeated disable request still calls
    kxcjk1013_set_power_state(data, false), dropping a runtime PM reference
    that was not acquired for this request. This can underflow the runtime
    PM usage count and trigger a "Runtime PM usage count underflow" warning.
    
    Return early when the requested state already matches ev_enable_state.
    
    Fixes: b4b491c0832e ("iio: accel: kxcjk-1013: Support thresholds")
    Signed-off-by: Jiale Yao <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: accel: sca3000: fix frequency divider condition check [+ + +]
Author: Salah Triki <[email protected]>
Date:   Wed Aug 19 12:41:01 2026 +0100

    iio: accel: sca3000: fix frequency divider condition check
    
    commit d380bf5f94a892e546d9a94e8557ad866b043a2a upstream.
    
    When setting the sampling frequency, the check for `base_freq / 2` is
    followed by an independent `if` statement for `base_freq / 4`. If `val`
    equals `base_freq / 2`, the second check fails and falls through to the
    `else if (val != base_freq)` branch, returning `-EINVAL` erroneously.
    
    Fix this by chaining the checks with `else if`.
    
    Fixes: e0f3fc9b47e6 ("iio: accel: sca3000_core: implemented IIO_CHAN_INFO_SAMP_FREQ")
    Signed-off-by: Salah Triki <[email protected]>
    Reviewed-by: Joshua Crofts <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: adc: aspeed: propagate reset deassert errors [+ + +]
Author: Pengpeng Hou <[email protected]>
Date:   Wed Oct 7 04:38:48 2026 -0400

    iio: adc: aspeed: propagate reset deassert errors
    
    [ Upstream commit 95e4eb426b4bd666fa2f37886c0ddf74a0cc6167 ]
    
    aspeed_adc_probe() continues to register ADC resources after deasserting
    the shared reset, even if the reset controller reports a failure.
    
    A failed deassertion leaves the hardware unavailable, so stop probing
    before installing the cleanup action and enabling the ADC.
    
    Fixes: edf7550a1f93 ("iio: adc: aspeed: Deassert reset in probe")
    Signed-off-by: Pengpeng Hou <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    [ sashal: Changed the direct error return to a jump to the existing reset_error label. ]
    Signed-off-by: Sasha Levin <[email protected]>

iio: adc: max1363: sign-extend bipolar differential channel reads [+ + +]
Author: Cong Nguyen <[email protected]>
Date:   Wed Oct 7 04:53:39 2026 -0400

    iio: adc: max1363: sign-extend bipolar differential channel reads
    
    [ Upstream commit 91908c0a78baddc8572aa3ab69e62ee2eb496ba4 ]
    
    MAX1363 differential channels are bipolar, but max1363_read_single_chan()
    masks the raw value to the ADC resolution without sign-extending it.
    Negative differential readings are therefore reported to userspace as
    large positive values (e.g. -1 as 4095 on a 12-bit part).
    
    Sign-extend the masked value from the resolution bit for differential
    channels. Single-ended channels are unipolar and are left unchanged.
    
    Fixes: d1325cf45077 ("Staging: IIO: max1363 ADC driver")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-4
    Signed-off-by: Cong Nguyen <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

iio: adc: sun4i-gpadc-iio: clean up on thermal zone registration failure [+ + +]
Author: Felix Gu <[email protected]>
Date:   Sun Sep 6 23:58:35 2026 +0800

    iio: adc: sun4i-gpadc-iio: clean up on thermal zone registration failure
    
    commit 2cdc7ef31827db4fbc6283750420639569e1f0e9 upstream.
    
    If devm_thermal_of_zone_register() fails, probe returns without
    unregistering the IIO map array or disabling runtime PM.
    
    Jump to err_map to release them.
    
    Fixes: b0a242894f11 ("iio: adc: sun4i-gpadc-iio: register in the thermal after registering in pm")
    Signed-off-by: Felix Gu <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: adc: sun4i-gpadc-iio: drop underflowing pm_runtime_put() calls [+ + +]
Author: Felix Gu <[email protected]>
Date:   Sun Sep 6 23:58:34 2026 +0800

    iio: adc: sun4i-gpadc-iio: drop underflowing pm_runtime_put() calls
    
    commit 8b958dd214ad0c003f56549e9e039cb8067dc1a2 upstream.
    
    Neither the error path in sun4i_gpadc_probe() nor sun4i_gpadc_remove()
    ever holds a runtime PM usage count. So the pm_runtime_put() in both
    places always triggers the "Runtime PM usage count underflow!" warning
    on every failed probe and every unbind.
    
    Drop both calls.
    
    Fixes: d1caa9905538 ("iio: adc: add support for Allwinner SoCs ADC")
    Signed-off-by: Felix Gu <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: gyro: adis16136: fix unprotected debugfs reads [+ + +]
Author: Arka Mondal <[email protected]>
Date:   Sun Aug 16 03:27:26 2026 +0900

    iio: gyro: adis16136: fix unprotected debugfs reads
    
    commit 2b498df75d6c29aa3e760127ae0f0003df598b53 upstream.
    
    The serial_number file operations are open coded and never call
    debugfs_file_get(), which debugfs_create_file_unsafe() requires.
    debugfs_remove_recursive() therefore does not wait for a read in
    progress, and unbind frees the iio_dev underneath it.
    
    Use debugfs_create_file() instead.
    
    Fixes: 9aaea09b4cbd ("gyro:adis16136: fix debugfs_simple_attr.cocci warnings")
    Signed-off-by: Arka Mondal <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: imu: adis16400: fix unprotected debugfs reads [+ + +]
Author: Arka Mondal <[email protected]>
Date:   Sun Aug 16 03:27:25 2026 +0900

    iio: imu: adis16400: fix unprotected debugfs reads
    
    commit d94787287a113a1326211647d5e0deed1e9de105 upstream.
    
    adis16400_serial_number_fops is open coded and never calls
    debugfs_file_get(), so debugfs_remove_recursive() does not wait for a
    read in progress and unbind frees the iio_dev underneath it.
    
    Commit ae1d37a9bb4b ("iio: imu: adis16400: use DEFINE_DEBUGFS_ATTRIBUTE
    instead of DEFINE_SIMPLE_ATTRIBUTE") converted product_id and
    flash_count to DEFINE_DEBUGFS_ATTRIBUTE, which protects itself, but
    moved all three files to debugfs_create_file_unsafe().
    
    serial_number prints three registers as "%.4x-%.4x-%.4x" and
    DEFINE_DEBUGFS_ATTRIBUTE() formats a single u64, so it cannot be
    converted without changing what the file returns. adis16475 and
    adis16550 already use debugfs_create_file() for their open coded
    files. Use it here too.
    
    Fixes: ae1d37a9bb4b ("iio: imu: adis16400: use DEFINE_DEBUGFS_ATTRIBUTE instead of DEFINE_SIMPLE_ATTRIBUTE")
    Signed-off-by: Arka Mondal <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: imu: adis16480: fix unprotected debugfs reads [+ + +]
Author: Arka Mondal <[email protected]>
Date:   Sun Aug 16 03:27:24 2026 +0900

    iio: imu: adis16480: fix unprotected debugfs reads
    
    commit e1dea54496f90a62318cf4eeaa1e9ef8316e92b6 upstream.
    
    The firmware_revision and firmware_date file operations are open coded
    and never call debugfs_file_get(), which debugfs_create_file_unsafe()
    requires. debugfs_remove_recursive() therefore does not wait for a read
    in progress, and unbind frees the iio_dev underneath it.
    
    Use debugfs_create_file() instead.
    
    Fixes: 9bf94f836e32 ("imu:adis16480: fix debugfs_simple_attr.cocci warnings")
    Signed-off-by: Arka Mondal <[email protected]>
    Reviewed-by: Andy Shevchenko <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: light: gp2ap020a00f: drain irq_work after free_irq [+ + +]
Author: Fan Wu <[email protected]>
Date:   Thu Aug 6 13:29:23 2026 +0000

    iio: light: gp2ap020a00f: drain irq_work after free_irq
    
    commit 63213927b141085b6c8719b8037dab3074b7e0fe upstream.
    
    The threaded IRQ handler queues data->work through irq_work_queue() so
    the trigger is polled from a per-CPU context.  free_irq() does not flush
    an irq_work the handler already queued, so after gp2ap020a00f_remove()
    returns that work may still run and call iio_trigger_poll() on data->trig,
    which the devm cleanup has already freed, causing a use-after-free.
    
    Add irq_work_sync(&data->work) after free_irq() in remove() and in the
    probe error path, mirroring commit 78601726d4a5 ("iio: trigger: sysfs:
    fix use-after-free on remove").
    
    Found by an in-house static analysis tool, confirmed by manual review.
    
    Fixes: bf29fbeaa13d ("iio: gp2ap020a00f: Add a driver for the device")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: proximity: isl29501: Fix return type of isl29501_register_write [+ + +]
Author: Salah Triki <[email protected]>
Date:   Thu Sep 17 14:00:52 2026 +0100

    iio: proximity: isl29501: Fix return type of isl29501_register_write
    
    commit e8dd273d199f5bbe295a8e3d8b777c5505b6b2e1 upstream.
    
    isl29501_register_write() was returning a u32 instead of an int.
    Since the function returns negative error codes (such as -ERANGE or
    return values from i2c_smbus_write_byte_data()), returning an unsigned
    integer type prevents callers from correctly checking for negative error
    conditions.
    
    Fix this by changing the function return type from u32 to int.
    
    This was found through manual code review.
    
    Fixes: 1c28799257bc ("iio: light: isl29501: Add support for the ISL29501 ToF sensor.")
    Signed-off-by: Salah Triki <[email protected]>
    Reviewed-by: Joshua Crofts <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

iio: proximity: pulsedlight: fix iio_device left registered on PM setup failure [+ + +]
Author: Cong Nguyen <[email protected]>
Date:   Fri Aug 28 17:59:09 2026 +0700

    iio: proximity: pulsedlight: fix iio_device left registered on PM setup failure
    
    commit 4daa9ca557b4b98ae1ad38a6d1deaa3e31eb8edf upstream.
    
    pm_runtime_set_active() failing in probe() jumps to error_unreg_buffer,
    which only calls iio_triggered_buffer_cleanup() -- it does not undo the
    iio_device_register() that already succeeded a few lines above. probe()
    then returns the error, the devm-managed indio_dev is freed, but the
    iio core still has it registered: the sysfs/chardev nodes stay live and
    point at freed memory.
    
    Add an error_unreg_dev label that unregisters the iio device before
    falling through to the existing buffer cleanup, mirroring the teardown
    order already used in lidar_remove().
    
    Fixes: 4ac4e086fd8c ("iio: pulsedlight-lidar-lite: add runtime PM")
    Assisted-by: Claude:claude-opus-4
    Signed-off-by: Cong Nguyen <[email protected]>
    Cc: [email protected]
    Signed-off-by: Jonathan Cameron <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Input: atkbd - skip deactivate for Lenovo IdeaPad Slim 3 15IWC11 [+ + +]
Author: Martino Papero <[email protected]>
Date:   Wed Sep 30 22:10:41 2026 +0200

    Input: atkbd - skip deactivate for Lenovo IdeaPad Slim 3 15IWC11
    
    commit 3bf8d603fd45649c106cae6290a10f20b1bbb569 upstream.
    
    The internal keyboard on the Lenovo IdeaPad Slim 3 15IWC11 (83RR)
    does not work correctly with the default i8042 settings. Using
    i8042.nopnp=1 and i8042.dumbkbd=1 restores keyboard input, but prevents
    the Caps Lock LED from working. Using i8042.nopnp=1 alone does not fix
    the keyboard.
    
    The laptop works correctly when atkbd_deactivate_fixup is used instead.
    Add a DMI quirk for the 83RR to enable it.
    
    This was tested without any i8042 command-line parameters. Keyboard
    input and the Caps Lock LED work correctly, including after suspend
    and resume and after a cold boot.
    
    Link: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Martino Papero <[email protected]>
    Reviewed-by: Hans de Goede <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Input: byd - synchronize timer deletion before freeing private data [+ + +]
Author: Linmao Li <[email protected]>
Date:   Mon Aug 24 12:26:11 2026 -0400

    Input: byd - synchronize timer deletion before freeing private data
    
    [ Upstream commit c83e79c0842ed29860648bcce5022ef0ba5001c6 ]
    
    byd_disconnect() uses timer_delete() before freeing the driver's private
    data.  This does not wait for a running byd_clear_touch() callback, which
    dereferences the private data and its psmouse pointer.  A callback racing
    with disconnect can therefore access the private data after it has been
    freed.  The timer can also still be re-armed by byd_process_byte() while
    the disconnect is in progress.
    
    Use timer_shutdown_sync() before freeing the private data: it waits for
    a running callback and turns any later re-arm attempt into a no-op.
    
    Fixes: 2d5f5611dd0d ("Input: byd - enable absolute mode")
    Cc: [email protected]
    Signed-off-by: Linmao Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

Input: i8042 - add nomux quirk for Fujitsu LIFEBOOK U7410 [+ + +]
Author: Lovekesh Solanki <[email protected]>
Date:   Sun Sep 20 17:05:41 2026 +0530

    Input: i8042 - add nomux quirk for Fujitsu LIFEBOOK U7410
    
    commit 495cd7f858b45d2ffa9b685bba3a8c23c1ca4dd3 upstream.
    
    On the Fujitsu LIFEBOOK U7410 the internal keyboard and touchpad die
    shortly after boot if i8042 multiplexing controller is probed and
    switched to muxed mode. These multiplexing setup commands disturb the EC
    emulated keyboard and atkbd reports "Spurious ACK" and "Unknown key
    pressed" warnings, after which both keyboard and touchpad stop
    delivering events. Both touchpad and keyboard work in BIOS and GRUB.
    
    Disabling multiplexer using i8042.nomux=1 makes both devices work on
    warm/cold boot.
    
    Add a DMI quirk to force nomux mode for this model.
    
    Reported-by: Heiko Brey <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Lovekesh Solanki <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Input: s6sy761 - fix resume ordering and restore sensing [+ + +]
Author: David Heidelberg <[email protected]>
Date:   Mon Oct 5 17:12:53 2026 -0400

    Input: s6sy761 - fix resume ordering and restore sensing
    
    [ Upstream commit a215720959c5450b3699e243904b39c3f8f68888 ]
    
    System suspend powers the controller off and resume powers it back on,
    but the resume path enables the interrupt before s6sy761_power_on()
    checks the boot. The firmware raises its boot-complete event on the
    interrupt line, the threaded handler consumes it, s6sy761_power_on()
    then reads an empty event and resume fails with -ENODEV, skipping the
    touch function setup:
    
    s6sy761 2-0048: PM: dpm_run_callback(): s6sy761_resume [s6sy761] returns -19
    
    Power the chip on first and only then unmask the interrupt. Once resume
    completes the boot handshake the chip comes back with sensing off, as
    at probe where input_open() turns it on, so the touchscreen stays dead
    after resume. Send SENSE_ON again when the input device is open.
    
    Tested on a Pixel 3 XL over several s2idle cycles: resume succeeds and
    the touch function and sense status match the pre-suspend state.
    
    Assisted-by: LLM
    Cc: [email protected]
    Fixes: 0145a7141e59 ("Input: add support for the Samsung S6SY761 touchscreen")
    Signed-off-by: David Heidelberg <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    [ sashal: Replaced the guarded input_device_enabled() check with sdata->input->users under explicit mutex locking. ]
    Signed-off-by: Sasha Levin <[email protected]>

Input: synaptics - add LEN205b entry to smbus_pnp_ids for ThinkPad T490 [+ + +]
Author: Lovekesh Solanki <[email protected]>
Date:   Mon Sep 21 01:37:30 2026 +0530

    Input: synaptics - add LEN205b entry to smbus_pnp_ids for ThinkPad T490
    
    commit a961417c5ae77bbb728a23d9577ecd8f4d8a4b5a upstream.
    
    Lenovo ThinkPad T490 has a Synaptics Touchpad that supports SMBus/RMI4
    mode, but is not listed in smbus_pnp_ids table.
    
    Add LEN205b to smbus_pnp_ids[] passlist.
    
    Reported-by: John Rosencutter <[email protected]>
    Closes: https://lore.kernel.org/all/CAOGuaRh025eKcBf9P8UrvtXNp68vQ0HVF2EbNMp-kpdaC1HNpA@mail.gmail.com/
    Signed-off-by: Lovekesh Solanki <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Cc: [email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

Input: synaptics - limit T440p InterTouch quirk to LEN0036 [+ + +]
Author: Raphaël Larocque <[email protected]>
Date:   Sat Sep 26 20:58:10 2026 -0400

    Input: synaptics - limit T440p InterTouch quirk to LEN0036
    
    commit f0fd8993082ca229faa3f9844f1c9fe182eca20b upstream.
    
    The ThinkPad L440 also uses board id 2722, but does not have the SMBus
    initialization problem seen on the T440p. On the L440, the SMBus
    companion becomes available shortly after psmouse probes, allowing the
    touchpad to use SMBus/RMI4 normally.
    
    The T440p's quirk is currently applied to all Synaptics touchpads with
    board id 2722, unnecessarily disabling SMBus InterTouch on the L440,
    as reported by Daniel Salmun.
    
    Restrict the quirk to PNP ID LEN0036, which identifies the T440p, so
    that other devices sharing board id 2722 retain their normal
    SMBus/RMI4 operation.
    
    Reported-by: Daniel Salmun <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Fixes: 26eb3d92c7a4 ("Input: synaptics - disable InterTouch on ThinkPad T440p (board id 2722)")
    Cc: [email protected]
    Signed-off-by: Raphaël Larocque <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Dmitry Torokhov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
io_uring/rw: end write accounting from ->ki_complete [+ + +]
Author: Jens Axboe <[email protected]>
Date:   Wed Sep 16 21:13:19 2026 -0400

    io_uring/rw: end write accounting from ->ki_complete
    
    [ Upstream commit 796aa0547557e63338657ed1c487906f9fac4c73 ]
    
    Commit b000145e9907 moved both the fsnotify calls and the write
    accounting out of the kiocb completion handler and into the
    io_req_rw_complete() task_work. However, only the fsnotify part actually
    needed to move as it may sleep. Ending the write accounting is just a
    percpu_up_read() on the superblock writers sem.
    
    Deferring it is a problem, because it makes dropping SB_FREEZE_WRITE
    protection depend on the ring owner getting to running task_work. But
    the task may be blocked in freeze_super(), causing it to never get to
    that:
    
      task                             io-wq worker
      --------------------------------------------------------------
      io_write()
        io_kiocb_start_write()         (takes sb_writers, hidden from
                                        lockdep by __sb_writers_release)
        write_iter() -> -EIOCBQUEUED
      ioctl(FS_IOC_SHUTDOWN)
        bdev_freeze()
          freeze_super()
            percpu_down_write()        <- waits for the reader above
                                       io_write()
                                         kiocb_start_write()
                                           percpu_down_read()  <- queued
                                                                  behind the
                                                                  writer
      <bio completes>
        io_complete_rw()
          queues io_req_rw_complete()  <- never runs, task is in D state
    
    End the write from io_complete_rw() instead, and leave only the fsnotify
    calls in task_work.
    
    Reported-by: [email protected]
    Cc: [email protected]
    Fixes: b000145e9907 ("io_uring/rw: defer fsnotify calls to task context")
    Signed-off-by: Jens Axboe <[email protected]>
    [ placed write-accounting release after __io_complete_rw_common() to accommodate the older retry path’s early return. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
iommu: disable SVA when CONFIG_X86 is set [+ + +]
Author: Lu Baolu <[email protected]>
Date:   Wed Oct 22 16:26:27 2025 +0800

    iommu: disable SVA when CONFIG_X86 is set
    
    commit 72f98ef9a4be30d2a60136dd6faee376f780d06c upstream.
    
    Patch series "Fix stale IOTLB entries for kernel address space", v7.
    
    This proposes a fix for a security vulnerability related to IOMMU Shared
    Virtual Addressing (SVA).  In an SVA context, an IOMMU can cache kernel
    page table entries.  When a kernel page table page is freed and
    reallocated for another purpose, the IOMMU might still hold stale,
    incorrect entries.  This can be exploited to cause a use-after-free or
    write-after-free condition, potentially leading to privilege escalation or
    data corruption.
    
    This solution introduces a deferred freeing mechanism for kernel page
    table pages, which provides a safe window to notify the IOMMU to
    invalidate its caches before the page is reused.
    
    
    This patch (of 8):
    
    In the IOMMU Shared Virtual Addressing (SVA) context, the IOMMU hardware
    shares and walks the CPU's page tables.  The x86 architecture maps the
    kernel's virtual address space into the upper portion of every process's
    page table.  Consequently, in an SVA context, the IOMMU hardware can walk
    and cache kernel page table entries.
    
    The Linux kernel currently lacks a notification mechanism for kernel page
    table changes, specifically when page table pages are freed and reused.
    The IOMMU driver is only notified of changes to user virtual address
    mappings.  This can cause the IOMMU's internal caches to retain stale
    entries for kernel VA.
    
    Use-After-Free (UAF) and Write-After-Free (WAF) conditions arise when
    kernel page table pages are freed and later reallocated.  The IOMMU could
    misinterpret the new data as valid page table entries.  The IOMMU might
    then walk into attacker-controlled memory, leading to arbitrary physical
    memory DMA access or privilege escalation.  This is also a
    Write-After-Free issue, as the IOMMU will potentially continue to write
    Accessed and Dirty bits to the freed memory while attempting to walk the
    stale page tables.
    
    Currently, SVA contexts are unprivileged and cannot access kernel
    mappings.  However, the IOMMU will still walk kernel-only page tables all
    the way down to the leaf entries, where it realizes the mapping is for the
    kernel and errors out.  This means the IOMMU still caches these
    intermediate page table entries, making the described vulnerability a real
    concern.
    
    Disable SVA on x86 architecture until the IOMMU can receive notification
    to flush the paging cache before freeing the CPU kernel page table pages.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Link: https://lkml.kernel.org/r/[email protected]
    Fixes: 26b25a2b98e4 ("iommu: Bind process address spaces to devices")
    Signed-off-by: Lu Baolu <[email protected]>
    Suggested-by: Jason Gunthorpe <[email protected]>
    Reviewed-by: Jason Gunthorpe <[email protected]>
    Cc: Alistair Popple <[email protected]>
    Cc: Andy Lutomirski <[email protected]>
    Cc: Borislav Betkov <[email protected]>
    Cc: Dave Hansen <[email protected]>
    Cc: David Hildenbrand <[email protected]>
    Cc: Ingo Molnar <[email protected]>
    Cc: Jann Horn <[email protected]>
    Cc: Jean-Philippe Brucker <[email protected]>
    Cc: Joerg Roedel <[email protected]>
    Cc: Kevin Tian <[email protected]>
    Cc: Liam Howlett <[email protected]>
    Cc: Lorenzo Stoakes <[email protected]>
    Cc: Matthew Wilcox (Oracle) <[email protected]>
    Cc: Michal Hocko <[email protected]>
    Cc: Mike Rapoport <[email protected]>
    Cc: Peter Zijlstra <[email protected]>
    Cc: Robin Murohy <[email protected]>
    Cc: Thomas Gleinxer <[email protected]>
    Cc: "Uladzislau Rezki (Sony)" <[email protected]>
    Cc: Vasant Hegde <[email protected]>
    Cc: Vinicius Costa Gomes <[email protected]>
    Cc: Vlastimil Babka <[email protected]>
    Cc: Will Deacon <[email protected]>
    Cc: Yi Lai <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ The context change is due to the commit
      be51b1d6bbff ("iommu/sva: Refactoring iommu_sva_bind/unbind_device()")
      and the commit 757636ed2607 ("iommu: Rename iommu-sva-lib.{c,h}")
      in v6.2 which are irrelevant to the logic of this patch. ]
    Signed-off-by: Rahul Sharma <[email protected]>
    Signed-off-by: Roman Demidov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
ipmr: account multicast table and route memory [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 16 12:21:16 2026 -0400

    ipmr: account multicast table and route memory
    
    [ Upstream commit b7ee18725f2292ab554aa96a101ae42d45f008bd ]
    
    A netadmin in a user+net namespace can create many IPv4 and IPv6
    multicast routing tables with MRT_TABLE and MRT6_TABLE. Each unseen
    id allocates an mr_table via the shared mr_table_alloc(), links it
    into the per-net list, and leaves it until netns teardown. Those
    objects were not charged to memcg, so the host unreclaimable slab
    grows with the table count.
    
    Account mr_table allocations with GFP_KERNEL_ACCOUNT and mark the
    IPv4/IPv6 MFC caches SLAB_ACCOUNT. This matches the established
    handling of IP addresses, routes and alternate interface names.
    
    Unresolved MFC entries are still allocated from softIRQ with
    GFP_ATOMIC and are not charged. They expire after 10 seconds and are
    bounded by the socket receive queue; see commit 0079ad8e8dc3
    ("ipmr: remove hard code cache_resolve_queue_len limit").
    
    Fixes: f0ad0860d01e ("ipv4: ipmr: support multiple tables")
    Fixes: d1db275dd3f6 ("ipv6: ip6mr: support multiple tables")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/050b58f7fc6b45da0fb12768ebb62d18fa46133d.1788784801.git.zihanx@nebusec.ai
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adapted upstream allocation helpers to existing kzalloc() and kmem_cache_create() calls. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ipv4: avoid divide by zero in fib_rebalance [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Thu Aug 27 18:25:14 2026 +0000

    ipv4: avoid divide by zero in fib_rebalance
    
    commit 5046d2880fec7d49ebed2fd2866747ee1d06ad71 upstream.
    
    fib_rebalance() computes the total eligible nexthop weight in one pass
    and programs upper bounds in a second pass. A concurrent change to
    ignore_routes_with_linkdown can make the first pass return zero while
    the second pass sees an eligible nexthop, resulting in division by zero.
    
    If the first pass reports a zero total, set each nexthop upper bound to
    -1 and skip the division. This matches the IPv6 fix in commit
    d2c26c2911dd ("ipv6: avoid divide by zero in rt6_multipath_rebalance")
    and preserves the lock-free rebalance path.
    
    Fixes: 0e884c78ee19 ("ipv4: L3 hash-based multipath")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

ipv4: udp: Create exceptions before socket matching [+ + +]
Author: Ido Schimmel <[email protected]>
Date:   Thu Oct 22 19:31:05 2026 -0400

    ipv4: udp: Create exceptions before socket matching
    
    [ Upstream commit 4c3499f79f8c7e8561266bcc220a18538cec0458 ]
    
    Currently, when ICMP Fragmentation Needed and Redirect Message packets
    are locally delivered and quote a UDP packet, a FIB nexthop exception
    (FNHE) is only created if the kernel can match the UDP packet to an
    existing socket.
    
    This behavior allows off-path attackers to conduct a side-channel attack
    on the FNHE cache in order to discover the ephemeral port used by a
    connected UDP socket.
    
    Commit 6457378fe796 ("ipv4: use siphash instead of Jenkins in
    fnhe_hashfun()") and commit 67d6d681e15b ("ipv4: make exception cache
    less predictible") tried to mitigate such attacks by making it harder
    for attackers to discover hash collisions in the FNHE cache and by
    randomizing the number of exceptions a hash bucket can hold,
    respectively. Unfortunately, both of the mitigations can be bypassed.
    
    Instead, mitigate such attacks by always creating a FNHE, even before
    trying to find a matching socket. Do that by calling ipv4_update_pmtu()
    and ipv4_redirect(), the helpers used when the quoted packet did not
    originate from a socket.
    
    This means that guesses (right or wrong) from an off-path attacker will
    always result in a FNHE being created or updated in the cache that the
    attacker can observe.
    
    Pass an oif of 0, in a similar fashion to icmp_err(). This is also the
    oif used by the socket path for sockets that are not bound to a device.
    
    Note that this does not allow attackers to create FNHEs that they could
    not create before, as both helpers can already be reached with little to
    no validation. For example, by sending an ICMP error that quotes an ICMP
    Echo Reply or one that quotes a UDP source port that matches a wildcard
    socket.
    
    Also note that in the good case (matched socket) the above scheme comes
    at the cost of an extra route lookup, as the no socket helpers perform
    their own lookup before the one performed by ipv4_sk_update_pmtu() /
    ipv4_sk_redirect(). When the two resolve to different nexthops, it also
    results in two exceptions being created for the same destination IP. One
    in the FNHE cache of the nexthop resolved by the no socket helpers and
    another in the FNHE cache of the nexthop used by the socket.
    
    Fixes: 4895c771c7f0 ("ipv4: Add FIB nexthop exceptions.")
    Cc: [email protected]
    Reported-by: Amit Klein <[email protected]>
    Reported-by: Noam Caspi <[email protected]>
    Signed-off-by: Ido Schimmel <[email protected]>
    Reviewed-by: David Ahern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ sashal: inlined udp_err_update_exception() logic in the existing udp_err() wrapper. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel() [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Mon Sep 28 19:45:24 2026 +0000

    ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel()
    
    [ Upstream commit 8ec454dcd00ce3375119111c6394964455b36d0d ]
    
    Since commit d58e468b1112 ("flow_dissector: implements flow dissector
    BPF hook") __skb_flow_dissect() needs a net pointer, either from
    skb->dev, skb->sk, or since commit 3cbf4ffba5ee ("net: plumb network
    namespace into __skb_flow_dissect") a caller provided pointer.
    
    syzbot was able to reach seg6_make_flowlabel() with an skb having
    neither skb->dev nor skb->sk set: a TIPC UDP bearer sends a discovery
    message through an IPv4 route using seg6 encap, while
    net.ipv6.seg6_flowlabel is set to 1.
    
    seg6_make_flowlabel() already has a net pointer, use skb_get_hash_net().
    
    WARNING: net/core/flow_dissector.c:1131 at __skb_flow_dissect+0x910/0x5368 net/core/flow_dissector.c:1126, CPU#0: syz.0.17/4930
    Call trace:
      __skb_flow_dissect+0x910/0x5368 net/core/flow_dissector.c:1126 (P)
      __skb_get_hash_net+0xe0/0x29c net/core/flow_dissector.c:1903
      skb_get_hash include/linux/skbuff.h:1663 [inline]
      seg6_make_flowlabel+0xcc/0x1ec net/ipv6/seg6_iptunnel.c:132
      __seg6_do_srh_encap+0x320/0xbf4 net/ipv6/seg6_iptunnel.c:161
      seg6_do_srh+0x4b4/0xa44 net/ipv6/seg6_iptunnel.c:431
      seg6_output_core+0x164/0x688 net/ipv6/seg6_iptunnel.c:681
      seg6_output+0x44/0x1ac net/ipv6/seg6_iptunnel.c:744
      lwtunnel_output+0x3d0/0x664 net/core/lwtunnel.c:356
      dst_output include/net/dst.h:470 [inline]
      ip_local_out+0x110/0x148 net/ipv4/ip_output.c:131
      iptunnel_xmit+0x50c/0xd38 net/ipv4/ip_tunnel_core.c:97
      udp_tunnel_xmit_skb+0x220/0x348 net/ipv4/udp_tunnel_core.c:187
      tipc_udp_xmit+0x75c/0x9c0 net/tipc/udp_media.c:202
      tipc_udp_send_msg+0x214/0x374 net/tipc/udp_media.c:274
      tipc_bearer_xmit_skb+0x260/0x3b0 net/tipc/bearer.c:576
      tipc_enable_bearer net/tipc/bearer.c:366 [inline]
      __tipc_nl_bearer_enable+0xc90/0xfb0 net/tipc/bearer.c:1048
      tipc_nl_bearer_enable+0x2c/0x48 net/tipc/bearer.c:1057
      genl_family_rcv_msg_doit+0x1e4/0x2d4 net/netlink/genetlink.c:1114
    
    Fixes: d58e468b1112 ("flow_dissector: implements flow dissector BPF hook")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/netdev/[email protected]/
    Signed-off-by: Eric Dumazet <[email protected]>
    Reviewed-by: Xuanqiang Luo <[email protected]>
    Reviewed-by: Ido Schimmel <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ipvs: bound LBLCR and LBLC cache growth [+ + +]
Author: Zhiling Zou <[email protected]>
Date:   Sat Oct 3 20:33:19 2026 -0400

    ipvs: bound LBLCR and LBLC cache growth
    
    [ Upstream commit 2a3c3de660f96865f303fd25f1285f2ffbfd521d ]
    
    ip_vs_lblcr_new() and ip_vs_lblc_new() create cache entries for
    every previously unseen destination address. The table max_size only
    tells the periodic collector to reclaim entries after the cache has
    already exceeded the limit. It does not reclaim entries that the
    attacker continues to use.
    
    Reject new cache entries once either table reaches max_size * 3 / 2.
    The extra headroom lets the periodic collector catch up while the
    existing scheduler fallback continues to use the selected destination
    when cache creation fails. New traffic therefore stays serviceable
    without growing the tables further.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Suggested-by: Julian Anastasov <[email protected]>
    Signed-off-by: Zhiling Zou <[email protected]>
    Acked-by: Julian Anastasov <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    [ sashal: Retained kmalloc() instead of kmalloc_obj(). ]
    Signed-off-by: Sasha Levin <[email protected]>

ipvs: do not create invisible templates [+ + +]
Author: Julian Anastasov <[email protected]>
Date:   Sat Sep 19 21:07:32 2026 +0300

    ipvs: do not create invisible templates
    
    [ Upstream commit 616cf5c06934364ab1002b420ebe975850b4b208 ]
    
    The IP_VS_CONN_F_ONE_PACKET flag was implemented for normal
    connections. When conn template inherits this flag from
    dest->conn_flags it will not be hashed. As result, we will
    create new template for every new normal connection.
    
    Fix it to allow one template to be used by many normal
    connections.
    
    Fixes: 26ec037f9841 ("IPVS: one-packet scheduling")
    Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260916231652.127456-1-pablo%40netfilter.org
    Signed-off-by: Julian Anastasov <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ipvs: filter some flags received in the backup server [+ + +]
Author: Julian Anastasov <[email protected]>
Date:   Sat Sep 19 21:07:33 2026 +0300

    ipvs: filter some flags received in the backup server
    
    [ Upstream commit f96e91748f6304668fe647e686d199d7207d36f1 ]
    
    While the IPVS SYNC protocol is not secure by design
    we can still protect the backup server from messages that
    can wreak havoc.
    
    This commit addresses problems from received connection flags
    or their combinations. We now drop messages as follows:
    
    1. the NO_CPORT+TEMPLATE combination allows lookups for normal
    connections to hit template which can break in many ways.
    While the master does not sync connections with NO_CPORT flag,
    i.e. before they are established, we still accept NO_CPORT
    without TEMPLATE.
    
    2. ONE_PACKET: it is not sent by master, so we do not
    expect it in backup. Before now it was ignored by
    IP_VS_CONN_F_BACKUP_MASK for protocol v1 while protocol
    v0 created connections that are not hashed and dropped
    immediately. Better to apply the IP_VS_CONN_F_BACKUP_MASK
    also to the flags from v0 messages for consistency with v1.
    
    Fixes: 87375ab47cd0 ("[IPVS]: ip_vs_ftp breaks connections using persistence")
    Signed-off-by: Julian Anastasov <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ipvs: fix missing counter decrement in lblc [+ + +]
Author: Julian Anastasov <[email protected]>
Date:   Thu Sep 10 13:08:31 2026 +0300

    ipvs: fix missing counter decrement in lblc
    
    [ Upstream commit bdac17779f46817f60103baf09f0370546c3f023 ]
    
    LBLC may delete cache entries for destinations that are
    removed or overloaded and replace them with available ones.
    But ip_vs_lblc_new() forgets to decrement the tbl->entries
    counter after calling ip_vs_lblc_del(). This can lead to
    increased shrinking of the cache with every new garbage
    collection.
    
    Fixes: 2f3d771a35fe ("ipvs: do not use dest after ip_vs_dest_put in LBLC")
    Link: https://sashiko.dev/#/patchset/0bdd5abe9968ded7ca2b9cb6844ba83d94cc8d53.1787318053.git.zhilinz%40nebusec.ai
    Signed-off-by: Julian Anastasov <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
kernel/params.c: Use kstrtobool() instead of strtobool() [+ + +]
Author: Christophe JAILLET <[email protected]>
Date:   Tue Sep 8 14:28:40 2026 -0400

    kernel/params.c: Use kstrtobool() instead of strtobool()
    
    [ Upstream commit def7b92efd868a6c78da86770704c1a03506016e ]
    
    strtobool() is the same as kstrtobool().
    However, the latter is more used within the kernel.
    
    In order to remove strtobool() and slightly simplify kstrtox.h, switch to
    the other function name.
    
    While at it, include the corresponding header file (<linux/kstrtox.h>)
    
    Signed-off-by: Christophe JAILLET <[email protected]>
    Reviewed-by: Miroslav Benes <[email protected]>
    Signed-off-by: Luis Chamberlain <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

 
keys: Avoid the owner account dereference in named keyring lookup [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Fri Oct 9 13:11:59 2026 +0800

    keys: Avoid the owner account dereference in named keyring lookup
    
    commit 51409aaa01f8602552c336009fd22b226b0cdf1d upstream.
    
    Named keyring lookup must keep the storage containing the owner UID
    alive through the namespace mapping check.  find_keyring_by_name()
    reads keyring->user->uid under keyring_name_lock, but that lock protects
    the keyring's name entry and allocation, not its separate key_user.
    
    A named session-keyring join can overlap a privileged KEYCTL_CHOWN on
    another CPU.  If the keyring holds the last reference to its old dynamic
    key_user and the ownership transfer succeeds, the following ordering is
    possible:
    
        Named join                         Chown
        find_keyring_by_name()              keyctl_chown_key()
          read_lock(keyring_name_lock)       down_write(key->sem)
          load old keyring->user
                                             replace key->user and key->uid
                                             up_write(key->sem)
                                             key_put(key)
                                             key_user_put(old user): free
          read old user->uid
          read_unlock(keyring_name_lock)
    
    Chown neither takes keyring_name_lock nor key_session_mutex, so it can
    free the old account between the pointer load and the UID read.  The
    lookup then reads freed memory even though the keyring itself is alive.
    
    Use keyring->uid for the mapping check.  key_alloc() initializes this
    inline owner UID and keyctl_chown_key() updates it on chown.
    The existing name lock keeps its containing keyring allocated throughout
    the check, so lookup no longer depends on the account's lifetime.  This
    also matches the owner UID used by the permission check.
    
    KASAN report as below:
    
        BUG: KASAN: slab-use-after-free in find_keyring_by_name+0x577/0x5d0
        Read of size 4 at addr ffff8881128ae2ec by task keycase/500
    
    Cc: [email protected]
    Fixes: 2ea190d0a006 ("keys: skip keys from another user namespace")
    Assisted-by: LLM
    Signed-off-by: Cen Zhang <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/pm-key-management-objects-candidate-0002-v3-2baa8cad2bb554364e10@gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

keys: Check the authorization payload in process keyring searches [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Fri Oct 9 13:52:16 2026 +0800

    keys: Check the authorization payload in process keyring searches
    
    commit 0a0ec45bf577a9b4d4960567f20d3877ef480de9 upstream.
    
    An authorization payload and its saved credentials must remain valid
    while search_process_keyrings_rcu() searches the requestor's keyrings.
    The function validates the authorization key, then separately loads
    payload.data[0] and unconditionally reads rka->cred. Validation does
    not prevent request_key_auth_revoke() from clearing the payload.
    
    A request-key helper can assume authority and fork a descendant that
    inherits the authorization key. If the descendant misses in its own
    keyrings, it falls back to the saved requestor credentials. Successful
    target instantiation invalidates the authorization key without clearing
    the payload. After the helper exits, UMH_WAIT_PROC returns to the
    requester, which calls complete_request_key() and revokes that key.
    
    With the descendant paused after validation, the paths can interleave
    as follows:
    
      1. The descendant enters search_process_keyrings_rcu() under RCU and
         key_validate() succeeds.
      2. The helper instantiates the target, invalidates the authorization
         key, and exits.
      3. The requester resumes from UMH_WAIT_PROC, calls
         complete_request_key(), and revokes the authorization key.
         request_key_auth_revoke() sets its payload pointer to NULL.
      4. The descendant loads NULL and dereferences rka->cred.
    
    This NULL dereference can oops the kernel. RCU delays payload disposal
    but does not prevent the pointer from being cleared.
    
    Load the payload with dereference_key_rcu() and require a non-NULL
    result before validating the authorization key and searching its saved
    credentials. A non-NULL payload and its credentials remain alive for
    the caller's RCU read-side section; a cleared payload skips the fallback
    search and follows the existing error selection.
    
    KASAN report as below:
    
        Oops: general protection fault, probably for non-canonical address 0xdffffc0000000005: 0000 [#1] SMP KASAN NOPTI
        KASAN: null-ptr-deref in range [0x0000000000000028-0x000000000000002f]
        RIP: 0010:search_process_keyrings_rcu+0x32b/0x790
    
    Cc: [email protected]
    Fixes: e59428f721ee ("keys: Move the RCU locks outwards from the keyring search functions")
    Assisted-by: LLM
    Signed-off-by: Cen Zhang <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/pm-key-management-objects-candidate-0004-v3-598361863b76bc25d58d@gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

keys: finalize persistent keyring timeout after link attempt [+ + +]
Author: Karl Mehltretter <[email protected]>
Date:   Sat Sep 12 11:54:40 2026 +0200

    keys: finalize persistent keyring timeout after link attempt
    
    commit 25bf14f817168079f731975b8998fc2af380f29e upstream.
    
    When no keyring exists for the requested UID, KEYCTL_GET_PERSISTENT
    creates and registers one before linking it to the requested destination.
    The configured timeout is set only after the destination link succeeds.
    
    A destination restricted with KEYCTL_RESTRICT_KEYRING makes that link fail
    with -EPERM. With persistent_keyring_expiry set to 60 seconds, /proc/keys
    still reports the registered keyring's expiry as "perm".
    The failed call therefore leaves a quota-exempt keyring in the namespace's
    hidden register, where it may remain until namespace teardown.
    
    Rename the write-locked helper to key_get_or_create_persistent() and return
    the key reference through a result parameter. Return 0 when it creates a
    keyring and 1 when the retry finds an existing one. Return a negative error
    on failure. Another caller may create the keyring between the initial
    read-locked lookup and the retry under the write lock.
    
    Set the timeout after permission checking and linking. Do this on success,
    or on failure if the call allocated the keyring. This leaves a new keyring
    collectible after failure without starting its timeout while linking is
    still in progress.
    
    Cc: [email protected] # v5.10+
    Fixes: f36f8c75ae2e ("KEYS: Add per-user_namespace registers for persistent per-UID kerberos caches")
    Assisted-by: LLM
    Signed-off-by: Karl Mehltretter <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
KEYS: Fix add_key() race with keyring restriction [+ + +]
Author: 성병찬 <[email protected]>
Date:   Wed Sep 30 13:18:01 2026 +0900

    KEYS: Fix add_key() race with keyring restriction
    
    commit dd3ea3fcba7c75493760cdbccd35f029597e8d5e upstream.
    
    __key_create_or_update() snapshots keyring->restrict_link before taking
    the destination keyring's semaphore.  keyring_restrict() installs a
    restriction while holding that semaphore.
    
    This allows a writer to observe no restriction, wait for the keyring
    owner to install a reject-all restriction and return successfully, and
    then link a key using the stale NULL snapshot.  The writer only needs
    write permission on the destination keyring.
    
    Move the restrict_link read after __key_link_lock() and
    __key_link_begin().  The read and the subsequent restriction check are
    then serialized with restriction installation by keyring->sem.
    
    The race was reproduced on v7.2.8 in 19 executions where restriction
    installation returned before the link completed.  All 19 linked the key
    despite the reject-all restriction.  With this change, 312 executions
    reached the same ordering and every add_key() call failed with -EPERM.
    
    The issue was found by manual concurrency analysis assisted by AI-based
    analysis and independently verified with a QEMU reproducer and kernel
    instrumentation.
    
    Fixes: 5ac7eace2d00 ("KEYS: Add a facility to restrict new links into a keyring")
    Cc: [email protected]
    Signed-off-by: 성병찬 <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KEYS: Fix key_reject_and_link() race with keyring restriction [+ + +]
Author: Adrian Martinez <[email protected]>
Date:   Sat Oct 10 23:40:00 2026 +0300

    KEYS: Fix key_reject_and_link() race with keyring restriction
    
    commit 0b157166e612b70f98a332b6c7be7eac6f8e9593 upstream.
    
    The restrict_link check in key_reject_and_link() is done before taking
    the keyring semaphore, racing with a concurrent keyring_restrict()
    that installs the restriction while holding the semaphore in write
    mode.
    
    Move the check to after __key_link_lock(), so it is done under the
    semaphore, matching the pattern used in __key_create_or_update().
    
    Cc: [email protected]
    Fixes: 5ac7eace2d00 ("KEYS: Add a facility to restrict new links into a keyring")
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Adrian Martinez <[email protected]>
    Link: https://lore.kernel.org/r/CACO1+RT+m==BY+ZPkE+fo536D0qu3wog4xE1dfuXQ56g+=Qv=A@mail.gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
keys: make keyring indexes independent of kernel addresses [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Tue Oct 13 16:12:51 2026 -0700

    keys: make keyring indexes independent of kernel addresses
    
    commit de891c73c1cf41ac8de12c07fa2c84d6a912ad0c upstream.
    
    KEYCTL_READ returns the serial numbers in a keyring in associative-array
    traversal order.  The first word of the index is a public, deterministic
    hash of the type pointer, domain pointer and description.  An unprivileged
    user can therefore insert keys with known descriptions, predict their
    order for each possible KASLR slide, and recover the kernel image address.
    On an x86-64 build with 16 MiB alignment, 45 user keys suffice to
    distinguish the candidate slides.
    
    Remove the addresses from the whole index, not just its first hash word.
    Assign each key type and domain a nonzero 64-bit ID and hash those IDs and
    the description with a once-initialized SipHash key.  Use the full IDs in
    the later index chunks as well.  Truncating or hashing the IDs there would
    lose the guarantee that distinct type/domain/description tuples have a
    differing index bit.
    
    Allocate IDs lazily since private key types need not be registered.  Cache
    them in the index key so tree walks and copies of an existing index do not
    need to dereference a type descriptor that may have been unregistered.
    Keep the 32-bit chunk layout and diff_objects() bit offsets consistent,
    and retain the separate root slot for keyrings used by recursive search.
    The key comparison, permissions and userspace data format are unchanged;
    only the address-dependent in-memory ordering is replaced.
    
    Cc: [email protected]
    Fixes: b2a4df200d57 ("KEYS: Expand the capacity of a keyring")
    Assisted-by: Codex:gpt-6-astra
    Signed-off-by: Kyle Zeng <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

keys: Protect the read method check against type removal [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Mon Oct 19 22:57:21 2026 +0800

    keys: Protect the read method check against type removal
    
    commit 925c84e3cc21caf09de92d9bcafab0147790debf upstream.
    
    keyctl_read_key() checks key->type->read without holding key->sem.
    A reference keeps the key alive, but does not pin the module containing
    its type. A surviving RxRPC key can therefore be read while AF_RXRPC
    is being unloaded:
    
      KEYCTL_READ task                    Module unload and key GC
      ----------------                   ------------------------
      lookup_user_key()
      permission / possession checks
      load key->type
                                         af_rxrpc_exit()
                                           unregister_key_type()
                                             GC: down_write(key->sem)
                                             GC: retype to key_type_dead
                                             GC: up_write(key->sem)
                                           unregister_key_type() returns
                                         free_module()
      read saved type's read member
    
    The final access can read freed module storage. The read invocation in
    __keyctl_read_key() is already protected by key->sem, but the earlier
    method check is outside that critical section.
    
    Move the method check into __keyctl_read_key(), after key_validate() and
    under its existing read hold on key->sem. The check and invocation then
    use the same protected type for length queries and every read retry.
    The GC cannot retype the key until the semaphore is released, and type
    unregistration waits for that GC pass before the module can be freed.
    
    Return -EOPNOTSUPP when validation succeeds and the type has no read
    method. A temporary buffer may now be allocated before this result;
    allocation and copying to userspace remain outside the semaphore.
    
    Assisted-by: LLM
    Cc: [email protected] # v5.10+
    Fixes: d3ec10aa9581 ("KEYS: Don't write out to userspace while holding key semaphore")
    Suggested-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Cen Zhang <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Link: https://lore.kernel.org/r/pm-key-management-objects-candidate-0010-v7-fc85721ff5cfb9e33ac6@gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

keys: Protect the type name while describing a key [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Fri Oct 9 13:11:03 2026 +0800

    keys: Protect the type name while describing a key
    
    commit fced7238b7e80cf8aa688d5af976e4aa6e33c329 upstream.
    
    keyctl_describe_key() must keep the key type's name alive until
    kasprintf() has consumed it. The retained key reference keeps the key
    and its description alive, but does not pin the module providing its
    type. The name is passed to kasprintf() without holding key->sem.
    
    kvasprintf() uses the saved name pointer in two formatting passes, with
    a GFP_KERNEL allocation between them. With AF_RXRPC=m, a task that
    passes View permission before type retirement can overlap a privileged
    module unload in this order:
    
    1. KEYCTL_DESCRIBE looks up the key, saves key->type->name in the
       kasprintf() arguments and completes the first formatting pass.
    2. While the formatter is delayed before its second pass,
       af_rxrpc_exit() calls unregister_key_type(), which removes the type
       from the registry and waits for key_gc_keytype().
    3. The collector takes key->sem for writing, retypes the retained key
       to key_type_dead and completes retirement. Unregistration and module
       exit return, allowing free_module() to release the type and name.
    4. The formatter resumes its second pass and reads the saved name from
       released module storage, which can fault in string().
    
    Hold key->sem for reading across kasprintf(). The collector then cannot
    retype the key or complete retirement until both formatting passes have
    finished. If retirement wins the lock first, formatting uses the core
    key_type_dead name instead. Release the semaphore immediately after
    kasprintf(), including on allocation failure, before copying to
    userspace.
    
    Oops report as below:
    
        BUG: unable to handle page fault for address: fffffbfff8054794
        #PF: supervisor read access in kernel mode
        #PF: error_code(0x0000) - not-present page
        RIP: 0010:string+0x23f/0x470
        Call Trace:
         vsnprintf+0x330/0x1110
    
    Cc: [email protected]
    Fixes: aa9d4437893f ("KEYS: Fix the size of the key description passed to/from userspace")
    Assisted-by: LLM
    Signed-off-by: Cen Zhang <[email protected]>
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Link: https://lore.kernel.org/r/pm-key-management-objects-candidate-0009-v4-6b537c5732fd957c33fa@gmail.com
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
KEYS: trusted: Fix TPM teardown ordering [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Thu Sep 3 11:28:29 2026 -0400

    KEYS: trusted: Fix TPM teardown ordering
    
    [ Upstream commit 5e2d672280d97d83de43031d93761b12dadd7b8a ]
    
    trusted_tpm_exit() drops the TPM chip reference and frees the digest
    array before unregistering the trusted key type. key_type_lookup()
    holds key_types_sem for reading until the key operation finishes, while
    unregister_key_type() takes it for writing. It therefore provides the
    synchronization point that must precede backend teardown.
    
    The current order permits this interleaving:
    
      CPU 0                              CPU 1
      trusted_tpm_exit()                 key_type_lookup("trusted")
        put_device(&chip->dev)             trusted_tpm_seal()
        kfree(digests)                       pcrlock()
        unregister_key_type()                  tpm_pcr_extend(..., digests)
    
    CPU 1 can consequently dereference the freed digest array. The chip can
    also be released before callbacks stop using it.
    
    KASAN reported:
    
      BUG: KASAN: slab-use-after-free in tpm_pcr_extend+0x1f0/0x200
      Read of size 2 at addr ffff88810872d000 by task poc/89
      Call Trace:
        tpm_pcr_extend+0x1f0/0x200
        pcrlock+0x42/0x70 [trusted]
        trusted_tpm_seal+0x1b6/0x570 [trusted]
        trusted_instantiate+0x293/0x340 [trusted]
        __key_instantiate_and_link+0xb2/0x2b0
        __key_create_or_update+0x61e/0xb50
        __do_sys_add_key+0x1b8/0x310
      Allocated by task 88:
        __kmalloc_noprof+0x1a7/0x490
        do_one_initcall+0xa1/0x390
        do_init_module+0x2df/0x840
      Freed by task 90:
        kfree+0x131/0x3c0
        trusted_tpm_exit+0x59/0xa0 [trusted]
        __do_sys_delete_module+0x346/0x510
    
    Move unregister_key_type() before releasing either resource. This stops
    new lookups and waits for in-flight key operations to finish before the
    backend state is destroyed.
    
    Fixes: 0b6cf6b97b7e ("tpm: pass an array of tpm_extend_digest structures to tpm_pcr_extend()")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Reviewed-by: Jarkko Sakkinen <[email protected]>
    Tested-by: Jarkko Sakkinen <[email protected]>
    Signed-off-by: Jarkko Sakkinen <[email protected]>
    [ preserved the additional trusted_shash_release() cleanup after unregister_key_type() ]
    Signed-off-by: Sasha Levin <[email protected]>

 
kgdboc: Fix tty driver reference leak in configure_kgdboc() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Thu Sep 17 15:55:23 2026 +0000

    kgdboc: Fix tty driver reference leak in configure_kgdboc()
    
    commit ef3134cd0d4831ae2137aee2883987859b80b2c6 upstream.
    
    tty_find_polling_driver() returns the tty driver with an extra
    reference taken by tty_driver_kref_get(). configure_kgdboc() stores it
    in kgdb_tty_driver but the reference is never dropped: it is leaked when
    kgdb_register_io_module() fails, when the configuration is cleared, and
    on every reconfigure.
    
    Release the reference both when unconfiguring and on the error path.
    
    Fixes: 7d7b93c1452f ("tty: kref the tty driver object")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Reviewed-by: Douglas Anderson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
kprobes: Protect kprobe_blacklist with RCU [+ + +]
Author: Masami Hiramatsu (Google) <[email protected]>
Date:   Thu Sep 10 11:44:46 2026 -0400

    kprobes: Protect kprobe_blacklist with RCU
    
    [ Upstream commit 0c4256196b3a105307e2235fbfd85e768bbcdd0f ]
    
    __within_kprobe_blacklist() traverses kprobe_blacklist without holding
    kprobe_mutex. When a module is unloaded, kprobe_remove_area_blacklist()
    removes blacklist entries and immediately frees them with kfree().
    A concurrent call to within_kprobe_blacklist() can therefore dereference
    freed memory.
    
    Furthermore, within_kprobe_blacklist() can be called in atomic or
    non-preemptible contexts where the sleeping kprobe_mutex cannot be taken.
    
    Protect kprobe_blacklist with RCU. Use guard(rcu)() and
    list_for_each_entry_rcu() for traversal, list_add_tail_rcu() for
    insertions, list_del_rcu() for deletions, and kfree_rcu() to reclaim
    entries safely after a grace period.
    
    Link: https://lore.kernel.org/all/178810004323.64882.16493230858653316962.stgit@devnote2/
    
    Fixes: 376e242429bf ("kprobes: Introduce NOKPROBE_SYMBOL() macro to maintain kprobes blacklist")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Closes: https://lore.kernel.org/all/[email protected]/
    Assisted-by: Antigravity:gemini-3.7-flash
    Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
    [ Replaced guard(rcu)() with explicit rcu_read_lock()/rcu_read_unlock() to avoid declaration-after-statement warnings. ]
    Signed-off-by: Sasha Levin <[email protected]>

kprobes: Skip disarmed probes when checking optkprobe overlap [+ + +]
Author: Leon Hwang <[email protected]>
Date:   Sat Oct 3 20:08:37 2026 -0400

    kprobes: Skip disarmed probes when checking optkprobe overlap
    
    [ Upstream commit 7a39c732a22ec4a369af9e19fbe3d666ec83eec4 ]
    
    On x86, an optkprobe at A replaces five bytes with a jump. If a disabled
    probe B is at A+2, get_optimized_kprobe() stops at B when arming a new
    probe C at A+4. It leaves A optimized:
    
                  A    A+1  A+2  A+3  A+4
      A's jump  | e9 | d0 | d1 | d2 | d3 |
      after C   | e9 | d0 | d1 | d2 | cc |
    
    The INT3 for C overwrites the last byte of A's jump displacement, so
    execution can jump to the wrong address. B can have prepared optinsns
    while disarmed, but has no jump to unoptimize.
    
    Continue past disarmed and unprepared probes to find the active optimized
    probe before arming a probe in its jump.
    
    Link: https://lore.kernel.org/all/[email protected]/
    
    Fixes: afd66255b9a4 ("kprobes: Introduce kprobes jump optimization")
    Cc: [email protected]
    Signed-off-by: Leon Hwang <[email protected]>
    Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
    [ sashal: Adapted get_optimized_kprobe() to use unsigned long addresses with byte-wise scanning. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
KVM: arm64: vgic-its: Don't dereference a NULL collection on ITT save [+ + +]
Author: Fuad Tabba <[email protected]>
Date:   Thu Oct 22 17:45:36 2026 +0000

    KVM: arm64: vgic-its: Don't dereference a NULL collection on ITT save
    
    [ Upstream commit c6c156d931c33b92362383cf76f6d6e1291dcbfe ]
    
    MAPC with V=0 drops ite->collection but leaves the ITE on the device's
    ITT list, and vgic_its_save_ite() dereferences it unconditionally. A
    guest that issues MAPD, MAPTI and then MAPC(V=0) therefore oopses the
    host when the VMM issues KVM_DEV_ARM_ITS_SAVE_TABLES to migrate it.
    That sequence is UNPREDICTABLE per the architecture, but KVM already
    handles the resulting state in the translate, MOVI and DISCARD paths.
    
    Save a zeroed entry, which vgic_its_restore_ite() reads back as
    invalid. Skipping the ITE instead would leave the ITT slot holding
    whatever is in guest memory, and restore rejects an entry naming a
    collection the restored collection table does not have.
    
    Fixes: eff484e0298da ("KVM: arm64: vgic-its: ITT save and restore")
    Cc: [email protected]
    Signed-off-by: Fuad Tabba <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Oliver Upton <[email protected]>
    [aarnahmd: Upstream vgic_its_write_entry_lock() takes in the kind of table
     entry (ite) and looks up its size, while 5.10 takes in the size of an ite
     directly via ite_esz, because commit 3b2c81d5feb2 ("KVM: arm64: vgic-its:
     Add stronger type-checking to the ITS entry sizes") is not in 5.10.]
    Signed-off-by: Aaron Ahmed <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

KVM: nVMX: Reset MMU back to the root MMU if loading L2 state fails for !VM-Entry [+ + +]
Author: Amirmohammad Eftekhar <[email protected]>
Date:   Thu Oct 1 14:43:54 2026 -0700

    KVM: nVMX: Reset MMU back to the root MMU if loading L2 state fails for !VM-Entry
    
    commit c8f4cfe1cf93bce924e27f2abead7a4c4a487505 upstream.
    
    Reset the vCPU's MMU pointer back to the root MMU if loading L2 state fails
    in the "not from VM-Entry" case, i.e. when emulating RSM or handling
    KVM_SET_NESTED_STATE.  Failure to unwind the MMU pointer results in KVM
    trying to run L1 with a nested MMU, and is especially problematic if the
    vCPU manages to free its nested state before the VM crashes.  Constructing
    the root for a nested EPT MMU goes through vmcs12, which is dynamically
    allocated/freed when nVMX is enabled/disabled.  And so if the nested state
    is freed with the MMU still pointing at the nested MMU, KVM will hit a NULL
    pointer deref when attempting to get L1=>L2 EPTP.
    
      BUG: kernel NULL pointer dereference, address: 0000000000000078
      #PF: supervisor read access in kernel mode
      #PF: error_code(0x0000) - not-present page
      PGD 114a2d067 P4D 111743067 PUD 11141f067 PMD 0
      Oops: Oops: 0000 [#1] SMP
      CPU: 20 UID: 1000 PID: 1272 Comm: nested_tdp_faul Not tainted 7.3.0-rc4-8c89f11d1a99b-sink-vm #1914 PREEMPTLAZY
      Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
      RIP: 0010:nested_ept_get_eptp+0xb/0x10 [kvm_intel]
      Call Trace:
       <TASK>
       kvm_mmu_load+0xcd/0x870 [kvm]
       kvm_arch_vcpu_ioctl_run+0x18f5/0x1f80 [kvm]
       kvm_vcpu_ioctl+0x2c7/0x970 [kvm]
       __x64_sys_ioctl+0x90/0xd0
       do_syscall_64+0x9c/0x4d0
       entry_SYSCALL_64_after_hwframe+0x4b/0x53
      RIP: 0033:0x47491b
       </TASK>
      Modules linked in: kvm_intel kvm irqbypass
      CR2: 0000000000000078
      ---[ end trace 0000000000000000 ]---
      RIP: 0010:nested_ept_get_eptp+0xb/0x10 [kvm_intel]
    
    Cc: David Woodhouse <[email protected]>
    Fixes: 72e9cbdb4338 ("KVM: nVMX: fix SMI injection in guest mode")
    Fixes: 8fcc4b5923af ("kvm: nVMX: Introduce KVM_CAP_NESTED_STATE")
    Cc: [email protected]
    Signed-off-by: Amirmohammad Eftekhar <[email protected]>
    [sean: write changelog]
    Signed-off-by: Sean Christopherson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Bonzini <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

KVM: nVMX: Service local TLB flushes on failed nested VM-Enter [+ + +]
Author: Yosry Ahmed <[email protected]>
Date:   Fri Sep 11 06:41:51 2026 -0400

    KVM: nVMX: Service local TLB flushes on failed nested VM-Enter
    
    [ Upstream commit 05a0b701d1089fb57beeb8982f23c3bbafe0fa8b ]
    
    KVM services local TLB flushes on "full" nested VM-Exits (through
    __nested_vmx_vmexit()), but not if a nested VM-Enter fails (e.g. due to
    failed VMCS checks in nested_vmx_enter_non_root_mode()).
    
    However, it is possible that KVM had queued TLB flushes that need to be
    performed, even if the nested VM-Enter was not successful. For example,
    if VPID is disabled for L2 (via nested_vmx_transition_tlb_flush(), or if
    via the MSR load lists, as the SDM says:
    
      If any MSR is being loaded in such a way that would architecturally
      require a TLB flush, the TLBs are updated so that, after VM entry, the
      logical processor will not use any translations that were cached before
      the transition.
    
    The SDM is unclear about when the TLB flush should occur, and whether or
    not a failed VM entry would flush the TLB, so it is safer to always
    do the TLB flush in this case.
    
    More concretely, KVM also updates the last VPID L1 used for L2 in
    nested_vmx_transition_tlb_flush() (i.e. last_vpid), even if the VM entry
    ultimately fails. With the current code, KVM could miss a TLB flush if
    L1 changes L2's VPID, then does a failed VM entry followed by a
    successful one, as the failed VM entry would update last_vpid but not
    actually flush the TLB. Servicing local TLB flushes on failed VM entries
    makes sure that the TLB is always flushed when last_vpid is updated.
    
    Fixes: 5c614b3583e7 ("KVM: nVMX: nested VPID emulation")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]> # Internal review
    Suggested-by: Sean Christopherson <[email protected]>
    Signed-off-by: Yosry Ahmed <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sean Christopherson <[email protected]>
    [ replaced unavailable kvm_service_local_tlb_flush_requests() with inline 5.10 TLB flush request handling. ]
    Signed-off-by: Sasha Levin <[email protected]>

KVM: s390: Fix length check __import_wp_info() [+ + +]
Author: Christian Borntraeger <[email protected]>
Date:   Fri Sep 11 06:57:43 2026 -0400

    KVM: s390: Fix length check __import_wp_info()
    
    [ Upstream commit 4c07680a467e2f7697245bcd11691bffb2a6f0ed ]
    
    struct kvm_hw_breakpoint::len is a __u64 that is fully controlled by user
    space. This is then assigned to wp_info->len, which is an int. The bounds
    check is done on the truncated value while the allocation uses the
    untruncated one:
    
            wp_info->len = bp_data->len;
            [...]
            if (wp_info->len < 0 || wp_info->len > MAX_WP_SIZE)
                    return -EINVAL;
    
            wp_info->old_data = kmalloc(bp_data->len, GFP_KERNEL_ACCOUNT);
    
    Use the validated value for the allocation as intended. Without this
    fix userspace can trigger >4GB allocations which will fail and result
    in a WARN due to MAX_PAGE_ORDER.
    
    Fixes: 27291e2165b6 ("KVM: s390: hardware support for guest debugging")
    Cc: [email protected]
    Signed-off-by: Christian Borntraeger <[email protected]>
    Reviewed-by: Claudio Imbrenda <[email protected]>
    Signed-off-by: Claudio Imbrenda <[email protected]>
    Message-ID: <[email protected]>
    [ Retained GFP_KERNEL instead of upstream GFP_KERNEL_ACCOUNT in the kmalloc() call. ]
    Signed-off-by: Sasha Levin <[email protected]>

KVM: s390: Zero initialize data structures for inject_pfault_token [+ + +]
Author: Christian Borntraeger <[email protected]>
Date:   Fri Sep 11 08:43:13 2026 -0400

    KVM: s390: Zero initialize data structures for inject_pfault_token
    
    [ Upstream commit 4e2c7f7cbc27418f9a290399b986c1b85ff93b90 ]
    
    __kvm_inject_pfault_token() only sets .type and .u.ext.ext_params2 of
    the on-stack struct kvm_s390_irq but the full ext substructure is copied
    into the cpu local variable on inject. ext_params and pad contain stale
    stack values.
    
    Interrupt delivery only uses ext_params2, so nothing leaks to the guest,
    but a host user can use the migration ioctls to get to the data.
    
    Fix by zero-initializing the irq struct.
    Do the same for the inti data structure.
    
    Fixes: 383d0b050106 ("KVM: s390: handle pending local interrupts via bitmap")
    Cc: [email protected]
    Signed-off-by: Christian Borntraeger <[email protected]>
    Reviewed-by: Matthew Rosato <[email protected]>
    Reviewed-by: Claudio Imbrenda <[email protected]>
    Signed-off-by: Claudio Imbrenda <[email protected]>
    Message-ID: <[email protected]>
    [ Adjusted context for missing inti_mem and ret declarations in __kvm_inject_pfault_token(). ]
    Signed-off-by: Sasha Levin <[email protected]>

KVM: SVM: Use the active VMCB's MSR bitmap when checking if MSR is intercepted [+ + +]
Author: Sean Christopherson <[email protected]>
Date:   Wed Oct 7 03:04:01 2026 -0400

    KVM: SVM: Use the active VMCB's MSR bitmap when checking if MSR is intercepted
    
    [ Upstream commit 9e06bbb9ade7cdf28d4a3b5b14e5812881c8df85 ]
    
    Use the MSR permission bitmap of the active VMCB instead of assuming that
    KVM is always using vmcb02's bitmap when L2 is active, as KVM uses msrpm02
    if and only if L1 wants to intercept MSR accesses, i.e. if and only if KVM
    needs to merge msprm01 with msrpm12.
    
    Don't bother tracking the virtual address of the bitmap that's being used,
    as __va() is cheap on x86, and caching the virtual address would introduce
    yet another source of potentially stale information.
    
    Fixes: b2ac58f90540 ("KVM/SVM: Allow direct access to MSR_IA32_SPEC_CTRL")
    Cc: [email protected]
    Reported-by: Stefan Teodorescu <[email protected]>
    Signed-off-by: Sean Christopherson <[email protected]>
    Message-ID: <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    [ sashal: adapted direct svm access to to_svm(vcpu) for the existing helper signature. ]
    Signed-off-by: Sasha Levin <[email protected]>

KVM: x86/mmu: Preserve nested TDP shadow page tables if they are used as roots [+ + +]
Author: Hyunwoo Kim <[email protected]>
Date:   Tue Oct 20 19:50:59 2026 -0700

    KVM: x86/mmu: Preserve nested TDP shadow page tables if they are used as roots
    
    [ Upstream commit 7a2c70e777a00c32ebafd376a6fe31ebb91c5b20 ]
    
    kvm_mmu_zap_oldest_mmu_pages() excludes a shadow page whose root_count
    is non-zero from top-level reclaim, because such a page cannot be
    freed. The path in mmu_page_zap_pte() that recursively zaps a parentless
    nested TDP child has no such check. As a result, a shadow page can
    be zapped even if the page itself can't be freed; as the comment in
    kvm_mmu_zap_oldest_mmu_pages() notes, zapping it will just force vCPUs
    to rebuild the page.
    
    As in top-level reclaim, do not recursively prepare zapping of a
    nested TDP child whose root_count is non-zero.
    
    Fixes: 2de4085cccea ("KVM: x86/MMU: Recursively zap nested TDP SPs when zapping last/only parent")
    Signed-off-by: Hyunwoo Kim <[email protected]>
    Signed-off-by: Paolo Bonzini <[email protected]>
    [sean: resolve minor conflict due to lack of lockless aging in 5.10]
    Signed-off-by: Sean Christopherson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

KVM: x86: Use active memslots for the per-vCPU MMIO cache [+ + +]
Author: Jinu Kim <[email protected]>
Date:   Fri Aug 7 20:28:18 2026 +0900

    KVM: x86: Use active memslots for the per-vCPU MMIO cache
    
    commit b3e6212dea2e4328a841ceb37f377583176dc735 upstream.
    
    KVM tags the per-vCPU MMIO cache with a memslot generation so that a
    memslot update invalidates cached MMIO information.  Both the fill and
    validation paths use kvm_memslots(), which unconditionally selects address
    space 0, even when the vCPU is running in SMM and using address space 1.
    
    Commit 56f17dd3fbc4 ("kvm: x86: fix stale mmio cache bug") added the
    memslot generation to the cache key so that a memslot update could not
    leave a stale entry valid.  When commit 699023e23965 ("KVM: x86: add SMM
    to the MMU role, support SMRAM address space") added the SMM address space,
    these helpers were not converted to use the active memslots.
    
    Consequently, an update to the SMM memslots can leave an entry from the old
    SMM address space apparently valid after the vCPU returns to the normal
    address space.  A guest can then cause an access to valid RAM at the same
    GFN to be returned to userspace as KVM_EXIT_MMIO.
    
    Completing that exit through the VMM's RAM address space writes the backing
    page without going through KVM's write-tracking path.  If the page backs a
    nested EPT table, KVM can continue using shadow translations derived from
    the old contents.  The WARN_ON_ONCE() in kvm_mmu_write_protect_fault()
    catches this invalid cache and memslot combination.
    
    Use the vCPU's active memslots when caching and validating the entry.
    Memslot generations are unique across address spaces, so the generation
    also distinguishes the normal and SMM views.  This matches the MMIO SPTE
    cache, which already uses kvm_vcpu_memslots().
    
    On an unpatched current-mainline kernel, a regression test that fills the
    cache in SMM and updates only the SMM memslots fails the intended RAM write
    and triggers the kvm_mmu_write_protect_fault() warning.  With this change,
    the same test completes the RAM write without a warning.  The x86/smm_test,
    set_memory_region_test, and memslot_modification_stress_test selftests also
    pass.
    
    Fixes: 699023e23965 ("KVM: x86: add SMM to the MMU role, support SMRAM address space")
    Cc: [email protected]
    Signed-off-by: Jinu Kim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sean Christopherson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Linux: Linux 5.10.273 [+ + +]
Author: Greg Kroah-Hartman <[email protected]>
Date:   Fri Oct 30 12:56:23 2026 +0100

    Linux 5.10.273
    
    Link: https://lore.kernel.org/r/[email protected]
    Tested-by: Brett A C Sheffield <[email protected]>
    Tested-by: Florian Fainelli <[email protected]>
    Tested-by: Dominique Martinet <[email protected]>
    Tested-by: Pavel Machek (CIP) <[email protected]>
    Tested-by: Shuah Khan <[email protected]>
    Tested-by: Barry K. Nathan <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
lockd: fix swapped arguments in nlmsvc_match_ip() [+ + +]
Author: Oscar Ou <[email protected]>
Date:   Wed Sep 9 07:03:58 2026 -0400

    lockd: fix swapped arguments in nlmsvc_match_ip()
    
    [ Upstream commit b9060689f49dc663e9a3d069c4a65ff63a836e66 ]
    
    When releasing locks by server IP address via /proc/fs/nfsd/unlock_ip,
    nlmsvc_unlock_all_by_ip() calls nlm_traverse_files() with the server
    sockaddr as the opaque @data argument:
    
            nlm_traverse_files(server_addr, nlmsvc_match_ip, NULL);
    
    The match callback is later invoked from nlm_traverse_locks() as:
    
            match(lockhost, host);
    
    where the first argument is the nlm_host that owns the lock, and the
    second argument is the @data that was originally passed down (here the
    server sockaddr).  This is the convention every other match callback
    relies on (nlmsvc_mark_host(), nlmsvc_same_host(), nlmsvc_is_client()):
    arg1 is the real nlm_host, arg2 is the caller-supplied reference value.
    
    nlmsvc_match_ip() has had these two arguments reversed ever since the
    unlock-by-IP feature was introduced in commit 4373ea84c84d ("lockd:
    unlock lockd locks associated with a given server ip"):
    
            return rpc_cmp_addr(nlm_srcaddr(host), datap);
    
    Here @host is actually the server sockaddr, so nlm_srcaddr(host)
    dereferences a struct sockaddr as a struct nlm_host and reads garbage
    at the offset of h_srcaddr; meanwhile @datap is actually the lock
    owner's nlm_host but is compared as a sockaddr.  As a result the
    comparison practically never matches and locks are not released for the
    requested IP.
    
    Swap the arguments so the lock owner's source address is compared
    against the requested server address:
    
            return rpc_cmp_addr(nlm_srcaddr(datap), (struct sockaddr *)host);
    
    Fixes: 4373ea84c84d ("lockd: unlock lockd locks associated with a given server ip")
    Cc: [email protected]
    Signed-off-by: Oscar Ou <[email protected]>
    [ cel: fix the misleading typedef parameter names too ]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
loop: Fix use-after-free issues [+ + +]
Author: Bart Van Assche <[email protected]>
Date:   Mon Oct 5 12:04:33 2026 +0200

    loop: Fix use-after-free issues
    
    [ Upstream commit 9b0cb770f5d7b1ff40bea7ca385438ee94570eec ]
    
    do_req_filebacked() calls blk_mq_complete_request() synchronously or
    asynchronously when using asynchronous I/O unless memory allocation fails.
    Hence, modify loop_handle_cmd() such that it does not dereference 'cmd' nor
    'rq' after do_req_filebacked() finished unless we are sure that the request
    has not yet been completed. This patch fixes the following kernel crash:
    
    Unable to handle kernel NULL pointer dereference at virtual address 0000000000000054
    Call trace:
     css_put.42938+0x1c/0x1ac
     loop_process_work+0xc8c/0xfd4
     loop_rootcg_workfn+0x24/0x34
     process_one_work+0x244/0x558
     worker_thread+0x400/0x8fc
     kthread+0x16c/0x1e0
     ret_from_fork+0x10/0x20
    
    [ Dropped the part fixing c74d40e8b5e2 as this commit isn't included in
    5.10. Kept the part fixing bc07c10a3603 ]
    
    Cc: Christoph Hellwig <[email protected]>
    Cc: Ming Lei <[email protected]>
    Cc: Jan Kara <[email protected]>
    Cc: Johannes Weiner <[email protected]>
    Cc: Dan Schatzberg <[email protected]>
    Fixes: c74d40e8b5e2 ("loop: charge i/o to mem and blk cg")
    Fixes: bc07c10a3603 ("block: loop: support DIO & AIO")
    Signed-off-by: Bart Van Assche <[email protected]>
    Reviewed-by: Ming Lei <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jens Axboe <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
media: saa7164: fix cleanup on resource allocation failure [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Fri Sep 11 08:19:34 2026 -0400

    media: saa7164: fix cleanup on resource allocation failure
    
    [ Upstream commit 28e84c6e2e6753ed238ea097b2842a32a6a6879b ]
    
    saa7164_dev_setup() adds the device to the global saa7164_devlist before
    requesting the PCI BAR memory regions.
    
    If get_resources() fails, saa7164_dev_setup() decrements the device count
    and returns an error, but leaves the device on saa7164_devlist. The probe
    error path then frees the device, leaving a dangling entry on the global
    list.
    
    Reuse the existing MMIO mapping error path to remove the device from
    saa7164_devlist and decrement the device count before returning.
    
    Also release BAR0 if it was successfully requested but the BAR2 request
    fails.
    
    Fixes: 443c1228d505 ("V4L/DVB (12923): SAA7164: Add support for the NXP SAA7164 silicon")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Hans Verkuil <[email protected]>
    [ Inlined err_devlist cleanup with explicit mutex locking because the shared MMIO cleanup path is absent. ]
    Signed-off-by: Sasha Levin <[email protected]>

media: zoran: Avoid freeing a registered video_device twice [+ + +]
Author: Ruoyu Wang <[email protected]>
Date:   Fri Sep 11 08:46:55 2026 -0400

    media: zoran: Avoid freeing a registered video_device twice
    
    [ Upstream commit 0735e0b5a96761a9ce277a238e834008ad92a0a5 ]
    
    zoran_init_video_device() installs zoran_vdev_release() as the
    video_device release callback through zoran_template. After
    video_register_device() succeeds, video_unregister_device() drops the
    registered video_device reference and the V4L2 core eventually invokes
    that release callback, which kfree()s the video_device.
    
    zoran_exit_video_devices() called video_unregister_device() and then
    kfree(zr->video_dev), so device teardown could free the same
    video_device twice.
    
    Remove the direct kfree() and clear the cached pointer after
    unregistering. The pre-registration failure path keeps its manual free
    because the video_device was not registered there.
    
    This issue was found by a static analysis checker and confirmed by
    manual source review.
    
    Fixes: 82e3a496eb56 ("media: staging: media: zoran: move videodev alloc")
    Cc: [email protected]
    Signed-off-by: Ruoyu Wang <[email protected]>
    Signed-off-by: Hans Verkuil <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
memstick: core: wait for request completion before freeing card [+ + +]
Author: Raj Ojha <[email protected]>
Date:   Fri Sep 25 00:59:55 2026 +0530

    memstick: core: wait for request completion before freeing card
    
    commit aa0a37b5024d921e96ac4f8f487c8bfbf1f1a582 upstream.
    
    In memstick_alloc_card() and memstick_set_rw_addr(),
    wait_for_completion_timeout() is used to wait for device identification
    and address configuration requests to complete.
    
    The memstick subsystem does not provide an abort or cancellation
    callback in struct memstick_host for in-flight requests. If
    wait_for_completion_timeout() expires (for instance, when a USB transfer
    or command retry is delayed), memstick_alloc_card() returns an error and
    frees the memstick_dev structure via kfree(card).
    
    However, the host controller driver (such as rtsx_usb_ms) is still
    running the request asynchronously in worker context. When the transfer
    eventually finishes, the driver writes into host->req->data, which
    points to memory inside the already freed card structure. This leads to
    a KASAN slab-use-after-free write:
    
      BUG: KASAN: slab-use-after-free in ms_read_bytes+0x8fe/0x990
      Write of size 1 at addr ffff88813c188079 by task kworker/1:5/5239
      Workqueue: events rtsx_usb_ms_handle_req
      Call Trace:
       ms_read_bytes+0x8fe/0x990 drivers/memstick/host/rtsx_usb_ms.c:450
       rtsx_usb_ms_issue_cmd drivers/memstick/host/rtsx_usb_ms.c:477 [inline]
       rtsx_usb_ms_handle_req+0x557/0x1a00 drivers/memstick/host/rtsx_usb_ms.c:531
       process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
       worker_thread+0x5ef/0xe50 kernel/workqueue.c:3560
       kthread+0x373/0x450 kernel/kthread.c:436
    
      Allocated by task 1662:
       memstick_alloc_card drivers/memstick/core/memstick.c:383 [inline]
       memstick_check+0x2c1/0x10d0 drivers/memstick/core/memstick.c:452
       process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
    
      Freed by task 1662:
       kfree+0x20c/0x650 mm/slub.c:6792
       memstick_alloc_card drivers/memstick/core/memstick.c:420 [inline]
       memstick_check+0x72b/0x10d0 drivers/memstick/core/memstick.c:452
       process_one_work+0xac7/0x1b10 kernel/workqueue.c:3396
    
    Host controller drivers (rtsx_usb_ms, jmb38x_ms, tifm_ms, r592) already
    implement their own hardware and bus timeouts, and callers in
    mspro_block and ms_block already rely on wait_for_completion()
    unconditionally.
    
    Replace wait_for_completion_timeout() with wait_for_completion() in
    memstick_set_rw_addr() and memstick_alloc_card() so that the card
    structure is never freed while an asynchronous request is in flight.
    
    Fixes: baf8532a147d ("memstick: initial commit for Sony MemoryStick support")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=ccffdf05833ebdaeae70
    Cc: [email protected]
    Signed-off-by: Raj Ojha <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

memstick: rtsx_usb_ms: complete requests after eject instead of dropping them [+ + +]
Author: Nguyen Ngoc Thang <[email protected]>
Date:   Wed Sep 30 21:07:48 2026 +0700

    memstick: rtsx_usb_ms: complete requests after eject instead of dropping them
    
    commit c96ca94425b076dc398d929366e378d1e22ec794 upstream.
    
    memstick_check() can pass its host->removing check just before
    rtsx_usb_ms_drv_remove() sets eject/removing. Its next request is then
    silently dropped: rtsx_usb_ms_request() skips schedule_work() once eject
    is set, and drv_remove's cancel_work_sync() can also cancel a queued
    handle_req before it picks the request up. Nobody completes
    card->mrq_complete.
    
    Once memstick core waits for requests without a timeout ("memstick: core:
    wait for request completion before freeing card"), this hangs removal:
    memstick_check() never returns and memstick_remove_host() blocks in
    flush_workqueue():
    
      INFO: task kworker/u10:3:65 blocked for more than 20 seconds.
      Workqueue: kmemstick memstick_check
       __wait_for_common
       memstick_check
    
      INFO: task kworker/1:1:33 blocked for more than 20 seconds.
      Workqueue: usb_hub_wq hub_event
       __flush_workqueue
       memstick_remove_host
       rtsx_usb_ms_drv_remove
    
    Never drop a request. rtsx_usb_ms_request() always schedules handle_req,
    and handle_req fails requests with -ENOMEDIUM once eject is set, without
    touching the device. drv_remove flushes handle_req instead of cancelling
    it, and cancels it only after memstick_remove_host(), when no new
    request can arrive, so it cannot run on a freed host.
    
    The host_mutex drain in drv_remove is removed: handle_req always leaves
    host->req NULL when it finishes, so the drain never had anything to do,
    and it would now race with handle_req.
    
    Fixes: 99451dceeb5f ("memstick: Add realtek USB memstick host driver")
    Cc: [email protected]
    Link: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Nguyen Ngoc Thang <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
mm/huge_memory: transfer the pmd dirty bit to the folio on zap [+ + +]
Author: Usama Arif <[email protected]>
Date:   Sat Oct 24 16:38:57 2026 +0800

    mm/huge_memory: transfer the pmd dirty bit to the folio on zap
    
    [ Upstream commit fe6cf984939d8e12cb33a99673c8d026c5135e68 ]
    
    zap_huge_pmd_folio() propagates the pmd young bit to the folio for the
    file case, but not the dirty bit.  The pte path does propagate it, in
    zap_present_folio_ptes() and so does the pmd split path, in
    __split_huge_pmd_locked().
    
    For most file mappings the omission is harmless, because writing to a
    shared file mapping goes through page_mkwrite(), which dirties the folio.
    tmpfs is different: it has no page_mkwrite(), and vma_wants_writenotify()
    is false for it, so a *read* fault on a MAP_SHARED tmpfs mapping installs
    a writable pmd via do_read_fault().  do_read_fault() does not call
    fault_dirty_shared_page(), so subsequent stores through that mapping set
    only the hardware dirty bit in the pmd and never call folio_mark_dirty().
    A shmem folio allocated by a fault is marked uptodate but not dirty (see
    the clear: block in shmem_get_folio_gfp()), so PG_dirty is never set at
    all.
    
    Unmapping such a folio - munmap(), or exit_mmap() when the process dies -
    then loses the only record that it was written, because zap_huge_pmd()
    drops the pmd without transferring the dirty bit.  Reclaim afterwards sees
    a clean shmem folio: the whole swap-out block in shrink_folio_list() is
    inside "if (folio_test_dirty(folio))", so pageout() is skipped and the
    folio falls into __remove_mapping().  There, folio_is_file_lru() is false
    for a swapbacked folio, so no shadow entry is created and
    __filemap_remove_folio(folio, NULL) simply empties the i_pages slot.  The
    data is freed without ever being written to swap, and the next fault on
    that index returns a freshly zeroed folio.
    
    This is silent data loss for any process that keeps state in a MAP_SHARED
    tmpfs segment across an unmap - for example a cache handed from one
    process generation to the next through /dev/shm.  It requires the folio to
    be PMD-mapped, so it only shows up once shmem THP is enabled (which is
    what we did in Meta fleet and started noticing crashes); with THP off the
    pte path transfers the dirty bit correctly.  It also only becomes visible
    when swap is enabled, because with no swap device shmem folios (which are
    on the anon LRU) are not scanned by reclaim at all, so the clean folio is
    never dropped.
    
    Reproduced on x86_64 with a tmpfs mounted huge=within_size: read-fault a
    2MB-backed region, write a known pattern through the resulting mapping,
    munmap, force reclaim of the cgroup, then re-map and read back.  Without
    this patch the region reads back as zeros and vmstat shows zswpout 0 - the
    data was discarded rather than swapped.  With this patch the region reads
    back correctly and the pages are swapped out as expected.  With
    huge=never, or when the first touch is a write, the test passes either
    way.
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: b5072380eb61 ("thp: support file pages in zap_huge_pmd()")
    Signed-off-by: Usama Arif <[email protected]>
    Acked-by: David Hildenbrand (Arm) <[email protected]>
    Reviewed-by: Kiryl Shutsemau <[email protected]>
    Acked-by: Hugh Dickins <[email protected]>
    Tested-by: Lance Yang <[email protected]>
    Reviewed-by: Zi Yan <[email protected]>
    Reviewed-by: Lorenzo Stoakes (ARM) <[email protected]>
    Reviewed-by: Baolin Wang <[email protected]>
    Cc: Barry Song <[email protected]>
    Cc: Dev Jain <[email protected]>
    Cc: Johannes Weiner <[email protected]>
    Cc: Liam R. Howlett <[email protected]>
    Cc: Nhat Pham <[email protected]>
    Cc: Rik van Riel <[email protected]>
    Cc: Ryan Roberts <[email protected]>
    Cc: Shakeel Butt <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ Ting-Han: zap_huge_pmd_folio() does not exist in this tree; the file
      branch is open-coded in zap_huge_pmd(), so transfer the dirty bit
      there. This tree has no folio_mark_dirty(), so use set_page_dirty()
      on the head page, as zap_pte_range() does for dirty ptes ]
    Assisted-by: LLM
    Signed-off-by: Ting-Han Hou <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
mm/hugetlb: fix avoid_reserve to allow taking folio from subpool [+ + +]
Author: Peter Xu <[email protected]>
Date:   Sat Sep 26 10:04:49 2026 +0200

    mm/hugetlb: fix avoid_reserve to allow taking folio from subpool
    
    commit 58db7c5fbe7daa42098d4965133a864f98ba90ba upstream.
    
    Patch series "mm/hugetlb: Refactor hugetlb allocation resv accounting",
    v2.
    
    This is a follow up on Ackerley's series here as replacement:
    
    https://lore.kernel.org/r/[email protected]
    
    The goal of this series is to cleanup hugetlb resv accounting, especially
    during folio allocation, to decouple a few things:
    
      - Hugetlb folios v.s. Hugetlbfs: IOW, the hope is in the future hugetlb
        folios can be allocated completely without hugetlbfs.
    
      - Decouple VMA v.s. hugetlb folio allocations: allocating a hugetlb folio
        should not always require a hugetlbfs VMA.  For example, either it got
        allocated from the inode level (see hugetlbfs_fallocate() where it used
        a pesudo VMA for allocation), or it can be allocated by other kernel
        subsystems.
    
    It paves way for other users to allocate hugetlb folios out of either
    system reservations, or subpools (instead of hugetlbfs, as a file system).
    For longer term, this prepares hugetlb as a separate concept versus
    hugetlbfs, so that hugetlb folios can be allocated by not only hugetlbfs
    and other things.
    
    Tests I've done:
    
    - I had a reproducer in patch 1 for the bug I found, this will start to
      work after patch 1 or the whole set applied.
    
    - Hugetlb regression tests (on x86_64 2MBs), includes:
    
      - All vmtests on hugetlbfs
    
      - libhugetlbfs test suite (which may fail some tests, but no new failures
        will be introduced by this series, so all such failures happen before
        this series so shouldn't be relevant).
    
    This patch (of 7):
    
    Since commit 04f2cbe35699 ("hugetlb: guarantee that COW faults for a
    process that called mmap(MAP_PRIVATE) on hugetlbfs will succeed"),
    avoid_reserve was introduced for a special case of CoW on hugetlb private
    mappings, and only if the owner VMA is trying to allocate yet another
    hugetlb folio that is not reserved within the private vma reserved map.
    
    Later on, in commit d85f69b0b533 ("mm/hugetlb: alloc_huge_page handle
    areas hole punched by fallocate"), alloc_huge_page() enforced to not
    consume any global reservation as long as avoid_reserve=true.  This
    operation doesn't look correct, because even if it will enforce the
    allocation to not use global reservation at all, it will still try to take
    one reservation from the spool (if the subpool existed).  Then since the
    spool reserved pages take from global reservation, it'll also take one
    reservation globally.
    
    Logically it can cause global reservation to go wrong.
    
    I wrote a reproducer below, trigger this special path, and every run of
    such program will cause global reservation count to increment by one, until
    it hits the number of free pages:
    
      #define _GNU_SOURCE             /* See feature_test_macros(7) */
      #include <stdio.h>
      #include <fcntl.h>
      #include <errno.h>
      #include <unistd.h>
      #include <stdlib.h>
      #include <sys/mman.h>
    
      #define  MSIZE  (2UL << 20)
    
      int main(int argc, char *argv[])
      {
          const char *path;
          int *buf;
          int fd, ret;
          pid_t child;
    
          if (argc < 2) {
              printf("usage: %s <hugetlb_file>\n", argv[0]);
              return -1;
          }
    
          path = argv[1];
    
          fd = open(path, O_RDWR | O_CREAT, 0666);
          if (fd < 0) {
              perror("open failed");
              return -1;
          }
    
          ret = fallocate(fd, 0, 0, MSIZE);
          if (ret != 0) {
              perror("fallocate");
              return -1;
          }
    
          buf = mmap(NULL, MSIZE, PROT_READ|PROT_WRITE,
                     MAP_PRIVATE, fd, 0);
    
          if (buf == MAP_FAILED) {
              perror("mmap() failed");
              return -1;
          }
    
          /* Allocate a page */
          *buf = 1;
    
          child = fork();
          if (child == 0) {
              /* child doesn't need to do anything */
              exit(0);
          }
    
          /* Trigger CoW from owner */
          *buf = 2;
    
          munmap(buf, MSIZE);
          close(fd);
          unlink(path);
    
          return 0;
      }
    
    It can only reproduce with a sub-mount when there're reserved pages on the
    spool, like:
    
      # sysctl vm.nr_hugepages=128
      # mkdir ./hugetlb-pool
      # mount -t hugetlbfs -o min_size=8M,pagesize=2M none ./hugetlb-pool
    
    Then run the reproducer on the mountpoint:
    
      # ./reproducer ./hugetlb-pool/test
    
    Fix it by taking the reservation from spool if available.  In general,
    avoid_reserve is IMHO more about "avoid vma resv map", not spool's.
    
    I copied stable, however I have no intention for backporting if it's not a
    clean cherry-pick, because private hugetlb mapping, and then fork() on top
    is too rare to hit.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Link: https://lkml.kernel.org/r/[email protected]
    Fixes: d85f69b0b533 ("mm/hugetlb: alloc_huge_page handle areas hole punched by fallocate")
    Signed-off-by: Peter Xu <[email protected]>
    Reviewed-by: Ackerley Tng <[email protected]>
    Tested-by: Ackerley Tng <[email protected]>
    Reviewed-by: Oscar Salvador <[email protected]>
    Cc: Breno Leitao <[email protected]>
    Cc: Muchun Song <[email protected]>
    Cc: Naoya Horiguchi <[email protected]>
    Cc: Rik van Riel <[email protected]>
    Cc: Roman Gushchin <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ Karl Mehltretter: The upstream changes map directly to this stable tree's
      older page-based HugeTLB API. The backport retains this stable tree's
      SetPagePrivate() reserve marker, plain hugetlb_lock calls and direct
      -ENOSPC return; the functional changes otherwise match upstream. ]
    Assisted-by: LLM
    Signed-off-by: Karl Mehltretter <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
mm/mremap: fix locked_vm leak by splitting VMA for MREMAP_DONTUNMAP [+ + +]
Author: Lorenzo Stoakes (ARM) <[email protected]>
Date:   Mon Oct 12 20:58:43 2026 -0400

    mm/mremap: fix locked_vm leak by splitting VMA for MREMAP_DONTUNMAP
    
    [ Upstream commit 597e4b9ab48a3f841080f627722064853d3f650e ]
    
    The MREMAP_DONTUNMAP feature is highly unusual in that it permits mremap()
    operations that keep the original VMA in place.
    
    Historically this has led to a lot of bugs where non-obvious interactions
    occur between existing mremap() operations and the original VMA.
    
    Fix another of these - partial copies.
    
    The long-standing mremap() partial VMA logic has the baked-in assumption
    that the originating VMA is unmapped and thus moved.
    
    However MREMAP_DONTUNMAP defeats this by performing a partial copy
    instead since it keeps the source VMA around.
    
    An mremap(..., MREMAP_DONTUNMAP) operation disallows resizing of the VMA,
    but the operation can be performed partially:
    
                               |-----------------|
                               |                 |
                               |                 v
                            <------>          <------>
                            .new_sz.           new_sz
                         |--.------.--|       |------|
                         |  .source.  |       | dest |
                         |--.------.--|       |------|
                         <------------>
                             old_sz
    
    The page tables in the specified range are moved, but the original VMA is
    kept intact.
    
    This interacts poorly with mlock()'d VMAs, as the VMA_LOCKED_BIT flag is
    cleared for the entire source VMA and set for the entire destination VMA.
    
    This results in an mm->locked_vm leak as the change is therefore not
    accounted correctly.
    
    The clear solution here is to make the portion of the source VMA which is
    mremap()'d distinct from the rest of it, a.k.a. split it.
    
    Therefore resolve this issue by splitting it ahead of the rest of the
    mremap() operation if the VMA is mlock()'d.
    
    This is valid, as the source VMA will lose its VMA_LOCKED_BIT flag, so if a
    partial remap it will become distinct from the rest of the VMA.
    
    In order to make this change re-expose split_vma() in vma.h for
    CONFIG_MMU (nommu doesn't compile mremap.c and uses a static helper
    instead).
    
    Finally, update the sys_map_count check to account for this case.
    
    Note that the early check does not use needs_pre_split() - this is because
    the VMA has not been looked up by this point, so be conservative and assume
    that the VMA is mlock()'d in this case for the purposes of the
    sys_map_count check.
    
    Link: https://lore.kernel.org/20260930-fix-dontunmap-partial-self-merge-v2-2-f388985a0f0a@kernel.org
    Fixes: e346b3813067 ("mm/mremap: add MREMAP_DONTUNMAP to mremap()")
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Reviewed-by: Pedro Falcato <[email protected]>
    Acked-by: Kiryl Shutsemau (Meta) <[email protected]>
    Reviewed-by: Jose A. Perez de Azpillaga <[email protected]>
    Tested-by: Anirudh Srinivasan <[email protected]>
    Cc: Liam R. Howlett <[email protected]>
    Cc: Vlastimil Babka <[email protected]>
    Cc: Jann Horn <[email protected]>
    Cc: Brian Geffon <[email protected]>
    Cc: Minchan Kim <[email protected]>
    Cc: <[email protected]>
    [ sashal: Replaced upstream VMA preparation helpers with inline logic in move_vma() using the existing split_vma(mm, ...) API. ]
    Signed-off-by: Sasha Levin <[email protected]>

mm/mremap: fix locked_vm leak from MREMAP_DONTUNMAP self-merge [+ + +]
Author: Lorenzo Stoakes (ARM) <[email protected]>
Date:   Tue Oct 13 18:31:15 2026 +0100

    mm/mremap: fix locked_vm leak from MREMAP_DONTUNMAP self-merge
    
    [ Upstream commit 838bb60dc21553e32df90f2f3bac5b905376e7aa ]
    
    The MREMAP_DONTUNMAP feature is highly unusual in that it permits mremap()
    operations that keep the original VMA in place.
    
    Historically this has led to a lot of bugs where non-obvious interactions
    occur between existing mremap() operations and the original VMA.
    
    Fix another of these - self-merge.
    
    Self-merge occurs when a VMA is moved in front of or behind itself and the
    attributes of the VMA permit such a merge.
    
    Practically this can only happen for unfaulted anonymous VMAs due to the
    page offset equality requirement for merge:
    
                               |------------|
                               |            |
                               |            v
            |...........||-----------||...........|
            |           || unfaulted ||           |
            |...........||-----------||...........|
                  ^            |
                  |            |
                  |------------|
    
    This becomes problematic if the VMA is configured by the user to
    mlock-on-fault, i.e. the VMA_LOCKED_BIT, VMA_LOCKONFAULT_BIT VMA flags are
    set.
    
    MREMAP_DONTUNMAP clears mlock flags for the source VMA and maintains them
    for the destination VMA.
    
    Self-merge makes this impossible (there is only one VMA) and incorrectly
    clears the destination VMA's mlock flags.
    
    This causes a leak in mm->locked_vm as clearing this flag does not
    decrement the counter and the VMA no longer has VMA_LOCKED_BIT set so it
    is not decremented on unmap.
    
    Resolve this by simply disallowing a self-merge in this case - the source
    and destination VMAs are kept distinct and then are able to have distinct
    mlock() flags.
    
    Update to make the now-redundant self-merge check a VM_WARN_ON_ONCE()
    instead to guard against future regressions.
    
    Fixes: e346b3813067 ("mm/mremap: add MREMAP_DONTUNMAP to mremap()")
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Reviewed-by: Pedro Falcato <[email protected]>
    Acked-by: Kiryl Shutsemau (Meta) <[email protected]>
    Reviewed-by: Jose A. Perez de Azpillaga <[email protected]>
    Tested-by: Anirudh Srinivasan <[email protected]>
    Cc: <[email protected]>
    [ ljs - Converted to work with vma_merge(), tweaked commit msg, removed
      redundant self-merge code and comment. ]
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
mm/rmap: fix missing barrier between anon_vma init and vma->anon_vma publish [+ + +]
Author: Jinjiang Tu <[email protected]>
Date:   Tue Sep 29 15:47:38 2026 -0400

    mm/rmap: fix missing barrier between anon_vma init and vma->anon_vma publish
    
    [ Upstream commit b6ac0b3f6013c168f22cad97e79967accacb08e1 ]
    
    On arm64 server, we find that a task trying to grab the anon_vma lock
    triggers hungtask.
    
    INFO: task main:2354726 blocked for more than 120 seconds.
          Tainted: G            E     5.10.0-0021.aarch64 #1
    "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
    task:main            state:D stack:    0 pid:2354726 ppid:2350673 flags:0x00000a01
    Call trace:
     __switch_to+0x7c/0xbc
     __schedule+0x3b4/0x8a0
     schedule+0x50/0xe0
     rwsem_down_write_slowpath+0x3cc/0x6cc
     down_write+0x60/0x260
     __anon_vma_prepare+0x6c/0x210
     do_anonymous_page+0x258/0x660
     handle_pte_fault+0x188/0x214
     __handle_mm_fault+0x1b0/0x380
     handle_mm_fault+0xf4/0x284
     do_page_fault+0x19c/0x494
     do_translation_fault+0xcc/0xf8
     do_mem_abort+0x48/0xac
     el0_da+0x44/0x80
     el0_sync_handler+0x88/0xb4
     el0_sync+0x160/0x180
    
    After analyzing the vmcore, we found the anon_vma->root->rwsem.count is
    -1.  There is another anon_vma whose anon_vma->root->rwsem.count is 1, the
    anon_vma->root->rwsem.owner shows the lock is held, but the stack of the
    task shows the task doesn't hold the anon_vma lock.
    
    After adding more debugging info, we found __anon_vma_prepare() reuses
    anon_vma and triggers the UAF of anon_vma->root due to missing memory
    barrier, leading to locking and unlocking two different anon_vma->root,
    thus leading to an anon_vma will never be unlocked, and another anon_vma
    couldn't be locked anymore.
    
    This race requires two adjacent VMAs that are not merged but are
    anon_vma-compatible (e.g., they differ in VMA_ACCESS_FLAGS that can be
    changed by mprotect()).  Two threads fault on each VMA concurrently, both
    calling __anon_vma_prepare() with only mmap_lock held for reading.
    
        THREAD A                             THREAD B
    __anon_vma_prepare                __anon_vma_prepare
     find_mergeable_anon_vma() -> NULL
     anon_vma = anon_vma_alloc();
       anon_vma->root = anon_vma;
     // the two stores may be reordered
     vma->anon_vma = anon_vma;
                                       // finds A's anon_vma
                                       anon_vma = find_mergeable_anon_vma(vma);
                                       anon_vma_lock_write(anon_vma);
                                         // may still see the old root
                                         down_write(&anon_vma->root->rwsem);
                                       anon_vma_unlock_write(anon_vma);
                                         // see the new root, never unlock old
                                         up_write(&anon_vma->root->rwsem);
    
    thread A triggers page fault and calls __anon_vma_prepare() to prepare
    anon_vma for the faulting vma.  __anon_vma_prepare() allocates and
    initializes a new anon_vma, and then publishes it to the vma with a plain
    store.  anon_vma_prepare() only requires the mmap_lock to be held for
    reading, so two threads can fault on adjacent VMAs at the same time.
    While thread A publishes a new anon_vma, thread B could find the anon_vma
    via find_mergeable_anon_vma() and then locks anon_vma->root->rwsem.
    
    The store to anon_vma->root in anon_vma_alloc() and the store to
    vma->anon_vma can be reordered.  The anon_vma_lock_write() and spin_lock()
    only provide acquire semantics, which do not prevent prior stores from
    being reordered after them.  The release semantics of the corresponding
    spin_unlock() and anon_vma_unlock_write() come too late, the store to
    vma->anon_vma is already published before they take effect.  As a result,
    thread B can observe the following order:
    
        vma->anon_vma = anon_vma;
        anon_vma->root = anon_vma;
    
    The anon_vma slab is SLAB_TYPESAFE_BY_RCU, so a newly allocated anon_vma
    may reuse memory from a previously freed one.  The constructor
    (anon_vma_ctor) does not reset anon_vma->root, and __put_anon_vma()
    doesn't clear it either, so the old root value persists until
    anon_vma_alloc() overwrites it.  If that store isn't visible, thread B
    reads a root that points to the old anon_vma and locks it.
    
    As a result, thread B can call anon_vma_lock_write() with the old root,
    and call anon_vma_unlock_write() with the new root, leading to an anon_vma
    will never be unlocked, and another anon_vma couldn't be locked anymore
    (its count is dropped from 0 to -1 due to wrong unlock).
    
    To fix it, change the plain store `vma->anon_vma = anon_vma` to store
    release, so that the fields of anon_vma are visible before anon_vma is
    published to vma->anon_vma.
    
    At read side, the load of anon_vma and anon_vma->root have address
    dependency.  According to Documentation/memory-barriers.txt and some
    investigations, only Alpha needs address-dependency barriers and it has
    been handled by READ_ONCE() in reusable_anon_vma().
    
    We reproduced this issue in v5.10 with KSM enabled.  The kernel doesn't
    merge commit cf7e7a3503df ("mm: prevent KSM from breaking VMA merging for
    new VMAs"), so there are many adjacent VMAs that aren't merged but are
    compatible for anon_vma.
    
    Without this fix, our production environment could reproduce this issue
    about 2-5 times each month.  After adding a smp_mb() before
    anon_vma_lock_write(anon_vma) in __anon_vma_prepare(), which is different
    to this patch, this issue hasn't been reproduced for one month.
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: 5c341ee1dfc8 ("mm: track the root (oldest) anon_vma")
    Signed-off-by: Jinjiang Tu <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Reviewed-by: Lance Yang <[email protected]>
    Reviewed-by: Lorenzo Stoakes (ARM) <[email protected]>
    Acked-by: David Hildenbrand (Arm) <[email protected]>
    Acked-by: Vlastimil Babka (SUSE) <[email protected]>
    Cc: Minchan Kim <[email protected]>
    Cc: Harry Yoo <[email protected]>
    Cc: Hiroyouki Kamezawa <[email protected]>
    Cc: Jann Horn <[email protected]>
    Cc: Jinjiang Tu <[email protected]>
    Cc: Kefeng Wang <[email protected]>
    Cc: Larry Woodman <[email protected]>
    Cc: Liam R. Howlett <[email protected]>
    Cc: Nanyong Sun <[email protected]>
    Cc: Rik van Riel <[email protected]>
    Cc: <[email protected]>
    [ adjusted context for mm/mmap.c and the existing anon_vma_chain_link() helper. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
mm/vmalloc: acquire init_mm lock on huge vmap to avoid ptdump UAF [+ + +]
Author: Lorenzo Stoakes (ARM) <[email protected]>
Date:   Mon Oct 19 18:47:30 2026 +0100

    mm/vmalloc: acquire init_mm lock on huge vmap to avoid ptdump UAF
    
    [ Upstream commit 26444eb71465c9934d9d418ef69c43f61185329b ]
    
    Currently there is a nasty race between ptdump and ioremap when attempting
    to map a huge P4D, PUD or PMD entry:
    
    * ptdump walks kernel page table ranges it doesn't own.
    
    * When ioremap maps ranges it tries to promote existing ones to huge
      page tables in ioremap_try_huge_[p4d,pud,pmd]() at P4D, PUD and PMD
      level, freeing the lower page table in
      [p4d,pud,pmd]_free_[pud,pmd,pte]_page() when it succeeds.
    
    Both of these things can happen at the same time and as a result ptdump
    can access a freed page table, resulting in a use-after-free and memory
    corruption.
    
    This is possible because while ptdump_walk_pgd() holds both the mem
    hotplug lock and the mmap write lock before invoking
    walk_page_range_novma(), ioremap takes no relevant locks at all.
    
    Fix this by holding the mmap read lock in ioremap_try_huge_*() when freeing
    page tables.
    
    The read lock is sufficient: ptdump is the only walker that must be
    excluded and it holds the mmap write lock.  Other holders of the read lock
    may run concurrently, but each exclusively owns the range it operates on
    and cannot reach the page tables freed here.
    
    We also hold the lock while assigning the huge page table entry, which
    means page table walkers observe only the huge or non-huge page table
    entry.
    
    We use a trylock to prevent ptdump from blocking ioremap making forward
    progress.  This is fine because it's an optimisation in any case, and thus
    the ioremap can safely proceed regardless.
    
    All other kernel page table walkers that touch vmalloc ranges either
    exclusively own the memory walked or acquire the mmap lock, so this
    correctly excludes those walkers.
    
    The issue has existed as long as ptdump was available and vmap freed page
    tables when promoting to a huge leaf entry, that is, since commit
    b6bdb7517c3d ("mm/vmalloc: add interfaces to free unmapped page table")
    for huge ioremap, and commit 121e6f3258fe ("mm/vmalloc: hugepage vmalloc
    mappings") for huge vmalloc.
    
    Since the former is the earlier of the two we choose that for our Fixes
    tag.
    
    This patch is based on work by David Carlier (linked), with gratitude!
    
    Fixes: b6bdb7517c3d ("mm/vmalloc: add interfaces to free unmapped page table")
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/[email protected]/T/
    Link: https://lore.kernel.org/linux-mm/[email protected]/
    Reviewed-by: Mike Rapoport (Microsoft) <[email protected]>
    Reviewed-by: Dev Jain <[email protected]>
    Acked-by: David Hildenbrand (Arm) <[email protected]>
    Reviewed-by: Kiryl Shutsemau <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    [ ljs - Applied to ioremap_try_huge_*() in mm/ioremap.c, open-coded missing
       stuff + other smaller changes. Updated commit msg to reflect. ]
    Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
mmc: cavium-octeon: destroy slot platform devices on remove [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Tue Sep 15 23:57:24 2026 +0800

    mmc: cavium-octeon: destroy slot platform devices on remove
    
    commit 0f4d4424fc1d651ec3fa63a0a8060ba9087eb0ec upstream.
    
    octeon_mmc_probe() creates host->slot_pdev[i] with
    of_platform_device_create(), while octeon_mmc_remove() does not destroy
    the child platform devices.
    
    The probe failure path removes each MMC slot and destroys its associated
    platform device, but the normal remove path only removes the MMC slot.
    As a result, the child platform devices remain registered after the
    Octeon MMC controller is removed.
    
    Destroy each slot platform device during removal after cleaning up the
    corresponding MMC slot, matching the probe failure cleanup path.
    
    This issue was found by manual code inspection.
    
    Fixes: 01d95843335c ("mmc: cavium: Add MMC support for Octeon SOCs.")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mmc: cavium-thunderx: destroy slot platform devices on remove [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Wed Sep 16 00:13:10 2026 +0800

    mmc: cavium-thunderx: destroy slot platform devices on remove
    
    commit 29ee8cf18a21b02cd0b2e35f741b61cd1fe3e14e upstream.
    
    thunder_mmc_probe() creates host->slot_pdev[i] with
    of_platform_device_create(), while thunder_mmc_remove() does not destroy
    the child platform devices.
    
    The probe failure path removes each MMC slot and destroys its associated
    platform device, but the normal remove path only removes the MMC slot.
    As a result, the child platform devices remain registered after the
    ThunderX MMC controller is removed.
    
    Destroy each slot platform device during removal after cleaning up the
    corresponding MMC slot, matching the probe failure cleanup path. Keep an
    extra device reference around of_platform_device_destroy() as done in
    the existing error path.
    
    This issue was found by manual code inspection.
    
    Fixes: 166bac38c3c56 ("mmc: cavium: Add MMC PCI driver for ThunderX SOCs")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mmc: mtk-sd: Cancel request timeout work on remove [+ + +]
Author: Yibo Tan <[email protected]>
Date:   Tue Sep 15 22:44:57 2026 +0800

    mmc: mtk-sd: Cancel request timeout work on remove
    
    commit b38af5386a74416e898955443f2e26547b358cb2 upstream.
    
    The driver queues req_timeout while a request is active.
    msdc_request_done() uses cancel_delayed_work(), which does not wait for
    a timeout callback that has already started.
    
    The timeout callback calls mmc_request_done(), which wakes the request
    waiter, and then continues to use host->dev_comp and check the SDIO IRQ.
    During unbind, msdc_drv_remove() can return and the managed mmc_host can
    be freed before the callback finishes.
    
    KASAN reported use-after-free accesses in msdc_request_done() and
    msdc_recheck_sdio_irq() in each of three unbind tests.  The same tests
    completed without a kernel diagnostic after this change.
    
    Call cancel_delayed_work_sync() after mmc_remove_host() has stopped new
    requests and before the driver releases the host resources.
    
    Fixes: 208489032bdd ("mmc: mediatek: Add Mediatek MMC driver")
    Cc: [email protected]
    Assisted-by: Codex:GPT-5
    Signed-off-by: Yibo Tan <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mmc: sdhci-sprd: disable runtime PM on remove [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Wed Sep 16 00:19:47 2026 +0800

    mmc: sdhci-sprd: disable runtime PM on remove
    
    commit e1c6c10a6a70a69e29b04fcc1ebe4b9bcbc7a49a upstream.
    
    sdhci_sprd_probe() enables runtime PM, while sdhci_sprd_remove() does
    not perform the corresponding runtime PM cleanup.
    
    The probe failure path disables runtime PM before disabling the clocks,
    but the normal remove path directly disables clocks that are also
    managed by the runtime PM callbacks. If the device is runtime
    suspended, those clocks may already be disabled.
    
    Resume the device before removal, disable runtime PM and drop the
    temporary runtime PM reference before disabling the clocks.
    
    This issue was found by manual code inspection.
    
    Fixes: fb8bd90f83c4 ("mmc: sdhci-sprd: Add Spreadtrum's initial host controller")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Reviewed-by: Baolin Wang <[email protected]>
    Acked-by: Adrian Hunter <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mmc: via-sdmmc: cancel card-detect work on remove [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 10:34:16 2026 -0400

    mmc: via-sdmmc: cancel card-detect work on remove
    
    [ Upstream commit 57e5d877f898d5e5c9d672a77bb6bdd24f0d9bf5 ]
    
    Disabling the device interrupt and freeing the IRQ prevents new card-detect
    work from being queued, but carddet_work already queued by the handler can
    still run after via_sd_remove() returns. via_sdc_card_detect() recovers the
    host through container_of() and dereferences its MMIO base; once remove()
    returns the host can be freed, so that work would touch freed memory.
    
    Cancel carddet_work after freeing the IRQ and before cancelling
    finish_bh_work, which the card-detect handler can also queue. carddet_work
    can re-enable the interrupt through via_reset_pcictrl(); mask it again
    afterwards.
    
    This issue was found by an in-house static analysis tool and confirmed by
    manual code review.
    
    Fixes: f0bf7f61b840 ("mmc: Add new via-sdmmc host controller driver")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Signed-off-by: Ulf Hansson <[email protected]>
    [ adjusted context to retain del_timer_sync() instead of timer_delete_sync(). ]
    Signed-off-by: Sasha Levin <[email protected]>

 
mtd: block2mtd: Fix divide error when erase_size is zero [+ + +]
Author: Pei Xiao <[email protected]>
Date:   Tue Oct 6 17:32:31 2026 -0400

    mtd: block2mtd: Fix divide error when erase_size is zero
    
    [ Upstream commit b5965c4221165045e19736794ca5f48ae3d67142 ]
    
    The erase size is parsed from the "block2mtd" module parameter and can
    be set to zero. add_device() then evaluates
    
            if (size % erase_size)
    
    with a zero divisor, which triggers a divide error:
    
    divide error: 0000 [#1] PREEMPT SMP PTI
    RIP: 0010:add_device drivers/mtd/devices/block2mtd.c:296 [inline]
    RIP: 0010:block2mtd_setup2+0x592/0xda0 drivers/mtd/devices/block2mtd.c:459
    Call Trace:
    block2mtd_setup+0x27/0xe0 drivers/mtd/devices/block2mtd.c:476
    param_attr_store+0x214/0x310 kernel/params.c:589
    module_attr_store+0x65/0x90 kernel/params.c:904
    kernfs_fop_write_iter+0x3a4/0x540 fs/kernfs/file.c:345
    ...
    
    Reject a zero erase size before performing the modulo operation so the
    existing "erasesize must be a divisor of device size" error path
    reports the invalid argument and frees the device.
    
    Fixes: ea6d833a3fdd ("mtd: block2mtd: check device size")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/lkml/[email protected]/
    Suggested-by: Jörn Engel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Pei Xiao <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    [ sashal: adapted the size variable check to use dev->blkdev->bd_inode->i_size directly ]
    Signed-off-by: Sasha Levin <[email protected]>

mtd: rawnand: cadence: Initialize IRQ state before requesting IRQ [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Wed Sep 2 15:05:42 2026 +0800

    mtd: rawnand: cadence: Initialize IRQ state before requesting IRQ
    
    commit 21f027016b1290d13c30b198ae7a00e6b3d1d5a5 upstream.
    
    The Cadence NAND interrupt handler uses both the IRQ lock and completion
    object. Registering the IRQ before initializing them leaves a window in
    which a pending interrupt can access uninitialized synchronization state.
    
    Initialize them before registering the handler.
    
    Fixes: ec4ba01e894d ("mtd: rawnand: Add new Cadence NAND driver to MTD subsystem")
    Cc: [email protected]
    Assisted-by: Codex:GPT-5
    Signed-off-by: Runyu Xiao <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: rawnand: vf610_nfc: fix false bitflips on reads of erased pages [+ + +]
Author: Mehmet Fide <[email protected]>
Date:   Tue Sep 1 09:39:07 2026 +0200

    mtd: rawnand: vf610_nfc: fix false bitflips on reads of erased pages
    
    [ Upstream commit 68fe2faf5c69d0e21f94cd695d28f0ba677d484f ]
    
    When the ECC engine fails to decode a page, the driver re-reads the OOB
    area with the engine bypassed, but runs the erased-page check for the
    data area on the buffer left in the controller SRAM by the failed
    transfer.
    
    That buffer does not hold what is on the flash: the failing engine
    writes a bogus single-bit "correction" into it. In the 60-byte ECC mode
    the all-0xff content of an erased page always decodes to the same error
    location, so every erased page shows one stale zero bit at data offset
    0x5FD, which the erased-page check then reports as a corrected bitflip.
    
    Edward Karpicz discovered this behaviour and identified the offset on a
    Colibri VF61; the analysis and the fix build on his finding. Measured
    with an instrumented driver on a Colibri VF50 (MX30LF1G18AC, 32-bit
    ECC): reading a 126 MiB partition with nanddump increased the corrected
    counter by 18035, exactly one per erased page, while raw reads of the
    same pages return clean 0xff. A v4.4 kernel on the VF61 (MX30LF4G28AC)
    accumulates the same false counts, so the behaviour follows the
    controller rather than the chip or the driver generation. Neither the
    Vybrid reference manual nor the published mask set errata (VFXXX_2N02G)
    document it. The 45-byte ECC mode is not affected.
    
    Restoring the known byte is not enough: on pages that fail to decode
    with content other than all-0xff the engine writes its correction
    wherever the syndrome points (measured at a different offset on such a
    page), so the check has to run on what the flash holds. Re-read the data
    area with the ECC engine bypassed, exactly as already done for the OOB
    area. The corrected counter then stays at zero on both boards.
    
    Reported-by: Edward Karpicz <[email protected]>
    Link: https://community.toradex.com/t/colibri-vf50-vf61-on-the-current-bsp-mainline-u-boot-v2026-07-and-linux-6-18-lts/30735
    Signed-off-by: Mehmet Fide <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

mtd: rawnand: vf610_nfc: fix reads on chips with more than 64 bytes of OOB [+ + +]
Author: Mehmet Fide <[email protected]>
Date:   Tue Sep 1 09:39:06 2026 +0200

    mtd: rawnand: vf610_nfc: fix reads on chips with more than 64 bytes of OOB
    
    commit 37adc9c5789c76db3b1ee7aeec3999b8503020d0 upstream.
    
    The controller transfers 64 spare bytes per page and the driver only
    implements the matching 64-byte ECC layout, so attach_chip() shrinks
    mtd->oobsize when the chip provides more. That clamp does not survive:
    nand_scan_tail() runs nanddev_init() after ->attach_chip(), and it
    restores mtd->oobsize from the memory organization, which still holds
    the value detected from the chip. The driver then transfers writesize
    plus the chip's full OOB size, the hardware ECC parity ends up at a
    different offset than the layout the controller was set up for, and
    every ECC-protected read fails with -EBADMSG.
    
    Measured on a Colibri VF61 (MX30LF4G28AC, 2048-byte pages, 112 bytes of
    OOB): with the clamp lost, UBI cannot read the erase counter headers of
    the pages U-Boot has just written, and the on-flash bad block table
    written by an older kernel reads back with ECC errors, so the board
    does not boot. Kernels before commit a7ab085d7c16 ("mtd: rawnand:
    Initialize the nand_device object") are not affected because nothing
    overwrote the clamp there, which is why the same chip works with a v4.4
    kernel and with U-Boot, whose copy of this driver has no memory
    organization to restore the value from. Edward Karpicz reported that
    the clamp no longer takes effect on this chip; see the link below.
    
    Instead of modifying the memory organization, keep the detected OOB
    size and give the driver its own mtd_ooblayout_ops: the same layout the
    NAND core uses for large pages, but computed on the first 64 OOB bytes
    instead of the whole OOB, so the ECC bytes stay where U-Boot and the
    old kernels put them. The data paths transfer writesize plus those 64
    bytes, as the controller always has.
    
    Since mtd->oobsize now reports the chip's real spare size, fill the
    tail of oob_poi with 0xff after the 64 transferred bytes on ECC page
    reads: the core may copy the full mtd->oobsize from it, which would
    otherwise expose whatever the buffer held before. 0xff also matches
    what a raw read returns from flash, since the write path only ever
    programs the first 64 spare bytes.
    
    Reported-by: Edward Karpicz <[email protected]>
    Link: https://community.toradex.com/t/colibri-vf50-vf61-on-the-current-bsp-mainline-u-boot-v2026-07-and-linux-6-18-lts/30735
    Suggested-by: Miquel Raynal <[email protected]>
    Fixes: a7ab085d7c16 ("mtd: rawnand: Initialize the nand_device object")
    Cc: [email protected]
    Signed-off-by: Mehmet Fide <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

mtd: spinand: Enable QE on all dies [+ + +]
Author: Han Xu <[email protected]>
Date:   Tue Oct 6 19:25:16 2026 -0400

    mtd: spinand: Enable QE on all dies
    
    [ Upstream commit 63d6cace2c4a7f36c1cb44f1bb5e0f3ef19e5c7f ]
    
    The QUAD ENABLE (QE) bit is stored in a per-die configuration
    register on some SPI-NAND devices. When a device contains multiple
    dies, updating the QE bit only on the currently selected die can
    leave the remaining dies operating in non-quad mode.
     
    Iterate over all targets and update the QE setting on each die
    during initialization to ensure consistent quad I/O operation
    across the entire device.
    
    Tested on ISSI IS38SMW04G8B.
    
    Fixes: 7529df465248 ("mtd: nand: Add core infrastructure to support SPI NANDs")
    Cc: [email protected]
    Signed-off-by: Han Xu <[email protected]>
    Signed-off-by: Miquel Raynal <[email protected]>
    [ sashal: retained local enable detection in spinand_init_quad_enable() instead of using an enable parameter. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
namespace: check a submount for references right before unmounting it [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Wed Sep 30 15:31:54 2026 +0200

    namespace: check a submount for references right before unmounting it
    
    commit 32bf92416614a1e3ff3524fc6b780259c7aad3ef upstream.
    
    shrink_submounts() and mark_mounts_for_expiry() first collect all the
    mounts they are allowed to unmount and then unmount them.
    
    Whether a mount is busy is decided by propagate_mount_busy() on the
    tree. But unmounting the first mount changes the tree that the second
    one propagates into. propagate_umount()
    moves a surviving overmount off a copy it unmounts and mounts it where
    the copy was mounted. If that's where the propagated copy of the second
    victim is looked up the overmount becomes a candidate of the second
    umount_tree(). It's childless and so trim_one() commits it without
    looking at its reference count.
    
    So a synchronous umount pulls out a busy mount that is in use somewhere
    else and marks it MNT_SYNC_UMOUNT while it has users:
    
      umount2(/tmp/plshrink/p1, 0) = 0 errno 0
      cwd is (unreachable)
    
    The same two umounts requested one after the other fail with EBUSY.
    This needs a mount with MNT_SHRINKABLE, i.e., automounted submounts of
    NFS, AFS and CIFS or the tracefs mount below debugfs. Bind mounts
    inherit the flag.
    
    Check each mount right before it is unmounted under the same hold of
    namespace_sem and mount_lock as the umount itself. Make sure that the
    algorithm stays linear.
    
    Fixes: 1064f874abc0 ("mnt: Tuck mounts under others instead of creating shadow/side mounts.")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

namespace: check the mounts before reading their parents in pivot_root() [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 22:44:59 2026 -0400

    namespace: check the mounts before reading their parents in pivot_root()
    
    [ Upstream commit 6b7c001eb5857fa09041f47673666060a2e5fc1c ]
    
    path_pivot_root() reads the parents of new_root and of the caller's root
    and checks whether they are shared before it checks that either mount is
    in the caller's mount namespace. Only namespace_sem is held. That's fine
    for a mount that is in the caller's mount namespace.
    
    But new_root can be a file descriptor to a mount that has been unmounted
    and that only the file descriptor keeps alive. If that mount stayed
    attached to its parent when it was unmounted nothing pins the parent for
    it. The final mntput() of the parent unhooks the children under
    mount_lock alone and frees the parent afterwards:
    
      pivot_root()                     close(fd), last ref on the parent
      ------------                     ---------------------------------
      ex_parent = new_mnt->mnt_parent
                                       mntput_no_expire_slowpath()
                                         __umount_mnt(new_mnt)
                                       cleanup_mnt()
                                         call_rcu()
      IS_MNT_SHARED(ex_parent)
    
      BUG: KASAN: slab-use-after-free in path_pivot_root+0xf1a/0x1840
      Read of size 4 at addr ffff8881047382f8 by task pivot_widen/157
       path_pivot_root+0xf1a/0x1840
       __x64_sys_pivot_root+0x165/0x190
    
    The same goes for the caller's root via chroot(). Both outcomes of the
    check end in EINVAL so nothing but the read itself goes wrong. It's the
    same thing commit bb4609405752 ("statmount: read the parent of an
    unmounted mount under mount_lock") fixed for statmount().
    
    Check that both mounts are in the caller's namespace before their
    parents are read. Every path returns EINVAL either way.
    
    Fixes: e0c9c0afd2fc ("mnt: Update detach_mounts to leave mounts connected")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: Adapted the checks to the pivot_root syscall implementation using goto out4 instead of return -EINVAL. ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: don't copy an unmounted mount tree [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 19:14:38 2026 -0400

    namespace: don't copy an unmounted mount tree
    
    [ Upstream commit 8bacbf6be959973b28b691713a872c12eae69eec ]
    
    may_copy_tree() accepts a mount whose root is an nsfs or pidfs file
    before it checks whether that mount is mounted. This exception exists
    for nsfs and pidfs mounts. They are part of no mount namespace so
    neither check_mnt() nor is_mounted() would let them through and
    bind-mounting a nsfsfd or a pidfd wouldn't work.
    
    Problem is that exception also admits a bind mount of such a file when
    it was lazily unmounted and is only kept alive by a file descriptor:
    
      mount --bind /proc/self/ns/net /tmp/x
      exec 3< /tmp/x
      umount -l /tmp/x
      mount --rbind /proc/self/fd/3 /tmp/y
    
    With MS_REC or AT_RECURSIVE copy_tree() doesn't stop at the unmounted
    mount. It copies every mount that stayed attached to it as well. So if
    you have a bunch of overmounts over the nsfsfd or the pidfd the whole
    unmounted stack is copied. That's a bug.
    
    So refuse to walk an unmounted tree. Copying its root alone stays
    possible. So a bind mount of a namespace that is gone can still be
    recreated from a file descriptor on the old one. The file descriptor
    pins that mount and its root and __has_locked_children() only reads the
    direct children which don't leave the parent's list without
    namespace_sem. The internal mounts carry MNT_NS_INTERNAL instead of NULL
    and are still walked. Copying an unmounted tree recursively fails with
    EINVAL.
    
    Fixes: e149ed2b805f ("take the targets of /proc/*/ns/* symlinks to separate fs")
    Fixes: ef4144ac2dec ("pidfs: allow bind-mounts")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adjusted context for the inline mount check instead of may_copy_tree() ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: don't inherit MNT_UMOUNT in clone_mnt() [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 21:21:39 2026 -0400

    namespace: don't inherit MNT_UMOUNT in clone_mnt()
    
    [ Upstream commit e2c6d326216642011da318b9edfd5d57ebd5a56f ]
    
    MNT_UMOUNT gets raised on a mount that umount_tree() or umount_one() has
    taken out of its namespace. It's never cleared. __detach_mounts()
    unhooks a mount that carries it instead of unmounting it.
    
    disconnect_mount() lets an unmounted child stay attached only if its
    parent carries it. propagate_umount() takes it as the sign that a mount
    is going to be unmounted when it decides what else can be unmounted,
    where a chain of locked mounts ends and where a for reparenting an
    overmount.
    
    clone_mnt() copies the flags of the source and only masks
    MNT_INTERNAL_FLAGS which doesn't include MNT_UMOUNT. A mount that was
    lazily unmounted but is kept alive by a file descriptor can still be
    copied when its root is an nsfs or pidfs file because may_copy_tree()
    accepts those before checking whether the source is mounted at all:
    
      mount --bind /proc/self/ns/net /tmp/x
      exec 3< /tmp/x
      umount -l /tmp/x
      mount --bind /proc/self/fd/3 /tmp/y
    
    The mount on /tmp/y is attached to the caller's namespace with
    MNT_UMOUNT already set and every copy of it inherits the flag again.
    
    That causes a number of bugs:
    
    - Unlink its mountpoint from a mount namespace where it isn't one.
      __detach_mounts() takes it for a mount that was unmounted earlier,
      unhooks it from its parent and drops the reference the namespace
      holds on it. It stays in the namespace with one reference too few
      and as its own parent, so it can't be unmounted through the file
      descriptor anymore and the namespace never finds it again. When the
      namespace goes away it's leaked and points to a freed struct
      mnt_namespace that may_change_propagation() and anon_ns_root() read
      on the next propagation change or mount_setattr() through the file
      descriptor.
    
    - Make it shared and unmount a peer. trace_transfers() follows the
      flag from the peer into it and strips it from its peer group.
    
    - Let a propagated umount reach it. gather_candidates() marks it with
      T_UMOUNT_CANDIDATE but never puts it on the candidate list, so the
      mark is never cleared and every later propagated umount skips it. If
      it's the parent of a locked mount handle_locked() takes it as the
      cutoff and commits the locked child that should have stayed and
      disconnect_mount() leaves that child attached to it, unmounted under
      a mounted parent, which is what disconnect_mount() exists to
      prevent. When the namespace goes away umount_tree() visits the child
      a second time. And once __detach_mounts() has made it its own parent
      reparent() never finds the end of the chain of unmounted parents.
    
    A clone is a new mount that has never been unmounted. Add MNT_UMOUNT
    to MNT_INTERNAL_FLAGS so clone_mnt() never copies it. And warn when
    umount_tree() reaches a mount that already has it set.
    
    Fixes: 590ce4bcbfb4 ("mnt: Add MNT_UMOUNT flag")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adapted MNT_UMOUNT filtering to the explicit flag mask in clone_mnt() ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: handle mount locking for automounts correctly [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Wed Oct 14 07:05:42 2026 -0400

    namespace: handle mount locking for automounts correctly
    
    [ Upstream commit 33aadc7c72055fca93cb5a3691d836ebf8b31c9b ]
    
    If mounts are propagated across user namespaces, attach_recursive_mnt()
    locks every copy of the source mount to protect overmounts from
    vanishing and revealing the underlying files or directories.
    
    The user namespace is taken from the caller's mount namespaces since
    this is where the mounts end up. Except, that's not always true.
    Automounts may legitimately get popped in by tasks located in a
    different mount and user namespace during path lookup.
    
    Then check doesn't make sense at that point. The copy in the namespace
    of the parent - which may be the host's - is now locked and the host
    cannot change the flags of its own mounts anymore.
    
    Here's the reproducer:
    
    - host has debugfs mounted nosuid,nodev,noexec and shared
    - tracefs automount below it is not yet active
    - hand a child process a directory descriptor on that mount
    - child process enters auser and mount namespace
    - child process' namespace now holds a locked copy of the host's debugfs
      mount that receives propagation from it
    - child process stats "tracing/." through the descriptor
    - lookup runs on the host's mount so the automount lands below the host's mount
    - propagation puts a copy below the child's copy
    - both try to clear the flags on the mount they got, with a bind remount:
    
        host, on its own automount:            MS_REMOUNT|MS_BIND = EPERM
        child, on the copy in its namespace:   MS_REMOUNT|MS_BIND = 0
    
    So the lock landed on the host's mount instead of the child's copy.
    Congrats. So we need to compare with the owner of the namespace the
    mount actually gets mounted on. For all regular cases that is the
    caller's mount namespace and so nothing changes.
    
    Detached trees in anonymous mount namespaces by be handed over via
    SCM_RIGHTS or inherited in other ways on purpose so the attaching task's
    mount namespace is authoritative, not the creator of the detached tree.
    
    Fixes: 132c94e31b8b ("vfs: Carefully propogate mounts across user namespaces")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adjusted context for attach_recursive_mnt() using separate destination arguments instead of a pinned_mountpoint ]
    Signed-off-by: Sasha Levin <[email protected]>

namespace: refuse an automount below a mount that is in no namespace [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Fri Oct 2 15:52:36 2026 +0200

    namespace: refuse an automount below a mount that is in no namespace
    
    commit ba985ce08471c555af2a2fbe217c1bc2e72a6d8c upstream.
    
    It's possible to add autmounts even when the parent mount isn't in the
    mount namespace of the caller. The only requirement we have is that the
    parent mount namespace must not be NULL, i.e., unmounted.
    
    Problem is that clone_private_mount() has MNT_NS_INTERNAL which makes
    that trivially true. So that passes the test and attach_recursive_mnt()
    accepts that as a mount point and funny enough, count_mounts()
    dereferences MNT_NS_INTERNAL. The problem is it is an error pointer...
    
    So we can reach this in userspace via fanotify. A filesystem mark on the
    lower filesystem of an overlay reports paths on the layer clone and
    reading the event hands out a descriptor on it. For example with debugfs
    as the lower layer it goes kaboom:
    
      openat(evfd, "tracing", O_DIRECTORY)
    
      Oops: general protection fault
      KASAN: null-ptr-deref in range [0x1d0-0x1d7]
      RIP: 0010:count_mounts+0x35/0x200
       attach_recursive_mnt
       finish_automount
    
    And since that sleeping beauty happens under namespace_sem held for
    writing every mount operation on the system blocks from then on.
    Congrats.
    
    Use is_mounted() instead which rejects unmounted and internal mounts
    alike. The open fails with EINVAL just as it did before
    clone_private_mount() used MNT_NS_INTERNAL.
    
    Fixes: df820f8de4e4 ("ovl: make private mounts longterm")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

namespace: unhash a dentry before detaching the mounts on it [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Tue Oct 13 21:21:45 2026 -0400

    namespace: unhash a dentry before detaching the mounts on it
    
    [ Upstream commit 528b383dc35d1e5caf64ddf5d35f983ae543b0d0 ]
    
    unlink(), rmdir() and rename() remove the entry from the filesystem,
    call detach_mounts() on the entry with the inode locked and then call
    d_delete() once the inode is unlocked.
    
    The thing is that between detach_mounts() and d_delete() the dentry is
    still hashed and positive. But after detach_mounts() nothing covers the
    dentry anymore. A lookup that finds this dentry in the dcache can
    uncover what the mounts hid.
    
    That's a problem when unlinking files or directories that are
    mountpoints in other mount namespaces. Everybody who had the underlying
    entry covered can race the detach_mount() call until d_delete() has run.
    
    The race window isn't all that small. It encompasses namespace_unlock()
    with a full synchronize_rcu_expedited() grace period and the
    inode_unlock() of the entry.
    
    In my experiments three walkers that kept trying read an overmounted
    file in 11938 of the 16140 unlinks that removed its mountpoint from a
    bind mount of the filesystem within a minute.
    
    Fun fact, d_invalidate() has the same ordering problem but gets it
    right. It unhashes the dentry first and detaches the mounts afterwards.
    Let's do the same in __detach_mounts():
    
    - A lookup that hasn't found the dentry yet misses it in the dcache and
      waits for the directory lock that the caller holds until the name is
      gone for good.
    
    - A lockless lookup that found it already fails the mount_lock check
      while the dentry still counts as a mountpoint and the d_seq check once
      it doesn't, and retries.
    
    This fixes the lockless path. We still need to fix the reference count
    lookup in a follow-up patch.
    
    So d_drop() the dentry. The dentry stays positive and held but can't be
    found anymore. Then proceed with the detach and unlink.
    
    Reproducer:
    
    The reads were counted with the program below, three walkers for 60 s
    in a VM with 4 CPUs. The race window is stretched with the debug patch
    pasted here. fs.detach_race_walk_us sleeps in lookup_fast() once it
    found a mountpoint dentry and before its mounts are crossed.
    fs.detach_race_unlink_us sleeps in vfs_unlink() between detach_mounts()
    and d_delete().
    
      // SPDX-License-Identifier: GPL-2.0
      /*
       * unlink_covered: unlink a file that is a mountpoint in a detached copy of
       * its mount, against lookups that open it through that copy.
       *
       * A is a tmpfs with the file f1 (content SECRET_F) and the plain file
       * MARK_A. A' is an open_tree(OPEN_TREE_CLONE) copy of A with MARK_A bound
       * on A'/f1, held through an O_PATH fd on its root once the tree fd is
       * closed. Walkers open f1 through that fd while the driver unlinks A/f1,
       * where nothing is mounted on it. A walker may read MARK_A or get ENOENT.
       * A read of SECRET_F is a hit: the name was found after its mount was
       * gone. The lockless walks use openat2(RESOLVE_CACHED).
       *
       * usage: unlink_covered [-t seconds] [-w walkers]
       */
      #ifndef _GNU_SOURCE
      #define _GNU_SOURCE
      #endif
      #include <errno.h>
      #include <fcntl.h>
      #include <pthread.h>
      #include <stdatomic.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      #include <sys/mount.h>
      #include <sys/stat.h>
      #include <sys/syscall.h>
      #include <linux/openat2.h>
    
      #ifndef __NR_open_tree
      #define __NR_open_tree 428
      #endif
      #ifndef __NR_move_mount
      #define __NR_move_mount 429
      #endif
      #ifndef __NR_openat2
      #define __NR_openat2 437
      #endif
      #ifndef OPEN_TREE_CLONE
      #define OPEN_TREE_CLONE 1
      #endif
      #ifndef OPEN_TREE_CLOEXEC
      #define OPEN_TREE_CLOEXEC O_CLOEXEC
      #endif
      #ifndef MOVE_MOUNT_F_EMPTY_PATH
      #define MOVE_MOUNT_F_EMPTY_PATH 0x00000004
      #endif
    
      #define WORK "/tmp/uc"
      #define ADIR WORK "/A"
    
      static int duration = 60, nwalkers = 3;
      static atomic_int stop, writer_waiting;
      static pthread_rwlock_t cur_lock = PTHREAD_RWLOCK_INITIALIZER;
      static int cur_fd = -1;               /* the root of A', -1 while there is none */
      static atomic_long n_unlink, n_walk, n_mark, n_enoent, n_other, n_secret,
                       n_secret_cached;
    
      static void die(const char *what)
      {
            fprintf(stderr, "FATAL %s: %s\n", what, strerror(errno));
            exit(2);
      }
    
      static void put_file(int dfd, const char *name, const char *content)
      {
            int fd = openat(dfd, name, O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC,
                            0644);
    
            if (fd < 0 || write(fd, content, strlen(content)) < 0)
                    die(name);
            close(fd);
      }
    
      /* "plain/../" @n times, then f1: a longer walk that checks nothing on its way */
      static char *longpath(int n)
      {
            char *p = malloc(n * 9 + 3), *q = p;
    
            for (int i = 0; i < n; i++, q += 9)
                    memcpy(q, "plain/../", 9);
            strcpy(q, "f1");
            return p;
      }
    
      static void try_read(int dfd, const char *path, int cached)
      {
            struct open_how how = { .flags = O_RDONLY | O_CLOEXEC,
                                    .resolve = RESOLVE_CACHED };
            char buf[32] = "";
            long n;
            int fd;
    
            if (cached)
                    fd = syscall(__NR_openat2, dfd, path, &how, sizeof(how));
            else
                    fd = openat(dfd, path, O_RDONLY | O_CLOEXEC);
            atomic_fetch_add(&n_walk, 1);
            if (fd < 0) {
                    if (errno == ENOENT)
                            atomic_fetch_add(&n_enoent, 1);
                    else if (!cached || errno != EAGAIN)
                            atomic_fetch_add(&n_other, 1);
                    return;
            }
            n = read(fd, buf, sizeof(buf) - 1);
            close(fd);
            if (n >= 6 && !strncmp(buf, "SECRET", 6)) {
                    if (cached)
                            atomic_fetch_add(&n_secret_cached, 1);
                    if (!atomic_fetch_add(&n_secret, 1))
                            printf("HIT: read \"%s\" through %s (%s walk)\n", buf,
                                   path, cached ? "lockless" : "any");
            } else {
                    atomic_fetch_add(&n_mark, 1);
            }
      }
    
      static void *walker(void *arg)
      {
            unsigned int r = (long)arg * 2654435761u;
    
            while (!atomic_load(&stop)) {
                    char *p_long, *p_short;
                    int dfd;
    
                    while (atomic_load(&writer_waiting) && !atomic_load(&stop))
                            usleep(20);
                    pthread_rwlock_rdlock(&cur_lock);
                    dfd = cur_fd;
                    if (dfd < 0) {
                            pthread_rwlock_unlock(&cur_lock);
                            usleep(100);
                            continue;
                    }
                    r = r * 1103515245u + 12345u;
                    p_long = longpath(1 + (r >> 8) % 400);
                    p_short = longpath(0);
                    try_read(dfd, p_long, 0);
                    try_read(dfd, p_short, 0);
                    try_read(dfd, p_long, 1);
                    pthread_rwlock_unlock(&cur_lock);
                    free(p_long);
                    free(p_short);
            }
            return NULL;
      }
    
      /* hand the walkers a new A' (or none), close the old one */
      static void publish(int fd)
      {
            int old;
    
            atomic_fetch_add(&writer_waiting, 1);
            pthread_rwlock_wrlock(&cur_lock);
            old = cur_fd;
            cur_fd = fd;
            pthread_rwlock_unlock(&cur_lock);
            atomic_fetch_sub(&writer_waiting, 1);
            if (old >= 0)
                    close(old);
      }
    
      static void *driver(void *arg __attribute__((unused)))
      {
            int a;
    
            if (mkdir(ADIR, 0755) && errno != EEXIST)
                    die("mkdir A");
            if (mount("A", ADIR, "tmpfs", 0, "size=4M"))
                    die("mount A");
            a = open(ADIR, O_PATH | O_DIRECTORY | O_CLOEXEC);
            if (a < 0 || mkdirat(a, "plain", 0755))
                    die("A/plain");
            put_file(a, "MARK_A", "MARK_A");
            while (!atomic_load(&stop)) {
                    int t, m, fd_a;
    
                    put_file(a, "f1", "SECRET_F");
                    t = syscall(__NR_open_tree, a, "",
                                OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC | AT_EMPTY_PATH);
                    if (t < 0)
                            die("open_tree A");
                    m = syscall(__NR_open_tree, a, "MARK_A",
                                OPEN_TREE_CLONE | OPEN_TREE_CLOEXEC);
                    if (m < 0)
                            die("open_tree MARK_A");
                    if (syscall(__NR_move_mount, m, "", t, "f1",
                                MOVE_MOUNT_F_EMPTY_PATH))
                            die("move_mount");
                    close(m);
                    fd_a = openat(t, ".", O_PATH | O_DIRECTORY | O_CLOEXEC);
                    if (fd_a < 0)
                            die("open A'");
                    publish(fd_a);
                    usleep(200 + rand() % 1000);
                    close(t);                       /* A' is unmounted, fd_a holds it */
                    usleep(200 + rand() % 1000);
                    if (unlinkat(a, "f1", 0))       /* through A, a plain file there */
                            die("unlink f1");
                    atomic_fetch_add(&n_unlink, 1);
                    usleep(rand() % 300);
                    publish(-1);
            }
            close(a);
            umount2(ADIR, MNT_DETACH);
            return NULL;
      }
    
      int main(int argc, char **argv)
      {
            pthread_t d, *w;
            int c, i;
    
            setvbuf(stdout, NULL, _IOLBF, 0);
            while ((c = getopt(argc, argv, "t:w:")) != -1) {
                    switch (c) {
                    case 't':
                            duration = atoi(optarg);
                            break;
                    case 'w':
                            nwalkers = atoi(optarg);
                            break;
                    default:
                            fprintf(stderr, "usage: unlink_covered [-t seconds] [-w walkers]\n");
                            return 2;
                    }
            }
            if (unshare(CLONE_NEWNS) ||
                mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL))
                    die("unshare");
            if (mkdir(WORK, 0755) && errno != EEXIST)
                    die("mkdir");
            w = calloc(nwalkers, sizeof(*w));
            for (i = 0; i < nwalkers; i++)
                    if (pthread_create(&w[i], NULL, walker, (void *)(long)i))
                            die("pthread_create");
            if (pthread_create(&d, NULL, driver, NULL))
                    die("pthread_create");
            sleep(duration);
            atomic_store(&stop, 1);
            pthread_join(d, NULL);
            for (i = 0; i < nwalkers; i++)
                    pthread_join(w[i], NULL);
            printf("unlink_covered: %d s, %d walkers: unlinks %ld walks %ld mark %ld enoent %ld other %ld SECRET %ld (lockless %ld)\n",
                   duration, nwalkers, atomic_load(&n_unlink), atomic_load(&n_walk),
                   atomic_load(&n_mark), atomic_load(&n_enoent),
                   atomic_load(&n_other), atomic_load(&n_secret),
                   atomic_load(&n_secret_cached));
            return atomic_load(&n_secret) ? 1 : 0;
      }
    
    #  diff --git a/fs/namei.c b/fs/namei.c
    #  --- a/fs/namei.c
    #  +++ b/fs/namei.c
    #  @@ -35,6 +35,7 @@
    #   #include <linux/fcntl.h>
    #   #include <linux/device_cgroup.h>
    #   #include <linux/fs_struct.h>
    #  +#include <linux/delay.h>
    #   #include <linux/posix_acl.h>
    #   #include <linux/hash.h>
    #   #include <linux/bitops.h>
    #  @@ -1205,9 +1206,26 @@ static int sysctl_protected_symlinks __read_mostly;
    #   static int sysctl_protected_hardlinks __read_mostly;
    #   static int sysctl_protected_fifos __read_mostly;
    #   static int sysctl_protected_regular __read_mostly;
    #  +/* debug: widen the two windows of the detach_mounts() race */
    #  +static int sysctl_detach_race_walk_us __read_mostly;
    #  +static int sysctl_detach_race_unlink_us __read_mostly;
    #
    #   #ifdef CONFIG_SYSCTL
    #   static const struct ctl_table namei_sysctls[] = {
    #  +    {
    #  +            .procname       = "detach_race_walk_us",
    #  +            .data           = &sysctl_detach_race_walk_us,
    #  +            .maxlen         = sizeof(int),
    #  +            .mode           = 0644,
    #  +            .proc_handler   = proc_dointvec,
    #  +    },
    #  +    {
    #  +            .procname       = "detach_race_unlink_us",
    #  +            .data           = &sysctl_detach_race_unlink_us,
    #  +            .maxlen         = sizeof(int),
    #  +            .mode           = 0644,
    #  +            .proc_handler   = proc_dointvec,
    #  +    },
    #       {
    #               .procname       = "protected_symlinks",
    #               .data           = &sysctl_protected_symlinks,
    #  @@ -1878,6 +1896,10 @@ static struct dentry *lookup_fast(struct nameidata *nd)
    #               dentry = __d_lookup(parent, &nd->last);
    #               if (unlikely(!dentry))
    #                       return NULL;
    #  +            /* debug: between finding a mountpoint and crossing its mounts */
    #  +            if (unlikely(sysctl_detach_race_walk_us) && d_mountpoint(dentry))
    #  +                    usleep_range(sysctl_detach_race_walk_us,
    #  +                                 sysctl_detach_race_walk_us + 10);
    #               status = d_revalidate(nd->inode, &nd->last, dentry, nd->flags);
    #       }
    #       if (unlikely(status <= 0)) {
    #  @@ -5693,6 +5715,10 @@ int vfs_unlink(struct mnt_idmap *idmap, struct inode *dir,
    #                       if (!error) {
    #                               dont_mount(dentry);
    #                               detach_mounts(dentry);
    #  +                            /* debug: the mounts are gone, d_delete() is still to come */
    #  +                            if (unlikely(sysctl_detach_race_unlink_us))
    #  +                                    usleep_range(sysctl_detach_race_unlink_us,
    #  +                                                 sysctl_detach_race_unlink_us + 10);
    #                       }
    #               }
    #       }
    
    Fixes: 8ed936b5671b ("vfs: Lazily remove mounts on unlinked files and directories.")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: adjusted context for pointer-based mountpoint handling ]
    Signed-off-by: Sasha Levin <[email protected]>

 
net/mlx5e: Order ICOSQ cc update after CQ doorbell [+ + +]
Author: Li RongQing <[email protected]>
Date:   Tue Oct 6 13:58:20 2026 +0300

    net/mlx5e: Order ICOSQ cc update after CQ doorbell
    
    [ Upstream commit b056ca4d3742d0769f91137bb1ce3215428398f7 ]
    
    mlx5e_poll_ico_cq() requires sq->cc to be updated only after
    mlx5_cqwq_update_db_record(), otherwise a CQ overrun may occur.
    
    The current implementation updates sq->cc before the CQ doorbell
    record, violating this ordering requirement.
    
    Update the CQ doorbell record first and use dma_wmb() before updating
    sq->cc. This ensures that the CQ space is released to the device
    before the corresponding ICOSQ consumer index is updated by software.
    
    Fixes: fd9b4be8002c ("net/mlx5e: RX, Support multiple outstanding UMR posts")
    Signed-off-by: Li RongQing <[email protected]>
    Reviewed-by: Dragos Tatulea <[email protected]>
    Signed-off-by: Tariq Toukan <[email protected]>
    Reviewed-by: Daniel Machon <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
net/packet: guard the ll header push in packet_rcv_spkt() [+ + +]
Author: Quchaosheng <[email protected]>
Date:   Mon Sep 28 19:31:08 2026 +0800

    net/packet: guard the ll header push in packet_rcv_spkt()
    
    commit 28bc1ef699610ee09ce3d46a00552f5a0a0144bd upstream.
    
    packet_rcv_spkt() restores the link layer header with
    
            skb_push(skb, skb->data - skb_mac_header(skb));
    
    That subtraction is only meaningful when the device actually has a link
    layer header.  packet_rcv() and tpacket_rcv() both wrap it in
    dev_has_header(), which is also the predicate the block comment at the
    top of the file states the restore in terms of; packet_rcv_spkt() does
    not.  commit d549699048b4 ("net/packet: fix packet receive on L3
    devices without visible hard header") introduced the helper and changed
    the two call sites, and this one stayed behind.
    
    A device without a visible ll header can leave skb->mac_header at the
    0xFFFF sentinel that __alloc_skb() initialises it to.  A CAN skb does:
    init_can_skb() sets pkt_type and ip_summed but does not reset the
    headers, and commit 9f10374bb024 ("can: remove private CAN skb
    headroom infrastructure") dropped the skb_reset_*_header() calls that
    used to be there.  skb_mac_header() is then 0xFFFF, the length becomes
    a large negative number and skb_push() reports it through
    skb_under_panic() -- from softirq context, so it is a full system panic
    even with panic_on_oops=0:
    
      skbuff: skb_under_panic: text:ffffffff8bd21bc1 len:-65455 put:-65471 head:... data:... tail:0x50 end:0x180 dev:can0
      kernel BUG at net/core/skbuff.c:214!
      RIP: 0010:skb_panic+0x50/0x60
      Call Trace:
       <IRQ>
       skb_push+0x38/0x40
       packet_rcv_spkt+0xe1/0x170
       __netif_receive_skb_core.constprop.0+0x7e8/0xd30
       ...
      Kernel panic - not syncing: Fatal exception in interrupt
    
    The socket type is reachable: packet_create() accepts SOCK_PACKET
    alongside SOCK_RAW and SOCK_DGRAM behind the same CAP_NET_RAW check,
    and neither the socket length nor a capability check keeps it away
    from a CAN interface.
    
    The missing skb_reset_*_header() calls in init_can_skb() are a
    regression in their own right and are being fixed separately, but a
    packet socket should not turn a link layer that did not initialise its
    mac header into a kernel panic.  Guard the push the way the other two
    receive paths do.
    
    Tested on v7.3-rc5 under QEMU with a slcan device on a pty, which is
    the driver RX path: vcan does not reproduce it, because can_send()
    resets the headers on the way out.  One SOCK_PACKET socket bound to
    can0 and one frame written into the line discipline panics an
    unpatched kernel with the trace above; the same image with this patch
    prints no panic and powers off normally.  Both kernels are this tree,
    defconfig plus CONFIG_CAN_SLCAN=y, differing only in this hunk.
    
    Fixes: d549699048b4 ("net/packet: fix packet receive on L3 devices without visible hard header")
    Cc: [email protected]
    Signed-off-by: Quchaosheng <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net/packet: prevent TX_RING byte count overflow [+ + +]
Author: Ilkka Lappeteläinen <[email protected]>
Date:   Fri Sep 25 15:48:29 2026 +0300

    net/packet: prevent TX_RING byte count overflow
    
    commit 2cf81fc9505b148b1b70068303ea6ea4b1212403 upstream.
    
    tpacket_snd() drains every SEND_REQUEST frame in a TX ring and adds
    each valid packet length to the signed int len_sum. Userspace can
    recycle completed frames concurrently, so a single blocking send call
    is not bounded by the ring size.
    
    After enough successful transmissions len_sum wraps into the negative
    range. In particular, 65536 65535-byte frames followed by a 65007-byte
    frame produce 0xfffffdef, or -EIOCBQUEUED. sock_sendmsg_nosec() treats
    that as an impossible return and triggers a BUG. On systems configured
    to panic on oops, a CAP_NET_RAW holder can panic the host kernel.
    
    Stop before the next frame would make the byte count exceed INT_MAX.
    The positive short count leaves that frame pending for a later send
    call.
    
    A two-thread TPACKET_V2 reproducer triggered the BUG on an arm64 build
    of Linux 7.3-rc4. With this change, the same reproducer returned the
    expected positive short count without an oops.
    
    Fixes: 69e3c75f4d54 ("net: TX_RING and packet mmap")
    Cc: [email protected]
    Signed-off-by: Ilkka Lappeteläinen <[email protected]>
    Reviewed-by: Willem de Bruijn <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net/sched: act_api: release all action references on NEWACTION failure [+ + +]
Author: Xuanqiang Luo <[email protected]>
Date:   Wed Sep 16 20:25:55 2026 -0400

    net/sched: act_api: release all action references on NEWACTION failure
    
    [ Upstream commit 478eb5abb51931a152abab068f8a717b7ff480fd ]
    
    When a batched RTM_NEWACTION request replaces an existing action,
    tcf_idr_check_alloc() takes a temporary reference on it. If a later
    action fails to initialize, tcf_action_destroy() uses strict release
    semantics to clean up the actions initialized so far. For an action
    bound to a filter, the strict check returns -EPERM without dropping
    the temporary reference.
    
    This error also makes tcf_action_destroy() return before releasing
    subsequent entries. Any new action initialized between the bound
    action and the failing entry is leaked together with its reserved
    IDR slot, preventing reuse of its index.
    
    Use tcf_idr_release() to drop each reference held by the batch without
    rejecting bound actions. This allows cleanup to continue through all
    initialized entries and preserves the module reference release when
    an action is destroyed. Explicit action deletion and flushing retain
    their separate bind-count checks.
    
    Fixes: 55334a5db5cd ("net_sched: act: refuse to remove bound action outside")
    Cc: [email protected]
    Signed-off-by: Xuanqiang Luo <[email protected]>
    Reviewed-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: cls_flower: validate mask pointer after nla_next() [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Wed Aug 26 10:51:20 2026 +0800

    net/sched: cls_flower: validate mask pointer after nla_next()
    
    commit fee10655709c5c597e8e9f722f3035d9ea31ff3a upstream.
    
    fl_set_enc_opt() iterates the key's nested tunnel-option attributes
    with nla_for_each_attr() while advancing a single mask pointer via
    nla_next() at the bottom of each loop, so the mask cursor is driven
    by the number of key attributes rather than by the mask's own
    attributes.  The nla_ok() added by commit c96adff956191 ("cls_flower:
    call nla_ok() before nla_next()") only validates the mask pointer
    that was just consumed; the pointer produced by nla_next() is used by
    the next iteration (fl_set_geneve_opt() and siblings) without any
    validation.
    
    The mask's nested attributes are validated with NL_VALIDATE_LIBERAL,
    which merely warns on trailing bytes that do not form a complete
    attribute.  A mask carrying one valid attribute plus 1-3 residue
    bytes (or a non-aligned attribute length making msk_depth negative)
    therefore reaches the next iteration with msk_depth != 0, so neither
    the !msk_depth check in fl_set_enc_opt() nor the !depth check in the
    per-type helpers fires.  nla_type() then reads past the mask payload
    and nla_parse_nested_deprecated() iterates with an nla_len taken
    from those bytes, reading well beyond the mask attribute (KASAN:
    slab-out-of-bounds read in __nla_validate_parse from fl_change()).
    
    Validate the advanced mask pointer as well: when the mask is not
    legitimately exhausted (msk_depth != 0) and the new pointer fails
    nla_ok(), reject the filter with -EINVAL.  An exactly exhausted mask
    still skips the check, preserving exact-match behaviour for the
    remaining key attributes.
    
    Fixes: c96adff95619 ("cls_flower: call nla_ok() before nla_next()")
    Reported-by: TencentOS Corvus AI <[email protected]>
    Cc: [email protected]
    Signed-off-by: Aohan Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net/sched: cls_u32: skip hash tables in u32_bind_class() [+ + +]
Author: Zhang Changzhong <[email protected]>
Date:   Tue Oct 20 22:26:36 2026 +0200

    net/sched: cls_u32: skip hash tables in u32_bind_class()
    
    [ Upstream commit 6d3724e616faf952c3adcf8414fc21a828ef3709 ]
    
    u32_walk() enumerates both struct tc_u_hnode and struct tc_u_knode
    through the walker callback. u32_bind_class() unconditionally casts the
    passed fh to tc_u_knode and accesses &n->res, so when fh is actually a
    tc_u_hnode, which has no tcf_result member, this results in a
    slab-out-of-bounds read of res->classid in tc_cls_bind_class().
    
    The issue can be reproduced with the following commands:
    
        tc qdisc add dev lo root handle 1: hfsc
        tc class add dev lo parent 1: classid 1:1 hfsc sc rate 1000kbit
        tc filter add dev lo parent 1:1 protocol ip prio 1 u32 match u32 0 0 flowid 1:1
        tc class add dev lo parent 1: classid 1:2 hfsc sc rate 2000kbit
    
    Fix this by skipping hash tables via the TC_U32_KEY(handle) check.
    
    Fixes: 07d79fc7d94e ("net_sched: add reverse binding for tc class")
    Signed-off-by: Zhang Changzhong <[email protected]>
    Acked-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: em_text: reject unterminated algo before autoload [+ + +]
Author: Jamal Hadi Salim <[email protected]>
Date:   Wed Sep 30 03:31:02 2026 -0400

    net/sched: em_text: reject unterminated algo before autoload
    
    [ Upstream commit c9728fcf2e7fb4a7a8d08ebd9524c3b02ae1a021 ]
    
    This is a follow-up to commit 9c572a83037a ("net/sched: fix potential
    stack infoleak in em_text_dump()"), which zero-initialised the dump-side
    struct. Sashiko pointed at a pre-existing bug that exposed the change-side
    input-validation gap open.
    
    em_text_change() casts the raw netlink attribute payload to struct
    tcf_em_text and passes conf->algo, a 16-byte array with no enforced NUL
    terminator, to textsearch_prepare().  On the TS_AUTOLOAD retry
    textsearch_prepare() calls request_module("ts_%s", algo); vsnprintf()
    walks %s until it finds a NUL, so an algo[] with no NUL reads past the
    array into the adjacent struct fields and payload and feeds those bytes
    to the usermode helper command line.  This is an out-of-bounds read and
    a kernel memory disclosure.
    
    Reject the attribute when no NUL exists within TC_EM_TEXT_ALGOSIZ bytes,
    matching the check xt_string has had since 3ab720881b6e.
    
    Conditions to recreate the bug:
    - CAP_NET_ADMIN on the target netns (namespace-local via unshare -Urn
      is enough)
    - install clsact on an interface, then add a basic filter with one text
      ematch whose algo[] is 16 bytes with no NUL (e.g. "A"*16) and
      pattern_len at least 1
    - the add fails with -ENOENT and the kernel invokes modprobe with a
      module name made of "ts_" plus the 16 bytes and the adjacent payload
    
    Fixes: d675c989ed2d4 ("[PKT_SCHED]: Packet classification based on textsearch (ematch)")
    Reported-by: Sashiko (gemini) <[email protected]>
    Closes: https://sashiko.dev/#/patchset/20260918133953.12494-1-bernard.ladenthin%40gmail.com
    Signed-off-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: fix use-after-free in __tcf_action_put() [+ + +]
Author: Jérémy Jean <[email protected]>
Date:   Thu Oct 8 18:13:49 2026 +0000

    net/sched: fix use-after-free in __tcf_action_put()
    
    commit 7b16eb911091aae237a8673da94e4dfb9cd21d54 upstream.
    
    __tcf_action_put() decrements the reference count before decrementing the
    binding count. Another thread can free the action between these operations,
    causing the binding-count update to access freed memory. KASAN reports it
    as:
    
      BUG: KASAN: slab-use-after-free in __tcf_action_put+0x327/0x340
      Write of size 4 at addr ff11000000d46420 by task tc-put-pause/64
    
    Hold the action IDR mutex across both counter updates and IDR removal,
    keeping cleanup outside the lock.
    
    Fixes: 16af6067392c ("net: sched: implement reference counted action release")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Jérémy Jean <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net/sched: fq_codel: match the no-drop threshold to the packet size [+ + +]
Author: Jamal Hadi Salim <[email protected]>
Date:   Sat Sep 26 14:03:27 2026 -0400

    net/sched: fq_codel: match the no-drop threshold to the packet size
    
    [ Upstream commit d031465acc362866f27e4f8f79cfecf1037fe2e5 ]
    
    commit d9ebd8f9aa8b ("net/sched: fq_codel: clamp default quantum and mtu")
    clamped both q->quantum and q->cparams.mtu to [256, FQ_CODEL_QUANTUM_MAX].
    The two fields mean different things: quantum is a DRR credit that wants
    the 256 floor, but cparams.mtu is the CoDel no-drop threshold
    (codel_impl.h "*backlog <= params->mtu"). On a link whose maximum
    transmitted packet size is below 256, the floor extends CoDel's
    minimum-backlog exemption beyond one packet and delays drop or mark
    eligibility by several small packets.
    
    Split the clamp. quantum keeps [256, FQ_CODEL_QUANTUM_MAX]; cparams.mtu
    tracks psched_mtu() (the device MTU plus its hard-header length) with
    only the upper bound that guards the original overflow (psched_mtu()
    wrapping to ~2 GiB on a huge-MTU device).
    
    Conditions to recreate the bug: attach an fq_codel qdisc on a link
    whose MTU plus hard_header_len is below 256 (e.g. a CAN interface). At
    that MTU the no-drop threshold must equal the device MTU plus its
    hard-header length; before this patch it was forced to 256.
    Basic Testing done: with dev->mtu=100 and hard_header_len=14, a
    return probe on fq_codel_init() observed cparams.mtu change from 256 to 114
    
    Fixes: d9ebd8f9aa8b ("net/sched: fq_codel: clamp default quantum and mtu")
    Reported-by: Sashiko (nipa) <[email protected]>
    Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/[email protected]
    Signed-off-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net/sched: sch_codel: match the no-drop threshold to the packet size [+ + +]
Author: Jamal Hadi Salim <[email protected]>
Date:   Sat Sep 26 14:03:28 2026 -0400

    net/sched: sch_codel: match the no-drop threshold to the packet size
    
    [ Upstream commit 54518e0e827f4ca9229ae657022c60bf60f5c1bf ]
    
    commit 6439461f1618 ("net/sched: sch_codel: clamp default mtu to avoid
    disabling CoDel") clamped q->params.mtu to [256, 1 << 20]. The value is
    the CoDel no-drop threshold (codel_impl.h "*backlog <= params->mtu"), so
    on a link whose maximum transmitted packet size is below 256 the floor
    extends CoDel's minimum-backlog exemption beyond one packet and delays
    drop or mark eligibility by several small packets.
    
    Keep the upper bound that guards the original overflow (psched_mtu()
    wrapping to ~2 GiB on a huge-MTU device) but drop the 256 floor, so the
    threshold tracks the real device packet size.
    
    Conditions to recreate the bug: attach a codel qdisc on a link whose
    MTU plus hard_header_len is below 256 (e.g. a CAN interface). At that
    MTU the no-drop threshold must equal the device MTU plus its
    hard-header length; before this patch it was forced to 256.
    Requires CAP_NET_ADMIN in a user namespace.
    
    Fixes: 6439461f1618 ("net/sched: sch_codel: clamp default mtu to avoid disabling CoDel")
    Reported-by: Sashiko (nipa) <[email protected]>
    Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/[email protected]
    Signed-off-by: Jamal Hadi Salim <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
net/smc: fix socket refcount leak in smc_switch_conns() [+ + +]
Author: Hidayath Khan <[email protected]>
Date:   Wed Sep 9 13:33:07 2026 -0400

    net/smc: fix socket refcount leak in smc_switch_conns()
    
    [ Upstream commit 719296c4aa8213d4ac8002e77d5956d436bc98d0 ]
    
    smc_switch_conns() takes a reference on the SMC socket before dropping
    lgr->conns_lock, so the connection stays alive while the CDC slot is
    fetched:
    
            sock_hold(&smc->sk);
            read_unlock_bh(&lgr->conns_lock);
            /* pre-fetch buffer outside of send_lock, might sleep */
            rc = smc_cdc_get_free_slot(conn, to_lnk, &wr_buf, NULL, &pend);
            if (rc)
                    goto err_out;
    
    The err_out label only drops the wr_tx link reference, so this early exit
    returns without the matching sock_put(). The second error exit is not
    affected, because sock_put() has already run by then.
    
    A leaked sk_refcnt means the smc_sock is never destroyed. Its send and
    receive buffers stay allocated, and for a user socket the reference held
    on the network namespace is never released, so the netns can no longer be
    torn down.
    
    smc_cdc_get_free_slot() fails when the target link goes down or when the
    connection has been killed while the switch is in progress. Both are
    reachable during the link failover this function implements, so the leak
    is triggered by the same hardware events that make smc_switch_conns() run
    in the first place.
    
    Restructure so there is a single sock_put() covering both outcomes,
    instead of adding a second one to the error path.
    
    Fixes: 95f7f3e7dc6b ("net/smc: improved fix wait on already cleared link")
    Cc: [email protected]
    Reviewed-by: Mahanta Jambigi <[email protected]>
    Reviewed-by: Breno Leitao <[email protected]>
    Signed-off-by: Hidayath Khan <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ Replaced smc_switch_link_and_count() with the existing conn->lnk = to_lnk assignment. ]
    Signed-off-by: Sasha Levin <[email protected]>

net/smc: protect clcsock lifetime in smc_getname [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Thu Oct 8 16:44:44 2026 +0800

    net/smc: protect clcsock lifetime in smc_getname
    
    commit 64a6b36b0e1855288080bc5f89769f27d6dc03c8 upstream.
    
    smc_getname() dereferences smc->clcsock without holding
    clcsock_release_lock. Link-group termination can release the CLC socket
    through smc_close_active_abort() while the SMC socket is still open,
    for example after shutdown(SHUT_WR).
    
    A getsockname() caller can load smc->clcsock, then the termination worker
    can clear the pointer and call sock_release() before the caller accesses
    clcsock->ops or invokes getname(). This causes a use-after-free; if the
    worker clears the pointer before the load, it causes a NULL dereference.
    The syscall's file reference keeps the SMC socket alive but does not
    prevent asynchronous release of its CLC socket.
    
    KASAN reported the following with test-only timing instrumentation:
    
      BUG: KASAN: slab-use-after-free in smc_getname+0x19e/0x1b0
      Read of size 8 at addr ffff888109abb4e0 by task poc/103
      Call Trace:
       smc_getname+0x19e/0x1b0
       do_getsockname+0xe5/0x170
       __sys_getsockname+0x8c/0x100
    
      Allocated by task 95:
       sock_alloc_inode+0x1e/0x280
       sock_alloc+0x3d/0x240
       __sock_create+0x7e/0x430
       smc_create+0x121/0x240
    
      Freed by task 0:
       kmem_cache_free+0xcc/0x340
       rcu_core+0x50a/0x1850
    
      Last potentially related work creation:
       evict+0x446/0x6c0
       smc_clcsock_release+0xa8/0xd0
       smc_close_active_abort+0x26a/0x3a0
       __smc_lgr_terminate.part.0+0x137/0x2e0
    
    Hold clcsock_release_lock across the pointer check and the getname()
    callback to serialize with smc_clcsock_release(). Return -EBADF if the
    CLC socket has already been released, preserving the existing peer
    state check and the callback's return value otherwise.
    
    Fixes: b03faa1fafc8 ("net/smc: postpone release of clcsock")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Reviewed-by: Mahanta Jambigi <[email protected]>
    Reviewed-by: Dust Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net: add and use skb_get_hash_net [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Sun Jun 9 00:10:39 2024 +0200

    net: add and use skb_get_hash_net
    
    [ Upstream commit b975d3ee5962237c1e2f5d5aeeaaf0dc2173486c ]
    
    Years ago flow dissector gained ability to delegate flow dissection
    to a bpf program, scoped per netns.
    
    Unfortunately, skb_get_hash() only gets an sk_buff argument instead
    of both net+skb.  This means the flow dissector needs to obtain the
    netns pointer from somewhere else.
    
    The netns is derived from skb->dev, and if that is not available, from
    skb->sk.  If neither is set, we hit a (benign) WARN_ON_ONCE().
    
    Trying both dev and sk covers most cases, but not all, as recently
    reported by Christoph Paasch.
    
    In case of nf-generated tcp reset, both sk and dev are NULL:
    
    WARNING: .. net/core/flow_dissector.c:1104
     skb_flow_dissect_flow_keys include/linux/skbuff.h:1536 [inline]
     skb_get_hash include/linux/skbuff.h:1578 [inline]
     nft_trace_init+0x7d/0x120 net/netfilter/nf_tables_trace.c:320
     nft_do_chain+0xb26/0xb90 net/netfilter/nf_tables_core.c:268
     nft_do_chain_ipv4+0x7a/0xa0 net/netfilter/nft_chain_filter.c:23
     nf_hook_slow+0x57/0x160 net/netfilter/core.c:626
     __ip_local_out+0x21d/0x260 net/ipv4/ip_output.c:118
     ip_local_out+0x26/0x1e0 net/ipv4/ip_output.c:127
     nf_send_reset+0x58c/0x700 net/ipv4/netfilter/nf_reject_ipv4.c:308
     nft_reject_ipv4_eval+0x53/0x90 net/ipv4/netfilter/nft_reject_ipv4.c:30
     [..]
    
    syzkaller did something like this:
    table inet filter {
      chain input {
        type filter hook input priority filter; policy accept;
        meta nftrace set 1
        tcp dport 42 reject with tcp reset
       }
       chain output {
        type filter hook output priority filter; policy accept;
        # empty chain is enough
       }
    }
    
    ... then sends a tcp packet to port 42.
    
    Initial attempt to simply set skb->dev from nf_reject_ipv4 doesn't cover
    all cases: skbs generated via ipv4 igmp_send_report trigger similar splat.
    
    Moreover, Pablo Neira found that nft_hash.c uses __skb_get_hash_symmetric()
    which would trigger same warn splat for such skbs.
    
    Lets allow callers to pass the current netns explicitly.
    The nf_trace infrastructure is adjusted to use the new helper.
    
    __skb_get_hash_symmetric is handled in the next patch.
    
    Reported-by: Christoph Paasch <[email protected]>
    Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/494
    Reviewed-by: Willem de Bruijn <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: 8ec454dcd00c ("ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel()")
    Signed-off-by: Sasha Levin <[email protected]>

net: bonding: fix use-after-free in bond_xmit_broadcast() [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Sun Oct 25 09:45:05 2026 +0100

    net: bonding: fix use-after-free in bond_xmit_broadcast()
    
    [ Upstream commit 2884bf72fb8f03409e423397319205de48adca16 ]
    
    bond_xmit_broadcast() reuses the original skb for the last slave
    (determined by bond_is_last_slave()) and clones it for others.
    Concurrent slave enslave/release can mutate the slave list during
    RCU-protected iteration, changing which slave is "last" mid-loop.
    This causes the original skb to be double-consumed (double-freed).
    
    Replace the racy bond_is_last_slave() check with a simple index
    comparison (i + 1 == slaves_count) against the pre-snapshot slave
    count taken via READ_ONCE() before the loop.  This preserves the
    zero-copy optimization for the last slave while making the "last"
    determination stable against concurrent list mutations.
    
    The UAF can trigger the following crash:
    
    ==================================================================
    BUG: KASAN: slab-use-after-free in skb_clone
    Read of size 8 at addr ffff888100ef8d40 by task exploit/147
    
    CPU: 1 UID: 0 PID: 147 Comm: exploit Not tainted 7.0.0-rc3+ #4 PREEMPTLAZY
    Call Trace:
     <TASK>
     dump_stack_lvl (lib/dump_stack.c:123)
     print_report (mm/kasan/report.c:379 mm/kasan/report.c:482)
     kasan_report (mm/kasan/report.c:597)
     skb_clone (include/linux/skbuff.h:1724 include/linux/skbuff.h:1792 include/linux/skbuff.h:3396 net/core/skbuff.c:2108)
     bond_xmit_broadcast (drivers/net/bonding/bond_main.c:5334)
     bond_start_xmit (drivers/net/bonding/bond_main.c:5567 drivers/net/bonding/bond_main.c:5593)
     dev_hard_start_xmit (include/linux/netdevice.h:5325 include/linux/netdevice.h:5334 net/core/dev.c:3871 net/core/dev.c:3887)
     __dev_queue_xmit (include/linux/netdevice.h:3601 net/core/dev.c:4838)
     ip6_finish_output2 (include/net/neighbour.h:540 include/net/neighbour.h:554 net/ipv6/ip6_output.c:136)
     ip6_finish_output (net/ipv6/ip6_output.c:208 net/ipv6/ip6_output.c:219)
     ip6_output (net/ipv6/ip6_output.c:250)
     ip6_send_skb (net/ipv6/ip6_output.c:1985)
     udp_v6_send_skb (net/ipv6/udp.c:1442)
     udpv6_sendmsg (net/ipv6/udp.c:1733)
     __sys_sendto (net/socket.c:730 net/socket.c:742 net/socket.c:2206)
     __x64_sys_sendto (net/socket.c:2209)
     do_syscall_64 (arch/x86/entry/syscall_64.c:63 arch/x86/entry/syscall_64.c:94)
     entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
     </TASK>
    
    Allocated by task 147:
    
    Freed by task 147:
    
    The buggy address belongs to the object at ffff888100ef8c80
     which belongs to the cache skbuff_head_cache of size 224
    The buggy address is located 192 bytes inside of
     freed 224-byte region [ffff888100ef8c80, ffff888100ef8d60)
    
    Memory state around the buggy address:
     ffff888100ef8c00: fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc
     ffff888100ef8c80: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    >ffff888100ef8d00: fb fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
                                                        ^
     ffff888100ef8d80: fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb fb
     ffff888100ef8e00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    ==================================================================
    
    Fixes: 4e5bd03ae346 ("net: bonding: fix bond_xmit_broadcast return value error bug")
    Reported-by: Weiming Shi <[email protected]>
    Signed-off-by: Xiang Mei <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    [ Backport to 5.10.y: 5.10's bond_xmit_broadcast() walks the live slave
      list, not the all_slaves array upstream indexes into (that walk came
      with ce7a381697cb "net: bonding: add broadcast_neighbor option for
      802.3ad"), so there is no index/count pair that stays consistent
      while the list changes. Instead of choosing the "last" slave up
      front, defer it: clone the skb for each up slave as the next one is
      found, and transmit the original skb to the last up slave seen only
      after the walk has finished. The original skb is consumed exactly
      once and not touched afterwards, however the list changes during
      the RCU walk; slave pointers stay valid under rcu_read_lock() since
      __bond_release_one() does synchronize_rcu() before freeing. ]
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: bridge: avoid recursive multicast port cleanup [+ + +]
Author: Zixuan Chai <[email protected]>
Date:   Tue Oct 13 10:39:07 2026 -0400

    net: bridge: avoid recursive multicast port cleanup
    
    [ Upstream commit 5158353121bae4f552cb677ce8c5c3ef52f93a0d ]
    
    br_multicast_sg_del_exclude_ports() removes automatically added STAR_EXCL
    port groups by calling br_multicast_del_pg(). For S,G entries, that
    deletion calls back into br_multicast_sg_del_exclude_ports(), so a large
    number of STAR_EXCL ports consumes one kernel stack frame per port and can
    hit the stack guard page.
    
    Keep the complete port-group deletion path for cleanup, but suppress the
    S,G exclude-port cleanup while that helper is already walking the same
    entry. Normal deletion callers retain the existing behavior.
    
    Fixes: 8266a0491e92 ("net: bridge: mcast: handle port group filter modes")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Zixuan Chai <[email protected]>
    Signed-off-by: Ren Wei <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    [ sashal: Adjusted context for the __br_multicast_del_pg() declaration because neighboring upstream forward declarations are absent. ]
    Signed-off-by: Sasha Levin <[email protected]>

net: bridge: mcast: don't truncate the port group walk on teardown [+ + +]
Author: Jun Yang <[email protected]>
Date:   Thu Oct 22 18:04:00 2026 -0400

    net: bridge: mcast: don't truncate the port group walk on teardown
    
    [ Upstream commit 5a3f7a683aee56e1f15c9d53041f3236767eaae7 ]
    
    __br_multicast_disable_port_ctx() and br_multicast_del_port() walk
    port->mglist with hlist_for_each_entry_safe(). However,
    br_multicast_find_del_pg() can also delete other entries from the same
    list through br_multicast_fwd_src_remove() or __fwd_del_star_excl().
    
    If such an entry is the iterator's saved next node, hlist_del_init()
    clears its ->next and terminates the walk early. The reproducer triggers
    this in both teardown walks, leaving port groups in the bridge mdb with
    a dangling ->key.port after del_nbp() frees the port:
    
      BUG: KASAN: slab-use-after-free in __mdb_fill_info+0x1191/0x1320
       __mdb_fill_info+0x1191/0x1320
       br_mdb_dump+0x594/0xe40
       rtnl_mdb_dump+0x1cf/0x5d0
    
    Use hlist_del_init_rcu() to unlink the group while preserving ->next.
    br_multicast_del_pg() and the teardown walks run under
    br->multicast_lock. The GC worker must acquire the same lock before
    detaching the group for destruction, so the node remains alive while
    the walk uses the preserved pointer.
    
    Preserving ->next means a walk can now reach a group that an earlier
    iteration already deleted as a side effect. That group is off mp->ports,
    so br_multicast_find_del_pg() would fall through its port scan and hit
    the trailing WARN_ON(1). Skip such groups at the top of that helper: a
    port group is put on port->mglist when it is created and only unlinked
    when it is deleted, so hlist_unhashed() identifies exactly this case.
    
    Fixes: b08123684bd5 ("net: bridge: mcast: install S,G entries automatically based on reports")
    Cc: [email protected]
    Suggested-by: Nikolay Aleksandrov <[email protected]>
    Reported-by: TencentOS Corvus AI <[email protected]>
    Signed-off-by: Jun Yang <[email protected]>
    Reviewed-by: Nikolay Aleksandrov <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ sashal: Applied the br_multicast_del_pg() change to the existing __br_multicast_del_pg() helper. ]
    Signed-off-by: Sasha Levin <[email protected]>

net: ena: fix MMIO read buffer leak on probe failure [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Wed Sep 30 09:07:06 2026 -0400

    net: ena: fix MMIO read buffer leak on probe failure
    
    [ Upstream commit 9476b4468862927297c94c440863cd8ed1e7cc83 ]
    
    ena_device_init() initializes the MMIO read mechanism with
    ena_com_mmio_reg_read_request_init(), which allocates a coherent DMA
    buffer for MMIO read responses.
    
    The normal removal path releases this buffer through
    ena_com_mmio_reg_read_request_destroy(). However, if ena_probe() fails
    after ena_device_init() succeeds, the error path destroys the admin
    resources and eventually frees ena_dev without destroying the MMIO read
    request, leaving the coherent DMA buffer allocated.
    
    Call ena_com_mmio_reg_read_request_destroy() in the probe error path
    before releasing the remaining device resources.
    
    This issue was found by manual code inspection.
    
    Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adjusted context for missing PHC, devlink, and customer-metrics cleanup in Linux 5.10. ]
    Signed-off-by: Sasha Levin <[email protected]>

net: initialize net->net_cookie at netns setup [+ + +]
Author: Eric Dumazet <[email protected]>
Date:   Wed Feb 10 06:41:44 2021 -0800

    net: initialize net->net_cookie at netns setup
    
    [ Upstream commit 3d368ab87cf6681f928de1ddf804d69600671bb2 ]
    
    It is simpler to make net->net_cookie a plain u64
    written once in setup_net() instead of looping
    and using atomic64 helpers.
    
    Lorenz Bauer wants to add SO_NETNS_COOKIE socket option
    and this patch would makes his patch series simpler.
    
    Signed-off-by: Eric Dumazet <[email protected]>
    Cc: Daniel Borkmann <[email protected]>
    Cc: Lorenz Bauer <[email protected]>
    Acked-by: Daniel Borkmann <[email protected]>
    Tested-by: Lorenz Bauer <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Stable-dep-of: f88bb3606e4b ("netlink: avoid hashing the network namespace pointer")
    Signed-off-by: Sasha Levin <[email protected]>

net: ipconfig: bound DHCP option construction [+ + +]
Author: Yuqi Xu <[email protected]>
Date:   Tue Sep 29 22:38:39 2026 -0400

    net: ipconfig: bound DHCP option construction
    
    [ Upstream commit e47a1958e12abc3a17b5231a4f21c8f1bf662e08 ]
    
    ic_dhcp_init_options() appends the hostname (option 12), vendor-class
    (option 60) and client-ID (option 61) options into the fixed 312-byte
    bootp_pkt.exten[] buffer.  Only the client-ID branch checked the
    remaining space; the hostname and vendor-class writes were unbounded.
    
    A 64-byte hostname together with the maximum 252-byte dhcpclass=
    identifier needs 18 + (2 + 64) + (2 + 252) = 338 of the 312 available
    bytes even before the terminating END marker, so the vendor-class memcpy
    runs past the end of exten[].  With CONFIG_FORTIFY_SOURCE this is
    reported as a field-spanning write and, when the kernel is booted with
    panic_on_warn=1, aborts boot with a panic.
    
    Route the optional options through a common helper that makes sure the
    option, its 2-byte header and the END marker all fit and drops an option
    that would not.  Configurations with short options keep sending exactly
    the same bytes as before.
    
    Fixes: 130c0f47fdf9 ("ipconfig: send host-name in DHCP requests")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Yuqi Xu <[email protected]>
    Reviewed-by: Ren Wei <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/7808dfbfa2162dfd0b19f59aff5742d6e0db2abb.1789798023.git.xuyuqiabc@gmail.com
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: ipconfig: Remove outdated comment and indent code block [+ + +]
Author: Thorsten Blum <[email protected]>
Date:   Tue Sep 29 22:38:38 2026 -0400

    net: ipconfig: Remove outdated comment and indent code block
    
    [ Upstream commit e405b3c9d4aaa10972525fe2ea5cf94224020561 ]
    
    The comment has been around ever since commit 1da177e4c3f4
    ("Linux-2.6.12-rc2") and can be removed. Remove it and indent the code
    block accordingly.
    
    Signed-off-by: Thorsten Blum <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Stable-dep-of: e47a1958e12a ("net: ipconfig: bound DHCP option construction")
    Signed-off-by: Sasha Levin <[email protected]>

net: openvswitch: conntrack: fix helper UAF due to extensions realloc [+ + +]
Author: Ilya Maximets <[email protected]>
Date:   Wed Sep 30 09:12:45 2026 -0400

    net: openvswitch: conntrack: fix helper UAF due to extensions realloc
    
    [ Upstream commit 1a4151e6be57b098b7a5ebfbde58585e83200cdc ]
    
    While calling the helpers, a raw pointer to the extensions area is
    wired into expectations list:
    
      -> nf_ct_helper()
       -> helper->help()
        -> nf_ct_expect_related_report()
         -> nf_ct_expect_insert()
          -> hlist_add_head_rcu(&exp->lnode, &master_help->expectations)
    
    In case the connection is not confirmed yet, more extensions can be
    added afterwards with *_ext_add() calls reallocating the extension
    space and leaving the now invalid pointer in the expectations list
    that is later accessed while removing the expectation.
    
    Make sure that helpers are called at the end after all the other
    extensions are already added.
    
    Note that the helper rejection now leaves the mark and labels set,
    but that's not different from how the NAT was handled before or how
    the mark and the labels were handled on confirmation failure.  And
    there are no atomicity guarantees provided by the API anyway.
    
    Fixes: cae3a2627520 ("openvswitch: Allow attaching helpers to ct action")
    Cc: [email protected]
    Reported-by: Axel Mierczuk <[email protected]>
    Signed-off-by: Ilya Maximets <[email protected]>
    Reviewed-by: Aaron Conole <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adapted nf_ct_helper() calls to the existing ovs_ct_helper() API. ]
    Signed-off-by: Sasha Levin <[email protected]>

net: openvswitch: validate transport header presence in set_ipv6_addr [+ + +]
Author: Fernando Fernandez Mancera <[email protected]>
Date:   Thu Oct 8 12:41:35 2026 +0200

    net: openvswitch: validate transport header presence in set_ipv6_addr
    
    [ Upstream commit 3c6a4b11330fe424557538a98fca9f0a4c5bf313 ]
    
    When executing IPv6 address rewrite actions on IPv6 fragments,
    set_ipv6_addr() calls update_ipv6_checksum(). If parse_ipv6hdr()
    processes a non-first IPv6 fragment, it sets key->ip.proto to
    NEXTHDR_FRAGMENT and returns early without calling
    skb_set_transport_header().
    
    update_ipv6_checksum() unconditionally evaluates skb_transport_offset()
    on entry before checking l4_proto.  Because skb->transport_header is
    uninitialized, this triggers a warning under CONFIG_DEBUG_NET=y although
    it is completely harmless.
    
    Fix this by returning early in update_ipv6_checksum() if l4_proto is
    NEXTHDR_FRAGMENT. This avoids reading the uninitialized transport offset
    for fragments while preserving the debug warning for any other protocol
    where the transport header is unexpectedly missing.
    
    See the syzbot trace:
    
    !skb_transport_header_was_set(skb)
    WARNING: ./include/linux/skbuff.h:3075 at skb_transport_header include/linux/skbuff.h:3075 [inline], CPU#1: syz-executor463/5635
    WARNING: ./include/linux/skbuff.h:3075 at skb_transport_offset include/linux/skbuff.h:3250 [inline], CPU#1: syz-executor463/5635
    WARNING: ./include/linux/skbuff.h:3075 at update_ipv6_checksum net/openvswitch/actions.c:361 [inline], CPU#1: syz-executor463/5635
    WARNING: ./include/linux/skbuff.h:3075 at set_ipv6_addr+0x462/0x660 net/openvswitch/actions.c:399, CPU#1: syz-executor463/5635
    [...]
    RIP: 0010:skb_transport_header include/linux/skbuff.h:3075 [inline]
    RIP: 0010:skb_transport_offset include/linux/skbuff.h:3250 [inline]
    RIP: 0010:update_ipv6_checksum net/openvswitch/actions.c:361 [inline]
    RIP: 0010:set_ipv6_addr+0x462/0x660 net/openvswitch/actions.c:399
    [...]
    Call Trace:
     <TASK>
     set_ipv6 net/openvswitch/actions.c:531 [inline]
     do_execute_actions+0x557e/0x8600 net/openvswitch/actions.c:1366
     ovs_execute_actions+0xde/0x520 net/openvswitch/actions.c:1592
     ovs_packet_cmd_execute+0xb4f/0xf10 net/openvswitch/datapath.c:705
     genl_family_rcv_msg_doit+0x233/0x340 net/netlink/genetlink.c:1114
     genl_rcv_msg+0x614/0x7a0 net/netlink/genetlink.c:1209
     netlink_rcv_skb+0x226/0x4a0 net/netlink/af_netlink.c:2572
     genl_rcv+0x28/0x40 net/netlink/genetlink.c:1218
     netlink_unicast+0x7bd/0x940 net/netlink/af_netlink.c:1361
     netlink_sendmsg+0x813/0xb40 net/netlink/af_netlink.c:1916
     sock_sendmsg_nosec+0x14e/0x190 net/socket.c:800
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=4cc63fcfb3845e149969
    Fixes: 3fdbd1ce11e5 ("openvswitch: add ipv6 'set' action")
    Signed-off-by: Fernando Fernandez Mancera <[email protected]>
    Reviewed-by: Ilya Maximets <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: rds: fix uninitialized trans dereference in CM event handler [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Sat Oct 3 09:34:07 2026 -0700

    net: rds: fix uninitialized trans dereference in CM event handler
    
    commit 492ba6ac1b1ffb8a06ff52db0825c1af2cdb28c8 upstream.
    
    rds_rdma_cm_event_handler_cmn() assigns trans only when the RDMA
    device is an InfiniBand CA (RDMA_NODE_IB_CA).  On any other device
    type, e.g. an iWARP RNIC such as siw, trans stays uninitialized, but
    the event switch dereferences it: unconditionally in the
    RDMA_CM_EVENT_CONNECT_REQUEST case via trans->cm_handle_connect(),
    and (with a connection context) in the ROUTE_RESOLVED and
    ESTABLISHED cases.
    
    An RDS listener on an iWARP device therefore crashes the kernel as
    soon as a connect request arrives: with CONFIG_INIT_STACK_ALL_ZERO
    the wild load becomes a NULL dereference at offset 0xa0
    (&trans->cm_handle_connect) in the iw_cm_wq workqueue.
    
    GCC masks the bug in default builds by folding the uninitialized
    load into &rds_ib_transport; Clang-built kernels take the real
    uninitialized path and oops.
    
    The active side can land on a non-IB device too: the id that
    rds_ib_conn_path_connect() creates is not restricted to a node type,
    so rdma_resolve_addr() binds it to whichever device serves the local
    address, and an iWARP RNIC on the same netdev qualifies.  The crash
    there is different: resolving a route on an iWARP id never fills in
    cm_id->route.path_rec, and the ROUTE_RESOLVED case writes
    path_rec[0].sl before it calls into the transport.
    
    The iWARP transport was dropped long ago and IB is the only
    transport left, so make that explicit: initialize trans to
    &rds_ib_transport at declaration, drop the conditional assignment,
    reject a connect request that arrives on a non-IB device, and drop a
    connection whose address resolved to one instead of resolving a
    route on it.  The rejection is limited to RDMA_CM_EVENT_CONNECT_REQUEST
    on purpose: a non-zero return from the handler makes rdma_cm destroy
    the id the event was delivered on, which is right for the request's
    freshly created id but would free a connection id that RDS still owns
    for any other event.  On the active side the id stays ic->i_cm_id and
    the connection's shutdown destroys it, so that case returns 0.
    
    Fixes: dcdede0406d3 ("RDS: Drop stale iWARP RDMA transport")
    Reported-by: TencentOS Corvus AI <[email protected]>
    Link: https://lore.kernel.org/netdev/[email protected]/
    Link: https://lore.kernel.org/netdev/[email protected]/
    Cc: [email protected]
    Assisted-by: CodeBuddy:Kimi-K3
    Signed-off-by: Aohan Mei <[email protected]>
    [achender: reject only on RDMA_CM_EVENT_CONNECT_REQUEST instead of
     bailing out for every event on a non-IB device, so that rdma_cm does
     not destroy connection ids RDS still tracks; drop a connection whose
     address resolved to a non-IB device before a route is resolved on it;
     changelog adjusted]
    Assisted-by: LLM
    Signed-off-by: Allison Henderson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net: sched: cls_u32: Undo tcf_bind_filter if u32_replace_hw_knode [+ + +]
Author: Victor Nogueira <[email protected]>
Date:   Mon Oct 5 12:28:46 2026 +0200

    net: sched: cls_u32: Undo tcf_bind_filter if u32_replace_hw_knode
    
    [ Upstream commit 9cb36faedeafb9720ac236aeae2ea57091d90a09 ]
    
    When u32_replace_hw_knode fails, we need to undo the tcf_bind_filter
    operation done at u32_set_parms.
    
    Fixes: d34e3e181395 ("net: cls_u32: Add support for skip-sw flag to tc u32 classifier.")
    Signed-off-by: Victor Nogueira <[email protected]>
    Acked-by: Jamal Hadi Salim <[email protected]>
    Reviewed-by: Pedro Tammela <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: systemport: Fix RUNT MIB counter register offset calculation [+ + +]
Author: Florian Fainelli <[email protected]>
Date:   Tue Sep 22 16:24:35 2026 -0700

    net: systemport: Fix RUNT MIB counter register offset calculation
    
    [ Upstream commit 242935adfeb096f09b29fb2cfcf12f9eb2911fc6 ]
    
    In UniMAC hardware, there is a 0xC byte gap between the RX MIB counters
    and the TX MIB counters, and a second 0xC byte gap between the TX MIB
    counters and the RX RUNT MIB counters.
    
    In bcm_sysport_update_mib_counters(), 'offset' was only set to
    UMAC_MIB_STAT_OFFSET (0xC) for all non-RX counters, omitting the second
    0xC gap for BCM_SYSPORT_STAT_RUNT counters. As a result, all 4 RUNT MIB
    counters were read from unmapped gap register space.
    
    Fix this by setting offset to 2 * UMAC_MIB_STAT_OFFSET (0x18) when
    reading BCM_SYSPORT_STAT_RUNT counters.
    
    Fixes: 80105befdb4b ("net: systemport: add Broadcom SYSTEMPORT Ethernet MAC driver")
    Reviewed-by: Nicolai Buchwitz <[email protected]>
    Signed-off-by: Florian Fainelli <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: team: fix NULL pointer dereference in team_xmit during mode change [+ + +]
Author: Weiming Shi <[email protected]>
Date:   Tue Oct 13 12:04:48 2026 -0400

    net: team: fix NULL pointer dereference in team_xmit during mode change
    
    [ Upstream commit 25fe708bbc59289d3d1ea4b126fbc1b460a072a5 ]
    
    __team_change_mode() clears team->ops with memset() before restoring
    safe dummy handlers via team_adjust_ops(). A concurrent team_xmit()
    running under RCU on another CPU can read team->ops.transmit during
    this window and call a NULL function pointer, crashing the kernel.
    
    The race requires a mode change (CAP_NET_ADMIN) concurrent with
    transmit on the team device.
    
     BUG: kernel NULL pointer dereference, address: 0000000000000000
     Oops: 0010 [#1] SMP KASAN NOPTI
     RIP: 0010:0x0
     Call Trace:
      team_xmit (drivers/net/team/team_core.c:1853)
      dev_hard_start_xmit (net/core/dev.c:3904)
      __dev_queue_xmit (net/core/dev.c:4871)
      packet_sendmsg (net/packet/af_packet.c:3109)
      __sys_sendto (net/socket.c:2265)
    
    The original code assumed that no ports means no traffic, so mode
    changes could freely memset()/memcpy() the ops.  AF_PACKET with
    forced carrier breaks that assumption.
    
    Prevent the race instead of making it safe: replace memset()/memcpy()
    with per-field updates that never touch transmit or receive.  Those
    two handlers are managed solely by team_adjust_ops(), which already
    installs dummies when tx_en_port_count == 0 (always true during mode
    change since no ports are present).  WRITE_ONCE/READ_ONCE prevent
    store/load tearing on the handler pointers.
    
    synchronize_net() before exit_op() drains in-flight readers that may
    still reference old mode state from before port removal switched the
    handlers to dummies.
    
    Fixes: 3d249d4ca7d0 ("net: introduce ethernet teaming device")
    Reported-by: Xiang Mei <[email protected]>
    Signed-off-by: Weiming Shi <[email protected]>
    Reviewed-by: Jiayuan Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: b7454f1940c5 ("net: team: stop reusing skb after queue override")
    Signed-off-by: Sasha Levin <[email protected]>

net: team: Remove unused team_mode_op, port_enabled [+ + +]
Author: Marc Harvey <[email protected]>
Date:   Tue Oct 13 12:04:46 2026 -0400

    net: team: Remove unused team_mode_op, port_enabled
    
    [ Upstream commit 014f249121d73909528df320818fba7693d0ec92 ]
    
    This team_mode_op wasn't used by any of the team modes, so remove it.
    
    Reviewed-by: Jiri Pirko <[email protected]>
    Signed-off-by: Marc Harvey <[email protected]>
    Reviewed-by: Kuniyuki Iwashima <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: b7454f1940c5 ("net: team: stop reusing skb after queue override")
    Signed-off-by: Sasha Levin <[email protected]>

net: team: Rename port_disabled team mode op to port_tx_disabled [+ + +]
Author: Marc Harvey <[email protected]>
Date:   Tue Oct 13 12:04:47 2026 -0400

    net: team: Rename port_disabled team mode op to port_tx_disabled
    
    [ Upstream commit cfa477df2cc62ba53cb936669886361152b594a7 ]
    
    This team mode op is only used by the load balance mode, and it only
    uses it in the tx path.
    
    Reviewed-by: Jiri Pirko <[email protected]>
    Signed-off-by: Marc Harvey <[email protected]>
    Reviewed-by: Kuniyuki Iwashima <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Stable-dep-of: b7454f1940c5 ("net: team: stop reusing skb after queue override")
    Signed-off-by: Sasha Levin <[email protected]>

net: team: stop reusing skb after queue override [+ + +]
Author: Weiming Shi <[email protected]>
Date:   Tue Oct 13 12:04:49 2026 -0400

    net: team: stop reusing skb after queue override
    
    [ Upstream commit b7454f1940c5e6d92e753853c476a769e452f30a ]
    
    A nonzero dev_queue_xmit() result does not return ownership of the skb.
    When an override port's qdisc drops it, the queue override helper used to
    try another port or the mode transmit op with the freed skb.
    
    Return the handoff decision separately from transmit success. Select only
    the first override port under RCU and stop after handing it the skb,
    regardless of the lower transmit result. Keep the existing success and
    drop accounting.
    
      BUG: KASAN: slab-use-after-free in sk_skb_reason_drop
      Write of size 4 by task poc/5040
      sk_skb_reason_drop (net/core/skbuff.c:1240)
      dev_kfree_skb_any_reason (net/core/dev.c:3470)
      ab_transmit (drivers/net/team/team_mode_activebackup.c:49)
      team_xmit (drivers/net/team/team_core.c:1849)
      __dev_direct_xmit (net/core/dev.c:4934)
      Freed by task 5040:
      __tcf_kfree_skb_list (net/sched/sch_generic.c:43)
      __dev_queue_xmit (net/core/dev.c:4831)
      team_xmit (drivers/net/team/team_core.c:1846)
      Kernel panic - not syncing: KASAN: panic_on_warn set ...
    
    Cc: [email protected]
    Fixes: 8ff5105a2b9d ("team: add support for queue override by setting queue_id for port")
    Reported-by: <[email protected]>
    Signed-off-by: Weiming Shi <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

net: usb: ax88179_178a: fix rx frame length for non-last packets [+ + +]
Author: Fredrik Nyberg <[email protected]>
Date:   Fri Oct 2 14:28:57 2026 +0200

    net: usb: ax88179_178a: fix rx frame length for non-last packets
    
    commit 9b6c20f788472d2042717a3c2f1bc60b2b77083e upstream.
    
    Commit 4ce62d5b2f7a ("net: usb: ax88179_178a: stop lying about
    skb->truesize") replaced skb_clone() with a copy into a new skb for
    every packet of a bulk-in transfer except the last one. The copy skips
    the 2-byte IP alignment pseudo header but still copies pkt_len bytes,
    and pkt_len includes that header. Each of these frames is therefore
    delivered with two extra trailing bytes: the 0xeeee pseudo header of
    the next slot when the frame ends on an 8-byte boundary, or slot
    padding otherwise. The last packet is still trimmed to pkt_len - 2.
    
    IPv4 and IPv6 trim the extra bytes, so most traffic is unaffected.
    Anything that relies on the frame length is not. MACsec takes the ICV
    from the last 16 bytes and drops every such frame as InPktsNotValid. In
    our setup that was 0.2-1.2% of received MACsec frames, depending on how
    many frames shared a transfer, including service discovery multicast.
    
    Allocate and copy pkt_len - 2 bytes, like the last-packet path.
    
    Fixes: 4ce62d5b2f7a ("net: usb: ax88179_178a: stop lying about skb->truesize")
    Cc: [email protected]
    Signed-off-by: Fredrik Nyberg <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

net: usb: qmi_wwan: add Quectel EG120K-EA [+ + +]
Author: Gilberto Conde <[email protected]>
Date:   Mon Sep 21 10:34:26 2026 +0100

    net: usb: qmi_wwan: add Quectel EG120K-EA
    
    commit 0f2fd31f63c65c409bd336af3a42d478a9207c1f upstream.
    
    Add support for the Quectel EG120K-EA LTE Cat.12 module (USB ID
    2c7c:030b). Its QMI interface (interface 4) uses class/subclass/protocol
    ff/ff/ff like the other recent Quectel modules, so match it the same way.
    
    The product ID is shared with the EM060K, which the option driver
    already knows and uses to claim the serial interfaces. Without a
    qmi_wwan entry the data interface is left unbound.
    
    Tested on a GL.iNet GL-X2000, where the module is soldered down and
    enumerates at SuperSpeed: cdc-wdm0 and wwan0 appear and ModemManager
    brings up a data session.
    
    T:  Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=5000 MxCh= 0
    D:  Ver= 3.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
    P:  Vendor=2c7c ProdID=030b Rev= 5.04
    S:  Manufacturer=Quectel
    S:  Product=EG120K-EA
    S:  SerialNumber=45546267
    C:* #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA
    I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    E:  Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=40 Driver=option
    E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=82(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=85(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=87(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
    E:  Ad=88(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
    E:  Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#=12 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=70 Driver=(none)
    E:  Ad=89(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    
    Signed-off-by: Gilberto Conde <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
net_sched: codel: fix stale state for empty flows in fq_codel [+ + +]
Author: Jonas Köppeler <[email protected]>
Date:   Mon Mar 23 18:49:20 2026 +0100

    net_sched: codel: fix stale state for empty flows in fq_codel
    
    [ Upstream commit 815980fe6dbb01ad4007e8b260a45617f598b76d ]
    
    When codel_dequeue() finds an empty queue, it resets vars->dropping
    but does not reset vars->first_above_time.  The reference CoDel
    algorithm (Nichols & Jacobson, ACM Queue 2012) resets both:
    
      dodeque_result codel_queue_t::dodeque(time_t now) {
          ...
          if (r.p == NULL) {
              first_above_time = 0;   // <-- Linux omits this
          }
          ...
      }
    
    Note that codel_should_drop() does reset first_above_time when called
    with a NULL skb, but codel_dequeue() returns early before ever calling
    codel_should_drop() in the empty-queue case.  The post-drop code paths
    do reach codel_should_drop(NULL) and correctly reset the timer, so a
    dropped packet breaks the cycle -- but the next delivered packet
    re-arms first_above_time and the cycle repeats.
    
    For sparse flows such as ICMP ping (one packet every 200ms-1s), the
    first packet arms first_above_time, the flow goes empty, and the
    second packet arrives after the interval has elapsed and gets dropped.
    The pattern repeats, producing sustained loss on flows that are not
    actually congested.
    
    Test: veth pair, fq_codel, BQL disabled, 30000 iptables rules in the
    consumer namespace (NAPI-64 cycle ~14ms, well above fq_codel's 5ms
    target), ping at 5 pps under UDP flood:
    
      Before fix:  26% ping packet loss
      After fix:    0% ping packet loss
    
    Fix by resetting first_above_time to zero in the empty-queue path
    of codel_dequeue(), matching the reference algorithm.
    
    Fixes: 76e3cc126bb2 ("codel: Controlled Delay AQM")
    Fixes: d068ca2ae2e6 ("codel: split into multiple files")
    Co-developed-by: Jesper Dangaard Brouer <[email protected]>
    Signed-off-by: Jesper Dangaard Brouer <[email protected]>
    Signed-off-by: Jonas Köppeler <[email protected]>
    Reported-by: Chris Arges <[email protected]>
    Tested-by: Jonas Köppeler <[email protected]>
    Reviewed-by: Toke Høiland-Jørgensen <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Reviewed-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
netfilter: ipset: do not update comments from kernel-side adds [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Fri Sep 4 20:03:07 2026 +0200

    netfilter: ipset: do not update comments from kernel-side adds
    
    [ Upstream commit a442c8a89fb9c531f9d6ab86120c31decd778d51 ]
    
    'Fixes' commit stopped calling ip_set_init_comment() for hash types
    from kernel-side-adds (xtables .. -j SET).  ip_set_init_comment() says:
    
       "The kadt functions don't use the comment extensions in any way."
    
    But bitmap set type calls the function from kadt cb too.
    
    While this appears to be safe (serialized via the set spinlock), it seems
    better to not call the init function either, least of all to keep
    behaviour consistent.
    
    ip_set_list calls ip_set_init_comment() only from uadt cb, it can be
    kept as-is.
    
    This was triggered by yet another LLM review, hinting that the existing
    rcu_dereference_protected() cannot be downgraded to only check if the
    nfnl mutex is held.
    
    Fixes: f30415929be8 ("netfilter: ipset: do not update comments from kernel-side hash adds")
    Signed-off-by: Florian Westphal <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: always increment set element count [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Sun Oct 25 16:32:23 2026 +0100

    netfilter: nf_tables: always increment set element count
    
    [ Upstream commit d4b7f29eb85c93893bc27388b37709efbc3c9a0e ]
    
    At this time, set->nelems counter only increments when the set has
    a maximum size.
    
    All set elements decrement the counter unconditionally, this is
    confusing.
    
    Increment the counter unconditionally to make this symmetrical.
    This would also allow changing the set maximum size after set creation
    in a later patch.
    
    Signed-off-by: Florian Westphal <[email protected]>
    [ Backport to 5.10.y: 5.10 has no NFT_SET_ELEM_CATCHALL element class,
      so the catch-all exclusion from the upstream commit is dropped and
      every element is counted. ]
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: avoid skb access on nf_stolen [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Wed Jun 22 16:43:57 2022 +0200

    netfilter: nf_tables: avoid skb access on nf_stolen
    
    [ Upstream commit e34b9ed96ce3b06c79bf884009b16961ca478f87 ]
    
    When verdict is NF_STOLEN, the skb might have been freed.
    
    When tracing is enabled, this can result in a use-after-free:
    1. access to skb->nf_trace
    2. access to skb->mark
    3. computation of trace id
    4. dump of packet payload
    
    To avoid 1, keep a cached copy of skb->nf_trace in the
    trace state struct.
    Refresh this copy whenever verdict is != STOLEN.
    
    Avoid 2 by skipping skb->mark access if verdict is STOLEN.
    
    3 is avoided by precomputing the trace id.
    
    Only dump the packet when verdict is not "STOLEN".
    
    Reported-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Stable-dep-of: 8ec454dcd00c ("ipv6: sr: use skb_get_hash_net() in seg6_make_flowlabel()")
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: fix bidirectional offload regression [+ + +]
Author: Felix Fietkau <[email protected]>
Date:   Wed Feb 14 15:42:35 2024 +0100

    netfilter: nf_tables: fix bidirectional offload regression
    
    [ Upstream commit 84443741faab9045d53f022a9ac6a6633067a481 ]
    
    Commit 8f84780b84d6 ("netfilter: flowtable: allow unidirectional rules")
    made unidirectional flow offload possible, while completely ignoring (and
    breaking) bidirectional flow offload for nftables.
    Add the missing flag that was left out as an exercise for the reader :)
    
    Cc: Vlad Buslov <[email protected]>
    Fixes: 8f84780b84d6 ("netfilter: flowtable: allow unidirectional rules")
    Reported-by: Daniel Golle <[email protected]>
    Signed-off-by: Felix Fietkau <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: fix crash when nf_trace is enabled [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Thu Aug 4 19:26:27 2022 +0200

    netfilter: nf_tables: fix crash when nf_trace is enabled
    
    [ Upstream commit 399a14ec7993d605740de7b2cd5c0ce8407d12ed ]
    
    do not access info->pkt when info->trace is not 1.
    nft_traceinfo is not initialized, except when tracing is enabled.
    
    The 'nft_trace_enabled' static key cannot be used for this, we must
    always check info->trace first.
    
    Pass nft_pktinfo directly to avoid this.
    
    Fixes: e34b9ed96ce3 ("netfilter: nf_tables: avoid skb access on nf_stolen")
    Reported-by: Hangbin Liu <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: release flowtable after rcu grace period on error [+ + +]
Author: Pablo Neira Ayuso <[email protected]>
Date:   Sat Oct 24 14:49:31 2026 +0200

    netfilter: nf_tables: release flowtable after rcu grace period on error
    
    [ Upstream commit d73f4b53aaaea4c95f245e491aa5eeb8a21874ce ]
    
    Call synchronize_rcu() after unregistering the hooks from error path,
    since a hook that already refers to this flowtable can be already
    registered, exposing this flowtable to packet path and nfnetlink_hook
    control plane.
    
    This error path is rare, it should only happen by reaching the maximum
    number hooks or by failing to set up to hardware offload, just call
    synchronize_rcu().
    
    There is a check for already used device hooks by different flowtable
    that could result in EEXIST at this late stage. The hook parser can be
    updated to perform this check earlier to this error path really becomes
    rarely exercised.
    
    Uncovered by KASAN reported as use-after-free from nfnetlink_hook path
    when dumping hooks.
    
    Fixes: 3b49e2e94e6e ("netfilter: nf_tables: add flow table netlink frontend")
    Reported-by: Yiming Qian <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    [ Backport to 5.10.y: 5.10 registers the flowtable hooks before the
      transaction is allocated and has no err_flowtable_hooks label. As in
      the 5.15.y backport of this fix, call synchronize_rcu() in the
      nft_register_flowtable_net_hooks() failure branch, before the hooks
      and the flowtable are released. ]
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nf_tables: unconditionally bump set->nelems before insertion [+ + +]
Author: Pablo Neira Ayuso <[email protected]>
Date:   Sun Oct 25 16:32:24 2026 +0100

    netfilter: nf_tables: unconditionally bump set->nelems before insertion
    
    [ Upstream commit def602e498a4f951da95c95b1b8ce8ae68aa733a ]
    
    In case that the set is full, a new element gets published then removed
    without waiting for the RCU grace period, while RCU reader can be
    walking over it already.
    
    To address this issue, add the element transaction even if set is full,
    but toggle the set_full flag to report -ENFILE so the abort path safely
    unwinds the set to its previous state.
    
    As for element updates, decrement set->nelems to restore it.
    
    A simpler fix is to call synchronize_rcu() in the error path.
    However, with a large batch adding elements to already maxed-out set,
    this could cause noticeable slowdown of such batches.
    
    Fixes: 35d0ac9070ef ("netfilter: nf_tables: fix set->nelems counting with no NLM_F_EXCL")
    Reported-by: Inseo An <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    [ Backport to 5.10.y: applies on top of d4b7f29eb85c ("netfilter:
      nf_tables: always increment set element count"), as in 6.1.y. 5.10
      has neither the nft_set_maxsize() helper (8d738c1869f6) nor the
      NFT_SET_ELEM_CATCHALL element class, so the ceiling is the same
      expression the prerequisite inlines, set->size ? set->size +
      set->ndeact : UINT_MAX, and every element is counted. On the
      full-set path the element is left in the transaction and unwound by
      the abort path, which removes it, decrements nelems and frees it only
      after synchronize_rcu(), instead of the in-place set->ops->remove()
      this replaces. The update-path hunk from the upstream commit does not
      apply: 5.10 has no in-place element-update path here. ]
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Steffen Pfendtner <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netfilter: nft_flow_offload: drop flowtable reference on init error path [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Thu Sep 10 16:33:26 2026 +0800

    netfilter: nft_flow_offload: drop flowtable reference on init error path
    
    commit 747928b5d4ff8c8de55138a54c13980e4bb88578 upstream.
    
    nft_flow_offload_init() bumps the flowtable use count with
    nft_use_inc() before calling nf_ct_netns_get().  When the latter
    fails, the error is returned as-is and the reference is leaked.
    
    The upper layers do not balance it either: nf_tables_newexpr()
    clears expr->ops when the expression init callback fails, so the
    nft_expr_more() iteration in nft_rule_expr_deactivate() and
    nf_tables_rule_destroy() stops right before the failed expression
    and its ->destroy callback, which would drop the reference, never
    runs.
    
    Each failed rule addition therefore leaks one flowtable reference
    and the flowtable can no longer be removed: NFT_MSG_DELFLOWTABLE
    keeps reporting -EBUSY even though no rule references it.
    
    Save the nf_ct_netns_get() return value and undo the nft_use_inc()
    when it fails, restoring the inc/dec pairing within
    nft_flow_offload_init() itself.
    
    Fixes: a3c90f7a2323 ("netfilter: nf_tables: flow offload expression")
    Reported-by: TencentOS Corvus AI <[email protected]>
    Cc: [email protected]
    Assisted-by: CodeBuddy:Kimi-K3
    Signed-off-by: Aohan Mei <[email protected]>
    Signed-off-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
netlink: avoid hashing the network namespace pointer [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Wed Oct 7 18:14:00 2026 -0700

    netlink: avoid hashing the network namespace pointer
    
    [ Upstream commit f88bb3606e4bd11ee035b682cddc2999e604609a ]
    
    The netlink rhashtable key includes a raw struct net pointer and a
    user-controlled port ID. Both /proc/net/netlink and socket diagnostics
    expose the table's bucket order. By binding and rebinding chosen
    NETLINK_USERSOCK port IDs, an unprivileged reader can distinguish equal
    buckets and recover the low bits of the Jenkins hash. Its 32-bit seed
    and the limited set of kernel-image slides can then be searched offline
    to recover the address of init_net.
    
    Use the namespace's unique, non-address net_cookie in the comparison
    key instead. It is assigned before the per-net initializers run and
    remains unchanged for the namespace's lifetime. The lookup key and
    object hash are still built by netlink_compare_arg_init(), keeping
    lookup, insertion, removal and rehashing consistent while preserving
    namespace separation. Neither public table walker needs to change.
    
    Reading the socket's namespace cookie in netlink_compare() is safe
    under RCU, including during namespace teardown. netlink_release()
    removes the socket from the hash table and defers its final put with
    call_rcu(). cleanup_net() runs the per-net exit methods and waits for
    outstanding RCU callbacks with rcu_barrier() before freeing namespace
    storage.
    
    Unlike ns.ns_id, net_cookie is also available and initialized during
    setup_net() in older stable kernels, making the change straightforward
    to backport to v5.15 and later.
    
    Fixes: c428ecd1a21f ("netlink: Move namespace into hash key")
    Assisted-by: LLM
    Signed-off-by: Kyle Zeng <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netlink: remove netlink_broadcast_filtered [+ + +]
Author: Florian Westphal <[email protected]>
Date:   Tue Oct 5 13:52:42 2021 +0200

    netlink: remove netlink_broadcast_filtered
    
    [ Upstream commit 549017aa1bb7ec19a1e24e7f65480a1c2e76b90e ]
    
    No users in tree since commit a3498436b3a0 ("netns: restrict uevents"),
    so remove this functionality.
    
    Cc: Christian Brauner <[email protected]>
    Signed-off-by: Florian Westphal <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Stable-dep-of: 8bf659bd54e1 ("netlink: reset skb headers before unicast and multicast filtering")
    Signed-off-by: Sasha Levin <[email protected]>

netlink: reset skb headers before unicast and multicast filtering [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Tue Oct 6 15:42:32 2026 -0700

    netlink: reset skb headers before unicast and multicast filtering
    
    [ Upstream commit 8bf659bd54e1f00e34cf5244b1d289c506fa47c0 ]
    
    Socket filters can use SKF_NET_OFF and SKF_LL_OFF to read relative to
    an skb's network and MAC headers. Netlink producers may reserve
    headroom without resetting those headers, allowing a receiving socket's
    filter to read data before the initialized message.
    
    For example, IWPM HELLO replies are allocated with dev_alloc_skb(),
    which reserves NET_SKB_PAD bytes. An unprivileged NETLINK_RDMA user can
    attach a classic socket filter and disclose this headroom through the
    length of the delivered reply. The resets in netlink_dump() do not help
    because IWPM sends a separately allocated skb through netlink_unicast().
    
    Reset both headers before running the receiver's filter in unicast and
    broadcast delivery, as is already done for dump skbs. This also covers
    other netlink producers that reserve headroom without changing their
    allocation or message-building code.
    
    Fixes: b1153f29ee07 ("netlink: make socket filters work on netlink")
    Assisted-by: LLM
    Signed-off-by: Kyle Zeng <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

netlink: Reverse the patch which removed filtering [+ + +]
Author: Anjali Kulkarni <[email protected]>
Date:   Wed Jul 19 13:18:16 2023 -0700

    netlink: Reverse the patch which removed filtering
    
    [ Upstream commit a3377386b56420d78a4c0a931a40f9a25c3ca2bd ]
    
    To use filtering at the connector & cn_proc layers, we need to enable
    filtering in the netlink layer. This reverses the patch which removed
    netlink filtering - commit ID for that patch:
    549017aa1bb7 (netlink: remove netlink_broadcast_filtered).
    
    Signed-off-by: Anjali Kulkarni <[email protected]>
    Reviewed-by: Liam R. Howlett <[email protected]>
    Acked-by: Jakub Kicinski <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Stable-dep-of: 8bf659bd54e1 ("netlink: reset skb headers before unicast and multicast filtering")
    Signed-off-by: Sasha Levin <[email protected]>

 
nfsd: check nfsd4_acl_to_attr() return value in nfsd4_create() [+ + +]
Author: Jeff Layton <[email protected]>
Date:   Sat Sep 5 09:55:33 2026 -0400

    nfsd: check nfsd4_acl_to_attr() return value in nfsd4_create()
    
    [ Upstream commit 2c7912732184773dbd371a411da87af1cc080b86 ]
    
    nfsd4_create() stores the return value of nfsd4_acl_to_attr() in
    status, but the switch(create->cr_type) block unconditionally
    overwrites it in every branch. ACL translation errors are silently
    discarded, and the CREATE proceeds without the requested ACL.
    
    Add an early exit check after nfsd4_acl_to_attr(), matching the
    pattern already used in nfsd4_setattr().
    
    Fixes: c0cbe70742f4 ("NFSD: add posix ACLs to struct nfsd_attrs")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Jeff Layton <[email protected]>
    [ cel: prefer NFS4ERR_BADTYPE over NFS4ERR_ATTRNOTSUPP ]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ retained unconditional ACL conversion because the older helper already handles null ACLs ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: fix clock domain mismatch in clients_still_reclaiming() [+ + +]
Author: Jeff Layton <[email protected]>
Date:   Sat Sep 5 10:30:19 2026 -0400

    nfsd: fix clock domain mismatch in clients_still_reclaiming()
    
    [ Upstream commit 09ea3eb9a518565f5bca386e81b993ed8825f5e8 ]
    
    clients_still_reclaiming() computes a deadline from nn->boot_time
    (CLOCK_REALTIME, ~1.7 billion) but compares it against
    ktime_get_boottime_seconds() (CLOCK_BOOTTIME, seconds since boot).
    The comparison is always false — it would take ~54 years of uptime
    for BOOTTIME to exceed the REALTIME-derived deadline.
    
    This means any client can hold the server in grace indefinitely by
    sending CLAIM_PREVIOUS OPEN requests, blocking all non-reclaim
    operations for all other clients.
    
    Add boot_time_bt (CLOCK_BOOTTIME) alongside the existing boot_time
    and use it for the deadline computation. boot_time (CLOCK_REALTIME)
    is preserved for its cl_boot clientid-nonce role.
    
    Fixes: 20b7d86f29d3 ("nfsd: use boottime for lease expiry calculation")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Jeff Layton <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ preserved the branch’s boolean fields instead of the upstream flags bitmap ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: fix nfsd_file leak on inter-server COPY setup failure [+ + +]
Author: Jeff Layton <[email protected]>
Date:   Sat Sep 5 12:50:46 2026 -0400

    nfsd: fix nfsd_file leak on inter-server COPY setup failure
    
    [ Upstream commit 88a76145451d703eedd867b5989bf73d17340399 ]
    
    When nfsd4_setup_inter_ssc() fails, nfsd4_copy() returns
    nfserr_offload_denied directly, bypassing the out: label where
    release_copy_files() would drop the nf_dst reference taken by
    nfs4_preprocess_stateid_op(). Each failed inter-server COPY
    leaks one nfsd_file, pinning file/inode/dentry/vfsmount.
    
    Fix by setting status and jumping to out: instead of returning
    directly.
    
    Fixes: ce0887ac96d3 ("NFSD add nfs4 inter ssc to nfsd4_copy")
    Cc: [email protected]
    Assisted-by: kres:claude-opus-4-7
    Signed-off-by: Jeff Layton <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ adjusted cleanup paths to omit unavailable trace_nfsd_copy_*() calls ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: gate nfs2 setacl by argp->mask [+ + +]
Author: Chuck Lever <[email protected]>
Date:   Sat Sep 5 22:13:38 2026 -0400

    nfsd: gate nfs2 setacl by argp->mask
    
    [ Upstream commit a3a7e20ed66d3f04d37883c398da8a113b430769 ]
    
    The NFSACL v2 SETACL path shares the decoder convention used by its
    v3 sibling: nfsaclsvc_decode_setaclargs() fills in argp->acl_access
    only when NFS_ACL is set in the request mask and argp->acl_default
    only when NFS_DFACL is set, leaving the other pointer NULL because
    the argument buffer is zeroed up to pc_argzero before decode.
    
    nfsacld_proc_setacl() then hands both pointers to set_posix_acl()
    unconditionally. set_posix_acl(idmap, dentry, type, NULL) is the VFS
    "remove this ACL type" operation, so an omitted arm is
    indistinguishable from an explicit request to delete that ACL. A
    SETACL carrying only NFS_ACL silently strips the directory's default
    ACL; mask=0 strips both.
    
    This is the same defect just fixed in nfsd3_proc_setacl(); apply the
    same remedy. Gate each set_posix_acl() call on its mask bit and
    initialize error to 0 so that a request with neither bit set leaves
    the on-disk ACLs untouched and returns success. The out_drop_lock
    path and the unconditional posix_acl_release() in
    nfsaclsvc_release_setacl() already tolerate the skipped arms.
    
    Fixes: a257cdd0e217 ("[PATCH] NFSD: Add server support for NFSv3 ACLs.")
    Cc: [email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ adapted four-argument set_posix_acl() calls to the older three-argument inode-based API. ]
    Signed-off-by: Sasha Levin <[email protected]>

nfsd: release path refs on follow_down() error [+ + +]
Author: Chris Mason <[email protected]>
Date:   Fri Sep 4 21:50:10 2026 -0400

    nfsd: release path refs on follow_down() error
    
    [ Upstream commit 6cba08dc1922140d260cfeb30bbda4ee1bf869d8 ]
    
    nfsd_cross_mnt() initializes a local struct path with mntget() and
    dget() before calling follow_down(). On a negative return the error
    arm jumps to out without releasing those references:
    
        err = follow_down(&path, follow_flags);
        if (err < 0)
                goto out;
    
    follow_down() never drops the caller's entry-time refs on any error
    sub-case; for example a pre-cross d_manage() failure leaves path
    untouched, so the mntget()/dget() taken on entry survive the call.
    
    Every other early-exit arm in nfsd_cross_mnt() (other-namespace
    return, IS_ERR(exp2), and the success tail after the swap) already
    calls path_put(&path); the err < 0 arm is the lone omission. The
    leak inflates mnt_count and d_count on each failed cross-mount,
    blocking umount and pinning dentries against the shrinker, and is
    reachable by any authenticated NFS client through nfsd_lookup_dentry
    or the NFSv4 READDIR encode path.
    
    Fix by calling path_put(&path) before the goto out in the err < 0
    arm so the entry-time refs are released on all follow_down() error
    returns.
    
    Fixes: cc53ce53c869 ("Add a dentry op to allow processes to be held during pathwalk transit")
    Cc: [email protected]
    Assisted-by: kres:claude-opus-4-7
    Signed-off-by: Chris Mason <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    [ retained the older single-argument follow_down(&path) API ]
    Signed-off-by: Sasha Levin <[email protected]>

 
nios2: fix __wsum type degradation in csum_fold() [+ + +]
Author: Keith Busch <[email protected]>
Date:   Tue Sep 22 08:34:16 2026 -0700

    nios2: fix __wsum type degradation in csum_fold()
    
    [ Upstream commit b963f2345fa20417401c51a69dedb6a58eea33a9 ]
    
    csum_fold() shifts a bitwise __wsum type, which sparse reports as
    "restricted __wsum degrades to integer". Sparse only checks the body of
    a static inline once something instantiates it, so this went unnoticed
    until a recent block layer change added the first csum_fold() caller to
    a file built on this architecture.
    
    Force cast to a __u32 for the shift, as the other architectures do.
    
    Fixes: eea9507a69d6 ("nios2: Library functions")
    Reported-by: kernel test robot <[email protected]>
    Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Dinh Nguyen <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
nitro_enclaves: fix use-after-free on SLOT_ALLOC failure [+ + +]
Author: Yuxiao Wang <[email protected]>
Date:   Wed Sep 9 12:44:00 2026 +0000

    nitro_enclaves: fix use-after-free on SLOT_ALLOC failure
    
    commit 9bc184a2eda8b773c88ecbff934001ad649b9cc1 upstream.
    
    When ne_create_vm_ioctl() fails the SLOT_ALLOC request after
    anon_inode_getfile() has succeeded, the error path calls
    fput(enclave_file) and then frees ne_enclave.
    
    In normal userspace context, fput() defers the final __fput() via
    task_work. ne_enclave_release() therefore runs after ne_enclave has
    already been freed and dereferences ne_enclave->slot_uid, causing a
    use-after-free: KASAN: slab-use-after-free in ne_enclave_release.
    
    The enclave has no slot allocated and is not yet linked into the
    enclaves list on this error path, so ne_enclave_release() is expected
    to return early when slot_uid is zero. However, reading slot_uid
    already accesses the freed object.
    
    Clear enclave_file->private_data before fput() on the error path.
    ne_enclave_release() then returns immediately when private_data is
    NULL, leaving the ioctl error path as the sole owner of ne_enclave.
    This is safe because the file has not been fd_install()'d yet.
    
    Tested on an AWS EC2 m5.2xlarge with CONFIG_KASAN=y. Without the
    patch, the reproducer triggers a KASAN slab-use-after-free on every
    SLOT_ALLOC failure. With the patch, no KASAN report is produced and
    the SLOT_ALLOC error is still returned. Normal enclave creation and
    teardown are unaffected.
    
    Fixes: 9c8eb50fe9e2 ("nitro_enclaves: Add logic for terminating an enclave")
    Cc: [email protected]
    Co-developed-by: Zhaofeng Chen <[email protected]>
    Signed-off-by: Zhaofeng Chen <[email protected]>
    Signed-off-by: Yuxiao Wang <[email protected]>
    Reviewed-by: Alexander Graf <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
nouveau/gem: reserve the bo in the info ioctl around the vma lookup [+ + +]
Author: Dave Airlie <[email protected]>
Date:   Tue Sep 8 14:22:30 2026 -0400

    nouveau/gem: reserve the bo in the info ioctl around the vma lookup
    
    [ Upstream commit 5e17160d41d92823f3379c1982e1369680c5ce4d ]
    
    In the non-uvmm path, there could be a race between the info lookup
    finding the vma, and the gem close path closing the vma leading
    to a use-after-free.
    
    Spotted with the help of Opus 4.6.
    
    Signed-off-by: Dave Airlie <[email protected]>
    Fixes: e758a3111914 ("drm/nouveau: fixup gem_info ioctl to return client-specific bo virtual")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Danilo Krummrich <[email protected]>
    [ adapted VMM and UVMM handling to the legacy direct VMM selection and condition. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
nvme-multipath: fix underflow in ANA log bounds checks [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Tue Sep 15 11:19:56 2026 +0900

    nvme-multipath: fix underflow in ANA log bounds checks
    
    commit 63fa2d9c9c37020bd2703fe2a6a38027b5abeb15 upstream.
    
    The number of ANA groups advertised through Identify Controller sizes the
    ANA log buffer. The ANA log header and group descriptors independently
    supply the number of groups and namespace IDs to parse.
    
    Both bounds checks subtract an untrusted object size from ana_log_size
    before comparing the current offset. If the object is larger than the
    buffer, the size_t subtraction underflows and lets the parser read beyond
    ana_log_buf.
    
    Check the current offset before the first subtraction and compare each
    object size with the remaining buffer instead. This rejects inconsistent
    ANA data before dereferencing a truncated group descriptor or walking an
    oversized namespace ID array.
    
    Fixes: 0d0b660f214d ("nvme: add ANA support")
    Cc: [email protected]
    Assisted-by: LLM
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Daehyeon Ko <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
nvme-tcp: Do not reset transport on data digest errors [+ + +]
Author: Daniel Wagner <[email protected]>
Date:   Wed Sep 9 06:49:56 2026 -0400

    nvme-tcp: Do not reset transport on data digest errors
    
    [ Upstream commit 1ba2e507f55c5b0cbde8c0fbfe0d9e39612a3e52 ]
    
    The spec says
    
      7.4.6.1 Digest Error handling
    
      When a host detects a data digest error in a C2HData PDU, that host
      shall continue processing C2HData PDUs associated with the command and
      when the command processing has completed, if a successful status was
      returned by the controller, the host shall fail the command with a
      non-fatal transport error.
    
    Currently the transport is reseted when a data digest error is
    detected. Instead, when a digest error is detected, mark the final
    status as NVME_SC_DATA_XFER_ERROR and let the upper layer handle
    the error.
    
    In order to keep track of the final result maintain a status field in
    nvme_tcp_request object and use it to overwrite the completion queue
    status (which might be successful even though a digest error has been
    detected) when completing the request.
    
    Signed-off-by: Daniel Wagner <[email protected]>
    Reviewed-by: Sagi Grimberg <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Signed-off-by: Christoph Hellwig <[email protected]>
    Stable-dep-of: 7fa3f73f6c8d ("nvme-tcp: reject a read that transferred too few bytes")
    Signed-off-by: Sasha Levin <[email protected]>

nvme-tcp: fix host memory disclosure on R2T for a read command [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Sep 9 06:45:13 2026 -0400

    nvme-tcp: fix host memory disclosure on R2T for a read command
    
    [ Upstream commit 6efbc52237facda35d2d874fe1765bb4839275d8 ]
    
    nvme_tcp_handle_r2t() does not check the direction of the request the
    R2T refers to. A malicious controller can send an R2T for a READ and
    the host will answer it: nvme_tcp_setup_h2c_data_pdu() builds the
    H2CData header and nvme_tcp_try_send_data() sends the request's data
    buffer. That buffer is the READ destination, so its contents go to the
    controller.
    
    The command then completes normally and nothing is logged.
    
    Against a test controller that answers every READ with an R2T, a 4096
    byte buffered read returned all 4096 bytes, split over two R2Ts. The
    pages contained stale kernel data, including an array of struct page
    pointers.
    
    Reject an R2T for a request that is not a write.
    
    Fixes: 3f2304f8c6d6 ("nvme-tcp: add NVMe over TCP host driver")
    Cc: [email protected]
    Signed-off-by: Yehyeong Lee <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

nvme-tcp: reject a read that transferred too few bytes [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Sep 9 06:49:57 2026 -0400

    nvme-tcp: reject a read that transferred too few bytes
    
    [ Upstream commit 7fa3f73f6c8ddc5f0425b50fb2a626a782ef7d12 ]
    
    nvme_tcp_recv_data() completes a request once the current C2HData PDU
    has been consumed. Nothing compares the total bytes received against
    the length the command asked for: struct nvme_tcp_request has no
    receive-side counter, queue->data_remaining is per queue, and
    blk_mq_end_request() completes for blk_rq_bytes(rq) unconditionally
    with no residual concept anywhere above.
    
    A controller can therefore answer a 4096-byte read with 512 bytes and
    have it reported as a complete read; user space then gets 4096 bytes of
    which 3584 are whatever was already in the page. I reproduced that with
    a test target.
    
    Count the bytes received and refuse to complete a successful read whose
    count does not match, at the two NVME_TCP_F_DATA_SUCCESS paths and in
    nvme_tcp_process_nvme_cqe(). The success test shifts req->status right
    by one, because the driver keeps the wire value there and shifts it on
    completion, so the check must see what the completion path will see.
    Only REQ_OP_READ is checked, because there the length comes from the
    sectors the request covers; a passthrough command is built by its
    submitter, which picks both command and buffer, so the kernel has
    nothing to compare against.
    
    Fixes: 3f2304f8c6d6 ("nvme-tcp: add NVMe over TCP host driver")
    Cc: [email protected]
    Signed-off-by: Yehyeong Lee <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

nvme-tcp: validate R2T PDU in nvme_tcp_handle_r2t() [+ + +]
Author: Varun Prakash <[email protected]>
Date:   Wed Sep 9 06:45:12 2026 -0400

    nvme-tcp: validate R2T PDU in nvme_tcp_handle_r2t()
    
    [ Upstream commit 1d3ef9c3a39e04be31155c27ebf80342350c3abf ]
    
    If maxh2cdata < r2t_length then driver will form multiple
    H2CData PDUs, validate R2T PDU in nvme_tcp_handle_r2t() to
    reuse nvme_tcp_setup_h2c_data_pdu().
    
    Also set req->state to NVME_TCP_SEND_H2C_PDU in
    nvme_tcp_setup_h2c_data_pdu().
    
    Signed-off-by: Varun Prakash <[email protected]>
    Reviewed-by: Sagi Grimberg <[email protected]>
    Signed-off-by: Christoph Hellwig <[email protected]>
    Stable-dep-of: 6efbc52237fa ("nvme-tcp: fix host memory disclosure on R2T for a read command")
    Signed-off-by: Sasha Levin <[email protected]>

 
nvme: add missing SRCU grace period in error path [+ + +]
Author: Tristan Madani <[email protected]>
Date:   Thu Sep 10 20:34:12 2026 -0400

    nvme: add missing SRCU grace period in error path
    
    [ Upstream commit ef248d5de4469fb6bbaf8dbe0c4c47800080d648 ]
    
    nvme_alloc_ns() error path at out_unlink_ns removes ns from the
    namespace head siblings list with list_del_rcu(&ns->siblings) but
    does not wait for SRCU readers before freeing the namespace struct.
    Multipath code iterates the head->list under srcu_read_lock() in
    nvme_find_path() and nvme_mpath_revalidate_paths(), so a concurrent
    reader can still hold a reference to ns when kfree(ns) runs.
    
    The normal removal path in nvme_ns_remove() correctly calls
    synchronize_srcu(&ns->head->srcu) after list_del_rcu() to wait for
    in-progress readers. Add the same grace period in the error path.
    
    Fixes: ed754e5deeb1 ("nvme: track shared namespaces")
    Cc: [email protected]
    Signed-off-by: Tristan Madani <[email protected]>
    Reviewed-by: Sagi Grimberg <[email protected]>
    Reviewed-by: John Garry <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    [ Adjusted patch context to account for missing last_path reference-counting code. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
nvmet: preserve device path on allocation failure [+ + +]
Author: Julian Sun <[email protected]>
Date:   Tue Sep 8 11:35:18 2026 +0800

    nvmet: preserve device path on allocation failure
    
    [ Upstream commit 2f271b812170d4cad578bae1f91db72f3c2e36e7 ]
    
    nvmet_ns_device_path_store() frees the old path before allocating its
    replacement, losing the existing configuration if allocation fails.
    Allocate the new path before freeing the old one.
    
    Fixes: a07b4970f464 ("nvmet: add a generic NVMe target")
    Signed-off-by: Julian Sun <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

nvmet: use the local P2P device on metadata allocation failure [+ + +]
Author: Sang-Hoon Choi <[email protected]>
Date:   Wed Sep 30 16:08:58 2026 +0900

    nvmet: use the local P2P device on metadata allocation failure
    
    [ Upstream commit 4aa9c0f377a4de5e8fddce76b34ee4529639a1ff ]
    
    nvmet_req_alloc_p2pmem_sgls() assigns req->p2p_dev only after the data
    and metadata SGL allocations succeed. If the data allocation succeeds
    but the metadata allocation fails, out_free_sg passes req->p2p_dev to
    pci_p2pmem_free_sgl() before that assignment has taken place.
    
    Pass the local p2p_dev argument instead, so cleanup uses the same PCI
    device as the successful data allocation.
    
    Fixes: bcd9a0797d73 ("nvmet: fix freeing unallocated p2pmem")
    Reported-by: Changyul Lee <[email protected]>
    Reviewed-by: Maurizio Lombardi <[email protected]>
    Signed-off-by: Sang-Hoon Choi <[email protected]>
    Signed-off-by: Keith Busch <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ocfs2/dlm: Protect the recovery list during debugfs reads [+ + +]
Author: Cen Zhang <[email protected]>
Date:   Sun Oct 11 23:35:06 2026 +0800

    ocfs2/dlm: Protect the recovery list during debugfs reads
    
    [ Upstream commit 4c435828932bf46f29860e4a0375bcae101b778a ]
    
    Recovery participant records must remain alive while debug_state_print()
    walks reco.node_data and formats their fields. The formatter holds
    dlm->spinlock, but the recovery participant list is protected by
    dlm_reco_state_lock. In particular, dlm_destroy_recovery_area() detaches
    the list under dlm_reco_state_lock and frees the detached records after
    releasing it. A concurrent debugfs open can therefore read freed memory.
    
    Protect the participant traversal and field reads in debug_state_print()
    with dlm_reco_state_lock, matching the existing list writers. This also
    serializes the traversal against list_add_tail() during recovery-area
    initialization. Make the existing lock available to the debug code
    through dlmcommon.h; the lock remains internal to the OCFS2 DLM module.
    
    Release dlm->spinlock after formatting the other domain state and before
    acquiring dlm_reco_state_lock, so the debug reader does not nest the two
    locks. Leave recovery list insertion, detachment and freeing unchanged.
    
    KASAN report as below:
    
        BUG: KASAN: slab-use-after-free in debug_state_open+0x1169/0x12d0
        Read of size 4 at addr ffff88810662ef80 by task dlm-state-stres/896
    
        CPU: 1 UID: 0 PID: 896 Comm: dlm-state-stres Not tainted 7.3.0-rc4-next-20260921-pmb-ocfs2-functional-v1+ #1 PREEMPT(lazy)
        Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
        Call Trace:
         <TASK>
         dump_stack_lvl+0x93/0xd0
         print_report+0xce/0x630
         ? debug_state_open+0x1169/0x12d0
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? __virt_addr_valid+0x20e/0x420
         ? debug_state_open+0x1169/0x12d0
         kasan_report+0xe0/0x110
         ? debug_state_open+0x1169/0x12d0
         debug_state_open+0x1169/0x12d0
         ? __pfx_debug_state_open+0x10/0x10
         full_proxy_open_regular+0x193/0x310
         do_dentry_open+0x595/0x12d0
         ? __pfx_full_proxy_open_regular+0x10/0x10
         vfs_open_consume+0xd1/0x400
         ? srso_alias_return_thunk+0x5/0xfbef5
         path_openat+0x18d0/0x2020
         ? __pfx_path_openat+0x10/0x10
         do_file_open+0x21e/0x470
         ? __pfx_do_file_open+0x10/0x10
         ? _raw_spin_unlock+0x23/0x40
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? alloc_fd+0x3a6/0x6b0
         do_sys_openat2+0xf4/0x1b0
         ? __pfx_do_sys_openat2+0x10/0x10
         ? srso_alias_return_thunk+0x5/0xfbef5
         ? __fput+0x5b5/0xa60
         __x64_sys_openat+0x136/0x1e0
         ? __pfx___x64_sys_openat+0x10/0x10
         do_syscall_64+0x114/0x620
         entry_SYSCALL_64_after_hwframe+0x77/0x7f
        [Register dump omitted.]
         </TASK>
    
        Allocated by task 880:
         kasan_save_stack+0x33/0x60
         kasan_save_track+0x14/0x30
         __kasan_kmalloc+0xaa/0xb0
         __kmalloc_cache_noprof+0x28d/0x610
         dlm_remaster_locks+0x147/0x1d90
         dlm_do_recovery+0xde1/0x1580
         dlm_recovery_thread+0x109/0x300
         kthread+0x351/0x460
         ret_from_fork+0x659/0x940
         ret_from_fork_asm+0x1a/0x30
    
        Freed by task 880:
         kasan_save_stack+0x33/0x60
         kasan_save_track+0x14/0x30
         kasan_save_free_info+0x3b/0x60
         __kasan_slab_free+0x5f/0x80
         kfree+0x308/0x580
         dlm_destroy_recovery_area+0x285/0x460
         dlm_remaster_locks+0x17c4/0x1d90
         dlm_do_recovery+0xde1/0x1580
         dlm_recovery_thread+0x109/0x300
         kthread+0x351/0x460
         ret_from_fork+0x659/0x940
         ret_from_fork_asm+0x1a/0x30
    
        The buggy address belongs to the object at ffff88810662ef80
         which belongs to the cache kmalloc-32 of size 32
        The buggy address is located 0 bytes inside of
         freed 32-byte region [ffff88810662ef80, ffff88810662efa0)
    
        [Page and memory-state dumps omitted.]
    
    Fixes: 007dce53a29c ("ocfs2/dlm: Dump the dlm state in a debugfs file")
    Signed-off-by: Cen Zhang <[email protected]>
    Link: https://patch.msgid.link/pm-ocfs2-objects-candidate-0049-v3-184e46c47f5283f06191@gmail.com
    Reviewed-by: Joseph Qi <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
ocfs2: validate directory-index entry counts when reading metadata [+ + +]
Author: Doruk Tan Ozturk <[email protected]>
Date:   Wed Sep 9 06:54:28 2026 -0400

    ocfs2: validate directory-index entry counts when reading metadata
    
    [ Upstream commit bc70726ddad53c7e9a9a85915bf2415b0d4f42f9 ]
    
    ocfs2_validate_dx_leaf() and ocfs2_validate_dx_root() check the ECC and
    signature of an indexed-directory block before it reaches higher-level
    callers, but neither validator bounds the ocfs2_dx_entry_list counts
    against the capacity of the block that holds them.
    
    ocfs2_dx_dir_search() then walks
    
            for (i = 0; i < le16_to_cpu(entry_list->de_num_used); i++)
                    dx_entry = &entry_list->de_entries[i];
    
    over de_num_used entries with no bounds check.  entry_list is either
    dx_leaf->dl_list (from ocfs2_read_dx_leaf) or, for an inline root,
    dx_root->dr_entries.  A crafted on-disk image can set de_num_used (and
    de_count, which is the __counted_by_le() bound of de_entries) to 0xffff
    and make the walk read far past the end of the 4KB metadata block, giving
    a slab out-of-bounds read reachable from any path lookup, stat() or open()
    on an indexed directory once the image is mounted.
    
    Commit 775c17386a6f ("ocfs2: validate dx_root extent list fields during
    block read") already bounds dr_list for the non-inline dx_root, but left
    the inline dr_entries path and the dx_leaf dl_list unchecked.  Add the
    same read-time validation for both entry lists: de_count must equal the
    capacity of the block (ocfs2_dx_entries_per_leaf()/per_root()) and
    de_num_used must not exceed de_count, rejecting corrupted metadata with
    -EFSCORRUPTED before ocfs2_dx_dir_search() can walk an out-of-range entry
    array.
    
    de_count is always written as exactly the block capacity when a leaf or
    inline root is formatted, so the equality check does not reject any valid
    image.
    
    Found by 0sec automated security-research tooling (https://0sec.ai).
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: 9b7895efac90 ("ocfs2: Add a name indexed b-tree to directory inodes")
    Fixes: 4ed8a6bb083b ("ocfs2: Store dir index records inline")
    Assisted-by: 0sec:claude-opus-4-8
    Signed-off-by: Doruk Tan Ozturk <[email protected]>
    Reviewed-by: Joseph Qi <[email protected]>
    Cc: Joel Becker <[email protected]>
    Cc: Kees Cook <[email protected]>
    Cc: Mark Fasheh <[email protected]>
    Cc: Junxiao Bi <[email protected]>
    Cc: Changwei Ge <[email protected]>
    Cc: Jun Piao <[email protected]>
    Cc: Heming Zhao <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

ocfs2: validate dx_root extent list fields during block read [+ + +]
Author: Joseph Qi <[email protected]>
Date:   Wed Sep 9 06:54:27 2026 -0400

    ocfs2: validate dx_root extent list fields during block read
    
    [ Upstream commit 775c17386a6fd695f999d4cda90e3931386570dd ]
    
    Patch series "ocfs2: consolidate extent list validation into block read
    callbacks".
    
    ocfs2 validates extent list fields (l_count, l_next_free_rec) at various
    points during extent tree traversal.  This is fragile because each caller
    must remember to check for corrupted on-disk data before using it.
    
    This series moves those checks into the block read validation callbacks
    (ocfs2_validate_dx_root and ocfs2_validate_extent_block), so corrupted
    fields are caught early at block read time.  Redundant post-read checks
    are then removed.
    
    This patch (of 4):
    
    Move the extent list l_count validation from ocfs2_dx_dir_lookup_rec()
    into ocfs2_validate_dx_root(), so that corrupted on-disk fields are caught
    early at block read time rather than during directory lookups.
    
    Additionally, add a l_next_free_rec <= l_count check to prevent
    out-of-bounds access when iterating over extent records.
    
    Both checks are skipped for inline dx roots (OCFS2_DX_FLAG_INLINE), which
    use dr_entries instead of dr_list.
    
    Link: https://lkml.kernel.org/r/[email protected]
    Link: https://lkml.kernel.org/r/[email protected]
    Signed-off-by: Joseph Qi <[email protected]>
    Reviewed-by: Heming Zhao <[email protected]>
    Cc: Mark Fasheh <[email protected]>
    Cc: Joel Becker <[email protected]>
    Cc: Junxiao Bi <[email protected]>
    Cc: Changwei Ge <[email protected]>
    Cc: Jun Piao <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Stable-dep-of: bc70726ddad5 ("ocfs2: validate directory-index entry counts when reading metadata")
    Signed-off-by: Sasha Levin <[email protected]>

 
of/irq: add missing of_node_put() for interrupt parent node [+ + +]
Author: Clément Léger <[email protected]>
Date:   Tue Jan 17 15:49:29 2023 +0100

    of/irq: add missing of_node_put() for interrupt parent node
    
    [ Upstream commit eb2b4ecf7299ee39ee9cecc4d3f2633aeb10cefb ]
    
    After calling of_irq_parse_one(), the node provided in the of_phandle_args
    has a refcount increment by one. Add missing of_node_put in of_irq_get()
    to decrement the refcount once used.
    
    Signed-off-by: Clément Léger <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Rob Herring <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

of/irq: Fix remaining refcount leaks in of_irq_init() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Thu Sep 17 12:42:47 2026 +0000

    of/irq: Fix remaining refcount leaks in of_irq_init()
    
    commit 30724547b221e0e670ddfef140fc7d816b2aaec6 upstream.
    
    Successfully initialized controllers are moved to intc_parent_list,
    but the final cleanup only frees the descriptors. The device node
    references taken with of_node_get() and the interrupt parent
    references are therefore leaked on the normal return path. Drop both
    before kfree(), as the intc_desc_list cleanup already does.
    
    Fixes: 8363ccb917c6 ("of/irq: add missing of_node_put")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
of/overlay: don't create "//" paths for fragments targeting the root [+ + +]
Author: Abdurrahman Hussain <[email protected]>
Date:   Mon Aug 31 18:29:25 2026 -0700

    of/overlay: don't create "//" paths for fragments targeting the root
    
    [ Upstream commit 21c89ff1fc86ffa517f3a9ca1ba5c48e9e37c1ba ]
    
    dup_and_fixup_symbol_prop() rewrites a symbol value by replacing its
    "/fragment/__overlay__" prefix with the fragment's target path. When
    the fragment targets the root node the target path is "/" and the
    result starts with "//", which __of_find_node_by_full_path() cannot
    resolve: symbols pointing into such fragments silently stop
    resolving.
    
    Drop the target path when it is the root and the tail is non-empty. A
    value naming the fragment root itself (empty tail) keeps the "/".
    
    Fixes: d1651b03c2df ("of: overlay: add overlay symbols to live device tree")
    Assisted-by: Claude:claude-fable-5 [Claude Code]
    Signed-off-by: Abdurrahman Hussain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

of/overlay: don't leak fragment references when changeset init fails [+ + +]
Author: Abdurrahman Hussain <[email protected]>
Date:   Mon Aug 31 18:29:24 2026 -0700

    of/overlay: don't leak fragment references when changeset init fails
    
    [ Upstream commit 1d62f0f2bc7edb12ed09f71203df0e47fa4efca4 ]
    
    init_overlay_changeset() stores the number of initialized fragments
    in ovcs->count only on full success. When find_target() or the
    __symbols__ lookup fails partway through, the target and overlay
    references taken for the fragments initialized so far are never
    dropped: free_overlay_changeset() bounds its cleanup loop by
    ovcs->count, which is still 0.
    
    Store the running count on the error path so free_overlay_changeset()
    puts whatever was set up. The store is guarded by ovcs->fragments
    because on the allocation-failure path cnt still holds the counting
    pass total while there is no fragments array; everywhere else cnt
    only counts fully-initialized fragments.
    
    Reported-by: Sashiko AI <[email protected]>
    Closes: https://lore.kernel.org/[email protected]
    Fixes: 61b4de4e0b38 ("of: overlay: minor restructuring")
    Assisted-by: Claude:claude-opus-4-8 [Claude Code]
    Signed-off-by: Abdurrahman Hussain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

of/overlay: put property on deadprops only after changeset add succeeds [+ + +]
Author: Abdurrahman Hussain <[email protected]>
Date:   Mon Aug 31 18:29:22 2026 -0700

    of/overlay: put property on deadprops only after changeset add succeeds
    
    commit 814f2da6995772c07a7c9c2cc6028b6e3f3ecc9c upstream.
    
    add_changeset_property() links a new property of a not-yet-live
    target node into the node's deadprops list before handing it to
    of_changeset_add_property(). If that fails, the error path frees the
    property but leaves the freed pointer linked in deadprops, and
    of_node_release() frees it a second time when the aborted overlay's
    node is released.
    
    Record the changeset entry first and link the property into deadprops
    only on success. of_changeset_add_property() never looks at the
    node's property lists, so the order of the two steps is otherwise
    immaterial, and the error path frees a property that nothing
    references.
    
    Fixes: f96278810150 ("of: overlay: set node fields from properties when add new overlay node")
    Cc: [email protected]
    Assisted-by: Claude:claude-fable-5 [Claude Code]
    Signed-off-by: Abdurrahman Hussain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Rob Herring (Arm) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
openvswitch: add nf_ct_is_confirmed check before assigning the helper [+ + +]
Author: Xin Long <[email protected]>
Date:   Thu Oct 6 15:45:02 2022 -0400

    openvswitch: add nf_ct_is_confirmed check before assigning the helper
    
    [ Upstream commit 3c1860543fccc1d0cfe3fd6b190e414a418fe60e ]
    
    A WARN_ON call trace would be triggered when 'ct(commit, alg=helper)'
    applies on a confirmed connection:
    
      WARNING: CPU: 0 PID: 1251 at net/netfilter/nf_conntrack_extend.c:98
      RIP: 0010:nf_ct_ext_add+0x12d/0x150 [nf_conntrack]
      Call Trace:
       <TASK>
       nf_ct_helper_ext_add+0x12/0x60 [nf_conntrack]
       __nf_ct_try_assign_helper+0xc4/0x160 [nf_conntrack]
       __ovs_ct_lookup+0x72e/0x780 [openvswitch]
       ovs_ct_execute+0x1d8/0x920 [openvswitch]
       do_execute_actions+0x4e6/0xb60 [openvswitch]
       ovs_execute_actions+0x60/0x140 [openvswitch]
       ovs_packet_cmd_execute+0x2ad/0x310 [openvswitch]
       genl_family_rcv_msg_doit.isra.15+0x113/0x150
       genl_rcv_msg+0xef/0x1f0
    
    which can be reproduced with these OVS flows:
    
      table=0, in_port=veth1,tcp,tcp_dst=2121,ct_state=-trk
      actions=ct(commit, table=1)
      table=1, in_port=veth1,tcp,tcp_dst=2121,ct_state=+trk+new
      actions=ct(commit, alg=ftp),normal
    
    The issue was introduced by commit 248d45f1e193 ("openvswitch: Allow
    attaching helper in later commit") where it somehow removed the check
    of nf_ct_is_confirmed before asigning the helper. This patch is to fix
    it by bringing it back.
    
    Fixes: 248d45f1e193 ("openvswitch: Allow attaching helper in later commit")
    Reported-by: Pablo Neira Ayuso <[email protected]>
    Signed-off-by: Xin Long <[email protected]>
    Acked-by: Aaron Conole <[email protected]>
    Tested-by: Aaron Conole <[email protected]>
    Link: https://lore.kernel.org/r/c5c9092a22a2194650222bffaf786902613deb16.1665085502.git.lucien.xin@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

openvswitch: fix soft lockup in the netlink flow dump [+ + +]
Author: Denis V. Lunev <[email protected]>
Date:   Tue Sep 29 09:25:19 2026 +0200

    openvswitch: fix soft lockup in the netlink flow dump
    
    commit aaaaf87ea99b8766c9a8aa0e71aa42e6bc8a5320 upstream.
    
    A production compute node carrying a few thousand datapath flows hit a
    soft lockup inside a single netlink flow dump and panicked.
    
    ovs_flow_cmd_dump() calls ovs_flow_stats_get() for every flow it
    emits, and that releases stats->lock with spin_unlock_bh() once per
    CPU that has touched the flow. Every release is a local_bh_enable(),
    and each one runs the pending softirq backlog in the dumping thread's
    own context.
    
    The skb bounds the flows one callback emits, but not the softirq work
    it absorbs. On a CPU that carries the box's packet load the backlog
    refills as fast as it drains, so the dumping thread becomes that CPU's
    softirq engine. It never sleeps and it has no reschedule point, so
    under voluntary preemption nothing can take the CPU away from it:
    neither the ksoftirqd the kernel woke to take the work over, nor the
    stopper thread the softlockup detector dispatches to refresh its
    timestamp.
    
    Hold BH off across the whole callback instead, the way
    ctnetlink_dump_table() does, so the nested spin_unlock_bh() stop
    draining softirqs. The loop already runs under rcu_read_lock() and
    cannot sleep. What it gives up is preemption under CONFIG_PREEMPT,
    since a BH-off region is not preemptible outside PREEMPT_RT. The
    region stays short: the skb caps the flows one callback emits, and
    empty buckets cost no skb space but are each visited once per dump, as
    the cursor only moves forward. The table grows on insert and shrinks
    only on flush, so the walk is bounded by the largest flow count the
    datapath has held. The softirq backlog the callback used to absorb has
    no bound at all.
    
    Fixes: 63e7959c4b9b ("openvswitch: Per NUMA node flow stats.")
    Cc: [email protected]
    Signed-off-by: Denis V. Lunev <[email protected]>
    Reviewed-by: Ilya Maximets <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
OPP: Fix race between OPP addition and lookup [+ + +]
Author: Di Shen <[email protected]>
Date:   Tue Oct 20 23:07:39 2026 +0200

    OPP: Fix race between OPP addition and lookup
    
    [ Upstream commit f5e1cc9a284bff2510981643a5bca4bc4c21b81a ]
    
    A race exists between dev_pm_opp_add_dynamic() and
    dev_pm_opp_find_freq_exact():
    
      CPU0 (add)                          CPU1 (lookup)
      -------------------------------     ------------------------------
      _opp_add()
        mutex_lock()
        list_add(&new_opp->node, head)
        mutex_unlock()                    _opp_table_find_key()
                                            mutex_lock()
                                            dev_pm_opp_get(opp)
                                              kref_get()
                                            mutex_unlock()
        kref_init(&new_opp->kref)
                                          dev_pm_opp_put()
                                            kref_put_mutex()
    
    The newly added OPP is inserted into the list before its kref is
    initialized. A concurrent lookup can find this OPP and increment its
    reference count while it is still uninitialized, leading to refcount
    corruption and a potential premature free.
    
    Fix this by initializing ->kref and ->opp_table before making the OPP
    visible via list_add(). This ensures any concurrent lookup observes a
    fully initialized object.
    
    Fixes: 7034764a1e4a (PM / OPP: Add 'struct kref' to struct dev_pm_opp)
    Co-developed-by: Ling Xu <[email protected]>
    Signed-off-by: Ling Xu <[email protected]>
    Signed-off-by: Di Shen <[email protected]>
    [ Viresh: Updated commit log ]
    Signed-off-by: Viresh Kumar <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
optee: register TEE devices only once fully initialized [+ + +]
Author: Shao-Fu Chen <[email protected]>
Date:   Tue Oct 13 11:59:44 2026 -0400

    optee: register TEE devices only once fully initialized
    
    [ Upstream commit c108feca0a096f8db25d1b69130035025e9e936d ]
    
    optee_probe() called tee_device_register() on both the client and the
    supplicant device before the rest of struct optee had been initialized.
    
    tee_device_register() calls cdev_device_add(), which does two things at
    once: it creates /dev/tee0 and /dev/teepriv0, and it links the device
    into the tee class so that class_find_device() can find it. From that
    moment on the device is reachable both from user space via tee_open()
    and from kernel space via tee_client_open_context(). The only gate in
    teedev_open() is tee_device_get(), which merely checks that
    teedev->desc is non-NULL, which was already set by tee_device_alloc().
    Therefore, there is effectively no gate at all.
    
    A context opened in that window can run against a struct optee where
    
      - optee->call_queue.mutex is not initialized by optee_cq_init()
      - optee->supp mutex and completions is not initialized by
        optee_supp_init()
      - optee->rpmb_dev_mutex is not initialized yet,
      - the message argument cache is not initialized by
        optee_shm_arg_cache_init()
      - optee->ctx is still NULL
    
    Any open session or invoke during this window takes uninitialized
    mutexes and dereferences a NULL pointer.
    
    Fix it by moving both tee_device_register() calls down to the point
    where all of struct optee is set up.
    
    Fixes: 4fb0a5eb364d ("tee: add OP-TEE driver")
    Cc: [email protected]
    Signed-off-by: Shao-Fu Chen <[email protected]>
    [JW: adding fixes and cc]
    Signed-off-by: Jens Wiklander <[email protected]>
    [ sashal: adapted separate FF-A and SMC probe changes to the unified optee_probe() with optee_remove() cleanup ]
    Signed-off-by: Sasha Levin <[email protected]>

 
page_pool: always add GFP_NOWARN for ATOMIC allocations [+ + +]
Author: Jakub Kicinski <[email protected]>
Date:   Mon Oct 5 15:18:43 2026 +0200

    page_pool: always add GFP_NOWARN for ATOMIC allocations
    
    [ Upstream commit f3b52167a0cb23b27414452fbc1278da2ee884fc ]
    
    Driver authors often forget to add GFP_NOWARN for page allocation
    from the datapath. This is annoying to users as OOMs are a fact
    of life, and we pretty much expect network Rx to hit page allocation
    failures during OOM. Make page pool add GFP_NOWARN for ATOMIC allocations
    by default.
    
    Reviewed-by: Mina Almasry <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
params: Do not go over the limit when getting the string length [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Tue Sep 8 14:28:41 2026 -0400

    params: Do not go over the limit when getting the string length
    
    [ Upstream commit fd0cd057a1b7351604daa6ffc91dfe28adf7225d ]
    
    We can use strnlen() even on early stages and it prevents from
    going over the string boundaries in case it's already too long.
    
    Reviewed-by: Luis Chamberlain <[email protected]>
    Reviewed-by: Kees Cook <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Kees Cook <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

params: fix charp corruption on allocation failure [+ + +]
Author: Jiacheng Yu <[email protected]>
Date:   Tue Sep 8 14:28:45 2026 -0400

    params: fix charp corruption on allocation failure
    
    [ Upstream commit 3dfaae04243cde460d82dfc2a7dd0bb6664d20ae ]
    
    param_set_charp() stores charp parameters in allocated memory after slab is
    available, and releases the previous value when the parameter is updated.
    
    The previous value is released before the replacement allocation succeeds.
    If kmalloc_parameter() fails, the setter returns -ENOMEM with the parameter
    left as NULL.
    
    Failing zswap's compressor update before zswap is initialized can later
    trigger:
    
      BUG: kernel NULL pointer dereference, address: 0000000000000000
      RIP: 0010:strcmp+0x10/0x30
      Call Trace:
        zswap_setup+0x3b1/0x490
        zswap_enabled_param_set+0x5b/0xa0
        param_attr_store+0x93/0xe0
        module_attr_store+0x1c/0x30
        kernfs_fop_write_iter+0x116/0x1f0
    
    Allocate and copy the replacement first, then replace the parameter value
    only after allocation succeeds.
    
    Fixes: e180a6b7759a ("param: fix charp parameters set via sysfs")
    Cc: [email protected]
    Signed-off-by: Jiacheng Yu <[email protected]>
    Reviewed-by: Petr Pavlu <[email protected]>
    Signed-off-by: Petr Pavlu <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

params: Fix multi-line comment style [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Tue Sep 8 14:28:44 2026 -0400

    params: Fix multi-line comment style
    
    [ Upstream commit b5e3f86a47d34f7b8af899f8cc70520f6daf8b53 ]
    
    The multi-line comment style in the file is rather arbitrary.
    Make it follow the standard one.
    
    Reviewed-by: Luis Chamberlain <[email protected]>
    Reviewed-by: Kees Cook <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Kees Cook <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

params: Sort headers [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Tue Sep 8 14:28:43 2026 -0400

    params: Sort headers
    
    [ Upstream commit a05f096c2c0ca52e8fd34740c7d4b53ab3e7123e ]
    
    Sort the headers in alphabetic order in order to ease
    the maintenance for this part.
    
    Reviewed-by: Luis Chamberlain <[email protected]>
    Reviewed-by: Kees Cook <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Kees Cook <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

params: Use size_add() for kmalloc() [+ + +]
Author: Andy Shevchenko <[email protected]>
Date:   Tue Sep 8 14:28:42 2026 -0400

    params: Use size_add() for kmalloc()
    
    [ Upstream commit 0fc79cbc937f2a754a302a710a94b68c61d0a89a ]
    
    Prevent allocations from integer overflow by using size_add().
    
    Reviewed-by: Luis Chamberlain <[email protected]>
    Reviewed-by: Kees Cook <[email protected]>
    Signed-off-by: Andy Shevchenko <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Kees Cook <[email protected]>
    Stable-dep-of: 3dfaae04243c ("params: fix charp corruption on allocation failure")
    Signed-off-by: Sasha Levin <[email protected]>

 
PCI: Accept AtomicOps already enabled by the hypervisor [+ + +]
Author: Nikola Prica <[email protected]>
Date:   Mon Sep 21 13:19:03 2026 +0200

    PCI: Accept AtomicOps already enabled by the hypervisor
    
    [ Upstream commit 40cce45b921f7930886bcba43069edc579725457 ]
    
    pci_enable_atomic_ops_to_root() currently fails when no Root Port is
    visible. That is common in passthrough guests (ESXi, Hyper-V): the Endpoint
    is assigned to the VM, but the Root Port above it is not visible in the
    guest topology.
    
    In those setups the hypervisor may already have enabled AtomicOp Requester
    Enable on the device. If PCI_EXP_DEVCTL2_ATOMIC_REQ is set, treat AtomicOps
    as already enabled and return success instead of failing the Root Port
    walk.
    
    After 1ae8c4ce1570 ("PCI: Enable AtomicOps only if Root Port supports
    them"), pci_enable_atomic_ops_to_root() always returns failure if the Root
    Port is not visible, so drivers don't use atomics when they could.  On
    systems where the Root Port is not visible but *does* support AtomicOps,
    this is a regression: prior to 1ae8c4ce1570, it enabled AtomicOps in the
    endpoint and returned success.
    
    Fixes: 1ae8c4ce1570 ("PCI: Enable AtomicOps only if Root Port supports them")
    Signed-off-by: Nikola Prica <[email protected]>
    [bhelgaas: commit log, code comment]
    Signed-off-by: Bjorn Helgaas <[email protected]>
    Tested-by: Gerd Bayer <[email protected]>
    Reviewed-by: Christian König <[email protected]>
    Reviewed-by: Gerd Bayer <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
perf test bpf: Address error about non-null argument for epoll_pwait 2nd arg [+ + +]
Author: Arnaldo Carvalho de Melo <[email protected]>
Date:   Thu Oct 1 09:01:14 2026 -0700

    perf test bpf: Address error about non-null argument for epoll_pwait 2nd arg
    
    commit ed847e30f001b207013b6136c264454d7560557f upstream.
    
    First noticed on Fedora Rawhide:
    
      tests/bpf.c: In function ‘epoll_pwait_loop’:
      tests/bpf.c:36:17: error: argument 2 null where non-null expected [-Werror=nonnull]
         36 |                 epoll_pwait(-(i + 1), NULL, 0, 0, NULL);
            |                 ^~~~~~~~~~~
      In file included from tests/bpf.c:5:
      /usr/include/sys/epoll.h:134:12: note: in a call to function ‘epoll_pwait’ declared ‘nonnull’
        134 | extern int epoll_pwait (int __epfd, struct epoll_event *__events,
            |            ^~~~~~~~~~~
    
      [perfbuilder@27cfe44d67ed perf-6.5.0-rc2]$ gcc -v
      Using built-in specs.
      COLLECT_GCC=gcc
      COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/13/lto-wrapper
      OFFLOAD_TARGET_NAMES=nvptx-none
      OFFLOAD_TARGET_DEFAULT=1
      Target: x86_64-redhat-linux
      Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,objc,obj-c++,ada,go,d,m2,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-libstdcxx-backtrace --with-libstdcxx-zoneinfo=/usr/share/zoneinfo --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-13.2.1-20230728/obj-x86_64-redhat-linux/isl-install --enable-offload-targets=nvptx-none --without-cuda-driver --enable-offload-defaulted --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux --with-build-config=bootstrap-lto --enable-link-serialization=1
      Thread model: posix
      Supported LTO compression algorithms: zlib zstd
      gcc version 13.2.1 20230728 (Red Hat 13.2.1-1) (GCC)
      [perfbuilder@27cfe44d67ed perf-6.5.0-rc2]$
    
    Just add that argument to address this compiler warning.
    
    Cc: Adrian Hunter <[email protected]>
    Cc: Ian Rogers <[email protected]>
    Cc: Jiri Olsa <[email protected]>
    Cc: Namhyung Kim <[email protected]>
    Link: https://lore.kernel.org/lkml/[email protected]
    Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
    Signed-off-by: Florian Fainelli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
perf tools: Fix a asan issue in parse_events_multi_pmu_add() [+ + +]
Author: Namhyung Kim <[email protected]>
Date:   Thu Oct 1 09:01:13 2026 -0700

    perf tools: Fix a asan issue in parse_events_multi_pmu_add()
    
    commit 66c9598bd8916c6c1319d0100ac916cac89d4b0e upstream.
    
    In the parse_events_multi_pmu_add() it passes the 'config' variable
    twice to parse_events_term__num() - one for config and another for
    loc_term.  I'm not sure about the second one as it's converted to
    YYLTYPE variable.  Asan reports it like below:
    
      In function ‘parse_events_term__num’,
          inlined from ‘parse_events_multi_pmu_add’ at util/parse-events.c:1602:6:
      util/parse-events.c:2653:64: error: array subscript ‘YYLTYPE[0]’ is partly outside
                                          array bounds of ‘char[8]’ [-Werror=array-bounds]
       2653 |                 .err_term  = loc_term ? loc_term->first_column : 0,
            |                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
      util/parse-events.c: In function ‘parse_events_multi_pmu_add’:
      util/parse-events.c:1587:15: note: object ‘config’ of size 8
       1587 |         char *config;
            |               ^~~~~~
      cc1: all warnings being treated as errors
    
    Signed-off-by: Namhyung Kim <[email protected]>
    Acked-by: Ian Rogers <[email protected]>
    Cc: Adrian Hunter <[email protected]>
    Cc: Ingo Molnar <[email protected]>
    Cc: Jiri Olsa <[email protected]>
    Cc: Kan Liang <[email protected]>
    Cc: Leo Yan <[email protected]>
    Cc: Peter Zijlstra <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
    [florian: Resolve conflict in parse_events_multi_pmu_add() where term
     initialization is located inside the PMU scan loop in 5.10.y]
    Signed-off-by: Florian Fainelli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
perf/x86/intel: Remove anythread_deprecated bit from perf_capabilities [+ + +]
Author: Dapeng Mi <[email protected]>
Date:   Thu Sep 10 20:29:22 2026 -0400

    perf/x86/intel: Remove anythread_deprecated bit from perf_capabilities
    
    [ Upstream commit 8767b4d73018bd3143f4c55b672064fad292f11b ]
    
    AnyThread mode deprecation is enumerated by CPUID.0AH:EDX[15] instead of
    PERF_CAPABILITIES MSR. It's not a good practice to define a bit to
    represent "anythread deprecation" in perf_capabilities. It leads to the
    anythread_deprecated bit could be overwritten by the real value of
    PERF_CAPABILITIES MSR, just like the below code in update_pmu_cap() does.
    
    if (!intel_pmu_broken_perf_cap()) {
            /* Perf Metric (Bit 15) and PEBS via PT (Bit 16) are hybrid enumeration */
            rdmsrq(MSR_IA32_PERF_CAPABILITIES, hybrid(pmu, intel_cap).capabilities);
    }
    
    It leads to the anythread_deprecated bit is cleared to 0 and the "any"
    attribute is incorrectly shown in the /sys/devices/cpu/format/ folder on
    these support Perfmon v6 platforms, like Clearwater Forest.
    
    $ grep . /sys/devices/cpu/format/*
    /sys/devices/cpu/format/acr_mask:config2:0-63
    /sys/devices/cpu/format/any:config:21
    /sys/devices/cpu/format/cmask:config:24-31
    
    So remove the anythread_deprecated bit from perf_capabilities structure
    and directly depends on CPUID.0AH:EDX[15] to judge if anythread is
    deprecated.
    
    Fixes: cadbaa039b99 ("perf/x86/intel: Make anythread filter support conditional")
    Reported-by: Namhyung Kim <[email protected]>
    Signed-off-by: Dapeng Mi <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Reviewed-by: Zide Chen <[email protected]>
    Reviewed-by: Thomas Falcon <[email protected]>
    Acked-by: Namhyung Kim <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

 
perf: Require kernel access for text poke events [+ + +]
Author: Zhengchuan Liang <[email protected]>
Date:   Tue Oct 6 04:42:45 2026 -0400

    perf: Require kernel access for text poke events
    
    [ Upstream commit 357e8a77a501d96c9517f01f4a211eed5e9c9184 ]
    
    Perf events with exclude_kernel=1 can be opened without kernel perf
    access. However, exclude_kernel does not suppress text-poke sideband
    records. Every PERF_RECORD_TEXT_POKE is marked PERF_RECORD_MISC_KERNEL
    and contains a raw kernel instruction address.
    
    An unprivileged task can therefore open and mmap a task-local software
    event with text_poke=1. Both opening a count-only tracepoint event and
    configuring UDP GRO for ESP-in-UDP cause updates to inline static calls;
    the observer receives the relocated addresses of the modified instructions.
    For a known kernel image, any such address reveals the runtime kernel
    text base despite KASLR.
    
    Call perf_allow_kernel() whenever attr.text_poke is set, regardless of
    exclude_kernel. Events that neither monitor kernel execution nor request
    text-poke records retain their existing permissions.
    
    Fixes: e17d43b93e54 ("perf: Add perf text poke event")
    Assisted-by: LLM
    Signed-off-by: Zhengchuan Liang <[email protected]>
    Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/99131354c41e23188f778b92f90363775b482395.1790573390.git.zcliangcn@gmail.com
    [ sashal: Adapted the condition to the existing exclude_kernel check without callchain checks. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
pinctrl: sunxi: keep a shadow copy of the data register output latches [+ + +]
Author: Ilya Titov <[email protected]>
Date:   Wed Sep 30 07:19:31 2026 -0400

    pinctrl: sunxi: keep a shadow copy of the data register output latches
    
    [ Upstream commit a13f7f5d14af9baf34eb12c25962f8d3542b281d ]
    
    On Allwinner SoCs, reading a bank's data register returns the pin level,
    not the output latch, for pins that are muxed as inputs.  Writing a GPIO
    therefore corrupts the output latches of all input-muxed pins in the
    same bank: the read-modify-write in sunxi_pinctrl_gpio_set() reads back
    their pin levels and writes those into their latches.
    
    This breaks emulated open-drain lines (e.g. a bit-banged I2C bus from
    i2c-gpio).  Such a line is released high by muxing it as input and
    letting the pull-up raise it, so any concurrent GPIO write in the same
    bank stores 1 into its latch.  Driving the line low afterwards is a
    non-atomic data-then-mux sequence in sunxi_pinctrl_gpio_direction_output();
    if the poisoning write lands between the two steps, the pin actively
    drives high (push-pull) instead of low.
    
    Observed in practice as sporadic glitches on a T507 board bit-banging
    I2C on port E while other PE GPIOs are toggled.  On a scope the failure
    is unmistakable: on a clock pulse where SCL should fall to GND, the line
    instead steps *above* its idle high level for the whole low phase — the
    pad drives a strong push-pull 3.3 V high, higher than the level the
    pull-up sustains on the loaded bus — before the next transition recovers
    it.  The same can hit SDA, corrupting data instead of clocks.
    
    Steps to reproduce on any sunxi board with a bit-banged (i2c-gpio) bus:
    
      # background: toggle any other GPIO of the same bank, e.g. line 21
      gpioset -c <chip> --toggle 100us 21=0 &
    
      # foreground: keep the bit-banged bus busy
      while :; do i2cdetect -y <bus> 0x50 0x57; done
    
      # watch SCL/SDA with a scope or logic analyzer: sporadic clock-low
      # phases driven high (above the pull-up level) instead of low
    
    The bank spinlock cannot help: the racing write is a perfectly valid
    whole-register RMW that faithfully writes back what the hardware
    returned.  There are no set/clear registers on this IP to write a single
    bit atomically.
    
    Fix it the same way gpio-mmio handles hardware whose data register read
    does not return the output latch: keep a shadow copy of each bank's
    latches, base the read-modify-write on the shadow, and only write the
    register.  The shadow is seeded from the hardware at probe time so pins
    left in output mode by the bootloader keep their state.  Pins that reach
    output mode through the gpiolib paths write their value (and thereby
    their shadow bit) before the mux switch in
    sunxi_pinctrl_gpio_direction_output(); pins muxed to gpio_out directly
    through a pinmux node bypass that path, so sunxi_pmx_set() refreshes
    their shadow bit from the latch (readable once the pin is in output
    mode) to keep them driving their pre-existing level.
    
    Seeding the shadow reads the PIO registers at probe time, which requires
    the bus clock to be enabled.  The clock was only requested at the very
    end of probe, after devm_pinctrl_register() had already claimed the pin
    hogs described in the device tree - which mux pins, and thus access
    registers, with the clock still gated.  Move the request ahead of both.
    Boards whose bootloader leaves the PIO clock running are unaffected,
    which is why the pre-existing hog problem has gone unnoticed since
    commit 950707c0eb5c ("pinctrl: sunxi: add clock support").
    
    Fixes: df7b34f4c3d2 ("pinctrl: sunxi: Fix gpio_set behaviour")
    Cc: [email protected]
    Signed-off-by: Ilya Titov <[email protected]>
    Signed-off-by: Linus Walleij <[email protected]>
    [ Removed the pctl argument from two sunxi_data_reg() calls to match the older four-argument API. ]
    Signed-off-by: Sasha Levin <[email protected]>

pinctrl: sunxi: Refactor register/offset calculation [+ + +]
Author: Samuel Holland <[email protected]>
Date:   Wed Sep 30 07:19:29 2026 -0400

    pinctrl: sunxi: Refactor register/offset calculation
    
    [ Upstream commit 0bb95ae2672f9e00f471598a515bf4e9c2005046 ]
    
    Starting with the D1/D1s/T113 SoC, Allwinner changed the layout of the
    pinctrl registers. This new layout widens the drive level field, which
    affects the pull register offset and the overall bank size.
    
    As a first step to support this, combine the register and offset
    calculation functions, and refactor the math to depend on one constant
    for field widths instead of three. This minimizes the code size impact
    of making some of the factors dynamic.
    
    While rewriting these functions, move them to the implementation file,
    since that is the only file where they are used. And make the comment
    more generic, without mentioning specific offsets/sizes.
    
    The callers are updated to expect a shifted mask, and to use consistent
    terminology (reg/shift/mask/val).
    
    Reviewed-by: Heiko Stuebner <[email protected]>
    Reviewed-by: Jernej Skrabec <[email protected]>
    Tested-by: Heiko Stuebner <[email protected]>
    Signed-off-by: Samuel Holland <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Linus Walleij <[email protected]>
    Stable-dep-of: a13f7f5d14af ("pinctrl: sunxi: keep a shadow copy of the data register output latches")
    Signed-off-by: Sasha Levin <[email protected]>

pinctrl: sunxi: Use devm_clk_get_enabled() helpers [+ + +]
Author: Wang Jianzheng <[email protected]>
Date:   Wed Sep 30 07:19:30 2026 -0400

    pinctrl: sunxi: Use devm_clk_get_enabled() helpers
    
    [ Upstream commit 7dc92ece32ed87a352e285e3d9f0d392b61443e2 ]
    
    sunxi sunxi_pinctrl_init_with_variant get, enable clk and
    deinit_device disable and unprepare it.
    
    This simplifes the code and avoids the calls to
    clk_disable_unprepare().
    
    Signed-off-by: Wang Jianzheng <[email protected]>
    Link: https://lore.kernel.org/[email protected]
    Signed-off-by: Linus Walleij <[email protected]>
    Stable-dep-of: a13f7f5d14af ("pinctrl: sunxi: keep a shadow copy of the data register output latches")
    Signed-off-by: Sasha Levin <[email protected]>

 
pipe: preserve existing fasync readers on writer setup failure [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Fri Oct 2 06:17:05 2026 +0000

    pipe: preserve existing fasync readers on writer setup failure
    
    [ Upstream commit 40bb03d3ea6f6a915218508819ecc4d7a7fa260d ]
    
    F_SETFL and FIOASYNC decide whether to invoke ->fasync() before
    pipe_fasync() takes pipe->mutex. Two enables of one O_RDWR FIFO can
    therefore both enter the callback.
    
    fasync_helper() allocates before checking for an existing entry. If the
    first enable installs both entries, a second enable can update the
    reader entry and then fail the allocation for the writer entry. The
    error path removes the pre-existing reader entry, clearing FASYNC while
    the writer entry remains registered. __fput() then skips ->fasync(), so a
    later pipe notification can dereference the freed file or its f_owner.
    An unprivileged memory-pressure reproducer triggers a KASAN
    slab-use-after-free in send_sigio() through this path.
    
    Keep the reader helper's result and undo the registration only if this
    call added it. The pipe mutex serializes changes to both lists, so a
    failed new registration still removes its reader, while a failed
    duplicate preserves the existing registrations and FASYNC. Successful
    duplicate enables continue to update fa_fd as before.
    
    Fixes: 76398425bb06 ("Move FASYNC bit handling to f_op->fasync()")
    Signed-off-by: Kyle Zeng <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
pmdomain: rockchip: don't ignore clock lookup errors on attach [+ + +]
Author: Shawn Lin <[email protected]>
Date:   Tue Oct 13 12:05:02 2026 -0400

    pmdomain: rockchip: don't ignore clock lookup errors on attach
    
    [ Upstream commit 4c66c423593e26273ea0d644906ed007630c6f6d ]
    
    rockchip_pd_attach_dev() treated every of_clk_get() error as the end
    of the clock list, so a clock that exists but is not available yet
    (e.g. -EPROBE_DEFER) was silently skipped and the device ended up
    without pm_clk management.  Only -ENOENT means there are no more
    clocks.
    
    Fixes: 7c696693a4f5 ("soc: rockchip: power-domain: Add power domain driver")
    Signed-off-by: Shawn Lin <[email protected]>
    Reviewed-by: Sebastian Reichel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Ulf Hansson <[email protected]>
    [ sashal: adjusted the patch to the Rockchip power-domain driver's older source location ]
    Signed-off-by: Sasha Levin <[email protected]>

pmdomain: rockchip: fix clock leak on domain probe failure [+ + +]
Author: Shawn Lin <[email protected]>
Date:   Tue Oct 13 12:05:08 2026 -0400

    pmdomain: rockchip: fix clock leak on domain probe failure
    
    [ Upstream commit d8b3847770661b7109146e6479eeadcdab9cecf0 ]
    
    When of_clk_get() failed in the middle of the loop, the references of
    the clocks acquired so far were leaked instead of being released by
    the error path.
    
    Fixes: d909072d0521 ("soc: rockchip: power-domain: use clk_bulk APIs")
    Signed-off-by: Shawn Lin <[email protected]>
    Reviewed-by: Sebastian Reichel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Ulf Hansson <[email protected]>
    [ sashal: adjusted for the Rockchip power-domain driver residing in the SoC subsystem. ]
    Signed-off-by: Sasha Levin <[email protected]>

pmdomain: rockchip: propagate subdomain add errors [+ + +]
Author: Shawn Lin <[email protected]>
Date:   Tue Oct 13 12:04:56 2026 -0400

    pmdomain: rockchip: propagate subdomain add errors
    
    [ Upstream commit 4c0d69d677cf5b0065ebbb3ceb8ba66fddbec630 ]
    
    rockchip_pm_add_subdomain() ignored the return value of its recursive
    call, so a failure deeper in the hierarchy was silently dropped and
    probe still succeeded with an incomplete domain tree.
    
    Fixes: 6be05b5ec161 ("soc: rockchip: power-domain: add support for sub-power domains")
    Signed-off-by: Shawn Lin <[email protected]>
    Reviewed-by: Sebastian Reichel <[email protected]>
    Cc: [email protected]
    Signed-off-by: Ulf Hansson <[email protected]>
    [ sashal: Adapted to the Rockchip power-domain driver’s older location in the SoC subsystem. ]
    [ sashal: goto err_out instead of return, so the np reference taken by for_each_child_of_node() is dropped ]
    Signed-off-by: Sasha Levin <[email protected]>

 
power: supply: bq24257: fix use-after-free on remove [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 12:57:54 2026 -0400

    power: supply: bq24257: fix use-after-free on remove
    
    [ Upstream commit 9d34c9d660c3d0931d2cc749c46c47cf31f96e48 ]
    
    The STAT-pin interrupt is devm-managed, so it stays armed until the devm
    cleanup that runs after remove() returns. remove() cancels
    bq->iilimit_setup_work while the threaded handler can still fire; that
    handler reschedules the work and dereferences bq, so the work runs
    against freed memory once devm frees bq.
    
    Make the delayed work device-managed with devm_delayed_work_autocancel(),
    registered before the interrupt request. The devm cleanup then releases
    the interrupt first, so the handler can no longer reschedule the work,
    and cancels the work before bq is freed. The explicit
    cancel_delayed_work_sync() in remove() is no longer needed and is dropped.
    
    Found by static analysis.
    
    Fixes: 2219a935963e ("power_supply: Add TI BQ24257 charger driver")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sebastian Reichel <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: ds2780: Fix ds2780_get_capacity() returning raw value [+ + +]
Author: Xueqin Luo <[email protected]>
Date:   Tue Sep 1 15:29:54 2026 +0800

    power: supply: ds2780: Fix ds2780_get_capacity() returning raw value
    
    [ Upstream commit a58cbc8b36ec0cd00d2ba3de7d003de818a27523 ]
    
    ds2780_get_capacity() returns the raw register value instead of 0 on
    success.  The capacity is already stored in *capacity, so the function
    should return 0 to indicate success.
    
    Fixes: 275ac74629c4 ("w1: add Maxim/Dallas DS2780 Stand-Alone Fuel Gauge IC support")
    Signed-off-by: Xueqin Luo <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sebastian Reichel <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: max17040: Convert to i2c's .probe_new() [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Wed Sep 9 07:28:23 2026 -0400

    power: supply: max17040: Convert to i2c's .probe_new()
    
    [ Upstream commit a07fca69378c26ea034826feb0011256e25ad237 ]
    
    .probe_new() doesn't get the i2c_device_id * parameter, so determine
    that explicitly in the probe function.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Sebastian Reichel <[email protected]>
    Stable-dep-of: 4e4b9f5ce9df ("power: supply: max17040: drop incorrect I2C functionality check")
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: max17040: drop incorrect I2C functionality check [+ + +]
Author: Jianing Li <[email protected]>
Date:   Wed Sep 9 07:28:24 2026 -0400

    power: supply: max17040: drop incorrect I2C functionality check
    
    [ Upstream commit 4e4b9f5ce9dfb8ed4b8d1262a504b8043ac09d87 ]
    
    max17040_probe() rejects adapters that do not advertise
    I2C_FUNC_SMBUS_BYTE. The driver does not issue SMBus byte transactions,
    however. Its regmap has 8-bit registers and 16-bit big-endian values, for
    which regmap-i2c supports either raw I2C transfers or SMBus word-data
    transactions.
    
    Consequently, an adapter providing raw I2C transfers or SMBus word data
    but not SMBus byte transactions is rejected even though regmap can access
    the device. Conversely, the current check can pass an adapter that regmap
    cannot use.
    
    Drop the stale check and let devm_regmap_init_i2c() validate and select
    the supported transfer method.
    
    Fixes: 6455a8a84bdfd ("power: supply: max17040: Use regmap i2c")
    Cc: [email protected]
    Signed-off-by: Jianing Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [Fixed Fixes tag, so that it points to the regmap introduction instead of the initial driver addition]
    Signed-off-by: Sebastian Reichel <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: rt9455: Convert to i2c's .probe_new() [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Wed Sep 9 07:31:19 2026 -0400

    power: supply: rt9455: Convert to i2c's .probe_new()
    
    [ Upstream commit 2adfc4370ebb745380a44c3e5418486a32a9ba67 ]
    
    The probe function doesn't make use of the i2c_device_id * parameter so it
    can be trivially converted.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Sebastian Reichel <[email protected]>
    Stable-dep-of: 3e7a1ebc32fa ("power: supply: rt9455: quiesce delayed work before teardown")
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: rt9455: quiesce delayed work before teardown [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 07:31:20 2026 -0400

    power: supply: rt9455: quiesce delayed work before teardown
    
    [ Upstream commit 3e7a1ebc32fad5a558254a478efd401c17a24381 ]
    
    The threaded IRQ handler can queue pwr_rdy_work,
    max_charging_time_work and batt_presence_work.  pwr_rdy_work and
    batt_presence_work can also queue max_charging_time_work, while
    batt_presence_work can requeue itself.
    
    rt9455_remove() cancels max_charging_time_work before
    batt_presence_work.  The latter can therefore queue
    max_charging_time_work after it has already been cancelled:
    
      rt9455_remove()                   workqueue
        cancel pwr_rdy_work
        cancel max_charging_time_work
                                          batt_presence_work queues
                                            max_charging_time_work
        cancel batt_presence_work
        return
        devres frees rt9455_info
                                          max_charging_time_work dereferences
                                            rt9455_info
    
    The IRQ also remains registered until devres cleanup and can queue more
    work after any of the cancellation calls.  If rt9455_hw_init() fails
    after the IRQ has been requested, probe returns without cancelling work
    that may already have been queued.  A pending callback can then access
    rt9455_info after it has been freed.
    
    Register rt9455_cancel_all_delayed_works() through
    devm_add_action_or_reset() right after devm_power_supply_register().
    devres invokes the action in reverse registration order, after the
    managed IRQ has been freed and before rt9455_info is released, so the
    delayed works are drained in both rt9455_remove() and the probe error
    path.  Cancel pwr_rdy_work and batt_presence_work before
    max_charging_time_work because both can queue the latter.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: e86d69dd786e ("power_supply: Add support for Richtek RT9455 battery charger")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sebastian Reichel <[email protected]>
    [ retained the int-returning rt9455_remove() callback required by the older I²C interface. ]
    Signed-off-by: Sasha Levin <[email protected]>

power: supply: ucs1002: fix use-after-free on remove [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 13:03:50 2026 -0400

    power: supply: ucs1002: fix use-after-free on remove
    
    [ Upstream commit 609af0ceeaefdfa42cd01dd060b20f2e41f9a232 ]
    
    ucs1002 has no remove callback, so unbind runs entirely through devm.
    The alert IRQ handler queues the health_poll delayed work, and the work
    reschedules itself while the chip reports a bad-health condition.  devm
    frees the alert IRQ, which only synchronizes the handler; it does not
    cancel the delayed work, which can then run after devm frees the driver
    data and dereference it.
    
    Register health_poll with devm_delayed_work_autocancel() before the
    alert IRQ is requested.  devm then frees the IRQ before cancelling the
    work, so the handler can no longer queue it and the work is cancelled
    before the driver data is freed.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 81196e2e57fc ("power: supply: ucs1002: fix some health status issues")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Reviewed-by: Lucas Stach <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sebastian Reichel <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
RDMA/hns: Fix WQ_MEM_RECLAIM warning [+ + +]
Author: Chengchang Tang <[email protected]>
Date:   Sun Jan 4 14:40:54 2026 +0800

    RDMA/hns: Fix WQ_MEM_RECLAIM warning
    
    commit c0a26bbd3f99b7b03f072e3409aff4e6ec8af6f6 upstream.
    
    When sunrpc is used, if a reset triggered, our wq may lead the
    following trace:
    
    workqueue: WQ_MEM_RECLAIM xprtiod:xprt_rdma_connect_worker [rpcrdma]
    is flushing !WQ_MEM_RECLAIM hns_roce_irq_workq:flush_work_handle
    [hns_roce_hw_v2]
    WARNING: CPU: 0 PID: 8250 at kernel/workqueue.c:2644 check_flush_dependency+0xe0/0x144
    Call trace:
      check_flush_dependency+0xe0/0x144
      start_flush_work.constprop.0+0x1d0/0x2f0
      __flush_work.isra.0+0x40/0xb0
      flush_work+0x14/0x30
      hns_roce_v2_destroy_qp+0xac/0x1e0 [hns_roce_hw_v2]
      ib_destroy_qp_user+0x9c/0x2b4
      rdma_destroy_qp+0x34/0xb0
      rpcrdma_ep_destroy+0x28/0xcc [rpcrdma]
      rpcrdma_ep_put+0x74/0xb4 [rpcrdma]
      rpcrdma_xprt_disconnect+0x1d8/0x260 [rpcrdma]
      xprt_rdma_connect_worker+0xc0/0x120 [rpcrdma]
      process_one_work+0x1cc/0x4d0
      worker_thread+0x154/0x414
      kthread+0x104/0x144
      ret_from_fork+0x10/0x18
    
    Since QP destruction frees memory, this wq should have the WQ_MEM_RECLAIM.
    
    Fixes: ffd541d45726 ("RDMA/hns: Add the workqueue framework for flush cqe handler")
    Signed-off-by: Chengchang Tang <[email protected]>
    Signed-off-by: Junxian Huang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Leon Romanovsky <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Roman Demidov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
rds_tcp: close NULL deref window in rds_tcp_set_callbacks [+ + +]
Author: Maoyi Xie <[email protected]>
Date:   Fri Oct 2 18:50:55 2026 -0700

    rds_tcp: close NULL deref window in rds_tcp_set_callbacks
    
    commit d2bfdbb69cf87676981b1043010b6224d84c6d3a upstream.
    
    rds_tcp_set_callbacks() links a new rds_tcp_connection onto
    rds_tcp_tc_list under rds_tcp_tc_list_lock. It releases the
    lock, then assigns tc->t_sock = sock outside the lock.
    
    rds_tcp_tc_info() and rds6_tcp_tc_info() walk rds_tcp_tc_list
    under the same lock. Both dereference tc->t_sock->sk without
    a NULL check.
    
    A reader can acquire rds_tcp_tc_list_lock between the writer's
    spin_unlock and the t_sock store. It then sees a list entry
    whose t_sock is NULL. The dereference of tc->t_sock->sk is a
    NULL access.
    
    Move tc->t_sock = sock inside rds_tcp_tc_list_lock, before
    list_add_tail. A reader holding the lock then observes the
    linkage and the t_sock store together.
    
    The restore path is safe. rds_tcp_restore_callbacks() does
    list_del_init inside the lock. The matching tc->t_sock = NULL
    after unlink is harmless to readers holding the lock.
    
    Fixes: 70041088e3b9 ("RDS: Add TCP transport to RDS")
    Suggested-by: Simon Horman <[email protected]>
    Signed-off-by: Maoyi Xie <[email protected]>
    Reviewed-by: Allison Henderson <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    
    [ achender: resolved context conflict; tc->t_rtn initialization is not
      present in this tree ]
    Signed-off-by: Allison Henderson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
regulator: ltc3676: don't read the write-only HRST and CLIRQ registers [+ + +]
Author: Abhishek Ojha <[email protected]>
Date:   Tue Sep 1 21:07:01 2026 -0400

    regulator: ltc3676: don't read the write-only HRST and CLIRQ registers
    
    commit 28c2388ee24cdbefbcc458fa41ef7bffaaa1cc83 upstream.
    
    HRST (0x1e) and CLIRQ (0x1f) are write-only command strobes. Writing HRST
    triggers a hard reset of the chip and writing CLIRQ clears the interrupt;
    reading them returns nothing useful, and the read itself fires the command.
    
    The result is that a plain register dump resets the board:
    
      cat /sys/kernel/debug/regmap/2-003c/registers
    
    walks every readable register, hits HRST, and the board reboots.
    
    Split the callback back in two so HRST and CLIRQ stay writable but are no
    longer readable. The readable range is left unchanged
    (LTC3676_BUCK1 ... LTC3676_IRQSTAT).
    
    Fixes: 37b918a034fe ("regulator: Add LTC3676 support")
    Cc: [email protected]
    Signed-off-by: Abhishek Ojha <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
Revert "scsi: sd: sd_zbc: Use logical blocks as unit when querying zones" [+ + +]
Author: Sasha Levin <[email protected]>
Date:   Tue Oct 6 11:07:46 2026 -0400

    Revert "scsi: sd: sd_zbc: Use logical blocks as unit when querying zones"
    
    This reverts commit cab3909d1be51cf1caa78ac8683e4bb69aab4c4f, the 5.10.y
    backport of upstream 43af5da09efb.
    
    As Simon Liebold found for the identical 5.15.y backport, the change
    makes sd_zbc_report_zones() advance with
    
            lba += sdkp->zone_blocks * i;
    
    zone_blocks is u32, so the product is computed in 32 bits and wraps
    before being widened into the 64-bit lba. A host-managed SMR drive that
    returns 8192 or more zones in one REPORT ZONES has the next batch
    requested at a wrapped LBA, zone revalidation fails, and sd truncates
    the device to zero capacity.
    
    Mainline never shipped this form: c976e588b34e ("scsi: sd: sd_zbc: Hide
    gap zones") rewrote the loop in the same series, and it is not in
    5.10.y. 43af5da09efb is only a cleanup, and the scsi_debug fix that
    pulled it in as a dependency (93dde0bf2f39) touches only scsi_debug.c,
    so revert it.
    
    Link: https://lore.kernel.org/stable/[email protected]/
    Signed-off-by: Sasha Levin <[email protected]>

 
Revert "wifi: libertas: reject short monitor TX frames" [+ + +]
Author: Johannes Berg <[email protected]>
Date:   Wed Oct 7 22:42:08 2026 +0200

    Revert "wifi: libertas: reject short monitor TX frames"
    
    commit 9727d1c4e1c971fc42b049b645fdda6852758835 upstream.
    
    This reverts commit 13ff543e0b2c713aedeaadadde686686e949dc78.
    
    The 'goto free' just made things worse, causing a spinlock
    to be handled incorrectly. Revert this for now.
    
    Reported-by: Takashi Iwai <[email protected]>
    Cc: [email protected]
    Fixes: 13ff543e0b2c ("wifi: libertas: reject short monitor TX frames")
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
ring-buffer: Acquire the lock with irqsave in rb_wake_up_waiters() [+ + +]
Author: Sebastian Andrzej Siewior <[email protected]>
Date:   Wed Sep 16 21:13:34 2026 -0400

    ring-buffer: Acquire the lock with irqsave in rb_wake_up_waiters()
    
    [ Upstream commit 815e07c8fe885a87751c2496a30ae0dcd4118210 ]
    
    rb_wake_up_waiters() is a irq_work callback which is initialized with
    init_irq_work(). As such it will be invoked in thread context on
    PREEMPT_RT. Invoking the callback in IRQ context on PREEMPT_RT is not an
    option due its usage of wake_up_all().  Since this callback may run in
    thread context, it needs to acquire ring_buffer_per_cpu::reader_lock with
    disabling interrupts and may not assume that they are disabled.
    
    Use raw_spinlock_irqsave() to acquire ring_buffer_per_cpu::reader_lock.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: 68282dd930ea3 ("ring-buffer: Fix resetting of shortest_full")
    Reviewed-by: Vincent Donnefort <[email protected]>
    Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    [ Replaced scoped_guard() with explicit raw_spin_lock_irqsave()/raw_spin_unlock_irqrestore() calls for GNU89 compatibility. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
rtc: spear: initialize IRQ state before requesting alarm IRQ [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Wed Sep 2 16:03:18 2026 +0800

    rtc: spear: initialize IRQ state before requesting alarm IRQ
    
    commit 055ef5ce9f67a6a3a1363fa663007f8196cc0fb8 upstream.
    
    devm_request_irq() enables the interrupt before it returns, so the handler
    may run while probe is still initializing the device. Initialize the MMIO
    address and spinlock before requesting the alarm IRQ.
    
    Fixes: 0942a71e435f ("rtc: add support for spear rtc")
    Cc: [email protected]
    Assisted-by: Codex:GPT-5
    Signed-off-by: Runyu Xiao <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Alexandre Belloni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
s390/ctcm: Prevent XID null dereference [+ + +]
Author: Aswin Karuvally <[email protected]>
Date:   Thu Aug 27 08:34:08 2026 +0200

    s390/ctcm: Prevent XID null dereference
    
    commit b264d8422779d69febce914efc47a92a85cc382c upstream.
    
    The mpc_validate_xid() function sets grp->saved_xid2->xid2_flag2 to 0x40
    to signal XID validation error. If peer XID is NULL or r/w channel
    pairing mismatch happens, grp->saved_xid2 is never initialized. An
    attempt to set the flag in such case leads to NULL dereference.
    
    Fix this by using the always available priv->xid->xid2_flag2 instead of
    grp->saved_xid2->xid2_flag2 for validation errors.
    
    Fixes: 293d984f0e36 ("ctcm: infrastructure for replaced ctc driver")
    Cc: [email protected]
    Signed-off-by: Aswin Karuvally <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
s390/pci: Fix leak of uninitialized kernel data in SCLP report [+ + +]
Author: Niklas Schnelle <[email protected]>
Date:   Thu Aug 6 11:43:39 2026 +0200

    s390/pci: Fix leak of uninitialized kernel data in SCLP report
    
    commit 8ac60ae2a307a50b599bf5d300b448d638f3ba29 upstream.
    
    While report_error_write() checks that the provided buffer is at least
    as large as the header struct, but not that it is large enough to
    contain the report with the length claimed by report->length. If
    user-space provides a short buffer, meaning a larger report->length than
    the actually written payload, up to around 4K of kernel data from past
    the kmalloc(len + 1) sized buffer allocated in kernfs_fop_write_iter()
    will leak into the SCLP report.
    
    However, as the entity processing the SCLP is privileged and able to
    access at least the page including the report, this does not leak data
    that entity could not access but it is still an out of bounds read and
    a malformed error report that should be rejected.
    
    Fixes: 368704a65be8 ("s390/pci: add report_error attribute")
    Cc: [email protected]
    Signed-off-by: Niklas Schnelle <[email protected]>
    Reviewed-by: Benjamin Block <[email protected]>
    Signed-off-by: Vasily Gorbik <[email protected]>
    Signed-off-by: Heiko Carstens <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
samples: pidfd: fix userprogs typo [+ + +]
Author: Sasha Levin <[email protected]>
Date:   Sun Oct 11 18:33:42 2026 -0400

    samples: pidfd: fix userprogs typo
    
    [ Upstream commit f1365f97fb7498d805981102eee22d362ae643f2 ]
    
    The Makefile adds pidfd-metadata to "usertprogs-always-y", which kbuild
    does not know, so the sample has not been built since the conversion to
    userprogs, even with CONFIG_SAMPLE_PIDFD=y.
    
    Fix the variable name. pidfd-metadata.c builds without warnings with
    gcc and clang for x86_64 and arm64.
    
    Fixes: 60fb0b1239719 ("samples: pidfd: build sample program for target architecture")
    Signed-off-by: Sasha Levin <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Christian Brauner <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
scsi: ch: Do not keep references to data transfer element devices [+ + +]
Author: Ahmed Abdelhaleem Ahmed <[email protected]>
Date:   Tue Oct 13 14:52:23 2026 -0400

    scsi: ch: Do not keep references to data transfer element devices
    
    [ Upstream commit 27c0f718d3b3c99e6d315308e95d987d0382a8a8 ]
    
    ch_readconfig() looks up the scsi_device of every data transfer element
    whose SCSI id the changer reports in READ ELEMENT STATUS, and stores it in
    ch->dt[]. scsi_device_lookup() takes a reference, and nothing ever drops
    it: ch_destroy() frees the array with kfree(). ch->dt[] is read nowhere
    else - it only supplies the vendor, model and revision printed in the same
    loop.
    
    Once such a drive is removed, its scsi_device can never be released. It
    stays on the host's device list at its address, so a new device there is
    refused by anything that walks the list - target_core_pscsi reports
    "scsi_device_get() failed for H:C:T:L" - and the low-level driver's module
    can no longer be unloaded. Only a reboot recovers.
    
    It shows with any changer that reports its drives' ids; with the mhvtl
    virtual library (IBM 3573-TL personality), each create and remove of a
    library with four drives leaves four references behind, counted by the
    module's use count in lsmod. With ch not bound the count is unchanged, and
    with this patch applied it is unchanged too.
    
    Drop the reference as soon as the name has been printed, and remove the now
    unused dt[] array. That also removes the array leaked when ch_probe() fails
    after ch_readconfig().
    
    The same leak was reported with an RFC patch in 2022, which was not merged.
    
    Fixes: daa6eda65a53 ("[SCSI] add scsi changer driver")
    Cc: [email protected]
    Link: https://lore.kernel.org/linux-scsi/[email protected]/
    Signed-off-by: Ahmed Abdelhaleem Ahmed <[email protected]>
    Reviewed-by: Laurence Oberman <[email protected]>
    Fixes: daa6eda65a53 ("[SCSI] add scsi changer driver")
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ sashal: adapted removal of kzalloc_objs() to the existing kcalloc() allocation ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: libiscsi: Reject a negative task index from parse_pdu_itt [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Oct 7 10:58:40 2026 +0900

    scsi: libiscsi: Reject a negative task index from parse_pdu_itt
    
    commit 8ee2a09a1dbb257c9e828ad2497f8e4832dfb142 upstream.
    
    A transport that implements parse_pdu_itt hands libiscsi an index taken
    from the PDU, and both lookups bound it from above only:
    
          if (i >= session->cmds_max)
    
    i and cmds_max are both int, so a negative index passes and
    session->cmds[i] is read from before the array.
    
    be2iscsi produces one. beiscsi_parse_pdu() assigns the raw tag,
    
          *index = (int)itt;
    
    and beiscsi_complete_pdu() forwards an unsolicited NOP-In from the
    hardware async ring without replacing its ITT, so the value is the
    target's. It also reports the session's own age rather than the one in
    the tag, which leaves the age comparison in iscsi_verify_itt() with
    nothing to reject.
    
    Bound the index from below in both lookups.
    
    Fixes: bfead3b2cb46 ("[SCSI] be2iscsi: Adding msix and mcc_rings V3")
    Cc: [email protected]
    Reviewed-by: Mike Christie <[email protected]>
    Signed-off-by: Yehyeong Lee <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

scsi: libiscsi: Validate the ITT reflected in a Reject PDU [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Oct 7 10:58:41 2026 +0900

    scsi: libiscsi: Validate the ITT reflected in a Reject PDU
    
    commit c5958c770b2a0ee492414e26b07da9164a0d1f5d upstream.
    
    A Reject PDU carries a copy of the header it rejects, and
    iscsi_handle_reject() takes the ITT out of that copy to find the task to
    clean up:
    
          memcpy(&rejected_pdu, data, sizeof(struct iscsi_hdr));
          ...
          task = iscsi_itt_to_task(conn, rejected_pdu.itt);
    
    That value is whatever the target put there. iscsi_itt_to_task() bounds
    the index against cmds_max and checks nothing else, so any task in the
    pool can be named, and iscsi_nop_out_rsp() then completes it.
    
    An index that has never been used gives a NULL task->conn: the pool is
    zeroed at session setup and conn is assigned only when a task is
    allocated. If the task was used and returned, iscsi_complete_task() hits
    its WARN_ON_ONCE(task->state == ISCSI_TASK_FREE) and the refcount
    underflows. An in-flight SCSI command is completed as successful - a 1
    MiB read returned 1048576 with none of its buffer written and no
    warning.
    
    Validate the reflected ITT the way iscsi_itt_to_ctask() validates a
    command ITT, and require the task to be in flight and not a SCSI
    command.
    
    [    6.248477] Oops: general protection fault, probably for non-canonical address 0xdffffc000000000c: 0000 [#1] SMP KASAN NOPTI
    [    6.249357] KASAN: null-ptr-deref in range [0x0000000000000060-0x0000000000000067]
    [    6.249951] CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 7.2.0-rc5-ISCSI1-gf5098b6bae76 #1 PREEMPT(lazy)
    [    6.250718] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
    [    6.251616] RIP: 0010:iscsi_nop_out_rsp.constprop.0+0x46/0x160
    [    6.252043] Code: c1 ea 03 48 83 ec 08 80 3c 02 00 0f 85 f5 00 00 00 48 b8 00 00 00 00 00 fc ff df 48 8b 6b 58 48 8d 7d 60 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 c0 00 00 00 48 8b 45 60 48 39 c3 74 50 48 b8 00
    [    6.252813] RSP: 0018:ffff88806c907b80 EFLAGS: 00010206
    [    6.253042] RAX: dffffc0000000000 RBX: ffff88800607e000 RCX: ffffffff8d571a25
    [    6.253345] RDX: 000000000000000c RSI: ffff88806c907c38 RDI: 0000000000000060
    [    6.253642] RBP: 0000000000000000 R08: 0000000000000000 R09: fffffbfff235a504
    [    6.253947] R10: 0000000000000003 R11: 7463656e6e6f6320 R12: 0000000000000000
    [    6.254251] R13: 0000000000000000 R14: ffff88806c907c38 R15: 0000000000000000
    [    6.254549] FS:  0000000000000000(0000) GS:ffff8880d95bc000(0000) knlGS:0000000000000000
    [    6.254887] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    6.255140] CR2: 00007fc393e8ffc0 CR3: 0000000005252006 CR4: 0000000000770ef0
    [    6.255439] PKRU: 55555554
    [    6.255564] Call Trace:
    [    6.255674]  <IRQ>
    [    6.255768]  __iscsi_complete_pdu+0x18bf/0x22a0
    [    6.256733]  iscsi_complete_pdu+0x54/0xa0
    [    6.256905]  iscsi_tcp_data_recv_done+0xf4/0x250
    [    6.257103]  iscsi_tcp_recv_skb+0x31e/0xec0
    [    6.257680]  iscsi_sw_tcp_recv+0x12f/0x390
    [    6.258061]  __tcp_read_sock+0x1ab/0x810
    [    6.258853]  iscsi_sw_tcp_data_ready+0x18b/0x510
    [    6.259808]  tcp_data_queue+0x1f13/0x4cd0
    [    6.260567]  tcp_rcv_established+0x8a5/0x3a00
    [    6.261931]  tcp_v4_do_rcv+0x449/0x960
    [    6.262269]  tcp_v4_rcv+0x2245/0x3bc0
    
    Fixes: 8afa1439fcff ("[SCSI] libiscsi: handle immediate command rejections")
    Cc: [email protected]
    Reviewed-by: Mike Christie <[email protected]>
    Signed-off-by: Yehyeong Lee <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

scsi: libiscsi: Validate the task named by a management response [+ + +]
Author: Yehyeong Lee <[email protected]>
Date:   Wed Oct 7 10:58:42 2026 +0900

    scsi: libiscsi: Validate the task named by a management response
    
    commit 11bffcd9cb346732eab2914ef44fe777a3f0b585 upstream.
    
    __iscsi_complete_pdu() fetches the task for five response types from one
    place and checks only that the index resolved:
    
          case ISCSI_OP_LOGOUT_RSP:
          case ISCSI_OP_LOGIN_RSP:
          case ISCSI_OP_TEXT_RSP:
          case ISCSI_OP_SCSI_TMFUNC_RSP:
          case ISCSI_OP_NOOP_IN:
                  task = iscsi_itt_to_task(conn, hdr->itt);
                  if (!task)
                          return ISCSI_ERR_BAD_ITT;
    
    iscsi_itt_to_task() bounds the index against cmds_max and looks at
    nothing else, so a target can name any slot in the pool, including one
    that has never been used. task->conn is then NULL, and both
    iscsi_nop_out_rsp() and iscsi_complete_task() dereference it. One
    unsolicited NOP-In is enough; a Text Response carrying the same ITT
    crashes in iscsi_complete_task() instead.
    
    Require the task to be in flight and not a SCSI command, the way
    iscsi_itt_to_ctask() does for the command opcodes.
    
    [    6.298634] Oops: general protection fault, probably for non-canonical address 0xdffffc000000000c: 0000 [#1] SMP KASAN NOPTI
    [    6.298642] KASAN: null-ptr-deref in range [0x0000000000000060-0x0000000000000067]
    [    6.298652] CPU: 1 UID: 0 PID: 111 Comm: iscsistart Not tainted 7.2.0-rc5-ISCSI1-gf5098b6bae76 #1 PREEMPT(lazy)
    [    6.298654] Hardware name: QEMU Ubuntu 24.04 PC v2 (i440FX + PIIX, arch_caps fix, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
    [    6.298656] RIP: 0010:iscsi_nop_out_rsp.constprop.0+0x46/0x160
    [    6.298691] Code: c1 ea 03 48 83 ec 08 80 3c 02 00 0f 85 f5 00 00 00 48 b8 00 00 00 00 00 fc ff df 48 8b 6b 58 48 8d 7d 60 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 c0 00 00 00 48 8b 45 60 48 39 c3 74 50 48 b8 00
    [    6.298698] RSP: 0018:ffff88806c907be8 EFLAGS: 00010206
    [    6.298701] RAX: dffffc0000000000 RBX: ffff888006116800 RCX: 0000000000000020
    [    6.298702] RDX: 000000000000000c RSI: ffff88800525d578 RDI: 0000000000000060
    [    6.298703] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
    [    6.298706] R10: 0000000000000020 R11: 0000000000000000 R12: 0000000000000000
    [    6.298706] R13: 000000000000002e R14: ffff8880056eb440 R15: ffff888006116800
    [    6.298707] FS:  00007fc02d1c2740(0000) GS:ffff8880b29bc000(0000) knlGS:0000000000000000
    [    6.298710] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [    6.298711] CR2: 000055fe3b56ddf8 CR3: 00000000053b9004 CR4: 0000000000770ef0
    [    6.298712] PKRU: 55555554
    [    6.298713] Call Trace:
    [    6.298714]  <IRQ>
    [    6.298714]  __iscsi_complete_pdu+0x13a8/0x22a0
    [    6.298758]  iscsi_complete_pdu+0x54/0xa0
    [    6.298759]  iscsi_tcp_hdr_recv_done+0x870/0x2c80
    [    6.298778]  iscsi_tcp_recv_skb+0x31e/0xec0
    [    6.298800]  iscsi_sw_tcp_recv+0x12f/0x390
    [    6.298804]  __tcp_read_sock+0x1ab/0x810
    [    6.298812]  iscsi_sw_tcp_data_ready+0x18b/0x510
    [    6.298814]  tcp_rcv_established+0x1f56/0x3a00
    [    6.298842]  tcp_v4_do_rcv+0x449/0x960
    [    6.298847]  tcp_v4_rcv+0x2245/0x3bc0
    
    Fixes: 7996a778ff8c ("[SCSI] iscsi: add libiscsi")
    Cc: [email protected]
    Reviewed-by: Mike Christie <[email protected]>
    Signed-off-by: Yehyeong Lee <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

scsi: qedi: Initialize callback state before registration [+ + +]
Author: Runyu Xiao <[email protected]>
Date:   Thu Sep 10 17:24:05 2026 +0800

    scsi: qedi: Initialize callback state before registration
    
    commit 85de8b3a5eaa23d153aff4c7c83dddbc949064c9 upstream.
    
    qedi_get_protocol_tlv_data() can be called asynchronously by QED after
    qedi_ops->register_ops(). It takes stats_lock and reads ll2_mtu, but
    __qedi_probe() currently registers the callback before initializing the
    mutex and assigning the default MTU on the normal probe path.
    
    Initialize the callback-visible state before registering qedi_cb_ops. Keep
    the recovery path from reinitializing state because it reuses the existing
    qedi context.
    
    Fixes: 3cc5746e5ad7 ("scsi: qedi: Initialize the stats mutex lock")
    Cc: [email protected]
    Assisted-by: LLM Codex
    Signed-off-by: Runyu Xiao <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

scsi: qla2xxx: Fix 64G link speed reporting in get_data_rate [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 14:03:22 2026 -0400

    scsi: qla2xxx: Fix 64G link speed reporting in get_data_rate
    
    [ Upstream commit 52fba32317ee631faa878725b2f7cd5c08acacd3 ]
    
    qla2x00_get_data_rate() skips updating ha->link_data_rate when the
    firmware returns mcp->mb[1] == 0x7.  That value was a legacy sentinel
    from before 64G hardware existed, but PORT_SPEED_64GB is now defined as
    0x07 and ha->link_data_rate is decoded with the PORT_SPEED_* encoding.
    On a 64G-capable adapter a genuine 64G link is therefore dropped, and
    the port speed is misreported (port_speed sysfs, fc_host speed, FDMI).
    
    Only 28xx and 29xx support 64G, so accept 0x07 on those adapters while
    keeping the legacy filter for older ones.  Also drop the duplicate copy
    of the check at the end of the success branch; it repeated the first
    assignment with no intervening change.
    
    Fixes: ecc89f25e225 ("scsi: qla2xxx: Add Device ID for ISP28XX")
    Cc: [email protected]
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ Omitted IS_QLA29XX() checks because this branch lacks 29xx adapter support. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Fix NVMe abort reference leak on repeated abort [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Thu Jul 30 21:28:29 2026 +0530

    scsi: qla2xxx: Fix NVMe abort reference leak on repeated abort
    
    [ Upstream commit 06b5b2a5d499323f1c3256ead35798e8e3d15e60 ]
    
    qla_nvme_ls_abort() and qla_nvme_fcp_abort() take a command reference with
    kref_get_unless_zero() and then call schedule_work() on priv->abort_work,
    ignoring its return value. qla_nvme_abort_work() runs once and drops
    exactly one reference via kref_put(&sp->cmd_kref, sp->put_fn).
    
    Since the per-abort INIT_WORK() was moved to submission time,
    schedule_work() now returns false when the work is already pending, for
    example on a concurrent transport teardown and timeout-driven abort of
    the same command. In that case the reference taken for the second abort
    is never released because the work still executes only once, leaking a
    reference. The command is then never returned to the NVMe-FC transport,
    which can hang the port.
    
    Drop the reference when schedule_work() returns false, so each
    kref_get_unless_zero() is balanced regardless of whether the work was
    newly queued. The held reference keeps priv->sp valid for the put.
    
    Fixes: 7e85f6dbc856 ("scsi: qla2xxx: Initialize NVMe abort_work once at submission")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 13:16:12 2026 -0400

    scsi: qla2xxx: Fix queue teardown NULL dma_free and bitmap locking
    
    [ Upstream commit 34a40e0dff940ac5eba494a69b553ea571e24873 ]
    
    qla25xx_free_req_que() and qla25xx_free_rsp_que() have two pre-existing
    bugs exposed on the error path of qla25xx_create_{req,rsp}_que():
    
     1. When dma_alloc_coherent() fails during queue creation, the error
        path calls the free function with req->ring / rsp->ring still NULL
        (from kzalloc).  The unconditional dma_free_coherent() with a NULL
        cpu_addr is undefined behavior and can panic.
    
     2. The free functions clear req_qid_map / rsp_qid_map under vport_lock,
        but the create functions protect the same bitmaps with mq_lock.
        This provides no mutual exclusion.  Additionally, the create error
        path clears the bit and releases mq_lock before calling the free
        function, creating a window where another thread can allocate the
        same que_id and have its ha->req_q_map entry clobbered by the
        subsequent lockless NULL assignment in the free function.
    
    Fix by:
    
     - Guarding dma_free_coherent() with a NULL check on the ring pointer.
    
     - Using mq_lock (the lock held by all creators) in the free functions
       to atomically NULL the map entry and clear the bitmap bit.
    
     - Removing the now-redundant clear_bit blocks from the create error
       paths since the free functions handle it atomically.
    
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    
    Backport adaptation for the stable tree: the 29xx IOCB size-selection
    helpers are absent, and queue creation still allocates fixed-size entries.
    Initialize the local req_entry_size and rsp_entry_size values with
    sizeof(request_t) and sizeof(response_t), respectively, so DMA freeing
    continues to match allocation without adding helper functions or 29xx
    support. Retain all NULL-ring guards, mq_lock protection, and removal of
    the premature bitmap clears.
    
    Keep the response-ring cleanup layout used by upstream so target commit
    19788a55cab61d78e33e0914a5a31d27843e8a4a applies unchanged.
    
    Stable-dep-of: 19788a55cab6 ("scsi: qla2xxx: Fix use-after-free of qpair work on queue teardown")
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Fix use-after-free of qpair work on queue teardown [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 13:16:13 2026 -0400

    scsi: qla2xxx: Fix use-after-free of qpair work on queue teardown
    
    [ Upstream commit 19788a55cab61d78e33e0914a5a31d27843e8a4a ]
    
    The response queue MSI-X handler qla2xxx_msix_rsp_q() schedules
    qla_do_work() via queue_work(ha->wq, &qpair->q_work). qla_do_work()
    dereferences the qpair (vha, rsp) and takes qpair->qp_lock.
    
    During teardown, qla2xxx_delete_qpair() deletes the response queue, which
    calls free_irq() in qla25xx_free_rsp_que(), and then frees the queue and
    the qpair. free_irq() waits for running hardirq handlers but does not
    cancel work already placed on ha->wq. A still-pending q_work then runs
    qla_do_work() against the freed qpair and response queue, causing a
    use-after-free. This is especially likely during full adapter teardown,
    where destroy_workqueue(ha->wq) forces pending work to run after the queue
    pairs have been freed.
    
    Flush the work item with cancel_work_sync() in qla25xx_free_rsp_que()
    after free_irq() has released the interrupt (so no new work can be
    queued) and before the response queue and qpair memory are freed (so the
    flushed handler still sees valid memory). Guard on rsp->qpair and ha->wq
    to match the INIT_WORK() condition and avoid operating on an
    uninitialized work_struct.
    
    Fixes: 68ca949cdb04 ("[SCSI] qla2xxx: Add CPU affinity support.")
    Reported-by: Sashiko <[email protected]>
    Cc: [email protected]
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Initialize NVMe abort_work once at submission [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Thu Jul 23 10:34:08 2026 +0530

    scsi: qla2xxx: Initialize NVMe abort_work once at submission
    
    [ Upstream commit 7e85f6dbc85616de2172bce8eaf84b387a723cd1 ]
    
    qla_nvme_fcp_abort() and qla_nvme_ls_abort() ran INIT_WORK() on
    priv->abort_work immediately before schedule_work(). INIT_WORK()
    reinitializes the work_struct, resetting its list head and clearing the
    pending bit. If an abort is issued more than once for the same command
    (for example, concurrent transport teardown and a timeout-driven abort),
    the second INIT_WORK() reinitializes a work item that is already queued,
    which can corrupt the workqueue list and lead to crashes or a looping
    worker.
    
    Initialize priv->abort_work once at command submission, next to the
    existing per-command spin_lock_init(&priv->cmd_lock), and leave only
    schedule_work() in the abort paths. schedule_work() already does nothing
    when the work item is still pending, so a repeated abort no longer
    disturbs an in-flight work item. The command is not returned to the
    transport until the final kref_put()/release callback runs after
    abort_work has completed, so the work item is idle before priv is reused
    and the single submission-time INIT_WORK() is safe.
    
    Fixes: e473b3074104 ("scsi: qla2xxx: Add FC-NVMe abort processing")
    Cc: [email protected]
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Null out freed pointers in qla2x00_mem_alloc() error path [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 17:15:35 2026 -0400

    scsi: qla2xxx: Null out freed pointers in qla2x00_mem_alloc() error path
    
    [ Upstream commit 6d90f0feb929f6c0f3010f9af4747c7230b75993 ]
    
    When qla2x00_mem_alloc() fails, qla2x00_probe_one() jumps to
    probe_hw_failed and calls qla2x00_mem_free(). Several error labels in
    qla2x00_mem_alloc() freed adapter members (elsrej.c, purex_dma_pool,
    flt, sfp_data, loop_id_map, async_pd, sf_init_cb, ex_init_cb, npiv_info)
    but left the pointers dangling. qla2x00_mem_free() then freed them a
    second time. Worse, for the dma_pool members it issued
    dma_pool_free(ha->s_dma_pool, ...) after s_dma_pool had already been
    destroyed and set to NULL at fail_s_dma_pool, dereferencing a NULL pool.
    
    Clear each freed pointer (and its DMA handle) in the error labels so the
    subsequent qla2x00_mem_free() skips them.
    
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ omitted the upstream cleanup block for allocation paths absent from Linux 5.10. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Quiesce response IRQ before freeing request queue [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 13:58:18 2026 -0400

    scsi: qla2xxx: Quiesce response IRQ before freeing request queue
    
    [ Upstream commit 505753ec2594c6af09a601f0dd60be7d840c1d2d ]
    
    qla2xxx_delete_qpair() deletes the request queue before the response
    queue. qla25xx_delete_req_que() frees the request queue memory
    (kfree(req) in qla25xx_free_req_que()), but the response-queue MSI-X is
    only released later, in qla25xx_free_rsp_que(). In that window the
    response interrupt can still fire, qla2xxx_msix_rsp_q() queues
    qpair->q_work, and qla_do_work() -> qla24xx_process_response_queue()
    dereferences the now-freed rsp->req (LOGINOUT/CT/ELS entries and the
    status path), a use-after-free.
    
    The cancel_work_sync() added for the qpair teardown lives in the
    response free path, which runs after the request queue is already freed,
    so it does not protect rsp->req.
    
    Release the response-queue interrupt and flush qpair->q_work before
    deleting the request queue, so no late completion can reach the freed
    request queue. Clearing have_irq makes the subsequent
    qla25xx_free_rsp_que() skip its free_irq(), and the firmware
    queue-delete order (request then response) is preserved; the
    request-delete mailbox completes on the default vector and is unaffected
    by dropping the qpair response interrupt early.
    
    Fixes: d74595278f4a ("scsi: qla2xxx: Add multiple queue pair functionality.")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ adjusted context due to missing qla_free_buf_pool() call ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Use memset_io() to clear QLAFX00 request ring slot [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 14:08:43 2026 -0400

    scsi: qla2xxx: Use memset_io() to clear QLAFX00 request ring slot
    
    [ Upstream commit 626e44f3d8a924a97a3848a9fd45833947e081e9 ]
    
    For QLAFX00 the request ring is ioremapped device I/O memory
    (ha->iobase + req_que_off), not DMA-coherent RAM, which is why the rest
    of the FX00 path accesses it through memcpy_toio() and the wrt_reg_*
    helpers. __qla2x00_alloc_iocbs() however zeroed the producer slot with a
    plain memset(). On architectures such as ARM64 a regular memset() may
    emit unaligned or block-zeroing instructions (e.g. DC ZVA) that are
    invalid on Device memory, leading to a synchronous external abort.
    
    Use memset_io() to clear the slot for QLAFX00, matching the I/O
    accessors used elsewhere on this ring. Other adapters keep the plain
    memset() on their DMA-coherent rings. The zero-fill is retained for FX00
    because its IOCB builders (e.g. qlafx00_fxdisc_iocb()) copy only part of
    the entry and rely on the unused tail being pre-zeroed.
    
    Fixes: 8ae6d9c7eb10 ("[SCSI] qla2xxx: Enhancements to support ISPFx00.")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ replaced qla_req_ring_slot() and qla_req_entry_size() with req->ring_ptr and REQUEST_ENTRY_SIZE. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Validate BSG request_len before reading vendor_cmd[] [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 15:32:22 2026 -0400

    scsi: qla2xxx: Validate BSG request_len before reading vendor_cmd[]
    
    [ Upstream commit 4cf38dd9465736141263ebb63375868311a0ec81 ]
    
    The FC BSG transport allocates job->request via memdup_user() using the
    exact user-supplied request_len. For FC_BSG_HST_VENDOR,
    fc_bsg_host_dispatch() only guarantees request_len covers msgcode and
    vendor_id; it does not account for the vendor_cmd[] flexible array.
    
    qla2xxx then reads the command selector vendor_cmd[0] and, in several
    sub-handlers, vendor_cmd[1]/[2] or structures overlaid on the vendor
    command area without verifying request_len. A caller holding
    CAP_SYS_RAWIO can submit a short request whose vendor_id matches the
    host, triggering out-of-bounds heap reads (KASAN-detectable, and able to
    mis-select a command or panic).
    
    Add a central guard in qla2x00_process_vendor_specific() so the selector
    is always in bounds, restrict the early vendor_cmd[0] read in
    qla24xx_bsg_request() to sufficiently long vendor messages, and add
    request_len checks to the sub-handlers that read further:
    qla24xx_proc_fcp_prio_cfg_cmd(), qla2x00_process_loopback(),
    qla84xx_reset(), qla84xx_updatefw(), qla2x00_read_optrom(),
    qla2x00_update_optrom(), qlafx00_mgmt_cmd() and
    qla28xx_validate_flash_image().
    
    Fixes: 01e0e15c8b3b ("scsi: don't use fc_bsg_job::request and fc_bsg_job::reply directly")
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Signed-off-by: Nilesh Javali <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ adapted validation to the older qla2xxx handler layout. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: qla2xxx: Zero dport diagnostics buffer to avoid info leak [+ + +]
Author: Nilesh Javali <[email protected]>
Date:   Fri Sep 11 11:33:25 2026 -0400

    scsi: qla2xxx: Zero dport diagnostics buffer to avoid info leak
    
    [ Upstream commit a152edab3854f01dd2daf3eaf8f32cbabdb3834e ]
    
    qla2x00_do_dport_diagnostics() allocates the qla_dport_diag response
    buffer with kmalloc_obj() (non-zeroing) and, on success, copies the full
    sizeof(*dd) back to user space via sg_copy_from_buffer(). The inbound
    sg_copy_to_buffer() only fills as many bytes as the user request payload
    provides, and qla26xx_dport_diagnostics() zeroes only dd->buf. The
    options and unused[] fields are therefore copied out uninitialized,
    leaking kernel heap contents to user space.
    
    Allocate with kzalloc_obj(), matching qla2x00_do_dport_diagnostics_v2().
    
    Fixes: ec89146215d1 ("qla2xxx: Add bsg interface to support D_Port Diagnostics.")
    Cc: [email protected]
    Signed-off-by: Nilesh Javali <[email protected]>
    Reviewed-by: Hannes Reinecke <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ Adapted kzalloc_obj(*dd) to kzalloc(sizeof(*dd), GFP_KERNEL) to match the branch’s allocation syntax. ]
    Signed-off-by: Sasha Levin <[email protected]>

scsi: st: Fix use-after-free race between st_remove() and st_open() [+ + +]
Author: Laurence Oberman <[email protected]>
Date:   Wed Oct 21 11:46:49 2026 -0400

    scsi: st: Fix use-after-free race between st_remove() and st_open()
    
    commit 71caf7f84bd62a4bf91cc95abd2de690afb8d15f upstream.
    
    st_remove() drops the probe reference on the scsi_tape with kref_put()
    and only afterwards removes its index from st_index_idr. If that was the
    last reference, scsi_tape_release() frees the structure while it is
    still published in the idr.
    
    scsi_tape_get(), called from st_open(), looks up the tape in
    st_index_idr and takes a reference under st_ref_mutex and
    st_index_lock. remove_cdevs() does not wait for opens that are already
    past chrdev_open(), so an open that is blocked on st_ref_mutex while
    st_remove() holds it can take the mutex as soon as st_remove() drops it,
    find the freed tpnt in the idr and call kref_get() on it:
    
      BUG: KASAN: slab-use-after-free in st_open
      Write of size 4 ...
       st_open (drivers/scsi/st.c:254 drivers/scsi/st.c:1291)
       chrdev_open
      ...
      Freed by task ...:
       kfree
       st_remove (drivers/scsi/st.c:4512)
    
    Remove the index from the idr before dropping the reference, all under
    st_ref_mutex. A concurrent scsi_tape_get() now either runs first and
    holds a valid reference that keeps the tape alive, or runs afterwards
    and finds nothing, so st_open() fails with -ENXIO.
    
    This restores the ordering st_remove() had before the conversion to
    st_index_idr, where the tape was unpublished from scsi_tapes[] before
    the final kref_put().
    
    Fixes: 6c648d95a6af ("[SCSI] st: get rid of scsi_tapes array")
    Cc: [email protected]
    Reported-by: Dingisoul <[email protected]>
    Closes: https://lore.kernel.org/linux-scsi/[email protected]/
    Tested-by: Dingisoul <[email protected]>
    Signed-off-by: Laurence Oberman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    [ loberman: st_remove() still returns int in 5.10; context adjusted ]
    Signed-off-by: Laurence Oberman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: st: Save the visited block for the partition the drive is in [+ + +]
Author: Laurence Oberman <[email protected]>
Date:   Tue Oct 6 12:42:50 2026 -0400

    scsi: st: Save the visited block for the partition the drive is in
    
    [ Upstream commit c9e9f024dd4f61f0f6636c9f2ed0830f87060e11 ]
    
    set_location() saves the current tape location before switching
    partitions, so that switch_partition() can return to it later. It reads
    the location with READ POSITION but stores it in the st_partstat of
    STp->partition, ignoring the partition the drive reports.
    
    The two differ after a device reset. When the reset is recovered with
    MTREW, MTSEEK or MTEOM, st_ioctl() sets STp->partition = 0 and calls
    switch_partition() to return to STp->new_partition. A drive that was in
    partition 1 is still there, so set_location() files the partition 1
    position under partition 0. The next switch to partition 0 locates to
    that block: if partition 0 holds less data, MTSETPART fails with EIO
    (BLANK CHECK), otherwise the tape is silently positioned at the wrong
    block.
    
    IBM ULTRIUM-TD5 (LTO-5), LU reset in partition 1 at block 1025:
    
      st 12:0:0:0: [st0] Visited block 1025 for partition 0 saved.
      ...
      st 12:0:0:0: [st0] Setting block to 1025 and partition to 0.
      st 12:0:0:0: [st0] Error: 402, cmd: 2b 2 0 0 0 4
      st 12:0:0:0: [st0] Sense Key : Blank Check [current]
      st 12:0:0:0: [st0] Add. Sense: End-of-data detected
    
    Store the location in the st_partstat of the partition reported by READ
    POSITION. With the fix:
    
      st 12:0:0:0: [st0] Visited block 1025 for partition 1 saved.
    
    This is a pre-existing issue. It was not caught when testing the recent
    st reset series because the partition test was only run on scsi_debug:
    on the LTO drive it was skipped, since can-partitions is off in the test
    harness's stinit.conf, as is normal for LTO. scsi_debug hides the
    problem because its emulated tape returns to the beginning of partition
    0 on an LU reset. It was found while validating a backport of that
    series to RHEL 9.8, when the partition tests were run on real hardware
    with can-partitions enabled. The same failure then reproduced on
    unmodified RHEL 9.8 and on upstream, and the fix makes the test pass on
    v7.3-rc3 and RHEL 9.8 with an LTO-5.
    
    The harness (https://gitlab.com/loberman/tapetest, test X03) now refuses
    to silently skip the partition tests on hardware.
    
    Fixes: 7081dc75df79 ("scsi: st: Restore some drive settings after reset")
    Assisted-by: Claude
    Signed-off-by: Laurence Oberman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

scsi: target: iscsi: Fix race in discovery auth updates [+ + +]
Author: Linfeng Sun <[email protected]>
Date:   Tue Aug 11 20:48:43 2026 +0800

    scsi: target: iscsi: Fix race in discovery auth updates
    
    [ Upstream commit e15b81f602edbdee39c335546f25486a1747f3f0 ]
    
    Separate configfs opens can concurrently update the discovery AuthMethod
    parameter. Both callers may free the same value in
    iscsi_update_param_value(), causing a double-free.
    
    Protect the lookup and replacement with the discovery TPG access lock,
    as used by the other TPG configfs parameter updates.
    
    Fixes: e48354ce078c ("iscsi-target: Add iSCSI fabric support for target v4.1")
    Signed-off-by: Linfeng Sun <[email protected]>
    Reviewed-by: Mike Christie <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Martin K. Petersen (Oracle) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
sctp: check RCV_SHUTDOWN after the sendmsg connect wait [+ + +]
Author: Jun Yang <[email protected]>
Date:   Sat Sep 26 17:55:15 2026 +0800

    sctp: check RCV_SHUTDOWN after the sendmsg connect wait
    
    commit 4f1da630d13de0370e2f6361f961f1c8b384af1c upstream.
    
    sctp_wait_for_connect() drops the socket lock while it sleeps. An
    out-of-the-blue ABORT can then be processed from the socket backlog and
    unlink the association. If a concurrent shutdown(fd, SHUT_RD) sets
    RCV_SHUTDOWN, the waiter breaks with err == 0 before checking
    asoc->base.dead. Its final sctp_association_put() can then free the
    association, leaving sctp_sendmsg_to_asoc() to continue with a dangling
    pointer.
    
    Check RCV_SHUTDOWN along with the wait error in sctp_sendmsg_to_asoc()
    before using the association again. The check only accesses the socket,
    so it needs no additional association reference. Return the existing
    -ESRCH so that sctp_sendmsg() skips freeing a new association that may
    already have been destroyed.
    
    Keep sctp_wait_for_connect() unchanged to preserve its behavior for the
    connect() caller.
    
    Fixes: 668c9beb9020 ("sctp: implement assign_number for sctp_stream_interleave")
    Cc: [email protected]
    Reported-by: TencentOS Corvus AI <[email protected]>
    Signed-off-by: Jun Yang <[email protected]>
    Acked-by: Xin Long <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

sctp: copy zeroed stats to user in sctp_getsockopt_pr_streamstatus() when !streamoute [+ + +]
Author: Hui Peng <[email protected]>
Date:   Wed Sep 30 04:46:11 2026 +0000

    sctp: copy zeroed stats to user in sctp_getsockopt_pr_streamstatus() when !streamoute
    
    commit 538b529509c7ab0d909cb65bb7264edca1788d30 upstream.
    
    When an SCTP stream output extension structure (streamoute) has not yet
    been allocated, sctp_getsockopt_pr_streamstatus() sets the local stack
    variables params.sprstat_abandoned_unsent = 0 and
    params.sprstat_abandoned_sent = 0, but then immediately jumps to 'out:',
    bypassing copy_to_user(). As a result, when an uninitialized user buffer
    is passed to getsockopt(SCTP_PR_STREAM_STATUS), the kernel returns
    success (0) without copying the zeroed stats back to user space, leaving
    uninitialized data in the user buffer.
    
    Refactor the !streamoute check into an if-else chain so that when
    streamoute is NULL, params is zeroed and falls through to copy_to_user(),
    copying the zeroed stats to user space and setting retval = 0 once before
    returning.
    
    Tested in QEMU against Linux 7.3.0-rc3 using an uninitialized
    sctp_prstatus user struct passed to getsockopt(SCTP_PR_STREAM_STATUS) on a
    freshly created stream: on the unfixed kernel the user struct contains
    uninitialized stack garbage; whereas with this fix applied, getsockopt()
    copies zeroed stats into user space and returns 0.
    
    Cc: [email protected]
    Reviewed-by: Xin Long <[email protected]>
    Signed-off-by: Hui Peng <[email protected]>
    Fixes: f952be79cebd ("sctp: introduce struct sctp_stream_out_ext")
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

sctp: revalidate output stream after association connect wait [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Wed Oct 7 12:57:39 2026 +0900

    sctp: revalidate output stream after association connect wait
    
    commit b7ad72414c673ce1fa1f463e807cd4f34f8be9bf upstream.
    
    When message interleaving is enabled, the first send waits for association
    establishment before building its data chunks.  The wait drops the socket
    lock, and handshake processing can reduce the output stream count to the
    peer-advertised inbound stream count.  sctp_stream_init() then frees the
    extension of every removed stream.
    
    The sender resumes with the stream that it checked before the wait.  If the
    peer removed that stream, sctp_outq_tail() later dereferences its NULL
    extension.  Fatal-oops policies then panic the host.
    
    KASAN: null-ptr-deref in range [0x38-0x3f]
    RIP: sctp_outq_tail+0x49e/0xaa0
    Call Trace:
     sctp_primitive_SEND
     sctp_sendmsg_to_asoc
     sctp_sendmsg
    
    A range check alone is insufficient.  Stream reconfiguration can grow the
    output count again while the lock is released without recreating extensions
    freed by the earlier shrink.  The stream can then be in range while its
    extension remains NULL.  The send-buffer wait has the same issue.
    
    Factor the range and extension checks into a helper and repeat both after
    each send-path wait that drops the socket lock.  Once the lock is
    reacquired, the validation remains stable through data creation and
    queueing.
    
    If validation fails after the connect wait, the auto-created association is
    already established.  Return ESRCH so the existing caller path keeps it
    under state-machine ownership instead of freeing it directly, which would
    leave protocol, counter and socket state inconsistent.
    
    Fixes: 668c9beb9020 ("sctp: implement assign_number for sctp_stream_interleave")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Daehyeon Ko <[email protected]>
    Acked-by: Xin Long <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

sctp: validate chunk length in the inqueue parser [+ + +]
Author: Charles Vosburgh <[email protected]>
Date:   Thu Aug 27 17:32:53 2026 -0400

    sctp: validate chunk length in the inqueue parser
    
    commit 6cfc1b90cb86f4aabc69fb8e30128e07e2cdfa3a upstream.
    
    SCTP chunks always include a four-byte generic header, but
    sctp_inq_pop() currently accepts shorter declared lengths. A zero-length
    chunk leaves chunk_end at the current header.
    
    When ASCONF is covered by the association's SCTP-AUTH policy,
    sctp_assoc_bh_rcv() can continue before the state machine performs its
    normal chunk-length check. sctp_inq_pop() then returns the same malformed
    chunk repeatedly and the receive softirq can lock up.
    
    A remote SCTP peer can trigger this after establishing an association on
    a kernel built with CONFIG_IP_SCTP and configured with
    net.sctp.addip_enable=1 and net.sctp.auth_enable=1. The reproducer did
    not require application credentials, a shared SCTP AUTH key, or
    net.sctp.addip_noauth_enable=1.
    
    On commit f967455fb2a5 ("seg6: reset IP6CB after IPv6 decapsulation"),
    one zero-length ASCONF caused repeated
    watchdog soft-lockup reports in a two-vCPU KVM guest. All 3 pre-trigger
    health probes succeeded, while 36 of 37 post-trigger probes failed. With
    this change, all 37 post-trigger probes succeeded and no equivalent
    soft-lockup signature appeared.
    
    Reject chunks shorter than the generic SCTP header at the shared inqueue
    parser boundary. Mark the packet for discard before either caller can
    continue processing it, while preserving the four-byte generic minimum.
    Declared-length 1 through 4 controls and kernel-generated ASCONF traffic
    remained healthy. The patched sctp_hello selftest passed for IPv4 and
    IPv6.
    
    The complete private reproducer and validation evidence are available
    directly to maintainers on request.
    
    Fixes: bbd0d59809f9 ("[SCTP]: Implement the receive and verification of AUTH chunk")
    Cc: [email protected]
    Signed-off-by: Charles Vosburgh <[email protected]>
    Acked-by: Xin Long <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
security/keys: fix missed RCU read section on lookup [+ + +]
Author: Linus Torvalds <[email protected]>
Date:   Tue Oct 20 22:17:58 2026 +0200

    security/keys: fix missed RCU read section on lookup
    
    commit 43a1e3744548e6fd85873e6fb43e293eb4010694 upstream.
    
    Nicholas Carlini reports that the keyring code calls assoc_array_find()
    in find_key_to_update() without holding the RCU read lock, while the
    assoc_array_gc() code really is designed around removing the node from
    the tree and then freeing it after an RCU grace-period.
    
    The regular key handling doesn't see this because holding the keyring
    semaphore hides any lifetime issues, but the persistent key handling
    uses a different model.
    
    Instead of extending the keyring locking, just do the simple RCU locking
    that the assoc_array was designed for.
    
    [ Moved the guard at the top of the function to solve a compilation
    issue ]
    
    Reported-by: Nicholas Carlini <[email protected]>
    Cc: David Howells <[email protected]>
    Cc: Jarkko Sakkinen <[email protected]>
    Cc: Paul Moore <[email protected]>
    Cc: James Morris James Morris <[email protected]>
    Cc: Serge E. Hallyn <[email protected]>
    Signed-off-by: Linus Torvalds <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
selinux: fix data race on AVC latest_notif [+ + +]
Author: Christian Göttsche <[email protected]>
Date:   Mon Oct 12 11:39:02 2026 -0400

    selinux: fix data race on AVC latest_notif
    
    [ Upstream commit 1ca924044bf0de879a1648be93a56939652267d3 ]
    
    avc_policy_seqno() reads latest_notif without holding notif_lock, while
    avc_latest_notif_update() can update it under that lock. KCSAN reports
    these concurrent accesses during policy boolean updates and permission
    checks.
    
    Use READ_ONCE() for the lockless read and WRITE_ONCE() for the update.
    The spinlock continues to serialize the comparison and update against
    other writers. Reads made while holding notif_lock cannot race with a
    writer and can remain plain accesses.
    
    This marks both sides of the intentional concurrent access and constrains
    compiler transformations, without suppressing checking with data_race().
    
    Cc: [email protected]
    Fixes: 788e7dd4c22e ("SELinux: Improve read/write performance")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=a7f7cb0737bd91aa698c
    Signed-off-by: Christian Göttsche <[email protected]>
    Acked-by: Stephen Smalley <[email protected]>
    Signed-off-by: Paul Moore <[email protected]>
    [ sashal: Adapted global selinux_avc accesses to avc and state->avc pointer accesses. ]
    Signed-off-by: Sasha Levin <[email protected]>

selinux: preserve NATIVE_LABELS on already-initialized sb in set_mnt_opts [+ + +]
Author: Stephen Smalley <[email protected]>
Date:   Mon Sep 28 10:19:17 2026 -0400

    selinux: preserve NATIVE_LABELS on already-initialized sb in set_mnt_opts
    
    commit 28b7260548af3d35773477993ad4e4de41578dd7 upstream.
    
    When an NFSv4 filesystem exported with security_label is mounted a
    second time, sget_fc() returns the existing superblock and
    nfs_get_root() calls security_sb_set_mnt_opts() again on it. Since the
    superblock is already SB_INITIALIZED, selinux_set_mnt_opts() takes an
    early exit without setting SECURITY_LSM_NATIVE_LABELS in
    *set_kern_flags. nfs_get_root() then sees kflags without
    SECURITY_LSM_NATIVE_LABELS set and clears NFS_CAP_SECURITY_LABEL on
    the shared nfs_server, silently disabling per-file labeling for both
    the new and the original mount.
    
    Commit 3815a245b501 ("security/selinux: fix SECURITY_LSM_NATIVE_LABELS
    on reused superblock") fixed the same problem in
    selinux_sb_clone_mnt_opts().  The reused-superblock path for a plain
    second mount now goes through sb_set_mnt_opts rather than
    sb_clone_mnt_opts, so it needs the same treatment: on both
    SE_SBINITIALIZED early exits, set SECURITY_LSM_NATIVE_LABELS in
    *set_kern_flags when the superblock was already using
    SECURITY_FS_USE_NATVE.
    
    Cc: [email protected]
    Closes: https://github.com/SELinuxProject/selinux-kernel/issues/69
    Closes: https://github.com/SELinuxProject/selinux-kernel/issues/70
    Closes: https://github.com/SELinuxProject/selinux-testsuite/issues/91
    Closes: https://github.com/SELinuxProject/selinux-testsuite/issues/92
    Fixes: eb9ae686507b ("SELinux: Add new labeling type native labels")
    Signed-off-by: Stephen Smalley <[email protected]>
    Signed-off-by: Paul Moore <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
serial: fix TIOCMIWAIT race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Oct 6 04:08:21 2026 -0400

    serial: fix TIOCMIWAIT race
    
    [ Upstream commit 40adffec8c0090533dfaa863ced7901b60bbf1dc ]
    
    The task state must be updated before checking the wakeup condition to
    avoid missing a racing modem status update.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: [email protected]
    Link: https://lore.kernel.org/r/[email protected]
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: adjusted context for spin_lock_irq()/spin_unlock_irq() instead of uart_port_lock_irq()/uart_port_unlock_irq() ]
    Signed-off-by: Sasha Levin <[email protected]>

serial: tegra: don't clear the Tx FIFO on an Rx-only reset [+ + +]
Author: Simon Gassner <[email protected]>
Date:   Thu Oct 1 08:05:39 2026 +0200

    serial: tegra: don't clear the Tx FIFO on an Rx-only reset
    
    commit 8aebfde6e84dceb7d47fe8001e50b754eb45d5df upstream.
    
    tegra_uart_fifo_reset() applies the Tegra30 workaround for
    "cannot clear the Tx FIFO while FIFO mode is enabled"
    unconditionally: it leaves FIFO mode, writes the requested FCR
    clear bits, and re-enters FIFO mode. Leaving FIFO mode empties
    both FIFOs, so an Rx-only reset discards queued Tx data as well.
    
    The break handler in tegra_uart_decode_rx_error() calls it with
    UART_FCR_CLEAR_RCVR only. On a half-duplex RS485 board whose Rx
    line is pulled low while the transceiver drives the bus, every
    transmission raises a spurious break, and all but the first
    character of the frame is lost.
    
    Only take the FIFO-mode path when the caller actually asked for
    CLEAR_XMIT. Likewise only wait for TEMT in that case: with the Tx
    FIFO deliberately left intact, that loop would otherwise spin for
    a full frame time in hard IRQ context with the port lock held.
    
    Tested on a Colibri T30 (Tegra30) with Rx DMA:
    
     - Break during transmission: the reset still fires from
       tegra_uart_decode_rx_error(), and the complete frame now
       reaches the peer. Before this change only the character in
       the shift register was sent.
     - Internal loopback with a generated break: the Rx FIFO is
       correctly cleared by the plain FCR write, and subsequent
       receive works with no frame, parity or overrun errors.
    
    Fixes: e9ea096dd225 ("serial: tegra: add serial driver")
    Cc: [email protected]
    Signed-off-by: Simon Gassner <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

serial: vt8500: Fix clock reference leak in vt8500_serial_probe() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Thu Sep 17 15:58:34 2026 +0000

    serial: vt8500: Fix clock reference leak in vt8500_serial_probe()
    
    commit 9d8955281d9229a899e2041659a59b389027b711 upstream.
    
    of_clk_get() returns a clock with a reference that has to be released
    with clk_put(). If clk_prepare_enable() fails the function returns
    without doing so, leaking the reference.
    
    Add the missing clk_put() on that error path.
    
    Fixes: 12faa35ae5cb ("serial: vt8500: UART uses gated clock rather than 24Mhz reference")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
signal: don't retarget shared signals in a dying thread group [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Mon Sep 21 15:44:54 2026 +0200

    signal: don't retarget shared signals in a dying thread group
    
    commit c0e659511d4f49087da095a95799edb5b775a705 upstream.
    
    If the calling thread has blocked a signal then
    retarget_shared_pending() slingshots a shared pending signal to a
    sibling thread. Today it only skips PF_EXITING threads but not a
    coredumping thread.
    
    But if SIGNAL_GROUP_EXIT is set no thread in the thread-group can
    dequeue such signals anymore as get_signal() sends SIGKILL to every
    thread and prepare_signal() drops any other signal.
    
    exit_signals() also returns early on SIGNAL_GROUP_EXIT. But neither
    sigprocmask() nor the mask restore in sigtimedwait() do.
    
    Say a thread sleeps in sigtimedwait() and a sibling thread crashes. The
    sleeping thread gets woken by the zap call. It restores its mask on the
    way out and retargets a signal that was queued for the coredumping
    process. That means TIF_SIGPENDING is set on the coredumping task which
    zap_threads() had cleared. So a blocking write sees TIF_SIGPENDING and
    truncates the dump.
    
    Stop retargeting signals when SIGNAL_GROUP_EXIT is set and avoid
    needlessly truncating coredumps.
    
    Fixes: e6fa16ab9c1e ("signal: sigprocmask() should do retarget_shared_pending()")
    Cc: [email protected]
    Acked-by: Oleg Nesterov <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
skmsg: Skip zero length skb in sk_msg_recvmsg [+ + +]
Author: Geliang Tang <[email protected]>
Date:   Mon Oct 19 18:35:44 2026 +0200

    skmsg: Skip zero length skb in sk_msg_recvmsg
    
    [ Upstream commit f0c18025693707ec344a70b6887f7450bf4c826b ]
    
    When running BPF selftests (./test_progs -t sockmap_basic) on a Loongarch
    platform, the following kernel panic occurs:
    
      [...]
      Oops[#1]:
      CPU: 22 PID: 2824 Comm: test_progs Tainted: G           OE  6.10.0-rc2+ #18
      Hardware name: LOONGSON Dabieshan/Loongson-TC542F0, BIOS Loongson-UDK2018
         ... ...
         ra: 90000000048bf6c0 sk_msg_recvmsg+0x120/0x560
        ERA: 9000000004162774 copy_page_to_iter+0x74/0x1c0
       CRMD: 000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE)
       PRMD: 0000000c (PPLV0 +PIE +PWE)
       EUEN: 00000007 (+FPE +SXE +ASXE -BTE)
       ECFG: 00071c1d (LIE=0,2-4,10-12 VS=7)
      ESTAT: 00010000 [PIL] (IS= ECode=1 EsubCode=0)
       BADV: 0000000000000040
       PRID: 0014c011 (Loongson-64bit, Loongson-3C5000)
      Modules linked in: bpf_testmod(OE) xt_CHECKSUM xt_MASQUERADE xt_conntrack
      Process test_progs (pid: 2824, threadinfo=0000000000863a31, task=...)
      Stack : ...
      Call Trace:
      [<9000000004162774>] copy_page_to_iter+0x74/0x1c0
      [<90000000048bf6c0>] sk_msg_recvmsg+0x120/0x560
      [<90000000049f2b90>] tcp_bpf_recvmsg_parser+0x170/0x4e0
      [<90000000049aae34>] inet_recvmsg+0x54/0x100
      [<900000000481ad5c>] sock_recvmsg+0x7c/0xe0
      [<900000000481e1a8>] __sys_recvfrom+0x108/0x1c0
      [<900000000481e27c>] sys_recvfrom+0x1c/0x40
      [<9000000004c076ec>] do_syscall+0x8c/0xc0
      [<9000000003731da4>] handle_syscall+0xc4/0x160
      Code: ...
      ---[ end trace 0000000000000000 ]---
      Kernel panic - not syncing: Fatal exception
      Kernel relocated by 0x3510000
       .text @ 0x9000000003710000
       .data @ 0x9000000004d70000
       .bss  @ 0x9000000006469400
      ---[ end Kernel panic - not syncing: Fatal exception ]---
      [...]
    
    This crash happens every time when running sockmap_skb_verdict_shutdown
    subtest in sockmap_basic.
    
    This crash is because a NULL pointer is passed to page_address() in the
    sk_msg_recvmsg(). Due to the different implementations depending on the
    architecture, page_address(NULL) will trigger a panic on Loongarch
    platform but not on x86 platform. So this bug was hidden on x86 platform
    for a while, but now it is exposed on Loongarch platform. The root cause
    is that a zero length skb (skb->len == 0) was put on the queue.
    
    This zero length skb is a TCP FIN packet, which was sent by shutdown(),
    invoked in test_sockmap_skb_verdict_shutdown():
    
            shutdown(p1, SHUT_WR);
    
    In this case, in sk_psock_skb_ingress_enqueue(), num_sge is zero, and no
    page is put to this sge (see sg_set_page in sg_set_page), but this empty
    sge is queued into ingress_msg list.
    
    And in sk_msg_recvmsg(), this empty sge is used, and a NULL page is got by
    sg_page(sge). Pass this NULL page to copy_page_to_iter(), which passes it
    to kmap_local_page() and to page_address(), then kernel panics.
    
    To solve this, we should skip this zero length skb. So in sk_msg_recvmsg(),
    if copy is zero, that means it's a zero length skb, skip invoking
    copy_page_to_iter(). We are using the EFAULT return triggered by
    copy_page_to_iter to check for is_fin in tcp_bpf.c.
    
    [moved the change from sk_msg_recvmsg in net/core/skmsg.c to
    __tcp_bpf_recvmsg in net/ipv4/tcp_bpf.c, as we are before
    2bc793e3272a13e337416c057cb81c5396ad91d1 ("skmsg: Extract
    __tcp_bpf_recvmsg() and tcp_bpf_wait_data()")
    
    Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface")
    Suggested-by: John Fastabend <[email protected]>
    Signed-off-by: Geliang Tang <[email protected]>
    Signed-off-by: Daniel Borkmann <[email protected]>
    Reviewed-by: John Fastabend <[email protected]>
    Link: https://lore.kernel.org/bpf/e3a16eacdc6740658ee02a33489b1b9d4912f378.1719992715.git.tanggeliang@kylinos.cn
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Miguel Gazquez (Schneider Electric) <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
smb/client: pass cifs_open_info_data to SMB2_open() [+ + +]
Author: ChenXiaoSong <[email protected]>
Date:   Thu Oct 1 07:01:01 2026 -0400

    smb/client: pass cifs_open_info_data to SMB2_open()
    
    [ Upstream commit 1f551e407bb49dce0bbd34ed6a499dad69e18020 ]
    
    Let SMB2_open() fill the smb2_file_all_info embedded in cifs_open_info_data
    directly. This removes the temporary smb2_file_all_info copy in
    smb2_open_file().
    
    Signed-off-by: ChenXiaoSong <[email protected]>
    Signed-off-by: Steve French <[email protected]>
    
    [5.10 dependency adaptation]
    This tree still uses fs/cifs and does not define cifs_open_info_data.
    Keep the existing SMB2_open() argument type and the FILE_ALL_INFO
    conversion in smb2_open_file(); drop the wrapper-type and caller changes.
    Use the dependency's file_info pointer directly on the existing buffer
    inside SMB2_open(), preserving the stable metadata-copy behavior.
    
    Move the existing open_done trace after smb2_parse_contexts(), retaining
    its six-argument stable signature. Together with the file_info argument,
    this allows 566820af017e ("smb: client: close handle after create-context
    parsing failure") to cherry-pick cleanly across the directory rename.
    No functions are added, and the target's close-on-error fix remains for
    the target commit.
    
    [ sashal: Reduced backport -- upstream 1f551e407bb49 touches 4 file(s), this
      backport carries 1. Not backported here:
      fs/smb/client/link.c
      fs/smb/client/smb2file.c
      fs/smb/client/smb2pdu.c
      fs/smb/client/smb2proto.h
      This note is generated from the file lists only; see the resolution record
      for the reasoning. ]
    
    Stable-dep-of: 566820af017e ("smb: client: close handle after create-context parsing failure")
    Signed-off-by: Sasha Levin <[email protected]>

smb/client: use stack-allocated smb2_file_all_info in smb3_query_mf_symlink() [+ + +]
Author: ChenXiaoSong <[email protected]>
Date:   Thu Oct 1 07:01:00 2026 -0400

    smb/client: use stack-allocated smb2_file_all_info in smb3_query_mf_symlink()
    
    [ Upstream commit fc8789bb57e625e5f32ac57ca2e7d3e7b7fda225 ]
    
    SMB2_open() only fills the fixed fields, so a stack-allocated
    smb2_file_all_info is sufficient here.
    
    Signed-off-by: ChenXiaoSong <[email protected]>
    Signed-off-by: Steve French <[email protected]>
    Stable-dep-of: 566820af017e ("smb: client: close handle after create-context parsing failure")
    Signed-off-by: Sasha Levin <[email protected]>

 
smb3: make query_on_disk_id open context consistent and move to common code [+ + +]
Author: Steve French <[email protected]>
Date:   Wed Sep 30 13:49:00 2026 -0400

    smb3: make query_on_disk_id open context consistent and move to common code
    
    [ Upstream commit 1149c8467ddebfb6bb9aab37830f70a49cab7085 ]
    
    cifs and ksmbd were using a slightly different version of the query_on_disk_id
    struct which could be confusing. Use the ksmbd version of this struct, and
    move it to common code.
    
    Reviewed-by: Paulo Alcantara (SUSE) <[email protected]>
    Signed-off-by: Steve French <[email protected]>
    
    [5.15 dependency adaptation for 67f4c1c6a1b:
    Keep the create-context declarations in the existing per-subsystem headers.
    This tree has not consolidated create_context into smbfs_common, and ksmbd
    still defines its own SMB2 headers. Moving the response into the common
    header would require unrelated header conversions.
    
    Retain the client response rename and match ksmbd's 16-byte Reserved array,
    without changing the packed wire layout. Leave the ksmbd and common headers
    unchanged and omit the upstream common-header lease comments.
    
    Rename the client's lease-break flag and both existing parser uses to the
    upstream _LE spelling. This is a value-preserving prerequisite for the
    target's lease-parser changes; no functions are added.]
    
    [ sashal: Reduced backport -- upstream 1149c8467ddeb touches 4 file(s), this
      backport carries 3. Not backported here:
      fs/ksmbd/smb2pdu.h
      fs/smbfs_common/smb2pdu.h
      This note is generated from the file lists only; see the resolution record
      for the reasoning. ]
    
    Stable-dep-of: 67f4c1c6a1b5 ("smb: client: fix create context out-of-bounds reads")
    Signed-off-by: Sasha Levin <[email protected]>

 
smb: client: avoid leaking refcount in cifs_queue_oplock_break() [+ + +]
Author: Bjoern Doebel <[email protected]>
Date:   Thu Sep 17 09:15:35 2026 -0400

    smb: client: avoid leaking refcount in cifs_queue_oplock_break()
    
    [ Upstream commit 9f2e63f1b2d5fc5b5423424902c091123e220e7e ]
    
    cifs_queue_oplock_break() unconditionally takes a reference on the
    target file before queueing cifs_oplock_break(). Only that work item
    decreases the reference counter again.
    
    If another oplock break arrives while that work is still queued,
    queue_work() will return false and not queue this second work item. As a
    result, we will never reach the point to drop the file reference again
    and are leaking this reference. This can be triggered when interacting
    with a slow-responding server.
    
    As a result, later unmount operations for this file system will fail with
    
      BUG: Dentry ... still in use (1) [unmount of cifs cifs]
      VFS: Busy inodes after unmount of cifs (cifs)
      kernel BUG at fs/super.c:777!
    
    Fix this by only incrementing the reference count if the work has been
    queued successfully. Taking it after queue_work() is safe because all
    three callers hold tcon->open_file_lock across the call and
    _cifsFileInfo_put() decrements under that same lock, so a worker that
    starts the handler in the window cannot drop the reference before it has
    been taken.
    
    Fixes: b98749cac4a69 ("CIFS: keep FileInfo handle live during oplock break")
    Cc: [email protected]
    Assisted-by: Kiro:claude-opus-5
    Signed-off-by: Bjoern Doebel <[email protected]>
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Adjusted the patch path from fs/smb/client/misc.c to fs/cifs/misc.c. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: clear setuid/setgid bit on write with cifsacl/modefromsid/posix extensions [+ + +]
Author: Jiangshan Yi <[email protected]>
Date:   Tue Oct 6 16:14:19 2026 +0000

    smb: client: clear setuid/setgid bit on write with cifsacl/modefromsid/posix extensions
    
    [ Upstream commit b8e5dc4f95e5484159b343903f302eb6d783f2e6 ]
    
    When a file has the setuid or setgid bit set and is written to, the VFS
    strips those bits and issues a setattr with ATTR_KILL_SUID/ATTR_KILL_SGID
    together with an ATTR_MODE carrying the already-cleared mode.
    
    Both cifs_setattr_unix() and cifs_setattr_nounix() unconditionally dropped
    ATTR_MODE in that case:
    
            /* skip mode change if it's just for clearing setuid/setgid */
            if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID))
                    attrs->ia_valid &= ~ATTR_MODE;
    
    This is fine for the default mount, where the mode is only emulated via
    the DOS read-only attribute and cannot represent the setuid/setgid bits
    anyway.  However, with the "cifsacl" or "modefromsid" mount options the
    mode is stored on the server through an ACL (id_mode_to_cifs_acl()), with
    the SMB3.1.1 POSIX extensions the mode is sent to the server directly,
    and with the SMB1 Unix extensions (cifs_setattr_unix) the mode is sent
    via CIFSSMBUnixSetPathInfo().  In all those cases dropping ATTR_MODE means
    the cleared mode is never pushed to the server, so the setuid/setgid bit
    survives the write.
    
    This is a security issue: on local filesystems the setuid bit is stripped
    when a file is written, but over these cifs.ko mounts the bit persists on
    the server, potentially allowing an unexpected privilege escalation on
    subsequent execution.
    
    Fix this in two places:
    
      1. cifs_setattr_nounix(): only take the "skip mode change" shortcut
         when the mode is emulated via the DOS read-only attribute (i.e.
         neither cifsacl/modefromsid nor the SMB3.1.1 POSIX extensions are
         in effect), so that the cleared mode is propagated to the server
         in the ACL / POSIX cases.
    
      2. cifs_setattr_unix(): this function is only called when Unix
         extensions are in effect, so the mode is always stored on the
         server.  Remove the shortcut entirely so that the cleared mode is
         always pushed.
    
    Fixes: d32c4f2626ac ("CIFS: ignore mode change if it's just for clearing setuid/setgid bits")
    Cc: [email protected]
    Signed-off-by: Jiangshan Yi <[email protected]>
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Backport note for 5.10: code lives in fs/cifs/inode.c; no sbflags
      local exists here, so test cifs_sb->mnt_cifs_flags directly (same flag
      bits). Drop the upstream posix_extensions clause: 5.10 lacks
      d413eabff18d ("fs/smb/client: implement chmod() for SMB3 POSIX
      Extensions"), so cifs_setattr_nounix() has no POSIX ATTR_MODE branch;
      match its CIFS_ACL/MODE_FROM_SID check. ]
    Signed-off-by: Bjoern Doebel <[email protected]>
    Assisted-by: opencode:kimi-k3
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: close completed creates on compound wait errors [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 30 20:59:10 2026 -0400

    smb: client: close completed creates on compound wait errors
    
    [ Upstream commit 6c5c547f037bc18f0b8d0b5db5a648f8f630ce85 ]
    
    compound_send_recv() waits for responses in order. If a later wait is
    interrupted, or if a later MID fails during response synchronization, an
    earlier CREATE may already have opened a remote handle. The earlier mid
    is then released without invoking handle_cancelled_mid(), leaving the
    remote handle open because no FID was copied to the caller.
    
    Mark completed earlier mids as cancelled when a compound wait or MID
    synchronization aborts. Keep their response buffers attached while the
    MIDs are synchronized, and transfer them only after synchronization of
    the processed responses, so the release path can inspect successful
    CREATE responses and queue SMB2_close() after a later failure. Account for
    a remote open only after the close work is allocated and before it is
    queued, since the caller has not yet updated num_remote_opens. Mark the
    create+close compound used by smb2_unlink() so it is not closed again.
    Non-CREATE responses and compounds that already include a close keep their
    existing behavior.
    
    Fixes: e0bba0b85481 ("cifs: add compound_send_recv()")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Luxing Yin <[email protected]>
    Signed-off-by: Luxing Yin <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Tested-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ adapted MID cancellation to use 5.10’s GlobalMid_Lock and MID_WAIT_CANCELLED flag. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: close handle after create-context parsing failure [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Thu Oct 1 07:01:02 2026 -0400

    smb: client: close handle after create-context parsing failure
    
    [ Upstream commit 566820af017e81497fb5e9d3ad6e7ffe2828bc8b ]
    
    SMB2_open() accounts a successful CREATE response as a remote open before
    parsing its create contexts.  If smb2_parse_contexts() rejects malformed
    context data, SMB2_open() returns without closing the handle, leaving the
    server-side handle open and num_remote_opens elevated.
    
    Close the handle after a post-CREATE context parsing failure so the error
    path releases the remote resource and balances the open count.
    
    Fixes: af1689a9b770 ("smb: client: fix potential OOBs in smb2_parse_contexts()")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Luxing Yin <[email protected]>
    Signed-off-by: Luxing Yin <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Tested-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix create context out-of-bounds reads [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 30 13:49:01 2026 -0400

    smb: client: fix create context out-of-bounds reads
    
    [ Upstream commit 67f4c1c6a1b51e203d986779299824d1c2c590a6 ]
    
    smb2_parse_contexts() validates the complete create-context area but
    does not limit each record to its Next field before dispatching it.  A
    malformed chain can therefore expose bytes beyond the current context to
    a handler.  The QFid handler also used a full response-structure cast
    although it only reads DiskFileId.
    
    The SMB2/SMB3 lease parsers made the same layout assumption: they read
    LeaseState and LeaseFlags at canonical offsets rather than at
    DataOffset.  A valid non-canonical DataOffset could therefore yield
    unrelated in-bounds data, while a short DataLength was still accepted.
    
    Limit each context to its Next value, reject offsets before the context
    header, and reject malformed chains.  Bound the name range by the current
    context and do not dispatch a known handler when DataLength is zero.  Read
    the QFid DiskFileId only when the context data covers that field.  Parse the
    lease context from DataOffset and require DataLength to match the v1 or v2
    lease_context size used by ksmbd.  A size mismatch skips lease parsing
    without failing the open.
    
    Fixes: b8c32dbb0deb ("CIFS: Request SMB2.1 leases")
    Fixes: f047390a097e ("CIFS: Add create lease v2 context for SMB3")
    Fixes: 89a5bfa350fa ("smb3: optimize open to not send query file internal info")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Luxing Yin <[email protected]>
    Signed-off-by: Luxing Yin <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Tested-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix file type corruption in cifs_reparse_point_to_fattr() [+ + +]
Author: Paulo Alcantara <[email protected]>
Date:   Thu Sep 17 09:10:39 2026 -0400

    smb: client: fix file type corruption in cifs_reparse_point_to_fattr()
    
    [ Upstream commit 6bd360447941357e959414a525aa62576a448116 ]
    
    Setting the file type in cf_mode without clearing the existing S_IFMT
    bits first is wrong as it corrupts the file type when cf_mode already
    has type bits set (e.g. S_IFREG | S_IFLNK == S_IFDIR | S_IFREG).
    
    Clear S_IFMT before setting S_IFLNK for native and SMB1 symlinks.
    
    Closes: https://sashiko.dev/#/patchset/20260906181540.647469-1-pc%40manguebit.org
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Cc: Ronnie Sahlberg <[email protected]>
    Cc: Shyam Prasad N <[email protected]>
    Cc: Tom Talpey <[email protected]>
    Cc: Bharath SM <[email protected]>
    Cc: [email protected]
    [ Moved the fix from missing reparse.c to smb311_posix_info_to_fattr() in inode.c. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix next_buffer UAF and NextCommand bounds in compound PDUs [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Tue Sep 22 21:40:21 2026 -0400

    smb: client: fix next_buffer UAF and NextCommand bounds in compound PDUs
    
    [ Upstream commit 05762c5bc1cfdcac36747994fde2c04387a457f1 ]
    
    Fix several related bounds checking and pointer lifecycle issues in
    receive_encrypted_standard()'s handling of compound encrypted frames:
    
    - Clear next_buffer after assigning it to server->bigbuf. A stale
      next_buffer pointer can lead to a use-after-free on subsequent
      error paths.
    - Update pdu_length to the decrypted plaintext size (buf_size). Using
      the pre-decryption length allows NextCommand to point into stale
      ciphertext residue.
    - Reject next_cmd values smaller than MID_HEADER_SIZE(server).
    - Fix an integer overflow in the upper bound check by verifying
      pdu_length - next_cmd < MID_HEADER_SIZE(server), ensuring the
      trailing slice is large enough for a header.
    
    Fixes: b24df3e30cbf ("cifs: update receive_encrypted_standard to handle compounded responses")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Replaced unavailable MID_HEADER_SIZE(server) with (HEADER_SIZE(server) - 1). ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix OOB read/write from unvalidated DataOffset in coalesce_t2() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Mon Sep 7 10:26:28 2026 -0400

    smb: client: fix OOB read/write from unvalidated DataOffset in coalesce_t2()
    
    [ Upstream commit 6343c1da561962688f203362d80d6a3bfa39fa1b ]
    
    coalesce_t2() computes data pointers directly from server-supplied
    DataOffset fields with no validation against buffer bounds:
    
      data_area_of_tgt = (char *)&pSMBt->hdr.Protocol +
                         get_unaligned_le16(&pSMBt->t2_rsp.DataOffset);
      data_area_of_src = (char *)&pSMBs->hdr.Protocol +
                         get_unaligned_le16(&pSMBs->t2_rsp.DataOffset);
      data_area_of_tgt += total_in_tgt;
      ...
      memcpy(data_area_of_tgt, data_area_of_src, total_in_src);
    
    A small DataOffset can push a pointer below the actual byte area,
    overwriting header fields; a large one can push it past the buffer
    end, causing out-of-bounds heap reads (source) or writes (target).
    The BCC overflow guard does not prevent this: BCC reflects how much
    data is present, while DataOffset controls where in the buffer it
    starts.
    
    The "validate target area" comment present since the function was
    first written in 2005 was a placeholder that was never implemented.
    
    Add lower- and upper-bound checks for both data pointers before the
    memcpy, and before any target header fields are modified.
    
    Fixes: e4eb295d38b5 ("[PATCH] cifs: Handle multiple response transact2 part 1 of 2")
    Cc: [email protected]
    Reported-by: Shen Yongchao <[email protected]>
    Signed-off-by: Frank Sorenson <[email protected]>
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ transplanted the bounds validation to coalesce_t2() in smb1ops.c due to code relocation ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix OOB struct field reads in move_smb2_ea_to_cifs() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Tue Sep 22 22:03:03 2026 -0400

    smb: client: fix OOB struct field reads in move_smb2_ea_to_cifs()
    
    [ Upstream commit eeb5ef6083e1cefa2ef75041b5597ff228b8d7bb ]
    
    In move_smb2_ea_to_cifs(), the while (src_size > 0) loop condition is
    insufficient. It allows iteration to continue even if the remaining
    src_size is too small to contain a complete smb2_ea_info structure.
    Consequently, reads of ea_name_length and ea_value_length can occur
    out-of-bounds.
    
    Fix this by ensuring src_size >= sizeof(*src) before attempting to read
    any structure fields. Additionally, reject any next_entry_offset that is
    smaller than sizeof(*src) or that would advance the pointer beyond the
    available buffer.
    
    Note that for calls where the server returns a malformed EA list, the
    error returned to userspace changes from -ENODATA (getxattr) or
    -ERANGE (listxattr) to -EIO. This correctly signals a server protocol
    error rather than misleadingly indicating "attribute not present" or
    "output buffer too small".
    
    Fixes: 95907fea4fd8 ("cifs: Add support for reading attributes on SMB2+")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    [ Replaced unavailable smb_EIO2() tracing calls with -EIO. ]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix potential OOB read in smb3_enum_snapshots() [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Tue Sep 22 17:23:32 2026 -0400

    smb: client: fix potential OOB read in smb3_enum_snapshots()
    
    [ Upstream commit 4775c3b7a597907e0b97556c7986fda238a377ae ]
    
    If snapshot_array_size is smaller than GMT_TOKEN_SIZE,
    smb3_enum_snapshots() sets ret_data_len to
    sizeof(struct smb_snapshot_array) without verifying the actual length
    of the server's reply.
    
    Because SMB2_ioctl() places no lower bound on the server-supplied
    OutputCount and allocates retbuf to exactly that length, a short reply
    results in ret_data_len exceeding the size of retbuf. The subsequent
    copy_to_user() then reads past the end of retbuf, leaking adjacent slab
    memory to userspace.  The subsequent clamp check is ineffective as it
    only reduces ret_data_len.
    
    Fix this by rejecting replies shorter than
    sizeof(struct smb_snapshot_array) with -EIO. Note that the bound is set
    to the 12-byte struct size rather than the 16-byte
    MIN_SNAPSHOT_ARRAY_SIZE defined in MS-SMB2 3.3.5.15.1, because 12 bytes
    is exactly what copy_to_user() attempts to read.
    
    Fixes: e02789a53d71 ("smb3: enumerating snapshots was leaving part of the data off end")
    Cc: [email protected]
    Signed-off-by: Frank Sorenson <[email protected]>
    Reviewed-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: fix smbd_connection leak on cifs_get_tcp_session() error [+ + +]
Author: Paulo Alcantara <[email protected]>
Date:   Tue Sep 22 15:40:43 2026 -0400

    smb: client: fix smbd_connection leak on cifs_get_tcp_session() error
    
    [ Upstream commit e75c96157d45e498970158c8f7373d90102e33b9 ]
    
    When an RDMA connection is successfully established via
    smbd_get_connection() but cifs_get_tcp_session() later fails (e.g.
    kthread_create() returns an error), the error path frees tcp_ses
    without first destroying the smbd_connection.
    
    Fix this by calling smbd_destroy() in the out_err cleanup path before
    kfree(tcp_ses).  smbd_destroy() safely handles the case where
    smbd_conn is NULL, so it can be called unconditionally.
    
    Closes: https://sashiko.dev/#/patchset/20260912165503.521597-1-pc%40manguebit.org
    Fixes: 2f8946464b11 ("CIFS: SMBD: Upper layer connects to SMBDirect session")
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Cc: Tom Talpey <[email protected]>
    Cc: Stefan Metzmacher <[email protected]>
    Cc: Shyam Prasad N <[email protected]>
    Cc: Ronnie Sahlberg <[email protected]>
    Cc: Bharath SM <[email protected]>
    Cc: Namjae Jeon <[email protected]>
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: reject userspace cifs.idmap descriptions [+ + +]
Author: Aohan Mei <[email protected]>
Date:   Wed Sep 16 23:29:25 2026 -0400

    smb: client: reject userspace cifs.idmap descriptions
    
    [ Upstream commit d9d7eeb0cea5b55b82888f443622fd8d4ee064f3 ]
    
    cifs.idmap key descriptions carry authority-bearing fields (owner and
    group SIDs and uid/gid values in "os:"/"gs:"/"oi:"/"gi:" form) that the
    cifs.idmap upcall helper treats as kernel-originating inputs.  Unlike
    its sibling cifs.spnego, the cifs.idmap key type has no vet_description
    hook, so userspace can create keys of this type through
    request_key(2)/add_key(2) and supply those fields without CIFS origin.
    A request_key(2) call with a non-NULL callout then drives a root
    usermodehelper upcall (/sbin/request-key -> cifs.idmap) that consumes
    the unvetted description in root context.
    
    Only accept cifs.idmap descriptions while CIFS is using its private
    root_cred to request the key.  id_to_sid()/sid_to_id() already run
    under override_creds(root_cred), so the kernel-originated path is
    unaffected.
    
    This mirrors commit 3da1fdf4efbc ("smb: client: reject userspace
    cifs.spnego descriptions"), which applied the same restriction to
    cifs.spnego.
    
    Fixes: 4d79dba0e007 ("cifs: Add idmap key and related data structures and functions (try #17 repost)")
    Reported-by: TencentOS Corvus AI <[email protected]>
    Cc: [email protected]
    Assisted-by: CodeBuddy:Kimi-K3
    Signed-off-by: Aohan Mei <[email protected]>
    Acked-by: David Howells <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: split cifsFileInfo bitfields to avoid shared-byte RMW races [+ + +]
Author: Frank Sorenson <[email protected]>
Date:   Mon Oct 5 12:52:31 2026 -0500

    smb: client: split cifsFileInfo bitfields to avoid shared-byte RMW races
    
    [ Upstream commit 19465a9aeb664f1d710d0d22c07c31bfb7c85446 ]
    
    The invalidHandle, swapfile, oplock_break_cancelled, offload,
    and status_file_deleted fields are stored in the same bitfield byte
    in struct cifsFileInfo, but are updated in different code paths that
    may run simultaneously, and are protected by different locks.  Since
    bitfield assignments generate byte-level read-modify-write operations,
    a modification to one flag can overwrite a concurrent modification to
    another flag.
    
    To avoid these races, convert these flags from a bitfield to
    separate bool fields.
    
    Closes: https://lore.kernel.org/r/[email protected]
    Fixes: 3bc303c254335 ("cifs: convert oplock breaks to use slow_work facility (try #4)")
    Fixes: 4e8aea30f7751 ("smb3: enable swap on SMB3 mounts")
    Fixes: ffceb7640cbfe ("smb: client: do not defer close open handles to deleted files")
    Fixes: 173217bd73365 ("smb3: retrying on failed server close")
    Signed-off-by: Frank Sorenson <[email protected]>
    Cc: [email protected]
    Reviewed-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    (cherry picked from commit 19465a9aeb664f1d710d0d22c07c31bfb7c85446)
    [ status_file_deleted and offload not present in kernel 5.10 ]
    Signed-off-by: Frank Sorenson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: use finish_no_open() for non-regular inodes [+ + +]
Author: Namjae Jeon <[email protected]>
Date:   Wed Sep 30 14:41:55 2026 -0400

    smb: client: use finish_no_open() for non-regular inodes
    
    [ Upstream commit e66cf1625ec4a3fe68346119f371def713fd0a4d ]
    
    An O_CREAT open can find an existing symlink or another non-regular
    inode. cifs_atomic_open() calls finish_open() on it and attaches a
    cifsFileInfo. Symlink inodes have no CIFS release operation, so the
    dentry reference held by cifsFileInfo is leaked. FMODE_OPENED also
    prevents the VFS from following the symlink.
    
    Track whether cifs_do_create() returned an open server handle. For
    non-regular inodes, close the handle if present, remove the pending
    open, and call finish_no_open() so the VFS can continue the lookup.
    Do not set FMODE_CREATED unless a regular file was opened. For
    O_NOFOLLOW with __O_REGULAR, return -ELOOP before the VFS's
    -EFTYPE check.
    
    Defer closing a legacy POSIX handle on a non-regular inode until
    after inode lookup. This avoids closing it again if lookup fails.
    
    Fixes: d2c127197dfc ("cifs: implement i_op->atomic_open()")
    Signed-off-by: Namjae Jeon <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Cc: [email protected]
    Signed-off-by: Sasha Levin <[email protected]>

smb: client: validate POSIX create context length [+ + +]
Author: Zihan Xi <[email protected]>
Date:   Wed Sep 30 12:11:57 2026 -0400

    smb: client: validate POSIX create context length
    
    [ Upstream commit fa2e9900dd2a3f5a1e7ef5a8c5e8d435feedbfcc ]
    
    parse_posix_ctxt() reads the fixed nlink, reparse_tag, and mode fields
    before checking that the POSIX create context contains them.  A short
    context can pass the generic checks and still make these fixed-width
    reads run past its declared data.
    
    The current in-tree smb2_open_file() path passes a NULL posix pointer,
    so this handler is not reached on the ordinary open path.  Still require
    the POSIX data to cover all three fields before reading them because the
    helper performs those unguarded reads.  Keep the existing soft-failure
    behavior so malformed optional metadata does not fail the open.
    
    Fixes: 69dda3059e7a ("cifs: add SMB2_open() arg to return POSIX data")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Luxing Yin <[email protected]>
    Signed-off-by: Luxing Yin <[email protected]>
    Signed-off-by: Zihan Xi <[email protected]>
    Tested-by: Frank Sorenson <[email protected]>
    Signed-off-by: Paulo Alcantara <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
soc: qcom: geni-se: Correct QUP Core ICC vote constants [+ + +]
Author: Viken Dadhaniya <[email protected]>
Date:   Mon Oct 5 10:10:27 2026 -0400

    soc: qcom: geni-se: Correct QUP Core ICC vote constants
    
    [ Upstream commit 1cd9b1be5a9c56fd69e3f555b200a1844f9b873e ]
    
    The GENI_TO_CORE ("qup-core") ICC vote selects the QUP Core 2X clock
    rate. The CORE_2X_*_MHZ constants are expressed in Bps, but their
    values are several orders of magnitude too small. For example, the
    50 MHz threshold is represented by 2500 rather than 25000000 Bps.
    
    As a result, clients using these constants can severely under-vote the
    QUP Core clock.
    
    Correct the constants to their intended Bps thresholds so that the ICC
    provider selects the corresponding QUP Core 2X clock rate. Drop the unused
    definitions.
    
    Fixes: 58ffbba6a399 ("soc: qcom: geni: Support for ICC voting")
    Cc: [email protected]
    Signed-off-by: Viken Dadhaniya <[email protected]>
    Reviewed-by: Konrad Dybcio <[email protected]>
    Link: https://patch.msgid.link/20260915-correct-icc-bandwidth-vote-constants-v2-1-f78eb611204e@oss.qualcomm.com
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
spi: bcm63xx: disable clock on resume failure [+ + +]
Author: Can Peng <[email protected]>
Date:   Thu Sep 10 09:01:59 2026 -0400

    spi: bcm63xx: disable clock on resume failure
    
    [ Upstream commit 2b62c2c134fa32d9d3a9e7323c8ac74518eeb4ac ]
    
    bcm63xx_spi_resume() enables the controller clock before restarting the
    SPI controller queue.
    
    If spi_controller_resume() fails, the function currently reports success
    and leaves the clock enabled. Propagate the error and disable the clock
    before returning.
    
    Fixes: b42dfed83d95 ("spi: add Broadcom BCM63xx SPI controller driver")
    Cc: [email protected]
    Signed-off-by: Can Peng <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Mark Brown <[email protected]>
    [ changed spi_controller_resume(host) to spi_master_resume(master) to match the older API and variable name. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
staging: rtl8723bs: fix OOB read in OnAssocRsp() IE loop [+ + +]
Author: Alexandru Hossu <[email protected]>
Date:   Fri May 22 02:45:29 2026 +0200

    staging: rtl8723bs: fix OOB read in OnAssocRsp() IE loop
    
    commit f9654207e92283e0acac5d64fe5f8835383b5a23 upstream.
    
    The IE parsing loop in OnAssocRsp() advances by (pIE->length + 2) each
    iteration but only guards on i < pkt_len. When a malicious AP sends an
    AssocResponse whose last IE has only one byte remaining in the frame
    (the element_id byte lands at pkt_len-1), the loop reads pIE->length
    from pframe[pkt_len], which is one byte past the allocated receive buffer.
    
    Additionally, even when the header bytes are in bounds, pIE->length
    itself can extend the data window beyond pkt_len, silently passing a
    truncated IE to the handler functions.
    
    Add two guards at the top of the loop body:
      1. Break if fewer than sizeof(*pIE) bytes remain (can't read header).
      2. Break if the IE's declared data extends past pkt_len.
    
    Fixes: 554c0a3abf21 ("staging: Add rtl8723bs sdio wifi driver")
    Cc: stable <[email protected]>
    Signed-off-by: Alexandru Hossu <[email protected]>
    Reviewed-by: Luka Gejak <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    [ mdmitrichenko: adapt to 5.10: struct ndis_80211_var_ie still has the
      CamelCase Length field and a one-element data[1] array here, so
      sizeof(*pIE) is 3 rather than the 2-byte IE header. Use the explicit
      header size 2, as the existing i += (pIE->Length + 2) does, so that a
      valid IE ending exactly at pkt_len is not dropped. ]
    Signed-off-by: Mikhail Dmitrichenko <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

staging: rtl8723bs: fix OOB read in rtw_restruct_wmm_ie() [+ + +]
Author: Muhammad Bilal <[email protected]>
Date:   Thu Sep 10 07:42:23 2026 -0400

    staging: rtl8723bs: fix OOB read in rtw_restruct_wmm_ie()
    
    [ Upstream commit 28a289beaf226b30b1e6e7d7b1a2946fe2d6e852 ]
    
    rtw_restruct_wmm_ie() scans in_ie for a WMM IE with:
    
            while (i < in_len) {
                    ...
                    if (i + 5 < in_len && in_ie[i] == 0xDD && ...) {
                            ...
                            break;
                    }
                    i += (in_ie[i + 1] + 2); /* to the next IE element */
            }
    
    When the "i + 5 < in_len" match check fails simply because i is
    within 5 bytes of the end of the buffer (i.e. no WMM IE was found
    near the tail of in_ie), execution falls through to
    "i += (in_ie[i + 1] + 2)", which reads in_ie[i + 1]. If i == in_len
    - 1 at that point, this is a 1-byte out-of-bounds read of an
    attacker-influenced IE buffer built from association/scan data.
    
    Commit a75281626fc8f ("staging: rtl8723bs: fix potential
    out-of-bounds read in rtw_restruct_wmm_ie") added the "i + 5 <
    in_len" guard to the match condition itself, but did not add an
    equivalent guard before the fallthrough advance, so the same class
    of OOB read remained reachable through the non-matching path.
    
    Add an explicit bounds check before advancing to the next IE.
    
    Fixes: 554c0a3abf216 ("staging: Add rtl8723bs sdio wifi driver")
    Cc: [email protected]
    Signed-off-by: Muhammad Bilal <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

staging: rtl8723bs: fix spacing around operators [+ + +]
Author: Vivek BalachandharTN <[email protected]>
Date:   Thu Sep 10 07:42:22 2026 -0400

    staging: rtl8723bs: fix spacing around operators
    
    [ Upstream commit 2038fe84b8bdf894b634f777096685e78e8f3774 ]
    
    Fix several instances where operators lacked spaces around them.
    This improves readability and brings the driver closer to kernel
    coding-style guidelines. No functional change.
    
    Signed-off-by: Vivek BalachandharTN <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    
    For this stable dependency, retain only the spacing change to the IE
    advance in rtw_restruct_wmm_ie(). This supplies the exact context needed
    by target commit 28a289beaf226 ("staging: rtl8723bs: fix OOB read in
    rtw_restruct_wmm_ie()"). Drop the unrelated operator-spacing hunks.
    
    Keep the existing bounds-first WMM match condition from stable commit
    4dd2d9cf563c5 (upstream a75281626fc8f); applying the older condition
    would undo its out-of-bounds-read fix. No functional change.
    
    Stable-dep-of: 28a289beaf22 ("staging: rtl8723bs: fix OOB read in rtw_restruct_wmm_ie()")
    Signed-off-by: Sasha Levin <[email protected]>

staging: sm750fb: fix mono image source stride mismatch in lynxfb_ops_imageblit() [+ + +]
Author: Muhammad Bilal <[email protected]>
Date:   Thu Sep 10 08:53:02 2026 -0400

    staging: sm750fb: fix mono image source stride mismatch in lynxfb_ops_imageblit()
    
    [ Upstream commit cc7cd2a9228175c975f62ad56ed7c767701cb4fa ]
    
    sm750_hw_imageblit() advances its monochrome source pointer by
    src_delta per scanline, and computes the correct rounded-up stride
    internally as:
    
            bytes_per_scan = (width + start_bit + 7) / 8;
    
    Its only caller, lynxfb_ops_imageblit(), instead passed src_delta as
    image->width >> 3. For widths not a multiple of 8 this under-counted
    the stride, so the source pointer fell further behind the real
    per-scanline layout on every line, corrupting the rendered image.
    
    Rather than just fixing the caller's calculation, remove src_delta
    as a parameter entirely and have sm750_hw_imageblit() advance by the
    bytes_per_scan it already computes for itself. There has only ever
    been one caller, and that caller was passing an out-of-sync
    derivative of the same width/start_bit values sm750_hw_imageblit()
    already has, so keeping stride as a separate parameter served no
    purpose beyond letting the two calculations drift apart, which is
    exactly what happened here.
    
    Rounding up, rather than down, is the direction consistent with the
    rest of the fbdev core: struct fb_image mono bitmap data (the same
    image->data this driver receives) is walked elsewhere with byte
    strides derived from a ceiling division of width by 8. The generic
    mono bit iterator in drivers/video/fbdev/core/fb_imageblit.h advances
    scanlines with "iter->data += BITS_TO_BYTES(iter->width)", and
    BITS_TO_BYTES() (include/linux/bitops.h) is a ceiling division.
    sm750_hw_imageblit()'s own "(width + start_bit + 7) / 8" is that same
    ceiling division with an added start_bit offset, so the caller's
    ">> 3" (floor) was the one calculation out of step with how this data
    layout is handled everywhere else.
    
    Found by code review of sm750_hw_imageblit()'s internal stride
    calculation against what its only caller was passing in, and
    confirmed with a clean -Werror build. I do not have this hardware,
    so this has not been exercised at runtime on real sm750 silicon.
    
    Fixes: 81dee67e215b2 ("staging: sm750fb: add sm750 to staging")
    Cc: [email protected]
    Reviewed-by: Dan Carpenter <[email protected]>
    Signed-off-by: Muhammad Bilal <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ adapted the patch to older sm750fb identifiers and unnamed de_imageblit parameters. ]
    Signed-off-by: Sasha Levin <[email protected]>

staging: sm750fb: sm750_accel: Provide description for 'accel' and fix function naming [+ + +]
Author: Lee Jones <[email protected]>
Date:   Thu Sep 10 08:53:01 2026 -0400

    staging: sm750fb: sm750_accel: Provide description for 'accel' and fix function naming
    
    [ Upstream commit d12dd1e0e3b96b1a2c9ffdb0fa9c115aeb82b569 ]
    
    Fixes the following W=1 kernel build warning(s):
    
     drivers/staging/sm750fb/sm750_accel.c:155: warning: Function parameter or member 'accel' not described in 'sm750_hw_copyarea'
     drivers/staging/sm750fb/sm750_accel.c:155: warning: expecting prototype for sm750_hm_copyarea(). Prototype was for sm750_hw_copyarea() instead
     drivers/staging/sm750fb/sm750_accel.c:321: warning: Function parameter or member 'accel' not described in 'sm750_hw_imageblit'
    
    Cc: Sudip Mukherjee <[email protected]>
    Cc: Teddy Wang <[email protected]>
    Cc: Greg Kroah-Hartman <[email protected]>
    Cc: [email protected]
    Cc: [email protected]
    Signed-off-by: Lee Jones <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: cc7cd2a92281 ("staging: sm750fb: fix mono image source stride mismatch in lynxfb_ops_imageblit()")
    Signed-off-by: Sasha Levin <[email protected]>

staging: vchiq_arm: Avoid NULL ptr deref in vchiq_dump_platform_instances [+ + +]
Author: Stefan Wahren <[email protected]>
Date:   Sun Jan 23 21:02:21 2022 +0100

    staging: vchiq_arm: Avoid NULL ptr deref in vchiq_dump_platform_instances
    
    commit aa899e686d442c63d50f4d369cc02dbbf0941cb0 upstream.
    
    vchiq_get_state() can return a NULL pointer. So handle this cases and
    avoid a NULL pointer derefence in vchiq_dump_platform_instances.
    
    Reviewed-by: Nicolas Saenz Julienne <[email protected]>
    Signed-off-by: Stefan Wahren <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Roman Demidov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
strparser: make sure __strp_recv isn't running before tearing down the parser [+ + +]
Author: Sabrina Dubroca <[email protected]>
Date:   Mon Oct 5 15:50:02 2026 +0200

    strparser: make sure __strp_recv isn't running before tearing down the parser
    
    commit 0984ebc631792acf8fff105112ee74a6b8f1efcc upstream.
    
    The comment above strp_done() claims that if strp is stopped,
    strp_recv will no longer be called. That's only true if the caller has
    a mechanism (eg locking) to guarantee that strp_recv() calls that
    started before strp_stop() have completed by the time we call
    strp_done().
    
    This adds a dummy lock_sock/release_sock pair to guarantee that any
    in-flight strp_recv() (which runs under either bh_lock_sock or
    lock_sock, depending if it's called from ->sk_data_ready or strp_work)
    has completed.
    
    Only espintcp can be affected by this race condition, but this patch
    makes sure no future user of strp can have the bug.
    
    This could crash on strp->sk ("general mode" of strp), but this mode
    has been here for 9 years and has never been used. It'll be gone soon,
    no point worrying about it.
    
    Switch the stopped/paused/etc bits to u8's to avoid races between
    strp_stop() and strp_pause/unpause().
    
    A reproducer has been published and turns the possible UAF into an
    exploit [1].
    
    Reported-by: Hyunwoo Kim <[email protected]>
    Link: https://lore.kernel.org/all/aZLn2Faeg1FB7XOf@v4bel/
    Link: https://lore.kernel.org/all/aZgpkyTDU3aXe_V0@v4bel/
    Link: https://github.com/m0x41nos/RustyTux [1]
    Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
    Cc: [email protected]
    Signed-off-by: Sabrina Dubroca <[email protected]>
    Reviewed-by: Hyunwoo Kim <[email protected]>
    Link: https://patch.msgid.link/425d9d926709b542ed5331110c19fee4aee1f28d.1791206940.git.sd@queasysnail.net
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
SUNRPC: fix gssx_dec_option_array error path bugs [+ + +]
Author: Chris Mason <[email protected]>
Date:   Thu May 28 15:32:09 2026 -0400

    SUNRPC: fix gssx_dec_option_array error path bugs
    
    [ Upstream commit 5e9a94539b1ec17a89177d952badfd0d844d694a ]
    
    Four coupled defects in the gssx XDR option-array decoder make the
    error paths unsafe: a NULL deref in the caller, a refcount leak on
    the decoded group_info, and a latent use-after-free that the leak
    fix would otherwise expose.
    
    gssx_dec_option_array() sets oa->count = 1 before allocating
    oa->data.  If that allocation fails, -ENOMEM is returned with
    oa->count == 1 and oa->data == NULL.  All other error paths jump
    to free_oa: which frees oa->data and NULLs it but also leaves
    oa->count == 1.  The caller trusts the count:
    
        gssp_accept_sec_context_upcall()
          gssx_dec_accept_sec_context()
            gssx_dec_option_array()        /* fails, count=1 data=NULL */
          data = res.options.data[0].value /* NULL deref */
    
    Independently, free_creds: releases the partially decoded svc_cred
    with a bare kfree(creds).  gssx_dec_linux_creds() installs a
    groups_alloc() result into creds->cr_group_info; that object is
    kvmalloc-backed and refcounted, and only put_group_info() reaches
    kvfree().  A plain kfree(creds) drops the wrapper and leaks the
    group_info allocation.
    
    The natural fix for the leak is to call free_svc_cred(creds) before
    kfree(creds), but free_svc_cred() invokes put_group_info() on
    creds->cr_group_info unconditionally when non-NULL.  The existing
    out_free_groups: path in gssx_dec_linux_creds() already called
    groups_free() on that pointer without clearing it, so once
    free_svc_cred() is wired in, the subsequent put_group_info() would
    touch freed memory.
    
    Fix all four together:
    
      - Move the oa->count = 1 assignment below the oa->data allocation
        so it is never set when oa->data is NULL.
      - Reset oa->count to 0 at free_oa: so count and data stay
        coherent and the caller sees an empty option array.
      - Call free_svc_cred(creds) before kfree(creds) at free_creds:
        so the refcounted cr_group_info is released.  free_svc_cred()
        either NULL-guards each field explicitly (cr_group_info has
        an if() check) or delegates to a helper that is NULL-safe
        itself (kfree for the string fields, gss_mech_put() which
        guards with if(gm) at gss_mech_switch.c:342), so it is safe
        to call on a partially decoded svc_cred where only
        cr_uid/cr_gid/cr_group_info have been written and everything
        else is zero from kzalloc.
      - In gssx_dec_linux_creds()'s out_free_groups: path, release
        cr_group_info with put_group_info() rather than groups_free()
        so the teardown matches free_svc_cred()'s refcount-aware path,
        and clear the pointer so a later free_svc_cred() on the same
        creds does not release it a second time.
    
    Fixes: 3cfcfc102a5e ("SUNRPC: fix some memleaks in gssx_dec_option_array")
    Cc: [email protected]
    Assisted-by: kres (claude-opus-4-7)
    Signed-off-by: Chris Mason <[email protected]>
    Reviewed-by: Jeff Layton <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

SUNRPC: reject duplicate CREDS_VALUE options [+ + +]
Author: Chris Mason <[email protected]>
Date:   Thu May 28 15:32:10 2026 -0400

    SUNRPC: reject duplicate CREDS_VALUE options
    
    [ Upstream commit 2e4ce62385c1b8a887c5370af058ac7b52a8eaf9 ]
    
    gssx_dec_option_array() walks the wire-supplied option array and, for
    every entry whose name matches CREDS_VALUE, calls
    gssx_dec_linux_creds() on the same struct svc_cred. That helper
    unconditionally installs a fresh groups_alloc() result into
    creds->cr_group_info without releasing whatever pointer was already
    there:
    
        for (i = 0; i < count; i++) {
            ... decode name ...
            if (length == sizeof(CREDS_VALUE) &&
                memcmp(p, CREDS_VALUE, sizeof(CREDS_VALUE)) == 0) {
                err = gssx_dec_linux_creds(xdr, creds);
                ...
            }
        }
    
    A reply that carries two CREDS_VALUE entries therefore overwrites
    cr_group_info on the second iteration and orphans the group_info
    allocated by the first call. The earlier free_creds path only
    releases the last cr_group_info via free_svc_cred(), so the first
    allocation's refcount stays at one and its kvmalloc-backed storage
    is leaked. No in-tree caller of gssp_accept_sec_context_upcall()
    expects more than one CREDS_VALUE per reply.
    
    Fix by tracking whether a CREDS_VALUE option has already been
    decoded and returning -EINVAL on any subsequent match, so the
    free_creds path releases the single group_info that was installed.
    
    Fixes: 1d658336b05f ("SUNRPC: Add RPC based upcall mechanism for RPCGSS auth")
    Cc: [email protected]
    Assisted-by: kres (claude-opus-4-7)
    Signed-off-by: Chris Mason <[email protected]>
    Reviewed-by: Jeff Layton <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Chuck Lever <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
tcp: fix use-after-free in do_tcp_getsockopt(TCP_CC_INFO) [+ + +]
Author: Cen Zhang (Microsoft Security FORGE Labs) <[email protected]>
Date:   Thu Aug 27 19:55:11 2026 -0400

    tcp: fix use-after-free in do_tcp_getsockopt(TCP_CC_INFO)
    
    commit 385e474086c2e7e29e2dded690be40dc273e20ee upstream.
    
    do_tcp_getsockopt() reads icsk->icsk_ca_ops and dereferences the
    get_info function pointer without rcu_read_lock(). With BPF struct_ops
    congestion control, ca_ops can point to dynamically allocated memory
    that is freed concurrently, resulting in a use-after-free when the
    kernel dereferences or calls through the stale pointer.
    
      BUG: KASAN: slab-use-after-free in do_tcp_getsockopt+0x2037/0x23e0
      Read of size 8 at addr ffff888013701258 by task exploit/149
       do_tcp_getsockopt+0x2037/0x23e0 (net/ipv4/tcp.c:4564)
       tcp_getsockopt+0x91/0xf0
       __sys_getsockopt+0xf7/0x170
    
    Fix this by wrapping the ca_ops load and get_info call within
    rcu_read_lock()/rcu_read_unlock(), and using READ_ONCE() to load
    the icsk_ca_ops pointer.
    
    Fixes: 0baf26b0fcd7 ("bpf: tcp: Support tcp_congestion_ops in bpf")
    Suggested-by: Eric Dumazet <[email protected]>
    Cc: [email protected]
    Cc: [email protected]
    Reviewed-by: Eric Dumazet <[email protected]>
    Signed-off-by: Cen Zhang (Microsoft Security FORGE Labs) <[email protected]>
    Reviewed-by: Jiayuan Chen <[email protected]>
    Reviewed-by: Matthieu Baerts (NGI0) <[email protected]>
    Link: https://patch.msgid.link/65fd3816ed5d541d9edd4bf4fcf97104a2cf907a.1787870710.git.blbllhy@gmail.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tcp: prevent collapsing skbs across boundary in rtx queue [+ + +]
Author: Willem de Bruijn <[email protected]>
Date:   Tue Sep 29 12:34:43 2026 -0400

    tcp: prevent collapsing skbs across boundary in rtx queue
    
    [ Upstream commit fc6d80eb504458d6416b75a94188b268c95c6533 ]
    
    tcp_write_collapse_fence() sets TCP_SKB_CB(skb)->eor = 1 on
    tcp_write_queue_tail(sk) to prevent skbs queued after a switch to
    device encryption from being collapsed into earlier skbs.
    
    The fence is a no-op if all earlier data has already been transmitted
    when the switch happens: sk->sk_write_queue is empty. The not yet
    acknowledged earlier skbs wait in sk->tcp_rtx_queue with eor 0.
    
    On a subsequent retransmit or SACK shift, tcp_retrans_try_collapse() or
    tcp_shift_skb_data() can then merge an skb queued after the switch into
    one queued before it.
    
    Both users of the fence are affected:
    
    - psp: devices only encrypt skbs with skb->decrypted set. The merged skb
      keeps decrypted = 0 from the earlier skb, so merged data sent after
      psp_sock_assoc_set_tx() is retransmitted in cleartext.
    
    - tls device offload: the merged skb straddles the start marker set in
      tls_set_device_offload(). The software fallback (fill_sg_in() returns
      -EINVAL) and the mlx5, nfp and funeth drivers cannot handle such an
      skb and drop it. Every retransmit rebuilds the same skb, so the
      connection stalls.
    
    Fix this in two places, for defense in depth:
    
    1. Fall back to tcp_rtx_queue_tail(sk) in tcp_write_collapse_fence()
       when tcp_write_queue_tail(sk) is NULL.
    
    2. Check !skb_cmp_decrypted(to, from) in tcp_skb_can_collapse(), as
       tcp_skb_can_collapse_rx() does on receive. skb_shift(), which both
       collapse paths call, already has a DEBUG_NET_WARN_ON_ONCE() for this
       condition.
    
    Fixes: e8f69799810c ("net/tls: Add generic NIC offload infrastructure")
    Cc: [email protected]
    Signed-off-by: Willem de Bruijn <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Reviewed-by: Daniel Zahka <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ inlined logic for missing skb_cmp_decrypted() and tcp_write_collapse_fence() helpers into existing functions. ]
    Signed-off-by: Sasha Levin <[email protected]>

tcp: refresh TS.Recent for accepted old ACKs [+ + +]
Author: Jeff Jo <[email protected]>
Date:   Thu Sep 24 15:44:58 2026 -0700

    tcp: refresh TS.Recent for accepted old ACKs
    
    [ Upstream commit 1b92780ae4fc3be64f05d97ed8833c445e73b0cf ]
    
    A TCP packet can carry new data while acknowledging traffic in the
    opposite direction. With overlapping traffic in both directions, a
    delayed packet's acknowledgment can be older than one Linux has already
    accepted, even when that packet fills a gap in the received data.
    
    Linux accepts the data, but tcp_ack() takes the old_ack path and skips
    updating TS.Recent, the timestamp saved for outgoing acknowledgments.
    The reply therefore echoes an older timestamp. If the sender uses this
    echo to measure round-trip time after a long idle period, its estimate
    includes the idle time and can reduce its sending rate.
    
    Update TS.Recent in old_ack using tcp_replace_ts_recent(), before SACK
    processing can trigger a transmission. This reuses the existing timestamp
    and sequence checks, including PAWS protection against old duplicate
    packets. ACK validation already rejects old ACKs in SYN_RECV before this
    path, so no additional state check is needed.
    
    Echoing the timestamp of the packet that fills the receive gap follows
    RFC 7323 section 4.3. In a socket reproduction with 300 seconds idle,
    controlled reordering and retransmission to exercise timestamp-based RTT
    sampling, the sender's smoothed round-trip time was 37.5 seconds without
    the fix and 15.5 ms with it.
    
    Fixes: 12fb3dd9dc3c ("tcp: call tcp_replace_ts_recent() from tcp_ack()")
    Assisted-by: LLM sparse
    Signed-off-by: Jeff Jo <[email protected]>
    Reviewed-by: Eric Dumazet <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
thunderbolt: Fix KASAN reported use-after-free when request is canceled [+ + +]
Author: Mika Westerberg <[email protected]>
Date:   Tue Oct 6 19:12:38 2026 -0400

    thunderbolt: Fix KASAN reported use-after-free when request is canceled
    
    [ Upstream commit a02188ddc24b7872f0c5e0c5873f827318717803 ]
    
    Alan reported that when doing stress testing sometimes KASAN notices
    use-after-free during control channel operation (stripped down keeping
    the relevant parts):
    
     BUG: KASAN: slab-use-after-free in tb_cfg_request_sync+0x240/0x250 [thunderbolt]
     Read of size 24 at addr ffff88811067f290 by task kworker/u40:2/1760
      <TASK>
      tb_cfg_request_sync+0x240/0x250 [thunderbolt]
      tb_cfg_read_raw+0x367/0x510 [thunderbolt]
      tb_cfg_read+0xec/0x240 [thunderbolt]
      tb_port_get_link_generation+0x258/0x420 [thunderbolt]
      tb_usb3_consumed_bandwidth+0x1c1/0x2c0 [thunderbolt]
      tb_tunnel_consumed_bandwidth+0xfd/0x910 [thunderbolt]
      tb_available_bandwidth+0x5f2/0xeb0 [thunderbolt]
      tb_recalc_estimated_bandwidth+0x2a0/0x1bc0 [thunderbolt]
      tb_handle_dp_bandwidth_request+0x1897/0x5e20 [thunderbolt]
      process_one_work+0x675/0x1230
      worker_thread+0x5e6/0xf70
      kthread+0x365/0x470
      ret_from_fork+0x54d/0x710
      ret_from_fork_asm+0x1a/0x30
      </TASK>
    
     Allocated by task 1760:
      __kmalloc_cache_noprof+0x1ee/0x550
      tb_cfg_read_raw+0x1d3/0x510 [thunderbolt]
      tb_cfg_read+0xec/0x240 [thunderbolt]
      tb_port_get_link_generation+0x258/0x420 [thunderbolt]
      tb_usb3_consumed_bandwidth+0x1c1/0x2c0 [thunderbolt]
      tb_tunnel_consumed_bandwidth+0xfd/0x910 [thunderbolt]
      tb_available_bandwidth+0x5f2/0xeb0 [thunderbolt]
      tb_recalc_estimated_bandwidth+0x2a0/0x1bc0 [thunderbolt]
      tb_handle_dp_bandwidth_request+0x1897/0x5e20 [thunderbolt]
      process_one_work+0x675/0x1230
      worker_thread+0x5e6/0xf70
      kthread+0x365/0x470
      ret_from_fork+0x54d/0x710
      ret_from_fork_asm+0x1a/0x30
    
     Freed by task 926:
      kfree+0x18f/0x4a0
      tb_cfg_request_put+0xb7/0xe0 [thunderbolt]
      tb_cfg_request_work+0x82/0x120 [thunderbolt]
      process_one_work+0x675/0x1230
      worker_thread+0x5e6/0xf70
      kthread+0x365/0x470
      ret_from_fork+0x54d/0x710
      ret_from_fork_asm+0x1a/0x30
    
     Second to last potentially related work creation:
      __queue_work+0x575/0xd00
      queue_work_on+0x77/0x80
      tb_cfg_request_cancel+0xc7/0x260 [thunderbolt]
      tb_cfg_request_sync+0x1f6/0x250 [thunderbolt]
      tb_cfg_read_raw+0x367/0x510 [thunderbolt]
      tb_cfg_read+0xec/0x240 [thunderbolt]
      tb_port_get_link_generation+0x258/0x420 [thunderbolt]
      tb_usb3_consumed_bandwidth+0x1c1/0x2c0 [thunderbolt]
      tb_tunnel_consumed_bandwidth+0xfd/0x910 [thunderbolt]
      tb_available_bandwidth+0x5f2/0xeb0 [thunderbolt]
      tb_recalc_estimated_bandwidth+0x2a0/0x1bc0 [thunderbolt]
      tb_handle_dp_bandwidth_request+0x1897/0x5e20 [thunderbolt]
      process_one_work+0x675/0x1230
      worker_thread+0x5e6/0xf70
      kthread+0x365/0x470
      ret_from_fork+0x54d/0x710
      ret_from_fork_asm+0x1a/0x30
    
    The last stack trace is helpful because it shows that we are cancelling
    a request and looking at tb_cfg_request_cancel() what might happen is
    that tb_cfg_request_work() completes right before tb_cfg_request_cancel()
    starts and because of this it will call schedule_work() queueing the
    same work to run again. However, it is already removed from the
    request_queue and reference count is dropped so when
    tb_cfg_request_work() triggers again it will access memory that is
    already released.
    
    Fix this so that we first make sure a cancelled request is not handed
    away from tb_cfg_request_find() or scheduled to run. Then instead of
    relying on the worker to clean up the request we will do it in
    tb_cfg_request_cancel() after the work is canceled from running. Make
    tb_cfg_request_dequeue() release the request only if it was actually
    removed from the queue.
    
    Reported-by: Alan Borzeszkowski <[email protected]>
    Fixes: d7f781bfdbf4 ("thunderbolt: Rework control channel to be more reliable")
    Cc: [email protected]
    Signed-off-by: Mika Westerberg <[email protected]>
    [ sashal: replaced scoped mutex guards with explicit mutex_lock()/mutex_unlock() calls ]
    Signed-off-by: Sasha Levin <[email protected]>

thunderbolt: Reject oversized XDomain properties responses [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Wed Sep 9 10:07:37 2026 +0900

    thunderbolt: Reject oversized XDomain properties responses
    
    commit 80756e263846ab694984e749e8c626897331438f upstream.
    
    tb_xdp_properties_request() allocates room for 45 data dwords in its
    252-byte response buffer.  The XDomain length field is six bits wide,
    however, and a malicious peer can set it to 63.  After the fixed response
    fields are subtracted, the driver treats this as 48 data dwords.
    
    Commit 322e93448d90 ("thunderbolt: Clamp XDomain response data copy to
    allocation size") only bounds the copy against data_len.  If data_len is
    at least 48, memcpy() reads 192 bytes from the 180-byte res->data array,
    causing a 12-byte heap out-of-bounds read.  Commit 4db2bd2ed478
    ("thunderbolt: Limit XDomain response copy to actual frame size") limits
    the earlier copy but does not constrain this header-derived length.
    
    Reject response data lengths that exceed the allocated source buffer
    before copying them into the assembled property block.
    
    Fixes: d1ff70241a27 ("thunderbolt: Add support for XDomain discovery protocol")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Daehyeon Ko <[email protected]>
    Signed-off-by: Mika Westerberg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tick/broadcast: Plug clockevents replacement race [+ + +]
Author: Thomas Gleixner <[email protected]>
Date:   Wed Sep 16 13:34:57 2026 -0400

    tick/broadcast: Plug clockevents replacement race
    
    [ Upstream commit 113a9796effe3376d2ec5aabcca1fef4fef4cd62 ]
    
    朱恺乾 reported and decoded the following race condition when a broadcast
    device is replaced:
    
    CPUA                                    CPUB
     __tick_broadcast_oneshot_control()
       bc = tick_broadcast_device.evtdev;
                                            tick_install_broadcast_device(dev)
                                            clockevents_exchange_device(cur, dev)
                                               shutdown(cur);
                                               detach(cur);
                                               cur->handler = noop;
                                               tick_broadcast_device.evtdev = dev;
    
      tick_broadcast_set_event(bc, next_event); <- FAIL: arms a detached device.
    
    If the original broadcast device has a restricted interrupt affinity mask
    and the last CPU in that mask goes offline then the BUG() in
    tick_cleanup_dead_cpu() triggers because the clockevent device is not in
    detached state.
    
    The reason for this is that tick_install_broadcast_device() is not
    serialized vs. tick broadcast operations.
    
    The obvious cure is to serialize tick_install_broadcast_device() with
    tick_broadcast_lock against a concurrent tick broadcast operation.
    
    That requires to split clockevents_exchange_device() into two parts, one
    which does the exchange, shutdown and detach operation and the other which
    drops the module reference count. This is required because the module
    reference cannot be dropped while holding tick_broadcast_lock.
    
    Let clockevents_exchange_device() do both operations as before, but let the
    broadcast device code take the two step approach and do the device
    exchange under tick_broadcast_lock and drop the module reference count
    after releasing it.
    
    Fixes: f8381cba04ba ("[PATCH] tick-management: broadcast functionality")
    Reported-by: 朱恺乾 <[email protected]>
    Signed-off-by: Thomas Gleixner <[email protected]>
    Signed-off-by: Thomas Gleixner <[email protected]>
    Reviewed-by: Bradley Morgan <[email protected]>
    Tested-by: 刘术高 <[email protected]>
    Cc: [email protected]
    Link: https://patch.msgid.link/87cymdsu0r.ffs@tglx
    [ replaced scoped_guard() with a nested guard() block for GNU89 compatibility. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
tipc: destroy topsrv workqueues before closing connections [+ + +]
Author: Yuqi Xu <[email protected]>
Date:   Mon Sep 28 16:24:38 2026 +0800

    tipc: destroy topsrv workqueues before closing connections
    
    commit 3acdd44385bc7e2e57605e073691ce69cc5a960d upstream.
    
    tipc_topsrv_stop() closed subscriber connections while the topology
    server's send and receive workqueues were still running. Socket
    callbacks and subscription events could then queue more work, and
    in-flight send/recv work could drop the last connection reference
    during the conn_idr walk.
    
    That race produced several teardown failures: refcount_t addition on
    0 from conn_get() on a connection whose release was blocked on
    idr_lock, a subsequent use-after-free in tipc_conn_close(),
    queue_work() on an already destroyed workqueue from the listener
    data-ready callback, and an RCU stall in tipc_topsrv_exit_net()
    while the walk spun under idr_lock.
    
    Clear srv->listener under idr_lock so it acts as a shutdown flag,
    skip queue_work() once it is NULL, destroy the workqueues to flush
    in-flight work, and only then close the remaining connections.
    Refuse tipc_conn_lookup() after that flag is cleared, and drop
    idr_lock when the teardown walk finds no connection, so an
    in-flight subscription event cannot pin idr_in_use while the
    walk holds the lock.
    
    v3 supersedes the narrower in-thread diff Tung Quang Nguyen
    posted on 2026-09-23. It keeps his teardown order and adds the
    lookup refusal and the empty-idr unlock.
    
    Fixes: c5fa7b3cf3cb ("tipc: introduce new TIPC server infrastructure")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Yuqi Xu <[email protected]>
    Reviewed-by: Ren Wei <[email protected]>
    Signed-off-by: David S. Miller <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tipc: hold a reference to nodes found by link name [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Tue Sep 29 00:12:46 2026 +0800

    tipc: hold a reference to nodes found by link name
    
    commit 17e73bae400f6a434dc006e3bee92c94cf781954 upstream.
    
    tipc_node_find_by_name() returns a node after dropping its RCU read lock
    without taking a reference.  The LINK_SET, LINK_GET and LINK_RESET_STATS
    handlers then lock and access the node, racing with timer-driven cleanup of
    a down peer.  Generic netlink serialization does not exclude the node
    timer.
    
    The following interleaving can leave a handler using a freed node:
    
      CPU 0: find the node under RCU and release the node read lock
      CPU 1: tipc_node_timeout() clears the links and unlinks the down node
      CPU 1: drop the list and timer references, queuing tipc_node_free()
      CPU 0: leave the RCU read-side critical section
      CPU 1: complete the grace period and free the node
      CPU 0: acquire the node lock through the stale pointer
    
    LINK_SET also uses the node's media address after releasing the node lock,
    when passing queued packets to tipc_bearer_xmit().
    
    KASAN on v7.3-rc5 reported:
    
      BUG: KASAN: slab-use-after-free in _raw_read_lock_bh
      Write of size 4 at addr ffff88807e06f008 by task poc/92
      Call Trace:
       _raw_read_lock_bh                 kernel/locking/spinlock.c:287
       tipc_nl_node_set_link             net/tipc/node.c:2475
       genl_family_rcv_msg_doit          net/netlink/genetlink.c:1114
       genl_rcv_msg                      net/netlink/genetlink.c:1209
       netlink_rcv_skb                   net/netlink/af_netlink.c:2575
    
      Allocated by task 0:
       tipc_node_create                  net/tipc/node.c:539
       tipc_node_check_dest              net/tipc/node.c:1196
       tipc_disc_rcv                     net/tipc/discover.c:252
    
      Freed by task 92:
       kfree                             mm/slub.c:6801
       rcu_core                          kernel/rcu/tree.c:2919
    
      Last potentially related work creation:
       __call_rcu_common.constprop.0     kernel/rcu/tree.c:3181
       tipc_node_timeout                 net/tipc/node.c:814
    
    Acquire a reference to the selected node with kref_get_unless_zero() before
    leaving RCU, returning NULL if the node has already been released.  Release
    that reference on every caller exit after the last node access, including
    transmission in LINK_SET.  Keep the existing link lookup order and locking
    so concurrent link removal still takes the existing error paths.
    
    Fixes: 6a939f365bdb ("tipc: Auto removal of peer down node instance")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tipc: prevent GCM nonce reuse on peer key changes [+ + +]
Author: Jérémy Jean <[email protected]>
Date:   Thu Sep 24 20:21:05 2026 +0000

    tipc: prevent GCM nonce reuse on peer key changes
    
    [ Upstream commit 512ccd3d0e91e791fb37442aa0a2599aca19783d ]
    
    TIPC can encrypt traffic between nodes using a different transmit key
    for each node. In this mode, the AES-GCM nonce for a packet sent to a
    known peer consists of a 32-bit prefix (a per-key salt XOR the peer's
    address) followed by a 64-bit counter. That counter is stored in the
    peer's RX crypto object. When the peer reports a change in which key
    it uses to receive packets, TIPC resets this counter. The sender can
    still be using the same TX key and salt, so subsequent packets reuse
    earlier nonces. This nonce reuse breaks confidentiality and exposes
    GCM's authentication key. This makes forgeries trivial: an attacker
    can exploit CTR malleability to alter captured ciphertexts and use the
    recovered authentication key to compute a valid tag for the modified
    ciphertext, under the same key and nonce.
    
    Use the TX key's existing aead->seqno counter instead. All encryptions
    using that key object share the same atomic counter, so concurrent
    encryptions get distinct nonce counter values. The counter survives
    key activation and peer reconnection, and peer key-status reports
    cannot reset it. This prevents those transitions from causing nonce
    reuse while the same TX key remains installed.
    
    The nonce format is unchanged, and receivers do not require consecutive
    counter values, so sharing the counter across peers remains compatible
    with existing receivers. A pre-existing check still invokes key
    revocation in the unlikely event that the counter wraps to zero.
    
    Fixes: fc1b6d6de220 ("tipc: introduce TIPC encryption & authentication")
    Signed-off-by: Jérémy Jean <[email protected]>
    Reviewed-by: Tung Nguyen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tipc: protect node reset trace dump with node lock [+ + +]
Author: Chengfeng Ye <[email protected]>
Date:   Wed Aug 26 03:01:41 2026 +0800

    tipc: protect node reset trace dump with node lock
    
    commit dddf197f29ba5e47a476dde82bf542ca2e0d5e5e upstream.
    
    The tipc_node_reset_links trace event asks tipc_node_dump() to walk the
    node's link entries. Unlike the other node events that request link data,
    this event runs without the node lock.
    
    This permits bearer teardown to free a link while the trace callback is
    dumping it:
    
      CPU 0                                CPU 1
      trace_tipc_node_reset_links()
        tipc_node_dump()
          l = n->links[0].link
                                           tipc_node_write_lock()
                                           kfree(l)
                                           n->links[0].link = NULL
                                           tipc_node_write_unlock()
          tipc_link_dump(l)
    
    tipc_link_dump() then dereferences the stale pointer. KASAN reported:
    
      BUG: KASAN: slab-use-after-free in tipc_link_dump
      Read of size 4 by task poc/115
      Call Trace:
       tipc_link_dump+0x10cb/0x16b0
       tipc_node_dump+0x4bb/0x740
       trace_event_raw_event_tipc_node_class+0x258/0x360
       tipc_node_reset_links+0x14d/0x1a0
       tipc_rcv+0x13f5/0x3030
       tipc_udp_recv+0x4e3/0x670
      Allocated by task 0:
       tipc_link_create+0x1e1/0x1020
       tipc_node_check_dest+0x7d2/0x11a0
       tipc_disc_rcv+0xdbf/0x1430
      Freed by task 89:
       kfree+0x131/0x3c0
       tipc_node_link_down+0x267/0x4b0
       tipc_node_delete_links+0xec/0x160
       bearer_disable+0x107/0x260
    
    Take the node write lock around the trace event. This serializes the
    dump against tipc_node_link_down(delete=true), which frees the link
    under the same write lock.
    
    Fixes: eb18a510b5cd ("tipc: add trace_events for tipc node")
    Cc: [email protected]
    Signed-off-by: Chengfeng Ye <[email protected]>
    Reviewed-by: Tung Nguyen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tls: device: fix out-of-bounds write in tls_append_frag() [+ + +]
Author: Jiayuan Chen <[email protected]>
Date:   Tue Sep 1 07:39:45 2026 -0400

    tls: device: fix out-of-bounds write in tls_append_frag()
    
    [ Upstream commit b17cf742eaad70ae29ac558cefb3aa9bbeea03d4 ]
    
    Found with syzkaller and a local syzbot instance running on top of a
    netdevsim TLS offload emulation; tls_device.c is otherwise only reachable
    on a machine with a NIC that implements the offload.
    
    tls_push_data() only checks whether the open record still has room for
    another frag at the bottom of its loop, and the MSG_MORE early break
    skips that check.  The record survives to the next syscall with the frag
    count it already had, and tls_append_frag() does not check either, so
    with TLS_TX_ZEROCOPY_RO every splice(SPLICE_F_MORE) of a byte or two adds
    a non-coalescing pipe page and num_frags walks off the end of
    tls_record_info.frags[MAX_SKB_FRAGS].  Once the record is pushed,
    tls_push_record() runs the same index over sg_tx_data[MAX_SKB_FRAGS] and
    the sg_set_page() writes land on the destruct_work that follows it, which
    the workqueue then calls.
    
    The byte limit is fine because copy drops to 0 and the loop falls through
    to the same check; the frag count has no such feedback.
    
    Push the record rather than keep a full one open, which is what a plain
    TCP socket does - tcp_sendmsg_locked() uses tcp_mark_push() and
    new_segment in both the copy and the MSG_SPLICE_PAGES paths, and tls_sw
    already sets full_record when the sk_msg ring fills up, MSG_MORE or not.
    
      BUG: KASAN: slab-out-of-bounds in tls_append_frag ( net/tls/tls_device.c:269)
      Write of size 8 at addr ffff8881104d1530 by task tls_oob/450
    
      CPU: 2 UID: 0 PID: 450 Comm: tls_oob Not tainted 7.2.0-rc7+ #329 PREEMPT
      Call Trace:
       <TASK>
       dump_stack_lvl (lib/dump_stack.c:94 lib/dump_stack.c:120)
       print_report (mm/kasan/report.c:378 mm/kasan/report.c:482)
       kasan_report (mm/kasan/report.c:595)
       tls_append_frag (net/tls/tls_device.c:269)
       tls_push_data (net/tls/tls_device.c:518)
       tls_device_sendmsg (net/tls/tls_device.c:583)
       inet_sendmsg (net/ipv4/af_inet.c:865)
       sock_sendmsg (net/socket.c:775 net/socket.c:790 net/socket.c:813)
       splice_to_socket (fs/splice.c:884)
       do_splice (fs/splice.c:936 fs/splice.c:1349)
       __do_splice (fs/splice.c:1431)
       __x64_sys_splice (fs/splice.c:1634 fs/splice.c:1616)
       do_syscall_64 (arch/x86/entry/syscall_64.c:63 arch/x86/entry/syscall_64.c:94)
       entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121)
       </TASK>
    
    and, once the record is pushed:
    
      UBSAN: array-index-out-of-bounds in net/tls/tls_device.c:300:24
      index 18 is out of range for type 'skb_frag_t [17]'
      UBSAN: array-index-out-of-bounds in net/tls/tls_device.c:301:41
      index 18 is out of range for type 'scatterlist [17]'
      UBSAN: array-index-out-of-bounds in net/tls/tls_device.c:302:39
      index 18 is out of range for type 'scatterlist [17]'
      UBSAN: array-index-out-of-bounds in net/tls/tls_device.c:307:38
      index 26 is out of range for type 'scatterlist [17]'
    
      kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
      BUG: unable to handle page fault for address: ffffea000411a680
      #PF: supervisor instruction fetch in kernel mode
      #PF: error_code(0x0011) - permissions violation
      Oops: Oops: 0011 [#1] SMP KASAN PTI
      Workqueue: ktls_device_destruct 0xffffea000411a680
      RIP: 0010:0xffffea000411a680
      Call Trace:
       <TASK>
       worker_thread (kernel/workqueue.c:3405 kernel/workqueue.c:3486)
       kthread (kernel/kthread.c:436)
       ret_from_fork (arch/x86/kernel/process.c:158)
       ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
       </TASK>
    
    Fixes: e8f69799810c ("net/tls: Add generic NIC offload infrastructure")
    Cc: [email protected]
    Signed-off-by: Jiayuan Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
 
tools/thermal/tmon: Fix compilation warning for wrong format [+ + +]
Author: Florian Eckert <[email protected]>
Date:   Thu Oct 1 09:01:56 2026 -0700

    tools/thermal/tmon: Fix compilation warning for wrong format
    
    commit 9da39ef332c417ce52732564c1c682a6e1209302 upstream.
    
    The following warnings are shown during compilation:
    
    tui.c: In function 'show_cooling_device':
     tui.c:216:40: warning: format '%d' expects argument of type 'int', but
    argument 7 has type 'long unsigned int' [-Wformat=]
       216 |                         "%02d %12.12s%6d %6d",
           |                                      ~~^
           |                                        |
           |                                        int
           |                                      %6ld
     .....
       219 |                         ptdata.cdi[j].cur_state,
           |                         ~~~~~~~~~~~~~~~~~~~~~~~
           |                                      |
           |                                      long unsigned int
     tui.c:216:44: warning: format '%d' expects argument of type 'int', but
    argument 8 has type 'long unsigned int' [-Wformat=]
       216 |                         "%02d %12.12s%6d %6d",
           |                                          ~~^
           |                                            |
           |                                            int
           |                                          %6ld
     .....
       220 |                         ptdata.cdi[j].max_state);
           |                         ~~~~~~~~~~~~~~~~~~~~~~~
           |                                      |
           |                                      long unsigned int
    
    To fix this, the correct string format must be used for printing.
    
    Signed-off-by: Florian Eckert <[email protected]>
    Signed-off-by: Daniel Lezcano <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Florian Fainelli <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
tools: gpio: fix building from the top level with O= [+ + +]
Author: Sasha Levin <[email protected]>
Date:   Sun Oct 11 18:33:33 2026 -0400

    tools: gpio: fix building from the top level with O=
    
    commit 52336337f1a01ad803c7f3ddb23f40222e9ad58d upstream.
    
    "make O=<dir> tools/gpio" fails:
    
      Makefile:27: /tools/build/Makefile.include: No such file or directory
    
    tools/Makefile clears srctree, and the gpio Makefile only works it out
    again when building_out_of_srctree is not set, which the top-level
    Makefile sets for O= builds.
    
    Also work out srctree when it is empty, as tools/bpf/Makefile does
    since commit a89b2cbf71d64 ("tools, bpf: Fix build for 'make -s
    tools/bpf O=<dir>'").
    
    Fixes: 4a6a6f5c4aeed ("tools: gpio: Use !building_out_of_srctree to determine srctree")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Sasha Levin <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Bartosz Golaszewski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tracing/histograms: Reject non-stacktrace fields for synthetic stacktrace fields [+ + +]
Author: Lee Jones <[email protected]>
Date:   Tue Oct 13 11:24:48 2026 +0000

    tracing/histograms: Reject non-stacktrace fields for synthetic stacktrace fields
    
    commit a244c241593b5b38a08f0df2cb43c26574efbdcb upstream.
    
    In check_synth_field(), when a synthetic event field is a stacktrace
    (field->is_stack) and the histogram field is not a "long[" stacktrace
    array, validation falls through to the generic size and signedness
    comparison.
    
    Because parse_synth_field() sets a stacktrace field's type to
    "__data_loc unsigned long[]", its size is sizeof(u64) and
    synth_field_signed() marks it as signed.  Consequently, any 8-byte
    signed scalar histogram field passes the fallback check, and its scalar
    value is subsequently dereferenced as a kernel stacktrace pointer in
    get_field_size() and trace_stack().
    
    Furthermore, checking strstr(hist_field->type, "long[") is insufficient
    because tracepoint fields defined with __bitmask() or __rel_bitmask()
    also have type "__data_loc unsigned long[]" or "__rel_loc unsigned
    long[]", whilst create_hist_field() treats them as 4-byte scalar values
    without HIST_FIELD_FL_STACKTRACE.
    
    Propagate HIST_FIELD_FL_STACKTRACE to variable references and field
    variables (whilst excluding variable aliases from per-element
    stacktrace capture), and reject any mismatch between
    HIST_FIELD_FL_STACKTRACE and field->is_stack in check_synth_field().
    
    Cc: [email protected]
    Fixes: 00cf3d672a9d ("tracing: Allow synthetic events to pass around stacktraces")
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Lee Jones <[email protected]>
    Acked-by: Masami Hiramatsu (Google) <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    [Lee: Omit create_var_field() and hist_trigger_elt_update() hunks as
          288709c9f3b0 ("tracing: Allow stacktraces to be saved as histogram
          variables") is not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tracing: Fix 64-bit and signed histogram fields on 32-bit kernels [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Thu Sep 17 10:55:32 2026 +0900

    tracing: Fix 64-bit and signed histogram fields on 32-bit kernels
    
    commit 443d23176812803d0fa182b8d05ef066a7b8271f upstream.
    
    DEFINE_HIST_FIELD_FN() reads a trace event field and widens it to the u64
    the histogram uses as a key or a value:
    
            type *addr = (type *)(event + hist_field->field->offset);
    
            return (u64)(unsigned long)*addr;
    
    unsigned long is 32 bits on a 32-bit kernel, so the intermediate cast
    discards the upper half of a 64-bit field, and widens a signed field by
    zero extension from 32 bits rather than sign extension from its own
    width. Five of the eight instantiations are wrong there: s64, u64, s32,
    s16 and s8.
    
    The cast came in with commit 79e577cbce4c ("tracing: Support string type
    key properly"), which also added hist_field_dynstring() and
    hist_field_pstring(). Those convert a char * to u64 and do warn without
    an unsigned long in between on 32-bit. DEFINE_HIST_FIELD_FN() converts an
    integer and never a pointer, so it gains nothing from the cast and only
    loses information.
    
    Drop the intermediate cast and let the usual arithmetic conversions widen
    *addr according to its own type. unsigned long is 64 bits on LP64, so the
    two forms are identical there and 64-bit kernels are unaffected.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: 79e577cbce4c ("tracing: Support string type key properly")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Donggeun Yoo <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Fix the shift out of bounds in the log2 histogram modifier [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Wed Sep 16 09:27:35 2026 +0900

    tracing: Fix the shift out of bounds in the log2 histogram modifier
    
    commit 647c2f97fcb94bc642cefe6db004999974563f06 upstream.
    
    The .log2 key modifier files a value under its base-2 order:
    
      # echo 'hist:keys=bytes_req.log2' > events/kmem/kmalloc/trigger
    
    hist_field_log2() computes that as ilog2(roundup_pow_of_two(val)). The
    out-of-line form of roundup_pow_of_two() is
    
            return 1UL << fls_long(n - 1);
    
    which shifts by 64 on a 64-bit kernel both when n is 0, where n - 1
    wraps to ULONG_MAX, and when n is above 2^63. Both are ordinary keys,
    because the field fetch hands every value over as a u64: a syscall
    argument of 0 reaches the first, and one above 2^63 reaches the second.
    
    Keying sys_enter_lseek on offset.log2 and passing 0, 1, 2, 3, 1000,
    2^63+1 and U64_MAX gives
    
      { offset: ~ 2^1  } hitcount:          1
      { offset: ~ 2^10 } hitcount:          1
      { offset: ~ 2^2  } hitcount:          1
      { offset: ~ 2^0  } hitcount:          4
    
    Keys above 2^63 land in the lowest bucket. With CONFIG_UBSAN_SHIFT=y
    the shift is also reported:
    
      UBSAN: shift-out-of-bounds in include/linux/log2.h:57:13
      shift exponent 64 is too large for 64-bit type 'long unsigned int'
       __ubsan_handle_shift_out_of_bounds.cold+0xdd/0x1cb
       hist_fn_call.cold+0x8b/0xd9
       event_hist_trigger+0x1cc/0x790
       ftrace_syscall_enter+0x197/0x360
       do_syscall_64+0x402/0x4b0
    
    Use order_base_2(), which is ilog2(n - 1) + 1 for n > 1 and 0 below
    that. It returns what the old expression returned on every input the
    old one was defined for. Where it was not, 0 stays in bucket 0, which
    is where x86_64 had been putting it, and the keys above 2^63 move into
    bucket 64.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: 4b94f5b7b4a5 ("tracing: Add hist trigger 'log2' modifier")
    Signed-off-by: Donggeun Yoo <[email protected]>
    Assisted-by: Claude:claude-fable-5
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Reject incomplete event filter expressions [+ + +]
Author: Kyle Zeng <[email protected]>
Date:   Fri Oct 23 10:46:20 2026 -0700

    tracing: Reject incomplete event filter expressions
    
    commit 1fdc4164e488916402badddbb1f51e9380dabb91 upstream.
    
    A non-empty expression normally finishes in predicate_parse()'s inner
    loop, which resolves the pending logical operators before jumping to
    finalization. If the input ends after an operator, possibly followed by
    unary '!' tokens, the outer loop instead falls through with unresolved
    operator state.
    
    For example, "common_pid == 1 || common_pid == 2 &&" leaves
    prog[0].target equal to -1. The second pass then reads prog[-1] before
    the forward-jump check can reject it. Depending on adjacent slab
    contents, it can also copy an out-of-bounds word into a branch target
    that passes the forward-only check. A self-targeted perf tracepoint
    counting event can reach this path through PERF_EVENT_IOC_SET_FILTER.
    
    Reject the outer-loop fallthrough when a predicate has already been
    parsed. This ensures that non-empty expressions only reach finalization
    after the inner loop has resolved their operators. Keep the existing
    no-filter error for input that has no predicates. Add a regression test
    for trailing logical operators and unary negations.
    
    Fixes: 80765597bc587 ("tracing: Rewrite filter logic to be simpler and faster")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Assisted-by: Codex:gpt-6-astra
    Acked-by: Masami Hiramatsu (Google) <[email protected]>
    Tested-by: JongHyuk Kim(MalHyuk) <[email protected]>
    Signed-off-by: Kyle Zeng <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Save the event file instead of the compatible histogram [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Tue Sep 15 08:47:54 2026 +0900

    tracing: Save the event file instead of the compatible histogram
    
    commit d5c42664fc094899af9aae5300b27fe8fdb658ef upstream.
    
    create_field_var_hist() creates a histogram on the matched event to
    supply a field variable, and records it on the target so it can be torn
    down later:
    
            hist_data = find_compatible_hist(target_hist_data, file);
            ...
            /* Save the compatible histogram information */
            var_hist->hist_data = hist_data;
    
    hist_data is not the histogram it creates. It is one that was already
    there, whose keys the new one copies. The saved pointer has a single
    user, unregister_field_var_hists(), which runs when the target is
    removed:
    
            file = hist_data->field_var_hists[i]->hist_data->event_file;
    
    find_compatible_hist() matches on keys alone, so it can pick one with no
    variables of its own. check_var_refs() then returns false and the user
    can remove it while the target still points at it:
    
     BUG: KASAN: slab-use-after-free in event_hist_trigger_free+0x2b2/0x320
     Read of size 8 at addr ffff8880093b90e0 by task init/1
    
     Freed by task 1:
      kfree+0x154/0x420
      event_hist_trigger_free+0x1d5/0x320
      event_hist_trigger_parse+0x35f3/0x69e0
      trigger_process_regex+0x1a6/0x250
    
    Save the event file instead. It is all the dereference ever wanted, and
    it does not go away when the user removes a trigger.
    
    Cc: [email protected]
    Reported-by: Sashiko <[email protected]>
    Link: https://lore.kernel.org/all/[email protected]/
    Link: https://patch.msgid.link/[email protected]
    Fixes: 02205a6752f2 ("tracing: Add support for 'field variables'")
    Signed-off-by: Donggeun Yoo <[email protected]>
    Assisted-by: Claude:claude-fable-5
    Acked-by: Tom Zanussi <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tracing: Set the trace clock before registering the histogram trigger [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Wed Oct 14 07:58:23 2026 +0000

    tracing: Set the trace clock before registering the histogram trigger
    
    [ Upstream commit 6ede78d0563a2a3ae3e46f9c07cedb5d79645429 ]
    
    hist_register_trigger() puts the trigger on the global named_triggers
    list in cmd_ops->init(), and only then sets the trace clock:
    
            if (data->cmd_ops->init) {
                    ret = data->cmd_ops->init(data);
                    if (ret < 0)
                            goto out;
            }
    
            if (hist_data->enable_timestamps) {
                    ret = tracing_set_clock(file->tr, hist_data->attrs->clock);
                    if (ret) {
                            hist_err(tr, HIST_ERR_SET_CLOCK_FAIL, errpos(clock));
                            goto out;
                    }
    
    The clock string is not checked anywhere before that call, so a named
    trigger using common_timestamp with an unknown clock fails after it has
    already become findable. event_hist_trigger_parse() then frees it
    without taking it off the list, and the next lookup by name reads the
    freed object:
    
     ~# cd /sys/kernel/tracing/events/sched/sched_switch
     ~# echo 'hist:name=foo:keys=common_pid:ts=common_timestamp:clock=bogus' > trigger
     bash: echo: write error: Invalid argument
     ~# echo 'hist:name=foo:keys=common_pid' > trigger
    
      BUG: KASAN: slab-use-after-free in find_named_trigger+0xac/0xc0
      Read of size 8 at addr ffff88800915d760 by task init/1
       find_named_trigger+0xac/0xc0
       hist_register_trigger+0xc1/0x900
       event_hist_trigger_parse+0x3146/0x6af0
       event_trigger_write+0xce/0x160
      Freed by task 63:
       kfree+0x154/0x420
       trigger_kthread_fn+0xfd/0x160
    
    Set the clock before the trigger is registered, so that nothing which
    can fail runs after it is published, the way commit 6f86bdeab633
    ("tracing: Fix bad hist from corrupting named_triggers list") moved the
    registration below the rest of the setup.
    
    tracing_set_filter_buffering() is reference counted, so the init failure
    path has to drop the reference that the clock block now takes first.
    
    Cc: [email protected]
    Fixes: a4072fe85ba3 ("tracing: Add a clock attribute for hist triggers")
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Donggeun Yoo <[email protected]>
    Signed-off-by: Steven Rostedt <[email protected]>
    [Lee: Call data->ops->init(data->ops, data) and
          tracing_set_time_stamp_abs() as b052d70f7c9c ("tracing: Merge
          struct event_trigger_ops into struct event_command"), 476705419518
          ("tracing: Remove redundant trigger_ops params") and b94bc80df648
          ("tracing: Use a no_filter_buffering_ref to stop using the filter
          buffer") are not present]
    Signed-off-by: Lee Jones <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tracing: Unregister field variable histograms when the command fails [+ + +]
Author: Donggeun Yoo <[email protected]>
Date:   Mon Sep 14 19:40:36 2026 +0900

    tracing: Unregister field variable histograms when the command fails
    
    commit 91c14d6c13096091c56304120aaa26e479130b8b upstream.
    
    An action that names a field on another event needs that field as a
    variable, so create_field_var_hist() registers a second hist trigger on
    that event to provide it, and records it in
    target_hist_data->field_var_hists[].
    
    If a later part of the same command fails, create_actions() returns an
    error and event_hist_trigger_parse() jumps to out_free. The write fails
    with -EINVAL and sched_switch gets no trigger, but:
    
      # echo 'hist:keys=pid:ts0=common_timestamp.usecs' >> \
          events/sched/sched_waking/trigger
      # echo 'my_synth u64 lat; int a; int b' >> synthetic_events
      # echo 'hist:keys=next_pid:wakeup_lat=common_timestamp.usecs-$ts0:\
          onmatch(sched.sched_waking).my_synth($wakeup_lat,prio,nosuchfld)'\
          >> events/sched/sched_switch/trigger
      # cat events/sched/sched_waking/trigger
      hist:keys=pid:vals=hitcount:ts0=common_timestamp.usecs:sort=hitcount:size=2048:clock=global [active]
      hist:keys=pid:vals=hitcount:synthetic_prio=prio:sort=hitcount:size=2048 [active]
    
    The second histogram is the one created for 'prio'. It is still active and
    still counting.
    
    out_free reaches destroy_field_var_hists(), which frees the
    field_var_hists[] entries, but never unregister_field_var_hists(), which is
    what removes the triggers and runs only from event_hist_trigger_free(). The
    entry is freed and the trigger is left with nothing tracking it.
    
    Unregister the field variable histograms in out_free as well, and record
    each one as soon as its trigger is registered rather than after the lookup
    that follows it, so no exit can leave a registered trigger untracked. The
    entry then belongs to field_var_hists[] and is released by
    destroy_field_var_hists(), so freeing it on that exit would be a double
    free.
    
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Fixes: 02205a6752f2 ("tracing: Add support for 'field variables'")
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/all/[email protected]/
    Signed-off-by: Donggeun Yoo <[email protected]>
    Assisted-by: Claude:claude-fable-5
    Signed-off-by: Steven Rostedt <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
tty: abort break signalling on hangup [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Oct 5 16:39:42 2026 -0400

    tty: abort break signalling on hangup
    
    [ Upstream commit 845a2737e0f5ffe5ca8d38de556012b0c9472cdd ]
    
    The break ioctls can race with hangup and end up calling into a tty
    driver for a device that is already gone or powered down.
    
    Drivers must handle this race, but TCSBRK and TCSBRKP should still be
    aborted to avoid calling back into the driver after a user-controlled
    timeout (possibly even after the tty has been reopened).
    
    Note that drivers should disable any break state on shutdown so just
    return on hangup (calling break_ctl() again is racy and will most likely
    fail for drivers handling the race).
    
    Fixes: f34d7a5b7010 ("tty: The big operations rework")
    Cc: stable <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Adjusted hangup context to use the existing tty->ctrl_lock instead of tty->ctrl.lock. ]
    Signed-off-by: Sasha Levin <[email protected]>

tty: amiserial: fix broken TIOCMIWAIT [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Fri Sep 11 11:01:32 2026 +0200

    tty: amiserial: fix broken TIOCMIWAIT
    
    commit 615f35fd5aee169cc4881a8594f2fa234a4d0bb8 upstream.
    
    A change replacing interruptible_sleep_on() inadvertently broke the
    TIOCMIWAIT implementation which now immediately returns -EIO (unless
    there is a racing modem status update).
    
    Replace the old hangup (and signal) detection with a check for the
    TTY_IO_ERROR flag which is set on hangup.
    
    Fixes: 591cee0a3563 ("tty/amiserial: avoid interruptible_sleep_on")
    Reported-by: [email protected]
    Link: https://lore.kernel.org/[email protected]
    Cc: [email protected]   # 3.14
    Cc: Arnd Bergmann <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Reviewed-by: Jiri Slaby <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tty: fix saved termios reset race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Oct 5 18:17:25 2026 -0400

    tty: fix saved termios reset race
    
    [ Upstream commit 8df07fe93573e9e548d6645273e9bcb6eb74059e ]
    
    Resetting saved termios state on device registration is needed where a
    minor number can be reused for an entirely different device and where
    the old settings may prevent the port from even being opened (e.g. when
    CLOCAL is not set).
    
    Not all TTY drivers guarantee that the minor number is no longer in use
    when registering devices however, something which can lead to a
    use-after-free when closing a TTY (and saving its termios) races with
    re-registration.
    
    Add a new TTY_DRIVER_RESET_SAVED_TERMIOS flag to request that any saved
    termios state is reset on registration and only set it for drivers that
    make sure that the minor number is no longer in use.
    
    Fixes: 93857edd9829 ("tty: reset termios state on device registration")
    Reported-by: Chengfeng Ye <[email protected]>
    Link: https://lore.kernel.org/[email protected]
    Cc: [email protected]   # 4.12
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Adapted the new flag to existing driver->flags assignments and hexadecimal #define conventions. ]
    Signed-off-by: Sasha Levin <[email protected]>

tty: introduce and use tty_port_tty_vhangup() helper [+ + +]
Author: Jiri Slaby (SUSE) <[email protected]>
Date:   Thu Oct 8 22:17:22 2026 +0800

    tty: introduce and use tty_port_tty_vhangup() helper
    
    [ Upstream commit 2b5eac0f8c6e79bc152c8804f9f88d16717013ab ]
    
    This code (tty_get -> vhangup -> tty_put) is repeated on few places.
    Introduce a helper similar to tty_port_tty_hangup() (asynchronous) to
    handle even vhangup (synchronous).
    
    And use it on those places.
    
    In fact, reuse the tty_port_tty_hangup()'s code and call tty_vhangup()
    depending on a new bool parameter.
    
    Signed-off-by: "Jiri Slaby (SUSE)" <[email protected]>
    Cc: Karsten Keil <[email protected]>
    Cc: David Lin <[email protected]>
    Cc: Johan Hovold <[email protected]>
    Cc: Alex Elder <[email protected]>
    Cc: Oliver Neukum <[email protected]>
    Cc: Marcel Holtmann <[email protected]>
    Cc: Johan Hedberg <[email protected]>
    Cc: Luiz Augusto von Dentz <[email protected]>
    Reviewed-by: Ilpo Järvinen <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ Ting-Han: adjust context in uart_remove_one_port(), which is still
      called that and keeps its "ret" variable in this version; the tty_port
      prototypes live in include/linux/tty.h here, so add the inline helpers
      there instead of include/linux/tty_port.h ]
    Assisted-by: LLM
    Signed-off-by: Ting-Han Hou <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tty: port: fix tty_port_tty_vhangup() race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Thu Oct 8 22:17:23 2026 +0800

    tty: port: fix tty_port_tty_vhangup() race
    
    [ Upstream commit b48820de8c1a596c5b99775524dfce73c6576c5d ]
    
    Drivers rely on tty_port_tty_vhangup() to synchronously hang up their
    ports before tearing down resources as part of deregistration (e.g. on
    physical disconnect).
    
    If tty_port_tty_vhangup() races with another hangup it may however
    return before the port has been shut down. This is in turn can lead to
    use-after-free and NULL-pointer dereferences in racing ioctls (including
    a synchronous hangup) and in processing of racing asynchronous hangups
    (carrier loss).
    
    Add the missing serialisation to tty_port_tty_vhangup() and
    tty_port_hangup() so that the former does not return until the port has
    been shut down also when there is a racing hangup.
    
    Note that serial core does not use tty_port_hangup(), but it already
    holds the port mutex when clearing port->tty and shutting down the port
    in uart_hangup().
    
    Fixes: 7ca0ff9ab321 ("tty: Add a full port_close function")
    Cc: [email protected]   # 2.6.32: 2b5eac0f8c6e: tty: introduce and use tty_port_tty_vhangup() helper
    Cc: [email protected]   # 2.6.32
    Reported-by: [email protected]
    Link: https://lore.kernel.org/[email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ Ting-Han: use mutex_lock()/spin_lock_irqsave() instead of guard(),
      scoped_guard() and the tty_port_tty class, matching the existing code
      in this version of tty_port.c; tty_port_shutdown() has no kernel-doc
      here, so there is none to move ]
    Assisted-by: LLM
    Signed-off-by: Ting-Han Hou <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

tty: serial: max3100: shut down timer before freeing port [+ + +]
Author: Fan Wu <[email protected]>
Date:   Mon Oct 5 18:33:44 2026 -0400

    tty: serial: max3100: shut down timer before freeing port
    
    [ Upstream commit db0949bbd06db0a75b4b1076f1e25194be7d956a ]
    
    max3100_shutdown() stops the polling timer but returns early during
    system suspend. If the SPI device is unbound before resume, the serial
    core does not call max3100_shutdown() again, so max3100_remove() frees
    the port while the timer remains armed. max3100_timeout() may then
    access the freed port and re-arm the timer.
    
    Add final timer teardown to max3100_remove() and use
    timer_shutdown_sync() to prevent a racing callback from re-arming it.
    Also free the IRQ and destroy the workqueue there before freeing the
    port. Keep timer_delete_sync() in max3100_shutdown() so that a
    subsequent open() can re-arm the timer.
    
    The workqueue is created before request_irq() and destroyed on both
    request_irq() failure and normal shutdown. Its presence at remove thus
    identifies the IRQ left registered when suspend bypasses shutdown.
    
    Free the IRQ before destroying the workqueue, in both
    max3100_shutdown() and max3100_remove(), and cancel the pending work
    in between. free_irq() waits for a running interrupt handler to
    finish and no new handler can start afterwards, so a racing handler
    cannot queue work on a workqueue that is being destroyed; the
    force_end_work check in max3100_dowork() only narrows that window, as
    a handler delayed between the check and queue_work() could still run
    after the teardown has cleared the workqueue pointer. Cancelling the
    work also keeps destroy_workqueue() from waiting on a queued work item
    in case remove() ever runs while the freezable workqueue is still
    frozen, e.g. device removal during the resume window, before
    workqueues are thawed.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 7831d56b0a35 ("tty: MAX3100")
    Cc: [email protected] # 6.2+
    Assisted-by: Codex:gpt-5.6
    Signed-off-by: Fan Wu <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Replaced unavailable timer_shutdown_sync() with timer_delete_sync(). ]
    Signed-off-by: Sasha Levin <[email protected]>

tty: serial: qcom_geni_serial: Keep console RX functional after deep idle [+ + +]
Author: Viken Dadhaniya <[email protected]>
Date:   Tue Sep 15 18:56:28 2026 +0530

    tty: serial: qcom_geni_serial: Keep console RX functional after deep idle
    
    commit 63ef71d1474b5417b5b2dec700cd251c44a570d9 upstream.
    
    At baud rates up to 115200, the serial console uses only a 1 kBps keepalive
    vote for the GENI_TO_CORE ("qup-core") ICC path. This vote keeps the path
    active but does not request a QUP Core 2X clock rate.
    
    When the CPU enters a deeper idle state, the missing Core clock vote can
    leave the console RX path unresponsive.
    
    Use the 19.2 MHz Core 2X vote at low baud rates, while retaining the 50 MHz
    vote at higher baud rates, so that console RX remains functional after deep
    idle transitions.
    
    Fixes: 7cf563b2c846 ("tty: serial: qcom_geni_serial: Add interconnect support")
    Cc: [email protected]
    Reviewed-by: Konrad Dybcio <[email protected]>
    Signed-off-by: Viken Dadhaniya <[email protected]>
    Link: https://patch.msgid.link/20260915-correct-icc-bandwidth-vote-constants-v2-2-f78eb611204e@oss.qualcomm.com
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tty: tty_port: restore TTY_IO_ERROR on activation failure [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Oct 5 17:21:45 2026 -0400

    tty: tty_port: restore TTY_IO_ERROR on activation failure
    
    [ Upstream commit 56964f6a31238fb41d5830bb42520c5b10ff7d8f ]
    
    Make sure to restore the TTY_IO_ERROR flag if activation fails to
    prevent I/O attempts on a port that is gone or powered down.
    
    This specifically avoids issues like kernel panic due to unclocked
    accesses or NULL-pointer dereferences when accessing powered down or
    deregistered ports when a TTY ioctl races with hangup and open.
    
    Note that the flag is set again in tty_port_close() but not restoring it
    on activation failure leaves a window where drivers fail to handle the
    ioctl-hangup race.
    
    Fixes: a9a37ec33a1b ("tty: tty_port: Move the IO_ERROR clear")
    Cc: stable <[email protected]>  # 2.6.33
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: adapted to the existing braced error block containing mutex_unlock() ]
    Signed-off-by: Sasha Levin <[email protected]>

tty: vcc: hold port lock when clearing tty pointer in vcc_cleanup [+ + +]
Author: Joshua Rogers <[email protected]>
Date:   Mon Aug 3 16:10:55 2026 +0200

    tty: vcc: hold port lock when clearing tty pointer in vcc_cleanup
    
    commit 03b49c991abb8d021ca6fe51cd173447236b0552 upstream.
    
    vcc_cleanup() sets port->tty to NULL without holding port->lock, racing
    with vcc_event() LDC callbacks that read port->tty under port->lock and
    then use tty->port. This can cause a use-after-free when the callback
    dereferences tty->port after cleanup has already destroyed and freed it.
    
    Assisted-by: AISLE:Snapshot
    Cc: stable <[email protected]>
    Signed-off-by: Joshua Rogers <[email protected]>
    Reviewed-by: Jiri Slaby <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tty: vcc: zero-initialize control packet in vcc_send_ctl() [+ + +]
Author: Joshua Rogers <[email protected]>
Date:   Mon Aug 3 16:10:54 2026 +0200

    tty: vcc: zero-initialize control packet in vcc_send_ctl()
    
    commit 1f71f565e3585da1098ff19ca3c24687dab59185 upstream.
    
    The stack-allocated struct vio_vcc pkt was partially initialized,
    leaving the tag.stype_env field uninitialized before being sent via
    ldc_write(), potentially leaking kernel stack data to the LDC peer.
    
    Assisted-by: AISLE:Snapshot
    Cc: stable <[email protected]>
    Signed-off-by: Joshua Rogers <[email protected]>
    Reviewed-by: Jiri Slaby <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

tty: vt: fix memory leak in vc_allocate() [+ + +]
Author: Mingyu Wang <[email protected]>
Date:   Mon Oct 5 17:48:03 2026 -0400

    tty: vt: fix memory leak in vc_allocate()
    
    [ Upstream commit 5b114bfc1dfd88f9d50822d532f7f1fce0f7388a ]
    
    If the screen buffer allocation fails in vc_allocate(), the error handling
    path jumps to `err_free`. However, this path fails to release the unicode
    screen map attached to `vc->uni_pagedict_loc`.
    
    During the early stages of vc_allocate(), the unicode screen map is either
    newly allocated via con_set_default_unimap() or shares the default unicode
    map from a previously initialized console (which increments its refcount).
    If the subsequent kzalloc() for the screen buffer fails, the err_free path
    frees the vc structure but leaves the attached uni_pagedict with an
    elevated refcount. This results in an unreferenced object memory leak, as
    the reference to the dictionary is lost and its refcount can never reach
    zero.
    
    This issue was discovered by DevGen (an automated virtual device modeling
    fuzzer based on Syzkaller). During fuzzing with kernel fault injection
    (failslab) enabled, the fuzzer forcefully failed the kzalloc() for the
    screen buffer, exposing this error-handling path leak.
    
    Fix this by checking *vc->uni_pagedict_loc and calling con_free_unimap(vc)
    in the err_free path before kfree(vc). This safely decrements the refcount
    and releases the dictionary memory if this was the last reference. The
    explicit check is added to maintain consistency with other callers.
    
    Fixes: 34902b7f2754 ("tty: vt, get rid of weird source code flow")
    Cc: stable <[email protected]>
    Signed-off-by: Mingyu Wang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Replaced uni_pagedict_loc with the existing vc_uni_pagedir_loc field name. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
unicode: free the map after a grace period [+ + +]
Author: Christian Brauner <[email protected]>
Date:   Wed Oct 21 17:36:56 2026 -0400

    unicode: free the map after a grace period
    
    [ Upstream commit a96c5299bd7305eb984377681eb3222a57376405 ]
    
    generic_ci_d_hash() and generic_ci_d_compare() read sb->s_encoding and
    dereference the unicode map while a pathwalk in rcu mode holds nothing
    but rcu_read_lock(). The filesystems that use them, ext4, f2fs and
    tmpfs, drop the map with utf8_unload() from ->put_super(), which runs
    when the last reference to the mount goes away. A lookup that is still
    inside such a filesystem at that point reads a freed map.
    
    With a pathwalk held up in utf8_casefold_hash() while the last reference
    to a casefolded tmpfs goes away:
    
      BUG: KASAN: slab-use-after-free in utf8nlookup+0x74c/0x950
      Read of size 8 at addr ff110001030fe658 by task walker/98
      Call Trace:
       <TASK>
       utf8nlookup+0x74c/0x950
       utf8byte+0x160/0x1560
       utf8_casefold_hash+0x167/0x230
       generic_ci_d_hash+0xdd/0x1c0
       link_path_walk+0x11ad/0x1d30
       path_lookupat+0x63/0xb00
       filename_lookup+0x1f1/0x5b0
       vfs_statx+0xd7/0x3b0
      [...]
      Allocated by task 94:
       __kmalloc_cache_noprof+0x249/0x560
       utf8_load+0x4e/0x570
       shmem_parse_opt_casefold.isra.0+0x92/0x270
      [...]
      Freed by task 97:
       kfree+0x1db/0x5b0
       shmem_put_super+0x72/0x170
       generic_shutdown_super+0x14c/0x530
       kill_anon_super+0x3a/0x60
       deactivate_locked_super+0x9c/0xf0
       cleanup_mnt+0x9f/0x130
    
    So far that has been hard to hit. umount(2) waits for a grace period
    in namespace_unlock() before it drops the mount, so only a mount whose
    last reference goes away elsewhere, like the close of a file or a chdir
    out of a lazily unmounted directory, can race a walker. So it is
    reachable.
    
    Delay the free until a grace period has passed. The map and the data
    table it holds a reference to then outlive any pathwalk that found the
    superblock before the mount went away. The reference on the data table
    module is dropped from the rcu callback as well. utf8-core is built in
    whenever CONFIG_UNICODE is set, so there is no module exit that would
    have to wait for the callbacks.
    
    Overlayfs points the s_encoding of an overlay at the map of its first
    layer without taking a reference of its own. That stays correct. The
    layer is held by the overlay, so its map is dropped only after the
    overlay is gone.
    
    Fixes: b886ee3e778e ("ext4: Support case-insensitive file name lookups")
    Cc: [email protected]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: replaced the custom RCU callback with kfree_rcu() because there is no table module reference to release ]
    Signed-off-by: Sasha Levin <[email protected]>

 
USB: cdc-acm: fix racy TIOCMIWAIT implementation [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Mon Sep 7 11:51:30 2026 +0200

    USB: cdc-acm: fix racy TIOCMIWAIT implementation
    
    commit be4219dd98608736e13e0b790ef742b76a13254d upstream.
    
    Check the wakeup condition after adding the task to the waitqueue and
    updating the task state to avoid missing a racing modem status update or
    disconnect.
    
    Store the old icount on entry and do not update it in the completion
    handler to avoid missing events or reporting spurious ones (due to modem
    status changes before TIOCMIWAIT was called).
    
    Fixes: 5a6a62bdb925 ("cdc-acm: add TIOCMIWAIT")
    Cc: stable <[email protected]>
    Cc: Oliver Neukum <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
usb: cdns3: Fix NULL pointer dereference in cdns3_pci_probe [+ + +]
Author: Jie Deng <[email protected]>
Date:   Mon Aug 10 10:36:26 2026 +0800

    usb: cdns3: Fix NULL pointer dereference in cdns3_pci_probe
    
    commit e5052f2c5c73c1dcca42bafc0bc737af2b2af059 upstream.
    
    The Cadence USBSS controller is a two-function PCI device. The first
    probed function allocates the driver data and stores it with
    pci_set_drvdata(), while the second function reuses it via
    pci_get_drvdata() when pci_is_enabled() reports that the first
    function has already been probed.
    
    When the second function is probed while the first one has been
    enabled but has not yet set its driver data, pci_get_drvdata()
    returns NULL, and the subsequent wrap->devfn assignment dereferences
    a NULL pointer and crashes the kernel.
    logs:
    Call trace:
      cdns3_pci_probe+0xa4/0x300
      local_pci_probe+0x44/0xa8
      pci_call_probe+0x54/0x158
      pci_device_probe+0x84/0x100
      really_probe+0x184/0x3d0
      __driver_probe_device+0x80/0x178
      driver_probe_device+0x44/0xe8
      __driver_attach+0xec/0x1f8
      bus_for_each_dev+0x7c/0xe0
      driver_attach+0x28/0x38
      bus_add_driver+0x110/0x238
      driver_register+0x64/0x128
      __pci_register_driver+0x50/0x60
      cdns3_pci_driver_init+0x28/0x38
      do_one_initcall+0x5c/0x280
      do_initcalls+0x104/0x1d8
      kernel_init_freeable+0x140/0x218
      kernel_init+0x28/0x1f8
      ret_from_fork+0x10/0x20
    
    Return -EPROBE_DEFER in this case so that probing is retried after
    the first function has completed its probe.
    
    Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
    Cc: stable <[email protected]>
    Signed-off-by: Jie Deng <[email protected]>
    Acked-by: Peter Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: cdns3: fix use-after-free in cdns3_gadget_exit() [+ + +]
Author: Fan Wu <[email protected]>
Date:   Mon Oct 5 12:24:59 2026 -0400

    usb: cdns3: fix use-after-free in cdns3_gadget_exit()
    
    [ Upstream commit ebe9b68c396792c15d0ac690d592e449e74ed804 ]
    
    cdns3_gadget_start() arms two works on system_freezable_wq:
    pending_status_wq for the deferred ep0 status stage and aligned_buf_wq
    for realigned request buffers. Both handlers use the cdns3_device the
    works are embedded in, and cdns3_pending_setup_status_handler() also
    calls the ep0 request completion.
    
    cdns3_gadget_exit() does not wait for these works. It frees all
    endpoints and aligned buffers and drops the last reference to the
    gadget device, which frees priv_dev, so a work queued before the exit
    can run after the free.
    
    Fix this by waiting for both works after the gadget driver is unbound
    and the IRQ is freed, when no new work can be queued, and before the
    endpoints and buffers are released.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
    Cc: stable <[email protected]>
    Reported-by: Sicong Huang <[email protected]>
    Closes: https://lore.kernel.org/linux-usb/[email protected]/
    Suggested-by: Sicong Huang <[email protected]>
    Assisted-by: Codex:gpt-5.6
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Acked-by: Peter Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

usb: core: clear both ep_in and ep_out for non-ep0 control endpoints [+ + +]
Author: Hui Peng <[email protected]>
Date:   Sun Sep 20 23:17:02 2026 +0000

    usb: core: clear both ep_in and ep_out for non-ep0 control endpoints
    
    commit 0e8baa78d872f2db440d8b9ded946ab8dceb89eb upstream.
    
    In usb_enable_endpoint(), non-zero control endpoints (where
    usb_endpoint_xfer_control(&ep->desc) is true) populate both
    dev->ep_in[epnum] and dev->ep_out[epnum] with the same struct
    usb_host_endpoint pointer.
    
    However, usb_disable_endpoint() only clears either dev->ep_out[epnum] or
    dev->ep_in[epnum] depending on the direction bit of epaddr when
    reset_hardware is set, leaving the opposite direction's array slot
    pointing to the disabled/freed endpoint.
    
    Clear both dev->ep_out[epnum] and dev->ep_in[epnum] when disabling a
    non-ep0 control endpoint with reset_hardware set, and update the
    function kerneldoc accordingly.
    
    Tested in QEMU against Linux 7.3.0-rc3 using dummy_hcd and raw-gadget to
    enumerate a USB device with a non-zero control endpoint
    (bEndpointAddress 0x01, bmAttributes USB_ENDPOINT_XFER_CONTROL),
    verifying that both dev->ep_in[1] and dev->ep_out[1] are cleared when
    the interface is disabled.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Hui Peng <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: gadget: aspeed-vhub: cancel wake work on device removal [+ + +]
Author: Fan Wu <[email protected]>
Date:   Tue Sep 8 04:17:39 2026 +0000

    usb: gadget: aspeed-vhub: cancel wake work on device removal
    
    commit 20388c8d1d74c203fec8194c45cd31afdfab934e upstream.
    
    wake_work is armed from the gadget .wakeup callback to resume suspended
    downstream ports, and it is never cancelled in ast_vhub_remove(), so a
    work item queued before or during removal can run after devm has freed
    vhub and its ports, a use-after-free.
    
    Cancelling the work alone is not sufficient: usb_gadget_wakeup() takes
    no lock and the unbind path never clears wakeup_en, so a remote-wakeup
    request in flight on another CPU can re-arm the work after the cancel
    and before vhub is freed.
    
    ast_vhub_del_dev() already clears d->registered under vhub->lock before
    unregistering the gadget. Refuse the wakeup in ast_vhub_udc_wakeup()
    once d->registered is clear: the check and the schedule_work() are then
    atomic against the unbind, so a wakeup that passed before the flag was
    cleared is drained by the cancel_work_sync() after the del_dev loop,
    and one that arrives later returns without arming. Also move INIT_WORK()
    to the top of ast_vhub_probe(), since the probe error path reuses
    ast_vhub_remove() and would otherwise cancel a never-initialized work
    item.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: 7ecca2a4080c ("usb/gadget: Add driver for Aspeed SoC virtual hub")
    Cc: [email protected]
    Assisted-by: Codex:gpt-5.6
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Reviewed-by: Benjamin Herrenschmidt <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
USB: gadget: dummy-hcd: Fix wait for outstanding request completions [+ + +]
Author: Alan Stern <[email protected]>
Date:   Sun Sep 20 17:37:34 2026 -0400

    USB: gadget: dummy-hcd: Fix wait for outstanding request completions
    
    commit b263ff9b0fc5c1f371d65c4eb196b31263d039ff upstream.
    
    The dummy-hcd driver emulates synchronize_irq() by waiting until its
    private callback_usage counter drops to 0 (with the private lock not
    held).  This counter is incremented whenever a gadget driver callback
    occurs (which requires the private lock to be dropped), but not when a
    request completion handler is called.
    
    This is an oversight.  Request completion is triggered by timer
    interrupts (emulating device IRQs in a real UDC), and the interrupt
    handlers are supposed to have completed when the synchronize_irq()
    emulation routine returns -- they aren't supposed to be in the middle
    of a completion callback.  If this happens it can lead to a gadget
    driver's unbind routine running before all outstanding request
    completions have finished, maybe even allowing the gadget driver's
    module to be unloaded while a completion handler is still running.
    
    Fix the oversight by incrementing the callback_usage value across
    request completion callbacks.
    
    Link: https://lore.kernel.org/linux-usb/[email protected]/
    Fixes: 7dbd8f4cabd9 ("USB: dummy-hcd: Fix erroneous synchronization change")
    Tested-by: Minseo Kim <[email protected]>
    Signed-off-by: Alan Stern <[email protected]>
    Cc: stable <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
usb: gadget: f_fs: Fix NULL pointer dereference in FUNCTIONFS_ENDPOINT_DESC [+ + +]
Author: Yuchao Zhang <[email protected]>
Date:   Fri Sep 18 08:54:38 2026 +0800

    usb: gadget: f_fs: Fix NULL pointer dereference in FUNCTIONFS_ENDPOINT_DESC
    
    commit 9cd072788c76595529eb38f42bf94d23852f8534 upstream.
    
    When user space sets up FunctionFS with only full-speed descriptors
    (e.g., flags = FUNCTIONFS_HAS_FS_DESC) and the gadget operates at a
    higher speed (such as USB_SPEED_HIGH or USB_SPEED_SUPER),
    config_ep_by_speed() detects that the function lacks descriptors for
    the current speed, logs a warning, and falls back to full-speed
    descriptors. The endpoint is then successfully enabled via
    usb_ep_enable(), and epfile->ep becomes valid.
    
    However, when user space subsequently issues the FUNCTIONFS_ENDPOINT_DESC
    ioctl to query the endpoint descriptor, ffs_epfile_ioctl() selects the
    descriptor index solely based on gadget->speed:
    
            switch (epfile->ffs->gadget->speed) {
            case USB_SPEED_SUPER:
            case USB_SPEED_SUPER_PLUS:
                    desc_idx = 2;
                    break;
            case USB_SPEED_HIGH:
                    desc_idx = 1;
                    break;
            default:
                    desc_idx = 0;
            }
            desc = epfile->ep->descs[desc_idx];
            memcpy(&desc1, desc, desc->bLength);
    
    Because user space only supplied full-speed descriptors,
    epfile->ep->descs[1] is NULL. Dereferencing desc->bLength triggers an
    immediate kernel NULL pointer dereference panic.
    
    Fix this by falling back through lower speed descriptors if the current
    speed descriptor was not supplied, matching the fallback logic in
    config_ep_by_speed() and historical f_fs behavior. If still missing,
    fall back to epfile->ep->ep->desc (the active descriptor), and return
    -EINVAL safely if no valid descriptor is found. In addition, mark desc
    as const to match struct usb_ep::desc and avoid discarding qualifiers.
    
    Fixes: c559a3534109 ("usb: gadget: f_fs: add ioctl returning ep descriptor")
    Cc: [email protected]
    Signed-off-by: Yuchao Zhang <[email protected]>
    Acked-by: Michał Nazarewicz <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: gadget: f_mass_storage: fix null pointer dereference in fsg_common_set_num_buffers() [+ + +]
Author: Jeffin Philip <[email protected]>
Date:   Wed Sep 9 22:29:34 2026 -0400

    usb: gadget: f_mass_storage: fix null pointer dereference in fsg_common_set_num_buffers()
    
    [ Upstream commit 2c0f5ca48674a5b5f9fa4a9c3325aa48053af0bc ]
    
    Previously fsg_num_buffers_validate() was removed as it was not
    necessary due to Kconfig setting the limits for n from 2 to 256 with
    default as 2. However, setting the page content in such a way that
    kstrtou8() reflects n value as either 0 or 1 bypasses these
    restrictions leading to a null pointer dereference if n is 0. Fix
    this by adding a check for n < 2 and returning -EINVAL if n is
    either 0 or 1 consistent with Kconfig logic.
    
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=791be35f1fbcc85d06d7
    Fixes: fe5a6c48fd95 ("usb: gadget: storage: get rid of fsg_num_buffers_validate()")
    Cc: stable <[email protected]>
    Signed-off-by: Jeffin Philip <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ adjusted context to retain the branch’s existing kcalloc() call instead of kzalloc_objs(). ]
    Signed-off-by: Sasha Levin <[email protected]>

usb: gadget: f_uac1_legacy: validate bRequest index in generic_{set,get}_cmd [+ + +]
Author: Liu Chao <[email protected]>
Date:   Mon Sep 21 15:25:51 2026 +0800

    usb: gadget: f_uac1_legacy: validate bRequest index in generic_{set,get}_cmd
    
    commit 9062d50e75c24dc7911be05c9b1719b3b256af15 upstream.
    
    generic_set_cmd() and generic_get_cmd() use the low nibble of
    ctrl->bRequest as an index into con->data[]:
    
        u8 cmd = (ctrl->bRequest & 0x0F);  /* 0 .. 15 */
        ...
        con->data[cmd] = value;            /* OOB when cmd >= 5 */
    
    struct usb_audio_control (include/linux/usb/audio.h) declares data as
    a 5-element array, so indices 5 through 15 write (or read) up to 44
    bytes past the end of the array on the heap.
    
    A malicious USB host can craft a class-specific SET_CUR / GET_CUR
    request with an arbitrary bRequest value, triggering the out-of-bounds
    access from an IRQ completion handler with no further preconditions.
    
    Add an ARRAY_SIZE() guard to both functions.
    
    Fixes: c47d7b09891a ("USB: audio: add USB audio class definitions")
    Cc: stable <[email protected]>
    Reviewed-by: Weibin Liu <[email protected]>
    Signed-off-by: Liu Chao <[email protected]>
    Reviewed-by: Ivy Lopez <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: hub: use shorter 120ms post resume hold for SS root hubs [+ + +]
Author: Lovekesh Solanki <[email protected]>
Date:   Thu Sep 3 16:59:03 2026 +0530

    usb: hub: use shorter 120ms post resume hold for SS root hubs
    
    commit 29480b05e6e226594dc11ccf2a036fbd5cdd0e42 upstream.
    
    Holding a USB3 hub PM runtime reference for 200ms at hub resume triggers
    an AMD platform issue.  Users running Android adb report crashes after
    adb has been polling and waking up the USB subsystem once a second for
    some time.  Vendors are working on a solution.  Disabling USB runtime PM
    is one way to prevent this issue, but it is also proven that reducing the
    hold time to 120ms in resume also mitigates it.  See Link for more
    details.
    
    Reducing the hold time to 120ms for the USB3 roothub is in itself a valid
    change and optimization, as the current 200ms is excessive: a root hub
    has no upstream suspended hub whose wake propagation needs to be
    accounted for, but still need some time for USB3 link training to
    complete.
    
    Keep the 200ms hold for external hubs that commit 8f5b7e2bec1c
    ("usb: hub: fix detection of high tier USB3 devices behind suspended
    hubs") is intended for.
    
    Reported-by: Mathieu Fluhr <[email protected]>
    Link: https://lore.kernel.org/all/CAPyJwA_D9qw0T72f8zwM1yKjP+To=maVANbcdsWM7yRmbBxYvw@mail.gmail.com/
    Cc: stable <[email protected]>
    Fixes: 8f5b7e2bec1c ("usb: hub: fix detection of high tier USB3 devices behind suspended hubs")
    Signed-off-by: Lovekesh Solanki <[email protected]>
    Acked-by: Mathias Nyman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: octeon-hcd: fix the FIFO-flush timeout computation [+ + +]
Author: Orgad Shaneh <[email protected]>
Date:   Mon Oct 5 10:10:36 2026 -0400

    usb: octeon-hcd: fix the FIFO-flush timeout computation
    
    [ Upstream commit 4c7a1b9f1f1979f2b3b69428ada12680695159c2 ]
    
    cvmx_wait_tx_rx() computes its 100us deadline from
    (u64)octeon_get_clock_rate - the address of the function, not its
    return value; the parentheses have been missing since the
    CVMX_WAIT_FOR_FIELD32 macro became a function. The cast makes it
    compile silently, and the resulting deadline is effectively infinite.
    
    On a healthy controller the flush bit clears on the first read and
    nothing is noticed. On a controller whose PHY did not come up (for
    example when the reference-clock configuration is wrong for the board),
    txfflsh/rxfflsh never clear and probe spins forever in __delay() -
    observed as a hard hang with a soft-lockup splat on a CN5020 board,
    where the board watchdog then resets the system with no console output.
    
    Call the function, restoring the 100us timeout the code always
    intended.
    
    Fixes: 3e195a80e096 ("Staging: octeon-usb: Replaces CVMX_WAIT_FOR_FIELD32 macro with a function")
    Cc: [email protected]
    Assisted-by: Claude:claude-opus-5
    Signed-off-by: Orgad Shaneh <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

usb: ohci-da8xx: disable controller wakeup on cleanup [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Mon Sep 14 21:20:08 2026 -0400

    usb: ohci-da8xx: disable controller wakeup on cleanup
    
    commit 901197dd4c7dcffbf97426487d4c047555c98554 upstream.
    
    The OHCI core marks controllers with RemoteWakeupConnected as
    wakeup-capable. Probe enables wakeup, but neither removal nor a later
    notifier registration failure disables it, leaving the wakeup source
    attached.
    
    Disable controller wakeup after removing the HCD on both paths.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: a6eeeb9f45b5 ("USB: Update USB default wakeup settings")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: ohci-s3c2410: disable controller wakeup on removal [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Mon Sep 14 21:20:09 2026 -0400

    usb: ohci-s3c2410: disable controller wakeup on removal
    
    commit 8dd8451c527e2a723bca20da5a6d724b8592551f upstream.
    
    Probe enables controller wakeup after the OHCI core marks controllers with
    RemoteWakeupConnected as wakeup-capable. Removal does not undo this, so the
    wakeup source can remain attached after driver unbind.
    
    Disable controller wakeup after removing the HCD.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: a6eeeb9f45b5 ("USB: Update USB default wakeup settings")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: ohci-spear: disable controller wakeup on removal [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Mon Oct 5 12:18:14 2026 -0400

    usb: ohci-spear: disable controller wakeup on removal
    
    [ Upstream commit b1b0f8bdbbc891a4ee7f3b1a878c633e02b7bbeb ]
    
    Probe enables controller wakeup after the OHCI core marks controllers with
    RemoteWakeupConnected as wakeup-capable. Removal does not undo this, so the
    wakeup source can remain attached after driver unbind.
    
    Disable controller wakeup after removing the HCD.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: a6eeeb9f45b5 ("USB: Update USB default wakeup settings")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

usb: ohci-spear: Remove unnecessary NULL check before clk_disable_unprepare() [+ + +]
Author: Chen Ni <[email protected]>
Date:   Mon Oct 5 12:18:13 2026 -0400

    usb: ohci-spear: Remove unnecessary NULL check before clk_disable_unprepare()
    
    [ Upstream commit a891b9aebcc7406fe2f439d184bac3948fb08645 ]
    
    clk_disable_unprepare() already checks NULL by using IS_ERR_OR_NULL.
    Remove unneeded NULL check for clk here.
    
    Signed-off-by: Chen Ni <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: b1b0f8bdbbc8 ("usb: ohci-spear: disable controller wakeup on removal")
    Signed-off-by: Sasha Levin <[email protected]>

usb: ohci-st: disable controller wakeup on removal [+ + +]
Author: Myeonghun Pak <[email protected]>
Date:   Mon Sep 14 21:20:11 2026 -0400

    usb: ohci-st: disable controller wakeup on removal
    
    commit 08b2ccd7eb7e41f77a04a09112ca3edcc588e3f0 upstream.
    
    Probe enables controller wakeup after the OHCI core marks controllers with
    RemoteWakeupConnected as wakeup-capable. Removal does not undo this, so the
    wakeup source can remain attached after driver unbind.
    
    Disable controller wakeup after removing the HCD.
    
    This issue was identified during our ongoing static-analysis research
    while reviewing kernel code.
    
    Fixes: d115837259ad ("usb: host: ohci-st: Add OHCI driver support for ST STB devices")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Co-developed-by: Ijae Kim <[email protected]>
    Signed-off-by: Ijae Kim <[email protected]>
    Signed-off-by: Myeonghun Pak <[email protected]>
    Reviewed-by: Patrice Chotard <[email protected]>
    Acked-by: Alan Stern <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
USB: serial: clean up core error labels [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Oct 6 18:10:36 2026 -0400

    USB: serial: clean up core error labels
    
    [ Upstream commit 96a83c95c3da5ba55ea2cf6ce87de10fc03417a9 ]
    
    Clean up the core error labels by consistently naming them after what
    they do rather than after from where they are jumped to.
    
    Reviewed-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Stable-dep-of: 646e5b28b4fd ("USB: serial: fix driver deregistration order")
    Signed-off-by: Sasha Levin <[email protected]>

USB: serial: cp210x: add Corsair AX1500i Power Supply [+ + +]
Author: Jérémy Carrat <[email protected]>
Date:   Thu Sep 10 18:26:09 2026 +0200

    USB: serial: cp210x: add Corsair AX1500i Power Supply
    
    commit d84e27d87738634b92001500435ae4dadba10a13 upstream.
    
    The Corsair AX1500i power supply exposes its Corsair Link monitoring
    interface on a mini-USB port through an on-board CP2103, using a
    Corsair-specific product ID. Without the ID in the table no driver binds
    and no tty is created.
    
    Tested by forcing the driver association with
    
      echo 1b1c 1c02 > /sys/bus/usb-serial/drivers/cp210x/new_id
    
    and then setting the serial port to 115200 8N1. Adding the ID is sufficient
    to talk to the device: the tty reaches a USB-to-SMBus bridge sitting behind
    the UART, which identifies itself as "USB to SMB Bridge (Firmware by Ross
    Fosler)" version 0.9 and relays PMBus reads to the power supply controller.
    Input voltage and current, input and output power, internal temperature and
    fan speed were all read back on an AX1500i.
    
      [    7.806181] usb 3-14: New USB device found, idVendor=1b1c, idProduct=1c02, bcdDevice= 1.00
      [  698.526754] usbcore: registered new interface driver cp210x
      [  698.526767] usbserial: USB Serial support registered for cp210x
      [  698.527863] cp210x 3-14:1.0: cp210x converter detected
      [  698.529263] usb 3-14: cp210x converter now attached to ttyUSB0
    
    The related AX1600i (1b1c:1c11, iProduct "USB API") is expected to be the
    same kind of device but has not been tested here, so it is not added.
    
    Cc: [email protected]
    Signed-off-by: Jérémy Carrat <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: fix driver deregistration order [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Oct 6 18:10:37 2026 -0400

    USB: serial: fix driver deregistration order
    
    [ Upstream commit 646e5b28b4fdbc1b828a2398d6ced2c1dd308a46 ]
    
    USB serial driver modules register one driver for the USB bus and one or
    more drivers for the ports on the USB serial bus.
    
    When unloading a driver module, the USB driver must be deregistered
    before the USB serial bus drivers so that I/O is stopped before
    unbinding the ports to avoid use-after-free in completion handlers
    accessing port data.
    
    Note that the "new_id" attributes must first be removed to prevent new
    ids from being added and triggering a probe of the USB driver after it
    has been deregistered.
    
    Fixes: 765e0ba62613 ("usb-serial: new API for driver registration")
    Cc: [email protected]      # 3.4
    Cc: Alan Stern <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

USB: serial: fix dynamic id driver deregistration race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Fri Aug 21 17:45:44 2026 +0200

    USB: serial: fix dynamic id driver deregistration race
    
    commit 63594e8ffe097bc0b7639936f33799a7653dded2 upstream.
    
    Only free the dynamic ids after having deregistered the driver and
    removed the "new_id" attribute to avoid leaking any id added by a racing
    write to the attribute.
    
    Fixes: 93bacefc4cc0 ("USB serial: add dynamic id support to usb-serial core")
    Cc: [email protected]      # 2.6.21
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: fix ioctl hangup race [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Oct 6 19:26:47 2026 -0400

    USB: serial: fix ioctl hangup race
    
    [ Upstream commit ae0e61d95677efa778379853e495d748e6efbf95 ]
    
    The tty ioctls can race with hangup and end up calling into a tty driver
    for a device that is already gone or powered down.
    
    Serialise the callbacks using the tty port mutex and add the missing
    checks to make sure the port has not been hung up before accessing port
    driver data or hardware.
    
    This specifically avoids dereferencing a NULL-pointer if a device is
    disconnected during lengthy break signalling.
    
    Note that TIOCGICOUNT and TIOCMIWAIT do not access port driver data or
    hardware and are therefore not affected by the race.
    
    Fixes: f34d7a5b7010 ("tty: The big operations rework")
    Reported-by: Nick Bowler <[email protected]>
    Link: https://lore.kernel.org/all/CADyTPExB2kYOOwkO0JqGhKaYVDqO9uS9WCw0J=MCTdVhcGOogA@mail.gmail.com/
    Reported-by: [email protected]
    Closes: https://lore.kernel.org/r/[email protected]
    Cc: [email protected]      # 2.6.26
    Signed-off-by: Johan Hovold <[email protected]>
    [ sashal: adapted locking to the older USB-serial callback interfaces. ]
    Signed-off-by: Sasha Levin <[email protected]>

USB: serial: fix port tear down use-after-free [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Fri Aug 21 17:45:43 2026 +0200

    USB: serial: fix port tear down use-after-free
    
    commit 33c920f7c5952dfc42d1b8ea6efe16b1f0bb0c5b upstream.
    
    Some drivers for multiport devices access port driver data from
    completion handlers of shared URBs submitted at attach() or first open()
    and stopped at disconnect() or last close(), respectively.
    
    A simple NULL check before accessing the driver data makes sure that a
    port state container has at least been allocated, but a completion
    handler can still race with port tear down.
    
    Reorder the disconnect handling so that ports are not deregistered (and
    their driver data freed) until after all ports have been hung up and the
    driver disconnect() callback has run so that all I/O has been stopped.
    
    Fixes: 2d93148ab698 ("USB: serial: fix lifetime and locking problems")
    Reported-by: [email protected]
    Link: https://lore.kernel.org/all/[email protected]/
    Cc: [email protected]      # 2.6.30
    Cc: Alan Stern <[email protected]>
    Reviewed-by: Greg Kroah-Hartman <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add Compal EXC-T1 support [+ + +]
Author: Ian Lin <[email protected]>
Date:   Fri Sep 4 16:00:46 2026 +0800

    USB: serial: option: add Compal EXC-T1 support
    
    commit b51faf3f2e307f114854bbe6d495f03cd5370686 upstream.
    
    The Compal EXC-T1 is a Qualcomm MDM9207-based LTE modem which reports
    "EXC-x1" as its USB product string. It exposes diagnostic, modem, AT,
    and NMEA ports as vendor-specific interfaces with subclass 0x10 and
    protocols 0x01 through 0x04.
    
    Add exact interface matches for these four ports, leaving the ff/ff/ff
    interface unbound.
    
    Relevant output from usb-devices:
    
    T:  Bus=03 Lev=02 Prnt=03 Port=03 Cnt=01 Dev#=  6 Spd=480  MxCh= 0
    D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=04b7 ProdID=4d22 Rev=03.18
    S:  Manufacturer=CEI
    S:  Product=EXC-x1
    C:  #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=500mA
    I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=10 Prot=01 Driver=option
    I:  If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=10 Prot=02 Driver=option
    I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=10 Prot=03 Driver=option
    I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=10 Prot=04 Driver=option
    I:  If#= 4 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
    I:  If#= 5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=10 Prot=05 Driver=qmi_wwan
    
    Tested on a Compal EXC-T1 modem using an Ubuntu kernel build. The four
    serial interfaces bound to option and exposed ttyUSB3 through ttyUSB6.
    
    Assisted-by: Codex:GPT-5
    Signed-off-by: Ian Lin <[email protected]>
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add Compal EXM-G1x support [+ + +]
Author: Ian Lin <[email protected]>
Date:   Mon Aug 31 16:44:05 2026 +0800

    USB: serial: option: add Compal EXM-G1x support
    
    commit 7f11480cda081de78a05d8c97073df66326b50b3 upstream.
    
    The Compal EXM-G1x is a Qualcomm SDX12-based LTE modem. Add support for
    its vendor-specific serial interfaces with protocols 0x30, 0x40, and
    0x60.
    
    Relevant output from usb-devices:
    
    T:  Bus=04 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  4 Spd=5000 MxCh= 0
    D:  Ver= 3.20 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs=  1
    P:  Vendor=04b7 ProdID=8217 Rev=05.04
    S:  Manufacturer=COMPAL
    S:  Product=EXM-G1x
    C:  #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA
    I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=(none)
    I:  If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=60 Driver=option
    I:  If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    I:  If#= 4 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
    I:  If#= 8 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=50 Driver=qmi_wwan
    
    Tested on a Compal EXM-G1x modem.
    
    Assisted-by: Codex:GPT-5
    Signed-off-by: Ian Lin <[email protected]>
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add Quectel EG060W [+ + +]
Author: Carlo Szelinsky <[email protected]>
Date:   Wed Aug 12 13:42:28 2026 +0300

    USB: serial: option: add Quectel EG060W
    
    commit cd243401994880b8b6810c53177bce56eebaece5 upstream.
    
    Add Quectel EG060W with product ID 0x6004.
    The three vendor-specific interfaces are DIAG, NMEA and AT; the CDC-NCM
    data interfaces are handled by the cdc_ncm driver.
    
    T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
    D:  Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
    P:  Vendor=2c7c ProdID=6004 Rev= 3.18
    S:  Manufacturer=Quectel
    S:  Product=EG060W-EAAA
    S:  SerialNumber=123456789ABCD
    C:* #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=  2mA
    A:  FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=0d Prot=00
    I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0d Prot=00 Driver=cdc_ncm
    E:  Ad=82(I) Atr=03(Int.) MxPS=  16 Ivl=32ms
    I:  If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=01 Driver=cdc_ncm
    I:* If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=01 Driver=cdc_ncm
    E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
    E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:* If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
    E:  Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    I:* If#= 4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
    E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
    
    Cc: [email protected]
    Signed-off-by: Carlo Szelinsky <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add Quectel RG660QB [+ + +]
Author: Sebastian Sjoholm <[email protected]>
Date:   Thu Sep 3 20:00:29 2026 +0200

    USB: serial: option: add Quectel RG660QB
    
    commit 6177bcd94be83f80a032c2e69a06606d325335b9 upstream.
    
    Add support for the Quectel RG660QB 5G module (USB ID 2c7c:013d).
    The interface layout is the same as the RG650V:
    
      If 0: DIAG   ff/ff/30, 2 endpoints
      If 1: NMEA   ff/00/00, 2 endpoints
      If 2: AT     ff/00/00, 3 endpoints
      If 3: Modem  ff/00/00, 3 endpoints
      If 4: QMI    ff/ff/ff, 3 endpoints
    
    Match the serial interfaces on class/subclass/protocol so that the QMI
    interface is left to qmi_wwan.
    
      # lsusb -v -d 2c7c:013d
    
      Bus 004 Device 002: ID 2c7c:013d Quectel Wireless Solutions Co., Ltd. RG660QB-EU
      Device Descriptor:
        bLength                18
        bDescriptorType         1
        bcdUSB               3.20
        bDeviceClass            0
        bDeviceSubClass         0
        bDeviceProtocol         0
        bMaxPacketSize0         9
        idVendor           0x2c7c Quectel Wireless Solutions Co., Ltd.
        idProduct          0x013d
        bcdDevice            6.06
        iManufacturer           1 Quectel
        iProduct                2 RG660QB-EU
        iSerial                 3 f50119d0
        bNumConfigurations      1
        Configuration Descriptor:
          bLength                 9
          bDescriptorType         2
          wTotalLength       0x0105
          bNumInterfaces          5
          bConfigurationValue     1
          iConfiguration          4 DIAG_SER_RMNET
          bmAttributes         0xa0
            (Bus Powered)
            Remote Wakeup
          MaxPower              896mA
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        0
            bAlternateSetting       0
            bNumEndpoints           2
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass    255 Vendor Specific Subclass
            bInterfaceProtocol     48
            iInterface              0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x01  EP 1 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x81  EP 1 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        1
            bAlternateSetting       0
            bNumEndpoints           2
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass      0
            bInterfaceProtocol      0
            iInterface              0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x82  EP 2 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x02  EP 2 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        2
            bAlternateSetting       0
            bNumEndpoints           3
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass      0
            bInterfaceProtocol      0
            iInterface              6 CDEV Serial
            ** UNRECOGNIZED:  05 24 00 10 01
            ** UNRECOGNIZED:  05 24 01 00 00
            ** UNRECOGNIZED:  04 24 02 02
            ** UNRECOGNIZED:  05 24 06 00 00
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x84  EP 4 IN
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x000a  1x 10 bytes
              bInterval               9
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x83  EP 3 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x03  EP 3 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        3
            bAlternateSetting       0
            bNumEndpoints           3
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass      0
            bInterfaceProtocol      0
            iInterface              6 CDEV Serial
            ** UNRECOGNIZED:  05 24 00 10 01
            ** UNRECOGNIZED:  05 24 01 00 00
            ** UNRECOGNIZED:  04 24 02 02
            ** UNRECOGNIZED:  05 24 06 00 00
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x86  EP 6 IN
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x000a  1x 10 bytes
              bInterval               9
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x85  EP 5 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x04  EP 4 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        4
            bAlternateSetting       0
            bNumEndpoints           3
            bInterfaceClass       255 Vendor Specific Class
            bInterfaceSubClass    255 Vendor Specific Subclass
            bInterfaceProtocol    255 Vendor Specific Protocol
            iInterface              7 RmNet
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x88  EP 8 IN
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0008  1x 8 bytes
              bInterval               9
              bMaxBurst               0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x87  EP 7 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               6
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x05  EP 5 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0400  1x 1024 bytes
              bInterval               0
              bMaxBurst               2
      Binary Object Store Descriptor:
        bLength                 5
        bDescriptorType        15
        wTotalLength       0x0023
        bNumDeviceCaps          2
        SuperSpeed USB Device Capability:
          bLength                10
          bDescriptorType        16
          bDevCapabilityType      3
          bmAttributes         0x00
          wSpeedsSupported   0x000f
            Device can operate at Low Speed (1Mbps)
            Device can operate at Full Speed (12Mbps)
            Device can operate at High Speed (480Mbps)
            Device can operate at SuperSpeed (5Gbps)
          bFunctionalitySupport   1
            Lowest fully-functional device speed is Full Speed (12Mbps)
          bU1DevExitLat           0 micro seconds
          bU2DevExitLat           0 micro seconds
        SuperSpeedPlus USB Device Capability:
          bLength                20
          bDescriptorType        16
          bDevCapabilityType     10
          bmAttributes         0x00000001
            Sublink Speed Attribute count 1
            Sublink Speed ID count 0
          wFunctionalitySupport   0x1100
          bmSublinkSpeedAttr[0]   0x000a4030
            Speed Attribute ID: 0 10Gb/s Symmetric RX SuperSpeedPlus
          bmSublinkSpeedAttr[1]   0x000a40b0
            Speed Attribute ID: 0 10Gb/s Symmetric TX SuperSpeedPlus
      Device Status:     0x0000
        (Bus Powered)
    
    Tested with an early sample of the module on a Quectel 5G EVB connected
    over USB 3 to a Raspberry Pi 5.
    
    Assisted-by: LLM
    Signed-off-by: Sebastian Sjoholm <[email protected]>
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: option: add support for SIMCom SIM8260C [+ + +]
Author: Zhao Dongdong <[email protected]>
Date:   Mon Aug 17 15:14:27 2026 +0800

    USB: serial: option: add support for SIMCom SIM8260C
    
    commit 35c950c9ec2c4c4d45dc9b63cfe8fca774ce33a0 upstream.
    
    Add support for SIMCom SIM8260C (1e0e:902b).
    
    T:  Bus=08 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=5000 MxCh= 0
    D:  Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs=  1
    P:  Vendor=1e0e ProdID=902b Rev= 5.04
    S:  Manufacturer=SIMCOM
    S:  Product=SDXLEMUR-LITE-MTP _SN:120696AB
    S:  SerialNumber=0123456789ABCDEF
    C:* #Ifs= 8 Cfg#= 1 Atr=a0 MxPwr=896mA
    A:  FirstIf#= 5 IfCount= 3 Cls=01(audio) Sub=00 Prot=20
    I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option
    E:  Ad=01(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=60 Driver=option
    E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=82(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=85(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=84(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=03(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option
    E:  Ad=87(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
    E:  Ad=86(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=04(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=50 Driver=qmi_wwan_simcom
    E:  Ad=88(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
    E:  Ad=8e(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    E:  Ad=0f(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms
    I:* If#= 5 Alt= 0 #EPs= 0 Cls=01(audio) Sub=01 Prot=20 Driver=snd-usb-audio
    I:* If#= 6 Alt= 0 #EPs= 0 Cls=01(audio) Sub=02 Prot=20 Driver=snd-usb-audio
    I:  If#= 6 Alt= 1 #EPs= 1 Cls=01(audio) Sub=02 Prot=20 Driver=snd-usb-audio
    E:  Ad=05(O) Atr=0d(Isoc) MxPS=  34 Ivl=1ms
    I:* If#= 7 Alt= 0 #EPs= 0 Cls=01(audio) Sub=02 Prot=20 Driver=(none)
    I:  If#= 7 Alt= 1 #EPs= 1 Cls=01(audio) Sub=02 Prot=20 Driver=(none)
    E:  Ad=89(I) Atr=0d(Isoc) MxPS=  34 Ivl=1ms
    
    Signed-off-by: Zhao Dongdong <[email protected]>
    Cc: [email protected]
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: quatech2: fix baud rate overflow [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Sep 15 14:40:12 2026 +0200

    USB: serial: quatech2: fix baud rate overflow
    
    commit ec06546b43b612cefc851558981b4955c0ef9e46 upstream.
    
    The requested baud rate is incorrectly truncated to 16 bits so that
    line speeds above 65535 bps cannot be set.
    
    Use 32 bits for the rate while rejecting rates outside of
    [50,921600] to avoid having the 16-bit divisor overflow.
    
    Fixes: f7a33e608d9a ("USB: serial: add quatech2 usb to serial driver")
    Cc: [email protected]      # 3.5
    Cc: Bill Pemberton <[email protected]>
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

USB: serial: ssu100: fix baud rate overflow [+ + +]
Author: Johan Hovold <[email protected]>
Date:   Tue Sep 15 14:40:11 2026 +0200

    USB: serial: ssu100: fix baud rate overflow
    
    commit afc235a217360c6859068d2e37a4df305c4d1be2 upstream.
    
    The requested baud rate is incorrectly truncated to 16 bits so that
    line speeds above 65535 bps cannot be set.
    
    Use 32 bits for the rate and remainder while rejecting rates outside of
    [50,460800] to avoid having the divisor or remainder overflow.
    
    This issue was flagged by an LLM.
    
    Fixes: 52af95459939 ("USB: add USB serial ssu100 driver")
    Cc: [email protected]      # 2.6.36
    Cc: Bill Pemberton <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Johan Hovold <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
usb: storage: sierra_ms: reject short SWoC info transfers [+ + +]
Author: Syed Labeeq Sajid Bukhari <[email protected]>
Date:   Thu Sep 10 19:03:43 2026 +0500

    usb: storage: sierra_ms: reject short SWoC info transfers
    
    commit 8a0200d14acd9db388b85cd016e68a4e60d900ec upstream.
    
    sierra_get_swoc_info() requests sizeof(struct swoc_info) (60) bytes
    from the device via usb_control_msg(), but its callers only treat a
    negative return value as failure. A device that answers the
    vendor-specific GetSwocInfo request with a short IN transfer is
    therefore accepted, leaving the tail of the freshly allocated
    (kmalloc(), non-zeroing) swoc_info buffer uninitialized.
    
    truinst_show() subsequently prints swocInfo->rev, swocInfo->LinuxSKU
    and swocInfo->LinuxVer from that buffer into the world-readable
    (0444) "truinst" sysfs attribute. An emulated/malicious USB device
    (VID 0x1199, PID 0x0fff) can exploit this to disclose up to 5 bytes
    of stale kernel heap memory (kmalloc-64) to unprivileged userspace,
    once per sysfs read, indefinitely. On kernels built without
    init_on_alloc this leaks recently freed heap contents.
    
    Only accept the transfer when the full structure was received.
    sierra_ms_init() already retries failed queries, so well-behaved
    devices are unaffected.
    
    Fixes: 32fe5e393455 ("USB Storage Sierra: TRU-Install feature update")
    Cc: stable <[email protected]>
    Signed-off-by: Syed Labeeq Sajid Bukhari <[email protected]>
    Assisted-by: Kimi:K2 [Kimi Code CLI]
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: tcpm: constrain TCPM_SOURCING_VBUS event handling [+ + +]
Author: Amit Sunil Dhamne <[email protected]>
Date:   Thu Sep 10 07:08:50 2026 -0400

    usb: typec: tcpm: constrain TCPM_SOURCING_VBUS event handling
    
    [ Upstream commit cd3b9cea675bbfebc223f007dc2f4e79524fa54c ]
    
    When a sink detach occurs while waiting for TX send status, the old
    TCPM_SOURCING_VBUS event along with TCPM_VBUS_EVENT and TCPM_CC_EVENT
    can be queued in port->pd_events. Because TCPM_SOURCING_VBUS is
    evaluated after TCPM_VBUS_EVENT and TCPM_CC_EVENT in
    tcpm_pd_event_handler(), a stale TCPM_SOURCING_VBUS event can override
    the detach handling and incorrectly set port->vbus_source and
    port->vbus_present to true.
    
    Add a state guard to check that the port is either operating as a
    Source (tcpm_port_is_source(port)) or in a Fast Role Swap (FRS) state
    up to FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED before processing
    TCPM_SOURCING_VBUS. Otherwise, discard and log the event.
    
    Log snippet for error condition before fix:
    [72792.204955] state change SRC_ATTACHED -> SRC_STARTUP [rev3 NONE_AMS]
    [72792.204960] sourcing vbus
    [72792.204962] VBUS on
    [72792.204970] AMS POWER_NEGOTIATION start
    [72792.204974] cc:=4
    [72792.205319] state change SRC_STARTUP -> AMS_START [rev3 POWER_NEGOTIATION]
    [72792.205325] state change AMS_START -> SRC_SEND_CAPABILITIES [rev3 POWER_NEGOTIATION]
    [72792.205332] PD TX, header: 0x11a1
    [72792.216911] PD TX complete, status: 2
    [72792.216957] pending state change SRC_SEND_CAPABILITIES -> SRC_SEND_CAPABILITIES @ 150 ms [rev3 POWER_NEGOTIATION]
    [72792.218005] VBUS off
    [72792.218013] pending state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED @ 650 ms [rev3 POWER_NEGOTIATION]
    [72792.218020] VBUS VSAFE0V
    [72792.218024] state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED [rev3 POWER_NEGOTIATION]
    [72792.218458] CC1: 2 -> 0, CC2: 0 -> 0 [state SNK_UNATTACHED, polarity 0, disconnected]
    [72792.218467] VBUS on --> VBUS left on
    [72792.218980] disable vbus discharge ret:0
    [72792.235193] Start toggling
    
    After fix:
    [ 1195.291691] state change SRC_ATTACHED -> SRC_STARTUP [rev3 NONE_AMS]
    [ 1195.291698] sourcing vbus
    [ 1195.291700] VBUS on
    [ 1195.291707] AMS POWER_NEGOTIATION start
    [ 1195.291710] cc:=4
    [ 1195.291758] state change SRC_STARTUP -> AMS_START [rev3 POWER_NEGOTIATION]
    [ 1195.291794] state change AMS_START -> SRC_SEND_CAPABILITIES [rev3 POWER_NEGOTIATION]
    [ 1195.291798] PD TX, header: 0x11a1
    [ 1195.297056] PD TX complete, status: 2
    [ 1195.297092] pending state change SRC_SEND_CAPABILITIES -> SRC_SEND_CAPABILITIES @ 150 ms [rev3 POWER_NEGOTIATION]
    [ 1195.297177] VBUS off
    [ 1195.297184] pending state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED @ 650 ms [rev3 POWER_NEGOTIATION]
    [ 1195.297227] CC1: 2 -> 0, CC2: 0 -> 0 [state SRC_SEND_CAPABILITIES, polarity 0, disconnected]
    [ 1195.307469] cc:=2
    [ 1195.307544] pending state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED @ 650 ms [rev3 POWER_NEGOTIATION]
    [ 1195.307555] Discarding sourcing vbus! Invalid state SRC_SEND_CAPABILITIES
    [ 1195.957636] state change SRC_SEND_CAPABILITIES -> SNK_UNATTACHED [delayed 650 ms]
    [ 1195.957732] disable vbus discharge ret:0
    [ 1195.970196] Start toggling
    [ 1195.970468] VBUS off
    [ 1196.051637] VBUS off
    [ 1196.051642] VBUS VSAFE0V
    
    Fixes: 8dc4bd073663 ("usb: typec: tcpm: Add support for Sink Fast Role SWAP(FRS)")
    Cc: stable <[email protected]>
    Assisted-by: Gemini:gemini-3.1-pro
    Signed-off-by: Amit Sunil Dhamne <[email protected]>
    Reviewed-by: Badhri Jagan Sridharan <[email protected]>
    Acked-by: Heikki Krogerus <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ Removed the unavailable AMS_START/upcoming_state check to match the direct transition to FR_SWAP_SEND. ]
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: tcpm: fix debug accessory mode detection for sink ports [+ + +]
Author: Xu Yang <[email protected]>
Date:   Thu Sep 10 07:08:49 2026 -0400

    usb: typec: tcpm: fix debug accessory mode detection for sink ports
    
    [ Upstream commit f6ec9bb4acc7182b25a793ad094a764e1cb819a7 ]
    
    The port in debug accessory mode can be either a source or sink. The
    previous tcpm_port_is_debug() function only checked for source port.
    
    Commit 8db73e6a42b6 ("usb: typec: tcpm: allow sink (ufp) to toggle into
    accessory mode debug") changed the detection logic to support both roles,
    but left some logic in _tcpm_cc_change() unchanged, This causes the state
    machine to transition to an incorrect state when operating as a sink in
    debug accessory mode. Log as below:
    
    [  978.637541] CC1: 0 -> 5, CC2: 0 -> 5 [state TOGGLING, polarity 0, connected]
    [  978.637567] state change TOGGLING -> SRC_ATTACH_WAIT [rev1 NONE_AMS]
    [  978.637596] pending state change SRC_ATTACH_WAIT -> DEBUG_ACC_ATTACHED @ 180 ms [rev1 NONE_AMS]
    [  978.647098] CC1: 5 -> 0, CC2: 5 -> 5 [state SRC_ATTACH_WAIT, polarity 0, connected]
    [  978.647115] state change SRC_ATTACH_WAIT -> SRC_ATTACH_WAIT [rev1 NONE_AMS]
    
    It should go to SNK_ATTACH_WAIT instead of SRC_ATTACH_WAIT state.
    
    To fix this, add tcpm_port_is_debug_source() and tcpm_port_is_debug_sink()
    helper to explicitly identify the power mode in debug accessory mode.
    Update the state transition logic in _tcpm_cc_change() to ensure the state
    machine transitions comply with Type-C specification. Also update the logic
    in run_state_machine() to keep consistency.
    
    Fixes: 8db73e6a42b6 ("usb: typec: tcpm: allow sink (ufp) to toggle into accessory mode debug")
    Cc: stable <[email protected]>
    Signed-off-by: Xu Yang <[email protected]>
    Acked-by: Heikki Krogerus <[email protected]>
    Reviewed-by: Amit Sunil Dhamne <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    
    [5.10 dependency adaptation: This tree does not contain 8db73e6a42b6
    or sink debug accessory support. Retain the source debug predicate and
    its source-path callers, and keep tcpm_port_is_debug() source-only.
    Drop the sink predicate and sink accessory state transitions, which
    require the missing feature. This supplies tcpm_port_is_debug_source()
    for cd3b9cea675b without changing 5.10 accessory behavior or adding
    functions. The target applies with a three-way merge; its references
    to AMS_START and upcoming_state still require a separate 5.10 adaptation
    because AMS and Collision Avoidance was not backported.]
    
    Stable-dep-of: cd3b9cea675b ("usb: typec: tcpm: constrain TCPM_SOURCING_VBUS event handling")
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: ucsi: acpi: Assume UCSI 1.2 on Acer Nitro ANV15-41 [+ + +]
Author: Pannarat Wiriyaarritham <[email protected]>
Date:   Mon Oct 5 17:54:54 2026 -0400

    usb: typec: ucsi: acpi: Assume UCSI 1.2 on Acer Nitro ANV15-41
    
    [ Upstream commit 8c51ea651d043c786c37668c51624bd6b338a0ef ]
    
    The Acer Nitro ANV15-41 exposes a functional UCSI ACPI PPM but
    reports a UCSI VERSION value of zero.
    
    ucsi_register() rejects a zero version with -ENODEV, leaving the
    system without registered USB Type-C connectors.
    
    The PPM works correctly when using the UCSI 1.2 layout. With UCSI
    1.2 assumed, both Type-C connectors register correctly and USB Power
    Delivery negotiation works.
    
    Add a DMI-specific UCSI operation for the Acer Nitro ANV15-41 that
    substitutes UCSI 1.2 only when firmware reports a zero version.
    Preserve any valid non-zero firmware version.
    
    Tested on an Acer Nitro ANV15-41 with BIOS V1.51.
    
    Fixes: c1b0bc2dabfa ("usb: typec: Add support for UCSI interface")
    Cc: stable <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Pannarat Wiriyaarritham <[email protected]>
    Reviewed-by: Heikki Krogerus <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Replaced the dedicated read_version callback with a DMI-gated check in ucsi_acpi_read(). ]
    Signed-off-by: Sasha Levin <[email protected]>

usb: typec: ucsi: displayport: Current CAM OOB index fixup [+ + +]
Author: Jameson Thies <[email protected]>
Date:   Thu Sep 17 03:20:08 2026 +0000

    usb: typec: ucsi: displayport: Current CAM OOB index fixup
    
    commit ea31c6498c61307dc0d8ce338a7f268cb8cbdd57 upstream.
    
    Update ucsi_displayport_enter() to return invalid error when the PPM
    reports an current alternate mode greater than or equal to
    UCSI_MAX_ALTMODES. While here, remove 0xff current cam assignment on
    failed GET_CURRENT_CAM response.
    
    Fixes: 04cec690b1fd ("usb: typec: ucsi: displayport: Fix OOB altmode array index")
    Cc: stable <[email protected]>
    Reviewed-by: Heikki Krogerus <[email protected]>
    Reviewed-by: Benson Leung <[email protected]>
    Signed-off-by: Jameson Thies <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: typec: ucsi: Get the connector fwnode based on reg value [+ + +]
Author: Prashanth K <[email protected]>
Date:   Wed Sep 16 09:58:08 2026 +0530

    usb: typec: ucsi: Get the connector fwnode based on reg value
    
    commit 6c51f09c6db5868a5090e8dd4d7764660c87f1ad upstream.
    
    ucsi_find_fwnode() currently maps UCSI connectors to Device tree
    connector nodes based on the order in which connector child nodes
    are described in DT.
    
    This can fail because the ordering of child nodes isn't guaranteed
    in Device-tree. For example, DTB may contain connector@1 before
    connector@0, causing connector numbers to be associated with the wrong
    fwnode. As a result, role switch and Type-C notifications can be
    delivered to the wrong remote endpoints.
    
    Fix this by using the "reg" property of each connector to match
    its corresponding fwnode. While at it, if the reg property isn't
    present, then fall back to the old method.
    
    Fixes: c1b0bc2dabfa ("usb: typec: Add support for UCSI interface")
    Cc: stable <[email protected]>
    Signed-off-by: Prashanth K <[email protected]>
    Reviewed-by: Heikki Krogerus <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

usb: xhci: bail out of setup if the controller is inaccessible [+ + +]
Author: Breno Leitao <[email protected]>
Date:   Tue Sep 1 07:19:31 2026 -0400

    usb: xhci: bail out of setup if the controller is inaccessible
    
    [ Upstream commit 78203d5b54a40f0e36196ebf31c9c7a380fc8811 ]
    
    xhci_gen_setup() locates the operational registers using the capability
    length read from the very first register:
    
            xhci->op_regs = hcd->regs +
                    HC_LENGTH(readl(&xhci->cap_regs->hc_capbase));
    
    If the controller is dead or has dropped off the bus, that read returns
    ~0, HC_LENGTH() truncates it to 0xff, and op_regs ends up 0xff bytes
    past the page-aligned MMIO base, i.e. unaligned. The first access
    through it, xhci_halt() -> xhci_handshake() reading op_regs->status, is
    then an unaligned readl() on device memory. arm64 faults on unaligned
    device accesses, so instead of xhci_handshake() catching the all-ones
    value and returning -ENODEV, setup oopses:
    
      xhci-pci-renesas 0005:08:00.0: Unable to change power state from D3cold to D0, device inaccessible
      xhci-pci-renesas 0005:08:00.0: xHCI Host Controller
      xhci-pci-renesas 0005:08:00.0: new USB bus registered, assigned bus number 1
      Unable to handle kernel paging request at virtual address ffff80030a770103
        ESR = 0x0000000096000021
        FSC = 0x21: alignment fault
      Internal error: Oops: 0000000096000021 [#1]  SMP
      pc : xhci_halt [xhci_hcd]
      Call trace:
       xhci_halt
       xhci_gen_setup
       xhci_pci_setup
       usb_add_hcd
       usb_hcd_pci_probe
       xhci_pci_common_probe
       xhci_pci_renesas_probe
    
    This was hit with a Renesas uPD720201 that failed to power up ("Unable
    to change power state from D3cold to D0, device inaccessible") yet still
    reached the HCD probe path.
    
    Read the capability register once, and if it reads back the all-ones
    value (as xhci_handshake() and xhci_reset() already test for), abort
    setup with -ENODEV before op_regs is derived from it. Reading it once
    also avoids re-reading a register that may change under a concurrent
    hot-removal.
    
    Fixes: 66d4eadd8d06 ("USB: xhci: BIOS handoff and HW initialization.")
    Cc: [email protected]
    Signed-off-by: Breno Leitao <[email protected]>
    Signed-off-by: Mathias Nyman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ adapted the double hc_capbase register read via hcc_params/hci_version to use a single new local hc_capbase variable ]
    Signed-off-by: Sasha Levin <[email protected]>

 
vc_screen: reload vc pointer before if (ret) in vcs_write() to avoid UAF [+ + +]
Author: Yi Yang <[email protected]>
Date:   Mon Oct 5 04:32:14 2026 -0400

    vc_screen: reload vc pointer before if (ret) in vcs_write() to avoid UAF
    
    [ Upstream commit 226bd5603371cd9f6642cbb9e9a677f445de3530 ]
    
    The reload of 'vc' added by commit 8fb9ea65c9d1 ("vc_screen: reload load
    of struct vc_data pointer in vcs_write() to avoid UAF") sits after the
    'if (ret)' block, so the copy-failure break path exits the loop without
    reloading vc. If the vc was kfree()'d via vc_port_destruct during the
    unlocked copy_from_user() window, the post-loop
    'if (written && vc) vcs_scr_updated(vc)' is reached with a stale
    non-NULL vc. The '&& vc' guard from commit a287620312dc ("vc_screen:
    fix null-ptr-deref in vcs_notifier() during concurrent vcs_write") only
    handles the NULL case, not this stale-non-NULL case; vcs_notifier() then
    reads param->vc->vc_num from freed memory:
    
      BUG: KASAN: slab-use-after-free in vcs_notifier+0x7c/0xd0
      Read of size 2 at addr ffff888007149190
      Call Trace:
       vcs_notifier+0x7c/0xd0
       atomic_notifier_call_chain+0x70/0xa0
       vcs_scr_updated+0x77/0xa0
       vcs_write+0x71b/0x7e0
      Allocated by task: vc_allocate -> con_install -> tty_open
      Freed by task: kfree <- vt_ioctl (VT_DISALLOCATE -> vc_port_destruct)
    
    Move the reload to immediately after console_lock(), before 'if (ret)',
    so every break path below passes a fresh vc to the post-loop
    vcs_scr_updated().
    
    Fixes: a287620312dc ("vc_screen: fix null-ptr-deref in vcs_notifier() during concurrent vcs_write")
    Cc: [email protected]
    Signed-off-by: Yi Yang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    [ sashal: Adapted the -ENXIO error return to use the existing unlock_out cleanup path. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
vlan: require the MAC header to be present in __vlan_insert_inner_tag() [+ + +]
Author: Xiang Mei <[email protected]>
Date:   Tue Sep 29 10:31:17 2026 -0400

    vlan: require the MAC header to be present in __vlan_insert_inner_tag()
    
    [ Upstream commit ab888242fce4f16f6c4d4c6ec53939ad36aa3b3a ]
    
    __vlan_insert_inner_tag() only guarantees head room via skb_cow_head(),
    never that mac_len bytes of MAC header are present.  Its ETH_HLEN
    wrappers - __vlan_insert_tag() under skb_vlan_push(), and
    vlan_insert_tag() under validate_xmit_vlan() on the generic transmit
    path - therefore rewrite the first 16 bytes at skb->data: a 12-byte
    memmove plus two 2-byte stores at +12 and +14.  No caller supplies the
    bound, while the pop helpers use skb_ensure_writable()/pskb_may_pull().
    
    An IFF_TUN device has hard_header_len == 0, so packet_snd() accepts a
    one-byte AF_PACKET/SOCK_RAW frame.  The first vlan push only sets a
    hwaccel tag; the next - clsact "action vlan push" or
    bpf_skb_vlan_push() - enters the helper with skb->len still 1.  The
    head comes from skbuff_small_head without __GFP_ZERO, so each push
    drags bytes from beyond skb->tail into the frame.  After three the
    one-byte send leaves as 13 bytes carrying 11 bytes of uninitialised
    slab:
    
      0000: 5a b3 62 12 80 88 ff ff 00 b3 62 12 81
               `------------------------------'
      only 0x5a was sent; the rest is slab, here the top 56 bits of a
      linear-map address
    
    Require the MAC header the helper rewrites to be present, so such a
    frame is dropped rather than transmitted.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: [email protected]
    Reported-by: [email protected]
    Signed-off-by: Xiang Mei <[email protected]>
    Reviewed-by: Simon Horman <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ adjusted context around skb_cow_head(skb, VLAN_HLEN) because the branch lacks upstream meta_len handling. ]
    Signed-off-by: Sasha Levin <[email protected]>

 
vsock: treat TCP_CLOSING as once-established [+ + +]
Author: Michal Luczaj <[email protected]>
Date:   Mon Oct 5 02:26:22 2026 +0200

    vsock: treat TCP_CLOSING as once-established
    
    [ Upstream commit 4f6ac74fa594a918d41255c941256e1d51592d3b ]
    
    Handle the TCP_ESTABLISHED -> TCP_CLOSING transition on OP_RST, which can
    race with the connect loop. Immediately break and return 0 on
    ESTABLISHED/CLOSING. The return value of connect() should reflect what
    happened up to the point the connection was established or failed. Events
    that occur afterwards must not affect it. E.g. even if OP_RW has already
    set sk_err, connect() should still return 0, not ENOBUFS because of it.
    Adapt the inaccurate comment above signal_pending().
    
    Resetting a socket that is still present in connected_table can lead to
    memory corruption. The reporter noted lost transports for in-flight skbs,
    and I have reproduced crashes caused by re-insertion into connected_table.
    
      list_add double add: new=, prev=, next=.
      kernel BUG at lib/list_debug.c:35!
      Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
      Workqueue: vsock-loopback vsock_loopback_work
      RIP: 0010:__list_add_valid_or_report+0x11f/0x130
      Call Trace:
       vsock_insert_connected.cold+0xe/0x13
       virtio_transport_recv_pkt+0x10e9/0x1460
       vsock_loopback_work+0x305/0x480
       process_one_work+0xe4c/0x1560
       worker_thread+0x4f1/0xd60
       kthread+0x36e/0x470
       ret_from_fork+0x47b/0x6b0
       ret_from_fork_asm+0x1a/0x30
    
    This fix is supplementary to commit 002541ef650b ("vsock: Ignore
    signal/timeout on connect() if already established"). Details under Link.
    
    Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
    Reported-by: Hyunwoo Kim <[email protected]>
    Link: https://lore.kernel.org/netdev/anzT1fREOSyHT99k@v4bel/
    Signed-off-by: Michal Luczaj <[email protected]>
    Reviewed-by: Stefano Garzarella <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Paolo Abeni <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
vt: skip screen update for DEC alignment test on backgroup consoles [+ + +]
Author: Zizhi Wo <[email protected]>
Date:   Sat Sep 5 14:43:37 2026 +0800

    vt: skip screen update for DEC alignment test on backgroup consoles
    
    commit 0928ed9bd7946baee911efa401088697836e3b1e upstream.
    
    [BUG]
    Recently, we encountered a KASAN warning as follows:
    
    BUG: KASAN: slab-out-of-bounds in fb_pad_aligned_buffer+0x11f/0x140
    Read of size 1 at addr ff1100015fd9f6a4 by task tty_fbcon_oob/1239
    CPU: 7 UID: 0 PID: 1239 Comm: tty_fbcon_oob Not tainted 7.3.0-rc1 #100 PREEMPT(full)
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.17.0-4.fc41 04/01/2014
    Call Trace:
     <TASK>
     ...
     kasan_report+0xf0/0x120
     fb_pad_aligned_buffer+0x11f/0x140
     ccw_putcs+0x86c/0xa80
     fbcon_putcs+0x338/0x410
     do_update_region+0x21d/0x450
     do_con_write+0x1e0e/0x4880
     con_write+0x13/0x80
     n_tty_write+0x374/0x1010
     file_tty_write.isra.0+0x404/0x7a0
     ...
    
    reproduce:
    1) open /dev/tty0, set a KDFONTOP ioctl with op.op = KD_FONT_OP_SET,
    op.width = 8 and op.height = 16 (visible VC1)
    2) open /dev/tty1, set a KDFONTOP ioctl with op.op = KD_FONT_OP_SET,
    op.width = 28 and op.height = 24 (invisible VC2)
    3) echo 3 > /sys/devices/virtual/graphics/fbcon/rotate_all
    4) write EShash8(esc hash8) to tty1
    
    [CAUSE]
    All VCs render to the framebuffer. setfont only modifies the target VC's
    font without resizing the framebuffer backing buffer (par->rotated.buf);
    the buffer is only resized for the visible VC
    (fbcon_do_set_font -> ... -> vc_do_resize -> update_screen). This relies on
    the con_should_update() check performed before every update_region().
    
    However, the ESC # 8 path (do_con_trol -> do_update_region) omits the
    con_should_update() check. After changing the font size of an invisible VC,
    do_update_region() fills using the new font size against a buffer that was
    never resized, causing an out-of-bounds access.
    
    [FIX]
    Only push the update when the console is visible and not blanked, add
    the con_should_update() check in the do_con_trol() like every other call
    site of do_update_region() (update_region(), invert_screen(), ...).
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable <[email protected]>
    Signed-off-by: Zizhi Wo <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
vxlan: Fix potential null-ptr-deref in vxlan_gro_prepare_receive(). [+ + +]
Author: Kuniyuki Iwashima <[email protected]>
Date:   Sat May 2 03:12:59 2026 +0000

    vxlan: Fix potential null-ptr-deref in vxlan_gro_prepare_receive().
    
    commit 30a45c0bffdd62350261e2f2689fdba426a33578 upstream.
    
    udp_tunnel_sock_release() could set sk->sk_user_data to NULL
    while vxlan_gro_prepare_receive() is running.
    
    Let's check if rcu_dereference_sk_user_data() is NULL after
    skb_gro_remcsum_init().
    
    Fixes: 5602c48cf875 ("vxlan: change vxlan to use UDP socket GRO")
    Signed-off-by: Kuniyuki Iwashima <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    [ Artem Novikov: Apply the check to the older vxlan_gro_receive()
      implementation. Initialize the remcsum state first and use the
      existing out path for cleanup when sk_user_data has been cleared. ]
    Signed-off-by: Artem Novikov <[email protected]>
    Signed-off-by: Fedor Pchelkin <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

vxlan: use one headroom snapshot for neighbour replies [+ + +]
Author: Sanghyun Park <[email protected]>
Date:   Fri Sep 18 12:26:58 2026 +0900

    vxlan: use one headroom snapshot for neighbour replies
    
    [ Upstream commit 481506a756dcd828ef42391cb08f38d8d96d38fc ]
    
    vxlan_na_create() samples LL_RESERVED_SPACE() to size the reply skb and then
    samples it again to reserve headroom. A concurrent vxlan_changelink() can
    update needed_headroom between the two reads, creating a TOCTOU race. The
    second value can exceed the allocation and make the Ethernet header write out
    of bounds.
    
    The race is reproducible on the unpatched kernel. It occurred when
    vxlan_na_create() generated a neighbour reply while vxlan_changelink() changed
    the link headroom. KASAN caught a four-byte write two bytes beyond a 704-byte
    skbuff_small_head allocation.
    
    Snapshot the headroom once and use that value for both allocation and
    reservation.
    
    Fixes: 4b29dba9c085 ("vxlan: fix nonfunctional neigh_reduce()")
    Signed-off-by: Sanghyun Park <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
watch_queue: Fix note pool publication race in watch_queue_set_size() [+ + +]
Author: Cen Zhang (Microsoft) <[email protected]>
Date:   Thu Oct 22 07:35:00 2026 -0400

    watch_queue: Fix note pool publication race in watch_queue_set_size()
    
    [ Upstream commit 5e531d62f1f8834faf7a4eed0d41105cf6570a8f ]
    
    There is a race between watch_queue_set_size() and post_one_notification().
    watch_queue_set_size() publishes wqueue->notes, notes_bitmap, nr_pages and
    nr_notes with plain stores, and post_one_notification() reads them with
    plain loads under a different lock, so nothing orders the four stores
    against the poster's loads: depending on the build, notes can be stored
    last (gcc 14 on x86-64 does this).  Since keyctl_watch_key() lets a watch
    attach to a queue before it is sized, post_one_notification() can already
    be running on another CPU at that moment: it reads nr_notes > 0, passes
    its bounds check, and then reads notes while it is still NULL,
    dereferencing notes[0].
    
    An unprivileged user triggers this reliably by watching one of its own
    keys through a notification pipe and racing ioctl(IOC_WATCH_QUEUE_SET_SIZE)
    on that pipe against keyctl(KEYCTL_SETPERM) on the key from another CPU,
    triggering:
    
      BUG: kernel NULL pointer dereference, address: 0000000000000000
      RIP: 0010:post_one_notification.isra.0+0xa2/0x1e0
      Call Trace:
       __post_watch_notification+0x148/0x180
       keyctl_setperm_key+0x119/0x130
       do_syscall_64+0x108/0x4c0
       entry_SYSCALL_64_after_hwframe+0x77/0x7f
      Kernel panic - not syncing: Fatal exception in interrupt
    
    Fix this by publishing nr_notes last with smp_store_release(), and by
    reading it once with smp_load_acquire() in post_one_notification() before
    the bitmap and the page array are touched.  A poster that observes a
    non-zero nr_notes then also observes the pool behind it; one that observes
    zero drops the notification as before.
    
    Fixes: c73be61cede5 ("pipe: Add general notification queue support")
    Reported-by: Dae R. Jeong <[email protected]>
    Closes: https://lore.kernel.org/all/ZT-S8Q7tyutcvu_q@dragonet/
    Reported-by: [email protected]
    Suggested-by: Dae R. Jeong <[email protected]>
    Signed-off-by: Cen Zhang (Microsoft) <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Reviewed-by: Bradley Morgan <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Christian Brauner (Amutable) <[email protected]>
    [ sashal: retained the existing mask variable when adding nr_notes to the local declaration ]
    Signed-off-by: Sasha Levin <[email protected]>

 
watchdog: rtd119x: Avoid division by zero [+ + +]
Author: Tzung-Bi Shih <[email protected]>
Date:   Tue Sep 22 14:31:02 2026 -0400

    watchdog: rtd119x: Avoid division by zero
    
    [ Upstream commit 5af7d2cbd20f893def03c8310a460ade66a5d822 ]
    
    clk_get_rate() could return 0.  Avoid a division by zero panic.
    
    Fixes: 2bdf6acbfead ("watchdog: Add Realtek RTD1295")
    Cc: [email protected]
    Signed-off-by: Tzung-Bi Shih <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Guenter Roeck <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

watchdog: rtd119x: Use devm_clk_get_enabled() helper [+ + +]
Author: Christophe JAILLET <[email protected]>
Date:   Tue Sep 22 14:31:01 2026 -0400

    watchdog: rtd119x: Use devm_clk_get_enabled() helper
    
    [ Upstream commit 6cc0768ba6f5293a4435612164a2cfbf2edbd025 ]
    
    The devm_clk_get_enabled() helper:
       - calls devm_clk_get()
       - calls clk_prepare_enable() and registers what is needed in order to
         call clk_disable_unprepare() when needed, as a managed resource.
    
    This simplifies the code and avoids the need of a dedicated function used
    with devm_add_action_or_reset().
    
    Signed-off-by: Christophe JAILLET <[email protected]>
    Reviewed-by: Guenter Roeck <[email protected]>
    Link: https://lore.kernel.org/r/14b521b821279bc5111dc80b55d0936c5767c737.1672418470.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Guenter Roeck <[email protected]>
    Signed-off-by: Wim Van Sebroeck <[email protected]>
    Stable-dep-of: 5af7d2cbd20f ("watchdog: rtd119x: Avoid division by zero")
    Signed-off-by: Sasha Levin <[email protected]>

 
wifi: ath11k: reset ar->num_stations on hardware start [+ + +]
Author: Nicolas Escande <[email protected]>
Date:   Wed Aug 12 16:58:05 2026 +0200

    wifi: ath11k: reset ar->num_stations on hardware start
    
    [ Upstream commit 7e0ad05ebc72fffba2bdf2400400902d94ed7272 ]
    
    When (multiple) hw restart occurs, we end up in a situation where we
    cannot accept new stations / mesh peers. This seems to be the
    'num_stations' in 'struct ath11k' that did not get reset properly in
    this case. In ath11k_mac_op_start(), it was indeed the only accounting var
    that did not get reset so let's clear it too.
    
    This avoids problems like those:
    
            [1248828.088023] WARNING: CPU: 0 PID: 12281 at net/mac80211/util.c:1682 ieee80211_reconfig_stations+0x98/0xc0
            [1248828.088115] Call trace:
            [1248828.088116]  ieee80211_reconfig_stations+0x98/0xc0 (P)
            [1248828.088119]  ieee80211_reconfig+0x774/0x1438
            [1248828.088123]  ieee80211_restart_work+0x10c/0x178
            [1248828.088127]  process_one_work+0x178/0x3c0
            [1248828.088130]  worker_thread+0x280/0x440
            [1248828.088133]  kthread+0xe0/0xf8
            [1248828.088137]  ret_from_fork+0x10/0x20
            [1248828.088141] ---[ end trace 0000000000000000 ]---
            [1248836.686604] ath11k_pci 0000:04:00.0: refusing to associate station: too many connected already (128)
            [1248836.686609] ath11k_pci 0000:04:00.0: Failed to add station: xx:xx:xx:xx:xx:xx for VDEV: 1
    
    Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.9.0.1-01977-QCAHKSWPL_SILICONZ-1
    
    Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
    Signed-off-by: Nicolas Escande <[email protected]>
    Reviewed-by: Rameshkumar Sundaram <[email protected]>
    Reviewed-by: Baochen Qiang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jeff Johnson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

wifi: brcmfmac: fix P2P device removal race in brcmf_detach() [+ + +]
Author: Michele Dionisio <[email protected]>
Date:   Mon Oct 12 17:34:51 2026 -0400

    wifi: brcmfmac: fix P2P device removal race in brcmf_detach()
    
    [ Upstream commit 08a3f02fea636e97a7422d1512f76dacdb5b0887 ]
    
    When the driver is removed while the user space process that created
    the P2P device (e.g. wpa_supplicant) is still exiting, the P2P device
    interface is removed twice and the kernel crashes.
    
    The two paths are:
    
     - wpa_supplicant, on exit, sends NL80211_CMD_DEL_INTERFACE for the P2P
       device. nl80211_del_interface() holds RTNL and the wiphy mutex and
       calls brcmf_p2p_del_vif(), which disables discovery and waits up to
       1.5 s for BRCMF_E_IF_DEL. Then it calls brcmf_remove_interface(),
       which unregisters the wdev and frees the vif and the ifp.
    
     - brcmf_detach() sets the bus down, so BRCMF_E_IF_DEL never arrives,
       and calls brcmf_remove_interface(ifp, false) for the same ifp.
       brcmf_p2p_ifp_removed() reads ifp->vif and then blocks on
       rtnl_lock(). When brcmf_p2p_del_vif() releases RTNL, it calls
       cfg80211_unregister_wdev() on the wdev that was already unregistered
       and freed.
    
    The second list_del_rcu() of wdev->list faults on LIST_POISON2:
    
      brcmfmac: brcmf_p2p_del_vif delete P2P vif
      brcmfmac: brcmf_p2p_deinit_discovery enter
      brcmfmac: brcmf_p2p_del_vif P2P: GO_NEG_PHASE status cleared
      brcmfmac: brcmf_detach Enter
      brcmfmac: brcmf_bus_change_state 1 -> 0
      brcmfmac: brcmf_remove_interface Enter, bsscfgidx=1, ifidx=0
      brcmfmac: brcmf_del_if Enter, bsscfgidx=1, ifidx=0
      brcmfmac: brcmf_p2p_ifp_removed P2P: device interface removed
      [1.5 s later, brcmf_p2p_del_vif() timed out]
      brcmfmac: brcmf_remove_interface Enter, bsscfgidx=1, ifidx=0
      brcmfmac: brcmf_del_if Enter, bsscfgidx=1, ifidx=0
      brcmfmac: brcmf_p2p_ifp_removed P2P: device interface removed
      Unable to handle kernel paging request at virtual address dead000000000122
      Internal error: Oops: 96000044 [#1] PREEMPT_RT SMP
      pc : _cfg80211_unregister_wdev+0x6c/0x264 [cfg80211]
      Call trace:
       _cfg80211_unregister_wdev+0x6c/0x264 [cfg80211]
       cfg80211_unregister_wdev+0x10/0x1c [cfg80211]
       brcmf_p2p_ifp_removed+0x84/0xb0 [brcmfmac]
       brcmf_remove_interface+0x1f4/0x254 [brcmfmac]
       brcmf_detach+0x88/0x180 [brcmfmac]
       brcmf_sdio_remove+0x90/0x7b0 [brcmfmac]
       brcmf_sdiod_remove+0x20/0xa0 [brcmfmac]
       brcmf_ops_sdio_remove+0xbc/0x12c [brcmfmac]
       sdio_bus_remove+0x38/0x144
       device_release_driver_internal+0x1e8/0x2c0
       device_release_driver+0x14/0x20
       brcmf_sdio_bus_remove+0x2c/0x40 [brcmfmac]
       brcmf_fwvid_unregister_vendor+0xd8/0x170 [brcmfmac]
       __exit_compat+0x18/0x418 [brcmfmac_cyw]
       __arm64_sys_delete_module+0x1ac/0x244
    
    The log was taken with debug=0x406 on an i.MX 8M Plus board with a
    CYW55513 (Sona IF513) on SDIO. The driver is the Ezurio backport of
    brcmfmac from v6.18.22 on a 5.4-rt kernel. The code involved is the same
    in mainline.
    
    To reproduce:
    
      1. Start wpa_supplicant on wlan0 and let it associate. It creates the
         P2P device (iw dev shows "type P2P-device").
      2. Stop wpa_supplicant and remove the driver without waiting for
         wpa_supplicant to exit:
    
           kill $(pidof wpa_supplicant)
           rmmod brcmfmac_cyw brcmfmac
    
    The crash is reproducible on that board.
    
    For the interface without a netdev (the P2P device), take RTNL and the
    wiphy mutex in brcmf_detach() before reading iflist, and remove it with
    locked=true. If brcmf_p2p_del_vif() runs first, brcmf_detach() finds the
    slot empty. If brcmf_detach() runs first, nl80211 does not find the wdev
    any more. The interfaces with a netdev are removed as before, because
    brcmf_del_if() takes RTNL on its own for the primary interface.
    
    Fixes: 9831bcb987df ("brcmfmac: Deleting of p2p device is leaking memory.")
    Cc: [email protected]
    Assisted-by: claude-opus-5-5
    Signed-off-by: Michele Dionisio <[email protected]>
    Acked-by: Arend van Spriel <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: Removed unavailable wiphy_lock() and wiphy_unlock() calls to rely solely on RTNL locking. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: cfg80211: avoid double free if updating BSS fails [+ + +]
Author: Benjamin Berg <[email protected]>
Date:   Wed Dec 20 13:41:43 2023 +0200

    wifi: cfg80211: avoid double free if updating BSS fails
    
    [ Upstream commit acc44cbd7727115f9381c35c2898b1b5af665ec8 ]
    
    cfg80211_update_known_bss will always consume the passed IEs. As such,
    cfg80211_update_assoc_bss_entry also needs to always set the pointers to
    NULL so that no double free can occur.
    
    Note that hitting this would probably require being connected to a
    hidden BSS which is then doing a channel switch while also switching to
    be not hidden anymore at the same time.
    
    Signed-off-by: Benjamin Berg <[email protected]>
    Reviewed-by: Johannes Berg <[email protected]>
    Signed-off-by: Miri Korenblit <[email protected]>
    Link: https://msgid.link/20231220133549.8891edb28d51.Id09c5145363e990ff5237decd58296302e2d53c8@changeid
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

wifi: cfg80211: preserve hidden-group beacon IE ownership [+ + +]
Author: Zhao Li <[email protected]>
Date:   Mon Sep 14 23:28:25 2026 +0800

    wifi: cfg80211: preserve hidden-group beacon IE ownership
    
    [ Upstream commit cc45f313d85533d647ce619326302aad6f797c14 ]
    
    A hidden-group probe-response entry borrows its beacon IEs from the
    group's beacon entry. cfg80211_update_assoc_bss_entry() can pass such
    an entry to cfg80211_update_known_bss() when merging scan entries
    after a channel switch.
    
    Copying the borrowed beacon_ies into the associated entry gives the
    same allocation two owners. Releasing the group's beacon entry can
    then leave the associated entry pointing to freed IEs, which are
    freed again when that entry is released.
    
    Skip beacon IE replacement when the source entry belongs to a hidden
    group. Preserve probe-response processing, the subsequent metadata
    updates, and the existing rejection path for conflicting hidden
    beacon updates.
    
    Fixes: 0afd425b1b64 ("cfg80211: fix duplicated scan entries after channel switch")
    Reported-by: Yilin Zhang <[email protected]>
    Closes: https://lore.kernel.org/linux-wireless/[email protected]/
    Assisted-by: Codex:gpt-6-astra
    Signed-off-by: Zhao Li <[email protected]>
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

wifi: cw1200: fix TX padding OOB read leaking heap data to device [+ + +]
Author: Tianchu Chen <[email protected]>
Date:   Fri Sep 4 15:23:34 2026 +0000

    wifi: cw1200: fix TX padding OOB read leaking heap data to device
    
    commit 7c1611780823b76219cb1478db53dfd890c4a9a2 upstream.
    
    The TX path rounds the transfer size up to the bus alignment
    (align_size(), up to 511 bytes for SDIO, 1 byte for SPI) but sends
    the padded length straight from the frame buffer, which has no room
    reserved for the padding.  cw1200_data_write() therefore reads past
    the end of the frame and the bus transfer carries those bytes to the
    device.  A bogus device can collect up to 511 bytes of kernel heap
    data per TX frame.
    
    The RX path does not have this problem: it allocates the skb with
    the aligned length (alloc_len) before reading.
    
    Compute the exact padding with the bus align_size() callback, make
    sure queued TX frames have tailroom for it, and zero the padding
    bytes before the transfer so nothing past the frame is exposed.
    
    This is not expected to change driver behavior on most cases: frame
    contents and transfer sizes are unchanged, only the content of the
    padding bytes (previously undefined stale memory, now zero), which
    the device never reads since the WSM header carries the real frame
    length.  The skb expansion can only fail under memory exhaustion,
    in which case the frame is dropped like on the existing error paths
    of cw1200_tx().
    
    Discovered by Atuin - Automated Vulnerability Discovery Engine.
    
    Fixes: a910e4a94f69 ("cw1200: add driver for the ST-E CW1100 & CW1200 WLAN chipsets")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Tianchu Chen <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: iwlegacy: 3945: free EEPROM data on remove [+ + +]
Author: Guangshuo Li <[email protected]>
Date:   Wed Sep 16 15:37:36 2026 +0800

    wifi: iwlegacy: 3945: free EEPROM data on remove
    
    commit f8ebe286394c0bbb4a6dbacb182a34ab6376922d upstream.
    
    il3945_pci_probe() calls il_eeprom_init(), which allocates memory for
    the EEPROM data. The probe failure paths release this allocation with
    il_eeprom_free(), but the remove path does not free it after a
    successful probe.
    
    As a result, the EEPROM data is leaked when the PCI device is removed.
    
    Free the EEPROM data in il3945_pci_remove() before releasing the
    mac80211 hardware structure.
    
    This issue was found by manual code inspection.
    
    Fixes: 073d3f5f1b3b ("iwlwifi: changing EEPROM layout handling")
    Cc: [email protected]
    Signed-off-by: Guangshuo Li <[email protected]>
    Acked-by: Stanislaw Gruszka <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: libipw: reject TKIP frames without a full MIC [+ + +]
Author: Daehyeon Ko <[email protected]>
Date:   Tue Sep 22 15:51:39 2026 -0400

    wifi: libipw: reject TKIP frames without a full MIC
    
    [ Upstream commit 06f42accaf3c6aecab1dcc57f68dde6c06c8b380 ]
    
    libipw_michael_mic_verify() assumes that an skb contains an eight-byte
    Michael MIC. A short TKIP frame makes the unsigned payload length wrap,
    causing michael_mic() to read past the skb.
    
    Check that the MIC is present before verifying it, and use the existing
    MICHAEL_MIC_LEN constant for all MIC lengths in the verifier.
    
    Fixes: b453872c35cf ("[NET] ieee80211 subsystem")
    Cc: [email protected]
    Assisted-by: LLM
    Signed-off-by: Daehyeon Ko <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    [ adapted libipw changes to the older lib80211 implementation and Michael MIC helper interface. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: account proxy paths against the mesh path limit [+ + +]
Author: Zhao Li <[email protected]>
Date:   Tue Oct 6 18:56:28 2026 -0400

    wifi: mac80211: account proxy paths against the mesh path limit
    
    [ Upstream commit a5f35d4b112af1415ff06bd501c8cc26cc08aa8b ]
    
    Proxy-path churn can drive the interface path counter negative and let
    later mesh path additions exceed MESH_MAX_MPATHS.
    
    mesh_path_free_rcu() decrements the interface mpaths counter for entries
    from both the mesh and proxy path tables, but mpp_path_add() never
    reserves a slot in that counter. Removing or expiring a proxy path
    therefore returns a slot that was never charged.
    
    mesh_path_add() uses the same counter to enforce MESH_MAX_MPATHS, so once
    it falls below the number of installed paths the limit no longer holds.
    
    Reserve the shared quota before allocating a proxy path and release it on
    every unsuccessful addition. Mesh and proxy paths now share one
    1024-entry budget, so mpp_path_add() can return -ENOSPC at that limit.
    
    Fixes: ece1a2e7e860 ("mac80211: Remove mesh paths when an interface is removed")
    Cc: [email protected]
    Assisted-by: LLM sparse kasan
    Signed-off-by: Zhao Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: adapted error handling to the absence of mesh_fast_tx_flush_addr() ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: count only matching reservations in reserved switch [+ + +]
Author: Zhiling Zou <[email protected]>
Date:   Wed Oct 7 03:12:49 2026 -0400

    wifi: mac80211: count only matching reservations in reserved switch
    
    [ Upstream commit 437f3727b4fd715266c296435c116288f82666fd ]
    
    ieee80211_vif_use_reserved_switch() validates a replacement by counting
    assigned links on ctx->replace_ctx and treating reservations too
    broadly. A link can still be assigned to the old channel context while
    holding a reservation that belongs to a different replacement
    operation.
    
    That can make the current replacement appear complete too early. If
    another link finalizes first, the function can free the
    WILL_BE_REPLACED chanctx while the unmatched link and driver still use
    it, leading to a use-after-free in later beacon generation.
    
    Require an in-place reservation to point at the current replacement
    context, and require the reserved and assigned contexts to be the
    matching replacement pair, before counting or moving the link.
    
    Fixes: 5bcae31d9cb1 ("mac80211: implement multi-vif in-place reservations")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zhiling Zou <[email protected]>
    Link: https://patch.msgid.link/4b6c4b8648ab1920c38a40be32c0b1a2797b4ac6.1785726007.git.zhilinz@nebusec.ai
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: Adapted per-link reservation handling to per-vif sdata helpers and list iteration. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: drain PS delivery work during station teardown [+ + +]
Author: Zhao Li <[email protected]>
Date:   Wed Sep 16 19:37:35 2026 +0800

    wifi: mac80211: drain PS delivery work during station teardown
    
    commit 67a9e80c3ca20c9044cd6ee72cd6278dd19b5023 upstream.
    
    Removing an AP or mesh station can notify the driver and wake TXQs after
    the station has already been removed from the driver, and can update
    num_sta_ps and the power-save queues after station cleanup has purged
    them.
    
    sta_deliver_ps_frames() tests sta->dead only before it starts delivery. A
    worker that passes that test can be delayed while teardown sets sta->dead
    and removes the station from the driver; when it resumes it still runs the
    full delivery.
    
    The existing cancel_work_sync() sits near the end of
    __cleanup_single_sta(), after the final driver state transition and after
    PS accounting and queue purging, so it drains the worker only once the
    state it has to protect has already changed. Before commit d34ba2168a3c
    ("mac80211: don't delay station destruction") cleanup was deferred
    through the same ordered workqueue as the delivery work, which kept the
    two ordered.
    
    Cancel the work after setting sta->dead and before moving the driver
    state, and move the existing cancellation to the start of
    __cleanup_single_sta(). The first drain closes the driver-lifetime window;
    driver callbacks during the remaining state transitions can still queue
    drv_deliver_wk through ieee80211_sta_block_awake(), so retain the second
    drain at the start of __cleanup_single_sta(). That drain also covers
    insertion failures, which reach cleanup without setting sta->dead.
    
    Fixes: d34ba2168a3c ("mac80211: don't delay station destruction")
    Cc: [email protected]
    Assisted-by: LLM sparse smatch coccinelle kasan
    Signed-off-by: Zhao Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: mac80211: handle empty FILS association request payload [+ + +]
Author: Yuqi Xu <[email protected]>
Date:   Sat Sep 19 16:48:12 2026 +0800

    wifi: mac80211: handle empty FILS association request payload
    
    commit 5bfd4b0b40b79781d900cb2f7da0685070f53c67 upstream.
    
    fils_encrypt_assoc_req() accepts a (Re)Association Request frame whose
    last element is the FILS Session element.  crypt_len is then zero and
    aes_siv_encrypt() is called with an empty plaintext.
    
    kmemdup() returns ZERO_SIZE_PTR for a zero-length allocation, so the
    unconditional sg_init_one() puts an invalid page into the scatterlist.
    With CONFIG_DEBUG_SG this triggers a kernel BUG in sg_set_buf();
    without the debug check the bogus page is handed to the crypto backend.
    
    AES-SIV is defined for empty plaintext and the S2V result is then the
    complete output, so handle this case before the CTR step, which has
    nothing to encrypt.
    
    Fixes: 39404feee691 ("mac80211: FILS AEAD protection for station mode association frames")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Assisted-by: LLM
    Signed-off-by: Yuqi Xu <[email protected]>
    Reviewed-by: Ren Wei <[email protected]>
    Link: https://patch.msgid.link/325c048982d637a3af80d74ac5b36e9369b93f1e.1789751126.git.xuyuqiabc@gmail.com
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: mac80211: keep fallback association elements alive [+ + +]
Author: Zhao Li <[email protected]>
Date:   Tue Oct 6 18:12:21 2026 -0400

    wifi: mac80211: keep fallback association elements alive
    
    [ Upstream commit a10a2f80476d166fd81c361ec0319493671b694e ]
    
    Associating to a non-transmitted MBSSID profile reads freed memory while
    determining the operating channel and applying HT capabilities.
    
    When an association response omits WMM, HT, or VHT information,
    ieee80211_assoc_config_link() parses the cached BSS IEs and copies the
    missing element pointers out of that fallback parse. For a
    non-transmitted MBSSID profile those pointers refer to merged-profile
    storage owned by the parse object, and the fallback block frees that
    object at its end. The copied pointers are used afterwards to determine
    the operating channel, configure bandwidth, and apply HT capabilities.
    
    Keep the fallback parse result alive until association setup finishes.
    
    Fixes: 5023b14cf4df ("mac80211: support profile split between elements")
    Cc: [email protected]
    Assisted-by: LLM sparse kasan
    [reorder variable declaration]
    Signed-off-by: Zhao Li <[email protected]>
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: changed kfree(bss_elems) to kfree(bss_elems.nontx_profile) for the stack-allocated parse structure. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: keep paired old chanctx alive [+ + +]
Author: Zhiling Zou <[email protected]>
Date:   Wed Oct 7 01:27:05 2026 -0400

    wifi: mac80211: keep paired old chanctx alive
    
    [ Upstream commit 3412e9a800786d1dec4a58367db1cba275e7ef11 ]
    
    An in-place replacement keeps reciprocal replace_ctx pointers between
    the old WILL_BE_REPLACED chanctx and the new REPLACES_OTHER chanctx.
    However, the early free paths only consider assigned and reserved link
    users when deciding whether to free the old chanctx.
    
    That lets the old chanctx be freed too early while the replacement
    partner still points back to it, either when the last assigned link is
    released or when that link successfully reassigns to another existing
    context. Later unreserve and switch-finalization paths can then follow a
    stale replace_ctx pointer.
    
    Keep a paired old chanctx alive until the replacement pair has been torn
    down. Apply the same check to both __ieee80211_link_release_channel()
    and ieee80211_link_use_reserved_reassign(). If the replacement is later
    abandoned, ieee80211_link_unreserve_chanctx() already tears down the
    pairing before freeing the old chanctx once no users remain.
    
    Fixes: 5bcae31d9cb1 ("mac80211: implement multi-vif in-place reservations")
    Cc: [email protected]
    Reported-by: Vega <[email protected]>
    Signed-off-by: Zhiling Zou <[email protected]>
    Link: https://patch.msgid.link/b9b582b0db3814f641648b8886bb50f9d68f93ac.1785730815.git.zhilinz@nebusec.ai
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: adapted link-based chanctx handling to the older vif-based API ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: mac80211: release mesh path quota on failed additions [+ + +]
Author: Zhao Li <[email protected]>
Date:   Wed Sep 16 19:36:48 2026 +0800

    wifi: mac80211: release mesh path quota on failed additions
    
    commit 7325a44474f20c1393a1c114c6811abce6ddfaf4 upstream.
    
    Repeated failed or duplicate mesh path additions can exhaust
    MESH_MAX_MPATHS while the path table holds fewer paths, which stops new
    paths to reachable destinations from being created.
    
    mesh_path_add() reserves a slot before allocating and inserting a path.
    If allocation fails, the function returns without releasing the slot. If
    the rhashtable insertion reports an error or an existing destination, the
    function discards its candidate but retains the reservation. No new path
    is installed in any of these cases.
    
    Release the reservation whenever the candidate is not installed.
    
    Fixes: ae76eef027f7 ("mac80211: return new mpath from mesh_path_add()")
    Fixes: 60854fd94573 ("mac80211: mesh: convert path table to rhashtable")
    Cc: [email protected]
    Assisted-by: LLM sparse kasan
    Signed-off-by: Zhao Li <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: mac80211: set info->band for 802.3 encap offload frames [+ + +]
Author: Felix Fietkau <[email protected]>
Date:   Wed Oct 7 02:24:39 2026 -0400

    wifi: mac80211: set info->band for 802.3 encap offload frames
    
    [ Upstream commit 4febc02cd02f021f2b6d0768332be643ef14a12d ]
    
    Unlike the 802.11 TX paths, ieee80211_8023_xmit() does not set
    info->band from the channel context on non-MLD interfaces. It stays at
    0, so ieee80211_get_tx_rates() uses the wrong band for these frames.
    
    Set it the same way as ieee80211_build_hdr(): drop the frame if there is
    no channel context, and leave the band at 0 on MLD interfaces.
    
    Reported-by: Andrea Pesaresi <[email protected]>
    Fixes: 50ff477a8639 ("mac80211: add 802.11 encapsulation offloading support")
    Cc: [email protected]
    Signed-off-by: Felix Fietkau <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    [ sashal: adapted MLD-aware channel-context handling to unconditional vif.chanctx_conf access with out_free cleanup. ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: p54: validate firmware record lengths [+ + +]
Author: Heyang Tan <[email protected]>
Date:   Fri Sep 18 16:33:49 2026 +0800

    wifi: p54: validate firmware record lengths
    
    commit db7b86bd97b380ece8fa39cfdd7502a9fd35e56f upstream.
    
    The p54 firmware parser accesses component ID and component version
    records without checking that their lengths cover the fields being read.
    A malformed record can therefore make the parser read past the record.
    
    Validate the component ID and component version record lengths before
    accessing their data. The descriptor record is also checked against the
    shortest descriptor length found in the supported firmware images.
    
    Reject descriptor values that underflow the RX offset or produce an empty
    RX range before updating the driver state.
    
    Assisted-by: LLM Codex
    Signed-off-by: Heyang Tan <[email protected]>
    Tested-by: Christian Lamparter <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: rtl8xxxu: fix use-after-free from rx_urb_wq on stop [+ + +]
Author: Fan Wu <[email protected]>
Date:   Wed Sep 9 20:18:07 2026 -0400

    wifi: rtl8xxxu: fix use-after-free from rx_urb_wq on stop
    
    [ Upstream commit 6c080026ecc17eecb103f8927c64ea73a74bb818 ]
    
    rtl8xxxu arms rx_urb_wq from the RX completion path:
    rtl8xxxu_rx_complete() hands the URB to rtl8xxxu_queue_rx_urb(), which
    queues it on rx_urb_pending_list and, once the list grows past
    RTL8XXXU_RX_URB_PENDING_WATER, schedules rx_urb_wq.  The worker
    rtl8xxxu_rx_urb_work() drains rx_urb_pending_list, recovers priv through
    container_of, and resubmits each URB through rtl8xxxu_submit_rx_urb(),
    which anchors it on rx_anchor and dereferences priv->udev.
    
    rtl8xxxu_stop() cancels the sibling work items (c2hcmd_work, ra_watchdog,
    update_beacon_work) but never cancels rx_urb_wq, so a worker armed during
    the last burst of RX traffic can run rtl8xxxu_rx_urb_work() after
    rtl8xxxu_disconnect() has called ieee80211_free_hw(), which frees priv,
    producing a use-after-free.  The window opens under active RX traffic
    (pending count above the watermark) followed by a disconnect.
    
    There are two teardown races to close:
    
      * rtl8xxxu_queue_rx_urb() decided whether to enqueue under rx_urb_lock
        but called schedule_work() after dropping the lock.  A completion
        that observed shutdown == false and released the lock could then call
        schedule_work() after rtl8xxxu_stop() had set shutdown and
        cancel_work_sync() had already returned, arming the worker to run
        after the teardown.  Move schedule_work() under the same !shutdown
        branch so the arming decision is atomic with the shutdown check.
    
      * rtl8xxxu_rx_urb_work() anchors every URB it drained back onto
        rx_anchor through rtl8xxxu_submit_rx_urb().  A worker still running
        when usb_kill_anchored_urbs(&priv->rx_anchor) returned would submit a
        URB that escaped the kill.  In rtl8xxxu_stop(), call
        cancel_work_sync(&priv->rx_urb_wq) before the kill so the worker is
        drained first.
    
    After priv->shutdown is set under rx_urb_lock, completions can no longer
    queue rx_urb_wq. cancel_work_sync() then drains the last queued or running
    worker, and the following usb_kill_anchored_urbs() kills the URBs it may
    have submitted.
    
    rtl8xxxu_disconnect() is covered because ieee80211_unregister_hw()
    guarantees .stop() runs for a live interface before ieee80211_free_hw()
    frees priv.  The probe error path needs no cancel: rx_urb_wq is
    INIT_WORK()'d there but cannot have been scheduled, since no URB is
    submitted before ieee80211_register_hw() succeeds.
    
    This bug was found by static analysis.
    
    Fixes: 26f1fad29ad9 ("New driver: rtl8xxxu (mac80211)")
    Cc: [email protected]
    Signed-off-by: Fan Wu <[email protected]>
    Signed-off-by: Ping-Ke Shih <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: wcn36xx: fix heap overflow from oversized firmware HAL response [+ + +]
Author: Tristan Madani <[email protected]>
Date:   Tue Apr 21 13:50:16 2026 +0000

    wifi: wcn36xx: fix heap overflow from oversized firmware HAL response
    
    commit 88a240d86d3d64521f9194abe185ac71cc74d0bd upstream.
    
    The firmware response dispatcher copies all synchronous HAL responses
    into the 4096-byte hal_buf without validating the response length. A
    response exceeding WCN36XX_HAL_BUF_SIZE causes a heap buffer overflow
    with firmware-controlled content.
    
    Add a bounds check on the response length.
    
    Fixes: 8e84c2582169 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware")
    Signed-off-by: Tristan Madani <[email protected]>
    Reviewed-by: Loic Poulain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jeff Johnson <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    Signed-off-by: Roman Demidov <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

wifi: wcn36xx: Fix potential use-after-free in TX ack timer teardown [+ + +]
Author: Fan Wu <[email protected]>
Date:   Tue Sep 22 15:55:10 2026 -0400

    wifi: wcn36xx: Fix potential use-after-free in TX ack timer teardown
    
    [ Upstream commit d9be5e75530772fc31637070d51e5717d6aeaa2a ]
    
    wcn36xx_dxe_deinit() tears down the TX ack timer with timer_delete(),
    which only dequeues the timer and does not wait for a callback that is
    already executing; the preceding free_irq() calls synchronize the
    interrupt handlers only. The callback, wcn36xx_dxe_tx_timer(), can
    therefore be running past the teardown and use the wcn freed along
    with the ieee80211_hw in wcn36xx_remove(): it takes wcn->dxe_lock,
    reads wcn->tx_ack_skb and passes wcn->hw to
    ieee80211_tx_status_irqsafe().
    
    Fix this by using timer_shutdown_sync(), which waits for a running
    callback and also prevents the timer from being rearmed again. The
    timer is set up again by wcn36xx_dxe_init() on the next start, so the
    start/stop cycle is unaffected.
    
    This issue was found by an in-house static analysis tool.
    
    Fixes: fdf21cc37149 ("wcn36xx: Add TX ack support")
    Cc: [email protected]
    Assisted-by: LLM
    Co-developed-by: Song Li <[email protected]>
    Signed-off-by: Song Li <[email protected]>
    Signed-off-by: Fan Wu <[email protected]>
    Reviewed-by: Loic Poulain <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jeff Johnson <[email protected]>
    [ Replaced unavailable timer_shutdown_sync() with timer_delete_sync(). ]
    Signed-off-by: Sasha Levin <[email protected]>

wifi: wl12xx: Drop if with an always false condition [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Mon Oct 5 02:40:44 2026 -0400

    wifi: wl12xx: Drop if with an always false condition
    
    [ Upstream commit 69ddcea564437ce4b0d5143f37a9154fcef8d3d2 ]
    
    The remove callback is only called after probe completed successfully.
    In this case platform_set_drvdata() was called with a non-NULL argument
    (in wlcore_probe()) and so wl is never NULL.
    
    This is a preparation for making platform remove callbacks return void.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Kalle Valo <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Stable-dep-of: a8b8881d0c1a ("wifi: wlcore: Fix runtime PM leak in wlcore_remove()")
    Signed-off-by: Sasha Levin <[email protected]>

wifi: wlcore: Convert to platform remove callback returning void [+ + +]
Author: Uwe Kleine-König <[email protected]>
Date:   Mon Oct 5 02:40:45 2026 -0400

    wifi: wlcore: Convert to platform remove callback returning void
    
    [ Upstream commit f00928012886a07ca6817ea70eb4856ce280ce05 ]
    
    The .remove() callback for a platform driver returns an int which makes
    many driver authors wrongly assume it's possible to do error handling by
    returning an error code.  However the value returned is (mostly) ignored
    and this typically results in resource leaks. To improve here there is a
    quest to make the remove callback return void. In the first step of this
    quest all drivers are converted to .remove_new() which already returns
    void.
    
    wlcore_remove() returned zero unconditionally. With that converted to
    return void instead, the wl12xx and wl18xx driver can be converted to
    .remove_new trivially.
    
    Signed-off-by: Uwe Kleine-König <[email protected]>
    Signed-off-by: Kalle Valo <[email protected]>
    Link: https://lore.kernel.org/r/[email protected]
    Stable-dep-of: a8b8881d0c1a ("wifi: wlcore: Fix runtime PM leak in wlcore_remove()")
    Signed-off-by: Sasha Levin <[email protected]>

wifi: wlcore: Fix runtime PM leak in wlcore_remove() [+ + +]
Author: Wentao Liang <[email protected]>
Date:   Mon Oct 5 02:40:46 2026 -0400

    wifi: wlcore: Fix runtime PM leak in wlcore_remove()
    
    [ Upstream commit a8b8881d0c1aff544fae190469d86db7b07f43a9 ]
    
    pm_runtime_get_sync() keeps the runtime PM usage counter elevated even
    when it returns an error, so the reference taken at the beginning of
    wlcore_remove() has to be dropped on every exit path. When the device
    was not initialized the function returned early without doing so,
    leaking the reference.
    
    Release it with pm_runtime_put_noidle() as done on the other early error
    paths of this driver.
    
    Fixes: fa2648a34e73f ("wlcore: Add support for runtime PM")
    Cc: [email protected]
    Signed-off-by: Wentao Liang <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Johannes Berg <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
wireguard: noise: reject response consumption after intermediate initiation [+ + +]
Author: Jason A. Donenfeld <[email protected]>
Date:   Thu Oct 8 14:59:16 2026 +0200

    wireguard: noise: reject response consumption after intermediate initiation
    
    commit d0305f8d90029556260c6824b61c493c424eba9e upstream.
    
    Two threads begin processing the identical response message, received
    twice. The first thread, A, runs. While it's running, the second one,
    B, gets partway through, and during that slow calculation, or even while
    blocking on down_write(), A completes and then also a handshake
    initiation that's already been queued up runs in thread C, which itself
    takes that same down_write(). The handshake initiation creation
    succeeds, and sets the state back to waiting-for-response, and calls
    up_write(), at which point thread B resumes, because either its finished
    its calculations or was finally allowed to acquire down_write(). Thread
    B then copies the state back to the peer, and begins a new session,
    using that state, which is the same session as the one made in thread A.
    
    Thread A                        Thread B                        Thread C
    
    down_read()
     sA = handshake->state
     memcpy(cA, handshake->crypto)
    up_read()
    if (sA != 1)
     goto fail
    slow_crypto(cA)
                                    down_read()
                                     sB = handshake->state
                                     memcpy(cB, handshake->crypto)
                                    up_read()
                                    if (sB != 1)
                                     goto fail
                                    slow_crypto(cB)
    down_write()
     if (sA != handshake->state)
      goto fail
     memcpy(handshake->crypto, cA)
     handshake->state = 2
    up_write()
    down_write()
     if (handshake->state != 2)
      goto fail
     derive_session(handshake->crypto)
    up_write()
                                                                    down_write()
                                                                     slow_crypto(handshake->crypto)
                                                                     handshake->state = 1
                                                                    up_write()
                                    down_write()
                                     if (sB != handshake->state)
                                       goto fail
                                     memcpy(handshake->crypto, cB)
                                     handshake->state = 2
                                    up_write()
                                    down_write()
                                     if (handshake->state != 2)
                                      goto fail
                                     derive_session(handshake->crypto)
                                    up_write()
    
    This seems basically impossible to hit in a meaningful way in practice,
    but ensure that it absolutely cannot happen by comparing the ephemeral
    private key that's on the stack with the latest one that the peer's
    handshake state has.
    
    Cc: [email protected]
    Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
    Reported-by: Jérémy Jean <[email protected]>
    Signed-off-by: Jason A. Donenfeld <[email protected]>
    Link: https://patch.msgid.link/[email protected]
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
workqueue: Add resource managed version of delayed work init [+ + +]
Author: Matti Vaittinen <[email protected]>
Date:   Wed Sep 9 12:57:53 2026 -0400

    workqueue: Add resource managed version of delayed work init
    
    [ Upstream commit 0341ce5443949588e93581b49b934cdde2befbf8 ]
    
    A few drivers which need a delayed work-queue must cancel work at driver
    detach. Some of those implement remove() solely for this purpose. Help
    drivers to avoid unnecessary remove and error-branch implementation by
    adding managed verision of delayed work initialization. This will also
    help drivers to avoid mixing manual and devm based unwinding when other
    resources are handled by devm.
    
    Reviewed-by: Hans de Goede <[email protected]>
    Signed-off-by: Matti Vaittinen <[email protected]>
    Link: https://lore.kernel.org/r/51769ea4668198deb798fe47fcfb5f5288d61586.1616506559.git.matti.vaittinen@fi.rohmeurope.com
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    Stable-dep-of: 9d34c9d660c3 ("power: supply: bq24257: fix use-after-free on remove")
    Signed-off-by: Sasha Levin <[email protected]>

workqueue: Fix NULL current_pwq deref in chained work check [+ + +]
Author: Pavankumar Kondeti <[email protected]>
Date:   Mon Sep 28 09:18:56 2026 +0530

    workqueue: Fix NULL current_pwq deref in chained work check
    
    commit 980db94e3eeefdd8a1c46f86412c33a7f7806f51 upstream.
    
    current_wq_worker() only tells us that %current is a kworker. It does
    not guarantee that the worker is currently executing a work item, as
    worker->current_pwq is populated only while process_one_work() is running
    the work function.
    
    is_chained_work() can be reached while queueing on a draining or
    destroying workqueue. If a kworker outside work-item execution reaches
    that path, current_wq_worker() returns a worker but worker->current_pwq is
    NULL, and the chained-work test can fault before it emits the intended
    warning.
    
    Guard the chained-work test with worker->current_pwq. A kworker without
    current_pwq is not executing work on the target workqueue, so the helper
    should return false and let the draining/destroying warning fire.
    
    Fixes: 8d03ecfe4718 ("workqueue: reimplement is_chained_work() using current_wq_worker()")
    Cc: [email protected]
    Signed-off-by: Pavankumar Kondeti <[email protected]>
    Signed-off-by: Tejun Heo <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
xen/netfront: don't leak the skb when xennet_fill_frags() fails [+ + +]
Author: Josef Bacik <[email protected]>
Date:   Wed Oct 7 17:57:32 2026 +0000

    xen/netfront: don't leak the skb when xennet_fill_frags() fails
    
    commit 93ccaf1c26e2133396173b76a071e59024daa622 upstream.
    
    When a response chain has more slots than fit in the skb's frags,
    xennet_fill_frags() returns an error and xennet_poll() jumps to its
    error path.  That path moves what's left on tmpq to errq to be freed,
    but the skb being filled was already dequeued from tmpq, so it's never
    freed.  Each chain that overflows leaks the skb and the pages attached
    to it as frags, and the backend decides how many slots it sends.
    
    Put the skb back on tmpq before taking the error path, like the
    xennet_set_skb_gso() failure just above it does.
    
    Fixes: ad4f15dc2c70 ("xen/netfront: don't bug in case of too many frags")
    Cc: [email protected]
    Signed-off-by: Josef Bacik <[email protected]>
    Reviewed-by: Juergen Gross <[email protected]>
    Link: https://patch.msgid.link/20261007-b4-xen-netfront-fill-frags-leak-v1-1-a8a01ff9cd52@toxicpanda.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

xen/netfront: drop RX packets with a short Ethernet header [+ + +]
Author: Josef Bacik <[email protected]>
Date:   Wed Oct 7 17:55:40 2026 +0000

    xen/netfront: drop RX packets with a short Ethernet header
    
    commit 089e58805c452e52179482b1025a8e309a57f801 upstream.
    
    handle_incoming_queue() pulls pull_to bytes into the head before
    calling eth_type_trans().  pull_to is the length of the first RX slot,
    capped at RX_COPY_THRESHOLD, and that length comes from the backend.
    Nothing checks it against ETH_HLEN.
    
    If the first slot is shorter than ETH_HLEN and more slots follow, the
    head ends up shorter than an Ethernet header while skb->len is longer,
    and eth_type_trans() BUG()s in __skb_pull().  If the whole packet is
    shorter than ETH_HLEN, eth_type_trans() reads the header past the end
    of the data instead.
    
    Pull at least ETH_HLEN, and drop the packet if that fails, which also
    drops packets too short to hold an Ethernet header.  This also checks
    the return value of the pull, which was ignored.
    
    Fixes: 0d160211965b ("xen: add virtual network device driver")
    Cc: [email protected]
    Signed-off-by: Josef Bacik <[email protected]>
    Link: https://patch.msgid.link/20261007-b4-xen-netfront-short-head-v1-1-12d7113a7e4e@toxicpanda.com
    Signed-off-by: Jakub Kicinski <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>

 
xfrm: prevent policy_hthresh.work from racing with netns teardown [+ + +]
Author: Tahera Fahimi <[email protected]>
Date:   Thu Oct 15 13:22:39 2026 -0700

    xfrm: prevent policy_hthresh.work from racing with netns teardown
    
    An XFRM_MSG_NEWSPDINFO request can queue the per-net work item
    policy_hthresh.work onto the system workqueue. xfrm_hash_rebuild()
    retrieves the enclosing struct net from the work item, so the callback
    can dereference freed memory if it runs after net namespace teardown.
    
    Mainline commit 29fe3a61bcdc ("xfrm: prevent policy_hthresh.work
    from racing with netns teardown") fixes this issue using
    disable_work_sync(). That API is not available in Linux 5.10, so the
    mainline change cannot be directly backported.
    
    Provide the same guarantee with an XFRM-local work_disabled flag. Protect
    the flag and schedule_work() with the existing policy_hthresh seqlock so
    teardown can atomically stop new queueing attempts. Then use
    cancel_work_sync() to synchronize work that was queued before the flag was
    set. This ensures policy_hthresh.work cannot outlive its struct net.
    
    Fixes: 880a6fab8f6b ("xfrm: configure policy hash table thresholds by netlink")
    Assisted-by: GitHub-Copilot:GPT-5.6 Sol
    Signed-off-by: Tahera Fahimi <[email protected]>
    Reviewed-by: Allen Pais <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
xfs: aborting inodes on shutdown may need buffer lock [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:39 2026 +0530

    xfs: aborting inodes on shutdown may need buffer lock
    
    [ Upstream commit d2d7c0473586d2f22e85d615275f34cf19f94447 ]
    
    Most buffer io list operations are run with the bp->b_lock held, but
    xfs_iflush_abort() can be called without the buffer lock being held
    resulting in inodes being removed from the buffer list while other
    list operations are occurring. This causes problems with corrupted
    bp->b_io_list inode lists during filesystem shutdown, leading to
    traversals that never end, double removals from the AIL, etc.
    
    Fix this by passing the buffer to xfs_iflush_abort() if we have
    it locked. If the inode is attached to the buffer, we're going to
    have to remove it from the buffer list and we'd have to get the
    buffer off the inode log item to do that anyway.
    
    If we don't have a buffer passed in (e.g. from xfs_reclaim_inode())
    then we can determine if the inode has a log item and if it is
    attached to a buffer before we do anything else. If it does have an
    attached buffer, we can lock it safely (because the inode has a
    reference to it) and then perform the inode abort.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Stable-dep-of: 09234a632be4 ("xfs: xfs_ifree_cluster vs xfs_iflush_shutdown_abort deadlock")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: buffer pins need to hold a buffer reference [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:43 2026 +0530

    xfs: buffer pins need to hold a buffer reference
    
    [ Upstream commit 89a4bf0dc3857569a77061d3d5ea2ac85f7e13c6 ]
    
    When a buffer is unpinned by xfs_buf_item_unpin(), we need to access
    the buffer after we've dropped the buffer log item reference count.
    This opens a window where we can have two racing unpins for the
    buffer item (e.g. shutdown checkpoint context callback processing
    racing with journal IO iclog completion processing) and both attempt
    to access the buffer after dropping the BLI reference count.  If we
    are unlucky, the "BLI freed" context wins the race and frees the
    buffer before the "BLI still active" case checks the buffer pin
    count.
    
    This results in a use after free that can only be triggered
    in active filesystem shutdown situations.
    
    To fix this, we need to ensure that buffer existence extends beyond
    the BLI reference count checks and until the unpin processing is
    complete. This implies that a buffer pin operation must also take a
    buffer reference to ensure that the buffer cannot be freed until the
    buffer unpin processing is complete.
    
    Reported-by: yangerkun <[email protected]>
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Dave Chinner <[email protected]>
    Signed-off-by: Leah Rumancik <[email protected]>
    Acked-by: Chandan Babu R <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    (cherry picked from commit 81274891036602355e72eabbb5184490f354b506)
    Stable-dep-of: 816c330b605c ("xfs: factor out stale buffer item completion")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: catch stale AGF/AGF metadata [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:45 2026 +0530

    xfs: catch stale AGF/AGF metadata
    
    [ Upstream commit db6a2274162de615ff74b927d38942fe3134d298 ]
    
    There is a race condition that can trigger in dmflakey fstests that
    can result in asserts in xfs_ialloc_read_agi() and
    xfs_alloc_read_agf() firing. The asserts look like this:
    
     XFS: Assertion failed: pag->pagf_freeblks == be32_to_cpu(agf->agf_freeblks), file: fs/xfs/libxfs/xfs_alloc.c, line: 3440
    .....
     Call Trace:
      <TASK>
      xfs_alloc_read_agf+0x2ad/0x3a0
      xfs_alloc_fix_freelist+0x280/0x720
      xfs_alloc_vextent_prepare_ag+0x42/0x120
      xfs_alloc_vextent_iterate_ags+0x67/0x260
      xfs_alloc_vextent_start_ag+0xe4/0x1c0
      xfs_bmapi_allocate+0x6fe/0xc90
      xfs_bmapi_convert_delalloc+0x338/0x560
      xfs_map_blocks+0x354/0x580
      iomap_writepages+0x52b/0xa70
      xfs_vm_writepages+0xd7/0x100
      do_writepages+0xe1/0x2c0
      __writeback_single_inode+0x44/0x340
      writeback_sb_inodes+0x2d0/0x570
      __writeback_inodes_wb+0x9c/0xf0
      wb_writeback+0x139/0x2d0
      wb_workfn+0x23e/0x4c0
      process_scheduled_works+0x1d4/0x400
      worker_thread+0x234/0x2e0
      kthread+0x147/0x170
      ret_from_fork+0x3e/0x50
      ret_from_fork_asm+0x1a/0x30
    
    I've seen the AGI variant from scrub running on the filesysetm
    after unmount failed due to systemd interference:
    
     XFS: Assertion failed: pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) || xfs_is_shutdown(pag->pag_mount), file: fs/xfs/libxfs/xfs_ialloc.c, line: 2804
    .....
     Call Trace:
      <TASK>
      xfs_ialloc_read_agi+0xee/0x150
      xchk_perag_drain_and_lock+0x7d/0x240
      xchk_ag_init+0x34/0x90
      xchk_inode_xref+0x7b/0x220
      xchk_inode+0x14d/0x180
      xfs_scrub_metadata+0x2e2/0x510
      xfs_ioc_scrub_metadata+0x62/0xb0
      xfs_file_ioctl+0x446/0xbf0
      __se_sys_ioctl+0x6f/0xc0
      __x64_sys_ioctl+0x1d/0x30
      x64_sys_call+0x1879/0x2ee0
      do_syscall_64+0x68/0x130
      ? exc_page_fault+0x62/0xc0
      entry_SYSCALL_64_after_hwframe+0x76/0x7e
    
    Essentially, it is the same problem. When _flakey_drop_and_remount()
    loads the drop-writes table, it makes all writes silently fail. Writes
    are reported to the fs as completed successfully, but they are not
    issued to the backing store. The filesystem sees the successful
    write completion and marks the metadata buffer clean and removes it
    from the AIL.
    
    If this happens at the same time as memory pressure is occuring,
    the now-clean AGF and/or AGI buffers can be reclaimed from memory.
    
    Shortly afterwards, but before _flakey_drop_and_remount() runs
    unmount, background writeback is kicked and it tries to allocate
    blocks for the dirty pages in memory. This then tries to access the
    AGF buffer we just turfed out of memory. It's not found, so it gets
    read in from disk.
    
    This is all fine, except for the fact that the last writeback of the
    AGF did not actually reach disk. The AGF on disk is stale compared
    to the in-memory state held by the perag, and so they don't match
    and the assert fires.
    
    Then other operations on that inode hang because the task was killed
    whilst holding inode locks. e.g:
    
     Workqueue: xfs-conv/dm-12 xfs_end_io
     Call Trace:
      <TASK>
      __schedule+0x650/0xb10
      schedule+0x6d/0xf0
      schedule_preempt_disabled+0x15/0x30
      rwsem_down_write_slowpath+0x31a/0x5f0
      down_write+0x43/0x60
      xfs_ilock+0x1a8/0x210
      xfs_trans_alloc_inode+0x9c/0x240
      xfs_iomap_write_unwritten+0xe3/0x300
      xfs_end_ioend+0x90/0x130
      xfs_end_io+0xce/0x100
      process_scheduled_works+0x1d4/0x400
      worker_thread+0x234/0x2e0
      kthread+0x147/0x170
      ret_from_fork+0x3e/0x50
      ret_from_fork_asm+0x1a/0x30
      </TASK>
    
    and it's all down hill from there.
    
    Memory pressure is one way to trigger this, another is to run "echo
    3 > /proc/sys/vm/drop_caches" randomly while tests are running.
    
    Regardless of how it is triggered, this effectively takes down the
    system once umount hangs because it's holding a sb->s_umount lock
    exclusive and now every sync(1) call gets stuck on it.
    
    Fix this by replacing the asserts with a corruption detection check
    and a shutdown.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    
    6.12:
    
    Fixed conflict due to the following missing commit:
            e9c4d8bfb26c ("xfs: factor out a generic xfs_group structure")
    
    6.6:
    
    Fixed conflict due to the following missing commit:
            e45ea3645178 ("xfs: split the agf_roots and agf_levels arrays")
    
    5.15:
    
    Fixed conflict due to the following missing commits:
            6f643c57d57c ("xfs: implement ->notify_failure() for XFS")
            [Continuous range: a95fee40e3d4^..08d3e84feeb8]
            08d3e84feeb8 ("xfs: pass perag to xfs_alloc_read_agf()")
            76b47e528e3a ("xfs: kill xfs_alloc_pagf_init()")
            99b13c7f0bd3 ("xfs: pass perag to xfs_ialloc_read_agi()")
            a95fee40e3d4 ("xfs: kill xfs_ialloc_pagi_init()")
    
    5.10:
    
    Fixed conflicts due to the following missing commits:
    
    fs/xfs/libxfs/xfs_alloc.c, fs/xfs/libxfs/xfs_ialloc.c:
            75c8c50fa16a ("xfs: replace XFS_FORCED_SHUTDOWN with xfs_is_shutdown")
    
    fs/xfs/libxfs/xfs_ialloc.c:
            9bbafc71919a ("xfs: move xfs_perag_get/put to xfs_ag.[ch]")
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: convert XLOG_FORCED_SHUTDOWN() to xlog_is_shutdown() [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:37 2026 +0530

    xfs: convert XLOG_FORCED_SHUTDOWN() to xlog_is_shutdown()
    
    [ Upstream commit 2039a272300b949c05888428877317b834c0b1fb ]
    
    Make it less shouty and a static inline before adding more calls
    through the log code.
    
    Also convert internal log code that uses XFS_FORCED_SHUTDOWN(mount)
    to use xlog_is_shutdown(log) as well.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    
    5.10:
    
    Fixed conflicts due to the following missing commits:
            956f6daa84bf ("xfs: add iclog state trace events")
            303591a0a947 ("xfs: cover the log during log quiesce")
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: don't hold buffer locks across sync transaction commit in xfs_sync_sb_buf [+ + +]
Author: Yun Zhou <[email protected]>
Date:   Thu Oct 22 18:03:29 2026 -0400

    xfs: don't hold buffer locks across sync transaction commit in xfs_sync_sb_buf
    
    [ Upstream commit 41a28c865d1d5843f8cb9e0af17a8f4d9e2961ff ]
    
    xfs_sync_sb_buf() holds sb/rtsb buffer locks across a synchronous
    xfs_trans_commit(), which flushes the CIL push workqueue internally.
    If shutdown occurs during the CIL push, xfs_buf_item_unpin() needs to
    lock these buffers to fail them, causing a deadlock:
    
      setlabel:          holds buf lock -> flush_workqueue(xfs-cil)
      CIL push worker:   xfs_buf_item_unpin -> xfs_buf_lock(same buf)
    
    Remove the xfs_trans_bhold() calls so that commit releases the buffer
    locks normally.  After the sync commit, re-acquire the buffers via
    mp->m_sb_bp / mp->m_rtsb_bp for the on-disk writeback.
    
    Fixes: f7664b31975b ("xfs: implement online get/set fs label")
    Reported-by: [email protected]
    Closes: https://syzkaller.appspot.com/bug?extid=837bcd54843dd6262f2f
    Cc: [email protected]
    Signed-off-by: Yun Zhou <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    [ sashal: Omitted realtime superblock changes because xfs_sync_sb_buf() lacks realtime superblock support. ]
    Signed-off-by: Sasha Levin <[email protected]>

xfs: don't nest icloglock inside ic_callback_lock [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:36 2026 +0530

    xfs: don't nest icloglock inside ic_callback_lock
    
    [ Upstream commit 6be001021f0b307c8c1544e8b3ac87de20d711de ]
    
    It's completely unnecessary because callbacks are added to iclogs
    without holding the icloglock, hence no amount of ordering between
    the icloglock and ic_callback_lock will order the removal of
    callbacks from the iclog.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Brian Foster <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    
    5.10:
    
    Fixed conflict due to the following missing commit:
            956f6daa84bf ("xfs: add iclog state trace events")
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: factor out stale buffer item completion [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:47 2026 +0530

    xfs: factor out stale buffer item completion
    
    [ Upstream commit 816c330b605c3f4813c0dc0ab5af5cce17ff06b3 ]
    
    The stale buffer item completion handling is currently only done
    from BLI unpinning. We need to perform this function from where-ever
    the last reference to the BLI is dropped, so first we need to
    factor this code out into a helper.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: fix intermittent hang during quotacheck [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Tue Oct 13 15:09:42 2026 +0530

    xfs: fix intermittent hang during quotacheck
    
    [ Upstream commit f0c2d7d2abca24d19831c99edea458704fac8087 ]
    
    Every now and then, I see the following hang during mount time
    quotacheck when running fstests.  Turning on KASAN seems to make it
    happen somewhat more frequently.  I've edited the backtrace for brevity.
    
    XFS (sdd): Quotacheck needed: Please wait.
    XFS: Assertion failed: bp->b_flags & _XBF_DELWRI_Q, file: fs/xfs/xfs_buf.c, line: 2411
    ------------[ cut here ]------------
    WARNING: CPU: 0 PID: 1831409 at fs/xfs/xfs_message.c:104 assfail+0x46/0x4a [xfs]
    CPU: 0 PID: 1831409 Comm: mount Tainted: G        W         5.19.0-rc6-xfsx #rc6 09911566947b9f737b036b4af85e399e4b9aef64
    Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.15.0-1 04/01/2014
    RIP: 0010:assfail+0x46/0x4a [xfs]
    Code: a0 8f 41 a0 e8 45 fe ff ff 8a 1d 2c 36 10 00 80 fb 01 76 0f 0f b6 f3 48 c7 c7 c0 f0 4f a0 e8 10 f0 02 e1 80 e3 01 74 02 0f 0b <0f> 0b 5b c3 48 8d 45 10 48 89 e2 4c 89 e6 48 89 1c 24 48 89 44 24
    RSP: 0018:ffffc900078c7b30 EFLAGS: 00010246
    RAX: 0000000000000000 RBX: ffff8880099ac000 RCX: 000000007fffffff
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffffffa0418fa0
    RBP: ffff8880197bc1c0 R08: 0000000000000000 R09: 000000000000000a
    R10: 000000000000000a R11: f000000000000000 R12: ffffc900078c7d20
    R13: 00000000fffffff5 R14: ffffc900078c7d20 R15: 0000000000000000
    FS:  00007f0449903800(0000) GS:ffff88803ec00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00005610ada631f0 CR3: 0000000014dd8002 CR4: 00000000001706f0
    Call Trace:
     <TASK>
     xfs_buf_delwri_pushbuf+0x150/0x160 [xfs 4561f5b32c9bfb874ec98d58d0719464e1f87368]
     xfs_qm_flush_one+0xd6/0x130 [xfs 4561f5b32c9bfb874ec98d58d0719464e1f87368]
     xfs_qm_dquot_walk.isra.0+0x109/0x1e0 [xfs 4561f5b32c9bfb874ec98d58d0719464e1f87368]
     xfs_qm_quotacheck+0x319/0x490 [xfs 4561f5b32c9bfb874ec98d58d0719464e1f87368]
     xfs_qm_mount_quotas+0x65/0x2c0 [xfs 4561f5b32c9bfb874ec98d58d0719464e1f87368]
     xfs_mountfs+0x6b5/0xab0 [xfs 4561f5b32c9bfb874ec98d58d0719464e1f87368]
     xfs_fs_fill_super+0x781/0x990 [xfs 4561f5b32c9bfb874ec98d58d0719464e1f87368]
     get_tree_bdev+0x175/0x280
     vfs_get_tree+0x1a/0x80
     path_mount+0x6f5/0xaa0
     __x64_sys_mount+0x103/0x140
     do_syscall_64+0x2b/0x80
     entry_SYSCALL_64_after_hwframe+0x46/0xb0
    
    I /think/ this can happen if xfs_qm_flush_one is racing with
    xfs_qm_dquot_isolate (i.e. dquot reclaim) when the second function has
    taken the dquot flush lock but xfs_qm_dqflush hasn't yet locked the
    dquot buffer, let alone queued it to the delwri list.  In this case,
    flush_one will fail to get the dquot flush lock, but it can lock the
    incore buffer, but xfs_buf_delwri_pushbuf will then trip over this
    ASSERT, which checks that the buffer isn't on a delwri list.  The hang
    results because the _delwri_submit_buffers ignores non DELWRI_Q buffers,
    which means that xfs_buf_iowait waits forever for an IO that has not yet
    been scheduled.
    
    AFAICT, a reasonable solution here is to detect a dquot buffer that is
    not on a DELWRI list, drop it, and return -EAGAIN to try the flush
    again.  It's not /that/ big of a deal if quotacheck writes the dquot
    buffer repeatedly before we even set QUOTA_CHKD.
    
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Dave Chinner <[email protected]>
    Signed-off-by: Leah Rumancik <[email protected]>
    Acked-by: Chandan Babu R <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>
    (cherry picked from commit 8d0baec78e8a7abe03b449820507c9777dae7f7b)
    Stable-dep-of: d62016b1a2df ("xfs: avoid dquot buffer pin deadlock")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: fix super block buf log item UAF during force shutdown [+ + +]
Author: Guo Xuenan <[email protected]>
Date:   Tue Oct 13 15:09:41 2026 +0530

    xfs: fix super block buf log item UAF during force shutdown
    
    [ Upstream commit 575689fc0ffa6c4bb4e72fd18e31a6525a6124e0 ]
    
    xfs log io error will trigger xlog shut down, and end_io worker call
    xlog_state_shutdown_callbacks to unpin and release the buf log item.
    The race condition is that when there are some thread doing transaction
    commit and happened not to be intercepted by xlog_is_shutdown, then,
    these log item will be insert into CIL, when unpin and release these
    buf log item, UAF will occur. BTW, add delay before `xlog_cil_commit`
    can increase recurrence probability.
    
    The following call graph actually encountered this bad situation.
    fsstress                    io end worker kworker/0:1H-216
                                xlog_ioend_work
                                  ->xlog_force_shutdown
                                    ->xlog_state_shutdown_callbacks
                                      ->xlog_cil_process_committed
                                        ->xlog_cil_committed
                                          ->xfs_trans_committed_bulk
    ->xfs_trans_apply_sb_deltas             ->li_ops->iop_unpin(lip, 1);
      ->xfs_trans_getsb
        ->_xfs_trans_bjoin
          ->xfs_buf_item_init
            ->if (bip) { return 0;} //relog
    ->xlog_cil_commit
      ->xlog_cil_insert_items //insert into CIL
                                               ->xfs_buf_ioend_fail(bp);
                                                 ->xfs_buf_ioend
                                                   ->xfs_buf_item_done
                                                     ->xfs_buf_item_relse
                                                       ->xfs_buf_item_free
    
    when cil push worker gather percpu cil and insert super block buf log item
    into ctx->log_items then uaf occurs.
    
    ==================================================================
    BUG: KASAN: use-after-free in xlog_cil_push_work+0x1c8f/0x22f0
    Write of size 8 at addr ffff88801800f3f0 by task kworker/u4:4/105
    
    CPU: 0 PID: 105 Comm: kworker/u4:4 Tainted: G W
    6.1.0-rc1-00001-g274115149b42 #136
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
    1.13.0-1ubuntu1.1 04/01/2014
    Workqueue: xfs-cil/sda xlog_cil_push_work
    Call Trace:
     <TASK>
     dump_stack_lvl+0x4d/0x66
     print_report+0x171/0x4a6
     kasan_report+0xb3/0x130
     xlog_cil_push_work+0x1c8f/0x22f0
     process_one_work+0x6f9/0xf70
     worker_thread+0x578/0xf30
     kthread+0x28c/0x330
     ret_from_fork+0x1f/0x30
     </TASK>
    
    Allocated by task 2145:
     kasan_save_stack+0x1e/0x40
     kasan_set_track+0x21/0x30
     __kasan_slab_alloc+0x54/0x60
     kmem_cache_alloc+0x14a/0x510
     xfs_buf_item_init+0x160/0x6d0
     _xfs_trans_bjoin+0x7f/0x2e0
     xfs_trans_getsb+0xb6/0x3f0
     xfs_trans_apply_sb_deltas+0x1f/0x8c0
     __xfs_trans_commit+0xa25/0xe10
     xfs_symlink+0xe23/0x1660
     xfs_vn_symlink+0x157/0x280
     vfs_symlink+0x491/0x790
     do_symlinkat+0x128/0x220
     __x64_sys_symlink+0x7a/0x90
     do_syscall_64+0x35/0x80
     entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    Freed by task 216:
     kasan_save_stack+0x1e/0x40
     kasan_set_track+0x21/0x30
     kasan_save_free_info+0x2a/0x40
     __kasan_slab_free+0x105/0x1a0
     kmem_cache_free+0xb6/0x460
     xfs_buf_ioend+0x1e9/0x11f0
     xfs_buf_item_unpin+0x3d6/0x840
     xfs_trans_committed_bulk+0x4c2/0x7c0
     xlog_cil_committed+0xab6/0xfb0
     xlog_cil_process_committed+0x117/0x1e0
     xlog_state_shutdown_callbacks+0x208/0x440
     xlog_force_shutdown+0x1b3/0x3a0
     xlog_ioend_work+0xef/0x1d0
     process_one_work+0x6f9/0xf70
     worker_thread+0x578/0xf30
     kthread+0x28c/0x330
     ret_from_fork+0x1f/0x30
    
    The buggy address belongs to the object at ffff88801800f388
     which belongs to the cache xfs_buf_item of size 272
    The buggy address is located 104 bytes inside of
     272-byte region [ffff88801800f388, ffff88801800f498)
    
    The buggy address belongs to the physical page:
    page:ffffea0000600380 refcount:1 mapcount:0 mapping:0000000000000000
    index:0xffff88801800f208 pfn:0x1800e
    head:ffffea0000600380 order:1 compound_mapcount:0 compound_pincount:0
    flags: 0x1fffff80010200(slab|head|node=0|zone=1|lastcpupid=0x1fffff)
    raw: 001fffff80010200 ffffea0000699788 ffff88801319db50 ffff88800fb50640
    raw: ffff88801800f208 000000000015000a 00000001ffffffff 0000000000000000
    page dumped because: kasan: bad access detected
    
    Memory state around the buggy address:
     ffff88801800f280: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff88801800f300: fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc fc
    >ffff88801800f380: fc fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb
                                                                 ^
     ffff88801800f400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
     ffff88801800f480: fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc fc
    ==================================================================
    Disabling lock debugging due to kernel taint
    
    Signed-off-by: Guo Xuenan <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Leah Rumancik <[email protected]>
    Acked-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Greg Kroah-Hartman <[email protected]>
    (cherry picked from commit 0d889ae85fcf0cf9bc6e998fca2ec760e08e0b46)
    Stable-dep-of: d2fe5c4c8d25 ("xfs: rearrange code in xfs_buf_item.c")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: fix unmount hang with unflushable inodes stuck in the AIL [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:48 2026 +0530

    xfs: fix unmount hang with unflushable inodes stuck in the AIL
    
    [ Upstream commit 7b5f775be14ac1532c049022feadcfe44769566d ]
    
    Unmount of a shutdown filesystem can hang with stale inode cluster
    buffers in the AIL like so:
    
    [95964.140623] Call Trace:
    [95964.144641]  __schedule+0x699/0xb70
    [95964.154003]  schedule+0x64/0xd0
    [95964.156851]  xfs_ail_push_all_sync+0x9b/0xf0
    [95964.164816]  xfs_unmount_flush_inodes+0x41/0x70
    [95964.168698]  xfs_unmountfs+0x7f/0x170
    [95964.171846]  xfs_fs_put_super+0x3b/0x90
    [95964.175216]  generic_shutdown_super+0x77/0x160
    [95964.178060]  kill_block_super+0x1b/0x40
    [95964.180553]  xfs_kill_sb+0x12/0x30
    [95964.182796]  deactivate_locked_super+0x38/0x100
    [95964.185735]  deactivate_super+0x41/0x50
    [95964.188245]  cleanup_mnt+0x9f/0x160
    [95964.190519]  __cleanup_mnt+0x12/0x20
    [95964.192899]  task_work_run+0x89/0xb0
    [95964.195221]  resume_user_mode_work+0x4f/0x60
    [95964.197931]  syscall_exit_to_user_mode+0x76/0xb0
    [95964.201003]  do_syscall_64+0x74/0x130
    
    $ pstree -N mnt |grep umount
                 |-check-parallel---nsexec---run_test.sh---753---umount
    
    It always seems to be generic/753 that triggers this, and repeating
    a quick group test run triggers it every 10-15 iterations. Hence it
    generally triggers once up every 30-40 minutes of test time. just
    running generic/753 by itself or concurrently with a limited group
    of tests doesn't reproduce this issue at all.
    
    Tracing on a hung system shows the AIL repeating every 50ms a log
    force followed by an attempt to push pinned, aborted inodes from the
    AIL (trimmed for brevity):
    
     xfs_log_force:   lsn 0x1c caller xfsaild+0x18e
     xfs_log_force:   lsn 0x0 caller xlog_cil_flush+0xbd
     xfs_log_force:   lsn 0x1c caller xfs_log_force+0x77
     xfs_ail_pinned:  lip 0xffff88826014afa0 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff88814000a708 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff88810b850c80 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff88810b850af0 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff888165cf0a28 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     xfs_ail_pinned:  lip 0xffff88810b850bb8 lsn 1/37472 type XFS_LI_INODE flags IN_AIL|ABORTED
     ....
    
    The inode log items are marked as aborted, which means that either:
    
    a) a transaction commit has occurred, seen an error or shutdown, and
    called xfs_trans_free_items() to abort the items. This should happen
    before any pinning of log items occurs.
    
    or
    
    b) a dirty transaction has been cancelled. This should also happen
    before any pinning of log items occurs.
    
    or
    
    c) AIL insertion at journal IO completion is marked as aborted. In
    this case, the log item is pinned by the CIL until journal IO
    completes and hence needs to be unpinned. This is then done after
    the ->iop_committed() callback is run, so the pin count should be
    balanced correctly.
    
    Yet none of these seemed to be occurring. Further tracing indicated
    this:
    
    d) Shutdown during CIL pushing resulting in log item completion
    being called from checkpoint abort processing. Items are unpinned
    and released without serialisation against each other, journal IO
    completion or transaction commit completion.
    
    In this case, we may still have a transaction commit in flight that
    holds a reference to a xfs_buf_log_item (BLI) after CIL insertion.
    e.g. a synchronous transaction will flush the CIL before the
    transaction is torn down.  The concurrent CIL push then aborts
    insertion it and drops the commit/AIL reference to the BLI. This can
    leave the transaction commit context with the last reference to the
    BLI which is dropped here:
    
    xfs_trans_free_items()
      ->iop_release
        xfs_buf_item_release
          xfs_buf_item_put
            if (XFS_LI_ABORTED)
              xfs_trans_ail_delete
            xfs_buf_item_relse()
    
    Unlike the journal completion ->iop_unpin path, this path does not
    run stale buffer completion process when it drops the last
    reference, hence leaving the stale inodes attached to the buffer
    sitting the AIL. There are no other references to those inodes, so
    there is no other mechanism to remove them from the AIL. Hence
    unmount hangs.
    
    The buffer lock context for stale buffers is passed to the last BLI
    reference. This is normally the last BLI unpin on journal IO
    completion. The unpin then processes the stale buffer completion and
    releases the buffer lock.  However, if the final unpin from journal
    IO completion (or CIL push abort) does not hold the last reference
    to the BLI, there -must- still be a transaction context that
    references the BLI, and so that context must perform the stale
    buffer completion processing before the buffer is unlocked and the
    BLI torn down.
    
    The fix for this is to rework the xfs_buf_item_relse() path to run
    stale buffer completion processing if it drops the last reference to
    the BLI. We still hold the buffer locked, so the buffer owner and
    lock context is the same as if we passed the BLI and buffer to the
    ->iop_unpin() context to finish stale process on journal commit.
    
    However, we have to be careful here. In a shutdown state, we can be
    freeing dirty BLIs from xfs_buf_item_put() via xfs_trans_brelse()
    and xfs_trans_bdetach().  The existing code handles this case by
    considering shutdown state as "aborted", but in doing so
    largely masks the failure to clean up stale BLI state from the
    xfs_buf_item_relse() path. i.e  regardless of the shutdown state and
    whether the item is in the AIL, we must finish the stale buffer
    cleanup if we are are dropping the last BLI reference from the
    ->iop_relse path in transaction commit context.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: hoist recovered bmap intent checks out of xfs_bui_item_recover [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Tue Oct 13 15:09:30 2026 +0530

    xfs: hoist recovered bmap intent checks out of xfs_bui_item_recover
    
    [ Upstream commit bc525cf455dac810d28f9edd379805dc249bc5a9 ]
    
    When we recover a bmap intent from the log, we need to validate its
    contents before we try to replay them.  Hoist the checking code into a
    separate function in preparation to refactor this code to use validation
    helpers.
    
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Reviewed-by: Brian Foster <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: hoist recovered refcount intent checks out of xfs_cui_item_recover [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Tue Oct 13 15:09:34 2026 +0530

    xfs: hoist recovered refcount intent checks out of xfs_cui_item_recover
    
    [ Upstream commit ed64f8343aafa62e762c74dfb400f640b6fa6c15 ]
    
    When we recover a refcount intent from the log, we need to validate its
    contents before we try to replay them.  Hoist the checking code into a
    separate function in preparation to refactor this code to use validation
    helpers.
    
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Reviewed-by: Brian Foster <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: hoist recovered rmap intent checks out of xfs_rui_item_recover [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Tue Oct 13 15:09:32 2026 +0530

    xfs: hoist recovered rmap intent checks out of xfs_rui_item_recover
    
    [ Upstream commit dda7ba65bf03b6f3a7502b9f85c2524a5ae5aa2e ]
    
    When we recover a rmap intent from the log, we need to validate its
    contents before we try to replay them.  Hoist the checking code into a
    separate function in preparation to refactor this code to use validation
    helpers.
    
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Reviewed-by: Brian Foster <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: improve the code that checks recovered bmap intent items [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Tue Oct 13 15:09:31 2026 +0530

    xfs: improve the code that checks recovered bmap intent items
    
    [ Upstream commit 67d8679bd3913d2c4ec5f32ade778881b93af766 ]
    
    The code that validates recovered bmap intent items is kind of a mess --
    it doesn't use the standard xfs type validators, and it doesn't check
    for things that it should.  Fix the validator function to use the
    standard validation helpers and look for more types of obvious errors.
    
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Reviewed-by: Brian Foster <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: improve the code that checks recovered refcount intent items [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Tue Oct 13 15:09:35 2026 +0530

    xfs: improve the code that checks recovered refcount intent items
    
    [ Upstream commit 0d79781a1aa6a6a567e63294012eee2384f406f2 ]
    
    The code that validates recovered refcount intent items is kind of a
    mess -- it doesn't use the standard xfs type validators, and it doesn't
    check for things that it should.  Fix the validator function to use the
    standard validation helpers and look for more types of obvious errors.
    
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Reviewed-by: Brian Foster <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: improve the code that checks recovered rmap intent items [+ + +]
Author: Darrick J. Wong <[email protected]>
Date:   Tue Oct 13 15:09:33 2026 +0530

    xfs: improve the code that checks recovered rmap intent items
    
    [ Upstream commit c447ad62dc906f4b5f788e8ff20c1768ab2eab2c ]
    
    The code that validates recovered rmap intent items is kind of a mess --
    it doesn't use the standard xfs type validators, and it doesn't check
    for things that it should.  Fix the validator function to use the
    standard validation helpers and look for more types of obvious errors.
    
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Brian Foster <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: log items should have a xlog pointer, not a mount [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:38 2026 +0530

    xfs: log items should have a xlog pointer, not a mount
    
    [ Upstream commit d86142dd7c4e10e50bdb3679b405d748214b2c28 ]
    
    Log items belong to the log, not the xfs_mount. Convert the mount
    pointer in the log item to a xlog pointer in preparation for
    upcoming log centric changes to the log items.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Chandan Babu R <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Stable-dep-of: 7b5f775be14a ("xfs: fix unmount hang with unflushable inodes stuck in the AIL")
    
    5.10:
    
    Fixed conflicts due to the following missing commits:
            38c26bfd90e1 ("xfs: replace xfs_sb_version checks with feature flag checks")
            75c8c50fa16a ("xfs: replace XFS_FORCED_SHUTDOWN with xfs_is_shutdown")
    
    Extra conversion in fs/xfs/xfs_dquot_item.c due to missing:
            40b52225e58c ("xfs: remove support for disabling quota accounting on a mounted file system")
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: rearrange code in xfs_buf_item.c [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:46 2026 +0530

    xfs: rearrange code in xfs_buf_item.c
    
    [ Upstream commit d2fe5c4c8d25999862d615f616aea7befdd62799 ]
    
    The code to initialise, release and free items is all the way down
    the bottom of the file. Upcoming fixes need to these functions
    earlier in the file, so move them to the top.
    
    There is one code change in this move - the parameter to
    xfs_buf_item_relse() is changed from the xfs_buf to the
    xfs_buf_log_item - the thing that the function is releasing.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    
    6.6:
    
    Fixed conflict due to the following missing commits:
            [Continuous range: 10634530f7ba^..d4c75a1b40cd]
            d4c75a1b40cd ("xfs: convert remaining kmem_free() to kfree()")
            49292576136f ("xfs: convert kmem_free() for kvmalloc users to kvfree()")
            afdc115559c5 ("xfs: move kmem_to_page()")
            f078d4ea8276 ("xfs: convert kmem_alloc() to kmalloc()")
            10634530f7ba ("xfs: convert kmem_zalloc() to kzalloc()")
    
    Removed ASSERT in favour of existing atomic_read-and-return in
    xfs_buf_item_relse() due to the following missing commit:
            3762113b597f ("xfs: don't lose solo superblock counter update transactions")
    
    5.15:
    
    Fixed conflict due to the following missing commit:
            182696fb021f ("xfs: rename _zone variables to _cache")
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: remove xfs_buf_t typedef [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:40 2026 +0530

    xfs: remove xfs_buf_t typedef
    
    [ Upstream commit e82226138b20d4f638426413e83c6b5db532c6a2 ]
    
    Prepare for kernel xfs_buf  alignment by getting rid of the
    xfs_buf_t typedef from userspace.
    
    [darrick: This patch is a port of a userspace patch removing the
    xfs_buf_t typedef in preparation to make the userspace xfs_buf code
    behave more like its kernel counterpart.]
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Darrick J. Wong <[email protected]>
    Signed-off-by: Darrick J. Wong <[email protected]>
    Reviewed-by: Dave Chinner <[email protected]>
    Stable-dep-of: d2fe5c4c8d25 ("xfs: rearrange code in xfs_buf_item.c")
    
    5.10:
    
    2 extra conversions in fs/xfs/xfs_inode.c due to missing:
            1abcf261016e ("xfs: move on-disk inode allocation out of xfs_ialloc()")
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

xfs: xfs_ifree_cluster vs xfs_iflush_shutdown_abort deadlock [+ + +]
Author: Dave Chinner <[email protected]>
Date:   Tue Oct 13 15:09:44 2026 +0530

    xfs: xfs_ifree_cluster vs xfs_iflush_shutdown_abort deadlock
    
    [ Upstream commit 09234a632be42573d9743ac5ff6773622d233ad0 ]
    
    Lock order of xfs_ifree_cluster() is cluster buffer -> try ILOCK
    -> IFLUSHING, except for the last inode in the cluster that is
    triggering the free. In that case, the lock order is ILOCK ->
    cluster buffer -> IFLUSHING.
    
    xfs_iflush_cluster() uses cluster buffer -> try ILOCK -> IFLUSHING,
    so this can safely run concurrently with xfs_ifree_cluster().
    
    xfs_inode_item_precommit() uses ILOCK -> cluster buffer, but this
    cannot race with xfs_ifree_cluster() so being in a different order
    will not trigger a deadlock.
    
    xfs_reclaim_inode() during a filesystem shutdown uses ILOCK ->
    IFLUSHING -> cluster buffer via xfs_iflush_shutdown_abort(), and
    this deadlocks against xfs_ifree_cluster() like so:
    
     sysrq: Show Blocked State
     task:kworker/10:37   state:D stack:12560 pid:276182 tgid:276182 ppid:2      flags:0x00004000
     Workqueue: xfs-inodegc/dm-3 xfs_inodegc_worker
     Call Trace:
      <TASK>
      __schedule+0x650/0xb10
      schedule+0x6d/0xf0
      schedule_timeout+0x8b/0x180
      schedule_timeout_uninterruptible+0x1e/0x30
      xfs_ifree+0x326/0x730
      xfs_inactive_ifree+0xcb/0x230
      xfs_inactive+0x2c8/0x380
      xfs_inodegc_worker+0xaa/0x180
      process_scheduled_works+0x1d4/0x400
      worker_thread+0x234/0x2e0
      kthread+0x147/0x170
      ret_from_fork+0x3e/0x50
      ret_from_fork_asm+0x1a/0x30
      </TASK>
     task:fsync-tester    state:D stack:12160 pid:2255943 tgid:2255943 ppid:3988702 flags:0x00004006
     Call Trace:
      <TASK>
      __schedule+0x650/0xb10
      schedule+0x6d/0xf0
      schedule_timeout+0x31/0x180
      __down_common+0xbe/0x1f0
      __down+0x1d/0x30
      down+0x48/0x50
      xfs_buf_lock+0x3d/0xe0
      xfs_iflush_shutdown_abort+0x51/0x1e0
      xfs_icwalk_ag+0x386/0x690
      xfs_reclaim_inodes_nr+0x114/0x160
      xfs_fs_free_cached_objects+0x19/0x20
      super_cache_scan+0x17b/0x1a0
      do_shrink_slab+0x180/0x350
      shrink_slab+0xf8/0x430
      drop_slab+0x97/0xf0
      drop_caches_sysctl_handler+0x59/0xc0
      proc_sys_call_handler+0x189/0x280
      proc_sys_write+0x13/0x20
      vfs_write+0x33d/0x3f0
      ksys_write+0x7c/0xf0
      __x64_sys_write+0x1b/0x30
      x64_sys_call+0x271d/0x2ee0
      do_syscall_64+0x68/0x130
      entry_SYSCALL_64_after_hwframe+0x76/0x7e
    
    We can't change the lock order of xfs_ifree_cluster() - XFS_ISTALE
    and XFS_IFLUSHING are serialised through to journal IO completion
    by the cluster buffer lock being held.
    
    There's quite a few asserts in the code that check that XFS_ISTALE
    does not occur out of sync with buffer locking (e.g. in
    xfs_iflush_cluster). There's also a dependency on the inode log item
    being removed from the buffer before XFS_IFLUSHING is cleared, also
    with asserts that trigger on this.
    
    Further, we don't have a requirement for the inode to be locked when
    completing or aborting inode flushing because all the inode state
    updates are serialised by holding the cluster buffer lock across the
    IO to completion.
    
    We can't check for XFS_IRECLAIM in xfs_ifree_mark_inode_stale() and
    skip the inode, because there is no guarantee that the inode will be
    reclaimed. Hence it *must* be marked XFS_ISTALE regardless of
    whether reclaim is preparing to free that inode. Similarly, we can't
    check for IFLUSHING before locking the inode because that would
    result in dirty inodes not being marked with ISTALE in the event of
    racing with XFS_IRECLAIM.
    
    Hence we have to address this issue from the xfs_reclaim_inode()
    side. It is clear that we cannot hold the inode locked here when
    calling xfs_iflush_shutdown_abort() because it is the inode->buffer
    lock order that causes the deadlock against xfs_ifree_cluster().
    
    Hence we need to drop the ILOCK before aborting the inode in the
    shutdown case. Once we've aborted the inode, we can grab the ILOCK
    again and then immediately reclaim it as it is now guaranteed to be
    clean.
    
    Note that dropping the ILOCK in xfs_reclaim_inode() means that it
    can now be locked by xfs_ifree_mark_inode_stale() and seen whilst in
    this state. This is safe because we have left the XFS_IFLUSHING flag
    on the inode and so xfs_ifree_mark_inode_stale() will simply set
    XFS_ISTALE and move to the next inode. An ASSERT check in this path
    needs to be tweaked to take into account this new shutdown
    interaction.
    
    Signed-off-by: Dave Chinner <[email protected]>
    Reviewed-by: Christoph Hellwig <[email protected]>
    Reviewed-by: Carlos Maiolino <[email protected]>
    Signed-off-by: Carlos Maiolino <[email protected]>
    
    5.10: Add header.
    
    Signed-off-by: Siddh Raman Pant <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

 
zram: fix out-of-bounds access in read_block_state() [+ + +]
Author: Longlong Xia <[email protected]>
Date:   Fri Sep 4 14:49:52 2026 -0400

    zram: fix out-of-bounds access in read_block_state()
    
    [ Upstream commit 391f057f44a51cc9418da5cba78b014324174264 ]
    
    read_block_state() calculates nr_pages before taking dev_lock.  If the
    device is reset and reinitialized with a smaller disksize before lock
    acquisition, nr_pages still describes the old table.  The subsequent loop
    can then call slot_lock() past the end of the newly allocated table.
    
    Read disksize after acquiring dev_lock and checking that the device is
    initialized.  The read lock then keeps the table and its bound stable for
    the duration of the scan.
    
    Link: https://lore.kernel.org/[email protected]
    Fixes: c0265342bff4 ("zram: introduce zram memory tracking")
    Assisted-by: Codex:gpt-5.6-sol
    Signed-off-by: Longlong Xia <[email protected]>
    Reviewed-by: Sergey Senozhatsky <[email protected]>
    Cc: Jens Axboe <[email protected]>
    Cc: Minchan Kim <[email protected]>
    Cc: <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    Signed-off-by: Sasha Levin <[email protected]>

zram: fixup read_block_state() [+ + +]
Author: Sergey Senozhatsky <[email protected]>
Date:   Fri Sep 4 14:49:51 2026 -0400

    zram: fixup read_block_state()
    
    [ Upstream commit 8b05d2d8af817c6a1e23032df51e7ad83030d543 ]
    
    ac_time is now in seconds, do not use ktime_to_timespec64()
    
    [[email protected]: remove now-unused local `ts']
    [[email protected]: fix build]
    Link: https://lkml.kernel.org/r/[email protected]
    Signed-off-by: Sergey Senozhatsky <[email protected]>
    Reported-by: Chris Mason <[email protected]>
    Closes: https://lkml.kernel.org/r/[email protected]
    Cc: Brian Geffon <[email protected]>
    Cc: David Stevens <[email protected]>
    Cc: Minchan Kim <[email protected]>
    Cc: Richard Chang <[email protected]>
    Signed-off-by: Andrew Morton <[email protected]>
    
    [ Stable tree note: The ac_time conversion described above is not present
      here, so retain the ktime_t conversion and microsecond output.  Move the
      timespec64 temporary into the scan loop instead, allowing the follow-up
      bounds fix to move nr_pages initialization under init_lock cleanly. ]
    
    Stable-dep-of: 391f057f44a5 ("zram: fix out-of-bounds access in read_block_state()")
    Signed-off-by: Sasha Levin <[email protected]>