diff options
author | taylor <none@none> | 2008-05-19 09:17:00 -0700 |
---|---|---|
committer | taylor <none@none> | 2008-05-19 09:17:00 -0700 |
commit | b35c6776bcf599e80d0bcf7e248313c3e5b4847a (patch) | |
tree | 04fbc92fe628ac09b5d17399017666177b6a8f71 | |
parent | 6d1e0b89f3e34478a022854df6b0cfab82ccce66 (diff) | |
download | illumos-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.c | 5 | ||||
-rw-r--r-- | usr/src/grub/grub-0.95/stage2/fsys_zfs.c | 24 | ||||
-rw-r--r-- | usr/src/uts/common/krtld/kobj_bootflags.c | 6 |
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) ¤t_bootfs_obj, mdn, stack)) return (0); } else { - if (errnum = get_objset_mdn(MOS, - current_bootfs, ¤t_bootfs_obj, mdn, stack)) + if (errnum = get_objset_mdn(MOS, current_bootfs, + ¤t_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; |