提交 ac7576f4 编写于 作者: M Miklos Szeredi 提交者: Al Viro

vfs: make first argument of dir_context.actor typed

Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 9f2f7d4c
...@@ -104,11 +104,12 @@ struct osf_dirent_callback { ...@@ -104,11 +104,12 @@ struct osf_dirent_callback {
}; };
static int static int
osf_filldir(void *__buf, const char *name, int namlen, loff_t offset, osf_filldir(struct dir_context *ctx, const char *name, int namlen,
u64 ino, unsigned int d_type) loff_t offset, u64 ino, unsigned int d_type)
{ {
struct osf_dirent __user *dirent; struct osf_dirent __user *dirent;
struct osf_dirent_callback *buf = (struct osf_dirent_callback *) __buf; struct osf_dirent_callback *buf =
container_of(ctx, struct osf_dirent_callback, ctx);
unsigned int reclen = ALIGN(NAME_OFFSET + namlen + 1, sizeof(u32)); unsigned int reclen = ALIGN(NAME_OFFSET + namlen + 1, sizeof(u32));
unsigned int d_ino; unsigned int d_ino;
......
...@@ -56,11 +56,12 @@ struct getdents_callback { ...@@ -56,11 +56,12 @@ struct getdents_callback {
#define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de))) #define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
static int filldir(void * __buf, const char * name, int namlen, loff_t offset, static int filldir(struct dir_context *ctx, const char *name, int namlen,
u64 ino, unsigned d_type) loff_t offset, u64 ino, unsigned d_type)
{ {
struct hpux_dirent __user * dirent; struct hpux_dirent __user * dirent;
struct getdents_callback * buf = (struct getdents_callback *) __buf; struct getdents_callback *buf =
container_of(ctx, struct getdents_callback, ctx);
ino_t d_ino; ino_t d_ino;
int reclen = ALIGN(NAME_OFFSET(dirent) + namlen + 1, sizeof(long)); int reclen = ALIGN(NAME_OFFSET(dirent) + namlen + 1, sizeof(long));
......
...@@ -207,13 +207,15 @@ static int ll_encode_fh(struct inode *inode, __u32 *fh, int *plen, ...@@ -207,13 +207,15 @@ static int ll_encode_fh(struct inode *inode, __u32 *fh, int *plen,
return LUSTRE_NFS_FID; return LUSTRE_NFS_FID;
} }
static int ll_nfs_get_name_filldir(void *cookie, const char *name, int namelen, static int ll_nfs_get_name_filldir(struct dir_context *ctx, const char *name,
loff_t hash, u64 ino, unsigned type) int namelen, loff_t hash, u64 ino,
unsigned type)
{ {
/* It is hack to access lde_fid for comparison with lgd_fid. /* It is hack to access lde_fid for comparison with lgd_fid.
* So the input 'name' must be part of the 'lu_dirent'. */ * So the input 'name' must be part of the 'lu_dirent'. */
struct lu_dirent *lde = container_of0(name, struct lu_dirent, lde_name); struct lu_dirent *lde = container_of0(name, struct lu_dirent, lde_name);
struct ll_getname_data *lgd = cookie; struct ll_getname_data *lgd =
container_of(ctx, struct ll_getname_data, ctx);
struct lu_fid fid; struct lu_fid fid;
fid_le_to_cpu(&fid, &lde->lde_fid); fid_le_to_cpu(&fid, &lde->lde_fid);
......
...@@ -26,7 +26,7 @@ static int afs_readdir(struct file *file, struct dir_context *ctx); ...@@ -26,7 +26,7 @@ static int afs_readdir(struct file *file, struct dir_context *ctx);
static int afs_d_revalidate(struct dentry *dentry, unsigned int flags); static int afs_d_revalidate(struct dentry *dentry, unsigned int flags);
static int afs_d_delete(const struct dentry *dentry); static int afs_d_delete(const struct dentry *dentry);
static void afs_d_release(struct dentry *dentry); static void afs_d_release(struct dentry *dentry);
static int afs_lookup_filldir(void *_cookie, const char *name, int nlen, static int afs_lookup_filldir(struct dir_context *ctx, const char *name, int nlen,
loff_t fpos, u64 ino, unsigned dtype); loff_t fpos, u64 ino, unsigned dtype);
static int afs_create(struct inode *dir, struct dentry *dentry, umode_t mode, static int afs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
bool excl); bool excl);
...@@ -391,10 +391,11 @@ static int afs_readdir(struct file *file, struct dir_context *ctx) ...@@ -391,10 +391,11 @@ static int afs_readdir(struct file *file, struct dir_context *ctx)
* - if afs_dir_iterate_block() spots this function, it'll pass the FID * - if afs_dir_iterate_block() spots this function, it'll pass the FID
* uniquifier through dtype * uniquifier through dtype
*/ */
static int afs_lookup_filldir(void *_cookie, const char *name, int nlen, static int afs_lookup_filldir(struct dir_context *ctx, const char *name,
loff_t fpos, u64 ino, unsigned dtype) int nlen, loff_t fpos, u64 ino, unsigned dtype)
{ {
struct afs_lookup_cookie *cookie = _cookie; struct afs_lookup_cookie *cookie =
container_of(ctx, struct afs_lookup_cookie, ctx);
_enter("{%s,%u},%s,%u,,%llu,%u", _enter("{%s,%u},%s,%u,,%llu,%u",
cookie->name.name, cookie->name.len, name, nlen, cookie->name.name, cookie->name.len, name, nlen,
......
...@@ -847,10 +847,12 @@ struct compat_readdir_callback { ...@@ -847,10 +847,12 @@ struct compat_readdir_callback {
int result; int result;
}; };
static int compat_fillonedir(void *__buf, const char *name, int namlen, static int compat_fillonedir(struct dir_context *ctx, const char *name,
loff_t offset, u64 ino, unsigned int d_type) int namlen, loff_t offset, u64 ino,
unsigned int d_type)
{ {
struct compat_readdir_callback *buf = __buf; struct compat_readdir_callback *buf =
container_of(ctx, struct compat_readdir_callback, ctx);
struct compat_old_linux_dirent __user *dirent; struct compat_old_linux_dirent __user *dirent;
compat_ulong_t d_ino; compat_ulong_t d_ino;
...@@ -915,11 +917,12 @@ struct compat_getdents_callback { ...@@ -915,11 +917,12 @@ struct compat_getdents_callback {
int error; int error;
}; };
static int compat_filldir(void *__buf, const char *name, int namlen, static int compat_filldir(struct dir_context *ctx, const char *name, int namlen,
loff_t offset, u64 ino, unsigned int d_type) loff_t offset, u64 ino, unsigned int d_type)
{ {
struct compat_linux_dirent __user * dirent; struct compat_linux_dirent __user * dirent;
struct compat_getdents_callback *buf = __buf; struct compat_getdents_callback *buf =
container_of(ctx, struct compat_getdents_callback, ctx);
compat_ulong_t d_ino; compat_ulong_t d_ino;
int reclen = ALIGN(offsetof(struct compat_linux_dirent, d_name) + int reclen = ALIGN(offsetof(struct compat_linux_dirent, d_name) +
namlen + 2, sizeof(compat_long_t)); namlen + 2, sizeof(compat_long_t));
...@@ -1001,11 +1004,13 @@ struct compat_getdents_callback64 { ...@@ -1001,11 +1004,13 @@ struct compat_getdents_callback64 {
int error; int error;
}; };
static int compat_filldir64(void * __buf, const char * name, int namlen, loff_t offset, static int compat_filldir64(struct dir_context *ctx, const char *name,
u64 ino, unsigned int d_type) int namlen, loff_t offset, u64 ino,
unsigned int d_type)
{ {
struct linux_dirent64 __user *dirent; struct linux_dirent64 __user *dirent;
struct compat_getdents_callback64 *buf = __buf; struct compat_getdents_callback64 *buf =
container_of(ctx, struct compat_getdents_callback64, ctx);
int reclen = ALIGN(offsetof(struct linux_dirent64, d_name) + namlen + 1, int reclen = ALIGN(offsetof(struct linux_dirent64, d_name) + namlen + 1,
sizeof(u64)); sizeof(u64));
u64 off; u64 off;
......
...@@ -75,11 +75,11 @@ struct ecryptfs_getdents_callback { ...@@ -75,11 +75,11 @@ struct ecryptfs_getdents_callback {
/* Inspired by generic filldir in fs/readdir.c */ /* Inspired by generic filldir in fs/readdir.c */
static int static int
ecryptfs_filldir(void *dirent, const char *lower_name, int lower_namelen, ecryptfs_filldir(struct dir_context *ctx, const char *lower_name,
loff_t offset, u64 ino, unsigned int d_type) int lower_namelen, loff_t offset, u64 ino, unsigned int d_type)
{ {
struct ecryptfs_getdents_callback *buf = struct ecryptfs_getdents_callback *buf =
(struct ecryptfs_getdents_callback *)dirent; container_of(ctx, struct ecryptfs_getdents_callback, ctx);
size_t name_size; size_t name_size;
char *name; char *name;
int rc; int rc;
......
...@@ -241,10 +241,11 @@ struct getdents_callback { ...@@ -241,10 +241,11 @@ struct getdents_callback {
* A rather strange filldir function to capture * A rather strange filldir function to capture
* the name matching the specified inode number. * the name matching the specified inode number.
*/ */
static int filldir_one(void * __buf, const char * name, int len, static int filldir_one(struct dir_context *ctx, const char *name, int len,
loff_t pos, u64 ino, unsigned int d_type) loff_t pos, u64 ino, unsigned int d_type)
{ {
struct getdents_callback *buf = __buf; struct getdents_callback *buf =
container_of(ctx, struct getdents_callback, ctx);
int result = 0; int result = 0;
buf->sequence++; buf->sequence++;
......
...@@ -702,10 +702,11 @@ static int fat_readdir(struct file *file, struct dir_context *ctx) ...@@ -702,10 +702,11 @@ static int fat_readdir(struct file *file, struct dir_context *ctx)
} }
#define FAT_IOCTL_FILLDIR_FUNC(func, dirent_type) \ #define FAT_IOCTL_FILLDIR_FUNC(func, dirent_type) \
static int func(void *__buf, const char *name, int name_len, \ static int func(struct dir_context *ctx, const char *name, int name_len, \
loff_t offset, u64 ino, unsigned int d_type) \ loff_t offset, u64 ino, unsigned int d_type) \
{ \ { \
struct fat_ioctl_filldir_callback *buf = __buf; \ struct fat_ioctl_filldir_callback *buf = \
container_of(ctx, struct fat_ioctl_filldir_callback, ctx); \
struct dirent_type __user *d1 = buf->dirent; \ struct dirent_type __user *d1 = buf->dirent; \
struct dirent_type __user *d2 = d1 + 1; \ struct dirent_type __user *d2 = d1 + 1; \
\ \
......
...@@ -69,10 +69,12 @@ struct get_name_filldir { ...@@ -69,10 +69,12 @@ struct get_name_filldir {
char *name; char *name;
}; };
static int get_name_filldir(void *opaque, const char *name, int length, static int get_name_filldir(struct dir_context *ctx, const char *name,
loff_t offset, u64 inum, unsigned int type) int length, loff_t offset, u64 inum,
unsigned int type)
{ {
struct get_name_filldir *gnfd = opaque; struct get_name_filldir *gnfd =
container_of(ctx, struct get_name_filldir, ctx);
if (inum != gnfd->inum.no_addr) if (inum != gnfd->inum.no_addr)
return 0; return 0;
......
...@@ -548,10 +548,11 @@ struct hppfs_dirent { ...@@ -548,10 +548,11 @@ struct hppfs_dirent {
struct dentry *dentry; struct dentry *dentry;
}; };
static int hppfs_filldir(void *d, const char *name, int size, static int hppfs_filldir(struct dir_context *ctx, const char *name, int size,
loff_t offset, u64 inode, unsigned int type) loff_t offset, u64 inode, unsigned int type)
{ {
struct hppfs_dirent *dirent = d; struct hppfs_dirent *dirent =
container_of(ctx, struct hppfs_dirent, ctx);
if (file_removed(dirent->dentry, name)) if (file_removed(dirent->dentry, name))
return 0; return 0;
......
...@@ -245,10 +245,11 @@ struct nfs4_dir_ctx { ...@@ -245,10 +245,11 @@ struct nfs4_dir_ctx {
}; };
static int static int
nfsd4_build_namelist(void *arg, const char *name, int namlen, nfsd4_build_namelist(struct dir_context *__ctx, const char *name, int namlen,
loff_t offset, u64 ino, unsigned int d_type) loff_t offset, u64 ino, unsigned int d_type)
{ {
struct nfs4_dir_ctx *ctx = arg; struct nfs4_dir_ctx *ctx =
container_of(__ctx, struct nfs4_dir_ctx, ctx);
struct name_list *entry; struct name_list *entry;
if (namlen != HEXDIR_LEN - 1) if (namlen != HEXDIR_LEN - 1)
......
...@@ -1819,10 +1819,12 @@ struct readdir_data { ...@@ -1819,10 +1819,12 @@ struct readdir_data {
int full; int full;
}; };
static int nfsd_buffered_filldir(void *__buf, const char *name, int namlen, static int nfsd_buffered_filldir(struct dir_context *ctx, const char *name,
loff_t offset, u64 ino, unsigned int d_type) int namlen, loff_t offset, u64 ino,
unsigned int d_type)
{ {
struct readdir_data *buf = __buf; struct readdir_data *buf =
container_of(ctx, struct readdir_data, ctx);
struct buffered_dirent *de = (void *)(buf->dirent + buf->used); struct buffered_dirent *de = (void *)(buf->dirent + buf->used);
unsigned int reclen; unsigned int reclen;
...@@ -1842,7 +1844,7 @@ static int nfsd_buffered_filldir(void *__buf, const char *name, int namlen, ...@@ -1842,7 +1844,7 @@ static int nfsd_buffered_filldir(void *__buf, const char *name, int namlen,
return 0; return 0;
} }
static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func, static __be32 nfsd_buffered_readdir(struct file *file, nfsd_filldir_t func,
struct readdir_cd *cdp, loff_t *offsetp) struct readdir_cd *cdp, loff_t *offsetp)
{ {
struct buffered_dirent *de; struct buffered_dirent *de;
...@@ -1926,7 +1928,7 @@ static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func, ...@@ -1926,7 +1928,7 @@ static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func,
*/ */
__be32 __be32
nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp, nfsd_readdir(struct svc_rqst *rqstp, struct svc_fh *fhp, loff_t *offsetp,
struct readdir_cd *cdp, filldir_t func) struct readdir_cd *cdp, nfsd_filldir_t func)
{ {
__be32 err; __be32 err;
struct file *file; struct file *file;
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
/* /*
* Callback function for readdir * Callback function for readdir
*/ */
typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int); typedef int (*nfsd_filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
/* nfsd/vfs.c */ /* nfsd/vfs.c */
int nfsd_racache_init(int); int nfsd_racache_init(int);
...@@ -95,7 +95,7 @@ __be32 nfsd_rename(struct svc_rqst *, ...@@ -95,7 +95,7 @@ __be32 nfsd_rename(struct svc_rqst *,
__be32 nfsd_unlink(struct svc_rqst *, struct svc_fh *, int type, __be32 nfsd_unlink(struct svc_rqst *, struct svc_fh *, int type,
char *name, int len); char *name, int len);
__be32 nfsd_readdir(struct svc_rqst *, struct svc_fh *, __be32 nfsd_readdir(struct svc_rqst *, struct svc_fh *,
loff_t *, struct readdir_cd *, filldir_t); loff_t *, struct readdir_cd *, nfsd_filldir_t);
__be32 nfsd_statfs(struct svc_rqst *, struct svc_fh *, __be32 nfsd_statfs(struct svc_rqst *, struct svc_fh *,
struct kstatfs *, int access); struct kstatfs *, int access);
......
...@@ -2073,10 +2073,12 @@ struct ocfs2_empty_dir_priv { ...@@ -2073,10 +2073,12 @@ struct ocfs2_empty_dir_priv {
unsigned seen_other; unsigned seen_other;
unsigned dx_dir; unsigned dx_dir;
}; };
static int ocfs2_empty_dir_filldir(void *priv, const char *name, int name_len, static int ocfs2_empty_dir_filldir(struct dir_context *ctx, const char *name,
loff_t pos, u64 ino, unsigned type) int name_len, loff_t pos, u64 ino,
unsigned type)
{ {
struct ocfs2_empty_dir_priv *p = priv; struct ocfs2_empty_dir_priv *p =
container_of(ctx, struct ocfs2_empty_dir_priv, ctx);
/* /*
* Check the positions of "." and ".." records to be sure * Check the positions of "." and ".." records to be sure
......
...@@ -1982,10 +1982,12 @@ struct ocfs2_orphan_filldir_priv { ...@@ -1982,10 +1982,12 @@ struct ocfs2_orphan_filldir_priv {
struct ocfs2_super *osb; struct ocfs2_super *osb;
}; };
static int ocfs2_orphan_filldir(void *priv, const char *name, int name_len, static int ocfs2_orphan_filldir(struct dir_context *ctx, const char *name,
loff_t pos, u64 ino, unsigned type) int name_len, loff_t pos, u64 ino,
unsigned type)
{ {
struct ocfs2_orphan_filldir_priv *p = priv; struct ocfs2_orphan_filldir_priv *p =
container_of(ctx, struct ocfs2_orphan_filldir_priv, ctx);
struct inode *iter; struct inode *iter;
if (name_len == 1 && !strncmp(".", name, 1)) if (name_len == 1 && !strncmp(".", name, 1))
......
...@@ -180,10 +180,12 @@ static void ovl_cache_put(struct ovl_dir_file *od, struct dentry *dentry) ...@@ -180,10 +180,12 @@ static void ovl_cache_put(struct ovl_dir_file *od, struct dentry *dentry)
} }
} }
static int ovl_fill_merge(void *buf, const char *name, int namelen, static int ovl_fill_merge(struct dir_context *ctx, const char *name,
loff_t offset, u64 ino, unsigned int d_type) int namelen, loff_t offset, u64 ino,
unsigned int d_type)
{ {
struct ovl_readdir_data *rdd = buf; struct ovl_readdir_data *rdd =
container_of(ctx, struct ovl_readdir_data, ctx);
rdd->count++; rdd->count++;
if (!rdd->is_merge) if (!rdd->is_merge)
......
...@@ -74,10 +74,11 @@ struct readdir_callback { ...@@ -74,10 +74,11 @@ struct readdir_callback {
int result; int result;
}; };
static int fillonedir(void * __buf, const char * name, int namlen, loff_t offset, static int fillonedir(struct dir_context *ctx, const char *name, int namlen,
u64 ino, unsigned int d_type) loff_t offset, u64 ino, unsigned int d_type)
{ {
struct readdir_callback *buf = (struct readdir_callback *) __buf; struct readdir_callback *buf =
container_of(ctx, struct readdir_callback, ctx);
struct old_linux_dirent __user * dirent; struct old_linux_dirent __user * dirent;
unsigned long d_ino; unsigned long d_ino;
...@@ -148,11 +149,12 @@ struct getdents_callback { ...@@ -148,11 +149,12 @@ struct getdents_callback {
int error; int error;
}; };
static int filldir(void * __buf, const char * name, int namlen, loff_t offset, static int filldir(struct dir_context *ctx, const char *name, int namlen,
u64 ino, unsigned int d_type) loff_t offset, u64 ino, unsigned int d_type)
{ {
struct linux_dirent __user * dirent; struct linux_dirent __user * dirent;
struct getdents_callback * buf = (struct getdents_callback *) __buf; struct getdents_callback *buf =
container_of(ctx, struct getdents_callback, ctx);
unsigned long d_ino; unsigned long d_ino;
int reclen = ALIGN(offsetof(struct linux_dirent, d_name) + namlen + 2, int reclen = ALIGN(offsetof(struct linux_dirent, d_name) + namlen + 2,
sizeof(long)); sizeof(long));
...@@ -232,11 +234,12 @@ struct getdents_callback64 { ...@@ -232,11 +234,12 @@ struct getdents_callback64 {
int error; int error;
}; };
static int filldir64(void * __buf, const char * name, int namlen, loff_t offset, static int filldir64(struct dir_context *ctx, const char *name, int namlen,
u64 ino, unsigned int d_type) loff_t offset, u64 ino, unsigned int d_type)
{ {
struct linux_dirent64 __user *dirent; struct linux_dirent64 __user *dirent;
struct getdents_callback64 * buf = (struct getdents_callback64 *) __buf; struct getdents_callback64 *buf =
container_of(ctx, struct getdents_callback64, ctx);
int reclen = ALIGN(offsetof(struct linux_dirent64, d_name) + namlen + 1, int reclen = ALIGN(offsetof(struct linux_dirent64, d_name) + namlen + 1,
sizeof(u64)); sizeof(u64));
......
...@@ -188,10 +188,11 @@ struct reiserfs_dentry_buf { ...@@ -188,10 +188,11 @@ struct reiserfs_dentry_buf {
}; };
static int static int
fill_with_dentries(void *buf, const char *name, int namelen, loff_t offset, fill_with_dentries(struct dir_context *ctx, const char *name, int namelen,
u64 ino, unsigned int d_type) loff_t offset, u64 ino, unsigned int d_type)
{ {
struct reiserfs_dentry_buf *dbuf = buf; struct reiserfs_dentry_buf *dbuf =
container_of(ctx, struct reiserfs_dentry_buf, ctx);
struct dentry *dentry; struct dentry *dentry;
WARN_ON_ONCE(!mutex_is_locked(&dbuf->xadir->d_inode->i_mutex)); WARN_ON_ONCE(!mutex_is_locked(&dbuf->xadir->d_inode->i_mutex));
...@@ -824,10 +825,12 @@ struct listxattr_buf { ...@@ -824,10 +825,12 @@ struct listxattr_buf {
struct dentry *dentry; struct dentry *dentry;
}; };
static int listxattr_filler(void *buf, const char *name, int namelen, static int listxattr_filler(struct dir_context *ctx, const char *name,
loff_t offset, u64 ino, unsigned int d_type) int namelen, loff_t offset, u64 ino,
unsigned int d_type)
{ {
struct listxattr_buf *b = (struct listxattr_buf *)buf; struct listxattr_buf *b =
container_of(ctx, struct listxattr_buf, ctx);
size_t size; size_t size;
if (name[0] != '.' || if (name[0] != '.' ||
......
...@@ -1467,7 +1467,10 @@ int fiemap_check_flags(struct fiemap_extent_info *fieinfo, u32 fs_flags); ...@@ -1467,7 +1467,10 @@ int fiemap_check_flags(struct fiemap_extent_info *fieinfo, u32 fs_flags);
* This allows the kernel to read directories into kernel space or * This allows the kernel to read directories into kernel space or
* to have different dirent layouts depending on the binary type. * to have different dirent layouts depending on the binary type.
*/ */
typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned); struct dir_context;
typedef int (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64,
unsigned);
struct dir_context { struct dir_context {
const filldir_t actor; const filldir_t actor;
loff_t pos; loff_t pos;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册