forked from Minki/linux
um: hostfs: Reduce number of syscalls in readdir
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 <richard@nod.at>
This commit is contained in:
parent
a98a6d864d
commit
0c9bd6365d
@ -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);
|
||||
|
@ -292,6 +292,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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user