From 4214009f8a226b43fd11bb24de29bcf44b9e1f4a Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Tue, 24 Jan 2017 19:00:23 -0500 Subject: journal-file: factor out helper function In preparation for later changes. --- src/journal/journal-file.c | 51 +++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 25 deletions(-) (limited to 'src/journal') diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index d3e0214731..d67b597af9 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -507,42 +507,43 @@ static int journal_file_refresh_header(JournalFile *f) { return r; } -static int journal_file_verify_header(JournalFile *f) { +static bool warn_wrong_flags(const JournalFile *f, bool compatible) { + const uint32_t any = compatible ? HEADER_COMPATIBLE_ANY : HEADER_INCOMPATIBLE_ANY, + supported = compatible ? HEADER_COMPATIBLE_SUPPORTED : HEADER_INCOMPATIBLE_SUPPORTED; + const char *type = compatible ? "compatible" : "incompatible"; uint32_t flags; + flags = le32toh(compatible ? f->header->compatible_flags : f->header->incompatible_flags); + + if (flags & ~supported) { + if (flags & ~any) + log_debug("Journal file %s has unknown %s flags %"PRIx32, + f->path, type, flags & ~any); + flags = (flags & any) & ~supported; + if (flags) + log_debug("Journal file %s uses %s flags %"PRIx32" disabled at compilation time.", + f->path, type, flags); + return true; + } + + return false; +} + +static int journal_file_verify_header(JournalFile *f) { assert(f); assert(f->header); if (memcmp(f->header->signature, HEADER_SIGNATURE, 8)) return -EBADMSG; - /* In both read and write mode we refuse to open files with - * incompatible flags we don't know */ - flags = le32toh(f->header->incompatible_flags); - if (flags & ~HEADER_INCOMPATIBLE_SUPPORTED) { - if (flags & ~HEADER_INCOMPATIBLE_ANY) - log_debug("Journal file %s has unknown incompatible flags %"PRIx32, - f->path, flags & ~HEADER_INCOMPATIBLE_ANY); - flags = (flags & HEADER_INCOMPATIBLE_ANY) & ~HEADER_INCOMPATIBLE_SUPPORTED; - if (flags) - log_debug("Journal file %s uses incompatible flags %"PRIx32 - " disabled at compilation time.", f->path, flags); + /* In both read and write mode we refuse to open files with incompatible + * flags we don't know. */ + if (warn_wrong_flags(f, false)) return -EPROTONOSUPPORT; - } - /* When open for writing we refuse to open files with - * compatible flags, too */ - flags = le32toh(f->header->compatible_flags); - if (f->writable && (flags & ~HEADER_COMPATIBLE_SUPPORTED)) { - if (flags & ~HEADER_COMPATIBLE_ANY) - log_debug("Journal file %s has unknown compatible flags %"PRIx32, - f->path, flags & ~HEADER_COMPATIBLE_ANY); - flags = (flags & HEADER_COMPATIBLE_ANY) & ~HEADER_COMPATIBLE_SUPPORTED; - if (flags) - log_debug("Journal file %s uses compatible flags %"PRIx32 - " disabled at compilation time.", f->path, flags); + /* When open for writing we refuse to open files with compatible flags, too. */ + if (f->writable && warn_wrong_flags(f, true)) return -EPROTONOSUPPORT; - } if (f->header->state >= _STATE_MAX) return -EBADMSG; -- cgit v1.2.3-54-g00ecf From 4761fd0ffb0d58efb2ad00775aba54f76a8a26ea Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Tue, 24 Jan 2017 19:19:33 -0500 Subject: journal-file, journalctl: provide better hint about unsupported features https://bugzilla.redhat.com/show_bug.cgi?id=1416201 $ journalctl -b Journal file /var/log/journal/ad18f69b80264b52bb3b766240742383/system@0005467d92e23784-a6571c8b69d09124.journal~ uses an unsupported feature, ignoring file. Use SYSTEMD_LOG_LEVEL=debug journalctl --file=/var/log/journal/ad18f69b80264b52bb3b766240742383/system@0005467d92e23784-a6571c8b69d09124.journal~ to see the details. -- No entries -- $ journalctl --file=/var/log/journal/ad18f69b80264b52bb3b766240742383/system@0005467d92e23784-a6571c8b69d09124.journal~ Journal file /var/log/journal/ad18f69b80264b52bb3b766240742383/system@0005467d92e23784-a6571c8b69d09124.journal~ uses incompatible flag lz4-compressed disabled at compilation time. Failed to open journal file /var/log/journal/ad18f69b80264b52bb3b766240742383/system@0005467d92e23784-a6571c8b69d09124.journal~: Protocol not supported mmap cache statistics: 0 hit, 1 miss Failed to open files: Protocol not supported --- src/journal/journal-file.c | 24 ++++++++++++++++++++---- src/journal/journalctl.c | 4 +++- 2 files changed, 23 insertions(+), 5 deletions(-) (limited to 'src/journal') diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index d67b597af9..7fcb30aa7b 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -42,6 +42,7 @@ #include "sd-event.h" #include "set.h" #include "string-util.h" +#include "strv.h" #include "xattr-util.h" #define DEFAULT_DATA_HASH_TABLE_SIZE (2047ULL*sizeof(HashItem)) @@ -517,12 +518,27 @@ static bool warn_wrong_flags(const JournalFile *f, bool compatible) { if (flags & ~supported) { if (flags & ~any) - log_debug("Journal file %s has unknown %s flags %"PRIx32, + log_debug("Journal file %s has unknown %s flags 0x%"PRIx32, f->path, type, flags & ~any); flags = (flags & any) & ~supported; - if (flags) - log_debug("Journal file %s uses %s flags %"PRIx32" disabled at compilation time.", - f->path, type, flags); + if (flags) { + const char* strv[3]; + unsigned n = 0; + _cleanup_free_ char *t = NULL; + + if (compatible && (flags & HEADER_COMPATIBLE_SEALED)) + strv[n++] = "sealed"; + if (!compatible && (flags & HEADER_INCOMPATIBLE_COMPRESSED_XZ)) + strv[n++] = "xz-compressed"; + if (!compatible && (flags & HEADER_INCOMPATIBLE_COMPRESSED_LZ4)) + strv[n++] = "lz4-compressed"; + strv[n] = NULL; + assert(n < ELEMENTSOF(strv)); + + t = strv_join((char**) strv, ", "); + log_debug("Journal file %s uses %s %s %s disabled at compilation time.", + f->path, type, n > 1 ? "flags" : "flag", strnull(t)); + } return true; } diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 2a5f2b37e8..2639fd6cf5 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -1910,7 +1910,9 @@ static int access_check(sd_journal *j) { break; case EPROTONOSUPPORT: - log_warning_errno(err, "Journal file %s uses an unsupported feature, ignoring file.", path); + log_warning_errno(err, "Journal file %1$s uses an unsupported feature, ignoring file.\n" + "Use SYSTEMD_LOG_LEVEL=debug journalctl --file=%1$s to see the details.", + path); break; case EBADMSG: -- cgit v1.2.3-54-g00ecf