From: trondmy@kernel.org To: linux-nfs@vger.kernel.org Subject: [PATCH v4 10/21] NFS: Simplify struct nfs_cache_array_entry Date: Sat, 7 Nov 2020 09:03:14 -0500 Message-ID: <20201107140325.281678-11-trondmy@kernel.org> (raw) In-Reply-To: <20201107140325.281678-10-trondmy@kernel.org> From: Trond Myklebust <trond.myklebust@hammerspace.com> We don't need to store a hash, so replace struct qstr with a simple const char pointer and length. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> --- fs/nfs/dir.c | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index b9001123ec84..be0e2891fecc 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -133,7 +133,8 @@ nfs_closedir(struct inode *inode, struct file *filp) struct nfs_cache_array_entry { u64 cookie; u64 ino; - struct qstr string; + const char *name; + unsigned int name_len; unsigned char d_type; }; @@ -192,7 +193,7 @@ void nfs_readdir_clear_array(struct page *page) array = kmap_atomic(page); for (i = 0; i < array->size; i++) - kfree(array->array[i].string.name); + kfree(array->array[i].name); nfs_readdir_array_init(array); kunmap_atomic(array); } @@ -213,20 +214,17 @@ static bool nfs_readdir_array_is_full(struct nfs_cache_array *array) * when called by nfs_readdir_add_to_array, the strings will be freed in * nfs_clear_readdir_array() */ -static -int nfs_readdir_make_qstr(struct qstr *string, const char *name, unsigned int len) +static const char *nfs_readdir_copy_name(const char *name, unsigned int len) { - string->len = len; - string->name = kmemdup_nul(name, len, GFP_KERNEL); - if (string->name == NULL) - return -ENOMEM; + const char *ret = kmemdup_nul(name, len, GFP_KERNEL); + /* * Avoid a kmemleak false positive. The pointer to the name is stored * in a page cache page which kmemleak does not scan. */ - kmemleak_not_leak(string->name); - string->hash = full_name_hash(NULL, name, len); - return 0; + if (ret != NULL) + kmemleak_not_leak(ret); + return ret; } /* @@ -249,27 +247,34 @@ static int nfs_readdir_array_can_expand(struct nfs_cache_array *array) static int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page) { - struct nfs_cache_array *array = kmap(page); + struct nfs_cache_array *array; struct nfs_cache_array_entry *cache_entry; + const char *name; int ret; + name = nfs_readdir_copy_name(entry->name, entry->len); + if (!name) + return -ENOMEM; + + array = kmap_atomic(page); ret = nfs_readdir_array_can_expand(array); - if (ret) + if (ret) { + kfree(name); goto out; + } cache_entry = &array->array[array->size]; cache_entry->cookie = entry->prev_cookie; cache_entry->ino = entry->ino; cache_entry->d_type = entry->d_type; - ret = nfs_readdir_make_qstr(&cache_entry->string, entry->name, entry->len); - if (ret) - goto out; + cache_entry->name_len = entry->len; + cache_entry->name = name; array->last_cookie = entry->cookie; array->size++; if (entry->eof != 0) nfs_readdir_array_set_eof(array); out: - kunmap(page); + kunmap_atomic(array); return ret; } @@ -413,9 +418,8 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des if (printk_ratelimit()) { pr_notice("NFS: directory %pD2 contains a readdir loop." "Please contact your server vendor. " - "The file: %.*s has duplicate cookie %llu\n", - desc->file, array->array[i].string.len, - array->array[i].string.name, desc->dir_cookie); + "The file: %s has duplicate cookie %llu\n", + desc->file, array->array[i].name, desc->dir_cookie); } status = -ELOOP; goto out; @@ -888,7 +892,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc) struct nfs_cache_array_entry *ent; ent = &array->array[i]; - if (!dir_emit(desc->ctx, ent->string.name, ent->string.len, + if (!dir_emit(desc->ctx, ent->name, ent->name_len, nfs_compat_user_ino64(ent->ino), ent->d_type)) { desc->eof = true; break; -- 2.28.0
next prev parent reply index Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-11-07 14:03 [PATCH v4 00/21] Readdir enhancements trondmy 2020-11-07 14:03 ` [PATCH v4 01/21] NFS: Remove unnecessary inode locking in nfs_llseek_dir() trondmy 2020-11-07 14:03 ` [PATCH v4 02/21] NFS: Remove unnecessary inode lock in nfs_fsync_dir() trondmy 2020-11-07 14:03 ` [PATCH v4 03/21] NFS: Ensure contents of struct nfs_open_dir_context are consistent trondmy 2020-11-07 14:03 ` [PATCH v4 04/21] NFS: Clean up readdir struct nfs_cache_array trondmy 2020-11-07 14:03 ` [PATCH v4 05/21] NFS: Clean up nfs_readdir_page_filler() trondmy 2020-11-07 14:03 ` [PATCH v4 06/21] NFS: Clean up directory array handling trondmy 2020-11-07 14:03 ` [PATCH v4 07/21] NFS: Don't discard readdir results trondmy 2020-11-07 14:03 ` [PATCH v4 08/21] NFS: Remove unnecessary kmap in nfs_readdir_xdr_to_array() trondmy 2020-11-07 14:03 ` [PATCH v4 09/21] NFS: Replace kmap() with kmap_atomic() in nfs_readdir_search_array() trondmy 2020-11-07 14:03 ` trondmy [this message] 2020-11-07 14:03 ` [PATCH v4 11/21] NFS: Support larger readdir buffers trondmy 2020-11-07 14:03 ` [PATCH v4 12/21] NFS: More readdir cleanups trondmy 2020-11-07 14:03 ` [PATCH v4 13/21] NFS: nfs_do_filldir() does not return a value trondmy 2020-11-07 14:03 ` [PATCH v4 14/21] NFS: Reduce readdir stack usage trondmy 2020-11-07 14:03 ` [PATCH v4 15/21] NFS: Cleanup to remove nfs_readdir_descriptor_t typedef trondmy 2020-11-07 14:03 ` [PATCH v4 16/21] NFS: Allow the NFS generic code to pass in a verifier to readdir trondmy 2020-11-07 14:03 ` [PATCH v4 17/21] NFS: Handle NFS4ERR_NOT_SAME and NFSERR_BADCOOKIE from readdir calls trondmy 2020-11-07 14:03 ` [PATCH v4 18/21] NFS: Improve handling of directory verifiers trondmy 2020-11-07 14:03 ` [PATCH v4 19/21] NFS: Optimisations for monotonically increasing readdir cookies trondmy 2020-11-07 14:03 ` [PATCH v4 20/21] NFS: Reduce number of RPC calls when doing uncached readdir trondmy 2020-11-07 14:03 ` [PATCH v4 21/21] NFS: Do uncached readdir when we're seeking a cookie in an empty page cache trondmy 2020-11-09 21:41 ` Benjamin Coddington 2020-11-09 21:46 ` Trond Myklebust 2020-11-11 16:43 ` Benjamin Coddington 2020-11-11 17:34 ` Trond Myklebust 2020-11-11 19:53 ` Benjamin Coddington 2020-11-11 20:11 ` Trond Myklebust 2020-11-10 14:48 ` David Wysochanski 2020-11-10 20:55 ` Trond Myklebust 2020-11-09 20:59 ` [PATCH v4 20/21] NFS: Reduce number of RPC calls when doing uncached readdir Benjamin Coddington 2020-11-09 13:15 ` [PATCH v4 00/21] Readdir enhancements David Wysochanski
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20201107140325.281678-11-trondmy@kernel.org \ --to=trondmy@kernel.org \ --cc=linux-nfs@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Linux-NFS Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-nfs/0 linux-nfs/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-nfs linux-nfs/ https://lore.kernel.org/linux-nfs \ linux-nfs@vger.kernel.org public-inbox-index linux-nfs Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-nfs AGPL code for this site: git clone https://public-inbox.org/public-inbox.git