|
@@ -410,7 +410,7 @@ static int call_filldir(struct file * filp, void * dirent,
|
|
get_dtype(sb, fname->file_type));
|
|
get_dtype(sb, fname->file_type));
|
|
if (error) {
|
|
if (error) {
|
|
filp->f_pos = curr_pos;
|
|
filp->f_pos = curr_pos;
|
|
- info->extra_fname = fname->next;
|
|
|
|
|
|
+ info->extra_fname = fname;
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
fname = fname->next;
|
|
fname = fname->next;
|
|
@@ -449,11 +449,21 @@ static int ext3_dx_readdir(struct file * filp,
|
|
* If there are any leftover names on the hash collision
|
|
* If there are any leftover names on the hash collision
|
|
* chain, return them first.
|
|
* 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);
|
|
info->curr_node = rb_first(&info->root);
|
|
|
|
|
|
while (1) {
|
|
while (1) {
|