In the Linux kernel, the following vulnerability has been resolved:
btrfs: fix racy bitfield write in btrfs_clear_space_info_full()
From the memory-barriers.txt document regarding memory barrier ordering guarantees:
(*) These guarantees do not apply to bitfields, because compilers often generate code to modify these using non-atomic read-modify-write sequences. Do not attempt to use bitfields to synchronize parallel algorithms.
(*) Even in cases where bitfields are protected by locks, all fields in a given bitfield must be protected by one lock. If two fields in a given bitfield are protected by different locks, the compiler's non-atomic read-modify-write sequences can cause an update to one field to corrupt the value of an adjacent field.
btrfs_space_info has a bitfield sharing an underlying word consisting of the fields full, chunk_alloc, and flush:
struct btrfs_space_info { struct btrfs_fs_info * fs_info; /* 0 8 */ struct btrfs_space_info * parent; /* 8 8 */ ... int clamp; /* 172 4 */ unsigned int full:1; /* 176: 0 4 */ unsigned int chunk_alloc:1; /* 176: 1 4 */ unsigned int flush:1; /* 176: 2 4 */ ...
Therefore, to be safe from parallel read-modify-writes losing a write to one of the bitfield members protected by a lock, all writes to all the bitfields must use the lock. They almost universally do, except for btrfs_clear_space_info_full() which iterates over the space_infos and writes out found->full = 0 without a lock.
Imagine that we have one thread completing a transaction in which we finished deleting a block_group and are thus calling btrfs_clear_space_info_full() while simultaneously the data reclaim ticket infrastructure is running do_async_reclaim_data_space():
T1 T2 btrfs_commit_transaction btrfs_clear_space_info_full data_sinfo->full = 0 READ: full:0, chunk_alloc:0, flush:1 do_async_reclaim_data_space(data_sinfo) spin_lock(&space_info->lock); if(list_empty(tickets)) space_info->flush = 0; READ: full: 0, chunk_alloc:0, flush:1 MOD/WRITE: full: 0, chunk_alloc:0, flush:0 spin_unlock(&space_info->lock); return; MOD/WRITE: full:0, chunk_alloc:0, flush:1
and now data_sinfo->flush is 1 but the reclaim worker has exited. This breaks the invariant that flush is 0 iff there is no work queued or running. Once this invariant is violated, future allocations that go into __reserve_bytes() will add tickets to space_info->tickets but will see space_info->flush is set to 1 and not queue the work. After this, they will block forever on the resulting ticket, as it is now impossible to kick the worker again.
I also confirmed by looking at the assembly of the affected kernel that it is doing RMW operations. For example, to set the flush (3rd) bit to 0, the assembly is: andb $0xfb,0x60(%rbx) and similarly for setting the full (1st) bit to 0: andb $0xfe,-0x20(%rax)
So I think this is really a bug on practical systems. I have observed a number of systems in this exact state, but am currently unable to reproduce it.
Rather than leaving this footgun lying around for the future, take advantage of the fact that there is room in the struct anyway, and that it is already quite large and simply change the three bitfield members to bools. This avoids writes to space_info->full having any effect on ---truncated---
CVSS Details
- CVSS 3.1 Base Score: 5.5
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Amazon Linux Ami 2 | — | Upgrade perfUpgrade python-perf-debuginfoUpgrade kernelUpgrade kernel-headersUpgrade python-perfUpgrade kernel-toolsUpgrade kernel-tools-develUpgrade perf-debuginfoUpgrade kernel-debuginfoUpgrade kernel-debuginfo-common-aarch64Upgrade kernel-tools-debuginfoUpgrade bpftool-debuginfoUpgrade bpftoolUpgrade kernel-debuginfo-common-x86_64Upgrade kernel-livepatch-5.15.201-140.219Upgrade kernel-devel | May 20, 2026 | May 20, 2026 |
| Debian | — | Upgrade linuxUpgrade linux-6.1 | Mar 16, 2026 | Mar 16, 2026 |
| Ubuntu | — | Upgrade linux-image-nvidia-lowlatency-5.15Upgrade linux-image-nvidia-tegra-igxUpgrade linux-image-lowlatency-hwe-22.04Upgrade linux-image-virtualUpgrade linux-image-virtual-5.15Upgrade linux-image-5.15.0-1104-intel-iot-realtimeUpgrade linux-image-5.15.0-186-generic-64kUpgrade linux-image-6.17.0-1010-raspiUpgrade linux-image-5.15.0-184-lowlatency-64kUpgrade linux-image-6.8.0-1055-ibmUpgrade linux-image-raspi-nolpaeUpgrade linux-image-6.8.0-1058-gcp-fipsUpgrade linux-image-gcp-5.15Upgrade linux-image-5.15.0-1108-gkeUpgrade linux-image-6.17.0-1008-realtimeUpgrade linux-image-6.17.0-1009-oracle-64kUpgrade linux-image-6.8.0-1041-gkeopUpgrade linux-image-aws-lts-24.04Upgrade linux-image-generic-5.15Upgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-aws-64k-5.15Upgrade linux-image-aws-64k-6.17Upgrade linux-image-awsUpgrade linux-image-azure-fips-6.8Upgrade linux-image-generic-6.8Upgrade linux-image-nvidia-tegra-rt-6.8Upgrade linux-image-gcp-6.8Upgrade linux-image-ibm-classicUpgrade linux-image-5.15.0-186-genericUpgrade linux-image-aws-64k-6.8Upgrade linux-image-oem-6.17Upgrade linux-image-gkeop-5.15Upgrade linux-image-6.8.0-117-lowlatencyUpgrade linux-image-gcp-lts-24.04Upgrade linux-image-5.15.0-1095-gkeopUpgrade linux-image-5.15.0-1111-realtimeUpgrade linux-image-gcp-64k-6.17Upgrade linux-image-azure-fdeUpgrade linux-image-generic-64k-6.8Upgrade linux-image-5.15.0-186-fipsUpgrade linux-image-6.17.0-19-generic-64kUpgrade linux-image-5.15.0-1064-nvidia-tegra-rtUpgrade linux-image-kvmUpgrade linux-image-nvidia-lowlatency-64kUpgrade linux-image-5.15.0-1104-kvmUpgrade linux-image-ibm-lts-24.04Upgrade linux-image-nvidia-tegra-igx-rt-5.15Upgrade linux-image-generic-lpae-hwe-20.04Upgrade linux-image-azure-fipsUpgrade linux-image-lowlatency-64k-5.15Upgrade linux-image-aws-64k-lts-24.04Upgrade linux-image-6.8.0-1058-gcpUpgrade linux-image-aws-fips-5.15Upgrade linux-image-aws-fips-6.8Upgrade linux-image-6.8.0-1059-azureUpgrade linux-image-aws-lts-22.04Upgrade linux-image-6.8.0-1024-nvidia-tegraUpgrade linux-image-6.8.0-1054-nvidia-lowlatency-64kUpgrade linux-image-azure-cvmUpgrade linux-image-oracle-lts-22.04Upgrade linux-image-5.15.0-1107-intel-iotgUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-virtual-6.8Upgrade linux-image-oem-24.04bUpgrade linux-image-gcp-fips-5.15Upgrade linux-image-oracleUpgrade linux-image-oracle-6.17Upgrade linux-image-6.17.0-1009-gcpUpgrade linux-image-6.8.0-117-genericUpgrade linux-image-aws-5.15Upgrade linux-image-6.17.0-1009-gcp-64kUpgrade linux-image-fips-6.8Upgrade linux-image-5.15.0-184-lowlatencyUpgrade linux-image-5.15.0-1117-azureUpgrade linux-image-6.17.0-19-genericUpgrade linux-image-gcp-6.17Upgrade linux-image-lowlatency-64k-6.8Upgrade linux-image-nvidia-lowlatencyUpgrade linux-image-lowlatency-6.8Upgrade linux-image-oracle-64k-6.17Upgrade linux-image-gcp-fipsUpgrade linux-image-generic-64k-6.17Upgrade linux-image-ibm-6.8Upgrade linux-image-xilinx-zynqmp-5.15Upgrade linux-image-nvidia-tegra-rtUpgrade linux-image-oem-20.04dUpgrade linux-image-nvidia-lowlatency-64k-6.8Upgrade linux-image-lowlatency-64k-hwe-20.04Upgrade linux-image-azure-fde-5.15Upgrade linux-image-generic-64k-5.15Upgrade linux-image-6.8.0-1058-gcp-64kUpgrade linux-image-5.15.0-1053-nvidia-tegra-igx-rtUpgrade linux-image-realtimeUpgrade linux-image-5.15.0-1053-nvidia-tegra-igxUpgrade linux-image-nvidia-64k-6.8Upgrade linux-image-5.15.0-1109-oracleUpgrade linux-image-oem-24.04cUpgrade linux-image-azure-lts-24.04Upgrade linux-image-gke-64kUpgrade linux-image-6.8.0-1054-gke-64kUpgrade linux-image-aws-fipsUpgrade linux-image-5.15.0-1112-awsUpgrade linux-image-generic-hwe-20.04Upgrade linux-image-intel-iot-realtime-5.15Upgrade linux-image-5.15.0-1107-nvidia-lowlatencyUpgrade linux-image-6.8.0-1055-aws-fipsUpgrade linux-image-6.17.0-1009-awsUpgrade linux-image-gcp-lts-22.04Upgrade linux-image-6.8.0-117-generic-64kUpgrade linux-image-nvidiaUpgrade linux-image-intel-iotgUpgrade linux-image-gcp-64k-6.8Upgrade linux-image-gke-64k-6.8Upgrade linux-image-gke-6.8Upgrade linux-image-generic-64kUpgrade linux-image-azure-fde-lts-22.04Upgrade linux-image-azureUpgrade linux-image-5.15.0-1107-nvidiaUpgrade linux-image-xilinx-zynqmpUpgrade linux-image-virtual-6.17Upgrade linux-image-raspi-realtimeUpgrade linux-image-oem-24.04Upgrade linux-image-azure-5.15Upgrade linux-image-oem-20.04Upgrade linux-image-6.8.0-116-fipsUpgrade linux-image-6.8.0-1059-azure-fipsUpgrade linux-image-6.8.0-1056-azureUpgrade linux-image-6.8.0-1054-gkeUpgrade linux-image-5.15.0-186-generic-lpaeUpgrade linux-image-5.15.0-1106-ibmUpgrade linux-image-oracle-64kUpgrade linux-image-oem-20.04cUpgrade linux-image-lowlatency-hwe-20.04Upgrade linux-image-gkeUpgrade linux-image-fipsUpgrade linux-image-azure-lts-22.04Upgrade linux-image-aws-6.8Upgrade linux-image-realtime-6.17Upgrade linux-image-6.8.0-1054-nvidiaUpgrade linux-image-lowlatency-64k-hwe-22.04Upgrade linux-image-nvidia-lowlatency-6.8Upgrade linux-image-nvidia-6.8Upgrade linux-image-gke-5.15Upgrade linux-image-aws-64kUpgrade linux-image-xilinx-6.8Upgrade linux-image-nvidia-tegra-rt-5.15Upgrade linux-image-gkeopUpgrade linux-image-raspi-5.15Upgrade linux-image-raspiUpgrade linux-image-ibmUpgrade linux-image-5.15.0-1112-aws-64kUpgrade linux-image-gcpUpgrade linux-image-6.8.0-117-lowlatency-64kUpgrade linux-image-6.8.0-2045-raspi-realtimeUpgrade linux-image-6.8.0-1056-raspiUpgrade linux-image-gcp-fips-6.8Upgrade linux-image-azure-fips-5.15Upgrade linux-image-azure-6.8Upgrade linux-image-6.8.0-1055-awsUpgrade linux-image-6.8.0-1032-xilinxUpgrade linux-image-6.8.0-1024-nvidia-tegra-rtUpgrade linux-image-virtual-hwe-20.04Upgrade linux-image-realtime-hwe-22.04Upgrade linux-image-nvidia-tegra-igx-5.15Upgrade linux-image-realtime-5.15Upgrade linux-image-nvidia-hwe-22.04Upgrade linux-image-intel-iot-realtimeUpgrade linux-image-generic-lpae-5.15Upgrade linux-image-gcp-64k-lts-24.04Upgrade linux-image-realtime-6.8.1Upgrade linux-image-nvidia-tegra-igx-rtUpgrade linux-image-6.17.0-1010-azureUpgrade linux-image-5.15.0-1117-azure-fipsUpgrade linux-image-oem-24.04aUpgrade linux-image-nvidia-64k-hwe-22.04Upgrade linux-image-gkeop-6.8Upgrade linux-image-6.8.0-1054-nvidia-lowlatencyUpgrade linux-image-6.8.0-1054-nvidia-64kUpgrade linux-image-6.17.0-1017-oemUpgrade linux-image-5.15.0-1112-gcpUpgrade linux-image-realtime-hwe-24.04Upgrade linux-image-nvidia-tegra-5.15Upgrade linux-image-5.15.0-1075-xilinx-zynqmpUpgrade linux-image-lowlatency-64kUpgrade linux-image-nvidia-tegra-6.8Upgrade linux-image-gcp-64kUpgrade linux-image-fips-5.15Upgrade linux-image-aws-64k-lts-22.04Upgrade linux-image-6.8.1-1051-realtimeUpgrade linux-image-virtual-hwe-24.04Upgrade linux-image-oem-24.04dUpgrade linux-image-oem-20.04bUpgrade linux-image-5.15.0-1064-nvidia-tegraUpgrade linux-image-lowlatency-5.15Upgrade linux-image-raspi-6.8Upgrade linux-image-5.15.0-1106-raspiUpgrade linux-image-generic-6.17Upgrade linux-image-intel-iotg-5.15Upgrade linux-image-5.15.0-1112-aws-fipsUpgrade linux-image-xilinxUpgrade linux-image-raspi-realtime-6.8Upgrade linux-image-raspi-6.17Upgrade linux-image-nvidia-64kUpgrade linux-image-nvidia-5.15Upgrade linux-image-kvm-5.15Upgrade linux-image-intelUpgrade linux-image-generic-64k-hwe-20.04Upgrade linux-image-genericUpgrade linux-image-generic-lpaeUpgrade linux-image-aws-6.17Upgrade linux-image-6.17.0-1009-oracleUpgrade linux-image-6.17.0-1009-aws-64kUpgrade linux-image-5.15.0-1117-azure-fdeUpgrade linux-image-5.15.0-1112-gcp-fipsUpgrade linux-image-oracle-5.15Upgrade linux-image-nvidia-tegraUpgrade linux-image-ibm-5.15Upgrade linux-image-azure-6.17Upgrade linux-image-6.8.0-1055-aws-64kUpgrade linux-image-lowlatency | Mar 17, 2026 | Dec 24, 2025 |
| Vmware Photon_os | — | Use 'tdnf update' to upgrade all packages to the latest version. | May 27, 2026 | Dec 24, 2025 |
Prioritise with Active Threat Intelligence
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