• Eric Sandeen's avatar
    ext4: fix header check in ext4_ext_search_right() for deep extent trees. · 395a87bf
    Eric Sandeen authored
    The ext4_ext_search_right() function is confusing; it uses a
    "depth" variable which is 0 at the root and maximum at the leaves, 
    but the on-disk metadata uses a "depth" (actually eh_depth) which
    is opposite: maximum at the root, and 0 at the leaves.
    
    The ext4_ext_check_header() function is given a depth and checks
    the header agaisnt that depth; it expects the on-disk semantics,
    but we are giving it the opposite in the while loop in this 
    function.  We should be giving it the on-disk notion of "depth"
    which we can get from (p_depth - depth) - and if you look, the last
    (more commonly hit) call to ext4_ext_check_header() does just this.
    
    Sending in the wrong depth results in (incorrect) messages
    about corruption:
    
    EXT4-fs error (device sdb1): ext4_ext_search_right: bad header
    in inode #2621457: unexpected eh_depth - magic f30a, entries 340,
    max 340(0), depth 1(2)
    
    http://bugzilla.kernel.org/show_bug.cgi?id=12821Reported-by: default avatarDavid Dindorp <ddi@dubex.dk>
    Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    395a87bf
extents.c 82.1 KB