Author: Eric Sandeen <email address hidden>
Date: Tue Mar 10 18:18:47 2009 -0400
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)
Bug #337246 launchpad. net/bugs/ 337246
http://
"kernel bug corrupts filesystem on heavy parallel I/O"
Upstream has received a patch that fixes this issue via
http:// bugzilla. kernel. org/show_ bug.cgi? id=12821
I've confirmed it applies cleanly to Jaunty.
Please cherry-pick commit 395a87bfefbc400 011417e9eaae331 69f9f036c0
Author: Eric Sandeen <email address hidden>
Date: Tue Mar 10 18:18:47 2009 -0400
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 check_header( ) does just this.
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_
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 <email address hidden>
Signed-off-by: Eric Sandeen <email address hidden>
Signed-off-by: "Theodore Ts'o" <email address hidden>
Committed via bug #346194