Changelog in Linux kernel 6.12.105

 
af_packet: Don't send zero-byte data in tpacket_snd(). [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Mon Aug 10 15:04:47 2026 +0000

    af_packet: Don't send zero-byte data in tpacket_snd().
    
    [ Upstream commit 6bcd76c134c55c697148acb5c0194e9666abdf84 ]
    
    syzbot reported a WARNING in __dev_queue_xmit() triggered via tpacket_snd():
    
    skb_assert_len
    WARNING: at include/linux/skbuff.h:2753 skb_assert_len
    WARNING: at __dev_queue_xmit+0x21bc/0x4970 net/core/dev.c:4781
    
    Call Trace:
     <TASK>
     dev_queue_xmit include/linux/netdevice.h:3448 [inline]
     packet_xmit+0x243/0x310 net/packet/af_packet.c:276
     tpacket_snd net/packet/af_packet.c:2907 [inline]
     packet_sendmsg+0x28d6/0x4eb0 net/packet/af_packet.c:3134
    
    When sending 0-byte packets via TPACKET ring buffer on devices with no
    hard header (e.g. dev->hard_header_len == 0), tpacket_fill_skb()
    populates an skb with skb->len == 0 and returns 0. tpacket_snd() then
    forwards this empty skb to packet_xmit(), causing __dev_queue_xmit() to
    hit skb_assert_len(skb).
    
    Similar checks exist in packet_snd() via commit dc633700f00f
    ("net/af_packet: check len when min_header_len equals to 0") and in
    packet_sendmsg_spkt() via commit 6a341729fb31 ("af_packet: Don't send
    zero-byte data in packet_sendmsg_spkt().").
    
    Return -EINVAL in tpacket_fill_skb() when skb->len is zero to reject
    zero-length packets in tpacket_snd().
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: syzbot+30b93b6845b19cc38581@syzkaller.appspotmail.com
    Closes: https://lore.kernel.org/netdev/6a79e807.01d0871a.3a0d52.00ac.GAE@google.com/T/#u
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Willem de Bruijn <willemb@google.com>
    Reviewed-by: Jiayuan Chen <jiayuan.chen@linux.dev>
    Link: https://patch.msgid.link/20260810150447.1220864-1-edumazet@google.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ALSA: hda/realtek: Enable headset mic on F+ FLAPTOP r [+ + +]
Author: Ajrat Makhmutov <rauty@altlinux.org>
Date:   Thu Aug 20 11:52:12 2026 +0300

    ALSA: hda/realtek: Enable headset mic on F+ FLAPTOP r
    
    commit 7097666b993b37f4e47982026b703b2379a364f8 upstream.
    
    The BIOS of the F+ FLAPTOP r laptop (Realtek ALC897, SSID 1e63:6d9a)
    declares only pin 0x1b, the headphone output of the 3.5 mm combo jack.
    Every other external pin is left at 0x411111f0, so the headset mic pin
    0x19 is never parsed and no headset mic input exists. The pin is wired
    on this board - retasking it makes the headset mic record.
    
    Reuse ALC897_FIXUP_HP_HSMIC_VERB, which already sets the pin config this
    machine needs: 0x19 as a headset mic without its own presence detect.
    Only 0x1b reports jack presence here, so a mic pin with presence detect
    would leave the driver in auto-mic mode waiting for an event that never
    arrives.
    
    Without the quirk the generic parser retasks the lone headphone pin as
    an input instead. That surfaces as a "Headphone Mic" input which records
    only the internal mic bleed, so the headset mic appears present but dead.
    
    Tested on ALT Linux, kernel 6.12, by recording a CTIA headset mic on the
    combo jack with the internal mic as a reference.
    
    ALSA info before the patch:
    https://alsa-project.org/db/?f=18363eddea933baee100c9bf461d0e5cf74c8de2
    
    ALSA info after the patch:
    https://alsa-project.org/db/?f=48ae2cd7aaf1eb0f24639ce83cd38cfd93b25f76
    
    Cc: stable@vger.kernel.org # 6.12.x
    Signed-off-by: Ajrat Makhmutov <rauty@altlinux.org>
    Link: https://patch.msgid.link/20260808185500.2564948-1-rauty@altlinux.org
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    [ Ajrat: adjust for the pre-6.17 layout -- the Realtek codec code was
      split into sound/hda/codecs/realtek/ in 6.17; in 6.12 it still lives
      in sound/pci/hda/patch_realtek.c ]
    Signed-off-by: Ajrat Makhmutov <rauty@altlinux.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
arm64: tegra: Add EL2 virtual timer interrupt for Tegra194 [+ + +]
Author: Jon Hunter <jonathanh@nvidia.com>
Date:   Tue Jul 28 16:50:59 2026 +0100

    arm64: tegra: Add EL2 virtual timer interrupt for Tegra194
    
    [ Upstream commit a7c28483fd57dd0e1487024af70622315320774b ]
    
    Commit d87773de9efe ("clocksource/drivers/arm_arch_timer: Default to EL2
    virtual timer when running VHE") updated the ARM arch timer driver to
    use the virtual timer by default if the CPU is running at EL2 with VHE
    enabled. If the CPU is running at EL2 with VHE enabled but there is no
    interrupt provided for the virtual timer, then the following warning is
    displayed:
    
     arch_timer: [Firmware Bug]: VHE-capable CPU without EL2 virtual timer
      interrupt
    
    This warning is observed on Tegra194 platforms. Tegra194 SoC includes
    NVIDIA Carmel ARM v8.2 CPUs and support an EL2 virtual timer. Fix the
    above warning by adding the PPI for the EL2 virtual timer interrupt for
    Tegra194.
    
    Fixes: 5425fb15d8ee ("arm64: tegra: Add Tegra194 chip device tree")
    Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
    Signed-off-by: Thierry Reding <treding@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ASoC: codecs: lpass-wsa-macro: Fix enum kcontrol accesses [+ + +]
Author: Dawid Wróbel <me@dawidwrobel.com>
Date:   Thu Jul 30 12:58:13 2026 +0200

    ASoC: codecs: lpass-wsa-macro: Fix enum kcontrol accesses
    
    commit 56f24311fd5607588a47e44675195a9efb200f29 upstream.
    
    EAR SPKR PA Gain" and the four "WSA RX* Mux" controls are enumerated,
    but their get and put callbacks access the value through
    ucontrol->value.integer.value[0] (a long) instead of
    ucontrol->value.enumerated.item[0] (an unsigned int).
    
    This same pattern was fixed in the sibling drivers by
    commit bcfe5f76cc40 ("ASoC: codecs: rx-macro: fix accessing array
    out of bounds for enum type") and
    commit 0ea5eff7c606 ("ASoC: codecs: va-macro: fix accessing array
    out of bounds for enum type"), but wsa-macro was missed.
    
    On 64-bit kernels with CONFIG_SND_CTL_DEBUG this trips the elem value
    sanity check and every read of these controls fails with -EINVAL.
    
    Fixes: 809bcbcecebf ("ASoC: codecs: lpass-wsa-macro: Add support to WSA Macro")
    Fixes: 2c4066e5d428 ("ASoC: codecs: lpass-wsa-macro: add dapm widgets and route")
    Assisted-by: Claude:claude-fable-5
    Cc: stable@vger.kernel.org
    Signed-off-by: Dawid Wróbel <me@dawidwrobel.com>
    Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com>
    Link: https://patch.msgid.link/20260730-worktree-lpass-tx-macro-enum-fix-v2-2-6d091c736116@dawidwrobel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: cs35l41: sort the register default table [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Wed Aug 5 11:24:11 2026 +0300

    ASoC: cs35l41: sort the register default table
    
    commit d74aac116cfb2058b15df53996d23232b310f7ff upstream.
    
    reg_defaults must be sorted by ascending register address, as
    regcache_lookup_reg() locates entries in it with bsearch().  See commit
    fd80df352ba1 ("regcache: Add support for sorting defaults arrays").
    
    cs35l41_reg[] lists CS35L41_BSTCVRT_PEAK_CUR (0x3808) after
    CS35L41_BSTCVRT_COEFF (0x3810) and CS35L41_BSTCVRT_SLOPE_LBST (0x3814), so
    the binary search does not find those two entries.
    regcache_reg_needs_sync() then cannot compare them against their default
    and reports that a sync is needed, so they are written to the device on
    every regcache_sync() even when they were never touched.
    
    Sort the table by register address.
    
    Fixes: 5f2f539901b0 ("ASoC: cs35l41: Correct handling of some registers in the cache")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Reviewed-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Link: https://patch.msgid.link/20260805082413.26174-2-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: cs35l45: sort the register default table [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Wed Aug 5 11:24:12 2026 +0300

    ASoC: cs35l45: sort the register default table
    
    commit f39a68ed08bb6eef0ae711b41d645ee5e9448c09 upstream.
    
    reg_defaults must be sorted by ascending register address, as
    regcache_lookup_reg() locates entries in it with bsearch().  See commit
    fd80df352ba1 ("regcache: Add support for sorting defaults arrays").
    
    cs35l45_defaults[] lists the DSP1_RX*_RATE and DSP1_TX*_RATE registers
    (0x02b80080 - 0x02b802b8) in the middle of the table, ahead of entries with
    much lower addresses, so the binary search does not find 36 of its 73
    entries.  regcache_reg_needs_sync() then cannot compare those against their
    default and reports that a sync is needed, so they are written to the
    device on every regcache_sync() even when they were never touched.
    
    Sort the table by register address.
    
    Fixes: 74b14e2850a3 ("ASoC: cs35l45: DSP Support")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Reviewed-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Link: https://patch.msgid.link/20260805082413.26174-3-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: cs4265: sort the register default table [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Wed Aug 5 11:24:13 2026 +0300

    ASoC: cs4265: sort the register default table
    
    commit e4fe3e046524e5de3c04c6eef3743780cbdc231c upstream.
    
    reg_defaults must be sorted by ascending register address, as
    regcache_lookup_reg() locates entries in it with bsearch().  See commit
    fd80df352ba1 ("regcache: Add support for sorting defaults arrays").
    
    cs4265_reg_defaults[] lists CS4265_INT_MASK (0x0e),
    CS4265_STATUS_MODE_MSB (0x0f) and CS4265_STATUS_MODE_LSB (0x10) after
    CS4265_SPDIF_CTL1 (0x11) and CS4265_SPDIF_CTL2 (0x12), so the binary search
    does not find those three entries.  regcache_reg_needs_sync() then cannot
    compare them against their default and reports that a sync is needed, so
    they are written to the device on every regcache_sync() even when they were
    never touched.
    
    Sort the table by register address.
    
    Fixes: fb6f806967f6 ("ASoC: Add support for the CS4265 CODEC")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Reviewed-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Link: https://patch.msgid.link/20260805082413.26174-4-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: SOF: ipc4-topology: Refresh copier IPC payload before widget setup [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Thu Jul 30 08:48:22 2026 +0300

    ASoC: SOF: ipc4-topology: Refresh copier IPC payload before widget setup
    
    commit 0c0e418dbcf0582bf80d8dbfd9b306607c065992 upstream.
    
    The ipc_config_data buffer for copier widgets is built once during
    ipc_prepare (called from sof_pcm_setup_connected_widgets) and cached
    for reuse. For host copiers this buffer contains the copier_data with
    gtw_cfg.node_id (host DMA ID). For DAI copiers it additionally includes
    a dma_config_tlv trailer with stream_id and dma_channel_id for HDA link
    DMA.
    
    On suspend/resume, both host and link DMA streams are released and
    re-allocated with potentially different stream tags. The underlying
    copier_data and dma_config_tlv structures are correctly updated by
    host_config and sdw_hda_dai_hw_params respectively. However, since the
    widget list (spcm->stream[].list) persists across suspend,
    sof_pcm_hw_params skips sof_pcm_setup_connected_widgets and ipc_prepare
    never runs again to rebuild ipc_config_data. The stale cached payload
    is then sent to firmware with boot-time DMA channel assignments, causing
    DMA channel conflicts that lead to firmware errors and crashes.
    
    Fix this by refreshing copier_data and dma_config_tlv portions of
    ipc_config_data in sof_ipc4_widget_setup right before the IPC message
    is sent. This ensures the payload always reflects the current DMA state
    regardless of whether ipc_prepare ran.
    
    For DAI copiers, the gtw_cfg.config_length in copier_data is temporarily
    inflated to include the TLV size (matching the ipc_config_data layout)
    before copying, then restored, mirroring what
    sof_ipc4_prepare_copier_module does when first building the buffer.
    
    Fixes: e9c6b118de1a ("ASoC: SOF: make dma_config_tlv be an array")
    Cc: stable@vger.kernel.org
    Link: https://github.com/thesofproject/sof/issues/10700
    Link: https://github.com/thesofproject/sof/issues/10955
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
    Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
    Link: https://patch.msgid.link/20260730054822.5913-1-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: SOF: sof-audio: Fix error path in sof_widget_setup_unlocked() [+ + +]
Author: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Date:   Thu Jul 30 11:59:14 2026 +0300

    ASoC: SOF: sof-audio: Fix error path in sof_widget_setup_unlocked()
    
    commit e780e4917d43683224812400fe3dc4816fceba75 upstream.
    
    If either tplg_ops->dai_config or widget_kcontrol_setup fail during widget
    setup we would double decrement the use_count of the widget because the
    sof_widget_free_unlocked() would be called twice, similarly the core_put
    would be invoked twice as well.
    
    Since the use_count and core_put() is handled within the widget_free
    function we need to return without falling through the pipe_widget_free
    label.
    
    The fixes tag is picked to the last change around this part of the code
    which is adequately old enough for backporting purposes.
    
    Link: https://github.com/thesofproject/sof/issues/10826
    Fixes: 31ed8da1c8e5 ("ASoC: SOF: sof-audio: Modify logic for enabling/disabling topology cores")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Link: https://patch.msgid.link/20260730085914.27546-1-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: SOF: topology: Use acpi mach from the machine driver [+ + +]
Author: Bard Liao <yung-chuan.liao@linux.intel.com>
Date:   Thu Jul 30 10:17:24 2026 +0300

    ASoC: SOF: topology: Use acpi mach from the machine driver
    
    commit ae63720dd7c3647d64f7a85e5e1870f90eb569d6 upstream.
    
    The parameters may be changed by the sof_sdw machine driver is the
    SOC_SDW_PCH_DMIC quirk is set. Use the mach_params from the machine
    driver to ensure the sof_sdw_get_tplg_files() function select the right
    function topologies.
    
    Fixes: 2fbeff33381c ("ASoC: Intel: add sof_sdw_get_tplg_files ops")
    Cc: stable@vger.kernel.org
    Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
    Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Link: https://patch.msgid.link/20260730071724.22296-1-peter.ujfalusi@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: tas2562: Validate values for volume writes [+ + +]
Author: Mark Brown <broonie@kernel.org>
Date:   Mon Aug 10 21:10:33 2026 -0400

    ASoC: tas2562: Validate values for volume writes
    
    [ Upstream commit 8fb41964f7e4e4207c8999af2056894caa7a252a ]
    
    tas2562_volume_control_put() does not do any validation of the control
    value written by userspace, it uses it to look up a value in a fixed
    size array which can easily be overflowed and then writes whatever value
    it gets back to the device.  Add validation that we are loading a value
    we have in the array.
    
    Cc: stable@vger.kernel.org
    Reviewed-by: Cezary Rojewski <cezary.rojewski@intel.com>
    Link: https://patch.msgid.link/20260715-asoc-tas2562-put-retval-v1-1-97bf467c924e@kernel.org
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ASoC: xilinx: formatter_pcm: pass aud_drv_data to irq handlers [+ + +]
Author: Rosen Penev <rosenp@gmail.com>
Date:   Thu Aug 6 16:32:31 2026 -0700

    ASoC: xilinx: formatter_pcm: pass aud_drv_data to irq handlers
    
    [ Upstream commit f12afefb7b01f94d6d66d397f323a9914edbf70e ]
    
    The irq handlers take a struct device pointer and call
    dev_get_drvdata() to obtain the driver data.  However, the driver
    data is only set at the end of probe, after devm_request_irq(),
    so an interrupt taken in between causes the handlers to pass a
    NULL pointer to readl() and crash.
    
    Pass the private data directly as the devm_request_irq() argument
    instead of the device pointer, matching what the handlers expect.
    
    Fixes: 6f6c3c36f091 ("ASoC: xlnx: add pcm formatter platform driver")
    Assisted-by: opencode:deepseek-v4-flash-free
    Signed-off-by: Rosen Penev <rosenp@gmail.com>
    Reviewed-by: Michal Simek <michal.simek@amd.com>
    Link: https://patch.msgid.link/20260806233231.30631-1-rosenp@gmail.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ata: libata-scsi: terminate deferred commands on time out [+ + +]
Author: Damien Le Moal <dlemoal@kernel.org>
Date:   Mon Aug 10 22:15:48 2026 -0400

    ata: libata-scsi: terminate deferred commands on time out
    
    [ Upstream commit 2e1d2e65e773d67dab163127f11a47dab0fbca9f ]
    
    If a command times out while we have deferred non-NCQ commands waiting to
    be issued, the SCSI EH task is not immediately woken up as the waiting
    deferred commands are never issued nor completed, thus leaving the SCSI
    host in a busy state (shost->host_failed != scsi_host_busy(shost)) which
    prevents the SCSI EH task from being woken up. Eventually, when the
    deferred commands also time out, the SCSI EH task is woken up and the
    timeout processing occurs.
    
    Avoid this unnecessary SCSI EH task wake-up additional time by scheduling
    a retry of all waiting deferred QCs, using the eh_timed_out SCSI host
    template operation. The function ata_scsi_eh_timed_out() is introduced to
    implement this operation.
    
    However, terminating deferred commands with DID_REQUEUE to force a retry
    by calling the function ata_scsi_requeue_deferred_qc() may still keep the
    SCSI host in a busy state because the block layer may immediately re-issue
    these commands. The solution to this is to schedule libata EH for the
    port which suffered the command timeout to prevent accepting any new
    command. ata_scsi_requeue_deferred_qc() is modified to add a call to
    ata_port_schedule_eh() for this purpose.
    
    In addition to this change, ata_scsi_requeue_deferred_qc() is also
    modified to take a new timedout_scmd scsi command argument which indicates
    the SCSI command that timed out. With this additional argument,
    ata_scsi_requeue_deferred_qc() can now also terminate with DID_TIME_OUT
    any timed out deferred qc, which simplifies ata_scsi_cmd_error_handler().
    In this case, ata_scsi_requeue_deferred_qc() returns SCSI_EH_DONE, with
    this return value propagated back to the ata_scsi_eh_timed_out() operation
    to indicate to scsi_timeout() that the timed out command was handled and
    no further processing is needed.
    
    For non-timed out deferred qc that need to be retried,
    ata_scsi_requeue_deferred_qc() returns SCSI_EH_NOT_HANDLED, thus
    indicating to scsi_timeout() that the timed out command needs to go
    through the SCSI EH (and libata EH) processing by adding it to the EH work
    queue with scsi_eh_scmd_add().
    
    One side effect of these changes is that the function atapi_qc_complete()
    needs to be modified to ensure that a deferred ATAPI command that needs
    to be retried is completed with DID_REQUEUE instead of the default
    SAM_STAT_GOOD status, and a command that timed out is completed with
    DID_TIME_OUT instead of SAM_STAT_CHECK_CONDITION.
    
    Fixes: 0ea84089dbf6 ("ata: libata-scsi: avoid Non-NCQ command starvation")
    Cc: stable@vger.kernel.org
    Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
    Reviewed-by: Igor Pylypiv <ipylypiv@google.com>
    Tested-by: Igor Pylypiv <ipylypiv@google.com>
    Reviewed-by: Niklas Cassel <cassel@kernel.org>
    Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
binfmt_misc: don't leak the user namespace when the mount fails [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Tue Aug 11 09:25:01 2026 -0400

    binfmt_misc: don't leak the user namespace when the mount fails
    
    [ Upstream commit b8206f516fe7cbe785cf44bf09c17c438d7c3cad ]
    
    bm_get_tree() takes a reference to the user namespace and hands it to
    get_tree_keyed() as the sget key. sget_fc() moves that reference into
    sb->s_fs_info and clears fc->s_fs_info, so from that point on the
    superblock owns it and bm_free() doesn't see it anymore.
    
    The superblock drops it in ->put_super(). But generic_shutdown_super()
    only calls ->put_super() from inside the if (sb->s_root) branch, so
    nothing releases it when bm_fill_super() fails:
    
    - The kzalloc_obj() failure leaves s_root NULL and the whole branch is
      skipped.
    
    - A simple_fill_super() failure in the file loop leaves s_root set, but
      s_op still points at simple_super_operations, which has no
      ->put_super(). bm_fill_super() installs s_ops only once
      simple_fill_super() returned success, and installing it earlier
      wouldn't help either because simple_fill_super() overwrites s_op.
    
    Either way vfs_get_super() calls deactivate_locked_super() and the
    reference is gone for good. binfmt_misc mounts are available in a user
    namespace and both the inode and the dentry cache are SLAB_ACCOUNT, so
    an unprivileged caller under a tight memory cgroup can fail
    simple_fill_super() on demand and leak one user namespace per attempt.
    
    Drop the reference in ->kill_sb() instead, which runs unconditionally,
    the same way nfsd and rpc_pipefs release their keyed s_fs_info.
    
    That also stops ->put_super() from clearing s_fs_info while the
    superblock is still on @fs_supers. generic_shutdown_super() leaves it
    there on purpose so that sget_fc() keeps finding it until kill_sb() has
    run, but a NULL s_fs_info makes test_keyed_super() miss it, so a
    concurrent mount for the same user namespace skips the grab_super()
    wait and creates a second superblock for a namespace that is still
    being torn down.
    
    Link: https://patch.msgid.link/20260728-work-binfmt_misc-usernsleak-v1-1-dbd8d5e626e7@kernel.org
    Fixes: 21ca59b365c0 ("binfmt_misc: enable sandboxed mounts")
    Cc: stable@vger.kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

binfmt_misc: restore write access when removing an entry [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Tue Aug 11 14:56:19 2026 -0400

    binfmt_misc: restore write access when removing an entry
    
    [ Upstream commit db1856ea9196cf6e015d12199a34c0b9313c7bfa ]
    
    Registering an entry with the MISC_FMT_OPEN_FILE flag opens the
    interpreter via open_exec() which denies write access to it for as
    long as the entry exists. Removing the entry closes the interpreter
    file via filp_close() but never restores write access, leaving the
    inode's i_writecount permanently negative. Opening the interpreter
    for writing keeps failing with ETXTBSY long after the entry is gone
    until the inode is evicted from the inode cache.
    
    Commit 90f601b497d7 ("binfmt_misc: restore write access before
    closing files opened by open_exec()") fixed the same imbalance in the
    error path of bm_register_write() but the actual removal path has
    been leaking the write denial since the introduction of the flag.
    
    Restore write access in put_binfmt_handler() before closing the
    interpreter file.
    
    Link: https://patch.msgid.link/20260710-work-binfmt_misc-locking-v3-1-a162f7cb58d6@kernel.org
    Fixes: 948b701a607f ("binfmt_misc: add persistent opened binary handler for containers")
    Cc: stable@vger.kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

binfmt_misc: use exe_file_deny_write_access() for the interpreter clone [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Fri Jul 10 11:33:03 2026 +0200

    binfmt_misc: use exe_file_deny_write_access() for the interpreter clone
    
    commit fa5990ca8fd917003e526036bcc50413edb9722c upstream.
    
    For MISC_FMT_OPEN_FILE entries load_misc_binary() clones the
    registered interpreter file and denies write access to the clone via
    plain deny_write_access(). The clone is installed as
    bprm->interpreter and later released by the exec machinery through
    exe_file_allow_write_access() which skips the i_writecount increment
    for files with FMODE_FSNOTIFY_HSM set.
    
    The deny and allow side can therefore come to different conclusions
    when pre-content watches are in play: if a pre-content watch is added
    to the interpreter after registration every subsequent exec through
    that entry takes a write denial on the clone that is never paired
    with a write allowance, driving the interpreter inode's i_writecount
    further down with each exec and leaving the interpreter unwritable
    even after the entry and all its users are gone.
    
    Take the write denial via exe_file_deny_write_access() so both sides
    of the pairing base their decision on the same file mode, and
    propagate failure instead of silently ignoring it: an interpreter
    that is concurrently open for writing now fails the exec with
    ETXTBSY, exactly like an interpreter freshly opened via open_exec()
    would.
    
    Link: https://patch.msgid.link/20260710-work-binfmt_misc-locking-v3-2-a162f7cb58d6@kernel.org
    Fixes: 0357ef03c94e ("fs: don't block write during exec on pre-content watched files")
    Cc: stable@vger.kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
block: stop the timeout timer when releasing a never added disk [+ + +]
Author: Chao Shi <coshi036@gmail.com>
Date:   Mon Jul 27 16:12:57 2026 -0400

    block: stop the timeout timer when releasing a never added disk
    
    [ Upstream commit 26cb8ebbfaf713c82e142d08828d4d765057633b ]
    
    disk_release() undoes blk_mq_init_allocated_queue() for a disk whose
    probe failed before add_disk(), but it only calls blk_mq_exit_queue().
    Nothing there stops q->timeout, and that timer rolls forward: it stays
    pending until it next expires, not until the last request completes.
    So if the driver issued any I/O before adding the disk, the
    request_queue is freed while still linked into a timer wheel bucket.
    
    Commit 6f8191fdf41d ("block: simplify disk shutdown") dropped the
    blk_cleanup_queue() call that used to stop it.  __del_gendisk() and
    blk_mq_destroy_queue() still do; only the probe failure path lost it.
    
    nvme gets there because nvme_update_ns_info() submits Report Zones or
    FDP io-mgmt-recv on ns->queue before the disk is added, so a later
    failure - a concurrent reset setting NVME_CTRL_FROZEN, or
    device_add_disk() failing - lands in put_disk() with the timer armed:
    
      BUG: KASAN: slab-use-after-free in detach_if_pending+0x30c/0x340
      Write of size 8 at addr ffff888004d71310 by task kworker/u8:2/37
       __timer_delete_sync+0x156/0x240 kernel/time/timer.c:1621
       blk_sync_queue+0x22/0x40 block/blk-core.c:222
       nvme_sync_queues+0x100/0x150 drivers/nvme/host/core.c:5362
       nvme_reset_work+0x138/0x930 drivers/nvme/host/pci.c:3264
    
      Allocated by task 34:
       __blk_mq_alloc_disk+0x33/0x100 block/blk-mq.c:4462
       nvme_alloc_ns+0x290/0x3870 drivers/nvme/host/core.c:4146
    
      Freed by task 0:
       blk_free_queue_rcu+0x3a/0x50 block/blk-core.c:254
       rcu_core+0xc10/0x1730 kernel/rcu/tree.c:2857
    
    The queue being synced there is ctrl->admin_q, only a victim sharing a
    timer wheel bucket with the freed queue's dangling entry; other runs
    tripped in enqueue_timer(), __run_timers() or blk_mq_timeout_work().
    Failing nvme_alloc_ns() with a debug patch makes it deterministic: one
    leaked timer trips KASAN within seconds, while 1987 patched releases
    produced no splat.
    
    Stop the timer and the queue work items before blk_mq_exit_queue(), like
    blk_mq_destroy_queue() does.
    
    Found by FuzzNvme.
    
    Fixes: 6f8191fdf41d ("block: simplify disk shutdown")
    Acked-by: Weidong Zhu <weizhu@fiu.edu>
    Signed-off-by: Chao Shi <coshi036@gmail.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Link: https://patch.msgid.link/20260727201257.211635-1-coshi036@gmail.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
 
bpf: Clear delta when clearing reg id for non-{add,sub} ops [+ + +]
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Tue Aug 18 16:14:20 2026 +0800

    bpf: Clear delta when clearing reg id for non-{add,sub} ops
    
    commit 1b327732c84640c1e3da487eefe9d00cc9f2dd34 upstream.
    
    When a non-{add,sub} alu op such as xor is performed on a scalar
    register that previously had a BPF_ADD_CONST delta, the else path
    in adjust_reg_min_max_vals() only clears dst_reg->id but leaves
    dst_reg->delta unchanged.
    
    This stale delta can propagate via assign_scalar_id_before_mov()
    when the register is later used in a mov. It gets a fresh id but
    keeps the stale delta from the old (now-cleared) BPF_ADD_CONST.
    This stale delta can later propagate leading to a verifier-vs-
    runtime value mismatch.
    
    The clear_id label already correctly clears both delta and id.
    Make the else path consistent by also zeroing the delta when id
    is cleared. More generally, this introduces a helper clear_scalar_id()
    which internally takes care of zeroing. There are various other
    locations in the verifier where only the id is cleared. By using
    the helper we catch all current and future locations.
    
    Fixes: 98d7ca374ba4 ("bpf: Track delta between "linked" registers.")
    Reported-by: STAR Labs SG <info@starlabs.sg>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/r/20260407192421.508817-2-daniel@iogearbox.net
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    [shung-hsi.yu:
     - reverse 'off' -> 'delta' renaming done later in commit 3d91c618aca4 ("bpf:
       rename bpf_reg_state->off to bpf_reg_state->delta")
     - kept "dst_reg->live |= REG_LIVE_WRITTEN", which got removed in commit
       107e16979905 ("bpf: disable and remove registers chain based liveness")
     - dropped hunk in scalar_byte_swap(), which was added later in commit
       9d2119984224 ("bpf: Add bitwise tracking for BPF_END")
     - dropped hunk in clear_singular_ids(), which was added later in commit
       b2a0aa3a8739 ("bpf: Clear singular ids for scalars in is_state_visited()")]
    Signed-off-by: Shung-Hsi Yu <shung-hsi.yu@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

bpf: Fix linked reg delta tracking when src_reg == dst_reg [+ + +]
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Tue Aug 18 16:14:19 2026 +0800

    bpf: Fix linked reg delta tracking when src_reg == dst_reg
    
    commit d7f14173c0d5866c3cae759dee560ad1bed10d2e upstream.
    
    Consider the case of rX += rX where src_reg and dst_reg are pointers to
    the same bpf_reg_state in adjust_reg_min_max_vals(). The latter first
    modifies the dst_reg in-place, and later in the delta tracking, the
    subsequent is_reg_const(src_reg)/reg_const_value(src_reg) reads the
    post-{add,sub} value instead of the original source.
    
    This is problematic since it sets an incorrect delta, which sync_linked_regs()
    then propagates to linked registers, thus creating a verifier-vs-runtime
    mismatch. Fix it by just skipping this corner case.
    
    Fixes: 98d7ca374ba4 ("bpf: Track delta between "linked" registers.")
    Reported-by: STAR Labs SG <info@starlabs.sg>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/r/20260407192421.508817-1-daniel@iogearbox.net
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    [shung-hsi.yu: contextual difference due to commit 7a433e519364 ("bpf: Support
    negative offsets, BPF_SUB, and alu32 for linked register tracking") not
    backported. ]
    Signed-off-by: Shung-Hsi Yu <shung-hsi.yu@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
btrfs: add debug build only WARN [+ + +]
Author: David Sterba <dsterba@suse.com>
Date:   Sun Aug 9 10:47:58 2026 -0400

    btrfs: add debug build only WARN
    
    [ Upstream commit 3db15c6ca6feb2c5000a1cbb39c33866e0349abd ]
    
    Add conditional WARN() wrapper that's enabled only in debug build. It
    should be used for unexpected conditions that should be noisy.  Use it
    instead of ASSERT(0). As it will not lead to BUG() make sure that
    continuing is still possible, e.g. the error is handled anyway.
    
    Reviewed-by: Josef Bacik <josef@toxicpanda.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Stable-dep-of: 8bc4d7209611 ("btrfs: zoned: fix missing chunk metadata reservation")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

btrfs: add space_info argument to btrfs_chunk_alloc() [+ + +]
Author: Naohiro Aota <naohiro.aota@wdc.com>
Date:   Sun Aug 9 10:47:59 2026 -0400

    btrfs: add space_info argument to btrfs_chunk_alloc()
    
    [ Upstream commit 098a442d5b6d440602604dc1a88706a2a91bce4e ]
    
    Take a btrfs_space_info argument in btrfs_chunk_alloc(). New block group
    will belong to that space_info.
    
    Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Stable-dep-of: 8bc4d7209611 ("btrfs: zoned: fix missing chunk metadata reservation")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

btrfs: remove fs_info argument from btrfs_zoned_activate_one_bg() [+ + +]
Author: Filipe Manana <fdmanana@suse.com>
Date:   Sun Aug 9 10:48:00 2026 -0400

    btrfs: remove fs_info argument from btrfs_zoned_activate_one_bg()
    
    [ Upstream commit a232ff90d14657c8637c6e94b606bb5d700a2ecb ]
    
    We don't need it since we can grab fs_info from the given space_info.
    So remove the fs_info argument.
    
    Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Stable-dep-of: 8bc4d7209611 ("btrfs: zoned: fix missing chunk metadata reservation")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

btrfs: zoned: fix missing chunk metadata reservation [+ + +]
Author: Guanghui Yang <3497809730@qq.com>
Date:   Sun Aug 9 10:48:01 2026 -0400

    btrfs: zoned: fix missing chunk metadata reservation
    
    [ Upstream commit 8bc4d7209611e8aa9d5409b6a4a86a9eb91b69a3 ]
    
    reserve_chunk_space() stores the return value of
    btrfs_zoned_activate_one_bg() in ret. The helper can return 1 after
    successfully activating a block group, but ret is later used to decide
    whether to reserve metadata for chunk tree updates.
    
    As a result, successful activation skips btrfs_block_rsv_add() and leaves
    trans->chunk_bytes_reserved unchanged. Use a separate variable for the
    activation result so positive success does not affect the later
    reservation. Keep activation failures in ret instead of returning early so
    the function uses the common tail path.
    
    Fixes: b6a98021e401 ("btrfs: zoned: activate necessary block group")
    CC: stable@vger.kernel.org
    Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: Guanghui Yang <3497809730@qq.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
can: rcar_canfd: change the initializing flow for clocks and resets [+ + +]
Author: Tu Nguyen <tu.nguyen.xg@renesas.com>
Date:   Wed Aug 12 11:44:21 2026 -0400

    can: rcar_canfd: change the initializing flow for clocks and resets
    
    [ Upstream commit bef9004c5b91debfceaea2841855a4ebe81ff2b3 ]
    
    Testing CANFD on RZ/G3E shows that many registers do not reset to their
    initial values with the current flow of deasserting resets first and then
    enabling clocks.
    
    Based on the HW manual, clocks should be supplied first and the
    resets deasserted afterward.
    
     section 7.4.3 Procedure for Activating Modules: RZ/G2L
     section 4.4.9.3 Procedure for Starting up Units: RZ/G3E
    
    So, update the order of the initializing flow for resets and clocks
    to match the hardware manual, resetting all CANFD registers to their
    initial values. Also update rcar_canfd_global_deinit() to assert
    resets before disabling clocks, so the teardown path mirrors the new
    init ordering.
    
    Fixes: 76e9353a80e9 ("can: rcar_canfd: Add support for RZ/G2L family")
    Signed-off-by: Tu Nguyen <tu.nguyen.xg@renesas.com>
    Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
    Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
    Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Reviewed-by: Vincent Mailhol <mailhol@kernel.org>
    Link: https://patch.msgid.link/20260625135216.130450-1-biju.das.jz@bp.renesas.com
    Cc: stable@kernel.org
    Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ceph: avoid fs reclaim while using current->journal_info [+ + +]
Author: Max Kellermann <max.kellermann@ionos.com>
Date:   Fri Aug 7 14:11:22 2026 -0400

    ceph: avoid fs reclaim while using current->journal_info
    
    [ Upstream commit 5b602344a49e039e792ce5a8923bcc61412ee134 ]
    
    handle_reply() stores a `ceph_mds_request` pointer in
    `current->journal_info` while filling the inode and dentry cache from
    an MDS reply.
    
    An allocation in this section can enter direct reclaim and prune
    dentries from another filesystem.  If this dirties an ext4 inode, ext4
    starts a JBD2 transaction.  JBD2 interprets the Ceph request in
    `current->journal_info` as a journal handle and dereferences the
    request's `r_tid` as `h_transaction`, causing a kernel crash, e.g.:
    
     Unable to handle kernel paging request at virtual address 00000000077b4818
     [...]
     Internal error: Oops: 0000000096000004 [#1]  SMP
     Modules linked in:
     CPU: 6 UID: 0 PID: 2699135 Comm: kworker/6:3 Tainted: G        W           6.18.38-i3 #1113 NONE
     [...]
     Workqueue: ceph-msgr ceph_con_workfn
     pstate: 80400009 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
     pc : jbd2__journal_start+0x2c/0x208
     lr : __ext4_journal_start_sb+0x100/0x178
     [...]
     Call trace:
      jbd2__journal_start+0x2c/0x208 (P)
      __ext4_journal_start_sb+0x100/0x178
      ext4_dirty_inode+0x3c/0x90
      __mark_inode_dirty+0x58/0x400
      iput.part.0+0x2b0/0x370
      iput+0x18/0x30
      dentry_unlink_inode+0xc0/0x158
      __dentry_kill+0x80/0x250
      shrink_dentry_list+0x90/0x130
      prune_dcache_sb+0x60/0x98
      super_cache_scan+0xe8/0x190
      do_shrink_slab+0x174/0x388
      shrink_slab+0xd8/0x4c0
      shrink_node+0x31c/0x908
      do_try_to_free_pages+0xd0/0x508
      try_to_free_pages+0x11c/0x238
      __alloc_frozen_pages_noprof+0x4d0/0xdd0
      __folio_alloc_noprof+0x18/0x70
      __filemap_get_folio+0x248/0x440
      ceph_readdir_prepopulate+0x570/0x9e8
      mds_dispatch+0x1424/0x1ba0
      ceph_con_process_message+0x74/0xa0
      ceph_con_v1_try_read+0x3a0/0x1510
      ceph_con_workfn+0x260/0x460
    
    Enter a scoped NOFS allocation context and leave it after clearing
    `journal_info`.  This prevents filesystem reclaim from recursing into
    another filesystem while the field contains Ceph-private data.
    
    Cc: stable@vger.kernel.org
    Fixes: 315f24088048 ("ceph: fix security xattr deadlock")
    Signed-off-by: Max Kellermann <max.kellermann@ionos.com>
    Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
    Reviewed-by: Xiubo Li <xiubo.li@clyso.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ceph: Convert ceph_find_incompatible() to take a folio [+ + +]
Author: Matthew Wilcox (Oracle) <willy@infradead.org>
Date:   Fri Aug 7 11:19:24 2026 -0400

    ceph: Convert ceph_find_incompatible() to take a folio
    
    [ Upstream commit f9707a8b5b9d0a631e0a64eab5c3d2bb6d43758c ]
    
    Both callers already have the folio.  Pass it in and use it throughout.
    Removes some hidden calls to compound_head() and a reference to
    page->mapping.
    
    Signed-off-by: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Link: https://lore.kernel.org/r/20250217185119.430193-4-willy@infradead.org
    Tested-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: cbf59617cd71 ("ceph: fix writeback_count leak in write_folio_nounlock()")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ceph: Convert writepage_nounlock() to write_folio_nounlock() [+ + +]
Author: Matthew Wilcox (Oracle) <willy@infradead.org>
Date:   Fri Aug 7 11:19:25 2026 -0400

    ceph: Convert writepage_nounlock() to write_folio_nounlock()
    
    [ Upstream commit 62171c16da6000811e172a76a1f73d132c4697e8 ]
    
    Remove references to page->index, page->mapping, thp_size(),
    page_offset() and other page APIs in favour of their more efficient
    folio replacements.
    
    Signed-off-by: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Link: https://lore.kernel.org/r/20250217185119.430193-6-willy@infradead.org
    Tested-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: cbf59617cd71 ("ceph: fix writeback_count leak in write_folio_nounlock()")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ceph: fix hanging __ceph_get_caps() with stale mds_wanted [+ + +]
Author: Max Kellermann <max.kellermann@ionos.com>
Date:   Fri Aug 7 15:17:25 2026 -0400

    ceph: fix hanging __ceph_get_caps() with stale mds_wanted
    
    [ Upstream commit 50958bb928bad3bdba9e5d1b7ff4bbadcf6951e6 ]
    
    A reader can hang forever in __ceph_get_caps() when the client no
    longer holds `FILE_RD`, but local cap state still says that the
    capability is already wanted (via `mds_wanted`).
    
    One way to trigger this is through MDS cap revocation.  If another
    client performs a conflicting operation, the MDS can revoke `FILE_RD`
    from the reader; the next read then has to reacquire `FILE_RD`.  If
    the cap update that should request `FILE_RD` never reaches the MDS
    after `cap->mds_wanted` was raised, the reader is left holding only
    non-file caps while local `mds_wanted` still includes the file read
    caps.
    
    In that state, try_get_cap_refs() sees `need <= mds_wanted` and
    returns 0, so __ceph_get_caps() just waits on `i_cap_wq`.  If the cap
    update that was supposed to request `FILE_RD never reaches the MDS
    after `cap->mds_wanted was` raised, no further request is sent and the
    waiter can sleep indefinitely until unrelated cap traffic happens to
    wake it up.
    
    The ordering issue is that `cap->mds_wanted` is updated in
    __prep_cap() before the `CEPH_MSG_CLIENT_CAPS message` is actually
    queued for send.  That makes one field serve two different meanings at
    once: what this client wants, and what the client believes the MDS
    already knows it wants.
    
    A proper fix would be to split those states and track whether a cap
    update is actually in flight or has been observed by the MDS.
    However, simply moving the `cap->mds_wanted assignment` later would
    not be sufficient: queueing the message in the messenger does not
    guarantee that the MDS processed that specific wanted set, and
    reconnect or message loss can still invalidate that assumption.
    Fixing that properly would require a larger rework of the cap state
    machine.
    
    To allow simpler backports to stable kernels, this patch implements a
    simpler workaround:
    
    - stop waiting forever in __ceph_get_caps(); after a bounded wait,
      fall back to the renew path
    
    - make ceph_renew_caps() issue a synchronous `OPEN` request whenever
      the inode still does not actually hold the wanted caps, instead of
      only calling ceph_check_caps()
    
    The extra issued-vs-wanted check in ceph_renew_caps() is necessary
    because the previous test only checked whether the inode still had any
    real caps at all.  That is not enough after revocation: the client can
    still hold something like `pLs` and yet be missing `FILE_RD`
    completely.  In that case, falling back to ceph_check_caps() is not
    sufficient, because it still trusts `cap->mds_wanted` and may resend
    nothing.  By requiring `(issued & wanted) == wanted` before taking the
    asynchronous path, the code only uses ceph_check_caps() when the
    `wanted caps` are already actually issued.  Otherwise, it sends the
    synchronous `OPEN` renew.
    
    This preserves the existing asynchronous fast path when the wanted
    caps are already issued, avoids changing cap-state semantics, and
    fixes the hang by guaranteeing that a stalled waiter eventually
    retries through a path that does not rely on the stale `mds_wanted`
    state.
    
    [ idryomov: move CEPH_GET_CAPS_WAIT_TIMEOUT from libceph.h to
      mds_client.h, formatting ]
    
    Cc: stable@vger.kernel.org
    Fixes: 0a454bdd501a ("ceph: reorganize __send_cap for less spinlock abuse")
    Signed-off-by: Max Kellermann <max.kellermann@ionos.com>
    Reviewed-by: Alex Markuze <amarkuze@redhat.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ceph: fix MDS random selection readiness predicate [+ + +]
Author: Yiming Zhu <zhuyiming@kuaishou.com>
Date:   Fri Jul 24 18:49:20 2026 +0800

    ceph: fix MDS random selection readiness predicate
    
    commit 2c11c4bfdb7bd2808b3b3ac228e1f2d9bcf25457 upstream.
    
    CEPH_MDS_IS_READY() is parsed so that the ternary expression can
    return true for an MDS entry with state 0 when it is not laggy. This
    allows the random selector to choose a down/DNE rank.
    
    Group the ternary expression under the state check so zero-state ranks
    are not treated as ready.
    
    Cc: stable@vger.kernel.org
    Fixes: b38c9eb4757d ("ceph: add possible_max_rank and make the code more readable")
    Link: https://tracker.ceph.com/issues/78648
    Signed-off-by: Yiming Zhu <zhuyiming@kuaishou.com>
    Reviewed-by: Viacheslav Dubeyko <slava@dubeyko.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ceph: fix writeback_count leak in write_folio_nounlock() [+ + +]
Author: Wentao Liang <vulab@iscas.ac.cn>
Date:   Fri Aug 7 11:19:26 2026 -0400

    ceph: fix writeback_count leak in write_folio_nounlock()
    
    [ Upstream commit cbf59617cd715219e84c50d106a3d0e1e8ba054e ]
    
    write_folio_nounlock() increments fsc->writeback_count to track
    in-flight writeback operations. On several error paths where the
    function returns early (folio lookup failure, snapshot context
    allocation failure, and writepages submission failure), the function
    returns without calling atomic_long_dec_return() to decrement the
    counter.
    
    Each leaked increment keeps the counter above zero, which can prevent
    the filesystem from cleanly unmounting or suspending writes.
    
    Add atomic_long_dec_return() calls on all error paths that currently
    return without decrementing the counter.
    
    Cc: stable@vger.kernel.org
    Fixes: d55207717ded ("ceph: add encryption support to writepage and writepages")
    Signed-off-by: Wentao Liang <vulab@iscas.ac.cn>
    Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ceph: Remove ceph_writepage() [+ + +]
Author: Matthew Wilcox (Oracle) <willy@infradead.org>
Date:   Fri Aug 7 11:19:22 2026 -0400

    ceph: Remove ceph_writepage()
    
    [ Upstream commit 19a288110435408fcf2cb274823f2a17d03caf9b ]
    
    Ceph already has a writepages operation which is preferred over writepage
    in all situations except for page migration.  By adding a migrate_folio
    operation, there will be no situations in which ->writepage should
    be called.  filemap_migrate_folio() is an appropriate operation to use
    because the ceph data stored in folio->private does not contain any
    reference to the memory address of the folio.
    
    Signed-off-by: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Link: https://lore.kernel.org/r/20250217185119.430193-2-willy@infradead.org
    Tested-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: cbf59617cd71 ("ceph: fix writeback_count leak in write_folio_nounlock()")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ceph: Use a folio in ceph_page_mkwrite() [+ + +]
Author: Matthew Wilcox (Oracle) <willy@infradead.org>
Date:   Fri Aug 7 11:19:23 2026 -0400

    ceph: Use a folio in ceph_page_mkwrite()
    
    [ Upstream commit 88a59bda3f3786107694a3f5fd7f9df421752c21 ]
    
    Convert the passed page to a folio and use it
    throughout ceph_page_mkwrite().  Removes the last call to
    page_mkwrite_check_truncate(), the last call to offset_in_thp() and one
    of the last calls to thp_size().  Saves a few calls to compound_head().
    
    Signed-off-by: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Link: https://lore.kernel.org/r/20250217185119.430193-3-willy@infradead.org
    Tested-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: cbf59617cd71 ("ceph: fix writeback_count leak in write_folio_nounlock()")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
cifs: add fscache_resize_cookie() to cifs_setsize() [+ + +]
Author: Frank Sorenson <sorenson@redhat.com>
Date:   Tue Aug 11 20:09:33 2026 -0400

    cifs: add fscache_resize_cookie() to cifs_setsize()
    
    [ Upstream commit fa724e235cfdb0fb0bb427d0f9dfe864ae27403e ]
    
    Several code paths update the VFS inode size by calling
    netfs_resize_file() and cifs_setsize(), but omit the corresponding
    fscache_resize_cookie() call, leaving the fscache cookie out of sync
    with the actual file size:
    
      - cifs_file_set_size() in inode.c: server-side truncation via setattr
      - cifs_do_truncate() in file.c: truncates to zero on O_TRUNC open
      - smb2_duplicate_extents() in smb2ops.c: file clone extending EOF
      - smb3_simple_falloc() in smb2ops.c: two branches that extend EOF
        via write-range and SMB2_set_eof respectively
    
    Since every caller of cifs_setsize() must resize the fscache cookie,
    add the call to cifs_setsize() itself, consistent with how
    truncate_pagecache() is already consolidated there.
    
    Fixes: 70431bfd825d ("cifs: Support fscache indexing rewrite")
    Fixes: 93a43155127f ("cifs: Fix missing set of remote_i_size")
    Fixes: 110fee6b9bb5 ("smb: client: fix missing timestamp updates with O_TRUNC")
    Fixes: 7a06d3b816d7 ("smb/client: emulate small EOF-extending mode 0 fallocate ranges")
    Cc: stable@vger.kernel.org
    Cc: David Howells <dhowells@redhat.com>
    Cc: Paulo Alcantara <pc@manguebit.org>
    Cc: Huiwen He <hehuiwen@kylinos.cn>
    Signed-off-by: Frank Sorenson <sorenson@redhat.com>
    Reviewed-by: Paulo Alcantara <pc@manguebit.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
crypto: ccm - Set rfc4309 maxauthsize from child [+ + +]
Author: Herbert Xu <herbert@gondor.apana.org.au>
Date:   Mon Jul 20 11:34:21 2026 +1000

    crypto: ccm - Set rfc4309 maxauthsize from child
    
    [ Upstream commit 438f4896f78f69ec73d5f32d2c024193f1223569 ]
    
    Set the maxauthsize of rfc4309 using that of the child algorithm.
    
    Fixes: 4a49b499dfa0 ("[CRYPTO] ccm: Added CCM mode")
    Reported-by: Seohyeon Maeng <bioloidgp@gmail.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

crypto: ccp: Add external API interface for PSP module initialization [+ + +]
Author: Sean Christopherson <seanjc@google.com>
Date:   Mon Feb 10 22:53:47 2025 +0000

    crypto: ccp: Add external API interface for PSP module initialization
    
    [ Upstream commit 435b344a7042e91fb4719d589f18310e8919e39f ]
    
    KVM is dependent on the PSP SEV driver and PSP SEV driver needs to be
    loaded before KVM module. In case of module loading any dependent
    modules are automatically loaded but in case of built-in modules there
    is no inherent mechanism available to specify dependencies between
    modules and ensure that any dependent modules are loaded implicitly.
    
    Add a new external API interface for PSP module initialization which
    allows PSP SEV driver to be loaded explicitly if KVM is built-in.
    
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Co-developed-by: Ashish Kalra <ashish.kalra@amd.com>
    Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
    Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
    Message-ID: <15279ca0cad56a07cf12834ec544310f85ff5edc.1739226950.git.ashish.kalra@amd.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

crypto: qce - fix error path in devm_qce_register_algs [+ + +]
Author: Thorsten Blum <thorsten.blum@linux.dev>
Date:   Fri Jul 24 10:15:38 2026 +0200

    crypto: qce - fix error path in devm_qce_register_algs
    
    commit 9c75402286409f5e1a75e4a445555c84066f89db upstream.
    
    If ops->register_algs() fails, the error path repeatedly calls the same
    ops->unregister_algs() from the failed registration. Use the loop index
    to unregister the previously registered algorithms instead.
    
    Fixes: e80cf84b6087 ("crypto: qce - unregister previously registered algos in error path")
    Cc: stable@vger.kernel.org
    Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
    Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

crypto: starfive - use scatterlist length before DMA mapping [+ + +]
Author: Thorsten Blum <thorsten.blum@linux.dev>
Date:   Sat Jul 25 11:06:10 2026 +0200

    crypto: starfive - use scatterlist length before DMA mapping
    
    commit 6b36f13891ab4709b7d60023005176cdd5c368cf upstream.
    
    Using sg_dma_len() is only valid after mapping a scatterlist with
    dma_map_sg(). However, starfive_aes_aead_do_one_req() uses it before
    mapping the scatterlist.
    
    Use the original scatterlist length because the DMA length has not been
    populated yet when CONFIG_NEED_SG_DMA_LENGTH=y.
    
    Fixes: 7467147ef9bf ("crypto: starfive - Use dma for aes requests")
    Cc: stable@vger.kernel.org
    Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

crypto: tegra - fix rctx->cryptlen calculation in tegra_gcm_do_one_req() [+ + +]
Author: Vladislav Dronov <vdronov@redhat.com>
Date:   Tue Jul 21 00:33:31 2026 +0200

    crypto: tegra - fix rctx->cryptlen calculation in tegra_gcm_do_one_req()
    
    [ Upstream commit 360f2974fcea49c61f6d6f81554741a9eeee7168 ]
    
    Perform rctx->cryptlen calculation in tegra_gcm_do_one_req() the same way
    it is done in tegra_ccm_crypt_init(). The current formulae may lead to a
    crash if a caller does not call tegra_gcm_setauthsize() and so ctx->authsize
    remains zero. Then a decrypt operation with incorrect rctx->cryptlen will
    lead to a write beyound rctx->dst_sg buffer.
    
    As a follow-up cleanup delete struct tegra_aead_ctx->authsize field since
    it appears to be completely unused. Also simplify tegra_ccm_setauthsize()
    and tegra_gcm_setauthsize() functions respectively.
    
    Fixes: 0880bb3b00c8 ("crypto: tegra - Add Tegra Security Engine driver")
    Signed-off-by: Vladislav Dronov <vdronov@redhat.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix [+ + +]
Author: Nathan Lucas <nlucasgit@gmail.com>
Date:   Sun Aug 2 08:35:23 2026 -0600

    drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix
    
    commit 2f9a5c0f018d4a1586ee892f81f1383219676415 upstream.
    
    COLOR_SPACE_YCBCR2020_TYPE, which is selected for
    COLOR_SPACE_2020_YCBCR_LIMITED color_space, has coefficients that are
    incorrect for limited-range output. Its luma and chroma scaling is
    full-range so output is too bright and colors are incorrect.
    
    COLOR_SPACE_YCBCR2020_TYPE is closer to a full-range conversion matrix with
    incorrect luma offset, so correct the luma offset for full-range and rename
    it to COLOR_SPACE_YCBCR2020_FULL_TYPE.
    
    Add COLOR_SPACE_YCBCR2020_LIMITED_TYPE with correct scaling and range for
    limited-range output.
    
    Fix related functions so COLOR_SPACE_YCBCR2020_LIMITED_TYPE and
    COLOR_SPACE_YCBCR2020_FULL_TYPE are correctly selected based on
    dc_color_space.
    
    Derivation of both matrices follows ITU-T H.273:
    
    Table 4, MatrixCoefficients 9, BT.2020-NCL weights:
    KR = 0.2627, KB = 0.0593, KG = 1 - KR - KB = 0.6780.
    
    Equations 45-47 in matrix form:
                [  KR             KG             KB            0 ]
    M2020_NCL = [ -KR/(2(1-KB))  -KG/(2(1-KB))   1/2           0 ]
                [  1/2           -KG/(2(1-KR))  -KB/(2(1-KR))  0 ]
                [  0              0              0             1 ]
    
    Limited and Full transforms based on equations 30-32 and 36-38 with bit
    depth 10, normalized by 1023:
    
                [ 876/1023   0         0         64/1023  ]
    MLimited  = [ 0          896/1023  0         512/1023 ]
                [ 0          0         896/1023  512/1023 ]
                [ 0          0         0         1        ]
    
                [ 1023/1023  0         0         0        ]
        MFull = [ 0          1023/1023 0         512/1023 ]
                [ 0          0         1023/1023 512/1023 ]
                [ 0          0         0         1        ]
    
    M2020_NCL_Limited = MLimited x M2020_NCL
    M2020_NCL_Full    = MFull x M2020_NCL
    
    The upper three rows of M2020_NCL_* are stored in CR, Y, CB order. Each
    M2020_NCL_* value is stored as Round(value * 8192) in its 16-bit
    two's-complement representation.
    
    Fixes: 973a9c810c78 ("drm/amd/display: Fix COLOR_SPACE_YCBCR2020_TYPE matrix")
    Assisted-by: OpenAI-Codex:GPT-5.6-Sol
    Tested-by: Igor Paunovic <royalnet026@gmail.com>
    Tested-by: Satyajit Roy <sroy14@alum.utk.edu>
    Signed-off-by: Nathan Lucas <nlucasgit@gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 3b906e1dc7e3c9ff9f7940f6828b367a6a9ec73c)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amd/display: fix BT.2020 YCbCr output CSC matrices for DCE [+ + +]
Author: Nathan Lucas <nlucasgit@gmail.com>
Date:   Sun Aug 2 08:35:24 2026 -0600

    drm/amd/display: fix BT.2020 YCbCr output CSC matrices for DCE
    
    commit cd22349e86faf6e15e6c622d70c0efc57d43201e upstream.
    
    The commit cited by the Fixes tag added separate limited and full-range
    BT.2020 YCbCr entries to the DCE output CSC tables, but populated both
    entries with the same matrix copied from the common DC table. That
    matrix combined full-range scaling with limited-range luma offset and was
    incorrect for both limited and full-range output.
    
    Replace the coefficients in both entries in the DCE paths with those from
    the new COLOR_SPACE_YCBCR2020_LIMITED_TYPE
    and COLOR_SPACE_YCBCR2020_FULL_TYPE entries in the preceding commit
    ("drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix").
    
    Fixes: 51e6668ab4ba ("drm/amd/display: add missing CSC entries for BT.2020 for DCE IPs")
    Assisted-by: OpenAI-Codex:GPT-5.6-Sol
    Tested-by: Igor Paunovic <royalnet026@gmail.com>
    Tested-by: Satyajit Roy <sroy14@alum.utk.edu>
    Signed-off-by: Nathan Lucas <nlucasgit@gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 14c8726b79d19934d6eb6d35c612e3f7204af2c6)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amd/pm: adjust the visibility of pp_table sysfs node [+ + +]
Author: Yang Wang <kevinyang.wang@amd.com>
Date:   Wed Aug 12 18:12:32 2026 -0400

    drm/amd/pm: adjust the visibility of pp_table sysfs node
    
    [ Upstream commit 5de8ce0f3709ad93ca5a579aa45cf1b52d72bc90 ]
    
    v1:
    - make pp_table invisible on VF mode (only valid on BM)
    - make pp_table invisible on Mi* chips (Not supported)
    - make pp_table invisible if scpm feature is enabled.
    
    v2:
    move pp_table invisible code logic into amdgpu_dpm_get_pp_table() function.
    
    v3:
    add table buffer pointer check both on powerplay & swsmu.
    
    Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Stable-dep-of: bb493058c35c ("drm/amd/pm: fix pptable use-after-free")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amd/pm: fix pptable use-after-free [+ + +]
Author: Yang Wang <kevinyang.wang@amd.com>
Date:   Wed Aug 12 18:12:33 2026 -0400

    drm/amd/pm: fix pptable use-after-free
    
    [ Upstream commit bb493058c35c8676e48269ab6732688ea733d23c ]
    
    amdgpu_dpm_get_pp_table() returns a pointer to a driver-owned power table
    after dropping adev->pm.mutex. The sysfs path then copies from that pointer.
    A concurrent pp_table write can replace and free the allocation during the
    copy, causing a use-after-free.
    
    Change the DPM interface to copy into caller-provided storage while the mutex
    is held. Keep the size-only query for attribute discovery without exposing
    the driver-owned pointer.
    
    Fixes: 1684d3ba4885 ("drm/amd/amdgpu: change pptable output format from ASCII to binary")
    Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
    Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit f6eed7acfd30099ef7baeb6ba45bb59daad80631)
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amd/pm: fix torn gpu metrics reads [+ + +]
Author: Yang Wang <kevinyang.wang@amd.com>
Date:   Wed Aug 12 11:44:28 2026 -0400

    drm/amd/pm: fix torn gpu metrics reads
    
    [ Upstream commit 048f4541b71fb19645fb79d6e62e6e4da23a4035 ]
    
    amdgpu_dpm_get_gpu_metrics() returns a pointer to the shared metrics cache
    after dropping adev->pm.mutex. The sysfs path then copies from that pointer.
    Another reader can refresh the cache in place during the copy and return a
    snapshot containing data from two generations.
    
    Pass caller-provided storage through the DPM interface and copy the metrics
    while the mutex is held. This keeps the cache pointer private and makes each
    sysfs read observe one complete sample.
    
    Fixes: 25c933b1c4fc ("drm/amd/powerplay: add new sysfs interface for retrieving gpu metrics(V2)")
    Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
    Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 862333bb48693ecafcae25af0c9d9ec31015ac77)
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amd/pm: Use macro to initialize metrics table [+ + +]
Author: Lijo Lazar <lijo.lazar@amd.com>
Date:   Wed Aug 12 11:44:27 2026 -0400

    drm/amd/pm: Use macro to initialize metrics table
    
    [ Upstream commit 1327d8f4061c08c29ea8ce7bb89e209d3c1e8b29 ]
    
    Helps to keep a build time check about usage of right datatype and
    avoids maintenance as new versions get added.
    
    Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
    Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
    Reviewed-by: Yang Wang <kevinyang.wang@amd.com>
    Reviewed-by: Asad Kamal <asad.kamal@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Stable-dep-of: 048f4541b71f ("drm/amd/pm: fix torn gpu metrics reads")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amd/pm: Use same metric table for APU [+ + +]
Author: Asad Kamal <asad.kamal@amd.com>
Date:   Wed Aug 12 11:44:26 2026 -0400

    drm/amd/pm: Use same metric table for APU
    
    [ Upstream commit 56cbb36696407a27cfbfdbc2dee0b1e206178cec ]
    
    Use same metric table for APU and Non APU systems
    for smu_v_13_0_6 to get metric data based on newer pmfw
    versions
    
    v2: Use inline func to check for unified metrics support
    
    Signed-off-by: Asad Kamal <asad.kamal@amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Stable-dep-of: 048f4541b71f ("drm/amd/pm: fix torn gpu metrics reads")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/amdgpu: check ASPM on the dGPU host link [+ + +]
Author: Yang Wang <kevinyang.wang@amd.com>
Date:   Wed Aug 5 20:39:18 2026 +0800

    drm/amdgpu: check ASPM on the dGPU host link
    
    commit 2a9c5154a5650c09ad44ff5e1dff74754e15a3c6 upstream.
    
    dGPUs with an internal PCIe switch expose graphics functions below the
    switch downstream port. The automatic ASPM check uses the display
    endpoint and evaluates the internal link instead of the host link.
    
    Use the switch upstream port for the check and report the selected
    link.
    
    Fixes: 0ab5d711ec74 ("drm/amd: Refactor `amdgpu_aspm` to be evaluated per device")
    Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
    Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
    Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 4e0d6f2876e704fff707b18c40dbd383aea4a1c9)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: disallow multiple FENCE chunks in one submit [+ + +]
Author: Junrui Luo <moonafterrain@outlook.com>
Date:   Thu Aug 6 12:45:24 2026 +0800

    drm/amdgpu: disallow multiple FENCE chunks in one submit
    
    commit 931cd1d1baeae68e8eb2c23bc1f3d8934dca6241 upstream.
    
    amdgpu_cs_pass1() dispatches on chunk_id once per chunk without
    rejecting repeated ids. p->uf_bo is a single-slot field, so a
    submission carrying two AMDGPU_CHUNK_ID_FENCE chunks runs
    amdgpu_cs_p1_user_fence() twice, and the second run overwrites
    p->uf_bo with a freshly referenced BO without dropping the reference
    taken by the first.
    
    amdgpu_cs_parser_fini() only unrefs the final p->uf_bo, so every FENCE
    chunk but the last leaks a BO reference. The leaked BO outlives handle
    close and process exit.
    
    Reject duplicate FENCE chunks the same way commit fec5f8e8c6bc
    ("drm/amdgpu: disallow multiple BO_HANDLES chunks in one submit") did
    for p->bo_list.
    
    Fixes: d38ceaf99ed0 ("drm/amdgpu: add core driver (v4)")
    Reported-by: Yuhao Jiang <danisjiang@gmail.com>
    Assisted-by: Claude:claude-opus-5
    Cc: stable@vger.kernel.org
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Junrui Luo <moonafterrain@outlook.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 665b1fc2a1845206408f9a2c6da67101789edb82)
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: fix aperture iounmap skipped on device removal [+ + +]
Author: Asad Kamal <asad.kamal@amd.com>
Date:   Thu Jul 30 15:00:00 2026 +0800

    drm/amdgpu: fix aperture iounmap skipped on device removal
    
    commit f9e5f51549000e2665e3b5e02ff876b9e09cfe95 upstream.
    
    amdgpu_pci_remove() calls drm_dev_unplug() before invoking the fini
    routines. After drm_dev_unplug() the drm_dev_enter() guard in
    amdgpu_ttm_fini() always returns false, so iounmap() for
    aper_base_kaddr is silently skipped. On connected_to_cpu hardware
    ioremap_cache() maps the aperture as WB; when iounmap() is skipped the
    stale WB PAT entry persists. On reload IP discovery's
    memremap(MEMREMAP_WC) on the same aperture range hits a WB/WC conflict,
    producing an ioremap error and failing re-probe.
    
    Remove the drm_dev_enter() guard and call iounmap() unconditionally.
    The aperture mapping is plain MMIO and does not require device-presence
    protection. Surprise-removal cleanup of aper_base_kaddr is already
    handled unconditionally by amdgpu_device_unmap_mmio().
    
    Fixes: 62d5f9f7110a ("drm/amdgpu: Unmap MMIO mappings when device is not unplugged")
    Signed-off-by: Asad Kamal <asad.kamal@amd.com>
    Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
    Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit fb3f68af9f6fce9343a2bd13b4d68a1c02d283df)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: fix nbif 6.3.1 l1 low power not functional [+ + +]
Author: Yang Wang <kevinyang.wang@amd.com>
Date:   Mon Aug 10 12:48:19 2026 +0800

    drm/amdgpu: fix nbif 6.3.1 l1 low power not functional
    
    commit cd688a3cb342b9f56399aa076157f1c324c15c5a upstream.
    
    The PCIe L1 low‑power settings for NBIF 6.3.1 were never applied due to
    unresolved register mapping, which caused the relevant code to be compiled out.
    As a result, the PCIe link could not enter L1/L23 power‑down states or transition to L0s.
    
    Properly configure the link control register to enable L1 and L23 power‑down,
    and permit L0s link transitions. Keep LTR disabled and let the PCI core enable it
    only after verifying end‑to‑end root complex support across switches.
    
    Fixes: 894c6d3522d1 ("drm/amdgpu: Add nbif v6_3_1 ip block support")
    Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
    Signed-off-by: Kenneth Feng <Kenneth.feng@amd.com>
    Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit c2417f9fd7049d5a8d87eefd82fd6e36ba1ff7b6)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: Fix UVD decode image min size calculation [+ + +]
Author: David Rosca <david.rosca@amd.com>
Date:   Thu Jul 30 18:01:51 2026 +0200

    drm/amdgpu: Fix UVD decode image min size calculation
    
    commit b8bb9ba3f101a1b0011f785a577a4a0a38371174 upstream.
    
    This needs to use pitch instead of width. Also reject pitch
    over 4096 to avoid overflow.
    
    Signed-off-by: David Rosca <david.rosca@amd.com>
    Acked-by: Leo Liu <leo.liu@amd.com>
    Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit b41c8cb12e202b220353332ab87dc01a11f69304)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: Fix UVD dpb min size calculation for H264 [+ + +]
Author: David Rosca <david.rosca@amd.com>
Date:   Thu Jul 30 17:56:17 2026 +0200

    drm/amdgpu: Fix UVD dpb min size calculation for H264
    
    commit 21a8084cd76223a13493237e04d45f5226d7cee6 upstream.
    
    This should use actual number of references from the decode
    message, instead of maximum derived from level.
    
    Signed-off-by: David Rosca <david.rosca@amd.com>
    Acked-by: Leo Liu <leo.liu@amd.com>
    Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 64b525edb7e7bdfcdc77883c5e413804e2396856)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: Fix UVD min buffer sizes [+ + +]
Author: David Rosca <david.rosca@amd.com>
Date:   Thu Jul 30 18:05:52 2026 +0200

    drm/amdgpu: Fix UVD min buffer sizes
    
    commit 18727670b44753865b81c56a9338c0d7bd102c54 upstream.
    
    Use correct size for message buffer = sizeof(struct ruvd_msg).
    Add ITSCALING_TABLE_BUFFER size.
    
    Signed-off-by: David Rosca <david.rosca@amd.com>
    Acked-by: Leo Liu <leo.liu@amd.com>
    Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 37519d007e4261febbcf35b3045f8344f3145497)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: Implement insert_end for VCE 3 [+ + +]
Author: David Rosca <david.rosca@amd.com>
Date:   Mon Aug 10 11:11:35 2026 +0200

    drm/amdgpu: Implement insert_end for VCE 3
    
    commit d5ab4c6a64efef2d143a96df5357f59703cd703d upstream.
    
    After a recent change VCE now hangs when VCE_CMD_END is emitted
    after a pipeline sync without VM flush.
    Implement insert_end to correctly insert only one VCE_CMD_END per job.
    
    Fixes: bc639a9eadc7 ("drm/amdgpu: always emit the job vm fence")
    Signed-off-by: David Rosca <david.rosca@amd.com>
    Acked-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 8897ea8c761b856f02061848a7908040a1fe5e68)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: move debug_vm handling to amdgpu_cs_parser_fini [+ + +]
Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Date:   Wed Aug 12 11:44:39 2026 -0400

    drm/amdgpu: move debug_vm handling to amdgpu_cs_parser_fini
    
    [ Upstream commit d8726ef11512754a68c0ab53c57634a569b8feff ]
    
    The commit referenced below restarts the CS if the validation is
    still in progress. When debug_vm is enabled, all BOs from the CS
    are invalidated so we will hit an infinite loop.
    
    To avoid that, defer BO invalidation to amdgpu_cs_parser_fini.
    
    Fixes: 59720bfd8c6d ("drm/amdgpu: restart the CS if some parts of the VM are still invalidated")
    Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 8c990ee9daa295462df24982ce6878db997a380a)
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: read TRUNCATE_COORD_MODE on gfx12 [+ + +]
Author: Qiang Yu <Qiang.Yu@amd.com>
Date:   Thu Jul 23 17:20:47 2026 +0800

    drm/amdgpu: read TRUNCATE_COORD_MODE on gfx12
    
    commit 2d69604b4d0b9c0c0ac71624b5fafb36cf249729 upstream.
    
    TA_CNTL2.TRUNCATE_COORD_MODE selects whether texture coordinate
    truncation is D3D9/GL/Vulkan conformant. gfx11 reads it and reports it to
    userspace via AMDGPU_IDS_FLAGS_CONFORMANT_TRUNC_COORD, but gfx12 never
    read it, so the flag was always reported as 0 and userspace fell back to
    the non-conformant path.
    
    Read it in gfx_v12_0_constants_init() like gfx11 does.
    
    Fixes: 52cb80c12e8a ("drm/amdgpu: Add gfx v12_0 ip block support (v6)")
    Signed-off-by: Qiang Yu <Qiang.Yu@amd.com>
    Reviewed-by: Marek Olšák <maraeo@gmail.com>
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 4261cbc7b03f1f56e95aeaf1492b8690fa5a253e)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: reject oversized IBs with per-ring packet limits [+ + +]
Author: Candice Li <candice.li@amd.com>
Date:   Thu Jul 30 11:28:10 2026 +0800

    drm/amdgpu: reject oversized IBs with per-ring packet limits
    
    commit fd37f9dd5b5ab70a46fa7bc76623c0528d602b27 upstream.
    
    On GFX rings, amdgpu_cs_p2_ib() passed user-supplied ib_bytes through
    to ib->length_dw without a limit, while ring_emit_ib() encodes length
    into packet fields. Oversized values can corrupt adjacent control bits
    and destabilize command submission.
    
    Add a per-ring IB packet size limit helper and reject command
    submissions exceeding the corresponding dword limit before IB
    allocation. Use the documented 20-bit limit for GFX/compute/SDMA/VPE,
    and apply the MM fallback limit for other ring types.
    
    Signed-off-by: Candice Li <candice.li@amd.com>
    Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 7f48fa2cf62e3fa6c9c3870aa74988f773247e52)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: Reject UVD message with dimensions above 4096 [+ + +]
Author: David Rosca <david.rosca@amd.com>
Date:   Thu Jul 30 17:37:44 2026 +0200

    drm/amdgpu: Reject UVD message with dimensions above 4096
    
    commit 8c9aebcdd9f46f7a14b98d6ab18574b7a48fbb08 upstream.
    
    Fixes potential overflow in DPB size calculations.
    
    Signed-off-by: David Rosca <david.rosca@amd.com>
    Acked-by: Leo Liu <leo.liu@amd.com>
    Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 05e1387d151f71569fbe122d2c89f9db0c21dc10)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: Reject UVD message with invalid number of h265 refs [+ + +]
Author: David Rosca <david.rosca@amd.com>
Date:   Tue Aug 11 11:03:10 2026 +0200

    drm/amdgpu: Reject UVD message with invalid number of h265 refs
    
    commit 9fca434208f1f9ab977feac62df8ebb1cc7ce893 upstream.
    
    Same change as for h264, avoids overflow later when calculating
    min dpb size.
    
    Signed-off-by: David Rosca <david.rosca@amd.com>
    Reviewed-by: Leo Liu <leo.liu@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit a4b0720e4f1601f97f59a2be9c1b4b94fa6527d5)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: remove unused function parameter [+ + +]
Author: Yunxiang Li <Yunxiang.Li@amd.com>
Date:   Wed Aug 12 11:44:38 2026 -0400

    drm/amdgpu: remove unused function parameter
    
    [ Upstream commit a541a6e865ecd8dfd8df6eeb134cc20e7139d329 ]
    
    amdgpu_vm_bo_invalidate doesn't use the adev parameter and not all
    callers have a reference to adev handy, so remove it for cleanliness.
    
    Signed-off-by: Yunxiang Li <Yunxiang.Li@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20241219151411.1150-5-Yunxiang.Li@amd.com
    Signed-off-by: Christian König <christian.koenig@amd.com>
    Stable-dep-of: d8726ef11512 ("drm/amdgpu: move debug_vm handling to amdgpu_cs_parser_fini")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

drm/amdgpu: validate GEM_CREATE domain combinations [+ + +]
Author: Candice Li <candice.li@amd.com>
Date:   Mon Jul 27 11:51:37 2026 +0800

    drm/amdgpu: validate GEM_CREATE domain combinations
    
    commit 5e9d136ad74df4edec67e502ce267597064d8f86 upstream.
    
    AMDGPU_GEM_CREATE checked domain bits against AMDGPU_GEM_DOMAIN_MASK,
    but did not validate domain combinations. Userspace could combine
    CPU|GTT|VRAM with DOORBELL, GDS, GWS, or OA, making
    amdgpu_bo_placement_from_domain() exceed AMDGPU_BO_MAX_PLACEMENTS and
    hit BUG_ON().
    
    Allow combinations only within CPU/GTT/VRAM, and require non-CPU/GTT/
    VRAM domains to be specified one at a time. Return -EINVAL for invalid
    combinations in amdgpu_gem_create_ioctl().
    
    v2: Rename helper from amdgpu_gem_domain_valid() to
        amdgpu_gem_are_domains_valid() (Christian)
    
    Signed-off-by: Candice Li <candice.li@amd.com>
    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit db39852d0c39843cb02048dfb47e4b8c703e9080)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/connector/hdmi: Fix out of bounds memory read [+ + +]
Author: John Harrison <John.Harrison@Igalia.com>
Date:   Thu Jul 23 15:06:52 2026 -0700

    drm/connector/hdmi: Fix out of bounds memory read
    
    commit 9ecf8ba763d0ffe0673538eb4bf7806f20455d19 upstream.
    
    A helper function was copying a given audio infoframe into the
    connector's copy but using the size of the destination (a generic
    target, sized to accept many different data blocks) not the source (a
    very specific type of data block). Thus, it was copying 60 bytes of
    data from a 28 byte allocation.
    
    Fix that by using the source size instead, together with a build bug
    on the source size actually being smaller than the destination.
    
    I hit this running KUnit tests under KASAN (while debugging something
    else entirely). In the real world, it seems unlikely to cause an
    actual problem. It is a read not a write so it can't corrupt any
    memory. However, it could potentially fall off the end of a page and
    cause an accvio bug.
    
    Fixes: f378b77227bc ("drm/connector: hdmi: Add Infoframes generation")
    Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
    Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Cc: Maxime Ripard <mripard@kernel.org>
    Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
    Cc: Thomas Zimmermann <tzimmermann@suse.de>
    Cc: David Airlie <airlied@gmail.com>
    Cc: Simona Vetter <simona@ffwll.ch>
    Cc: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
    Cc: Daniel Stone <daniel@fooishbar.org>
    Cc: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
    Cc: Jani Nikula <jani.nikula@intel.com>
    Cc: José Expósito <jose.exposito89@gmail.com>
    Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
    Cc: dri-devel@lists.freedesktop.org
    Cc: stable@vger.kernel.org # v6.11+
    Signed-off-by: John Harrison <John.Harrison@Igalia.com>
    Link: https://patch.msgid.link/20260723220652.533345-1-John.Harrison@Igalia.com
    Signed-off-by: Maxime Ripard <mripard@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/panthor: skip zero-sized firmware sections [+ + +]
Author: Osama Abdelkader <osama.abdelkader@gmail.com>
Date:   Fri Jul 24 19:26:20 2026 +0200

    drm/panthor: skip zero-sized firmware sections
    
    commit 2b8f13d3c7e26c46c20d9e367904cf01729c88e6 upstream.
    
    panthor_fw_load_section_entry() skips BO creation when the firmware section
    VA range is empty. If such a section is added to the firmware section list,
    section->mem is left as NULL.
    
    Later reload and unplug paths iterate over all firmware sections and
    dereference section->mem, which can lead to a NULL pointer dereference.
    
    Zero-sized firmware sections are valid, so accept them as no-op entries but
    skip adding them to the section list.
    
    Fixes: 2718d91816ee ("drm/panthor: Add the FW logical block")
    Cc: stable@vger.kernel.org
    Signed-off-by: Osama Abdelkader <osama.abdelkader@gmail.com>
    Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
    Reviewed-by: Steven Price <steven.price@arm.com>
    Link: https://patch.msgid.link/20260724172621.63046-1-osama.abdelkader@gmail.com
    Signed-off-by: Steven Price <steven.price@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/radeon: fix autosuspend cleanup during teardown [+ + +]
Author: Guangshuo Li <lgs201920130244@gmail.com>
Date:   Sat Aug 8 21:59:42 2026 +0800

    drm/radeon: fix autosuspend cleanup during teardown
    
    commit 587be7a17358ef8c0106775fcedae5a7bef50735 upstream.
    
    radeon_driver_load_kms() calls pm_runtime_use_autosuspend() for PX
    devices, but radeon_driver_unload_kms() does not call the matching
    pm_runtime_dont_use_autosuspend() during teardown.
    
    If the autosuspend delay is set to a negative value while autosuspend
    is enabled, the runtime PM core increments usage_count to prevent
    runtime suspend. Without calling pm_runtime_dont_use_autosuspend()
    during teardown, this reference is not dropped.
    
    The documentation for pm_runtime_use_autosuspend() also notes that it
    is important to undo it with pm_runtime_dont_use_autosuspend() at
    driver exit time, unless runtime PM was initially enabled with
    devm_pm_runtime_enable().
    
    Add the missing pm_runtime_dont_use_autosuspend() call to the driver
    unload path.
    
    This issue was found by manual code inspection.
    
    Fixes: 10ebc0bc0934 ("drm/radeon: add runtime PM support (v2)")
    Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 0fdc1ff82ea14844c22795e9e0813c3ca03235e1)
    Cc: stable@vger.kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/vmwgfx: take fman->lock around fence list mutation in fifo_down [+ + +]
Author: Zack Rusin <zack.rusin@broadcom.com>
Date:   Sat Aug 15 11:55:25 2026 -0400

    drm/vmwgfx: take fman->lock around fence list mutation in fifo_down
    
    [ Upstream commit 250af2e8c3e90dc978e062a936b633870a22e660 ]
    
    vmw_fence_fifo_down() drops fman->lock to wait on a fence and, on
    timeout, mutates fman->fence_list via list_del_init() and signals
    the fence without re-acquiring the lock.  __vmw_fences_update() walks
    and removes entries from the same list under fman->lock from any
    other waiter, the fence-IRQ thread, or vmw_fences_update(), so the
    unlocked list_del_init() can corrupt the list head.
    
    Re-take fman->lock before manipulating fence->head and use
    dma_fence_signal_locked().  Wrap the locked signalling in
    dma_fence_begin_signalling() / dma_fence_end_signalling() so the
    lockdep annotation that dma_fence_signal() previously provided is
    preserved (the same pattern as __vmw_fences_update()).
    
    dma_fence_put() is moved outside the lock to avoid a recursive
    acquire from vmw_fence_obj_destroy(), which also takes fman->lock.
    
    Fixes: ae2a104058e2 ("vmwgfx: Implement fence objects")
    Cc: stable@vger.kernel.org
    Assisted-by: Claude:claude-opus-4.7
    Signed-off-by: Zack Rusin <zack.rusin@broadcom.com>
    Reviewed-by: Ian Forbes <ian.forbes@broadcom.com>
    Link: https://patch.msgid.link/20260505222728.519626-5-zack.rusin@broadcom.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
drm/xe/oa: Fix sync entry leak on OA config emit failure [+ + +]
Author: Linmao Li <lilinmao@kylinos.cn>
Date:   Fri Jul 31 09:19:32 2026 +0800

    drm/xe/oa: Fix sync entry leak on OA config emit failure
    
    [ Upstream commit 8d33c4987cd162527375a3905017ae129ba7c3fe ]
    
    xe_oa_emit_oa_config() releases the sync entries and the syncs array
    only on its success path. When it fails before the point of no return
    (fence allocation, config buffer allocation or batch submission), it
    returns without touching stream->syncs.
    
    The stream open path handles such failures in the caller, but
    xe_oa_config_locked() propagates the error without any cleanup, so the
    syncs array and the fence references held by the parsed entries are
    leaked. The next config ioctl overwrites stream->syncs, making the
    memory unreachable for good.
    
    Clean up the parsed syncs when xe_oa_emit_oa_config() fails, matching
    the cleanup done by the stream open error path.
    
    Fixes: 9920c8b88c5c ("drm/xe/oa: Add syncs support to OA config ioctl")
    Signed-off-by: Linmao Li <lilinmao@kylinos.cn>
    Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
    Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
    Link: https://patch.msgid.link/20260731011932.3426219-1-lilinmao@kylinos.cn
    (cherry picked from commit 8af97b3da2cfce04e6b457c6eb17ed3c1daf912b)
    Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
drm/xe: Order ring writes before ring tail updates [+ + +]
Author: Matthew Brost <matthew.brost@intel.com>
Date:   Fri Aug 7 10:17:16 2026 -0700

    drm/xe: Order ring writes before ring tail updates
    
    commit 9f83c94469ff0fa37274b873ba24922e02531fa7 upstream.
    
    The ring buffer and the LRC context image are both mapped WC, so the ring
    tail update can become visible to the device before the ring contents it
    is meant to publish.
    
    The GuC CT send does contain an xe_device_wmb(), so sending the H2G would
    flush the ring contents. The problem is that it comes too late:
    xe_lrc_set_ring_tail() publishes the tail before the H2G is sent, and the
    device samples the tail from the context image independently of it, either
    at context switch-in or while the context is already resident. A submitter
    which is interrupted between updating the tail and sending its H2G
    therefore leaves the device free to observe the new tail while the ring
    contents behind it are not yet visible:
    
      1. Thread A emits a job into the ring, sets the tail to T_A and sends
         the H2G, which flushes A's ring contents. The GuC starts scheduling
         the context in, but it is not executing yet.
      2. Thread B emits a job into ring[T_A..T_B]. Those writes are not yet
         visible to the device.
      3. Thread B updates the ring tail to T_B. That write targets a
         different page and becomes visible first.
      4. Thread B is interrupted before it sends its H2G, so the flush which
         would have published ring[T_A..T_B] has not happened yet.
      5. The context is switched in and samples the ring tail from the
         context image, picking up T_B rather than T_A.
      6. The GPU executes A's job, advances HEAD to T_A, and continues on to
         ring[T_A..T_B], which still holds the previous wrap's contents, so
         the CS parses stale commands.
    
    The result is command stream corruption, which typically manifests as a
    hang or a spurious pagefault rather than anything that points back at the
    submission path.
    
    Kernel jobs are by far the most likely to hit this. Kernel queues such as
    the migration queue are shared and can be driven by many threads
    concurrently, producing back-to-back submissions on an LRC which is
    already executing. User queues are typically tied to a single submitting
    thread, so the same interleaving is much harder to produce.
    
    Add an xe_device_wmb() at the end of xe_lrc_write_ring() so that it covers
    every ring tail publication site, and so the invariant is local: once
    xe_lrc_write_ring() returns, the ring contents are visible to the device.
    
    Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
    Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/8651
    Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/7810
    Cc: stable@vger.kernel.org
    Signed-off-by: Matthew Brost <matthew.brost@intel.com>
    Assisted-by: GitHub_Copilot:claude-opus-5
    Reviewed-by: Stuart Summers <stuart.summers@intel.com>
    Link: https://patch.msgid.link/20260807171716.140475-1-matthew.brost@intel.com
    (cherry picked from commit 136360290f314890428a3fbf31aaa8e4f1d43567)
    Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
erofs: fix EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS on some UP platforms [+ + +]
Author: Gao Xiang <xiang@kernel.org>
Date:   Wed Aug 12 21:11:43 2026 +0800

    erofs: fix EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS on some UP platforms
    
    [ Upstream commit a64d500b0078e16e9abb25baca4dee1dbc9054fc ]
    
    CONFIG_NR_CPUS doesn't define on some UP platforms (e.g.  arm), so this
    can cause make oldconfig to loop indefinitely when CONFIG_SMP=n:
    
      $ make ARCH=arm allmodconfig
      $ sed -i "/CONFIG_SMP=y/d" .config
      $ sed -i "/CONFIG_EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS.*/d" .config
    
      EROFS LZMA default maximum decompression streams (EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS) [0] (NEW)
      EROFS LZMA default maximum decompression streams (EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS) [0] (NEW)
      ...
    
    Let's guard NR_CPUS with SMP instead of using a hardcoded arbitrary CPU
    uplimit here, similar to commit a3344078101c ("mm: make SPLIT_PTE_PTLOCKS
    depend on SMP").
    
    The initial report from SJ Park was for m68k [1] (m68k is the only arch
    without NR_CPUS in Kconfig), and that got fixed in commit 1fd495ef09ee
    ("m68k: Define NR_CPUS to 1")
    
    Reported-by: SJ Park <sj@kernel.org>
    Link: https://lore.kernel.org/all/anuyFHLUGDjZWY4K@XiangdeMacBook-Pro.local/T/#u [1]
    Closes: https://lore.kernel.org/r/20260728065447.91511-1-sj@kernel.org
    Reported-by: Guenter Roeck <groeck7@gmail.com>
    Closes: https://lore.kernel.org/r/87853c96-cc8f-49e6-81b1-02bfe409e372@roeck-us.net
    Fixes: c9b47e6b2311 ("erofs: cap LZMA stream pool size")
    Signed-off-by: Gao Xiang <xiang@kernel.org>
    Tested-by: SJ Park <sj@kernel.org>
    Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
eventpoll: pin files while checking reverse paths [+ + +]
Author: Guidong Han <2045gemini@gmail.com>
Date:   Sat Aug 8 20:48:13 2026 -0400

    eventpoll: pin files while checking reverse paths
    
    [ Upstream commit 8b7e8245e2293078f657521236ac92c045552e5a ]
    
    Commit 319c15174757 ("epoll: take epitem list out of struct file")
    intentionally removed temporary file references from the reverse path
    check list. At the time, both epitems and their files were freed after
    an RCU grace period, so unlist_file() could obtain file->f_lock through
    an epitem while clear_tfile_check_list() held rcu_read_lock().
    
    Commit 0ede61d8589c ("file: convert to SLAB_TYPESAFE_BY_RCU") made
    struct file SLAB_TYPESAFE_BY_RCU and removed its RCU-delayed freeing.
    RCU still protects the epitem, but no longer keeps the referenced file
    from being freed and reused. A concurrent close can therefore make
    unlist_file() lock or unlock f_lock in a recycled file object.
    
    This violates the documented SLAB_TYPESAFE_BY_RCU rule requiring a
    reference before acquiring an object's lock. The race was reproduced,
    causing a wild unlock of f_lock in a recycled file and breaking its
    mutual exclusion.
    
    Add ->file to epitems_head to remember the pinned file independently of
    ->epitems. A concurrent EPOLL_CTL_DEL can empty ->epitems before the head
    is unlisted, leaving no epi->ffd.file from which to drop the reference.
    
    In list_file(), acquire the reference before adding the head to the
    check list. The caller either owns a reference or holds the ep->mtx for
    the epitem leading to the file. In the latter case, file_ref_get() can
    fail after the last reference is dropped, but eventpoll_release_file()
    must acquire the same mutex before the file can be freed. The dying leaf
    can be skipped because removing links cannot increase the reverse path
    count.
    
    In unlist_file(), epnested_mutex excludes another list_file() or
    unlist_file(), while head->next prevents a concurrent EPOLL_CTL_DEL from
    freeing the head. Save head->file locally, clear it with head->next
    under f_lock, and drop the reference after the RCU-protected operation.
    
    Christian Brauner <brauner@kernel.org> quotes:
    
    > SLAB_TYPESAFE_BY_RCU allows a slab slot to be reused while an RCU reader
    > still holds its old address. Once that address contains a new live
    > struct file, KASAN sees valid, unpoisoned memory and cannot distinguish
    > the stale object identity. CONFIG_DEBUG_SPINLOCK exposes the failure
    > instead.
    >
    > The failing interleaving is:
    >
    > CPU0: nested EPOLL_CTL_ADD             CPU1: close/open churn
    > ------------------------------------   ---------------------------------
    > p = hlist_first_rcu(&head->epitems)
    > epi = container_of(p, ...)
    >                                        close(victim)
    >                                          __fput()
    >                                            eventpoll_release_file()
    >                                            file_free(victim)
    >                                        // the slot is free; f_lock remains
    > spin_lock(&epi->ffd.file->f_lock)
    >                                        open() reuses the slot as new_file
    >                                          spin_lock_init(&new_file->f_lock)
    > spin_unlock(&epi->ffd.file->f_lock)     // wild unlock of new_file's lock
    >
    > CONFIG_DEBUG_SPINLOCK reports:
    >
    > BUG: spinlock already unlocked on CPU#0, poc_unlist/150
    >  lock: 0xffff8880067fb200, .magic: dead4ead, .owner: <none>/-1, .owner_cpu: -1
    > CPU: 0 UID: 1000 PID: 150 Comm: poc_unlist Not tainted 7.2.0-rc3-dirty #22 PREEMPTLAZY
    > 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+0x64/0x80
    >  do_raw_spin_unlock+0x75/0xb0
    >  _raw_spin_unlock+0xe/0x30
    >  clear_tfile_check_list+0x88/0xe0
    >  do_epoll_ctl_file+0x519/0xcf0
    >  ? __pfx_ep_ptable_queue_proc+0x10/0x10
    >  do_epoll_ctl+0x8f/0x100
    >  __x64_sys_epoll_ctl+0x6f/0xa0
    >  do_syscall_64+0xdc/0x520
    >  ? srso_alias_return_thunk+0x5/0xfbef5
    >  entry_SYSCALL_64_after_hwframe+0x76/0x7e
    > RIP: 0033:0x42034e
    > Code: 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 49 89 ca b8 e9 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48
    > RSP: 002b:00007a657ff3c198 EFLAGS: 00000202 ORIG_RAX: 00000000000000e9
    > RAX: ffffffffffffffda RBX: 00007a657ff3ccdc RCX: 000000000042034e
    > RDX: 0000000000000003 RSI: 0000000000000001 RDI: 0000000000000004
    > RBP: 00007a657ff3c2f0 R08: 0000000000000000 R09: 00007a657ff3c6c0
    > R10: 00007a657ff3c1a4 R11: 0000000000000202 R12: 00007a657ff3c6c0
    > R13: ffffffffffffffb8 R14: 000000000000000d R15: 00007fffb7de0210
    >  </TASK>
    > ------------[ cut here ]------------
    >
    > unlist_file() does not appear as a separate frame because it was inlined
    > into clear_tfile_check_list(). This report was obtained with mdelay()
    > instrumentation immediately before spin_lock() and spin_unlock() in
    > unlist_file() to widen the two race windows.
    >
    > More importantly, this is a wild unlock. The stale unlock can target
    > f_lock of a different live file and invalidate mutual exclusion for
    > state protected by that lock. Turning this into a reliable exploit
    > would require precise scheduling and same-slot reuse and is likely
    > difficult, but the primitive is potentially exploitable.
    
    Reported-by: Qi Tang <tpluszz77@gmail.com>
    Reported-by: Junxi Qian <qjx1298677004@gmail.com>
    Fixes: 0ede61d8589c ("file: convert to SLAB_TYPESAFE_BY_RCU")
    Cc: stable@vger.kernel.org
    Signed-off-by: Guidong Han <2045gemini@gmail.com>
    Link: https://patch.msgid.link/20260718104406.27897-1-2045gemini@gmail.com
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
f2fs: fix UAF issue in f2fs_merge_page_bio() [+ + +]
Author: Chao Yu <chao@kernel.org>
Date:   Tue Aug 18 19:19:54 2026 +0800

    f2fs: fix UAF issue in f2fs_merge_page_bio()
    
    commit edf7e9040fc52c922db947f9c6c36f07377c52ea upstream.
    
    As JY reported in bugzilla [1],
    
    Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
    pc : [0xffffffe51d249484] f2fs_is_cp_guaranteed+0x70/0x98
    lr : [0xffffffe51d24adbc] f2fs_merge_page_bio+0x520/0x6d4
    CPU: 3 UID: 0 PID: 6790 Comm: kworker/u16:3 Tainted: P    B   W  OE      6.12.30-android16-5-maybe-dirty-4k #1 5f7701c9cbf727d1eebe77c89bbbeb3371e895e5
    Tainted: [P]=PROPRIETARY_MODULE, [B]=BAD_PAGE, [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
    Workqueue: writeback wb_workfn (flush-254:49)
    Call trace:
     f2fs_is_cp_guaranteed+0x70/0x98
     f2fs_inplace_write_data+0x174/0x2f4
     f2fs_do_write_data_page+0x214/0x81c
     f2fs_write_single_data_page+0x28c/0x764
     f2fs_write_data_pages+0x78c/0xce4
     do_writepages+0xe8/0x2fc
     __writeback_single_inode+0x4c/0x4b4
     writeback_sb_inodes+0x314/0x540
     __writeback_inodes_wb+0xa4/0xf4
     wb_writeback+0x160/0x448
     wb_workfn+0x2f0/0x5dc
     process_scheduled_works+0x1c8/0x458
     worker_thread+0x334/0x3f0
     kthread+0x118/0x1ac
     ret_from_fork+0x10/0x20
    
    [1] https://bugzilla.kernel.org/show_bug.cgi?id=220575
    
    The panic was caused by UAF issue w/ below race condition:
    
    kworker
    - writepages
     - f2fs_write_cache_pages
      - f2fs_write_single_data_page
       - f2fs_do_write_data_page
        - f2fs_inplace_write_data
         - f2fs_merge_page_bio
          - add_inu_page
          : cache page #1 into bio & cache bio in
            io->bio_list
      - f2fs_write_single_data_page
       - f2fs_do_write_data_page
        - f2fs_inplace_write_data
         - f2fs_merge_page_bio
          - add_inu_page
          : cache page #2 into bio which is linked
            in io->bio_list
                                                    write
                                                    - f2fs_write_begin
                                                    : write page #1
                                                     - f2fs_folio_wait_writeback
                                                      - f2fs_submit_merged_ipu_write
                                                       - f2fs_submit_write_bio
                                                       : submit bio which inclues page #1 and #2
    
                                                    software IRQ
                                                    - f2fs_write_end_io
                                                     - fscrypt_free_bounce_page
                                                     : freed bounced page which belongs to page #2
          - inc_page_count( , WB_DATA_TYPE(data_folio), false)
          : data_folio points to fio->encrypted_page
            the bounced page can be freed before
            accessing it in f2fs_is_cp_guarantee()
    
    It can reproduce w/ below testcase:
    Run below script in shell #1:
    for ((i=1;i>0;i++)) do xfs_io -f /mnt/f2fs/enc/file \
    -c "pwrite 0 32k" -c "fdatasync"
    
    Run below script in shell #2:
    for ((i=1;i>0;i++)) do xfs_io -f /mnt/f2fs/enc/file \
    -c "pwrite 0 32k" -c "fdatasync"
    
    So, in f2fs_merge_page_bio(), let's avoid using fio->encrypted_page after
    commit page into internal ipu cache.
    
    Fixes: 0b20fcec8651 ("f2fs: cache global IPU bio")
    Reported-by: JY <JY.Ho@mediatek.com>
    Signed-off-by: Chao Yu <chao@kernel.org>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    [Jiucheng Xu: backport to 6.12.y]
    Signed-off-by: Jiucheng Xu <jiucheng.xu@amlogic.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
fbdev: core: Fix pointer desynchronization in fb_io_read() [+ + +]
Author: Mingyu Wang <25181214217@stu.xidian.edu.cn>
Date:   Tue Jul 21 16:19:42 2026 +0800

    fbdev: core: Fix pointer desynchronization in fb_io_read()
    
    commit 81cc73be40c6f028f1ee3f438ace46afe666dbae upstream.
    
    In fb_io_read(), if copy_to_user() performs a partial copy (e.g., due to
    a faulty user buffer), the loop adjusts the chunk size 'c' and updates
    the remaining 'count'. However, the hardware 'src' pointer has already
    been eagerly advanced by the original chunk size.
    
    If the loop is allowed to continue, the read will resume from an
    incorrect, over-advanced offset. Since the remaining 'count' was only
    decremented by the successful bytes, this desynchronization causes the
    next iterations to execute more hardware reads than originally bounded,
    eventually leading to out-of-bounds I/O reads.
    
    Fix this by breaking out of the loop immediately upon a partial
    copy_to_user(). A partial copy indicates a faulty user buffer, making
    subsequent read attempts futile. Breaking out ensures we return the
    number of successfully read bytes without risking out-of-bounds hardware
    accesses in subsequent mismatched iterations.
    
    Fixes: 6121cd9ef911 ("fbdev: Move I/O read and write code into helper functions")
    Cc: stable@vger.kernel.org
    Signed-off-by: Mingyu Wang <25181214217@stu.xidian.edu.cn>
    Signed-off-by: Helge Deller <deller@gmx.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
fs/super: fix emergency thaw double-unlock of s_umount [+ + +]
Author: Chen Changcheng <chenchangcheng@kylinos.cn>
Date:   Sat Aug 8 11:48:51 2026 -0400

    fs/super: fix emergency thaw double-unlock of s_umount
    
    [ Upstream commit 503d67fbaec6fdeaba391cb497675071db9d16ea ]
    
    do_thaw_all() iterates over all superblocks via __iterate_supers()
    with SUPER_ITER_EXCL, which acquires s_umount exclusively before
    calling the callback and releases it afterwards. However, the
    callback do_thaw_all_callback() calls thaw_super_locked() which
    unconditionally releases s_umount on every code path. This results
    in a second unlock attempt in __iterate_supers() that corrupts the
    rwsem state, triggering a DEBUG_RWSEMS warning:
    
    [  182.601148] sysrq: Emergency Thaw of all frozen filesystems
    [  182.601865] ------------[ cut here ]------------
    [  182.602375] DEBUG_RWSEMS_WARN_ON((rwsem_owner(sem) != current) && !rwsem_test_oflags(sem, RWSEM_NONSPINNABLE)): count = 0x0, magic = 0xffff99b1011e5870, owner = 0x0, curr 0xffff99b101b06c80, list not empty
    [  182.603817] WARNING: kernel/locking/rwsem.c:1412 at up_write+0xa3/0x170, CPU#2: kworker/2:1/53
    [  182.604578] Modules linked in:
    [  182.604864] CPU: 2 UID: 0 PID: 53 Comm: kworker/2:1 Not tainted 7.2.0-rc4-00001-gbd3bd93ea98a-dirty #4 PREEMPT(lazy)
    [  182.605711] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1kylin1 04/01/2014
    [  182.606417] Workqueue: events do_thaw_all
    [  182.606750] RIP: 0010:up_write+0xaf/0x170
    [  182.607076] Code: 19 3a 92 48 0f 44 c2 48 8b 55 08 48 8b 55 00 4c 8b 45 08 48 8b 55 00 48 8d 3d ad 91 e0 01 48 8b 4d 20 50 48 c7 c6 f0 8c 26 92 <67> 48 0f b9 3a e8 d7 93 4e 00 58 eb 81 48 83 7f 18 00 48 c7 c2 8d
    [  182.608563] RSP: 0018:ffffb670001d7e08 EFLAGS: 00010246
    [  182.609007] RAX: ffffffff92349e8d RBX: 0000000000000000 RCX: ffff99b1011e5870
    [  182.609595] RDX: 0000000000000000 RSI: ffffffff92268cf0 RDI: ffffffff92914d10
    [  182.610283] RBP: ffff99b1011e5870 R08: 0000000000000000 R09: ffff99b101b06c80
    [  182.610847] R10: ffff99b10139a808 R11: fefefefefefefeff R12: 0000000000000000
    [  182.611414] R13: ffffffff90cf74d0 R14: 0000000000000000 R15: ffff99b1011e5800
    [  182.612009] FS:  0000000000000000(0000) GS:ffff99b1eaaee000(0000) knlGS:0000000000000000
    [  182.612670] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [  182.613146] CR2: 00000000005c631c CR3: 00000000013ee000 CR4: 00000000000006f0
    [  182.613722] Call Trace:
    [  182.613946]  <TASK>
    [  182.614130]  __iterate_supers+0x128/0x150
    [  182.614463]  do_thaw_all+0x1b/0x30
    [  182.614759]  process_scheduled_works+0xbb/0x3f0
    [  182.615150]  ? __pfx_worker_thread+0x10/0x10
    [  182.615499]  worker_thread+0x129/0x270
    [  182.615816]  ? __pfx_worker_thread+0x10/0x10
    [  182.616201]  kthread+0xe2/0x120
    [  182.616469]  ? __pfx_kthread+0x10/0x10
    [  182.616792]  ret_from_fork+0x15b/0x240
    [  182.617115]  ? __pfx_kthread+0x10/0x10
    [  182.617426]  ret_from_fork_asm+0x1a/0x30
    [  182.617761]  </TASK>
    [  182.617968] ---[ end trace 0000000000000000 ]---
    [  182.618412] Emergency Thaw complete
    
    Fix this by switching to SUPER_ITER_UNLOCKED and acquiring s_umount
    in the callback via super_lock_excl() before calling
    thaw_super_locked(). This matches the locking pattern expected by
    thaw_super_locked() and eliminates the double unlock.
    
    While at it, remove the dead 'return;' at the end of
    do_thaw_all_callback().
    
    Fixes: 2992476528ae ("super: use a common iterator (Part 1)")
    Cc: stable@vger.kernel.org
    Signed-off-by: Chen Changcheng <chenchangcheng@kylinos.cn>
    Link: https://patch.msgid.link/20260721064140.152305-1-chenchangcheng@kylinos.cn
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Stable-dep-of: 749d7aa0377a ("super: fix emergency thaw deadlock on frozen block devices")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
fs: don't block write during exec on pre-content watched files [+ + +]
Author: Amir Goldstein <amir73il@gmail.com>
Date:   Tue Aug 11 14:56:18 2026 -0400

    fs: don't block write during exec on pre-content watched files
    
    [ Upstream commit 0357ef03c94ef835bd44a0658b8edb672a9dbf51 ]
    
    Commit 2a010c412853 ("fs: don't block i_writecount during exec") removed
    the legacy behavior of getting ETXTBSY on attempt to open and executable
    file for write while it is being executed.
    
    This commit was reverted because an application that depends on this
    legacy behavior was broken by the change.
    
    We need to allow HSM writing into executable files while executed to
    fill their content on-the-fly.
    
    To that end, disable the ETXTBSY legacy behavior for files that are
    watched by pre-content events.
    
    This change is not expected to cause regressions with existing systems
    which do not have any pre-content event listeners.
    
    Signed-off-by: Amir Goldstein <amir73il@gmail.com>
    Acked-by: Christian Brauner <brauner@kernel.org>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Link: https://patch.msgid.link/20241128142532.465176-1-amir73il@gmail.com
    Stable-dep-of: db1856ea9196 ("binfmt_misc: restore write access when removing an entry")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

fs: unlock the superblock during iterate_supers_type [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Wed Jun 11 09:40:44 2025 -0700

    fs: unlock the superblock during iterate_supers_type
    
    commit 0b9d62a47149083d581d8b2abb04124b6175cb29 upstream.
    
    This function takes super_lock in shared mode, so it should release the
    same lock.
    
    Cc: stable@vger.kernel.org # v6.16-rc1
    Fixes: af7551cf13cf7f ("super: remove pointless s_root checks")
    Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
    Link: https://lore.kernel.org/20250611164044.GF6138@frogsfrogsfrogs
    Reviewed-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
fsnotify, lsm: Decouple fsnotify from lsm [+ + +]
Author: Song Liu <song@kernel.org>
Date:   Tue Aug 11 14:56:16 2026 -0400

    fsnotify, lsm: Decouple fsnotify from lsm
    
    [ Upstream commit 1cda52f1b4611f4daa9d89e69d9428fb4137dc3f ]
    
    Currently, fsnotify_open_perm() is called from security_file_open().
    This is a a bit unexpected and creates otherwise unnecessary dependency
    of CONFIG_FANOTIFY_ACCESS_PERMISSIONS on CONFIG_SECURITY. Fix this by
    calling fsnotify_open_perm() directly.
    
    Signed-off-by: Song Liu <song@kernel.org>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Link: https://patch.msgid.link/20241013002248.3984442-1-song@kernel.org
    Stable-dep-of: db1856ea9196 ("binfmt_misc: restore write access when removing an entry")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
fsnotify: opt-in for permission events at file open time [+ + +]
Author: Amir Goldstein <amir73il@gmail.com>
Date:   Tue Aug 11 14:56:17 2026 -0400

    fsnotify: opt-in for permission events at file open time
    
    [ Upstream commit a94204f4d48e28a711b7ed10399f749286c433e3 ]
    
    Legacy inotify/fanotify listeners can add watches for events on inode,
    parent or mount and expect to get events (e.g. FS_MODIFY) on files that
    were already open at the time of setting up the watches.
    
    fanotify permission events are typically used by Anti-malware sofware,
    that is watching the entire mount and it is not common to have more that
    one Anti-malware engine installed on a system.
    
    To reduce the overhead of the fsnotify_file_perm() hooks on every file
    access, relax the semantics of the legacy FAN_ACCESS_PERM event to generate
    events only if there were *any* permission event listeners on the
    filesystem at the time that the file was opened.
    
    The new semantic is implemented by extending the FMODE_NONOTIFY bit into
    two FMODE_NONOTIFY_* bits, that are used to store a mode for which of the
    events types to report.
    
    This is going to apply to the new fanotify pre-content events in order
    to reduce the cost of the new pre-content event vfs hooks.
    
    [Thanks to Bert Karwatzki <spasswolf@web.de> for reporting a bug in this
    code with CONFIG_FANOTIFY_ACCESS_PERMISSIONS disabled]
    
    Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
    Link: https://lore.kernel.org/linux-fsdevel/CAHk-=wj8L=mtcRTi=NECHMGfZQgXOp_uix1YVh04fEmrKaMnXA@mail.gmail.com/
    Signed-off-by: Amir Goldstein <amir73il@gmail.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Link: https://patch.msgid.link/5ea5f8e283d1edb55aa79c35187bfe344056af14.1731684329.git.josef@toxicpanda.com
    Stable-dep-of: db1856ea9196 ("binfmt_misc: restore write access when removing an entry")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ftrace: Fix off-by-one fentry site disable in ftrace_free_mem() [+ + +]
Author: Josh Poimboeuf <jpoimboe@kernel.org>
Date:   Wed Aug 5 21:56:46 2026 -0700

    ftrace: Fix off-by-one fentry site disable in ftrace_free_mem()
    
    commit 8b8292d6487c81bd57c2605a9b404b1cf8f1edfb upstream.
    
    When a module's init text is freed, do_init_module() calls
    ftrace_free_mem() with a half-open [start, end) range.  However the
    ftrace_cmp_recs() comparator treats the upper bound as inclusive, as all
    its other users do, passing 'ip + size - 1'.  So ftrace_free_mem() can
    delete a record sitting exactly at 'end', which is outside the freed
    range.
    
    For a kernel without CFI or IBT, the first record of a function is at
    the function start, which for the first function in a module is also the
    base of its text allocation.  As the module allocator packs its regions,
    that address is often the 'end' passed by a neighboring module's
    do_init_module(), causing the first function's ftrace location to get
    disabled, preventing an attempt to livepatch it:
    
      livepatch: failed to find location for function 'pcspkr_probe'
    
    Convert the exclusive end to the inclusive 'end - 1' the comparator
    expects, and return early for an empty range to avoid the subtraction
    from underflowing when the init text size is zero.
    
    Cc: stable@vger.kernel.org
    Fixes: 42c269c88dc1 ("ftrace: Allow for function tracing to record init functions on boot up")
    Link: https://patch.msgid.link/1b5ccfa8095bdb1277f84af1c2c2e2205aca03ae.1785992188.git.jpoimboe@kernel.org
    Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
    Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ftrace: Protect direct_functions in ftrace_find_rec_direct [+ + +]
Author: Leon Hwang <leon.hwang@linux.dev>
Date:   Thu Jul 30 23:04:08 2026 +0800

    ftrace: Protect direct_functions in ftrace_find_rec_direct
    
    commit 63444b7617c09aeed36282e061c3f80818f2b600 upstream.
    
    Fix accessing the __rcu pointer direct_functions with RCU protection.
    
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260730150411.88667-2-leon.hwang@linux.dev
    Fixes: d05cb470663a ("ftrace: Fix modification of direct_function hash while in use")
    Acked-by: Jiri Olsa <jolsa@kernel.org>
    Suggested-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
gpio: sloppy-logic-analyzer: fix use-after-free via debugfs trigger on unbind [+ + +]
Author: Cengiz Can <cengiz.can@canonical.com>
Date:   Fri Jul 31 01:02:57 2026 +0300

    gpio: sloppy-logic-analyzer: fix use-after-free via debugfs trigger on unbind
    
    commit 44f3468a0aef1aabdad551898ab7cfa2a9d20e99 upstream.
    
    The "trigger" debugfs file has a hand-rolled ->write handler
    (trigger_write()) that dereferences the per-device gpio_la_poll_priv. The
    file is created with debugfs_create_file_unsafe(), and the handler never
    takes a debugfs reference. Nothing keeps the object alive while the
    handler runs.
    
    priv is allocated with devm_kzalloc(). devres frees it when the platform
    device is unbound. debugfs_create_file_unsafe() installs no full_proxy
    wrapper, so debugfs_remove_recursive() in gpio_la_poll_remove() does not
    wait for an in-flight trigger_write(). The blob_lock taken there does not
    help, because trigger_write() never takes it. A write that races an unbind
    therefore writes into freed memory:
    
      trigger_write()                  gpio_la_poll_remove()
        priv = m->private
        buf = memdup_user()  [may sleep]
                                         mutex_lock(&priv->blob_lock)
                                         debugfs_remove_recursive()  [no wait]
                                         mutex_unlock(&priv->blob_lock)
                                       (remove returns; devres frees priv)
        priv->trig_data = buf   <-- use-after-free write
        priv->trig_len  = count
    
    The race is reachable by root via
    /sys/bus/platform/drivers/gpio-sloppy-logic-analyzer/unbind.
    
    Create "trigger" with debugfs_create_file() instead. Its full_proxy
    wrapper makes debugfs_remove_recursive() drain any in-flight ->write
    before it returns.
    
    The use-after-free is confirmed under KASAN with a minimal reproducer of
    the same debugfs_create_file_unsafe() plus devm_kzalloc() pattern
    (available on request); it produces a slab-use-after-free write in the
    handler.
    
    Fixes: 7828b7bbbf20 ("gpio: add sloppy logic analyzer using polling")
    Cc: stable@vger.kernel.org
    Assisted-by: Claude:claude-opus-4.8
    Signed-off-by: Cengiz Can <cengiz.can@canonical.com>
    Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
    Link: https://patch.msgid.link/20260730220258.358169-2-cengiz.can@canonical.com
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ice: fix VF interrupts cleanup [+ + +]
Author: Dawid Osuchowski <dawid.osuchowski@linux.intel.com>
Date:   Tue Aug 11 20:09:25 2026 -0400

    ice: fix VF interrupts cleanup
    
    [ Upstream commit fb096882095e5a8d6b5159e43793d4a38a0c5b1f ]
    
    When a virtual function sends an IRQ map command, the PF will set up
    interrupts according to that request. However, because these interrupts are
    never reset, the next time Virtual Function initializes, the interrupts are
    still enabled for a given VF, which leads to performance degradation in
    certain cases due to interrupts being unexpectedly enabled and thus causing
    interrupt floods.
    
    Cc: stable@vger.kernel.org
    Fixes: 1071a8358a28 ("ice: Implement virtchnl commands for AVF support")
    Suggested-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
    Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
    Signed-off-by: Dawid Osuchowski <dawid.osuchowski@linux.intel.com>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Tested-by: Patryk Holda <patryk.holda@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    [ changed the file path for the `ice_vf_ena_rxq_interrupt` hunk from `ice/virt/queues.c` to `ice_virtchnl.c`, which predates the upstream directory split ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
igc: fix netdev not re-attached after resume if interface is down [+ + +]
Author: Philipp David <pd-lkml@3b.pm>
Date:   Tue Aug 18 13:54:07 2026 +0200

    igc: fix netdev not re-attached after resume if interface is down
    
    [ Upstream commit b0ce5fd9fabe7c79463cf4602217d4dfeff5b1fd ]
    
    __igc_resume() calls netif_device_attach() only inside the
    netif_running() branch, so an interface that was down during suspend
    is never re-attached on resume. It then stays in the not-present state
    that __igc_shutdown() set via netif_device_detach(): ethtool reports
    ENODEV and every attempt to bring the interface up fails the
    netif_device_present() check in __dev_open() with -ENODEV, silently,
    since __igc_resume() returns 0. Only reloading the driver recovers the
    device.
    
    This is easy to hit in practice because NetworkManager brings managed
    interfaces down before sleep unless Wake-on-LAN is configured, making
    the adapter unusable after every suspend/resume cycle with WoL
    disabled.
    
    Re-attach the netdev on every successful resume, as igb and e1000e do.
    
    Fixes: 6f31d6b643a3 ("igc: Refactor runtime power management flow")
    Cc: stable@vger.kernel.org
    Signed-off-by: Philipp David <pd-lkml@3b.pm>
    Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
    Reviewed-by: Dima Ruinskiy <dima.ruinskiy@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Link: https://patch.msgid.link/20260804222205.1580328-11-anthony.l.nguyen@intel.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

igc: remove napi_synchronize() in igc_down() [+ + +]
Author: David Carlier <devnexen@gmail.com>
Date:   Tue Aug 11 07:17:15 2026 -0400

    igc: remove napi_synchronize() in igc_down()
    
    [ Upstream commit 5ffab5b9589c50e4cfc0cf36ffd76c89422d4019 ]
    
    When an AF_XDP zero-copy application is killed abruptly, the XSK pool is
    torn down but NAPI keeps polling. igc_clean_rx_irq_zc() then returns the
    full budget on every poll, so napi_complete_done() never clears
    NAPI_STATE_SCHED.
    
    igc_down() calls napi_synchronize() before napi_disable(), so it spins
    forever waiting for that bit and the interface never goes down. Drop the
    napi_synchronize() and let napi_disable() do the job -- it sets
    NAPI_STATE_DISABLE, which forces the stuck poll to complete. Reorder it
    ahead of igc_set_queue_napi() so the NAPI mapping is cleared only after
    polling has stopped, matching the recent igb fix b1e067240379.
    
    Fixes: fc9df2a0b520 ("igc: Enable RX via AF_XDP zero-copy")
    Suggested-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: David Carlier <devnexen@gmail.com>
    Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
    Reviewed-by: Dima Ruinskiy <dima.ruinskiy@intel.com>
    Tested-by: Moriya Kadosh <moriyax.kadosh@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
include/linux/fs.h: add inode_lock_killable() [+ + +]
Author: Max Kellermann <max.kellermann@ionos.com>
Date:   Tue Aug 11 20:09:31 2026 -0400

    include/linux/fs.h: add inode_lock_killable()
    
    [ Upstream commit d8c5507cd140d9471472ece673e70250b957c595 ]
    
    Prepare for making inode operations killable while they're waiting for
    the lock.
    
    Signed-off-by: Max Kellermann <max.kellermann@ionos.com>
    Link: https://lore.kernel.org/20250513150327.1373061-1-max.kellermann@ionos.com
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: fa724e235cfd ("cifs: add fscache_resize_cookie() to cifs_setsize()")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
Input: atkbd - skip deactivate for Xiaomi Book Pro 14's internal keyboard [+ + +]
Author: Zhefu Zhang <a723356@gmail.com>
Date:   Sun Aug 2 15:36:54 2026 -0700

    Input: atkbd - skip deactivate for Xiaomi Book Pro 14's internal keyboard
    
    commit 3a046db33bb9f28b43a951a7a090db771dc0f8b3 upstream.
    
    The internal keyboard of the Xiaomi Book Pro 14 does not work unless
    atkbd skips deactivating it at the end of atkbd_probe().
    
    Using 'i8042.dumbkbd=1' also makes the keyboard work, but then the driver
    never writes to the keyboard at all, so the Caps Lock LED is lost. The
    atkbd_deactivate_fixup quirk fixes both without a boot parameter.
    
    DMI: XIAOMI Xiaomi Book Pro 14/TM2424, BIOS XMAPT4B0P0909 05/06/2026
    
    Signed-off-by: Zhefu Zhang <a723356@gmail.com>
    Reviewed-by: Andrew Zhou <zhoulol888@gmail.com>
    Link: https://patch.msgid.link/20260802031559.19701-1-a723356@gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: cs40l50-vibra - validate custom data from user space [+ + +]
Author: HyeongJun An <sammiee5311@gmail.com>
Date:   Sat Jul 18 16:40:32 2026 +0900

    Input: cs40l50-vibra - validate custom data from user space
    
    commit 7d5c576cb1c86047b1fcb1aa9532e17fc5e46c1d upstream.
    
    cs40l50_add() copies the custom data of an FF_PERIODIC/FF_CUSTOM effect
    straight from the ff_effect the user passed to EVIOCSFF, without
    requiring it to hold anything:
    
        work_data.custom_data = memdup_array_user(periodic->custom_data,
                                                  periodic->custom_len,
                                                  sizeof(s16));
        work_data.custom_len = periodic->custom_len;
    
    The driver then reads two words out of that buffer: custom_data[0] as the
    waveform bank in cs40l50_effect_bank_set(), and custom_data[1] as the
    index within the bank in cs40l50_effect_index_set().  Neither read is
    covered by a length check, and custom_len is fully user controlled:
    
      - custom_len == 0 makes memdup_array_user() call memdup_user() with a
        length of zero, which returns ZERO_SIZE_PTR rather than an error, so
        custom_data[0] dereferences it.
    
      - custom_len == 1 allocates two bytes.  A bank of ROM or RAM keeps
        effect->type out of the OWT case, and custom_data[1] is then read one
        word past the allocation.
    
    The bank value itself is also mishandled.  It is masked with
    CS40L50_CUSTOM_DATA_MASK (0xffff) but stored in an s16, so a
    custom_data[0] of 0x8000 or above wraps to a negative value that passes
    the "bank_type >= CS40L50_WVFRM_BANK_NUM" test.
    cs40l50_effect_index_set() indexes vib->dsp.banks[] with it before the
    switch statement's default case gets a chance to reject it:
    
        base_index = vib->dsp.banks[effect->type].base_index;
        max_index = vib->dsp.banks[effect->type].max_index;
    
    Require the two words the driver reads to be present, and hold the masked
    bank in a u32 so the existing upper-bound test covers the whole range.
    The da7280 haptic driver already range checks custom_len this way.
    
    Fixes: c38fe1bb5d21 ("Input: cs40l50 - Add support for the CS40L50 haptic driver")
    Cc: stable@vger.kernel.org
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
    Link: https://patch.msgid.link/20260718074032.1864861-1-sammiee5311@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: focaltech - fix array out-of-bounds in focaltech_process_rel_packet [+ + +]
Author: Richard Davies <richard@arachsys.com>
Date:   Sun Aug 2 17:53:10 2026 -0700

    Input: focaltech - fix array out-of-bounds in focaltech_process_rel_packet
    
    commit 296736076b3fd078742651c719555a488624023a upstream.
    
    Make finger2 (and also finger1) unsigned, so that if the finger index in
    the packet is 0 then subtracting 1 creates an array index which overflows
    above the existing check for FOC_MAX_FINGERS, as the existing comment says
    it should, instead of writing to state->fingers[-1].
    
    Fixes: 05be1d079ec0 ("Input: psmouse - support for the FocalTech PS/2 protocol extensions")
    Signed-off-by: Richard Davies <richard@arachsys.com>
    Link: https://patch.msgid.link/20260701190932.14960-1-richard@arachsys.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: hynitron_cstxxx - validate touch count and finger IDs [+ + +]
Author: Jianing Li <m13940358460@163.com>
Date:   Mon Aug 3 21:18:52 2026 -0700

    Input: hynitron_cstxxx - validate touch count and finger IDs
    
    commit 27f380ef0e1d3de3cde114e02d33f9320ce3a5a6 upstream.
    
    The driver allocates max_touch_num input slots, which are indexed from
    zero through max_touch_num - 1. The current check allows a finger ID
    equal to max_touch_num to reach cst3xx_report_contact(). While the input
    core ignores out-of-range slot indices, reporting touch data without a
    valid slot change corrupts the touch state of the previously active slot.
    
    The touch count is read from the controller's report and is used to
    index the fixed-size report buffer without first checking its range.
    Reject counts larger than the supported number of touch slots before
    checking the trailing byte or parsing touch data.
    
    Reject finger IDs equal to or greater than max_touch_num, and return
    immediately when an invalid finger ID is encountered so that corrupt
    touch frames are discarded instead of reporting partial contact state.
    
    The V821 Avaota F1 board configures the vendor driver with one touch
    slot, so finger ID 1 is already invalid on that device.
    
    Fixes: 66603243f528 ("Input: add driver for Hynitron cstxxx touchscreens")
    Signed-off-by: Jianing Li <m13940358460@163.com>
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260804031339.2379-1-m13940358460@163.com
    Assisted-by: Antigravity:gemini-3.6-flash
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: iforce - validate input packet lengths [+ + +]
Author: Pengpeng Hou <pengpeng@iscas.ac.cn>
Date:   Fri Jul 24 20:46:27 2026 -0700

    Input: iforce - validate input packet lengths
    
    commit 5751c781d3c97ab6ce0e2a966156ed882152c415 upstream.
    
    iforce_process_packet() reads fixed fields from joystick, wheel and
    status packets without first checking their lengths. In particular, the
    shared hats-and-buttons helper unconditionally reads data[6]. The status
    tail is a sequence of 16-bit effect addresses, but an incomplete final
    address is also consumed. A successful zero-length USB URB additionally
    reads the packet ID before the common parser is called.
    
    Reject the zero-length USB transfer, require the seven-byte joystick and
    wheel prefixes and the two-byte status prefix, and consume only complete
    status-tail addresses.
    
    Signed-off-by: Pengpeng Hou <pengpeng@iscas.ac.cn>
    Link: https://patch.msgid.link/20260720115018.75045-1-pengpeng@iscas.ac.cn
    Cc: stable@vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: psxpad-spi - set driver data before use [+ + +]
Author: Linmao Li <lilinmao@kylinos.cn>
Date:   Fri Jul 24 18:42:06 2026 -0700

    Input: psxpad-spi - set driver data before use
    
    commit 732f38c36059e68ba3b4b89c56911d777fd3185c upstream.
    
    psxpad_spi_suspend() retrieves the controller state with
    spi_get_drvdata(), but probe never stores it, so suspend dereferences a
    NULL pointer. Store it during probe.
    
    Fixes: 8be193c7b1f4 ("Input: add support for PlayStation 1/2 joypads connected via SPI")
    Signed-off-by: Linmao Li <lilinmao@kylinos.cn>
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260721055551.1714965-1-lilinmao@kylinos.cn
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: sur40 - fix input device registration ordering [+ + +]
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Mon Jun 15 22:12:29 2026 -0700

    Input: sur40 - fix input device registration ordering
    
    commit 9da976eb649c9e2f588a4499410e4d8af687925f upstream.
    
    In sur40_probe(), input_register_device() was previously called early before
    the V4L2 video device and vb2_queue components were fully initialized. If
    userspace opened the input device immediately upon registration, sur40_open()
    would trigger and start the sur40_poll() worker thread. This worker thread
    invokes sur40_process_video() and accesses the uninitialized vb2_queue
    structure, leading to a data race and potential system crash.
    
    Furthermore, if V4L2 or video registration failed after input_register_device()
    succeeded, the error path fell through to calling input_free_device() on a
    successfully registered device instead of input_unregister_device(), corrupting
    input core state.
    
    Move input_register_device() to the very end of sur40_probe(). This ensures
    the V4L2 and video queue structures are fully initialized before polling can
    start, and naturally resolves the error path bug since input_free_device()
    is now only called when input registration has not yet occurred.
    
    To maintain strict LIFO (Last-In, First-Out) teardown ordering, also move
    input_unregister_device() to the very beginning of sur40_disconnect(). This
    guarantees that the input polling worker thread is stopped before V4L2
    video components or control handlers are unregistered.
    
    Reported-by: sashiko-bot@kernel.org
    Cc: stable@vger.kernel.org
    Assisted-by: Antigravity:gemini-3.5-flash
    Link: https://patch.msgid.link/20260616051235.1549517-1-dmitry.torokhov@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: sur40 - fix V4L error path cleanup [+ + +]
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Mon Jun 15 22:12:30 2026 -0700

    Input: sur40 - fix V4L error path cleanup
    
    commit 062dc4693e2c10d77de06f61e6f3faf37c0a8383 upstream.
    
    In sur40_probe(), if video_register_device() fails, the error path jumps to
    err_unreg_video. This incorrectly attempts to unregister a video device
    that was never successfully registered, and fails to free the V4L2 control
    handler (v4l2_ctrl_handler_free) that was initialized immediately prior.
    
    Fix this by introducing an err_free_ctrl label to properly free the V4L2
    control handler and bypass video_unregister_device() when video device
    registration fails.
    
    Reported-by: sashiko-bot@kernel.org
    Cc: stable@vger.kernel.org
    Assisted-by: Antigravity:gemini-3.5-flash
    Link: https://patch.msgid.link/20260616051235.1549517-2-dmitry.torokhov@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: synaptics-rmi4 - block s_input when F54 queue is busy [+ + +]
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Thu Jun 25 22:17:54 2026 -0700

    Input: synaptics-rmi4 - block s_input when F54 queue is busy
    
    commit fbfd76746adc16d64be29ff113f673b70bc3f5c2 upstream.
    
    Changing the input (diagnostic report type) mid-stream changes the
    report size. Since V4L2 buffers are allocated based on the size at
    stream start, changing the input while streaming could lead to a
    heap buffer overflow if the new size is larger than the allocated
    buffers.
    
    Prevent this by blocking VIDIOC_S_INPUT with -EBUSY if the V4L2 queue
    is busy (streaming).
    
    Fixes: 3a762dbd5347 ("[media] Input: synaptics-rmi4 - add support for F54 diagnostics")
    Cc: stable@vger.kernel.org
    Assisted-by: Antigravity:gemini-3.5-flash
    Reviewed-by: Hans Verkuil <hverkuil+cisco@kernel.org>
    Link: https://patch.msgid.link/20260626051802.4033172-5-dmitry.torokhov@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: synaptics-rmi4 - bound the F54 report size to the allocated buffer [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
Date:   Thu Jun 25 22:17:52 2026 -0700

    Input: synaptics-rmi4 - bound the F54 report size to the allocated buffer
    
    commit 49c5adc2b7d6e43c5cf033e1c86fdb9c16ababb1 upstream.
    
    rmi_f54_work() reads a diagnostics report from the device into
    f54->report_data, sizing the transfer with rmi_f54_get_report_size():
    
            report_size = rmi_f54_get_report_size(f54);
            ...
            for (i = 0; i < report_size; i += F54_REPORT_DATA_SIZE) {
                    int size = min(F54_REPORT_DATA_SIZE, report_size - i);
                    ...
                    rmi_read_block(.., f54->report_data + i, size);
            }
    
    report_data is allocated once at probe from F54's own electrode counts
    (array3_size(f54->num_tx_electrodes, f54->num_rx_electrodes, sizeof(u16))),
    but rmi_f54_get_report_size() computes the size from
    drv_data->num_*_electrodes when those are set, i.e. from the F55
    function's electrode counts. Both counts come straight from device
    queries (F54 and F55 each report up to 255 electrodes) and nothing
    constrains the F55 counts to the F54 ones.
    
    A malicious or malfunctioning RMI4 device that reports larger F55
    electrode counts than its F54 counts makes report_size exceed the
    allocation, so the read loop writes past report_data (and the V4L2
    dequeue memcpy() then reads past it). On conforming hardware the F55
    configured electrodes are a subset of the F54 physical electrodes, so
    report_size never exceeds the buffer and well-behaved devices are
    unaffected.
    
    Record the allocation size and reject a report that does not fit,
    mirroring the existing zero-size check.
    
    Fixes: c762cc68b6a1 ("Input: synaptics-rmi4 - propagate correct number of rx and tx electrodes to F54")
    Cc: stable@vger.kernel.org
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Assisted-by: Antigravity:gemini-3.5-flash
    Link: https://patch.msgid.link/20260626051802.4033172-3-dmitry.torokhov@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: synaptics-rmi4 - fix F55 transmitter electrode count typo [+ + +]
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Thu Jun 25 22:17:50 2026 -0700

    Input: synaptics-rmi4 - fix F55 transmitter electrode count typo
    
    commit 6058f0fea10f3caf63a435677358d1b8e9325114 upstream.
    
    During F55 sensor detection, the transmitter (TX) electrode count was
    incorrectly assigned the value of the receiver (RX) electrode count
    due to copy-paste typos.
    
    This incorrect value was then propagated to the driver data and used
    by F54 to determine the diagnostics report size. On devices with more
    RX than TX electrodes, this inflated the perceived TX count, leading
    to incorrect report size calculations and potential out-of-bounds
    buffer accesses.
    
    Fix the typos by correctly assigning the TX electrode counts.
    
    Fixes: 6adba43fd222 ("Input: synaptics-rmi4 - add support for F55 sensor tuning")
    Fixes: c762cc68b6a1 ("Input: synaptics-rmi4 - propagate correct number of rx and tx electrodes to F54")
    Reported-by: sashiko-bot@kernel.org
    Cc: stable@vger.kernel.org
    Assisted-by: Antigravity:gemini-3.5-flash
    Link: https://patch.msgid.link/20260626051802.4033172-1-dmitry.torokhov@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: synaptics-rmi4 - propagate F54 worker errors to V4L2 queue [+ + +]
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Thu Jun 25 22:17:55 2026 -0700

    Input: synaptics-rmi4 - propagate F54 worker errors to V4L2 queue
    
    commit 8786d74bf50e6797b6f655eb381ef6b25451161f upstream.
    
    Previously, rmi_f54_buffer_queue() waited for the worker thread to
    finish but ignored whether it succeeded. If the worker failed (e.g.,
    due to a timeout or register read failure), the queue thread would
    silently return success, delivering stale or uninitialized memory to
    userspace.
    
    Add a 'report_error' field to struct f54_data to store the worker's exit
    status. Check this field in rmi_f54_buffer_queue() after the worker
    finishes, and mark the buffer as VB2_BUF_STATE_ERROR if an error
    occurred.
    
    Fixes: 3a762dbd5347 ("[media] Input: synaptics-rmi4 - add support for F54 diagnostics")
    Reported-by: sashiko-bot@kernel.org
    Cc: stable@vger.kernel.org
    Assisted-by: Antigravity:gemini-3.5-flash
    Link: https://patch.msgid.link/20260626051802.4033172-6-dmitry.torokhov@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: synaptics-rmi4 - zero report size on F54 work error [+ + +]
Author: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date:   Thu Jun 25 22:17:51 2026 -0700

    Input: synaptics-rmi4 - zero report size on F54 work error
    
    commit dc76c3c8e8ad09362b8c1561f3928288c15cba2e upstream.
    
    In rmi_f54_work(), if an error occurs during report request or command
    verification, the code jumped directly to the 'error' label, bypassing
    the 'abort' label where f54->report_size was normally zeroed out.
    
    This left f54->report_size containing its previous successful payload
    size. If a user then altered the V4L2 format to a smaller size, and a
    subsequent run failed, rmi_f54_buffer_queue() would copy the stale,
    larger payload size into the shrunken V4L2 buffer, causing a heap
    buffer overflow.
    
    Fix this by merging the 'abort' and 'error' labels into a single 'out'
    exit path, and ensuring that f54->report_size is always set to 0 on
    failure by checking for error and zeroing the local report_size first.
    
    Fixes: 3a762dbd5347 ("[media] Input: synaptics-rmi4 - add support for F54 diagnostics")
    Cc: stable@vger.kernel.org
    Reported-by: sashiko-bot@kernel.org
    Assisted-by: Antigravity:gemini-3.5-flash
    Link: https://patch.msgid.link/20260626051802.4033172-2-dmitry.torokhov@gmail.com
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Input: xpad - add support for ZENAIM LEVERLESS [+ + +]
Author: Kyohei Kadota <lufia@lufia.org>
Date:   Thu Jul 23 19:55:57 2026 +0900

    Input: xpad - add support for ZENAIM LEVERLESS
    
    commit 7d971337ebfad0b173cb46097c709db174ac3557 upstream.
    
    Add the VID/PID for the ZENAIM LEVERLESS controller to xpad_device and
    the VID to xpad_table.
    
    Signed-off-by: KADOTA, Kyohei <lufia@lufia.org>
    Link: https://patch.msgid.link/CAFMepckDUuOHiDDVVhUYc-UqJMeCqrWSfCuxbJ2x2sGgdDD4nw@mail.gmail.com
    Cc: stable@vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
iommufd: Fix wrong hwpt passed to iommufd_auto_response_faults on replace [+ + +]
Author: Peiyang He <peiyang_he@smail.nju.edu.cn>
Date:   Sun Aug 9 09:54:07 2026 -0400

    iommufd: Fix wrong hwpt passed to iommufd_auto_response_faults on replace
    
    [ Upstream commit ba5c0f28a26e7d9be1e0997f8920dd638e2782fd ]
    
    iommufd_hwpt_replace_device() calls:
    
            iommufd_auto_response_faults(hwpt, old_handle);
    
    passing the *new* hwpt together with the handle of
    the device's *old* domain. This should be a parameter mismatch:
    
    1. Semantically, iommufd_auto_response_faults(x, handle) scans
       x->fault's deliver list and response xarray for groups matching
       "handle". A group is queued under the hwpt that was attached at
       fault-delivery time. old_handle is fetched *before* the domain switch,
       so its group lives on old->fault, not on the new hwpt->fault.
    
    2. Historically, the first argument was "old". The routine was
       introduced by commit b7d8833677ba ("iommufd: Fault-capable hwpt
       attach/detach/replace") as __fault_domain_replace_dev() in
       fault.c, correctly calling iommufd_auto_response_faults(old, curr).
       Commit fb21b1568ada ("iommufd: Make attach_handle generic than
       fault specific") moved this into iommufd_hwpt_replace_device() in
       device.c and swapped it to "hwpt". This should be a refactor regression,
       not an intentional change.
    
    Fix this by passing "old" instead.
    
    Link: https://patch.msgid.link/r/9D652384339C69D5+20260710122952.885325-1-peiyang_he@smail.nju.edu.cn
    Fixes: fb21b1568ada ("iommufd: Make attach_handle generic than fault specific")
    Cc: stable@vger.kernel.org
    Signed-off-by: Peiyang He <peiyang_he@smail.nju.edu.cn>
    Reviewed-by: Kevin Tian <kevin.tian@intel.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ip_tunnel: adapt iptunnel_xmit_stats() to NETDEV_PCPU_STAT_DSTATS [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Wed Mar 11 12:31:10 2026 +0000

    ip_tunnel: adapt iptunnel_xmit_stats() to NETDEV_PCPU_STAT_DSTATS
    
    commit 8431c602f551549f082bbfa67f3003f2d8e3e132 upstream.
    
    Blamed commits forgot that vxlan/geneve use udp_tunnel[6]_xmit_skb() which
    call iptunnel_xmit_stats().
    
    iptunnel_xmit_stats() was assuming tunnels were only using
    NETDEV_PCPU_STAT_TSTATS.
    
    @syncp offset in pcpu_sw_netstats and pcpu_dstats is different.
    
    32bit kernels would either have corruptions or freezes if the syncp
    sequence was overwritten.
    
    This patch also moves pcpu_stat_type closer to dev->{t,d}stats to avoid
    a potential cache line miss since iptunnel_xmit_stats() needs to read it.
    
    Fixes: 6fa6de302246 ("geneve: Handle stats using NETDEV_PCPU_STAT_DSTATS.")
    Fixes: be226352e8dc ("vxlan: Handle stats using NETDEV_PCPU_STAT_DSTATS.")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Guillaume Nault <gnault@redhat.com>
    Link: https://patch.msgid.link/20260311123110.1471930-1-edumazet@google.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ipvlan: inherit needed_headroom and needed_tailroom from phy_dev [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Thu Aug 6 10:38:57 2026 +0000

    ipvlan: inherit needed_headroom and needed_tailroom from phy_dev
    
    [ Upstream commit e16e960d55a40d36bd7c2494cc005e757dc9a1ef ]
    
    ipvlan devices inherit hard_header_len from phy_dev during ipvlan_init(),
    but leave needed_headroom and needed_tailroom set to 0.
    
    When the underlying phy_dev (or stacked lower device) requires extra headroom
    or tailroom for headers/trailers (e.g. macsec, ipsec, wireguard, tunnels, or
    veth with rx headroom), upper layers calculating packet headroom and tailroom
    fail to reserve sufficient space.
    
    This can result in reallocation overhead, skb headroom underflows, or KASAN
    slab-use-after-free crashes when dev_hard_header() / ipvlan_hard_header()
    prepends header data or when lower devices append tailroom.
    
    Fix this by:
    1. Inheriting needed_headroom and needed_tailroom from phy_dev in ipvlan_init().
    2. Propagating needed_headroom and needed_tailroom updates to attached ipvlans
       in ipvlan_device_event() when receiving NETDEV_FEAT_CHANGE events.
    
    Fixes: 2ad7bf363841 ("ipvlan: Initial check-in of the IPVLAN driver.")
    Reported-by: syzbot+1f9fd0f4b601cf88d6e6@syzkaller.appspotmail.com
    Closes: https://lore.kernel.org/netdev/6a720a21.40259c87.584f4.04bb.GAE@google.com/T/#u
    Reported-by: Tangxin Xie <xietangxin@h-partners.com>
    Closes: https://lore.kernel.org/netdev/CANn89i+1EW-sFNK8xoq98gMbPCeLS7e=+rs9gHfLg5Wj+4x0sw@mail.gmail.com/T/#mcc6307f115e500df23ea2980d5669fe95f20b6b4
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Hangbin Liu <liuhangbin@kylinos.cn>
    Link: https://patch.msgid.link/20260806103857.115541-1-edumazet@google.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ipvs: separate destination availability state [+ + +]
Author: Yizhou Zhao <zhaoyz24@mails.tsinghua.edu.cn>
Date:   Tue Aug 18 23:16:38 2026 +0300

    ipvs: separate destination availability state
    
    commit cdcc4e46180df8161f4d2f3c6fd6beaf6990133d upstream.
    
    IPVS configuration paths update destination availability while connection
    accounting updates destination overload state. The two independent states
    share dest->flags, so their read-modify-write updates can race and lose one
    another.
    
    Keep OVERLOAD in flags, where the preceding patch serializes its updates
    with dst_lock, and move AVAILABLE to cflags. This keeps configuration-
    controlled availability out of the scheduler hot cacheline until a
    scheduler needs to check it. It also prevents availability updates from
    clobbering overload state.
    
    The destination status bits are not exposed through the IPVS sockopt or
    netlink interfaces, so keep their definitions in the internal IPVS header.
    
    Readers can still observe stale destination state; this does not provide a
    cross-field snapshot.
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org
    Reported-by: Yizhou Zhao <zhaoyz24@mails.tsinghua.edu.cn>
    Reported-by: Yuxiang Yang <yangyx22@mails.tsinghua.edu.cn>
    Reported-by: Ao Wang <wangao@seu.edu.cn>
    Reported-by: Xuewei Feng <fengxw06@126.com>
    Reported-by: Qi Li <qli01@tsinghua.edu.cn>
    Reported-by: Ke Xu <xuke@tsinghua.edu.cn>
    Link: https://lore.kernel.org/all/8913381c-1e02-35c7-0ec4-61de5a12fd35@ssi.bg/
    Assisted-by: Claude-Code:GLM-5.2
    Suggested-by: Julian Anastasov <ja@ssi.bg>
    Signed-off-by: Yizhou Zhao <zhaoyz24@mails.tsinghua.edu.cn>
    Acked-by: Julian Anastasov <ja@ssi.bg>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    (cherry picked from commit cdcc4e46180df8161f4d2f3c6fd6beaf6990133d)
    [ Julian: Backport by removing the hunks from ip_vs_xmit.c ]
    Signed-off-by: Julian Anastasov <ja@ssi.bg>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
ksmbd: conn lock to serialize smb2 negotiate [+ + +]
Author: Namjae Jeon <linkinjeon@kernel.org>
Date:   Tue Aug 11 07:17:37 2026 -0400

    ksmbd: conn lock to serialize smb2 negotiate
    
    [ Upstream commit fe4ed2f09b492e3507615a053814daa8fafdecb1 ]
    
    If client send parallel smb2 negotiate request on same connection,
    ksmbd_conn can be racy. smb2 negotiate handling that are not
    performance-related can be serialized with conn lock.
    
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Stable-dep-of: cb469993b3a6 ("ksmbd: reject repeated SMB2 NEGOTIATE requests")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ksmbd: reject repeated SMB2 NEGOTIATE requests [+ + +]
Author: Namjae Jeon <linkinjeon@kernel.org>
Date:   Tue Aug 11 07:17:38 2026 -0400

    ksmbd: reject repeated SMB2 NEGOTIATE requests
    
    [ Upstream commit cb469993b3a61a72653770856d37af616d72d05f ]
    
    Unauthenticated client can send multiple successful SMB2 NEGOTIATE
    requests on one connection before SESSION_SETUP. While the connection is
    in KSMBD_SESS_NEED_SETUP, smb2_handle_negotiate() accepts another
    SMB3.1.1 NEGOTIATE and overwrites conn->preauth_info with a new allocation.
    Only the final allocation is freed when the connection is released, leaking
    one object for every additional successful request.
    
    A repeated SMB2 NEGOTIATE after a dialect has been selected is a protocol
    violation. MS-SMB2 section 3.3.5.4 requires the server to disconnect
    without replying in this case. Set the connection exiting when rejecting
    the request, in addition to suppressing the response.
    
    Reject SMB2 NEGOTIATE unless the connection is new or is waiting for the
    SMB2 NEGOTIATE that follows an SMB1 multi-protocol negotiate. Serialize
    both SMB1 and SMB2 negotiation paths under conn->srv_mutex, since they
    update connection-wide dialect and negotiation state.
    
    Move the locking contract to ksmbd_smb_negotiate_common(), where the state
    and dialect are selected, and add ksmbd_conn_new() for consistent state
    access.
    
    Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
    Cc: stable@vger.kernel.org
    Reported-by: Runa Takemoto <takemotoruna223@gmail.com>
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ksmbd: rename smb2_get_msg to smb_get_msg [+ + +]
Author: Namjae Jeon <linkinjeon@kernel.org>
Date:   Sat Aug 8 20:48:08 2026 -0400

    ksmbd: rename smb2_get_msg to smb_get_msg
    
    [ Upstream commit 0b444cfd8b74ebce421ccd96eac9c495e536c92e ]
    
    With the removal of the RFC1002 length field from the SMB header,
    smb2_get_msg is now used to get the smb1 request from the request buffer.
    Since this function is no longer exclusive to smb2 and now supports smb1
    as well, This patch rename it to smb_get_msg to better reflect its usage.
    
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Stable-dep-of: cfc0b8e5080a ("ksmbd: validate minimum PDU size for transform requests")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ksmbd: validate minimum PDU size for transform requests [+ + +]
Author: Namjae Jeon <linkinjeon@kernel.org>
Date:   Sat Aug 8 20:48:11 2026 -0400

    ksmbd: validate minimum PDU size for transform requests
    
    [ Upstream commit cfc0b8e5080aec87700774e8568765eaa4b7b92b ]
    
    The receive path applies the minimum SMB2 PDU size check only when
    ProtocolId is SMB2_PROTO_NUMBER. A packet carrying
    SMB2_TRANSFORM_PROTO_NUM bypasses the check even when the negotiated
    dialect does not provide transform handling.
    
    On an SMB 2.1 connection, a short transform packet therefore reaches
    init_smb2_rsp_hdr(), which interprets the request as a full SMB2 header
    and reads beyond the request allocation. The copied fields can then be
    returned to the unauthenticated client.
    
    Compression transforms are converted to ordinary SMB2 messages before
    protocol validation. After that conversion, validate ordinary SMB2
    requests against SMB2_MIN_SUPPORTED_PDU_SIZE and require encryption
    transform requests to contain both a transform header and an SMB2
    header. This rejects truncated requests before work allocation.
    
    Fixes: 368ba06881c3 ("ksmbd: check the validation of pdu_size in ksmbd_conn_handler_loop")
    Cc: stable@vger.kernel.org
    Reported-by: zdi-disclosures@trendmicro.com # ZDI-CAN-31063
    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
KVM: SVM: Ensure PSP module is initialized if KVM module is built-in [+ + +]
Author: Sean Christopherson <seanjc@google.com>
Date:   Mon Feb 10 22:54:02 2025 +0000

    KVM: SVM: Ensure PSP module is initialized if KVM module is built-in
    
    [ Upstream commit 44e70718df4fc2fadf1665eb9374df71aeda1f03 ]
    
    The kernel's initcall infrastructure lacks the ability to express
    dependencies between initcalls, whereas the modules infrastructure
    automatically handles dependencies via symbol loading.  Ensure the
    PSP SEV driver is initialized before proceeding in sev_hardware_setup()
    if KVM is built-in as the dependency isn't handled by the initcall
    infrastructure.
    
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
    Message-ID: <f78ddb64087df27e7bcb1ae0ab53f55aa0804fab.1739226950.git.ashish.kalra@amd.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

KVM: SVM: Serialize accesses to the owner and mirror list with separate lock [+ + +]
Author: Paolo Bonzini <pbonzini@redhat.com>
Date:   Wed Aug 19 07:13:52 2026 -0400

    KVM: SVM: Serialize accesses to the owner and mirror list with separate lock
    
    [ Upstream commit 1d78d33275ef2a16c6d080910b291d0a97a0e613 ]
    
    Interaction between KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM and
    KVM_CAP_VM_COPY_ENC_CONTEXT_FROM can cause two separate issues:
    
    - in sev_migrate_from(), when the destination KVM is a mirror, the mirror
      entry is moved from the source's list to the owner's mirror_vms list,
      without holding the owner's lock unlike other writers of the owner's
      mirror list (sev_vm_copy_enc_context_from(), sev_vm_destroy()).
      A concurrent COPY or destroy can race with sev_migrate_from() and
      corrupt the list.
    
    - In sev_vm_destroy(), the *owner* is still active and could receive
      concurrently a KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM that causes
      sev->enc_context_owner to change.  In this case the incorrect VM
      receives kvm_put_kvm().
    
    The second issue needs particular care because the owner could disappear
    altogether (even though the race window is impossibly small) between
    reading it and locking it.  There is thus no way to perform the checks
    under the owner lock without putting struct kvm under SLAB_TYPESAFE_BY_RCU
    (which would allow kvm_get_kvm_safe() under RCU critical section).
    
    It is much simpler to just use a global lock, since the critical
    sections are so small and the new lock is always a leaf lock.
    
    Fixes: b2125513dfc0 ("KVM: SEV: Allow SEV intra-host migration of VM with mirrors")
    Cc: stable@vger.kernel.org
    Reported-by: Shen Yongchao <grayhat@foxmail.com>
    Link: https://lore.kernel.org/kvm/tencent_625C0F42824E542C72B34733392AF2C49709@qq.com/
    Link: https://lore.kernel.org/kvm/tencent_DDC4E4352EC91CAC05A9A8F4E55E8C96730A@qq.com/
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

KVM: x86: Cancel delayed I/O APIC EOI handling before destroying vCPUs [+ + +]
Author: Weiming Shi <bestswngs@gmail.com>
Date:   Mon Aug 10 19:51:08 2026 -0400

    KVM: x86: Cancel delayed I/O APIC EOI handling before destroying vCPUs
    
    [ Upstream commit 9910e835580fef3bef53b70241dd00c4bffad693 ]
    
    Cancel (and flush) the I/O APIC's delayed EOI handling work during the
    "pre VM destroy" phase, before vCPUs are destroyed, as processing the EOI
    broadcast will inject another IRQ if the line is asserted, i.e. will try
    to deliver an IRQ to the target vCPU(s).  Canceling the work after vCPUs
    are destroyed leads to UAF if the delayed work is processed after vCPUs are
    destroyed.
    
      BUG: KASAN: slab-use-after-free in __kvm_irq_delivery_to_apic_fast+0x9bf/0xa20 arch/x86/kvm/lapic.c:1250
      Read of size 8 at addr ffff8880499abea0 by task kworker/1:2/1218
    
      CPU: 1 UID: 0 PID: 1218 Comm: kworker/1:2 Not tainted 7.1.0-rc7 #5 PREEMPT(lazy)
      Hardware name: QEMU Ubuntu 25.10 PC v2 (i440FX + PIIX, + 10.1 machine, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
      Workqueue: events kvm_ioapic_eoi_inject_work
      Call Trace:
       <TASK>
       __dump_stack lib/dump_stack.c:94
       dump_stack_lvl+0x100/0x190 lib/dump_stack.c:120
       print_address_description mm/kasan/report.c:378
       print_report+0x139/0x4ad mm/kasan/report.c:482
       kasan_report+0xe4/0x1d0 mm/kasan/report.c:595
       __kvm_irq_delivery_to_apic_fast+0x9bf/0xa20 arch/x86/kvm/lapic.c:1250
       __kvm_irq_delivery_to_apic+0xd8/0xbf0 arch/x86/kvm/lapic.c:1345
       kvm_irq_delivery_to_apic arch/x86/kvm/lapic.h:129
       ioapic_service+0x308/0x590 arch/x86/kvm/ioapic.c:492
       kvm_ioapic_eoi_inject_work+0x13c/0x190 arch/x86/kvm/ioapic.c:532
       process_one_work+0xa59/0x19a0 kernel/workqueue.c:3314
       process_scheduled_works kernel/workqueue.c:3397
       worker_thread+0x5eb/0xe50 kernel/workqueue.c:3478
       kthread+0x370/0x450 kernel/kthread.c:436
       ret_from_fork+0x72b/0xd30 arch/x86/kernel/process.c:158
       ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
       </TASK>
    
    Note, the VM is unreachable once kvm_destroy_vm() starts, and scheduling
    new work via kvm_ioapic_send_eoi() can only be done via KVM_RUN, i.e.
    requires a live vCPU.
    
    Alternatively, KVM could simply destroy the I/O APIC during the "pre" phase
    of VM destruction, but that gets more than a bit sketchy as KVM expects the
    I/O APIC to exist if ioapic_in_kernel() is true, and nested virtualization
    in particular has a bad habit of touching VM-scope state during vCPU
    destruction.  E.g. attempting to free the PIC during the pre phase would
    lead to a NULL pointer dereference in kvm_cpu_has_extint(), and it's not
    hard to imagine the I/O APIC having a similar flaw.
    
    Fixes: 17bcd7144263 ("KVM: x86: Free vCPUs before freeing VM state")
    Reported-by: <zdi-disclosures@trendmicro.com>
    Reported-by: Zhong Wang <wangzhong.c0ss4ck@bytedance.com>
    Reported-by: Xuanqing Shi <shixuanqing.11@bytedance.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Weiming Shi <bestswngs@gmail.com>
    Co-developed-by: Sean Christopherson <seanjc@google.com>
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-ID: <20260727171718.543491-1-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
libceph: Amend checking to fix `make W=1` build breakage [+ + +]
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Fri Aug 7 18:16:06 2026 -0400

    libceph: Amend checking to fix `make W=1` build breakage
    
    [ Upstream commit 04d8712b079327409b09dee628378f9583e2e035 ]
    
    In a few cases the code compares 32-bit value to a SIZE_MAX derived
    constant which is much higher than that value on 64-bit platforms,
    Clang, in particular, is not happy about this
    
    net/ceph/osdmap.c:1441:10: error: result of comparison of constant 4611686018427387891 with expression of type 'u32' (aka 'unsigned int') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
     1441 |         if (len > (SIZE_MAX - sizeof(*pg)) / sizeof(u32))
          |             ~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    net/ceph/osdmap.c:1624:10: error: result of comparison of constant 2305843009213693945 with expression of type 'u32' (aka 'unsigned int') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
     1624 |         if (len > (SIZE_MAX - sizeof(*pg)) / (2 * sizeof(u32)))
          |             ~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    Fix this by casting to size_t. Note, that possible replacement of SIZE_MAX
    by U32_MAX may lead to the behaviour changes on the corner cases.
    
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Stable-dep-of: 9f00f9cf2be2 ("libceph: bound pg_{temp,upmap,upmap_items} length to CEPH_PG_MAX_SIZE")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

libceph: Avoid using invalid osd indices from primary_temp [+ + +]
Author: Raphael Zimmer <raphael.zimmer@tu-ilmenau.de>
Date:   Tue Jul 28 10:43:40 2026 +0200

    libceph: Avoid using invalid osd indices from primary_temp
    
    commit 3660b98d1204b419f6a77e9a295f148dcf38d042 upstream.
    
    A corrupted osdmap received from a Ceph monitor or OSD may contain osd
    indices in its pg_temp, primary_temp, pg_upmap, and pg_upmap_items parts
    that don't exist, i.e., that are greater than max_osd or smaller than
    CEPH_HOMELESS_OSD (-1). These indices are used to create the up and
    acting set in ceph_pg_to_up_acting_osds(), called from calc_target().
    While most of these osd indices are checked, the one from primary_temp
    is not. Subsequently, this may lead to calc_target() returning this
    (potentially invalid) index as target osd for a (linger) request.
    Because the osd_state, osd_weight, and osd_addr arrays only contain
    max_osd entries (with indices 0 to max_osd -1), this leads to
    out-of-bounds accesses when trying to read values from these arrays.
    
    This patch fixes the issue by adding a check to get_temp_osds(), so that
    only valid osd indices from primary_temp are used, and it falls back to
    using the primary from pg_temp or the up set if it is invalid.
    
    [ idryomov: changelog ]
    
    Cc: stable@vger.kernel.org
    Fixes: 5e8d4d36bf23 ("libceph: add support for primary_temp mappings")
    Signed-off-by: Raphael Zimmer <raphael.zimmer@tu-ilmenau.de>
    Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

libceph: bound pg_{temp,upmap,upmap_items} length to CEPH_PG_MAX_SIZE [+ + +]
Author: Xiang Mei <xmei5@asu.edu>
Date:   Fri Aug 7 18:16:07 2026 -0400

    libceph: bound pg_{temp,upmap,upmap_items} length to CEPH_PG_MAX_SIZE
    
    [ Upstream commit 9f00f9cf2be293efe899db67dc5272e3a9c62717 ]
    
    __decode_pg_temp() decodes an user-controlled length but only rejects
    values large enough to overflow the allocation; it does not bound it to
    CEPH_PG_MAX_SIZE. The helper backs both pg_temp and pg_upmap decoding, and
    apply_upmap()/get_temp_osds() later copy the decoded list into the fixed-size
    on-stack array struct ceph_osds.osds[CEPH_PG_MAX_SIZE]. A monitor that sends
    an OSDMap with a pg_temp/pg_upmap entry longer than 32 thus causes a stack
    out-of-bounds write.
    
    An OSD set for a single PG can never exceed CEPH_PG_MAX_SIZE, so reject longer
    entries at decode time. The bound is well below the old overflow threshold, so
    it also covers the allocation-size overflow the previous check guarded against.
    
      BUG: KASAN: stack-out-of-bounds in ceph_pg_to_up_acting_osds
      Write of size 4 ... by task exploit
       kasan_report (mm/kasan/report.c:595)
       ceph_pg_to_up_acting_osds (net/ceph/osdmap.c:2617 net/ceph/osdmap.c:2833)
       calc_target (net/ceph/osd_client.c:1638)
       __submit_request (net/ceph/osd_client.c:2394)
       ceph_osdc_start_request (net/ceph/osd_client.c:2490)
       ceph_osdc_call (net/ceph/osd_client.c:5164)
       rbd_dev_image_probe (drivers/block/rbd.c:6899)
       do_rbd_add (drivers/block/rbd.c:7138)
       ...
      kernel BUG at net/ceph/osdmap.c:2670!
    
    [ idryomov: do the same in __decode_pg_upmap_items() ]
    
    Cc: stable@vger.kernel.org
    Fixes: a303bb0e5834 ("libceph: introduce and switch to decode_pg_mapping()")
    Reported-by: Weiming Shi <bestswngs@gmail.com>
    Assisted-by: Claude:claude-opus-4-8
    Signed-off-by: Xiang Mei <xmei5@asu.edu>
    Reviewed-by: Alex Markuze <amarkuze@redhat.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

libceph: fix multiple unsafe decodes in decode_locker() [+ + +]
Author: Pavitra Jha <jhapavitra98@gmail.com>
Date:   Tue Jun 2 01:02:19 2026 -0400

    libceph: fix multiple unsafe decodes in decode_locker()
    
    commit 437b6551cfcc235eea1d735a874f9d421f555e17 upstream.
    
    decode_locker() in cls_lock_client.c contains three unsafe decode
    operations that allow a malicious or compromised OSD to trigger
    slab-out-of-bounds reads:
    
    1. ceph_decode_copy() at the locker_id_t name field has no preceding
       bounds check. With p == end after ceph_start_decoding() accepts
       struct_len=0, this reads sizeof(ceph_entity_name) = 9 bytes past
       the validated buffer boundary.
    
    2. *p += sizeof(struct ceph_timespec) after the locker_info_t header
       is an unchecked pointer advance. A malicious OSD can position p
       past end, causing all subsequent _safe checks to pass against a
       bogus boundary.
    
    3. len = ceph_decode_32(p) has no preceding bounds check, and the
       immediately following *p += len is uncapped. A malicious OSD can
       send len=0xffffffff, advancing p gigabytes past end and escaping
       the decode window entirely.
    
    Fix all three by replacing bare operations with their safe variants:
      ceph_decode_copy   -> ceph_decode_copy_safe
      *p += sizeof(...)  -> ceph_decode_skip_n
      ceph_decode_32(p)  -> ceph_decode_32_safe
      *p += len          -> ceph_decode_skip_n
    
    A new label is added to return -EINVAL on any bounds violation.
    -EINVAL is appropriate here: the data received from the OSD
    is structurally malformed, which is an invalid argument to the decode
    contract regardless of whether the caller or the wire is at fault.
    
    Attacker model: a malicious or compromised OSD in a multi-tenant Ceph
    deployment can trigger this against any kernel client that issues the
    lock.get_info class method (e.g. during RBD exclusive lock acquisition)
    without any further privileges beyond OSD session establishment.
    
    [ idryomov: use ceph_decode_skip_string() to skip description, trim
      changelog ]
    
    Cc: stable@vger.kernel.org
    Fixes: d4ed4a530562 ("libceph: support for lock.lock_info")
    Signed-off-by: Pavitra Jha <jhapavitra98@gmail.com>
    Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

libceph: fix two unsafe bare decodes in decode_lockers() [+ + +]
Author: Pavitra Jha <jhapavitra98@gmail.com>
Date:   Sat Aug 8 07:12:44 2026 -0400

    libceph: fix two unsafe bare decodes in decode_lockers()
    
    [ Upstream commit a109a556115271ca7896dcda7b4b7e45e156c227 ]
    
    decode_lockers() in cls_lock_client.c contains two bare decode operations
    that allow a malicious or compromised OSD to trigger slab-out-of-bounds
    reads:
    
    1. ceph_decode_32(p) at the num_lockers field has no preceding bounds
       check. ceph_start_decoding() accepts struct_len=0 as valid -- the
       internal ceph_decode_need(p, end, 0, bad) always passes -- so when an
       OSD sends struct_len=0, ceph_start_decoding() returns success with
       p == end. The immediately following bare ceph_decode_32(p) then reads
       4 bytes past the validated buffer boundary. The garbage value is
       passed directly to kzalloc_objs() as the locker count.
    
       The sibling function decode_watchers() in osd_client.c already uses
       ceph_decode_32_safe() after its own ceph_start_decoding() call.
       decode_lockers() was the only site using the bare variant.
    
    2. ceph_decode_8(p) after the decode_locker() loop has no preceding
       bounds check. If an OSD crafts num_lockers such that the loop
       advances p exactly to end, the subsequent bare ceph_decode_8(p) reads
       one byte past the validated buffer boundary. The result is passed
       directly into *type, which is used as a lock type discriminator by
       callers, giving an OSD-controlled one-byte OOB read with direct
       influence over the lock type field.
    
    Fix both by replacing bare operations with their safe variants:
      ceph_decode_32(p) -> ceph_decode_32_safe(p, end, *num_lockers,
                                               err_inval)
      ceph_decode_8(p)  -> ceph_decode_8_safe(p, end, *type,
                                              err_free_lockers)
    
    The goto targets differ intentionally:
      err_inval: is a new label returning -EINVAL directly. It is used for
      the pre-allocation failure path where *lockers is not yet allocated
      and must not be passed to ceph_free_lockers().
    
      err_free_lockers: is the existing label. It is used for the
      post-allocation failure path where *lockers is allocated and must
      be freed.
    
    ret is set to -EINVAL before ceph_decode_8_safe() so that
    err_free_lockers returns the correct error code on bounds violation.
    Without this, err_free_lockers would return a stale ret value (0 from
    the successful decode_locker() loop), silently swallowing the error.
    
    -EINVAL is correct for both failure paths. The data received from the
    OSD is structurally malformed. -ENOMEM would misrepresent the failure
    class to callers and to stable@ backporters triaging error paths.
    
    Attacker model: a malicious or compromised OSD in a multi-tenant Ceph
    deployment can trigger this against any kernel client that issues the
    lock.get_info class method (e.g. during RBD exclusive lock acquisition).
    
    [ idryomov: trim changelog, formatting ]
    
    Cc: stable@vger.kernel.org
    Fixes: d4ed4a530562 ("libceph: support for lock.lock_info")
    Signed-off-by: Pavitra Jha <jhapavitra98@gmail.com>
    Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

libceph: tolerate addrvecs with multiple entries of the same type [+ + +]
Author: Kefu Chai <k.chai@proxmox.com>
Date:   Thu Jun 11 19:32:51 2026 +0800

    libceph: tolerate addrvecs with multiple entries of the same type
    
    commit 5a87925539acecfe88229bad76ab81bd75a7e3f5 upstream.
    
    ceph_decode_entity_addrvec() rejects any addrvec containing more than
    one entry that matches the requested msgr type (LEGACY or MSGR2),
    logging "another match of type N in addrvec" and returning -EINVAL.
    
    Some admin tooling (e.g. pveceph mon create from Proxmox VE) generates
    addrvecs with multiple same-type entries when public_network lists more
    than one CIDR: it picks one local IP per subnet and emits both a v2 and
    a v1 entry for each IP.  Monmaps shaped this way cause:
    
      libceph: mon0 (1)10.10.10.15:6789 session established
      libceph: another match of type 1 in addrvec
      libceph: problem decoding monmap, -22
    
    No Ceph code uses the extra entries: since Nautilus, the userspace
    messenger (AsyncMessenger) unconditionally picks the first address of
    the requested type and ignores any subsequent matches.
    
    Match that behavior: use the first matching entry and silently skip any
    subsequent ones.  This is a compatibility fix for existing deployments
    and does not enable dual-stack or multi-subnet address selection.
    
    [ idryomov: tweak ceph_decode_entity_addrvec() comment ]
    
    Cc: stable@vger.kernel.org
    Fixes: a5cbd5fc22d5 ("libceph, ceph: get and handle cluster maps with addrvecs")
    Link: https://bugzilla.proxmox.com/show_bug.cgi?id=7518
    Signed-off-by: Kefu Chai <k.chai@proxmox.com>
    Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
Linux: Linux 6.12.105 [+ + +]
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Sun Aug 23 14:22:52 2026 +0200

    Linux 6.12.105
    
    Link: https://lore.kernel.org/r/20260820145223.480031205@linuxfoundation.org
    Tested-by: Pavel Machek (CIP) <pavel@nabladev.com>
    Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
    Tested-by: Brett A C Sheffield <bacs@librecast.net>
    Tested-by: Salvatore Bonaccorso <carnil@debian.org>
    Tested-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
    Tested-by: Miguel Ojeda <ojeda@kernel.org>
    Tested-by: Francesco Dolcini <francesco.dolcini@toradex.com>
    Tested-by: Peter Schneider <pschneider1968@googlemail.com>
    Tested-by: Shuah Khan <skhan@linuxfoundation.org>
    Tested-by: Ron Economos <re@w6rz.net>
    Tested-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
m68k: Define NR_CPUS to 1 [+ + +]
Author: Uwe Kleine-König <ukleinek@kernel.org>
Date:   Fri Jul 31 11:49:49 2026 +0200

    m68k: Define NR_CPUS to 1
    
    [ Upstream commit 1fd495ef09eef96169a379a749c24b5e69974bb8 ]
    
    This fixes a Kconfig warning
    
            fs/erofs/Kconfig:137:warning: range is invalid
    
    which originates from EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS using
    NR_CPUS which up to now didn't exist for ARCH=m68k.  All other
    architectures define this symbol, so fix the outlier.
    
    [geert] This also fixes:
      - CONFIG_EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS being set to the
        literal NR_CPUS instead of a number by automatic configs like
        "make allmodconfig" or "make olddefconfig",
      - An infinite loop in manual configs like "make oldconfig" when
        CONFIG_EROFS_FS_ZIP_LZMA_DEFAULT_MAX_STREAMS is not present or
        has an invalid value in your existing .config.
    
    Fixes: c9b47e6b2311 ("erofs: cap LZMA stream pool size")
    Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
    Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Link: https://patch.msgid.link/20260731094950.1988084-2-ukleinek@kernel.org
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
macvlan: inherit needed_headroom and needed_tailroom from lowerdev [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Thu Aug 6 14:19:38 2026 +0000

    macvlan: inherit needed_headroom and needed_tailroom from lowerdev
    
    [ Upstream commit cef51860becd9700217c81732ca1eb1ea6ed6fe1 ]
    
    macvlan devices inherit hard_header_len from lowerdev during macvlan_init(),
    but leave needed_headroom and needed_tailroom set to 0.
    
    When the underlying lowerdev requires extra headroom or tailroom for
    headers/trailers (e.g. macsec, ipsec, wireguard, tunnels, or veth with rx
    headroom), upper layers calculating packet headroom and tailroom fail to
    reserve sufficient space.
    
    This can result in reallocation overhead, skb headroom underflows, or KASAN
    slab-use-after-free crashes when dev_hard_header() / macvlan_hard_header()
    prepends header data or when lower devices append tailroom.
    
    Fix this by:
    1. Inheriting needed_headroom and needed_tailroom from lowerdev in macvlan_init().
    2. Propagating needed_headroom and needed_tailroom updates to attached macvlans
       in macvlan_device_event() when receiving NETDEV_FEAT_CHANGE events.
    
    Fixes: b863ceb7ddce ("[NET]: Add macvlan driver")
    Reported-by: Tangxin Xie <xietangxin@h-partners.com>
    Closes: https://lore.kernel.org/netdev/CANn89i+1EW-sFNK8xoq98gMbPCeLS7e=+rs9gHfLg5Wj+4x0sw@mail.gmail.com/T/#m16adf0ff972cbfd8066c3a8e656e75eaeb12d021
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reviewed-by: Hangbin Liu <liuhangbin@kylinos.cn>
    Link: https://patch.msgid.link/20260806141938.287660-1-edumazet@google.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
mm/damon/ops-common: putback folios on invalid migrate nid [+ + +]
Author: liyouhong <liyouhong@kylinos.cn>
Date:   Mon Aug 17 23:25:18 2026 -0700

    mm/damon/ops-common: putback folios on invalid migrate nid
    
    [ Upstream commit 5deb65c34e682e7c5f5df417a70e223e8fcc5f5a ]
    
    damon_pa_migrate() and damos_va_migrate() isolate folios into a local list
    and then call damon_migrate_pages().  When target_nid is invalid
    (including the scheme default NUMA_NO_NODE / -1), damon_migrate_pages()
    returns early without putting the folios back to the LRU.
    
    Callers then discard the list head while those folios remain isolated with
    an extra reference taken by folio_isolate_lru().  The pages stay off the
    LRU for as long as the mapping exists (anon active+inactive counts drop
    while RSS does not), and the leftover references can pin the pages after
    the mapping is gone.
    
    Put the folios back on the invalid-nid path so ignored migration requests
    still return them to the LRU.
    
    Link: https://lore.kernel.org/20260726014815.1280757-1-dayou5941@163.com
    Fixes: 7e6c3130690a ("mm/damon/ops-common: ignore migration request to invalid nodes")
    Assisted-by: Cursor:grok-4.5
    Reviewed-by: SJ Park <sj@kernel.org>
    Signed-off-by: liyouhong <liyouhong@kylinos.cn>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: SJ Park <sj@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
mm/damon: adjust isolated pages stat for DAMOS_MIGRATE_{HOT,COLD} [+ + +]
Author: SJ Park <sj@kernel.org>
Date:   Mon Aug 17 23:30:39 2026 -0700

    mm/damon: adjust isolated pages stat for DAMOS_MIGRATE_{HOT,COLD}
    
    [ Upstream commit 1ec0e6b6f7321feb769f50d2f094a0aa6c2eda63 ]
    
    Callers of migrate_pages() should adjust NR_MIGRATED_{ANON,FILE} for
    isolations and putback of the folios.  That for migration succeeded folios
    is done by migrate_pages(), in migrate_folio_done().  That for MR_DEMOTION
    reason is an exception though.
    
    DAMOS_MIGRATE_{HOT,COLD} call migrate_pages() but mistakenly not doing the
    stat adjustment.  As a result, use of DAMOS_MIGRATE_{HOT,COLD} could
    corrupt the stat.  It could confuse too_many_isolated(), make compaction
    and reclaim to behave in unexpected ways.  The stat corruption can be
    reproduced and confirmed using DAMON user-space tool [1] on NUMA systems,
    like below.
    
        $ numactl --hardware
        available: 2 nodes (0-1)
        [...]
        $ sudo ./damo start --damos_action migrate_hot 1
        $ sudo cat /proc/sys/vm/stat_refresh
        $ sudo dmesg
        [...]
        [   80.215554] vmstat_refresh: nr_isolated_anon -5578
        [   80.216842] vmstat_refresh: nr_isolated_file -34400
    
    This issue was discovered [2] by Sashiko.
    
    Link: https://lore.kernel.org/20260728140404.94476-1-sj@kernel.org
    Link: https://github.com/damonitor/damo [1]
    Link: https://lore.kernel.org/20260726164356.87940-1-sj@kernel.org [2]
    Fixes: b51820ebea65 ("mm/damon/paddr: introduce DAMOS_MIGRATE_COLD action for demotion")
    Signed-off-by: SJ Park <sj@kernel.org>
    Cc: Honggyu Kim <honggyu.kim@sk.com>
    Cc: Hyeongtak Ji <hyeongtak.ji@sk.com>
    Cc: <stable@vger.kernel.org> # 6.11.x
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: SJ Park <sj@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
mm/khugepaged: guard is_zero_pfn() calls with pte_present() [+ + +]
Author: Lance Yang <lance.yang@linux.dev>
Date:   Fri Aug 7 22:52:29 2026 -0400

    mm/khugepaged: guard is_zero_pfn() calls with pte_present()
    
    [ Upstream commit 074f027d15c10cb376b3ad88405b8e512fa5b3a8 ]
    
    A non-present entry, like a swap PTE, contains completely different data
    (swap type and offset).  pte_pfn() doesn't know this, so if we feed it a
    non-present entry, it will spit out a junk PFN.
    
    What if that junk PFN happens to match the zeropage's PFN by sheer chance?
    While really unlikely, this would be really bad if it did.
    
    So, let's fix this potential bug by ensuring all calls to is_zero_pfn() in
    khugepaged.c are properly guarded by a pte_present() check.
    
    Link: https://lkml.kernel.org/r/20251020151111.53561-1-lance.yang@linux.dev
    Signed-off-by: Lance Yang <lance.yang@linux.dev>
    Suggested-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
    Reviewed-by: Nico Pache <npache@redhat.com>
    Reviewed-by: Dev Jain <dev.jain@arm.com>
    Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
    Reviewed-by: Wei Yang <richard.weiyang@gmail.com>
    Acked-by: David Hildenbrand <david@redhat.com>
    Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
    Cc: Liam Howlett <liam.howlett@oracle.com>
    Cc: Ryan Roberts <ryan.roberts@arm.com>
    Cc: Wei Yang <richard.weiyang@gmail.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Stable-dep-of: 3c58f641e813 ("userfaultfd: prevent registration of special VMAs")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mm/pagewalk: split walk_page_range_novma() into kernel/user parts [+ + +]
Author: Lorenzo Stoakes <ljs@kernel.org>
Date:   Tue Aug 18 15:30:36 2026 -0400

    mm/pagewalk: split walk_page_range_novma() into kernel/user parts
    
    [ Upstream commit 96d81e4766f9e88b66a0502b5a7f34a4c20ac754 ]
    
    walk_page_range_novma() is rather confusing - it supports two modes, one
    used often, the other used only for debugging.
    
    The first mode is the common case of traversal of kernel page tables,
    which is what nearly all callers use this for.
    
    Secondly it provides an unusual debugging interface that allows for the
    traversal of page tables in a userland range of memory even for that
    memory which is not described by a VMA.
    
    It is far from certain that such page tables should even exist, but
    perhaps this is precisely why it is useful as a debugging mechanism.
    
    As a result, this is utilised by ptdump only.  Historically, things were
    reversed - ptdump was the only user, and other parts of the kernel evolved
    to use the kernel page table walking here.
    
    Since we have some complicated and confusing locking rules for the novma
    case, it makes sense to separate the two usages into their own functions.
    
    Doing this also provide self-documentation as to the intent of the caller
    - are they doing something rather unusual or are they simply doing a
    standard kernel page table walk?
    
    We therefore establish two separate functions - walk_page_range_debug()
    for this single usage, and walk_kernel_page_table_range() for general
    kernel page table walking.
    
    The walk_page_range_debug() function is currently used to traverse both
    userland and kernel mappings, so we maintain this and in the case of
    kernel mappings being traversed, we have walk_page_range_debug() invoke
    walk_kernel_page_table_range() internally.
    
    We additionally make walk_page_range_debug() internal to mm.
    
    Link: https://lkml.kernel.org/r/20250605135104.90720-1-lorenzo.stoakes@oracle.com
    Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
    Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
    Acked-by: Qi Zheng <zhengqi.arch@bytedance.com>
    Reviewed-by: Oscar Salvador <osalvador@suse.de>
    Reviewed-by: Suren Baghdasaryan <surenb@google.com>
    Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
    Acked-by: David Hildenbrand <david@redhat.com>
    Cc: Albert Ou <aou@eecs.berkeley.edu>
    Cc: Alexandre Ghiti <alex@ghiti.fr>
    Cc: Barry Song <baohua@kernel.org>
    Cc: Huacai Chen <chenhuacai@kernel.org>
    Cc: Jann Horn <jannh@google.com>
    Cc: Jonas Bonn <jonas@southpole.se>
    Cc: Liam Howlett <liam.howlett@oracle.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Palmer Dabbelt <palmer@dabbelt.com>
    Cc: Paul Walmsley <paul.walmsley@sifive.com>
    Cc: Stafford Horne <shorne@gmail.com>
    Cc: Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
    Cc: WANG Xuerui <kernel@xen0n.name>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Stable-dep-of: 27c32e553834 ("mm/ptdump: always stabilise against page table freeing using init_mm")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mm/ptdump: always stabilise against page table freeing using init_mm [+ + +]
Author: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Date:   Tue Aug 18 15:30:38 2026 -0400

    mm/ptdump: always stabilise against page table freeing using init_mm
    
    [ Upstream commit 27c32e5538344b13c1505a08861e04620c125d47 ]
    
    Previous commits have established the invariant that kernel page table
    freeing is performed while an mmap read lock on init_mm is held, which
    fixes races between ptdump and kernel page table freeing over init_mm.
    
    However, x86 and arm64 can perform a ptdump over an mm other than init_mm
    via ptdump_walk_pgd() and since kernel memory ranges are shared across
    non-kernel mm's, this means that the race still exists for these cases.
    
    Fix this by acquiring a nested mmap write lock for init_mm in
    ptdump_walk_pgd().
    
    This is safe as we take this after mmap write locking the mm, and nothing
    acquires the init_mm lock first before locking an arbitrary mm, so no
    deadlock is possible.
    
    Also update walk_page_range_debug() to assert that init_mm is write
    locked, add a comment explaining why and remove some redundant code, and
    eliminate the unnecessary and confusing invocation of
    walk_kernel_page_table_range().
    
    We can safely remove the non-NULL check for walk.mm, as the mmap lock
    asserts would NULL pointer deref if it was (and of course no callers do
    this).
    
    The first point at which ptdump can race kernel page table freeing is
    commit b6bdb7517c3d ("mm/vmalloc: add interfaces to free unmapped page
    table"), so we target this in the Fixes tag.
    
    Link: https://lore.kernel.org/20260723-series-vmap-race-fix-v6-4-8cc77dcc0018@kernel.org
    Fixes: b6bdb7517c3d ("mm/vmalloc: add interfaces to free unmapped page table")
    Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
    Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
    Acked-by: David Hildenbrand (Arm) <david@kernel.org>
    Reviewed-by: Kiryl Shutsemau <kas@kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: "Borah, Chaitanya Kumar" <chaitanya.kumar.borah@intel.com>
    Cc: "Borislav Petkov (AMD)" <bp@alien8.de>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: David Carlier <devnexen@gmail.com>
    Cc: Dev Jain <dev.jain@arm.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Liam R. Howlett <liam@infradead.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ryan Roberts <ryan.roberts@arm.com>
    Cc: Shakeel Butt <shakeel.butt@linux.dev>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Toshi Kani <toshi.kani@hpe.com>
    Cc: "Uladzislau Rezki (Sony)" <urezki@gmail.com>
    Cc: Vlastimil Babka <vbabka@kernel.org>
    Cc: Will Deacon <will@kernel.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mm/vmalloc: acquire init_mm lock on huge vmap to avoid ptdump UAF [+ + +]
Author: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Date:   Tue Aug 18 15:30:37 2026 -0400

    mm/vmalloc: acquire init_mm lock on huge vmap to avoid ptdump UAF
    
    [ Upstream commit 26444eb71465c9934d9d418ef69c43f61185329b ]
    
    Patch series "mm: fix UAF caused by race between ptdump and vmap pgtable
    freeing", v6.
    
    Kernel page table walkers fall into two broad categories - those ranges
    where no exclusion is required via walk_kernel_page_table_range_lockless()
    and those where exclusion is required via walk_kernel_page_table_range()
    or walk_page_range_debug().
    
    The former category is used only by arm64 arch code operating on ranges it
    both wholly owns and does not concurrently write.
    
    The latter category consists of kernel page table walkers operating on
    ranges that are wholly owned (but which need exclusion against concurrent
    writers).
    
    The lock used for exclusion is the mmap lock, and for kernel ranges this
    is the mmap lock on init_mm.
    
    ptdump is a special case being both the only user of
    walk_page_range_debug(), and the only case in which it walks ranges it
    does not own.
    
    This presents a problem, as page tables may be freed under ptdump.  And
    indeed there is a use-after-free bug in the kernel as a result, which this
    series addresses.
    
    vmap promotes page tables to huge leaf entries where possible, freeing the
    lower page table when it does.  It does this with no meaningful locks held
    against concurrent ptdump walks.
    
    As a result, use-after-free can currently occur.  This series addresses
    the issue by having the vmap huge promotion logic acquire the mmap read
    lock while both setting the huge page table entry and freeing the prior
    leaf page table.
    
    The ptdump code already acquires the mmap write lock, so by doing so we
    ensure that the ptdump walker only ever observes either the huge page
    table entry or the existing page table entry, and nothing is freed
    underneath it.
    
    A mitigation for this issue was already applied for arm64 in commit
    fa93b45fd397 ("arm64: Enable vmalloc-huge with ptdump"), which this series
    has to deal with carefully.
    
    This mitigation resolves the issue by acquiring the mmap read lock on
    init_mm on vmap page table free if a ptdump is in progress.
    
    However the fix in this series would cause a deadlock if we were to simply
    apply it for arm64 without also reverting the change.
    
    This is because vmap may acquire the read lock before ptdump attempts to
    acquire the write lock, which then gets queued, and rwsem starvation rules
    mean that the (unacknowledged) nested mmap read lock in the arm64 code
    would also block, meaning the original read lock is never released and
    thus deadlock.
    
    This series works around this by #ifndef CONFIG_ARM64'ing the mmap read
    lock in vmap logic, then partially reverting commit fa93b45fd397 ("arm64:
    Enable vmalloc-huge with ptdump"), keeping the enablement of huge vmap
    support, and removing the ifdeffery with the partial revert patch.
    
    There are related issues that are also addressed in this series:
    
    * x86 page attribute logic, specifically Change Page Attributes (CPA),
      implements a feature whereby huge ranges can be collapsed into huge leaf
      entries. This can similarly cause a UAF when done in parallel with a
      ptdump walk, so similarly acquire the init_mm mmap lock to avoid this.
    
    * The CPA logic allows concurrent page table manipulation and CPA
      collapse, meaning the former risks accessing a page table the latter
      frees. Fix this by acquiring mmap write lock on init_mm across the
      whole CPA collapse operation and read lock on the page table
      manipulation.
    
    * x86 and arm64 permit walks of non-kernel mm's (both allowing efi mm
      walks, and in x86's case arbitrary mm's), so we ensure kernel mappings
      remain stable by locking the init_mm as well as the mm being walked.
    
    The ordering of patches is established for both strict dependencies (the
    arm64 partial revert in particular has to be done after the vmap changes)
    and logical ones (the non-kernel mm fix only makes sense once the vmap/CPA
    fixes are in place).
    
    This patch (of 3):
    
    Currently there is a nasty race between ptdump and vmap when attempting to
    map a huge P4D, PUD or PMD entry:
    
    * ptdump walks kernel page table ranges it doesn't own.
    
    * When vmap maps ranges it tries to promotes existing ones to huge page
      tables in vmap_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_debug(), vmap takes no relevant locks at all.
    
    Fix this by holding the mmap read lock in vmap_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 vmap making forward
    progress.  This is fine because it's an optimisation in any case, and thus
    the vmap 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.
    
    One wrinkle here is commit fa93b45fd397 ("arm64: Enable vmalloc-huge with
    ptdump"), which addresses the issue for arm64 only by explicitly acquiring
    the mmap read lock on kernel page table freeing should a concurrent ptdump
    be in progress.
    
    This is problematic as vmap may acquire the mmap read lock prior to ptdump
    attempting to acquire an mmap write lock, leading to a deadlock when the
    mmap read lock is slept upon on page table freeing due to rwsem
    anti-starvation.
    
    We work around this by predicating the mmap lock being taken on
    !CONFIG_ARM64 for the time being.
    
    With this patch applied, a follow up will partially revert commit
    fa93b45fd397 ("arm64: Enable vmalloc-huge with ptdump") and at that stage
    remove the arm64 ifdeffery.
    
    We also update walk_page_range_debug() to assert the mmap write lock
    unconditionally and update the comment here to reflect this change.
    
    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.
    
    We also define a guard class for mmap_read_trylock() so we can use
    cleanup.h to make the scope handling cleaner in the implementation.
    
    This patch is based on work by David Carlier (linked), with gratitude!
    
    Link: https://lore.kernel.org/20260723-series-vmap-race-fix-v6-0-8cc77dcc0018@kernel.org
    Link: https://lore.kernel.org/20260723-series-vmap-race-fix-v6-1-8cc77dcc0018@kernel.org
    Fixes: b6bdb7517c3d ("mm/vmalloc: add interfaces to free unmapped page table")
    Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
    Reported-by: syzbot+fd95a72470f5a44e464c@syzkaller.appspotmail.com
    Closes: https://lore.kernel.org/all/6a287988.39669fcc.33b062.00a0.GAE@google.com/T/
    Link: https://lore.kernel.org/linux-mm/20260706203128.162335-1-devnexen@gmail.com/
    Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
    Reviewed-by: Dev Jain <dev.jain@arm.com>
    Acked-by: David Hildenbrand (Arm) <david@kernel.org>
    Reviewed-by: Kiryl Shutsemau <kas@kernel.org>
    Cc: <stable@vger.kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: "Borah, Chaitanya Kumar" <chaitanya.kumar.borah@intel.com>
    Cc: "Borislav Petkov (AMD)" <bp@alien8.de>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Liam R. Howlett <liam@infradead.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ryan Roberts <ryan.roberts@arm.com>
    Cc: Shakeel Butt <shakeel.butt@linux.dev>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Toshi Kani <toshi.kani@hpe.com>
    Cc: "Uladzislau Rezki (Sony)" <urezki@gmail.com>
    Cc: Vlastimil Babka <vbabka@kernel.org>
    Cc: Will Deacon <will@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Stable-dep-of: 27c32e553834 ("mm/ptdump: always stabilise against page table freeing using init_mm")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mmc: atmel-mci: Fix use-after-free in atmci_remove due to race condition [+ + +]
Author: Pei Xiao <xiaopei01@kylinos.cn>
Date:   Mon Aug 3 17:48:21 2026 +0800

    mmc: atmel-mci: Fix use-after-free in atmci_remove due to race condition
    
    commit c125ee35a49a0518521b52b27631eef061b8719a upstream.
    
    In atmci_probe, &host->bh_work is bound with atmci_work_func, and
    atmci_interrupt, atmci_timeout_timer and atmci_dma_complete can all
    queue this work on system_bh_wq.
    
    If we remove the module, atmci_remove makes cleanup and the memory
    allocated for host with devm_kzalloc() is released after the remove
    callback returns, while the work mentioned above may still be pending
    or running. The sequence of operations that may lead to a UAF bug is
    as follows:
    
    CPU0                                      CPU1
    
                                              | atmci_interrupt
                                              | queue_work(system_bh_wq,
                                              |            &host->bh_work)
    atmci_remove                              |
    atmci_cleanup_slot(...)                   |
    atmci_writel(host, ATMCI_IDR, ~0UL)       |
    timer_delete_sync(&host->timer)           |
    dma_release_channel(host->dma.chan)       |
    free_irq(platform_get_irq(pdev, 0), host) |
                                              | atmci_work_func
                                              | // use host
    // devm resources released after          |
    // remove returns, host is freed          |
                                              | // use host (use-after-free)
    
    Fix it by canceling the work after all the sources that can schedule
    it (IRQ handler, timeout timer and DMA completion callback) have been
    stopped, and before proceeding with the remaining cleanup in
    atmci_remove.
    
    Fixes: 7d2be0749a59 ("atmel-mci: Driver for Atmel on-chip MMC controllers")
    Assisted-by: Codex:deepseek-v4-flash
    Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
    Cc: stable@vger.kernel.org
    Signed-off-by: Ulf Hansson <ulfh@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

mmc: omap_hsmmc: fix busy_timeout overflow in ns conversion on 32-bit [+ + +]
Author: Zhan Xusheng <zhanxusheng1024@gmail.com>
Date:   Tue Aug 4 10:25:00 2026 +0800

    mmc: omap_hsmmc: fix busy_timeout overflow in ns conversion on 32-bit
    
    commit f64ea900e4bda3055ef24a2c906f8d049cf1c3bd upstream.
    
    omap_hsmmc_prepare_data() converts the command busy timeout to nanoseconds
    with:
    
            timeout = req->cmd->busy_timeout * NSEC_PER_MSEC;
    
    busy_timeout is an unsigned int (milliseconds) and timeout is a u64, but
    NSEC_PER_MSEC is 1000000L.  On 32-bit builds the multiplication is
    performed in 32-bit arithmetic and wraps for busy_timeout values above
    ~4294 ms, before the result is assigned to the u64.
    
    The driver does not set mmc->max_busy_timeout, so the core does not cap the
    busy timeout, and commands such as erase or SANITIZE (MMC_SANITIZE_TIMEOUT_MS
    is 240000 ms) can pass a busy_timeout far larger than 4294 ms.  The wrapped,
    much smaller ns value is then programmed via set_data_timeout(), so the data
    timeout is set too short and the operation can time out prematurely.
    
    Cast busy_timeout to u64 before the multiplication so the conversion is done
    in 64-bit arithmetic.
    
    Fixes: 8cc9a3e73de1 ("mmc: host: omap_hsmmc: use generic_cmd6_time to program timeout value for CMD6")
    Cc: stable@vger.kernel.org
    Signed-off-by: Zhan Xusheng <zhanxusheng@xiaomi.com>
    Signed-off-by: Ulf Hansson <ulfh@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

mmc: sdhci: make tuning_err a signed int [+ + +]
Author: Haibo Chen <haibo.chen@nxp.com>
Date:   Mon Jul 27 18:38:49 2026 +0800

    mmc: sdhci: make tuning_err a signed int
    
    commit ae31bcc92bb42502bb7c9029e6dc7a824cf6cd14 upstream.
    
    Coverity report INTEGER_OVERFLOW for host->tuning_err.
    The tuning_err field in struct sdhci_host is used to store an error
    code for re-tuning, but it was declared as unsigned int. Several call
    sites store negative error codes into it and later compare against
    negative values:
    
      - sdhci.c, sdhci-of-dwcmshc.c and sdhci-pci-gli.c assign it the
        return value of __sdhci_execute_tuning()/__sdhci_execute_tuning_9750(),
        both of which return a signed int (possibly a negative errno);
      - sdhci-of-esdhc.c assigns host->tuning_err = -EAGAIN and later does
        "ret = host->tuning_err; if (ret == -EAGAIN ...)";
      - sdhci-of-dwcmshc.c prints it with the %d (signed) conversion.
    
    Storing a negative errno in an unsigned int and reading it back as a
    signed int only happens to work because of two's-complement, same-width
    integer conversions. It is misleading and triggers sign-conversion
    warnings. All users treat the value either as a signed error code or as
    a boolean (zero / non-zero), so changing the type to a signed int is
    safe and makes the intent explicit.
    
    Fixes: 7d8bb1f46e13 ("mmc: sdhci: add tuning error codes")
    Assisted-by: Cline:claude-sonnet [read_file, search_files, git]
    Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
    Reviewed-by: Frank Li <Frank.Li@nxp.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Ulf Hansson <ulfh@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

mmc: sdhci: unmap the bounce buffer before device release [+ + +]
Author: Myeonghun Pak <mhun512@gmail.com>
Date:   Mon Jul 27 23:03:22 2026 +0900

    mmc: sdhci: unmap the bounce buffer before device release
    
    commit 9e9f561269dff35e6f84ed21776ec37fd6360b03 upstream.
    
    sdhci_allocate_bounce_buffer() allocates its buffer with devm_kmalloc()
    but maps it with dma_map_single(). The buffer is therefore released by
    devres without the streaming DMA mapping being unmapped.
    
    Register a managed action after dma_map_single() succeeds so the mapping
    is removed before devres releases the buffer. The action is registered
    only for buffers allocated and mapped by the SDHCI core, leaving buffers
    provided by host drivers under their existing ownership.
    
    Fixes: bd9b902798ab ("mmc: sdhci: Implement an SDHCI-specific bounce buffer")
    Cc: stable@vger.kernel.org
    Co-developed-by: Ijae Kim <ae878000@gmail.com>
    Signed-off-by: Ijae Kim <ae878000@gmail.com>
    Signed-off-by: Myeonghun Pak <mhun512@gmail.com>
    Reviewed-by: Linus Walleij <linusw@kernel.org>
    Signed-off-by: Ulf Hansson <ulfh@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mptcp: avoid combining some incoming suboptions [+ + +]
Author: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Date:   Mon Aug 3 18:16:34 2026 +0200

    mptcp: avoid combining some incoming suboptions
    
    commit b6ee361524641f57b2e2363f7737f20e17f67827 upstream.
    
    Some MPTCP suboptions are mutually exclusive according to the RFC8684,
    but also because in different places, the code doesn't expect some
    combinations to be present. That's specially true for suboptions that
    would be present twice, but with different attributes.
    
    The new restrictions are the same as the ones applied on the output
    side, with mptcp_write_options. The same rules can be reused with a
    small fix: an MP_FASTCLOSE can be used with a DSS when the sender picks
    this option [1], which is not the case on Linux. Here are the rules:
    
      Which options can be used together?
    
      X: mutually exclusive
      O: often used together
      C: can be used together in some cases
      P: could be used together but we prefer not to (optimisations)
    
      | Opt: | MPC  | MPJ  | DSS  | ADD  |  RM  | PRIO | FAIL |  FC  |
      |------|------|------|------|------|------|------|------|------|
      | MPC  |------|------|------|------|------|------|------|------|
      | MPJ  |  X   |------|------|------|------|------|------|------|
      | DSS  |  X   |  X   |------|------|------|------|------|------|
      | ADD  |  X   |  X   |  P   |------|------|------|------|------|
      | RM   |  C   |  C   |  C   |  P   |------|------|------|------|
      | PRIO |  X   |  C   |  C   |  C   |  C   |------|------|------|
      | FAIL |  X   |  X   |  C   |  X   |  X   |  X   |------|------|
      | FC   |  X   |  X   |  P   |  X   |  X   |  X   |  X   |------|
      | RST  |  X   |  X   |  X   |  X   |  X   |  X   |  O   |  O   |
      |------|------|------|------|------|------|------|------|------|
    
    The only difference is with the 'P': another stack could send and
    ADD_ADDR with other suboptions (DSS, RM_ADDR), and this should be
    allowed.
    
    A few points of attention:
    
     - In theory, an MP_CAPABLE could be used with a RM_ADDR, but there is
       no reason to add it with a SYN. Note that even with a 4th ACK, it
       doesn't seem to be useful, except when IDs are known in advance via
       another channel. Better not to break that.
    
     - Now, combining both an MP_CAPABLE and an MP_JOIN will no longer
       result to a reject of the two options, but only the second suboption
       is ignored. That seems OK to do that for this unexpected error. At
       least now all inconsistent combinations are handled the same way.
       This could change later in next. This also means the explicit checks
       for having both MPC + MPJ in subflow.c will now be unreachable.
       That's fine, they will be removed in a follow-up patch.
    
     - In case of conflicting combinations, the extra suboption(s) is/are
       ignored: having such combinations either means the remote peer is
       buggy, or is evil. The simplest action is then taken in this case:
       stop processing the current suboption.
    
     - In mp_opt->suboptions, there is also a bit reserved to the checksum,
       which can be used in an MP_CAPABLE and a DSS. Each time a DSS option
       can be used in parallel with another option, the checksum can be set,
       so the verification is combined into a new OPTIONS_MPTCP_DSS macro.
    
     - An MP_CAPABLE ACK can carry a Data-Level Length, and an optional
       Checksum: they are the same as the ones found in a DSS, because a DSS
       cannot be used in parallel to an MP_CAPABLE. Similarly, even if there
       is room, a DSS cannot be used with an MP_JOIN.
    
    Fixes: eda7acddf808 ("mptcp: Handle MPTCP TCP options")
    Cc: stable@vger.kernel.org
    Link: https://www.rfc-editor.org/rfc/rfc8684.html#section-3.5-5.1 [1]
    Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Link: https://patch.msgid.link/20260803-net-mptcp-misc-fixes-7-2-rc6-v2-2-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

mptcp: fastopen: only mark MPTFO subflows with SYN data [+ + +]
Author: Wyatt Feng <bronzed_45_vested@icloud.com>
Date:   Mon Aug 3 18:16:39 2026 +0200

    mptcp: fastopen: only mark MPTFO subflows with SYN data
    
    commit e00b63056fb4f261455b3e5df5268a1f8ce47a87 upstream.
    
    Passive TCP Fast Open accepts a valid-cookie SYN even when it carries
    no data. In that case the child socket's receive queue is intentionally
    left empty.
    
    mptcp_fastopen_subflow_synack_set_params() set is_mptfo before checking
    for queued SYN data. That made data-less TFO SYNs hit a WARN and, if
    the warning was non-fatal, left stale MPTFO state behind. The stale
    flag could later trigger a state-confusion bug in
    check_fully_established().
    
    Only mark the subflow as MPTFO after confirming that an SKB was queued.
    Return quietly when the receive queue is empty.
    
    Note that mptcp_subflow_context's is_mptfo field is now not just about
    subflows where the TFO was present, but about MPTFO subflow that
    consumed SYN data. Only having a valid cookie but not carrying data is
    not really "doing TFO".
    
    Fixes: 36b122baf6a8 ("mptcp: add subflow_v(4,6)_send_synack()")
    Cc: stable@vger.kernel.org
    Reported-by: Yuan Tan <yuantan098@gmail.com>
    Reported-by: Yifan Wu <yifanwucs@gmail.com>
    Reported-by: Juefei Pu <tomapufckgml@gmail.com>
    Reported-by: Zhengchuan Liang <zcliangcn@gmail.com>
    Reported-by: Xin Liu <bird@lzu.edu.cn>
    Signed-off-by: Wyatt Feng <bronzed_45_vested@icloud.com>
    Signed-off-by: Ren Wei <n05ec@lzu.edu.cn>
    Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Link: https://patch.msgid.link/20260803-net-mptcp-misc-fixes-7-2-rc6-v2-7-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

mptcp: options: reset DSS fields in case of unexpected size [+ + +]
Author: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Date:   Mon Aug 3 18:16:33 2026 +0200

    mptcp: options: reset DSS fields in case of unexpected size
    
    commit 35772b4981f38ba8059372cde8753e8e477e98ec upstream.
    
    A remote peer could send a malformed DSS with a wrong size, followed by
    another DSS or MPC + Data. In this case, the first suboption will be
    ignored, but leaving some fields written, which could lead to
    inconsistency or access uninitialized data.
    
    Explicitly reset the fields that could have been modified in case of
    unexpected size.
    
    Link: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260728-net-mptcp-misc-fixes-7-2-rc6-v1-0-f7e2d229159d%40kernel.org?part=1
    Fixes: 648ef4b88673 ("mptcp: Implement MPTCP receive path")
    Cc: stable@vger.kernel.org
    Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Link: https://patch.msgid.link/20260803-net-mptcp-misc-fixes-7-2-rc6-v2-1-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
mtd: ubi: skip programming unused bits in ubi headers [+ + +]
Author: Cheng Ming Lin <chengminglin@mxic.com.tw>
Date:   Tue Aug 18 02:09:34 2026 +0000

    mtd: ubi: skip programming unused bits in ubi headers
    
    [ Upstream commit 77530d1a78ca5c274e37d6494a965223672630b2 ]
    
    This patch prevents unnecessary programming of bits in ec_hdr and
    vid_hdr that are not used or read during normal UBI operation. These
    unused bits are typcially already set to 1 in erased flash and do not
    need to be explicitly programmed to 0 if they are not used.
    
    Programming such unused areas offers no functional benefit and may
    result in unnecessary flash wear, reducing the overall lifetime of the
    device. By skipping these writes, we preserve the flash state as much as
    possible and minimize wear caused by redundant operations.
    
    This change ensures that only necessary fields are written when preparing
    UBI headers, improving flash efficiency without affecting functionality.
    
    Additionally, the Kioxia TC58NVG1S3HTA00 datasheet (page 63) also notes
    that continuous program/erase cycling with a high percentage of '0' bits
    in the data pattern can accelerate block endurance degradation.
    This further supports avoiding large 0x00 patterns.
    
    Link: https://europe.kioxia.com/content/dam/kioxia/newidr/productinfo/datasheet/201910/DST_TC58NVG1S3HTA00-TDE_EN_31442.pdf
    
    Signed-off-by: Cheng Ming Lin <chengminglin@mxic.com.tw>
    Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
    Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com>
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
net/sched: act_api: fix TOCTOU NULL deref on a->goto_chain [+ + +]
Author: Jamal Hadi Salim <jhs@mojatatu.com>
Date:   Sun Aug 9 05:09:28 2026 -0400

    net/sched: act_api: fix TOCTOU NULL deref on a->goto_chain
    
    [ Upstream commit f60b396ee174206fe08ebf997d16cd3801b77b22 ]
    
    tcf_action_exec() handles TC_ACT_GOTO_CHAIN by first checking
    rcu_access_pointer(a->goto_chain) and then calling
    tcf_action_goto_chain_exec(), which does a second, independent
    rcu_dereference_bh(a->goto_chain) read and immediately dereferences
    chain->filter_chain. A concurrent tcf_action_set_ctrlact() (e.g. the gact
    replace path) can clear a->goto_chain between the two reads, so the second
    read returns NULL and tcf_action_goto_chain_exec() dereferences NULL.
    
    Fix the race by doing a single rcu_dereference_bh() read of a->goto_chain
    in tcf_action_exec(), checking it once for NULL, and passing the resulting
    chain pointer into tcf_action_goto_chain_exec(). This turns the split
    check/use into a single check/use on one value.
    
    Fixes: ee3bbfe806cd ("net/sched: let actions use RCU to access 'goto_chain'")
    Reported-by: vega@nebusec.ai
    Tested-by: Victor Nogueira <victor@mojatatu.com>
    Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
    Reviewed-by: Davide Caratti <dcaratti@redhat.com>
    Link: https://patch.msgid.link/20260809090928.868186-1-jhs@mojatatu.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net/sched: cls_bpf: reject dev-bound programs bound to a different device [+ + +]
Author: Jamal Hadi Salim <jhs@mojatatu.com>
Date:   Sun Aug 9 05:44:18 2026 -0400

    net/sched: cls_bpf: reject dev-bound programs bound to a different device
    
    [ Upstream commit 120977e2c096deea4e866e4273be9220b957c29e ]
    
    cls_bpf_prog_from_efd() obtained a SCHED_CLS program via
    bpf_prog_get_type_dev() but never verified that a device-bound (offloaded)
    program's bound netdev matches the TC netdev the classifier is being
    attached to. This let a program loaded with prog_ifindex for device A be
    attached via cls_bpf + skip_sw to device B; deleting device A then
    destroyed the program's offload state while it was still attached to
    device B, triggering a netdevsim WARN (panic with panic_on_warn=1).
    
    Mirror the XDP attach path (net/core/dev.c) and reject the attach with
    -EINVAL when a dev-bound program's bound device does not match the
    target device.
    
    Fixes: 2b3486bc2d23 ("bpf: Introduce device-bound XDP programs")
    Reported-by: vega@nebusec.ai
    Tested-by: Victor Nogueira <victor@mojatatu.com>
    Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
    Acked-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://patch.msgid.link/20260809094418.901607-1-jhs@mojatatu.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net/sched: cls_u32: skip hash tables in u32_bind_class() [+ + +]
Author: Zhang Changzhong <zhangchangzhong@huawei.com>
Date:   Fri Aug 7 15:50:38 2026 +0800

    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 <zhangchangzhong@huawei.com>
    Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
    Link: https://patch.msgid.link/1786089038-36366-1-git-send-email-zhangchangzhong@huawei.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net/sched: serialize qdisc_rtab_list against concurrent get/put [+ + +]
Author: Aldo Ariel Panzardo <qwe.aldo@gmail.com>
Date:   Sat Aug 8 08:12:10 2026 -0400

    net/sched: serialize qdisc_rtab_list against concurrent get/put
    
    [ Upstream commit f43ee0c0730d6191629b5ee1ceae27b1ebfdc047 ]
    
    qdisc_get_rtab() and qdisc_put_rtab() mutate the process-global singly
    linked list qdisc_rtab_list and a plain non-atomic 'int refcnt' with no
    lock. This was only safe because every caller historically held the RTNL
    mutex, which serialized all rate-table lookups, inserts and frees.
    
    That invariant no longer holds. cls_flower sets
    TCF_PROTO_OPS_DOIT_UNLOCKED, so tc_new_tfilter() keeps rtnl_held == false
    for it and sets TCA_ACT_FLAGS_NO_RTNL. That flag propagates through
    tcf_exts_validate_ex() -> tcf_action_init() -> tcf_action_init_1() ->
    tcf_police_init(), which calls qdisc_get_rtab()/qdisc_put_rtab() with the
    RTNL mutex NOT held. Two RTM_NEWTFILTER requests on different CPUs, each
    adding a flower filter with a police action carrying the same rate, then
    race on qdisc_rtab_list and on the non-atomic refcnt, leading to a
    use-after-free / double-free of the kmalloc-2k struct qdisc_rate_table.
    qdisc_rtab_list is a single global (not per-netns), so the corrupted
    object is shared system-wide.
    
      BUG: KASAN: slab-use-after-free in qdisc_put_rtab+0x12f/0x160
       qdisc_put_rtab+0x12f/0x160
       tcf_police_init+0xda9/0x1590
       tcf_action_init_1+0x460/0x6b0
       tcf_action_init+0x439/0xa40
       tcf_exts_validate_ex+0x42d/0x550
       fl_change+0xddd/0x7da0
       tc_new_tfilter+0xaa7/0x2420
       rtnetlink_rcv_msg+0x95e/0xe90
      which belongs to the cache kmalloc-2k of size 2048
    
    Protect qdisc_rtab_list and the refcount with a dedicated spinlock. The
    (sleeping, GFP_KERNEL) allocation in qdisc_get_rtab() is performed before
    taking the lock; if a concurrent inserter added an identical table in the
    meantime the freshly allocated one is freed under the lock, so no
    duplicate is leaked. qdisc_put_rtab() now decrements the refcount and
    unlinks under the same lock.
    
    Fixes: 470502de5bdb ("net: sched: unlock rules update API")
    Suggested-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Aldo Ariel Panzardo <qwe.aldo@gmail.com>
    Cc: stable@vger.kernel.org
    Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://patch.msgid.link/20260715114114.446841-1-qwe.aldo@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
net/tls: Fail tls_sw_splice_read() after a failed async decrypt [+ + +]
Author: Chuck Lever <cel@kernel.org>
Date:   Thu Aug 6 20:44:07 2026 -0400

    net/tls: Fail tls_sw_splice_read() after a failed async decrypt
    
    [ Upstream commit 976df67f463db1fddaf2a32fb04f57ad2891a23d ]
    
    When an async decrypt fails, tls_decrypt_done() records the error in
    ctx->async_wait.err and calls tls_err_abort(), which stores it in
    sk_err. tls_sw_recvmsg() and tls_sw_read_sock() each read
    async_wait.err once they hold the reader lock and fail the call: a
    record that did not authenticate breaks the connection.
    
    tls_sw_splice_read() has no such check, and sk_err does not stand in
    for one. tls_rx_rec_wait() tests sk_err only inside the loop it
    skips whenever a record is already parsed, and the first reader to
    reach sock_error() clears it, while async_wait.err persists. A
    splice therefore keeps delivering records on a connection that
    recvmsg() and read_sock() refuse to read.
    
    Read async_wait.err in tls_sw_splice_read() as the other two readers
    do.
    
    Fixes: f314bfee81b1 ("tls: rx: return the already-copied data on crypto error")
    Reviewed-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Chuck Lever <cel@kernel.org>
    Reviewed-by: Sabrina Dubroca <sd@queasysnail.net>
    Link: https://patch.msgid.link/20260806-tls-splice-crypto-fix-v1-1-a2624005a286@kernel.org
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
net/x25: fix use-after-free of the socket by its timers [+ + +]
Author: Baul Lee <baul.lee@xbow.com>
Date:   Mon Jul 27 07:03:42 2026 +0900

    net/x25: fix use-after-free of the socket by its timers
    
    commit 2195424c3da2ef1829a63b807e3a900a90e57d85 upstream.
    
    The x25 timers are armed with mod_timer() and cancelled with
    timer_delete(), so a pending timer holds no reference on the socket and a
    cancel does not wait for a callback already running on another CPU.
    
    x25_heartbeat_expiry() also rearms unconditionally, so it can reinstall
    sk->sk_timer after __x25_destroy_socket() has passed its cancel point.
    The following __sock_put() frees the socket while the timer is still
    queued, and the next expiry uses freed memory.  KASAN reports a
    slab-use-after-free on the kmalloc-2k object freed by close().
    
    timer_delete_sync() cannot be used here: x25_heartbeat_expiry() and
    x25_timer_expiry() both reach the cancels from inside the timer they
    would wait on, through __x25_destroy_socket() and x25_disconnect().
    
    Arm the timers with sk_reset_timer() and cancel them with sk_stop_timer()
    so that an armed timer owns a reference, and release it in both expiry
    handlers.  Rearm the heartbeat only while sk_hashed(sk) is still true,
    since __x25_destroy_socket() unlinks the socket before dropping it.  Arm
    the deferred destroy timer the same way and drop its reference in
    x25_destroy_timer().
    
    Reproduced on net with KASAN, with the heartbeat period shortened so the
    window recurs.  With this patch the reproducer no longer triggers a
    report and /proc/net/x25 drains.
    
    Discovered by XBOW, triaged by Baul Lee <baul.lee@xbow.com>
    
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Baul Lee <baul.lee@xbow.com>
    Link: https://patch.msgid.link/20260726220342.47245-1-baul.lee@xbow.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    [ adjusted context due to `del_timer()` not yet renamed to `timer_delete()` ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
net: ethernet: mtk_eth_soc: improve support for named interrupts [+ + +]
Author: Daniel Golle <daniel@makrotopia.org>
Date:   Wed Jul 2 14:14:29 2025 +0100

    net: ethernet: mtk_eth_soc: improve support for named interrupts
    
    commit e81d36d48880ab3f2b351ce3df799acaa8b11c4f upstream.
    
    Use platform_get_irq_byname_optional() to avoid outputting error
    messages when using legacy device trees which rely identifying
    interrupts only by index. Instead, output a warning notifying the user
    to update their device tree.
    
    Signed-off-by: Daniel Golle <daniel@makrotopia.org>
    Reviewed-by: Andrew Lunn <andrew@lunn.ch>
    Link: https://patch.msgid.link/aeccd00eccb7186d39d2c16292019b3b22ec53b8.1751461762.git.daniel@makrotopia.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: ethernet: mtk_eth_soc: only use legacy mode on missing IRQ name [+ + +]
Author: Frank Wunderlich <frank-w@public-files.de>
Date:   Thu Jun 19 15:21:24 2025 +0200

    net: ethernet: mtk_eth_soc: only use legacy mode on missing IRQ name
    
    commit 070e98dd4e26279280e15db8f37077a001ca1b4c upstream.
    
    If platform_get_irq_byname returns -ENXIO fall back to legacy (index
    based) mode, but on other errors function should return this error.
    
    Suggested-by: Daniel Golle <daniel@makrotopia.org>
    Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/20250619132125.78368-5-linux@fw-web.de
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: ethernet: ti: am65-cpsw-nuss: Fix port_id extraction from SRC TAG [+ + +]
Author: Siddharth Vadapalli <s-vadapalli@ti.com>
Date:   Fri Aug 7 16:47:37 2026 +0530

    net: ethernet: ti: am65-cpsw-nuss: Fix port_id extraction from SRC TAG
    
    [ Upstream commit 36a05d2820077bb3955acb8111e1041d39148037 ]
    
    On the packet reception path, the ID of the MAC Port on which the packet
    was received, is embedded in the RX DMA Descriptor's metadata. The ID is
    extracted using the helper function cppi5_desc_get_tags_ids() which fills
    in the 16-bit Source Tag into the 'port_id' variable. However, it is only
    the lower 8-bits of the 16-bit Source Tag that represent the MAC Port ID,
    while the upper 8-bits are Hardware-Reserved and carry an arbitrary value.
    With the existing logic, sporadic kernel crash is observed due to the
    subsequent driver code accessing out-of-bound memory because of an invalid
    port_id.
    
    Hence, fix the port_id extraction logic to use only the lower 8-bits of the
    Source Tag as the MAC Port ID.
    
    Fixes: 93a76530316a ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver")
    Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com>
    Reviewed-by: Chintan Vankar <c-vankar@ti.com>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/20260807111738.2055900-1-s-vadapalli@ti.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: harmonize tstats and dstats [+ + +]
Author: Paolo Abeni <pabeni@redhat.com>
Date:   Sat Feb 1 19:02:51 2025 +0100

    net: harmonize tstats and dstats
    
    commit d3ed6dee73c560fad0a8e152c8e233b3fb3a2e44 upstream.
    
    After the blamed commits below, some UDP tunnel use dstats for
    accounting. On the xmit path, all the UDP-base tunnels ends up
    using iptunnel_xmit_stats() for stats accounting, and the latter
    assumes the relevant (tunnel) network device uses tstats.
    
    The end result is some 'funny' stat report for the mentioned UDP
    tunnel, e.g. when no packet is actually dropped and a bunch of
    packets are transmitted:
    
    gnv2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue \
                    state UNKNOWN mode DEFAULT group default qlen 1000
        link/ether ee:7d:09:87:90:ea brd ff:ff:ff:ff:ff:ff
        RX:  bytes packets errors dropped  missed   mcast
             14916      23      0      15       0       0
        TX:  bytes packets errors dropped carrier collsns
                 0    1566      0       0       0       0
    
    Address the issue ensuring the same binary layout for the overlapping
    fields of dstats and tstats. While this solution is a bit hackish, is
    smaller and with no performance pitfall compared to other alternatives
    i.e. supporting both dstat and tstat in iptunnel_xmit_stats() or
    reverting the blamed commit.
    
    With time we should possibly move all the IP-based tunnel (and virtual
    devices) to dstats.
    
    Fixes: c77200c07491 ("bareudp: Handle stats using NETDEV_PCPU_STAT_DSTATS.")
    Fixes: 6fa6de302246 ("geneve: Handle stats using NETDEV_PCPU_STAT_DSTATS.")
    Fixes: be226352e8dc ("vxlan: Handle stats using NETDEV_PCPU_STAT_DSTATS.")
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Reviewed-by: Guillaume Nault <gnault@redhat.com>
    Link: https://patch.msgid.link/2e1c444cf0f63ae472baff29862c4c869be17031.1738432804.git.pabeni@redhat.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: mana: Fix EQ leak in mana_remove on NULL port [+ + +]
Author: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
Date:   Tue Aug 18 19:25:31 2026 -0400

    net: mana: Fix EQ leak in mana_remove on NULL port
    
    [ Upstream commit 65267c9c4f28199985505977bc2c628c82fc50ef ]
    
    In mana_remove(), when a NULL port is encountered in the port iteration
    loop, 'goto out' skips the mana_destroy_eq(ac) call, leaking the event
    queues allocated earlier by mana_create_eq().
    
    This can happen when mana_probe_port() fails for port 0, leaving
    ac->ports[0] as NULL. On driver unload or error cleanup, mana_remove()
    hits the NULL entry and jumps past mana_destroy_eq().
    
    Change 'goto out' to 'break' so the for-loop exits normally and
    mana_destroy_eq() is always reached. Remove the now-unreferenced out:
    label.
    
    Fixes: 1e2d0824a9c3 ("net: mana: Add support for EQ sharing")
    Signed-off-by: Erni Sri Satya Vennela <ernis@linux.microsoft.com>
    Link: https://patch.msgid.link/20260420124741.1056179-6-ernis@linux.microsoft.com
    Reviewed-by: Simon Horman <horms@kernel.org>
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    [ hmahfooz: resolve conflict in mana_remove() due to missing commit
      3b194343c250 ("net: mana: Implement ndo_tx_timeout and serialize
      queue resets per port.") ]
    Signed-off-by: Hamza Mahfooz <hamzamahfooz@linux.microsoft.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: packet: fix wrong transport_header when sending VLAN-tagged frame [+ + +]
Author: Wei Fang <wei.fang@nxp.com>
Date:   Fri Aug 7 14:34:04 2026 +0800

    net: packet: fix wrong transport_header when sending VLAN-tagged frame
    
    [ Upstream commit 01fdecc0480d916c799dbee584833a4a37e94d06 ]
    
    In packet_parse_headers(), when processing a VLAN-tagged frame,
    skb_set_network_header() is called to advance network_header past the
    VLAN tag to the inner protocol header. skb_probe_transport_header() is
    then called with skb->protocol still set to the outer VLAN EtherType
    (e.g. ETH_P_8021Q), while nhoff (derived from skb_network_offset())
    already points past the VLAN tag to the inner protocol header.
    
    In __skb_flow_dissect(), proto is initialized to ETH_P_8021Q and nhoff
    points past the VLAN tag. When the dissector hits case ETH_P_8021Q, it
    reads a struct vlan_hdr at nhoff via __skb_header_pointer(), but that
    offset contains the inner protocol header (e.g. an IP header). The bytes
    are misinterpreted as a VLAN header, yielding a garbage encapsulated
    EtherType that matches no known protocol. The dissector returns false,
    so skb_probe_transport_header() never calls skb_set_transport_header(),
    leaving transport_header at its uninitialized sentinel value (~0U).
    
    Move skb_probe_transport_header() to before skb_set_network_header(). At
    the time skb_probe_transport_header() is called, network_header still
    points to the VLAN header, so nhoff correctly points to the VLAN header.
    The flow dissector can then parse the VLAN header, extract the inner
    EtherType, and advance nhoff to the inner protocol header, allowing
    transport_header to be set correctly.
    
    Fixes: dfed913e8b55 ("net/af_packet: add VLAN support for AF_PACKET SOCK_RAW GSO")
    Assisted-by: WChat:claude-opus-4-8
    Signed-off-by: Wei Fang <wei.fang@nxp.com>
    Reviewed-by: Willem de Bruijn <willemb@google.com>
    Link: https://patch.msgid.link/20260807063405.688780-2-wei.fang@oss.nxp.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

net: pktgen: fix code style (WARNING: Block comments) [+ + +]
Author: Peter Seiderer <ps.report@gmx.net>
Date:   Tue Aug 11 07:55:03 2026 -0400

    net: pktgen: fix code style (WARNING: Block comments)
    
    [ Upstream commit 870b856cb478bc02fffe4d89897e62c692efb09a ]
    
    Fix checkpatch code style warnings:
    
      WARNING: Block comments use a trailing */ on a separate line
      +                                * removal by worker thread */
    
      WARNING: Block comments use * on subsequent lines
      +       __u8 tos;            /* six MSB of (former) IPv4 TOS
      +                               are for dscp codepoint */
    
      WARNING: Block comments use a trailing */ on a separate line
      +                               are for dscp codepoint */
    
      WARNING: Block comments use * on subsequent lines
      +       __u8 traffic_class;  /* ditto for the (former) Traffic Class in IPv6
      +                               (see RFC 3260, sec. 4) */
    
      WARNING: Block comments use a trailing */ on a separate line
      +                               (see RFC 3260, sec. 4) */
    
      WARNING: Block comments use * on subsequent lines
      +       /* = {
      +          0x00, 0x80, 0xC8, 0x79, 0xB3, 0xCB,
    
      WARNING: Block comments use * on subsequent lines
      +       /* Field for thread to receive "posted" events terminate,
      +          stop ifs etc. */
    
      WARNING: Block comments use a trailing */ on a separate line
      +          stop ifs etc. */
    
      WARNING: Block comments should align the * on each line
      + * we go look for it ...
      +*/
    
      WARNING: Block comments use a trailing */ on a separate line
      +        * we resolve the dst issue */
    
      WARNING: Block comments use a trailing */ on a separate line
      +        * with proc_create_data() */
    
    Signed-off-by: Peter Seiderer <ps.report@gmx.net>
    Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Stable-dep-of: 817ff6efdb7f ("net: pktgen: fix proc entry use-after-free")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: pktgen: fix proc entry use-after-free [+ + +]
Author: Chengfeng Ye <nicoyip.dev@gmail.com>
Date:   Tue Aug 11 07:55:04 2026 -0400

    net: pktgen: fix proc entry use-after-free
    
    [ Upstream commit 817ff6efdb7f484ea547218e11e17d8e43daa3b4 ]
    
    pktgen_change_name() replaces pkt_dev->entry while holding t->if_lock.
    pktgen_remove_device() removes the same entry before
    _rem_dev_from_if_list() takes that lock.
    
    This allows the following interleaving:
    
      CPU 0 (NETDEV_CHANGENAME)       CPU 1 (kpktgend)
      if_lock(t)
      proc_remove(pkt_dev->entry)
                                      proc_remove(pkt_dev->entry)
      pkt_dev->entry = proc_create_data(...)
      if_unlock(t)
    
    The kthread can pass the stale proc_dir_entry to proc_remove() after the
    rename path has freed it. A reproducer with a widened race window reports:
    
      BUG: KASAN: slab-use-after-free in proc_remove+0x78/0x80
      Read of size 8 at addr ffff8881478fea70 by task kpktgend_0/67
      Call Trace:
       proc_remove+0x78/0x80
       pktgen_remove_device.isra.0+0x11c/0x4c0
       pktgen_thread_worker+0x1214/0x6bc0
       kthread+0x2c6/0x3b0
      Allocated by task 95:
       __proc_create+0x204/0x790
       proc_create_data+0x72/0xe0
       pktgen_thread_write+0xd61/0x1510
      Freed by task 28:
       kmem_cache_free+0xcb/0x3d0
       proc_free_inode+0x5b/0x80
       rcu_core+0x50a/0x1850
      The buggy address belongs to the object at ffff8881478fea00
       which belongs to the cache proc_dir_entry of size 192
    
    Move proc_remove() into the if_lock-protected list removal helper. Keep it
    before list_del_rcu() to preserve the ordering required by add_device().
    The rename path must then finish replacing the entry before removal, or
    it observes that the device is no longer on the list.
    
    Fixes: 39df232f1a9b ("[PKTGEN]: fix device name handling")
    Cc: stable@vger.kernel.org
    Signed-off-by: Chengfeng Ye <nicoyip.dev@gmail.com>
    Reviewed-by: Simon Horman <horms@kernel.org>
    Link: https://patch.msgid.link/20260719145740.2888967-1-nicoyip.dev@gmail.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

net: tap: set skb->dev before parsing virtio net header in tap_get_user_xdp() [+ + +]
Author: Dongli Zhang <dongli.zhang@oracle.com>
Date:   Sat Aug 15 11:55:17 2026 -0400

    net: tap: set skb->dev before parsing virtio net header in tap_get_user_xdp()
    
    [ Upstream commit 3874892dd27d5387aa9a06f58d9060f18f351d24 ]
    
    The commit 4f61f133f354 ("net: tap: NULL pointer derefence in
    dev_parse_header_protocol when skb->dev is null") fixed a crash in
    tap_get_user() by assigning skb->dev before calling tun_vnet_hdr_to_skb().
    This is required because virtio_net_hdr_to_skb() may invoke
    dev_parse_header_protocol(), which dereferences skb->dev. Without the
    assignment, a NULL pointer dereference can occur.
    
    However, tap_get_user_xdp() still parses the virtio-net header before
    assigning skb->dev. When the vhost TX path passes an XDP buffer containing
    a GSO virtio-net header but the protocol is set to zero on purpose,
    tun_vnet_hdr_to_skb() can reach dev_parse_header_protocol() while skb->dev
    is still NULL, resulting in a crash.
    
    Fix this by looking up the tap device and assigning skb->dev before calling
    tun_vnet_hdr_to_skb(), matching the ordering already used in
    tap_get_user(). Preserve the existing RCU read-side critical section across
    dev_queue_xmit().
    
    Fixes: 924a9bc362a5 ("net: check if protocol extracted by virtio_net_hdr_set_proto is correct")
    Cc: stable@vger.kernel.org
    Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
    Reviewed-by: Willem de Bruijn <willemb@google.com>
    Acked-by: Michael S. Tsirkin <mst@redhat.com>
    Link: https://patch.msgid.link/20260802224612.264563-1-dongli.zhang@oracle.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
netfilter: flowtable: publish GC-visible tuple last [+ + +]
Author: Jérémy Jean <Jeremy.Jean@oss.cyber.gouv.fr>
Date:   Sat Aug 8 12:40:02 2026 +0000

    netfilter: flowtable: publish GC-visible tuple last
    
    [ Upstream commit 2014ac62df9d45bb9a004a043e85df7be09ed780 ]
    
    nf_flow_table_iterate() only treats original-direction tuple nodes as
    owning entries. Publishing the original node first lets GC observe and
    free a flow while flow_offload_add() is still inserting the reply node.
    Publish the reply node first and the original node last so GC never
    sees a partially installed flow.
    
    KASAN can trigger slab-use-after-free read and write reports in the
    flowtable/rhashtable path (rht_deferred_worker, jhash, flow_offload_del,
    flow_offload_lookup, etc.).
    
    Fixes: ac2a66665e23 ("netfilter: add generic flow table infrastructure")
    Signed-off-by: Jérémy Jean <Jeremy.Jean@oss.cyber.gouv.fr>
    Assisted-by: Codex:gpt-5
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

netfilter: ipset: fix list type element drift bug [+ + +]
Author: Florian Westphal <fw@strlen.de>
Date:   Thu Aug 6 15:53:41 2026 +0200

    netfilter: ipset: fix list type element drift bug
    
    [ Upstream commit 4cbd69766b35a089664cadb1f613bb85f7ef77a9 ]
    
    If list_set_uadd() calls list_set_replace() to swap an expired entry,
    the element count remains the same, therefore the increment must be elided.
    
    Fixes: 702b71e7c666 ("netfilter: ipset: Add element count to all set types header")
    Link: https://sashiko.dev/#/patchset/20260806101947.2802-1-fw%40strlen.de
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Acked-by: Jozsef Kadlecsik <kadlec@netfilter.org>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

netfilter: ipset: fix refcount race between list:set GC and swap [+ + +]
Author: Xiang Mei (Microsoft) <xmei5@asu.edu>
Date:   Wed Jul 22 22:38:32 2026 +0000

    netfilter: ipset: fix refcount race between list:set GC and swap
    
    [ Upstream commit 0c88868271653537ed443272dd8e7d13634d214b ]
    
    __ip_set_put_byindex() resolved the index to a set pointer under RCU,
    then took ip_set_ref_lock in __ip_set_put() to decrement set->ref.
    ip_set_swap() holds that same lock while swapping both the ip_set_list
    slots and the two sets' ref counters, so it can interleave between the
    dereference and the lock acquisition, leaving the caller to decrement a
    set whose reference already moved to the other index and hit
    BUG_ON(set->ref == 0). list_set_gc() reaches this from timer softirq,
    which the nfnl mutex does not serialize against swap: an expiring
    list:set member calls list_set_del() -> ip_set_put_byindex() while
    IPSET_CMD_SWAP runs on the referenced sets.
    
    Resolve the index and decrement under ip_set_ref_lock, as ip_set_swap()
    already does, keeping the refcount tied to the index rather than to a
    stale set pointer.
    
      kernel BUG at net/netfilter/ipset/ip_set_core.c:685!
      Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI
      RIP: 0010:ip_set_put_byindex (net/netfilter/ipset/ip_set_core.c:870)
      Call Trace:
       <IRQ>
       list_set_del (net/netfilter/ipset/ip_set_list_set.c:159)
       set_cleanup_entries (net/netfilter/ipset/ip_set_list_set.c:181)
       list_set_gc (net/netfilter/ipset/ip_set_list_set.c:578)
       call_timer_fn (kernel/time/timer.c:1748)
       __run_timers (kernel/time/timer.c:1799 kernel/time/timer.c:2374)
       run_timer_softirq (kernel/time/timer.c:2405)
       </IRQ>
      Kernel panic - not syncing: Fatal exception in interrupt
    
    Fixes: 9076aea76538 ("netfilter: ipset: Increase the number of maximal sets automatically")
    Reported-by: AutonomousCodeSecurity@microsoft.com
    Signed-off-by: Xiang Mei (Microsoft) <xmei5@asu.edu>
    Acked-by: Jozsef Kadlecsik <kadlec@netfilter.org>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

netfilter: ipset: let destroy callbacks adjust ext mem size [+ + +]
Author: Florian Westphal <fw@strlen.de>
Date:   Thu Aug 6 16:17:50 2026 +0200

    netfilter: ipset: let destroy callbacks adjust ext mem size
    
    [ Upstream commit 490937b88cb592cc0c5367758edd700fd5abd15c ]
    
    For bitmap this change makes no difference, because destructors are
    called synchronously.
    
    List type however calls them via call_rcu() so accounting decrement can
    happen after list_set_flush() set ext_size to 0.
    
    'set->elements = 0' can be removed for the same reason in the list type
    case, it calls 'set->elements--' for each element.
    
    Fixes: 9e41f26a505c ("netfilter: ipset: Count non-static extension memory for userspace")
    Suggested-by: Jozsef Kadlecsik <kadlec@netfilter.org>
    Signed-off-by: Florian Westphal <fw@strlen.de>
    Acked-by: Jozsef Kadlecsik <kadlec@netfilter.org>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

netfilter: nf_tables_offload: suppress WARN_ON_ONCE for ENOMEM in abort path [+ + +]
Author: Alexey Velichayshiy <a.velichayshiy@ispras.ru>
Date:   Thu Aug 6 19:11:38 2026 +0300

    netfilter: nf_tables_offload: suppress WARN_ON_ONCE for ENOMEM in abort path
    
    [ Upstream commit d02f592064347e0c1e0d84f24941ad338838cc48 ]
    
    In nft_flow_rule_offload_abort(), WARN_ON_ONCE(err) is triggered on every
    error during rollback, including -ENOMEM. Memory allocation failures are
    expected under low-memory conditions and do not indicate a kernel bug.
    
    Trace for example:
    nft_flow_offload_chain() // FLOW_BLOCK_BIND
      nft_flow_block_chain()
        nft_chain_offload_cmd()
          nft_block_offload_cmd()
            ->ndo_setup_tc()
            nsim_setup_tc()
              flow_block_cb_setup_simple()
                flow_block_cb_alloc() // fails to -ENOMEM
    
    The warning was reproduced on the 5.10 stable kernel under memory pressure
    via fault injection, but the underlying bug exists in mainline as well,
    as demonstrated by the ENOMEM trace above. The following splat was
    triggered during nf_tables transaction processing:
    
    WARNING: CPU: 0 PID: 8567 at net/netfilter/nf_tables_offload.c:532 nft_flow_rule_offload_abort net/netfilter/nf_tables_offload.c:532 [inline]
    WARNING: CPU: 0 PID: 8567 at net/netfilter/nf_tables_offload.c:532 nft_flow_rule_offload_commit+0x971/0xcd0 net/netfilter/nf_tables_offload.c:591
    Modules linked in:
    CPU: 0 PID: 8567 Comm: syz-executor.0 Not tainted 5.10.260-syzkaller #0
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
    RIP: 0010:nft_flow_rule_offload_abort net/netfilter/nf_tables_offload.c:532 [inline]
    RIP: 0010:nft_flow_rule_offload_commit+0x971/0xcd0 net/netfilter/nf_tables_offload.c:591
    Call Trace:
     nf_tables_commit+0x3bd/0x4bd0 net/netfilter/nf_tables_api.c:8604
     nfnetlink_rcv_batch+0xb1e/0x1f20 net/netfilter/nfnetlink.c:509
     nfnetlink_rcv_skb_batch net/netfilter/nfnetlink.c:579 [inline]
     nfnetlink_rcv+0x3b3/0x420 net/netfilter/nfnetlink.c:597
     netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
     netlink_unicast+0x6cd/0xa00 net/netfilter/af_netlink.c:1340
     netlink_sendmsg+0x906/0xe10 net/netfilter/af_netlink.c:1919
     sock_sendmsg_nosec net/socket.c:651 [inline]
     __sock_sendmsg+0x155/0x190 net/socket.c:663
     ____sys_sendmsg+0x705/0x870 net/socket.c:2379
     ___sys_sendmsg+0x100/0x170 net/socket.c:2433
     __sys_sendmsg+0xe9/0x1c0 net/socket.c:2462
     do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46
     entry_SYSCALL_64_after_hwframe+0x67/0xd1
    
    Change the condition to WARN_ON_ONCE(err && err != -ENOMEM) so that
    warnings are only emitted for unexpected errors. This aligns with the
    common kernel practice of not warning on -ENOMEM.
    
    Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
    
    Fixes: 63b48c73ff56 ("netfilter: nf_tables_offload: undo updates if transaction fails")
    Signed-off-by: Alexey Velichayshiy <a.velichayshiy@ispras.ru>
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
openrisc: signal: do not restore privileged SR bits on sigreturn [+ + +]
Author: Ali Ahmet Memis <ali@iusegentoo.com>
Date:   Fri Aug 7 23:42:30 2026 +0000

    openrisc: signal: do not restore privileged SR bits on sigreturn
    
    commit 32ef1b30ad736519f7a207bcc2986f3d4129d972 upstream.
    
    restore_sigcontext() copies the whole supervision register (SR) from the
    signal frame and only clears SPR_SR_SM before the value is reloaded into
    the hardware SR (through ESR and l.rfe) on the return to user space.  All
    other SR bits are left under user control.
    
    An unprivileged task can thus return from a signal handler through a
    crafted sigframe that clears SPR_SR_DME.  With the data MMU disabled the
    CPU performs no translation or protection on data accesses, so the task
    gains read and write access to arbitrary physical memory, a local
    privilege escalation.  SPR_SR_IME, SPR_SR_SUMRA, SPR_SR_LEE, SPR_SR_EPH
    and the cache-enable bits are exposed the same way.  The ptrace GPR regset
    already refuses any change to SR for exactly this reason.
    
    Restore only the arithmetic flag bits (F, CY, OV) from the signal frame
    and take every privileged control bit from the SR the kernel saved on
    signal entry.
    
    Verified with qemu-system-or1k -M or1k-sim: before this change an
    unprivileged PoC clears SPR_SR_DME in rt_sigreturn and writes a marker to
    physical address 0x03000000 (beyond the kernel's mem=32M); afterwards the
    same PoC receives SIGSEGV and physical memory is unchanged.
    
    Fixes: ac689eb7f9d4 ("OpenRISC: Signal handling")
    Cc: stable@vger.kernel.org
    Signed-off-by: Ali Ahmet Memis <ali@iusegentoo.com>
    Signed-off-by: Stafford Horne <shorne@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
perf/core: Fix group leader use-after-free after sibling detach [+ + +]
Author: Aditya Chillara <aditya.chillara@oss.qualcomm.com>
Date:   Fri Aug 7 18:11:52 2026 +0530

    perf/core: Fix group leader use-after-free after sibling detach
    
    commit 42c5ca1f0a288a52878bd72a5595b08261057438 upstream.
    
    perf_group_detach() handles leader and sibling detach differently. When the
    group leader is detached, all siblings are promoted to singleton events and
    their group_leader pointer is reset to themselves. When a sibling is
    detached, it is removed from the leader's sibling_list, but its
    group_leader pointer is left pointing at the old leader.
    
    That is harmless when the sibling is being closed and freed immediately, as
    in the DETACH_DEAD path. It is not safe when the sibling is detached but
    kept alive, such as during CPU hotplug with DETACH_GROUP. In that case the
    sibling is removed from the context, while its file descriptor can still
    keep it alive.
    
    A typical failing sequence is:
    
      - A group contains leader L and sibling S.
      - CPU hot-unplug detaches S with DETACH_GROUP, removing it from
        L->sibling_list but leaving S->group_leader == L.
      - L is later closed and freed.
      - A PERF_IOC_FLAG_GROUP ioctl on S follows S->group_leader and
        dereferences the freed leader.
    
    This was reproduced by running the perf event fuzzer, CPU hotplug, and a
    stress workload concurrently:
    
      Unable to handle kernel paging request at virtual address 006b6b6b6b6b6cdb
      CPU: 2 PID: 12489 Comm: perf_fuzzer 6.18.7 PREEMPT
      pc : perf_ioctl+0x34c/0xc68
      x20: ffffff89a3fa2c70 x8 : 6b6b6b6b6b6b6b6b
      Code: 943c4a0e 340047a0 f9404a94 f9411e88 (f940b908)
      Call trace:
      perf_ioctl+0x34c/0xc68 (P)
      __arm64_sys_ioctl+0xa0/0xf4
      invoke_syscall+0x58/0xe4
      el0_svc_common+0xa8/0xdc
      do_el0_svc+0x1c/0x28
      el0_svc+0x40/0xc0
      el0t_64_sync_handler+0x68/0xdc
      el0t_64_sync+0x1c4/0x1c8
    
    The fault happened in perf_ioctl(), where perf_event_for_each() follows
    the stale group_leader pointer and perf_event_for_each_child() then
    dereferences the freed leader's context.
    
    Fix the use-after-free by promoting the detached sibling to a singleton.
    Also fix __event_disable() cgroup accounting and event state change.
    
    Fixes: 8a49542c0554 ("perf_events: Fix races in group composition")
    Assisted-by: PatchWise:gpt-5.5
    Signed-off-by: Aditya Chillara <aditya.chillara@oss.qualcomm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260807-fix-group-leader-uaf-v3-1-b0c2310c9a0d@oss.qualcomm.com
    [ Dropped one blank line from the context after `perf_event_set_state()` since 6.12 lacks the cosmetic whitespace added upstream. ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
perf: Unify perf_event_free_task() / perf_event_exit_task_context() [+ + +]
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Thu Feb 13 14:04:07 2025 +0100

    perf: Unify perf_event_free_task() / perf_event_exit_task_context()
    
    commit 90661365021a6d0d7f3a2c5046ebe33e4df53b92 upstream.
    
    Both perf_event_free_task() and perf_event_exit_task_context() are
    very similar, except perf_event_exit_task_context() is a little more
    generic / makes less assumptions.
    
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Ravi Bangoria <ravi.bangoria@amd.com>
    Link: https://lkml.kernel.org/r/20250307193723.274039710@infradead.org
    Stable-dep-of: 42c5ca1f0a28 ("perf/core: Fix group leader use-after-free after sibling detach")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
pmdomain: arm: Fix -EINVAL from scmi_pd_set_perf_state() on state 0 [+ + +]
Author: Praveen Talari <praveen.talari@oss.qualcomm.com>
Date:   Wed Aug 5 01:27:39 2026 +0530

    pmdomain: arm: Fix -EINVAL from scmi_pd_set_perf_state() on state 0
    
    commit 3314c90a2eda3df7da4ab6f4388e667b2758de7f upstream.
    
    Currently, scmi_pd_set_perf_state() treats a performance state of 0 as
    invalid and returns -EINVAL. As a result, devices attached to SCMI
    performance domains can report failures when relinquishing their
    performance vote.
    
    The OPP framework use performance state 0 to indicate that no performance
    vote is required. For example, dev_pm_opp_set_rate(dev, 0) is commonly
    used (by firmware or linux)  when a device is runtime suspended.
    
    A zero performance state does not require any SCMI performance request
    to be sent. Treat it as a no-op and return success instead of reporting
    an error.
    
    Signed-off-by: Praveen Talari <praveen.talari@oss.qualcomm.com>
    Fixes: 2af23ceb8624 ("pmdomain: arm: Add the SCMI performance domain")
    Cc: stable@vger.kernel.org
    Signed-off-by: Ulf Hansson <ulfh@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
powerpc/pseries: lparcfg - fix kbuf[] underflow [+ + +]
Author: George Wilson <gcwilson@linux.ibm.com>
Date:   Fri Aug 7 11:59:00 2026 -0500

    powerpc/pseries: lparcfg - fix kbuf[] underflow
    
    commit fb442a6673ff1046bf67754957d95880fdb394b5 upstream.
    
    In lparcfg_write(), a count of 0 results in kbuf[] being indexed at -1.
    Check for count == 0 in the existing check for count > sizeof(kbuf) and
    return -EINVAL if true.
    
    Fixes: 74422e2b1939 ("powerpc/pseries: Remove VLA from lparcfg_write()")
    Acked-by: Nayna Jain <nayna@linux.ibm.com>
    Tested-by: R Nageswara Sastry <rnsastry@linux.ibm.com>
    Cc: stable@vger.kernel.org # 4.20
    Signed-off-by: George Wilson <gcwilson@linux.ibm.com>
    Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

powerpc/pseries: pci - logic bug [+ + +]
Author: George Wilson <gcwilson@linux.ibm.com>
Date:   Fri Aug 7 11:58:36 2026 -0500

    powerpc/pseries: pci - logic bug
    
    commit 649c10bff5cb7a514bf299094833ec8c9190aac3 upstream.
    
    The checks on num_vfs in pseries_pci_sriov_enable() are ANDed where OR
    was apparently intended.  Change it to OR.
    
    Fixes: 9a7f6b438664 ("powerpc/pseries/pci: Associate PEs to VFs in configure SR-IOV")
    Acked-by: Nayna Jain <nayna@linux.ibm.com>
    Tested-by: R Nageswara Sastry <rnsastry@linux.ibm.com>
    Cc: stable@vger.kernel.org # 4.16
    Signed-off-by: George Wilson <gcwilson@linux.ibm.com>
    Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ring-buffer: Initialise reader page order in rb_allocate_cpu_buffer() [+ + +]
Author: Vincent Donnefort <vdonnefort@google.com>
Date:   Tue Aug 18 15:30:32 2026 -0400

    ring-buffer: Initialise reader page order in rb_allocate_cpu_buffer()
    
    [ Upstream commit 6d014e44b68ddd43f71288d2a4dbb1a259869149 ]
    
    In rb_allocate_cpu_buffer(), bpage->order was omitted, leaving it as 0.
    This is an issue for a ring-buffer with subbufs bigger than PAGE_SIZE if
    when freed: free_buffer_page() relies on this value. Align the value
    with the actual allocation size (buffer::subbuf_order).
    
    Cc: stable@vger.kernel.org
    Fixes: f9b94daa542a ("ring-buffer: Set new size of the ring buffer sub page")
    Link: https://patch.msgid.link/20260806211306.3704194-4-vdonnefort@google.com
    Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ring-buffer: Make ring_buffer_{un}map() simpler with guard(mutex) [+ + +]
Author: Steven Rostedt <rostedt@goodmis.org>
Date:   Wed Aug 19 10:56:27 2026 -0400

    ring-buffer: Make ring_buffer_{un}map() simpler with guard(mutex)
    
    [ Upstream commit 60bc720e10eac397b3adae975095df77bc368b88 ]
    
    Convert the taking of the buffer->mutex and the cpu_buffer->mapping_lock
    over to guard(mutex) and simplify the ring_buffer_map() and
    ring_buffer_unmap() functions.
    
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Vincent Donnefort <vdonnefort@google.com>
    Link: https://lore.kernel.org/20250527122009.267efb72@gandalf.local.home
    Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
    Stable-dep-of: 7c727dfce6be ("ring-buffer: Prevent resizing of persistent ring buffer")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ring-buffer: Prevent resizing of persistent ring buffer [+ + +]
Author: Vincent Donnefort <vdonnefort@google.com>
Date:   Wed Aug 19 10:56:28 2026 -0400

    ring-buffer: Prevent resizing of persistent ring buffer
    
    [ Upstream commit 7c727dfce6be04dd009b29091a4a17d952dbfe03 ]
    
    Dynamically resizing a persistent ring buffer is not possible. Disable
    the feature.
    
    Cc: stable@vger.kernel.org
    Fixes: be68d63a139b ("ring-buffer: Add ring_buffer_alloc_range()")
    Link: https://patch.msgid.link/20260806211306.3704194-2-vdonnefort@google.com
    Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    [ Dropped the incoming `} else if (buffer->remote) {` branch context, which does not exist in this tree. ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ring-buffer: Remove jump to out label in ring_buffer_swap_cpu() [+ + +]
Author: Steven Rostedt <rostedt@goodmis.org>
Date:   Tue May 27 14:57:53 2025 -0400

    ring-buffer: Remove jump to out label in ring_buffer_swap_cpu()
    
    [ Upstream commit f115d2b70bff2665f67fa8e8dc5ed9452b696c44 ]
    
    The function ring_buffer_swap_cpu() has a bunch of jumps to the label out
    that simply returns "ret". There's no reason to jump to a label that
    simply returns a value. Just return directly from there.
    
    This goes back to almost the beginning when commit 8aabee573dff
    ("ring-buffer: remove unneeded get_online_cpus") was introduced. That
    commit removed a put_online_cpus() from that label, but never updated all
    the jumps to it that now no longer needed to do anything but return a
    value.
    
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Link: https://lore.kernel.org/20250527145753.6b45d840@gandalf.local.home
    Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
    Stable-dep-of: f27bdc43077e ("ring-buffer: Use current_context for safe per-CPU buffer swap")
    Signed-off-by: Sasha Levin <sashal@kernel.org>

ring-buffer: Simplify functions with __free(kfree) to free allocations [+ + +]
Author: Steven Rostedt <rostedt@goodmis.org>
Date:   Tue Aug 18 15:30:31 2026 -0400

    ring-buffer: Simplify functions with __free(kfree) to free allocations
    
    [ Upstream commit 99d232804405e35d7a9af1536a057578a1442e81 ]
    
    The function rb_allocate_pages() allocates cpu_buffer and on error needs
    to free it. It has a single return. Use __free(kfree) and return directly
    on errors and have the return use return_ptr(cpu_buffer).
    
    The function alloc_buffer() allocates buffer and on error needs to free
    it. It has a single return. Use __free(kfree) and return directly on
    errors and have the return use return_ptr(buffer).
    
    The function __rb_map_vma() allocates a temporary array "pages". Have it
    use __free() and not worry about freeing it when returning.
    
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Link: https://lore.kernel.org/20250527143144.6edc4625@gandalf.local.home
    Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
    Stable-dep-of: 6d014e44b68d ("ring-buffer: Initialise reader page order in rb_allocate_cpu_buffer()")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ring-buffer: Simplify ring_buffer_read_page() with guard() [+ + +]
Author: Steven Rostedt <rostedt@goodmis.org>
Date:   Wed Aug 19 10:56:26 2026 -0400

    ring-buffer: Simplify ring_buffer_read_page() with guard()
    
    [ Upstream commit b2e7c6ed26e90fab1e5e626071e54e3b9ec9cb5a ]
    
    The function ring_buffer_read_page() had two gotos. One was simply
    returning "ret" and the other was unlocking the reader_lock.
    
    There's no reason to use goto to simply return the "ret" variable. Instead
    just return the value.
    
    The jump to the unlocking of the reader_lock can be replaced by
    guard(raw_spinlock_irqsave)(&cpu_buffer->reader_lock).
    
    With these two changes the "ret" variable is no longer used and can be
    removed. The return value on non-error is what was read and is stored in
    the "read" variable.
    
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Link: https://lore.kernel.org/20250527145216.0187cf36@gandalf.local.home
    Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
    Stable-dep-of: 7c727dfce6be ("ring-buffer: Prevent resizing of persistent ring buffer")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

ring-buffer: Use current_context for safe per-CPU buffer swap [+ + +]
Author: Tengda Wu <wutengda@huaweicloud.com>
Date:   Mon Aug 3 00:56:39 2026 +0000

    ring-buffer: Use current_context for safe per-CPU buffer swap
    
    [ Upstream commit f27bdc43077e4fcb5557dfc315ee8d91e741f483 ]
    
    The ring_buffer_swap_cpu() function currently checks the per-CPU
    committing counter to determine if a buffer is actively being written to
    before performing the swap. However, there exists a race window where
    this check can be bypassed:
    
        ring_buffer_lock_reserve
            cpu_buffer = buffer->buffers[cpu];       // cpu_buffer_a
            rb_reserve_next_event
                rb_start_commit // inc committing
                if (unlikely(READ_ONCE(cpu_buffer->buffer) != buffer)) {...}
                __rb_reserve_next
                    rb_move_tail
                        rb_end_commit(cpu_buffer);   // dec committing => 0
                        /* interrupt hits here, successfully swaps! */
                        local_inc(&cpu_buffer->committing);
    
        ring_buffer_unlock_commit
            cpu_buffer = buffer->buffers[cpu];      // cpu_buffer_b
            rb_commit
                rb_end_commit
                RB_WARN_ON(cpu_buffer, !local_read(&cpu_buffer->committing))
                                                    // triggers warning
    
    The committing counter can temporarily drop to 0 during a single write
    operation (within rb_move_tail), creating a window where swap can
    succeed even though the write is still in progress. This leads to
    inconsistent buffer state and triggers the RB_WARN_ON in rb_commit().
    
    Replace the committing counter check with current_context checks, which
    are set at the entry of ring_buffer_lock_reserve() and remain valid
    throughout the entire write operation, providing a reliable indicator of
    buffer busy state during swap.
    
    Cc: stable@vger.kernel.org
    Fixes: 4239c38fe0b3 ("ring-buffer: Process commits whenever moving to a new page.")
    Link: https://patch.msgid.link/20260803005640.2445666-2-wutengda@huaweicloud.com
    Signed-off-by: Tengda Wu <wutengda@huaweicloud.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
s390/qeth: validate user buffer length in SNMP and ARP query ioctls [+ + +]
Author: Hidayath Khan <hidayath@linux.ibm.com>
Date:   Thu Jul 30 16:22:16 2026 +0200

    s390/qeth: validate user buffer length in SNMP and ARP query ioctls
    
    commit d141f087b1af656f055d7c5793a3e87817ba0bbe upstream.
    
    qeth_snmp_command() and qeth_l3_arp_query() allocate a buffer sized by
    a user-supplied length (udata_len) without checking a lower bound, then
    set udata_offset to a fixed non-zero value and pass both to a reply
    callback. The callback bounds-checks the copy with
    
            if ((udata_len - udata_offset) < len)
    
    Both fields are u32, so a udata_len smaller than udata_offset makes the
    subtraction wrap and the check pass, and the following memcpy() writes
    past the allocation. A udata_len of 0 also yields ZERO_SIZE_PTR from
    kzalloc(), which the existing NULL check does not catch.
    
    Reject buffers smaller than udata_offset before allocating, so the
    callback subtraction can no longer underflow.
    
    Fixes: 4a71df50047f ("qeth: new qeth device driver")
    Cc: stable@vger.kernel.org
    Reviewed-by: Alexandra Winter <wintera@linux.ibm.com>
    Signed-off-by: Hidayath Khan <hidayath@linux.ibm.com>
    Reviewed-by: Joe Damato <joe@dama.to>
    Link: https://patch.msgid.link/20260730142216.218309-1-hidayath@linux.ibm.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
s390/vfio_ccw: Calculate idal length based on idaw type [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:17 2026 +0200

    s390/vfio_ccw: Calculate idal length based on idaw type
    
    commit 4f6fdc6e1a7fbfa36b945af33c65a417948feac0 upstream.
    
    Sashiko pointed out that get_guest_idal() unconditionally calculates
    the length of the IDAL presuming everything is a Format-2 IDAW.
    
    The output of vfio-ccw is always Format-2, but the input can be either
    Format-1 (31-bit addresses) or Format-2 (64-bit addresses). As a result,
    the size of the guest IDAL may be incorrect and should be trimmed down.
    
    Reported-by: sashiko-bot <sashiko-bot@kernel.org>
    Link: https://lore.kernel.org/r/20260720203400.7328E1F000E9@smtp.kernel.org/
    Fixes: 1b676fe3d9d3 ("vfio/ccw: handle a guest Format-1 IDAL")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Cancel existing workqueues [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:19 2026 +0200

    s390/vfio_ccw: Cancel existing workqueues
    
    commit 79c60b2c61105368dcc8444eb45847e21734f7c4 upstream.
    
    The initialization of the io_work and crw_work workqueues begs the
    question of whether they should be un-initialized. Add the corresponding
    cleanup tags in _release_dev to ensure work isn't dispatched after
    the private struct is free'd.
    
    Suggested-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Fixes: e5f84dbaea59 ("vfio: ccw: return I/O results asynchronously")
    Fixes: 3f02cb2fd9d2 ("vfio-ccw: Wire up the CRW irq and CRW region")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Ensure first IDAW remains constant [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:16 2026 +0200

    s390/vfio_ccw: Ensure first IDAW remains constant
    
    commit 565bef268d75bf7df665bce6923a88cd0eb74592 upstream.
    
    The first IDAW in a list does not need to be on a 2K/4K boundary
    like all others, and so is read separately to accurately calculate
    the size of the buffer needed to read the full IDAL.
    
    Verify that the address found in the first IDAW is unchanged between
    reads, to ensure a consistent set of IDAWs being worked with.
    
    Fixes: 01aa26c672c0 ("s390/cio: Combine direct and indirect CCW paths")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Ensure index for read/write regions are within range [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:18 2026 +0200

    s390/vfio_ccw: Ensure index for read/write regions are within range
    
    commit 9f5f9a78fedc45bc29d6a0a64e3a3472361afae5 upstream.
    
    The introduction of the capability chain rightly clamped the
    region indexes to the range of the capabilities itself, but
    neglected to do so for the existing read/write regions which
    should also be enforced.
    
    Fixes: db8e5d17ac03 ("vfio-ccw: add capabilities chain")
    Cc: stable@vger.kernel.org
    Cc: Cornelia Huck <cohuck@redhat.com>
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Fix out of bounds check on CCW array [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:15 2026 +0200

    s390/vfio_ccw: Fix out of bounds check on CCW array
    
    commit a005b7f1a491ffda61bff0fd0f6548f8986fb977 upstream.
    
    The routine ccwchain_calc_length() counts the number of channel
    command words (CCWs) that are chained together in a single channel
    program, and rejects anything larger than CCWCHAIN_LEN_MAX (256) CCWs.
    
    The loop itself is "do..while (count < 257)", and while the logic in
    is_cpa_within_range() correctly adjusts between the 0-index array of
    CCWs and the count of CCWs starting at 1, this means it would look
    at a possible 257th CCW before ending the loop and (correctly)
    returning an error.
    
    Fix this by restructuring the loop to break as soon as 256 CCWs
    (thus indexes 0-255) are examined, without looking at memory
    outside the range.
    
    Fixes: 0a19e61e6d4c ("vfio: ccw: introduce channel program interfaces")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Free all memory if cp_init() fails [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:13 2026 +0200

    s390/vfio_ccw: Free all memory if cp_init() fails
    
    commit 74186c2968f8f756ac3226b545b598457c910c75 upstream.
    
    The routine cp_free() is called to unpin/free any memory once an I/O
    is completed successfully, or if cp_prefetch() fails. But if cp_init()
    fails, and cp->initialized is not enabled, the same routine cannot be
    used to free all the memory.
    
    An attempt to address this exists in ccwchain_handle_ccw(), where a
    single call to ccwchain_free() is made for the currently-processed
    CCW segment. But this will leak other segments (created as a result
    of a Transfer in Channel) that had been allocated as part of the same
    channel program.
    
    Address this by performing the cleanup outside of the recursive
    ccwchain_handle_ccw()/ccwchain_loop_tic() logic.
    
    Fixes: 8b515be512a2 ("vfio-ccw: Fix memory leak and don't call cp_free in cp_init")
    Cc: stable@vger.kernel.org
    Reviewed-by: Farhan Ali <alifm@linux.ibm.com>
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Implement a crw lock [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:22 2026 +0200

    s390/vfio_ccw: Implement a crw lock
    
    commit 16b0798024c0e9117e395829ddbbe70981c79d9c upstream.
    
    Unlike the channel_program struct, which covers synchronous I/O
    submissions and asynchronous interrupts, the CRW region relies
    exclusively on asynchronous events coming from hardware.
    
    Implement a lock to manage the list of those payloads, to ensure
    they are read cohesively.
    
    Fixes: 3f02cb2fd9d2 ("vfio-ccw: Wire up the CRW irq and CRW region")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Reviewed-by: Farhan Ali <alifm@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Limit the number of channel program segments [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:14 2026 +0200

    s390/vfio_ccw: Limit the number of channel program segments
    
    commit 5405c90d6a47b3014e74ee0618a162449abbbc93 upstream.
    
    The processing of channel programs, and the CCWs within them, is done
    recursively. As such, there is an arbitrary (but not architectural)
    limit to the number of CCWs that can exist in a single channel program.
    
    The vfio-ccw logic breaks these channel programs into segments whenever
    it encounters a Transfer-In-Channel (TIC) CCW, and the combined number
    of segments count towards the global limit. Impose an equivalent limit
    to the number of segments until such logic can be made non-recursive.
    
    Fixes: 0a19e61e6d4c ("vfio: ccw: introduce channel program interfaces")
    Cc: stable@vger.kernel.org
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Move cp cleanup out of not operational [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:20 2026 +0200

    s390/vfio_ccw: Move cp cleanup out of not operational
    
    commit 0c11f61a876ed6fcca53d442ed3f33ea8362a0f9 upstream.
    
    The fsm_notoper() routine is called when the device has been
    lost, and is (by definition) no longer operational. Since this
    can happen asynchronously from the normal behavior of the
    driver, the cleanup may happen when holding other locks
    in the calling sequence (notably, the cio subchannel lock).
    
    Push the cleanup of the private->cp resources to a workqueue,
    where it can be done out from under that lock sequence and
    a future patch can safely manage the locking requirements.
    
    Fixes: 204b394a23ad ("vfio/ccw: Move FSM open/close to MDEV open/close")
    Cc: stable@vger.kernel.org
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

s390/vfio_ccw: Selectively expand io_mutex [+ + +]
Author: Eric Farman <farman@linux.ibm.com>
Date:   Tue Jul 28 05:30:21 2026 +0200

    s390/vfio_ccw: Selectively expand io_mutex
    
    commit 34f4feff3e90bd09308fad0974e97113b23b812a upstream.
    
    The io_mutex was defined to serialize the io_regions, but then has
    also sort of been associated with the I/O themselves because of
    the close relationship they share.
    
    With the handful of races that are possible, the choices are either to:
     A) expand the scope of io_mutex to close these remaining windows, or
     B) reduce the scope of io_mutex to just io_region, and introduce a new
        lock mechanism for the remaining I/O resources
    
    This patch implements A, since B brings with it a lot more interactions
    that would need to be tracked and kept in a correct hierarchy. It also
    takes advantage of the workqueue element for cp_free() that now gets
    called out of fsm_notoper(), which could be invoked out of an interrupt
    context and thus cannot acquire a mutex itself.
    
    Fixes: 4f76617378ee ("vfio-ccw: protect the I/O region")
    Cc: stable@vger.kernel.org
    Signed-off-by: Eric Farman <farman@linux.ibm.com>
    Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
selftests/bpf: Add tests for delta tracking when src_reg == dst_reg [+ + +]
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Tue Aug 18 16:14:21 2026 +0800

    selftests/bpf: Add tests for delta tracking when src_reg == dst_reg
    
    commit ed2eecdc0c6613353bc1565e900d2b23237713da upstream.
    
    Extend the verifier_linked_scalars BPF selftest with a rX += rX test
    such that the div-by-zero path is rejected in the fixed case.
    
      # LDLIBS=-static PKG_CONFIG='pkg-config --static' ./vmtest.sh -- ./test_progs -t verifier_linked_scalars
      [...]
      ./test_progs -t verifier_linked_scalars
      #612/1   verifier_linked_scalars/scalars: find linked scalars:OK
      #612/2   verifier_linked_scalars/sync_linked_regs_preserves_id:OK
      #612/3   verifier_linked_scalars/scalars_neg:OK
      #612/4   verifier_linked_scalars/scalars_neg_sub:OK
      #612/5   verifier_linked_scalars/scalars_neg_alu32_add:OK
      #612/6   verifier_linked_scalars/scalars_neg_alu32_sub:OK
      #612/7   verifier_linked_scalars/scalars_pos:OK
      #612/8   verifier_linked_scalars/scalars_sub_neg_imm:OK
      #612/9   verifier_linked_scalars/scalars_double_add:OK
      #612/10  verifier_linked_scalars/scalars_sync_delta_overflow:OK
      #612/11  verifier_linked_scalars/scalars_sync_delta_overflow_large_range:OK
      #612/12  verifier_linked_scalars/scalars_alu32_big_offset:OK
      #612/13  verifier_linked_scalars/scalars_alu32_basic:OK
      #612/14  verifier_linked_scalars/scalars_alu32_wrap:OK
      #612/15  verifier_linked_scalars/scalars_alu32_zext_linked_reg:OK
      #612/16  verifier_linked_scalars/scalars_alu32_alu64_cross_type:OK
      #612/17  verifier_linked_scalars/scalars_alu32_alu64_regsafe_pruning:OK
      #612/18  verifier_linked_scalars/alu32_negative_offset:OK
      #612/19  verifier_linked_scalars/spurious_precision_marks:OK
      #612/20  verifier_linked_scalars/scalars_self_add_clears_id:OK
      #612/21  verifier_linked_scalars/scalars_self_add_alu32_clears_id:OK
      #612     verifier_linked_scalars:OK
      Summary: 1/21 PASSED, 0 SKIPPED, 0 FAILED
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/r/20260407192421.508817-3-daniel@iogearbox.net
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Shung-Hsi Yu <shung-hsi.yu@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

selftests/bpf: Add tests for stale delta leaking through id reassignment [+ + +]
Author: Daniel Borkmann <daniel@iogearbox.net>
Date:   Tue Aug 18 16:14:22 2026 +0800

    selftests/bpf: Add tests for stale delta leaking through id reassignment
    
    commit cac16ce1e3786bd98cec0c108e3bc06ed3d3c6a9 upstream.
    
    Extend the verifier_linked_scalars BPF selftest with a stale delta test
    such that the div-by-zero path is rejected in the fixed case.
    
      # LDLIBS=-static PKG_CONFIG='pkg-config --static' ./vmtest.sh -- ./test_progs -t verifier_linked_scalars
      [...]
      ./test_progs -t verifier_linked_scalars
      #612/1   verifier_linked_scalars/scalars: find linked scalars:OK
      #612/2   verifier_linked_scalars/sync_linked_regs_preserves_id:OK
      #612/3   verifier_linked_scalars/scalars_neg:OK
      #612/4   verifier_linked_scalars/scalars_neg_sub:OK
      #612/5   verifier_linked_scalars/scalars_neg_alu32_add:OK
      #612/6   verifier_linked_scalars/scalars_neg_alu32_sub:OK
      #612/7   verifier_linked_scalars/scalars_pos:OK
      #612/8   verifier_linked_scalars/scalars_sub_neg_imm:OK
      #612/9   verifier_linked_scalars/scalars_double_add:OK
      #612/10  verifier_linked_scalars/scalars_sync_delta_overflow:OK
      #612/11  verifier_linked_scalars/scalars_sync_delta_overflow_large_range:OK
      #612/12  verifier_linked_scalars/scalars_alu32_big_offset:OK
      #612/13  verifier_linked_scalars/scalars_alu32_basic:OK
      #612/14  verifier_linked_scalars/scalars_alu32_wrap:OK
      #612/15  verifier_linked_scalars/scalars_alu32_zext_linked_reg:OK
      #612/16  verifier_linked_scalars/scalars_alu32_alu64_cross_type:OK
      #612/17  verifier_linked_scalars/scalars_alu32_alu64_regsafe_pruning:OK
      #612/18  verifier_linked_scalars/alu32_negative_offset:OK
      #612/19  verifier_linked_scalars/spurious_precision_marks:OK
      #612/20  verifier_linked_scalars/scalars_self_add_clears_id:OK
      #612/21  verifier_linked_scalars/scalars_self_add_alu32_clears_id:OK
      #612/22  verifier_linked_scalars/scalars_stale_delta_from_cleared_id:OK
      #612/23  verifier_linked_scalars/scalars_stale_delta_from_cleared_id_alu32:OK
      #612     verifier_linked_scalars:OK
      Summary: 1/23 PASSED, 0 SKIPPED, 0 FAILED
    
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/r/20260407192421.508817-4-daniel@iogearbox.net
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Shung-Hsi Yu <shung-hsi.yu@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
selftests: mptcp: join: mark tests with data corruption as failed [+ + +]
Author: Gang Yan <yangang@kylinos.cn>
Date:   Mon Aug 3 18:16:37 2026 +0200

    selftests: mptcp: join: mark tests with data corruption as failed
    
    commit ca318e7bbb7723f57bcd9e69a2873b5884435552 upstream.
    
    check_transfer() compares the input and output files byte-by-byte using
    `cmp -l "$in" "$out" | while read ...`. Because the while-loop body runs
    in a subshell (the script sets neither lastpipe nor pipefail), the
    fail_test call inside it -- which sets the global ret/last_test_failed --
    and the `return 1` both act on the subshell, not on check_transfer().
    
    check_transfer() thus always falls through to `return 0`, and any data
    corruption affecting only the payload (leaving the subflow/PM counters
    untouched) is silently reported as PASS.
    
    Fixes: 8117dac3e7c3 ("selftests: mptcp: add invert check in check_transfer")
    Cc: stable@vger.kernel.org
    Signed-off-by: Gang Yan <yangang@kylinos.cn>
    Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
    Link: https://patch.msgid.link/20260803-net-mptcp-misc-fixes-7-2-rc6-v2-5-b8f496d71664@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
selinux: do not cancel a policy conversion that never started [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
Date:   Fri Jul 31 12:44:09 2026 -0500

    selinux: do not cancel a policy conversion that never started
    
    commit e5c0235a3c4e9eb047a16cd02323fe4ecf2f570e upstream.
    
    sel_write_load() calls selinux_policy_cancel() when sel_make_policy_nodes()
    fails, and that helper dereferences the outgoing policy to cancel its
    sidtab conversion. On the first policy load there is no outgoing policy:
    security_load_policy() returns early for that case, before it converts
    anything, and state->policy is still NULL. A first load that fails while
    building the selinuxfs tree therefore takes a NULL dereference in
    selinux_policy_cancel(), reached from a write(2) to /sys/fs/selinux/load.
    
    Skip the cancel when there is no old policy, mirroring the check
    security_load_policy() already makes before it converts.
    
    Cc: stable@vger.kernel.org
    Fixes: 02a52c5c8c3b ("selinux: move policy commit after updating selinuxfs")
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

selinux: reject a class permission count below its inherited common [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
Date:   Mon Jul 27 20:30:59 2026 -0500

    selinux: reject a class permission count below its inherited common
    
    commit 9a82dcd98b6e6e11cfd162410967951f12152528 upstream.
    
    security_get_permissions() maps an inherited common's permissions into
    an array sized by the class's own permissions.nprim, but class_read()
    takes that nprim verbatim from the policy image and never checks that it
    covers the common.  A class that inherits a common of N permissions while
    declaring a smaller nprim is accepted, and on load the common's
    permissions are written past the class-sized array -- an out-of-bounds
    heap write.
    
    Reject a class whose permission count is below its inherited common's.
    Well-formed policies, where the class count already includes the
    inherited permissions, are unaffected.
    
    Cc: stable@vger.kernel.org
    Fixes: 55fcf09b3fe4 ("selinux: add support for querying object classes and permissions from the running policy")
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

selinux: reject an unclaimed class value in security_get_classes() [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
Date:   Fri Jul 31 12:44:11 2026 -0500

    selinux: reject an unclaimed class value in security_get_classes()
    
    commit 22b05fec62c0fe9864cfceb52f7d0f3a34d9b1dd upstream.
    
    security_get_classes() sizes an array by p_classes.nprim and fills it at
    value - 1, so a class value the policy never defines leaves a NULL.
    sel_make_classes() passes every entry to sel_make_dir(), reaching the same
    d_alloc_name() dereference as the permission array. The class symbol table
    is allowed to be sparse (policydb_class_isvalid() exists to absorb that),
    but this getter builds its own array straight from the hash table and has
    no such predicate.
    
    Fail the lookup when a value went unclaimed instead of handing out the
    NULL. Conforming policies define every class they declare and are
    unaffected.
    
    Cc: stable@vger.kernel.org
    Fixes: 55fcf09b3fe4 ("selinux: add support for querying object classes and permissions from the running policy")
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

selinux: require every boolean value to be defined [+ + +]
Author: Bryam Vargas <hexlabsecurity@proton.me>
Date:   Fri Jul 31 12:44:12 2026 -0500

    selinux: require every boolean value to be defined
    
    commit a93d37a09b863810653f93d371fb197457d59deb upstream.
    
    p_bools.nprim comes from the policy image independently of how many
    booleans follow it, and cond_index_bool() fills bool_val_to_struct[] at
    value - 1, so a count larger than the values present leaves NULL entries.
    Every user of that array then walks it by index and dereferences each
    entry: cond_evaluate_expr() on the access-vector path,
    security_get_bools() and security_get_bool_value() behind selinuxfs, and
    security_set_bools(). A sparse class value is absorbed by
    policydb_class_isvalid() and its siblings; booleans have no such
    predicate, and no consumer that could use one.
    
    Reject a boolean value that no boolean defines, once, where the array is
    built. Conforming policies define every boolean they declare and are
    unaffected.
    
    Cc: stable@vger.kernel.org
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
    Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
    Signed-off-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
smb/server: fix minimum SMB1 PDU size [+ + +]
Author: ChenXiaoSong <chenxiaosong@kylinos.cn>
Date:   Sat Aug 8 20:48:09 2026 -0400

    smb/server: fix minimum SMB1 PDU size
    
    [ Upstream commit 3b9c30eb8f5aaad4a54cdfa470b74c0467cc71e8 ]
    
    Since the RFC1002 header has been removed from `struct smb_hdr`,
    the minimum SMB1 PDU size should be updated as well.
    
    Fixes: 83bfbd0bb902 ("cifs: Remove the RFC1002 header from smb_hdr")
    Suggested-by: David Howells <dhowells@redhat.com>
    Suggested-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Reviewed-by: David Howells <dhowells@redhat.com>
    Acked-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Stable-dep-of: cfc0b8e5080a ("ksmbd: validate minimum PDU size for transform requests")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

smb/server: fix minimum SMB2 PDU size [+ + +]
Author: ChenXiaoSong <chenxiaosong@kylinos.cn>
Date:   Sat Aug 8 20:48:10 2026 -0400

    smb/server: fix minimum SMB2 PDU size
    
    [ Upstream commit 4c7d8eb9a79ae5400eac19c4f6f0815bff674452 ]
    
    The minimum SMB2 PDU size should be updated to the size of
    `struct smb2_pdu` (that is, the size of `struct smb2_hdr` + 2).
    
    Suggested-by: David Howells <dhowells@redhat.com>
    Suggested-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Reviewed-by: David Howells <dhowells@redhat.com>
    Acked-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Stable-dep-of: cfc0b8e5080a ("ksmbd: validate minimum PDU size for transform requests")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

smb/server: rename include guard in smb_common.h [+ + +]
Author: ChenXiaoSong <chenxiaosong@kylinos.cn>
Date:   Sat Aug 8 20:48:07 2026 -0400

    smb/server: rename include guard in smb_common.h
    
    [ Upstream commit 01ab0d1640e379f0a0d6602250b33ff2b45e9560 ]
    
    Make the include guard more descriptive to avoid conflicts with include
    guards that may be used in the future.
    
    Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Acked-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Stable-dep-of: cfc0b8e5080a ("ksmbd: validate minimum PDU size for transform requests")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
smb: client: fix race with fallocate(2) and AIO+DIO [+ + +]
Author: Paulo Alcantara <pc@manguebit.org>
Date:   Tue Aug 11 20:09:32 2026 -0400

    smb: client: fix race with fallocate(2) and AIO+DIO
    
    [ Upstream commit dba9f997c9d9a1cade05d006ed0429a63a4eed32 ]
    
    AIO+DIO may extend the file size, hence we need to make sure ->i_size
    is stable across the entire fallocate(2) operation, otherwise it would
    become a truncate and then inode size reduced back down when it
    finishes.
    
    Fix this by calling netfs_wait_for_outstanding_io() right after
    acquiring ->i_rwsem exclusively in cifs_fallocate() and then guarantee
    a stable ->i_size across fallocate(2).
    
    Also call netfs_wait_for_outstanding_io() after truncating pagecache
    to avoid any potential races with writeback.
    
    Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
    Reviewed-by: David Howells <dhowells@redhat.com>
    Fixes: 210627b0aca9 ("smb: client: fix missing timestamp updates with O_TRUNC")
    Cc: Frank Sorenson <sorenson@redhat.com>
    Cc: linux-cifs@vger.kernel.org
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Stable-dep-of: fa724e235cfd ("cifs: add fscache_resize_cookie() to cifs_setsize()")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

smb: move get_rfc1002_len() to common/smbglob.h [+ + +]
Author: ZhangGuoDong <zhangguodong@kylinos.cn>
Date:   Sat Aug 8 20:48:06 2026 -0400

    smb: move get_rfc1002_len() to common/smbglob.h
    
    [ Upstream commit 36c31540cf5279262bfd148d8537cd04866499f2 ]
    
    Rename get_rfc1002_length() to get_rfc1002_len(), then move duplicate
    definitions to common header file.
    
    Co-developed-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Signed-off-by: ZhangGuoDong <zhangguodong@kylinos.cn>
    Acked-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Stable-dep-of: cfc0b8e5080a ("ksmbd: validate minimum PDU size for transform requests")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

smb: move smb_version_values to common/smbglob.h [+ + +]
Author: ZhangGuoDong <zhangguodong@kylinos.cn>
Date:   Sat Aug 8 20:48:05 2026 -0400

    smb: move smb_version_values to common/smbglob.h
    
    [ Upstream commit 34cf191bb6a349dc88ec2c4f6355fe006ac669e0 ]
    
    Merge the struct members of the server and the client:
    
      - req_capabilities:           from client
      - header_preamble_size:       from client
      - cap_unicode:                from client
      - capabilities:               from server, rename to req_capabilities
      - max_read_size:              from server
      - max_write_size:             from server
      - max_trans_size:             from server
      - max_credits:                from server
      - create_durable_size:        from server
      - create_durable_v2_size:     from server
      - create_mxac_size:           from server
      - create_disk_id_size:        from server
      - create_posix_size:          from server
    
    Then move duplicate definitions to common header file.
    
    Co-developed-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
    Signed-off-by: ZhangGuoDong <zhangguodong@kylinos.cn>
    Acked-by: Namjae Jeon <linkinjeon@kernel.org>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Stable-dep-of: cfc0b8e5080a ("ksmbd: validate minimum PDU size for transform requests")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
super: fix emergency thaw deadlock on frozen block devices [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Sat Aug 8 11:48:52 2026 -0400

    super: fix emergency thaw deadlock on frozen block devices
    
    [ Upstream commit 749d7aa0377aae32af8c0a4ad43371e7bf830ab5 ]
    
    do_thaw_all_callback() calls bdev_thaw() while holding sb->s_umount
    exclusively. If the block device was frozen via bdev_freeze() dropping
    the last block layer freeze reference calls fs_bdev_thaw() which
    reacquires s_umount:
    
      do_thaw_all_callback(sb)
        super_lock_excl(sb)                     # holds sb->s_umount
        bdev_thaw(sb->s_bdev)
          mutex_lock(&bdev->bd_fsfreeze_mutex)
          # bd_fsfreeze_count drops 1 -> 0
          bd_holder_ops->thaw == fs_bdev_thaw
            get_bdev_super(bdev)
              bdev_super_lock(bdev, true)
                super_lock(sb, true)
                  down_write(&sb->s_umount)     # same task: deadlock
    
    The emergency thaw worker deadlocks against itself holding both
    s_umount and bd_fsfreeze_mutex. That fscks any subsequent unmount,
    freeze, or thaw of that filesystem and block device.
    
      [   81.878470] sysrq: Show Blocked State
      [   81.880140] task:kworker/0:1     state:D stack:0     pid:11    tgid:11    ppid:2      task_flags:0x4208060 flags:0x00080000
      [   81.884876] Workqueue: events do_thaw_all
      [   81.886656] Call Trace:
      [   81.887759]  <TASK>
      [   81.888763]  __schedule+0x579/0x1420
      [   81.890372]  schedule+0x3a/0x100
      [   81.891794]  schedule_preempt_disabled+0x15/0x30
      [   81.893848]  rwsem_down_write_slowpath+0x1ea/0x900
      [   81.895191]  ? __pfx_do_thaw_all_callback+0x10/0x10
      [   81.896528]  down_write+0xbd/0xc0
      [   81.897505]  super_lock+0x91/0x180
      [   81.898457]  ? __mutex_lock+0xa99/0x1140
      [   81.900748]  ? __mutex_unlock_slowpath+0x1f/0x400
      [   81.902069]  bdev_super_lock+0x5b/0x150
      [   81.903132]  get_bdev_super+0x10/0x60
      [   81.904042]  fs_bdev_thaw+0x23/0xf0
      [   81.904755]  bdev_thaw+0x82/0x100
      [   81.905484]  do_thaw_all_callback+0x2c/0x50
      [   81.906298]  __iterate_supers+0x5d/0x130
      [   81.907067]  do_thaw_all+0x20/0x40
      [   81.907739]  process_one_work+0x206/0x5e0
      [   81.908545]  worker_thread+0x1e2/0x3c0
      [   81.909339]  ? __pfx_worker_thread+0x10/0x10
      [   81.910171]  kthread+0xf4/0x130
      [   81.910799]  ? __pfx_kthread+0x10/0x10
      [   81.911528]  ret_from_fork+0x2e2/0x3b0
      [   81.912259]  ? __pfx_kthread+0x10/0x10
      [   81.913010]  ret_from_fork_asm+0x1a/0x30
      [   81.913806]  </TASK>
    
    bdev_super_lock() even documents the violated requirement with
    lockdep_assert_not_held(&sb->s_umount).
    
    Acquiring bd_fsfreeze_mutex under s_umount also inverts the
    bd_fsfreeze_mutex vs. s_umount ordering established by
    bdev_{freeze,thaw}() and can thus ABBA against a concurrent block-layer
    freeze even when the recursive path isn't hit.
    
    Fix this by not holding s_umount around the bdev_thaw() loop at all. Pin
    the superblock with an active reference instead as
    filesystems_freeze_callback() does. The active reference keeps the
    superblock from being shut down and so ->s_bdev stays valid without
    holding s_umount. The block-layer-held freeze is dropped by
    fs_bdev_thaw() with FREEZE_MAY_NEST | FREEZE_HOLDER_USERSPACE exactly as
    a regular unfreeze would and thaw_super_locked() handles
    filesystem-level freezes as before.
    
    The emergency thaw path has deadlocked like this in one form or
    another for a long long time but the current exclusively-held
    shape dates back to commit [1] where thaw_bdev() already ended in
    thaw_super() with s_umount held by do_thaw_all_callback().
    
    Fixes: 08fdc8a0138a ("buffer.c: call thaw_super during emergency thaw") [1]
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260723-work-super-emergency_thaw-v1-1-7c315c600245@kernel.org
    Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

super: remove pointless s_root checks [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Sat Aug 8 11:48:47 2026 -0400

    super: remove pointless s_root checks
    
    [ Upstream commit af7551cf13cf7fb1d4f939db4f1f24c00550ed57 ]
    
    The locking guarantees that the superblock is alive and sb->s_root is
    still set. Remove the pointless check.
    
    Link: https://lore.kernel.org/r/20250329-work-freeze-v2-1-a47af37ecc3d@kernel.org
    Reviewed-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: 749d7aa0377a ("super: fix emergency thaw deadlock on frozen block devices")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

super: skip dying superblocks early [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Sat Aug 8 11:48:48 2026 -0400

    super: skip dying superblocks early
    
    [ Upstream commit 6920e3388ba4c66b0468d43bb7a373f5fff15d35 ]
    
    Make all iterators uniform by performing an early check whether the
    superblock is dying.
    
    Link: https://lore.kernel.org/r/20250329-work-freeze-v2-3-a47af37ecc3d@kernel.org
    Reviewed-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: 749d7aa0377a ("super: fix emergency thaw deadlock on frozen block devices")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

super: use a common iterator (Part 1) [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Sat Aug 8 11:48:49 2026 -0400

    super: use a common iterator (Part 1)
    
    [ Upstream commit 2992476528aeecbaee17ba0a6396a817481205a3 ]
    
    Use a common iterator for all callbacks.
    
    Link: https://lore.kernel.org/r/20250329-work-freeze-v2-4-a47af37ecc3d@kernel.org
    Reviewed-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: 749d7aa0377a ("super: fix emergency thaw deadlock on frozen block devices")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

super: use common iterator (Part 2) [+ + +]
Author: Christian Brauner <brauner@kernel.org>
Date:   Sat Aug 8 11:48:50 2026 -0400

    super: use common iterator (Part 2)
    
    [ Upstream commit b47e42d10e8c20525febccbd6e0dc8528861aea4 ]
    
    Use a common iterator for all callbacks. We could go for something even
    more elaborate (advance step-by-step similar to iov_iter) but I really
    don't think this is warranted.
    
    Link: https://lore.kernel.org/r/20250329-work-freeze-v2-5-a47af37ecc3d@kernel.org
    Reviewed-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Christian Brauner <brauner@kernel.org>
    Stable-dep-of: 749d7aa0377a ("super: fix emergency thaw deadlock on frozen block devices")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
tcp: challenge ACK for non-exact RST in SYN-RECEIVED [+ + +]
Author: Yuxiang Yang <yangyx22@mails.tsinghua.edu.cn>
Date:   Sun Aug 9 00:20:28 2026 -0400

    tcp: challenge ACK for non-exact RST in SYN-RECEIVED
    
    [ Upstream commit a28c4fcbf774e23b4779cae468e3497a5ad1f4a1 ]
    
    The SYN-RECEIVED request-socket path in tcp_check_req() accepts an
    in-window RST without requiring SEG.SEQ to exactly match RCV.NXT.  A
    non-exact RST therefore removes the request instead of eliciting a
    challenge ACK.
    
    RFC 9293 section 3.10.7.4 applies the RFC 5961 reset check in
    SYN-RECEIVED: an exact RST resets the connection, while a non-exact
    in-window RST must trigger a challenge ACK and be dropped.
    
    Apply that check before the ACK-field validation, following the RFC
    sequence-number, RST, then ACK processing order.  Factor the per-netns
    challenge ACK quota out of tcp_send_challenge_ack() so request sockets
    can share it.  Use the request socket's send_ack() callback and its own
    out-of-window ACK timestamp to send and rate-limit the response.
    
    Reported-by: Yuxiang Yang <yangyx22@mails.tsinghua.edu.cn>
    Reported-by: Yizhou Zhao <zhaoyz24@mails.tsinghua.edu.cn>
    Reported-by: Ao Wang <wangao@seu.edu.cn>
    Reported-by: Xuewei Feng <fengxw06@126.com>
    Reported-by: Qi Li <qli01@tsinghua.edu.cn>
    Reported-by: Ke Xu <xuke@tsinghua.edu.cn>
    Fixes: 282f23c6ee34 ("tcp: implement RFC 5961 3.2")
    Cc: stable@vger.kernel.org
    Signed-off-by: Yuxiang Yang <yangyx22@mails.tsinghua.edu.cn>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://patch.msgid.link/20260717081443.809393-2-yangyx22@mails.tsinghua.edu.cn
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tcp: fast path functions later [+ + +]
Author: Ilpo Järvinen <ij@kernel.org>
Date:   Sun Aug 9 00:20:26 2026 -0400

    tcp: fast path functions later
    
    [ Upstream commit 61b2f7baa9779b12a7bf1b9800a3f2a2549a1315 ]
    
    The following patch will use tcp_ecn_mode_accecn(),
    TCP_ACCECN_CEP_INIT_OFFSET, TCP_ACCECN_CEP_ACE_MASK in
    __tcp_fast_path_on() to make new flag for AccECN.
    
    No functional changes.
    
    Signed-off-by: Ilpo Järvinen <ij@kernel.org>
    Signed-off-by: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://patch.msgid.link/20250911110642.87529-3-chia-yu.chang@nokia-bell-labs.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Stable-dep-of: a28c4fcbf774 ("tcp: challenge ACK for non-exact RST in SYN-RECEIVED")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tcp: fix icsk_ack.ato bitfield overflow [+ + +]
Author: Jiayuan Chen <jiayuan.chen@linux.dev>
Date:   Fri Aug 7 09:44:36 2026 +0800

    tcp: fix icsk_ack.ato bitfield overflow
    
    [ Upstream commit 60837e4b840a9c3f7ec826e3584df0bc6542a2c2 ]
    
    On cross-region connections we observed delayed ACKs suddenly turning
    into immediate ACKs plus a TCP_MAX_QUICKACKS burst, as if the
    connection had just received its first data segment.
    
    Commit 95b9a87c6a6b ("tcp: record last received ipv6 flowlabel")
    squeezed icsk_ack.ato into 8 bits, sized for TCP_DELACK_MAX. But both
    writers still bound ato by icsk_rto, which can be well above 255
    jiffies, so the bitfield assignment silently wraps mod 256: repeated
    delack timer misses double ato up to icsk_rto, storing 320 as 64 and
    256 as 0, and ato == 0 is the "first data packet" sentinel in
    tcp_event_data_recv().
    
    Clamp both writers to TCP_DELACK_MAX, which the static_assert already
    guarantees to fit and tcp_send_delayed_ack() effectively caps ato at
    anyway.
    
    Fixes: 95b9a87c6a6b ("tcp: record last received ipv6 flowlabel")
    Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
    Reviewed-by: Neal Cardwell <ncardwell@google.com>
    Link: https://patch.msgid.link/20260807014437.36687-1-jiayuan.chen@linux.dev
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

tcp: Pass flags to __tcp_send_ack [+ + +]
Author: Ilpo Järvinen <ij@kernel.org>
Date:   Sun Aug 9 00:20:25 2026 -0400

    tcp: Pass flags to __tcp_send_ack
    
    [ Upstream commit 9866884ce8ef25338c5b33cbb97c2b5d92088528 ]
    
    Accurate ECN needs to send custom flags to handle IP-ECN
    field reflection during handshake.
    
    Signed-off-by: Ilpo Järvinen <ij@kernel.org>
    Signed-off-by: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Stable-dep-of: a28c4fcbf774 ("tcp: challenge ACK for non-exact RST in SYN-RECEIVED")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tcp: reorganize tcp_sock_write_txrx group for variables later [+ + +]
Author: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com>
Date:   Sun Aug 9 00:20:27 2026 -0400

    tcp: reorganize tcp_sock_write_txrx group for variables later
    
    [ Upstream commit c3426ba2ed6942fe33c75bf17fc7513ba2c6ac64 ]
    
    Use the first 3-byte hole at the beginning of the tcp_sock_write_txrx
    group for 'noneagle'/'rate_app_limited' to fill in the existing hole
    in later patches. Therefore, the group size of tcp_sock_write_txrx is
    reduced from 92 + 4 to 91 + 4. In addition, the group size of
    tcp_sock_write_rx is changed to 96 to fit in the pahole outcome.
    Below are the trimmed pahole outcomes before and after this patch:
    
    [BEFORE THIS PATCH]
    struct tcp_sock {
        [...]
        __cacheline_group_begin__tcp_sock_write_txrx[0]; /*  2521     0 */
        /* XXX 3 bytes hole, try to pack */
    
        [...]
        struct tcp_options_received rx_opt;              /*  2588    24 */
        u8                         nonagle:4;            /*  2612: 0  1 */
        u8                         rate_app_limited:1;   /*  2612: 4  1 */
        /* XXX 3 bits hole, try to pack */
    
        __cacheline_group_end__tcp_sock_write_txrx[0];   /*  2613     0 */
        /* XXX 3 bytes hole, try to pack */
    
        __cacheline_group_begin__tcp_sock_write_rx[0] __attribute__((__aligned__(8))); /*  2616     0 */
    
        [...]
        __cacheline_group_end__tcp_sock_write_rx[0];     /*  2712     0 */
    
        [...]
        /* size: 3200, cachelines: 50, members: 161 */
    }
    
    [AFTER THIS PATCH]
    struct tcp_sock {
        [...]
        __cacheline_group_begin__tcp_sock_write_txrx[0]; /*  2521     0 */
        u8                         nonagle:4;            /*  2521: 0  1 */
        u8                         rate_app_limited:1;   /*  2521: 4  1 */
        /* XXX 3 bits hole, try to pack */
        /* XXX 2 bytes hole, try to pack */
    
        [...]
        struct tcp_options_received rx_opt;              /*  2588    24 */
    
        __cacheline_group_end__tcp_sock_write_txrx[0];   /*  2612     0 */
        /* XXX 4 bytes hole, try to pack */
    
        __cacheline_group_begin__tcp_sock_write_rx[0] __attribute__((__aligned__(8))); /*  2616     0 */
    
        [...]
        __cacheline_group_end__tcp_sock_write_rx[0];     /*  2712     0 */
    
        [...]
        /* size: 3200, cachelines: 50, members: 161 */
    }
    
    Signed-off-by: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://patch.msgid.link/20250911110642.87529-4-chia-yu.chang@nokia-bell-labs.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Stable-dep-of: a28c4fcbf774 ("tcp: challenge ACK for non-exact RST in SYN-RECEIVED")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
ubi: fastmap: fix ubi->fm memory leak [+ + +]
Author: Liyuan Pang <pangliyuan1@huawei.com>
Date:   Tue Aug 18 02:09:35 2026 +0000

    ubi: fastmap: fix ubi->fm memory leak
    
    [ Upstream commit d133e30aabc7c8eb8206827f8fbe0f3679adb911 ]
    
    The problem is that scan_fast() allocate memory for ubi->fm
    and ubi->fm->e[x], but if the following attach process fails
    in ubi_wl_init or ubi_read_volume_table, the whole attach
    process will fail without executing ubi_wl_close to free the
    memory under ubi->fm.
    
    Fix this by add a new ubi_free_fastmap function in fastmap.c
    to free the memory allocated for fm.
    
    If SLUB_DEBUG and KUNIT are enabled, the following warning messages
    will show:
    ubi0: detaching mtd0
    ubi0: mtd0 is detached
    ubi0: default fastmap pool size: 200
    ubi0: default fastmap WL pool size: 100
    ubi0: attaching mtd0
    ubi0: attached by fastmap
    ubi0: fastmap pool size: 200
    ubi0: fastmap WL pool size: 100
    ubi0 error: ubi_wl_init [ubi]: no enough physical eraseblocks (4, need 203)
    ubi0 error: ubi_attach_mtd_dev [ubi]: failed to attach mtd0, error -28
    UBI error: cannot attach mtd0
    =================================================================
    BUG ubi_wl_entry_slab (Tainted: G    B      O L   ): Objects remaining in ubi_wl_entry_slab on __kmem_cache_shutdown()
    -----------------------------------------------------------------------------
    
    Slab 0xffff2fd23a40cd00 objects=22 used=1 fp=0xffff2fd1d0334fd8 flags=0x883fffc010200(slab|head|section=34|node=0|zone=1|lastcpupid=0x7fff)
    CPU: 0 PID: 5884 Comm: insmod Tainted: G    B      O L    5.10.0 #1
    Hardware name: LS1043A RDB Board (DT)
    Call trace:
     dump_backtrace+0x0/0x198
     show_stack+0x18/0x28
     dump_stack+0xe8/0x15c
     slab_err+0x94/0xc0
     __kmem_cache_shutdown+0x1fc/0x39c
     kmem_cache_destroy+0x48/0x138
     ubi_init+0x1d4/0xf34 [ubi]
     do_one_initcall+0xb4/0x24c
     do_init_module+0x4c/0x1dc
     load_module+0x212c/0x2260
     __se_sys_finit_module+0xb4/0xd8
     __arm64_sys_finit_module+0x18/0x28
     el0_svc_common.constprop.0+0x78/0x1a0
     do_el0_svc+0x78/0x90
     el0_svc+0x20/0x38
     el0_sync_handler+0xf0/0x140
     normal+0x3d8/0x400
    Object 0xffff2fd1d0334e68 @offset=3688
    Allocated in ubi_scan_fastmap+0xf04/0xf40 [ubi] age=80 cpu=0 pid=5884
            __slab_alloc.isra.21+0x6c/0xb4
            kmem_cache_alloc+0x1e4/0x80c
            ubi_scan_fastmap+0xf04/0xf40 [ubi]
            ubi_attach+0x1f0/0x3a8 [ubi]
            ubi_attach_mtd_dev+0x810/0xbc8 [ubi]
            ubi_init+0x238/0xf34 [ubi]
            do_one_initcall+0xb4/0x24c
            do_init_module+0x4c/0x1dc
            load_module+0x212c/0x2260
            __se_sys_finit_module+0xb4/0xd8
            __arm64_sys_finit_module+0x18/0x28
            el0_svc_common.constprop.0+0x78/0x1a0
            do_el0_svc+0x78/0x90
            el0_svc+0x20/0x38
            el0_sync_handler+0xf0/0x140
            normal+0x3d8/0x400
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=220744
    
    Signed-off-by: Liyuan Pang <pangliyuan1@huawei.com>
    Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com>
    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
userfaultfd: prevent registration of special VMAs [+ + +]
Author: Mike Rapoport (Microsoft) <rppt@kernel.org>
Date:   Fri Aug 7 22:52:30 2026 -0400

    userfaultfd: prevent registration of special VMAs
    
    [ Upstream commit 3c58f641e813c3c71039f8fd4d4e2a3aab713288 ]
    
    Vova Tokarev says:
    
      userfaultfd allows registration on shadow stack VMAs.  With userfaultfd
      access, you can register on the shadow stack, discard a page ... and
      inject a page with chosen return addresses via UFFDIO_COPY.
    
    Update vma_can_userfault() to reject VM_SHADOW_STACK.
    
    While on it, also reject VM_SPECIAL so that if a driver would implement
    vm_uffd_ops, it wouldn't be possible to register special VMAs with
    userfaultfd.
    
    Since VM_SPECIAL includes VM_DONTEXPAND which is set but hugetlb, exclude
    hugetlb VMAs from the check for VM_SPECIAL.
    
    Link: https://lore.kernel.org/20260618095017.2553004-1-rppt@kernel.org
    Fixes: 54007f818206 ("mm: Introduce VM_SHADOW_STACK for shadow stack memory")
    Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
    Reported-by: vova tokarev <vladimirelitokarev@gmail.com>
    Acked-by: David Hildenbrand (Arm) <david@kernel.org>
    Reviewed-by: Lorenzo Stoakes <ljs@kernel.org>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Linus Torvalds <torvalds@linuxfoundation.org>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
veth: fix queue index used to wake the peer txq in veth_poll [+ + +]
Author: Jonas Köppeler <j.koeppeler@tu-berlin.de>
Date:   Thu Aug 6 13:43:49 2026 +0200

    veth: fix queue index used to wake the peer txq in veth_poll
    
    [ Upstream commit 60db47f02bfa2aa688938aa199117ec4f8e31d23 ]
    
    veth_poll() derives the index of the peer TX queue to wake from
    rq->xdp_rxq.queue_index. That field is only initialized by
    xdp_rxq_info_reg() in veth_enable_xdp_range(), which runs only when an
    XDP program is attached. On the plain GRO/NAPI path
    (veth_napi_enable_range()) xdp_rxq_info_reg() is never called, so
    queue_index stays 0 for every queue, as priv->rq is zero-allocated.
    
    So in a multi-queue setup with GRO enabled and no XDP program attached,
    every NAPI instance looks at the peer's TX queue 0. If veth_xmit() stops
    peer TX queue 1 because the ptr_ring is full (NETDEV_TX_BUSY), nothing
    ever wakes it again: the poller draining queue 1 wakes queue 0 instead.
    veth implements no ndo_tx_timeout, so the netdev watchdog does not kick
    in either, and the queue stays stopped indefinitely.
    
    Derive the index from the position of the rq within priv->rq instead,
    which is correct regardless of whether XDP was ever enabled.
    
    Scripts to reproduce the stall are available at
    https://github.com/netoptimizer/veth-backpressure-performance-testing
    
    Fixes: dc82a33297fc ("veth: apply qdisc backpressure on full ptr_ring to reduce TX drops")
    Signed-off-by: Jonas Köppeler <j.koeppeler@tu-berlin.de>
    Tested-by: Jesper Dangaard Brouer <hawk@kernel.org>
    Acked-by: Jesper Dangaard Brouer <hawk@kernel.org>
    Link: https://patch.msgid.link/20260806-veth-fix-poll-queue-idx-v1-1-c5357fb7573d@tu-berlin.de
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>

 
vrf: Make pcpu_dstats update functions available to other modules. [+ + +]
Author: Guillaume Nault <gnault@redhat.com>
Date:   Tue Aug 11 20:09:06 2026 -0400

    vrf: Make pcpu_dstats update functions available to other modules.
    
    [ Upstream commit 18eabadd73ae60023ab05e376246bd725fb0c113 ]
    
    Currently vrf is the only module that uses NETDEV_PCPU_STAT_DSTATS.
    In order to make this kind of statistics available to other modules,
    we need to define the update functions in netdevice.h.
    
    Therefore, let's define dev_dstats_*() functions for RX and TX packet
    updates (packets, bytes and drops). Use these new functions in vrf.c
    instead of vrf_rx_stats() and the other manual counter updates.
    
    While there, update the type of the "len" variables to "unsigned int",
    so that there're aligned with both skb->len and the new dstats update
    functions.
    
    Signed-off-by: Guillaume Nault <gnault@redhat.com>
    Link: https://patch.msgid.link/d7a552ee382c79f4854e7fcc224cf176cd21150d.1733313925.git.gnault@redhat.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Stable-dep-of: b9553558b48d ("vxlan: use pskb_network_may_pull() for transmit path header pulls")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
vxlan: Handle stats using NETDEV_PCPU_STAT_DSTATS. [+ + +]
Author: Guillaume Nault <gnault@redhat.com>
Date:   Tue Aug 11 20:09:07 2026 -0400

    vxlan: Handle stats using NETDEV_PCPU_STAT_DSTATS.
    
    [ Upstream commit be226352e8dc77d3313c096b2d8e7f69bf6980fc ]
    
    VXLAN uses the TSTATS infrastructure (dev_sw_netstats_*()) for RX and
    TX packet counters. It also uses the device core stats
    (dev_core_stats_*()) for RX and TX drops.
    
    Let's consolidate that using the DSTATS infrastructure, which can
    handle both packet counters and packet drops. Statistics that don't
    fit DSTATS are still updated atomically with DEV_STATS_INC().
    
    While there, convert the "len" variable of vxlan_encap_bypass() to
    unsigned int, to respect the types of skb->len and
    dev_dstats_[rt]x_add().
    
    Signed-off-by: Guillaume Nault <gnault@redhat.com>
    Link: https://patch.msgid.link/145558b184b3cda77911ca5682b6eb83c3ffed8e.1733313925.git.gnault@redhat.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Stable-dep-of: b9553558b48d ("vxlan: use pskb_network_may_pull() for transmit path header pulls")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

vxlan: use pskb_network_may_pull() for transmit path header pulls [+ + +]
Author: Eric Dumazet <edumazet@google.com>
Date:   Tue Aug 11 20:09:08 2026 -0400

    vxlan: use pskb_network_may_pull() for transmit path header pulls
    
    [ Upstream commit b9553558b48db54ac9273e6b98d7263ef5c1a329 ]
    
    In vxlan_xmit(), arp_reduce(), and vxlan_mdb_entry_skb_get(), pskb_may_pull() was
    being called to verify the availability of network layer headers (ARP, IPv6/ND,
    IP/IPv6 MDB keys).
    
    However, during transmit skb->data points to the MAC header, so skb_network_offset(skb)
    is ETH_HLEN (14 bytes). Using pskb_may_pull(skb, len) only checks len bytes from skb->data
    rather than skb_network_offset(skb) + len, which can leave part of the network header
    in non-linear frags.
    
    Replace these remaining pskb_may_pull() calls with pskb_network_may_pull() to properly
    account for the MAC header offset.
    
    Fixes: e4f67addf158 ("add DOVE extensions for VXLAN")
    Fixes: f564f45c4518 ("vxlan: add ipv6 proxy support")
    Fixes: 0f83e69f44bf ("vxlan: Add MDB data path support")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: stable@vger.kernel.org
    Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
    Reviewed-by: Ido Schimmel <idosch@nvidia.com>
    Link: https://patch.msgid.link/20260723144249.759100-6-edumazet@google.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
x86/mce: Remove __mcheck_cpu_init_early() [+ + +]
Author: Yazen Ghannam <yazen.ghannam@amd.com>
Date:   Wed Aug 19 15:08:49 2026 -0400

    x86/mce: Remove __mcheck_cpu_init_early()
    
    [ Upstream commit 9f34032ec0deef58bd0eb7475f1981adfa998648 ]
    
    The __mcheck_cpu_init_early() function was introduced so that some
    vendor-specific features are detected before the first MCA polling event done
    in __mcheck_cpu_init_generic().
    
    Currently, __mcheck_cpu_init_early() is only used on AMD-based systems and
    additional code will be needed to support various system configurations.
    
    However, the current and future vendor-specific code should be done during
    vendor init. This keeps all the vendor code in a common location and
    simplifies the generic init flow.
    
    Move all the __mcheck_cpu_init_early() code into mce_amd_feature_init().
    
    Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
    Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
    Reviewed-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
    Reviewed-by: Tony Luck <tony.luck@intel.com>
    Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
    Tested-by: Tony Luck <tony.luck@intel.com>
    Link: https://lore.kernel.org/20250825-wip-mca-updates-v5-6-865768a2eef8@amd.com
    Stable-dep-of: a213dfaa2596 ("x86/mce: Set up the polling timer before CMCI discovery")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

x86/mce: Set CR4.MCE last during init [+ + +]
Author: Yazen Ghannam <yazen.ghannam@amd.com>
Date:   Wed Aug 19 15:08:50 2026 -0400

    x86/mce: Set CR4.MCE last during init
    
    [ Upstream commit cfffcf97997bd35f4a59e035523d1762568bdbad ]
    
    Set the CR4.MCE bit as the last step during init. This brings the MCA
    init order closer to what is described in the x86 docs.
    
    x86 docs:
      AMD           Intel
                    MCG_CTL
      MCA_CONFIG    MCG_EXT_CTL
      MCi_CTL       MCi_CTL
      MCG_CTL
      CR4.MCE       CR4.MCE
    
    Current Linux:
      AMD           Intel
      CR4.MCE       CR4.MCE
      MCG_CTL       MCG_CTL
      MCA_CONFIG    MCG_EXT_CTL
      MCi_CTL       MCi_CTL
    
    Updated Linux:
      AMD           Intel
      MCG_CTL       MCG_CTL
      MCA_CONFIG    MCG_EXT_CTL
      MCi_CTL       MCi_CTL
      CR4.MCE       CR4.MCE
    
    The new init flow will match Intel's docs, but there will still be a
    mismatch for AMD regarding MCG_CTL. However, there is no known issue with this
    ordering, so leave it for now.
    
    Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
    Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
    Reviewed-by: Nikolay Borisov <nik.borisov@suse.com>
    Link: https://lore.kernel.org/20250908-wip-mca-updates-v6-0-eef5d6c74b9c@amd.com
    Stable-dep-of: a213dfaa2596 ("x86/mce: Set up the polling timer before CMCI discovery")
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

x86/mce: Set up the polling timer before CMCI discovery [+ + +]
Author: Breno Leitao <leitao@debian.org>
Date:   Wed Aug 19 15:08:51 2026 -0400

    x86/mce: Set up the polling timer before CMCI discovery
    
    [ Upstream commit a213dfaa2596c1c0dc4dae91c14fbfa499c03223 ]
    
    I hit the following on one of my machines:
    
      mce: CPU0 BANK15 CMCI inherited storm
      ------------[ cut here ]------------
      ODEBUG: assert_init not available (active state 0) object: (____ptrval____) object type: timer_list hint: 0x0
      WARNING: lib/debugobjects.c:632 at debug_object_assert_init+0x178/0x230, CPU#0: swapper/0/0
      CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 7.2.0-rc5 #3 PREEMPTLAZY
      RIP: 0010:debug_object_assert_init+0x18f/0x230
      Call Trace:
       <TASK>
       __mod_timer
       mce_timer_kick
       cmci_discover
       intel_init_cmci
       mce_intel_feature_init
       mcheck_cpu_init
       identify_cpu
       identify_boot_cpu
       arch_cpu_finalize_init
       start_kernel
    
    A second splat follows right after, from timer_setup() finding that same
    timer already queued:
    
      ODEBUG: init active (active state 0) object: (____ptrval____) object type: timer_list hint: stub_timer+0x0/0x10
    
    This is happening because CMCI storm detection is trying to modify the timer
    before latter was properly set up.
    
    Set up the timer first. __mcheck_cpu_setup_timer() only calls timer_setup(),
    and depends on neither the generic nor the vendor init.
    
      [ bp: Massage commit message. ]
    
    Fixes: 1f68ce2a0272 ("x86/mce: Handle Intel threshold interrupt storms")
    Signed-off-by: Breno Leitao <leitao@debian.org>
    Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
    Cc: stable@vger.kernel.org
    Link: https://patch.msgid.link/20260803-mce_timer_init-v1-1-9539db424330@debian.org
    [ kept 6.12's `__mcheck_cpu_init_clear_banks()`/`__mcheck_cpu_check_banks()` pair instead of the merged `__mcheck_cpu_init_prepare_banks()` ]
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

 
xfs: avoid UAF on sc->tempip in xrep_tempfile_create [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:24:17 2026 -0700

    xfs: avoid UAF on sc->tempip in xrep_tempfile_create
    
    commit 0c88e10d12de9ca7cbed1467bb1b52310101bff8 upstream.
    
    LOLLM noticed a potential UAF if the tempfile creation code fails after
    it set sc->tempip.  Fix that.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: 84c14ee39dd388 ("xfs: create temporary files and directories for online repair")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: check v5 superblock features early [+ + +]
Author: Christoph Hellwig <hch@lst.de>
Date:   Wed Jul 29 15:00:58 2026 +0200

    xfs: check v5 superblock features early
    
    commit eb6b2cc1fc8ad566d746d128a559989ff0bba5cc upstream.
    
    When working on a new features that reuses the existing pad in the
    superblock, I noticed that mounting such a file system on an old kernel
    logs a rather confusing warning:
    
        XFS (vdc): Metadir superblock padding fields must be zero.
    
    This is because we only validate the various feature fields in v5
    superblocks after the common superblock validation helper is called.
    
    Fix this by calling the feature validation first.
    
    Fixes: eca383fcd63b ("xfs: refactor superblock verifiers")
    Cc: <stable@vger.kernel.org> # v4.19
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: check xfarray iteration errors when committing unlinked inode lists [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:25:50 2026 -0700

    xfs: check xfarray iteration errors when committing unlinked inode lists
    
    commit 2daf3ed5d059dec79c123aec42eb8d28e0c016d4 upstream.
    
    LOLLM noticed that we neglect to check for xfarray_iter itself returning
    errors when writing a new AGI.  Fix that.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: ab97f4b1c03075 ("xfs: repair AGI unlinked inode bucket lists")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: clear zapped attr fork state when bmap repair finds no attr fork [+ + +]
Author: Qiang Ma <maqianga@uniontech.com>
Date:   Thu Jul 16 17:22:45 2026 +0800

    xfs: clear zapped attr fork state when bmap repair finds no attr fork
    
    commit 87b2a82e135ba81e49d82b59e3d72468cb66ea98 upstream.
    
    xfstests xfs/377 can make xfs_scrub repeatedly check and repair the
    attr block map after inode repair zaps an attr fork.
    
    When inode repair zaps an attr fork, it records
    XFS_SICK_INO_BMBTA_ZAPPED so that scrub/repair can revisit the attr fork
    block map.  If the fork has been reset to an empty state and removed,
    BMBTA repair has no attr fork mappings to rebuild and can return success.
    
    The post-repair scrub then runs with XREP_ALREADY_FIXED set, which means
    xchk_file_looks_zapped() deliberately ignores the stale zapped health bit
    and asks xchk_bmap() to check the current attr fork.  For an absent attr
    fork, xchk_bmap() returns -ENOENT.  Returning that error prevents
    xchk_bmap_attr() from marking XFS_SICK_INO_BMBTA_ZAPPED healthy, leaving
    the zapped health state behind even though there are no attr fork mappings
    left to check.
    
    Treat -ENOENT during post-repair BMBTA revalidation as a clean result for
    the zapped attr fork: clear XFS_SICK_INO_BMBTA_ZAPPED and return success.
    Keep the existing -ENOENT behavior for ordinary scrubs of absent attr
    forks.
    
    Fixes: d9041681dd2f ("xfs: set inode sick state flags when we zap either ondisk fork")
    Cc: stable@vger.kernel.org # v6.8
    Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
    Signed-off-by: Qiang Ma <maqianga@uniontech.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: don't double-lock when deleting a self-referential directory [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:23:15 2026 -0700

    xfs: don't double-lock when deleting a self-referential directory
    
    commit 5fc643fb86599e29b38e7b2c2680b4b15bf8f772 upstream.
    
    LOLLM notices that the dirtree scrubber can detect a directory that
    refers to itself.  In this case, it's not correct for the directory tree
    repair code to try to iolock/ilock both sc->ip and dp, because they're
    the same inode.  Fix this by detecting that corner case and handling it
    appropriately.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: 3f31406aef493b ("xfs: fix corruptions in the directory tree")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: don't return EFSCORRUPTED when scrubbing corrupt parent pointers [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:23:31 2026 -0700

    xfs: don't return EFSCORRUPTED when scrubbing corrupt parent pointers
    
    commit 8af9cd79cdf6ee96ec610d707db22244fa21eb40 upstream.
    
    LOLLM noticed that scrub sets the CORRUPT flag when xfs_parent_from_attr
    thinks it's been given a corrupt parent pointer.  This eliminates the
    potential to repair the filesystem because that error code is bubbled up
    the call stack.  Fix this by collapsing them all to ECANCELED in
    xchk_parent_pptr, which doesn't have that trait.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: 0d29a20fbdba89 ("xfs: scrub parent pointers")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: don't swallow dquot recovery verification errors [+ + +]
Author: Long Li <leo.lilong@huawei.com>
Date:   Mon Jul 27 10:38:49 2026 +0800

    xfs: don't swallow dquot recovery verification errors
    
    commit e2b4a856085e9bd939bde2dee0d08b1d41babde9 upstream.
    
    xlog_recover_dquot_commit_pass2() validates the recovered dquot with
    xfs_dqblk_verify() and, on failure, sets error = -EFSCORRUPTED and jumps
    to out_release.  But out_release unconditionally returns 0, so the
    corruption error is discarded: the caller xlog_recover_items_pass2()
    sees success, log recovery proceeds as if the dquot were valid, and the
    corrupt quota buffer can be written back to disk.
    
    Fixes: 9c235dfc3d3f ("xfs: dquot recovery does not validate the recovered dquot")
    Cc: stable@vger.kernel.org # v6.8
    Signed-off-by: Long Li <leo.lilong@huawei.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: don't walk off the end of a null sc->sa.agi_bp in AGI repair [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:25:04 2026 -0700

    xfs: don't walk off the end of a null sc->sa.agi_bp in AGI repair
    
    commit 1e96a00e0d3a00be6e4f368b2f18e2d345f813ce upstream.
    
    LOLLM noticed a longstanding bug where xrep_iunlink_walk_ondisk_bucket
    tries to walk ragi->sc->sa.agi_bp to rebuild the unlinked inode lists.
    Unfortunately, it's possible for agi_bp to be null if the buffer
    verifier fails, so we have to use ragi->agi_bp (which skips verifier
    checks) instead.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: ab97f4b1c03075 ("xfs: repair AGI unlinked inode bucket lists")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: don't zap the attr fork on repair when there are queued pptr updates [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:23:46 2026 -0700

    xfs: don't zap the attr fork on repair when there are queued pptr updates
    
    commit 5ee37132ea81abd36213b31a72140660c2aac54b upstream.
    
    LOLLM noticed that xrep_xattr_rebuild_tree doesn't check for queued
    parent pointer updates when it decides that it's going to zap the attr
    fork.  This is obviously incorrect, so fix that.  We hold the IOLOCK and
    the ILOCK of sc->ip at that point in time, so we can't race with any
    /new/ operations.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: e5d7ce0364d8ee ("xfs: replay unlocked parent pointer updates that accrue during xattr repair")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: fix allocated inodes that show up in the unlinked list [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:26:06 2026 -0700

    xfs: fix allocated inodes that show up in the unlinked list
    
    commit 68ab37650ce5195b4f4f8466444a36a78207840c upstream.
    
    If an allocated inode shows up in the unlinked list, we need to get it
    completely off the list.  Set the corrected next/prev pointers such that
    the inode will not look like it should be on an unlinked list at all.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: ab97f4b1c03075 ("xfs: repair AGI unlinked inode bucket lists")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: fix another iunlink infinite loop bug in online fsck [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:26:21 2026 -0700

    xfs: fix another iunlink infinite loop bug in online fsck
    
    commit 6d67c6b99f1fc07c64b97fcbc974c6f1ada7f622 upstream.
    
    xrep_iunlink_resolve_bucket is supposed to reconstruct as much of the
    incore prev and next unlinked list pointers based on what it finds on
    disk and in memory before we move on to relinking the truly lost inodes
    back into the unlinked list.  However, it's still vulnerable to infinite
    loops that come in via the next_unlinked pointers.
    
    Fix this problem by remembering which inodes we've already seen and
    checking new agino pointers against that.  If a bit is already set,
    either this is a loop or the inode has nonzero link count.  We'll deal
    with the second case in a subsequent patch.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: ab97f4b1c03075 ("xfs: repair AGI unlinked inode bucket lists")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: fix exchange-range reflink flag clearing issue with INO1_WRITTEN [+ + +]
Author: Lin Jiapeng <ljp1205831794@gmail.com>
Date:   Tue Jul 28 15:19:10 2026 +0800

    xfs: fix exchange-range reflink flag clearing issue with INO1_WRITTEN
    
    commit b2d5a81dae385333f9734910277fbf94c78bd17f upstream.
    
    When exchanging two full-file ranges, xmi_can_exchange_reflink_flags()
    can move the reflink inode flag from the file that currently has it to
    the other file, as long as exactly one side is marked.  This assumes
    that the file contents, and therefore all shared extents, are exchanged.
    
    That assumption is not true when XFS_EXCHMAPS_INO1_WRITTEN is set.
    xfs_exchmaps_can_skip_mapping() can skip hole and unwritten mappings
    from file1, so an exchange can complete without moving every mapping
    that the earlier flag-swap decision accounted for.  In that case the
    post-operation cleanup can clear the reflink flag from an inode that
    still owns shared written extents.  Later writes then take the
    non-reflink write path and may update blocks that should still have
    been protected by CoW, which shows up as data corruption between
    reflink-related files.
    
    Fix this by disabling the reflink flag exchange whenever
    XFS_EXCHMAPS_INO1_WRITTEN is requested.  The contents exchange can still
    proceed; the conservative outcome is that both inodes keep the reflink
    flag.  The regular reflink flag cleanup path can drop the extra flag
    later once the inode no longer has shared extents.
    
    Reported-by: Lin Jiapeng (TencentOS Red Team) <jiapenglin@tencent.com>
    Fixes: 966ceafc7a43 ("xfs: create deferred log items for file mapping exchanges")
    Cc: stable@vger.kernel.org # v6.10
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Lin Jiapeng <jiapenglin@tencent.com>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: fix ilock leak on error in xfs_dq_get_next_id [+ + +]
Author: Long Li <leo.lilong@huawei.com>
Date:   Mon Jul 27 10:38:48 2026 +0800

    xfs: fix ilock leak on error in xfs_dq_get_next_id
    
    commit 63320a0f70f66f311f4bccff3af0719c2119f46c upstream.
    
    xfs_dq_get_next_id() takes the quota inode ILOCK before calling
    xfs_iread_extents().  If xfs_iread_extents() fails, the function returns
    immediately without releasing the lock, leaking the quota inode ILOCK.
    This can leave the quota inode locked and cause subsequent quota
    operations to hang.
    
    Fix this by jumping to a common unlock path on error instead of returning
    directly.
    
    Fixes: bda250dbaf39f ("xfs: rewrite xfs_dq_get_next_id using xfs_iext_lookup_extent")
    Cc: stable@vger.kernel.org # v4.12
    Signed-off-by: Long Li <leo.lilong@huawei.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: load next_agino from the correct xfarray in xrep_iunlink_relink_prev [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:25:19 2026 -0700

    xfs: load next_agino from the correct xfarray in xrep_iunlink_relink_prev
    
    commit 6b9cd540138a06660a843a519facc147060acbef upstream.
    
    LOLLM notices that xrep_iunlink_relink_prev has the comment "set the
    forward pointer..." but then loads the value from the xfarray that
    stores pointers to the previous inode in the unlinked list.  That's
    wrong, so fix the variable access.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: ab97f4b1c03075 ("xfs: repair AGI unlinked inode bucket lists")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: nlink scrub must take IOLOCK before determining ILOCK state [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:24:02 2026 -0700

    xfs: nlink scrub must take IOLOCK before determining ILOCK state
    
    commit b1a296fc2241f724ef8f14da6a4efa800d444dac upstream.
    
    In xchk_nlinks_ilock_dir, take the IOLOCK before accessing internal
    inode state to figure out if we need to take ILOCK shared or exclusive.
    That way we can't race with directory updates.  LOLLM pointed out that
    the code was initially correct w.r.t. the IOLOCK, but then I broke it.
    
    Cc: stable@vger.kernel.org # v6.18
    Fixes: f477af0cfa0487 ("xfs: fix locking in xchk_nlinks_collect_dir")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: only check mergeability of bnobt records [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:22:59 2026 -0700

    xfs: only check mergeability of bnobt records
    
    commit 97efed1091a50e4dbf31307015138b43a972d2e4 upstream.
    
    In the cntbt (free space by block count) btree, records are not supposed
    to be in startblock order.  Hence the mergeability check is pointless.
    Remove it, since it does nothing, as LOLLM points out.
    
    Cc: stable@vger.kernel.org # v6.4
    Fixes: d5784ae82778d9 ("xfs: flag free space btree records that could be merged")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: pass runtime errors from xrep_iunlink_mark_ondisk_rec up to callers [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:25:35 2026 -0700

    xfs: pass runtime errors from xrep_iunlink_mark_ondisk_rec up to callers
    
    commit 5644fab990fc72406dddc91cbb8304659d77f3f1 upstream.
    
    LOLLM points out that the only error that xrep_iunlink_mark_ondisk_rec
    returns is ENOMEM, but we ignore that, and can end up writing a garbage
    AGI based on incomplete information.  We shouldn't do that, though here
    we must be screen out EFSCORRUPTED/EFSBASDCRC because we haven't
    checked the inobt yet.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: ab97f4b1c03075 ("xfs: repair AGI unlinked inode bucket lists")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: set the prev pointer when reinserting an inode on the unlinked list [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Sun Jul 26 22:26:37 2026 -0700

    xfs: set the prev pointer when reinserting an inode on the unlinked list
    
    commit af146cb7ff8ff5c54162f35c238f3ff1d5ad110f upstream.
    
    If we find a rogue free inode and decide to reinsert it into the
    unlinked list, we need to set the prev pointer to NULLAGINO so that the
    incore list gets updated.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: ab97f4b1c03075 ("xfs: repair AGI unlinked inode bucket lists")
    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

xfs: zero i_nlink before repair puts inode on unlinked list [+ + +]
Author: Darrick J. Wong <djwong@kernel.org>
Date:   Mon Jul 20 20:24:33 2026 -0700

    xfs: zero i_nlink before repair puts inode on unlinked list
    
    commit 49933254ba8d421ed706cbe6ed0fbc264e572cab upstream.
    
    LOLLM observes that we don't reset i_nlink if we encounter a file with
    no parent that isn't on the unlinked list.  This causes unnecessary
    assertion trips on debugging kernels and an inconsistent file, so let's
    fix that.
    
    Cc: stable@vger.kernel.org # v6.10
    Fixes: 669dfe883c8e20 ("xfs: update the unlinked list when repairing link counts")
    Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
    Assisted-by: LOLLM # finding obvious bugs
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Carlos Maiolino <cem@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>