Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc4b39ef authored by David Anderson's avatar David Anderson Committed by android-build-merger
Browse files

Merge "Force merges to complete before wiping data or metadata."

am: 8444dec7

Change-Id: If50fd0536584c8e1271ea6212c9fe76e9b208b22
parents 85808f6a 8444dec7
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -58,12 +58,16 @@ cc_defaults {
    ],

    shared_libs: [
        "android.hardware.boot@1.0",
        "android.hardware.boot@1.1",
        "libbase",
        "libbootloader_message",
        "libcrypto",
        "libcutils",
        "libfs_mgr",
        "liblp",
        "liblog",
        "libprotobuf-cpp-lite",
        "libziparchive",
    ],

@@ -73,6 +77,7 @@ cc_defaults {
        "libminui",
        "librecovery_utils",
        "libotautil",
        "libsnapshot_nobinder",
    ],
}

+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ cc_defaults {
    static_libs: [
        "librecovery_utils",
        "libotautil",
        "libsnapshot_nobinder",

        // external dependencies
        "libvintf_recovery",
@@ -60,6 +61,7 @@ cc_library_static {
        "fuse_install.cpp",
        "install.cpp",
        "package.cpp",
        "snapshot_utils.cpp",
        "verifier.cpp",
        "wipe_data.cpp",
        "wipe_device.cpp",
+21 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include "recovery_ui/device.h"

bool FinishPendingSnapshotMerges(Device* device);
+49 −0
Original line number Diff line number Diff line

/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <android-base/properties.h>
#include <libsnapshot/snapshot.h>

#include "recovery_ui/device.h"
#include "recovery_ui/ui.h"
#include "recovery_utils/roots.h"

using android::snapshot::SnapshotManager;

bool FinishPendingSnapshotMerges(Device* device) {
  if (!android::base::GetBoolProperty("ro.virtual_ab.enabled", false)) {
    return true;
  }

  RecoveryUI* ui = device->GetUI();
  auto sm = SnapshotManager::NewForFirstStageMount();
  if (!sm) {
    ui->Print("Could not create SnapshotManager.\n");
    return false;
  }

  auto callback = [&]() -> void {
    double progress;
    sm->GetUpdateState(&progress);
    ui->Print("Waiting for merge to complete: %.2f\n", progress);
  };
  if (!sm->HandleImminentDataWipe(callback)) {
    ui->Print("Unable to check merge status and/or complete update merge.\n");
    return false;
  }
  return true;
}
+7 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <android-base/logging.h>
#include <android-base/stringprintf.h>

#include "install/snapshot_utils.h"
#include "otautil/dirutil.h"
#include "recovery_ui/ui.h"
#include "recovery_utils/logging.h"
@@ -104,6 +105,12 @@ bool WipeCache(RecoveryUI* ui, const std::function<bool()>& confirm_func) {
bool WipeData(Device* device, bool convert_fbe) {
  RecoveryUI* ui = device->GetUI();
  ui->Print("\n-- Wiping data...\n");

  if (!FinishPendingSnapshotMerges(device)) {
    ui->Print("Unable to check update status or complete merge, cannot wipe partitions.\n");
    return false;
  }

  bool success = device->PreWipeData();
  if (success) {
    success &= EraseVolume(DATA_ROOT, ui, convert_fbe);