Merge "Convert fastboot/libsnapshot to new BootControl client"

This commit is contained in:
Treehugger Robot 2022-07-12 17:47:20 +00:00 committed by Gerrit Code Review
commit c29f0745d5
15 changed files with 74 additions and 78 deletions

View file

@ -164,6 +164,8 @@ cc_binary {
shared_libs: [
"android.hardware.boot@1.0",
"android.hardware.boot@1.1",
"android.hardware.boot-V1-ndk",
"libboot_control_client",
"android.hardware.fastboot@1.1",
"android.hardware.health@2.0",
"android.hardware.health-V1-ndk",

View file

@ -40,6 +40,7 @@
#include <storage_literals/storage_literals.h>
#include <uuid/uuid.h>
#include "BootControlClient.h"
#include "constants.h"
#include "fastboot_device.h"
#include "flashing.h"
@ -52,15 +53,12 @@ static constexpr bool kEnableFetch = false;
#endif
using android::fs_mgr::MetadataBuilder;
using android::hal::CommandResult;
using ::android::hardware::hidl_string;
using ::android::hardware::boot::V1_0::BoolResult;
using ::android::hardware::boot::V1_0::CommandResult;
using ::android::hardware::boot::V1_0::Slot;
using ::android::hardware::boot::V1_1::MergeStatus;
using ::android::hardware::fastboot::V1_0::Result;
using ::android::hardware::fastboot::V1_0::Status;
using android::snapshot::SnapshotManager;
using IBootControl1_1 = ::android::hardware::boot::V1_1::IBootControl;
using MergeStatus = android::hal::BootControlClient::MergeStatus;
using namespace android::storage_literals;
@ -317,7 +315,7 @@ bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& ar
"set_active command is not allowed on locked devices");
}
Slot slot;
int32_t slot = 0;
if (!GetSlotNumber(args[1], &slot)) {
// Slot suffix needs to be between 'a' and 'z'.
return device->WriteStatus(FastbootResult::FAIL, "Bad slot suffix");
@ -329,7 +327,7 @@ bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& ar
return device->WriteStatus(FastbootResult::FAIL,
"Cannot set slot: boot control HAL absent");
}
if (slot >= boot_control_hal->getNumberSlots()) {
if (slot >= boot_control_hal->GetNumSlots()) {
return device->WriteStatus(FastbootResult::FAIL, "Slot out of range");
}
@ -358,10 +356,8 @@ bool SetActiveHandler(FastbootDevice* device, const std::vector<std::string>& ar
}
}
CommandResult ret;
auto cb = [&ret](CommandResult result) { ret = result; };
auto result = boot_control_hal->setActiveBootSlot(slot, cb);
if (result.isOk() && ret.success) {
CommandResult ret = boot_control_hal->SetActiveBootSlot(slot);
if (ret.success) {
// Save as slot suffix to match the suffix format as returned from
// the boot control HAL.
auto current_slot = "_" + args[1];
@ -682,9 +678,14 @@ bool SnapshotUpdateHandler(FastbootDevice* device, const std::vector<std::string
if (args[1] == "cancel") {
switch (status) {
case MergeStatus::SNAPSHOTTED:
case MergeStatus::MERGING:
hal->setSnapshotMergeStatus(MergeStatus::CANCELLED);
case MergeStatus::MERGING: {
const auto ret = hal->SetSnapshotMergeStatus(MergeStatus::CANCELLED);
if (!ret.success) {
device->WriteFail("Failed to SetSnapshotMergeStatus(MergeStatus::CANCELLED) " +
ret.errMsg);
}
break;
}
default:
break;
}

View file

@ -18,6 +18,7 @@
#include <algorithm>
#include <BootControlClient.h>
#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android-base/strings.h>
@ -38,9 +39,8 @@ using std::string_literals::operator""s;
using android::fs_mgr::EnsurePathUnmounted;
using android::fs_mgr::Fstab;
using ::android::hardware::hidl_string;
using ::android::hardware::boot::V1_0::IBootControl;
using ::android::hardware::boot::V1_0::Slot;
using ::android::hardware::fastboot::V1_1::IFastboot;
using BootControlClient = FastbootDevice::BootControlClient;
namespace sph = std::placeholders;
@ -85,7 +85,7 @@ FastbootDevice::FastbootDevice()
{FB_CMD_SNAPSHOT_UPDATE, SnapshotUpdateHandler},
{FB_CMD_FETCH, FetchHandler},
}),
boot_control_hal_(IBootControl::getService()),
boot_control_hal_(BootControlClient::WaitForService()),
health_hal_(get_health_service()),
fastboot_hal_(IFastboot::getService()),
active_slot_("") {
@ -95,10 +95,6 @@ FastbootDevice::FastbootDevice()
transport_ = std::make_unique<ClientUsbTransport>();
}
if (boot_control_hal_) {
boot1_1_ = android::hardware::boot::V1_1::IBootControl::castFrom(boot_control_hal_);
}
// Make sure cache is unmounted, since recovery will have mounted it for
// logging.
Fstab fstab;
@ -125,12 +121,17 @@ std::string FastbootDevice::GetCurrentSlot() {
if (!boot_control_hal_) {
return "";
}
std::string suffix;
auto cb = [&suffix](hidl_string s) { suffix = s; };
boot_control_hal_->getSuffix(boot_control_hal_->getCurrentSlot(), cb);
std::string suffix = boot_control_hal_->GetSuffix(boot_control_hal_->GetCurrentSlot());
return suffix;
}
BootControlClient* FastbootDevice::boot1_1() const {
if (boot_control_hal_->GetVersion() >= android::hal::BootControlVersion::BOOTCTL_V1_1) {
return boot_control_hal_.get();
}
return nullptr;
}
bool FastbootDevice::WriteStatus(FastbootResult result, const std::string& message) {
constexpr size_t kResponseReasonSize = 4;
constexpr size_t kNumResponseTypes = 4; // "FAIL", "OKAY", "INFO", "DATA"

View file

@ -22,9 +22,8 @@
#include <utility>
#include <vector>
#include <BootControlClient.h>
#include <aidl/android/hardware/health/IHealth.h>
#include <android/hardware/boot/1.0/IBootControl.h>
#include <android/hardware/boot/1.1/IBootControl.h>
#include <android/hardware/fastboot/1.1/IFastboot.h>
#include "commands.h"
@ -33,6 +32,7 @@
class FastbootDevice {
public:
using BootControlClient = android::hal::BootControlClient;
FastbootDevice();
~FastbootDevice();
@ -50,10 +50,8 @@ class FastbootDevice {
std::vector<char>& download_data() { return download_data_; }
Transport* get_transport() { return transport_.get(); }
android::sp<android::hardware::boot::V1_0::IBootControl> boot_control_hal() {
return boot_control_hal_;
}
android::sp<android::hardware::boot::V1_1::IBootControl> boot1_1() { return boot1_1_; }
BootControlClient* boot_control_hal() const { return boot_control_hal_.get(); }
BootControlClient* boot1_1() const;
android::sp<android::hardware::fastboot::V1_1::IFastboot> fastboot_hal() {
return fastboot_hal_;
}
@ -65,8 +63,7 @@ class FastbootDevice {
const std::unordered_map<std::string, CommandHandler> kCommandMap;
std::unique_ptr<Transport> transport_;
android::sp<android::hardware::boot::V1_0::IBootControl> boot_control_hal_;
android::sp<android::hardware::boot::V1_1::IBootControl> boot1_1_;
std::unique_ptr<BootControlClient> boot_control_hal_;
std::shared_ptr<aidl::android::hardware::health::IHealth> health_hal_;
android::sp<android::hardware::fastboot::V1_1::IFastboot> fastboot_hal_;
std::vector<char> download_data_;

View file

@ -36,7 +36,6 @@
using namespace android::fs_mgr;
using namespace std::chrono_literals;
using android::base::unique_fd;
using android::hardware::boot::V1_0::Slot;
namespace {
@ -137,7 +136,7 @@ bool LogicalPartitionExists(FastbootDevice* device, const std::string& name, boo
return true;
}
bool GetSlotNumber(const std::string& slot, Slot* number) {
bool GetSlotNumber(const std::string& slot, int32_t* number) {
if (slot.size() != 1) {
return false;
}
@ -204,7 +203,7 @@ bool UpdateAllPartitionMetadata(FastbootDevice* device, const std::string& super
size_t num_slots = 1;
auto boot_control_hal = device->boot_control_hal();
if (boot_control_hal) {
num_slots = boot_control_hal->getNumberSlots();
num_slots = boot_control_hal->GetNumSlots();
}
bool ok = true;

View file

@ -21,7 +21,6 @@
#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/unique_fd.h>
#include <android/hardware/boot/1.0/IBootControl.h>
#include <fstab/fstab.h>
#include <liblp/liblp.h>
@ -124,7 +123,7 @@ bool LogicalPartitionExists(FastbootDevice* device, const std::string& name,
bool OpenPartition(FastbootDevice* device, const std::string& name, PartitionHandle* handle,
int flags = O_WRONLY);
bool GetSlotNumber(const std::string& slot, android::hardware::boot::V1_0::Slot* number);
bool GetSlotNumber(const std::string& slot, int32_t* number);
std::vector<std::string> ListPartitions(FastbootDevice* device);
bool GetDeviceLockStatus();

View file

@ -29,7 +29,7 @@
#include <fs_mgr.h>
#include <liblp/liblp.h>
#include "constants.h"
#include "BootControlClient.h"
#include "fastboot_device.h"
#include "flashing.h"
#include "utility.h"
@ -40,13 +40,10 @@ static constexpr bool kEnableFetch = true;
static constexpr bool kEnableFetch = false;
#endif
using ::android::hardware::boot::V1_0::BoolResult;
using ::android::hardware::boot::V1_0::Slot;
using ::android::hardware::boot::V1_1::MergeStatus;
using MergeStatus = android::hal::BootControlClient::MergeStatus;
using ::android::hardware::fastboot::V1_0::FileSystemType;
using ::android::hardware::fastboot::V1_0::Result;
using ::android::hardware::fastboot::V1_0::Status;
using IBootControl1_1 = ::android::hardware::boot::V1_1::IBootControl;
using namespace android::fs_mgr;
using namespace std::string_literals;
@ -211,7 +208,7 @@ bool GetSlotCount(FastbootDevice* device, const std::vector<std::string>& /* arg
if (!boot_control_hal) {
*message = "0";
} else {
*message = std::to_string(boot_control_hal->getNumberSlots());
*message = std::to_string(boot_control_hal->GetNumSlots());
}
return true;
}
@ -222,7 +219,7 @@ bool GetSlotSuccessful(FastbootDevice* device, const std::vector<std::string>& a
*message = "Missing argument";
return false;
}
Slot slot;
int32_t slot = -1;
if (!GetSlotNumber(args[0], &slot)) {
*message = "Invalid slot";
return false;
@ -232,7 +229,7 @@ bool GetSlotSuccessful(FastbootDevice* device, const std::vector<std::string>& a
*message = "Device has no slots";
return false;
}
if (boot_control_hal->isSlotMarkedSuccessful(slot) != BoolResult::TRUE) {
if (boot_control_hal->IsSlotMarkedSuccessful(slot).value_or(false)) {
*message = "no";
} else {
*message = "yes";
@ -246,7 +243,7 @@ bool GetSlotUnbootable(FastbootDevice* device, const std::vector<std::string>& a
*message = "Missing argument";
return false;
}
Slot slot;
int32_t slot = -1;
if (!GetSlotNumber(args[0], &slot)) {
*message = "Invalid slot";
return false;
@ -256,7 +253,7 @@ bool GetSlotUnbootable(FastbootDevice* device, const std::vector<std::string>& a
*message = "Device has no slots";
return false;
}
if (boot_control_hal->isSlotBootable(slot) != BoolResult::TRUE) {
if (!boot_control_hal->IsSlotBootable(slot).value_or(false)) {
*message = "yes";
} else {
*message = "no";

View file

@ -74,6 +74,8 @@ cc_defaults {
shared_libs: [
"android.hardware.boot@1.0",
"android.hardware.boot@1.1",
"android.hardware.boot-V1-ndk",
"libboot_control_client",
],
}
@ -233,6 +235,7 @@ cc_defaults {
static_libs: [
"android.hardware.boot@1.0",
"android.hardware.boot@1.1",
"android.hardware.boot-V1-ndk",
"libbrotli",
"libc++fs",
"libfs_mgr_binder",
@ -261,7 +264,7 @@ cc_defaults {
cc_test {
name: "vts_libsnapshot_test",
defaults: ["libsnapshot_test_defaults"],
defaults: ["libsnapshot_test_defaults", "libsnapshot_hal_deps"],
}
sh_test {
@ -309,8 +312,6 @@ cc_binary {
"update_metadata-protos",
],
shared_libs: [
"android.hardware.boot@1.0",
"android.hardware.boot@1.1",
"libbase",
"libext2_uuid",
"libext4_utils",

View file

@ -23,8 +23,9 @@ namespace android {
namespace snapshot {
#ifdef LIBSNAPSHOT_USE_HAL
using android::hardware::boot::V1_0::BoolResult;
using android::hardware::boot::V1_0::CommandResult;
using android::hal::BootControlClient;
using android::hal::BootControlVersion;
using android::hal::CommandResult;
#endif
using namespace std::chrono_literals;
@ -63,16 +64,16 @@ bool DeviceInfo::IsOverlayfsSetup() const {
#ifdef LIBSNAPSHOT_USE_HAL
bool DeviceInfo::EnsureBootHal() {
if (!boot_control_) {
auto hal = android::hardware::boot::V1_0::IBootControl::getService();
auto hal = BootControlClient::WaitForService();
if (!hal) {
LOG(ERROR) << "Could not find IBootControl HAL";
return false;
}
boot_control_ = android::hardware::boot::V1_1::IBootControl::castFrom(hal);
if (!boot_control_) {
if (hal->GetVersion() < BootControlVersion::BOOTCTL_V1_1) {
LOG(ERROR) << "Could not find IBootControl 1.1 HAL";
return false;
}
boot_control_ = std::move(hal);
}
return true;
}
@ -83,8 +84,9 @@ bool DeviceInfo::SetBootControlMergeStatus([[maybe_unused]] MergeStatus status)
if (!EnsureBootHal()) {
return false;
}
if (!boot_control_->setSnapshotMergeStatus(status)) {
LOG(ERROR) << "Unable to set the snapshot merge status";
const auto ret = boot_control_->SetSnapshotMergeStatus(status);
if (!ret.IsOk()) {
LOG(ERROR) << "Unable to set the snapshot merge status " << ret.errMsg;
return false;
}
return true;
@ -108,9 +110,7 @@ bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) {
return false;
}
CommandResult result = {};
auto cb = [&](CommandResult r) -> void { result = r; };
boot_control_->setSlotAsUnbootable(slot, cb);
CommandResult result = boot_control_->MarkSlotUnbootable(slot);
if (!result.success) {
LOG(ERROR) << "Error setting slot " << slot << " unbootable: " << result.errMsg;
return false;

View file

@ -17,7 +17,7 @@
#include <string>
#ifdef LIBSNAPSHOT_USE_HAL
#include <android/hardware/boot/1.1/IBootControl.h>
#include <BootControlClient.h>
#endif
#include <liblp/partition_opener.h>
#include <libsnapshot/snapshot.h>
@ -26,7 +26,7 @@ namespace android {
namespace snapshot {
class DeviceInfo final : public SnapshotManager::IDeviceInfo {
using MergeStatus = android::hardware::boot::V1_1::MergeStatus;
using MergeStatus = ::aidl::android::hardware::boot::MergeStatus;
public:
std::string GetMetadataDir() const override;
@ -50,7 +50,7 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo {
android::fs_mgr::PartitionOpener opener_;
bool first_stage_init_ = false;
#ifdef LIBSNAPSHOT_USE_HAL
android::sp<android::hardware::boot::V1_1::IBootControl> boot_control_;
std::unique_ptr<::android::hal::BootControlClient> boot_control_;
#endif
};

View file

@ -46,6 +46,10 @@
#define DEFINED_FRIEND_TEST
#endif
namespace aidl::android::hardware::boot {
enum class MergeStatus;
}
namespace android {
namespace fiemap {
@ -59,13 +63,6 @@ class IPartitionOpener;
// Forward declare IBootControl types since we cannot include only the headers
// with Soong. Note: keep the enum width in sync.
namespace hardware {
namespace boot {
namespace V1_1 {
enum class MergeStatus : int32_t;
} // namespace V1_1
} // namespace boot
} // namespace hardware
namespace snapshot {
@ -95,6 +92,7 @@ class ISnapshotManager {
class IDeviceInfo {
public:
using IImageManager = android::fiemap::IImageManager;
using MergeStatus = aidl::android::hardware::boot::MergeStatus;
virtual ~IDeviceInfo() {}
virtual std::string GetMetadataDir() const = 0;
@ -103,8 +101,7 @@ class ISnapshotManager {
virtual std::string GetSuperDevice(uint32_t slot) const = 0;
virtual const android::fs_mgr::IPartitionOpener& GetPartitionOpener() const = 0;
virtual bool IsOverlayfsSetup() const = 0;
virtual bool SetBootControlMergeStatus(
android::hardware::boot::V1_1::MergeStatus status) = 0;
virtual bool SetBootControlMergeStatus(MergeStatus status) = 0;
virtual bool SetSlotAsUnbootable(unsigned int slot) = 0;
virtual bool IsRecovery() const = 0;
virtual bool IsTestDevice() const { return false; }
@ -311,7 +308,7 @@ class SnapshotManager final : public ISnapshotManager {
using LpMetadata = android::fs_mgr::LpMetadata;
using MetadataBuilder = android::fs_mgr::MetadataBuilder;
using DeltaArchiveManifest = chromeos_update_engine::DeltaArchiveManifest;
using MergeStatus = android::hardware::boot::V1_1::MergeStatus;
using MergeStatus = aidl::android::hardware::boot::MergeStatus;
using FiemapStatus = android::fiemap::FiemapStatus;
friend class SnapshotMergeStats;

View file

@ -20,7 +20,6 @@
#include <unordered_set>
#include <android-base/file.h>
#include <android/hardware/boot/1.1/IBootControl.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <libfiemap/image_manager.h>
@ -33,10 +32,10 @@
namespace android {
namespace snapshot {
using aidl::android::hardware::boot::MergeStatus;
using android::fs_mgr::IPropertyFetcher;
using android::fs_mgr::MetadataBuilder;
using android::fs_mgr::testing::MockPropertyFetcher;
using android::hardware::boot::V1_1::MergeStatus;
using chromeos_update_engine::DeltaArchiveManifest;
using chromeos_update_engine::PartitionUpdate;
using testing::_;

View file

@ -53,6 +53,7 @@
namespace android {
namespace snapshot {
using aidl::android::hardware::boot::MergeStatus;
using android::base::unique_fd;
using android::dm::DeviceMapper;
using android::dm::DmDeviceState;
@ -72,7 +73,6 @@ using android::fs_mgr::GetPartitionName;
using android::fs_mgr::LpMetadata;
using android::fs_mgr::MetadataBuilder;
using android::fs_mgr::SlotNumberForSlotSuffix;
using android::hardware::boot::V1_1::MergeStatus;
using chromeos_update_engine::DeltaArchiveManifest;
using chromeos_update_engine::Extent;
using chromeos_update_engine::FileDescriptor;
@ -2274,8 +2274,8 @@ bool SnapshotManager::MapAllPartitions(LockedFile* lock, const std::string& supe
.block_device = super_device,
.metadata = metadata.get(),
.partition = &partition,
.partition_opener = &opener,
.timeout_ms = timeout_ms,
.partition_opener = &opener,
};
if (!MapPartitionWithSnapshot(lock, std::move(params), SnapshotContext::Mount, nullptr)) {
return false;
@ -2752,8 +2752,8 @@ bool SnapshotManager::MapAllSnapshots(const std::chrono::milliseconds& timeout_m
.block_device = super_device,
.metadata = metadata.get(),
.partition_name = snapshot,
.partition_opener = &opener,
.timeout_ms = timeout_ms,
.partition_opener = &opener,
};
if (!MapPartitionWithSnapshot(lock.get(), std::move(params), SnapshotContext::Mount,
nullptr)) {

View file

@ -29,6 +29,7 @@
// by SnapshotManager.
#include "android/snapshot/snapshot_fuzz.pb.h"
#include "libsnapshot/snapshot.h"
namespace android::snapshot {
@ -94,6 +95,7 @@ class SnapshotFuzzEnv {
class SnapshotFuzzDeviceInfo : public ISnapshotManager::IDeviceInfo {
public:
using MergeStatus = ISnapshotManager::IDeviceInfo::MergeStatus;
// Client is responsible for maintaining the lifetime of |data|.
SnapshotFuzzDeviceInfo(SnapshotFuzzEnv* env, const FuzzDeviceInfoData& data,
std::unique_ptr<TestPartitionOpener>&& partition_opener,
@ -118,7 +120,7 @@ class SnapshotFuzzDeviceInfo : public ISnapshotManager::IDeviceInfo {
std::string GetSlotSuffix() const override { return CurrentSlotIsA() ? "_a" : "_b"; }
std::string GetOtherSlotSuffix() const override { return CurrentSlotIsA() ? "_b" : "_a"; }
bool IsOverlayfsSetup() const override { return data_->is_overlayfs_setup(); }
bool SetBootControlMergeStatus(android::hardware::boot::V1_1::MergeStatus) override {
bool SetBootControlMergeStatus(MergeStatus) override {
return data_->allow_set_boot_control_merge_status();
}
bool SetSlotAsUnbootable(unsigned int) override {

View file

@ -26,6 +26,7 @@
#include <future>
#include <iostream>
#include <aidl/android/hardware/boot/MergeStatus.h>
#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/properties.h>