Do not map dynamic partitions on VABC devices
With VABC, we no longer need to map all partitions before
reading/writing, so don't try to map them.
1. modify GetPartitionDevice to return empty path for target partitions
on VABC
2. Add a separate GetMountableTargetDevice for obtaining a mountable
device path, specifically for postinstall
Test: treehugger
Change-Id: Ib1f608914fc49c677ce7389140ca79b028171191
diff --git a/common/boot_control_interface.h b/common/boot_control_interface.h
index c93de5c..3b61add 100644
--- a/common/boot_control_interface.h
+++ b/common/boot_control_interface.h
@@ -75,6 +75,11 @@
Slot slot,
std::string* device) const = 0;
+ virtual std::optional<PartitionDevice> GetPartitionDevice(
+ const std::string& partition_name,
+ uint32_t slot,
+ uint32_t current_slot,
+ bool not_in_payload = false) const = 0;
// Returns whether the passed |slot| is marked as bootable. Returns false if
// the slot is invalid.
virtual bool IsSlotBootable(Slot slot) const = 0;
diff --git a/common/boot_control_stub.cc b/common/boot_control_stub.cc
index 907f670..a1cc055 100644
--- a/common/boot_control_stub.cc
+++ b/common/boot_control_stub.cc
@@ -44,6 +44,15 @@
return false;
}
+std::optional<PartitionDevice> BootControlStub::GetPartitionDevice(
+ const std::string& partition_name,
+ uint32_t slot,
+ uint32_t current_slot,
+ bool not_in_payload) const {
+ LOG(ERROR) << __FUNCTION__ << " should never be called.";
+ return {};
+}
+
bool BootControlStub::GetPartitionDevice(const string& partition_name,
Slot slot,
string* device) const {
diff --git a/common/boot_control_stub.h b/common/boot_control_stub.h
index a1bdb96..dcddbae 100644
--- a/common/boot_control_stub.h
+++ b/common/boot_control_stub.h
@@ -48,6 +48,11 @@
bool GetPartitionDevice(const std::string& partition_name,
BootControlInterface::Slot slot,
std::string* device) const override;
+ std::optional<PartitionDevice> GetPartitionDevice(
+ const std::string& partition_name,
+ uint32_t slot,
+ uint32_t current_slot,
+ bool not_in_payload = false) const override;
bool IsSlotBootable(BootControlInterface::Slot slot) const override;
bool MarkSlotUnbootable(BootControlInterface::Slot slot) override;
bool SetActiveBootSlot(BootControlInterface::Slot slot) override;
diff --git a/common/dynamic_partition_control_interface.h b/common/dynamic_partition_control_interface.h
index 1362c19..855d6e8 100644
--- a/common/dynamic_partition_control_interface.h
+++ b/common/dynamic_partition_control_interface.h
@@ -36,6 +36,12 @@
namespace chromeos_update_engine {
+struct PartitionDevice {
+ std::string rw_device_path;
+ std::string mountable_device_path;
+ bool is_dynamic;
+};
+
struct FeatureFlag {
enum class Value { NONE = 0, RETROFIT, LAUNCH };
constexpr explicit FeatureFlag(Value value) : value_(value) {}
diff --git a/common/fake_boot_control.h b/common/fake_boot_control.h
index 98b93e6..fc7839d 100644
--- a/common/fake_boot_control.h
+++ b/common/fake_boot_control.h
@@ -51,14 +51,16 @@
bool not_in_payload,
std::string* device,
bool* is_dynamic) const override {
- if (slot >= num_slots_)
+ auto dev =
+ GetPartitionDevice(partition_name, slot, current_slot_, not_in_payload);
+ if (!dev.has_value()) {
return false;
- auto part_it = devices_[slot].find(partition_name);
- if (part_it == devices_[slot].end())
- return false;
- *device = part_it->second;
- if (is_dynamic != nullptr) {
- *is_dynamic = false;
+ }
+ if (is_dynamic) {
+ *is_dynamic = dev->is_dynamic;
+ }
+ if (device) {
+ *device = dev->rw_device_path;
}
return true;
}
@@ -120,6 +122,25 @@
return dynamic_partition_control_.get();
}
+ std::optional<PartitionDevice> GetPartitionDevice(
+ const std::string& partition_name,
+ uint32_t slot,
+ uint32_t current_slot,
+ bool not_in_payload = false) const override {
+ if (slot >= devices_.size()) {
+ return {};
+ }
+ auto device_path = devices_[slot].find(partition_name);
+ if (device_path == devices_[slot].end()) {
+ return {};
+ }
+ PartitionDevice device;
+ device.is_dynamic = false;
+ device.rw_device_path = device_path->second;
+ device.mountable_device_path = device.rw_device_path;
+ return device;
+ }
+
private:
BootControlInterface::Slot num_slots_{2};
BootControlInterface::Slot current_slot_{0};