From fa0c327afe484fa5ff164fb81ff93715dd6573f8 Mon Sep 17 00:00:00 2001 From: Toomas Soome Date: Fri, 5 Jun 2015 16:11:03 +0300 Subject: [PATCH] 6706 disable grub menu management in bootadm (loader project) 6707 disable grub menu management in libbe (loader project) Reviewed by: Richard Lowe Approved by: Robert Mustacchi --- usr/src/cmd/boot/bootadm/bootadm.c | 32 ++++++++++++++++++++++++++++---- usr/src/lib/libbe/common/be_utils.c | 25 +++++++++++++++++++------ usr/src/lib/libbe/common/libbe_priv.h | 2 ++ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/usr/src/cmd/boot/bootadm/bootadm.c b/usr/src/cmd/boot/bootadm/bootadm.c index 92ffa0cdd5..58c1a825ec 100644 --- a/usr/src/cmd/boot/bootadm/bootadm.c +++ b/usr/src/cmd/boot/bootadm/bootadm.c @@ -70,6 +70,7 @@ #include #include #include +#include #ifdef i386 #include #endif @@ -125,6 +126,10 @@ typedef enum { #define UFS_SIGNATURE_LIST "/var/run/grub_ufs_signatures" #define ZFS_LEGACY_MNTPT "/tmp/bootadm_mnt_zfs_legacy" +/* BE defaults */ +#define BE_DEFAULTS "/etc/default/be" +#define BE_DFLT_BE_HAS_GRUB "BE_HAS_GRUB=" + #define BOOTADM_RDONLY_TEST "BOOTADM_RDONLY_TEST" /* lock related */ @@ -3942,15 +3947,34 @@ is_grub(const char *root) { char path[PATH_MAX]; struct stat sb; + void *defp; + boolean_t grub = B_FALSE; + const char *res = NULL; const char *fcn = "is_grub()"; - (void) snprintf(path, sizeof (path), "%s%s", root, GRUB_STAGE2); - if (stat(path, &sb) == -1) { - BAM_DPRINTF(("%s: Missing GRUB directory: %s\n", fcn, path)); + /* grub is disabled by default */ + if ((defp = defopen_r(BE_DEFAULTS)) == NULL) { return (0); + } else { + res = defread_r(BE_DFLT_BE_HAS_GRUB, defp); + if (res != NULL && res[0] != '\0') { + if (strcasecmp(res, "true") == 0) + grub = B_TRUE; + } + defclose_r(defp); } - return (1); + if (grub == B_TRUE) { + (void) snprintf(path, sizeof (path), "%s%s", root, GRUB_STAGE2); + if (stat(path, &sb) == -1) { + BAM_DPRINTF(("%s: Missing GRUB directory: %s\n", + fcn, path)); + return (0); + } else + return (1); + } + + return (0); } int diff --git a/usr/src/lib/libbe/common/be_utils.c b/usr/src/lib/libbe/common/be_utils.c index e63809c899..1d79c51a4f 100644 --- a/usr/src/lib/libbe/common/be_utils.c +++ b/usr/src/lib/libbe/common/be_utils.c @@ -405,16 +405,24 @@ be_get_defaults(struct be_defaults *defaults) { void *defp; + defaults->be_deflt_grub = B_FALSE; defaults->be_deflt_rpool_container = B_FALSE; defaults->be_deflt_bename_starts_with[0] = '\0'; if ((defp = defopen_r(BE_DEFAULTS)) != NULL) { const char *res = defread_r(BE_DFLT_BENAME_STARTS, defp); - if (res != NULL && res[0] != NULL) { + if (res != NULL && res[0] != '\0') { (void) strlcpy(defaults->be_deflt_bename_starts_with, res, ZFS_MAX_DATASET_NAME_LEN); defaults->be_deflt_rpool_container = B_TRUE; } + if (be_is_isa("i386")) { + res = defread_r(BE_DFLT_BE_HAS_GRUB, defp); + if (res != NULL && res[0] != '\0') { + if (strcasecmp(res, "true") == 0) + defaults->be_deflt_grub = B_TRUE; + } + } defclose_r(defp); } } @@ -3116,11 +3124,16 @@ be_err_to_str(int err) boolean_t be_has_grub(void) { - /* - * TODO: This will need to be expanded to check for the existence of - * grub if and when there is grub support for SPARC. - */ - return (be_is_isa("i386")); + static struct be_defaults be_defaults; + static boolean_t be_deflts_set = B_FALSE; + + /* Cache the defaults, because be_has_grub is used often. */ + if (be_deflts_set == B_FALSE) { + be_get_defaults(&be_defaults); + be_deflts_set = B_TRUE; + } + + return (be_defaults.be_deflt_grub); } /* diff --git a/usr/src/lib/libbe/common/libbe_priv.h b/usr/src/lib/libbe/common/libbe_priv.h index a9c464dc69..d9cb964c25 100644 --- a/usr/src/lib/libbe/common/libbe_priv.h +++ b/usr/src/lib/libbe/common/libbe_priv.h @@ -42,6 +42,7 @@ extern "C" { #define BE_AUTO_NAME_DELIM '-' #define BE_DEFAULTS "/etc/default/be" #define BE_DFLT_BENAME_STARTS "BENAME_STARTS_WITH=" +#define BE_DFLT_BE_HAS_GRUB "BE_HAS_GRUB=" #define BE_CONTAINER_DS_NAME "ROOT" #define BE_DEFAULT_CONSOLE "text" #define BE_POLICY_PROPERTY "org.opensolaris.libbe:policy" @@ -137,6 +138,7 @@ typedef struct be_plcy_list { struct be_defaults { boolean_t be_deflt_rpool_container; + boolean_t be_deflt_grub; char be_deflt_bename_starts_with[ZFS_MAX_DATASET_NAME_LEN]; }; -- 2.11.4.GIT