summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortaylor <none@none>2008-05-19 09:17:00 -0700
committertaylor <none@none>2008-05-19 09:17:00 -0700
commitb35c6776bcf599e80d0bcf7e248313c3e5b4847a (patch)
tree04fbc92fe628ac09b5d17399017666177b6a8f71
parent6d1e0b89f3e34478a022854df6b0cfab82ccce66 (diff)
downloadillumos-joyent-b35c6776bcf599e80d0bcf7e248313c3e5b4847a.tar.gz
6694438 zfs grub code doesn't unset "bootfs" after a failed boot attempt
6696372 zfs boot: krtld needs to ignore -Z and its argument on SPARC 6697623 grub finds only one instance of a zfs root
-rw-r--r--usr/src/grub/grub-0.95/stage2/builtins.c5
-rw-r--r--usr/src/grub/grub-0.95/stage2/fsys_zfs.c24
-rw-r--r--usr/src/uts/common/krtld/kobj_bootflags.c6
3 files changed, 26 insertions, 9 deletions
diff --git a/usr/src/grub/grub-0.95/stage2/builtins.c b/usr/src/grub/grub-0.95/stage2/builtins.c
index 84177a97eb..1580a53dbd 100644
--- a/usr/src/grub/grub-0.95/stage2/builtins.c
+++ b/usr/src/grub/grub-0.95/stage2/builtins.c
@@ -4045,6 +4045,11 @@ bootfs_func (char *arg, int flags)
errnum = ERR_BAD_ARGUMENT;
return 0;
}
+ if (current_rootpool[0] != 0 && grub_strncmp(arg,
+ current_rootpool, strlen(current_rootpool))) {
+ errnum = ERR_BAD_ARGUMENT;
+ return 0;
+ }
if (set_bootfs(arg) == 0) {
errnum = ERR_BAD_ARGUMENT;
diff --git a/usr/src/grub/grub-0.95/stage2/fsys_zfs.c b/usr/src/grub/grub-0.95/stage2/fsys_zfs.c
index 40366f51a8..3d05d1456d 100644
--- a/usr/src/grub/grub-0.95/stage2/fsys_zfs.c
+++ b/usr/src/grub/grub-0.95/stage2/fsys_zfs.c
@@ -1163,24 +1163,32 @@ zfs_mount(void)
char *stack;
int label = 0;
uberblock_phys_t *ub_array, *ubbest = NULL;
+ vdev_boot_header_t *bh;
objset_phys_t *osp;
- /* if zfs is already mounted, don't do it again */
- if (is_zfs_mount == 1)
- return (1);
-
stackbase = ZFS_SCRATCH;
stack = stackbase;
ub_array = (uberblock_phys_t *)stack;
stack += VDEV_UBERBLOCK_RING;
+ bh = (vdev_boot_header_t *)stack;
+ stack += VDEV_BOOT_HEADER_SIZE;
+
osp = (objset_phys_t *)stack;
stack += sizeof (objset_phys_t);
/* XXX add back labels support? */
for (label = 0; ubbest == NULL && label < (VDEV_LABELS/2); label++) {
uint64_t sector = (label * sizeof (vdev_label_t) +
- VDEV_SKIP_SIZE + VDEV_BOOT_HEADER_SIZE +
+ VDEV_SKIP_SIZE) >> SPA_MINBLOCKSHIFT;
+ if (devread(sector, 0, VDEV_BOOT_HEADER_SIZE,
+ (char *)bh) == 0)
+ continue;
+ if ((bh->vb_magic != VDEV_BOOT_MAGIC) ||
+ (bh->vb_version != VDEV_BOOT_VERSION)) {
+ continue;
+ }
+ sector += (VDEV_BOOT_HEADER_SIZE +
VDEV_PHYS_SIZE) >> SPA_MINBLOCKSHIFT;
/* Read in the uberblock ring (128K). */
@@ -1253,9 +1261,11 @@ zfs_open(char *filename)
&current_bootfs_obj, mdn, stack))
return (0);
} else {
- if (errnum = get_objset_mdn(MOS,
- current_bootfs, &current_bootfs_obj, mdn, stack))
+ if (errnum = get_objset_mdn(MOS, current_bootfs,
+ &current_bootfs_obj, mdn, stack)) {
+ memset(current_bootfs, 0, MAXNAMELEN);
return (0);
+ }
}
}
diff --git a/usr/src/uts/common/krtld/kobj_bootflags.c b/usr/src/uts/common/krtld/kobj_bootflags.c
index 681f80e362..92ee199475 100644
--- a/usr/src/uts/common/krtld/kobj_bootflags.c
+++ b/usr/src/uts/common/krtld/kobj_bootflags.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -78,7 +78,7 @@ bootflags(struct bootops *ops)
#if defined(_OBP)
/* skip bootblk args */
- params.gos_opts = "abcdDF:gGHhi:km:o:O:rsvVwx";
+ params.gos_opts = "abcdDF:gGHhi:km:o:O:rsvVwxZ:";
#else
params.gos_opts = "abcdgGhi:km:O:rsvwx";
#endif
@@ -199,6 +199,8 @@ bootflags(struct bootops *ops)
#if defined(_OBP)
case 'V':
break;
+ case 'Z':
+ break;
#endif
case 'w':
boothowto |= RB_WRITABLE;