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/payload_consumer/install_plan.cc b/payload_consumer/install_plan.cc
index 4a37836..f4bbeb4 100644
--- a/payload_consumer/install_plan.cc
+++ b/payload_consumer/install_plan.cc
@@ -109,18 +109,19 @@
for (Partition& partition : partitions) {
if (source_slot != BootControlInterface::kInvalidSlot &&
partition.source_size > 0) {
- result = boot_control->GetPartitionDevice(
- partition.name, source_slot, &partition.source_path) &&
- result;
+ TEST_AND_RETURN_FALSE(boot_control->GetPartitionDevice(
+ partition.name, source_slot, &partition.source_path));
} else {
partition.source_path.clear();
}
if (target_slot != BootControlInterface::kInvalidSlot &&
partition.target_size > 0) {
- result = boot_control->GetPartitionDevice(
- partition.name, target_slot, &partition.target_path) &&
- result;
+ auto device = boot_control->GetPartitionDevice(
+ partition.name, target_slot, source_slot);
+ TEST_AND_RETURN_FALSE(device.has_value());
+ partition.target_path = device->rw_device_path;
+ partition.postinstall_mount_device = device->mountable_device_path;
} else {
partition.target_path.clear();
}
diff --git a/payload_consumer/install_plan.h b/payload_consumer/install_plan.h
index ee1a72b..7068f6c 100644
--- a/payload_consumer/install_plan.h
+++ b/payload_consumer/install_plan.h
@@ -98,9 +98,17 @@
uint64_t source_size{0};
brillo::Blob source_hash;
+ // |target_path| is intended to be a path to block device, which you can
+ // open with |open| syscall and perform regular unix style read/write.
+ // For VABC, this will be empty. As you can't read/write VABC devices with
+ // regular syscall.
std::string target_path;
+ // |mountable_target_device| is intended to be a path to block device which
+ // can be used for mounting this block device's underlying filesystem.
+ std::string postinstall_mount_device;
uint64_t target_size{0};
brillo::Blob target_hash;
+
uint32_t block_size{0};
// Whether we should run the postinstall script from this partition and the
diff --git a/payload_consumer/postinstall_runner_action.cc b/payload_consumer/postinstall_runner_action.cc
index d51241f..bd49639 100644
--- a/payload_consumer/postinstall_runner_action.cc
+++ b/payload_consumer/postinstall_runner_action.cc
@@ -50,7 +50,6 @@
namespace chromeos_update_engine {
-using brillo::MessageLoop;
using std::string;
using std::vector;
@@ -127,7 +126,7 @@
const InstallPlan::Partition& partition =
install_plan_.partitions[current_partition_];
- const string mountable_device = partition.target_path;
+ const string mountable_device = partition.postinstall_mount_device;
if (mountable_device.empty()) {
LOG(ERROR) << "Cannot make mountable device from " << partition.target_path;
return CompletePostinstall(ErrorCode::kPostinstallRunnerError);
diff --git a/payload_consumer/postinstall_runner_action_unittest.cc b/payload_consumer/postinstall_runner_action_unittest.cc
index cce86e9..9b330d9 100644
--- a/payload_consumer/postinstall_runner_action_unittest.cc
+++ b/payload_consumer/postinstall_runner_action_unittest.cc
@@ -195,6 +195,7 @@
InstallPlan::Partition part;
part.name = "part";
part.target_path = device_path;
+ part.postinstall_mount_device = device_path;
part.run_postinstall = true;
part.postinstall_path = postinstall_program;
InstallPlan install_plan;
@@ -356,6 +357,7 @@
InstallPlan::Partition part;
part.name = "part";
part.target_path = "/dev/null";
+ part.postinstall_mount_device = "/dev/null";
part.run_postinstall = true;
part.postinstall_path = kPostinstallDefaultScript;
part.postinstall_optional = true;