summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2012-06-04 20:56:40 +0000
committermarius <marius@FreeBSD.org>2012-06-04 20:56:40 +0000
commit569112bb5fd7beb1c4786c4e8ab5d98339b64ca6 (patch)
tree1b4b94d96db16c83ee5416d48db3327f9f1a9e9d
parent6047aaa48083e7ca6673cc6b03ef184ebed6650b (diff)
downloadFreeBSD-src-569112bb5fd7beb1c4786c4e8ab5d98339b64ca6.zip
FreeBSD-src-569112bb5fd7beb1c4786c4e8ab5d98339b64ca6.tar.gz
The loaddev environment variable is not modifiable once set, so it is not
update for ZFS. It seems that this does not really affect anything except the help command. Nevertheless, rearrange things so loaddev is set only once in all cases in order to get it right. Pointed out by: avg MFC after: r235364
-rw-r--r--sys/boot/sparc64/loader/main.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/sys/boot/sparc64/loader/main.c b/sys/boot/sparc64/loader/main.c
index 3da7ea5..4cbea17 100644
--- a/sys/boot/sparc64/loader/main.c
+++ b/sys/boot/sparc64/loader/main.c
@@ -141,6 +141,7 @@ static u_int tlb_locked;
static vm_offset_t curkva = 0;
static vm_offset_t heapva;
+static char bootpath[64];
static phandle_t root;
/*
@@ -740,7 +741,7 @@ sparc64_zfs_probe(void)
/* Get the GUID of the ZFS pool on the boot device. */
guid = 0;
- zfs_probe_dev(getenv("currdev"), &guid);
+ zfs_probe_dev(bootpath, &guid);
for (unit = 0; unit < MAXDEV; unit++) {
/* Find freebsd-zfs slices in the VTOC. */
@@ -757,7 +758,7 @@ sparc64_zfs_probe(void)
for (part = 0; part < 8; part++) {
if (part == 2 || vtoc.part[part].tag !=
- VTOC_TAG_FREEBSD_ZFS)
+ VTOC_TAG_FREEBSD_ZFS)
continue;
sprintf(devname, "disk%d:%c", unit, part + 'a');
if (zfs_probe_dev(devname, NULL) == ENXIO)
@@ -770,11 +771,9 @@ sparc64_zfs_probe(void)
zfs_currdev.root_guid = 0;
zfs_currdev.d_dev = &zfs_dev;
zfs_currdev.d_type = zfs_currdev.d_dev->dv_type;
- /* Update the environment for ZFS. */
- env_setenv("currdev", EV_VOLATILE, zfs_fmtdev(&zfs_currdev),
- ofw_setcurrdev, env_nounset);
- env_setenv("loaddev", EV_VOLATILE, zfs_fmtdev(&zfs_currdev),
- env_noset, env_nounset);
+ (void)strncpy(bootpath, zfs_fmtdev(&zfs_currdev),
+ sizeof(bootpath) - 1);
+ bootpath[sizeof(bootpath) - 1] = '\0';
}
}
#endif /* LOADER_ZFS_SUPPORT */
@@ -782,7 +781,6 @@ sparc64_zfs_probe(void)
int
main(int (*openfirm)(void *))
{
- char bootpath[64];
char compatible[32];
struct devsw **dp;
@@ -834,16 +832,11 @@ main(int (*openfirm)(void *))
*/
if (bootpath[strlen(bootpath) - 2] == ':' &&
bootpath[strlen(bootpath) - 1] == 'f' &&
- strstr(bootpath, "cdrom")) {
+ strstr(bootpath, "cdrom") != NULL) {
bootpath[strlen(bootpath) - 1] = 'a';
printf("Boot path set to %s\n", bootpath);
}
- env_setenv("currdev", EV_VOLATILE, bootpath,
- ofw_setcurrdev, env_nounset);
- env_setenv("loaddev", EV_VOLATILE, bootpath,
- env_noset, env_nounset);
-
/*
* Initialize devices.
*/
@@ -851,6 +844,15 @@ main(int (*openfirm)(void *))
if ((*dp)->dv_init != 0)
(*dp)->dv_init();
+ /*
+ * Now that sparc64_zfs_probe() might have altered bootpath,
+ * export it.
+ */
+ env_setenv("currdev", EV_VOLATILE, bootpath,
+ ofw_setcurrdev, env_nounset);
+ env_setenv("loaddev", EV_VOLATILE, bootpath,
+ env_noset, env_nounset);
+
printf("\n");
printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
printf("(%s, %s)\n", bootprog_maker, bootprog_date);
OpenPOWER on IntegriCloud