diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_format.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_format.h index bfa8f6bea..b271dad6c 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/cow_format.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_format.h @@ -91,6 +91,18 @@ struct CowHeader { // Scratch space used during merge uint32_t buffer_size; + +} __attribute__((packed)); + +struct CowHeaderV3 : public CowHeader { + // Location of sequence buffer in COW. + uint64_t sequence_buffer_offset; + // Size, in bytes, of the CowResumePoint buffer. + uint32_t resume_buffer_size; + // Size, in bytes, of the CowOperation buffer. + uint32_t op_buffer_size; + // Compression Algorithm + uint32_t compression_algorithm; } __attribute__((packed)); // This structure is the same size of a normal Operation, but is repurposed for the footer. diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_base.h b/fs_mgr/libsnapshot/libsnapshot_cow/writer_base.h index cdf622268..709b248e6 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_base.h +++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_base.h @@ -63,7 +63,6 @@ class CowWriterBase : public ICowWriter { bool ValidateNewBlock(uint64_t new_block); CowOptions options_; - CowHeader header_{}; android::base::unique_fd fd_; bool is_dev_null_ = false; diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.cpp index e51dbde63..a6f449faa 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.cpp @@ -243,7 +243,7 @@ bool CowWriterV2::OpenForWrite() { // Headers are not complete, but this ensures the file is at the right // position. - if (!android::base::WriteFully(fd_, &header_, sizeof(header_))) { + if (!android::base::WriteFully(fd_, &header_, sizeof(CowHeader))) { PLOG(ERROR) << "write failed"; return false; } @@ -262,7 +262,7 @@ bool CowWriterV2::OpenForWrite() { return false; } - if (lseek(fd_.get(), sizeof(header_) + header_.buffer_size, SEEK_SET) < 0) { + if (lseek(fd_.get(), sizeof(CowHeader) + header_.buffer_size, SEEK_SET) < 0) { PLOG(ERROR) << "lseek failed"; return false; } diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h index ce97b0182..24170ebbd 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h +++ b/fs_mgr/libsnapshot/libsnapshot_cow/writer_v2.h @@ -63,6 +63,7 @@ class CowWriterV2 : public CowWriterBase { private: CowFooter footer_{}; + CowHeader header_{}; CowCompression compression_; // in the case that we are using one thread for compression, we can store and re-use the same // compressor