return true;
 }
 
+static void nfs_readdir_seek_next_array(struct nfs_cache_array *array,
+                                       struct nfs_readdir_descriptor *desc)
+{
+       if (array->page_full) {
+               desc->last_cookie = array->last_cookie;
+               desc->current_index += array->size;
+               desc->cache_entry_index = 0;
+               desc->page_index++;
+       } else
+               desc->last_cookie = array->array[0].cookie;
+}
+
 static int nfs_readdir_search_for_pos(struct nfs_cache_array *array,
                                      struct nfs_readdir_descriptor *desc)
 {
        if (diff >= array->size) {
                if (array->page_is_eof)
                        goto out_eof;
+               nfs_readdir_seek_next_array(array, desc);
                return -EAGAIN;
        }
 
                status = -EBADCOOKIE;
                if (desc->dir_cookie == array->last_cookie)
                        desc->eof = true;
-       }
+       } else
+               nfs_readdir_seek_next_array(array, desc);
 out:
        return status;
 }
        else
                status = nfs_readdir_search_for_cookie(array, desc);
 
-       if (status == -EAGAIN) {
-               desc->last_cookie = array->last_cookie;
-               desc->current_index += array->size;
-               desc->page_index++;
-       }
        kunmap_atomic(array);
        return status;
 }
 {
        struct file     *file = desc->file;
        struct nfs_cache_array *array;
-       unsigned int i = 0;
+       unsigned int i;
 
        array = kmap(desc->page);
        for (i = desc->cache_entry_index; i < array->size; i++) {
                        break;
                }
                memcpy(desc->verf, verf, sizeof(desc->verf));
-               if (i < (array->size-1))
-                       desc->dir_cookie = array->array[i+1].cookie;
-               else
+               if (i == array->size - 1) {
                        desc->dir_cookie = array->last_cookie;
+                       nfs_readdir_seek_next_array(array, desc);
+               } else {
+                       desc->dir_cookie = array->array[i + 1].cookie;
+                       desc->last_cookie = array->array[0].cookie;
+               }
                if (nfs_readdir_use_cookie(file))
                        desc->ctx->pos = desc->dir_cookie;
                else