summaryrefslogtreecommitdiff
path: root/aosp/dynamic_partition_control_android.cc
diff options
context:
space:
mode:
authorKelvin Zhang <zhangkelvin@google.com>2020-11-05 13:52:00 -0500
committerKelvin Zhang <zhangkelvin@google.com>2020-11-23 14:49:17 -0500
commit91d95fa9454d56f486e49742039ddb92e10cf054 (patch)
tree12fd299e1333feb82157b245d8fd38e08f0967e6 /aosp/dynamic_partition_control_android.cc
parent098e79a0c348d2636fd102db081b4e03cb30ef9d (diff)
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
Diffstat (limited to 'aosp/dynamic_partition_control_android.cc')
-rw-r--r--aosp/dynamic_partition_control_android.cc92
1 files changed, 65 insertions, 27 deletions
diff --git a/aosp/dynamic_partition_control_android.cc b/aosp/dynamic_partition_control_android.cc
index 3ced3e0c..15757969 100644
--- a/aosp/dynamic_partition_control_android.cc
+++ b/aosp/dynamic_partition_control_android.cc
@@ -16,6 +16,7 @@
#include "update_engine/aosp/dynamic_partition_control_android.h"
+#include <algorithm>
#include <chrono> // NOLINT(build/c++11) - using libsnapshot / liblp API
#include <cstdint>
#include <map>
@@ -960,20 +961,63 @@ bool DynamicPartitionControlAndroid::GetPartitionDevice(
bool not_in_payload,
std::string* device,
bool* is_dynamic) {
+ auto partition_dev = GetPartitionDevice(partition_name, slot, current_slot);
+ if (!partition_dev.has_value()) {
+ return false;
+ }
+ if (device) {
+ *device = std::move(partition_dev->rw_device_path);
+ }
+ if (is_dynamic) {
+ *is_dynamic = partition_dev->is_dynamic;
+ }
+ return true;
+}
+
+bool DynamicPartitionControlAndroid::GetPartitionDevice(
+ const std::string& partition_name,
+ uint32_t slot,
+ uint32_t current_slot,
+ std::string* device) {
+ return GetPartitionDevice(
+ partition_name, slot, current_slot, false, device, nullptr);
+}
+
+static std::string GetStaticDevicePath(
+ const base::FilePath& device_dir,
+ const std::string& partition_name_suffixed) {
+ base::FilePath path = device_dir.Append(partition_name_suffixed);
+ return path.value();
+}
+
+std::optional<PartitionDevice>
+DynamicPartitionControlAndroid::GetPartitionDevice(
+ const std::string& partition_name,
+ uint32_t slot,
+ uint32_t current_slot,
+ bool not_in_payload) {
+ std::string device_dir_str;
+ if (!GetDeviceDir(&device_dir_str)) {
+ LOG(ERROR) << "Failed to GetDeviceDir()";
+ return {};
+ }
+ const base::FilePath device_dir(device_dir_str);
+ // When VABC is enabled, we can't get device path for dynamic partitions in
+ // target slot.
const auto& partition_name_suffix =
partition_name + SlotSuffixForSlotNumber(slot);
- std::string device_dir_str;
- TEST_AND_RETURN_FALSE(GetDeviceDir(&device_dir_str));
- base::FilePath device_dir(device_dir_str);
-
- if (is_dynamic) {
- *is_dynamic = false;
+ if (GetVirtualAbCompressionFeatureFlag().IsEnabled() &&
+ IsDynamicPartition(partition_name) && slot != current_slot) {
+ return {{.mountable_device_path =
+ GetStaticDevicePath(device_dir, partition_name_suffix),
+ .is_dynamic = true}};
}
// When looking up target partition devices, treat them as static if the
// current payload doesn't encode them as dynamic partitions. This may happen
// when applying a retrofit update on top of a dynamic-partitions-enabled
// build.
+ std::string device;
if (GetDynamicPartitionsFeatureFlag().IsEnabled() &&
(slot == current_slot || is_target_dynamic_)) {
switch (GetDynamicPartitionDevice(device_dir,
@@ -981,36 +1025,29 @@ bool DynamicPartitionControlAndroid::GetPartitionDevice(
slot,
current_slot,
not_in_payload,
- device)) {
+ &device)) {
case DynamicPartitionDeviceStatus::SUCCESS:
- if (is_dynamic) {
- *is_dynamic = true;
- }
- return true;
+ return {{.rw_device_path = device,
+ .mountable_device_path = device,
+ .is_dynamic = true}};
+
case DynamicPartitionDeviceStatus::TRY_STATIC:
break;
case DynamicPartitionDeviceStatus::ERROR: // fallthrough
default:
- return false;
+ return {};
}
}
- base::FilePath path = device_dir.Append(partition_name_suffix);
- if (!DeviceExists(path.value())) {
- LOG(ERROR) << "Device file " << path.value() << " does not exist.";
- return false;
+ // Try static partitions.
+ auto static_path = GetStaticDevicePath(device_dir, partition_name_suffix);
+ if (!DeviceExists(static_path)) {
+ LOG(ERROR) << "Device file " << static_path << " does not exist.";
+ return {};
}
- *device = path.value();
- return true;
-}
-
-bool DynamicPartitionControlAndroid::GetPartitionDevice(
- const std::string& partition_name,
- uint32_t slot,
- uint32_t current_slot,
- std::string* device) {
- return GetPartitionDevice(
- partition_name, slot, current_slot, false, device, nullptr);
+ return {{.rw_device_path = static_path,
+ .mountable_device_path = static_path,
+ .is_dynamic = false}};
}
bool DynamicPartitionControlAndroid::IsSuperBlockDevice(
@@ -1294,4 +1331,5 @@ bool DynamicPartitionControlAndroid::IsDynamicPartition(
dynamic_partition_list_.end(),
partition_name) != dynamic_partition_list_.end();
}
+
} // namespace chromeos_update_engine