diff options
-rw-r--r-- | fs/ext3/dir.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c index 2eea96ec78ed..28b681ef47e8 100644 --- a/fs/ext3/dir.c +++ b/fs/ext3/dir.c | |||
@@ -410,7 +410,7 @@ static int call_filldir(struct file * filp, void * dirent, | |||
410 | get_dtype(sb, fname->file_type)); | 410 | get_dtype(sb, fname->file_type)); |
411 | if (error) { | 411 | if (error) { |
412 | filp->f_pos = curr_pos; | 412 | filp->f_pos = curr_pos; |
413 | info->extra_fname = fname->next; | 413 | info->extra_fname = fname; |
414 | return error; | 414 | return error; |
415 | } | 415 | } |
416 | fname = fname->next; | 416 | fname = fname->next; |
@@ -449,11 +449,21 @@ static int ext3_dx_readdir(struct file * filp, | |||
449 | * If there are any leftover names on the hash collision | 449 | * If there are any leftover names on the hash collision |
450 | * chain, return them first. | 450 | * chain, return them first. |
451 | */ | 451 | */ |
452 | if (info->extra_fname && | 452 | if (info->extra_fname) { |
453 | call_filldir(filp, dirent, filldir, info->extra_fname)) | 453 | if (call_filldir(filp, dirent, filldir, info->extra_fname)) |
454 | goto finished; | 454 | goto finished; |
455 | 455 | ||
456 | if (!info->curr_node) | 456 | info->extra_fname = NULL; |
457 | info->curr_node = rb_next(info->curr_node); | ||
458 | if (!info->curr_node) { | ||
459 | if (info->next_hash == ~0) { | ||
460 | filp->f_pos = EXT3_HTREE_EOF; | ||
461 | goto finished; | ||
462 | } | ||
463 | info->curr_hash = info->next_hash; | ||
464 | info->curr_minor_hash = 0; | ||
465 | } | ||
466 | } else if (!info->curr_node) | ||
457 | info->curr_node = rb_first(&info->root); | 467 | info->curr_node = rb_first(&info->root); |
458 | 468 | ||
459 | while (1) { | 469 | while (1) { |