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

Commit f1496d33 authored by Alistair Strachan's avatar Alistair Strachan Committed by android-build-merger
Browse files

Merge "Handle renamed "super" device correctly" am: 5d55580f am: 16e6fe81

am: 21a8fca4

Change-Id: I6f3ee3cd119c16863119f36cf0f6b0e14fa4be5a
parents 279e04e8 21a8fca4
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -51,12 +51,20 @@ using DmTarget = android::dm::DmTarget;
using DmTargetZero = android::dm::DmTargetZero;
using DmTargetLinear = android::dm::DmTargetLinear;

bool GetPhysicalPartitionDevicePath(const LpMetadataBlockDevice& block_device,
static bool GetPhysicalPartitionDevicePath(const LpMetadata& metadata,
                                           const LpMetadataBlockDevice& block_device,
                                           const std::string& super_device,
                                           std::string* result) {
    // Note: device-mapper will not accept symlinks, so we must use realpath
    // here.
    std::string name = GetBlockDevicePartitionName(block_device);
    std::string path = "/dev/block/by-name/" + name;
    // If the super device is the source of this block device's metadata,
    // make sure we use the correct super device (and not just "super",
    // which might not exist.)
    if (GetMetadataSuperBlockDevice(metadata) == &block_device) {
        path = super_device;
    }
    if (!android::base::Realpath(path, result)) {
        PERROR << "realpath: " << path;
        return false;
@@ -65,7 +73,7 @@ bool GetPhysicalPartitionDevicePath(const LpMetadataBlockDevice& block_device,
}

static bool CreateDmTable(const LpMetadata& metadata, const LpMetadataPartition& partition,
                          DmTable* table) {
                          const std::string& super_device, DmTable* table) {
    uint64_t sector = 0;
    for (size_t i = 0; i < partition.num_extents; i++) {
        const auto& extent = metadata.extents[partition.first_extent_index + i];
@@ -77,7 +85,7 @@ static bool CreateDmTable(const LpMetadata& metadata, const LpMetadataPartition&
            case LP_TARGET_TYPE_LINEAR: {
                const auto& block_device = metadata.block_devices[extent.target_source];
                std::string path;
                if (!GetPhysicalPartitionDevicePath(block_device, &path)) {
                if (!GetPhysicalPartitionDevicePath(metadata, block_device, super_device, &path)) {
                    LOG(ERROR) << "Unable to complete device-mapper table, unknown block device";
                    return false;
                }
@@ -102,11 +110,11 @@ static bool CreateDmTable(const LpMetadata& metadata, const LpMetadataPartition&

static bool CreateLogicalPartition(const LpMetadata& metadata, const LpMetadataPartition& partition,
                                   bool force_writable, const std::chrono::milliseconds& timeout_ms,
                                   std::string* path) {
                                   const std::string& super_device, std::string* path) {
    DeviceMapper& dm = DeviceMapper::Instance();

    DmTable table;
    if (!CreateDmTable(metadata, partition, &table)) {
    if (!CreateDmTable(metadata, partition, super_device, &table)) {
        return false;
    }
    if (force_writable) {
@@ -137,7 +145,7 @@ bool CreateLogicalPartitions(const std::string& block_device) {
        LOG(ERROR) << "Could not read partition table.";
        return true;
    }
    return CreateLogicalPartitions(*metadata.get());
    return CreateLogicalPartitions(*metadata.get(), block_device);
}

std::unique_ptr<LpMetadata> ReadCurrentMetadata(const std::string& block_device) {
@@ -145,14 +153,14 @@ std::unique_ptr<LpMetadata> ReadCurrentMetadata(const std::string& block_device)
    return ReadMetadata(block_device.c_str(), slot);
}

bool CreateLogicalPartitions(const LpMetadata& metadata) {
bool CreateLogicalPartitions(const LpMetadata& metadata, const std::string& super_device) {
    for (const auto& partition : metadata.partitions) {
        if (!partition.num_extents) {
            LINFO << "Skipping zero-length logical partition: " << GetPartitionName(partition);
            continue;
        }
        std::string path;
        if (!CreateLogicalPartition(metadata, partition, false, {}, &path)) {
        if (!CreateLogicalPartition(metadata, partition, false, {}, super_device, &path)) {
            LERROR << "Could not create logical partition: " << GetPartitionName(partition);
            return false;
        }
@@ -171,7 +179,7 @@ bool CreateLogicalPartition(const std::string& block_device, uint32_t metadata_s
    for (const auto& partition : metadata->partitions) {
        if (GetPartitionName(partition) == partition_name) {
            return CreateLogicalPartition(*metadata.get(), partition, force_writable, timeout_ms,
                                          path);
                                          block_device, path);
        }
    }
    LERROR << "Could not find any partition with name: " << partition_name;
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ std::unique_ptr<LpMetadata> ReadCurrentMetadata(const std::string& block_device)

// Create block devices for all logical partitions in the given metadata. The
// metadata must have been read from the current slot.
bool CreateLogicalPartitions(const LpMetadata& metadata);
bool CreateLogicalPartitions(const LpMetadata& metadata, const std::string& block_device);

// Create block devices for all logical partitions. This is a convenience
// method for ReadMetadata and CreateLogicalPartitions.
+4 −3
Original line number Diff line number Diff line
@@ -252,9 +252,10 @@ bool FirstStageMount::InitRequiredDevices() {
}

bool FirstStageMount::InitDmLinearBackingDevices(const android::fs_mgr::LpMetadata& metadata) {
    auto partition_names = GetBlockDevicePartitionNames(metadata);
    auto partition_names = android::fs_mgr::GetBlockDevicePartitionNames(metadata);
    for (const auto& partition_name : partition_names) {
        if (partition_name == lp_metadata_partition_) {
        const auto super_device = android::fs_mgr::GetMetadataSuperBlockDevice(metadata);
        if (partition_name == android::fs_mgr::GetBlockDevicePartitionName(*super_device)) {
            continue;
        }
        required_devices_partition_names_.emplace(partition_name);
@@ -292,7 +293,7 @@ bool FirstStageMount::CreateLogicalPartitions() {
    if (!InitDmLinearBackingDevices(*metadata.get())) {
        return false;
    }
    return android::fs_mgr::CreateLogicalPartitions(*metadata.get());
    return android::fs_mgr::CreateLogicalPartitions(*metadata.get(), lp_metadata_partition_);
}

ListenerAction FirstStageMount::HandleBlockDevice(const std::string& name, const Uevent& uevent) {