loff_t          current_index;
        loff_t          prev_index;
 
+       __be32          verf[NFS_DIR_VERIFIER_SIZE];
        unsigned long   dir_verifier;
        unsigned long   timestamp;
        unsigned long   gencount;
 
 /* Fill a page with xdr information before transferring to the cache page */
 static int nfs_readdir_xdr_filler(struct nfs_readdir_descriptor *desc,
-                                 u64 cookie, struct page **pages,
-                                 size_t bufsize)
+                                 __be32 *verf, u64 cookie,
+                                 struct page **pages, size_t bufsize,
+                                 __be32 *verf_res)
 {
        struct inode *inode = file_inode(desc->file);
-       __be32 verf_res[2];
        struct nfs_readdir_arg arg = {
                .dentry = file_dentry(desc->file),
                .cred = desc->file->f_cred,
-               .verf = NFS_I(inode)->cookieverf,
+               .verf = verf,
                .cookie = cookie,
                .pages = pages,
                .page_len = bufsize,
        }
        desc->timestamp = timestamp;
        desc->gencount = gencount;
-       memcpy(NFS_I(inode)->cookieverf, res.verf,
-              sizeof(NFS_I(inode)->cookieverf));
 error:
        return error;
 }
 }
 
 static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
-                                   struct page *page, struct inode *inode)
+                                   struct page *page, __be32 *verf_arg,
+                                   __be32 *verf_res)
 {
        struct page **pages;
        struct nfs_entry *entry;
        size_t array_size;
+       struct inode *inode = file_inode(desc->file);
        size_t dtsize = NFS_SERVER(inode)->dtsize;
        int status = -ENOMEM;
 
 
        do {
                unsigned int pglen;
-               status = nfs_readdir_xdr_filler(desc, entry->cookie,
-                                               pages, dtsize);
+               status = nfs_readdir_xdr_filler(desc, verf_arg, entry->cookie,
+                                               pages, dtsize,
+                                               verf_res);
                if (status < 0)
                        break;
 
 {
        struct inode *inode = file_inode(desc->file);
        struct nfs_inode *nfsi = NFS_I(inode);
+       __be32 verf[NFS_DIR_VERIFIER_SIZE];
        int res;
 
        desc->page = nfs_readdir_page_get_cached(desc);
        if (!desc->page)
                return -ENOMEM;
        if (nfs_readdir_page_needs_filling(desc->page)) {
-               res = nfs_readdir_xdr_to_array(desc, desc->page, inode);
+               res = nfs_readdir_xdr_to_array(desc, desc->page,
+                                              nfsi->cookieverf, verf);
                if (res < 0) {
                        nfs_readdir_page_unlock_and_put_cached(desc);
                        if (res == -EBADCOOKIE || res == -ENOTSYNC) {
                        }
                        return res;
                }
+               memcpy(nfsi->cookieverf, verf, sizeof(nfsi->cookieverf));
        }
        res = nfs_readdir_search_array(desc);
        if (res == 0) {
 static void nfs_do_filldir(struct nfs_readdir_descriptor *desc)
 {
        struct file     *file = desc->file;
+       struct nfs_inode *nfsi = NFS_I(file_inode(file));
        struct nfs_cache_array *array;
        unsigned int i = 0;
 
                        desc->eof = true;
                        break;
                }
+               memcpy(desc->verf, nfsi->cookieverf, sizeof(desc->verf));
                if (i < (array->size-1))
                        desc->dir_cookie = array->array[i+1].cookie;
                else
 static int uncached_readdir(struct nfs_readdir_descriptor *desc)
 {
        struct page     *page = NULL;
+       __be32          verf[NFS_DIR_VERIFIER_SIZE];
        int             status;
-       struct inode *inode = file_inode(desc->file);
 
        dfprintk(DIRCACHE, "NFS: uncached_readdir() searching for cookie %Lu\n",
                        (unsigned long long)desc->dir_cookie);
        desc->duped = 0;
 
        nfs_readdir_page_init_array(page, desc->dir_cookie);
-       status = nfs_readdir_xdr_to_array(desc, page, inode);
+       status = nfs_readdir_xdr_to_array(desc, page, desc->verf, verf);
        if (status < 0)
                goto out_release;
 
        desc->dup_cookie = dir_ctx->dup_cookie;
        desc->duped = dir_ctx->duped;
        desc->attr_gencount = dir_ctx->attr_gencount;
+       memcpy(desc->verf, dir_ctx->verf, sizeof(desc->verf));
        spin_unlock(&file->f_lock);
 
        do {
        dir_ctx->dup_cookie = desc->dup_cookie;
        dir_ctx->duped = desc->duped;
        dir_ctx->attr_gencount = desc->attr_gencount;
+       memcpy(dir_ctx->verf, desc->verf, sizeof(dir_ctx->verf));
        spin_unlock(&file->f_lock);
 
        kfree(desc);
                        dir_ctx->dir_cookie = offset;
                else
                        dir_ctx->dir_cookie = 0;
+               if (offset == 0)
+                       memset(dir_ctx->verf, 0, sizeof(dir_ctx->verf));
                dir_ctx->duped = 0;
        }
        spin_unlock(&filp->f_lock);
 
        nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
        nfsi->attrtimeo_timestamp = jiffies;
 
-       memset(NFS_I(inode)->cookieverf, 0, sizeof(NFS_I(inode)->cookieverf));
        if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) {
                nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATTR
                                        | NFS_INO_INVALID_DATA
 
 static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping)
 {
-       struct nfs_inode *nfsi = NFS_I(inode);
        int ret;
 
        if (mapping->nrpages != 0) {
                if (ret < 0)
                        return ret;
        }
-       if (S_ISDIR(inode->i_mode)) {
-               spin_lock(&inode->i_lock);
-               memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));
-               spin_unlock(&inode->i_lock);
-       }
        nfs_inc_stats(inode, NFSIOS_DATAINVALIDATE);
        nfs_fscache_wait_on_invalidate(inode);