Modify the experimental NFSv4 server's file handle hash function

to use the generic hash32_buf() function. Although adding the
bytes seemed sufficient for UFS and ZFS, since most of the bytes
are the same for file handles on the same volume, this might not
be sufficient for other file systems. Use of a generic function
also seems preferable to one specific to NFSv4.

Suggested by:	gleb.kurtsou at gmail.com
MFC after:	10 days
This commit is contained in:
Rick Macklem 2010-10-23 22:28:29 +00:00
parent ca4f898699
commit 377c50f67a
2 changed files with 5 additions and 7 deletions

View File

@ -576,7 +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 *);
uint32_t nfsrv_hashfh(fhandle_t *);
/* nfs_commonkrpc.c */
int newnfs_nmcancelreqs(struct nfsmount *);

View File

@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
*/
#include <fs/nfs/nfsport.h>
#include <sys/hash.h>
#include <sys/sysctl.h>
#include <nlm/nlm_prot.h>
#include <nlm/nlm.h>
@ -3090,15 +3091,12 @@ nfsvno_testexp(struct nfsrv_descript *nd, struct nfsexstuff *exp)
/*
* Calculate a hash value for the fid in a file handle.
*/
int
uint32_t
nfsrv_hashfh(fhandle_t *fhp)
{
int hashval = 0, i;
uint8_t *cp;
uint32_t hashval;
cp = (uint8_t *)&fhp->fh_fid;
for (i = 0; i < sizeof(struct fid); i++)
hashval += *cp++;
hashval = hash32_buf(&fhp->fh_fid, sizeof(struct fid), 0);
return (hashval);
}