staging/lustre/llite: readdir convert to iterate
authorPeng Tao <tao.peng@emc.com>
Mon, 15 Jul 2013 14:27:19 +0000 (22:27 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 23 Jul 2013 19:24:07 +0000 (12:24 -0700)
Signed-off-by: Peng Tao <tao.peng@emc.com>
Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/llite/dir.c
drivers/staging/lustre/lustre/llite/llite_internal.h
drivers/staging/lustre/lustre/llite/llite_nfs.c

index e2afb97303434f913b3001b2e76a25c9f5dfdae0..1084999be959c5537c4312157b31b5b5c7bc6e65 100644 (file)
@@ -483,12 +483,11 @@ fail:
        goto out_unlock;
 }
 
-int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie,
-               filldir_t filldir)
+int ll_dir_read(struct inode *inode, struct dir_context *ctx)
 {
        struct ll_inode_info *info       = ll_i2info(inode);
        struct ll_sb_info    *sbi       = ll_i2sbi(inode);
-       __u64            pos    = *_pos;
+       __u64              pos          = ctx->pos;
        int                api32      = ll_need_32bit_api(sbi);
        int                hash64     = sbi->ll_flags & LL_SBI_64BIT_HASH;
        struct page       *page;
@@ -548,12 +547,14 @@ int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie,
                                fid_le_to_cpu(&fid, &ent->lde_fid);
                                ino = cl_fid_build_ino(&fid, api32);
                                type = ll_dirent_type_get(ent);
+                               ctx->pos = lhash;
                                /* For 'll_nfs_get_name_filldir()', it will try
                                 * to access the 'ent' through its 'lde_name',
-                                * so the parameter 'name' for 'filldir()' must
-                                * be part of the 'ent'. */
-                               done = filldir(cookie, ent->lde_name, namelen,
-                                              lhash, ino, type);
+                                * so the parameter 'name' for 'ctx->actor()'
+                                * must be part of the 'ent'.
+                                */
+                               done = !dir_emit(ctx, ent->lde_name,
+                                                namelen, ino, type);
                        }
                        next = le64_to_cpu(dp->ldp_hash_end);
                        if (!done) {
@@ -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);
        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 ll_file_data     *lfd    = LUSTRE_FPRIVATE(filp);
        struct ll_sb_info       *sbi    = ll_i2sbi(inode);
-       __u64                   pos     = lfd->lfd_pos;
        int                     hash64  = sbi->ll_flags & LL_SBI_64BIT_HASH;
        int                     api32   = ll_need_32bit_api(sbi);
        int                     rc;
-       struct path             path;
        ENTRY;
 
        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p) pos %lu/%llu "
               " 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.
                 */
                GOTO(out, rc = 0);
 
-       rc = ll_dir_read(inode, &pos, cookie, filldir);
-       lfd->lfd_pos = pos;
-       if (pos == MDS_DIR_END_OFF) {
+       ctx->pos = lfd->lfd_pos;
+       rc = ll_dir_read(inode, ctx);
+       lfd->lfd_pos = ctx->pos;
+       if (ctx->pos == MDS_DIR_END_OFF) {
                if (api32)
-                       filp->f_pos = LL_DIR_END_OFF_32BIT;
+                       ctx->pos = LL_DIR_END_OFF_32BIT;
                else
-                       filp->f_pos = LL_DIR_END_OFF;
+                       ctx->pos = LL_DIR_END_OFF;
        } else {
                if (api32 && hash64)
-                       filp->f_pos = pos >> 32;
-               else
-                       filp->f_pos = pos;
+                       ctx->pos >>= 32;
        }
        filp->f_version = inode->i_version;
-       path.mnt = filp->f_path.mnt;
-       path.dentry = filp->f_dentry;
-       touch_atime(&path);
 
 out:
        if (!rc)
@@ -1976,7 +1971,7 @@ struct file_operations ll_dir_operations = {
        .open     = ll_dir_open,
        .release  = ll_dir_release,
        .read     = generic_read_dir,
-       .readdir  = ll_readdir,
+       .iterate  = ll_readdir,
        .unlocked_ioctl   = ll_dir_ioctl,
        .fsync    = ll_fsync,
 };
index cbcd11847aac4541c9df7d5fb42a3cb94080fdb5..0534665df905a53ab578fb71a8a78d6616521eb5 100644 (file)
@@ -90,6 +90,7 @@ extern struct file_operations ll_pgcache_seq_fops;
 #define REMOTE_PERM_HASHSIZE 16
 
 struct ll_getname_data {
+       struct dir_context ctx;
        char        *lgd_name;      /* points to a buffer with NAME_MAX+1 size */
        struct lu_fid    lgd_fid;       /* target fid we are looking for */
        int           lgd_found;     /* inode matched? */
@@ -679,8 +680,7 @@ extern struct file_operations ll_dir_operations;
 extern struct inode_operations ll_dir_inode_operations;
 struct page *ll_get_dir_page(struct inode *dir, __u64 hash,
                             struct ll_dir_chain *chain);
-int ll_dir_read(struct inode *inode, __u64 *_pos, void *cookie,
-               filldir_t filldir);
+int ll_dir_read(struct inode *inode, struct dir_context *ctx);
 
 int ll_get_mdt_idx(struct inode *inode);
 /* llite/namei.c */
index 28cc41e90581a9bad42eb3426c16270ea8c1f2ba..f142a1ec3f86fab8c775e519637068f329085c9e 100644 (file)
@@ -214,9 +214,12 @@ static int ll_get_name(struct dentry *dentry, char *name,
                       struct dentry *child)
 {
        struct inode *dir = dentry->d_inode;
-       struct ll_getname_data lgd;
-       __u64 offset = 0;
        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;
 
        if (!dir || !S_ISDIR(dir->i_mode))
@@ -225,12 +228,8 @@ static int ll_get_name(struct dentry *dentry, char *name,
        if (!dir->i_fop)
                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);
-       rc = ll_dir_read(dir, &offset, &lgd, ll_nfs_get_name_filldir);
+       rc = ll_dir_read(dir, &lgd.ctx);
        mutex_unlock(&dir->i_mutex);
        if (!rc && !lgd.lgd_found)
                rc = -ENOENT;