]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: copy hardlinks wherever we deal with possibly large OS-style trees 16933/head
authorLennart Poettering <lennart@poettering.net>
Tue, 1 Sep 2020 21:04:29 +0000 (23:04 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 9 Sep 2020 18:21:49 +0000 (20:21 +0200)
Fixes: #7382
src/basic/btrfs-util.c
src/machine/machine-dbus.c
src/partition/repart.c
src/tmpfiles/tmpfiles.c

index 7de777073739c371ac6a20fa8703327c950e5e30..43a58918e9d724f8fdab1e69fa674d27837557ec 100644 (file)
@@ -1654,7 +1654,10 @@ int btrfs_subvol_snapshot_fd_full(
                 } else if (r < 0)
                         return r;
 
-                r = copy_directory_fd_full(old_fd, new_path, COPY_MERGE|COPY_REFLINK|COPY_SAME_MOUNT|(FLAGS_SET(flags, BTRFS_SNAPSHOT_SIGINT) ? COPY_SIGINT : 0), progress_path, progress_bytes, userdata);
+                r = copy_directory_fd_full(
+                                old_fd, new_path,
+                                COPY_MERGE|COPY_REFLINK|COPY_SAME_MOUNT|COPY_HARDLINKS|(FLAGS_SET(flags, BTRFS_SNAPSHOT_SIGINT) ? COPY_SIGINT : 0),
+                                progress_path, progress_bytes, userdata);
                 if (r < 0)
                         goto fallback_fail;
 
index d203ac0bd4dcb105b03accbe03172c4b9a2d0340..a98e883afa947331368106abd747b800d813c738 100644 (file)
@@ -1066,7 +1066,7 @@ finish:
 int bus_machine_method_copy(sd_bus_message *message, void *userdata, sd_bus_error *error) {
         const char *src, *dest, *host_path, *container_path, *host_basename, *container_basename, *container_dirname;
         _cleanup_close_pair_ int errno_pipe_fd[2] = { -1, -1 };
-        CopyFlags copy_flags = COPY_REFLINK|COPY_MERGE;
+        CopyFlags copy_flags = COPY_REFLINK|COPY_MERGE|COPY_HARDLINKS;
         _cleanup_close_ int hostfd = -1;
         Machine *m = userdata;
         bool copy_from;
index f5015b73a13d5f87d1e75f9113f3b65da40cd1d0..d647d3d5e4377be868f9e61f11e5ff88a7762c8d 100644 (file)
@@ -2609,9 +2609,17 @@ static int do_copy_files(Partition *p, const char *fs) {
                                 if (pfd < 0)
                                         return log_error_errno(pfd, "Failed to open parent directory of target: %m");
 
-                                r = copy_tree_at(sfd, ".", pfd, basename(*target), UID_INVALID, GID_INVALID, COPY_REFLINK|COPY_MERGE|COPY_REPLACE|COPY_SIGINT);
+                                r = copy_tree_at(
+                                                sfd, ".",
+                                                pfd, basename(*target),
+                                                UID_INVALID, GID_INVALID,
+                                                COPY_REFLINK|COPY_MERGE|COPY_REPLACE|COPY_SIGINT|COPY_HARDLINKS);
                         } else
-                                r = copy_tree_at(sfd, ".", tfd, ".", UID_INVALID, GID_INVALID, COPY_REFLINK|COPY_MERGE|COPY_REPLACE|COPY_SIGINT);
+                                r = copy_tree_at(
+                                                sfd, ".",
+                                                tfd, ".",
+                                                UID_INVALID, GID_INVALID,
+                                                COPY_REFLINK|COPY_MERGE|COPY_REPLACE|COPY_SIGINT|COPY_HARDLINKS);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to copy %s%s to %s: %m", strempty(arg_root), *source, *target);
                 } else {
index 5a0a5a58672933364edd56f114431ad53ba4e259..b0b8fe8e7121e9db2a3be821584d25a5c790c424 100644 (file)
@@ -1540,7 +1540,7 @@ static int copy_files(Item *i) {
                          dfd, bn,
                          i->uid_set ? i->uid : UID_INVALID,
                          i->gid_set ? i->gid : GID_INVALID,
-                         COPY_REFLINK | COPY_MERGE_EMPTY | COPY_MAC_CREATE);
+                         COPY_REFLINK | COPY_MERGE_EMPTY | COPY_MAC_CREATE | COPY_HARDLINKS);
         if (r < 0) {
                 struct stat a, b;