Merge "Store lz4 blocks as uncompressed if compression makes data larger"
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp
index e58f45a..0eb231b 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_compress.cpp
@@ -84,7 +84,13 @@
<< ", compression bound: " << bound << ", ret: " << compressed_size;
return {};
}
- buffer.resize(compressed_size);
+ // Don't run compression if the compressed output is larger
+ if (compressed_size >= length) {
+ buffer.resize(length);
+ memcpy(buffer.data(), data, length);
+ } else {
+ buffer.resize(compressed_size);
+ }
return buffer;
}
default:
diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/cow_decompress.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/cow_decompress.cpp
index a4d2277..139a29f 100644
--- a/fs_mgr/libsnapshot/libsnapshot_cow/cow_decompress.cpp
+++ b/fs_mgr/libsnapshot/libsnapshot_cow/cow_decompress.cpp
@@ -273,6 +273,18 @@
<< actual_buffer_size << " bytes";
return false;
}
+ // If input size is same as output size, then input is uncompressed.
+ if (stream_->Size() == output_size) {
+ size_t bytes_read = 0;
+ stream_->Read(output_buffer, output_size, &bytes_read);
+ if (bytes_read != output_size) {
+ LOG(ERROR) << "Failed to read all input at once. Expected: " << output_size
+ << " actual: " << bytes_read;
+ return false;
+ }
+ sink_->ReturnData(output_buffer, output_size);
+ return true;
+ }
std::string input_buffer;
input_buffer.resize(stream_->Size());
size_t bytes_read = 0;