public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] xfs: test reproducible builds
@ 2025-12-12  8:15 Luca Di Maio
  2025-12-12 20:20 ` Darrick J. Wong
  0 siblings, 1 reply; 3+ messages in thread
From: Luca Di Maio @ 2025-12-12  8:15 UTC (permalink / raw)
  To: linux-xfs; +Cc: Luca Di Maio

With the addition of the `-p` populate option, SOURCE_DATE_EPOCH and
DETERMINISTIC_SEED support, it is possible to create fully reproducible
pre-populated filesystems. We should test them here.

Signed-off-by: Luca Di Maio <luca.dimaio1@gmail.com>
---
 tests/xfs/841     | 171 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/841.out |   3 +
 2 files changed, 174 insertions(+)
 create mode 100755 tests/xfs/841
 create mode 100644 tests/xfs/841.out

diff --git a/tests/xfs/841 b/tests/xfs/841
new file mode 100755
index 00000000..e77533c3
--- /dev/null
+++ b/tests/xfs/841
@@ -0,0 +1,171 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2025 Chainguard, Inc. All Rights Reserved.
+#
+# FS QA Test No. 841
+#
+# Test that XFS filesystems created with reproducibility options produce
+# identical images across multiple runs. This verifies that the combination
+# of SOURCE_DATE_EPOCH, DETERMINISTIC_SEED, and -m uuid= options result in
+# bit-for-bit reproducible filesystem images.
+
+. ./common/preamble
+_begin_fstest auto quick mkfs
+
+# Image file settings
+IMG_SIZE="512M"
+IMG_FILE="$TEST_DIR/xfs_reproducible_test.img"
+PROTO_DIR="$TEST_DIR/proto"
+
+# Fixed values for reproducibility
+FIXED_UUID="12345678-1234-1234-1234-123456789abc"
+FIXED_EPOCH="1234567890"
+
+# Check if mkfs.xfs supports required options
+_check_mkfs_xfs_options()
+{
+	local check_img="$TEST_DIR/mkfs_check.img"
+	truncate -s 64M "$check_img" || return 1
+
+	# Check -m uuid support
+	$MKFS_XFS_PROG -m uuid=00000000-0000-0000-0000-000000000000 \
+		-N "$check_img" &> /dev/null
+	local uuid_support=$?
+
+	# Check -p support (protofile/directory population)
+	$MKFS_XFS_PROG 2>&1 | grep populate &> /dev/null
+	local proto_support=$?
+
+	rm -f "$check_img"
+
+	if [ $uuid_support -ne 0 ]; then
+		_notrun "mkfs.xfs does not support -m uuid= option"
+	fi
+	if [ $proto_support -ne 0 ]; then
+		_notrun "mkfs.xfs does not support -p option for directory population"
+	fi
+}
+
+# Create a prototype directory with all file types supported by mkfs.xfs -p
+_create_proto_dir()
+{
+	rm -rf "$PROTO_DIR"
+	mkdir -p "$PROTO_DIR/subdir/nested"
+
+	# Regular files with different content
+	echo "test file content" > "$PROTO_DIR/regular.txt"
+	dd if=/dev/zero of="$PROTO_DIR/zeros" bs=1k count=4 2> /dev/null
+	echo "file in subdir" > "$PROTO_DIR/subdir/nested.txt"
+	echo "deeply nested" > "$PROTO_DIR/subdir/nested/deep.txt"
+
+	# Empty file
+	touch "$PROTO_DIR/empty"
+
+	# Symbolic links (file and directory)
+	ln -s regular.txt "$PROTO_DIR/symlink"
+	ln -s subdir "$PROTO_DIR/dirlink"
+
+	# Hardlink
+	ln "$PROTO_DIR/regular.txt" "$PROTO_DIR/hardlink"
+
+	# FIFO (named pipe)
+	mkfifo "$PROTO_DIR/fifo"
+
+	# Unix socket
+	$here/src/af_unix "$PROTO_DIR/socket" 2> /dev/null || true
+
+	# Block device (requires root)
+	mknod "$PROTO_DIR/blockdev" b 1 0 2> /dev/null || true
+
+	# Character device (requires root)
+	mknod "$PROTO_DIR/chardev" c 1 3 2> /dev/null || true
+
+	# File with extended attributes
+	echo "file with xattrs" > "$PROTO_DIR/xattrfile"
+	setfattr -n user.testattr -v "testvalue" "$PROTO_DIR/xattrfile" 2> /dev/null || true
+}
+
+_require_test
+_check_mkfs_xfs_options
+
+# Create XFS filesystem with full reproducibility options
+# Uses -p to populate from directory during mkfs (no mount needed)
+_mkfs_xfs_reproducible()
+{
+	local img=$1
+
+	# Create fresh image file
+	rm -f "$img"
+	truncate -s $IMG_SIZE "$img" || return 1
+
+	# Set environment variables for reproducibility:
+	# - SOURCE_DATE_EPOCH: fixes all inode timestamps to this value
+	# - DETERMINISTIC_SEED: uses fixed seed (0x53454544) instead of
+	#   getrandom()
+	#
+	# mkfs.xfs options:
+	# - -m uuid=: fixed filesystem UUID
+	# - -p dir: populate filesystem from directory during creation
+	SOURCE_DATE_EPOCH=$FIXED_EPOCH \
+	DETERMINISTIC_SEED=1 \
+	$MKFS_XFS_PROG \
+		-f \
+		-m uuid=$FIXED_UUID \
+		-p "$PROTO_DIR" \
+		"$img" >> $seqres.full 2>&1
+
+	return $?
+}
+
+# Compute hash of the image file
+_hash_image()
+{
+	sha256sum "$1" | awk '{print $1}'
+}
+
+# Run a single reproducibility test iteration
+_run_iteration()
+{
+	local iteration=$1
+
+	echo "Iteration $iteration: Creating filesystem with -p $PROTO_DIR" >> $seqres.full
+	if ! _mkfs_xfs_reproducible "$IMG_FILE"; then
+		echo "mkfs.xfs failed" >> $seqres.full
+		return 1
+	fi
+
+	local hash=$(_hash_image "$IMG_FILE")
+	echo "Iteration $iteration: Hash = $hash" >> $seqres.full
+
+	echo $hash
+}
+
+# Create the prototype directory with various file types
+_create_proto_dir
+
+echo "Test: XFS reproducible filesystem image creation"
+
+# Run three iterations
+hash1=$(_run_iteration 1)
+[ -z "$hash1" ] && _fail "Iteration 1 failed"
+
+hash2=$(_run_iteration 2)
+[ -z "$hash2" ] && _fail "Iteration 2 failed"
+
+hash3=$(_run_iteration 3)
+[ -z "$hash3" ] && _fail "Iteration 3 failed"
+
+# Verify all hashes match
+if [ "$hash1" = "$hash2" ] && [ "$hash2" = "$hash3" ]; then
+	echo "All filesystem images are identical."
+else
+	echo "ERROR: Filesystem images differ!"
+	echo "Hash 1: $hash1"
+	echo "Hash 2: $hash2"
+	echo "Hash 3: $hash3"
+	_fail "Reproducibility test failed - images are not identical"
+fi
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/841.out b/tests/xfs/841.out
new file mode 100644
index 00000000..3bdfbfda
--- /dev/null
+++ b/tests/xfs/841.out
@@ -0,0 +1,3 @@
+QA output created by 841
+Test: XFS reproducible filesystem image creation
+All filesystem images are identical.
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] xfs: test reproducible builds
  2025-12-12  8:15 [PATCH v2] xfs: test reproducible builds Luca Di Maio
@ 2025-12-12 20:20 ` Darrick J. Wong
  2025-12-15 15:42   ` Luca Di Maio
  0 siblings, 1 reply; 3+ messages in thread
From: Darrick J. Wong @ 2025-12-12 20:20 UTC (permalink / raw)
  To: Luca Di Maio; +Cc: linux-xfs

On Fri, Dec 12, 2025 at 09:15:19AM +0100, Luca Di Maio wrote:
> With the addition of the `-p` populate option, SOURCE_DATE_EPOCH and
> DETERMINISTIC_SEED support, it is possible to create fully reproducible
> pre-populated filesystems. We should test them here.
> 
> Signed-off-by: Luca Di Maio <luca.dimaio1@gmail.com>
> ---
>  tests/xfs/841     | 171 ++++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/841.out |   3 +
>  2 files changed, 174 insertions(+)
>  create mode 100755 tests/xfs/841
>  create mode 100644 tests/xfs/841.out
> 
> diff --git a/tests/xfs/841 b/tests/xfs/841
> new file mode 100755
> index 00000000..e77533c3
> --- /dev/null
> +++ b/tests/xfs/841
> @@ -0,0 +1,171 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2025 Chainguard, Inc. All Rights Reserved.
> +#
> +# FS QA Test No. 841
> +#
> +# Test that XFS filesystems created with reproducibility options produce
> +# identical images across multiple runs. This verifies that the combination
> +# of SOURCE_DATE_EPOCH, DETERMINISTIC_SEED, and -m uuid= options result in
> +# bit-for-bit reproducible filesystem images.
> +
> +. ./common/preamble
> +_begin_fstest auto quick mkfs
> +
> +# Image file settings
> +IMG_SIZE="512M"
> +IMG_FILE="$TEST_DIR/xfs_reproducible_test.img"
> +PROTO_DIR="$TEST_DIR/proto"
> +
> +# Fixed values for reproducibility
> +FIXED_UUID="12345678-1234-1234-1234-123456789abc"
> +FIXED_EPOCH="1234567890"
> +
> +# Check if mkfs.xfs supports required options
> +_check_mkfs_xfs_options()
> +{
> +	local check_img="$TEST_DIR/mkfs_check.img"
> +	truncate -s 64M "$check_img" || return 1
> +
> +	# Check -m uuid support
> +	$MKFS_XFS_PROG -m uuid=00000000-0000-0000-0000-000000000000 \
> +		-N "$check_img" &> /dev/null
> +	local uuid_support=$?
> +
> +	# Check -p support (protofile/directory population)
> +	$MKFS_XFS_PROG 2>&1 | grep populate &> /dev/null
> +	local proto_support=$?

I forget, didn't mkfs.xfs -p appear before adding SOURCE_DATE_EPOCH /
DETERMINISTIC_SEED?  There's nothing in the --help screen, but I think
you could detect it with

	grep -q SOURCE_DATE_EPOCH $MKFS_XFS_PROG || \
		_notrun "mkfs.xfs does not support SOURCE_DATE_EPOCH"

> +
> +	rm -f "$check_img"
> +
> +	if [ $uuid_support -ne 0 ]; then
> +		_notrun "mkfs.xfs does not support -m uuid= option"
> +	fi
> +	if [ $proto_support -ne 0 ]; then
> +		_notrun "mkfs.xfs does not support -p option for directory population"
> +	fi
> +}
> +
> +# Create a prototype directory with all file types supported by mkfs.xfs -p
> +_create_proto_dir()
> +{
> +	rm -rf "$PROTO_DIR"
> +	mkdir -p "$PROTO_DIR/subdir/nested"

If you really want to go wild you could (in addition to the code below)
run fsstress for a thousand or so fs ops to populate $PROTO_DIR with
xattrs and whatnot, which would make the inputs less predictable. ;)

(Just something to think about; the code below is quite all right for a
functional test.)

> +
> +	# Regular files with different content
> +	echo "test file content" > "$PROTO_DIR/regular.txt"
> +	dd if=/dev/zero of="$PROTO_DIR/zeros" bs=1k count=4 2> /dev/null
> +	echo "file in subdir" > "$PROTO_DIR/subdir/nested.txt"
> +	echo "deeply nested" > "$PROTO_DIR/subdir/nested/deep.txt"
> +
> +	# Empty file
> +	touch "$PROTO_DIR/empty"
> +
> +	# Symbolic links (file and directory)
> +	ln -s regular.txt "$PROTO_DIR/symlink"
> +	ln -s subdir "$PROTO_DIR/dirlink"
> +
> +	# Hardlink
> +	ln "$PROTO_DIR/regular.txt" "$PROTO_DIR/hardlink"
> +
> +	# FIFO (named pipe)
> +	mkfifo "$PROTO_DIR/fifo"
> +
> +	# Unix socket
> +	$here/src/af_unix "$PROTO_DIR/socket" 2> /dev/null || true
> +
> +	# Block device (requires root)
> +	mknod "$PROTO_DIR/blockdev" b 1 0 2> /dev/null || true
> +
> +	# Character device (requires root)
> +	mknod "$PROTO_DIR/chardev" c 1 3 2> /dev/null || true
> +
> +	# File with extended attributes
> +	echo "file with xattrs" > "$PROTO_DIR/xattrfile"
> +	setfattr -n user.testattr -v "testvalue" "$PROTO_DIR/xattrfile" 2> /dev/null || true
> +}
> +
> +_require_test
> +_check_mkfs_xfs_options
> +
> +# Create XFS filesystem with full reproducibility options
> +# Uses -p to populate from directory during mkfs (no mount needed)
> +_mkfs_xfs_reproducible()
> +{
> +	local img=$1
> +
> +	# Create fresh image file
> +	rm -f "$img"
> +	truncate -s $IMG_SIZE "$img" || return 1
> +
> +	# Set environment variables for reproducibility:
> +	# - SOURCE_DATE_EPOCH: fixes all inode timestamps to this value
> +	# - DETERMINISTIC_SEED: uses fixed seed (0x53454544) instead of
> +	#   getrandom()
> +	#
> +	# mkfs.xfs options:
> +	# - -m uuid=: fixed filesystem UUID
> +	# - -p dir: populate filesystem from directory during creation
> +	SOURCE_DATE_EPOCH=$FIXED_EPOCH \
> +	DETERMINISTIC_SEED=1 \
> +	$MKFS_XFS_PROG \
> +		-f \
> +		-m uuid=$FIXED_UUID \
> +		-p "$PROTO_DIR" \
> +		"$img" >> $seqres.full 2>&1
> +
> +	return $?
> +}
> +
> +# Compute hash of the image file
> +_hash_image()
> +{
> +	sha256sum "$1" | awk '{print $1}'
> +}
> +
> +# Run a single reproducibility test iteration
> +_run_iteration()
> +{
> +	local iteration=$1
> +
> +	echo "Iteration $iteration: Creating filesystem with -p $PROTO_DIR" >> $seqres.full
> +	if ! _mkfs_xfs_reproducible "$IMG_FILE"; then
> +		echo "mkfs.xfs failed" >> $seqres.full
> +		return 1
> +	fi
> +
> +	local hash=$(_hash_image "$IMG_FILE")
> +	echo "Iteration $iteration: Hash = $hash" >> $seqres.full
> +
> +	echo $hash
> +}
> +
> +# Create the prototype directory with various file types
> +_create_proto_dir
> +
> +echo "Test: XFS reproducible filesystem image creation"
> +
> +# Run three iterations
> +hash1=$(_run_iteration 1)
> +[ -z "$hash1" ] && _fail "Iteration 1 failed"
> +
> +hash2=$(_run_iteration 2)
> +[ -z "$hash2" ] && _fail "Iteration 2 failed"
> +
> +hash3=$(_run_iteration 3)
> +[ -z "$hash3" ] && _fail "Iteration 3 failed"
> +
> +# Verify all hashes match
> +if [ "$hash1" = "$hash2" ] && [ "$hash2" = "$hash3" ]; then
> +	echo "All filesystem images are identical."
> +else
> +	echo "ERROR: Filesystem images differ!"
> +	echo "Hash 1: $hash1"
> +	echo "Hash 2: $hash2"
> +	echo "Hash 3: $hash3"
> +	_fail "Reproducibility test failed - images are not identical"

As a general note, printing "ERROR: Filesystem images differ!" (or any
string that's not in the 841.out file) is enough to fail the test, so
there's no need to call _fail.

Other that those comments, this looks good.  Thanks for launching us
into the reproducible fs image era!

--D

> +fi
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/841.out b/tests/xfs/841.out
> new file mode 100644
> index 00000000..3bdfbfda
> --- /dev/null
> +++ b/tests/xfs/841.out
> @@ -0,0 +1,3 @@
> +QA output created by 841
> +Test: XFS reproducible filesystem image creation
> +All filesystem images are identical.
> -- 
> 2.52.0
> 
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] xfs: test reproducible builds
  2025-12-12 20:20 ` Darrick J. Wong
@ 2025-12-15 15:42   ` Luca Di Maio
  0 siblings, 0 replies; 3+ messages in thread
From: Luca Di Maio @ 2025-12-15 15:42 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs

On Fri, Dec 12, 2025 at 12:20:00PM -0800, Darrick J. Wong wrote:
> On Fri, Dec 12, 2025 at 09:15:19AM +0100, Luca Di Maio wrote:
> > With the addition of the `-p` populate option, SOURCE_DATE_EPOCH and
> > DETERMINISTIC_SEED support, it is possible to create fully reproducible
> > pre-populated filesystems. We should test them here.
> > 
> > Signed-off-by: Luca Di Maio <luca.dimaio1@gmail.com>
> > ---
> >  tests/xfs/841     | 171 ++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/xfs/841.out |   3 +
> >  2 files changed, 174 insertions(+)
> >  create mode 100755 tests/xfs/841
> >  create mode 100644 tests/xfs/841.out
> > 
> > diff --git a/tests/xfs/841 b/tests/xfs/841
> > new file mode 100755
> > index 00000000..e77533c3
> > --- /dev/null
> > +++ b/tests/xfs/841
> > @@ -0,0 +1,171 @@
> > +#! /bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +# Copyright (c) 2025 Chainguard, Inc. All Rights Reserved.
> > +#
> > +# FS QA Test No. 841
> > +#
> > +# Test that XFS filesystems created with reproducibility options produce
> > +# identical images across multiple runs. This verifies that the combination
> > +# of SOURCE_DATE_EPOCH, DETERMINISTIC_SEED, and -m uuid= options result in
> > +# bit-for-bit reproducible filesystem images.
> > +
> > +. ./common/preamble
> > +_begin_fstest auto quick mkfs
> > +
> > +# Image file settings
> > +IMG_SIZE="512M"
> > +IMG_FILE="$TEST_DIR/xfs_reproducible_test.img"
> > +PROTO_DIR="$TEST_DIR/proto"
> > +
> > +# Fixed values for reproducibility
> > +FIXED_UUID="12345678-1234-1234-1234-123456789abc"
> > +FIXED_EPOCH="1234567890"
> > +
> > +# Check if mkfs.xfs supports required options
> > +_check_mkfs_xfs_options()
> > +{
> > +	local check_img="$TEST_DIR/mkfs_check.img"
> > +	truncate -s 64M "$check_img" || return 1
> > +
> > +	# Check -m uuid support
> > +	$MKFS_XFS_PROG -m uuid=00000000-0000-0000-0000-000000000000 \
> > +		-N "$check_img" &> /dev/null
> > +	local uuid_support=$?
> > +
> > +	# Check -p support (protofile/directory population)
> > +	$MKFS_XFS_PROG 2>&1 | grep populate &> /dev/null
> > +	local proto_support=$?
> 
> I forget, didn't mkfs.xfs -p appear before adding SOURCE_DATE_EPOCH /
> DETERMINISTIC_SEED?  There's nothing in the --help screen, but I think
> you could detect it with
> 
> 	grep -q SOURCE_DATE_EPOCH $MKFS_XFS_PROG || \
> 		_notrun "mkfs.xfs does not support SOURCE_DATE_EPOCH"
>

Ack

> > +
> > +	rm -f "$check_img"
> > +
> > +	if [ $uuid_support -ne 0 ]; then
> > +		_notrun "mkfs.xfs does not support -m uuid= option"
> > +	fi
> > +	if [ $proto_support -ne 0 ]; then
> > +		_notrun "mkfs.xfs does not support -p option for directory population"
> > +	fi
> > +}
> > +
> > +# Create a prototype directory with all file types supported by mkfs.xfs -p
> > +_create_proto_dir()
> > +{
> > +	rm -rf "$PROTO_DIR"
> > +	mkdir -p "$PROTO_DIR/subdir/nested"
> 
> If you really want to go wild you could (in addition to the code below)
> run fsstress for a thousand or so fs ops to populate $PROTO_DIR with
> xattrs and whatnot, which would make the inputs less predictable. ;)
> 
> (Just something to think about; the code below is quite all right for a
> functional test.)
>

TIL about fsstress, will switch to it, thanks for pointing it out

> > +
> > +	# Regular files with different content
> > +	echo "test file content" > "$PROTO_DIR/regular.txt"
> > +	dd if=/dev/zero of="$PROTO_DIR/zeros" bs=1k count=4 2> /dev/null
> > +	echo "file in subdir" > "$PROTO_DIR/subdir/nested.txt"
> > +	echo "deeply nested" > "$PROTO_DIR/subdir/nested/deep.txt"
> > +
> > +	# Empty file
> > +	touch "$PROTO_DIR/empty"
> > +
> > +	# Symbolic links (file and directory)
> > +	ln -s regular.txt "$PROTO_DIR/symlink"
> > +	ln -s subdir "$PROTO_DIR/dirlink"
> > +
> > +	# Hardlink
> > +	ln "$PROTO_DIR/regular.txt" "$PROTO_DIR/hardlink"
> > +
> > +	# FIFO (named pipe)
> > +	mkfifo "$PROTO_DIR/fifo"
> > +
> > +	# Unix socket
> > +	$here/src/af_unix "$PROTO_DIR/socket" 2> /dev/null || true
> > +
> > +	# Block device (requires root)
> > +	mknod "$PROTO_DIR/blockdev" b 1 0 2> /dev/null || true
> > +
> > +	# Character device (requires root)
> > +	mknod "$PROTO_DIR/chardev" c 1 3 2> /dev/null || true
> > +
> > +	# File with extended attributes
> > +	echo "file with xattrs" > "$PROTO_DIR/xattrfile"
> > +	setfattr -n user.testattr -v "testvalue" "$PROTO_DIR/xattrfile" 2> /dev/null || true
> > +}
> > +
> > +_require_test
> > +_check_mkfs_xfs_options
> > +
> > +# Create XFS filesystem with full reproducibility options
> > +# Uses -p to populate from directory during mkfs (no mount needed)
> > +_mkfs_xfs_reproducible()
> > +{
> > +	local img=$1
> > +
> > +	# Create fresh image file
> > +	rm -f "$img"
> > +	truncate -s $IMG_SIZE "$img" || return 1
> > +
> > +	# Set environment variables for reproducibility:
> > +	# - SOURCE_DATE_EPOCH: fixes all inode timestamps to this value
> > +	# - DETERMINISTIC_SEED: uses fixed seed (0x53454544) instead of
> > +	#   getrandom()
> > +	#
> > +	# mkfs.xfs options:
> > +	# - -m uuid=: fixed filesystem UUID
> > +	# - -p dir: populate filesystem from directory during creation
> > +	SOURCE_DATE_EPOCH=$FIXED_EPOCH \
> > +	DETERMINISTIC_SEED=1 \
> > +	$MKFS_XFS_PROG \
> > +		-f \
> > +		-m uuid=$FIXED_UUID \
> > +		-p "$PROTO_DIR" \
> > +		"$img" >> $seqres.full 2>&1
> > +
> > +	return $?
> > +}
> > +
> > +# Compute hash of the image file
> > +_hash_image()
> > +{
> > +	sha256sum "$1" | awk '{print $1}'
> > +}
> > +
> > +# Run a single reproducibility test iteration
> > +_run_iteration()
> > +{
> > +	local iteration=$1
> > +
> > +	echo "Iteration $iteration: Creating filesystem with -p $PROTO_DIR" >> $seqres.full
> > +	if ! _mkfs_xfs_reproducible "$IMG_FILE"; then
> > +		echo "mkfs.xfs failed" >> $seqres.full
> > +		return 1
> > +	fi
> > +
> > +	local hash=$(_hash_image "$IMG_FILE")
> > +	echo "Iteration $iteration: Hash = $hash" >> $seqres.full
> > +
> > +	echo $hash
> > +}
> > +
> > +# Create the prototype directory with various file types
> > +_create_proto_dir
> > +
> > +echo "Test: XFS reproducible filesystem image creation"
> > +
> > +# Run three iterations
> > +hash1=$(_run_iteration 1)
> > +[ -z "$hash1" ] && _fail "Iteration 1 failed"
> > +
> > +hash2=$(_run_iteration 2)
> > +[ -z "$hash2" ] && _fail "Iteration 2 failed"
> > +
> > +hash3=$(_run_iteration 3)
> > +[ -z "$hash3" ] && _fail "Iteration 3 failed"
> > +
> > +# Verify all hashes match
> > +if [ "$hash1" = "$hash2" ] && [ "$hash2" = "$hash3" ]; then
> > +	echo "All filesystem images are identical."
> > +else
> > +	echo "ERROR: Filesystem images differ!"
> > +	echo "Hash 1: $hash1"
> > +	echo "Hash 2: $hash2"
> > +	echo "Hash 3: $hash3"
> > +	_fail "Reproducibility test failed - images are not identical"
> 
> As a general note, printing "ERROR: Filesystem images differ!" (or any
> string that's not in the 841.out file) is enough to fail the test, so
> there's no need to call _fail.

Ack

> Other that those comments, this looks good.  Thanks for launching us
> into the reproducible fs image era!
> 
> --D
> 

Thanks for the kind words.
It's an honor to contribute.

L.

> > +fi
> > +
> > +# success, all done
> > +status=0
> > +exit
> > diff --git a/tests/xfs/841.out b/tests/xfs/841.out
> > new file mode 100644
> > index 00000000..3bdfbfda
> > --- /dev/null
> > +++ b/tests/xfs/841.out
> > @@ -0,0 +1,3 @@
> > +QA output created by 841
> > +Test: XFS reproducible filesystem image creation
> > +All filesystem images are identical.
> > -- 
> > 2.52.0
> > 
> > 

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-12-15 15:43 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-12  8:15 [PATCH v2] xfs: test reproducible builds Luca Di Maio
2025-12-12 20:20 ` Darrick J. Wong
2025-12-15 15:42   ` Luca Di Maio

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox