ext3,ext4: don't mess with dir_file->f_pos in htree_dirblock_to_tree()
Both ext3 and ext4 htree_dirblock_to_tree() is just filling the in-core rbtree for use by call_filldir(). All updates of ->f_pos are done by the latter; bumping it here (on error) is obviously wrong - we might very well have it nowhere near the block we'd found an error in. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Cc: stable@vger.kernel.org
This commit is contained in:
Родитель
fe52d17cdd
Коммит
64cb927371
|
@ -576,11 +576,8 @@ static int htree_dirblock_to_tree(struct file *dir_file,
|
|||
if (!ext3_check_dir_entry("htree_dirblock_to_tree", dir, de, bh,
|
||||
(block<<EXT3_BLOCK_SIZE_BITS(dir->i_sb))
|
||||
+((char *)de - bh->b_data))) {
|
||||
/* On error, skip the f_pos to the next block. */
|
||||
dir_file->f_pos = (dir_file->f_pos |
|
||||
(dir->i_sb->s_blocksize - 1)) + 1;
|
||||
brelse (bh);
|
||||
return count;
|
||||
/* silently ignore the rest of the block */
|
||||
break;
|
||||
}
|
||||
ext3fs_dirhash(de->name, de->name_len, hinfo);
|
||||
if ((hinfo->hash < start_hash) ||
|
||||
|
|
|
@ -918,11 +918,8 @@ static int htree_dirblock_to_tree(struct file *dir_file,
|
|||
bh->b_data, bh->b_size,
|
||||
(block<<EXT4_BLOCK_SIZE_BITS(dir->i_sb))
|
||||
+ ((char *)de - bh->b_data))) {
|
||||
/* On error, skip the f_pos to the next block. */
|
||||
dir_file->f_pos = (dir_file->f_pos |
|
||||
(dir->i_sb->s_blocksize - 1)) + 1;
|
||||
brelse(bh);
|
||||
return count;
|
||||
/* silently ignore the rest of the block */
|
||||
break;
|
||||
}
|
||||
ext4fs_dirhash(de->name, de->name_len, hinfo);
|
||||
if ((hinfo->hash < start_hash) ||
|
||||
|
|
Загрузка…
Ссылка в новой задаче