summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2010-10-22 21:38:56 +0000
committerrmacklem <rmacklem@FreeBSD.org>2010-10-22 21:38:56 +0000
commitb7d601dc3a6d6bf34e079e05898cf7ec033754f4 (patch)
tree6bcf706fc494c38580fb595e7079999ee9c1e992 /sys/fs
parent122f9e5a0728bd17ab2583baf26e86f188d1ee2b (diff)
downloadFreeBSD-src-b7d601dc3a6d6bf34e079e05898cf7ec033754f4.zip
FreeBSD-src-b7d601dc3a6d6bf34e079e05898cf7ec033754f4.tar.gz
Modify the file handle hash function in the experimental NFS
server so that it will work better for non-UFS file systems. The new function simply sums the bytes of the fh_fid field of fhandle_t. MFC after: 10 days
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/nfs/nfs_var.h1
-rw-r--r--sys/fs/nfs/nfsdport.h2
-rw-r--r--sys/fs/nfsserver/nfs_nfsdport.c15
3 files changed, 17 insertions, 1 deletions
diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h
index d46983f..03b7a0a 100644
--- a/sys/fs/nfs/nfs_var.h
+++ b/sys/fs/nfs/nfs_var.h
@@ -576,6 +576,7 @@ void nfsvno_unlockvfs(mount_t);
int nfsvno_lockvfs(mount_t);
int nfsrv_v4rootexport(void *, struct ucred *, NFSPROC_T *);
int nfsvno_testexp(struct nfsrv_descript *, struct nfsexstuff *);
+int nfsrv_hashfh(fhandle_t *);
/* nfs_commonkrpc.c */
int newnfs_nmcancelreqs(struct nfsmount *);
diff --git a/sys/fs/nfs/nfsdport.h b/sys/fs/nfs/nfsdport.h
index fdba916..4888866 100644
--- a/sys/fs/nfs/nfsdport.h
+++ b/sys/fs/nfs/nfsdport.h
@@ -73,7 +73,7 @@ struct nfsexstuff {
bcmp(&(f1)->fh_fid, &(f2)->fh_fid, sizeof(struct fid)) == 0)
#define NFSLOCKHASH(f) \
- (&nfslockhash[(*((u_int32_t *)((f)->fh_fid.fid_data))) % NFSLOCKHASHSIZE])
+ (&nfslockhash[nfsrv_hashfh(f) % NFSLOCKHASHSIZE])
#define NFSFPVNODE(f) ((struct vnode *)((f)->f_data))
#define NFSFPCRED(f) ((f)->f_cred)
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index 0d35d1d..b49442f 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -3087,6 +3087,21 @@ nfsvno_testexp(struct nfsrv_descript *nd, struct nfsexstuff *exp)
return (1);
}
+/*
+ * Calculate a hash value for the fid in a file handle.
+ */
+int
+nfsrv_hashfh(fhandle_t *fhp)
+{
+ int hashval = 0, i;
+ uint8_t *cp;
+
+ cp = (uint8_t *)&fhp->fh_fid;
+ for (i = 0; i < sizeof(struct fid); i++)
+ hashval += *cp++;
+ return (hashval);
+}
+
extern int (*nfsd_call_nfsd)(struct thread *, struct nfssvc_args *);
/*
OpenPOWER on IntegriCloud