Odebrany

CVE-2026-92501

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ę:

ext4: opróżnij DIO w locie przed rezerwowym zapisem buforowanym

generyczny/746 zaczął sporadycznie ulegać awariom na ext3 (i-węzły bez zasięgu).
Test wyzwala „Błąd unieważnienia pamięci podręcznej strony przy bezpośrednim we/wy”
ostrzeżenia i późniejsze fsync zwraca -EIO. Dodanie opóźnienia 50 ms
pomiędzy ext4_buffered_write_iter() i filemap_write_and_wait_range()
w ext4_dio_write_iter() sprawia, że wyścig jest prawie zawsze odtwarzalny.

W przypadku i-węzłów DIO zapisuje do dziur i nie może używać niezapisanych zakresów,
więc ext4_iomap_alloc() pozostawia m_flags=0, a ext4_map_blocks() zwraca 0.
Następnie warstwa iomap zwraca -ENOTBLK, powodując powrót do buforowanych operacji we/wy.

Ścieżka rezerwowa w wywołaniach ext4_dio_write_iter().
ext4_buffered_write_iter(), która brudzi strony, a następnie opróżnia i
unieważnić. Jednak pomiędzy nimi znajduje się niechronione okno
ext4_buffered_write_iter() powraca (ze zwolnioną blokadą i-węzła) i
kolejne spłukiwanie + unieważnienie.

Można uruchomić współbieżne asynchroniczne uzupełnienia DIO z innych wątków
kiocb_invalidate_post_direct_write() w tym oknie. Jeśli strony mają
został ponownie zabrudzony, po unieważnieniu znajduje brudne strony i uruchamia
ostrzeżenie, ustawienie -EIO w sekwencji błędów.

Rozważmy plik o dwóch rozmiarach 4 tys.: [dziura] [napisany]. Wątek A tak
DIO w zakresie zapisanym, podczas gdy wątek B wykonuje DIO obejmujące oba:

kworker A (4k DIO, przydzielony blok) kworker B (8k DIO, rezerwa)
---------------------------------- ----------------------------
inode_lock_shared() inode_lock_shared()
iomap_dio_rw(): iomap_dio_rw():
kiocb_invalidate_pages -> wyczyść iomap_begin -> -ENOTBLK
Submit_bio (asynchronicznie) dio->rozmiar = 0
inode_unlock_shared() inode_unlock_shared()

[biooczekujące w warstwie blokowej] /* rozwiązanie awaryjne: blokada zwolniona */
ext4_buffered_write_iter()
inode_lock (wyłącznie)
rodzajowy_wykonaj_write()
-> brudne strony [0, 8k]
inode_unlock (wyłącznie)

/* strony brudne, brak zamka */
[bio uzupełnia] filemap_write_and_wait_range()
iomap_dio_complete() -> opróżnij brudne strony
kiocb_invalidate_post_direct_write() validate_mapping_pages()
unieważnić_inode_pages2_range()
-> znajduje brudną stronę!
-> dio_warn_stale_pagecache()
-> errseq_set(-EIO)

Ten problem może zostać wywołany przez normalne ścieżki we/wy, a nie tylko
celowo nakładające się zapisy DIO z przestrzeni użytkownika. Na przykład
generyczny/746 używa urządzenia pętlowego, w którym wielu kworkerów wydaje jednocześnie
We/Wy do pliku kopii zapasowej. Dodatkowo, gdy rozmiar_bloku < rozmiar_folio,
mogą również zostać wywołane nienakładające się zapisy DIO, które dzielą duże folio
wyścig.

Dodaj wcześniej inode_dio_wait() w ext4_buffered_write_iter().
ext4_write_checks(), aby opróżnić wszystkie DIO w locie. To gwarantuje
wszystkie DIO czyści istniejące strony przed przesłaniem IO (przez
kiocb_invalidate_pages()), wszystkie BIO czekają na zakończenie wszystkich DIO
(poprzez inode_dio_wait()), a ext4_write_checks() obserwuje i-węzeł
size po zakończeniu wszystkich DIO, więc ext4_block_zero_eof() nie
ścigaj się z pokładowym DIO, eliminując w ten sposób wyścig.

>_ 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