diff options
author | Toomas Soome <tsoome@me.com> | 2015-04-03 15:27:49 +0300 |
---|---|---|
committer | Richard Lowe <richlowe@richlowe.net> | 2015-04-07 18:04:51 -0400 |
commit | 57631629e78d7cda75d1f6ec529fc985298b24f4 (patch) | |
tree | 2e16bea799ac1ba16ef064eb72248b614a427169 /usr/src | |
parent | 37915d862fc5cc87b5b702954d7d7f16a9f98e5c (diff) | |
download | illumos-gate-57631629e78d7cda75d1f6ec529fc985298b24f4.tar.gz |
5786 Fast reboot broken on EFI formatted drives
Reviewed by: Richard PALO <richard@NetBSD.org>
Reviewed by: Josef Sipek <jeffpc@josefsipek.net>
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/lib/libgrubmgmt/Makefile.com | 3 | ||||
-rw-r--r-- | usr/src/lib/libgrubmgmt/common/libgrub_cmd.c | 13 | ||||
-rw-r--r-- | usr/src/lib/libgrubmgmt/common/libgrub_fs.c | 27 |
3 files changed, 38 insertions, 5 deletions
diff --git a/usr/src/lib/libgrubmgmt/Makefile.com b/usr/src/lib/libgrubmgmt/Makefile.com index 30b7bf4790..ef1da17922 100644 --- a/usr/src/lib/libgrubmgmt/Makefile.com +++ b/usr/src/lib/libgrubmgmt/Makefile.com @@ -21,6 +21,7 @@ # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. +# Copyright 2015 Toomas Soome <tsoome@me.com> # # @@ -42,7 +43,7 @@ $(LINTLIB) := SRCS = $(SRCDIR)/$(LINTSRC) # # Libraries added to the next line must be present in miniroot # -LDLIBS += -lc -lzfs -ldevinfo -lfstyp +LDLIBS += -lc -lzfs -ldevinfo -lfstyp -lefi CFLAGS += $(CCVERBOSE) diff --git a/usr/src/lib/libgrubmgmt/common/libgrub_cmd.c b/usr/src/lib/libgrubmgmt/common/libgrub_cmd.c index 5dc12247b1..4166f2ee4c 100644 --- a/usr/src/lib/libgrubmgmt/common/libgrub_cmd.c +++ b/usr/src/lib/libgrubmgmt/common/libgrub_cmd.c @@ -402,10 +402,15 @@ findroot(const grub_line_t *lp, grub_barg_t *barg) return (EG_FINDROOTFMT); ++pos; - if ((pos[0] != ',' && pos[0] != ')') || - !IS_SLCNUM_VALID(barg->gb_slcnum = pos[1]) || - pos[2] != ')') - return (EG_FINDROOTFMT); + /* + * check the slice only when its presented + */ + if (pos[0] != ')') { + if (pos[0] != ',' || + !IS_SLCNUM_VALID(barg->gb_slcnum = pos[1]) || + pos[2] != ')') + return (EG_FINDROOTFMT); + } } else { sz = strlen(sign); } diff --git a/usr/src/lib/libgrubmgmt/common/libgrub_fs.c b/usr/src/lib/libgrubmgmt/common/libgrub_fs.c index d53b89761a..aa5faa6470 100644 --- a/usr/src/lib/libgrubmgmt/common/libgrub_fs.c +++ b/usr/src/lib/libgrubmgmt/common/libgrub_fs.c @@ -24,6 +24,7 @@ */ /* * Copyright 2013 Nexenta Systems, Inc. All rights reserved. + * Copyright 2015 Toomas Soome <tsoome@me.com> */ /* @@ -42,6 +43,8 @@ #include <sys/mount.h> #include <sys/mntent.h> #include <sys/mnttab.h> +#include <sys/efi_partition.h> +#include <sys/vtoc.h> #include <sys/fs/ufs_mount.h> #include <sys/dktp/fdisk.h> #include <libfstyp.h> @@ -56,6 +59,10 @@ slice_match(const char *physpath, int slice) { const char *pos; + /* always match whole disk slice */ + if (slice == SLCNUM_WHOLE_DISK) + return (0); + return ((pos = strrchr(physpath, slice)) == NULL || pos[1] != 0 || pos[-1] != ':'); } @@ -100,6 +107,26 @@ get_sol_prtnum(const char *physpath) if ((pos = strrchr(rdev, ':')) == NULL) return (PRTNUM_INVALID); + /* + * first check for EFI partitioning, efi_alloc_and_read() + * will return partition number. + */ + if ((fd = open(rdev, O_RDONLY|O_NDELAY)) >= 0) { + struct dk_gpt *vtoc; + + if ((i = efi_alloc_and_read(fd, &vtoc)) >= 0) { + /* zfs is using V_USR */ + if (vtoc->efi_parts[i].p_tag != V_USR) + i = PRTNUM_INVALID; /* error */ + efi_free(vtoc); + (void) close(fd); + return (i); + } + (void) close(fd); + } else { + return (PRTNUM_INVALID); + } + pos[1] = SLCNUM_WHOLE_DISK; fd = open(rdev, O_RDONLY); |