[Midnightbsd-cvs] src [8298] trunk/sys/boot: zfs boot: export boot/primary pool and vdev guid all teh way to kenv

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sat Sep 17 18:18:20 EDT 2016


Revision: 8298
          http://svnweb.midnightbsd.org/src/?rev=8298
Author:   laffer1
Date:     2016-09-17 18:18:20 -0400 (Sat, 17 Sep 2016)
Log Message:
-----------
zfs boot: export boot/primary pool and vdev guid all teh way to kenv

Modified Paths:
--------------
    trunk/sys/boot/i386/loader/main.c
    trunk/sys/boot/i386/zfsboot/zfsboot.c
    trunk/sys/boot/zfs/libzfs.h
    trunk/sys/boot/zfs/zfsimpl.c

Modified: trunk/sys/boot/i386/loader/main.c
===================================================================
--- trunk/sys/boot/i386/loader/main.c	2016-09-17 22:17:56 UTC (rev 8297)
+++ trunk/sys/boot/i386/loader/main.c	2016-09-17 22:18:20 UTC (rev 8298)
@@ -209,6 +209,7 @@
 {
     struct i386_devdesc		new_currdev;
 #ifdef LOADER_ZFS_SUPPORT
+    char			buf[20];
     struct zfs_boot_args	*zargs;
 #endif
     int				biosdev = -1;
@@ -239,10 +240,17 @@
 	if ((kargs->bootflags & KARGS_FLAGS_EXTARG) != 0)
 	    zargs = (struct zfs_boot_args *)(kargs + 1);
 
-	if (zargs != NULL && zargs->size >= sizeof(*zargs)) {
+	if (zargs != NULL &&
+	    zargs->size >= offsetof(struct zfs_boot_args, primary_pool)) {
 	    /* sufficient data is provided */
 	    new_currdev.d_kind.zfs.pool_guid = zargs->pool;
 	    new_currdev.d_kind.zfs.root_guid = zargs->root;
+	    if (zargs->size >= sizeof(*zargs) && zargs->primary_vdev != 0) {
+		sprintf(buf, "%llu", zargs->primary_pool);
+		setenv("vfs.zfs.boot.primary_pool", buf, 1);
+		sprintf(buf, "%llu", zargs->primary_vdev);
+		setenv("vfs.zfs.boot.primary_vdev", buf, 1);
+	    }
 	} else {
 	    /* old style zfsboot block */
 	    new_currdev.d_kind.zfs.pool_guid = kargs->zfspool;

Modified: trunk/sys/boot/i386/zfsboot/zfsboot.c
===================================================================
--- trunk/sys/boot/i386/zfsboot/zfsboot.c	2016-09-17 22:17:56 UTC (rev 8297)
+++ trunk/sys/boot/i386/zfsboot/zfsboot.c	2016-09-17 22:18:20 UTC (rev 8298)
@@ -176,6 +176,8 @@
  * Current ZFS pool
  */
 static spa_t *spa;
+static spa_t *primary_spa;
+static vdev_t *primary_vdev;
 
 /*
  * A wrapper for dskread that doesn't have to worry about whether the
@@ -526,7 +528,7 @@
      * first pool we found, if any.
      */
     if (!spa) {
-	spa = STAILQ_FIRST(&zfs_pools);
+	spa = spa_get_primary();
 	if (!spa) {
 	    printf("%s: No ZFS pools located, can't boot\n", BOOTPROG);
 	    for (;;)
@@ -534,6 +536,9 @@
 	}
     }
 
+    primary_spa = spa;
+    primary_vdev = spa_get_primary_vdev(spa);
+
     if (zfs_spa_init(spa) != 0 || zfs_mount(spa, 0, &zfsmount) != 0) {
 	printf("%s: failed to mount default pool %s\n",
 	    BOOTPROG, spa->spa_name);
@@ -702,6 +707,11 @@
     zfsargs.size = sizeof(zfsargs);
     zfsargs.pool = zfsmount.spa->spa_guid;
     zfsargs.root = zfsmount.rootobj;
+    zfsargs.primary_pool = primary_spa->spa_guid;
+    if (primary_vdev != NULL)
+	zfsargs.primary_vdev = primary_vdev->v_guid;
+    else
+	printf("failed to detect primary vdev\n");
     __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),
 	   bootdev,
 	   KARGS_FLAGS_ZFS | KARGS_FLAGS_EXTARG,

Modified: trunk/sys/boot/zfs/libzfs.h
===================================================================
--- trunk/sys/boot/zfs/libzfs.h	2016-09-17 22:17:56 UTC (rev 8297)
+++ trunk/sys/boot/zfs/libzfs.h	2016-09-17 22:18:20 UTC (rev 8298)
@@ -53,6 +53,8 @@
     uint32_t		reserved;
     uint64_t		pool;
     uint64_t		root;
+    uint64_t		primary_pool;
+    uint64_t		primary_vdev;
 };
 
 int	zfs_parsedev(struct zfs_devdesc *dev, const char *devspec,

Modified: trunk/sys/boot/zfs/zfsimpl.c
===================================================================
--- trunk/sys/boot/zfs/zfsimpl.c	2016-09-17 22:17:56 UTC (rev 8297)
+++ trunk/sys/boot/zfs/zfsimpl.c	2016-09-17 22:18:20 UTC (rev 8298)
@@ -648,7 +648,35 @@
 	return (0);
 }
 
+#ifdef BOOT2
 static spa_t *
+spa_get_primary(void)
+{
+
+	return (STAILQ_FIRST(&zfs_pools));
+}
+
+static vdev_t *
+spa_get_primary_vdev(const spa_t *spa)
+{
+	vdev_t *vdev;
+	vdev_t *kid;
+
+	if (spa == NULL)
+		spa = spa_get_primary();
+	if (spa == NULL)
+		return (NULL);
+	vdev = STAILQ_FIRST(&spa->spa_vdevs);
+	if (vdev == NULL)
+		return (NULL);
+	for (kid = STAILQ_FIRST(&vdev->v_children); kid != NULL;
+	     kid = STAILQ_FIRST(&vdev->v_children))
+		vdev = kid;
+	return (vdev);
+}
+#endif
+
+static spa_t *
 spa_create(uint64_t guid)
 {
 	spa_t *spa;



More information about the Midnightbsd-cvs mailing list