From: Vito Caputo Date: Sun, 29 Nov 2020 00:28:08 +0000 (-0800) Subject: journal-file: fix archiving offline journals X-Git-Tag: v248-rc1~91 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bb1296b55a222cbab24d533006e730529009258c;p=thirdparty%2Fsystemd.git journal-file: fix archiving offline journals The existing set_offline() short-circuit erroneously included when f->archive was true and header->state was STATE_OFFLINE. This commit makes the short-circuit f->archive aware, so it will only catch scenarios where there's not an offlining in progress and the header state matches the target state of either archived or offline. Fixes https://github.com/systemd/systemd/issues/17770 --- diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index cfa4657f846..2545f1314bb 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -208,6 +208,7 @@ static bool journal_file_set_offline_try_restart(JournalFile *f) { * context without involving another thread. */ int journal_file_set_offline(JournalFile *f, bool wait) { + int target_state; bool restarted; int r; @@ -219,9 +220,13 @@ int journal_file_set_offline(JournalFile *f, bool wait) { if (f->fd < 0 || !f->header) return -EINVAL; + target_state = f->archive ? STATE_ARCHIVED : STATE_OFFLINE; + /* An offlining journal is implicitly online and may modify f->header->state, - * we must also join any potentially lingering offline thread when not online. */ - if (!journal_file_is_offlining(f) && f->header->state != STATE_ONLINE) + * we must also join any potentially lingering offline thread when already in + * the desired offline state. + */ + if (!journal_file_is_offlining(f) && f->header->state == target_state) return journal_file_set_offline_thread_join(f); /* Restart an in-flight offline thread and wait if needed, or join a lingering done one. */