NFS: Optimise away the previous cookie field
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 27 Feb 2022 17:46:24 +0000 (12:46 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 2 Mar 2022 13:43:39 +0000 (08:43 -0500)
Replace the 'previous cookie' field in struct nfs_entry with the
array->last_cookie.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/dir.c
fs/nfs/nfs2xdr.c
fs/nfs/nfs3xdr.c
fs/nfs/nfs4xdr.c
include/linux/nfs_xdr.h

index f6aac1e..033249a 100644 (file)
@@ -301,19 +301,20 @@ static int nfs_readdir_array_can_expand(struct nfs_cache_array *array)
        return 0;
 }
 
-static
-int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page)
+static int nfs_readdir_page_array_append(struct page *page,
+                                        const struct nfs_entry *entry,
+                                        u64 *cookie)
 {
        struct nfs_cache_array *array;
        struct nfs_cache_array_entry *cache_entry;
        const char *name;
-       int ret;
+       int ret = -ENOMEM;
 
        name = nfs_readdir_copy_name(entry->name, entry->len);
-       if (!name)
-               return -ENOMEM;
 
        array = kmap_atomic(page);
+       if (!name)
+               goto out;
        ret = nfs_readdir_array_can_expand(array);
        if (ret) {
                kfree(name);
@@ -321,7 +322,7 @@ int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page)
        }
 
        cache_entry = &array->array[array->size];
-       cache_entry->cookie = entry->prev_cookie;
+       cache_entry->cookie = array->last_cookie;
        cache_entry->ino = entry->ino;
        cache_entry->d_type = entry->d_type;
        cache_entry->name_len = entry->len;
@@ -333,6 +334,7 @@ int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page)
        if (entry->eof != 0)
                nfs_readdir_array_set_eof(array);
 out:
+       *cookie = array->last_cookie;
        kunmap_atomic(array);
        return ret;
 }
@@ -798,6 +800,7 @@ static int nfs_readdir_page_filler(struct nfs_readdir_descriptor *desc,
        struct xdr_stream stream;
        struct xdr_buf buf;
        struct page *scratch, *new, *page = *arrays;
+       u64 cookie;
        int status;
 
        scratch = alloc_page(GFP_KERNEL);
@@ -819,22 +822,21 @@ static int nfs_readdir_page_filler(struct nfs_readdir_descriptor *desc,
                        nfs_prime_dcache(file_dentry(desc->file), entry,
                                        desc->dir_verifier);
 
-               status = nfs_readdir_add_to_array(entry, page);
+               status = nfs_readdir_page_array_append(page, entry, &cookie);
                if (status != -ENOSPC)
                        continue;
 
                if (page->mapping != mapping) {
                        if (!--narrays)
                                break;
-                       new = nfs_readdir_page_array_alloc(entry->prev_cookie,
-                                                          GFP_KERNEL);
+                       new = nfs_readdir_page_array_alloc(cookie, GFP_KERNEL);
                        if (!new)
                                break;
                        arrays++;
                        *arrays = page = new;
                } else {
-                       new = nfs_readdir_page_get_next(
-                               mapping, entry->prev_cookie, change_attr);
+                       new = nfs_readdir_page_get_next(mapping, cookie,
+                                                       change_attr);
                        if (!new)
                                break;
                        if (page != *arrays)
@@ -842,7 +844,7 @@ static int nfs_readdir_page_filler(struct nfs_readdir_descriptor *desc,
                        page = new;
                }
                desc->page_index_max++;
-               status = nfs_readdir_add_to_array(entry, page);
+               status = nfs_readdir_page_array_append(page, entry, &cookie);
        } while (!status && !entry->eof);
 
        switch (status) {
index 3d5ba43..05c3b4b 100644 (file)
@@ -955,7 +955,6 @@ int nfs2_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
         * The type (size and byte order) of nfscookie isn't defined in
         * RFC 1094.  This implementation assumes that it's an XDR uint32.
         */
-       entry->prev_cookie = entry->cookie;
        p = xdr_inline_decode(xdr, 4);
        if (unlikely(!p))
                return -EAGAIN;
index d6779ce..3b0b650 100644 (file)
@@ -2024,7 +2024,6 @@ int nfs3_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
                        zero_nfs_fh3(entry->fh);
        }
 
-       entry->prev_cookie = entry->cookie;
        entry->cookie = new_cookie;
 
        return 0;
index b7780b9..86a5f65 100644 (file)
@@ -7508,7 +7508,6 @@ int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
        if (entry->fattr->valid & NFS_ATTR_FATTR_TYPE)
                entry->d_type = nfs_umode_to_dtype(entry->fattr->mode);
 
-       entry->prev_cookie = entry->cookie;
        entry->cookie = new_cookie;
 
        return 0;
index 728cb0c..82f7c27 100644 (file)
@@ -745,8 +745,7 @@ struct nfs_auth_info {
  */
 struct nfs_entry {
        __u64                   ino;
-       __u64                   cookie,
-                               prev_cookie;
+       __u64                   cookie;
        const char *            name;
        unsigned int            len;
        int                     eof;