summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLei YU <mine260309@gmail.com>2018-08-21 15:21:40 +0800
committerLei YU <mine260309@gmail.com>2018-08-30 03:03:05 +0000
commit269bff30da8dfabe84d29d6a510bf3b5fdb51fee (patch)
tree6e9913e1815080af21c8f01af609fbb75676dd66
parente4c063293af32e59f893bea9016522e7753413d4 (diff)
downloadphosphor-bmc-code-mgmt-269bff30da8dfabe84d29d6a510bf3b5fdb51fee.tar.gz
phosphor-bmc-code-mgmt-269bff30da8dfabe84d29d6a510bf3b5fdb51fee.zip
Make MEDIA_DIR configurable
MEDIA_DIR was configured as "/media", it works on ubi-fs systems. On static layout systems, "/media" is in rwfs, and thus is persistent after BMC reboot or code update (if rwfs is not updated). This makes the dirs/files in MEDIA_DIR persistent, and it causes an issue that BMC uses the incorrect versionId of the image that is the persistent one in MEDIA_DIR, while it should generate the versionID from the functional BMC version. Making MEDIA_DIR configurable, so static layout system could configure it to a tmpfs, and the above issue is fixed. Partly resolves openbmc/phosphor-bmc-code-mgmt#3 Tested: Verify that MEDIA_DIR could be configured via configure argument. Change-Id: I10d46ea00b79677bec16ac69d2a3375597665f0c Signed-off-by: Lei YU <mine260309@gmail.com>
-rwxr-xr-xconfigure.ac11
-rw-r--r--item_updater.cpp21
2 files changed, 26 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac
index deaf110..f768d45 100755
--- a/configure.ac
+++ b/configure.ac
@@ -87,10 +87,6 @@ AC_DEFINE(FILEPATH_IFACE, "xyz.openbmc_project.Common.FilePath",
[The common file path interface])
AC_DEFINE(OS_RELEASE_FILE, "/etc/os-release",
[The name of the BMC table of contents file])
-AC_DEFINE(MEDIA_DIR, "/media/",
- [The base dir where all RO partitions are mounted])
-AC_DEFINE(BMC_ROFS_PREFIX, "/media/rofs-",
- [The prefix path for the versioned read-only bmc partitions])
AC_DEFINE(ALT_RWFS, "/media/alt/var/persist",
[The path of the alt rwfs overlay])
AC_DEFINE(PERSIST_DIR, "/var/lib/obmc/phosphor-bmc-code-mgmt/",
@@ -102,6 +98,13 @@ AC_DEFINE(SYSTEMD_PATH, "/org/freedesktop/systemd1",
AC_DEFINE(SYSTEMD_INTERFACE, "org.freedesktop.systemd1.Manager",
[The systemd interface])
+AC_ARG_VAR(MEDIA_DIR, [The base dir where all RO partitions are mounted])
+AS_IF([test "x$MEDIA_DIR" == "x"], [MEDIA_DIR="/media"])
+AC_DEFINE_UNQUOTED([MEDIA_DIR], ["$MEDIA_DIR"], [The base dir where all RO partitions are mounted])
+
+AC_DEFINE_UNQUOTED(BMC_ROFS_PREFIX, "$MEDIA_DIR/rofs-",
+ [The prefix path for the versioned read-only bmc partitions])
+
AC_ARG_VAR(IMG_UPLOAD_DIR, [Directory where downloaded software images are placed])
AS_IF([test "x$IMG_UPLOAD_DIR" == "x"], [IMG_UPLOAD_DIR="/tmp/images"])
AC_DEFINE_UNQUOTED([IMG_UPLOAD_DIR], ["$IMG_UPLOAD_DIR"], [Directory where downloaded software images are placed])
diff --git a/item_updater.cpp b/item_updater.cpp
index e2d0f94..014757d 100644
--- a/item_updater.cpp
+++ b/item_updater.cpp
@@ -134,6 +134,21 @@ void ItemUpdater::createActivation(sdbusplus::message::message& msg)
void ItemUpdater::processBMCImage()
{
using VersionClass = phosphor::software::manager::Version;
+
+ // Check MEDIA_DIR and create if it does not exist
+ try
+ {
+ if (!fs::is_directory(MEDIA_DIR))
+ {
+ fs::create_directory(MEDIA_DIR);
+ }
+ }
+ catch (const fs::filesystem_error& e)
+ {
+ log<level::ERR>("Failed to prepare dir", entry("ERR=%s", e.what()));
+ return;
+ }
+
// Read os-release from /etc/ to get the functional BMC version
auto functionalVersion = VersionClass::getBMCVersion(OS_RELEASE_FILE);
@@ -172,7 +187,8 @@ void ItemUpdater::processBMCImage()
auto purpose = server::Version::VersionPurpose::BMC;
auto path = fs::path(SOFTWARE_OBJPATH) / id;
- // Create functional association if this is the functional version
+ // Create functional association if this is the functional
+ // version
if (version.compare(functionalVersion) == 0)
{
createFunctionalAssociation(path);
@@ -209,7 +225,8 @@ void ItemUpdater::processBMCImage()
id, std::make_unique<Activation>(
bus, path, *this, id, activationState, associations)));
- // If Active, create RedundancyPriority instance for this version.
+ // If Active, create RedundancyPriority instance for this
+ // version.
if (activationState == server::Activation::Activations::Active)
{
uint8_t priority = std::numeric_limits<uint8_t>::max();
OpenPOWER on IntegriCloud