btrfs/220: fix how we tests for mount options
[xfstests-dev.git] / tests / btrfs / 220
index 471f5782e727529eb2bd411edd9328a29c96adf4..c84c7065d8c625531c7af6a6b9e76f990fb2db44 100755 (executable)
@@ -24,7 +24,6 @@ trap "cleanup; exit \$status" 0 1 2 3 15
 rm -f $seqres.full
 
 _supported_fs btrfs
-_supported_os Linux
 _require_scratch
 
 cleanup()
@@ -40,13 +39,35 @@ test_mount_flags()
 {
        local opt
        local opt_check
+       local stripped
        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'"
+
+       if [ "$opt_check" != "$DEFAULT_OPTS" ]; then
+               # We only care about the common things between defaults and the
+               # active set, so strip out the uniq lines between the two, and
+               # then we'll add this to our $opt_check which should equal
+               # $active_opt.  We also strip 'rw' as we may be checking 'ro',
+               # so we need to adjust that accordingly
+               stripped=$(echo "$DEFAULT_OPTS,$active_opt" | tr ',' '\n' | \
+                               sort | grep -v 'rw' | uniq -d | tr '\n' ',' | \
+                               sed 's/.$//')
+               opt_check="$opt_check,$stripped"
+       fi
+
+       # We diff by putting our wanted opts together with the current opts,
+       # turning it into one option per line, sort'ing, and then printing out
+       # any uniq lines left.  This will catch anything that is set that we're
+       # not expecting, or anything that wasn't set that we wanted.
+       #
+       # We strip 'rw' because some tests flip ro, so just ignore rw.
+       diff=$(echo "$opt_check,$active_opt" | tr ',' '\n' | \
+               sort | grep -v 'rw' | uniq -u)
+       if [ -n "$diff" ]; then
+               echo "Unexepcted mount options, checking for '$opt_check' in '$active_opt' using '$opt'"
        fi
 }
 
@@ -174,116 +195,124 @@ test_subvol()
        # 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"
+       test_mount_opt "subvol=vol1,subvolid=256" "subvolid=256,subvol=/vol1"
+       test_roundtrip_mount "subvol=vol1" "subvolid=256,subvol=/vol1" "subvolid=256" "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_optional_mount_opts "check_int" "check_int"
+       test_optional_mount_opts "check_int_data" "check_int_data"
+       test_optional_mount_opts "check_int_print_mask=123" "check_int_print_mask=123"
 
        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_optional_mount_opts "fragment=all" "fragment=data,fragment=metadata"
+       test_optional_mount_opts "fragment=data" "fragment=data"
+       test_optional_mount_opts "fragment=metadata" "fragment=metadata"
 }
 
 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 "clear_cache" "clear_cache"
+       test_mount_opt "degraded" "degraded"
 
-       test_mount_opt "inode_cache" "space_cache,inode_cache,subvolid"
+       test_mount_opt "inode_cache" "inode_cache"
 
        # nologreplay should be used only with
        test_should_fail "nologreplay"
-       test_mount_opt "nologreplay,ro" "ro,relatime,rescue=nologreplay,space_cache"
+       test_mount_opt "nologreplay,ro" "ro,rescue=nologreplay"
 
        # 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_mount_opt "norecovery,ro" "ro,rescue=nologreplay"
+       test_mount_opt "rescan_uuid_tree" "rescan_uuid_tree"
+       test_mount_opt "skip_balance" "skip_balance"
+       test_mount_opt "user_subvol_rm_allowed" "user_subvol_rm_allowed"
 
        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"
+       test_mount_opt "rescue=nologreplay,ro" "ro,rescue=nologreplay"
 }
 
 # 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_roundtrip_mount "acl" "$DEFAULT_OPTS" "noacl" "noacl"
+       test_roundtrip_mount "autodefrag" "autodefrag" "noautodefrag" "$DEFAULT_OPTS"
+       test_roundtrip_mount "barrier" "$DEFAULT_OPTS" "nobarrier" "nobarrier"
 
        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_roundtrip_mount "commit=35" "commit=35" "commit=0" "$DEFAULT_OPTS"
 
        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"
+       test_roundtrip_mount "compress" "compress=zlib:3" "compress=lzo" "compress=lzo"
+       test_roundtrip_mount "compress=zstd" "compress=zstd:3" "compress=no" "$DEFAULT_OPTS"
+       test_roundtrip_mount "compress-force=no" "$DEFAULT_OPTS" "compress-force=zstd" "compress-force=zstd:3"
        # 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"
+       test_roundtrip_mount "compress=zlib:20" "compress=zlib:9" "compress=zstd:16" "compress=zstd:15"
+       test_roundtrip_mount "compress-force=lzo" "compress-force=lzo" "compress-force=zlib:4" "compress-force=zlib:4"
 
        # 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"
+       test_roundtrip_mount "nodatacow" "nodatasum,nodatacow" "datacow,datasum" "$DEFAULT_OPTS"
        # nodatacow disabled compression
-       test_roundtrip_mount "compress-force" "relatime,compress-force=zlib:3,space_cache,subvolid" "nodatacow" "relatime,nodatasum,nodatacow,space_cache,subvolid"
+       test_roundtrip_mount "compress-force" "compress-force=zlib:3" "nodatacow" "nodatasum,nodatacow"
 
        # 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_roundtrip_mount "nodatacow" "nodatasum,nodatacow" "datasum" "$DEFAULT_OPTS"
+       test_roundtrip_mount "nodatasum" "nodatasum" "datasum" "$DEFAULT_OPTS"
 
        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 "discard" "discard" "discard=sync" "discard"
+       test_roundtrip_mount "discard=async" "discard=async" "discard=sync" "discard"
+       test_roundtrip_mount "discard=sync" "discard" "nodiscard" "$DEFAULT_OPTS"
 
-       test_roundtrip_mount "enospc_debug" "relatime,space_cache,enospc_debug,subvolid" "noenospc_debug" "relatime,space_cache,subvolid"
+       test_roundtrip_mount "enospc_debug" "enospc_debug" "noenospc_debug" "$DEFAULT_OPTS"
 
        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 "fatal_errors=panic" "fatal_errors=panic" "fatal_errors=bug" "$DEFAULT_OPTS"
 
-       test_roundtrip_mount "flushoncommit" "relatime,flushoncommit,space_cache,subvolid" "noflushoncommit" "relatime,space_cache,subvolid"
+       test_roundtrip_mount "flushoncommit" "flushoncommit" "noflushoncommit" "$DEFAULT_OPTS"
 
        # 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 "max_inline=1024" "max_inline=1024" "max_inline=2048" "$DEFAULT_OPTS"
 
-       test_roundtrip_mount "metadata_ratio=0" "relatime,space_cache,subvolid" "metadata_ratio=10" "space_cache,metadata_ratio=10,subvolid"
+       test_roundtrip_mount "metadata_ratio=0" "$DEFAULT_OPTS" "metadata_ratio=10" "metadata_ratio=10"
 
        # 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_roundtrip_mount "ssd_spread" "ssd_spread" "nossd" "nossd"
+       test_roundtrip_mount "ssd" "ssd" "nossd" "nossd"
+       test_mount_opt "ssd" "ssd"
 
        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 "thread_pool=10" "thread_pool=10" "thread_pool=50" "thread_pool=50"
 
-       test_roundtrip_mount "notreelog" "relatime,notreelog,space_cache" "treelog" "relatime,space_cache,subvolid"
+       test_roundtrip_mount "notreelog" "notreelog" "treelog" "$DEFAULT_OPTS"
 }
 
 # real QA test starts here
 _scratch_mkfs >/dev/null
 
+# This test checks mount options, so having random MOUNT_OPTIONS set could
+# affect the results of a few of these tests.
+MOUNT_OPTIONS=
+
 # create a subvolume that will be used later
 _scratch_mount
+
+# We need to save the current default options so we can validate our changes
+# from one mount option to the next one.
+DEFAULT_OPTS=$(cat /proc/self/mounts | grep $SCRATCH_MNT | \
+               $AWK_PROG '{ print $4 }')
+
 $BTRFS_UTIL_PROG subvolume create "$SCRATCH_MNT/vol1" > /dev/null
 touch "$SCRATCH_MNT/vol1/file.txt"
 _scratch_unmount