diff --git a/products/opensuse/main.pm b/products/opensuse/main.pm index 6566adbe4a7a..a50cc75af6fe 100644 --- a/products/opensuse/main.pm +++ b/products/opensuse/main.pm @@ -481,6 +481,7 @@ sub load_extra_tests() { if (get_var("FILESYSTEM", "btrfs") eq "btrfs") { loadtest "console/btrfs_autocompletion.pm"; if (get_var("NUMDISKS", 0) > 1) { + loadtest "console/btrfs_qgroups.pm"; loadtest "console/btrfs_send_receive.pm"; } } diff --git a/products/sle/main.pm b/products/sle/main.pm index 8f9ec7f46f6a..c70feaa0c12e 100644 --- a/products/sle/main.pm +++ b/products/sle/main.pm @@ -657,6 +657,7 @@ sub load_extra_test () { if (get_var("FILESYSTEM", "btrfs") eq "btrfs") { loadtest "console/btrfs_autocompletion.pm"; if (get_var("NUMDISKS", 0) > 1) { + loadtest "console/btrfs_qgroups.pm"; loadtest "console/btrfs_send_receive.pm"; } } diff --git a/tests/console/btrfs_qgroups.pm b/tests/console/btrfs_qgroups.pm new file mode 100644 index 000000000000..e143ef022473 --- /dev/null +++ b/tests/console/btrfs_qgroups.pm @@ -0,0 +1,77 @@ +# SUSE's openQA tests +# +# Copyright © 2016 SUSE LLC +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. This file is offered as-is, +# without any warranty. + +use base "consoletest"; +use strict; +use testapi; + +my $dest = "/mnt/qg"; + +# poo#11446 +# Creating qgroups in a hierarchy for multiple subvolumes, +# putting data into them and then running btrfsck on the hard disk +sub run() { + select_console 'root-console'; + + # Set up + script_run "mkdir $dest"; + script_run "mkfs.btrfs -f /dev/vdb && mount /dev/vdb $dest && cd $dest"; + script_run "btrfs quota enable ."; + + # Create subvolumes, qgroups, assigns and limits + # 2/1 + # / \ + # 1/1 1/2 + # / \ / | \ + # a b c d(k) + script_run "for c in {a..d}; do btrfs subvolume create \$c; done"; + script_run "for c in 1/1 1/2 2/1; do btrfs qgroup create \$c .; done"; + + script_run "for c in a b; do btrfs qgroup assign \$c 1/1 .; done"; + script_run "for c in b c d; do btrfs qgroup assign \$c 1/2 .; done"; + script_run "for c in 1/1 1/2; do btrfs qgroup assign \$c 2/1 .; done"; + + # Set limits + script_run "btrfs qgroup limit 50m a ."; + script_run "btrfs qgroup limit 100m 1/1 ."; + script_run "btrfs qgroup limit 500m 2/1 ."; + + # Fill with data + script_run "for c in {1..40}; do dd if=/dev/zero bs=1M count=1 of=a/file\$c; done"; + script_run "for c in {1..40}; do dd if=/dev/zero bs=1M count=1 of=b/file\$c; done"; + script_run "for c in {1..200}; do dd if=/dev/zero bs=1M count=1 of=c/file\$c; done"; + script_run "for c in {1..150}; do dd if=/dev/zero bs=1M count=1 of=d/file\$c; done"; + + script_run "btrfs subvolume snapshot d k"; + script_run "btrfs quota rescan -w ."; + script_run "rm d/file\[1-75\]"; + script_run "for c in {51..100}; do dd if=/dev/zero bs=1M count=1 of=k/file\$c; done"; + + # Show structure + type_string "sync\n"; + type_string "btrfs qgroup show --mbytes -pcre .\n"; + + # Check limits + script_run "dd if=/dev/zero bs=10M count=3 of=nofile"; + foreach my $c ('a' .. 'b') { + assert_script_run "! cp nofile $c/nofile"; + script_run "sync && rm $c/nofile"; + } + assert_script_run "cp nofile c/nofile"; + + # TODO? check btrfsck output + script_run "cd; umount $dest"; + assert_script_run "btrfsck /dev/vdb"; +} + +sub test_flags() { + return {important => 1}; +} + +1; diff --git a/tests/console/btrfs_send_receive.pm b/tests/console/btrfs_send_receive.pm index 404f51441262..1c5a0da340f1 100644 --- a/tests/console/btrfs_send_receive.pm +++ b/tests/console/btrfs_send_receive.pm @@ -46,19 +46,19 @@ sub run() { script_run "mkdir $src"; script_run "btrfs subvolume create $src/sv"; script_run "mkdir $dest"; - script_run "mkfs.btrfs /dev/vdb && mount /dev/vdb $dest"; + script_run "mkfs.btrfs -f /dev/vdb && mount /dev/vdb $dest"; # Create full snapshot generate_data; script_run "btrfs subvolume snapshot -r $src/sv $src/snap1"; - script_run "btrfs send $src/snap1 | btrfs receive $dest"; + assert_script_run "btrfs send $src/snap1 | btrfs receive $dest"; compare_data 1; # Create few incremental snapshots for my $i (2 .. 3) { shuffle_data; script_run "btrfs subvolume snapshot -r $src/sv $src/snap$i"; - script_run "btrfs send -p $src/snap" . ($i - 1) . " $src/snap$i | btrfs receive $dest"; + assert_script_run "btrfs send -p $src/snap" . ($i - 1) . " $src/snap$i | btrfs receive $dest"; compare_data $i; } }