Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit e97be433 authored by Yumi Yukimura's avatar Yumi Yukimura Committed by Michael Bestas
Browse files

updater: Support loading dynamic partition metadata from OTA

* Provides an alternative option when dynamic partition metadata
  could not be loaded from the device (like when migrating from
  standard partitions to dynamic partitions)

Change-Id: I73381abd5b0cc1af37172a784735e25aae9c5958
parent 5c76c3ea
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -72,7 +72,8 @@ class UpdaterRuntimeInterface {
  // Dynamic partition related functions.
  // Dynamic partition related functions.
  virtual bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) = 0;
  virtual bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) = 0;
  virtual bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) = 0;
  virtual bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) = 0;
  virtual bool UpdateDynamicPartitions(const std::string_view op_list_value) = 0;
  virtual bool UpdateDynamicPartitions(const std::string_view op_list_value,
                                       const std::string_view super_empty_value) = 0;


  // On devices supports A/B, add current slot suffix to arg. Otherwise, return |arg| as is.
  // On devices supports A/B, add current slot suffix to arg. Otherwise, return |arg| as is.
  virtual std::string AddSlotSuffix(const std::string_view arg) const = 0;
  virtual std::string AddSlotSuffix(const std::string_view arg) const = 0;
+14 −3
Original line number Original line Diff line number Diff line
@@ -88,8 +88,10 @@ static constexpr char kMetadataUpdatedMarker[] = "/dynamic_partition_metadata.UP


Value* UpdateDynamicPartitionsFn(const char* name, State* state,
Value* UpdateDynamicPartitionsFn(const char* name, State* state,
                                 const std::vector<std::unique_ptr<Expr>>& argv) {
                                 const std::vector<std::unique_ptr<Expr>>& argv) {
  if (argv.size() != 1) {
  const std::string_view empty_string_view{};
    ErrorAbort(state, kArgsParsingFailure, "%s expects 1 arguments, got %zu", name, argv.size());
  if (argv.size() != 1 && argv.size() != 2) {
    ErrorAbort(state, kArgsParsingFailure, "%s expects 1 or 2 arguments, got %zu", name,
               argv.size());
    return StringValue("");
    return StringValue("");
  }
  }
  std::vector<std::unique_ptr<Value>> args;
  std::vector<std::unique_ptr<Value>> args;
@@ -102,6 +104,14 @@ Value* UpdateDynamicPartitionsFn(const char* name, State* state,
    return StringValue("");
    return StringValue("");
  }
  }


  const std::unique_ptr<Value>& super_empty_value = args[1];
  if (argv.size() > 1) {
    if (super_empty_value->type != Value::Type::BLOB) {
      ErrorAbort(state, kArgsParsingFailure, "super_empty argument to %s must be blob", name);
      return StringValue("");
    }
  }

  std::string updated_marker = Paths::Get().stash_directory_base() + kMetadataUpdatedMarker;
  std::string updated_marker = Paths::Get().stash_directory_base() + kMetadataUpdatedMarker;
  if (state->is_retry) {
  if (state->is_retry) {
    struct stat sb;
    struct stat sb;
@@ -121,7 +131,8 @@ Value* UpdateDynamicPartitionsFn(const char* name, State* state,
  }
  }


  auto updater_runtime = state->updater->GetRuntime();
  auto updater_runtime = state->updater->GetRuntime();
  if (!updater_runtime->UpdateDynamicPartitions(op_list_value->data)) {
  if (!updater_runtime->UpdateDynamicPartitions(
          op_list_value->data, argv.size() > 1 ? super_empty_value->data : empty_string_view)) {
    return StringValue("");
    return StringValue("");
  }
  }


+2 −1
Original line number Original line Diff line number Diff line
@@ -52,7 +52,8 @@ class SimulatorRuntime : public UpdaterRuntimeInterface {


  bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) override;
  bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) override;
  bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) override;
  bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) override;
  bool UpdateDynamicPartitions(const std::string_view op_list_value) override;
  bool UpdateDynamicPartitions(const std::string_view op_list_value,
                               const std::string_view super_empty_value) override;
  std::string AddSlotSuffix(const std::string_view arg) const override;
  std::string AddSlotSuffix(const std::string_view arg) const override;


 private:
 private:
+3 −1
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
#include <utility>
#include <utility>
#include <vector>
#include <vector>


#include "edify/expr.h"
#include "edify/updater_runtime_interface.h"
#include "edify/updater_runtime_interface.h"


class UpdaterRuntime : public UpdaterRuntimeInterface {
class UpdaterRuntime : public UpdaterRuntimeInterface {
@@ -53,7 +54,8 @@ class UpdaterRuntime : public UpdaterRuntimeInterface {


  bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) override;
  bool MapPartitionOnDeviceMapper(const std::string& partition_name, std::string* path) override;
  bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) override;
  bool UnmapPartitionOnDeviceMapper(const std::string& partition_name) override;
  bool UpdateDynamicPartitions(const std::string_view op_list_value) override;
  bool UpdateDynamicPartitions(const std::string_view op_list_value,
                               const std::string_view super_empty_value) override;
  std::string AddSlotSuffix(const std::string_view arg) const override;
  std::string AddSlotSuffix(const std::string_view arg) const override;


  struct selabel_handle* sehandle() const override {
  struct selabel_handle* sehandle() const override {
+2 −1
Original line number Original line Diff line number Diff line
@@ -113,7 +113,8 @@ bool SimulatorRuntime::UnmapPartitionOnDeviceMapper(const std::string& partition
  return true;
  return true;
}
}


bool SimulatorRuntime::UpdateDynamicPartitions(const std::string_view op_list_value) {
bool SimulatorRuntime::UpdateDynamicPartitions(const std::string_view op_list_value,
                                               const std::string_view /* super_empty_value */) {
  const std::unordered_set<std::string> commands{
  const std::unordered_set<std::string> commands{
    "resize",    "remove",       "add",          "move",
    "resize",    "remove",       "add",          "move",
    "add_group", "resize_group", "remove_group", "remove_all_groups",
    "add_group", "resize_group", "remove_group", "remove_all_groups",
Loading