Подробности

[В начало]

Проблема в реализации № 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

[В начало]