[readdir] convert procfs
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -542,8 +542,8 @@ static const struct file_operations hppfs_file_fops = {
|
||||
};
|
||||
|
||||
struct hppfs_dirent {
|
||||
void *vfs_dirent;
|
||||
filldir_t filldir;
|
||||
struct dir_context ctx;
|
||||
struct dir_context *caller;
|
||||
struct dentry *dentry;
|
||||
};
|
||||
|
||||
@@ -555,34 +555,29 @@ static int hppfs_filldir(void *d, const char *name, int size,
|
||||
if (file_removed(dirent->dentry, name))
|
||||
return 0;
|
||||
|
||||
return (*dirent->filldir)(dirent->vfs_dirent, name, size, offset,
|
||||
inode, type);
|
||||
dirent->caller->pos = dirent->ctx.pos;
|
||||
return !dir_emit(dirent->caller, name, size, inode, type);
|
||||
}
|
||||
|
||||
static int hppfs_readdir(struct file *file, void *ent, filldir_t filldir)
|
||||
static int hppfs_readdir(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
struct hppfs_private *data = file->private_data;
|
||||
struct file *proc_file = data->proc_file;
|
||||
int (*readdir)(struct file *, void *, filldir_t);
|
||||
struct hppfs_dirent dirent = ((struct hppfs_dirent)
|
||||
{ .vfs_dirent = ent,
|
||||
.filldir = filldir,
|
||||
.dentry = file->f_path.dentry
|
||||
});
|
||||
struct hppfs_dirent d = {
|
||||
.ctx.actor = hppfs_filldir,
|
||||
.caller = ctx,
|
||||
.dentry = file->f_path.dentry
|
||||
};
|
||||
int err;
|
||||
|
||||
readdir = file_inode(proc_file)->i_fop->readdir;
|
||||
|
||||
proc_file->f_pos = file->f_pos;
|
||||
err = (*readdir)(proc_file, &dirent, hppfs_filldir);
|
||||
file->f_pos = proc_file->f_pos;
|
||||
|
||||
proc_file->f_pos = ctx->pos;
|
||||
err = iterate_dir(proc_file, &d.ctx);
|
||||
ctx->pos = d.ctx.pos;
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct file_operations hppfs_dir_fops = {
|
||||
.owner = NULL,
|
||||
.readdir = hppfs_readdir,
|
||||
.iterate = hppfs_readdir,
|
||||
.open = hppfs_dir_open,
|
||||
.llseek = default_llseek,
|
||||
.release = hppfs_release,
|
||||
|
Reference in New Issue
Block a user