Merge "liblp: Force 10.0 metadata on downgrade to Q." into rvc-dev
This commit is contained in:
commit
2ce3ddfee1
|
@ -204,11 +204,18 @@ std::unique_ptr<MetadataBuilder> MetadataBuilder::NewForUpdate(const IPartitionO
|
|||
}
|
||||
}
|
||||
|
||||
if (IPropertyFetcher::GetInstance()->GetBoolProperty("ro.virtual_ab.enabled", false) &&
|
||||
!always_keep_source_slot) {
|
||||
if (!UpdateMetadataForInPlaceSnapshot(metadata.get(), source_slot_number,
|
||||
target_slot_number)) {
|
||||
return nullptr;
|
||||
if (IPropertyFetcher::GetInstance()->GetBoolProperty("ro.virtual_ab.enabled", false)) {
|
||||
if (always_keep_source_slot) {
|
||||
// always_keep_source_slot implies the target build does not support snapshots.
|
||||
// Clear unsupported attributes.
|
||||
SetMetadataHeaderV0(metadata.get());
|
||||
} else {
|
||||
// !always_keep_source_slot implies the target build supports snapshots. Do snapshot
|
||||
// updates.
|
||||
if (!UpdateMetadataForInPlaceSnapshot(metadata.get(), source_slot_number,
|
||||
target_slot_number)) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -209,8 +209,10 @@ class MetadataBuilder {
|
|||
// metadata may not have the target slot's devices listed yet, in which
|
||||
// case, it is automatically upgraded to include all available block
|
||||
// devices.
|
||||
// If |always_keep_source_slot| is set, on a Virtual A/B device, source slot
|
||||
// partitions are kept. This is useful when applying a downgrade package.
|
||||
// If |always_keep_source_slot| is set, on a Virtual A/B device
|
||||
// - source slot partitions are kept.
|
||||
// - UPDATED flag is cleared.
|
||||
// This is useful when applying a downgrade package.
|
||||
static std::unique_ptr<MetadataBuilder> NewForUpdate(const IPartitionOpener& opener,
|
||||
const std::string& source_partition,
|
||||
uint32_t source_slot_number,
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
@ -29,6 +30,7 @@
|
|||
#include <vector>
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
#include <ext4_utils/ext4_utils.h>
|
||||
#include <openssl/sha.h>
|
||||
|
||||
|
@ -285,5 +287,42 @@ bool UpdateMetadataForInPlaceSnapshot(LpMetadata* metadata, uint32_t source_slot
|
|||
return true;
|
||||
}
|
||||
|
||||
inline std::string ToHexString(uint64_t value) {
|
||||
return android::base::StringPrintf("0x%" PRIx64, value);
|
||||
}
|
||||
|
||||
void SetMetadataHeaderV0(LpMetadata* metadata) {
|
||||
if (metadata->header.minor_version <= LP_METADATA_MINOR_VERSION_MIN) {
|
||||
return;
|
||||
}
|
||||
LINFO << "Forcefully setting metadata header version " << LP_METADATA_MAJOR_VERSION << "."
|
||||
<< metadata->header.minor_version << " to " << LP_METADATA_MAJOR_VERSION << "."
|
||||
<< LP_METADATA_MINOR_VERSION_MIN;
|
||||
metadata->header.minor_version = LP_METADATA_MINOR_VERSION_MIN;
|
||||
metadata->header.header_size = sizeof(LpMetadataHeaderV1_0);
|
||||
|
||||
// Retrofit Virtual A/B devices should have version 10.1, so flags shouldn't be set.
|
||||
// Warn if this is the case, but zero it out anyways.
|
||||
if (metadata->header.flags) {
|
||||
LWARN << "Zeroing unexpected flags: " << ToHexString(metadata->header.flags);
|
||||
}
|
||||
|
||||
// Zero out all fields beyond LpMetadataHeaderV0.
|
||||
static_assert(sizeof(metadata->header) > sizeof(LpMetadataHeaderV1_0));
|
||||
memset(reinterpret_cast<uint8_t*>(&metadata->header) + sizeof(LpMetadataHeaderV1_0), 0,
|
||||
sizeof(metadata->header) - sizeof(LpMetadataHeaderV1_0));
|
||||
|
||||
// Clear partition attributes unknown to V0.
|
||||
// On retrofit Virtual A/B devices, UPDATED flag may be set, so only log info here.
|
||||
for (auto& partition : metadata->partitions) {
|
||||
if (partition.attributes & ~LP_PARTITION_ATTRIBUTE_MASK_V0) {
|
||||
LINFO << "Clearing " << GetPartitionName(partition)
|
||||
<< " partition attribute: " << ToHexString(partition.attributes);
|
||||
}
|
||||
|
||||
partition.attributes &= LP_PARTITION_ATTRIBUTE_MASK_V0;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace fs_mgr
|
||||
} // namespace android
|
||||
|
|
|
@ -103,6 +103,10 @@ bool SetBlockReadonly(int fd, bool readonly);
|
|||
bool UpdateMetadataForInPlaceSnapshot(LpMetadata* metadata, uint32_t source_slot_number,
|
||||
uint32_t target_slot_number);
|
||||
|
||||
// Forcefully set metadata header version to 1.0, clearing any incompatible flags and attributes
|
||||
// so that when downgrading to a build with liblp V0, the device still boots.
|
||||
void SetMetadataHeaderV0(LpMetadata* metadata);
|
||||
|
||||
} // namespace fs_mgr
|
||||
} // namespace android
|
||||
|
||||
|
|
Loading…
Reference in New Issue