bug#79267: cp --sparse=auto heuristic fails on a squashfs mounted drive.

Pádraig Brady <[email protected]>
Newsgroups gmane.comp.gnu.core-utils.bugs
Message-ID <[email protected]>
On 23/08/2025 01:48, Paul Eggert wrote:
> On 8/22/25 07:04, Pádraig Brady wrote:
>>         /* Copy this extent, looking for further opportunities to not
>>            bother to write zeros if --sparse=always, since SEEK_HOLE
>>            is conservative and may miss some holes.  */
>>
>> So the comment needs to be tweaked, but a more general issue
>> is that it disables copy offloading (copy_file_range) for sparse files.
> 
> Ouch, I didn't see that. That's a real loss. I installed the first
> attached patch to revert that part of my recent change.

Cool. I'll push the attached test to enforce this
> I assume the part of the change that always punches holes is OK. I
> couldn't see why one would not want to punch a hole if one has already
> taken the trouble to find and create the hole.

Fair enough. It simplifies the code anyway.

>> BTW commit 26bf557 also changed this a couple of weeks ago
>> without updating the comment, so the comment relates to sparse_mode !=
>> SPARSE_ALWAYS.
> 
> Not quite following but I hope the comment is OK now with the first
> patch installed.

Right, I missed that commit 26bf557 didn't actually change the logic
for this line, only the syntax.

thanks!
Padraig
cp-copy-offload-nfs-test.patch (text/x-patch, 1.7 KB)
From 6c668dc133af7d374790c1da666a701e21682a35 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <[email protected]>
Date: Sat, 23 Aug 2025 18:53:17 +0100
Subject: [PATCH] tests: cp: ensure copy offload is not disabled for sparse
 files

Related to commits v9.1-109-g879d2180d and v9.7-248-g306de6c26

* tests/cp/sparse-perf.sh: This edge case was missed a couple of times,
so add a test to ensure we attempt copy offload.
---
 tests/cp/sparse-perf.sh | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/tests/cp/sparse-perf.sh b/tests/cp/sparse-perf.sh
index 8f737f798..5a283c1fe 100755
--- a/tests/cp/sparse-perf.sh
+++ b/tests/cp/sparse-perf.sh
@@ -18,8 +18,27 @@
 
 . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
 print_ver_ cp
+cleanup_() { rm -rf "$other_partition_tmpdir"; }
+. "$abs_srcdir/tests/other-fs-tmpdir"
+
+# Create a sparse file on another partition to avoid reflinking
+# thus exercising more copy logic
+
+other_partition_sparse=$other_partition_tmpdir/k
+printf x > $other_partition_sparse || framework_failure_
+truncate -s1M $other_partition_sparse || framework_failure_
+
+# cp should not disable anything by default, even for sparse files.  For e.g.
+# copy offload is an important performance improvement for sparse files on NFS.
+cp --debug $other_partition_sparse k2 >cp.out || fail=1
+cmp $other_partition_sparse k2 || fail=1
+grep ': avoided' cp.out && { cat cp.out; fail=1; }
+
+
+
+# Create a large-but-sparse file on the current partition.
+# We disable relinking below, thus verifying SEEK_HOLE support
 
-# Create a large-but-sparse file.
 timeout 10 truncate -s1T f ||
   skip_ "unable to create a 1 TiB sparse file"
 
-- 
2.50.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.