Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Oct 2012 16:10:18 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r242242 - in stable/8/sys/boot: i386/loader i386/zfsboot zfs
Message-ID:  <201210281610.q9SGAIU5046853@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Sun Oct 28 16:10:18 2012
New Revision: 242242
URL: http://svn.freebsd.org/changeset/base/242242

Log:
  MFC r241293: zfs boot: export boot/primary pool and vdev guid all the
  way to kenv

Modified:
  stable/8/sys/boot/i386/loader/main.c
  stable/8/sys/boot/i386/zfsboot/zfsboot.c
  stable/8/sys/boot/zfs/libzfs.h
  stable/8/sys/boot/zfs/zfsimpl.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/boot/   (props changed)

Modified: stable/8/sys/boot/i386/loader/main.c
==============================================================================
--- stable/8/sys/boot/i386/loader/main.c	Sun Oct 28 16:10:03 2012	(r242241)
+++ stable/8/sys/boot/i386/loader/main.c	Sun Oct 28 16:10:18 2012	(r242242)
@@ -209,6 +209,7 @@ extract_currdev(void)
 {
     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 @@ extract_currdev(void)
 	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: stable/8/sys/boot/i386/zfsboot/zfsboot.c
==============================================================================
--- stable/8/sys/boot/i386/zfsboot/zfsboot.c	Sun Oct 28 16:10:03 2012	(r242241)
+++ stable/8/sys/boot/i386/zfsboot/zfsboot.c	Sun Oct 28 16:10:18 2012	(r242242)
@@ -176,6 +176,8 @@ zfs_read(spa_t *spa, const dnode_phys_t 
  * 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
@@ -521,7 +523,7 @@ main(void)
      * 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 (;;)
@@ -529,6 +531,9 @@ main(void)
 	}
     }
 
+    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);
@@ -697,6 +702,11 @@ load(void)
     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: stable/8/sys/boot/zfs/libzfs.h
==============================================================================
--- stable/8/sys/boot/zfs/libzfs.h	Sun Oct 28 16:10:03 2012	(r242241)
+++ stable/8/sys/boot/zfs/libzfs.h	Sun Oct 28 16:10:18 2012	(r242242)
@@ -53,6 +53,8 @@ struct zfs_boot_args
     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: stable/8/sys/boot/zfs/zfsimpl.c
==============================================================================
--- stable/8/sys/boot/zfs/zfsimpl.c	Sun Oct 28 16:10:03 2012	(r242241)
+++ stable/8/sys/boot/zfs/zfsimpl.c	Sun Oct 28 16:10:18 2012	(r242242)
@@ -648,6 +648,34 @@ spa_find_by_name(const char *name)
 	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)
 {



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