NFS: Optimise the readdir searches
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 24 Sep 2010 22:49:43 +0000 (18:49 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Sat, 23 Oct 2010 19:27:30 +0000 (15:27 -0400)
If we're going through the loop in nfs_readdir() more than once, we usually
do not want to restart searching from the beginning of the pages cache.

We only want to do that if the previous search failed...

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/dir.c

index f772439..33b0ce7 100644 (file)
@@ -491,10 +491,6 @@ static inline
 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc)
 {
        int res = -EAGAIN;
-       desc->page_index = 0;
-
-       if (*desc->dir_cookie == 0)
-               desc->cache_entry_index = 0;
 
        while (1) {
                res = find_cache_page(desc);
@@ -589,6 +585,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,
                goto out_release;
        }
 
+       desc->page_index = 0;
        desc->page = page;
        status = nfs_do_filldir(desc, dirent, filldir);
 
@@ -653,6 +650,7 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
                if (res == -ETOOSMALL && desc->plus) {
                        clear_bit(NFS_INO_ADVISE_RDPLUS, &NFS_I(inode)->flags);
                        nfs_zap_caches(inode);
+                       desc->page_index = 0;
                        desc->plus = 0;
                        desc->eof = 0;
                        continue;