From: Yu Watanabe Date: Thu, 15 Feb 2024 13:46:06 +0000 (+0900) Subject: journal-file-util: use COPY_VERIFY_LINKED X-Git-Tag: v256-rc1~835^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=18d4e475c7fad8a5f003e5eb2a9ed0616e0ade20;p=thirdparty%2Fsystemd.git journal-file-util: use COPY_VERIFY_LINKED As the main thread may call journal_directory_vacuum() -> unlinkat_deallocate() while another thread is copying the file. Fixes #24150 and #31222. --- diff --git a/src/shared/journal-file-util.c b/src/shared/journal-file-util.c index b9c44442c31..8df165d2f14 100644 --- a/src/shared/journal-file-util.c +++ b/src/shared/journal-file-util.c @@ -210,11 +210,15 @@ static void journal_file_set_offline_internal(JournalFile *f) { log_debug_errno(r, "Failed to re-enable copy-on-write for %s: %m, rewriting file", f->path); + /* Here, setting COPY_VERIFY_LINKED flag is crucial. Otherwise, a broken + * journal file may be created, if journal_directory_vacuum() -> + * unlinkat_deallocate() is called in the main thread while this thread is + * copying the file. See issue #24150 and #31222. */ r = copy_file_atomic_at_full( f->fd, NULL, AT_FDCWD, f->path, f->mode, 0, FS_NOCOW_FL, - COPY_REPLACE | COPY_FSYNC | COPY_HOLES | COPY_ALL_XATTRS, + COPY_REPLACE | COPY_FSYNC | COPY_HOLES | COPY_ALL_XATTRS | COPY_VERIFY_LINKED, NULL, NULL); if (r < 0) { log_debug_errno(r, "Failed to rewrite %s: %m", f->path);