mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
[readdir] constify ->actor
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
2233f31aad
commit
ac6614b764
@ -147,17 +147,16 @@ SYSCALL_DEFINE4(osf_getdirentries, unsigned int, fd,
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
struct fd arg = fdget(fd);
|
struct fd arg = fdget(fd);
|
||||||
struct osf_dirent_callback buf;
|
struct osf_dirent_callback buf = {
|
||||||
|
.ctx.actor = osf_filldir,
|
||||||
|
.dirent = dirent,
|
||||||
|
.basep = basep,
|
||||||
|
.count = count
|
||||||
|
};
|
||||||
|
|
||||||
if (!arg.file)
|
if (!arg.file)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
buf.dirent = dirent;
|
|
||||||
buf.basep = basep;
|
|
||||||
buf.count = count;
|
|
||||||
buf.error = 0;
|
|
||||||
buf.ctx.actor = osf_filldir;
|
|
||||||
|
|
||||||
error = iterate_dir(arg.file, &buf.ctx);
|
error = iterate_dir(arg.file, &buf.ctx);
|
||||||
if (error >= 0)
|
if (error >= 0)
|
||||||
error = buf.error;
|
error = buf.error;
|
||||||
|
@ -111,19 +111,17 @@ int hpux_getdents(unsigned int fd, struct hpux_dirent __user *dirent, unsigned i
|
|||||||
{
|
{
|
||||||
struct fd arg;
|
struct fd arg;
|
||||||
struct hpux_dirent __user * lastdirent;
|
struct hpux_dirent __user * lastdirent;
|
||||||
struct getdents_callback buf;
|
struct getdents_callback buf = {
|
||||||
|
.ctx.actor = filldir,
|
||||||
|
.current_dir = dirent,
|
||||||
|
.count = count
|
||||||
|
};
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
arg = fdget(fd);
|
arg = fdget(fd);
|
||||||
if (!arg.file)
|
if (!arg.file)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
buf.current_dir = dirent;
|
|
||||||
buf.previous = NULL;
|
|
||||||
buf.count = count;
|
|
||||||
buf.error = 0;
|
|
||||||
buf.ctx.actor = filldir;
|
|
||||||
|
|
||||||
error = iterate_dir(arg.file, &buf.ctx);
|
error = iterate_dir(arg.file, &buf.ctx);
|
||||||
if (error >= 0)
|
if (error >= 0)
|
||||||
error = buf.error;
|
error = buf.error;
|
||||||
|
33
fs/compat.c
33
fs/compat.c
@ -874,15 +874,14 @@ asmlinkage long compat_sys_old_readdir(unsigned int fd,
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
struct fd f = fdget(fd);
|
struct fd f = fdget(fd);
|
||||||
struct compat_readdir_callback buf;
|
struct compat_readdir_callback buf = {
|
||||||
|
.ctx.actor = compat_fillonedir,
|
||||||
|
.dirent = dirent
|
||||||
|
};
|
||||||
|
|
||||||
if (!f.file)
|
if (!f.file)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
buf.result = 0;
|
|
||||||
buf.dirent = dirent;
|
|
||||||
buf.ctx.actor = compat_fillonedir;
|
|
||||||
|
|
||||||
error = iterate_dir(f.file, &buf.ctx);
|
error = iterate_dir(f.file, &buf.ctx);
|
||||||
if (buf.result)
|
if (buf.result)
|
||||||
error = buf.result;
|
error = buf.result;
|
||||||
@ -954,7 +953,11 @@ asmlinkage long compat_sys_getdents(unsigned int fd,
|
|||||||
{
|
{
|
||||||
struct fd f;
|
struct fd f;
|
||||||
struct compat_linux_dirent __user * lastdirent;
|
struct compat_linux_dirent __user * lastdirent;
|
||||||
struct compat_getdents_callback buf;
|
struct compat_getdents_callback buf = {
|
||||||
|
.ctx.actor = compat_filldir,
|
||||||
|
.current_dir = dirent,
|
||||||
|
.count = count
|
||||||
|
};
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, dirent, count))
|
if (!access_ok(VERIFY_WRITE, dirent, count))
|
||||||
@ -964,12 +967,6 @@ asmlinkage long compat_sys_getdents(unsigned int fd,
|
|||||||
if (!f.file)
|
if (!f.file)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
buf.current_dir = dirent;
|
|
||||||
buf.previous = NULL;
|
|
||||||
buf.count = count;
|
|
||||||
buf.error = 0;
|
|
||||||
buf.ctx.actor = compat_filldir;
|
|
||||||
|
|
||||||
error = iterate_dir(f.file, &buf.ctx);
|
error = iterate_dir(f.file, &buf.ctx);
|
||||||
if (error >= 0)
|
if (error >= 0)
|
||||||
error = buf.error;
|
error = buf.error;
|
||||||
@ -1041,7 +1038,11 @@ asmlinkage long compat_sys_getdents64(unsigned int fd,
|
|||||||
{
|
{
|
||||||
struct fd f;
|
struct fd f;
|
||||||
struct linux_dirent64 __user * lastdirent;
|
struct linux_dirent64 __user * lastdirent;
|
||||||
struct compat_getdents_callback64 buf;
|
struct compat_getdents_callback64 buf = {
|
||||||
|
.ctx.actor = compat_filldir64,
|
||||||
|
.current_dir = dirent,
|
||||||
|
.count = count
|
||||||
|
};
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, dirent, count))
|
if (!access_ok(VERIFY_WRITE, dirent, count))
|
||||||
@ -1051,12 +1052,6 @@ asmlinkage long compat_sys_getdents64(unsigned int fd,
|
|||||||
if (!f.file)
|
if (!f.file)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
buf.current_dir = dirent;
|
|
||||||
buf.previous = NULL;
|
|
||||||
buf.count = count;
|
|
||||||
buf.error = 0;
|
|
||||||
buf.ctx.actor = compat_filldir64;
|
|
||||||
|
|
||||||
error = iterate_dir(f.file, &buf.ctx);
|
error = iterate_dir(f.file, &buf.ctx);
|
||||||
if (error >= 0)
|
if (error >= 0)
|
||||||
error = buf.error;
|
error = buf.error;
|
||||||
|
@ -255,7 +255,11 @@ static int get_name(const struct path *path, char *name, struct dentry *child)
|
|||||||
struct inode *dir = path->dentry->d_inode;
|
struct inode *dir = path->dentry->d_inode;
|
||||||
int error;
|
int error;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
struct getdents_callback buffer;
|
struct getdents_callback buffer = {
|
||||||
|
.ctx.actor = filldir_one,
|
||||||
|
.name = name,
|
||||||
|
.ino = child->d_inode->i_ino
|
||||||
|
};
|
||||||
|
|
||||||
error = -ENOTDIR;
|
error = -ENOTDIR;
|
||||||
if (!dir || !S_ISDIR(dir->i_mode))
|
if (!dir || !S_ISDIR(dir->i_mode))
|
||||||
@ -275,11 +279,7 @@ static int get_name(const struct path *path, char *name, struct dentry *child)
|
|||||||
if (!file->f_op->iterate)
|
if (!file->f_op->iterate)
|
||||||
goto out_close;
|
goto out_close;
|
||||||
|
|
||||||
buffer.name = name;
|
|
||||||
buffer.ino = child->d_inode->i_ino;
|
|
||||||
buffer.found = 0;
|
|
||||||
buffer.sequence = 0;
|
buffer.sequence = 0;
|
||||||
buffer.ctx.actor = filldir_one;
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int old_seq = buffer.sequence;
|
int old_seq = buffer.sequence;
|
||||||
|
|
||||||
|
@ -89,7 +89,10 @@ static int gfs2_get_name(struct dentry *parent, char *name,
|
|||||||
struct inode *dir = parent->d_inode;
|
struct inode *dir = parent->d_inode;
|
||||||
struct inode *inode = child->d_inode;
|
struct inode *inode = child->d_inode;
|
||||||
struct gfs2_inode *dip, *ip;
|
struct gfs2_inode *dip, *ip;
|
||||||
struct get_name_filldir gnfd;
|
struct get_name_filldir gnfd = {
|
||||||
|
.ctx.actor = get_name_filldir,
|
||||||
|
.name = name
|
||||||
|
};
|
||||||
struct gfs2_holder gh;
|
struct gfs2_holder gh;
|
||||||
int error;
|
int error;
|
||||||
struct file_ra_state f_ra = { .start = 0 };
|
struct file_ra_state f_ra = { .start = 0 };
|
||||||
@ -106,9 +109,6 @@ static int gfs2_get_name(struct dentry *parent, char *name,
|
|||||||
*name = 0;
|
*name = 0;
|
||||||
gnfd.inum.no_addr = ip->i_no_addr;
|
gnfd.inum.no_addr = ip->i_no_addr;
|
||||||
gnfd.inum.no_formal_ino = ip->i_no_formal_ino;
|
gnfd.inum.no_formal_ino = ip->i_no_formal_ino;
|
||||||
gnfd.name = name;
|
|
||||||
gnfd.ctx.actor = get_name_filldir;
|
|
||||||
gnfd.ctx.pos = 0;
|
|
||||||
|
|
||||||
error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &gh);
|
error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &gh);
|
||||||
if (error)
|
if (error)
|
||||||
|
@ -268,7 +268,10 @@ nfsd4_list_rec_dir(recdir_func *f, struct nfsd_net *nn)
|
|||||||
{
|
{
|
||||||
const struct cred *original_cred;
|
const struct cred *original_cred;
|
||||||
struct dentry *dir = nn->rec_file->f_path.dentry;
|
struct dentry *dir = nn->rec_file->f_path.dentry;
|
||||||
struct nfs4_dir_ctx ctx;
|
struct nfs4_dir_ctx ctx = {
|
||||||
|
.ctx.actor = nfsd4_build_namelist,
|
||||||
|
.names = LIST_HEAD_INIT(ctx.names)
|
||||||
|
};
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
status = nfs4_save_creds(&original_cred);
|
status = nfs4_save_creds(&original_cred);
|
||||||
@ -281,8 +284,6 @@ nfsd4_list_rec_dir(recdir_func *f, struct nfsd_net *nn)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT_LIST_HEAD(&ctx.names);
|
|
||||||
ctx.ctx.actor = nfsd4_build_namelist;
|
|
||||||
status = iterate_dir(nn->rec_file, &ctx.ctx);
|
status = iterate_dir(nn->rec_file, &ctx.ctx);
|
||||||
mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
|
mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
|
||||||
while (!list_empty(&ctx.names)) {
|
while (!list_empty(&ctx.names)) {
|
||||||
|
@ -1944,14 +1944,15 @@ static int nfsd_buffered_filldir(void *__buf, const char *name, int namlen,
|
|||||||
static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func,
|
static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func,
|
||||||
struct readdir_cd *cdp, loff_t *offsetp)
|
struct readdir_cd *cdp, loff_t *offsetp)
|
||||||
{
|
{
|
||||||
struct readdir_data buf;
|
|
||||||
struct buffered_dirent *de;
|
struct buffered_dirent *de;
|
||||||
int host_err;
|
int host_err;
|
||||||
int size;
|
int size;
|
||||||
loff_t offset;
|
loff_t offset;
|
||||||
|
struct readdir_data buf = {
|
||||||
|
.ctx.actor = nfsd_buffered_filldir,
|
||||||
|
.dirent = (void *)__get_free_page(GFP_KERNEL)
|
||||||
|
};
|
||||||
|
|
||||||
buf.ctx.actor = nfsd_buffered_filldir;
|
|
||||||
buf.dirent = (void *)__get_free_page(GFP_KERNEL);
|
|
||||||
if (!buf.dirent)
|
if (!buf.dirent)
|
||||||
return nfserrno(-ENOMEM);
|
return nfserrno(-ENOMEM);
|
||||||
|
|
||||||
|
33
fs/readdir.c
33
fs/readdir.c
@ -109,15 +109,14 @@ SYSCALL_DEFINE3(old_readdir, unsigned int, fd,
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
struct fd f = fdget(fd);
|
struct fd f = fdget(fd);
|
||||||
struct readdir_callback buf;
|
struct readdir_callback buf = {
|
||||||
|
.ctx.actor = fillonedir,
|
||||||
|
.dirent = dirent
|
||||||
|
};
|
||||||
|
|
||||||
if (!f.file)
|
if (!f.file)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
buf.ctx.actor = fillonedir;
|
|
||||||
buf.result = 0;
|
|
||||||
buf.dirent = dirent;
|
|
||||||
|
|
||||||
error = iterate_dir(f.file, &buf.ctx);
|
error = iterate_dir(f.file, &buf.ctx);
|
||||||
if (buf.result)
|
if (buf.result)
|
||||||
error = buf.result;
|
error = buf.result;
|
||||||
@ -195,7 +194,11 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd,
|
|||||||
{
|
{
|
||||||
struct fd f;
|
struct fd f;
|
||||||
struct linux_dirent __user * lastdirent;
|
struct linux_dirent __user * lastdirent;
|
||||||
struct getdents_callback buf;
|
struct getdents_callback buf = {
|
||||||
|
.ctx.actor = filldir,
|
||||||
|
.count = count,
|
||||||
|
.current_dir = dirent
|
||||||
|
};
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, dirent, count))
|
if (!access_ok(VERIFY_WRITE, dirent, count))
|
||||||
@ -205,12 +208,6 @@ SYSCALL_DEFINE3(getdents, unsigned int, fd,
|
|||||||
if (!f.file)
|
if (!f.file)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
buf.current_dir = dirent;
|
|
||||||
buf.previous = NULL;
|
|
||||||
buf.count = count;
|
|
||||||
buf.error = 0;
|
|
||||||
buf.ctx.actor = filldir;
|
|
||||||
|
|
||||||
error = iterate_dir(f.file, &buf.ctx);
|
error = iterate_dir(f.file, &buf.ctx);
|
||||||
if (error >= 0)
|
if (error >= 0)
|
||||||
error = buf.error;
|
error = buf.error;
|
||||||
@ -277,7 +274,11 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,
|
|||||||
{
|
{
|
||||||
struct fd f;
|
struct fd f;
|
||||||
struct linux_dirent64 __user * lastdirent;
|
struct linux_dirent64 __user * lastdirent;
|
||||||
struct getdents_callback64 buf;
|
struct getdents_callback64 buf = {
|
||||||
|
.ctx.actor = filldir64,
|
||||||
|
.count = count,
|
||||||
|
.current_dir = dirent
|
||||||
|
};
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, dirent, count))
|
if (!access_ok(VERIFY_WRITE, dirent, count))
|
||||||
@ -287,12 +288,6 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,
|
|||||||
if (!f.file)
|
if (!f.file)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
buf.current_dir = dirent;
|
|
||||||
buf.previous = NULL;
|
|
||||||
buf.count = count;
|
|
||||||
buf.error = 0;
|
|
||||||
buf.ctx.actor = filldir64;
|
|
||||||
|
|
||||||
error = iterate_dir(f.file, &buf.ctx);
|
error = iterate_dir(f.file, &buf.ctx);
|
||||||
if (error >= 0)
|
if (error >= 0)
|
||||||
error = buf.error;
|
error = buf.error;
|
||||||
|
@ -1507,7 +1507,7 @@ int fiemap_check_flags(struct fiemap_extent_info *fieinfo, u32 fs_flags);
|
|||||||
*/
|
*/
|
||||||
typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
|
typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
|
||||||
struct dir_context {
|
struct dir_context {
|
||||||
filldir_t actor;
|
const filldir_t actor;
|
||||||
loff_t pos;
|
loff_t pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user