mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-28 05:20:27 +09:00
ext4: fix hole length detection in ext4_ind_map_blocks()
commit2ee3ee06a8upstream. When ext4_ind_map_blocks() computes a length of a hole, it doesn't count with the fact that mapped offset may be somewhere in the middle of the completely empty subtree. In such case it will return too large length of the hole which then results in lseek(SEEK_DATA) to end up returning an incorrect offset beyond the end of the hole. Fix the problem by correctly taking offset within a subtree into account when computing a length of a hole. Fixes:facab4d971CC: stable@vger.kernel.org Reported-by: Jeff Mahoney <jeffm@suse.com> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2435d6b110
commit
42cc42eaba
@@ -560,10 +560,16 @@ int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
|
||||
unsigned epb = inode->i_sb->s_blocksize / sizeof(u32);
|
||||
int i;
|
||||
|
||||
/* Count number blocks in a subtree under 'partial' */
|
||||
count = 1;
|
||||
for (i = 0; partial + i != chain + depth - 1; i++)
|
||||
count *= epb;
|
||||
/*
|
||||
* Count number blocks in a subtree under 'partial'. At each
|
||||
* level we count number of complete empty subtrees beyond
|
||||
* current offset and then descend into the subtree only
|
||||
* partially beyond current offset.
|
||||
*/
|
||||
count = 0;
|
||||
for (i = partial - chain + 1; i < depth; i++)
|
||||
count = count * epb + (epb - offsets[i] - 1);
|
||||
count++;
|
||||
/* Fill in size of a hole we found */
|
||||
map->m_pblk = 0;
|
||||
map->m_len = min_t(unsigned int, map->m_len, count);
|
||||
|
||||
Reference in New Issue
Block a user