Подробности
[В начало]
Проблема в реализации № F0005
Краткое описание
ext4: зависание системы ввиду некорректной обработки нехватки памяти в ext4_mb_new_preallocation()
Подробное описание
В случае нехватки памяти в ext4_mb_new_group_pa(), эта функция возвращает соответствующий код ошибки, ext4_mb_new_preallocation() прокидывает его дальше,но ext4_mb_new_blocks() игнорирует его. В результате в нашем тесте события развивались следующим образом:
- сбой приводит к тому, что ext4_mb_new_group_pa() не обновляет ext4_allocation_context; - ext4_mb_new_blocks() устанавливает ext4_allocation_request->len (ar->len = ac->ac_b_ex.fe_len;) в число выделенных блоков (512) вместо числа запрошенных блокоы (1); - это приводит к циклу обновления в ext4_splice_branch(): for (i = 1; i < blks; i++) <-- blks здесь равно 512 вместо 1 *(where->p + i) = cpu_to_le32(current_block++); - этот цикл отрабатывает 511 раз и портит кусок памяти, в который попадает структура inode; - случается page fault в EXT4_SB(inode->i_sb) в ext4_mark_inode_dirty(); - система зависает с сообщением "scheduling while atomic" BUG.
Компонент
linux-kernel 3.9
Принято
https://lkml.org/lkml/2013/5/5/64
commit
Статус
Исправлено в kernel 3.10-rc3
[В начало]
»