Merge "libsnapshot: Fetch device size from header" into main am: 7428705371

Original change: https://android-review.googlesource.com/c/platform/system/core/+/2974622

Change-Id: I42f1f048d6a8298c8cb82f7f3eef710998598743
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Akilesh Kailash 2024-02-24 07:17:43 +00:00 committed by Automerger Merge Worker
commit ea798470a0

View file

@ -508,8 +508,6 @@ bool SnapshotManager::MapDmUserCow(LockedFile* lock, const std::string& name,
// When snapshots are on current slot, we determine the size
// of block device based on the number of COW operations. We cannot
// use base device as it will be from older image.
size_t num_ops = 0;
uint64_t dev_sz = 0;
unique_fd fd(open(cow_file.c_str(), O_RDONLY | O_CLOEXEC));
if (fd < 0) {
PLOG(ERROR) << "Failed to open " << cow_file;
@ -522,13 +520,18 @@ bool SnapshotManager::MapDmUserCow(LockedFile* lock, const std::string& name,
return false;
}
uint64_t dev_sz = 0;
const auto& header = reader.GetHeader();
if (header.prefix.major_version > 2) {
LOG(ERROR) << "COW format not supported";
return false;
if (header.prefix.major_version == 2) {
const size_t num_ops = reader.get_num_total_data_ops();
dev_sz = (num_ops * header.block_size);
} else {
// create_snapshot will skip in-place copy ops. Hence, fetch this
// information directly from v3 header.
const auto& v3_header = reader.header_v3();
dev_sz = v3_header.op_count_max * v3_header.block_size;
}
num_ops = reader.get_num_total_data_ops();
dev_sz = (num_ops * header.block_size);
base_sectors = dev_sz >> 9;
} else {
// For userspace snapshots, the size of the base device is taken as the