ext4: fix header check in ext4_ext_search_right() for deep extent trees.
authorEric Sandeen <sandeen@redhat.com>
Tue, 10 Mar 2009 22:18:47 +0000 (18:18 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 10 Mar 2009 22:18:47 +0000 (18:18 -0400)
commit395a87bfefbc400011417e9eaae33169f9f036c0
tree1f0d0f85f33166c9d6187102573a683c27d3e849
parent041b62374c7fedc11a8a1eeda2868612d3d1436c
ext4: fix header check in ext4_ext_search_right() for deep extent trees.

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=12821

Reported-by: David Dindorp <ddi@dubex.dk>
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/extents.c