Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Jul 2012 11:11:06 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r238904 - in stable/9: . sys/boot/sparc64/loader
Message-ID:  <201207301111.q6UBB6Vo086260@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Mon Jul 30 11:11:05 2012
New Revision: 238904
URL: http://svn.freebsd.org/changeset/base/238904

Log:
  Pull the tier-2 card and change the sparc64 ZFS loader to no longer probe
  all diskN aliases for providers (which more or less corresponds to how the
  x86 version behaves) but instead probe only those listed in the boot-device
  OFW environment variable. This has the following advantages:
  - avoids otherwise unavoidable OFW warnings about failures to open disks
    for which aliases exist but no actual hardware is connected
  - avoids issues due to different diskN naming schemes
  - aligns us with Solaris
  
  Approved by:	re (kib)

Modified:
  stable/9/UPDATING   (contents, props changed)
  stable/9/sys/boot/sparc64/loader/main.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/amd64/include/xen/   (props changed)
  stable/9/sys/boot/   (props changed)
  stable/9/sys/boot/i386/efi/   (props changed)
  stable/9/sys/boot/ia64/efi/   (props changed)
  stable/9/sys/boot/ia64/ski/   (props changed)
  stable/9/sys/boot/powerpc/boot1.chrp/   (props changed)
  stable/9/sys/boot/powerpc/ofw/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)
  stable/9/sys/conf/   (props changed)
  stable/9/sys/contrib/dev/acpica/   (props changed)
  stable/9/sys/contrib/octeon-sdk/   (props changed)
  stable/9/sys/contrib/pf/   (props changed)
  stable/9/sys/contrib/x86emu/   (props changed)
  stable/9/sys/dev/   (props changed)
  stable/9/sys/dev/e1000/   (props changed)
  stable/9/sys/dev/isp/   (props changed)
  stable/9/sys/dev/ixgbe/   (props changed)
  stable/9/sys/fs/   (props changed)
  stable/9/sys/fs/ntfs/   (props changed)
  stable/9/sys/modules/   (props changed)

Modified: stable/9/UPDATING
==============================================================================
--- stable/9/UPDATING	Mon Jul 30 11:02:22 2012	(r238903)
+++ stable/9/UPDATING	Mon Jul 30 11:11:05 2012	(r238904)
@@ -9,6 +9,11 @@ handbook.
 Items affecting the ports and packages system can be found in
 /usr/ports/UPDATING.  Please read that file before running portupgrade.
 
+20120727:
+	The sparc64 ZFS loader has been changed to no longer try to auto-
+	detect ZFS providers based on diskN aliases but now requires these
+	to be explicitly listed in the OFW boot-device environment variable.
+
 20120422:
 	Now unix domain sockets behave "as expected" on	nullfs(5). Previously
 	nullfs(5) did not pass through all behaviours to the underlying layer,

Modified: stable/9/sys/boot/sparc64/loader/main.c
==============================================================================
--- stable/9/sys/boot/sparc64/loader/main.c	Mon Jul 30 11:02:22 2012	(r238903)
+++ stable/9/sys/boot/sparc64/loader/main.c	Mon Jul 30 11:11:05 2012	(r238904)
@@ -7,7 +7,7 @@
  * unchanged, you can do what ever you want with this file.
  */
 /*-
- * Copyright (c) 2008 Marius Strobl <marius@FreeBSD.org>
+ * Copyright (c) 2008 - 2012 Marius Strobl <marius@FreeBSD.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -75,8 +75,6 @@ __FBSDID("$FreeBSD$");
 #include "libofw.h"
 #include "dev_net.h"
 
-#define	MAXDEV	31
-
 extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[];
 
 enum {
@@ -735,18 +733,52 @@ sparc64_zfs_probe(void)
 {
 	struct vtoc8 vtoc;
 	struct zfs_devdesc zfs_currdev;
-	char devname[32];
+	char alias[64], devname[sizeof(alias) + sizeof(":x") - 1];
+	char type[sizeof("device_type")];
+	char *bdev, *dev, *odev;
 	uint64_t guid;
-	int fd, part, unit;
+	int fd, len, part;
+	phandle_t aliases, options;
 
 	/* Get the GUID of the ZFS pool on the boot device. */
 	guid = 0;
 	zfs_probe_dev(bootpath, &guid);
 
-	for (unit = 0; unit < MAXDEV; unit++) {
+	/*
+	 * Get the GUIDs of the ZFS pools on any additional disks listed in
+	 * the boot-device environment variable.
+	 */
+	if ((aliases = OF_finddevice("/aliases")) == -1)
+		goto out;
+	options = OF_finddevice("/options");
+	len = OF_getproplen(options, "boot-device");
+	if (len <= 0)
+		goto out;
+	bdev = odev = malloc(len + 1);
+	if (bdev == NULL)
+		goto out;
+	if (OF_getprop(options, "boot-device", bdev, len) <= 0)
+		goto out;
+	bdev[len] = '\0';
+	while ((dev = strsep(&bdev, " ")) != NULL) {
+		if (*dev == '\0')
+			continue;
+		strcpy(alias, dev);
+		(void)OF_getprop(aliases, dev, alias, sizeof(alias));
+		/*
+		 * Don't probe the boot disk twice.  Note that bootpath
+		 * includes the partition specifier.
+		 */
+		if (strncmp(alias, bootpath, strlen(alias)) == 0)
+			continue;
+		if (OF_getprop(OF_finddevice(alias), "device_type", type,
+		    sizeof(type)) == -1)
+			continue;
+		if (strcmp(type, "block") != 0)
+			continue;
+
 		/* Find freebsd-zfs slices in the VTOC. */
-		sprintf(devname, "disk%d:", unit);
-		fd = open(devname, O_RDONLY);
+		fd = open(alias, O_RDONLY);
 		if (fd == -1)
 			continue;
 		lseek(fd, 0, SEEK_SET);
@@ -760,12 +792,14 @@ sparc64_zfs_probe(void)
 			if (part == 2 || vtoc.part[part].tag !=
 			    VTOC_TAG_FREEBSD_ZFS)
 				continue;
-			sprintf(devname, "disk%d:%c", unit, part + 'a');
+			(void)sprintf(devname, "%s:%c", alias, part + 'a');
 			if (zfs_probe_dev(devname, NULL) == ENXIO)
 				break;
 		}
 	}
+	free(odev);
 
+ out:
 	if (guid != 0) {
 		zfs_currdev.pool_guid = guid;
 		zfs_currdev.root_guid = 0;



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