Skip to content

Commit

Permalink
liblp: Allow flashing to readonly logical partitions.
Browse files Browse the repository at this point in the history
By default, logical partitions with the readonly flag are created with a
readonly device. This change allows callers of CreateLogicalPartition
to create writable devices so they can still be flashed.

Bug: 78793464
Test: fastboot flash product_services works with fastbootd
Change-Id: Ia8d2761a3067e3b62815acbf0b6fb7f033072ba2
  • Loading branch information
dvandercorp committed Aug 6, 2018
1 parent f502182 commit 4d71d85
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 6 deletions.
14 changes: 10 additions & 4 deletions fs_mgr/fs_mgr_dm_linear.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,17 @@ static bool CreateDmTable(const std::string& block_device, const LpMetadata& met
}

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

DmTable table;
if (!CreateDmTable(block_device, metadata, partition, &table)) {
return false;
}
if (force_writable) {
table.set_readonly(false);
}
std::string name = GetPartitionName(partition);
if (!dm.CreateDevice(name, table)) {
return false;
Expand All @@ -107,7 +111,7 @@ bool CreateLogicalPartitions(const std::string& block_device) {
}
for (const auto& partition : metadata->partitions) {
std::string path;
if (!CreateLogicalPartition(block_device, *metadata.get(), partition, &path)) {
if (!CreateLogicalPartition(block_device, *metadata.get(), partition, false, &path)) {
LERROR << "Could not create logical partition: " << GetPartitionName(partition);
return false;
}
Expand All @@ -116,15 +120,17 @@ bool CreateLogicalPartitions(const std::string& block_device) {
}

bool CreateLogicalPartition(const std::string& block_device, uint32_t metadata_slot,
const std::string& partition_name, std::string* path) {
const std::string& partition_name, bool force_writable,
std::string* path) {
auto metadata = ReadMetadata(block_device.c_str(), metadata_slot);
if (!metadata) {
LOG(ERROR) << "Could not read partition table.";
return true;
}
for (const auto& partition : metadata->partitions) {
if (GetPartitionName(partition) == partition_name) {
return CreateLogicalPartition(block_device, *metadata.get(), partition, path);
return CreateLogicalPartition(block_device, *metadata.get(), partition, force_writable,
path);
}
}
LERROR << "Could not find any partition with name: " << partition_name;
Expand Down
6 changes: 4 additions & 2 deletions fs_mgr/include/fs_mgr_dm_linear.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@ bool CreateLogicalPartitions(const std::string& block_device);

// Create a block device for a single logical partition, given metadata and
// the partition name. On success, a path to the partition's block device is
// returned.
// returned. If |force_writable| is true, the "readonly" flag will be ignored
// so the partition can be flashed.
bool CreateLogicalPartition(const std::string& block_device, uint32_t metadata_slot,
const std::string& partition_name, std::string* path);
const std::string& partition_name, bool force_writable,
std::string* path);

// Destroy the block device for a logical partition, by name.
bool DestroyLogicalPartition(const std::string& name);
Expand Down

0 comments on commit 4d71d85

Please sign in to comment.