From nobody Sun Apr 12 03:16:28 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ftbKm568Zz6YM2p for ; Sun, 12 Apr 2026 03:16:28 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ftbKm3gS9z3NpK for ; Sun, 12 Apr 2026 03:16:28 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775963788; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=T8+eqfJL+vTqk9BFQTXdPtQsgRcIy3HygEIBPhZ7HC4=; b=q2mwvEKPXS6kyyvpU/vVdL1cnVFv60bzyQhOXMR+r1ax0PYmcklBo9+esGdyEcjJGHcbl9 OaDMl68zB/4U5vb8fn5hkKjbt8qyearxP/oALSWxNybVhClu4Xm4s9DkSBwTrql48li/V/ FEIIxU9m/x3nhmG1E8kZT4t/W/nuBAIsQJTKlkB0d1EoBFrX8DnddIIqo2mmTMD5odsjP0 f8x6jyUMVsCe48fwY8MlBKjo4d1+L7dw/tY954EwimBFDiJF4XtSOJ4ZTilRY70DjSmNMD VhkXfpGmcU4DaWYOqKLxxbDXezED6oPydnwdTRkAz93At0VGPCEBSis7CZa3Cg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1775963788; a=rsa-sha256; cv=none; b=kURfjVM8AWbQxCPVz7lsP3a01c95dFcov1ES/ZZZ/D8AEzp4d6/XeR3pctmsmsznOTE+W2 B5rePNKYaiL0SZoZKa/xgWwQLB8DvHFq2m6pTIhnYM2bObCv/xRgYgZM4MFEI+22MF4m37 E3vLjWF4r7qbNLMAlxORCM2LJlwyHJkajNHULqdVu61yPudxOXhNca7bm2R7xJDGetc992 +eu16FJJRCdAevoCdr1YOwNGmNneSOvS4L/WKvCzni2kCC05+VJoqghnpdQwDnKS4dSDBq TL2ThMa+OGHoXQoYxtHvCyKM4/KrW9J6agl2GZ7UiML1BnG1H7CgIRoatEajIw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1775963788; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=T8+eqfJL+vTqk9BFQTXdPtQsgRcIy3HygEIBPhZ7HC4=; b=O7S6QvSNnAxoMawUzLiZ3une/yR45RLQdoOE17e4wbsEp65K3PMDMvxf66hgs634kuqytx ww31QTShiZWe049KipBDKVzFMrhBJMaDv6AdKvmQekFO8mj+ziMeZcw6xeiU+XFEtfgQkY zWiuuMCjW7RKaaIBAmTRATDwnL3+Il68lEckeYpt9A99sz+6lP4YHG8ubEoF2IzTBsUZPd osn87HfJgFAE4tWQbspvm5FmKPdd4IeuzkkWL+Oi5v/CfLU9E3sBYxkEhcR8L8xeljmTSK QrOehKeKSZqfi6l0rJc05/MdD+mE3cCyBB+/HvI92NuJPlACoR/3dFJxlT4rlQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4ftbKm3BZkz10GV for ; Sun, 12 Apr 2026 03:16:28 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 478d2 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 12 Apr 2026 03:16:28 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kyle Evans Subject: git: cf62b00b47ac - stable/15 - truncate: fix a minor nit + add a hole-punching test List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kevans X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: cf62b00b47acf9f528dfe147635a95693307003e Auto-Submitted: auto-generated Date: Sun, 12 Apr 2026 03:16:28 +0000 Message-Id: <69db0e8c.478d2.5cabba40@gitrepo.freebsd.org> The branch stable/15 has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=cf62b00b47acf9f528dfe147635a95693307003e commit cf62b00b47acf9f528dfe147635a95693307003e Author: Kyle Evans AuthorDate: 2026-01-21 23:34:27 +0000 Commit: Kyle Evans CommitDate: 2026-04-12 03:15:10 +0000 truncate: fix a minor nit + add a hole-punching test The struct spacectl_range we use is only really used in these three lines of code, so re-scope it down to just the dealloc branch. This is marginally easier to reason about what might be necessary to replace in porting our truncate(1) to other platforms. While we're here, add a test for the -d flag to be sure it really does punch a hole in the file. The test also tries to confirm that it does not disturb other segments of the file in the process, just to inspire some confidence that it's not corrupting the file somehow. Sponsored by: Klara, Inc. Reviewed by: markj (cherry picked from commit eacc501eff52db16b7b784c89a3a4a03c9a3ef34) --- usr.bin/truncate/tests/truncate_test.sh | 48 +++++++++++++++++++++++++++++++++ usr.bin/truncate/truncate.c | 3 ++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/usr.bin/truncate/tests/truncate_test.sh b/usr.bin/truncate/tests/truncate_test.sh index ec219059de42..845b3e1b4d84 100644 --- a/usr.bin/truncate/tests/truncate_test.sh +++ b/usr.bin/truncate/tests/truncate_test.sh @@ -438,6 +438,53 @@ rounddown_zero_body() [ ${st_size} -eq 0 ] || atf_fail "new file should now be 0 bytes" } +atf_test_case deallocate +deallocate_head() +{ + atf_set "descr" "Verifies that -d punches a hole in the file" + atf_set "require.user" "root" +} +deallocate_body() +{ + blocksz=$(stat -h . | cut -f1 -d' ') + atf_check test -n "$blocksz" + + # We use /dev/random here to defeat ZFS compression, which would + # collapse ranges of zeroes into holes without us deallocating it. This + # isn't a concern below because those are specificially for creating our + # reference files -- we expect the deallocate operation to result in + # ranges of zeroes, whether they end up creating a hole or not. + filesz=$((blocksz * 3)) + atf_check -e not-empty dd if=/dev/random of=sparse \ + bs=${filesz} count=1 conv=notrunc + + atf_check cp sparse sparse.orig + atf_check cp sparse sparse.orig.orig + + # Punch a hole in the middle, ensure that bit is zeroed out. + atf_check -e not-empty dd if=/dev/zero of=sparse.orig \ + bs=${blocksz} oseek=1 count=1 conv=notrunc + atf_check truncate -d -o ${blocksz} -l ${blocksz} sparse + atf_check cmp -s sparse sparse.orig + + # Clobber the end part of the original file and punch a hole in + # the same spot on the new file, ensure that it has zeroed out that + # portion. + atf_check -e not-empty dd if=/dev/zero of=sparse.orig \ + bs=${blocksz} oseek=2 count=1 conv=notrunc + atf_check truncate -d -o $((blocksz * 2)) -l ${blocksz} sparse + atf_check cmp -s sparse sparse.orig + + # Now bring the original file back and make sure that punching a hole + # in data at the beginning doesn't disturb the data at the end. + atf_check cp sparse.orig.orig sparse.orig + atf_check cp sparse.orig.orig sparse + atf_check -e not-empty dd if=/dev/zero of=sparse.orig \ + bs=${blocksz} oseek=0 count=1 conv=notrunc + atf_check truncate -d -l ${blocksz} sparse + atf_check cmp -s sparse sparse.orig +} + atf_init_test_cases() { atf_add_test_case illegal_option @@ -459,4 +506,5 @@ atf_init_test_cases() atf_add_test_case roundup atf_add_test_case rounddown atf_add_test_case rounddown_zero + atf_add_test_case deallocate } diff --git a/usr.bin/truncate/truncate.c b/usr.bin/truncate/truncate.c index d8484257294a..15be339df0e3 100644 --- a/usr.bin/truncate/truncate.c +++ b/usr.bin/truncate/truncate.c @@ -62,7 +62,6 @@ main(int argc, char **argv) int do_refer; int got_size; char *fname, *rname; - struct spacectl_range sr; fd = -1; rsize = tsize = sz = off = 0; @@ -198,6 +197,8 @@ main(int argc, char **argv) tsize = 0; if (do_dealloc == 1) { + struct spacectl_range sr; + sr.r_offset = off; sr.r_len = len; r = fspacectl(fd, SPACECTL_DEALLOC, &sr, 0, &sr);