Skip to content

Commit

Permalink
ext3: fix ext3_dx_readdir hash collision handling
Browse files Browse the repository at this point in the history
This fixes a bug where readdir() would return a directory entry twice
if there was a hash collision in an hash tree indexed directory.

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Eugene Dashevsky <eugene@ibrix.com>
Signed-off-by: Mike Snitzer <msnitzer@ibrix.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Eugene Dashevsky authored and Linus Torvalds committed Oct 20, 2008
1 parent 960a22a commit 6a897cf
Showing 1 changed file with 15 additions and 5 deletions.
20 changes: 15 additions & 5 deletions fs/ext3/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ static int call_filldir(struct file * filp, void * dirent,
get_dtype(sb, fname->file_type));
if (error) {
filp->f_pos = curr_pos;
info->extra_fname = fname->next;
info->extra_fname = fname;
return error;
}
fname = fname->next;
Expand Down Expand Up @@ -449,11 +449,21 @@ static int ext3_dx_readdir(struct file * filp,
* If there are any leftover names on the hash collision
* chain, return them first.
*/
if (info->extra_fname &&
call_filldir(filp, dirent, filldir, info->extra_fname))
goto finished;
if (info->extra_fname) {
if (call_filldir(filp, dirent, filldir, info->extra_fname))
goto finished;

if (!info->curr_node)
info->extra_fname = NULL;
info->curr_node = rb_next(info->curr_node);
if (!info->curr_node) {
if (info->next_hash == ~0) {
filp->f_pos = EXT3_HTREE_EOF;
goto finished;
}
info->curr_hash = info->next_hash;
info->curr_minor_hash = 0;
}
} else if (!info->curr_node)
info->curr_node = rb_first(&info->root);

while (1) {
Expand Down

0 comments on commit 6a897cf

Please sign in to comment.