• J
    btrfs: increment ctx->pos for every emitted or skipped dirent in readdir · d2fbb2b5
    Jeff Mahoney 提交于
    If we process the last item in the leaf and hit an I/O error while
    reading the next leaf, we return -EIO without having adjusted the
    position.  Since we have emitted dirents, getdents() will return
    the byte count to the user instead of the error.  Subsequent callers
    will emit the last successful dirent again, and return -EIO again,
    with the same result.  Callers loop forever.
    
    Instead, if we always increment ctx->pos after emitting or skipping
    the dirent, we'll be sure that we won't hit the same one again.  When
    we go to process the next leaf, we won't have emitted any dirents
    and the -EIO will be returned to the user properly.  We also don't
    need to track if we've emitted a dirent already or if we've changed
    the position yet.
    Signed-off-by: NJeff Mahoney <jeffm@suse.com>
    Reviewed-by: NDavid Sterba <dsterba@suse.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    d2fbb2b5
inode.c 281.5 KB