lkml.org 
[lkml]   [2008]   [Sep]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/4] ext3: Fix ext3_dx_readdir hash collision handling
    Date
    This fixes a bug where readdir() would return a directory entry twice
    if there was a hash collision in an hash tree indexed directory.

    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>
    Cc: linux-ext4@vger.kernel.org
    ---
    fs/ext3/dir.c | 22 ++++++++++++++++------
    1 files changed, 16 insertions(+), 6 deletions(-)

    diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c
    index 2eea96e..42c5391 100644
    --- a/fs/ext3/dir.c
    +++ b/fs/ext3/dir.c
    @@ -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;
    @@ -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->curr_node)
    + if (info->extra_fname) {
    + if (call_filldir(filp, dirent, filldir, info->extra_fname))
    + goto finished;
    +
    + 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) {
    --
    1.5.6.1.205.ge2c7.dirty


    \
     
     \ /
      Last update: 2008-09-13 17:35    [from the cache]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and my Meterkast|Read the blog