Mark Millard <[email protected]> writes:
> From inside a bulk -i where I did a manual make command
> after it built and installed libsass.so.1.0.0 . The
> manual make produced a /wrkdirs/ :
> [...]
> So the original creation looks okay. But . . .
> [...]
> So: The later, staged copy is a bad copy. Both are in the
> tmpfs. So copying to the staging area makes a corrupted
> copy inside the same tmpfs. After that, further copies of
> staging's bad copy can be expected to be messed up.
This and the fact that it happens on 14 and 15 but not on 13 strongly
suggests an issue wth `copy_file_range(2)`, since `install(1)` in 14 and
15 (but not in 13) now uses `copy_file_range(2)` if at all possible.
My educated guess is that hole detection doesn't work reliably for files
that have had holes filled while memory-mapped, so `copy_file_range(2)`
thinks there is a hole where there isn't one and skips some of the data
when `install(1)` uses it to copy the library from `${WRKSRC}` to
`${STAGEDIR}`. This may or may not be specific to tmpfs.
You may want to try applying the attached patch to your FreeBSD 14 and
15 jails. It prevents `cp(1)` and `install(1)` from trying to use
`copy_file_range(2)`.
DES
--
Dag-Erling Smørgrav - [email protected]
>From 18eb75139045c30609d93f6a138526d3288acbd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dag-Erling=20Sm=C3=B8rgrav?= <[email protected]>
Date: Tue, 26 Nov 2024 10:54:14 +0100
Subject: [PATCH] cp, install: disable copy_file_range.
---
bin/cp/utils.c | 2 +-
usr.bin/xinstall/xinstall.c | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/bin/cp/utils.c b/bin/cp/utils.c
index cfbb2022caaf..c6a688235bf1 100644
--- a/bin/cp/utils.c
+++ b/bin/cp/utils.c
@@ -104,7 +104,7 @@ copy_file(const FTSENT *entp, int dne)
ssize_t wcount;
off_t wtotal;
int ch, checkch, from_fd, rval, to_fd;
- int use_copy_file_range = 1;
+ int use_copy_file_range = 0;
fs = entp->fts_statp;
from_fd = to_fd = -1;
diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c
index 2823a9040b7a..4ab0a6dd0de2 100644
--- a/usr.bin/xinstall/xinstall.c
+++ b/usr.bin/xinstall/xinstall.c
@@ -1194,6 +1194,7 @@ copy(int from_fd, const char *from_name, int to_fd, const char *to_name,
err(EX_OSERR, "lseek: %s", to_name);
#ifndef BOOTSTRAP_XINSTALL
+#if 0
/* Try copy_file_range() if no digest is requested */
if (digesttype == DIGEST_NONE) {
do {
@@ -1210,6 +1211,7 @@ copy(int from_fd, const char *from_name, int to_fd, const char *to_name,
}
/* Fall back */
}
+#endif
#endif
digest_init(&ctx);
--
2.46.0