NFS: Simplify nfs_readdir_xdr_to_array()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 7 Feb 2022 20:07:01 +0000 (15:07 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 2 Mar 2022 13:43:38 +0000 (08:43 -0500)
Recent changes to readdir mean that we can cope with partially filled
page cache entries, so we no longer need to rely on looping in
nfs_readdir_xdr_to_array().

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

index 9998d7d..9d086ab 100644 (file)
@@ -889,6 +889,7 @@ static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
        size_t array_size;
        struct inode *inode = file_inode(desc->file);
        unsigned int dtsize = desc->dtsize;
+       unsigned int pglen;
        int status = -ENOMEM;
 
        entry = kzalloc(sizeof(*entry), GFP_KERNEL);
@@ -906,28 +907,20 @@ static int nfs_readdir_xdr_to_array(struct nfs_readdir_descriptor *desc,
        if (!pages)
                goto out;
 
-       do {
-               unsigned int pglen;
-               status = nfs_readdir_xdr_filler(desc, verf_arg, entry->cookie,
-                                               pages, dtsize,
-                                               verf_res);
-               if (status < 0)
-                       break;
-
-               pglen = status;
-               if (pglen == 0) {
-                       nfs_readdir_page_set_eof(page);
-                       break;
-               }
-
-               verf_arg = verf_res;
+       status = nfs_readdir_xdr_filler(desc, verf_arg, entry->cookie, pages,
+                                       dtsize, verf_res);
+       if (status < 0)
+               goto free_pages;
 
+       pglen = status;
+       if (pglen != 0)
                status = nfs_readdir_page_filler(desc, entry, pages, pglen,
                                                 arrays, narrays);
-               desc->buffer_fills++;
-       } while (!status && nfs_readdir_page_needs_filling(page) &&
-               page_mapping(page));
+       else
+               nfs_readdir_page_set_eof(page);
+       desc->buffer_fills++;
 
+free_pages:
        nfs_readdir_free_pages(pages, array_size);
 out:
        nfs_free_fattr(entry->fattr);