Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Aug 2011 09:51:57 -0400 (EDT)
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        Benjamin Kaduk <kaduk@MIT.EDU>
Cc:        current@FreeBSD.org
Subject:   Re: fsid change of ZFS?
Message-ID:  <2096772200.330408.1314280317504.JavaMail.root@erie.cs.uoguelph.ca>
In-Reply-To: <alpine.GSO.1.10.1108241711320.7526@multics.mit.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
Benjamin Kaduk wrote:
> On Wed, 24 Aug 2011, Rick Macklem wrote:
> 
> > "afs"
> 
> The current OpenAFS codebase uses the all-caps "AFS". Judging by the
> omitted text, perhaps this should change. (We also don't use VFS_SET
> to
> set it, which I filed a bug about.)
> 
> >
> > and here is my current rendition of the patch. (I took Gleb's
> > suggestion
> > and switched to fnv_32_str(). I'll leave it that way unless there is
> > a
> > collision after adding any names people post to the above list.)
> >
> > It sounds like people have agreed that this is a reasonable
> > solution.
> > If hrs@ can confirm that testing shows it fixes the original problem
> > (the ZFS file handles don't change when it's loaded at different
> > times),
> > I'll pass it along to re@.
> >
> > Thanks for the helpful suggestions, rick
> >
> > --- kern/vfs_init.c.sav 2011-06-11 18:58:33.000000000 -0400
> > +++ kern/vfs_init.c 2011-08-24 16:15:24.000000000 -0400
> > @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD: head/sys/kern/vfs_in
> >
> > #include <sys/param.h>
> > #include <sys/systm.h>
> > +#include <sys/fnv_hash.h>
> > #include <sys/kernel.h>
> > #include <sys/linker.h>
> > #include <sys/mount.h>
> > @@ -138,6 +139,8 @@ vfs_register(struct vfsconf *vfc)
> > 	struct sysctl_oid *oidp;
> > 	struct vfsops *vfsops;
> > 	static int once;
> > + struct vfsconf *tvfc;
> > + uint32_t hashval;
> >
> > 	if (!once) {
> > 		vattr_null(&va_null);
> > @@ -152,7 +155,26 @@ vfs_register(struct vfsconf *vfc)
> > 	if (vfs_byname(vfc->vfc_name) != NULL)
> > 		return EEXIST;
> >
> > - vfc->vfc_typenum = maxvfsconf++;
> > + /*
> > + * Calculate a hash on vfc_name to use for vfc_typenum. Unless
> > + * a collision occurs, it is limited to 8bits since that is
> > + * what ZFS uses from vfc_typenum and that also limits how sparsely
> > + * distributed vfc_typenum becomes.
> > + */
> > + hashval = fnv_32_str(vfc->vfc_name, FNV1_32_INIT);
> > + hashval &= 0xff;
> > + do {
> > + /* Look for and fix any collision. */
> > + TAILQ_FOREACH(tvfc, &vfsconf, vfc_list) {
> > + if (hashval == tvfc->vfc_typenum) {
> > + hashval++; /* Can exceed 8bits, if needed. */
> 
> If we're confident that we won't ever fully fill the hash table, I
> would
> think that this should wrap around back to zero (or one?) instead of
> overflowing.
> 
I did it that way so that it could overflow for the highly unlikely case
of more than 255 file system types.

I suppose I should scan for an unused value 1<->255 and only allow it to
go past 255 if all of them are used.

I'll post yet another patch soon, rick

> Do we need to care about something attempting to add the same vfc_name
> twice? This code will happily add a second entry at the next available
> index.
> 
> > + break;
> > + }
> > + }
> > + } while (tvfc != NULL);
> > + vfc->vfc_typenum = hashval;
> > + if (vfc->vfc_typenum >= maxvfsconf)
> > + maxvfsconf = vfc->vfc_typenum + 1;
> 
> I guess we're holding off on killing maxvfsconf until after 9.0 is
> out?
> 
> -Ben
> 
> > 	TAILQ_INSERT_TAIL(&vfsconf, vfc, vfc_list);
> >
> > 	/*
> >
> >
> >
> _______________________________________________
> freebsd-current@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to
> "freebsd-current-unsubscribe@freebsd.org"



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