Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 07 Aug 2011 01:35:36 +0200
From:      Dimitry Andric <dim@FreeBSD.org>
To:        Test Rat <ttsestt@gmail.com>
Cc:        freebsd-current@freebsd.org
Subject:   Re: [clang] (gpt)zfsboot is broken: zfs_alloc()/zfs_free() mismatch
Message-ID:  <4E3DCFC8.7000802@FreeBSD.org>
In-Reply-To: <86vcucfnt3.fsf@gmail.com>
References:  <86zkjtwc8r.fsf@gmail.com> <B9C820F7-EAD7-4AB8-903A-06CEF17240CA@gmail.com> <86vcucfnt3.fsf@gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------020600000003040704020902
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

On 2011-08-05 07:08, Test Rat wrote:
> Pawel Worach<pawel.worach@gmail.com>  writes:
...
>> A workaround for the hang on boot and "error 1 lba X" failures is the
>> following patch, it would be interesting if it also makes the
>> zfs_alloc/free error go away too.
> After applying the patch zfsboot and gptzfsboot boot successfully.
> Tested both inside qemu and only gptzfsboot on a living system.

Hi,

Can you please try the following alternative patch, which should fix the
problem without disabling -mrtd?  E.g. revert the previous patch, then
apply this one.

Of course, if any other posters in this thread that had problems with
gptzfsboot (or 'plain' zfsboot) can also confirm this patch works, it
would be nice. :)

--------------020600000003040704020902
Content-Type: text/plain;
 name="fix-gptzfsboot-clang-failure-2.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="fix-gptzfsboot-clang-failure-2.diff"

Index: sys/boot/zfs/zfsimpl.c
===================================================================
--- sys/boot/zfs/zfsimpl.c	(revision 224560)
+++ sys/boot/zfs/zfsimpl.c	(working copy)
@@ -949,10 +949,10 @@ vdev_probe(vdev_phys_read_t *read, void *read_priv
 		if (up->ub_txg < spa->spa_txg)
 			continue;
 		if (up->ub_txg > spa->spa_uberblock.ub_txg) {
-			spa->spa_uberblock = *up;
+			memcpy(&spa->spa_uberblock, up, sizeof(*up));
 		} else if (up->ub_txg == spa->spa_uberblock.ub_txg) {
 			if (up->ub_timestamp > spa->spa_uberblock.ub_timestamp)
-				spa->spa_uberblock = *up;
+				memcpy(&spa->spa_uberblock, up, sizeof(*up));
 		}
 	}
 	zfs_free(upbuf, VDEV_UBERBLOCK_SIZE(vdev));
@@ -1703,6 +1703,6 @@ zfs_lookup(spa_t *spa, const char *upath, dnode_ph
 		}
 	}
 
-	*dnode = dn;
+	memcpy(dnode, &dn, sizeof(dn));
 	return (0);
 }

--------------020600000003040704020902--



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