mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
btrfs: check if mount opts are applied
This new test will apply different mount points and check if they were applied by reading /proc/self/mounts. Almost all available btrfs options are tested here, leaving only device=, which is tested in btrfs/125 and space_cache, tested in btrfs/131. This test does not apply any workload after the fs is mounted, just checks is the option was set/unset correctly. Kernel with the following patch should pass the test: btrfs: reset compression level for lzo on remount Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
committed by
Eryu Guan
parent
43fbe02d87
commit
85de6a5e53
Executable
+302
@@ -0,0 +1,302 @@
|
||||
#! /bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2020 SUSE Linux Products GmbH. All Rights Reserved.
|
||||
#
|
||||
# FS QA Test 220
|
||||
#
|
||||
# Test all existent mount options of btrfs
|
||||
# * device= argument is already being test by btrfs/125
|
||||
# * space cache test already covered by test btrfs/131
|
||||
seq=`basename $0`
|
||||
seqres=$RESULT_DIR/$seq
|
||||
echo "QA output created by $seq"
|
||||
|
||||
here=`pwd`
|
||||
tmp=/tmp/$$
|
||||
status=1 # failure is the default!
|
||||
trap "cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
# get standard environment, filters and checks
|
||||
. ./common/rc
|
||||
. ./common/filter
|
||||
|
||||
# remove previous $seqres.full before test
|
||||
rm -f $seqres.full
|
||||
|
||||
_supported_fs btrfs
|
||||
_supported_os Linux
|
||||
_require_scratch
|
||||
|
||||
cleanup()
|
||||
{
|
||||
cd /
|
||||
rm -f $tmp.*
|
||||
}
|
||||
|
||||
# Compare the mounted flags with $opt_check. When the comparison fails, $opt is
|
||||
# echoed to help to track which option was used to trigger the unexpected
|
||||
# results.
|
||||
test_mount_flags()
|
||||
{
|
||||
local opt
|
||||
local opt_check
|
||||
opt="$1"
|
||||
opt_check="$2"
|
||||
|
||||
active_opt=$(cat /proc/self/mounts | grep $SCRATCH_MNT | \
|
||||
$AWK_PROG '{ print $4 }')
|
||||
if [[ "$active_opt" != *$opt_check* ]]; then
|
||||
echo "Could not find '$opt_check' in '$active_opt', using '$opt'"
|
||||
fi
|
||||
}
|
||||
|
||||
# Mounts using opt ($1), remounts using remount_opt ($2), and remounts again
|
||||
# using opt again (1), checking if the mount opts are being enabled/disabled by
|
||||
# using _check arguments ($3 and $4)
|
||||
test_enable_disable_mount_opt()
|
||||
{
|
||||
local opt
|
||||
local opt_check
|
||||
local remount_opt
|
||||
local remount_opt_check
|
||||
opt="$1"
|
||||
opt_check="$2"
|
||||
remount_opt="$3"
|
||||
remount_opt_check="$4"
|
||||
|
||||
_scratch_mount "-o $opt"
|
||||
|
||||
test_mount_flags $opt $opt_check
|
||||
|
||||
_scratch_remount $remount_opt
|
||||
|
||||
test_mount_flags $remount_opt $remount_opt_check
|
||||
|
||||
_scratch_remount $opt
|
||||
|
||||
test_mount_flags $opt $opt_check
|
||||
|
||||
_scratch_unmount
|
||||
}
|
||||
|
||||
# Checks if mount options are applied and reverted correctly.
|
||||
# By using options to mount ($1) and remount ($2), this function will mount,
|
||||
# remount, and the mount with the original args, checking if the mount options
|
||||
# match the _check args ($3 and $4).
|
||||
|
||||
# Later, opt and remount_opt are swapped, testing the counterpart option if used
|
||||
# to first mount the fs.
|
||||
test_roundtrip_mount()
|
||||
{
|
||||
local opt
|
||||
local opt_check
|
||||
local remount_opt
|
||||
local remount_opt_check
|
||||
opt="$1"
|
||||
opt_check="$2"
|
||||
remount_opt="$3"
|
||||
remount_opt_check="$4"
|
||||
|
||||
# invert the args to make sure that both options work at mount and
|
||||
# remount time
|
||||
test_enable_disable_mount_opt $opt $opt_check $remount_opt $remount_opt_check
|
||||
test_enable_disable_mount_opt $remount_opt $remount_opt_check $opt $opt_check
|
||||
}
|
||||
|
||||
# Just mount and check if the options were mounted correctly by comparing the
|
||||
# results with $opt_check
|
||||
test_mount_opt()
|
||||
{
|
||||
local opt
|
||||
local opt_check
|
||||
local active_opt
|
||||
opt="$1"
|
||||
opt_check="$2"
|
||||
|
||||
_scratch_mount "-o $opt"
|
||||
|
||||
test_mount_flags $opt $opt_check
|
||||
|
||||
_scratch_unmount
|
||||
}
|
||||
|
||||
# Test mount options that should fail, usually by wrong arguments to options
|
||||
test_should_fail()
|
||||
{
|
||||
local opt
|
||||
opt="$1"
|
||||
|
||||
# wrong $opt on purpose, should fail
|
||||
_try_scratch_mount "-o $opt" >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
return
|
||||
fi
|
||||
echo "Option $opt should fail to mount"
|
||||
_scratch_unmount
|
||||
}
|
||||
|
||||
# Try to mount using $opt, and bail our if the mount fails without errors. If
|
||||
# the mount succeeds, then compare the mount options with $opt_check
|
||||
test_optional_mount_opts()
|
||||
{
|
||||
local opt
|
||||
local opt_check
|
||||
opt="$1"
|
||||
opt_check="$2"
|
||||
|
||||
# $opt not enabled, return without running any tests
|
||||
_try_scratch_mount "-o $opt" >/dev/null 2>&1 || return
|
||||
_scratch_unmount
|
||||
|
||||
# option enabled, run the test
|
||||
test_mount_opt $opt $opt_check
|
||||
}
|
||||
|
||||
# Testes related to subvolumes, from subvol and subvolid options.
|
||||
test_subvol()
|
||||
{
|
||||
test_should_fail "subvol=vol2"
|
||||
|
||||
_scratch_mount "-o subvol=vol1"
|
||||
if [ ! -f "$SCRATCH_MNT/file.txt" ]; then
|
||||
echo "file.txt not found inside vol1 using subvol=vol1 mount option"
|
||||
fi
|
||||
_scratch_unmount
|
||||
|
||||
test_should_fail "subvolid=222"
|
||||
|
||||
_scratch_mount "-o subvolid=256"
|
||||
if [ ! -f "$SCRATCH_MNT/file.txt" ]; then
|
||||
echo "file.txt not found inside vol1 using subvolid=256 mount option"
|
||||
fi
|
||||
_scratch_unmount
|
||||
|
||||
# subvol and subvolid should point to the same subvolume
|
||||
test_should_fail "-o subvol=vol1,subvolid=1234132"
|
||||
|
||||
test_mount_opt "subvol=vol1,subvolid=256" "space_cache,subvolid=256,subvol=/vol1"
|
||||
test_roundtrip_mount "subvol=vol1" "space_cache,subvolid=256,subvol=/vol1" "subvolid=256" "space_cache,subvolid=256,subvol=/vol1"
|
||||
}
|
||||
|
||||
# These options are enable at kernel compile time, so no bother if they fail
|
||||
test_optional_kernel_features()
|
||||
{
|
||||
# Test options that are enabled by kernel config, and so can fail safely
|
||||
test_optional_mount_opts "check_int" "space_cache,check_int,subvolid"
|
||||
test_optional_mount_opts "check_int_data" "space_cache,check_int_data,subvolid"
|
||||
test_optional_mount_opts "check_int_print_mask=123" "space_cache,check_int_print_mask=123,subvolid"
|
||||
|
||||
test_should_fail "fragment=invalid"
|
||||
test_optional_mount_opts "fragment=all" "space_cache,fragment=data,fragment=metadata,subvolid"
|
||||
test_optional_mount_opts "fragment=data" "space_cache,fragment=data,subvolid"
|
||||
test_optional_mount_opts "fragment=metadata" "space_cache,fragment=metadata,subvolid"
|
||||
}
|
||||
|
||||
test_non_revertible_options()
|
||||
{
|
||||
test_mount_opt "clear_cache" "relatime,space_cache,clear_cache,subvolid"
|
||||
test_mount_opt "degraded" "relatime,degraded,space_cache,subvolid"
|
||||
|
||||
test_mount_opt "inode_cache" "space_cache,inode_cache,subvolid"
|
||||
|
||||
# nologreplay should be used only with
|
||||
test_should_fail "nologreplay"
|
||||
test_mount_opt "nologreplay,ro" "ro,relatime,rescue=nologreplay,space_cache"
|
||||
|
||||
# norecovery should be used only with. This options is an alias to nologreplay
|
||||
test_should_fail "norecovery"
|
||||
test_mount_opt "norecovery,ro" "ro,relatime,rescue=nologreplay,space_cache"
|
||||
test_mount_opt "rescan_uuid_tree" "relatime,space_cache,rescan_uuid_tree,subvolid"
|
||||
test_mount_opt "skip_balance" "relatime,space_cache,skip_balance,subvolid"
|
||||
test_mount_opt "user_subvol_rm_allowed" "space_cache,user_subvol_rm_allowed,subvolid"
|
||||
|
||||
test_should_fail "rescue=invalid"
|
||||
|
||||
# nologreplay requires readonly
|
||||
test_should_fail "rescue=nologreplay"
|
||||
test_mount_opt "rescue=nologreplay,ro" "relatime,rescue=nologreplay,space_cache"
|
||||
|
||||
test_mount_opt "rescue=usebackuproot,ro" "relatime,space_cache,subvolid"
|
||||
}
|
||||
|
||||
# All these options can be reverted (with their "no" counterpart), or can have
|
||||
# their values set to default on remount
|
||||
test_revertible_options()
|
||||
{
|
||||
test_roundtrip_mount "acl" "relatime,space_cache,subvolid" "noacl" "relatime,noacl,space_cache,subvolid"
|
||||
test_roundtrip_mount "autodefrag" "relatime,space_cache,autodefrag" "noautodefrag" "relatime,space_cache,subvolid"
|
||||
test_roundtrip_mount "barrier" "relatime,space_cache,subvolid" "nobarrier" "relatime,nobarrier,space_cache,subvolid"
|
||||
|
||||
test_should_fail "commit=-10"
|
||||
# commit=0 sets the default, so btrfs hides this mount opt
|
||||
test_roundtrip_mount "commit=35" "relatime,space_cache,commit=35,subvolid" "commit=0" "relatime,space_cache,subvolid"
|
||||
|
||||
test_should_fail "compress=invalid"
|
||||
test_should_fail "compress-force=invalid"
|
||||
test_roundtrip_mount "compress" "relatime,compress=zlib:3,space_cache,subvolid" "compress=lzo" "relatime,compress=lzo,space_cache,subvolid"
|
||||
test_roundtrip_mount "compress=zstd" "relatime,compress=zstd:3,space_cache,subvolid" "compress=no" "relatime,space_cache,subvolid"
|
||||
test_roundtrip_mount "compress-force=no" "relatime,space_cache,subvolid" "compress-force=zstd" "relatime,compress-force=zstd:3,space_cache,subvolid"
|
||||
# zlib's max level is 9 and zstd's max level is 15
|
||||
test_roundtrip_mount "compress=zlib:20" "relatime,compress=zlib:9,space_cache,subvolid" "compress=zstd:16" "relatime,compress=zstd:15,space_cache,subvolid"
|
||||
test_roundtrip_mount "compress-force=lzo" "relatime,compress-force=lzo,space_cache,subvolid" "compress-force=zlib:4" "relatime,compress-force=zlib:4,space_cache,subvolid"
|
||||
|
||||
# on remount, if we only pass datacow after nodatacow was used it will remain with nodatasum
|
||||
test_roundtrip_mount "nodatacow" "relatime,nodatasum,nodatacow,space_cache,subvolid" "datacow,datasum" "relatime,space_cache,subvolid"
|
||||
# nodatacow disabled compression
|
||||
test_roundtrip_mount "compress-force" "relatime,compress-force=zlib:3,space_cache,subvolid" "nodatacow" "relatime,nodatasum,nodatacow,space_cache,subvolid"
|
||||
|
||||
# nodatacow disabled both datacow and datasum, and datasum enabled datacow and datasum
|
||||
test_roundtrip_mount "nodatacow" "relatime,nodatasum,nodatacow,space_cache,subvolid" "datasum" "relatime,space_cache,subvolid"
|
||||
test_roundtrip_mount "nodatasum" "relatime,nodatasum,space_cache,subvolid" "datasum" "relatime,space_cache,subvolid"
|
||||
|
||||
test_should_fail "discard=invalid"
|
||||
test_roundtrip_mount "discard" "relatime,discard,space_cache,subvolid" "discard=sync" "relatime,discard,space_cache,subvolid"
|
||||
test_roundtrip_mount "discard=async" "relatime,discard=async,space_cache,subvolid" "discard=sync" "relatime,discard,space_cache,subvolid"
|
||||
test_roundtrip_mount "discard=sync" "relatime,discard,space_cache,subvolid" "nodiscard" "relatime,space_cache,subvolid"
|
||||
|
||||
test_roundtrip_mount "enospc_debug" "relatime,space_cache,enospc_debug,subvolid" "noenospc_debug" "relatime,space_cache,subvolid"
|
||||
|
||||
test_should_fail "fatal_errors=pani"
|
||||
# fatal_errors=bug is the default
|
||||
test_roundtrip_mount "fatal_errors=panic" "relatime,space_cache,fatal_errors=panic,subvolid" "fatal_errors=bug" "relatime,space_cache,subvolid"
|
||||
|
||||
test_roundtrip_mount "flushoncommit" "relatime,flushoncommit,space_cache,subvolid" "noflushoncommit" "relatime,space_cache,subvolid"
|
||||
|
||||
# 2048 is the max_inline default value
|
||||
test_roundtrip_mount "max_inline=1024" "relatime,max_inline=1024,space_cache" "max_inline=2048" "relatime,space_cache,subvolid"
|
||||
|
||||
test_roundtrip_mount "metadata_ratio=0" "relatime,space_cache,subvolid" "metadata_ratio=10" "space_cache,metadata_ratio=10,subvolid"
|
||||
|
||||
# ssd_spread implies ssd, while nossd_spread only disables ssd_spread
|
||||
test_roundtrip_mount "ssd_spread" "relatime,ssd_spread,space_cache" "nossd" "relatime,nossd,space_cache,subvolid"
|
||||
test_roundtrip_mount "ssd" "relatime,ssd,space_cache" "nossd" "relatime,nossd,space_cache,subvolid"
|
||||
test_mount_opt "ssd" "relatime,ssd,space_cache"
|
||||
|
||||
test_should_fail "thread_pool=-10"
|
||||
test_should_fail "thread_pool=0"
|
||||
test_roundtrip_mount "thread_pool=10" "relatime,thread_pool=10,space_cache" "thread_pool=50" "relatime,thread_pool=50,space_cache"
|
||||
|
||||
test_roundtrip_mount "notreelog" "relatime,notreelog,space_cache" "treelog" "relatime,space_cache,subvolid"
|
||||
}
|
||||
|
||||
# real QA test starts here
|
||||
_scratch_mkfs >/dev/null
|
||||
|
||||
# create a subvolume that will be used later
|
||||
_scratch_mount
|
||||
$BTRFS_UTIL_PROG subvolume create "$SCRATCH_MNT/vol1" > /dev/null
|
||||
touch "$SCRATCH_MNT/vol1/file.txt"
|
||||
_scratch_unmount
|
||||
|
||||
test_optional_kernel_features
|
||||
|
||||
test_non_revertible_options
|
||||
|
||||
test_revertible_options
|
||||
|
||||
test_subvol
|
||||
|
||||
echo "Silence is golden"
|
||||
|
||||
status=0
|
||||
exit
|
||||
@@ -0,0 +1,2 @@
|
||||
QA output created by 220
|
||||
Silence is golden
|
||||
@@ -221,3 +221,4 @@
|
||||
217 auto quick trim dangerous
|
||||
218 auto quick volume
|
||||
219 auto quick volume
|
||||
220 auto quick
|
||||
|
||||
Reference in New Issue
Block a user