]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFS: Clean up nfs_readdir_page_filler()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 1 Nov 2020 22:15:43 +0000 (17:15 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 2 Dec 2020 19:05:51 +0000 (14:05 -0500)
Clean up handling of the case where there are no entries in the readdir
reply.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Tested-by: Benjamin Coddington <bcodding@redhat.com>
Tested-by: Dave Wysochanski <dwysocha@redhat.com>
fs/nfs/dir.c

index 604ebe0153870d141ebfc0c169c3905625872e52..68acbde3f914b16fe2a8959ce68f7c66e299e908 100644 (file)
@@ -601,16 +601,12 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en
        struct xdr_stream stream;
        struct xdr_buf buf;
        struct page *scratch;
-       unsigned int count = 0;
        int status;
 
        scratch = alloc_page(GFP_KERNEL);
        if (scratch == NULL)
                return -ENOMEM;
 
-       if (buflen == 0)
-               goto out_nopages;
-
        xdr_init_decode_pages(&stream, &buf, xdr_pages, buflen);
        xdr_set_scratch_buffer(&stream, page_address(scratch), PAGE_SIZE);
 
@@ -619,27 +615,27 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en
                        entry->label->len = NFS4_MAXLABELLEN;
 
                status = xdr_decode(desc, entry, &stream);
-               if (status != 0) {
-                       if (status == -EAGAIN)
-                               status = 0;
+               if (status != 0)
                        break;
-               }
-
-               count++;
 
                if (desc->plus)
                        nfs_prime_dcache(file_dentry(desc->file), entry,
                                        desc->dir_verifier);
 
                status = nfs_readdir_add_to_array(entry, page);
-               if (status != 0)
-                       break;
-       } while (!entry->eof);
+       } while (!status && !entry->eof);
 
-out_nopages:
-       if (count == 0 || (status == -EBADCOOKIE && entry->eof != 0)) {
-               nfs_readdir_page_set_eof(page);
+       switch (status) {
+       case -EBADCOOKIE:
+               if (entry->eof) {
+                       nfs_readdir_page_set_eof(page);
+                       status = 0;
+               }
+               break;
+       case -ENOSPC:
+       case -EAGAIN:
                status = 0;
+               break;
        }
 
        put_page(scratch);
@@ -714,14 +710,15 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page,
 
                if (status < 0)
                        break;
+
                pglen = status;
-               status = nfs_readdir_page_filler(desc, &entry, pages, page, pglen);
-               if (status < 0) {
-                       if (status == -ENOSPC)
-                               status = 0;
+               if (pglen == 0) {
+                       nfs_readdir_page_set_eof(page);
                        break;
                }
-       } while (!nfs_readdir_array_is_full(array));
+
+               status = nfs_readdir_page_filler(desc, &entry, pages, page, pglen);
+       } while (!status && !nfs_readdir_array_is_full(array));
 
        nfs_readdir_free_pages(pages, array_size);
 out_release_array: