Hi.
I just noticed that we have a bug fix in FreeBSD that I never reported
back. The thing is that ZFS creates dnode cache zone:
dnode_cache = kmem_cache_create("dnode_t",
sizeof (dnode_t),
0, dnode_cons, dnode_dest, NULL, NULL, NULL, 0);
And declares dnode_cons() as constructor callback. But in the code we
can find that dnode_cons() is called directly for the second time after
allocation:
dnode_t *dn = kmem_cache_alloc(dnode_cache, KM_SLEEP);
(void) dnode_cons(dn, NULL, 0); /* XXX */
This way we initialize everything in dnode_cons() twice, which might not
be critial on OpenSolaris, but it is critical on FreeBSD. And it is a
waste of time for both systems.
This simple patch works on FreeBSD:
--- dnode.c.orig 2009-09-05 14:01:09.971645686 +0200
+++ dnode.c 2009-09-05 14:01:28.208648713 +0200
@@ -276,7 +276,6 @@
uint64_t object)
{
dnode_t *dn = kmem_cache_alloc(dnode_cache, KM_SLEEP);
- (void) dnode_cons(dn, NULL, 0); /* XXX */
dn->dn_objset = os;
dn->dn_object = object;
--
Pawel Jakub Dawidek http://www.wheel.pl
pjd at FreeBSD.org http://www.FreeBSD.org
FreeBSD committer Am I Evil? Yes, I Am!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
URL:
<http://mail.opensolaris.org/pipermail/zfs-code/attachments/20090905/48510214/attachment.bin>