[PATCH 3/3] discover: Clear default-boot-device when invalidated

Samuel Mendoza-Jonas sam.mj at au1.ibm.com
Fri Apr 10 13:52:07 AEST 2015


Update the clear_ipmi_bootdev functions to optionally invalidate the
next- or default-boot-device for their respective machines.
If a client invalidates the ipmi_bootdev in the config, invalidate the
respective bootdev.

Signed-off-by: Samuel Mendoza-Jonas <sam.mj at au1.ibm.com>
---
 discover/platform-powerpc.c | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c
index 5cbf1b8..2c74422 100644
--- a/discover/platform-powerpc.c
+++ b/discover/platform-powerpc.c
@@ -38,7 +38,8 @@ struct platform_powerpc {
 				struct platform_powerpc *platform,
 				uint8_t *bootdev, bool *persistent);
 	int		(*clear_ipmi_bootdev)(
-				struct platform_powerpc *platform);
+				struct platform_powerpc *platform,
+				bool persistent);
 };
 
 static const char *known_params[] = {
@@ -682,6 +683,14 @@ static int update_config(struct platform_powerpc *platform,
 		val = tmp = talloc_asprintf(platform, "%d",
 				config->autoboot_timeout_sec);
 
+	if (config->ipmi_bootdev == IPMI_BOOTDEV_INVALID &&
+	    platform->clear_ipmi_bootdev) {
+		platform->clear_ipmi_bootdev(platform,
+				config->ipmi_bootdev_persistent);
+		config->ipmi_bootdev = IPMI_BOOTDEV_NONE;
+		config->ipmi_bootdev_persistent = false;
+	}
+
 	update_string_config(platform, "petitboot,timeout", val);
 	if (tmp)
 		talloc_free(tmp);
@@ -797,10 +806,16 @@ static int write_bootdev_sysparam(const char *name, uint8_t val)
 }
 
 static int clear_ipmi_bootdev_sysparams(
-		struct platform_powerpc *platform __attribute__((unused)))
+		struct platform_powerpc *platform __attribute__((unused)),
+		bool persistent)
 {
-	/* invalidate next-boot-device setting */
-	write_bootdev_sysparam("next-boot-device", 0xff);
+	if (persistent) {
+		/* invalidate default-boot-device setting */
+		write_bootdev_sysparam("default-boot-device", 0xff);
+	} else {
+		/* invalidate next-boot-device setting */
+		write_bootdev_sysparam("next-boot-device", 0xff);
+	}
 	return 0;
 }
 
@@ -827,7 +842,8 @@ static int get_ipmi_bootdev_sysparams(
 	return 0;
 }
 
-static int clear_ipmi_bootdev_ipmi(struct platform_powerpc *platform)
+static int clear_ipmi_bootdev_ipmi(struct platform_powerpc *platform,
+				   bool persistent __attribute__((unused)))
 {
 	uint16_t resp_len;
 	uint8_t resp[1];
@@ -956,7 +972,7 @@ static void pre_boot(struct platform *p, const struct config *config)
 	struct platform_powerpc *platform = to_platform_powerpc(p);
 
 	if (!config->ipmi_bootdev_persistent && platform->clear_ipmi_bootdev)
-		platform->clear_ipmi_bootdev(platform);
+		platform->clear_ipmi_bootdev(platform, false);
 }
 
 static int get_sysinfo(struct platform *p, struct system_info *sysinfo)
-- 
2.1.0



More information about the Petitboot mailing list