Commit 0b09d381 authored by Peng Tao's avatar Peng Tao Committed by Greg Kroah-Hartman

staging/lustre/llite: readdir convert to iterate

Signed-off-by: default avatarPeng Tao <tao.peng@emc.com>
Signed-off-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 90181e1d
...@@ -483,12 +483,11 @@ struct page *ll_get_dir_page(struct inode *dir, __u64 hash, ...@@ -483,12 +483,11 @@ struct page *ll_get_dir_page(struct inode *dir, __u64 hash,
goto out_unlock; goto out_unlock;
} }
int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie, int ll_dir_read(struct inode *inode, struct dir_context *ctx)
filldir_t filldir)
{ {
struct ll_inode_info *info = ll_i2info(inode); struct ll_inode_info *info = ll_i2info(inode);
struct ll_sb_info *sbi = ll_i2sbi(inode); struct ll_sb_info *sbi = ll_i2sbi(inode);
__u64 pos = *_pos; __u64 pos = ctx->pos;
int api32 = ll_need_32bit_api(sbi); int api32 = ll_need_32bit_api(sbi);
int hash64 = sbi->ll_flags & LL_SBI_64BIT_HASH; int hash64 = sbi->ll_flags & LL_SBI_64BIT_HASH;
struct page *page; struct page *page;
...@@ -548,12 +547,14 @@ int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie, ...@@ -548,12 +547,14 @@ int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie,
fid_le_to_cpu(&fid, &ent->lde_fid); fid_le_to_cpu(&fid, &ent->lde_fid);
ino = cl_fid_build_ino(&fid, api32); ino = cl_fid_build_ino(&fid, api32);
type = ll_dirent_type_get(ent); type = ll_dirent_type_get(ent);
ctx->pos = lhash;
/* For 'll_nfs_get_name_filldir()', it will try /* For 'll_nfs_get_name_filldir()', it will try
* to access the 'ent' through its 'lde_name', * to access the 'ent' through its 'lde_name',
* so the parameter 'name' for 'filldir()' must * so the parameter 'name' for 'ctx->actor()'
* be part of the 'ent'. */ * must be part of the 'ent'.
done = filldir(cookie, ent->lde_name, namelen, */
lhash, ino, type); done = !dir_emit(ctx, ent->lde_name,
namelen, ino, type);
} }
next = le64_to_cpu(dp->ldp_hash_end); next = le64_to_cpu(dp->ldp_hash_end);
if (!done) { if (!done) {
...@@ -594,50 +595,44 @@ int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie, ...@@ -594,50 +595,44 @@ int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie,
} }
} }
*_pos = pos; ctx->pos = pos;
ll_dir_chain_fini(&chain); ll_dir_chain_fini(&chain);
RETURN(rc); RETURN(rc);
} }
static int ll_readdir(struct file *filp, void *cookie, filldir_t filldir) static int ll_readdir(struct file *filp, struct dir_context *ctx)
{ {
struct inode *inode = filp->f_dentry->d_inode; struct inode *inode = filp->f_dentry->d_inode;
struct ll_file_data *lfd = LUSTRE_FPRIVATE(filp); struct ll_file_data *lfd = LUSTRE_FPRIVATE(filp);
struct ll_sb_info *sbi = ll_i2sbi(inode); struct ll_sb_info *sbi = ll_i2sbi(inode);
__u64 pos = lfd->lfd_pos;
int hash64 = sbi->ll_flags & LL_SBI_64BIT_HASH; int hash64 = sbi->ll_flags & LL_SBI_64BIT_HASH;
int api32 = ll_need_32bit_api(sbi); int api32 = ll_need_32bit_api(sbi);
int rc; int rc;
struct path path;
ENTRY; ENTRY;
CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p) pos %lu/%llu " CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p) pos %lu/%llu "
" 32bit_api %d\n", inode->i_ino, inode->i_generation, " 32bit_api %d\n", inode->i_ino, inode->i_generation,
inode, (unsigned long)pos, i_size_read(inode), api32); inode, (unsigned long)lfd->lfd_pos, i_size_read(inode), api32);
if (pos == MDS_DIR_END_OFF) if (lfd->lfd_pos == MDS_DIR_END_OFF)
/* /*
* end-of-file. * end-of-file.
*/ */
GOTO(out, rc = 0); GOTO(out, rc = 0);
rc = ll_dir_read(inode, &pos, cookie, filldir); ctx->pos = lfd->lfd_pos;
lfd->lfd_pos = pos; rc = ll_dir_read(inode, ctx);
if (pos == MDS_DIR_END_OFF) { lfd->lfd_pos = ctx->pos;
if (ctx->pos == MDS_DIR_END_OFF) {
if (api32) if (api32)
filp->f_pos = LL_DIR_END_OFF_32BIT; ctx->pos = LL_DIR_END_OFF_32BIT;
else else
filp->f_pos = LL_DIR_END_OFF; ctx->pos = LL_DIR_END_OFF;
} else { } else {
if (api32 && hash64) if (api32 && hash64)
filp->f_pos = pos >> 32; ctx->pos >>= 32;
else
filp->f_pos = pos;
} }
filp->f_version = inode->i_version; filp->f_version = inode->i_version;
path.mnt = filp->f_path.mnt;
path.dentry = filp->f_dentry;
touch_atime(&path);
out: out:
if (!rc) if (!rc)
...@@ -1976,7 +1971,7 @@ struct file_operations ll_dir_operations = { ...@@ -1976,7 +1971,7 @@ struct file_operations ll_dir_operations = {
.open = ll_dir_open, .open = ll_dir_open,
.release = ll_dir_release, .release = ll_dir_release,
.read = generic_read_dir, .read = generic_read_dir,
.readdir = ll_readdir, .iterate = ll_readdir,
.unlocked_ioctl = ll_dir_ioctl, .unlocked_ioctl = ll_dir_ioctl,
.fsync = ll_fsync, .fsync = ll_fsync,
}; };
...@@ -90,6 +90,7 @@ extern struct file_operations ll_pgcache_seq_fops; ...@@ -90,6 +90,7 @@ extern struct file_operations ll_pgcache_seq_fops;
#define REMOTE_PERM_HASHSIZE 16 #define REMOTE_PERM_HASHSIZE 16
struct ll_getname_data { struct ll_getname_data {
struct dir_context ctx;
char *lgd_name; /* points to a buffer with NAME_MAX+1 size */ char *lgd_name; /* points to a buffer with NAME_MAX+1 size */
struct lu_fid lgd_fid; /* target fid we are looking for */ struct lu_fid lgd_fid; /* target fid we are looking for */
int lgd_found; /* inode matched? */ int lgd_found; /* inode matched? */
...@@ -679,8 +680,7 @@ extern struct file_operations ll_dir_operations; ...@@ -679,8 +680,7 @@ extern struct file_operations ll_dir_operations;
extern struct inode_operations ll_dir_inode_operations; extern struct inode_operations ll_dir_inode_operations;
struct page *ll_get_dir_page(struct inode *dir, __u64 hash, struct page *ll_get_dir_page(struct inode *dir, __u64 hash,
struct ll_dir_chain *chain); struct ll_dir_chain *chain);
int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie, int ll_dir_read(struct inode *inode, struct dir_context *ctx);
filldir_t filldir);
int ll_get_mdt_idx(struct inode *inode); int ll_get_mdt_idx(struct inode *inode);
/* llite/namei.c */ /* llite/namei.c */
......
...@@ -214,9 +214,12 @@ static int ll_get_name(struct dentry *dentry, char *name, ...@@ -214,9 +214,12 @@ static int ll_get_name(struct dentry *dentry, char *name,
struct dentry *child) struct dentry *child)
{ {
struct inode *dir = dentry->d_inode; struct inode *dir = dentry->d_inode;
struct ll_getname_data lgd;
__u64 offset = 0;
int rc; int rc;
struct ll_getname_data lgd = {
.lgd_name = name,
.lgd_fid = ll_i2info(child->d_inode)->lli_fid,
.ctx.actor = ll_nfs_get_name_filldir,
};
ENTRY; ENTRY;
if (!dir || !S_ISDIR(dir->i_mode)) if (!dir || !S_ISDIR(dir->i_mode))
...@@ -225,12 +228,8 @@ static int ll_get_name(struct dentry *dentry, char *name, ...@@ -225,12 +228,8 @@ static int ll_get_name(struct dentry *dentry, char *name,
if (!dir->i_fop) if (!dir->i_fop)
GOTO(out, rc = -EINVAL); GOTO(out, rc = -EINVAL);
lgd.lgd_name = name;
lgd.lgd_fid = ll_i2info(child->d_inode)->lli_fid;
lgd.lgd_found = 0;
mutex_lock(&dir->i_mutex); mutex_lock(&dir->i_mutex);
rc = ll_dir_read(dir, &offset, &lgd, ll_nfs_get_name_filldir); rc = ll_dir_read(dir, &lgd.ctx);
mutex_unlock(&dir->i_mutex); mutex_unlock(&dir->i_mutex);
if (!rc && !lgd.lgd_found) if (!rc && !lgd.lgd_found)
rc = -ENOENT; rc = -ENOENT;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment