Mount all partitions before running postinstall
For Virtual AB Compression, we need to mount snapshotted partitions
manually.
Test: treehugger
Change-Id: I15af8375e393ce2539d2075b467e8dbe94bec247
diff --git a/common/error_code.h b/common/error_code.h
index 7d9cfff..a889888 100644
--- a/common/error_code.h
+++ b/common/error_code.h
@@ -86,6 +86,7 @@
kNotEnoughSpace = 60,
kDeviceCorrupted = 61,
kPackageExcludedFromUpdate = 62,
+ kPostInstallMountError = 63,
// VERY IMPORTANT! When adding new error codes:
//
diff --git a/common/error_code_utils.cc b/common/error_code_utils.cc
index cda4c7e..421544a 100644
--- a/common/error_code_utils.cc
+++ b/common/error_code_utils.cc
@@ -173,6 +173,8 @@
return "ErrorCode::kDeviceCorrupted";
case ErrorCode::kPackageExcludedFromUpdate:
return "ErrorCode::kPackageExcludedFromUpdate";
+ case ErrorCode::kPostInstallMountError:
+ return "ErrorCode::kPostInstallMountError";
// Don't add a default case to let the compiler warn about newly added
// error codes which should be added here.
}
diff --git a/metrics_utils.cc b/metrics_utils.cc
index 2211a67..a947a7e 100644
--- a/metrics_utils.cc
+++ b/metrics_utils.cc
@@ -95,6 +95,7 @@
case ErrorCode::kPostinstallRunnerError:
case ErrorCode::kPostinstallBootedFromFirmwareB:
case ErrorCode::kPostinstallFirmwareRONotUpdatable:
+ case ErrorCode::kPostInstallMountError:
return metrics::AttemptResult::kPostInstallFailed;
case ErrorCode::kUserCanceled:
@@ -189,6 +190,7 @@
case ErrorCode::kOmahaResponseHandlerError:
case ErrorCode::kFilesystemCopierError:
case ErrorCode::kPostinstallRunnerError:
+ case ErrorCode::kPostInstallMountError:
case ErrorCode::kPayloadMismatchedType:
case ErrorCode::kInstallDeviceOpenError:
case ErrorCode::kKernelDeviceOpenError:
diff --git a/payload_consumer/postinstall_runner_action.cc b/payload_consumer/postinstall_runner_action.cc
index 91c3a64..d51241f 100644
--- a/payload_consumer/postinstall_runner_action.cc
+++ b/payload_consumer/postinstall_runner_action.cc
@@ -56,8 +56,22 @@
void PostinstallRunnerAction::PerformAction() {
CHECK(HasInputObject());
+ CHECK(boot_control_);
install_plan_ = GetInputObject();
+ auto dynamic_control = boot_control_->GetDynamicPartitionControl();
+ CHECK(dynamic_control);
+
+ // Mount snapshot partitions for Virtual AB Compression Compression.
+ if (dynamic_control->GetVirtualAbCompressionFeatureFlag().IsEnabled()) {
+ // Before calling MapAllPartitions to map snapshot devices, all CowWriters
+ // must be closed, and MapAllPartitions() should be called.
+ dynamic_control->UnmapAllPartitions();
+ if (!dynamic_control->MapAllPartitions()) {
+ return CompletePostinstall(ErrorCode::kPostInstallMountError);
+ }
+ }
+
// We always powerwash when rolling back, however policy can determine
// if this is a full/normal powerwash, or a special rollback powerwash
// that retains a small amount of system state such as enrollment and