git: 14c5cf3a16c9 - main - makefs/zfs: Avoid generating a GUID of zero

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Fri, 26 May 2023 20:06:54 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=14c5cf3a16c9c21b49e0ec0a109467d81e5a47ff

commit 14c5cf3a16c9c21b49e0ec0a109467d81e5a47ff
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2023-05-26 19:14:00 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2023-05-26 19:38:08 +0000

    makefs/zfs: Avoid generating a GUID of zero
---
 usr.sbin/makefs/zfs.c     | 20 ++++++++++++++++++--
 usr.sbin/makefs/zfs/dsl.c |  2 +-
 usr.sbin/makefs/zfs/zfs.h |  1 +
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/usr.sbin/makefs/zfs.c b/usr.sbin/makefs/zfs.c
index 7c2805ae5bbb..4d45926fb33f 100644
--- a/usr.sbin/makefs/zfs.c
+++ b/usr.sbin/makefs/zfs.c
@@ -274,6 +274,22 @@ nvlist_copy(const nvlist_t *nvl, char *buf, size_t sz)
 	memcpy(buf + sizeof(nvl->nv_header), nvl->nv_data, nvl->nv_size);
 }
 
+/*
+ * Avoid returning a GUID of 0, just to avoid the possibility that something
+ * will interpret that as meaning that the GUID is uninitialized.
+ */
+uint64_t
+randomguid(void)
+{
+	uint64_t ret;
+
+	do {
+		ret = ((uint64_t)random() << 32) | random();
+	} while (ret == 0);
+
+	return (ret);
+}
+
 static nvlist_t *
 pool_config_nvcreate(zfs_opt_t *zfs)
 {
@@ -529,8 +545,8 @@ pool_init(zfs_opt_t *zfs)
 {
 	uint64_t dnid;
 
-	zfs->poolguid = ((uint64_t)random() << 32) | random();
-	zfs->vdevguid = ((uint64_t)random() << 32) | random();
+	zfs->poolguid = randomguid();
+	zfs->vdevguid = randomguid();
 
 	zfs->mos = objset_alloc(zfs, DMU_OST_META);
 
diff --git a/usr.sbin/makefs/zfs/dsl.c b/usr.sbin/makefs/zfs/dsl.c
index f6b7dc0ede17..a9ab93a90c38 100644
--- a/usr.sbin/makefs/zfs/dsl.c
+++ b/usr.sbin/makefs/zfs/dsl.c
@@ -602,7 +602,7 @@ dsl_dataset_alloc(zfs_opt_t *zfs, zfs_dsl_dir_t *dir)
 	ds->phys->ds_creation_txg = TXG - 1;
 	if (ds != zfs->snapds)
 		ds->phys->ds_prev_snap_txg = TXG - 1;
-	ds->phys->ds_guid = ((uint64_t)random() << 32) | random();
+	ds->phys->ds_guid = randomguid();
 	ds->dir = dir;
 
 	return (ds);
diff --git a/usr.sbin/makefs/zfs/zfs.h b/usr.sbin/makefs/zfs/zfs.h
index b585955f7a1d..193ca1248d89 100644
--- a/usr.sbin/makefs/zfs/zfs.h
+++ b/usr.sbin/makefs/zfs/zfs.h
@@ -168,5 +168,6 @@ struct dnode_cursor *dnode_cursor_init(zfs_opt_t *, zfs_objset_t *,
     dnode_phys_t *, off_t, off_t);
 blkptr_t *dnode_cursor_next(zfs_opt_t *, struct dnode_cursor *, off_t);
 void dnode_cursor_finish(zfs_opt_t *, struct dnode_cursor *);
+uint64_t randomguid(void);
 
 #endif /* !_MAKEFS_ZFS_H_ */