diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h index 3890b1754..f5995015a 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h @@ -133,6 +133,7 @@ class CowReader final : public ICowReader { CowHeader& GetHeader() override { return header_; } + bool GetRawBytes(const CowOperation* op, void* buffer, size_t len, size_t* read); bool GetRawBytes(uint64_t offset, void* buffer, size_t len, size_t* read); // Returns the total number of data ops that should be merged. This is the diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp index c2a7fdb39..4ac89ae4f 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp @@ -230,7 +230,7 @@ bool CowReader::PrepMergeOps() { size_t seq_len = current_op.data_length / sizeof(uint32_t); merge_op_blocks->resize(merge_op_blocks->size() + seq_len); - if (!GetRawBytes(current_op.source, &merge_op_blocks->data()[num_seqs], + if (!GetRawBytes(¤t_op, &merge_op_blocks->data()[num_seqs], current_op.data_length, &read)) { PLOG(ERROR) << "Failed to read sequence op!"; return false; @@ -516,6 +516,18 @@ std::unique_ptr CowReader::GetMergeOpIter(bool ignore_progress) { ignore_progress ? 0 : merge_op_start_); } +bool CowReader::GetRawBytes(const CowOperation* op, void* buffer, size_t len, size_t* read) { + switch (op->type) { + case kCowSequenceOp: + case kCowReplaceOp: + case kCowXorOp: + return GetRawBytes(op->source, buffer, len, read); + default: + LOG(ERROR) << "Cannot get raw bytes of non-data op: " << *op; + return false; + } +} + bool CowReader::GetRawBytes(uint64_t offset, void* buffer, size_t len, size_t* read) { // Validate the offset, taking care to acknowledge possible overflow of offset+len. if (offset < header_.prefix.header_size || offset >= fd_size_ - sizeof(CowFooter) || diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp index 148ecb006..a6dee4f43 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp @@ -57,7 +57,7 @@ static void ShowBad(CowReader& reader, const struct CowOperation* op) { size_t count; auto buffer = std::make_unique(op->data_length); - if (!reader.GetRawBytes(op->source, buffer.get(), op->data_length, &count)) { + if (!reader.GetRawBytes(op, buffer.get(), op->data_length, &count)) { std::cerr << "Failed to read at all!\n"; } else { std::cout << "The Block data is:\n"; @@ -199,7 +199,7 @@ static bool Inspect(const std::string& path) { std::vector merge_op_blocks; size_t seq_len = op->data_length / sizeof(uint32_t); merge_op_blocks.resize(seq_len); - if (!reader.GetRawBytes(op->source, merge_op_blocks.data(), op->data_length, &read)) { + if (!reader.GetRawBytes(op, merge_op_blocks.data(), op->data_length, &read)) { PLOG(ERROR) << "Failed to read sequence op!"; return false; }