803fb7
From f45b66a348f5778bd391ad1b0a0e09bf5789b415 Mon Sep 17 00:00:00 2001
803fb7
From: Lennart Poettering <lennart@poettering.net>
803fb7
Date: Sat, 24 Oct 2015 13:17:54 +0200
803fb7
Subject: [PATCH] journal: fix error handling when compressing journal objects
803fb7
803fb7
Let's make sure we handle compression errors properly, and don't
803fb7
misunderstand an error for success.
803fb7
803fb7
Also, let's actually compress things if lz4 is enabled.
803fb7
803fb7
Fixes #1662.
803fb7
803fb7
Cherry-picked from: d1afbcd22170e95c79261340071d376fe41fc3af
803fb7
Resolves: #1292447
803fb7
---
803fb7
 src/journal/journal-file.c | 12 +++++++-----
803fb7
 src/journal/journal-file.h |  5 +++++
803fb7
 2 files changed, 12 insertions(+), 5 deletions(-)
803fb7
803fb7
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
803fb7
index f500568fe..a8f92e23a 100644
803fb7
--- a/src/journal/journal-file.c
803fb7
+++ b/src/journal/journal-file.c
803fb7
@@ -1051,23 +1051,25 @@ static int journal_file_append_data(
803fb7
         o->data.hash = htole64(hash);
803fb7
 
803fb7
 #if defined(HAVE_XZ) || defined(HAVE_LZ4)
803fb7
-        if (f->compress_xz &&
803fb7
-            size >= COMPRESSION_SIZE_THRESHOLD) {
803fb7
+        if (JOURNAL_FILE_COMPRESS(f) && size >= COMPRESSION_SIZE_THRESHOLD) {
803fb7
                 size_t rsize;
803fb7
 
803fb7
                 compression = compress_blob(data, size, o->data.payload, &rsize);
803fb7
 
803fb7
-                if (compression) {
803fb7
+                if (compression >= 0) {
803fb7
                         o->object.size = htole64(offsetof(Object, data.payload) + rsize);
803fb7
                         o->object.flags |= compression;
803fb7
 
803fb7
                         log_debug("Compressed data object %"PRIu64" -> %zu using %s",
803fb7
                                   size, rsize, object_compressed_to_string(compression));
803fb7
-                }
803fb7
+                } else
803fb7
+                        /* Compression didn't work, we don't really care why, let's continue without compression */
803fb7
+                        compression = 0;
803fb7
+
803fb7
         }
803fb7
 #endif
803fb7
 
803fb7
-        if (!compression && size > 0)
803fb7
+        if (compression == 0 && size > 0)
803fb7
                 memcpy(o->data.payload, data, size);
803fb7
 
803fb7
         r = journal_file_link_data(f, o, p, hash);
803fb7
diff --git a/src/journal/journal-file.h b/src/journal/journal-file.h
803fb7
index 403c8f760..0f29b092b 100644
803fb7
--- a/src/journal/journal-file.h
803fb7
+++ b/src/journal/journal-file.h
803fb7
@@ -229,3 +229,8 @@ int journal_file_get_cutoff_realtime_usec(JournalFile *f, usec_t *from, usec_t *
803fb7
 int journal_file_get_cutoff_monotonic_usec(JournalFile *f, sd_id128_t boot, usec_t *from, usec_t *to);
803fb7
 
803fb7
 bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec);
803fb7
+
803fb7
+static inline bool JOURNAL_FILE_COMPRESS(JournalFile *f) {
803fb7
+        assert(f);
803fb7
+        return f->compress_xz || f->compress_lz4;
803fb7
+}