summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2015-04-03 15:27:49 +0300
committerRichard Lowe <richlowe@richlowe.net>2015-04-07 18:04:51 -0400
commit57631629e78d7cda75d1f6ec529fc985298b24f4 (patch)
tree2e16bea799ac1ba16ef064eb72248b614a427169 /usr/src
parent37915d862fc5cc87b5b702954d7d7f16a9f98e5c (diff)
downloadillumos-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.com3
-rw-r--r--usr/src/lib/libgrubmgmt/common/libgrub_cmd.c13
-rw-r--r--usr/src/lib/libgrubmgmt/common/libgrub_fs.c27
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);