Odebrany

CVE-2026-90264

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

btrfs: zawsze czekaj na zamówione zakresy, aby uniknąć wyścigów OE

[BŁĄD]
Syzbot zgłosił błąd polegający na tym, że mogą istnieć konflikty OE dla tego samego
zakres:

Krytyczny BTRFS (pętla urządzenia 4): panika w wstawce_ordered_extent:264: nakładające się uporządkowane zakresy, istniejące oe file_offset 16384 num_bytes 430080 flagi 0x1089, nowe oe file_offset 16384 num_bytes 430080 flagi 0x80 (errno=-17 Object alrea[ 179.162726][ T6897] Krytyczny BTRFS (pętla urządzenia 4): panika w wstawce_ordered_extent:264: nakładające się uporządkowane zakresy, istniejące oe file_offset 16384 num_bytes 430080 flags 0x1089, nowe oe file_offset 16384 num_bytes 430080 flagi 0x80 (errno=-17 Obiekt już istnieje)
------------[przetnij tutaj ]------------
BŁĄD jądra w fs/btrfs/ordered-data.c:264!
Nazwa sprzętu: Google Google Compute Engine/Google Compute Engine, BIOS Google 09.05.2026
RIP: 0010:btrfs_alloc_ordered_extent+0x943/0xad0
Zadzwoń do śledzenia:
<ZADANIE>
zakres_pliku_krowy+0x744/0x12a0
fallback_to_cow+0x5ea/0xa00
run_delalloc_nocow+0x110c/0x17a0
btrfs_run_delalloc_range+0xbe4/0x1c20
writepage_delalloc+0x104d/0x1ba0
btrfs_writepages+0x1667/0x28b0
do_writepages+0x338/0x560
filemap_fdatawrite_range+0x1f2/0x300
btrfs_fdatawrite_range+0x54/0xf0
btrfs_direct_write+0x6a0/0xc30
btrfs_do_write_iter+0x329/0x790
do_iter_readv_writev+0x624/0x8d0
vfs_writev+0x34c/0x990
__se_sys_pwritev2+0x17a/0x2a0
do_syscall_64+0x174/0x580
wpis_SYSCALL_64_after_hwframe+0x77/0x7f
</ZADANIE>
---[koniec śladu 0000000000000000 ]---

[PRZYCZYNA]
Od czasu zatwierdzenia ff66fe666233 („btrfs: napraw nieprawidłowe buforowane rezerwowe wejście/wyjście
dla dołączania bezpośrednich zapisów”), jeśli bezpośrednie IO zakończy się krótko, zrobimy to
przywróć rozmiar isize z powrotem do pierwotnego, aby można było dodawać zapisy
przestrzegane podczas buforowanego powrotu.

Zwykle podczas operacji polegamy na funkcji lock_and_cleanup_extent_if_need().
buforowany zapis zwrotny w celu oczekiwania na istniejące uporządkowane zakresy.

Ale ten uporządkowany zakres oczekiwania ma miejsce tylko wtedy, gdy start_pos znajduje się w środku
rozmiar.
Ponieważ przywróciliśmy wartość isize podczas nieudanego bezpośredniego wejścia/wyjścia, nie zrobimy tego
poczekaj na zamówione zakresy.

Oznacza to, że możemy zorganizować wyścig, w którym nadal będzie obowiązywać bezpośredni OE OE
drzewo, gotowe, ale jeszcze nie usunięte, następnie wstawiamy OE dla
buforowany zapis, powodujący powyższą awarię.

[POPRAWKA]
Spraw, aby OE czekało na bezwarunkowe, aby obsłużyć przywrócony rozmiar
sytuacja.

A ponieważ lock_and_cleanup_extent_if_need() teraz albo zablokuj
ekstensje lub zwróć -EAGAIN, usuń także gałęzie, które obsługują
przypadki bez blokady i zmień jego nazwę, aby usunąć przyrostek „_if_need”.

Poniższy mikrotest porównawczy pokazuje różnicę w czasie działania dla
btrfs_buffered_write(), wykonując obciążenie `xfs_io -f -c "pwrite 0 1m"`,
wszystkie wartości są średnim czasem działania w nano sekundach.

czas wykonania funkcji | przed | po
----------------------------------+------------+-----------------------------
lock_and_cleanup_extent_if_need() | 58,2 | 183,0
btrfs_buffered_write() | 2115,6 | 2973.3

Ogólny czas działania btrfs_buffered_write() jest nadal ładny
malutki (wciąż mniej niż 3 mikrosekundy), powiedziałbym, że dodatkowy koszt jest nadal
akceptowalne.

Alternatywą rozwiązania tego problemu jest poczekanie na zamówione zakresy w trakcie
iomap_end() gdzie przywracane jest rozmiar.

Ale to rozwiązanie złamie wymagania nowait, tak jakby było to nowe rozwiązanie bezpośrednie
IO zakończyło się krótko, musimy bezwarunkowo poczekać na OE lub
następne dołączenie buforowanego wejścia/wyjścia może nadal powodować ten sam problem.

Więc tutaj musimy przenieść koszt oczekiwania na zapis buforowany, ale przynajmniej
kod jest nieco bardziej usprawniony.

>_ Referencje

Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.

This product uses the NVD API but is not endorsed or certified by the NVD.

Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.

CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.

NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org