From e8f6a126fb8800a075580664a751db4fec5ffcfb Mon Sep 17 00:00:00 2001 From: Akilesh Kailash Date: Tue, 18 Oct 2022 06:56:22 +0000 Subject: [PATCH 1/2] libsnapshot: Refactor code Move all files related to libsnapshot_cow library to a seperate directory. Libsnapshot directory is getting crowded and we will be adding more files to this library with async writes. No changes to any logic. Bug: 254188450 Test: Full OTA on Pixel Signed-off-by: Akilesh Kailash Change-Id: If84ff730d477c85a8ef57864d2185f2f897cf8e0 --- fs_mgr/libsnapshot/Android.bp | 12 ++++++------ .../{ => libsnapshot_cow}/cow_api_test.cpp | 0 .../{ => libsnapshot_cow}/cow_decompress.cpp | 0 .../{ => libsnapshot_cow}/cow_decompress.h | 0 .../libsnapshot/{ => libsnapshot_cow}/cow_format.cpp | 0 .../libsnapshot/{ => libsnapshot_cow}/cow_reader.cpp | 0 .../libsnapshot/{ => libsnapshot_cow}/cow_writer.cpp | 0 .../{ => libsnapshot_cow}/inspect_cow.cpp | 0 8 files changed, 6 insertions(+), 6 deletions(-) rename fs_mgr/libsnapshot/{ => libsnapshot_cow}/cow_api_test.cpp (100%) rename fs_mgr/libsnapshot/{ => libsnapshot_cow}/cow_decompress.cpp (100%) rename fs_mgr/libsnapshot/{ => libsnapshot_cow}/cow_decompress.h (100%) rename fs_mgr/libsnapshot/{ => libsnapshot_cow}/cow_format.cpp (100%) rename fs_mgr/libsnapshot/{ => libsnapshot_cow}/cow_reader.cpp (100%) rename fs_mgr/libsnapshot/{ => libsnapshot_cow}/cow_writer.cpp (100%) rename fs_mgr/libsnapshot/{ => libsnapshot_cow}/inspect_cow.cpp (100%) diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index d5e85e60f..a47a24c1c 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -173,10 +173,10 @@ cc_library_static { "libsnapshot_cow_defaults", ], srcs: [ - "cow_decompress.cpp", - "cow_reader.cpp", - "cow_writer.cpp", - "cow_format.cpp", + "libsnapshot_cow/cow_decompress.cpp", + "libsnapshot_cow/cow_reader.cpp", + "libsnapshot_cow/cow_writer.cpp", + "libsnapshot_cow/cow_format.cpp", ], host_supported: true, recovery_available: true, @@ -424,7 +424,7 @@ cc_test { "libsnapshot_cow_defaults", ], srcs: [ - "cow_api_test.cpp", + "libsnapshot_cow/cow_api_test.cpp", ], cflags: [ "-D_FILE_OFFSET_BITS=64", @@ -546,7 +546,7 @@ cc_binary { shared_libs: [ ], srcs: [ - "inspect_cow.cpp", + "libsnapshot_cow/inspect_cow.cpp", ], } diff --git a/fs_mgr/libsnapshot/cow_api_test.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_api_test.cpp similarity index 100% rename from fs_mgr/libsnapshot/cow_api_test.cpp rename to fs_mgr/libsnapshot/libsnapshot_cow/cow_api_test.cpp diff --git a/fs_mgr/libsnapshot/cow_decompress.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_decompress.cpp similarity index 100% rename from fs_mgr/libsnapshot/cow_decompress.cpp rename to fs_mgr/libsnapshot/libsnapshot_cow/cow_decompress.cpp diff --git a/fs_mgr/libsnapshot/cow_decompress.h b/fs_mgr/libsnapshot/libsnapshot_cow/cow_decompress.h similarity index 100% rename from fs_mgr/libsnapshot/cow_decompress.h rename to fs_mgr/libsnapshot/libsnapshot_cow/cow_decompress.h diff --git a/fs_mgr/libsnapshot/cow_format.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_format.cpp similarity index 100% rename from fs_mgr/libsnapshot/cow_format.cpp rename to fs_mgr/libsnapshot/libsnapshot_cow/cow_format.cpp diff --git a/fs_mgr/libsnapshot/cow_reader.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp similarity index 100% rename from fs_mgr/libsnapshot/cow_reader.cpp rename to fs_mgr/libsnapshot/libsnapshot_cow/cow_reader.cpp diff --git a/fs_mgr/libsnapshot/cow_writer.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_writer.cpp similarity index 100% rename from fs_mgr/libsnapshot/cow_writer.cpp rename to fs_mgr/libsnapshot/libsnapshot_cow/cow_writer.cpp diff --git a/fs_mgr/libsnapshot/inspect_cow.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp similarity index 100% rename from fs_mgr/libsnapshot/inspect_cow.cpp rename to fs_mgr/libsnapshot/libsnapshot_cow/inspect_cow.cpp From 1119e8e018d0a371a2a794c02c9b78eca0666271 Mon Sep 17 00:00:00 2001 From: Akilesh Kailash Date: Tue, 18 Oct 2022 16:45:18 +0000 Subject: [PATCH 2/2] libsnapshot: Refactor compress function Move compress() function to a dedicated file. This is in preparation for variable block size compression and async writes. No change in functional logic. Bug: 254188450 Test: Full OTA Pixel Signed-off-by: Akilesh Kailash Change-Id: I7681e9a4d884eac1ccbf8adeb1fc6bd1a9fedfa6 --- fs_mgr/libsnapshot/Android.bp | 1 + .../libsnapshot_cow/cow_compress.cpp | 98 +++++++++++++++++++ .../libsnapshot_cow/cow_writer.cpp | 61 ------------ 3 files changed, 99 insertions(+), 61 deletions(-) create mode 100644 fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index a47a24c1c..474d4828c 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -177,6 +177,7 @@ cc_library_static { "libsnapshot_cow/cow_reader.cpp", "libsnapshot_cow/cow_writer.cpp", "libsnapshot_cow/cow_format.cpp", + "libsnapshot_cow/cow_compress.cpp", ], host_supported: true, recovery_available: true, diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp new file mode 100644 index 000000000..e58f45ac7 --- /dev/null +++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp @@ -0,0 +1,98 @@ +// +// Copyright (C) 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace android { +namespace snapshot { + +std::basic_string CowWriter::Compress(const void* data, size_t length) { + switch (compression_) { + case kCowCompressGz: { + const auto bound = compressBound(length); + std::basic_string buffer(bound, '\0'); + + uLongf dest_len = bound; + auto rv = compress2(buffer.data(), &dest_len, reinterpret_cast(data), + length, Z_BEST_COMPRESSION); + if (rv != Z_OK) { + LOG(ERROR) << "compress2 returned: " << rv; + return {}; + } + buffer.resize(dest_len); + return buffer; + } + case kCowCompressBrotli: { + const auto bound = BrotliEncoderMaxCompressedSize(length); + if (!bound) { + LOG(ERROR) << "BrotliEncoderMaxCompressedSize returned 0"; + return {}; + } + std::basic_string buffer(bound, '\0'); + + size_t encoded_size = bound; + auto rv = BrotliEncoderCompress( + BROTLI_DEFAULT_QUALITY, BROTLI_DEFAULT_WINDOW, BROTLI_DEFAULT_MODE, length, + reinterpret_cast(data), &encoded_size, buffer.data()); + if (!rv) { + LOG(ERROR) << "BrotliEncoderCompress failed"; + return {}; + } + buffer.resize(encoded_size); + return buffer; + } + case kCowCompressLz4: { + const auto bound = LZ4_compressBound(length); + if (!bound) { + LOG(ERROR) << "LZ4_compressBound returned 0"; + return {}; + } + std::basic_string buffer(bound, '\0'); + + const auto compressed_size = LZ4_compress_default( + static_cast(data), reinterpret_cast(buffer.data()), length, + buffer.size()); + if (compressed_size <= 0) { + LOG(ERROR) << "LZ4_compress_default failed, input size: " << length + << ", compression bound: " << bound << ", ret: " << compressed_size; + return {}; + } + buffer.resize(compressed_size); + return buffer; + } + default: + LOG(ERROR) << "unhandled compression type: " << compression_; + break; + } + return {}; +} + +} // namespace snapshot +} // namespace android diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_writer.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_writer.cpp index 7281fc209..e4f019ee5 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_writer.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_writer.cpp @@ -404,67 +404,6 @@ bool CowWriter::EmitClusterIfNeeded() { return true; } -std::basic_string CowWriter::Compress(const void* data, size_t length) { - switch (compression_) { - case kCowCompressGz: { - const auto bound = compressBound(length); - std::basic_string buffer(bound, '\0'); - - uLongf dest_len = bound; - auto rv = compress2(buffer.data(), &dest_len, reinterpret_cast(data), - length, Z_BEST_COMPRESSION); - if (rv != Z_OK) { - LOG(ERROR) << "compress2 returned: " << rv; - return {}; - } - buffer.resize(dest_len); - return buffer; - } - case kCowCompressBrotli: { - const auto bound = BrotliEncoderMaxCompressedSize(length); - if (!bound) { - LOG(ERROR) << "BrotliEncoderMaxCompressedSize returned 0"; - return {}; - } - std::basic_string buffer(bound, '\0'); - - size_t encoded_size = bound; - auto rv = BrotliEncoderCompress( - BROTLI_DEFAULT_QUALITY, BROTLI_DEFAULT_WINDOW, BROTLI_DEFAULT_MODE, length, - reinterpret_cast(data), &encoded_size, buffer.data()); - if (!rv) { - LOG(ERROR) << "BrotliEncoderCompress failed"; - return {}; - } - buffer.resize(encoded_size); - return buffer; - } - case kCowCompressLz4: { - const auto bound = LZ4_compressBound(length); - if (!bound) { - LOG(ERROR) << "LZ4_compressBound returned 0"; - return {}; - } - std::basic_string buffer(bound, '\0'); - - const auto compressed_size = LZ4_compress_default( - static_cast(data), reinterpret_cast(buffer.data()), length, - buffer.size()); - if (compressed_size <= 0) { - LOG(ERROR) << "LZ4_compress_default failed, input size: " << length - << ", compression bound: " << bound << ", ret: " << compressed_size; - return {}; - } - buffer.resize(compressed_size); - return buffer; - } - default: - LOG(ERROR) << "unhandled compression type: " << compression_; - break; - } - return {}; -} - // TODO: Fix compilation issues when linking libcrypto library // when snapuserd is compiled as part of ramdisk. static void SHA256(const void*, size_t, uint8_t[]) {