summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorLin Ling <Lin.Ling@Sun.COM>2009-02-10 16:23:25 -0800
committerLin Ling <Lin.Ling@Sun.COM>2009-02-10 16:23:25 -0800
commit9bd6d2697ce845da0f5a213c59b85b4a604e08db (patch)
tree30941e1f86c590e212ea5b7025c151cb9875239c /usr/src
parentde0cf919b83d25b7d9384daad6cf6a7b3bdd355a (diff)
downloadillumos-gate-9bd6d2697ce845da0f5a213c59b85b4a604e08db.tar.gz
6714681 On x86 ZFS root reboot with args panics due to missing -B $ZFS-BOOTFS
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/boot/bootadm/bootadm.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/usr/src/cmd/boot/bootadm/bootadm.c b/usr/src/cmd/boot/bootadm/bootadm.c
index 890a09ed14..0bc2bb4a5e 100644
--- a/usr/src/cmd/boot/bootadm/bootadm.c
+++ b/usr/src/cmd/boot/bootadm/bootadm.c
@@ -7952,7 +7952,6 @@ update_temp(menu_t *mp, char *dummy, char *opt)
return (BAM_ERROR);
}
- free(fstype);
free(osdev);
(void) strlcpy(signbuf, sign, sizeof (signbuf));
free(sign);
@@ -7967,6 +7966,7 @@ update_temp(menu_t *mp, char *dummy, char *opt)
*/
INJECT_ERROR1("REBOOT_NOT_DBOOT", bam_direct = BAM_DIRECT_MULTIBOOT);
if (bam_direct != BAM_DIRECT_DBOOT) {
+ free(fstype);
bam_error(REBOOT_DIRECT_FAILED);
return (BAM_ERROR);
}
@@ -7977,12 +7977,21 @@ update_temp(menu_t *mp, char *dummy, char *opt)
ret = get_kernel(mp, KERNEL_CMD, kernbuf, sizeof (kernbuf));
INJECT_ERROR1("REBOOT_GET_KERNEL", ret = BAM_ERROR);
if (ret != BAM_SUCCESS) {
+ free(fstype);
bam_error(REBOOT_GET_KERNEL_FAILED);
return (BAM_ERROR);
}
if (kernbuf[0] == '\0')
(void) strlcpy(kernbuf, DIRECT_BOOT_KERNEL,
sizeof (kernbuf));
+ /*
+ * If this is a zfs file system and kernbuf does not
+ * have "-B $ZFS-BOOTFS" string yet, add it.
+ */
+ if (strcmp(fstype, "zfs") == 0 && !strstr(kernbuf, ZFS_BOOT)) {
+ (void) strlcat(kernbuf, " ", sizeof (kernbuf));
+ (void) strlcat(kernbuf, ZFS_BOOT, sizeof (kernbuf));
+ }
(void) strlcat(kernbuf, " ", sizeof (kernbuf));
(void) strlcat(kernbuf, opt, sizeof (kernbuf));
BAM_DPRINTF((D_REBOOT_OPTION, fcn, kernbuf));
@@ -8010,6 +8019,7 @@ update_temp(menu_t *mp, char *dummy, char *opt)
sizeof (args_buf));
INJECT_ERROR1("REBOOT_GET_ARGS", ret = BAM_ERROR);
if (ret != BAM_SUCCESS) {
+ free(fstype);
bam_error(REBOOT_GET_ARGS_FAILED);
return (BAM_ERROR);
}
@@ -8053,6 +8063,7 @@ update_temp(menu_t *mp, char *dummy, char *opt)
INJECT_ERROR1("UPDATE_TEMP_PARTIAL_ARGS",
ret = BAM_ERROR);
if (ret != BAM_SUCCESS) {
+ free(fstype);
bam_error(REBOOT_GET_ARGS_FAILED);
return (BAM_ERROR);
}
@@ -8066,11 +8077,13 @@ update_temp(menu_t *mp, char *dummy, char *opt)
}
BAM_DPRINTF((D_REBOOT_RESOLVED_PARTIAL, fcn, kernbuf));
} else {
+ free(fstype);
bam_error(UNKNOWN_KERNEL, opt);
bam_print_stderr(UNKNOWN_KERNEL_REBOOT);
return (BAM_ERROR);
}
}
+ free(fstype);
entry = add_boot_entry(mp, REBOOT_TITLE, signbuf, kernbuf,
NULL, NULL);
INJECT_ERROR1("REBOOT_ADD_BOOT_ENTRY", entry = BAM_ERROR);