• E
    ext4: fix premature freeing of partial clusters split across leaf blocks · ad6599ab
    Eric Whitney 提交于
    Xfstests generic/311 and shared/298 fail when run on a bigalloc file
    system.  Kernel error messages produced during the tests report that
    blocks to be freed are already on the to-be-freed list.  When e2fsck
    is run at the end of the tests, it typically reports bad i_blocks and
    bad free blocks counts.
    
    The bug that causes these failures is located in ext4_ext_rm_leaf().
    Code at the end of the function frees a partial cluster if it's not
    shared with an extent remaining in the leaf.  However, if all the
    extents in the leaf have been removed, the code dereferences an
    invalid extent pointer (off the front of the leaf) when the check for
    sharing is made.  This generally has the effect of unconditionally
    freeing the partial cluster, which leads to the observed failures
    when the partial cluster is shared with the last extent in the next
    leaf.
    
    Fix this by attempting to free the cluster only if extents remain in
    the leaf.  Any remaining partial cluster will be freed if possible
    when the next leaf is processed or when leaf removal is complete.
    Signed-off-by: NEric Whitney <enwlinux@gmail.com>
    Signed-off-by: N"Theodore Ts'o" <tytso@mit.edu>
    Cc: stable@vger.kernel.org
    ad6599ab
extents.c 148.6 KB