Currently hostfs issues every time a seekdir(), in fact
it has to do this only upon the first call.
Also telldir() can be omitted as we can obtain the directory
offset from readdir().

Signed-off-by: Richard Weinberger <[email protected]>
---
 fs/hostfs/hostfs.h      |  3 ++-
 fs/hostfs/hostfs_kern.c |  1 +
 fs/hostfs/hostfs_user.c | 12 +++++++++---
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/fs/hostfs/hostfs.h b/fs/hostfs/hostfs.h
index 4fcd40d..00f9c12 100644
--- a/fs/hostfs/hostfs.h
+++ b/fs/hostfs/hostfs.h
@@ -66,7 +66,8 @@ extern int stat_file(const char *path, struct hostfs_stat *p, 
int fd);
 extern int access_file(char *path, int r, int w, int x);
 extern int open_file(char *path, int r, int w, int append);
 extern void *open_dir(char *path, int *err_out);
-extern char *read_dir(void *stream, unsigned long long *pos,
+extern void seek_dir(void *stream, unsigned long long pos);
+extern char *read_dir(void *stream, unsigned long long *pos_out,
                      unsigned long long *ino_out, int *len_out,
                      unsigned int *type_out);
 extern void close_file(void *stream);
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
index fd62cae..968a2b5 100644
--- a/fs/hostfs/hostfs_kern.c
+++ b/fs/hostfs/hostfs_kern.c
@@ -284,6 +284,7 @@ static int hostfs_readdir(struct file *file, struct 
dir_context *ctx)
        if (dir == NULL)
                return -error;
        next = ctx->pos;
+       seek_dir(dir, next);
        while ((name = read_dir(dir, &next, &ino, &len, &type)) != NULL) {
                if (!dir_emit(ctx, name, len, ino, type))
                        break;
diff --git a/fs/hostfs/hostfs_user.c b/fs/hostfs/hostfs_user.c
index 9765dab..1d1f293 100644
--- a/fs/hostfs/hostfs_user.c
+++ b/fs/hostfs/hostfs_user.c
@@ -97,21 +97,27 @@ void *open_dir(char *path, int *err_out)
        return dir;
 }
 
-char *read_dir(void *stream, unsigned long long *pos,
+void seek_dir(void *stream, unsigned long long pos)
+{
+       DIR *dir = stream;
+
+       seekdir(dir, pos);
+}
+
+char *read_dir(void *stream, unsigned long long *pos_out,
               unsigned long long *ino_out, int *len_out,
               unsigned int *type_out)
 {
        DIR *dir = stream;
        struct dirent *ent;
 
-       seekdir(dir, *pos);
        ent = readdir(dir);
        if (ent == NULL)
                return NULL;
        *len_out = strlen(ent->d_name);
        *ino_out = ent->d_ino;
        *type_out = ent->d_type;
-       *pos = telldir(dir);
+       *pos_out = ent->d_off;
        return ent->d_name;
 }
 
-- 
1.8.4.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to