Skip to content

ZTS: add mount_loopback to test zfs behind loop dev #17329

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion tests/runfiles/linux.run
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ tests = ['mmp_on_thread', 'mmp_on_uberblocks', 'mmp_on_off', 'mmp_interval',
tags = ['functional', 'mmp']

[tests/functional/mount:Linux]
tests = ['umount_unlinked_drain']
tests = ['umount_unlinked_drain', 'mount_loopback']
tags = ['functional', 'mount']

[tests/functional/pam:Linux]
Expand Down
2 changes: 2 additions & 0 deletions tests/zfs-tests/include/commands.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ export SYSTEM_FILES_COMMON='awk
uniq
vmstat
wc
which
xargs
xxh128sum'

Expand Down Expand Up @@ -146,6 +147,7 @@ export SYSTEM_FILES_LINUX='attr
lscpu
lsmod
lsscsi
mkfs.xfs
mkswap
modprobe
mountpoint
Expand Down
1 change: 1 addition & 0 deletions tests/zfs-tests/tests/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -1673,6 +1673,7 @@ nobase_dist_datadir_zfs_tests_tests_SCRIPTS += \
functional/mmp/setup.ksh \
functional/mount/cleanup.ksh \
functional/mount/setup.ksh \
functional/mount/mount_loopback.ksh \
functional/mount/umount_001.ksh \
functional/mount/umountall_001.ksh \
functional/mount/umount_unlinked_drain.ksh \
Expand Down
111 changes: 111 additions & 0 deletions tests/zfs-tests/tests/functional/mount/mount_loopback.ksh
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#!/bin/ksh -p
# SPDX-License-Identifier: CDDL-1.0
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or https://opensource.org/licenses/CDDL-1.0.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#

# Copyright (c) 2025 by Lawrence Livermore National Security, LLC.

. $STF_SUITE/include/libtest.shlib

#
# DESCRIPTION:
# Verify that we can make an xfs filesystem on a ZFS-backed loopback device.
#
# See:
# https://github.com/openzfs/zfs/pull/17298
# https://github.com/openzfs/zfs/issues/17277
#
# STRATEGY:
# 1. Make a pool
# 2. Make a file on the pool or create zvol
# 3. Mount the file/zvol behind a loopback device
# 4. Create & mount an xfs filesystem on the loopback device
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not to be greedy, but it'd be nice to have an identical test which uses ext4.


function cleanup
{
if [ -d $TEST_BASE_DIR/mnt ] ; then
umount $TEST_BASE_DIR/mnt
log_must rmdir $TEST_BASE_DIR/mnt
fi
if [ -n "$DEV" ] ; then
log_must losetup -d $DEV
fi
destroy_pool $TESTPOOL2
log_must rm -f $TEST_BASE_DIR/file1
}

if ! which mkfs.xfs &>/dev/null ; then
log_unsupported "No mkfs.xfs binary"
fi

if [ ! -d /lib/modules/$(uname -r)/kernel/fs/xfs ] && \
! grep -qE '\sxfs$' /proc/filesystems ; then
log_unsupported "No XFS kernel support"
fi
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since xfs may not be built as a kmod it's probably more reliable to check that either CONFIG_XFS_FS=m or CONFIG_XFS_FS=y is set in /boot/config-$(uname -r).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's the /proc/filesystems check though, right? If it's not a module, then it must be builtin and so in the filesystem list?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@robn that's right - the two checks are to look for modules & built-in filesystems. I actually think the /boot/config-* check is a little more elegant, but I wasn't 100% sure all distros put their configs in /boot.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems to work for at least the distributions covered by the CI. We already do a similar check for uring support in functional/io/io_uring.ksh. If you wanted to be fancy you could first check for /proc/config.gz. Providing the kernel config in /proc/ has been supported for years now, but I'm not sure how commonly it's enabled in distribution kernels.

At least on RHEL8 it's disabled:

/boot/config-4.18.0-553.50.1.el8_10.x86_64:# CONFIG_IKCONFIG is not set
/boot/config-4.18.0-553.51.1.el8_10.x86_64:# CONFIG_IKCONFIG is not set


log_assert "Make an xfs filesystem on a ZFS-backed loopback device"
log_onexit cleanup

# fio options
export NUMJOBS=2
export RUNTIME=3
export PERF_RANDSEED=1234
export PERF_COMPPERCENT=66
export PERF_COMPCHUNK=0
export BLOCKSIZE=128K
export SYNC_TYPE=0
export FILE_SIZE=$(( 1024 * 1024 ))

function do_test
{
imgfile=$1
log_note "Running test on $imgfile"
log_must losetup -f $imgfile
DEV=$(losetup --associated $imgfile | grep -Eo '^/dev/loop[0-9]+')
log_must mkfs.xfs $DEV
mkdir $TEST_BASE_DIR/mnt
log_must mount $DEV $TEST_BASE_DIR/mnt
export DIRECTORY=$TEST_BASE_DIR/mnt

for d in 0 1 ; do
# fio options
export DIRECT=$d
log_must fio $FIO_SCRIPTS/mkfiles.fio
log_must fio $FIO_SCRIPTS/random_reads.fio
done
log_must umount $TEST_BASE_DIR/mnt
log_must rmdir $TEST_BASE_DIR/mnt
log_must losetup -d $DEV
DEV=""
}

log_must truncate -s 1G $TEST_BASE_DIR/file1
log_must zpool create $TESTPOOL2 $TEST_BASE_DIR/file1
log_must truncate -s 512M /$TESTPOOL2/img
do_test /$TESTPOOL2/img
log_must rm /$TESTPOOL2/img
log_must zfs create -V 512M $TESTPOOL2/vol

blkdev="$ZVOL_DEVDIR/$TESTPOOL2/vol"
block_device_wait $blkdev
do_test $blkdev

log_pass "Verified xfs filesystem on a ZFS-backed loopback device"
Loading