From 9e2ba7eb050fcfd9c13f5212c7df9c82cd44cef5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andreas=20St=C3=BChrk?= Date: Wed, 26 Feb 2025 00:05:41 +0100 Subject: [PATCH] copy: Invoke hardlink context cleanup before restoring timestamps When hardlink recreation is requested, it creates temporary files that will be deleted once the context is destroyed. The deletion (potentially) updates the directory's timestamps, so it's crucial that the deletion happens before the directory timestamps are restored when `COPY_RESTORE_DIRECTORY_TIMESTAMPS` is requested. (cherry picked from commit b66291444b8d4022ce68121af8e6f99d29ebefd0) --- src/shared/copy.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/shared/copy.c b/src/shared/copy.c index 5221397da5d..27b517e21aa 100644 --- a/src/shared/copy.c +++ b/src/shared/copy.c @@ -1178,11 +1178,16 @@ finish: if (fchmod(fdt, st->st_mode & 07777) < 0) r = -errno; + /* Run hardlink context cleanup now because it potentially changes timestamps */ + hardlink_context_destroy(&our_hardlink_context); (void) copy_xattr(dirfd(d), NULL, fdt, NULL, copy_flags); (void) futimens(fdt, (struct timespec[]) { st->st_atim, st->st_mtim }); - } else if (FLAGS_SET(copy_flags, COPY_RESTORE_DIRECTORY_TIMESTAMPS)) + } else if (FLAGS_SET(copy_flags, COPY_RESTORE_DIRECTORY_TIMESTAMPS)) { + /* Run hardlink context cleanup now because it potentially changes timestamps */ + hardlink_context_destroy(&our_hardlink_context); /* If the directory already exists, make sure the timestamps stay the same as before. */ (void) futimens(fdt, (struct timespec[]) { dt_st.st_atim, dt_st.st_mtim }); + } if (copy_flags & COPY_FSYNC_FULL) { if (fsync(fdt) < 0) -- 2.47.3