Commit c4c649ab authored by Chuck Lever's avatar Chuck Lever

NFSD: Convert filecache to rhltable

While we were converting the nfs4_file hashtable to use the kernel's
resizable hashtable data structure, Neil Brown observed that the
list variant (rhltable) would be better for managing nfsd_file items
as well. The nfsd_file hash table will contain multiple entries for
the same inode -- these should be kept together on a list. And, it
could be possible for exotic or malicious client behavior to cause
the hash table to resize itself on every insertion.

A nice simplification is that rhltable_lookup() can return a list
that contains only nfsd_file items that match a given inode, which
enables us to eliminate specialized hash table helper functions and
use the default functions provided by the rhashtable implementation).

Since we are now storing nfsd_file items for the same inode on a
single list, that effectively reduces the number of hash entries
that have to be tracked in the hash table. The mininum bucket count
is therefore lowered.

Light testing with fstests generic/531 show no regressions.
Suggested-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent dcb779fc
This diff is collapsed.
...@@ -29,9 +29,8 @@ struct nfsd_file_mark { ...@@ -29,9 +29,8 @@ struct nfsd_file_mark {
* never be dereferenced, only used for comparison. * never be dereferenced, only used for comparison.
*/ */
struct nfsd_file { struct nfsd_file {
struct rhash_head nf_rhash; struct rhlist_head nf_rlist;
struct list_head nf_lru; void *nf_inode;
struct rcu_head nf_rcu;
struct file *nf_file; struct file *nf_file;
const struct cred *nf_cred; const struct cred *nf_cred;
struct net *nf_net; struct net *nf_net;
...@@ -40,10 +39,12 @@ struct nfsd_file { ...@@ -40,10 +39,12 @@ struct nfsd_file {
#define NFSD_FILE_REFERENCED (2) #define NFSD_FILE_REFERENCED (2)
#define NFSD_FILE_GC (3) #define NFSD_FILE_GC (3)
unsigned long nf_flags; unsigned long nf_flags;
struct inode *nf_inode; /* don't deref */
refcount_t nf_ref; refcount_t nf_ref;
unsigned char nf_may; unsigned char nf_may;
struct nfsd_file_mark *nf_mark; struct nfsd_file_mark *nf_mark;
struct list_head nf_lru;
struct rcu_head nf_rcu;
ktime_t nf_birthtime; ktime_t nf_birthtime;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment