In the Linux kernel, the following vulnerability has been resolved:
ceph: fix i_nlink underrun during async unlink
During async unlink, we drop the `i_nlink` counter before we receive the completion (that will eventually update the `i_nlink`) because "we assume that the unlink will succeed". That is not a bad idea, but it races against deletions by other clients (or against the completion of our own unlink) and can lead to an underrun which emits a WARNING like this one:
WARNING: CPU: 85 PID: 25093 at fs/inode.c:407 drop_nlink+0x50/0x68 Modules linked in: CPU: 85 UID: 3221252029 PID: 25093 Comm: php-cgi8.1 Not tainted 6.14.11-cm4all1-ampere #655 Hardware name: Supermicro ARS-110M-NR/R12SPD-A, BIOS 1.1b 10/17/2023 pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : drop_nlink+0x50/0x68 lr : ceph_unlink+0x6c4/0x720 sp : ffff80012173bc90 x29: ffff80012173bc90 x28: ffff086d0a45aaf8 x27: ffff0871d0eb5680 x26: ffff087f2a64a718 x25: 0000020000000180 x24: 0000000061c88647 x23: 0000000000000002 x22: ffff07ff9236d800 x21: 0000000000001203 x20: ffff07ff9237b000 x19: ffff088b8296afc0 x18: 00000000f3c93365 x17: 0000000000070000 x16: ffff08faffcbdfe8 x15: ffff08faffcbdfec x14: 0000000000000000 x13: 45445f65645f3037 x12: 34385f6369706f74 x11: 0000a2653104bb20 x10: ffffd85f26d73290 x9 : ffffd85f25664f94 x8 : 00000000000000c0 x7 : 0000000000000000 x6 : 0000000000000002 x5 : 0000000000000081 x4 : 0000000000000481 x3 : 0000000000000000 x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff08727d3f91e8 Call trace: drop_nlink+0x50/0x68 (P) vfs_unlink+0xb0/0x2e8 do_unlinkat+0x204/0x288 __arm64_sys_unlinkat+0x3c/0x80 invoke_syscall.constprop.0+0x54/0xe8 do_el0_svc+0xa4/0xc8 el0_svc+0x18/0x58 el0t_64_sync_handler+0x104/0x130 el0t_64_sync+0x154/0x158
In ceph_unlink(), a call to ceph_mdsc_submit_request() submits the CEPH_MDS_OP_UNLINK to the MDS, but does not wait for completion.
Meanwhile, between this call and the following drop_nlink() call, a worker thread may process a CEPH_CAP_OP_IMPORT, CEPH_CAP_OP_GRANT or just a CEPH_MSG_CLIENT_REPLY (the latter of which could be our own completion). These will lead to a set_nlink() call, updating the `i_nlink` counter to the value received from the MDS. If that new `i_nlink` value happens to be zero, it is illegal to decrement it further. But that is exactly what ceph_unlink() will do then.
The WARNING can be reproduced this way:
1. Force async unlink; only the async code path is affected. Having no real clue about Ceph internals, I was unable to find out why the MDS wouldn't give me the "Fxr" capabilities, so I patched get_caps_for_async_unlink() to always succeed.
(Note that the WARNING dump above was found on an unpatched kernel, without this kludge - this is not a theoretical bug.)
2. Add a sleep call after ceph_mdsc_submit_request() so the unlink completion gets handled by a worker thread before drop_nlink() is called. This guarantees that the `i_nlink` is already zero before drop_nlink() runs.
The solution is to skip the counter decrement when it is already zero, but doing so without a lock is still racy (TOCTOU). Since ceph_fill_inode() and handle_cap_grant() both hold the `ceph_inode_info.i_ceph_lock` spinlock while set_nlink() runs, this seems like the proper lock to protect the `i_nlink` updates.
I found prior art in NFS and SMB (using `inode.i_lock`) and AFS (using `afs_vnode.cb_lock`). All three have the zero check as well.
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Amazon Linux Ami 2 | — | Upgrade kernel-headersUpgrade kernel-debuginfo-common-x86_64Upgrade python-perfUpgrade kernel-livepatch-5.10.253-252.1015Upgrade bpftool-debuginfoUpgrade kernel-toolsUpgrade python-perf-debuginfoUpgrade kernel-tools-debuginfoUpgrade bpftoolUpgrade kernelUpgrade kernel-tools-develUpgrade kernel-debuginfoUpgrade kernel-livepatch-5.15.204-143.230Upgrade perf-debuginfoUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-develUpgrade perf | May 24, 2026 | May 24, 2026 |
| Debian | — | Upgrade linux | May 10, 2026 | May 10, 2026 |
| Redhat_linux | — | No solution exists | Jul 17, 2026 | May 8, 2026 |
| Ubuntu | — | Upgrade linux-image-nvidia-tegra-igxUpgrade linux-image-nvidia-64k-6.8Upgrade linux-image-genericUpgrade linux-image-aws-fips-6.8Upgrade linux-image-intel-iot-realtimeUpgrade linux-image-5.15.0-1095-gkeopUpgrade linux-image-intel-iot-realtime-5.15Upgrade linux-image-generic-64k-hwe-22.04Upgrade linux-image-oem-22.04aUpgrade linux-image-5.15.0-1064-nvidia-tegra-rtUpgrade linux-image-nvidia-64kUpgrade linux-image-lowlatency-64k-hwe-22.04Upgrade linux-image-6.8.0-1059-gkeUpgrade linux-image-intel-iotgUpgrade linux-image-6.8.0-1061-aws-fipsUpgrade linux-image-5.15.0-1111-realtimeUpgrade linux-image-5.15.0-1106-raspiUpgrade linux-image-6.8.1-1056-realtimeUpgrade linux-image-oem-20.04dUpgrade linux-image-generic-lpae-5.15Upgrade linux-image-nvidia-tegra-igx-5.15Upgrade linux-image-generic-hwe-22.04Upgrade linux-image-xilinxUpgrade linux-image-aws-lts-22.04Upgrade linux-image-azure-6.8Upgrade linux-image-fips-6.8Upgrade linux-image-aws-64kUpgrade linux-image-6.8.0-1058-oracle-64kUpgrade linux-image-6.8.0-1064-gcp-64kUpgrade linux-image-nvidia-tegra-rt-6.8Upgrade linux-image-6.8.0-2050-raspi-realtimeUpgrade linux-image-ibmUpgrade linux-image-aws-5.15Upgrade linux-image-generic-64k-hwe-20.04Upgrade linux-image-aws-64k-lts-22.04Upgrade linux-image-5.15.0-1112-aws-fipsUpgrade linux-image-6.8.0-1059-nvidia-lowlatency-64kUpgrade linux-image-5.15.0-1112-aws-64kUpgrade linux-image-aws-64k-6.8Upgrade linux-image-oem-20.04Upgrade linux-image-fips-5.15Upgrade linux-image-virtualUpgrade linux-image-ibm-classicUpgrade linux-image-lowlatencyUpgrade linux-image-oem-22.04bUpgrade linux-image-generic-lpaeUpgrade linux-image-virtual-hwe-22.04Upgrade linux-image-azure-fde-lts-22.04Upgrade linux-image-gcpUpgrade linux-image-nvidia-tegra-igx-rtUpgrade linux-image-kvmUpgrade linux-image-5.15.0-184-lowlatency-64kUpgrade linux-image-6.8.0-1030-nvidia-tegraUpgrade linux-image-5.15.0-1112-awsUpgrade linux-image-6.8.0-1059-nvidia-64kUpgrade linux-image-xilinx-zynqmp-5.15Upgrade linux-image-6.8.0-136-genericUpgrade linux-image-azure-fde-6.8Upgrade linux-image-oracleUpgrade linux-image-gke-5.15Upgrade linux-image-ibm-lts-24.04Upgrade linux-image-5.15.0-1112-gcpUpgrade linux-image-lowlatency-64k-6.8Upgrade linux-image-oracle-lts-22.04Upgrade linux-image-realtime-hwe-22.04Upgrade linux-image-5.15.0-1053-nvidia-tegra-igxUpgrade linux-image-gkeop-6.8Upgrade linux-image-generic-6.8Upgrade linux-image-6.8.0-136-lowlatencyUpgrade linux-image-lowlatency-hwe-20.04Upgrade linux-image-realtimeUpgrade linux-image-lowlatency-64k-5.15Upgrade linux-image-intelUpgrade linux-image-gcp-6.8Upgrade linux-image-ibm-6.8Upgrade linux-image-azure-cvmUpgrade linux-image-nvidia-64k-hwe-22.04Upgrade linux-image-azure-lts-24.04Upgrade linux-image-5.15.0-1107-nvidiaUpgrade linux-image-azure-fips-6.8Upgrade linux-image-5.15.0-186-genericUpgrade linux-image-oracle-64kUpgrade linux-image-5.15.0-1075-xilinx-zynqmpUpgrade linux-image-6.8.0-1033-xilinxUpgrade linux-image-6.8.0-1061-raspiUpgrade linux-image-6.8.0-1059-nvidia-lowlatencyUpgrade linux-image-gkeUpgrade linux-image-5.15.0-1117-azureUpgrade linux-image-kvm-5.15Upgrade linux-image-5.15.0-1107-intel-iotgUpgrade linux-image-nvidia-lowlatency-64k-6.8Upgrade linux-image-6.8.0-1064-gcp-fipsUpgrade linux-image-gcp-fips-6.8Upgrade linux-image-nvidia-hwe-22.04Upgrade linux-image-gkeopUpgrade linux-image-raspi-realtimeUpgrade linux-image-6.8.0-1063-azureUpgrade linux-image-6.8.0-1030-nvidia-tegra-rtUpgrade linux-image-lowlatency-64kUpgrade linux-image-nvidia-tegra-igx-rt-5.15Upgrade linux-image-5.15.0-186-fipsUpgrade linux-image-azure-fde-lts-24.04Upgrade linux-image-azureUpgrade linux-image-6.8.0-1061-ibmUpgrade linux-image-5.15.0-1112-gcp-fipsUpgrade linux-image-raspiUpgrade linux-image-oracle-64k-lts-24.04Upgrade linux-image-oem-22.04cUpgrade linux-image-nvidiaUpgrade linux-image-generic-hwe-20.04Upgrade linux-image-gcp-64k-lts-24.04Upgrade linux-image-oem-20.04cUpgrade linux-image-oem-20.04bUpgrade linux-image-nvidia-tegra-rt-5.15Upgrade linux-image-oracle-64k-6.8Upgrade linux-image-generic-64k-5.15Upgrade linux-image-fipsUpgrade linux-image-aws-fipsUpgrade linux-image-5.15.0-1117-azure-fdeUpgrade linux-image-5.15.0-1104-kvmUpgrade linux-image-xilinx-zynqmpUpgrade linux-image-xilinx-6.8Upgrade linux-image-virtual-6.8Upgrade linux-image-nvidia-tegra-5.15Upgrade linux-image-lowlatency-6.8Upgrade linux-image-laptop-23.10Upgrade linux-image-gke-64k-6.8Upgrade linux-image-gcp-lts-22.04Upgrade linux-image-awsUpgrade linux-image-6.8.0-1064-gcpUpgrade linux-image-6.8.0-1059-gke-64kUpgrade linux-image-5.15.0-1108-gkeUpgrade linux-image-5.15.0-1107-nvidia-lowlatencyUpgrade linux-image-aws-6.8Upgrade linux-image-intel-iotg-5.15Upgrade linux-image-5.15.0-1109-oracleUpgrade linux-image-virtual-5.15Upgrade linux-image-gcp-5.15Upgrade linux-image-nvidia-lowlatencyUpgrade linux-image-lowlatency-hwe-22.04Upgrade linux-image-gke-6.8Upgrade linux-image-gcp-64k-6.8Upgrade linux-image-6.8.0-136-generic-64kUpgrade linux-image-6.8.0-1058-oracleUpgrade linux-image-raspi-5.15Upgrade linux-image-nvidia-lowlatency-6.8Upgrade linux-image-nvidia-lowlatency-5.15Upgrade linux-image-oracle-6.8Upgrade linux-image-raspi-6.8Upgrade linux-image-lowlatency-5.15Upgrade linux-image-gcp-lts-24.04Upgrade linux-image-azure-fips-5.15Upgrade linux-image-azure-5.15Upgrade linux-image-5.15.0-1117-azure-fipsUpgrade linux-image-oracle-5.15Upgrade linux-image-azure-fipsUpgrade linux-image-raspi-realtime-6.8Upgrade linux-image-5.15.0-186-generic-lpaeUpgrade linux-image-ibm-5.15Upgrade linux-image-6.8.0-1061-aws-64kUpgrade linux-image-6.8.0-1061-awsUpgrade linux-image-6.8.0-1046-gkeopUpgrade linux-image-nvidia-tegraUpgrade linux-image-nvidia-lowlatency-64kUpgrade linux-image-gkeop-5.15Upgrade linux-image-gke-64kUpgrade linux-image-generic-5.15Upgrade linux-image-azure-lts-22.04Upgrade linux-image-azure-fde-5.15Upgrade linux-image-aws-64k-lts-24.04Upgrade linux-image-6.8.0-1059-nvidiaUpgrade linux-image-5.15.0-186-generic-64kUpgrade linux-image-5.15.0-184-lowlatencyUpgrade linux-image-5.15.0-1104-intel-iot-realtimeUpgrade linux-image-5.15.0-1064-nvidia-tegraUpgrade linux-image-5.15.0-1053-nvidia-tegra-igx-rtUpgrade linux-image-realtime-5.15Upgrade linux-image-oem-22.04dUpgrade linux-image-oem-22.04Upgrade linux-image-nvidia-5.15Upgrade linux-image-lowlatency-64k-hwe-20.04Upgrade linux-image-gcp-fips-5.15Upgrade linux-image-gcp-fipsUpgrade linux-image-gcp-64kUpgrade linux-image-generic-lpae-hwe-20.04Upgrade linux-image-generic-64k-6.8Upgrade linux-image-generic-64kUpgrade linux-image-azure-fdeUpgrade linux-image-aws-fips-5.15Upgrade linux-image-aws-64k-5.15Upgrade linux-image-6.8.0-136-lowlatency-64kUpgrade linux-image-6.8.0-1062-azure-fdeUpgrade linux-image-virtual-hwe-20.04Upgrade linux-image-6.8.0-136-fipsUpgrade linux-image-nvidia-tegra-rtUpgrade linux-image-realtime-6.8.1Upgrade linux-image-oracle-lts-24.04Upgrade linux-image-nvidia-tegra-6.8Upgrade linux-image-nvidia-6.8Upgrade linux-image-6.8.0-1063-azure-fipsUpgrade linux-image-5.15.0-1106-ibmUpgrade linux-image-raspi-nolpaeUpgrade linux-image-aws-lts-24.04 | Jul 20, 2026 | May 8, 2026 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | Jun 12, 2026 | May 8, 2026 |
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub