#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2014 Filipe Manana. All Rights Reserved. # # FS QA Test No. btrfs/048 # # Btrfs properties test. The btrfs properties feature was introduced in the # linux kernel 3.14. # Fails without the kernel patches: # btrfs: fix vanished compression property after failed set # btrfs: fix zstd compression parameter # 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 _cleanup() { rm -fr $send_files_dir rm -fr $tmp } # get standard environment, filters and checks . ./common/rc . ./common/filter . ./common/filter.btrfs # real QA test starts here _supported_fs btrfs _require_test _require_scratch _require_btrfs_command "property" _require_btrfs_command inspect-internal dump-super send_files_dir=$TEST_DIR/btrfs-test-$seq rm -f $seqres.full rm -fr $send_files_dir mkdir $send_files_dir _scratch_mkfs >/dev/null 2>&1 _scratch_mount echo "Testing label property" $BTRFS_UTIL_PROG property get $SCRATCH_MNT label echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT label foobar $BTRFS_UTIL_PROG property get $SCRATCH_MNT label echo "***" $BTRFS_UTIL_PROG property get $SCRATCH_MNT echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT label '' $BTRFS_UTIL_PROG property get $SCRATCH_MNT label echo "***" mkdir $SCRATCH_MNT/testdir $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir label 2>&1 | _filter_btrfs_prop_error label echo "***" echo -e "\nTesting subvolume ro property" _run_btrfs_util_prog subvolume create $SCRATCH_MNT/sv1 $BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 ro echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro foo 2>&1 | _filter_btrfs_prop_error echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro true echo "***" $BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 ro echo "***" touch $SCRATCH_MNT/sv1/foobar 2>&1 | _filter_scratch echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/sv1 ro false touch $SCRATCH_MNT/sv1/foobar 2>&1 | _filter_scratch $BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 echo "***" echo -e "\nTesting compression property" mkdir $SCRATCH_MNT/testdir/subdir1 touch $SCRATCH_MNT/testdir/file1 $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression \ foo 2>&1 | _filter_scratch | _filter_btrfs_prop_error SCRATCH_MNT/testdir/file1 echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression lzo $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression # Verify property was persisted. _scratch_unmount _check_scratch_fs _scratch_mount $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression zlib $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/file1 compression '' $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/file1 compression # Test compression property inheritance. echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression lzo $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression echo "***" mkdir $SCRATCH_MNT/testdir/subdir1/subsubdir touch $SCRATCH_MNT/testdir/subdir1/some_file $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression echo "***" $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression echo "***" mkdir $SCRATCH_MNT/testdir/subdir1/subsubdir/foo $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir/foo \ compression echo "***" # Verify property was persisted. _scratch_unmount _check_scratch_fs _scratch_mount $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression echo "***" $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir/foo \ compression echo "***" $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1/subsubdir \ compression '' $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1/some_file \ compression '' $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression '' echo "***" $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/subsubdir compression echo "***" $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file compression echo "***" $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression echo "***" touch $SCRATCH_MNT/testdir/subdir1/some_file_2 $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/some_file_2 \ compression echo "***" # Verify send is able to replicate properties. echo -e "\nTesting properties with send" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/testdir/subdir1 compression lzo touch $SCRATCH_MNT/testdir/subdir1/foobar $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1 compression $BTRFS_UTIL_PROG property get $SCRATCH_MNT/testdir/subdir1/foobar compression echo "***" _run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 touch $SCRATCH_MNT/testdir/subdir1/foobar2 _run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 _run_btrfs_util_prog send -f $send_files_dir/1.snap $SCRATCH_MNT/mysnap1 _run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 -f $send_files_dir/2.snap \ $SCRATCH_MNT/mysnap2 _scratch_unmount _check_scratch_fs _scratch_mkfs >/dev/null 2>&1 _scratch_mount _run_btrfs_util_prog receive -f $send_files_dir/1.snap $SCRATCH_MNT _run_btrfs_util_prog receive -f $send_files_dir/2.snap $SCRATCH_MNT $BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1 compression $BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1/foobar \ compression $BTRFS_UTIL_PROG property get $SCRATCH_MNT/mysnap2/testdir/subdir1/foobar2 \ compression echo "***" _scratch_unmount _check_scratch_fs _scratch_mkfs >/dev/null 2>&1 _scratch_mount echo -e "\nTesting subvolume properties" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'lzo' $BTRFS_UTIL_PROG property get $SCRATCH_MNT compression echo "***" touch $SCRATCH_MNT/file1 $BTRFS_UTIL_PROG property get $SCRATCH_MNT/file1 compression echo "***" mkdir $SCRATCH_MNT/dir1 $BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1 compression echo "***" mkdir $SCRATCH_MNT/dir1/subdir1 $BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1/subdir1 compression echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT/dir1/subdir1 compression 'zlib' touch $SCRATCH_MNT/dir1/subdir1/foo $BTRFS_UTIL_PROG property get $SCRATCH_MNT/dir1/subdir1/foo compression echo -e "\nTesting subvolume property inheritance" _run_btrfs_util_prog subvolume create $SCRATCH_MNT/sv1 $BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1 compression touch $SCRATCH_MNT/sv1/file2 $BTRFS_UTIL_PROG property get $SCRATCH_MNT/sv1/file2 compression echo -e "\nTesting argument validation, should fail" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'lz' 2>&1 | _filter_scratch echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'zli' 2>&1 | _filter_scratch echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'zst' 2>&1 | _filter_scratch echo -e "\nTesting if property is persistent across failed validation" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'lzo' $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'zli' 2>&1 | _filter_scratch $BTRFS_UTIL_PROG property get $SCRATCH_MNT compression echo -e "\nTesting generation is unchanged after failed validation" $BTRFS_UTIL_PROG filesystem sync $SCRATCH_MNT gen_before=$($BTRFS_UTIL_PROG inspect-internal dump-super $SCRATCH_DEV | grep '^generation') $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'lz' 2>&1 | _filter_scratch $BTRFS_UTIL_PROG filesystem sync $SCRATCH_MNT gen_after=$($BTRFS_UTIL_PROG inspect-internal dump-super $SCRATCH_DEV | grep '^generation') [ "$gen_after" == "$gen_before" ] || echo "filesystem generation changed" echo -e "\nTesting argument validation with options" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'zlib:3' echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'zstd:0' echo "***" echo -e "\nTesting invalid argument validation with options, should fail" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'zl:9' 2>&1 | _filter_scratch echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'zli:0' 2>&1 | _filter_scratch echo "***" $BTRFS_UTIL_PROG property set $SCRATCH_MNT compression 'zst:3' 2>&1 | _filter_scratch status=0 exit