cool. reads and tests well for me.

ok dlg@

> On 3 Dec 2014, at 13:49, Ted Unangst <t...@tedunangst.com> wrote:
> 
> Use now preferred SipHash24 functions. This also means we shouldn't
> need to hash in the value of the dirhash pointer itself, which confuses
> me every time I look at it.
> 
> Index: ufs/ufs_dirhash.c
> ===================================================================
> RCS file: /cvs/src/sys/ufs/ufs/ufs_dirhash.c,v
> retrieving revision 1.30
> diff -u -p -r1.30 ufs_dirhash.c
> --- ufs/ufs_dirhash.c 14 Sep 2014 14:17:27 -0000      1.30
> +++ ufs/ufs_dirhash.c 3 Dec 2014 03:47:22 -0000
> @@ -42,9 +42,10 @@ __FBSDID("$FreeBSD: src/sys/ufs/ufs/ufs_
> #include <sys/vnode.h>
> #include <sys/mount.h>
> #include <sys/sysctl.h>
> -#include <sys/hash.h>
> #include <sys/mutex.h>
> 
> +#include <crypto/siphash.h>
> +
> #include <ufs/ufs/quota.h>
> #include <ufs/ufs/inode.h>
> #include <ufs/ufs/dir.h>
> @@ -62,6 +63,7 @@ int ufs_dirhashmaxmem;
> int ufs_dirhashmem;
> int ufs_dirhashcheck;
> 
> +SIPHASH_KEY ufsdirhash_key;
> 
> int ufsdirhash_hash(struct dirhash *dh, char *name, int namelen);
> void ufsdirhash_adjfree(struct dirhash *dh, doff_t offset, int diff);
> @@ -857,17 +859,7 @@ ufsdirhash_checkblock(struct inode *ip, 
> int
> ufsdirhash_hash(struct dirhash *dh, char *name, int namelen)
> {
> -     u_int32_t hash;
> -
> -     /*
> -      * We hash the name and then some other bit of data that is
> -      * invariant over the dirhash's lifetime. Otherwise names
> -      * differing only in the last byte are placed close to one
> -      * another in the table, which is bad for linear probing.
> -      */
> -     hash = hash32_buf(name, namelen, HASHINIT);
> -     hash = hash32_buf(&dh, sizeof(dh), hash);
> -     return (hash % dh->dh_hlen);
> +     return SipHash24(&ufsdirhash_key, name, namelen) % dh->dh_hlen;
> }
> 
> /*
> @@ -1059,6 +1051,7 @@ ufsdirhash_init(void)
>       pool_init(&ufsdirhash_pool, DH_NBLKOFF * sizeof(doff_t), 0, 0, 0,
>           "dirhash", &pool_allocator_nointr);
>       mtx_init(&ufsdirhash_mtx, IPL_NONE);
> +     arc4random_buf(&ufsdirhash_key, sizeof(ufsdirhash_key));
>       TAILQ_INIT(&ufsdirhash_list);
> #if defined (__sparc__) && !defined (__sparc64__)
>       if (!CPU_ISSUN4OR4C)
> 

Reply via email to