[readdir] introduce iterate_dir() and dir_context
iterate_dir(): new helper, replacing vfs_readdir(). struct dir_context: contains the readdir callback (and will get more stuff in it), embedded into whatever data that callback wants to deal with; eventually, we'll be passing it to ->readdir() replacement instead of (data,filldir) pair. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
12
fs/compat.c
12
fs/compat.c
@@ -832,6 +832,7 @@ struct compat_old_linux_dirent {
|
||||
};
|
||||
|
||||
struct compat_readdir_callback {
|
||||
struct dir_context ctx;
|
||||
struct compat_old_linux_dirent __user *dirent;
|
||||
int result;
|
||||
};
|
||||
@@ -880,8 +881,9 @@ asmlinkage long compat_sys_old_readdir(unsigned int fd,
|
||||
|
||||
buf.result = 0;
|
||||
buf.dirent = dirent;
|
||||
buf.ctx.actor = compat_fillonedir;
|
||||
|
||||
error = vfs_readdir(f.file, compat_fillonedir, &buf);
|
||||
error = iterate_dir(f.file, &buf.ctx);
|
||||
if (buf.result)
|
||||
error = buf.result;
|
||||
|
||||
@@ -897,6 +899,7 @@ struct compat_linux_dirent {
|
||||
};
|
||||
|
||||
struct compat_getdents_callback {
|
||||
struct dir_context ctx;
|
||||
struct compat_linux_dirent __user *current_dir;
|
||||
struct compat_linux_dirent __user *previous;
|
||||
int count;
|
||||
@@ -965,8 +968,9 @@ asmlinkage long compat_sys_getdents(unsigned int fd,
|
||||
buf.previous = NULL;
|
||||
buf.count = count;
|
||||
buf.error = 0;
|
||||
buf.ctx.actor = compat_filldir;
|
||||
|
||||
error = vfs_readdir(f.file, compat_filldir, &buf);
|
||||
error = iterate_dir(f.file, &buf.ctx);
|
||||
if (error >= 0)
|
||||
error = buf.error;
|
||||
lastdirent = buf.previous;
|
||||
@@ -983,6 +987,7 @@ asmlinkage long compat_sys_getdents(unsigned int fd,
|
||||
#ifndef __ARCH_OMIT_COMPAT_SYS_GETDENTS64
|
||||
|
||||
struct compat_getdents_callback64 {
|
||||
struct dir_context ctx;
|
||||
struct linux_dirent64 __user *current_dir;
|
||||
struct linux_dirent64 __user *previous;
|
||||
int count;
|
||||
@@ -1050,8 +1055,9 @@ asmlinkage long compat_sys_getdents64(unsigned int fd,
|
||||
buf.previous = NULL;
|
||||
buf.count = count;
|
||||
buf.error = 0;
|
||||
buf.ctx.actor = compat_filldir64;
|
||||
|
||||
error = vfs_readdir(f.file, compat_filldir64, &buf);
|
||||
error = iterate_dir(f.file, &buf.ctx);
|
||||
if (error >= 0)
|
||||
error = buf.error;
|
||||
lastdirent = buf.previous;
|
||||
|
Reference in New Issue
Block a user