• Eric Whitney's avatar
    ext4: fix delayed allocation bug in ext4_clu_mapped for bigalloc + inline · 131294c3
    Eric Whitney authored
    When converting files with inline data to extents, delayed allocations
    made on a file system created with both the bigalloc and inline options
    can result in invalid extent status cache content, incorrect reserved
    cluster counts, kernel memory leaks, and potential kernel panics.
    
    With bigalloc, the code that determines whether a block must be
    delayed allocated searches the extent tree to see if that block maps
    to a previously allocated cluster.  If not, the block is delayed
    allocated, and otherwise, it isn't.  However, if the inline option is
    also used, and if the file containing the block is marked as able to
    store data inline, there isn't a valid extent tree associated with
    the file.  The current code in ext4_clu_mapped() calls
    ext4_find_extent() to search the non-existent tree for a previously
    allocated cluster anyway, which typically finds nothing, as desired.
    However, a side effect of the search can be to cache invalid content
    from the non-existent tree (garbage) in the extent status tree,
    including bogus entries in the pending reservation tree.
    
    To fix this, avoid searching the extent tree when allocating blocks
    for bigalloc + inline files that are being converted from inline to
    extent mapped.
    Signed-off-by: default avatarEric Whitney <enwlinux@gmail.com>
    Link: https://lore.kernel.org/r/20221117152207.2424-1-enwlinux@gmail.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Cc: stable@kernel.org
    131294c3
extents.c 166 KB