From: Daan De Meyer Date: Thu, 22 Aug 2024 15:23:58 +0000 (+0200) Subject: Revert "tree-wide: Don't explicity disable copy-on-write when copying images" X-Git-Tag: v257-rc1~557^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=519216b71fb3c95c0dfbc9b09a4aa4a67179939e;p=thirdparty%2Fsystemd.git Revert "tree-wide: Don't explicity disable copy-on-write when copying images" Let's still try to disable COW after copying. It won't do much, but it doesn't hurt either. See https://github.com/systemd/systemd/pull/33825/files#r1727288871. This reverts commit 42e9288180ce37abd86c58774950636ebce35432. --- diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c index af5552379ef..57f96f7eab5 100644 --- a/src/core/exec-invoke.c +++ b/src/core/exec-invoke.c @@ -2891,6 +2891,16 @@ static int setup_ephemeral( if (fd < 0) return log_debug_errno(fd, "Failed to copy image %s to %s: %m", *root_image, new_root); + + /* A root image might be subject to lots of random writes so let's try to disable COW on it + * which tends to not perform well in combination with lots of random writes. + * + * Note: btrfs actually isn't impressed by us setting the flag after making the reflink'ed + * copy, but we at least want to make the intention clear. + */ + r = chattr_fd(fd, FS_NOCOW_FL, FS_NOCOW_FL, NULL); + if (r < 0) + log_debug_errno(r, "Failed to disable copy-on-write for %s, ignoring: %m", new_root); } else { assert(*root_directory); diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 9cd52e06c08..c1820690310 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -6072,8 +6072,10 @@ static int run(int argc, char *argv[]) { { BLOCK_SIGNALS(SIGINT); - r = copy_file(arg_image, np, O_EXCL, arg_read_only ? 0400 : 0600, - COPY_REFLINK|COPY_CRTIME|COPY_SIGINT); + r = copy_file_full(arg_image, np, O_EXCL, arg_read_only ? 0400 : 0600, + FS_NOCOW_FL, FS_NOCOW_FL, + COPY_REFLINK|COPY_CRTIME|COPY_SIGINT, + NULL, NULL); } if (r == -EINTR) { log_error_errno(r, "Interrupted while copying image file to %s, removed again.", np); diff --git a/src/shared/discover-image.c b/src/shared/discover-image.c index 1386452203f..dd78a013aaf 100644 --- a/src/shared/discover-image.c +++ b/src/shared/discover-image.c @@ -1205,7 +1205,8 @@ int image_clone(Image *i, const char *new_name, bool read_only) { case IMAGE_RAW: new_path = strjoina("/var/lib/machines/", new_name, ".raw"); - r = copy_file_atomic(i->path, new_path, read_only ? 0444 : 0644, COPY_REFLINK|COPY_CRTIME); + r = copy_file_atomic_full(i->path, new_path, read_only ? 0444 : 0644, FS_NOCOW_FL, FS_NOCOW_FL, + COPY_REFLINK|COPY_CRTIME, NULL, NULL); break; case IMAGE_BLOCK: