Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Oct 2010 21:38:56 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r214224 - in head/sys/fs: nfs nfsserver
Message-ID:  <201010222138.o9MLcuLY066850@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Fri Oct 22 21:38:56 2010
New Revision: 214224
URL: http://svn.freebsd.org/changeset/base/214224

Log:
  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

Modified:
  head/sys/fs/nfs/nfs_var.h
  head/sys/fs/nfs/nfsdport.h
  head/sys/fs/nfsserver/nfs_nfsdport.c

Modified: head/sys/fs/nfs/nfs_var.h
==============================================================================
--- head/sys/fs/nfs/nfs_var.h	Fri Oct 22 20:46:08 2010	(r214223)
+++ head/sys/fs/nfs/nfs_var.h	Fri Oct 22 21:38:56 2010	(r214224)
@@ -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 *);

Modified: head/sys/fs/nfs/nfsdport.h
==============================================================================
--- head/sys/fs/nfs/nfsdport.h	Fri Oct 22 20:46:08 2010	(r214223)
+++ head/sys/fs/nfs/nfsdport.h	Fri Oct 22 21:38:56 2010	(r214224)
@@ -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)

Modified: head/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdport.c	Fri Oct 22 20:46:08 2010	(r214223)
+++ head/sys/fs/nfsserver/nfs_nfsdport.c	Fri Oct 22 21:38:56 2010	(r214224)
@@ -3087,6 +3087,21 @@ nfsvno_testexp(struct nfsrv_descript *nd
 	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 *);
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010222138.o9MLcuLY066850>