Details

[Home]

Issue of the Implementation # F0005

Brief

ext4: system hangs after failure in ext4_mb_new_preallocation()

Detailed Description

If memory allocation in ext4_mb_new_group_pa() is failed, it returns error code, ext4_mb_new_preallocation() propages it,but ext4_mb_new_blocks() ignores it. An observed result was:

- allocation fail means ext4_mb_new_group_pa() does not update ext4_allocation_context;
- ext4_mb_new_blocks() sets ext4_allocation_request->len (ar->len = ac->ac_b_ex.fe_len;)
  to number of blocks preallocated (512) instead of number of blocks requested (1);
- that activates update cycle in ext4_splice_branch():
    for (i = 1; i < blks; i++) <-- blks is 512 instead of 1 here
      *(where->p + i) = cpu_to_le32(current_block++);
- it iterates 511 times and corrupts a chunk of memory including inode structure;
- page fault happens at EXT4_SB(inode->i_sb) in ext4_mark_inode_dirty();
- system hangs with "scheduling while atomic" BUG.

Component

linux-kernel 3.9

Accepted

https://lkml.org/lkml/2013/5/5/64
commit

Status

Fixed in kernel 3.10-rc3

[Home]