[readdir] switch dcache_readdir() users to ->iterate()
new helpers - dir_emit_dot(file, ctx, dentry), dir_emit_dotdot(file, ctx), dir_emit_dots(file, ctx). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
80886298c0
commit
5f99f4e79a
4 changed files with 64 additions and 59 deletions
|
|
@ -1511,12 +1511,6 @@ struct dir_context {
|
|||
loff_t pos;
|
||||
};
|
||||
|
||||
static inline bool dir_emit(struct dir_context *ctx,
|
||||
const char *name, int namelen,
|
||||
u64 ino, unsigned type)
|
||||
{
|
||||
return ctx->actor(ctx, name, namelen, ctx->pos, ino, type) == 0;
|
||||
}
|
||||
struct block_device_operations;
|
||||
|
||||
/* These macros are for out of kernel modules to test that
|
||||
|
|
@ -2537,7 +2531,7 @@ extern void iterate_supers_type(struct file_system_type *,
|
|||
extern int dcache_dir_open(struct inode *, struct file *);
|
||||
extern int dcache_dir_close(struct inode *, struct file *);
|
||||
extern loff_t dcache_dir_lseek(struct file *, loff_t, int);
|
||||
extern int dcache_readdir(struct file *, void *, filldir_t);
|
||||
extern int dcache_readdir(struct file *, struct dir_context *);
|
||||
extern int simple_setattr(struct dentry *, struct iattr *);
|
||||
extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
||||
extern int simple_statfs(struct dentry *, struct kstatfs *);
|
||||
|
|
@ -2701,4 +2695,35 @@ static inline void inode_has_no_xattr(struct inode *inode)
|
|||
inode->i_flags |= S_NOSEC;
|
||||
}
|
||||
|
||||
static inline bool dir_emit(struct dir_context *ctx,
|
||||
const char *name, int namelen,
|
||||
u64 ino, unsigned type)
|
||||
{
|
||||
return ctx->actor(ctx, name, namelen, ctx->pos, ino, type) == 0;
|
||||
}
|
||||
static inline bool dir_emit_dot(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
return ctx->actor(ctx, ".", 1, ctx->pos,
|
||||
file->f_path.dentry->d_inode->i_ino, DT_DIR) == 0;
|
||||
}
|
||||
static inline bool dir_emit_dotdot(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
return ctx->actor(ctx, "..", 2, ctx->pos,
|
||||
parent_ino(file->f_path.dentry), DT_DIR) == 0;
|
||||
}
|
||||
static inline bool dir_emit_dots(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
if (ctx->pos == 0) {
|
||||
if (!dir_emit_dot(file, ctx))
|
||||
return false;
|
||||
ctx->pos = 1;
|
||||
}
|
||||
if (ctx->pos == 1) {
|
||||
if (!dir_emit_dotdot(file, ctx))
|
||||
return false;
|
||||
ctx->pos = 2;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* _LINUX_FS_H */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue