.freepage = nfs_readdir_clear_array,
 };
 
-static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir, const struct cred *cred)
+static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir)
 {
        struct nfs_inode *nfsi = NFS_I(dir);
        struct nfs_open_dir_context *ctx;
                ctx->attr_gencount = nfsi->attr_gencount;
                ctx->dir_cookie = 0;
                ctx->dup_cookie = 0;
-               ctx->cred = get_cred(cred);
                spin_lock(&dir->i_lock);
                if (list_empty(&nfsi->open_files) &&
                    (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
        spin_lock(&dir->i_lock);
        list_del(&ctx->list);
        spin_unlock(&dir->i_lock);
-       put_cred(ctx->cred);
        kfree(ctx);
 }
 
 
        nfs_inc_stats(inode, NFSIOS_VFSOPEN);
 
-       ctx = alloc_nfs_open_dir_context(inode, current_cred());
+       ctx = alloc_nfs_open_dir_context(inode);
        if (IS_ERR(ctx)) {
                res = PTR_ERR(ctx);
                goto out;
 }
 
 /* Fill a page with xdr information before transferring to the cache page */
-static
-int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc,
-                       struct nfs_entry *entry, struct file *file, struct inode *inode)
+static int nfs_readdir_xdr_filler(struct nfs_readdir_descriptor *desc,
+                                 u64 cookie, struct page **pages,
+                                 size_t bufsize)
 {
-       struct nfs_open_dir_context *ctx = file->private_data;
-       const struct cred *cred = ctx->cred;
+       struct file *file = desc->file;
+       struct inode *inode = file_inode(file);
        unsigned long   timestamp, gencount;
        int             error;
 
        timestamp = jiffies;
        gencount = nfs_inc_attr_generation_counter();
        desc->dir_verifier = nfs_save_change_attribute(inode);
-       error = NFS_PROTO(inode)->readdir(file_dentry(file), cred, entry->cookie, pages,
-                                         NFS_SERVER(inode)->dtsize, desc->plus);
+       error = NFS_PROTO(inode)->readdir(file_dentry(file), file->f_cred,
+                                         cookie, pages, bufsize, desc->plus);
        if (error < 0) {
                /* We requested READDIRPLUS, but the server doesn't grok it */
                if (error == -ENOTSUPP && desc->plus) {
 {
        struct page **pages;
        struct nfs_entry entry;
-       struct file     *file = desc->file;
        size_t array_size;
        size_t dtsize = NFS_SERVER(inode)->dtsize;
        int status = -ENOMEM;
 
        do {
                unsigned int pglen;
-               status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode);
-
+               status = nfs_readdir_xdr_filler(desc, entry.cookie,
+                                               pages, dtsize);
                if (status < 0)
                        break;