Merge "liblp: Allow flashing to readonly logical partitions."

This commit is contained in:
Treehugger Robot 2018-08-07 00:28:48 +00:00 committed by Gerrit Code Review
commit a70e2b2ed7
2 changed files with 14 additions and 6 deletions

View file

@ -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, 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(); DeviceMapper& dm = DeviceMapper::Instance();
DmTable table; DmTable table;
if (!CreateDmTable(block_device, metadata, partition, &table)) { if (!CreateDmTable(block_device, metadata, partition, &table)) {
return false; return false;
} }
if (force_writable) {
table.set_readonly(false);
}
std::string name = GetPartitionName(partition); std::string name = GetPartitionName(partition);
if (!dm.CreateDevice(name, table)) { if (!dm.CreateDevice(name, table)) {
return false; return false;
@ -107,7 +111,7 @@ bool CreateLogicalPartitions(const std::string& block_device) {
} }
for (const auto& partition : metadata->partitions) { for (const auto& partition : metadata->partitions) {
std::string path; 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); LERROR << "Could not create logical partition: " << GetPartitionName(partition);
return false; return false;
} }
@ -116,7 +120,8 @@ bool CreateLogicalPartitions(const std::string& block_device) {
} }
bool CreateLogicalPartition(const std::string& block_device, uint32_t metadata_slot, 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); auto metadata = ReadMetadata(block_device.c_str(), metadata_slot);
if (!metadata) { if (!metadata) {
LOG(ERROR) << "Could not read partition table."; LOG(ERROR) << "Could not read partition table.";
@ -124,7 +129,8 @@ bool CreateLogicalPartition(const std::string& block_device, uint32_t metadata_s
} }
for (const auto& partition : metadata->partitions) { for (const auto& partition : metadata->partitions) {
if (GetPartitionName(partition) == partition_name) { 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; LERROR << "Could not find any partition with name: " << partition_name;

View file

@ -41,9 +41,11 @@ bool CreateLogicalPartitions(const std::string& block_device);
// Create a block device for a single logical partition, given metadata and // 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 // 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, 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. // Destroy the block device for a logical partition, by name.
bool DestroyLogicalPartition(const std::string& name); bool DestroyLogicalPartition(const std::string& name);