Retrofit devices do not do allocatable space / 2.
Retrofit devices have two supers, so the allocatable
space does not need to be halved.
Test: manual OTA
Bug: 118506262
Change-Id: I31c77b9318e7c0b6bc6d1a8ae6efa70a3383b05f
diff --git a/boot_control_android.cc b/boot_control_android.cc
index f4e0a4b..2d2b77e 100644
--- a/boot_control_android.cc
+++ b/boot_control_android.cc
@@ -323,12 +323,17 @@
total_size += group.size;
}
- if (total_size > (builder->AllocatableSpace() / 2)) {
- LOG(ERROR)
- << "The maximum size of all groups with suffix " << target_suffix
- << " (" << total_size
- << ") has exceeded half of allocatable space for dynamic partitions "
- << (builder->AllocatableSpace() / 2) << ".";
+ string expr;
+ uint64_t allocatable_space = builder->AllocatableSpace();
+ if (!dynamic_control->IsDynamicPartitionsRetrofit()) {
+ allocatable_space /= 2;
+ expr = "half of ";
+ }
+ if (total_size > allocatable_space) {
+ LOG(ERROR) << "The maximum size of all groups with suffix " << target_suffix
+ << " (" << total_size << ") has exceeded " << expr
+ << "allocatable space for dynamic partitions "
+ << allocatable_space << ".";
return false;
}
diff --git a/boot_control_android_unittest.cc b/boot_control_android_unittest.cc
index 6460ffe..2375714 100644
--- a/boot_control_android_unittest.cc
+++ b/boot_control_android_unittest.cc
@@ -273,6 +273,8 @@
ON_CALL(dynamicControl(), IsDynamicPartitionsEnabled())
.WillByDefault(Return(true));
+ ON_CALL(dynamicControl(), IsDynamicPartitionsRetrofit())
+ .WillByDefault(Return(false));
ON_CALL(dynamicControl(), GetDeviceDir(_))
.WillByDefault(Invoke([](auto path) {
*path = kFakeDevicePath;
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc
index 93a0fae..bd34ea9 100644
--- a/dynamic_partition_control_android.cc
+++ b/dynamic_partition_control_android.cc
@@ -54,7 +54,7 @@
return GetBoolProperty(kUseDynamicPartitions, false);
}
-static bool IsDynamicPartitionsRetrofit() {
+bool DynamicPartitionControlAndroid::IsDynamicPartitionsRetrofit() {
return GetBoolProperty(kRetrfoitDynamicPartitions, false);
}
diff --git a/dynamic_partition_control_android.h b/dynamic_partition_control_android.h
index 52d4f5b..0ccab4e 100644
--- a/dynamic_partition_control_android.h
+++ b/dynamic_partition_control_android.h
@@ -30,6 +30,7 @@
DynamicPartitionControlAndroid() = default;
~DynamicPartitionControlAndroid();
bool IsDynamicPartitionsEnabled() override;
+ bool IsDynamicPartitionsRetrofit() override;
bool MapPartitionOnDeviceMapper(const std::string& super_device,
const std::string& target_partition_name,
uint32_t slot,
diff --git a/dynamic_partition_control_interface.h b/dynamic_partition_control_interface.h
index b92d88a..86a0730 100644
--- a/dynamic_partition_control_interface.h
+++ b/dynamic_partition_control_interface.h
@@ -35,6 +35,9 @@
// Return true iff dynamic partitions is enabled on this device.
virtual bool IsDynamicPartitionsEnabled() = 0;
+ // Return true iff dynamic partitions is retrofitted on this device.
+ virtual bool IsDynamicPartitionsRetrofit() = 0;
+
// Map logical partition on device-mapper.
// |super_device| is the device path of the physical partition ("super").
// |target_partition_name| is the identifier used in metadata; for example,
diff --git a/mock_dynamic_partition_control.h b/mock_dynamic_partition_control.h
index 7b37581..24aca06 100644
--- a/mock_dynamic_partition_control.h
+++ b/mock_dynamic_partition_control.h
@@ -47,6 +47,7 @@
uint32_t));
MOCK_METHOD1(GetDeviceDir, bool(std::string*));
MOCK_METHOD0(IsDynamicPartitionsEnabled, bool());
+ MOCK_METHOD0(IsDynamicPartitionsRetrofit, bool());
};
} // namespace chromeos_update_engine