From 2fae26bd8b752cfae083962a152f4b1ee54ada17 Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Fri, 23 Feb 2018 16:31:00 +0000 Subject: [PATCH] Add the ZFS test suite It was originally written by Sun as part of the STF (Solaris test framework). They open sourced it in OpenSolaris, then HighCloud partially ported it to FreeBSD, and Spectra Logic finished the port. We also added many testcases, fixed many broken ones, and converted them all to the ATF framework. We've had help along the way from avg, araujo, smh, and brd. By default most of the tests are disabled. Set the disks Kyua variable to enable them. Submitted by: asomers, will, justing, ken, brd, avg, araujo, smh Sponsored by: Spectra Logic Corp, HighCloud --- etc/mtree/BSD.tests.dist | 246 ++ share/mk/atf.test.mk | 26 + tests/sys/Makefile | 7 + tests/sys/cddl/Makefile | 13 + tests/sys/cddl/zfs/Makefile | 11 + tests/sys/cddl/zfs/bin/Makefile | 61 + tests/sys/cddl/zfs/bin/bsddisks.ksh | 6 + tests/sys/cddl/zfs/bin/chg_usr_exec.c | 78 + tests/sys/cddl/zfs/bin/devname2devid.c | 123 + tests/sys/cddl/zfs/bin/dir_rd_update.c | 122 + tests/sys/cddl/zfs/bin/dircmp.ksh | 5 + tests/sys/cddl/zfs/bin/dumpadm.ksh | 10 + tests/sys/cddl/zfs/bin/ff.ksh | 6 + tests/sys/cddl/zfs/bin/file_check.c | 89 + tests/sys/cddl/zfs/bin/file_common.h | 65 + tests/sys/cddl/zfs/bin/file_trunc.c | 240 ++ tests/sys/cddl/zfs/bin/file_write.c | 239 ++ tests/sys/cddl/zfs/bin/fmadm.ksh | 6 + tests/sys/cddl/zfs/bin/fmdump.ksh | 6 + tests/sys/cddl/zfs/bin/format.ksh | 6 + tests/sys/cddl/zfs/bin/groupadd.ksh | 13 + tests/sys/cddl/zfs/bin/groupdel.ksh | 13 + tests/sys/cddl/zfs/bin/groupmod.ksh | 13 + tests/sys/cddl/zfs/bin/groupshow.ksh | 5 + tests/sys/cddl/zfs/bin/largest_file.c | 132 + tests/sys/cddl/zfs/bin/mkfile.c | 214 + tests/sys/cddl/zfs/bin/mktree.c | 196 + tests/sys/cddl/zfs/bin/mmapwrite.c | 99 + tests/sys/cddl/zfs/bin/randfree_file.c | 104 + tests/sys/cddl/zfs/bin/readmmap.c | 140 + tests/sys/cddl/zfs/bin/rename_dir.c | 92 + tests/sys/cddl/zfs/bin/rm_lnkcnt_zero_file.c | 148 + tests/sys/cddl/zfs/bin/svcs.ksh | 6 + tests/sys/cddl/zfs/bin/swap.ksh | 5 + tests/sys/cddl/zfs/bin/testenv.ksh | 8 + tests/sys/cddl/zfs/bin/useradd.ksh | 13 + tests/sys/cddl/zfs/bin/userdel.ksh | 13 + tests/sys/cddl/zfs/bin/usermod.ksh | 13 + tests/sys/cddl/zfs/bin/zfs.ksh | 44 + tests/sys/cddl/zfs/bin/zfs_crypto.ksh | 59 + tests/sys/cddl/zfs/bin/zfs_version.ksh | 68 + tests/sys/cddl/zfs/bin/zlogin.ksh | 6 + tests/sys/cddl/zfs/bin/zoneadm.ksh | 6 + tests/sys/cddl/zfs/bin/zonecfg.ksh | 6 + tests/sys/cddl/zfs/bin/zpool.ksh | 46 + tests/sys/cddl/zfs/bin/zpool_bsd.ksh | 42 + tests/sys/cddl/zfs/bin/zpool_smi.ksh | 138 + tests/sys/cddl/zfs/bin/zpool_version.ksh | 73 + tests/sys/cddl/zfs/include/Makefile | 32 + tests/sys/cddl/zfs/include/commands.txt | 194 + tests/sys/cddl/zfs/include/constants.cfg | 113 + tests/sys/cddl/zfs/include/default.cfg.in | 52 + tests/sys/cddl/zfs/include/libgnop.kshlib | 98 + tests/sys/cddl/zfs/include/libremote.kshlib | 47 + tests/sys/cddl/zfs/include/libtest.kshlib | 3480 +++++++++++++++++ tests/sys/cddl/zfs/include/libtest_test.sh | 44 + tests/sys/cddl/zfs/include/logapi.kshlib | 419 ++ tests/sys/cddl/zfs/include/stf.shlib | 55 + tests/sys/cddl/zfs/include/testenv.ksh | 21 + tests/sys/cddl/zfs/include/testenv.kshlib | 22 + .../cddl/zfs/include/translatecommands.awk | 40 + tests/sys/cddl/zfs/tests/Makefile | 89 + tests/sys/cddl/zfs/tests/acl/Makefile | 18 + tests/sys/cddl/zfs/tests/acl/acl.cfg | 72 + .../sys/cddl/zfs/tests/acl/acl_common.kshlib | 638 +++ tests/sys/cddl/zfs/tests/acl/cifs/Makefile | 18 + tests/sys/cddl/zfs/tests/acl/cifs/cifs.kshlib | 91 + .../zfs/tests/acl/cifs/cifs_attr_001_pos.ksh | 262 ++ .../zfs/tests/acl/cifs/cifs_attr_002_pos.ksh | 280 ++ .../zfs/tests/acl/cifs/cifs_attr_003_pos.ksh | 622 +++ .../sys/cddl/zfs/tests/acl/cifs/cifs_test.sh | 116 + tests/sys/cddl/zfs/tests/acl/cleanup.ksh | 44 + .../cddl/zfs/tests/acl/nontrivial/Makefile | 40 + .../tests/acl/nontrivial/nontrivial_test.sh | 695 ++++ .../acl/nontrivial/zfs_acl_chmod_001_neg.ksh | 151 + .../acl/nontrivial/zfs_acl_chmod_002_pos.ksh | 82 + .../zfs_acl_chmod_aclmode_001_pos.ksh | 490 +++ .../zfs_acl_chmod_compact_001_pos.ksh | 274 ++ .../zfs_acl_chmod_delete_001_pos.ksh | 321 ++ .../zfs_acl_chmod_inherit_001_pos.ksh | 193 + .../zfs_acl_chmod_inherit_002_pos.ksh | 415 ++ .../zfs_acl_chmod_inherit_003_pos.ksh | 449 +++ .../zfs_acl_chmod_inherit_004_pos.ksh | 162 + .../zfs_acl_chmod_owner_001_pos.ksh | 402 ++ .../zfs_acl_chmod_rwacl_001_pos.ksh | 262 ++ .../nontrivial/zfs_acl_chmod_rwx_001_pos.ksh | 141 + .../nontrivial/zfs_acl_chmod_rwx_002_pos.ksh | 261 ++ .../nontrivial/zfs_acl_chmod_rwx_003_pos.ksh | 152 + .../nontrivial/zfs_acl_chmod_rwx_004_pos.ksh | 155 + .../zfs_acl_chmod_xattr_001_pos.ksh | 257 ++ .../zfs_acl_chmod_xattr_002_pos.ksh | 252 ++ .../acl/nontrivial/zfs_acl_cp_001_pos.ksh | 115 + .../acl/nontrivial/zfs_acl_cp_002_pos.ksh | 121 + .../acl/nontrivial/zfs_acl_cpio_001_pos.ksh | 140 + .../acl/nontrivial/zfs_acl_cpio_002_pos.ksh | 144 + .../acl/nontrivial/zfs_acl_find_001_pos.ksh | 144 + .../acl/nontrivial/zfs_acl_ls_001_pos.ksh | 124 + .../acl/nontrivial/zfs_acl_mv_001_pos.ksh | 190 + .../acl/nontrivial/zfs_acl_tar_001_pos.ksh | 124 + .../acl/nontrivial/zfs_acl_tar_002_pos.ksh | 131 + tests/sys/cddl/zfs/tests/acl/setup.ksh | 66 + tests/sys/cddl/zfs/tests/acl/trivial/Makefile | 33 + .../zfs/tests/acl/trivial/trivial_test.sh | 516 +++ .../acl/trivial/zfs_acl_chmod_001_pos.ksh | 151 + .../acl/trivial/zfs_acl_compress_001_pos.ksh | 92 + .../tests/acl/trivial/zfs_acl_cp_001_pos.ksh | 95 + .../tests/acl/trivial/zfs_acl_cp_002_neg.ksh | 92 + .../tests/acl/trivial/zfs_acl_cp_003_neg.ksh | 138 + .../acl/trivial/zfs_acl_find_001_pos.ksh | 101 + .../acl/trivial/zfs_acl_find_002_neg.ksh | 107 + .../tests/acl/trivial/zfs_acl_ls_001_pos.ksh | 88 + .../tests/acl/trivial/zfs_acl_ls_002_neg.ksh | 89 + .../tests/acl/trivial/zfs_acl_mv_001_pos.ksh | 87 + .../acl/trivial/zfs_acl_pack_001_pos.ksh | 92 + .../tests/acl/trivial/zfs_acl_pax_001_pos.ksh | 104 + .../tests/acl/trivial/zfs_acl_pax_002_pos.ksh | 103 + .../tests/acl/trivial/zfs_acl_pax_003_pos.ksh | 98 + .../tests/acl/trivial/zfs_acl_pax_004_pos.ksh | 104 + .../tests/acl/trivial/zfs_acl_pax_005_pos.ksh | 111 + .../tests/acl/trivial/zfs_acl_pax_006_pos.ksh | 111 + .../tests/acl/trivial/zfs_acl_tar_001_pos.ksh | 102 + .../tests/acl/trivial/zfs_acl_tar_002_neg.ksh | 118 + tests/sys/cddl/zfs/tests/atime/Makefile | 20 + tests/sys/cddl/zfs/tests/atime/atime.cfg | 35 + .../cddl/zfs/tests/atime/atime_001_pos.ksh | 85 + .../cddl/zfs/tests/atime/atime_002_neg.ksh | 86 + .../cddl/zfs/tests/atime/atime_common.kshlib | 72 + tests/sys/cddl/zfs/tests/atime/atime_test.sh | 86 + tests/sys/cddl/zfs/tests/atime/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/atime/setup.ksh | 36 + tests/sys/cddl/zfs/tests/bootfs/Makefile | 24 + tests/sys/cddl/zfs/tests/bootfs/bootfs.cfg | 33 + .../cddl/zfs/tests/bootfs/bootfs_001_pos.ksh | 98 + .../cddl/zfs/tests/bootfs/bootfs_002_neg.ksh | 81 + .../cddl/zfs/tests/bootfs/bootfs_003_pos.ksh | 109 + .../cddl/zfs/tests/bootfs/bootfs_004_neg.ksh | 110 + .../cddl/zfs/tests/bootfs/bootfs_005_neg.ksh | 103 + .../cddl/zfs/tests/bootfs/bootfs_006_pos.ksh | 162 + .../cddl/zfs/tests/bootfs/bootfs_007_pos.ksh | 81 + .../cddl/zfs/tests/bootfs/bootfs_008_neg.ksh | 96 + .../cddl/zfs/tests/bootfs/bootfs_009_neg.ksh | 97 + .../sys/cddl/zfs/tests/bootfs/bootfs_test.sh | 180 + tests/sys/cddl/zfs/tests/cache/Makefile | 29 + tests/sys/cddl/zfs/tests/cache/cache.cfg | 47 + tests/sys/cddl/zfs/tests/cache/cache.kshlib | 182 + .../cddl/zfs/tests/cache/cache_001_pos.ksh | 78 + .../cddl/zfs/tests/cache/cache_002_pos.ksh | 78 + .../cddl/zfs/tests/cache/cache_003_pos.ksh | 81 + .../cddl/zfs/tests/cache/cache_004_neg.ksh | 76 + .../cddl/zfs/tests/cache/cache_005_neg.ksh | 77 + .../cddl/zfs/tests/cache/cache_006_pos.ksh | 97 + .../cddl/zfs/tests/cache/cache_007_neg.ksh | 75 + .../cddl/zfs/tests/cache/cache_008_neg.ksh | 79 + .../cddl/zfs/tests/cache/cache_009_pos.ksh | 85 + .../cddl/zfs/tests/cache/cache_010_neg.ksh | 102 + .../cddl/zfs/tests/cache/cache_011_pos.ksh | 80 + tests/sys/cddl/zfs/tests/cache/cache_test.sh | 340 ++ tests/sys/cddl/zfs/tests/cache/cleanup.ksh | 44 + tests/sys/cddl/zfs/tests/cache/setup.ksh | 45 + tests/sys/cddl/zfs/tests/cachefile/Makefile | 20 + .../cddl/zfs/tests/cachefile/cachefile.cfg | 38 + .../cddl/zfs/tests/cachefile/cachefile.kshlib | 53 + .../zfs/tests/cachefile/cachefile_001_pos.ksh | 107 + .../zfs/tests/cachefile/cachefile_002_pos.ksh | 92 + .../zfs/tests/cachefile/cachefile_003_pos.ksh | 113 + .../zfs/tests/cachefile/cachefile_004_pos.ksh | 136 + .../zfs/tests/cachefile/cachefile_test.sh | 104 + .../sys/cddl/zfs/tests/clean_mirror/Makefile | 22 + .../clean_mirror/clean_mirror_001_pos.ksh | 67 + .../clean_mirror/clean_mirror_002_pos.ksh | 67 + .../clean_mirror/clean_mirror_003_pos.ksh | 67 + .../clean_mirror/clean_mirror_004_pos.ksh | 67 + .../clean_mirror/clean_mirror_common.kshlib | 79 + .../tests/clean_mirror/clean_mirror_test.sh | 133 + .../cddl/zfs/tests/clean_mirror/cleanup.ksh | 47 + .../cddl/zfs/tests/clean_mirror/default.cfg | 57 + .../sys/cddl/zfs/tests/clean_mirror/setup.ksh | 47 + tests/sys/cddl/zfs/tests/cli_root/Makefile | 60 + tests/sys/cddl/zfs/tests/cli_root/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/cli_root/cli.cfg | 55 + .../cddl/zfs/tests/cli_root/cli_common.kshlib | 91 + tests/sys/cddl/zfs/tests/cli_root/setup.ksh | 36 + .../sys/cddl/zfs/tests/cli_root/zdb/Makefile | 18 + .../cddl/zfs/tests/cli_root/zdb/cleanup.ksh | 34 + .../sys/cddl/zfs/tests/cli_root/zdb/setup.ksh | 36 + tests/sys/cddl/zfs/tests/cli_root/zdb/zdb.cfg | 32 + .../zfs/tests/cli_root/zdb/zdb_001_neg.ksh | 86 + .../cddl/zfs/tests/cli_root/zdb/zdb_test.sh | 57 + .../sys/cddl/zfs/tests/cli_root/zfs/Makefile | 20 + .../cddl/zfs/tests/cli_root/zfs/cleanup.ksh | 34 + .../sys/cddl/zfs/tests/cli_root/zfs/setup.ksh | 36 + .../zfs/tests/cli_root/zfs/zfs_001_neg.ksh | 90 + .../zfs/tests/cli_root/zfs/zfs_002_pos.ksh | 127 + .../zfs/tests/cli_root/zfs/zfs_003_neg.ksh | 77 + .../zfs/tests/cli_root/zfs/zfs_malformed.cfg | 32 + .../cddl/zfs/tests/cli_root/zfs/zfs_test.sh | 108 + .../zfs/tests/cli_root/zfs_clone/Makefile | 26 + .../zfs/tests/cli_root/zfs_clone/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_clone/setup.ksh | 36 + .../tests/cli_root/zfs_clone/zfs_clone.cfg | 35 + .../cli_root/zfs_clone/zfs_clone_001_neg.ksh | 143 + .../cli_root/zfs_clone/zfs_clone_002_pos.ksh | 106 + .../cli_root/zfs_clone/zfs_clone_003_pos.ksh | 99 + .../cli_root/zfs_clone/zfs_clone_004_pos.ksh | 107 + .../cli_root/zfs_clone/zfs_clone_005_pos.ksh | 99 + .../cli_root/zfs_clone/zfs_clone_006_pos.ksh | 105 + .../cli_root/zfs_clone/zfs_clone_007_pos.ksh | 106 + .../cli_root/zfs_clone/zfs_clone_008_neg.ksh | 97 + .../cli_root/zfs_clone/zfs_clone_009_neg.ksh | 97 + .../cli_root/zfs_clone/zfs_clone_test.sh | 257 ++ .../zfs/tests/cli_root/zfs_copies/Makefile | 24 + .../zfs/tests/cli_root/zfs_copies/cleanup.ksh | 48 + .../zfs/tests/cli_root/zfs_copies/setup.ksh | 39 + .../tests/cli_root/zfs_copies/zfs_copies.cfg | 40 + .../cli_root/zfs_copies/zfs_copies.kshlib | 146 + .../zfs_copies/zfs_copies_001_pos.ksh | 126 + .../zfs_copies/zfs_copies_002_pos.ksh | 117 + .../zfs_copies/zfs_copies_003_pos.ksh | 82 + .../zfs_copies/zfs_copies_004_neg.ksh | 71 + .../zfs_copies/zfs_copies_005_neg.ksh | 89 + .../zfs_copies/zfs_copies_006_pos.ksh | 91 + .../cli_root/zfs_copies/zfs_copies_test.sh | 196 + .../zfs/tests/cli_root/zfs_create/Makefile | 32 + .../zfs/tests/cli_root/zfs_create/cleanup.ksh | 34 + .../cli_root/zfs_create/properties.kshlib | 83 + .../zfs/tests/cli_root/zfs_create/setup.ksh | 36 + .../tests/cli_root/zfs_create/zfs_create.cfg | 56 + .../zfs_create/zfs_create_001_pos.ksh | 84 + .../zfs_create/zfs_create_002_pos.ksh | 96 + .../zfs_create/zfs_create_003_pos.ksh | 81 + .../zfs_create/zfs_create_004_pos.ksh | 92 + .../zfs_create/zfs_create_005_pos.ksh | 101 + .../zfs_create/zfs_create_006_pos.ksh | 103 + .../zfs_create/zfs_create_007_pos.ksh | 106 + .../zfs_create/zfs_create_008_neg.ksh | 113 + .../zfs_create/zfs_create_009_neg.ksh | 139 + .../zfs_create/zfs_create_010_neg.ksh | 161 + .../zfs_create/zfs_create_011_pos.ksh | 87 + .../zfs_create/zfs_create_012_pos.ksh | 92 + .../zfs_create/zfs_create_013_pos.ksh | 96 + .../zfs_create/zfs_create_common.kshlib | 56 + .../cli_root/zfs_create/zfs_create_test.sh | 410 ++ .../zfs/tests/cli_root/zfs_destroy/Makefile | 25 + .../tests/cli_root/zfs_destroy/cleanup.ksh | 36 + .../zfs/tests/cli_root/zfs_destroy/setup.ksh | 36 + .../cli_root/zfs_destroy/zfs_destroy.cfg | 44 + .../zfs_destroy/zfs_destroy_001_pos.ksh | 215 + .../zfs_destroy/zfs_destroy_002_pos.ksh | 114 + .../zfs_destroy/zfs_destroy_003_pos.ksh | 168 + .../zfs_destroy/zfs_destroy_004_pos.ksh | 132 + .../zfs_destroy/zfs_destroy_005_neg.ksh | 197 + .../zfs_destroy/zfs_destroy_006_neg.ksh | 79 + .../zfs_destroy/zfs_destroy_007_neg.ksh | 86 + .../zfs_destroy/zfs_destroy_common.kshlib | 173 + .../cli_root/zfs_destroy/zfs_destroy_test.sh | 228 ++ .../cddl/zfs/tests/cli_root/zfs_diff/Makefile | 20 + .../zfs/tests/cli_root/zfs_diff/cleanup.ksh | 33 + .../zfs/tests/cli_root/zfs_diff/setup.ksh | 34 + .../zfs/tests/cli_root/zfs_diff/zfs_diff.cfg | 30 + .../cli_root/zfs_diff/zfs_diff_001_pos.golden | 13 + .../cli_root/zfs_diff/zfs_diff_001_pos.ksh | 79 + .../tests/cli_root/zfs_diff/zfs_diff_test.sh | 56 + .../cddl/zfs/tests/cli_root/zfs_get/Makefile | 29 + .../zfs/tests/cli_root/zfs_get/cleanup.ksh | 34 + .../cddl/zfs/tests/cli_root/zfs_get/setup.ksh | 36 + .../zfs/tests/cli_root/zfs_get/zfs_get.cfg | 34 + .../cli_root/zfs_get/zfs_get_001_pos.ksh | 160 + .../cli_root/zfs_get/zfs_get_002_pos.ksh | 116 + .../cli_root/zfs_get/zfs_get_003_pos.ksh | 79 + .../cli_root/zfs_get/zfs_get_004_pos.ksh | 246 ++ .../cli_root/zfs_get/zfs_get_005_neg.ksh | 140 + .../cli_root/zfs_get/zfs_get_006_neg.ksh | 78 + .../cli_root/zfs_get/zfs_get_007_neg.ksh | 78 + .../cli_root/zfs_get/zfs_get_008_pos.ksh | 113 + .../cli_root/zfs_get/zfs_get_009_pos.ksh | 105 + .../cli_root/zfs_get/zfs_get_010_neg.ksh | 77 + .../cli_root/zfs_get/zfs_get_common.kshlib | 102 + .../cli_root/zfs_get/zfs_get_list_d.kshlib | 94 + .../tests/cli_root/zfs_get/zfs_get_test.sh | 323 ++ .../zfs/tests/cli_root/zfs_inherit/Makefile | 20 + .../tests/cli_root/zfs_inherit/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_inherit/setup.ksh | 36 + .../cli_root/zfs_inherit/zfs_inherit.cfg | 30 + .../zfs_inherit/zfs_inherit_001_neg.ksh | 96 + .../zfs_inherit/zfs_inherit_002_neg.ksh | 114 + .../zfs_inherit/zfs_inherit_003_pos.ksh | 104 + .../cli_root/zfs_inherit/zfs_inherit_test.sh | 107 + .../zfs/tests/cli_root/zfs_mount/Makefile | 30 + .../zfs/tests/cli_root/zfs_mount/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_mount/setup.ksh | 36 + .../tests/cli_root/zfs_mount/zfs_mount.cfg | 42 + .../tests/cli_root/zfs_mount/zfs_mount.kshlib | 135 + .../cli_root/zfs_mount/zfs_mount_001_pos.ksh | 81 + .../cli_root/zfs_mount/zfs_mount_002_pos.ksh | 92 + .../cli_root/zfs_mount/zfs_mount_003_pos.ksh | 104 + .../cli_root/zfs_mount/zfs_mount_004_pos.ksh | 97 + .../cli_root/zfs_mount/zfs_mount_005_pos.ksh | 100 + .../cli_root/zfs_mount/zfs_mount_006_pos.ksh | 138 + .../cli_root/zfs_mount/zfs_mount_007_pos.ksh | 152 + .../cli_root/zfs_mount/zfs_mount_008_pos.ksh | 109 + .../cli_root/zfs_mount/zfs_mount_009_neg.ksh | 127 + .../cli_root/zfs_mount/zfs_mount_010_neg.ksh | 85 + .../cli_root/zfs_mount/zfs_mount_011_neg.ksh | 95 + .../zfs_mount/zfs_mount_all_001_pos.ksh | 197 + .../cli_root/zfs_mount/zfs_mount_test.sh | 372 ++ .../zfs/tests/cli_root/zfs_promote/Makefile | 26 + .../tests/cli_root/zfs_promote/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_promote/setup.ksh | 36 + .../cli_root/zfs_promote/zfs_promote.cfg | 46 + .../zfs_promote/zfs_promote_001_pos.ksh | 139 + .../zfs_promote/zfs_promote_002_pos.ksh | 114 + .../zfs_promote/zfs_promote_003_pos.ksh | 146 + .../zfs_promote/zfs_promote_004_pos.ksh | 152 + .../zfs_promote/zfs_promote_005_pos.ksh | 87 + .../zfs_promote/zfs_promote_006_neg.ksh | 98 + .../zfs_promote/zfs_promote_007_neg.ksh | 90 + .../zfs_promote/zfs_promote_008_pos.ksh | 97 + .../zfs_promote/zfs_promote_common.kshlib | 48 + .../cli_root/zfs_promote/zfs_promote_test.sh | 248 ++ .../zfs/tests/cli_root/zfs_property/Makefile | 18 + .../tests/cli_root/zfs_property/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_property/setup.ksh | 36 + .../cli_root/zfs_property/zfs_property.cfg | 32 + .../zfs_property/zfs_property_test.sh | 57 + .../zfs_property/zfs_set_property_001_pos.ksh | 88 + .../zfs/tests/cli_root/zfs_receive/Makefile | 26 + .../tests/cli_root/zfs_receive/cleanup.ksh | 37 + .../zfs/tests/cli_root/zfs_receive/setup.ksh | 39 + .../cli_root/zfs_receive/zfs_receive.cfg | 36 + .../zfs_receive/zfs_receive_001_pos.ksh | 188 + .../zfs_receive/zfs_receive_002_pos.ksh | 122 + .../zfs_receive/zfs_receive_003_pos.ksh | 107 + .../zfs_receive/zfs_receive_004_neg.ksh | 119 + .../zfs_receive/zfs_receive_005_neg.ksh | 113 + .../zfs_receive/zfs_receive_006_pos.ksh | 122 + .../zfs_receive/zfs_receive_007_neg.ksh | 98 + .../zfs_receive/zfs_receive_008_pos.ksh | 162 + .../zfs_receive/zfs_receive_009_neg.ksh | 132 + .../cli_root/zfs_receive/zfs_receive_test.sh | 257 ++ .../zfs/tests/cli_root/zfs_rename/Makefile | 31 + .../zfs/tests/cli_root/zfs_rename/cleanup.ksh | 43 + .../zfs/tests/cli_root/zfs_rename/setup.ksh | 48 + .../tests/cli_root/zfs_rename/zfs_rename.cfg | 41 + .../cli_root/zfs_rename/zfs_rename.kshlib | 117 + .../zfs_rename/zfs_rename_001_pos.ksh | 121 + .../zfs_rename/zfs_rename_002_pos.ksh | 104 + .../zfs_rename/zfs_rename_003_pos.ksh | 82 + .../zfs_rename/zfs_rename_004_neg.ksh | 125 + .../zfs_rename/zfs_rename_005_neg.ksh | 105 + .../zfs_rename/zfs_rename_006_pos.ksh | 92 + .../zfs_rename/zfs_rename_007_pos.ksh | 170 + .../zfs_rename/zfs_rename_008_pos.ksh | 108 + .../zfs_rename/zfs_rename_009_neg.ksh | 96 + .../zfs_rename/zfs_rename_010_neg.ksh | 93 + .../zfs_rename/zfs_rename_011_pos.ksh | 95 + .../zfs_rename/zfs_rename_012_neg.ksh | 81 + .../zfs_rename/zfs_rename_013_pos.ksh | 105 + .../cli_root/zfs_rename/zfs_rename_test.sh | 383 ++ .../tests/cli_root/zfs_reservation/Makefile | 19 + .../cli_root/zfs_reservation/cleanup.ksh | 34 + .../tests/cli_root/zfs_reservation/setup.ksh | 36 + .../zfs_reservation/zfs_reservation.cfg | 32 + .../zfs_reservation_001_pos.ksh | 77 + .../zfs_reservation_002_pos.ksh | 101 + .../zfs_reservation/zfs_reservation_test.sh | 82 + .../zfs/tests/cli_root/zfs_rollback/Makefile | 22 + .../tests/cli_root/zfs_rollback/cleanup.ksh | 39 + .../zfs/tests/cli_root/zfs_rollback/setup.ksh | 35 + .../cli_root/zfs_rollback/zfs_rollback.cfg | 53 + .../zfs_rollback/zfs_rollback_001_pos.ksh | 181 + .../zfs_rollback/zfs_rollback_002_pos.ksh | 82 + .../zfs_rollback/zfs_rollback_003_neg.ksh | 98 + .../zfs_rollback/zfs_rollback_004_neg.ksh | 100 + .../zfs_rollback/zfs_rollback_common.kshlib | 305 ++ .../zfs_rollback/zfs_rollback_test.sh | 144 + .../cddl/zfs/tests/cli_root/zfs_send/Makefile | 21 + .../zfs/tests/cli_root/zfs_send/cleanup.ksh | 37 + .../zfs/tests/cli_root/zfs_send/setup.ksh | 36 + .../zfs/tests/cli_root/zfs_send/zfs_send.cfg | 36 + .../cli_root/zfs_send/zfs_send_001_pos.ksh | 140 + .../cli_root/zfs_send/zfs_send_002_pos.ksh | 152 + .../cli_root/zfs_send/zfs_send_003_pos.ksh | 83 + .../cli_root/zfs_send/zfs_send_004_neg.ksh | 123 + .../tests/cli_root/zfs_send/zfs_send_test.sh | 132 + .../cddl/zfs/tests/cli_root/zfs_set/Makefile | 44 + .../tests/cli_root/zfs_set/cache_001_pos.ksh | 81 + .../tests/cli_root/zfs_set/cache_002_neg.ksh | 81 + .../cli_root/zfs_set/canmount_001_pos.ksh | 137 + .../cli_root/zfs_set/canmount_002_pos.ksh | 170 + .../cli_root/zfs_set/canmount_003_pos.ksh | 131 + .../cli_root/zfs_set/canmount_004_pos.ksh | 113 + .../cli_root/zfs_set/checksum_001_pos.ksh | 85 + .../zfs/tests/cli_root/zfs_set/cleanup.ksh | 34 + .../cli_root/zfs_set/compression_001_pos.ksh | 81 + .../cli_root/zfs_set/mountpoint_001_pos.ksh | 112 + .../cli_root/zfs_set/mountpoint_002_pos.ksh | 110 + .../cli_root/zfs_set/mountpoint_003_pos.ksh | 116 + .../tests/cli_root/zfs_set/onoffs_001_pos.ksh | 106 + .../zfs_set/property_alias_001_pos.ksh | 158 + .../cli_root/zfs_set/readonly_001_pos.ksh | 172 + .../cli_root/zfs_set/reservation_001_neg.ksh | 116 + .../cli_root/zfs_set/ro_props_001_pos.ksh | 163 + .../cddl/zfs/tests/cli_root/zfs_set/setup.ksh | 35 + .../cli_root/zfs_set/share_mount_001_neg.ksh | 78 + .../cli_root/zfs_set/snapdir_001_pos.ksh | 128 + .../zfs_set/user_property_001_pos.ksh | 83 + .../zfs_set/user_property_002_pos.ksh | 136 + .../zfs_set/user_property_003_neg.ksh | 81 + .../zfs_set/user_property_004_pos.ksh | 115 + .../cli_root/zfs_set/version_001_neg.ksh | 109 + .../zfs/tests/cli_root/zfs_set/zfs_set.cfg | 35 + .../cli_root/zfs_set/zfs_set_001_neg.ksh | 93 + .../cli_root/zfs_set/zfs_set_002_neg.ksh | 76 + .../cli_root/zfs_set/zfs_set_003_neg.ksh | 91 + .../cli_root/zfs_set/zfs_set_common.kshlib | 253 ++ .../tests/cli_root/zfs_set/zfs_set_test.sh | 765 ++++ .../zfs/tests/cli_root/zfs_share/Makefile | 28 + .../zfs/tests/cli_root/zfs_share/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_share/setup.ksh | 38 + .../tests/cli_root/zfs_share/zfs_share.cfg | 35 + .../cli_root/zfs_share/zfs_share_001_pos.ksh | 163 + .../cli_root/zfs_share/zfs_share_002_pos.ksh | 86 + .../cli_root/zfs_share/zfs_share_003_pos.ksh | 124 + .../cli_root/zfs_share/zfs_share_004_pos.ksh | 109 + .../cli_root/zfs_share/zfs_share_005_pos.ksh | 97 + .../cli_root/zfs_share/zfs_share_006_pos.ksh | 119 + .../cli_root/zfs_share/zfs_share_007_neg.ksh | 99 + .../cli_root/zfs_share/zfs_share_008_neg.ksh | 88 + .../cli_root/zfs_share/zfs_share_009_neg.ksh | 87 + .../cli_root/zfs_share/zfs_share_009_pos.ksh | 113 + .../cli_root/zfs_share/zfs_share_010_neg.ksh | 74 + .../cli_root/zfs_share/zfs_share_test.sh | 296 ++ .../zfs/tests/cli_root/zfs_snapshot/Makefile | 24 + .../tests/cli_root/zfs_snapshot/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_snapshot/setup.ksh | 36 + .../cli_root/zfs_snapshot/zfs_snapshot.cfg | 37 + .../zfs_snapshot/zfs_snapshot_001_neg.ksh | 132 + .../zfs_snapshot/zfs_snapshot_002_neg.ksh | 111 + .../zfs_snapshot/zfs_snapshot_003_neg.ksh | 79 + .../zfs_snapshot/zfs_snapshot_004_neg.ksh | 111 + .../zfs_snapshot/zfs_snapshot_005_neg.ksh | 102 + .../zfs_snapshot/zfs_snapshot_006_pos.ksh | 143 + .../zfs_snapshot/zfs_snapshot_007_neg.ksh | 146 + .../zfs_snapshot/zfs_snapshot_test.sh | 207 + .../zfs/tests/cli_root/zfs_unmount/Makefile | 28 + .../tests/cli_root/zfs_unmount/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_unmount/setup.ksh | 36 + .../cli_root/zfs_unmount/zfs_unmount.cfg | 42 + .../cli_root/zfs_unmount/zfs_unmount.kshlib | 76 + .../zfs_unmount/zfs_unmount_001_pos.ksh | 130 + .../zfs_unmount/zfs_unmount_002_pos.ksh | 112 + .../zfs_unmount/zfs_unmount_003_pos.ksh | 123 + .../zfs_unmount/zfs_unmount_004_pos.ksh | 113 + .../zfs_unmount/zfs_unmount_005_pos.ksh | 127 + .../zfs_unmount/zfs_unmount_006_pos.ksh | 85 + .../zfs_unmount/zfs_unmount_007_neg.ksh | 124 + .../zfs_unmount/zfs_unmount_008_neg.ksh | 157 + .../zfs_unmount/zfs_unmount_009_pos.ksh | 141 + .../zfs_unmount/zfs_unmount_all_001_pos.ksh | 209 + .../cli_root/zfs_unmount/zfs_unmount_test.sh | 310 ++ .../zfs/tests/cli_root/zfs_unshare/Makefile | 22 + .../tests/cli_root/zfs_unshare/cleanup.ksh | 34 + .../zfs/tests/cli_root/zfs_unshare/setup.ksh | 38 + .../cli_root/zfs_unshare/zfs_unshare.cfg | 35 + .../zfs_unshare/zfs_unshare_001_pos.ksh | 195 + .../zfs_unshare/zfs_unshare_002_pos.ksh | 194 + .../zfs_unshare/zfs_unshare_003_pos.ksh | 109 + .../zfs_unshare/zfs_unshare_004_neg.ksh | 95 + .../zfs_unshare/zfs_unshare_005_neg.ksh | 74 + .../cli_root/zfs_unshare/zfs_unshare_test.sh | 152 + .../zfs/tests/cli_root/zfs_upgrade/Makefile | 25 + .../tests/cli_root/zfs_upgrade/cleanup.ksh | 37 + .../zfs/tests/cli_root/zfs_upgrade/setup.ksh | 46 + .../cli_root/zfs_upgrade/zfs_upgrade.cfg | 35 + .../cli_root/zfs_upgrade/zfs_upgrade.kshlib | 196 + .../zfs_upgrade/zfs_upgrade_001_pos.ksh | 154 + .../zfs_upgrade/zfs_upgrade_002_pos.ksh | 81 + .../zfs_upgrade/zfs_upgrade_003_pos.ksh | 118 + .../zfs_upgrade/zfs_upgrade_004_pos.ksh | 122 + .../zfs_upgrade/zfs_upgrade_005_pos.ksh | 126 + .../zfs_upgrade/zfs_upgrade_006_neg.ksh | 72 + .../zfs_upgrade/zfs_upgrade_007_neg.ksh | 73 + .../cli_root/zfs_upgrade/zfs_upgrade_test.sh | 225 ++ .../cddl/zfs/tests/cli_root/zpool/Makefile | 20 + .../cddl/zfs/tests/cli_root/zpool/cleanup.ksh | 34 + .../cddl/zfs/tests/cli_root/zpool/setup.ksh | 36 + .../cddl/zfs/tests/cli_root/zpool/zpool.cfg | 32 + .../tests/cli_root/zpool/zpool_001_neg.ksh | 83 + .../tests/cli_root/zpool/zpool_002_pos.ksh | 110 + .../tests/cli_root/zpool/zpool_003_pos.ksh | 83 + .../zfs/tests/cli_root/zpool/zpool_test.sh | 107 + .../zfs/tests/cli_root/zpool_add/Makefile | 28 + .../zfs/tests/cli_root/zpool_add/cleanup.ksh | 37 + .../zfs/tests/cli_root/zpool_add/setup.ksh | 52 + .../tests/cli_root/zpool_add/zpool_add.cfg | 69 + .../tests/cli_root/zpool_add/zpool_add.kshlib | 154 + .../cli_root/zpool_add/zpool_add_001_pos.ksh | 148 + .../cli_root/zpool_add/zpool_add_002_pos.ksh | 85 + .../cli_root/zpool_add/zpool_add_003_pos.ksh | 91 + .../cli_root/zpool_add/zpool_add_004_pos.ksh | 90 + .../cli_root/zpool_add/zpool_add_005_pos.ksh | 102 + .../cli_root/zpool_add/zpool_add_006_pos.ksh | 161 + .../cli_root/zpool_add/zpool_add_007_neg.ksh | 84 + .../cli_root/zpool_add/zpool_add_008_neg.ksh | 85 + .../cli_root/zpool_add/zpool_add_009_neg.ksh | 83 + .../cli_root/zpool_add/zpool_add_010_pos.ksh | 56 + .../cli_root/zpool_add/zpool_add_test.sh | 313 ++ .../zfs/tests/cli_root/zpool_attach/Makefile | 18 + .../tests/cli_root/zpool_attach/cleanup.ksh | 36 + .../zfs/tests/cli_root/zpool_attach/setup.ksh | 38 + .../cli_root/zpool_attach/zpool_attach.cfg | 32 + .../zpool_attach/zpool_attach_001_neg.ksh | 96 + .../zpool_attach/zpool_attach_test.sh | 57 + .../zfs/tests/cli_root/zpool_clear/Makefile | 21 + .../tests/cli_root/zpool_clear/cleanup.ksh | 34 + .../cli_root/zpool_clear/zpool_clear.cfg | 37 + .../zpool_clear/zpool_clear_001_pos.ksh | 110 + .../zpool_clear/zpool_clear_002_neg.ksh | 88 + .../zpool_clear/zpool_clear_003_neg.ksh | 79 + .../zpool_clear/zpool_clear_004_pos.ksh | 97 + .../zpool_clear/zpool_clear_005_pos.ksh | 77 + .../cli_root/zpool_clear/zpool_clear_test.sh | 151 + .../zfs/tests/cli_root/zpool_create/Makefile | 41 + .../tests/cli_root/zpool_create/cleanup.ksh | 45 + .../zfs/tests/cli_root/zpool_create/setup.ksh | 53 + .../cli_root/zpool_create/zpool_create.cfg | 77 + .../cli_root/zpool_create/zpool_create.kshlib | 131 + .../zpool_create/zpool_create_001_pos.ksh | 133 + .../zpool_create/zpool_create_002_pos.ksh | 121 + .../zpool_create/zpool_create_003_pos.ksh | 95 + .../zpool_create/zpool_create_004_pos.ksh | 94 + .../zpool_create/zpool_create_005_pos.ksh | 122 + .../zpool_create/zpool_create_006_pos.ksh | 141 + .../zpool_create/zpool_create_007_neg.ksh | 97 + .../zpool_create/zpool_create_008_pos.ksh | 158 + .../zpool_create/zpool_create_009_neg.ksh | 102 + .../zpool_create/zpool_create_010_neg.ksh | 97 + .../zpool_create/zpool_create_011_neg.ksh | 140 + .../zpool_create/zpool_create_012_neg.ksh | 80 + .../zpool_create/zpool_create_013_neg.ksh | 116 + .../zpool_create/zpool_create_014_neg.ksh | 103 + .../zpool_create/zpool_create_015_neg.ksh | 103 + .../zpool_create/zpool_create_016_pos.ksh | 100 + .../zpool_create/zpool_create_017_neg.ksh | 102 + .../zpool_create/zpool_create_018_pos.ksh | 120 + .../zpool_create/zpool_create_019_pos.ksh | 91 + .../zpool_create/zpool_create_020_pos.ksh | 123 + .../zpool_create/zpool_create_021_pos.ksh | 106 + .../zpool_create/zpool_create_022_pos.ksh | 113 + .../zpool_create/zpool_create_023_neg.ksh | 102 + .../zpool_create/zpool_create_test.sh | 677 ++++ .../zfs/tests/cli_root/zpool_destroy/Makefile | 21 + .../tests/cli_root/zpool_destroy/cleanup.ksh | 33 + .../cli_root/zpool_destroy/zpool_destroy.cfg | 35 + .../zpool_destroy/zpool_destroy_001_pos.ksh | 88 + .../zpool_destroy/zpool_destroy_002_pos.ksh | 122 + .../zpool_destroy/zpool_destroy_003_neg.ksh | 70 + .../zpool_destroy/zpool_destroy_004_pos.ksh | 146 + .../zpool_destroy/zpool_destroy_test.sh | 129 + .../zfs/tests/cli_root/zpool_detach/Makefile | 18 + .../tests/cli_root/zpool_detach/cleanup.ksh | 36 + .../zfs/tests/cli_root/zpool_detach/setup.ksh | 38 + .../cli_root/zpool_detach/zpool_detach.cfg | 32 + .../zpool_detach/zpool_detach_001_neg.ksh | 83 + .../zpool_detach/zpool_detach_test.sh | 57 + .../zfs/tests/cli_root/zpool_expand/Makefile | 20 + .../tests/cli_root/zpool_expand/cleanup.ksh | 36 + .../zfs/tests/cli_root/zpool_expand/setup.ksh | 42 + .../cli_root/zpool_expand/zpool_expand.cfg | 47 + .../zpool_expand/zpool_expand_001_pos.ksh | 138 + .../zpool_expand/zpool_expand_002_pos.ksh | 142 + .../zpool_expand/zpool_expand_003_neg.ksh | 128 + .../zpool_expand/zpool_expand_test.sh | 110 + .../zfs/tests/cli_root/zpool_export/Makefile | 21 + .../tests/cli_root/zpool_export/cleanup.ksh | 34 + .../zfs/tests/cli_root/zpool_export/setup.ksh | 36 + .../cli_root/zpool_export/zpool_export.cfg | 32 + .../zpool_export/zpool_export_001_pos.ksh | 83 + .../zpool_export/zpool_export_002_pos.ksh | 94 + .../zpool_export/zpool_export_003_neg.ksh | 82 + .../zpool_export/zpool_export_004_pos.ksh | 117 + .../zpool_export/zpool_export_test.sh | 132 + .../zfs/tests/cli_root/zpool_get/Makefile | 21 + .../zfs/tests/cli_root/zpool_get/cleanup.ksh | 36 + .../zfs/tests/cli_root/zpool_get/setup.ksh | 37 + .../tests/cli_root/zpool_get/zpool_get.cfg | 71 + .../cli_root/zpool_get/zpool_get_001_pos.ksh | 75 + .../cli_root/zpool_get/zpool_get_002_pos.ksh | 108 + .../cli_root/zpool_get/zpool_get_003_pos.ksh | 85 + .../cli_root/zpool_get/zpool_get_004_neg.ksh | 75 + .../cli_root/zpool_get/zpool_get_test.sh | 130 + .../zfs/tests/cli_root/zpool_history/Makefile | 19 + .../tests/cli_root/zpool_history/cleanup.ksh | 37 + .../tests/cli_root/zpool_history/setup.ksh | 35 + .../cli_root/zpool_history/zpool_history.cfg | 30 + .../zpool_history/zpool_history_001_neg.ksh | 83 + .../zpool_history/zpool_history_002_pos.ksh | 70 + .../zpool_history/zpool_history_test.sh | 82 + .../zfs/tests/cli_root/zpool_import/Makefile | 43 + .../cli_root/zpool_import/blockfiles/Makefile | 12 + .../cli_root/zpool_import/blockfiles/README | 31 + .../blockfiles/unclean_export.dat.bz2 | Bin 0 -> 14161 bytes .../tests/cli_root/zpool_import/cleanup.ksh | 62 + .../zfs/tests/cli_root/zpool_import/setup.ksh | 79 + .../cli_root/zpool_import/zpool_import.cfg | 135 + .../cli_root/zpool_import/zpool_import.kshlib | 35 + .../zpool_import/zpool_import_002_pos.ksh | 166 + .../zpool_import/zpool_import_003_pos.ksh | 78 + .../zpool_import/zpool_import_004_pos.ksh | 110 + .../zpool_import/zpool_import_005_pos.ksh | 112 + .../zpool_import/zpool_import_006_pos.ksh | 107 + .../zpool_import/zpool_import_007_pos.ksh | 111 + .../zpool_import/zpool_import_008_pos.ksh | 112 + .../zpool_import/zpool_import_009_neg.ksh | 115 + .../zpool_import/zpool_import_010_pos.ksh | 109 + .../zpool_import/zpool_import_011_neg.ksh | 94 + .../zpool_import/zpool_import_012_pos.ksh | 194 + .../zpool_import/zpool_import_013_neg.ksh | 87 + .../zpool_import/zpool_import_014_pos.ksh | 66 + .../zpool_import/zpool_import_all_001_pos.ksh | 238 ++ .../zpool_import_corrupt_001_pos.ksh | 130 + .../zpool_import_destroyed_001_neg.ksh | 66 + .../zpool_import_destroyed_002_neg.ksh | 59 + .../zpool_import_missing_001_pos.ksh | 171 + .../zpool_import_missing_002_pos.ksh | 150 + .../zpool_import_missing_003_pos.ksh | 239 ++ .../zpool_import_missing_004_pos.ksh | 101 + .../zpool_import_missing_005_pos.ksh | 124 + .../zpool_import_rename_001_pos.ksh | 181 + .../zpool_import/zpool_import_test.sh | 589 +++ .../zfs/tests/cli_root/zpool_offline/Makefile | 19 + .../tests/cli_root/zpool_offline/cleanup.ksh | 36 + .../tests/cli_root/zpool_offline/setup.ksh | 38 + .../cli_root/zpool_offline/zpool_offline.cfg | 32 + .../zpool_offline/zpool_offline_001_pos.ksh | 138 + .../zpool_offline/zpool_offline_002_neg.ksh | 109 + .../zpool_offline/zpool_offline_test.sh | 82 + .../zfs/tests/cli_root/zpool_online/Makefile | 19 + .../tests/cli_root/zpool_online/cleanup.ksh | 36 + .../zfs/tests/cli_root/zpool_online/setup.ksh | 38 + .../cli_root/zpool_online/zpool_online.cfg | 32 + .../zpool_online/zpool_online_001_pos.ksh | 126 + .../zpool_online/zpool_online_002_neg.ksh | 88 + .../zpool_online/zpool_online_test.sh | 82 + .../zfs/tests/cli_root/zpool_remove/Makefile | 20 + .../tests/cli_root/zpool_remove/cleanup.ksh | 36 + .../zfs/tests/cli_root/zpool_remove/setup.ksh | 37 + .../cli_root/zpool_remove/zpool_remove.cfg | 35 + .../zpool_remove/zpool_remove_001_neg.ksh | 108 + .../zpool_remove/zpool_remove_002_pos.ksh | 79 + .../zpool_remove/zpool_remove_003_pos.ksh | 90 + .../zpool_remove/zpool_remove_test.sh | 107 + .../zfs/tests/cli_root/zpool_replace/Makefile | 19 + .../tests/cli_root/zpool_replace/cleanup.ksh | 36 + .../tests/cli_root/zpool_replace/setup.ksh | 38 + .../cli_root/zpool_replace/zpool_replace.cfg | 32 + .../zpool_replace/zpool_replace_001_neg.ksh | 96 + .../zpool_replace/zpool_replace_002_neg.ksh | 40 + .../zpool_replace/zpool_replace_test.sh | 79 + .../zfs/tests/cli_root/zpool_scrub/Makefile | 22 + .../tests/cli_root/zpool_scrub/cleanup.ksh | 36 + .../zfs/tests/cli_root/zpool_scrub/setup.ksh | 45 + .../cli_root/zpool_scrub/zpool_scrub.cfg | 34 + .../zpool_scrub/zpool_scrub_001_neg.ksh | 76 + .../zpool_scrub/zpool_scrub_002_pos.ksh | 66 + .../zpool_scrub/zpool_scrub_003_pos.ksh | 89 + .../zpool_scrub/zpool_scrub_004_pos.ksh | 76 + .../zpool_scrub/zpool_scrub_005_pos.ksh | 77 + .../cli_root/zpool_scrub/zpool_scrub_test.sh | 157 + .../zfs/tests/cli_root/zpool_set/Makefile | 17 + .../cli_root/zpool_set/zpool_set_001_pos.ksh | 80 + .../cli_root/zpool_set/zpool_set_002_neg.ksh | 144 + .../cli_root/zpool_set/zpool_set_003_neg.ksh | 95 + .../cli_root/zpool_set/zpool_set_test.sh | 77 + .../zfs/tests/cli_root/zpool_status/Makefile | 19 + .../tests/cli_root/zpool_status/cleanup.ksh | 34 + .../zfs/tests/cli_root/zpool_status/setup.ksh | 36 + .../cli_root/zpool_status/zpool_status.cfg | 32 + .../zpool_status/zpool_status_001_pos.ksh | 75 + .../zpool_status/zpool_status_002_pos.ksh | 80 + .../zpool_status/zpool_status_test.sh | 82 + .../zfs/tests/cli_root/zpool_upgrade/Makefile | 29 + .../zpool_upgrade/blockfiles/Makefile | 65 + .../cli_root/zpool_upgrade/blockfiles/README | 34 + .../blockfiles/zfs-broken-mirror1.dat.Z | Bin 0 -> 43027 bytes .../blockfiles/zfs-broken-mirror2.dat.Z | Bin 0 -> 77195 bytes .../blockfiles/zfs-pool-v1.dat.Z | Bin 0 -> 82255 bytes .../blockfiles/zfs-pool-v10.dat.Z | Bin 0 -> 84381 bytes .../blockfiles/zfs-pool-v11.dat.Z | Bin 0 -> 78551 bytes .../blockfiles/zfs-pool-v12.dat.Z | Bin 0 -> 78717 bytes .../blockfiles/zfs-pool-v13.dat.Z | Bin 0 -> 81519 bytes .../blockfiles/zfs-pool-v14.dat.Z | Bin 0 -> 81669 bytes .../blockfiles/zfs-pool-v15.dat.Z | Bin 0 -> 94841 bytes .../blockfiles/zfs-pool-v1mirror1.dat.Z | Bin 0 -> 86301 bytes .../blockfiles/zfs-pool-v1mirror2.dat.Z | Bin 0 -> 86277 bytes .../blockfiles/zfs-pool-v1mirror3.dat.Z | Bin 0 -> 86319 bytes .../blockfiles/zfs-pool-v1raidz1.dat.Z | Bin 0 -> 72903 bytes .../blockfiles/zfs-pool-v1raidz2.dat.Z | Bin 0 -> 67753 bytes .../blockfiles/zfs-pool-v1raidz3.dat.Z | Bin 0 -> 72119 bytes .../blockfiles/zfs-pool-v1stripe1.dat.Z | Bin 0 -> 50441 bytes .../blockfiles/zfs-pool-v1stripe2.dat.Z | Bin 0 -> 50223 bytes .../blockfiles/zfs-pool-v1stripe3.dat.Z | Bin 0 -> 85825 bytes .../blockfiles/zfs-pool-v2.dat.Z | Bin 0 -> 83157 bytes .../blockfiles/zfs-pool-v28.dat.Z | Bin 0 -> 52860 bytes .../blockfiles/zfs-pool-v2mirror1.dat.Z | Bin 0 -> 112015 bytes .../blockfiles/zfs-pool-v2mirror2.dat.Z | Bin 0 -> 112019 bytes .../blockfiles/zfs-pool-v2mirror3.dat.Z | Bin 0 -> 112023 bytes .../blockfiles/zfs-pool-v2raidz1.dat.Z | Bin 0 -> 96249 bytes .../blockfiles/zfs-pool-v2raidz2.dat.Z | Bin 0 -> 103399 bytes .../blockfiles/zfs-pool-v2raidz3.dat.Z | Bin 0 -> 99425 bytes .../blockfiles/zfs-pool-v2stripe1.dat.Z | Bin 0 -> 77433 bytes .../blockfiles/zfs-pool-v2stripe2.dat.Z | Bin 0 -> 66485 bytes .../blockfiles/zfs-pool-v2stripe3.dat.Z | Bin 0 -> 77869 bytes .../blockfiles/zfs-pool-v3.dat.Z | Bin 0 -> 69699 bytes .../blockfiles/zfs-pool-v3hotspare1.dat.Z | Bin 0 -> 113405 bytes .../blockfiles/zfs-pool-v3hotspare2.dat.Z | Bin 0 -> 96439 bytes .../blockfiles/zfs-pool-v3hotspare3.dat.Z | Bin 0 -> 54789 bytes .../blockfiles/zfs-pool-v3mirror1.dat.Z | Bin 0 -> 71439 bytes .../blockfiles/zfs-pool-v3mirror2.dat.Z | Bin 0 -> 71457 bytes .../blockfiles/zfs-pool-v3mirror3.dat.Z | Bin 0 -> 71455 bytes .../blockfiles/zfs-pool-v3raidz1.dat.Z | Bin 0 -> 67695 bytes .../blockfiles/zfs-pool-v3raidz2.dat.Z | Bin 0 -> 67771 bytes .../blockfiles/zfs-pool-v3raidz21.dat.Z | Bin 0 -> 70207 bytes .../blockfiles/zfs-pool-v3raidz22.dat.Z | Bin 0 -> 70163 bytes .../blockfiles/zfs-pool-v3raidz23.dat.Z | Bin 0 -> 70173 bytes .../blockfiles/zfs-pool-v3raidz3.dat.Z | Bin 0 -> 67749 bytes .../blockfiles/zfs-pool-v3stripe1.dat.Z | Bin 0 -> 60789 bytes .../blockfiles/zfs-pool-v3stripe2.dat.Z | Bin 0 -> 58073 bytes .../blockfiles/zfs-pool-v3stripe3.dat.Z | Bin 0 -> 60861 bytes .../blockfiles/zfs-pool-v4.dat.Z | Bin 0 -> 106121 bytes .../blockfiles/zfs-pool-v5.dat.Z | Bin 0 -> 115725 bytes .../blockfiles/zfs-pool-v5000.dat.Z | Bin 0 -> 56867 bytes .../blockfiles/zfs-pool-v6.dat.Z | Bin 0 -> 101989 bytes .../blockfiles/zfs-pool-v7.dat.Z | Bin 0 -> 94261 bytes .../blockfiles/zfs-pool-v8.dat.Z | Bin 0 -> 94625 bytes .../blockfiles/zfs-pool-v9.dat.Z | Bin 0 -> 88061 bytes .../blockfiles/zfs-pool-v999.dat.Z | Bin 0 -> 85575 bytes .../blockfiles/zfs-pool-vBROKEN.dat.Z | Bin 0 -> 66695 bytes .../tests/cli_root/zpool_upgrade/cleanup.ksh | 55 + .../zpool_upgrade/create_upgrade_pool_dat.sh | 42 + .../tests/cli_root/zpool_upgrade/setup.ksh | 44 + .../cli_root/zpool_upgrade/zpool_upgrade.cfg | 293 ++ .../zpool_upgrade/zpool_upgrade.kshlib | 162 + .../zpool_upgrade/zpool_upgrade_001_pos.ksh | 90 + .../zpool_upgrade/zpool_upgrade_002_pos.ksh | 77 + .../zpool_upgrade/zpool_upgrade_003_pos.ksh | 75 + .../zpool_upgrade/zpool_upgrade_004_pos.ksh | 104 + .../zpool_upgrade/zpool_upgrade_005_neg.ksh | 74 + .../zpool_upgrade/zpool_upgrade_006_neg.ksh | 73 + .../zpool_upgrade/zpool_upgrade_007_pos.ksh | 89 + .../zpool_upgrade/zpool_upgrade_008_pos.ksh | 99 + .../zpool_upgrade/zpool_upgrade_009_neg.ksh | 92 + .../zpool_upgrade/zpool_upgrade_test.sh | 290 ++ tests/sys/cddl/zfs/tests/cli_user/Makefile | 19 + tests/sys/cddl/zfs/tests/cli_user/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/cli_user/cli.cfg | 36 + .../cddl/zfs/tests/cli_user/cli_user.kshlib | 35 + .../sys/cddl/zfs/tests/cli_user/misc/Makefile | 59 + .../cddl/zfs/tests/cli_user/misc/cleanup.ksh | 42 + .../sys/cddl/zfs/tests/cli_user/misc/misc.cfg | 72 + .../cddl/zfs/tests/cli_user/misc/misc_test.sh | 1174 ++++++ .../cddl/zfs/tests/cli_user/misc/setup.ksh | 173 + .../zfs/tests/cli_user/misc/setup_basic.ksh | 32 + .../zfs/tests/cli_user/misc/zdb_001_neg.ksh | 96 + .../zfs/tests/cli_user/misc/zfs_001_neg.ksh | 74 + .../tests/cli_user/misc/zfs_allow_001_neg.ksh | 82 + .../tests/cli_user/misc/zfs_clone_001_neg.ksh | 69 + .../cli_user/misc/zfs_create_001_neg.ksh | 74 + .../cli_user/misc/zfs_destroy_001_neg.ksh | 80 + .../tests/cli_user/misc/zfs_get_001_neg.ksh | 79 + .../cli_user/misc/zfs_inherit_001_neg.ksh | 71 + .../tests/cli_user/misc/zfs_mount_001_neg.ksh | 71 + .../cli_user/misc/zfs_promote_001_neg.ksh | 71 + .../cli_user/misc/zfs_receive_001_neg.ksh | 73 + .../cli_user/misc/zfs_rename_001_neg.ksh | 71 + .../cli_user/misc/zfs_rollback_001_neg.ksh | 75 + .../tests/cli_user/misc/zfs_send_001_neg.ksh | 82 + .../tests/cli_user/misc/zfs_set_001_neg.ksh | 84 + .../tests/cli_user/misc/zfs_share_001_neg.ksh | 77 + .../cli_user/misc/zfs_snapshot_001_neg.ksh | 70 + .../cli_user/misc/zfs_unallow_001_neg.ksh | 79 + .../cli_user/misc/zfs_unmount_001_neg.ksh | 78 + .../cli_user/misc/zfs_unshare_001_neg.ksh | 78 + .../cli_user/misc/zfs_upgrade_001_neg.ksh | 82 + .../zfs/tests/cli_user/misc/zpool_001_neg.ksh | 75 + .../tests/cli_user/misc/zpool_add_001_neg.ksh | 72 + .../tests/cli_user/misc/zpool_add_002_pos.ksh | 45 + .../cli_user/misc/zpool_attach_001_neg.ksh | 80 + .../cli_user/misc/zpool_clear_001_neg.ksh | 66 + .../cli_user/misc/zpool_create_001_neg.ksh | 75 + .../cli_user/misc/zpool_create_002_pos.ksh | 44 + .../cli_user/misc/zpool_destroy_001_neg.ksh | 72 + .../cli_user/misc/zpool_detach_001_neg.ksh | 72 + .../cli_user/misc/zpool_export_001_neg.ksh | 79 + .../tests/cli_user/misc/zpool_get_001_neg.ksh | 81 + .../cli_user/misc/zpool_history_001_neg.ksh | 68 + .../cli_user/misc/zpool_import_001_neg.ksh | 81 + .../cli_user/misc/zpool_import_002_neg.ksh | 77 + .../cli_user/misc/zpool_offline_001_neg.ksh | 81 + .../cli_user/misc/zpool_online_001_neg.ksh | 81 + .../cli_user/misc/zpool_remove_001_neg.ksh | 73 + .../cli_user/misc/zpool_replace_001_neg.ksh | 80 + .../cli_user/misc/zpool_scrub_001_neg.ksh | 67 + .../tests/cli_user/misc/zpool_set_001_neg.ksh | 85 + .../cli_user/misc/zpool_status_001_neg.ksh | 79 + .../cli_user/misc/zpool_upgrade_001_neg.ksh | 80 + tests/sys/cddl/zfs/tests/cli_user/setup.ksh | 36 + .../cddl/zfs/tests/cli_user/zfs_list/Makefile | 26 + .../zfs/tests/cli_user/zfs_list/cleanup.ksh | 35 + .../zfs/tests/cli_user/zfs_list/setup.ksh | 76 + .../zfs/tests/cli_user/zfs_list/zfs_list.cfg | 40 + .../tests/cli_user/zfs_list/zfs_list.kshlib | 119 + .../cli_user/zfs_list/zfs_list_001_pos.ksh | 134 + .../cli_user/zfs_list/zfs_list_002_pos.ksh | 190 + .../cli_user/zfs_list/zfs_list_003_pos.ksh | 91 + .../cli_user/zfs_list/zfs_list_004_neg.ksh | 77 + .../cli_user/zfs_list/zfs_list_005_pos.ksh | 197 + .../cli_user/zfs_list/zfs_list_006_pos.ksh | 126 + .../cli_user/zfs_list/zfs_list_007_pos.ksh | 111 + .../cli_user/zfs_list/zfs_list_008_neg.ksh | 77 + .../tests/cli_user/zfs_list/zfs_list_test.sh | 265 ++ .../zfs/tests/cli_user/zpool_iostat/Makefile | 19 + .../tests/cli_user/zpool_iostat/cleanup.ksh | 34 + .../zfs/tests/cli_user/zpool_iostat/setup.ksh | 36 + .../cli_user/zpool_iostat/zpool_iostat.cfg | 32 + .../zpool_iostat/zpool_iostat_001_neg.ksh | 77 + .../zpool_iostat/zpool_iostat_002_pos.ksh | 84 + .../zpool_iostat/zpool_iostat_003_neg.ksh | 78 + .../zpool_iostat/zpool_iostat_test.sh | 103 + .../zfs/tests/cli_user/zpool_list/Makefile | 18 + .../zfs/tests/cli_user/zpool_list/cleanup.ksh | 34 + .../zfs/tests/cli_user/zpool_list/setup.ksh | 36 + .../tests/cli_user/zpool_list/zpool_list.cfg | 32 + .../zpool_list/zpool_list_001_pos.ksh | 78 + .../zpool_list/zpool_list_002_neg.ksh | 70 + .../cli_user/zpool_list/zpool_list_test.sh | 75 + tests/sys/cddl/zfs/tests/compression/Makefile | 20 + .../cddl/zfs/tests/compression/cleanup.ksh | 34 + .../cddl/zfs/tests/compression/compress.cfg | 39 + .../tests/compression/compress_001_pos.ksh | 86 + .../tests/compression/compress_003_pos.ksh | 109 + .../tests/compression/compress_004_pos.ksh | 146 + .../zfs/tests/compression/compression_test.sh | 110 + .../sys/cddl/zfs/tests/compression/setup.ksh | 36 + tests/sys/cddl/zfs/tests/ctime/Makefile | 20 + tests/sys/cddl/zfs/tests/ctime/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/ctime/ctime.cfg | 32 + .../sys/cddl/zfs/tests/ctime/ctime_001_pos.c | 381 ++ tests/sys/cddl/zfs/tests/ctime/ctime_test.sh | 57 + tests/sys/cddl/zfs/tests/ctime/setup.ksh | 35 + tests/sys/cddl/zfs/tests/delegate/Makefile | 40 + tests/sys/cddl/zfs/tests/delegate/cleanup.ksh | 37 + .../sys/cddl/zfs/tests/delegate/delegate.cfg | 62 + .../zfs/tests/delegate/delegate_common.kshlib | 1902 +++++++++ tests/sys/cddl/zfs/tests/delegate/setup.ksh | 50 + .../zfs/tests/delegate/zfs_allow_001_pos.ksh | 119 + .../zfs/tests/delegate/zfs_allow_002_pos.ksh | 100 + .../zfs/tests/delegate/zfs_allow_003_pos.ksh | 118 + .../zfs/tests/delegate/zfs_allow_004_pos.ksh | 121 + .../zfs/tests/delegate/zfs_allow_005_pos.ksh | 103 + .../zfs/tests/delegate/zfs_allow_006_pos.ksh | 91 + .../zfs/tests/delegate/zfs_allow_007_pos.ksh | 122 + .../zfs/tests/delegate/zfs_allow_008_pos.ksh | 92 + .../zfs/tests/delegate/zfs_allow_009_neg.ksh | 78 + .../zfs/tests/delegate/zfs_allow_010_pos.ksh | 128 + .../zfs/tests/delegate/zfs_allow_011_neg.ksh | 82 + .../zfs/tests/delegate/zfs_allow_012_neg.ksh | 93 + .../cddl/zfs/tests/delegate/zfs_allow_test.sh | 356 ++ .../tests/delegate/zfs_unallow_001_pos.ksh | 79 + .../tests/delegate/zfs_unallow_002_pos.ksh | 75 + .../tests/delegate/zfs_unallow_003_pos.ksh | 85 + .../tests/delegate/zfs_unallow_004_pos.ksh | 73 + .../tests/delegate/zfs_unallow_005_pos.ksh | 87 + .../tests/delegate/zfs_unallow_006_pos.ksh | 85 + .../tests/delegate/zfs_unallow_007_neg.ksh | 78 + .../tests/delegate/zfs_unallow_008_neg.ksh | 88 + .../zfs/tests/delegate/zfs_unallow_test.sh | 248 ++ tests/sys/cddl/zfs/tests/devices/Makefile | 22 + tests/sys/cddl/zfs/tests/devices/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/devices/devices.cfg | 33 + .../zfs/tests/devices/devices_001_pos.ksh | 79 + .../zfs/tests/devices/devices_002_neg.ksh | 79 + .../zfs/tests/devices/devices_003_pos.ksh | 63 + .../zfs/tests/devices/devices_common.kshlib | 120 + .../cddl/zfs/tests/devices/devices_test.sh | 112 + tests/sys/cddl/zfs/tests/devices/setup.ksh | 35 + tests/sys/cddl/zfs/tests/exec/Makefile | 21 + tests/sys/cddl/zfs/tests/exec/cleanup.ksh | 34 + .../sys/cddl/zfs/tests/exec/exec_001_pos.ksh | 77 + .../sys/cddl/zfs/tests/exec/exec_002_neg.ksh | 98 + tests/sys/cddl/zfs/tests/exec/exec_test.sh | 80 + tests/sys/cddl/zfs/tests/exec/mmap_exec.c | 70 + tests/sys/cddl/zfs/tests/exec/setup.ksh | 35 + tests/sys/cddl/zfs/tests/grow_pool/Makefile | 18 + .../sys/cddl/zfs/tests/grow_pool/cleanup.ksh | 46 + .../cddl/zfs/tests/grow_pool/grow_pool.cfg | 46 + .../zfs/tests/grow_pool/grow_pool_001_pos.ksh | 87 + .../zfs/tests/grow_pool/grow_pool_test.sh | 57 + tests/sys/cddl/zfs/tests/grow_pool/setup.ksh | 47 + .../sys/cddl/zfs/tests/grow_replicas/Makefile | 18 + .../cddl/zfs/tests/grow_replicas/cleanup.ksh | 42 + .../zfs/tests/grow_replicas/grow_replicas.cfg | 74 + .../grow_replicas/grow_replicas_001_pos.ksh | 96 + .../tests/grow_replicas/grow_replicas_test.sh | 58 + .../cddl/zfs/tests/grow_replicas/setup.ksh | 59 + tests/sys/cddl/zfs/tests/history/Makefile | 33 + tests/sys/cddl/zfs/tests/history/cleanup.ksh | 37 + tests/sys/cddl/zfs/tests/history/history.cfg | 48 + .../zfs/tests/history/history_001_pos.ksh | 121 + .../zfs/tests/history/history_002_pos.ksh | 177 + .../zfs/tests/history/history_003_pos.ksh | 89 + .../zfs/tests/history/history_004_pos.ksh | 114 + .../zfs/tests/history/history_005_neg.ksh | 82 + .../zfs/tests/history/history_006_neg.ksh | 95 + .../zfs/tests/history/history_007_pos.ksh | 129 + .../zfs/tests/history/history_008_pos.ksh | 147 + .../zfs/tests/history/history_009_pos.ksh | 180 + .../zfs/tests/history/history_010_pos.ksh | 108 + .../zfs/tests/history/history_common.kshlib | 268 ++ .../cddl/zfs/tests/history/history_test.sh | 301 ++ .../zfs/tests/history/i386.migratedpool.DAT.Z | Bin 0 -> 173047 bytes .../zfs/tests/history/i386.orig_history.txt | 13 + tests/sys/cddl/zfs/tests/history/setup.ksh | 38 + .../tests/history/sparc.migratedpool.DAT.Z | Bin 0 -> 163879 bytes .../zfs/tests/history/sparc.orig_history.txt | 13 + .../cddl/zfs/tests/history/zfs-pool-v4.dat.Z | Bin 0 -> 73415 bytes tests/sys/cddl/zfs/tests/hotplug/Makefile | 21 + tests/sys/cddl/zfs/tests/hotplug/cleanup.ksh | 35 + tests/sys/cddl/zfs/tests/hotplug/hotplug.cfg | 36 + .../sys/cddl/zfs/tests/hotplug/hotplug.kshlib | 463 +++ .../zfs/tests/hotplug/hotplug_001_pos.ksh | 77 + .../zfs/tests/hotplug/hotplug_008_pos.ksh | 74 + .../zfs/tests/hotplug/hotplug_011_pos.ksh | 84 + .../cddl/zfs/tests/hotplug/hotplug_test.sh | 111 + tests/sys/cddl/zfs/tests/hotplug/setup.ksh | 35 + tests/sys/cddl/zfs/tests/hotspare/Makefile | 45 + tests/sys/cddl/zfs/tests/hotspare/cleanup.ksh | 41 + .../sys/cddl/zfs/tests/hotspare/hotspare.cfg | 60 + .../cddl/zfs/tests/hotspare/hotspare.kshlib | 126 + .../tests/hotspare/hotspare_add_001_pos.ksh | 90 + .../tests/hotspare/hotspare_add_002_pos.ksh | 106 + .../tests/hotspare/hotspare_add_003_neg.ksh | 144 + .../tests/hotspare/hotspare_add_004_neg.ksh | 95 + .../tests/hotspare/hotspare_clone_001_pos.ksh | 128 + .../tests/hotspare/hotspare_clone_002_pos.ksh | 136 + .../hotspare/hotspare_create_001_neg.ksh | 139 + .../hotspare/hotspare_detach_001_pos.ksh | 104 + .../hotspare/hotspare_detach_002_pos.ksh | 114 + .../hotspare/hotspare_detach_003_pos.ksh | 107 + .../hotspare/hotspare_detach_004_pos.ksh | 108 + .../hotspare/hotspare_detach_005_neg.ksh | 93 + .../hotspare/hotspare_export_001_neg.ksh | 127 + .../hotspare/hotspare_import_001_pos.ksh | 167 + .../hotspare/hotspare_onoffline_003_neg.ksh | 99 + .../hotspare/hotspare_onoffline_004_neg.ksh | 167 + .../hotspare/hotspare_remove_001_pos.ksh | 92 + .../hotspare/hotspare_remove_002_neg.ksh | 116 + .../hotspare/hotspare_remove_003_neg.ksh | 86 + .../hotspare/hotspare_remove_004_pos.ksh | 99 + .../hotspare/hotspare_replace_001_neg.ksh | 112 + .../hotspare/hotspare_replace_002_neg.ksh | 97 + .../tests/hotspare/hotspare_scrub_001_pos.ksh | 120 + .../tests/hotspare/hotspare_scrub_002_pos.ksh | 135 + .../hotspare/hotspare_shared_001_pos.ksh | 96 + .../hotspare/hotspare_snapshot_001_pos.ksh | 126 + .../hotspare/hotspare_snapshot_002_pos.ksh | 132 + .../cddl/zfs/tests/hotspare/hotspare_test.sh | 760 ++++ tests/sys/cddl/zfs/tests/hotspare/setup.ksh | 43 + tests/sys/cddl/zfs/tests/inheritance/Makefile | 66 + .../cddl/zfs/tests/inheritance/README.config | 66 + .../cddl/zfs/tests/inheritance/README.state | 108 + .../cddl/zfs/tests/inheritance/cleanup.ksh | 34 + .../cddl/zfs/tests/inheritance/config001.cfg | 33 + .../cddl/zfs/tests/inheritance/config002.cfg | 33 + .../cddl/zfs/tests/inheritance/config003.cfg | 33 + .../cddl/zfs/tests/inheritance/config004.cfg | 33 + .../cddl/zfs/tests/inheritance/config005.cfg | 33 + .../cddl/zfs/tests/inheritance/config006.cfg | 33 + .../cddl/zfs/tests/inheritance/config007.cfg | 33 + .../cddl/zfs/tests/inheritance/config008.cfg | 33 + .../cddl/zfs/tests/inheritance/config009.cfg | 33 + .../cddl/zfs/tests/inheritance/config010.cfg | 33 + .../cddl/zfs/tests/inheritance/config011.cfg | 33 + .../cddl/zfs/tests/inheritance/config012.cfg | 33 + .../cddl/zfs/tests/inheritance/config013.cfg | 33 + .../cddl/zfs/tests/inheritance/config014.cfg | 33 + .../cddl/zfs/tests/inheritance/config015.cfg | 33 + .../cddl/zfs/tests/inheritance/config016.cfg | 33 + .../cddl/zfs/tests/inheritance/config017.cfg | 33 + .../cddl/zfs/tests/inheritance/config018.cfg | 33 + .../cddl/zfs/tests/inheritance/config019.cfg | 33 + .../cddl/zfs/tests/inheritance/config020.cfg | 33 + .../cddl/zfs/tests/inheritance/config021.cfg | 33 + .../cddl/zfs/tests/inheritance/config022.cfg | 33 + .../cddl/zfs/tests/inheritance/config023.cfg | 33 + .../cddl/zfs/tests/inheritance/config024.cfg | 33 + .../cddl/zfs/tests/inheritance/inherit.cfg | 33 + .../cddl/zfs/tests/inheritance/inherit.kshlib | 115 + .../zfs/tests/inheritance/inherit_001_pos.ksh | 440 +++ .../zfs/tests/inheritance/inheritance_test.sh | 57 + .../cddl/zfs/tests/inheritance/state001.cfg | 44 + .../cddl/zfs/tests/inheritance/state002.cfg | 45 + .../cddl/zfs/tests/inheritance/state003.cfg | 43 + .../cddl/zfs/tests/inheritance/state004.cfg | 44 + .../cddl/zfs/tests/inheritance/state005.cfg | 45 + .../cddl/zfs/tests/inheritance/state006.cfg | 47 + .../cddl/zfs/tests/inheritance/state007.cfg | 45 + .../cddl/zfs/tests/inheritance/state008.cfg | 44 + .../cddl/zfs/tests/inheritance/state009.cfg | 57 + .../cddl/zfs/tests/inheritance/state010.cfg | 56 + .../cddl/zfs/tests/inheritance/state011.cfg | 58 + .../cddl/zfs/tests/inheritance/state012.cfg | 62 + .../cddl/zfs/tests/inheritance/state013.cfg | 56 + .../cddl/zfs/tests/inheritance/state014.cfg | 62 + .../cddl/zfs/tests/inheritance/state015.cfg | 66 + .../cddl/zfs/tests/inheritance/state016.cfg | 62 + .../cddl/zfs/tests/inheritance/state017.cfg | 67 + .../cddl/zfs/tests/inheritance/state018.cfg | 64 + .../cddl/zfs/tests/inheritance/state019.cfg | 63 + .../cddl/zfs/tests/inheritance/state020.cfg | 64 + .../cddl/zfs/tests/inheritance/state021.cfg | 64 + .../cddl/zfs/tests/inheritance/state022.cfg | 63 + .../cddl/zfs/tests/inheritance/state023.cfg | 65 + .../cddl/zfs/tests/inheritance/state024.cfg | 63 + tests/sys/cddl/zfs/tests/interop/Makefile | 18 + tests/sys/cddl/zfs/tests/interop/cleanup.ksh | 72 + tests/sys/cddl/zfs/tests/interop/interop.cfg | 82 + .../zfs/tests/interop/interop_001_pos.ksh | 101 + .../cddl/zfs/tests/interop/interop_test.sh | 56 + tests/sys/cddl/zfs/tests/interop/setup.ksh | 83 + tests/sys/cddl/zfs/tests/inuse/Makefile | 18 + tests/sys/cddl/zfs/tests/inuse/inuse.cfg | 126 + .../cddl/zfs/tests/inuse/inuse_005_pos.ksh | 74 + .../cddl/zfs/tests/inuse/inuse_010_neg.ksh | 52 + tests/sys/cddl/zfs/tests/inuse/inuse_test.sh | 66 + tests/sys/cddl/zfs/tests/inuse/setup.ksh | 36 + tests/sys/cddl/zfs/tests/iscsi/Makefile | 24 + tests/sys/cddl/zfs/tests/iscsi/cleanup.ksh | 38 + tests/sys/cddl/zfs/tests/iscsi/iscsi.cfg | 34 + .../cddl/zfs/tests/iscsi/iscsi_001_pos.ksh | 99 + .../cddl/zfs/tests/iscsi/iscsi_002_neg.ksh | 88 + .../cddl/zfs/tests/iscsi/iscsi_003_neg.ksh | 79 + .../cddl/zfs/tests/iscsi/iscsi_004_pos.ksh | 88 + .../cddl/zfs/tests/iscsi/iscsi_005_pos.ksh | 94 + .../cddl/zfs/tests/iscsi/iscsi_006_neg.ksh | 88 + .../cddl/zfs/tests/iscsi/iscsi_common.kshlib | 87 + tests/sys/cddl/zfs/tests/iscsi/iscsi_test.sh | 188 + tests/sys/cddl/zfs/tests/iscsi/setup.ksh | 40 + tests/sys/cddl/zfs/tests/large_files/Makefile | 18 + .../cddl/zfs/tests/large_files/cleanup.ksh | 34 + .../zfs/tests/large_files/large_files.cfg | 32 + .../tests/large_files/large_files_001_pos.ksh | 67 + .../zfs/tests/large_files/large_files_test.sh | 56 + .../sys/cddl/zfs/tests/large_files/setup.ksh | 36 + .../sys/cddl/zfs/tests/largest_pool/Makefile | 16 + .../zfs/tests/largest_pool/largest_pool.cfg | 45 + .../largest_pool/largest_pool_001_pos.ksh | 168 + .../tests/largest_pool/largest_pool_test.sh | 57 + tests/sys/cddl/zfs/tests/link_count/Makefile | 18 + .../sys/cddl/zfs/tests/link_count/cleanup.ksh | 34 + .../cddl/zfs/tests/link_count/link_count.cfg | 33 + .../zfs/tests/link_count/link_count_001.ksh | 102 + .../zfs/tests/link_count/link_count_test.sh | 55 + tests/sys/cddl/zfs/tests/link_count/setup.ksh | 36 + tests/sys/cddl/zfs/tests/migration/Makefile | 30 + .../sys/cddl/zfs/tests/migration/cleanup.ksh | 57 + .../cddl/zfs/tests/migration/migration.cfg | 67 + .../cddl/zfs/tests/migration/migration.kshlib | 152 + .../zfs/tests/migration/migration_001_pos.ksh | 80 + .../zfs/tests/migration/migration_002_pos.ksh | 80 + .../zfs/tests/migration/migration_003_pos.ksh | 80 + .../zfs/tests/migration/migration_004_pos.ksh | 87 + .../zfs/tests/migration/migration_005_pos.ksh | 87 + .../zfs/tests/migration/migration_006_pos.ksh | 87 + .../zfs/tests/migration/migration_007_pos.ksh | 80 + .../zfs/tests/migration/migration_008_pos.ksh | 80 + .../zfs/tests/migration/migration_009_pos.ksh | 80 + .../zfs/tests/migration/migration_010_pos.ksh | 80 + .../zfs/tests/migration/migration_011_pos.ksh | 80 + .../zfs/tests/migration/migration_012_pos.ksh | 80 + .../zfs/tests/migration/migration_test.sh | 356 ++ tests/sys/cddl/zfs/tests/migration/setup.ksh | 69 + tests/sys/cddl/zfs/tests/mmap/Makefile | 19 + tests/sys/cddl/zfs/tests/mmap/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/mmap/mmap.cfg | 32 + .../cddl/zfs/tests/mmap/mmap_read_001_pos.ksh | 69 + tests/sys/cddl/zfs/tests/mmap/mmap_test.sh | 80 + .../zfs/tests/mmap/mmap_write_001_pos.ksh | 93 + tests/sys/cddl/zfs/tests/mmap/setup.ksh | 36 + tests/sys/cddl/zfs/tests/mount/Makefile | 19 + tests/sys/cddl/zfs/tests/mount/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/mount/mount_test.sh | 86 + tests/sys/cddl/zfs/tests/mount/mounttest.ksh | 101 + tests/sys/cddl/zfs/tests/mount/setup.ksh | 69 + tests/sys/cddl/zfs/tests/mount/vars.cfg | 33 + tests/sys/cddl/zfs/tests/mv_files/Makefile | 20 + tests/sys/cddl/zfs/tests/mv_files/cleanup.ksh | 39 + .../sys/cddl/zfs/tests/mv_files/mv_files.cfg | 46 + .../zfs/tests/mv_files/mv_files_001_pos.ksh | 84 + .../zfs/tests/mv_files/mv_files_002_pos.ksh | 85 + .../zfs/tests/mv_files/mv_files_common.kshlib | 216 + .../cddl/zfs/tests/mv_files/mv_files_test.sh | 88 + tests/sys/cddl/zfs/tests/mv_files/setup.ksh | 47 + tests/sys/cddl/zfs/tests/nestedfs/Makefile | 18 + tests/sys/cddl/zfs/tests/nestedfs/cleanup.ksh | 34 + .../sys/cddl/zfs/tests/nestedfs/nestedfs.cfg | 33 + .../zfs/tests/nestedfs/nestedfs_001_pos.ksh | 79 + .../cddl/zfs/tests/nestedfs/nestedfs_test.sh | 57 + tests/sys/cddl/zfs/tests/nestedfs/setup.ksh | 36 + tests/sys/cddl/zfs/tests/no_space/Makefile | 18 + tests/sys/cddl/zfs/tests/no_space/cleanup.ksh | 47 + tests/sys/cddl/zfs/tests/no_space/enospc.cfg | 39 + .../zfs/tests/no_space/enospc_001_pos.ksh | 81 + .../cddl/zfs/tests/no_space/no_space_test.sh | 57 + tests/sys/cddl/zfs/tests/no_space/setup.ksh | 40 + .../cddl/zfs/tests/online_offline/Makefile | 18 + .../cddl/zfs/tests/online_offline/cleanup.ksh | 39 + .../tests/online_offline/online_offline.cfg | 31 + .../online_offline/online_offline_001_pos.ksh | 67 + .../online_offline/online_offline_002_neg.ksh | 81 + .../online_offline/online_offline_test.sh | 82 + tests/sys/cddl/zfs/tests/pool_names/Makefile | 17 + .../cddl/zfs/tests/pool_names/pool_names.cfg | 32 + .../tests/pool_names/pool_names_001_pos.ksh | 126 + .../tests/pool_names/pool_names_002_neg.ksh | 147 + .../zfs/tests/pool_names/pool_names_test.sh | 68 + tests/sys/cddl/zfs/tests/poolversion/Makefile | 18 + .../cddl/zfs/tests/poolversion/cleanup.ksh | 45 + .../tests/poolversion/poolversion_001_pos.ksh | 73 + .../tests/poolversion/poolversion_002_pos.ksh | 86 + .../zfs/tests/poolversion/poolversion_test.sh | 78 + .../sys/cddl/zfs/tests/poolversion/setup.ksh | 50 + tests/sys/cddl/zfs/tests/quota/Makefile | 24 + tests/sys/cddl/zfs/tests/quota/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/quota/quota.cfg | 36 + tests/sys/cddl/zfs/tests/quota/quota.kshlib | 88 + .../cddl/zfs/tests/quota/quota_001_pos.ksh | 91 + .../cddl/zfs/tests/quota/quota_002_pos.ksh | 88 + .../cddl/zfs/tests/quota/quota_003_pos.ksh | 94 + .../cddl/zfs/tests/quota/quota_004_pos.ksh | 89 + .../cddl/zfs/tests/quota/quota_005_pos.ksh | 88 + .../cddl/zfs/tests/quota/quota_006_neg.ksh | 84 + tests/sys/cddl/zfs/tests/quota/quota_test.sh | 194 + tests/sys/cddl/zfs/tests/quota/setup.ksh | 37 + tests/sys/cddl/zfs/tests/redundancy/Makefile | 22 + .../sys/cddl/zfs/tests/redundancy/cleanup.ksh | 38 + .../cddl/zfs/tests/redundancy/redundancy.cfg | 43 + .../zfs/tests/redundancy/redundancy.kshlib | 304 ++ .../tests/redundancy/redundancy_001_pos.ksh | 91 + .../tests/redundancy/redundancy_002_pos.ksh | 98 + .../tests/redundancy/redundancy_003_pos.ksh | 108 + .../tests/redundancy/redundancy_004_neg.ksh | 74 + .../zfs/tests/redundancy/redundancy_test.sh | 137 + tests/sys/cddl/zfs/tests/redundancy/setup.ksh | 37 + tests/sys/cddl/zfs/tests/refquota/Makefile | 23 + tests/sys/cddl/zfs/tests/refquota/cleanup.ksh | 39 + .../sys/cddl/zfs/tests/refquota/refquota.cfg | 32 + .../zfs/tests/refquota/refquota_001_pos.ksh | 91 + .../zfs/tests/refquota/refquota_002_pos.ksh | 103 + .../zfs/tests/refquota/refquota_003_pos.ksh | 96 + .../zfs/tests/refquota/refquota_004_pos.ksh | 89 + .../zfs/tests/refquota/refquota_005_pos.ksh | 90 + .../zfs/tests/refquota/refquota_006_neg.ksh | 92 + .../cddl/zfs/tests/refquota/refquota_test.sh | 182 + tests/sys/cddl/zfs/tests/refquota/setup.ksh | 40 + tests/sys/cddl/zfs/tests/refreserv/Makefile | 22 + .../sys/cddl/zfs/tests/refreserv/cleanup.ksh | 39 + .../cddl/zfs/tests/refreserv/refreserv.cfg | 32 + .../zfs/tests/refreserv/refreserv_001_pos.ksh | 88 + .../zfs/tests/refreserv/refreserv_002_pos.ksh | 127 + .../zfs/tests/refreserv/refreserv_003_pos.ksh | 90 + .../zfs/tests/refreserv/refreserv_004_pos.ksh | 102 + .../zfs/tests/refreserv/refreserv_005_pos.ksh | 85 + .../zfs/tests/refreserv/refreserv_test.sh | 157 + tests/sys/cddl/zfs/tests/refreserv/setup.ksh | 40 + tests/sys/cddl/zfs/tests/rename_dirs/Makefile | 18 + .../cddl/zfs/tests/rename_dirs/cleanup.ksh | 34 + .../zfs/tests/rename_dirs/rename_dirs.cfg | 33 + .../tests/rename_dirs/rename_dirs_001_pos.ksh | 85 + .../zfs/tests/rename_dirs/rename_dirs_test.sh | 56 + .../sys/cddl/zfs/tests/rename_dirs/setup.ksh | 35 + tests/sys/cddl/zfs/tests/replacement/Makefile | 19 + .../cddl/zfs/tests/replacement/cleanup.ksh | 36 + .../zfs/tests/replacement/replacement.kshlib | 51 + .../tests/replacement/replacement_001_pos.ksh | 44 + .../tests/replacement/replacement_002_pos.ksh | 50 + .../tests/replacement/replacement_003_pos.ksh | 48 + .../zfs/tests/replacement/replacement_test.sh | 100 + tests/sys/cddl/zfs/tests/reservation/Makefile | 36 + .../cddl/zfs/tests/reservation/cleanup.ksh | 34 + .../zfs/tests/reservation/reservation.cfg | 47 + .../zfs/tests/reservation/reservation.kshlib | 180 + .../tests/reservation/reservation_001_pos.ksh | 132 + .../tests/reservation/reservation_002_pos.ksh | 111 + .../tests/reservation/reservation_003_pos.ksh | 137 + .../tests/reservation/reservation_004_pos.ksh | 131 + .../tests/reservation/reservation_005_pos.ksh | 123 + .../tests/reservation/reservation_006_pos.ksh | 87 + .../tests/reservation/reservation_007_pos.ksh | 131 + .../tests/reservation/reservation_008_pos.ksh | 123 + .../tests/reservation/reservation_009_pos.ksh | 105 + .../tests/reservation/reservation_010_pos.ksh | 105 + .../tests/reservation/reservation_011_pos.ksh | 81 + .../tests/reservation/reservation_012_pos.ksh | 98 + .../tests/reservation/reservation_013_pos.ksh | 121 + .../tests/reservation/reservation_014_pos.ksh | 126 + .../tests/reservation/reservation_015_pos.ksh | 114 + .../tests/reservation/reservation_016_pos.ksh | 112 + .../tests/reservation/reservation_017_pos.ksh | 105 + .../tests/reservation/reservation_018_pos.ksh | 78 + .../zfs/tests/reservation/reservation_test.sh | 524 +++ .../sys/cddl/zfs/tests/reservation/setup.ksh | 43 + tests/sys/cddl/zfs/tests/rootpool/Makefile | 19 + tests/sys/cddl/zfs/tests/rootpool/cleanup.ksh | 37 + .../zfs/tests/rootpool/rootpool_001_pos.ksh | 72 + .../zfs/tests/rootpool/rootpool_002_neg.ksh | 72 + .../zfs/tests/rootpool/rootpool_007_neg.ksh | 85 + .../cddl/zfs/tests/rootpool/rootpool_test.sh | 107 + tests/sys/cddl/zfs/tests/rootpool/setup.ksh | 40 + tests/sys/cddl/zfs/tests/rsend/Makefile | 31 + tests/sys/cddl/zfs/tests/rsend/cleanup.ksh | 53 + tests/sys/cddl/zfs/tests/rsend/rsend.cfg | 43 + tests/sys/cddl/zfs/tests/rsend/rsend.kshlib | 373 ++ .../cddl/zfs/tests/rsend/rsend_001_pos.ksh | 87 + .../cddl/zfs/tests/rsend/rsend_002_pos.ksh | 107 + .../cddl/zfs/tests/rsend/rsend_003_pos.ksh | 109 + .../cddl/zfs/tests/rsend/rsend_004_pos.ksh | 134 + .../cddl/zfs/tests/rsend/rsend_005_pos.ksh | 118 + .../cddl/zfs/tests/rsend/rsend_006_pos.ksh | 96 + .../cddl/zfs/tests/rsend/rsend_007_pos.ksh | 113 + .../cddl/zfs/tests/rsend/rsend_008_pos.ksh | 142 + .../cddl/zfs/tests/rsend/rsend_009_pos.ksh | 108 + .../cddl/zfs/tests/rsend/rsend_010_pos.ksh | 91 + .../cddl/zfs/tests/rsend/rsend_011_pos.ksh | 137 + .../cddl/zfs/tests/rsend/rsend_012_pos.ksh | 211 + .../cddl/zfs/tests/rsend/rsend_013_pos.ksh | 100 + tests/sys/cddl/zfs/tests/rsend/rsend_test.sh | 396 ++ tests/sys/cddl/zfs/tests/rsend/setup.ksh | 52 + .../sys/cddl/zfs/tests/scrub_mirror/Makefile | 22 + .../cddl/zfs/tests/scrub_mirror/cleanup.ksh | 48 + .../cddl/zfs/tests/scrub_mirror/default.cfg | 57 + .../scrub_mirror/scrub_mirror_001_pos.ksh | 67 + .../scrub_mirror/scrub_mirror_002_pos.ksh | 67 + .../scrub_mirror/scrub_mirror_003_pos.ksh | 67 + .../scrub_mirror/scrub_mirror_004_pos.ksh | 67 + .../scrub_mirror/scrub_mirror_common.kshlib | 83 + .../tests/scrub_mirror/scrub_mirror_test.sh | 140 + .../sys/cddl/zfs/tests/scrub_mirror/setup.ksh | 47 + tests/sys/cddl/zfs/tests/slog/Makefile | 32 + tests/sys/cddl/zfs/tests/slog/cleanup.ksh | 49 + tests/sys/cddl/zfs/tests/slog/setup.ksh | 45 + tests/sys/cddl/zfs/tests/slog/slog.cfg | 44 + tests/sys/cddl/zfs/tests/slog/slog.kshlib | 181 + .../sys/cddl/zfs/tests/slog/slog_001_pos.ksh | 78 + .../sys/cddl/zfs/tests/slog/slog_002_pos.ksh | 76 + .../sys/cddl/zfs/tests/slog/slog_003_pos.ksh | 83 + .../sys/cddl/zfs/tests/slog/slog_004_pos.ksh | 82 + .../sys/cddl/zfs/tests/slog/slog_005_pos.ksh | 80 + .../sys/cddl/zfs/tests/slog/slog_006_pos.ksh | 80 + .../sys/cddl/zfs/tests/slog/slog_007_pos.ksh | 91 + .../sys/cddl/zfs/tests/slog/slog_008_neg.ksh | 77 + .../sys/cddl/zfs/tests/slog/slog_009_neg.ksh | 78 + .../sys/cddl/zfs/tests/slog/slog_010_neg.ksh | 78 + .../sys/cddl/zfs/tests/slog/slog_011_neg.ksh | 82 + .../sys/cddl/zfs/tests/slog/slog_012_neg.ksh | 87 + .../sys/cddl/zfs/tests/slog/slog_013_pos.ksh | 107 + .../sys/cddl/zfs/tests/slog/slog_014_pos.ksh | 93 + tests/sys/cddl/zfs/tests/slog/slog_test.sh | 411 ++ tests/sys/cddl/zfs/tests/snapshot/Makefile | 42 + tests/sys/cddl/zfs/tests/snapshot/cleanup.ksh | 34 + .../cddl/zfs/tests/snapshot/clone_001_pos.ksh | 143 + .../cddl/zfs/tests/snapshot/ctldir_acl.txt | 3 + .../zfs/tests/snapshot/rollback_001_pos.ksh | 114 + .../zfs/tests/snapshot/rollback_002_pos.ksh | 126 + .../zfs/tests/snapshot/rollback_003_pos.ksh | 114 + tests/sys/cddl/zfs/tests/snapshot/setup.ksh | 36 + .../sys/cddl/zfs/tests/snapshot/snapshot.cfg | 62 + .../zfs/tests/snapshot/snapshot_001_pos.ksh | 103 + .../zfs/tests/snapshot/snapshot_002_pos.ksh | 139 + .../zfs/tests/snapshot/snapshot_003_pos.ksh | 108 + .../zfs/tests/snapshot/snapshot_004_pos.ksh | 96 + .../zfs/tests/snapshot/snapshot_005_pos.ksh | 102 + .../zfs/tests/snapshot/snapshot_006_pos.ksh | 137 + .../zfs/tests/snapshot/snapshot_007_pos.ksh | 112 + .../zfs/tests/snapshot/snapshot_008_pos.ksh | 105 + .../zfs/tests/snapshot/snapshot_009_pos.ksh | 131 + .../zfs/tests/snapshot/snapshot_010_pos.ksh | 113 + .../zfs/tests/snapshot/snapshot_011_pos.ksh | 114 + .../zfs/tests/snapshot/snapshot_012_pos.ksh | 116 + .../zfs/tests/snapshot/snapshot_013_pos.ksh | 106 + .../zfs/tests/snapshot/snapshot_014_pos.ksh | 90 + .../zfs/tests/snapshot/snapshot_015_pos.ksh | 136 + .../zfs/tests/snapshot/snapshot_016_pos.ksh | 116 + .../zfs/tests/snapshot/snapshot_017_pos.ksh | 213 + .../zfs/tests/snapshot/snapshot_018_pos.ksh | 95 + .../zfs/tests/snapshot/snapshot_019_pos.ksh | 119 + .../zfs/tests/snapshot/snapshot_020_pos.ksh | 89 + .../cddl/zfs/tests/snapshot/snapshot_test.sh | 634 +++ tests/sys/cddl/zfs/tests/snapused/Makefile | 23 + tests/sys/cddl/zfs/tests/snapused/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/snapused/setup.ksh | 36 + .../sys/cddl/zfs/tests/snapused/snapused.cfg | 34 + .../cddl/zfs/tests/snapused/snapused.kshlib | 191 + .../zfs/tests/snapused/snapused_001_pos.ksh | 110 + .../zfs/tests/snapused/snapused_002_pos.ksh | 101 + .../zfs/tests/snapused/snapused_003_pos.ksh | 101 + .../zfs/tests/snapused/snapused_004_pos.ksh | 114 + .../zfs/tests/snapused/snapused_005_pos.ksh | 92 + .../cddl/zfs/tests/snapused/snapused_test.sh | 167 + tests/sys/cddl/zfs/tests/sparse/Makefile | 18 + tests/sys/cddl/zfs/tests/sparse/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/sparse/setup.ksh | 37 + tests/sys/cddl/zfs/tests/sparse/sparse.cfg | 38 + .../cddl/zfs/tests/sparse/sparse_001_pos.ksh | 93 + .../sys/cddl/zfs/tests/sparse/sparse_test.sh | 58 + .../sys/cddl/zfs/tests/threadsappend/Makefile | 22 + .../cddl/zfs/tests/threadsappend/cleanup.ksh | 34 + .../cddl/zfs/tests/threadsappend/setup.ksh | 36 + .../zfs/tests/threadsappend/threadsappend.c | 135 + .../zfs/tests/threadsappend/threadsappend.cfg | 32 + .../threadsappend/threadsappend_001_pos.ksh | 95 + .../tests/threadsappend/threadsappend_test.sh | 57 + tests/sys/cddl/zfs/tests/truncate/Makefile | 19 + tests/sys/cddl/zfs/tests/truncate/cleanup.ksh | 34 + tests/sys/cddl/zfs/tests/truncate/setup.ksh | 36 + .../sys/cddl/zfs/tests/truncate/truncate.cfg | 38 + .../zfs/tests/truncate/truncate_001_pos.ksh | 92 + .../zfs/tests/truncate/truncate_002_pos.ksh | 80 + .../cddl/zfs/tests/truncate/truncate_test.sh | 83 + .../sys/cddl/zfs/tests/txg_integrity/Makefile | 26 + .../cddl/zfs/tests/txg_integrity/cleanup.ksh | 36 + .../zfs/tests/txg_integrity/fsync_integrity.c | 517 +++ .../txg_integrity/fsync_integrity_001_pos.ksh | 83 + .../zfs/tests/txg_integrity/make_patterns.py | 59 + .../cddl/zfs/tests/txg_integrity/setup.ksh | 49 + .../zfs/tests/txg_integrity/txg_integrity.c | 609 +++ .../zfs/tests/txg_integrity/txg_integrity.cfg | 34 + .../zfs/tests/txg_integrity/txg_integrity.d | 117 + .../txg_integrity/txg_integrity_001_pos.ksh | 74 + .../tests/txg_integrity/txg_integrity_test.sh | 113 + tests/sys/cddl/zfs/tests/userquota/Makefile | 34 + .../sys/cddl/zfs/tests/userquota/cleanup.ksh | 41 + .../tests/userquota/groupspace_001_pos.ksh | 98 + .../tests/userquota/groupspace_002_pos.ksh | 93 + tests/sys/cddl/zfs/tests/userquota/setup.ksh | 48 + .../cddl/zfs/tests/userquota/userquota.cfg | 48 + .../zfs/tests/userquota/userquota_001_pos.ksh | 88 + .../zfs/tests/userquota/userquota_002_pos.ksh | 98 + .../zfs/tests/userquota/userquota_003_pos.ksh | 75 + .../zfs/tests/userquota/userquota_004_pos.ksh | 95 + .../zfs/tests/userquota/userquota_005_neg.ksh | 108 + .../zfs/tests/userquota/userquota_006_pos.ksh | 89 + .../zfs/tests/userquota/userquota_007_pos.ksh | 89 + .../zfs/tests/userquota/userquota_008_pos.ksh | 74 + .../zfs/tests/userquota/userquota_009_pos.ksh | 106 + .../zfs/tests/userquota/userquota_010_pos.ksh | 88 + .../zfs/tests/userquota/userquota_011_pos.ksh | 141 + .../zfs/tests/userquota/userquota_012_neg.ksh | 81 + .../tests/userquota/userquota_common.kshlib | 147 + .../zfs/tests/userquota/userquota_test.sh | 464 +++ .../zfs/tests/userquota/userspace_001_pos.ksh | 98 + .../zfs/tests/userquota/userspace_002_pos.ksh | 95 + tests/sys/cddl/zfs/tests/utils_test/Makefile | 27 + .../sys/cddl/zfs/tests/utils_test/cleanup.ksh | 33 + tests/sys/cddl/zfs/tests/utils_test/setup.ksh | 33 + .../cddl/zfs/tests/utils_test/utils_test.cfg | 41 + .../zfs/tests/utils_test/utils_test.kshlib | 30 + .../tests/utils_test/utils_test_001_pos.ksh | 75 + .../tests/utils_test/utils_test_002_pos.ksh | 81 + .../tests/utils_test/utils_test_003_pos.ksh | 76 + .../tests/utils_test/utils_test_004_pos.ksh | 73 + .../tests/utils_test/utils_test_005_pos.ksh | 75 + .../tests/utils_test/utils_test_006_pos.ksh | 79 + .../tests/utils_test/utils_test_007_pos.ksh | 85 + .../tests/utils_test/utils_test_008_pos.ksh | 81 + .../tests/utils_test/utils_test_009_pos.ksh | 73 + .../zfs/tests/utils_test/utils_test_test.sh | 276 ++ tests/sys/cddl/zfs/tests/write_dirs/Makefile | 19 + .../sys/cddl/zfs/tests/write_dirs/cleanup.ksh | 37 + tests/sys/cddl/zfs/tests/write_dirs/setup.ksh | 41 + .../cddl/zfs/tests/write_dirs/write_dirs.cfg | 36 + .../tests/write_dirs/write_dirs_001_pos.ksh | 90 + .../tests/write_dirs/write_dirs_002_pos.ksh | 91 + .../zfs/tests/write_dirs/write_dirs_test.sh | 84 + tests/sys/cddl/zfs/tests/xattr/Makefile | 31 + tests/sys/cddl/zfs/tests/xattr/cleanup.ksh | 43 + tests/sys/cddl/zfs/tests/xattr/setup.ksh | 62 + tests/sys/cddl/zfs/tests/xattr/xattr.cfg | 54 + .../cddl/zfs/tests/xattr/xattr_001_pos.ksh | 77 + .../cddl/zfs/tests/xattr/xattr_002_neg.ksh | 70 + .../cddl/zfs/tests/xattr/xattr_003_neg.ksh | 81 + .../cddl/zfs/tests/xattr/xattr_004_pos.ksh | 102 + .../cddl/zfs/tests/xattr/xattr_005_pos.ksh | 92 + .../cddl/zfs/tests/xattr/xattr_006_pos.ksh | 77 + .../cddl/zfs/tests/xattr/xattr_007_neg.ksh | 102 + .../cddl/zfs/tests/xattr/xattr_008_pos.ksh | 112 + .../cddl/zfs/tests/xattr/xattr_009_neg.ksh | 78 + .../cddl/zfs/tests/xattr/xattr_010_neg.ksh | 82 + .../cddl/zfs/tests/xattr/xattr_011_pos.ksh | 203 + .../cddl/zfs/tests/xattr/xattr_012_pos.ksh | 119 + .../cddl/zfs/tests/xattr/xattr_013_pos.ksh | 104 + .../cddl/zfs/tests/xattr/xattr_common.kshlib | 108 + tests/sys/cddl/zfs/tests/xattr/xattr_test.sh | 370 ++ tests/sys/cddl/zfs/tests/zfsd/Makefile | 38 + tests/sys/cddl/zfs/tests/zfsd/cleanup.ksh | 37 + .../cddl/zfs/tests/zfsd/hotspare_cleanup.ksh | 47 + .../cddl/zfs/tests/zfsd/hotspare_setup.ksh | 45 + tests/sys/cddl/zfs/tests/zfsd/setup.ksh | 34 + tests/sys/cddl/zfs/tests/zfsd/zfsd.cfg | 32 + tests/sys/cddl/zfs/tests/zfsd/zfsd.kshlib | 85 + .../tests/zfsd/zfsd_autoreplace_001_neg.ksh | 95 + .../tests/zfsd/zfsd_autoreplace_002_pos.ksh | 92 + .../tests/zfsd/zfsd_autoreplace_003_pos.ksh | 102 + .../zfs/tests/zfsd/zfsd_degrade_001_pos.ksh | 90 + .../zfs/tests/zfsd/zfsd_degrade_002_pos.ksh | 102 + .../zfs/tests/zfsd/zfsd_fault_001_pos.ksh | 163 + .../zfs/tests/zfsd/zfsd_hotspare_001_pos.ksh | 151 + .../zfs/tests/zfsd/zfsd_hotspare_002_pos.ksh | 114 + .../zfs/tests/zfsd/zfsd_hotspare_003_pos.ksh | 109 + .../zfs/tests/zfsd/zfsd_hotspare_004_pos.ksh | 108 + .../zfs/tests/zfsd/zfsd_hotspare_005_pos.ksh | 112 + .../zfs/tests/zfsd/zfsd_hotspare_006_pos.ksh | 144 + .../zfs/tests/zfsd/zfsd_hotspare_007_pos.ksh | 106 + .../zfs/tests/zfsd/zfsd_hotspare_008_neg.ksh | 83 + .../zfs/tests/zfsd/zfsd_import_001_pos.ksh | 152 + .../zfs/tests/zfsd/zfsd_replace_001_pos.ksh | 81 + .../zfs/tests/zfsd/zfsd_replace_002_pos.ksh | 76 + .../zfs/tests/zfsd/zfsd_replace_003_pos.ksh | 125 + tests/sys/cddl/zfs/tests/zfsd/zfsd_test.sh | 591 +++ tests/sys/cddl/zfs/tests/zil/Makefile | 20 + tests/sys/cddl/zfs/tests/zil/cleanup.ksh | 39 + tests/sys/cddl/zfs/tests/zil/setup.ksh | 37 + tests/sys/cddl/zfs/tests/zil/zil.cfg | 31 + tests/sys/cddl/zfs/tests/zil/zil.kshlib | 55 + tests/sys/cddl/zfs/tests/zil/zil_001_pos.ksh | 84 + tests/sys/cddl/zfs/tests/zil/zil_002_pos.ksh | 106 + tests/sys/cddl/zfs/tests/zil/zil_test.sh | 86 + tests/sys/cddl/zfs/tests/zinject/Makefile | 22 + tests/sys/cddl/zfs/tests/zinject/cleanup.ksh | 40 + tests/sys/cddl/zfs/tests/zinject/setup.ksh | 52 + tests/sys/cddl/zfs/tests/zinject/zinject.cfg | 63 + .../sys/cddl/zfs/tests/zinject/zinject.kshlib | 227 ++ .../zfs/tests/zinject/zinject_001_pos.ksh | 147 + .../zfs/tests/zinject/zinject_002_pos.ksh | 148 + .../zfs/tests/zinject/zinject_003_pos.ksh | 144 + .../zfs/tests/zinject/zinject_004_pos.ksh | 130 + .../cddl/zfs/tests/zinject/zinject_test.sh | 140 + tests/sys/cddl/zfs/tests/zones/Makefile | 23 + tests/sys/cddl/zfs/tests/zones/cleanup.ksh | 66 + tests/sys/cddl/zfs/tests/zones/setup.ksh | 65 + tests/sys/cddl/zfs/tests/zones/zones.cfg | 83 + .../cddl/zfs/tests/zones/zones_001_pos.ksh | 112 + .../cddl/zfs/tests/zones/zones_002_pos.ksh | 81 + .../cddl/zfs/tests/zones/zones_003_pos.ksh | 133 + .../cddl/zfs/tests/zones/zones_004_pos.ksh | 91 + .../cddl/zfs/tests/zones/zones_005_pos.ksh | 72 + .../cddl/zfs/tests/zones/zones_common.kshlib | 70 + tests/sys/cddl/zfs/tests/zones/zones_test.sh | 167 + tests/sys/cddl/zfs/tests/zvol/Makefile | 17 + tests/sys/cddl/zfs/tests/zvol/zvol.cfg | 39 + .../cddl/zfs/tests/zvol/zvol_ENOSPC/Makefile | 18 + .../zfs/tests/zvol/zvol_ENOSPC/cleanup.ksh | 39 + .../cddl/zfs/tests/zvol/zvol_ENOSPC/setup.ksh | 43 + .../tests/zvol/zvol_ENOSPC/zvol_ENOSPC.cfg | 35 + .../zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh | 82 + .../zvol/zvol_ENOSPC/zvol_ENOSPC_test.sh | 56 + .../sys/cddl/zfs/tests/zvol/zvol_cli/Makefile | 20 + .../cddl/zfs/tests/zvol/zvol_cli/cleanup.ksh | 39 + .../cddl/zfs/tests/zvol/zvol_cli/setup.ksh | 39 + .../cddl/zfs/tests/zvol/zvol_cli/zvol_cli.cfg | 35 + .../tests/zvol/zvol_cli/zvol_cli_001_pos.ksh | 75 + .../tests/zvol/zvol_cli/zvol_cli_002_pos.ksh | 74 + .../tests/zvol/zvol_cli/zvol_cli_003_neg.ksh | 73 + .../zfs/tests/zvol/zvol_cli/zvol_cli_test.sh | 107 + .../cddl/zfs/tests/zvol/zvol_common.kshlib | 165 + .../cddl/zfs/tests/zvol/zvol_misc/Makefile | 26 + .../cddl/zfs/tests/zvol/zvol_misc/cleanup.ksh | 39 + .../cddl/zfs/tests/zvol/zvol_misc/setup.ksh | 39 + .../zfs/tests/zvol/zvol_misc/zvol_misc.cfg | 36 + .../zvol/zvol_misc/zvol_misc_001_neg.ksh | 85 + .../zvol/zvol_misc/zvol_misc_002_pos.ksh | 89 + .../zvol/zvol_misc/zvol_misc_003_neg.ksh | 93 + .../zvol/zvol_misc/zvol_misc_004_pos.ksh | 129 + .../zvol/zvol_misc/zvol_misc_005_neg.ksh | 94 + .../zvol/zvol_misc/zvol_misc_006_pos.ksh | 92 + .../zvol/zvol_misc/zvol_misc_007_pos.ksh | 133 + .../zvol/zvol_misc/zvol_misc_008_pos.ksh | 159 + .../zvol/zvol_misc/zvol_misc_009_pos.ksh | 126 + .../tests/zvol/zvol_misc/zvol_misc_test.sh | 262 ++ .../cddl/zfs/tests/zvol/zvol_swap/Makefile | 23 + .../cddl/zfs/tests/zvol/zvol_swap/cleanup.ksh | 52 + .../cddl/zfs/tests/zvol/zvol_swap/setup.ksh | 43 + .../zfs/tests/zvol/zvol_swap/zvol_swap.cfg | 41 + .../zvol/zvol_swap/zvol_swap_001_pos.ksh | 93 + .../zvol/zvol_swap/zvol_swap_002_pos.ksh | 100 + .../zvol/zvol_swap/zvol_swap_003_pos.ksh | 163 + .../zvol/zvol_swap/zvol_swap_004_pos.ksh | 108 + .../zvol/zvol_swap/zvol_swap_005_pos.ksh | 109 + .../zvol/zvol_swap/zvol_swap_006_pos.ksh | 120 + .../tests/zvol/zvol_swap/zvol_swap_test.sh | 176 + tests/sys/cddl/zfs/tests/zvol_thrash/Makefile | 18 + .../cddl/zfs/tests/zvol_thrash/cleanup.ksh | 39 + .../sys/cddl/zfs/tests/zvol_thrash/setup.ksh | 39 + .../zfs/tests/zvol_thrash/zvol_thrash.cfg | 33 + .../tests/zvol_thrash/zvol_thrash_001_pos.ksh | 112 + .../zfs/tests/zvol_thrash/zvol_thrash_test.sh | 57 + 1506 files changed, 139361 insertions(+) create mode 100644 tests/sys/cddl/Makefile create mode 100644 tests/sys/cddl/zfs/Makefile create mode 100644 tests/sys/cddl/zfs/bin/Makefile create mode 100644 tests/sys/cddl/zfs/bin/bsddisks.ksh create mode 100644 tests/sys/cddl/zfs/bin/chg_usr_exec.c create mode 100644 tests/sys/cddl/zfs/bin/devname2devid.c create mode 100644 tests/sys/cddl/zfs/bin/dir_rd_update.c create mode 100644 tests/sys/cddl/zfs/bin/dircmp.ksh create mode 100644 tests/sys/cddl/zfs/bin/dumpadm.ksh create mode 100644 tests/sys/cddl/zfs/bin/ff.ksh create mode 100644 tests/sys/cddl/zfs/bin/file_check.c create mode 100644 tests/sys/cddl/zfs/bin/file_common.h create mode 100644 tests/sys/cddl/zfs/bin/file_trunc.c create mode 100644 tests/sys/cddl/zfs/bin/file_write.c create mode 100644 tests/sys/cddl/zfs/bin/fmadm.ksh create mode 100644 tests/sys/cddl/zfs/bin/fmdump.ksh create mode 100644 tests/sys/cddl/zfs/bin/format.ksh create mode 100644 tests/sys/cddl/zfs/bin/groupadd.ksh create mode 100644 tests/sys/cddl/zfs/bin/groupdel.ksh create mode 100644 tests/sys/cddl/zfs/bin/groupmod.ksh create mode 100644 tests/sys/cddl/zfs/bin/groupshow.ksh create mode 100644 tests/sys/cddl/zfs/bin/largest_file.c create mode 100644 tests/sys/cddl/zfs/bin/mkfile.c create mode 100644 tests/sys/cddl/zfs/bin/mktree.c create mode 100644 tests/sys/cddl/zfs/bin/mmapwrite.c create mode 100644 tests/sys/cddl/zfs/bin/randfree_file.c create mode 100644 tests/sys/cddl/zfs/bin/readmmap.c create mode 100644 tests/sys/cddl/zfs/bin/rename_dir.c create mode 100644 tests/sys/cddl/zfs/bin/rm_lnkcnt_zero_file.c create mode 100644 tests/sys/cddl/zfs/bin/svcs.ksh create mode 100644 tests/sys/cddl/zfs/bin/swap.ksh create mode 100644 tests/sys/cddl/zfs/bin/testenv.ksh create mode 100644 tests/sys/cddl/zfs/bin/useradd.ksh create mode 100644 tests/sys/cddl/zfs/bin/userdel.ksh create mode 100644 tests/sys/cddl/zfs/bin/usermod.ksh create mode 100644 tests/sys/cddl/zfs/bin/zfs.ksh create mode 100644 tests/sys/cddl/zfs/bin/zfs_crypto.ksh create mode 100644 tests/sys/cddl/zfs/bin/zfs_version.ksh create mode 100644 tests/sys/cddl/zfs/bin/zlogin.ksh create mode 100644 tests/sys/cddl/zfs/bin/zoneadm.ksh create mode 100644 tests/sys/cddl/zfs/bin/zonecfg.ksh create mode 100644 tests/sys/cddl/zfs/bin/zpool.ksh create mode 100644 tests/sys/cddl/zfs/bin/zpool_bsd.ksh create mode 100644 tests/sys/cddl/zfs/bin/zpool_smi.ksh create mode 100644 tests/sys/cddl/zfs/bin/zpool_version.ksh create mode 100644 tests/sys/cddl/zfs/include/Makefile create mode 100644 tests/sys/cddl/zfs/include/commands.txt create mode 100644 tests/sys/cddl/zfs/include/constants.cfg create mode 100644 tests/sys/cddl/zfs/include/default.cfg.in create mode 100644 tests/sys/cddl/zfs/include/libgnop.kshlib create mode 100644 tests/sys/cddl/zfs/include/libremote.kshlib create mode 100644 tests/sys/cddl/zfs/include/libtest.kshlib create mode 100755 tests/sys/cddl/zfs/include/libtest_test.sh create mode 100644 tests/sys/cddl/zfs/include/logapi.kshlib create mode 100644 tests/sys/cddl/zfs/include/stf.shlib create mode 100644 tests/sys/cddl/zfs/include/testenv.ksh create mode 100644 tests/sys/cddl/zfs/include/testenv.kshlib create mode 100644 tests/sys/cddl/zfs/include/translatecommands.awk create mode 100644 tests/sys/cddl/zfs/tests/Makefile create mode 100644 tests/sys/cddl/zfs/tests/acl/Makefile create mode 100644 tests/sys/cddl/zfs/tests/acl/acl.cfg create mode 100644 tests/sys/cddl/zfs/tests/acl/acl_common.kshlib create mode 100644 tests/sys/cddl/zfs/tests/acl/cifs/Makefile create mode 100644 tests/sys/cddl/zfs/tests/acl/cifs/cifs.kshlib create mode 100644 tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_003_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/acl/cifs/cifs_test.sh create mode 100644 tests/sys/cddl/zfs/tests/acl/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/Makefile create mode 100755 tests/sys/cddl/zfs/tests/acl/nontrivial/nontrivial_test.sh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_aclmode_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_delete_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_owner_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwacl_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_xattr_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_xattr_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cp_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cp_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cpio_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cpio_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_find_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_ls_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_mv_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_tar_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_tar_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/Makefile create mode 100755 tests/sys/cddl/zfs/tests/acl/trivial/trivial_test.sh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_chmod_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_compress_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_find_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_find_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_ls_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_ls_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_mv_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pack_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_tar_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_tar_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/atime/Makefile create mode 100644 tests/sys/cddl/zfs/tests/atime/atime.cfg create mode 100644 tests/sys/cddl/zfs/tests/atime/atime_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/atime/atime_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/atime/atime_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/atime/atime_test.sh create mode 100644 tests/sys/cddl/zfs/tests/atime/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/atime/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/Makefile create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs.cfg create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/bootfs/bootfs_009_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/bootfs/bootfs_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cache/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cache/cache.cfg create mode 100644 tests/sys/cddl/zfs/tests/cache/cache.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_010_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/cache_011_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cache/cache_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cache/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cache/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cachefile/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cachefile/cachefile.cfg create mode 100644 tests/sys/cddl/zfs/tests/cachefile/cachefile.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cachefile/cachefile_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cachefile/cachefile_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cachefile/cachefile_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cachefile/cachefile_004_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cachefile/cachefile_test.sh create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/Makefile create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_test.sh create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/default.cfg create mode 100644 tests/sys/cddl/zfs/tests/clean_mirror/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/cli.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/cli_common.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zdb/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zdb/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zdb/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zdb/zdb.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zdb/zdb_001_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zdb/zdb_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_malformed.cfg create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_009_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_006_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/properties.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_010_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_011_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_012_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_013_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_006_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_diff/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_diff/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_diff/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_001_pos.golden create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_006_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_010_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_common.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_list_d.kshlib create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_003_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_010_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_011_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_all_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_006_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_property/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_property/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_property/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_property.cfg create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_property_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_set_property_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_009_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_010_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_011_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_012_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_013_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_002_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_send/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_send/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_send/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_004_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/cache_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/cache_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/checksum_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/compression_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/onoffs_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/property_alias_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/readonly_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/reservation_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/ro_props_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/share_mount_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/snapdir_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/version_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_010_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_007_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_all_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_005_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_006_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_007_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool/zpool.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_003_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_010_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_attach/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_attach/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_attach/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach_001_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_005_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_010_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_011_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_012_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_013_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_014_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_015_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_016_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_017_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_018_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_019_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_020_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_021_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_022_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_023_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_004_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_detach/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_detach/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_detach/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach_001_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_expand/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_expand/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_expand/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_003_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_export/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_export/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_export/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_004_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_get/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_get/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_get/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_004_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_history/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_history/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_history/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_002_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/README create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/unclean_export.dat.bz2 create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_010_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_011_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_012_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_013_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_014_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_all_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_corrupt_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_destroyed_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_destroyed_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_rename_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_offline/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_offline/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_offline/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_002_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_online/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_online/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_online/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_002_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_remove/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_remove/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_remove/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_003_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_replace/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_replace/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_replace/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_002_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_005_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_set/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_003_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_status/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_status/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_status/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_002_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/README create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v10.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v11.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v12.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v13.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v14.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v28.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz21.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz22.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz23.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe1.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe2.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe3.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v4.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5000.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v6.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v7.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v8.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v9.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v999.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-vBROKEN.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/cleanup.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/create_upgrade_pool_dat.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_006_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_009_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_user/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/cli.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_user/cli_user.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/misc.cfg create mode 100755 tests/sys/cddl/zfs/tests/cli_user/misc/misc_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/setup_basic.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zdb_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_allow_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_clone_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_create_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_destroy_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_get_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_inherit_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_mount_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_promote_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_receive_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_rename_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_rollback_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_send_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_set_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_share_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_snapshot_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unallow_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unmount_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unshare_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zfs_upgrade_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_add_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_add_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_attach_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_clear_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_create_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_create_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_destroy_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_detach_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_export_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_get_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_history_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_import_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_import_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_offline_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_online_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_remove_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_replace_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_scrub_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_set_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_status_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/misc/zpool_upgrade_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list.kshlib create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_008_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_test.sh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_list/Makefile create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_list/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_list/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list.cfg create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_002_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_test.sh create mode 100644 tests/sys/cddl/zfs/tests/compression/Makefile create mode 100644 tests/sys/cddl/zfs/tests/compression/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/compression/compress.cfg create mode 100644 tests/sys/cddl/zfs/tests/compression/compress_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/compression/compress_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/compression/compress_004_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/compression/compression_test.sh create mode 100644 tests/sys/cddl/zfs/tests/compression/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/ctime/Makefile create mode 100644 tests/sys/cddl/zfs/tests/ctime/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/ctime/ctime.cfg create mode 100644 tests/sys/cddl/zfs/tests/ctime/ctime_001_pos.c create mode 100755 tests/sys/cddl/zfs/tests/ctime/ctime_test.sh create mode 100644 tests/sys/cddl/zfs/tests/ctime/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/Makefile create mode 100644 tests/sys/cddl/zfs/tests/delegate/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/delegate.cfg create mode 100644 tests/sys/cddl/zfs/tests/delegate/delegate_common.kshlib create mode 100644 tests/sys/cddl/zfs/tests/delegate/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_010_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_011_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_allow_012_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/delegate/zfs_allow_test.sh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_008_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/delegate/zfs_unallow_test.sh create mode 100644 tests/sys/cddl/zfs/tests/devices/Makefile create mode 100644 tests/sys/cddl/zfs/tests/devices/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/devices/devices.cfg create mode 100644 tests/sys/cddl/zfs/tests/devices/devices_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/devices/devices_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/devices/devices_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/devices/devices_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/devices/devices_test.sh create mode 100644 tests/sys/cddl/zfs/tests/devices/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/exec/Makefile create mode 100644 tests/sys/cddl/zfs/tests/exec/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/exec/exec_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/exec/exec_002_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/exec/exec_test.sh create mode 100644 tests/sys/cddl/zfs/tests/exec/mmap_exec.c create mode 100644 tests/sys/cddl/zfs/tests/exec/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/grow_pool/Makefile create mode 100644 tests/sys/cddl/zfs/tests/grow_pool/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/grow_pool/grow_pool.cfg create mode 100644 tests/sys/cddl/zfs/tests/grow_pool/grow_pool_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/grow_pool/grow_pool_test.sh create mode 100644 tests/sys/cddl/zfs/tests/grow_pool/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/grow_replicas/Makefile create mode 100644 tests/sys/cddl/zfs/tests/grow_replicas/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas.cfg create mode 100644 tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas_test.sh create mode 100644 tests/sys/cddl/zfs/tests/grow_replicas/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/Makefile create mode 100644 tests/sys/cddl/zfs/tests/history/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history.cfg create mode 100644 tests/sys/cddl/zfs/tests/history/history_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_006_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_010_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/history_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/history/history_test.sh create mode 100644 tests/sys/cddl/zfs/tests/history/i386.migratedpool.DAT.Z create mode 100644 tests/sys/cddl/zfs/tests/history/i386.orig_history.txt create mode 100644 tests/sys/cddl/zfs/tests/history/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/history/sparc.migratedpool.DAT.Z create mode 100644 tests/sys/cddl/zfs/tests/history/sparc.orig_history.txt create mode 100644 tests/sys/cddl/zfs/tests/history/zfs-pool-v4.dat.Z create mode 100644 tests/sys/cddl/zfs/tests/hotplug/Makefile create mode 100644 tests/sys/cddl/zfs/tests/hotplug/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotplug/hotplug.cfg create mode 100644 tests/sys/cddl/zfs/tests/hotplug/hotplug.kshlib create mode 100644 tests/sys/cddl/zfs/tests/hotplug/hotplug_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotplug/hotplug_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotplug/hotplug_011_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/hotplug/hotplug_test.sh create mode 100644 tests/sys/cddl/zfs/tests/hotplug/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/Makefile create mode 100644 tests/sys/cddl/zfs/tests/hotspare/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare.cfg create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare.kshlib create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_add_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_add_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_add_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_add_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_clone_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_clone_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_create_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_export_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_import_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_onoffline_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_onoffline_004_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_replace_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_replace_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_scrub_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_scrub_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_shared_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_snapshot_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/hotspare_snapshot_002_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/hotspare/hotspare_test.sh create mode 100644 tests/sys/cddl/zfs/tests/hotspare/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/inheritance/Makefile create mode 100644 tests/sys/cddl/zfs/tests/inheritance/README.config create mode 100644 tests/sys/cddl/zfs/tests/inheritance/README.state create mode 100644 tests/sys/cddl/zfs/tests/inheritance/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config001.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config002.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config003.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config004.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config005.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config006.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config007.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config008.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config009.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config010.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config011.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config012.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config013.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config014.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config015.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config016.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config017.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config018.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config019.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config020.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config021.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config022.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config023.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/config024.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/inherit.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/inherit.kshlib create mode 100644 tests/sys/cddl/zfs/tests/inheritance/inherit_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/inheritance/inheritance_test.sh create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state001.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state002.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state003.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state004.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state005.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state006.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state007.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state008.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state009.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state010.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state011.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state012.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state013.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state014.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state015.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state016.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state017.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state018.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state019.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state020.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state021.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state022.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state023.cfg create mode 100644 tests/sys/cddl/zfs/tests/inheritance/state024.cfg create mode 100644 tests/sys/cddl/zfs/tests/interop/Makefile create mode 100644 tests/sys/cddl/zfs/tests/interop/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/interop/interop.cfg create mode 100644 tests/sys/cddl/zfs/tests/interop/interop_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/interop/interop_test.sh create mode 100644 tests/sys/cddl/zfs/tests/interop/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/inuse/Makefile create mode 100644 tests/sys/cddl/zfs/tests/inuse/inuse.cfg create mode 100644 tests/sys/cddl/zfs/tests/inuse/inuse_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/inuse/inuse_010_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/inuse/inuse_test.sh create mode 100644 tests/sys/cddl/zfs/tests/inuse/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/Makefile create mode 100644 tests/sys/cddl/zfs/tests/iscsi/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/iscsi.cfg create mode 100644 tests/sys/cddl/zfs/tests/iscsi/iscsi_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/iscsi_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/iscsi_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/iscsi_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/iscsi_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/iscsi_006_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/iscsi_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/iscsi/iscsi_test.sh create mode 100644 tests/sys/cddl/zfs/tests/iscsi/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/large_files/Makefile create mode 100644 tests/sys/cddl/zfs/tests/large_files/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/large_files/large_files.cfg create mode 100644 tests/sys/cddl/zfs/tests/large_files/large_files_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/large_files/large_files_test.sh create mode 100644 tests/sys/cddl/zfs/tests/large_files/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/largest_pool/Makefile create mode 100644 tests/sys/cddl/zfs/tests/largest_pool/largest_pool.cfg create mode 100644 tests/sys/cddl/zfs/tests/largest_pool/largest_pool_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/largest_pool/largest_pool_test.sh create mode 100644 tests/sys/cddl/zfs/tests/link_count/Makefile create mode 100644 tests/sys/cddl/zfs/tests/link_count/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/link_count/link_count.cfg create mode 100644 tests/sys/cddl/zfs/tests/link_count/link_count_001.ksh create mode 100755 tests/sys/cddl/zfs/tests/link_count/link_count_test.sh create mode 100644 tests/sys/cddl/zfs/tests/link_count/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/Makefile create mode 100644 tests/sys/cddl/zfs/tests/migration/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration.cfg create mode 100644 tests/sys/cddl/zfs/tests/migration/migration.kshlib create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_010_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_011_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/migration/migration_012_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/migration/migration_test.sh create mode 100644 tests/sys/cddl/zfs/tests/migration/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/mmap/Makefile create mode 100644 tests/sys/cddl/zfs/tests/mmap/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/mmap/mmap.cfg create mode 100644 tests/sys/cddl/zfs/tests/mmap/mmap_read_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/mmap/mmap_test.sh create mode 100644 tests/sys/cddl/zfs/tests/mmap/mmap_write_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/mmap/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/mount/Makefile create mode 100644 tests/sys/cddl/zfs/tests/mount/cleanup.ksh create mode 100755 tests/sys/cddl/zfs/tests/mount/mount_test.sh create mode 100644 tests/sys/cddl/zfs/tests/mount/mounttest.ksh create mode 100644 tests/sys/cddl/zfs/tests/mount/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/mount/vars.cfg create mode 100644 tests/sys/cddl/zfs/tests/mv_files/Makefile create mode 100644 tests/sys/cddl/zfs/tests/mv_files/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/mv_files/mv_files.cfg create mode 100644 tests/sys/cddl/zfs/tests/mv_files/mv_files_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/mv_files/mv_files_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/mv_files/mv_files_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/mv_files/mv_files_test.sh create mode 100644 tests/sys/cddl/zfs/tests/mv_files/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/nestedfs/Makefile create mode 100644 tests/sys/cddl/zfs/tests/nestedfs/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/nestedfs/nestedfs.cfg create mode 100644 tests/sys/cddl/zfs/tests/nestedfs/nestedfs_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/nestedfs/nestedfs_test.sh create mode 100644 tests/sys/cddl/zfs/tests/nestedfs/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/no_space/Makefile create mode 100644 tests/sys/cddl/zfs/tests/no_space/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/no_space/enospc.cfg create mode 100644 tests/sys/cddl/zfs/tests/no_space/enospc_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/no_space/no_space_test.sh create mode 100644 tests/sys/cddl/zfs/tests/no_space/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/online_offline/Makefile create mode 100644 tests/sys/cddl/zfs/tests/online_offline/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/online_offline/online_offline.cfg create mode 100644 tests/sys/cddl/zfs/tests/online_offline/online_offline_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/online_offline/online_offline_002_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/online_offline/online_offline_test.sh create mode 100644 tests/sys/cddl/zfs/tests/pool_names/Makefile create mode 100644 tests/sys/cddl/zfs/tests/pool_names/pool_names.cfg create mode 100644 tests/sys/cddl/zfs/tests/pool_names/pool_names_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/pool_names/pool_names_002_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/pool_names/pool_names_test.sh create mode 100644 tests/sys/cddl/zfs/tests/poolversion/Makefile create mode 100644 tests/sys/cddl/zfs/tests/poolversion/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/poolversion/poolversion_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/poolversion/poolversion_002_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/poolversion/poolversion_test.sh create mode 100644 tests/sys/cddl/zfs/tests/poolversion/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/quota/Makefile create mode 100644 tests/sys/cddl/zfs/tests/quota/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/quota/quota.cfg create mode 100644 tests/sys/cddl/zfs/tests/quota/quota.kshlib create mode 100644 tests/sys/cddl/zfs/tests/quota/quota_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/quota/quota_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/quota/quota_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/quota/quota_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/quota/quota_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/quota/quota_006_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/quota/quota_test.sh create mode 100644 tests/sys/cddl/zfs/tests/quota/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/redundancy/Makefile create mode 100644 tests/sys/cddl/zfs/tests/redundancy/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/redundancy/redundancy.cfg create mode 100644 tests/sys/cddl/zfs/tests/redundancy/redundancy.kshlib create mode 100644 tests/sys/cddl/zfs/tests/redundancy/redundancy_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/redundancy/redundancy_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/redundancy/redundancy_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/redundancy/redundancy_004_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/redundancy/redundancy_test.sh create mode 100644 tests/sys/cddl/zfs/tests/redundancy/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/refquota/Makefile create mode 100644 tests/sys/cddl/zfs/tests/refquota/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/refquota/refquota.cfg create mode 100644 tests/sys/cddl/zfs/tests/refquota/refquota_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refquota/refquota_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refquota/refquota_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refquota/refquota_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refquota/refquota_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refquota/refquota_006_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/refquota/refquota_test.sh create mode 100644 tests/sys/cddl/zfs/tests/refquota/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/refreserv/Makefile create mode 100644 tests/sys/cddl/zfs/tests/refreserv/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/refreserv/refreserv.cfg create mode 100644 tests/sys/cddl/zfs/tests/refreserv/refreserv_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refreserv/refreserv_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refreserv/refreserv_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refreserv/refreserv_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/refreserv/refreserv_005_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/refreserv/refreserv_test.sh create mode 100644 tests/sys/cddl/zfs/tests/refreserv/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/rename_dirs/Makefile create mode 100644 tests/sys/cddl/zfs/tests/rename_dirs/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs.cfg create mode 100644 tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs_test.sh create mode 100644 tests/sys/cddl/zfs/tests/rename_dirs/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/replacement/Makefile create mode 100644 tests/sys/cddl/zfs/tests/replacement/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/replacement/replacement.kshlib create mode 100644 tests/sys/cddl/zfs/tests/replacement/replacement_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/replacement/replacement_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/replacement/replacement_003_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/replacement/replacement_test.sh create mode 100644 tests/sys/cddl/zfs/tests/reservation/Makefile create mode 100644 tests/sys/cddl/zfs/tests/reservation/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation.cfg create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation.kshlib create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_010_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_011_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_012_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_013_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_014_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_015_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_016_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_017_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/reservation/reservation_018_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/reservation/reservation_test.sh create mode 100644 tests/sys/cddl/zfs/tests/reservation/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/rootpool/Makefile create mode 100644 tests/sys/cddl/zfs/tests/rootpool/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/rootpool/rootpool_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rootpool/rootpool_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/rootpool/rootpool_007_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/rootpool/rootpool_test.sh create mode 100644 tests/sys/cddl/zfs/tests/rootpool/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/Makefile create mode 100644 tests/sys/cddl/zfs/tests/rsend/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend.cfg create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend.kshlib create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_010_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_011_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_012_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/rsend/rsend_013_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/rsend/rsend_test.sh create mode 100644 tests/sys/cddl/zfs/tests/rsend/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/Makefile create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/default.cfg create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_test.sh create mode 100644 tests/sys/cddl/zfs/tests/scrub_mirror/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/Makefile create mode 100644 tests/sys/cddl/zfs/tests/slog/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog.cfg create mode 100644 tests/sys/cddl/zfs/tests/slog/slog.kshlib create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_010_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_011_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_012_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_013_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/slog/slog_014_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/slog/slog_test.sh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/Makefile create mode 100644 tests/sys/cddl/zfs/tests/snapshot/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/clone_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/ctldir_acl.txt create mode 100644 tests/sys/cddl/zfs/tests/snapshot/rollback_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/rollback_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/rollback_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot.cfg create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_010_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_011_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_012_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_013_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_014_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_015_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_016_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_017_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_018_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_019_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapshot/snapshot_020_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/snapshot/snapshot_test.sh create mode 100644 tests/sys/cddl/zfs/tests/snapused/Makefile create mode 100644 tests/sys/cddl/zfs/tests/snapused/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapused/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapused/snapused.cfg create mode 100644 tests/sys/cddl/zfs/tests/snapused/snapused.kshlib create mode 100644 tests/sys/cddl/zfs/tests/snapused/snapused_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapused/snapused_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapused/snapused_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapused/snapused_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/snapused/snapused_005_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/snapused/snapused_test.sh create mode 100644 tests/sys/cddl/zfs/tests/sparse/Makefile create mode 100644 tests/sys/cddl/zfs/tests/sparse/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/sparse/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/sparse/sparse.cfg create mode 100644 tests/sys/cddl/zfs/tests/sparse/sparse_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/sparse/sparse_test.sh create mode 100644 tests/sys/cddl/zfs/tests/threadsappend/Makefile create mode 100644 tests/sys/cddl/zfs/tests/threadsappend/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/threadsappend/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/threadsappend/threadsappend.c create mode 100644 tests/sys/cddl/zfs/tests/threadsappend/threadsappend.cfg create mode 100644 tests/sys/cddl/zfs/tests/threadsappend/threadsappend_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/threadsappend/threadsappend_test.sh create mode 100644 tests/sys/cddl/zfs/tests/truncate/Makefile create mode 100644 tests/sys/cddl/zfs/tests/truncate/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/truncate/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/truncate/truncate.cfg create mode 100644 tests/sys/cddl/zfs/tests/truncate/truncate_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/truncate/truncate_002_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/truncate/truncate_test.sh create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/Makefile create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/fsync_integrity.c create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/fsync_integrity_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/make_patterns.py create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.c create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.cfg create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.d create mode 100644 tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity_test.sh create mode 100644 tests/sys/cddl/zfs/tests/userquota/Makefile create mode 100644 tests/sys/cddl/zfs/tests/userquota/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/groupspace_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/groupspace_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota.cfg create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_009_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_010_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_011_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_012_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userquota_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/userquota/userquota_test.sh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userspace_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/userquota/userspace_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/Makefile create mode 100644 tests/sys/cddl/zfs/tests/utils_test/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test.cfg create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test.kshlib create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/utils_test/utils_test_009_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/utils_test/utils_test_test.sh create mode 100644 tests/sys/cddl/zfs/tests/write_dirs/Makefile create mode 100644 tests/sys/cddl/zfs/tests/write_dirs/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/write_dirs/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/write_dirs/write_dirs.cfg create mode 100644 tests/sys/cddl/zfs/tests/write_dirs/write_dirs_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/write_dirs/write_dirs_002_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/write_dirs/write_dirs_test.sh create mode 100644 tests/sys/cddl/zfs/tests/xattr/Makefile create mode 100644 tests/sys/cddl/zfs/tests/xattr/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr.cfg create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_002_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_007_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_009_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_010_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_011_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_012_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_013_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/xattr/xattr_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/xattr/xattr_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zfsd/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/hotspare_cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/hotspare_setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd.cfg create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd.kshlib create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_degrade_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_degrade_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_fault_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_008_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_import_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_003_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/zfsd/zfsd_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zil/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zil/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zil/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zil/zil.cfg create mode 100644 tests/sys/cddl/zfs/tests/zil/zil.kshlib create mode 100644 tests/sys/cddl/zfs/tests/zil/zil_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zil/zil_002_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/zil/zil_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zinject/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zinject/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zinject/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zinject/zinject.cfg create mode 100644 tests/sys/cddl/zfs/tests/zinject/zinject.kshlib create mode 100644 tests/sys/cddl/zfs/tests/zinject/zinject_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zinject/zinject_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zinject/zinject_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zinject/zinject_004_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/zinject/zinject_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zones/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zones/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zones/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zones/zones.cfg create mode 100644 tests/sys/cddl/zfs/tests/zones/zones_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zones/zones_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zones/zones_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zones/zones_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zones/zones_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zones/zones_common.kshlib create mode 100755 tests/sys/cddl/zfs/tests/zones/zones_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zvol/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol.cfg create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC.cfg create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_cli/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_cli/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_cli/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli.cfg create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_003_neg.ksh create mode 100755 tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_common.kshlib create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc.cfg create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_001_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_003_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_005_neg.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_006_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_007_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_008_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_009_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap.cfg create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_001_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_002_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_003_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_004_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_005_pos.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_006_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_test.sh create mode 100644 tests/sys/cddl/zfs/tests/zvol_thrash/Makefile create mode 100644 tests/sys/cddl/zfs/tests/zvol_thrash/cleanup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol_thrash/setup.ksh create mode 100644 tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash.cfg create mode 100644 tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash_001_pos.ksh create mode 100755 tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash_test.sh diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist index 2b266601fdf..37af92ad561 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -428,6 +428,252 @@ .. aio .. + cddl + zfs + bin + .. + include + .. + tests + acl + cifs + .. + nontrivial + .. + trivial + .. + .. + atime + .. + bootfs + .. + cache + .. + cachefile + .. + clean_mirror + .. + cli_root + zfs_upgrade + .. + zfs_promote + .. + zfs_clone + .. + zfs_property + .. + zfs_destroy + .. + zpool_create + .. + zpool_history + .. + zpool_expand + .. + zpool_remove + .. + zfs_mount + .. + zfs_unshare + .. + zdb + .. + zpool_online + .. + zpool_get + .. + zpool_export + .. + zfs_copies + .. + zfs_get + .. + zfs + .. + zpool_clear + .. + zpool_import + blockfiles + .. + .. + zpool + .. + zpool_offline + .. + zpool_replace + .. + zfs_rollback + .. + zpool_set + .. + zfs_send + .. + zfs_set + .. + zpool_detach + .. + zfs_diff + .. + zpool_scrub + .. + zfs_inherit + .. + zfs_snapshot + .. + zfs_share + .. + zpool_destroy + .. + zpool_status + .. + zfs_unmount + .. + zfs_receive + .. + zfs_create + .. + zpool_upgrade + blockfiles + .. + .. + zpool_add + .. + zfs_rename + .. + zpool_attach + .. + zfs_reservation + .. + .. + cli_user + misc + .. + zfs_list + .. + zpool_iostat + .. + zpool_list + .. + .. + compression + .. + ctime + .. + delegate + .. + devices + .. + exec + .. + grow_pool + .. + grow_replicas + .. + history + .. + hotplug + .. + hotspare + .. + inheritance + .. + interop + .. + inuse + .. + iscsi + .. + large_files + .. + largest_pool + .. + link_count + .. + migration + .. + mmap + .. + mount + .. + mv_files + .. + nestedfs + .. + no_space + .. + online_offline + .. + pool_names + .. + poolversion + .. + quota + .. + redundancy + .. + refquota + .. + refreserv + .. + rename_dirs + .. + replacement + .. + reservation + .. + rootpool + .. + rsend + .. + scrub_mirror + .. + slog + .. + snapshot + .. + snapused + .. + sparse + .. + threadsappend + .. + truncate + .. + txg_integrity + .. + userquota + .. + utils_test + .. + write_dirs + .. + xattr + .. + zfsd + .. + zil + .. + zinject + .. + zones + .. + zvol + zvol_ENOSPC + .. + zvol_cli + .. + zvol_misc + .. + zvol_swap + .. + .. + zvol_thrash + .. + .. + .. + .. + dtrace + .. fifo .. file diff --git a/share/mk/atf.test.mk b/share/mk/atf.test.mk index babecd9f6a8..dd9a462ade1 100644 --- a/share/mk/atf.test.mk +++ b/share/mk/atf.test.mk @@ -21,6 +21,7 @@ ATF_TESTS_C?= ATF_TESTS_CXX?= ATF_TESTS_SH?= +ATF_TESTS_KSH93?= .if !empty(ATF_TESTS_C) PROGS+= ${ATF_TESTS_C} @@ -80,3 +81,28 @@ ${_T}: ${ATF_TESTS_SH_SRC_${_T}} mv ${.TARGET}.tmp ${.TARGET} .endfor .endif + +.if !empty(ATF_TESTS_KSH93) +SCRIPTS+= ${ATF_TESTS_KSH93} +_TESTS+= ${ATF_TESTS_KSH93} +.for _T in ${ATF_TESTS_KSH93} +SCRIPTSDIR_${_T}= ${TESTSDIR} +TEST_INTERFACE.${_T}= atf +CLEANFILES+= ${_T} ${_T}.tmp +# TODO(jmmv): It seems to me that this SED and SRC functionality should +# exist in bsd.prog.mk along the support for SCRIPTS. Move it there if +# this proves to be useful within the tests. +ATF_TESTS_KSH93_SED_${_T}?= # empty +ATF_TESTS_KSH93_SRC_${_T}?= ${_T}.sh +${_T}: ${ATF_TESTS_KSH93_SRC_${_T}} + echo '#! /usr/libexec/atf-sh -s/usr/local/bin/ksh93' > ${.TARGET}.tmp +.if empty(ATF_TESTS_KSH93_SED_${_T}) + cat ${.ALLSRC:N*Makefile*} >>${.TARGET}.tmp +.else + cat ${.ALLSRC:N*Makefile*} \ + | sed ${ATF_TESTS_KSH93_SED_${_T}} >>${.TARGET}.tmp +.endif + chmod +x ${.TARGET}.tmp + mv ${.TARGET}.tmp ${.TARGET} +.endfor +.endif diff --git a/tests/sys/Makefile b/tests/sys/Makefile index 1ff81373435..49b43c6f7c6 100644 --- a/tests/sys/Makefile +++ b/tests/sys/Makefile @@ -1,9 +1,12 @@ # $FreeBSD$ +.include + TESTSDIR= ${TESTSBASE}/sys TESTS_SUBDIRS+= acl TESTS_SUBDIRS+= aio +TESTS_SUBDIRS+= ${_cddl} TESTS_SUBDIRS+= fifo TESTS_SUBDIRS+= file TESTS_SUBDIRS+= fs @@ -21,6 +24,10 @@ TESTS_SUBDIRS+= sys TESTS_SUBDIRS+= vfs TESTS_SUBDIRS+= vm +.if ${MK_CDDL} != "no" +_cddl= cddl +.endif + # Items not integrated into kyua runs by default SUBDIR+= pjdfstest diff --git a/tests/sys/cddl/Makefile b/tests/sys/cddl/Makefile new file mode 100644 index 00000000000..f326602b77c --- /dev/null +++ b/tests/sys/cddl/Makefile @@ -0,0 +1,13 @@ +# $FreeBSD$ + +.include + +TESTSDIR= ${TESTSBASE}/sys/cddl + +TESTS_SUBDIRS+= ${_zfs} + +.if ${MK_ZFS} != "no" +_zfs= zfs +.endif + +.include diff --git a/tests/sys/cddl/zfs/Makefile b/tests/sys/cddl/zfs/Makefile new file mode 100644 index 00000000000..0b2e334d1a3 --- /dev/null +++ b/tests/sys/cddl/zfs/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +.include + +TESTSDIR= ${TESTSBASE}/sys/cddl/zfs + +TESTS_SUBDIRS+= tests include + +SUBDIR+= bin + +.include diff --git a/tests/sys/cddl/zfs/bin/Makefile b/tests/sys/cddl/zfs/bin/Makefile new file mode 100644 index 00000000000..21fff8e2ea5 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/Makefile @@ -0,0 +1,61 @@ +# $FreeBSD$ + +.include + +PACKAGE= tests +MAN= +BINDIR= ${TESTSBASE}/sys/cddl/zfs/bin +SCRIPTSDIR= ${TESTSBASE}/sys/cddl/zfs/bin + +SCRIPTS+= bsddisks.ksh +SCRIPTS+= dircmp.ksh +SCRIPTS+= dumpadm.ksh +SCRIPTS+= ff.ksh +SCRIPTS+= fmadm.ksh +SCRIPTS+= fmdump.ksh +SCRIPTS+= format.ksh +SCRIPTS+= groupadd.ksh +SCRIPTS+= groupdel.ksh +SCRIPTS+= groupmod.ksh +SCRIPTS+= groupshow.ksh +SCRIPTS+= svcs.ksh +SCRIPTS+= swap.ksh +SCRIPTS+= testenv.ksh +SCRIPTS+= useradd.ksh +SCRIPTS+= userdel.ksh +SCRIPTS+= usermod.ksh +SCRIPTS+= zfs.ksh +SCRIPTS+= zfs_crypto.ksh +SCRIPTS+= zfs_version.ksh +SCRIPTS+= zlogin.ksh +SCRIPTS+= zoneadm.ksh +SCRIPTS+= zonecfg.ksh +SCRIPTS+= zpool.ksh +SCRIPTS+= zpool_bsd.ksh +SCRIPTS+= zpool_smi.ksh +SCRIPTS+= zpool_version.ksh + +PROGS+= chg_usr_exec +# Not ported to FreeBSD +# PROGRS+= devname2devid +PROGS+= dir_rd_update +PROGS+= file_check +PROGS+= file_trunc +PROGS+= file_write +PROGS+= largest_file +PROGS+= mkfile +PROGS+= mktree +PROGS+= mmapwrite +PROGS+= randfree_file +PROGS+= readmmap +PROGS+= rename_dir +PROGS+= rm_lnkcnt_zero_file + +.for p in ${PROGS} +SRCS.$p= $p.c +.endfor + +LIBADD.mmapwrite+= pthread +LIBADD.rm_lnkcnt_zero_file+= pthread + +.include diff --git a/tests/sys/cddl/zfs/bin/bsddisks.ksh b/tests/sys/cddl/zfs/bin/bsddisks.ksh new file mode 100644 index 00000000000..e544fb078bb --- /dev/null +++ b/tests/sys/cddl/zfs/bin/bsddisks.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +BSDDEVS="ad|da|mlxd|myld|aacd|ided|twed" +ls /dev|egrep "^($BSDDEVS)[0-9]+\$" |sed 's/^/\/dev\//' diff --git a/tests/sys/cddl/zfs/bin/chg_usr_exec.c b/tests/sys/cddl/zfs/bin/chg_usr_exec.c new file mode 100644 index 00000000000..c1de099aa1b --- /dev/null +++ b/tests/sys/cddl/zfs/bin/chg_usr_exec.c @@ -0,0 +1,78 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)chg_usr_exec.c 1.3 07/05/25 SMI" + +#include +#include +#include +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + char *plogin = NULL; + char cmds[BUFSIZ] = { 0 }; + char sep[] = " "; + struct passwd *ppw = NULL; + int i, len; + + if (argc < 3 || strlen(argv[1]) == 0) { + (void) printf("\tUsage: %s ...\n", argv[0]); + return (1); + } + + plogin = argv[1]; + len = 0; + for (i = 2; i < argc; i++) { + (void) snprintf(cmds+len, sizeof (cmds)-len, + "%s%s", argv[i], sep); + len += strlen(argv[i]) + strlen(sep); + } + + if ((ppw = getpwnam(plogin)) == NULL) { + perror("getpwnam"); + return (errno); + } + if (setgid(ppw->pw_gid) != 0) { + perror("setgid"); + return (errno); + } + if (setuid(ppw->pw_uid) != 0) { + perror("setuid"); + return (errno); + } + + if (execl("/bin/sh", "sh", "-c", cmds, (char *)0) != 0) { + perror("execl"); + return (errno); + } + + return (0); +} diff --git a/tests/sys/cddl/zfs/bin/devname2devid.c b/tests/sys/cddl/zfs/bin/devname2devid.c new file mode 100644 index 00000000000..b9f3eec6326 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/devname2devid.c @@ -0,0 +1,123 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)devname2devid.c 1.3 07/05/25 SMI" + +#include +#include +#include +#include +#include +#include +#include + +/* + * Usage: devname2devid + * + * Examples: + * # ./devname2devid /dev/dsk/c1t4d0s0 + * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/a + * # ./devname2devid /dev/dsk/c1t4d0 + * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/wd + * # ./devname2devid /dev/dsk/c1t4d0s1 + * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/b + * # + * + * This program accepts a disk or disk slice path and prints a + * device id. + * + * Exit values: + * 0 - means success + * 1 - means failure + * + */ +int +main(int argc, char *argv[]) +{ + int fd; + ddi_devid_t devid; + char *minor_name, *devidstr, *device; +#ifdef DEBUG + devid_nmlist_t *list = NULL; + char *search_path; + int i; +#endif + + if (argc == 1) { + (void) printf("%s [search path]\n", + argv[0]); + exit(1); + } + device = argv[1]; + + if ((fd = open(device, O_RDONLY|O_NDELAY)) < 0) { + perror(device); + exit(1); + } + if (devid_get(fd, &devid) != 0) { + perror("devid_get"); + exit(1); + } + if (devid_get_minor_name(fd, &minor_name) != 0) { + perror("devid_get_minor_name"); + exit(1); + } + if ((devidstr = devid_str_encode(devid, minor_name)) == 0) { + perror("devid_str_encode"); + exit(1); + } + + (void) printf("devid %s\n", devidstr); + + devid_str_free(devidstr); + +#ifdef DEBUG + if (argc == 3) { + search_path = argv[2]; + } else { + search_path = "/dev/rdsk"; + } + + if (devid_deviceid_to_nmlist(search_path, devid, DEVID_MINOR_NAME_ALL, + &list)) { + perror("devid_deviceid_to_nmlist"); + exit(1); + } + + /* loop through list and process device names and numbers */ + for (i = 0; list[i].devname != NULL; i++) { + (void) printf("devname: %s %p\n", list[i].devname, list[i].dev); + } + devid_free_nmlist(list); + +#endif /* DEBUG */ + + devid_str_free(minor_name); + devid_free(devid); + + return (0); +} diff --git a/tests/sys/cddl/zfs/bin/dir_rd_update.c b/tests/sys/cddl/zfs/bin/dir_rd_update.c new file mode 100644 index 00000000000..6e7fd93e10a --- /dev/null +++ b/tests/sys/cddl/zfs/bin/dir_rd_update.c @@ -0,0 +1,122 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)dir_rd_update.c 1.2 07/01/09 SMI" + +/* + * Assertion: + * + * A read operation and directory update operation performed + * concurrently on the same directory can lead to deadlock + * on a UFS logging file system, but not on a ZFS file system. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#define TMP_DIR /tmp + +static char dirpath[256]; + +int +main(int argc, char **argv) +{ + char *cp1 = ""; + int i = 0; + int ret = 0; + int testdd = 0; + pid_t pid; + static const int op_num = 5; + + if (argc == 1) { + (void) printf("Usage: %s \n", argv[0]); + exit(-1); + } + for (i = 0; i < 256; i++) { + dirpath[i] = 0; + } + + cp1 = argv[1]; + (void) strcpy(&dirpath[0], (const char *)cp1); + (void) strcat(&dirpath[strlen(dirpath)], "TMP_DIR"); + + ret = mkdir(dirpath, 0777); + if (ret != 0) { + if (errno != EEXIST) { + (void) printf( + "%s: mkdir(<%s>, 0777) failed: errno (decimal)=%d\n", + argv[0], dirpath, errno); + exit(-1); + } + } + testdd = open(dirpath, O_RDONLY|O_SYNC); + if (testdd < 0) { + (void) printf( +"%s: open(<%s>, O_RDONLY|O_SYNC) failed: errno (decimal)=%d\n", + argv[0], dirpath, errno); + exit(-1); + } else { + (void) close(testdd); + } + pid = fork(); + if (pid > 0) { + int fd = open(dirpath, O_RDONLY|O_SYNC); + char buf[16]; + int rdret; + int j = 0; + + while (j < op_num) { + (void) sleep(1); + rdret = read(fd, buf, 16); + if (rdret == -1) { + (void) printf("readdir failed"); + } + j++; + } + } else if (pid == 0) { + int fd = open(dirpath, O_RDONLY); + int chownret; + int k = 0; + + while (k < op_num) { + (void) sleep(1); + chownret = fchown(fd, 0, 0); + if (chownret == -1) { + (void) printf("chown failed"); + } + + k++; + } + } + + return (0); +} diff --git a/tests/sys/cddl/zfs/bin/dircmp.ksh b/tests/sys/cddl/zfs/bin/dircmp.ksh new file mode 100644 index 00000000000..251c4a869c0 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/dircmp.ksh @@ -0,0 +1,5 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +diff -qr $* diff --git a/tests/sys/cddl/zfs/bin/dumpadm.ksh b/tests/sys/cddl/zfs/bin/dumpadm.ksh new file mode 100644 index 00000000000..a96a71d7931 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/dumpadm.ksh @@ -0,0 +1,10 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +if [ $# != 0 ] +then + echo "ERROR option not supported" + return 1 +fi +grep dumpdev /etc/rc.conf diff --git a/tests/sys/cddl/zfs/bin/ff.ksh b/tests/sys/cddl/zfs/bin/ff.ksh new file mode 100644 index 00000000000..5e596ddcfd7 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/ff.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +echo dummy +exit 0 diff --git a/tests/sys/cddl/zfs/bin/file_check.c b/tests/sys/cddl/zfs/bin/file_check.c new file mode 100644 index 00000000000..dc2f348a724 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/file_check.c @@ -0,0 +1,89 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)file_check.c 1.3 07/05/25 SMI" + +#include "file_common.h" + +static unsigned char bigbuffer[BIGBUFFERSIZE]; + +/* + * Given a filename, check that the file consists entirely + * of a particular pattern. If the pattern is not specified a + * default will be used. For default values see file_common.h + */ +int +main(int argc, char **argv) +{ + int bigfd; + long i, n; + uint8_t fillchar = DATA; + int bigbuffersize = BIGBUFFERSIZE; + int64_t read_count = 0; + + /* + * Validate arguments + */ + if (argc < 2) { + (void) printf("Usage: %s filename [pattern]\n", + argv[0]); + exit(1); + } + + if (argv[2]) { + fillchar = atoi(argv[2]); + } + + /* + * Read the file contents and check every character + * against the supplied pattern. Abort if the + * pattern check fails. + */ + if ((bigfd = open(argv[1], O_RDONLY)) == -1) { + (void) printf("open %s failed %d\n", argv[1], errno); + exit(1); + } + + do { + if ((n = read(bigfd, &bigbuffer, bigbuffersize)) == -1) { + (void) printf("read failed (%ld), %d\n", n, errno); + exit(errno); + } + + for (i = 0; i < n; i++) { + if (bigbuffer[i] != fillchar) { + (void) printf("error %s: 0x%x != 0x%x)\n", + argv[1], bigbuffer[i], fillchar); + exit(1); + } + } + + read_count += n; + } while (n == bigbuffersize); + + return (0); +} diff --git a/tests/sys/cddl/zfs/bin/file_common.h b/tests/sys/cddl/zfs/bin/file_common.h new file mode 100644 index 00000000000..3ae1b07cd22 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/file_common.h @@ -0,0 +1,65 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef FILE_COMMON_H +#define FILE_COMMON_H + +#pragma ident "@(#)file_common.h 1.3 07/05/25 SMI" + +/* + * header file for file_* utilities. These utilities + * are used by the test cases to perform various file + * operations (append writes, for example). + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#define BLOCKSZ 8192 +#define DATA 0xa5 +#define DATA_RANGE 120 +#define BIGBUFFERSIZE 0x800000 +#define BIGFILESIZE 20 + +extern char *optarg; +extern int optind, opterr, optopt; + +#ifdef __cplusplus +} +#endif + +#endif /* FILE_COMMON_H */ diff --git a/tests/sys/cddl/zfs/bin/file_trunc.c b/tests/sys/cddl/zfs/bin/file_trunc.c new file mode 100644 index 00000000000..5fe3ad61a32 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/file_trunc.c @@ -0,0 +1,240 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ +#pragma ident "@(#)file_trunc.c 1.2 07/05/25 SMI" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FSIZE 256*1024*1024 +#define BSIZE 512 + +/* Initialize Globals */ +static long fsize = FSIZE; +static size_t bsize = BSIZE; +static int count = 0; +static int rflag = 0; +static int seed = 0; +static int vflag = 0; +static int errflag = 0; +static off_t offset = 0; +static char *filename = NULL; + +static void usage(char *execname); +static void parse_options(int argc, char *argv[]); +static void do_write(int fd); +static void do_trunc(int fd); + +static void +usage(char *execname) +{ + (void) fprintf(stderr, + "usage: %s [-b blocksize] [-c count] [-f filesize]" + " [-o offset] [-s seed] [-r] [-v] filename\n", execname); + (void) exit(1); +} + +int +main(int argc, char *argv[]) +{ + int i = 0; + int fd = -1; + + parse_options(argc, argv); + + fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0666); + if (fd < 0) { + perror("open"); + exit(3); + } + + while (i < count) { + (void) do_write(fd); + (void) do_trunc(fd); + + i++; + } + + (void) close(fd); + return (0); +} + +static void +parse_options(int argc, char *argv[]) +{ + int c; + + extern char *optarg; + extern int optind, optopt; + + count = fsize / bsize; + seed = time(NULL); + while ((c = getopt(argc, argv, "b:c:f:o:rs:v")) != -1) { + switch (c) { + case 'b': + bsize = atoi(optarg); + break; + + case 'c': + count = atoi(optarg); + break; + + case 'f': + fsize = atoi(optarg); + break; + + case 'o': + offset = atoi(optarg); + break; + + case 'r': + rflag++; + break; + + case 's': + seed = atoi(optarg); + break; + + case 'v': + vflag++; + break; + + case ':': + (void) fprintf(stderr, + "Option -%c requires an operand\n", optopt); + errflag++; + break; + + case '?': + (void) fprintf(stderr, + "Unrecognized option: -%c\n", optopt); + errflag++; + break; + } + + if (errflag) { + (void) usage(argv[0]); + } + } + if (argc <= optind) { + (void) fprintf(stderr, + "No filename specified\n"); + usage(argv[0]); + } + filename = argv[optind]; + + if (vflag) { + (void) fprintf(stderr, "Seed = %d\n", seed); + } + srandom(seed); +} + +static void +do_write(int fd) +{ + off_t roffset = 0; + char *buf = NULL; + char *rbuf = NULL; + + buf = (char *)calloc(1, bsize); + rbuf = (char *)calloc(1, bsize); + if (buf == NULL || rbuf == NULL) { + perror("malloc"); + exit(4); + } + + roffset = random() % fsize; + if (lseek(fd, (offset + roffset), SEEK_SET) < 0) { + perror("lseek"); + exit(5); + } + + strcpy(buf, "ZFS Test Suite Truncation Test"); + if (write(fd, buf, bsize) < bsize) { + perror("write"); + exit(6); + } + + if (rflag) { + if (lseek(fd, (offset + roffset), SEEK_SET) < 0) { + perror("lseek"); + exit(7); + } + + if (read(fd, rbuf, bsize) < bsize) { + perror("read"); + exit(8); + } + + if (memcmp(buf, rbuf, bsize) != 0) { + perror("memcmp"); + exit(9); + } + } + if (vflag) { + (void) fprintf(stderr, + "Wrote to offset %ld\n", (offset + roffset)); + if (rflag) { + (void) fprintf(stderr, + "Read back from offset %ld\n", (offset + roffset)); + } + } + + (void) free(buf); + (void) free(rbuf); +} + +static void +do_trunc(int fd) +{ + off_t roffset = 0; + + roffset = random() % fsize; + if (ftruncate(fd, (offset + roffset)) < 0) { + perror("truncate"); + exit(7); + } + + if (vflag) { + (void) fprintf(stderr, + "Truncated at offset %ld\n", + (offset + roffset)); + } +} diff --git a/tests/sys/cddl/zfs/bin/file_write.c b/tests/sys/cddl/zfs/bin/file_write.c new file mode 100644 index 00000000000..1c276589ec3 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/file_write.c @@ -0,0 +1,239 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)file_write.c 1.4 07/10/09 SMI" + +#include "file_common.h" +#include + +static unsigned char bigbuffer[BIGBUFFERSIZE]; + +/* + * Writes (or appends) a given value to a file repeatedly. + * See header file for defaults. + */ + +static void usage(void); +static char *execname; + +int +main(int argc, char **argv) +{ + int bigfd; + int c; + int oflag = 0; + int err = 0; + int k; + long i; + int64_t good_writes = 0; + uint8_t nxtfillchar; + /* + * Default Parameters + */ + int write_count = BIGFILESIZE; + uint8_t fillchar = DATA; + int block_size = BLOCKSZ; + char *filename = NULL; + char *operation = NULL; + off_t noffset, offset = 0; + int verbose = 0; + int rsync = 0; + int wsync = 0; + + execname = argv[0]; + + /* + * Process Arguments + */ + while ((c = getopt(argc, argv, "b:c:d:s:f:o:vwr")) != -1) { + switch (c) { + case 'b': + block_size = atoi(optarg); + break; + case 'c': + write_count = atoi(optarg); + break; + case 'd': + fillchar = atoi(optarg); + break; + case 's': + offset = atoll(optarg); + break; + case 'f': + filename = optarg; + break; + case 'o': + operation = optarg; + break; + case 'v': + verbose = 1; + break; + case 'w': + wsync = 1; + break; + case 'r': + rsync = 1; + break; + case '?': + (void) printf("unknown arg %c\n", optopt); + usage(); + break; + } + } + + /* + * Validate Parameters + */ + if (!filename) { + (void) printf("Filename not specified (-f )\n"); + err++; + } + + if (!operation) { + (void) printf("Operation not specified (-o ).\n"); + err++; + } + + if (block_size > BIGBUFFERSIZE) { + (void) printf("block_size is too large max==%d.\n", + BIGBUFFERSIZE); + err++; + } + + if (err) usage(); + + /* + * Prepare the buffer and determine the requested operation + */ + nxtfillchar = fillchar; + k = 0; + + for (i = 0; i < block_size; i++) { + bigbuffer[i] = nxtfillchar; + + if (fillchar == 0) { + if ((k % DATA_RANGE) == 0) { + k = 0; + } + nxtfillchar = k++; + } + } + + /* + * using the strncmp of operation will make the operation match the + * first shortest match - as the operations are unique from the first + * character this means that we match single character operations + */ + if ((strncmp(operation, "create", strlen(operation) + 1)) == 0 || + (strncmp(operation, "overwrite", strlen(operation) + 1)) == 0) { + oflag = (O_RDWR|O_CREAT); + } else if ((strncmp(operation, "append", strlen(operation) + 1)) == 0) { + oflag = (O_RDWR|O_APPEND); + } else { + (void) printf("valid operations are not '%s'\n", + operation); + usage(); + } + +#ifdef UNSUPPORTED + if (rsync) { + oflag = oflag | O_RSYNC; + } +#endif + + if (wsync) { + oflag = oflag | O_SYNC; + } + + /* + * Given an operation (create/overwrite/append), open the file + * accordingly and perform a write of the appropriate type. + */ + if ((bigfd = open(filename, oflag, 0666)) == -1) { + (void) printf("open %s: failed [%s]%d. Aborting!\n", filename, + strerror(errno), errno); + exit(errno); + } + noffset = lseek(bigfd, offset, SEEK_SET); + if (noffset != offset) { + (void) printf("lseek %s (%lld/%lld) failed [%s]%d.Aborting!\n", + filename, offset, noffset, strerror(errno), errno); + exit(errno); + } + + if (verbose) { + (void) printf("%s: block_size = %d, write_count = %d, " + "offset = %lld, data = %s%d\n", filename, block_size, + write_count, offset, + (fillchar == 0) ? "0->" : "", + (fillchar == 0) ? DATA_RANGE : fillchar); + } + + for (i = 0; i < write_count; i++) { + ssize_t n; + + if ((n = write(bigfd, &bigbuffer, block_size)) == -1) { + (void) printf("write failed (%ld), good_writes = %lld, " + "error: %s[%d]\n", (long)n, good_writes, + strerror(errno), + errno); + exit(errno); + } + good_writes++; + } + + if (verbose) { + (void) printf("Success: good_writes = %lld (%lld)\n", + good_writes, (good_writes * block_size)); + } + + return (0); +} + +static void +usage(void) +{ + char *base = (char *)"file_write"; + char *exec = (char *)execname; + + if (exec != NULL) + exec = strdup(exec); + if (exec != NULL) + base = basename(exec); + + (void) printf("Usage: %s [-v] -o {create,overwrite,append} -f file_name" + " [-b block_size]\n" + "\t[-s offset] [-c write_count] [-d data]\n" + "\twhere [data] equal to zero causes chars " + "0->%d to be repeated throughout\n", base, DATA_RANGE); + + if (exec) { + free(exec); + } + + exit(1); +} diff --git a/tests/sys/cddl/zfs/bin/fmadm.ksh b/tests/sys/cddl/zfs/bin/fmadm.ksh new file mode 100644 index 00000000000..5e596ddcfd7 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/fmadm.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +echo dummy +exit 0 diff --git a/tests/sys/cddl/zfs/bin/fmdump.ksh b/tests/sys/cddl/zfs/bin/fmdump.ksh new file mode 100644 index 00000000000..5e596ddcfd7 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/fmdump.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +echo dummy +exit 0 diff --git a/tests/sys/cddl/zfs/bin/format.ksh b/tests/sys/cddl/zfs/bin/format.ksh new file mode 100644 index 00000000000..5e596ddcfd7 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/format.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +echo dummy +exit 0 diff --git a/tests/sys/cddl/zfs/bin/groupadd.ksh b/tests/sys/cddl/zfs/bin/groupadd.ksh new file mode 100644 index 00000000000..a4e13a19444 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/groupadd.ksh @@ -0,0 +1,13 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +a= +g= +for i in $* +do + a="$a $g" + g=$i +done + +/usr/sbin/pw groupadd $g $a diff --git a/tests/sys/cddl/zfs/bin/groupdel.ksh b/tests/sys/cddl/zfs/bin/groupdel.ksh new file mode 100644 index 00000000000..16f01f48bd8 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/groupdel.ksh @@ -0,0 +1,13 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +a= +g= +for i in $* +do + a="$a $g" + g=$i +done + +/usr/sbin/pw groupdel $a $g diff --git a/tests/sys/cddl/zfs/bin/groupmod.ksh b/tests/sys/cddl/zfs/bin/groupmod.ksh new file mode 100644 index 00000000000..9c1ea72647b --- /dev/null +++ b/tests/sys/cddl/zfs/bin/groupmod.ksh @@ -0,0 +1,13 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +a= +g= +for i in $* +do + a="$a $g" + g=$i +done + +/usr/sbin/pw groupmod $g $a diff --git a/tests/sys/cddl/zfs/bin/groupshow.ksh b/tests/sys/cddl/zfs/bin/groupshow.ksh new file mode 100644 index 00000000000..f6469aa0721 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/groupshow.ksh @@ -0,0 +1,5 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +/usr/sbin/pw groupshow $* diff --git a/tests/sys/cddl/zfs/bin/largest_file.c b/tests/sys/cddl/zfs/bin/largest_file.c new file mode 100644 index 00000000000..67b7b95dbbe --- /dev/null +++ b/tests/sys/cddl/zfs/bin/largest_file.c @@ -0,0 +1,132 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)largest_file.c 1.3 07/05/25 SMI" + +#include "file_common.h" +#include +#include +#include + +/* + * -------------------------------------------------------------- + * + * Assertion: + * The last byte of the largest file size can be + * accessed without any errors. Also, the writing + * beyond the last byte of the largest file size + * will produce an errno of EFBIG. + * + * -------------------------------------------------------------- + * If the write() system call below returns a "1", + * then the last byte can be accessed. + * -------------------------------------------------------------- + */ +static void sigxfsz(int); +static void usage(char *); + +int +main(int argc, char **argv) +{ + int fd = 0; + off_t offset = (OFF_MAX - 1); + off_t lseek_ret = 0; + int write_ret = 0; + int err = 0; + char mybuf[5]; + char *testfile; + + if (argc != 2) { + usage(argv[0]); + } + + (void) sigset(SIGXFSZ, sigxfsz); + + testfile = strdup(argv[1]); + + fd = open(testfile, O_CREAT | O_RDWR); + if (fd < 0) { + perror("Failed to create testfile"); + err = errno; + goto out; + } + + lseek_ret = lseek(fd, offset, SEEK_SET); + if (lseek_ret < 0) { + perror("Failed to seek to end of testfile"); + err = errno; + goto out; + } + + write_ret = write(fd, mybuf, 1); + if (write_ret < 0) { + perror("Failed to write to end of file"); + err = errno; + goto out; + } + + offset = 0; + lseek_ret = lseek(fd, offset, SEEK_CUR); + if (lseek_ret < 0) { + perror("Failed to seek to end of file"); + err = errno; + goto out; + } + + write_ret = write(fd, mybuf, 1); + if (write_ret < 0) { + if (errno == EFBIG) { + (void) printf("write errno=EFBIG: success\n"); + err = 0; + } else { + perror("Did not receive EFBIG"); + err = errno; + } + } else { + (void) printf("write completed successfully, test failed\n"); + err = 1; + } + +out: + (void) unlink(testfile); + free(testfile); + return (err); +} + +static void +usage(char *name) +{ + (void) printf("%s \n", name); + exit(1); +} + +/* ARGSUSED */ +static void +sigxfsz(int signo) +{ + (void) printf("\nlargest_file: sigxfsz() caught SIGXFSZ\n"); +} diff --git a/tests/sys/cddl/zfs/bin/mkfile.c b/tests/sys/cddl/zfs/bin/mkfile.c new file mode 100644 index 00000000000..cb74471a4c6 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/mkfile.c @@ -0,0 +1,214 @@ +/*- + * Copyright (c) 2001-2013 + * HATANO Tomomi. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef lint +static char rcsid[] = "$Id: mkfile.c,v 1.5 2013-10-26 10:11:34+09 hatanou Exp $"; +#endif /* !lint */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MKFILE_WBUF ((size_t)(1048576)) /* Is 1M a reasonable value? */ + +/* SunOS's mkfile(8) sets "sticky bit." */ +#define MKFILE_FLAG (O_WRONLY | O_CREAT | O_TRUNC) +#define MKFILE_MODE (S_IRUSR | S_IWUSR | S_ISVTX) + +static char buf[MKFILE_WBUF]; +static int nofill = 0; +static int verbose = 0; + +static void +usage() +{ + fprintf(stderr, + "Usage: mkfile [-nv] [e|p|t|g|m|k|b] ...\n"); +} + +static unsigned long long +getsize(char *s) +{ + int sh; + unsigned long long length; + char *suffix; + + /* + * NOTE: We don't handle 'Z' (zetta) or 'Y' (yotta) suffixes yet. + * These are too large to store in unsigned long long (64bits). + * In the future, we'll have to use larger type, + * something like uint128_t. + */ + length = strtoull(s, &suffix, 10); + sh = 0; + switch (tolower(*suffix)) { + case 'e': /* Exabytes. */ + sh = 60; + break; + case 'p': /* Petabytes. */ + sh = 50; + break; + case 't': /* Terabytes. */ + sh = 40; + break; + case 'g': /* Gigabytes. */ + sh = 30; + break; + case 'm': /* Megabytes. */ + sh = 20; + break; + case 'k': /* Kilobytes. */ + sh = 10; + break; + case 'b': /* Blocks. */ + sh = 9; + break; + case '\0': /* Bytes. */ + break; + default: /* Unknown... */ + errno = EINVAL; + return 0; + } + if (sh) { + unsigned long long l; + + l = length; + length <<= sh; + /* Check overflow. */ + if ((length >> sh) != l) { + errno = ERANGE; + return 0; + } + } + + return length; +} + +static int +create_file(char *f, unsigned long long s) +{ + int fd; + size_t w; + ssize_t ws; + + if (verbose) { + fprintf(stdout, "%s %llu bytes\n", f, s); + fflush(stdout); + } + + /* Open file to create. */ + if ((fd = open(f, MKFILE_FLAG, MKFILE_MODE)) < 0) { + return -1; + } + + /* Seek to the end and write 1 byte. */ + if ((lseek(fd, (off_t)(s - 1LL), SEEK_SET) == (off_t)-1) || + (write(fd, buf, (size_t)1) == (ssize_t)-1)) { + /* + * We don't close(fd) here to avoid overwriting errno. + * This is fd-leak, but is not harmful + * because returning error causes mkfile(8) to exit. + */ + return -1; + } + + /* Fill. */ + if (!nofill) { + if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) { + /* Same as above. */ + return -1; + } + while (s) { + w = (s > MKFILE_WBUF) ? MKFILE_WBUF : s; + if ((ws = write(fd, buf, w)) == (ssize_t)-1) { + /* Same as above. */ + return -1; + } + s -= ws; + } + } + close(fd); + + return 0; +} + +int +main(int argc, char *argv[]) +{ + unsigned long long fsize; + char ch; + + /* We have at least 2 arguments. */ + if (argc < 3) { + usage(); + return EXIT_FAILURE; + } + + /* Options. */ + while ((ch = getopt(argc, argv, "nv")) != -1) { + switch (ch) { + case 'n': + nofill = 1; + break; + case 'v': + verbose = 1; + break; + default: + usage(); + return EXIT_FAILURE; + } + } + argc -= optind; + argv += optind; + + /* File size to create. */ + if ((fsize = getsize(*argv)) == 0) { + perror(*argv); + return EXIT_FAILURE; + } + + /* Filenames to create. */ + bzero(buf, MKFILE_WBUF); + while (++argv, --argc) { + if (create_file(*argv, fsize) == -1) { + perror(*argv); + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} diff --git a/tests/sys/cddl/zfs/bin/mktree.c b/tests/sys/cddl/zfs/bin/mktree.c new file mode 100644 index 00000000000..03aa2d67609 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/mktree.c @@ -0,0 +1,196 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)mktree.c 1.3 07/05/25 SMI" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TYPE_D 'D' +#define TYPE_F 'F' + +extern int errno; + +static char fdname[MAXPATHLEN] = {0}; +static char *pbasedir = NULL; +static int nlevel = 2; +static int ndir = 2; +static int nfile = 2; + +static void usage(char *this); +static void crtfile(char *pname); +static char *getfdname(char *pdir, char type, int level, int dir, int file); +static int mktree(char *pbasedir, int level); + +int +main(int argc, char *argv[]) +{ + int c, ret; + + while ((c = getopt(argc, argv, "b:l:d:f:")) != -1) { + switch (c) { + case 'b': + pbasedir = optarg; + break; + case 'l': + nlevel = atoi(optarg); + break; + case 'd': + ndir = atoi(optarg); + break; + case 'f': + nfile = atoi(optarg); + break; + case '?': + usage(argv[0]); + } + } + if (nlevel < 0 || ndir < 0 || nfile < 0 || pbasedir == NULL) { + usage(argv[0]); + } + + ret = mktree(pbasedir, 1); + + return (ret); +} + +static void +usage(char *this) +{ + (void) fprintf(stderr, + "\tUsage: %s -b -l [nlevel] -d [ndir] -f [nfile]\n", + this); + exit(1); +} + +static int +mktree(char *pdir, int level) +{ + int d, f; + char dname[MAXPATHLEN] = {0}; + char fname[MAXPATHLEN] = {0}; + + if (level > nlevel) { + return (1); + } + + for (d = 0; d < ndir; d++) { + (void) memset(dname, '\0', sizeof (dname)); + (void) strcpy(dname, getfdname(pdir, TYPE_D, level, d, 0)); + + if (mkdir(dname, 0777) != 0) { + (void) fprintf(stderr, "mkdir(%s) failed." + "\n[%d]: %s.\n", + dname, errno, strerror(errno)); + exit(errno); + } + + /* + * No sub-directory need be created, only create files in it. + */ + if (mktree(dname, level+1) != 0) { + for (f = 0; f < nfile; f++) { + (void) memset(fname, '\0', sizeof (fname)); + (void) strcpy(fname, + getfdname(dname, TYPE_F, level+1, d, f)); + crtfile(fname); + } + } + } + + for (f = 0; f < nfile; f++) { + (void) memset(fname, '\0', sizeof (fname)); + (void) strcpy(fname, getfdname(pdir, TYPE_F, level, d, f)); + crtfile(fname); + } + + return (0); +} + +static char * +getfdname(char *pdir, char type, int level, int dir, int file) +{ + (void) snprintf(fdname, sizeof (fdname), + "%s/%c-l%dd%df%d", pdir, type, level, dir, file); + return (fdname); +} + +static void +crtfile(char *pname) +{ + int fd = -1; + int afd = -1; + int i, size; + char *context = "0123456789ABCDF"; + char *pbuf; + + if (pname == NULL) { + exit(1); + } + + size = sizeof (char) * 1024; + pbuf = (char *)valloc(size); + for (i = 0; i < size / strlen(context); i++) { + int offset = i * strlen(context); + (void) snprintf(pbuf+offset, size-offset, "%s", context); + } + + if ((fd = open(pname, O_CREAT|O_RDWR, 0777)) < 0) { + (void) fprintf(stderr, "open(%s, O_CREAT|O_RDWR, 0777) failed." + "\n[%d]: %s.\n", pname, errno, strerror(errno)); + exit(errno); + } + if (write(fd, pbuf, 1024) < 1024) { + (void) fprintf(stderr, "write(fd, pbuf, 1024) failed." + "\n[%d]: %s.\n", errno, strerror(errno)); + exit(errno); + } + +#if UNSUPPORTED + if ((afd = openat(fd, "xattr", O_CREAT | O_RDWR | O_XATTR, 0777)) < 0) { + (void) fprintf(stderr, "openat failed.\n[%d]: %s.\n", + errno, strerror(errno)); + exit(errno); + } + if (write(afd, pbuf, 1024) < 1024) { + (void) fprintf(stderr, "write(afd, pbuf, 1024) failed." + "\n[%d]: %s.\n", errno, strerror(errno)); + exit(errno); + } + + (void) close(afd); +#endif + (void) close(fd); + free(pbuf); +} diff --git a/tests/sys/cddl/zfs/bin/mmapwrite.c b/tests/sys/cddl/zfs/bin/mmapwrite.c new file mode 100644 index 00000000000..756b33b5cb9 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/mmapwrite.c @@ -0,0 +1,99 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)mmapwrite.c 1.4 07/05/25 SMI" + +#include +#include +#include +#include +#include +#include + +/* + * -------------------------------------------------------------------- + * Bug Id: 5032643 + * + * Simply writing to a file and mmaping that file at the same time can + * result in deadlock. Nothing perverse like writing from the file's + * own mapping is required. + * -------------------------------------------------------------------- + */ + +static void * +mapper(void *fdp) +{ + void *addr; + int fd = *(int *)fdp; + + if ((addr = + mmap(0, 8192, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) { + perror("mmap"); + exit(1); + } + for (;;) { + if (mmap(addr, 8192, PROT_READ, + MAP_SHARED|MAP_FIXED, fd, 0) == MAP_FAILED) { + perror("mmap"); + exit(1); + } + } + /* NOTREACHED */ + return ((void *)1); +} + +int +main(int argc, char **argv) +{ + int fd; + char buf[BUFSIZ]; + pthread_t pt; + + if (argc != 2) { + (void) printf("usage: %s \n", argv[0]); + exit(1); + } + + if ((fd = open(argv[1], O_RDWR|O_CREAT|O_TRUNC, 0666)) == -1) { + perror("open"); + exit(1); + } + + if (pthread_create(&pt, NULL, mapper, &fd) != 0) { + perror("pthread_create"); + exit(1); + } + for (;;) { + if (write(fd, buf, sizeof (buf)) == -1) { + perror("write"); + exit(1); + } + } + + /* NOTREACHED */ + return (0); +} diff --git a/tests/sys/cddl/zfs/bin/randfree_file.c b/tests/sys/cddl/zfs/bin/randfree_file.c new file mode 100644 index 00000000000..3c43abcf6c2 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/randfree_file.c @@ -0,0 +1,104 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)randfree_file.c 1.3 07/05/25 SMI" + +#include "file_common.h" + +/* + * Create a file with assigned size and then free the specified + * section of the file + */ + +static void usage(char *progname); + +static void +usage(char *progname) +{ + (void) fprintf(stderr, + "usage: %s [-l filesize] [-s start-offset]" + "[-n section-len] filename\n", progname); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + char *filename, *buf; + size_t filesize; + off_t start_off, off_len; + int fd, ch; + struct flock fl; + + while ((ch = getopt(argc, argv, "l:s:n:")) != EOF) { + switch (ch) { + case 'l': + filesize = atoll(optarg); + break; + case 's': + start_off = atoll(optarg); + break; + case 'n': + off_len = atoll(optarg); + break; + default: + usage(argv[0]); + break; + } + } + + if (optind == argc - 1) + filename = argv[optind]; + else + usage(argv[0]); + + buf = (char *)malloc(filesize); + + if ((fd = open(filename, O_RDWR|O_CREAT|O_TRUNC)) < 0) { + perror("open"); + return (1); + } + if (write(fd, buf, filesize) < filesize) { + perror("write"); + return (1); + } +#if UNSUPPORTED + fl.l_whence = SEEK_SET; + fl.l_start = start_off; + fl.l_len = off_len; + if (fcntl(fd, F_FREESP, &fl) != 0) { + perror("fcntl"); + return (1); + } +#else + fprintf(stderr, "fcntl: F_FREESP not supported\n"); + return (1); +#endif + + free(buf); + return (0); +} diff --git a/tests/sys/cddl/zfs/bin/readmmap.c b/tests/sys/cddl/zfs/bin/readmmap.c new file mode 100644 index 00000000000..117246a8c2c --- /dev/null +++ b/tests/sys/cddl/zfs/bin/readmmap.c @@ -0,0 +1,140 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)readmmap.c 1.4 07/05/25 SMI" + +/* + * -------------------------------------------------------------- + * BugId 5047993 : Getting bad read data. + * + * Usage: readmmap + * + * where: + * filename is an absolute path to the file name. + * + * Return values: + * 1 : error + * 0 : no errors + * -------------------------------------------------------------- + */ +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + char *filename = "badfile"; + size_t size = 4395; + size_t idx = 0; + char *buf = NULL; + char *map = NULL; + int fd = -1, bytes, retval = 0; + unsigned seed; + + if (argc < 2 || optind == argc) { + (void) fprintf(stderr, + "usage: %s \n", argv[0]); + exit(1); + } + + if ((buf = calloc(1, size)) == NULL) { + perror("calloc"); + exit(1); + } + + filename = argv[optind]; + + (void) remove(filename); + + fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0666); + if (fd == -1) { + perror("open to create"); + retval = 1; + goto end; + } + + bytes = write(fd, buf, size); + if (bytes != size) { + (void) printf("short write: %d != %ud\n", bytes, size); + retval = 1; + goto end; + } + + map = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (map == MAP_FAILED) { + perror("mmap"); + retval = 1; + goto end; + } + seed = time(NULL); + srandom(seed); + + idx = random() % size; + map[idx] = 1; + + if (msync(map, size, MS_SYNC) != 0) { + perror("msync"); + retval = 1; + goto end; + } + + if (munmap(map, size) != 0) { + perror("munmap"); + retval = 1; + goto end; + } + + bytes = pread(fd, buf, size, 0); + if (bytes != size) { + (void) printf("short read: %d != %ud\n", bytes, size); + retval = 1; + goto end; + } + + if (buf[idx] != 1) { + (void) printf( + "bad data from read! got buf[%ud]=%d, expected 1\n", + idx, buf[idx]); + retval = 1; + goto end; + } + + (void) printf("good data from read: buf[%ud]=1\n", idx); +end: + if (fd != -1) { + (void) close(fd); + } + if (buf != NULL) { + free(buf); + } + + return (retval); +} diff --git a/tests/sys/cddl/zfs/bin/rename_dir.c b/tests/sys/cddl/zfs/bin/rename_dir.c new file mode 100644 index 00000000000..3a475f2544d --- /dev/null +++ b/tests/sys/cddl/zfs/bin/rename_dir.c @@ -0,0 +1,92 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)rename_dir.c 1.1 07/05/25 SMI" + +/* + * Assertion: + * Create two directory trees in zfs filesystem, and rename + * directory across the directory structure. ZFS can handle + * the race situation. + */ + +/* + * Need to create the following directory structures before + * running this program: + * + * mkdir -p 1/2/3/4/5 a/b/c/d/e + */ + + +#include +#include +#include +#include + +int +main() +{ + int i = 1; + char buf[256]; + char *msg = "rename() fails to handle race situation\n"; + + switch (fork()) { + case -1: + perror("fork"); + exit(1); + break; + case 0: + while (i > 0) { + int c_count = 0; + if (rename("a/b/c", "1/2/3/c") == 0) + c_count++; + if (rename("1/2/3/c", "a/b/c") == 0) + c_count++; + if (c_count) { + (void) strlcat(buf, "c_count: %d,", 256); + (void) strlcat(buf, msg, 256); + (void) fprintf(stderr, buf, c_count); + } + } + break; + default: + while (i > 0) { + int p_count = 0; + if (rename("1", "a/b/c/d/e/1") == 0) + p_count++; + if (rename("a/b/c/d/e/1", "1") == 0) + p_count++; + if (p_count) { + (void) strlcat(buf, "p_count: %d,", 256); + (void) strlcat(buf, msg, 256); + (void) fprintf(stderr, buf, p_count); + } + } + break; + } + return (0); +} diff --git a/tests/sys/cddl/zfs/bin/rm_lnkcnt_zero_file.c b/tests/sys/cddl/zfs/bin/rm_lnkcnt_zero_file.c new file mode 100644 index 00000000000..c6ebb22b3d3 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/rm_lnkcnt_zero_file.c @@ -0,0 +1,148 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)rm_lnkcnt_zero_file.c 1.3 07/05/25 SMI" + +/* + * -------------------------------------------------------------------- + * The purpose of this test is to see if the bug reported (#4723351) for + * UFS exists when using a ZFS file system. + * -------------------------------------------------------------------- + * + */ +#define _REENTRANT 1 +#include +#include +#include +#include +#include +#include +#include +#include + +static const int TRUE = 1; +static char *filebase; + +static int +pickidx() +{ + return (random() % 1000); +} + +/* ARGSUSED */ +static void * +mover(void *a) +{ + char buf[256]; + int idx, ret; + + while (TRUE) { + idx = pickidx(); + (void) sprintf(buf, "%s.%03d", filebase, idx); + ret = rename(filebase, buf); + if (ret < 0 && errno != ENOENT) + (void) perror("renaming file"); + } + + return (NULL); +} + +/* ARGSUSED */ +static void * +cleaner(void *a) +{ + char buf[256]; + int idx, ret; + + while (TRUE) { + idx = pickidx(); + (void) sprintf(buf, "%s.%03d", filebase, idx); + ret = remove(buf); + if (ret < 0 && errno != ENOENT) + (void) perror("removing file"); + } + + return (NULL); +} + +static void * +writer(void *a) +{ + int *fd = (int *)a; + + while (TRUE) { + (void) close (*fd); + *fd = open(filebase, O_APPEND | O_RDWR | O_CREAT, 0644); + if (*fd < 0) + perror("refreshing file"); + (void) write(*fd, "test\n", 5); + } + + return (NULL); +} + +int +main(int argc, char **argv) +{ + int fd; + pthread_t tid; + + if (argc == 1) { + (void) printf("Usage: %s \n", argv[0]); + exit(-1); + } + + filebase = argv[1]; + fd = open(filebase, O_APPEND | O_RDWR | O_CREAT, 0644); + if (fd < 0) { + perror("creating test file"); + exit(-1); + } + + if (pthread_setconcurrency(4)) { /* 3 threads + main */ + fprintf(stderr, "failed to set concurrency\n"); + exit(-1); + } + (void) pthread_create(&tid, NULL, mover, NULL); + (void) pthread_create(&tid, NULL, cleaner, NULL); + (void) pthread_create(&tid, NULL, writer, (void *) &fd); + + while (TRUE) { + int ret; + struct stat st; + + ret = stat(filebase, &st); + if (ret == 0 && (st.st_nlink > 2 || st.st_nlink < 1)) { + (void) printf("st.st_nlink = %d, exiting\n", \ + (int)st.st_nlink); + exit(0); + } + (void) sleep(1); + } + + return (0); +} diff --git a/tests/sys/cddl/zfs/bin/svcs.ksh b/tests/sys/cddl/zfs/bin/svcs.ksh new file mode 100644 index 00000000000..5e596ddcfd7 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/svcs.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +echo dummy +exit 0 diff --git a/tests/sys/cddl/zfs/bin/swap.ksh b/tests/sys/cddl/zfs/bin/swap.ksh new file mode 100644 index 00000000000..9a6cbd8040d --- /dev/null +++ b/tests/sys/cddl/zfs/bin/swap.ksh @@ -0,0 +1,5 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +swapinfo diff --git a/tests/sys/cddl/zfs/bin/testenv.ksh b/tests/sys/cddl/zfs/bin/testenv.ksh new file mode 100644 index 00000000000..9daa985475a --- /dev/null +++ b/tests/sys/cddl/zfs/bin/testenv.ksh @@ -0,0 +1,8 @@ +#!/usr/bin/env ksh93 +script=$(realpath $0) +export STF_BIN=$(dirname ${script}) +export STF_SUITE=$(dirname ${STF_BIN}) + +# $FreeBSD$ + +env ENV=${STF_SUITE}/include/testenv.kshlib ksh93 -E -l diff --git a/tests/sys/cddl/zfs/bin/useradd.ksh b/tests/sys/cddl/zfs/bin/useradd.ksh new file mode 100644 index 00000000000..fc6b177b3a5 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/useradd.ksh @@ -0,0 +1,13 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +a= +g= +for i in $* +do + a="$a $g" + g=$i +done + +/usr/sbin/pw useradd $g $a diff --git a/tests/sys/cddl/zfs/bin/userdel.ksh b/tests/sys/cddl/zfs/bin/userdel.ksh new file mode 100644 index 00000000000..9ea56d6a041 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/userdel.ksh @@ -0,0 +1,13 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +a= +g= +for i in $* +do + a="$a $g" + g=$i +done + +/usr/sbin/pw userdel $g $a diff --git a/tests/sys/cddl/zfs/bin/usermod.ksh b/tests/sys/cddl/zfs/bin/usermod.ksh new file mode 100644 index 00000000000..37c51519676 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/usermod.ksh @@ -0,0 +1,13 @@ +#! /usr/local/bin/ksh93 -p + +# $FreeBSD$ + +a= +g= +for i in $* +do + a="$a $g" + g=$i +done + +/usr/sbin/pw usermod $g $a diff --git a/tests/sys/cddl/zfs/bin/zfs.ksh b/tests/sys/cddl/zfs/bin/zfs.ksh new file mode 100644 index 00000000000..eb007024ab2 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zfs.ksh @@ -0,0 +1,44 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs.ksh 1.2 09/01/13 SMI" +# + +ZFS=/sbin/zfs + +set -A saved_options -- "$@" + +for wrapper in ${ZFS_WRAPPER} ; do + if [[ -x ${STF_SUITE}/bin/zfs_$wrapper ]]; then + options=$(${STF_SUITE}/bin/zfs_$wrapper "${saved_options[@]}") + set -A saved_options -- $options + fi +done + +$ZFS "${saved_options[@]}" +return $? diff --git a/tests/sys/cddl/zfs/bin/zfs_crypto.ksh b/tests/sys/cddl/zfs/bin/zfs_crypto.ksh new file mode 100644 index 00000000000..ebca5025932 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zfs_crypto.ksh @@ -0,0 +1,59 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_crypto.ksh 1.2 09/05/19 SMI" +# + +cmd=$1 +shift +options="$@" + +case $cmd in + create) + # Get zfs name + # eval zfsname=\${$#} + + if [[ $KEYSOURCE_DATASET == "passphrase" ]]; then + options="-o encryption=$ENCRYPTION \ +-o keysource=passphrase,file://$PASSPHRASE_FILE $options" + elif [[ $KEYSOURCE_DATASET == "raw" ]]; then + options="-o encryption=$ENCRYPTION \ +-o keysource=raw,file://$RAW_KEY_FILE $options" + elif [[ $KEYSOURCE_DATASET == "hex" ]]; then + options="-o encryption=$ENCRYPTION \ +-o keysource=hex,file://$HEX_KEY_FILE $options" + elif [[ -n $KEYSOURCE_DATASET ]]; then + log_note "Warning: invalid KEYSOURCE_DATASET \c" + log_note "value: $KEYSOURCE_DATASET, ignore it" + fi + ;; + *) + ;; +esac + +print $cmd $options diff --git a/tests/sys/cddl/zfs/bin/zfs_version.ksh b/tests/sys/cddl/zfs/bin/zfs_version.ksh new file mode 100644 index 00000000000..8c0b6bac430 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zfs_version.ksh @@ -0,0 +1,68 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_version.ksh 1.1 09/01/13 SMI" +# + +cmd=$1 +shift +options="$@" + +o_version_option="no" +V_option="no" + +while getopts :o:V: c +do + case $c in + o) + if [[ "$OPTARG" == "version="* ]]; then + o_version_option="yes" + fi + ;; + V) + V_option="yes" + ;; + *) + ;; + esac +done +shift $(($OPTIND - 1)) + +case $cmd in + create) + if [[ "$ZFS_TEST_VERSION" != "0" ]] && + [[ "$o_version_option" == "no" ]] && + [[ "$V_option" == "no" ]]; then + options="-o version=$ZFS_TEST_VERSION $options" + fi + ;; + *) + ;; +esac + +print "$cmd $options" diff --git a/tests/sys/cddl/zfs/bin/zlogin.ksh b/tests/sys/cddl/zfs/bin/zlogin.ksh new file mode 100644 index 00000000000..5e596ddcfd7 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zlogin.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +echo dummy +exit 0 diff --git a/tests/sys/cddl/zfs/bin/zoneadm.ksh b/tests/sys/cddl/zfs/bin/zoneadm.ksh new file mode 100644 index 00000000000..1860f6285f5 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zoneadm.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +echo global +exit 0 diff --git a/tests/sys/cddl/zfs/bin/zonecfg.ksh b/tests/sys/cddl/zfs/bin/zonecfg.ksh new file mode 100644 index 00000000000..5e596ddcfd7 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zonecfg.ksh @@ -0,0 +1,6 @@ +#!/usr/local/bin/ksh93 + +# $FreeBSD$ + +echo dummy +exit 0 diff --git a/tests/sys/cddl/zfs/bin/zpool.ksh b/tests/sys/cddl/zfs/bin/zpool.ksh new file mode 100644 index 00000000000..f7d8bab1646 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zpool.ksh @@ -0,0 +1,46 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool.ksh 1.2 09/01/13 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +ZPOOL=/sbin/zpool + +set -A saved_options -- "$@" + +for wrapper in ${ZPOOL_WRAPPER} ; do + if [[ -x ${STF_SUITE}/bin/zpool_$wrapper ]]; then + options=$(${STF_SUITE}/bin/zpool_$wrapper "${saved_options[@]}") + set -A saved_options -- $options + fi +done + +$ZPOOL "${saved_options[@]}" +return $? diff --git a/tests/sys/cddl/zfs/bin/zpool_bsd.ksh b/tests/sys/cddl/zfs/bin/zpool_bsd.ksh new file mode 100644 index 00000000000..2d0920640a2 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zpool_bsd.ksh @@ -0,0 +1,42 @@ +#!/usr/local/bin/ksh93 -p +# + +# $FreeBSD$ + +cmd=$1 + +if [[ -z $cmd ]]; then + return 0 +fi + +shift + + +typeset option +case $cmd in + create|add|attach|detach|replace|remove|online|offline|clear) + for arg in $@; do + if [[ $arg == "/dev/dsk/"* ]]; then + arg=${arg#/dev/dsk/} + arg="/dev/"$arg + fi + if [[ $arg == "/dev/"* ]]; then + echo $arg | egrep "*s[0-9]$" > /dev/null 2>&1 + if [ $? -eq 0 ] + then + n=`echo $arg| wc -c` + set -A map a b c d e f g h i j + s=`echo $arg | cut -c $((n-1))` + arg=${arg%s[0-9]}${map[$s]} + fi + fi + + option="${option} $arg" + done + ;; + *) + option="$@" + ;; +esac + +echo $cmd $option diff --git a/tests/sys/cddl/zfs/bin/zpool_smi.ksh b/tests/sys/cddl/zfs/bin/zpool_smi.ksh new file mode 100644 index 00000000000..d84a0330c20 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zpool_smi.ksh @@ -0,0 +1,138 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_smi.ksh 1.2 09/01/13 SMI" +# + +function labelvtoc +{ + typeset disk=$1 + if [[ -z $disk ]]; then + print "no disk is given." + return 1 + fi + + /usr/sbin/format $disk << _EOF >/dev/null 2>&1 +label +yes +_EOF + + labeltype=$(/usr/sbin/prtvtoc -fh /dev/rdsk/${disk}s2 | \ + awk '{print $1}' | awk -F= '{print $2}' ) + if [[ -z $labeltype ]]; then + print "${disk} not exist." + return 1 + fi + + if [[ $labeltype == "34" ]]; then + + typeset label_file=$TMPDIR/labelvtoc.${TESTCASE_ID:-$$} + typeset arch=$(uname -p) + + if [[ $arch == "i386" ]]; then + print "label" > $label_file + print "0" >> $label_file + print "" >> $label_file + print "q" >> $label_file + print "q" >> $label_file + + fdisk -B /dev/rdsk/${disk}p0 >/dev/null 2>&1 + # wait a while for fdisk finishes + /usr/sbin/devfsadm > /dev/null 2>&1 + elif [[ $arch == "sparc" ]]; then + print "label" > $label_file + print "0" >> $label_file + print "" >> $label_file + print "" >> $label_file + print "" >> $label_file + print "q" >> $label_file + else + print "unknow arch type : $arch" + return 1 + fi + + format -e -s -d $disk -f $label_file + typeset -i ret_val=$? + rm -f $label_file + # + # wait the format to finish + # + /usr/sbin/devfsadm > /dev/null 2>&1 + if (( ret_val != 0 )); then + print "unable to label $disk as VTOC." + return 1 + fi + fi + + return 0 +} + +cmd=$1 + +if [[ -z $cmd ]]; then + return 0 +fi + +shift + + +typeset option +case $cmd in + create|add|attach|detach|replace|remove|online|offline|clear) + for arg in $@; do + if [[ $arg == "/dev/dsk/"* ]]; then + arg=${arg#/dev/dsk/} + fi + + print $arg | egrep "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1 + + if [[ $? -eq 0 ]] ; then + labelvtoc $arg + if [[ $? -eq 0 ]] ; then + arg=${arg}s2 + fi + fi + option="${option} $arg" + done + ;; + *) + option="$@" + ;; +esac + +case $cmd in + create|add|attach|replace) + if [[ $option != *"-f"* ]]; then + cmd="${cmd} -f" + fi + ;; + *) + ;; +esac + +print $cmd $option diff --git a/tests/sys/cddl/zfs/bin/zpool_version.ksh b/tests/sys/cddl/zfs/bin/zpool_version.ksh new file mode 100644 index 00000000000..dfec5cf53e8 --- /dev/null +++ b/tests/sys/cddl/zfs/bin/zpool_version.ksh @@ -0,0 +1,73 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_version.ksh 1.1 09/01/13 SMI" +# + +cmd=$1 +shift +options="$@" + +o_version_option="no" +O_version_option="no" + +while getopts :o:O: c +do + case $c in + o) + if [[ "$OPTARG" == "version="* ]]; then + o_version_option="yes" + fi + ;; + O) + if [[ "$OPTARG" == "version="* ]]; then + O_version_option="yes" + fi + ;; + *) + ;; + esac +done +shift $(($OPTIND - 1)) + +case $cmd in + create) + if [[ "$ZFS_TEST_VERSION" != "0" ]] && + [[ "$O_version_option" == "no" ]]; then + options="-O version=$ZFS_TEST_VERSION $options" + fi + if [[ "$ZPOOL_TEST_VERSION" != "0" ]] && + [[ "$o_version_option" == "no" ]]; then + options="-o version=$ZPOOL_TEST_VERSION $options" + fi + ;; + *) + ;; +esac + +print "$cmd $options" diff --git a/tests/sys/cddl/zfs/include/Makefile b/tests/sys/cddl/zfs/include/Makefile new file mode 100644 index 00000000000..76c4af9e15f --- /dev/null +++ b/tests/sys/cddl/zfs/include/Makefile @@ -0,0 +1,32 @@ +# $FreeBSD$ + +.include + +PACKAGE= tests + +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/include + +STFSUITEDIR=${TESTSBASE}/sys/cddl/zfs + +MAN= +FILESDIR= ${TESTSBASE}/sys/cddl/zfs/include +${PACKAGE}FILES+= constants.cfg +${PACKAGE}FILES+= libremote.kshlib +${PACKAGE}FILES+= libgnop.kshlib +${PACKAGE}FILES+= logapi.kshlib +${PACKAGE}FILES+= libtest.kshlib +${PACKAGE}FILES+= stf.shlib +${PACKAGE}FILES+= testenv.kshlib + +${PACKAGE}FILES+= commands.cfg +CLEANFILES+= commands.cfg +commands.cfg: translatecommands.awk commands.txt + awk -v stfsuitedir=${STFSUITEDIR} -f ${.ALLSRC} > ${.TARGET} + +${PACKAGE}FILES+= default.cfg +CLEANFILES+= default.cfg +default.cfg: default.cfg.in + sed "s:%%STFSUITEDIR%%:${STFSUITEDIR}:" ${.ALLSRC} > ${.TARGET} + +ATF_TESTS_KSH93+= libtest_test +.include diff --git a/tests/sys/cddl/zfs/include/commands.txt b/tests/sys/cddl/zfs/include/commands.txt new file mode 100644 index 00000000000..8c90e6f8f42 --- /dev/null +++ b/tests/sys/cddl/zfs/include/commands.txt @@ -0,0 +1,194 @@ +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +#!/usr/local/bin/ksh93 -p +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)commands.txt 1.8 09/01/13 SMI" +# +# All the commands in this file are converted into environment variables +# with the same name as the command e.g. +# +# /bin/df becomes export DF="/bin/df" +# finally an export CMDS="aggregation of all the environment variables" +# is created for checking in the execution environment. +# +# comments are ignored in this file, as are whitespace lines + +# General Solaris Commands +/usr/bin/awk +/usr/sbin/arp +/usr/bin/basename +/usr/bin/bzcat +/bin/cat +/usr/bin/cd +/usr/bin/chgrp +/bin/chmod +/usr/sbin/chown +/usr/bin/cksum +/sbin/clri +/usr/bin/cmp +/usr/bin/compress +/usr/bin/uncompress +#/usr/bin/coreadm +/bin/cp +/usr/bin/cpio +/usr/bin/cut +/bin/date +/bin/dd +#/usr/sbin/devfsadm +%%STFSUITEDIR%%/bin/df +/usr/bin/diff +%%STFSUITEDIR%%/bin/dircmp +/usr/bin/dirname +/usr/bin/du +#%%STFSUITEDIR%%/bin/dumpadm +/bin/echo +/usr/bin/egrep +/usr/bin/env +#%%STFSUITEDIR%%/bin/ff +/usr/bin/fgrep +/usr/bin/file +/usr/bin/find +#%%STFSUITEDIR%%/bin/fmadm +#%%STFSUITEDIR%%/bin/fmdump +#%%STFSUITEDIR%%/bin/format +/sbin/fsck +/sbin/fsdb +/sbin/fsirand +/usr/bin/fsync +/usr/sbin/fstyp +/usr/bin/id +#/usr/bin/isainfo +#/usr/sbin/iscsiadm +#/usr/sbin/iscsitadm +/usr/bin/getent +/bin/getfacl +/usr/bin/getconf +/sbin/sha1 +/sbin/gpart +/usr/bin/grep +/usr/bin/groups +%%STFSUITEDIR%%/bin/groupadd +%%STFSUITEDIR%%/bin/groupdel +%%STFSUITEDIR%%/bin/groupmod +%%STFSUITEDIR%%/bin/groupshow +/usr/bin/head +/bin/hostname +/bin/kill +/usr/local/bin/ksh93 +#/usr/sbin/labelit +#/usr/sbin/lockfs +#/usr/sbin/lofiadm +/bin/ls +/usr/bin/logname +#/usr/bin/mdb +/sbin/mdconfig +#/usr/sbin/metaclear +#/usr/sbin/metadb +#/usr/sbin/metainit +#/usr/sbin/metastat +/bin/mkdir +/sbin/mknod +#/usr/sbin/modinfo +#/usr/sbin/modunload +/sbin/mount +/bin/mv +#/usr/sbin/ncheck +/sbin/newfs +/usr/bin/nawk +#/usr/bin/pack +/usr/bin/pagesize +/bin/pax +/sbin/ping +/usr/bin/printf +#/usr/sbin/prtvtoc +#/usr/bin/pfexec +/bin/pgrep +#/usr/bin/pkginfo +/bin/pkill +/bin/ps +#/usr/sbin/psrinfo +/bin/pwd +/usr/sbin/quotaon +/bin/rcp +/sbin/reboot +/bin/rm +/bin/rmdir +/usr/bin/rsh +#/usr/bin/runat +/usr/bin/sed +#/usr/sbin/share +/bin/sleep +/usr/bin/su +/usr/bin/sum +#%%STFSUITEDIR%%/bin/svcs +#/usr/sbin/svcadm +#%%STFSUITEDIR%%/bin/swap +#/sbin/swapadd +/usr/bin/sort +/usr/bin/stat +/usr/bin/strings +/bin/sync +/usr/bin/tar +/usr/bin/tail +/usr/bin/timeout +/usr/bin/touch +/usr/bin/tr +/usr/bin/true +/usr/bin/truncate +/sbin/tunefs +#/usr/sbin/ufsdump +#/usr/sbin/ufsrestore +/usr/bin/umask +/sbin/umount +/usr/bin/uname +/usr/bin/uniq +#/usr/sbin/unshare +#/usr/bin/unpack +%%STFSUITEDIR%%/bin/useradd +%%STFSUITEDIR%%/bin/userdel +%%STFSUITEDIR%%/bin/usermod +/usr/bin/wait +/usr/bin/wc +#%%STFSUITEDIR%%/bin/zoneadm +#%%STFSUITEDIR%%/bin/zonecfg +#%%STFSUITEDIR%%/bin/zlogin +#/usr/bin/zonename +/sbin/swapon +/sbin/swapoff +/sbin/swapctl +/usr/bin/xargs +/usr/sbin/zfsd + +# ZFS Commands +/usr/sbin/zdb +/sbin/zfs +/sbin/zpool +/usr/bin/zinject + +# Test framework commands +#/opt/SUNWstc-runwattr/bin/runwattr +%%STFSUITEDIR%%/bin/bsddisks diff --git a/tests/sys/cddl/zfs/include/constants.cfg b/tests/sys/cddl/zfs/include/constants.cfg new file mode 100644 index 00000000000..74f760085f3 --- /dev/null +++ b/tests/sys/cddl/zfs/include/constants.cfg @@ -0,0 +1,113 @@ +#!/usr/bin/env ksh93 +# vim: filetype=sh +# $FreeBSD$ + +# Add test-specific binaries to PATH +export PATH=${STF_SUITE}/bin:${PATH} +export TMPDIR=${TMPDIR-/tmp} + +# Set default value of TMPDIR +export TMPDIR=${TMPDIR-/tmp} + +# Define run length constants +export RT_LONG="3" +export RT_MEDIUM="2" +export RT_SHORT="1" + +# Define macro for zone test +export ZONE_POOL="zonepool" +export ZONE_CTR="zonectr" + +# Test Suite Specific Commands +export DEVNAME2DEVID="devname2devid" +export FILE_WRITE="file_write" +export FILE_CHECK="file_check" +export LARGEST_FILE="largest_file" +export MMAPWRITE="mmapwrite" +export MKFILE="mkfile" +export READMMAP="readmmap" +export FILE_TRUNC="file_trunc" +export CHG_USR_EXEC="chg_usr_exec" +export MKTREE="mktree" +export RANDFREE_FILE="randfree_file" +export DIR_RD_UPDATE="dir_rd_update" +export RM_LNKCNT_ZERO_FILE="rm_lnkcnt_zero_file" +export RENAME_DIR="rename_dir" + +# ensure we're running in the C locale, since +# localised messages may result in test failures +export LC_ALL="C" +export LANG="C" + +# +# pattern to ignore from 'zpool list'. +# +export NO_POOLS="no pools available" + +# pattern to ignore from 'zfs list'. +export NO_DATASETS="no datasets available" + +export TEST_BASE_DIR="/" + +# Default to compression ON +export COMPRESSION_PROP=on + +# Default to using the checksum +export CHECKSUM_PROP=on + +# some common variables used by test scripts : + +export TESTCASE_ID=${TESTCASE_ID:-$$} +# some test pool names +export TESTPOOL=testpool.${TESTCASE_ID} +export TESTPOOL1=testpool1.${TESTCASE_ID} +export TESTPOOL2=testpool2.${TESTCASE_ID} +export TESTPOOL3=testpool3.${TESTCASE_ID} + +# some test file system names +export TESTCTR=testctr${TESTCASE_ID} +export TESTFS=testfs.${TESTCASE_ID} +export TESTFS1=testfs1.${TESTCASE_ID} +export TESTFS2=testfs2.${TESTCASE_ID} +export TESTFS3=testfs3.${TESTCASE_ID} + +# some test directory names +export TESTDIR=${TEST_BASE_DIR%%/}/testdir${TESTCASE_ID} +export TESTDIR0=${TEST_BASE_DIR%%/}/testdir0${TESTCASE_ID} +export TESTDIR1=${TEST_BASE_DIR%%/}/testdir1${TESTCASE_ID} +export TESTDIR2=${TEST_BASE_DIR%%/}/testdir2${TESTCASE_ID} + +# Default to limit disks to be checked +export MAX_FINDDISKSNUM=100 + +# For iscsi target support +export ISCSITGTFILE=$TMPDIR/iscsitgt_file +export ISCSITGT_FMRI=svc:/system/iscsitgt:default + +if [ -n "$SVCS" ]; then + export AUTO_SNAP=$($SVCS -a | $GREP auto-snapshot | $GREP online | $AWK '{print $3}') +fi + +# zfs upgrade should output the first line as: +# This system is currently running ZFS filesystem version 2. +# . + +ZFS_VERSION= +$ZFS upgrade -v > /dev/null 2>&1 +if [ $? -eq 0 ]; then + export ZFS_VERSION=$($ZFS upgrade | $HEAD -1 | $AWK '{print $NF}' \ + | $SED -e 's/\.//g') +fi + +if [ -n "$ZFS_VERSION" ]; then + i=1 + ZFS_ALL_VERSIONS="" + while [ "$i" -le "$ZFS_VERSION" ]; do + eval 'export ZFS_VERSION_$i="v${i}-fs"' + ZFS_ALL_VERSIONS="$ZFS_ALL_VERSIONS $i" + i=$(( i + 1 )) + done + export ZFS_ALL_VERSIONS +fi + +$TRUE diff --git a/tests/sys/cddl/zfs/include/default.cfg.in b/tests/sys/cddl/zfs/include/default.cfg.in new file mode 100644 index 00000000000..98a21725528 --- /dev/null +++ b/tests/sys/cddl/zfs/include/default.cfg.in @@ -0,0 +1,52 @@ +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)default.cfg 1.8 08/11/03 SMI" +# +# Read the user config file, if it exists +# + +export STF_SUITE=%%STFSUITEDIR%% + +. $STF_SUITE/include/libtest.kshlib + +# source the autogenerated commands.cfg file (built from the commands.txt file +. $STF_SUITE/include/commands.cfg + +# Turn ATF variables into environment variables +export DISKS=`atf_config_get disks ""` +export KEEP=`atf_config_get keep_pools "" | ${SED} -E 's/ +/|/g'` +export TESTCASE_ID=$(echo $(atf_get ident) | cksum -o 2 | cut -f 1 -d " ") + + +. $STF_SUITE/include/constants.cfg + +# finally, if we're running in a local zone +# we take some additional actions +if ! is_global_zone; then + reexport_pool +fi diff --git a/tests/sys/cddl/zfs/include/libgnop.kshlib b/tests/sys/cddl/zfs/include/libgnop.kshlib new file mode 100644 index 00000000000..1e285bb9f02 --- /dev/null +++ b/tests/sys/cddl/zfs/include/libgnop.kshlib @@ -0,0 +1,98 @@ +# vim: filetype=sh +# +# Copyright (c) 2017 Spectra Logic Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer, +# without modification. +# 2. Redistributions in binary form must reproduce at minimum a disclaimer +# substantially similar to the "NO WARRANTY" disclaimer below +# ("Disclaimer") and any redistribution must be conditioned upon +# including a substantially similar Disclaimer requirement for further +# binary redistribution. +# +# NO WARRANTY +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGES. +# +# $FreeBSD$ +# + +# +# Routines that use gnop(8) to simulate devices that can disappear at any time +# + +# Create a gnop device on top of a real device. Don't use the full extent; use +# a portion in the middle so that any ZFS label present on the real device +# won't be present on the gnop device and vice versa. +function create_gnop +{ + # Name of disk to use, with or without /dev/ + typeset disk=$1 + # Optional physical path to use + typeset physpath=$2 + # size of disk in bytes + typeset -li disk_size + # disk size, rounded down to multiple of 16384 + typeset -li disk_size_rounded + # size of the nop device in bytes + typeset -li nop_size + # offset of the beginning of the nop device in bytes + typeset -li nop_offset + typeset args + + disk_size=`diskinfo $disk | cut -f 3` + # Round it down so the nop device will be 4k-aligned + disk_size_rounded=$(( ${disk_size} / 16384 * 16384 )) + nop_size=$(( ${disk_size_rounded} / 4 )) + nop_offset=${nop_size} + args="-s ${nop_size} -o ${nop_offset}" + if [ -n "$physpath" ]; then + args="$args -z $physpath" + fi + + gnop create ${args} ${disk} +} + +# Create multiple gnop devices +function create_gnops +{ + typeset disk + for disk in $@; do + create_gnop "$disk" || return 1 + done + return 0 +} + +# Destroy a gnop device. +function destroy_gnop +{ + # Name of the underlying (non-gnop) device + typeset disk=$1 + + # Use "-f" so we can destroy a gnop with a consumer (like ZFS) + gnop destroy -f ${disk}.nop +} + +# Destroy multiple gnop devices. Attempt to destroy them all, ignoring errors +function destroy_gnops +{ + typeset disk + for disk in $@; do + destroy_gnop "$disk" + done + return 0 +} diff --git a/tests/sys/cddl/zfs/include/libremote.kshlib b/tests/sys/cddl/zfs/include/libremote.kshlib new file mode 100644 index 00000000000..85acf6f14c8 --- /dev/null +++ b/tests/sys/cddl/zfs/include/libremote.kshlib @@ -0,0 +1,47 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)libremote.kshlib 1.1 07/05/25 SMI" +# + +# Check if a package is installed +# $1 package name +# Return 0 if it is installed; 1 if not installed +function pkg_isinstalled +{ + /usr/bin/pkginfo -q $1 + return $? +} + +# Get the installation base for a package +# $1 package name +# Return +function pkg_getinstbase +{ + /bin/echo $(/usr/bin/pkginfo -r $1 2>/dev/null) +} diff --git a/tests/sys/cddl/zfs/include/libtest.kshlib b/tests/sys/cddl/zfs/include/libtest.kshlib new file mode 100644 index 00000000000..30589649e12 --- /dev/null +++ b/tests/sys/cddl/zfs/include/libtest.kshlib @@ -0,0 +1,3480 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)libtest.kshlib 1.15 09/08/06 SMI" +# + +. ${STF_SUITE}/include/logapi.kshlib + +ZFS=${ZFS:-/sbin/zfs} +ZPOOL=${ZPOOL:-/sbin/zpool} +os_name=`uname -s` + +# Determine if a test has the necessary requirements to run + +function test_requires +{ + integer unsupported=0 + unsupported_list="" + until [[ $# -eq 0 ]];do + var_name=$1 + cmd=$(eval echo \$${1}) + if [[ ! "$cmd" != "" ]] ; then + print $var_name is not set + unsupported_list="$var_name $unsupported_list" + ((unsupported=unsupported+1)) + fi + shift + done + if [[ unsupported -gt 0 ]] ; then + log_unsupported "$unsupported_list commands are unsupported" + else + log_note "All commands are supported" + fi +} + +# Determine whether a dataset is mounted +# +# $1 dataset name +# $2 filesystem type; optional - defaulted to zfs +# +# Return 0 if dataset is mounted; 1 if unmounted; 2 on error + +function ismounted +{ + typeset fstype=$2 + [[ -z $fstype ]] && fstype=zfs + typeset out dir name ret + + case $fstype in + zfs) + if [[ "$1" == "/"* ]] ; then + for out in $($ZFS mount | $AWK '{print $2}') ; do + [[ $1 == $out ]] && return 0 + done + else + for out in $($ZFS mount | $AWK '{print $1}') ; do + [[ $1 == $out ]] && return 0 + done + fi + ;; + ufs|nfs) + # a = device, b = "on", c = mount point", d = flags + $MOUNT | $GREP $fstype | while read a b c d + do + [[ "$1" == "$a" || "$1" == "$c" ]] && return 0 + done + ;; + esac + + return 1 +} + +# Return 0 if a dataset is mounted; 1 otherwise +# +# $1 dataset name +# $2 filesystem type; optional - defaulted to zfs + +function mounted +{ + ismounted $1 $2 + (( $? == 0 )) && return 0 + return 1 +} + +# Return 0 if a dataset is unmounted; 1 otherwise +# +# $1 dataset name +# $2 filesystem type; optional - defaulted to zfs + +function unmounted +{ + ismounted $1 $2 + (( $? == 1 )) && return 0 + return 1 +} + +# split line on "," +# +# $1 - line to split + +function splitline +{ + $ECHO $1 | $SED "s/,/ /g" +} + +function default_setup +{ + default_setup_noexit "$@" + + log_pass +} + +# +# Given a list of disks, setup storage pools and datasets. +# +function default_setup_noexit +{ + typeset disklist=$1 + typeset container=$2 + typeset volume=$3 + + if is_global_zone; then + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL + log_must $ZPOOL create -f $TESTPOOL $disklist + else + reexport_pool + fi + + $RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR + $MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR + + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + if [[ -n $container ]]; then + $RM -rf $TESTDIR1 || \ + log_unresolved Could not remove $TESTDIR1 + $MKDIR -p $TESTDIR1 || \ + log_unresolved Could not create $TESTDIR1 + + log_must $ZFS create $TESTPOOL/$TESTCTR + log_must $ZFS set canmount=off $TESTPOOL/$TESTCTR + log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTFS1 + log_must $ZFS set mountpoint=$TESTDIR1 \ + $TESTPOOL/$TESTCTR/$TESTFS1 + fi + + if [[ -n $volume ]]; then + if is_global_zone ; then + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + else + log_must $ZFS create $TESTPOOL/$TESTVOL + fi + + fi +} + +# +# Given a list of disks, setup a storage pool, file system and +# a container. +# +function default_container_setup +{ + typeset disklist=$1 + + default_setup "$disklist" "true" +} + +# +# Given a list of disks, setup a storage pool,file system +# and a volume. +# +function default_volume_setup +{ + typeset disklist=$1 + + default_setup "$disklist" "" "true" +} + +# +# Given a list of disks, setup a storage pool,file system, +# a container and a volume. +# +function default_container_volume_setup +{ + typeset disklist=$1 + + default_setup "$disklist" "true" "true" +} + +# +# Create a snapshot on a filesystem or volume. Defaultly create a snapshot on +# filesystem +# +# $1 Existing filesystem or volume name. Default, $TESTFS +# $2 snapshot name. Default, $TESTSNAP +# +function create_snapshot +{ + typeset fs_vol=${1:-$TESTFS} + typeset snap=${2:-$TESTSNAP} + + [[ -z $fs_vol ]] && log_fail "Filesystem or volume's name is undefined." + [[ -z $snap ]] && log_fail "Snapshot's name is undefined." + + if snapexists $fs_vol@$snap; then + log_fail "$fs_vol@$snap already exists." + fi + datasetexists $fs_vol || \ + log_fail "$fs_vol must exist." + + log_must $ZFS snapshot $fs_vol@$snap +} + +# +# Create a clone from a snapshot, default clone name is $TESTCLONE. +# +# $1 Existing snapshot, $TESTPOOL/$TESTFS@$TESTSNAP is default. +# $2 Clone name, $TESTPOOL/$TESTCLONE is default. +# +function create_clone # snapshot clone +{ + typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} + typeset clone=${2:-$TESTPOOL/$TESTCLONE} + + [[ -z $snap ]] && \ + log_fail "Snapshot name is undefined." + [[ -z $clone ]] && \ + log_fail "Clone name is undefined." + + log_must $ZFS clone $snap $clone +} + +function default_mirror_setup +{ + default_mirror_setup_noexit $1 $2 $3 + + log_pass +} + +# +# Given a pair of disks, set up a storage pool and dataset for the mirror +# @parameters: $1 the primary side of the mirror +# $2 the secondary side of the mirror +# @uses: ZPOOL ZFS TESTPOOL TESTFS +function default_mirror_setup_noexit +{ + readonly func="default_mirror_setup_noexit" + typeset primary=$1 + typeset secondary=$2 + + [[ -z $primary ]] && \ + log_fail "$func: No parameters passed" + [[ -z $secondary ]] && \ + log_fail "$func: No secondary partition passed" + [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL + log_must $ZPOOL create -f $TESTPOOL mirror $@ + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +# +# create a number of mirrors. +# We create a number($1) of 2 way mirrors using the pairs of disks named +# on the command line. These mirrors are *not* mounted +# @parameters: $1 the number of mirrors to create +# $... the devices to use to create the mirrors on +# @uses: ZPOOL ZFS TESTPOOL +function setup_mirrors +{ + typeset -i nmirrors=$1 + + shift + while (( nmirrors > 0 )); do + log_must test -n "$1" -a -n "$2" + [[ -d /$TESTPOOL$nmirrors ]] && $RM -rf /$TESTPOOL$nmirrors + log_must $ZPOOL create -f $TESTPOOL$nmirrors mirror $1 $2 + shift 2 + (( nmirrors = nmirrors - 1 )) + done +} + +# +# create a number of raidz pools. +# We create a number($1) of 2 raidz pools using the pairs of disks named +# on the command line. These pools are *not* mounted +# @parameters: $1 the number of pools to create +# $... the devices to use to create the pools on +# @uses: ZPOOL ZFS TESTPOOL +function setup_raidzs +{ + typeset -i nraidzs=$1 + + shift + while (( nraidzs > 0 )); do + log_must test -n "$1" -a -n "$2" + [[ -d /$TESTPOOL$nraidzs ]] && $RM -rf /$TESTPOOL$nraidzs + log_must $ZPOOL create -f $TESTPOOL$nraidzs raidz $1 $2 + shift 2 + (( nraidzs = nraidzs - 1 )) + done +} + +# +# Destroy the configured testpool mirrors. +# the mirrors are of the form ${TESTPOOL}{number} +# @uses: ZPOOL ZFS TESTPOOL +function destroy_mirrors +{ + default_cleanup_noexit + + log_pass +} + +# +# Given a minimum of two disks, set up a storage pool and dataset for the raid-z +# $1 the list of disks +# +function default_raidz_setup +{ + typeset disklist="$*" + set -A disks $disklist + + if [[ ${#disks[*]} -lt 2 ]]; then + log_fail "A raid-z requires a minimum of two disks." + fi + + [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL + log_must $ZPOOL create -f $TESTPOOL raidz $1 $2 $3 + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + log_pass +} + +# +# Common function used to cleanup storage pools and datasets. +# +# Invoked at the start of the test suite to ensure the system +# is in a known state, and also at the end of each set of +# sub-tests to ensure errors from one set of tests doesn't +# impact the execution of the next set. + +function default_cleanup +{ + default_cleanup_noexit + + log_pass +} + +function all_pools +{ + cmd="$ZPOOL list -H -o name | $GREP 'testpool'" + eval $cmd +} + +# +# Returns 0 if the system contains any pools that must not be modified by the +# ZFS tests. +# +function other_pools_exist +{ + typeset pool_count=`$ZPOOL list -H | $GREP -v '^testpool' | $WC -l` + [ "$pool_count" -ne 0 ] +} + +function default_cleanup_noexit +{ + typeset exclude="" + typeset pool="" + # + # Destroying the pool will also destroy any + # filesystems it contains. + # + if is_global_zone; then + # Here, we loop through the pools we're allowed to + # destroy, only destroying them if it's safe to do + # so. + for pool in $(all_pools); do + if safe_to_destroy_pool $pool; then + destroy_pool $pool + fi + done + else + typeset fs="" + for fs in $($ZFS list -H -o name \ + | $GREP "^$ZONE_POOL/$ZONE_CTR[01234]/"); do + datasetexists $fs && \ + log_must $ZFS destroy -Rf $fs + done + + # Need cleanup here to avoid garbage dir left. + for fs in $($ZFS list -H -o name \ + ); do + [[ $fs == /$ZONE_POOL ]] && continue + [[ -d $fs ]] && log_must $RM -rf $fs/* + done + + # + # Reset the $ZONE_POOL/$ZONE_CTR[01234] file systems property to + # the default value + # + for fs in $($ZFS list -H -o name \ + ); do + if [[ $fs == $ZONE_POOL/$ZONE_CTR[01234] ]]; then + log_must $ZFS set reservation=none $fs + log_must $ZFS set recordsize=128K $fs + log_must $ZFS set mountpoint=/$fs $fs + typeset enc="" + enc=$(get_prop encryption $fs) + if [[ $? -ne 0 ]] || [[ -z "$enc" ]] || \ + [[ "$enc" == "off" ]]; then + log_must $ZFS set checksum=on $fs + fi + log_must $ZFS set compression=off $fs + log_must $ZFS set atime=on $fs + log_must $ZFS set devices=off $fs + log_must $ZFS set exec=on $fs + log_must $ZFS set setuid=on $fs + log_must $ZFS set readonly=off $fs + log_must $ZFS set snapdir=hidden $fs + log_must $ZFS set aclmode=groupmask $fs + log_must $ZFS set aclinherit=secure $fs + fi + done + fi + + [[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR +} + + +# +# Common function used to cleanup storage pools, file systems +# and containers. +# +function default_container_cleanup +{ + if ! is_global_zone; then + reexport_pool + fi + + ismounted $TESTPOOL/$TESTCTR/$TESTFS1 + [[ $? -eq 0 ]] && \ + log_must $ZFS unmount $TESTPOOL/$TESTCTR/$TESTFS1 + + datasetexists $TESTPOOL/$TESTCTR/$TESTFS1 && \ + log_must $ZFS destroy -R $TESTPOOL/$TESTCTR/$TESTFS1 + + datasetexists $TESTPOOL/$TESTCTR && \ + log_must $ZFS destroy -Rf $TESTPOOL/$TESTCTR + + [[ -e $TESTDIR1 ]] && \ + log_must $RM -rf $TESTDIR1 > /dev/null 2>&1 + + default_cleanup +} + +# +# Common function used to cleanup snapshot of file system or volume. Default to +# delete the file system's snapshot +# +# $1 snapshot name +# +function destroy_snapshot +{ + typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} + + if ! snapexists $snap; then + log_fail "'$snap' does not existed." + fi + + # + # For the sake of the value which come from 'get_prop' is not equal + # to the really mountpoint when the snapshot is unmounted. So, firstly + # check and make sure this snapshot's been mounted in current system. + # + typeset mtpt="" + if ismounted $snap; then + mtpt=$(get_prop mountpoint $snap) + (( $? != 0 )) && \ + log_fail "get_prop mountpoint $snap failed." + fi + + log_must $ZFS destroy $snap + [[ $mtpt != "" && -d $mtpt ]] && \ + log_must $RM -rf $mtpt +} + +# +# Common function used to cleanup clone. +# +# $1 clone name +# +function destroy_clone +{ + typeset clone=${1:-$TESTPOOL/$TESTCLONE} + + if ! datasetexists $clone; then + log_fail "'$clone' does not existed." + fi + + # With the same reason in destroy_snapshot + typeset mtpt="" + if ismounted $clone; then + mtpt=$(get_prop mountpoint $clone) + (( $? != 0 )) && \ + log_fail "get_prop mountpoint $clone failed." + fi + + log_must $ZFS destroy $clone + [[ $mtpt != "" && -d $mtpt ]] && \ + log_must $RM -rf $mtpt +} + +# Return 0 if a snapshot exists; $? otherwise +# +# $1 - snapshot name + +function snapexists +{ + $ZFS list -H -t snapshot "$1" > /dev/null 2>&1 + return $? +} + +# +# Set a property to a certain value on a dataset. +# Sets a property of the dataset to the value as passed in. +# @param: +# $1 dataset who's property is being set +# $2 property to set +# $3 value to set property to +# @return: +# 0 if the property could be set. +# non-zero otherwise. +# @use: ZFS +# +function dataset_setprop +{ + typeset fn=dataset_setprop + + if (( $# < 3 )); then + log_note "$fn: Insufficient parameters (need 3, had $#)" + return 1 + fi + typeset output= + output=$($ZFS set $2=$3 $1 2>&1) + typeset rv=$? + if (( rv != 0 )); then + log_note "Setting property on $1 failed." + log_note "property $2=$3" + log_note "Return Code: $rv" + log_note "Output: $output" + return $rv + fi + return 0 +} + +# +# Assign suite defined dataset properties. +# This function is used to apply the suite's defined default set of +# properties to a dataset. +# @parameters: $1 dataset to use +# @uses: ZFS COMPRESSION_PROP CHECKSUM_PROP +# @returns: +# 0 if the dataset has been altered. +# 1 if no pool name was passed in. +# 2 if the dataset could not be found. +# 3 if the dataset could not have it's properties set. +# +function dataset_set_defaultproperties +{ + typeset dataset="$1" + + [[ -z $dataset ]] && return 1 + + typeset confset= + typeset -i found=0 + for confset in $($ZFS list); do + if [[ $dataset = $confset ]]; then + found=1 + break + fi + done + [[ $found -eq 0 ]] && return 2 + if [[ -n $COMPRESSION_PROP ]]; then + dataset_setprop $dataset compression $COMPRESSION_PROP || \ + return 3 + log_note "Compression set to '$COMPRESSION_PROP' on $dataset" + fi + if [[ -n $CHECKSUM_PROP && $WRAPPER != *"crypto"* ]]; then + dataset_setprop $dataset checksum $CHECKSUM_PROP || \ + return 3 + log_note "Checksum set to '$CHECKSUM_PROP' on $dataset" + fi + return 0 +} + +# +# Check a numeric assertion +# @parameter: $@ the assertion to check +# @output: big loud notice if assertion failed +# @use: log_fail +# +function assert +{ + (( $@ )) || log_fail $@ +} + +function wipe_partition_table # [ ...] +{ + while [[ -n $* ]]; do + typeset diskname=$1 + [ ! -e $diskname ] && log_fail "ERROR: $diskname doesn't exist" + if gpart list $(basename $diskname) >/dev/null 2>&1; then + wait_for 5 1 $GPART destroy -F $diskname + else + log_note "No GPT partitions detected on $diskname" + fi + log_must $GPART create -s gpt $diskname + shift + done +} + +# +# Given a slice, size and disk, this function +# formats the slice to the specified size. +# Size should be specified with units as per +# the `format` command requirements eg. 100mb 3gb +# +function set_partition # +{ + typeset -i slicenum=$1 + typeset start=$2 + typeset size=$3 + typeset disk=$4 + set -A devmap a b c d e f g h + [[ -z $slicenum || -z $size || -z $disk ]] && \ + log_fail "The slice, size or disk name is unspecified." + + size=`$ECHO $size| sed s/mb/M/` + size=`$ECHO $size| sed s/m/M/` + size=`$ECHO $size| sed s/gb/G/` + size=`$ECHO $size| sed s/g/G/` + [[ -n $start ]] && start="-b $start" + log_must $GPART add -t efi $start -s $size -i $slicenum $disk + return 0 +} + +function get_disk_size # +{ + typeset disk=$1 + diskinfo da0 | awk '{print $3}' +} + +function get_available_disk_size # +{ + typeset disk=$1 + raw_size=`get_disk_size $disk` + (( available_size = raw_size * 95 / 100 )) + echo $available_size +} + +# +# Get the end cyl of the given slice +# #TODO: fix this to be GPT-compatible if we want to use the SMI WRAPPER. This +# function is not necessary on FreeBSD +# +function get_endslice # +{ + log_fail "get_endslice has not been updated for GPT partitions" +} + +# +# Get the first LBA that is beyond the end of the given partition +function get_partition_end # +{ + typeset disk=$1 + typeset partition_index=$2 + export partition_index + $GPART show $disk | $AWK \ + '/^[ \t]/ && $3 ~ ENVIRON["partition_index"] {print $1 + $2}' +} + + +# +# Given a size,disk and total number of partitions, this function formats the +# disk partitions from 0 to the total partition number with the same specified +# size. +# +function partition_disk # +{ + typeset -i i=1 + typeset part_size=$1 + typeset disk_name=$2 + typeset total_parts=$3 + typeset cyl + + wipe_partition_table $disk_name + while (( i <= $total_parts )); do + set_partition $i "" $part_size $disk_name + (( i = i+1 )) + done +} + +function size_of_file # fname +{ + typeset fname=$1 + sz=`stat -f '%z' $fname` + [[ -z "$sz" ]] && log_fail "stat($fname) failed" + $ECHO $sz + return 0 +} + +# +# This function continues to write to a filenum number of files into dirnum +# number of directories until either $FILE_WRITE returns an error or the +# maximum number of files per directory have been written. +# +# Usage: +# fill_fs [destdir] [dirnum] [filenum] [bytes] [num_writes] [data] +# +# Return value: 0 on success +# non 0 on error +# +# Where : +# destdir: is the directory where everything is to be created under +# dirnum: the maximum number of subdirectories to use, -1 no limit +# filenum: the maximum number of files per subdirectory +# blocksz: number of bytes per block +# num_writes: number of blocks to write +# data: the data that will be written +# +# E.g. +# file_fs /testdir 20 25 1024 256 0 +# +# Note: blocksz * num_writes equals the size of the testfile +# +function fill_fs # destdir dirnum filenum blocksz num_writes data +{ + typeset destdir=${1:-$TESTDIR} + typeset -i dirnum=${2:-50} + typeset -i filenum=${3:-50} + typeset -i blocksz=${4:-8192} + typeset -i num_writes=${5:-10240} + typeset -i data=${6:-0} + + typeset -i retval=0 + typeset -i dn=0 # current dir number + typeset -i fn=0 # current file number + while (( retval == 0 )); do + (( dirnum >= 0 && dn >= dirnum )) && break + typeset curdir=$destdir/$dn + log_must $MKDIR -p $curdir + for (( fn = 0; $fn < $filenum && $retval == 0; fn++ )); do + log_cmd $FILE_WRITE -o create -f $curdir/$TESTFILE.$fn \ + -b $blocksz -c $num_writes -d $data + retval=$? + done + (( dn = dn + 1 )) + done + return $retval +} + +# +# Simple function to get the specified property. If unable to +# get the property then exits. +# +# Note property is in 'parsable' format (-p) +# +function get_prop # property dataset +{ + typeset prop_val + typeset prop=$1 + typeset dataset=$2 + + prop_val=$($ZFS get -pH -o value $prop $dataset 2>/dev/null) + if [[ $? -ne 0 ]]; then + log_note "Unable to get $prop property for dataset $dataset" + return 1 + fi + + $ECHO $prop_val + return 0 +} + +# +# Simple function to return the lesser of two values. +# +function min +{ + typeset first_arg=$1 + typeset second_arg=$2 + + if (( first_arg < second_arg )); then + $ECHO $first_arg + else + $ECHO $second_arg + fi + return 0 +} + +# +# Simple function to get the specified property of pool. If unable to +# get the property then exits. +# +function get_pool_prop # property pool +{ + typeset prop_val + typeset prop=$1 + typeset pool=$2 + + if poolexists $pool ; then + prop_val=$($ZPOOL get $prop $pool 2>/dev/null | $TAIL -1 | \ + $AWK '{print $3}') + if [[ $? -ne 0 ]]; then + log_note "Unable to get $prop property for pool " \ + "$pool" + return 1 + fi + else + log_note "Pool $pool not exists." + return 1 + fi + + $ECHO $prop_val + return 0 +} + +# Return 0 if a pool exists; $? otherwise +# +# $1 - pool name + +function poolexists +{ + typeset pool=$1 + + if [[ -z $pool ]]; then + log_note "No pool name given." + return 1 + fi + + $ZPOOL list -H "$pool" > /dev/null 2>&1 + return $? +} + +# Return 0 if all the specified datasets exist; $? otherwise +# +# $1-n dataset name +function datasetexists +{ + if (( $# == 0 )); then + log_note "No dataset name given." + return 1 + fi + + while (( $# > 0 )); do + $ZFS list -H -t filesystem,snapshot,volume $1 > /dev/null 2>&1 || \ + return $? + shift + done + + return 0 +} + +# return 0 if none of the specified datasets exists, otherwise return 1. +# +# $1-n dataset name +function datasetnonexists +{ + if (( $# == 0 )); then + log_note "No dataset name given." + return 1 + fi + + while (( $# > 0 )); do + $ZFS list -H -t filesystem,snapshot,volume $1 > /dev/null 2>&1 && \ + return 1 + shift + done + + return 0 +} + +# +# Given a mountpoint, or a dataset name, determine if it is shared. +# +# Returns 0 if shared, 1 otherwise. +# +function is_shared +{ + typeset fs=$1 + typeset mtpt + + if [[ $fs != "/"* ]] ; then + if datasetnonexists "$fs" ; then + return 1 + else + mtpt=$(get_prop mountpoint "$fs") + case $mtpt in + none|legacy|-) return 1 + ;; + *) fs=$mtpt + ;; + esac + fi + fi + + for mtpt in `$SHARE | $AWK '{print $2}'` ; do + if [[ $mtpt == $fs ]] ; then + return 0 + fi + done + + typeset stat=$($SVCS -H -o STA nfs/server:default) + if [[ $stat != "ON" ]]; then + log_note "Current nfs/server status: $stat" + fi + + return 1 +} + +# +# Given a mountpoint, determine if it is not shared. +# +# Returns 0 if not shared, 1 otherwise. +# +function not_shared +{ + typeset fs=$1 + + is_shared $fs + if (( $? == 0)); then + return 1 + fi + + return 0 +} + +# +# Helper function to unshare a mountpoint. +# +function unshare_fs #fs +{ + typeset fs=$1 + + is_shared $fs + if (( $? == 0 )); then + log_must $ZFS unshare $fs + fi + + return 0 +} + +# +# Check NFS server status and trigger it online. +# +function setup_nfs_server +{ + # Cannot share directory in non-global zone. + # + if ! is_global_zone; then + log_note "Cannot trigger NFS server by sharing in LZ." + return + fi + + typeset nfs_fmri="svc:/network/nfs/server:default" + if [[ $($SVCS -Ho STA $nfs_fmri) != "ON" ]]; then + # + # Only really sharing operation can enable NFS server + # to online permanently. + # + typeset dummy=$TMPDIR/dummy + + if [[ -d $dummy ]]; then + log_must $RM -rf $dummy + fi + + log_must $MKDIR $dummy + log_must $SHARE $dummy + + # + # Waiting for fmri's status to be the final status. + # Otherwise, in transition, an asterisk (*) is appended for + # instances, unshare will reverse status to 'DIS' again. + # + # Waiting for 1's at least. + # + log_must $SLEEP 1 + timeout=10 + while [[ timeout -ne 0 && $($SVCS -Ho STA $nfs_fmri) == *'*' ]] + do + log_must $SLEEP 1 + + (( timeout -= 1 )) + done + + log_must $UNSHARE $dummy + log_must $RM -rf $dummy + fi + + log_note "Current NFS status: '$($SVCS -Ho STA,FMRI $nfs_fmri)'" +} + +# +# To verify whether calling process is in global zone +# +# Return 0 if in global zone, 1 in non-global zone +# +function is_global_zone +{ + typeset cur_zone=$($ZONENAME 2>/dev/null) + + # Zones are not supported on FreeBSD. + if [[ $os_name == "FreeBSD" ]]; then + return 0 + fi + + if [[ $cur_zone != "global" ]]; then + return 1 + fi + return 0 +} + +# +# Verify whether test is permit to run from +# global zone, local zone, or both +# +# $1 zone limit, could be "global", "local", or "both"(no limit) +# +# Return 0 if permit, otherwise exit with log_unsupported +# +function verify_runnable # zone limit +{ + typeset limit=$1 + + [[ -z $limit ]] && return 0 + + if is_global_zone ; then + case $limit in + global|both) + break + ;; + local) log_unsupported "Test is unable to run from \ + global zone." + break + ;; + *) log_note "Warning: unknown limit $limit - use both." + ;; + esac + else + case $limit in + local|both) + break + ;; + global) log_unsupported "Test is unable to run from \ + local zone." + break + ;; + *) log_note "Warning: unknown limit $limit - use both." + ;; + esac + + reexport_pool + fi + + return 0 +} + +# Return 0 if create successfully or the pool exists; $? otherwise +# Note: In local zones, this function should return 0 silently. +# +# $1 - pool name +# $2-n - [keyword] devs_list + +function create_pool #pool devs_list +{ + typeset pool=${1%%/*} + + shift + + if [[ -z $pool ]]; then + log_note "Missing pool name." + return 1 + fi + + if poolexists $pool ; then + destroy_pool $pool + fi + + if is_global_zone ; then + [[ -d /$pool ]] && $RM -rf /$pool + log_must $ZPOOL create -f $pool $@ + fi + + return 0 +} + +# Return 0 if destroy successfully or the pool exists; $? otherwise +# Note: In local zones, this function should return 0 silently. +# +# $1 - pool name +# Destroy pool with the given parameters. + +function destroy_pool #pool +{ + typeset pool=${1%%/*} + typeset mtpt + + if [[ -z $pool ]]; then + log_note "No pool name given." + return 1 + fi + + if is_global_zone ; then + if poolexists "$pool" ; then + mtpt=$(get_prop mountpoint "$pool") + log_must $ZPOOL destroy -f $pool + + [[ -d $mtpt ]] && \ + log_must $RM -rf $mtpt + else + log_note "Pool $pool does not exist, skipping destroy." + return 1 + fi + fi + + return 0 +} + +# +# Create file vdevs. +# By default this generates sparse vdevs 10GB in size, for performance. +# +function create_vdevs # vdevs +{ + typeset vdsize=10G + + [ -n "$VDEV_SIZE" ] && vdsize=$VDEV_SIZE + rm -f $@ || return 1 + truncate -s $vdsize $@ +} + +# +# Firstly, create a pool with 5 datasets. Then, create a single zone and +# export the 5 datasets to it. In addition, we also add a ZFS filesystem +# and a zvol device to the zone. +# +# $1 zone name +# $2 zone root directory prefix +# $3 zone ip +# +function zfs_zones_setup #zone_name zone_root zone_ip +{ + typeset zone_name=${1:-$(hostname)-z} + typeset zone_root=${2:-"/zone_root"} + typeset zone_ip=${3:-"10.1.1.10"} + typeset prefix_ctr=$ZONE_CTR + typeset pool_name=$ZONE_POOL + typeset -i cntctr=5 + typeset -i i=0 + + # Create pool and 5 container within it + # + [[ -d /$pool_name ]] && $RM -rf /$pool_name + log_must $ZPOOL create -f $pool_name $DISKS + while (( i < cntctr )); do + log_must $ZFS create $pool_name/$prefix_ctr$i + (( i += 1 )) + done + + # create a zvol + log_must $ZFS create -V 1g $pool_name/zone_zvol + + # + # If current system support slog, add slog device for pool + # + typeset sdevs="$TMPDIR/sdev1 $TMPDIR/sdev2" + log_must create_vdevs $sdevs + log_must $ZPOOL add $pool_name log mirror $sdevs + + # this isn't supported just yet. + # Create a filesystem. In order to add this to + # the zone, it must have it's mountpoint set to 'legacy' + # log_must $ZFS create $pool_name/zfs_filesystem + # log_must $ZFS set mountpoint=legacy $pool_name/zfs_filesystem + + [[ -d $zone_root ]] && \ + log_must $RM -rf $zone_root/$zone_name + [[ ! -d $zone_root ]] && \ + log_must $MKDIR -p -m 0700 $zone_root/$zone_name + + # Create zone configure file and configure the zone + # + typeset zone_conf=$TMPDIR/zone_conf.${TESTCASE_ID} + $ECHO "create" > $zone_conf + $ECHO "set zonepath=$zone_root/$zone_name" >> $zone_conf + $ECHO "set autoboot=true" >> $zone_conf + i=0 + while (( i < cntctr )); do + $ECHO "add dataset" >> $zone_conf + $ECHO "set name=$pool_name/$prefix_ctr$i" >> \ + $zone_conf + $ECHO "end" >> $zone_conf + (( i += 1 )) + done + + # add our zvol to the zone + $ECHO "add device" >> $zone_conf + $ECHO "set match=/dev/zvol/dsk/$pool_name/zone_zvol" >> $zone_conf + $ECHO "end" >> $zone_conf + + # add a corresponding zvol rdsk to the zone + $ECHO "add device" >> $zone_conf + $ECHO "set match=/dev/zvol/rdsk/$pool_name/zone_zvol" >> $zone_conf + $ECHO "end" >> $zone_conf + + # once it's supported, we'll add our filesystem to the zone + # $ECHO "add fs" >> $zone_conf + # $ECHO "set type=zfs" >> $zone_conf + # $ECHO "set special=$pool_name/zfs_filesystem" >> $zone_conf + # $ECHO "set dir=/export/zfs_filesystem" >> $zone_conf + # $ECHO "end" >> $zone_conf + + $ECHO "verify" >> $zone_conf + $ECHO "commit" >> $zone_conf + log_must $ZONECFG -z $zone_name -f $zone_conf + log_must $RM -f $zone_conf + + # Install the zone + $ZONEADM -z $zone_name install + if (( $? == 0 )); then + log_note "SUCCESS: $ZONEADM -z $zone_name install" + else + log_fail "FAIL: $ZONEADM -z $zone_name install" + fi + + # Install sysidcfg file + # + typeset sysidcfg=$zone_root/$zone_name/root/etc/sysidcfg + $ECHO "system_locale=C" > $sysidcfg + $ECHO "terminal=dtterm" >> $sysidcfg + $ECHO "network_interface=primary {" >> $sysidcfg + $ECHO "hostname=$zone_name" >> $sysidcfg + $ECHO "}" >> $sysidcfg + $ECHO "name_service=NONE" >> $sysidcfg + $ECHO "root_password=mo791xfZ/SFiw" >> $sysidcfg + $ECHO "security_policy=NONE" >> $sysidcfg + $ECHO "timezone=US/Eastern" >> $sysidcfg + + # Boot this zone + log_must $ZONEADM -z $zone_name boot +} + +# +# Reexport TESTPOOL & TESTPOOL(1-4) +# +function reexport_pool +{ + typeset -i cntctr=5 + typeset -i i=0 + + while (( i < cntctr )); do + if (( i == 0 )); then + TESTPOOL=$ZONE_POOL/$ZONE_CTR$i + if ! ismounted $TESTPOOL; then + log_must $ZFS mount $TESTPOOL + fi + else + eval TESTPOOL$i=$ZONE_POOL/$ZONE_CTR$i + if eval ! ismounted \$TESTPOOL$i; then + log_must eval $ZFS mount \$TESTPOOL$i + fi + fi + (( i += 1 )) + done +} + +# +# Wait for something to return true, checked by the caller. +# +function wait_for_checked # timeout dt [args...] +{ + typeset timeout=$1 + typeset dt=$2 + shift; shift + typeset -i start=$(date '+%s') + typeset -i endtime + + log_note "Waiting $timeout seconds (checked every $dt seconds) for: $*" + ((endtime = start + timeout)) + while :; do + $* + [ $? -eq 0 ] && return + curtime=$(date '+%s') + [ $curtime -gt $endtime ] && return 1 + sleep $dt + done + return 0 +} + +# +# Wait for something to return true. +# +function wait_for # timeout dt [args...] +{ + typeset timeout=$1 + typeset dt=$2 + shift; shift + + wait_for_checked $timeout $dt $* || \ + log_fail "ERROR: Timed out waiting for: $*" +} + +# +# Verify a given disk is online or offline +# +# Return 0 is pool/disk matches expected state, 1 otherwise +# stateexpr is a regex like ONLINE or REMOVED|UNAVAIL +# +function check_state # pool disk stateexpr +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + disk=${disk#/dev/rdsk/} + disk=${disk#/dev/} + typeset stateexpr=$3 + + $ZPOOL status -v $pool | grep "$disk" \ + | egrep -i "$stateexpr" > /dev/null 2>&1 + + return $? +} + +# +# Wait for a given disk to leave a state +# +function wait_for_state_exit +{ + typeset pool=$1 + typeset disk=$2 + typeset state=$3 + + while check_state "$pool" "$disk" "$state"; do + $SLEEP 1 + done +} + +# +# Wait for a given disk to enter a state +# +function wait_for_state_enter +{ + typeset -i timeout=$1 + typeset pool=$2 + typeset disk=$3 + typeset state=$4 + + log_note "Waiting up to $timeout seconds for $disk to become $state ..." + for ((; $timeout > 0; timeout=$timeout-1)); do + check_state $pool "$disk" "$state" + [ $? -eq 0 ] && return + $SLEEP 1 + done + log_must $ZPOOL status $pool + log_fail "ERROR: Disk $disk not marked as $state in $pool" +} + +# +# Get the mountpoint of snapshot +# as its mountpoint +# +function snapshot_mountpoint +{ + typeset dataset=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} + + if [[ $dataset != *@* ]]; then + log_fail "Error name of snapshot '$dataset'." + fi + + typeset fs=${dataset%@*} + typeset snap=${dataset#*@} + + if [[ -z $fs || -z $snap ]]; then + log_fail "Error name of snapshot '$dataset'." + fi + + $ECHO $(get_prop mountpoint $fs)/$(get_snapdir_name)/$snap +} + +function pool_maps_intact # pool +{ + typeset pool="$1" + + if ! $ZDB -bcv $pool; then + return 1 + fi + return 0 +} + +function filesys_has_zil # filesystem +{ + typeset filesys="$1" + + if ! $ZDB -ivv $filesys | $GREP "ZIL header"; then + return 1 + fi + return 0 +} + +# +# Given a pool and file system, this function will verify the file system +# using the zdb internal tool. Note that the pool is exported and imported +# to ensure it has consistent state. +# +function verify_filesys # pool filesystem dir +{ + typeset pool="$1" + typeset filesys="$2" + typeset zdbout="$TMPDIR/zdbout.${TESTCASE_ID}" + + shift + shift + typeset dirs=$@ + typeset search_path="" + + log_note "Calling $ZDB to verify filesystem '$filesys'" + log_must $ZPOOL export $pool + + if [[ -n $dirs ]] ; then + for dir in $dirs ; do + search_path="$search_path -d $dir" + done + fi + + log_must $ZPOOL import $search_path $pool + + $ZDB -cudi $filesys > $zdbout 2>&1 + if [[ $? != 0 ]]; then + log_note "Output: $ZDB -cudi $filesys" + $CAT $zdbout + log_fail "$ZDB detected errors with: '$filesys'" + fi + + log_must $RM -rf $zdbout +} + +# +# Given a pool, and this function list all disks in the pool +# +function get_disklist # pool +{ + typeset disklist="" + + disklist=$($ZPOOL iostat -v $1 | $NAWK '(NR >4 ) {print $1}' | \ + $GREP -v "\-\-\-\-\-" | \ + $EGREP -v -e "^(mirror|raidz1|raidz2|spare|log|cache)$" ) + + $ECHO $disklist +} + +# +# Destroy all existing metadevices and state database +# +function destroy_metas +{ + typeset metad + + for metad in $($METASTAT -p | $AWK '{print $1}'); do + log_must $METACLEAR -rf $metad + done + + for metad in $($METADB | $CUT -f6 | $GREP dev | $UNIQ); do + log_must $METADB -fd $metad + done +} + +# /** +# This function kills a given list of processes after a time period. We use +# this in the stress tests instead of STF_TIMEOUT so that we can have processes +# run for a fixed amount of time, yet still pass. Tests that hit STF_TIMEOUT +# would be listed as FAIL, which we don't want : we're happy with stress tests +# running for a certain amount of time, then finishing. +# +# @param $1 the time in seconds after which we should terminate these processes +# @param $2..$n the processes we wish to terminate. +# */ +function stress_timeout +{ + typeset -i TIMEOUT=$1 + shift + typeset cpids="$@" + + log_note "Waiting for child processes($cpids). " \ + "It could last dozens of minutes, please be patient ..." + log_must $SLEEP $TIMEOUT + + log_note "Killing child processes after ${TIMEOUT} stress timeout." + typeset pid + for pid in $cpids; do + $PS -p $pid > /dev/null 2>&1 + if (( $? == 0 )); then + log_must $KILL -USR1 $pid + fi + done +} + +# +# Check whether current OS support a specified feature or not +# +# return 0 if current OS version is in unsupported list, 1 otherwise +# +# $1 unsupported target OS versions +# +function check_version # +{ + typeset unsupported_vers="$@" + typeset ver + typeset cur_ver=`$UNAME -r` + + for ver in $unsupported_vers; do + [[ "$cur_ver" == "$ver" ]] && return 0 + done + + return 1 +} + +# +# Verify a given hotspare disk is inuse or avail +# +# Return 0 is pool/disk matches expected state, 1 otherwise +# +function check_hotspare_state # pool disk state{inuse,avail} +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + disk=${disk#/dev/rdsk/} + disk=${disk#/dev/} + typeset state=$3 + + cur_state=$(get_device_state $pool $disk "spares") + + if [[ $state != ${cur_state} ]]; then + return 1 + fi + return 0 +} + +# +# Verify a given slog disk is inuse or avail +# +# Return 0 is pool/disk matches expected state, 1 otherwise +# +function check_slog_state # pool disk state{online,offline,unavail} +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + disk=${disk#/dev/rdsk/} + disk=${disk#/dev/} + typeset state=$3 + + cur_state=$(get_device_state $pool $disk "logs") + + if [[ $state != ${cur_state} ]]; then + return 1 + fi + return 0 +} + +# +# Verify a given vdev disk is inuse or avail +# +# Return 0 is pool/disk matches expected state, 1 otherwise +# +function check_vdev_state # pool disk state{online,offline,unavail} +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + disk=${disk#/dev/rdsk/} + disk=${disk#/dev/} + typeset state=$3 + + if [[ $WRAPPER == *"smi"* ]]; then + $ECHO $disk | $EGREP "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1 + if (( $? == 0 )); then + disk=${disk}s2 + fi + fi + + cur_state=$(get_device_state $pool $disk) + + if [[ $state != ${cur_state} ]]; then + return 1 + fi + return 0 +} + +# +# Check the output of 'zpool status -v ', +# and to see if the content of contain the specified. +# +# Return 0 is contain, 1 otherwise +# +function check_pool_status # pool token keyword +{ + typeset pool=$1 + typeset token=$2 + typeset keyword=$3 + + $ZPOOL status -v "$pool" 2>/dev/null | \ + $NAWK -v token="$token:" '($1==token) {print $0}' | \ + $GREP -i "$keyword" >/dev/null 2>&1 + + return $? +} + +function vdev_pool_error_count +{ + typeset errs=$1 + if [ -z "$2" ]; then + test $errs -gt 0; ret=$? + else + test $errs -eq $2; ret=$? + fi + log_debug "vdev_pool_error_count: errs='$errs' \$2='$2' ret='$ret'" + return $ret +} + +# +# Generate a pool status error file suitable for pool_errors_from_file. +# If the pool is healthy, returns 0. Otherwise, the caller must handle the +# returned temporarily file appropriately. +# +function pool_error_file # +{ + typeset pool="$1" + + typeset tmpfile=$TMPDIR/pool_status.${TESTCASE_ID} + $ZPOOL status -x $pool > ${tmpfile} + echo $tmpfile +} + +# +# Evaluates counting the number of errors. If vdev specified, only +# that vdev's errors are counted. Returns the total number. will be +# deleted on exit. +# +function pool_errors_from_file # [vdev] +{ + typeset file=$1 + shift + typeset checkvdev="$2" + + typeset line + typeset -i fetchbegin=1 + typeset -i errnum=0 + typeset -i c_read=0 + typeset -i c_write=0 + typeset -i c_cksum=0 + + cat ${file} | $EGREP -v "pool:" | while read line; do + if (( $fetchbegin != 0 )); then + $ECHO $line | $GREP "NAME" >/dev/null 2>&1 + (( $? == 0 )) && (( fetchbegin = 0 )) + continue + fi + + if [[ -n $checkvdev ]]; then + $ECHO $line | $GREP $checkvdev >/dev/null 2>&1 + (( $? != 0 )) && continue + c_read=`$ECHO $line | $AWK '{print $3}'` + c_write=`$ECHO $line | $AWK '{print $4}'` + c_cksum=`$ECHO $line | $AWK '{print $5}'` + if [ $c_read != 0 ] || [ $c_write != 0 ] || \ + [ $c_cksum != 0 ] + then + (( errnum = errnum + 1 )) + fi + break + fi + + c_read=`$ECHO $line | $AWK '{print $3}'` + c_write=`$ECHO $line | $AWK '{print $4}'` + c_cksum=`$ECHO $line | $AWK '{print $5}'` + if [ $c_read != 0 ] || [ $c_write != 0 ] || \ + [ $c_cksum != 0 ] + then + (( errnum = errnum + 1 )) + fi + done + + rm -f $file + echo $errnum +} + +# +# Returns whether the vdev has the given number of errors. +# If the number is unspecified, any non-zero number returns true. +# +function vdev_has_errors # pool vdev [errors] +{ + typeset pool=$1 + typeset vdev=$2 + typeset tmpfile=$(pool_error_file $pool) + log_note "Original pool status:" + cat $tmpfile + + typeset -i errs=$(pool_errors_from_file $tmpfile $vdev) + vdev_pool_error_count $errs $3 +} + +# +# Returns whether the pool has the given number of errors. +# If the number is unspecified, any non-zero number returns true. +# +function pool_has_errors # pool [errors] +{ + typeset pool=$1 + typeset tmpfile=$(pool_error_file $pool) + log_note "Original pool status:" + cat $tmpfile + + typeset -i errs=$(pool_errors_from_file $tmpfile) + vdev_pool_error_count $errs $2 +} + +# +# Returns whether clearing $pool at $vdev (if given) succeeds. +# +function pool_clear_succeeds +{ + typeset pool="$1" + typeset vdev=$2 + + $ZPOOL clear $pool $vdev + ! pool_has_errors $pool +} + +# +# Return whether the pool is healthy +# +function is_pool_healthy # pool +{ + typeset pool=$1 + + typeset healthy_output="pool '$pool' is healthy" + typeset real_output=$($ZPOOL status -x $pool) + + if [[ "$real_output" == "$healthy_output" ]]; then + return 0 + else + typeset -i ret + $ZPOOL status -x $pool | $GREP "state:" | \ + $GREP "FAULTED" >/dev/null 2>&1 + ret=$? + (( $ret == 0 )) && return 1 + typeset l_scan + typeset errnum + l_scan=$($ZPOOL status -x $pool | $GREP "scan:") + l_scan=${l_scan##*"with"} + errnum=$($ECHO $l_scan | $AWK '{print $1}') + if [ "$errnum" != "0" ]; then + return 1 + else + return 0 + fi + fi +} + +# +# These 5 following functions are instance of check_pool_status() +# is_pool_resilvering - to check if the pool is resilver in progress +# is_pool_resilvered - to check if the pool is resilver completed +# is_pool_scrubbing - to check if the pool is scrub in progress +# is_pool_scrubbed - to check if the pool is scrub completed +# is_pool_scrub_stopped - to check if the pool is scrub stopped +# +function is_pool_resilvering #pool +{ + check_pool_status "$1" "scan" "resilver in progress" + return $? +} + +function is_pool_resilvered #pool +{ + check_pool_status "$1" "scan" "resilvered" + return $? +} + +function resilver_happened # pool +{ + typeset pool=$1 + is_pool_resilvering "$pool" || is_pool_resilvered "$pool" +} + +function is_pool_scrubbing #pool +{ + check_pool_status "$1" "scan" "scrub in progress" + return $? +} + +function is_pool_scrubbed #pool +{ + check_pool_status "$1" "scan" "scrub repaired" + return $? +} + +function is_pool_scrub_stopped #pool +{ + check_pool_status "$1" "scan" "scrub canceled" + return $? +} + +function is_pool_state # pool state +{ + check_pool_status "$1" "state" "$2" + return $? +} + +# +# Erase the partition tables and destroy any zfs labels +# +function cleanup_devices #vdevs +{ + for device in $@; do + # Labelclear must happen first, otherwise it may interfere + # with the teardown/setup of GPT labels. + $ZPOOL labelclear -f $device + # Only wipe partition tables for arguments that are disks, + # as opposed to slices (which are valid arguments here). + if camcontrol inquiry $device >/dev/null 2>&1; then + wipe_partition_table $device + fi + done + return 0 +} + +# +# Verify the rsh connectivity to each remote host in RHOSTS. +# +# Return 0 if remote host is accessible; otherwise 1. +# $1 remote host name +# $2 username +# +function verify_rsh_connect #rhost, username +{ + typeset rhost=$1 + typeset username=$2 + typeset rsh_cmd="$RSH -n" + typeset cur_user= + + $GETENT hosts $rhost >/dev/null 2>&1 + if (( $? != 0 )); then + log_note "$rhost cannot be found from" \ + "administrative database." + return 1 + fi + + $PING $rhost 3 >/dev/null 2>&1 + if (( $? != 0 )); then + log_note "$rhost is not reachable." + return 1 + fi + + if (( ${#username} != 0 )); then + rsh_cmd="$rsh_cmd -l $username" + cur_user="given user \"$username\"" + else + cur_user="current user \"`$LOGNAME`\"" + fi + + if ! $rsh_cmd $rhost $TRUE; then + log_note "$RSH to $rhost is not accessible" \ + "with $cur_user." + return 1 + fi + + return 0 +} + +# +# Verify the remote host connection via rsh after rebooting +# $1 remote host +# +function verify_remote +{ + rhost=$1 + + # + # The following loop waits for the remote system rebooting. + # Each iteration will wait for 150 seconds. there are + # total 5 iterations, so the total timeout value will + # be 12.5 minutes for the system rebooting. This number + # is an approxiate number. + # + typeset -i count=0 + while ! verify_rsh_connect $rhost; do + sleep 150 + (( count = count + 1 )) + if (( count > 5 )); then + return 1 + fi + done + return 0 +} + +# +# Replacement function for /usr/bin/rsh. This function will include +# the /usr/bin/rsh and meanwhile return the execution status of the +# last command. +# +# $1 usrname passing down to -l option of /usr/bin/rsh +# $2 remote machine hostname +# $3... command string +# + +function rsh_status +{ + typeset ruser=$1 + typeset rhost=$2 + typeset -i ret=0 + typeset cmd_str="" + typeset rsh_str="" + + shift; shift + cmd_str="$@" + + err_file=$TMPDIR/${rhost}.${TESTCASE_ID}.err + if (( ${#ruser} == 0 )); then + rsh_str="$RSH -n" + else + rsh_str="$RSH -n -l $ruser" + fi + + $rsh_str $rhost /usr/local/bin/ksh93 -c "'$cmd_str; \ + print -u 2 \"status=\$?\"'" \ + >/dev/null 2>$err_file + ret=$? + if (( $ret != 0 )); then + $CAT $err_file + $RM -f $std_file $err_file + log_fail "$RSH itself failed with exit code $ret..." + fi + + ret=$($GREP -v 'print -u 2' $err_file | $GREP 'status=' | \ + $CUT -d= -f2) + (( $ret != 0 )) && $CAT $err_file >&2 + + $RM -f $err_file >/dev/null 2>&1 + return $ret +} + +# +# Get the SUNWstc-fs-zfs package installation path in a remote host +# $1 remote host name +# +function get_remote_pkgpath +{ + typeset rhost=$1 + typeset pkgpath="" + + pkgpath=$($RSH -n $rhost "$PKGINFO -l SUNWstc-fs-zfs | $GREP BASEDIR: |\ + $CUT -d: -f2") + + $ECHO $pkgpath +} + +#/** +# A function to find and locate free disks on a system or from given +# disks as the parameter. Since the conversion to ATF, this function is +# superfluous; it is assumed that the user will supply an accurate list of +# disks to use. So we just return the arguments. +# +# $@ given disks to find which are free +# +# @return a string containing the list of available disks +#*/ +function find_disks +{ + (( first=0 )) + for disk in $@; do + [[ $first == 1 ]] && echo -n " " + (( first=1 )) + case $disk in + /dev/*) echo -n "$disk" ;; + *) echo -n "/dev/$disk" ;; + esac + done +} + +# A function to set convenience variables for disks. +function set_disks +{ + set -A disk_array $(find_disks $DISKS) + [[ -z "$DISK_ARRAY_LIMIT" ]] && typeset -i DISK_ARRAY_LIMIT=5 + + export DISK="" + typeset -i i=0 + while (( i < ${#disk_array[*]} && i <= $DISK_ARRAY_LIMIT )); do + export DISK${i}="${disk_array[$i]}" + DISKSARRAY="$DISKSARRAY ${disk_array[$i]}" + (( i = i + 1 )) + done + export DISK_ARRAY_NUM=$i + export DISKSARRAY + export disk=$DISK0 +} + +# +# Add specified user to specified group +# +# $1 group name +# $2 user name +# +function add_user # +{ + typeset gname=$1 + typeset uname=$2 + + if (( ${#gname} == 0 || ${#uname} == 0 )); then + log_fail "group name or user name are not defined." + fi + + # Check to see if the user exists. + $ID $uname > /dev/null 2>&1 && return 0 + + # Assign 1000 as the base uid + typeset -i uid=1000 + while true; do + typeset -i ret + $USERADD -u $uid -g $gname -d /var/tmp/$uname -m $uname + ret=$? + case $ret in + 0) return 0 ;; + # The uid is not unique + 65) ((uid += 1)) ;; + *) return 1 ;; + esac + if [[ $uid == 65000 ]]; then + log_fail "No user id available under 65000 for $uname" + fi + done + + return 0 +} + +# +# Delete the specified user. +# +# $1 login name +# +function del_user # +{ + typeset user=$1 + + if (( ${#user} == 0 )); then + log_fail "login name is necessary." + fi + + if $ID $user > /dev/null 2>&1; then + log_must $USERDEL $user + fi + + return 0 +} + +# +# Select valid gid and create specified group. +# +# $1 group name +# +function add_group # +{ + typeset group=$1 + + if (( ${#group} == 0 )); then + log_fail "group name is necessary." + fi + + # See if the group already exists. + $GROUPSHOW $group >/dev/null 2>&1 + [[ $? == 0 ]] && return 0 + + # Assign 100 as the base gid + typeset -i gid=100 + while true; do + $GROUPADD -g $gid $group > /dev/null 2>&1 + typeset -i ret=$? + case $ret in + 0) return 0 ;; + # The gid is not unique + 65) ((gid += 1)) ;; + *) return 1 ;; + esac + if [[ $gid == 65000 ]]; then + log_fail "No user id available under 65000 for $group" + fi + done +} + +# +# Delete the specified group. +# +# $1 group name +# +function del_group # +{ + typeset grp=$1 + if (( ${#grp} == 0 )); then + log_fail "group name is necessary." + fi + + $GROUPDEL -n $grp > /dev/null 2>&1 + typeset -i ret=$? + case $ret in + # Group does not exist, or was deleted successfully. + 0|6|65) return 0 ;; + # Name already exists as a group name + 9) log_must $GROUPDEL $grp ;; + *) return 1 ;; + esac + + return 0 +} + +# +# This function will return true if it's safe to destroy the pool passed +# as argument 1. It checks for pools based on zvols and files, and also +# files contained in a pool that may have a different mountpoint. +# +function safe_to_destroy_pool { # $1 the pool name + + typeset pool="" + typeset DONT_DESTROY="" + + # We check that by deleting the $1 pool, we're not + # going to pull the rug out from other pools. Do this + # by looking at all other pools, ensuring that they + # aren't built from files or zvols contained in this pool. + + for pool in $($ZPOOL list -H -o name) + do + ALTMOUNTPOOL="" + + # this is a list of the top-level directories in each of the files + # that make up the path to the files the pool is based on + FILEPOOL=$($ZPOOL status -v $pool | $GREP /$1/ | \ + $AWK '{print $1}') + + # this is a list of the zvols that make up the pool + ZVOLPOOL=$($ZPOOL status -v $pool | $GREP "/dev/zvol/dsk/$1$" | \ + $AWK '{print $1}') + + # also want to determine if it's a file-based pool using an + # alternate mountpoint... + POOL_FILE_DIRS=$($ZPOOL status -v $pool | \ + $GREP / | $AWK '{print $1}' | \ + $AWK -F/ '{print $2}' | $GREP -v "dev") + + for pooldir in $POOL_FILE_DIRS + do + OUTPUT=$($ZFS list -H -r -o mountpoint $1 | \ + $GREP "${pooldir}$" | $AWK '{print $1}') + + ALTMOUNTPOOL="${ALTMOUNTPOOL}${OUTPUT}" + done + + + if [ ! -z "$ZVOLPOOL" ] + then + DONT_DESTROY="true" + log_note "Pool $pool is built from $ZVOLPOOL on $1" + fi + + if [ ! -z "$FILEPOOL" ] + then + DONT_DESTROY="true" + log_note "Pool $pool is built from $FILEPOOL on $1" + fi + + if [ ! -z "$ALTMOUNTPOOL" ] + then + DONT_DESTROY="true" + log_note "Pool $pool is built from $ALTMOUNTPOOL on $1" + fi + done + + if [ -z "${DONT_DESTROY}" ] + then + return 0 + else + log_note "Warning: it is not safe to destroy $1!" + return 1 + fi +} + +# +# Get IP address of hostname +# $1 hostname +# +function getipbyhost +{ + typeset ip + ip=`$ARP $1 2>/dev/null | $AWK -F\) '{print $1}' \ + | $AWK -F\( '{print $2}'` + $ECHO $ip +} + +# +# Setup iSCSI initiator to target +# $1 target hostname +# +function iscsi_isetup +{ + # check svc:/network/iscsi_initiator:default state, try to enable it + # if the state is not ON + typeset ISCSII_FMRI="svc:/network/iscsi_initiator:default" + if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then + log_must $SVCADM enable $ISCSII_FMRI + + typeset -i retry=20 + while [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) && \ + ( $retry -ne 0 ) ]] + do + (( retry = retry - 1 )) + $SLEEP 1 + done + + if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then + log_fail "$ISCSII_FMRI service can not be enabled!" + fi + fi + + log_must $ISCSIADM add discovery-address $(getipbyhost $1) + log_must $ISCSIADM modify discovery --sendtargets enable + log_must $DEVFSADM -i iscsi +} + +# +# Check whether iscsi parameter is set as remote +# +# return 0 if iscsi is set as remote, otherwise 1 +# +function check_iscsi_remote +{ + if [[ $iscsi == "remote" ]] ; then + return 0 + else + return 1 + fi +} + +# +# Check if a volume is a valide iscsi target +# $1 volume name +# return 0 if suceeds, otherwise, return 1 +# +function is_iscsi_target +{ + typeset dataset=$1 + typeset target targets + + [[ -z $dataset ]] && return 1 + + targets=$($ISCSITADM list target | $GREP "Target:" | $AWK '{print $2}') + [[ -z $targets ]] && return 1 + + for target in $targets; do + [[ $dataset == $target ]] && return 0 + done + + return 1 +} + +# +# Get the iSCSI name of a target +# $1 target name +# +function iscsi_name +{ + typeset target=$1 + typeset name + + [[ -z $target ]] && log_fail "No parameter." + + if ! is_iscsi_target $target ; then + log_fail "Not a target." + fi + + name=$($ISCSITADM list target $target | $GREP "iSCSI Name:" \ + | $AWK '{print $2}') + + return $name +} + +# +# check svc:/system/iscsitgt:default state, try to enable it if the state +# is not ON +# +function iscsitgt_setup +{ + log_must $RM -f $ISCSITGTFILE + if [[ "ON" == $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then + log_note "iscsitgt is already enabled" + return + fi + + log_must $SVCADM enable -t $ISCSITGT_FMRI + + typeset -i retry=20 + while [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) && \ + ( $retry -ne 0 ) ]] + do + $SLEEP 1 + (( retry = retry - 1 )) + done + + if [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then + log_fail "$ISCSITGT_FMRI service can not be enabled!" + fi + + log_must $TOUCH $ISCSITGTFILE +} + +# +# set DISABLED state of svc:/system/iscsitgt:default +# which is the most suiteable state if $ISCSITGTFILE exists +# +function iscsitgt_cleanup +{ + if [[ -e $ISCSITGTFILE ]]; then + log_must $SVCADM disable $ISCSITGT_FMRI + log_must $RM -f $ISCSITGTFILE + fi +} + +# +# Close iSCSI initiator to target +# $1 target hostname +# +function iscsi_iclose +{ + log_must $ISCSIADM modify discovery --sendtargets disable + log_must $ISCSIADM remove discovery-address $(getipbyhost $1) + $DEVFSADM -Cv +} + +# +# Get the available ZFS compression options +# $1 option type zfs_set|zfs_compress +# +function get_compress_opts +{ + typeset COMPRESS_OPTS + typeset GZIP_OPTS="gzip gzip-1 gzip-2 gzip-3 gzip-4 gzip-5 \ + gzip-6 gzip-7 gzip-8 gzip-9" + + if [[ $1 == "zfs_compress" ]] ; then + COMPRESS_OPTS="on lzjb" + elif [[ $1 == "zfs_set" ]] ; then + COMPRESS_OPTS="on off lzjb" + fi + typeset valid_opts="$COMPRESS_OPTS" + $ZFS get 2>&1 | $GREP gzip >/dev/null 2>&1 + if [[ $? -eq 0 ]]; then + valid_opts="$valid_opts $GZIP_OPTS" + fi + $ECHO "$valid_opts" +} + +# +# Check the subcommand/option is supported +# +function check_opt_support #command, option +{ + typeset command=$1 + typeset option=$2 + + if [[ -z $command ]]; then + return 0 + elif [[ -z $option ]]; then + eval "$ZFS 2>&1 | $GREP '$command' > /dev/null 2>&1" + else + eval "$ZFS $command 2>&1 | $GREP -- '$option' | \ + $GREP -v -- 'User-defined' > /dev/null 2>&1" + fi + return $? +} + +# +# Check the zpool subcommand/option is supported +# +function check_zpool_opt_support #command, option +{ + typeset command=$1 + typeset option=$2 + + if [[ -z $command ]]; then + return 0 + elif [[ -z $option ]]; then + eval "$ZPOOL 2>&1 | $GREP '$command' > /dev/null 2>&1" + else + eval "$ZPOOL $command 2>&1 | $GREP -- '$option' > /dev/null 2>&1" + fi + return $? +} + +# +# Verify zfs operation with -p option work as expected +# $1 operation, value could be create, clone or rename +# $2 dataset type, value could be fs or vol +# $3 dataset name +# $4 new dataset name +# +function verify_opt_p_ops +{ + typeset ops=$1 + typeset datatype=$2 + typeset dataset=$3 + typeset newdataset=$4 + + if [[ $datatype != "fs" && $datatype != "vol" ]]; then + log_fail "$datatype is not supported." + fi + + # check parameters accordingly + case $ops in + create) + newdataset=$dataset + dataset="" + if [[ $datatype == "vol" ]]; then + ops="create -V $VOLSIZE" + fi + ;; + clone) + if [[ -z $newdataset ]]; then + log_fail "newdataset should not be empty" \ + "when ops is $ops." + fi + log_must datasetexists $dataset + log_must snapexists $dataset + ;; + rename) + if [[ -z $newdataset ]]; then + log_fail "newdataset should not be empty" \ + "when ops is $ops." + fi + log_must datasetexists $dataset + log_mustnot snapexists $dataset + ;; + *) + log_fail "$ops is not supported." + ;; + esac + + # make sure the upper level filesystem does not exist + if datasetexists ${newdataset%/*} ; then + log_must $ZFS destroy -rRf ${newdataset%/*} + fi + + # without -p option, operation will fail + log_mustnot $ZFS $ops $dataset $newdataset + log_mustnot datasetexists $newdataset ${newdataset%/*} + + # with -p option, operation should succeed + log_must $ZFS $ops -p $dataset $newdataset + if ! datasetexists $newdataset ; then + log_fail "-p option does not work for $ops" + fi + + # when $ops is create or clone, redo the operation still return zero + if [[ $ops != "rename" ]]; then + log_must $ZFS $ops -p $dataset $newdataset + fi + + return 0 +} + +function get_disk_guid +{ + typeset diskname=$1 + lastcwd=$(pwd) + cd /dev + guid=$($ZDB -l ${diskname} | ${AWK} '/^ guid:/ {print $2}' | head -1) + cd $lastcwd + echo $guid +} + +# +# Get cachefile for a pool. +# Prints the cache file, if there is one. +# Returns 0 for a default zpool.cache, 1 for an explicit one, and 2 for none. +# +function cachefile_for_pool +{ + typeset pool=$1 + + cachefile=$(get_pool_prop cachefile $pool) + [[ $? != 0 ]] && return 1 + + case "$cachefile" in + none) ret=2 ;; + "-") + ret=2 + for dir in /boot/zfs /etc/zfs; do + if [[ -f "${dir}/zpool.cache" ]]; then + cachefile="${dir}/zpool.cache" + ret=0 + break + fi + done + ;; + *) ret=1; + esac + [[ $ret -eq 0 || $ret -eq 1 ]] && print "$cachefile" + return $ret +} + +# +# Assert that the pool is in the appropriate cachefile. +# +function assert_pool_in_cachefile +{ + typeset pool=$1 + + cachefile=$(cachefile_for_pool $pool) + [ $? -ne 0 ] && log_fail "ERROR: Cachefile not created for '$pool'?" + log_must test -e "${cachefile}" + log_must zdb -U ${cachefile} -C ${pool} +} + +# +# Get the zdb options given the cachefile state of the pool. +# +function zdb_cachefile_opts +{ + typeset pool=$1 + typeset vdevdir=$2 + typeset opts + + if poolexists "$pool"; then + cachefile=$(cachefile_for_pool $pool) + typeset -i ret=$? + case $ret in + 0) opts="-C" ;; + 1) opts="-U $cachefile -C" ;; + 2) opts="-eC" ;; + *) log_fail "Unknown return '$ret'" ;; + esac + else + opts="-eC" + [[ -n "$vdevdir" ]] && opts="$opts -p $vdevdir" + fi + echo "$opts" +} + +# +# Get configuration of pool +# $1 pool name +# $2 config name +# +function get_config +{ + typeset pool=$1 + typeset config=$2 + typeset vdevdir=$3 + typeset alt_root + typeset zdb_opts + + zdb_opts=$(zdb_cachefile_opts $pool $vdevdir) + value=$($ZDB $zdb_opts $pool | $GREP "$config:" | $AWK -F: '{print $2}') + if [[ -n $value ]] ; then + value=${value#'} + value=${value%'} + else + return 1 + fi + echo $value + + return 0 +} + +# +# Privated function. Random select one of items from arguments. +# +# $1 count +# $2-n string +# +function _random_get +{ + typeset cnt=$1 + shift + + typeset str="$@" + typeset -i ind + ((ind = RANDOM % cnt + 1)) + + typeset ret=$($ECHO "$str" | $CUT -f $ind -d ' ') + $ECHO $ret +} + +# +# Random select one of item from arguments which include NONE string +# +function random_get_with_non +{ + typeset -i cnt=$# + ((cnt =+ 1)) + + _random_get "$cnt" "$@" +} + +# +# Random select one of item from arguments which doesn't include NONE string +# +function random_get +{ + _random_get "$#" "$@" +} + +# +# The function will generate a dataset name with specific length +# $1, the length of the name +# $2, the base string to construct the name +# +function gen_dataset_name +{ + typeset -i len=$1 + typeset basestr="$2" + typeset -i baselen=${#basestr} + typeset -i iter=0 + typeset l_name="" + + if (( len % baselen == 0 )); then + (( iter = len / baselen )) + else + (( iter = len / baselen + 1 )) + fi + while (( iter > 0 )); do + l_name="${l_name}$basestr" + + (( iter -= 1 )) + done + + $ECHO $l_name +} + +# +# Ensure that a given path has been synced, not just ZIL committed. +# +# XXX The implementation currently requires calling 'zpool history'. On +# FreeBSD, the sync(8) command (via $SYNC) calls zfs_sync() which just +# does a zil_commit(), as opposed to a txg_wait_synced(). For things that +# require writing to their final destination (e.g. for intentional +# corruption purposes), zil_commit() is not good enough. +# +function force_sync_path # path +{ + typeset path="$1" + + zfspath=$($DF $path 2>/dev/null | tail -1 | cut -d" " -f1 | cut -d/ -f1) + [ -z "$zfspath" ] && return false + log_note "Force syncing ${zfspath} for ${path} ..." + $ZPOOL history $zfspath >/dev/null 2>&1 +} + +# +# Get cksum tuple of dataset +# $1 dataset name +# +# zdb output is like below +# " Dataset pool/fs [ZPL], ID 978, cr_txg 2277, 19.0K, 5 objects, +# rootbp [L0 DMU objset] 400L/200P DVA[0]=<0:1880c00:200> +# DVA[1]=<0:341880c00:200> fletcher4 lzjb LE contiguous birth=2292 fill=5 +# cksum=989930ccf:4014fe00c83:da5e388e58b4:1f7332052252ac " +# +function datasetcksum +{ + typeset cksum + $SYNC + cksum=$($ZDB -vvv $1 | $GREP "^Dataset $1 \[" | $GREP "cksum" \ + | $AWK -F= '{print $6}') + $ECHO $cksum +} + +# +# Get cksum of file +# #1 file path +# +function checksum +{ + typeset cksum + cksum=$($CKSUM $1 | $AWK '{print $1}') + $ECHO $cksum +} + +# +# Get the given disk/slice state from the specific field of the pool +# +function get_device_state #pool disk field("", "spares","logs") +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + disk=${disk#/dev/rdsk/} + disk=${disk#/dev/} + typeset field=${3:-$pool} + + state=$($ZPOOL status -v "$pool" 2>/dev/null | \ + $NAWK -v device=$disk -v pool=$pool -v field=$field \ + 'BEGIN {startconfig=0; startfield=0; } + /config:/ {startconfig=1} + (startconfig==1)&&($1==field) {startfield=1; next;} + (startfield==1)&&($1==device) {print $2; exit;} + (startfield==1)&&(NF>=3)&&($(NF-1)=="was")&&($NF==device) {print $2; exit;} + (startfield==1)&&($1==field || $1 ~ "^spares$" || $1 ~ "^logs$") {startfield=0}') + print $state +} + + +# +# print the given directory filesystem type +# +# $1 directory name +# +function get_fstype +{ + typeset dir=$1 + + if [[ -z $dir ]]; then + log_fail "Usage: get_fstype " + fi + + $DF -T $dir | $AWK '{print $2}' +} + +# +# Given a disk, label it to VTOC regardless what label was on the disk +# $1 disk +# +function labelvtoc +{ + typeset disk=$1 + if [[ -z $disk ]]; then + log_fail "The disk name is unspecified." + fi + typeset label_file=$TMPDIR/labelvtoc.${TESTCASE_ID} + typeset arch=$($UNAME -p) + + if [[ $arch == "i386" ]]; then + $ECHO "label" > $label_file + $ECHO "0" >> $label_file + $ECHO "" >> $label_file + $ECHO "q" >> $label_file + $ECHO "q" >> $label_file + + $FDISK -B $disk >/dev/null 2>&1 + # wait a while for fdisk finishes + $SLEEP 60 + elif [[ $arch == "sparc" ]]; then + $ECHO "label" > $label_file + $ECHO "0" >> $label_file + $ECHO "" >> $label_file + $ECHO "" >> $label_file + $ECHO "" >> $label_file + $ECHO "q" >> $label_file + else + log_fail "unknown arch type" + fi + + $FORMAT -e -s -d $disk -f $label_file + typeset -i ret_val=$? + $RM -f $label_file + # + # wait the format to finish + # + $SLEEP 60 + if (( ret_val != 0 )); then + log_fail "unable to label $disk as VTOC." + fi + + return 0 +} + +# +# Detect if the given filesystem property is supported in this release +# +# 0 Yes, it is supported +# !0 No, it is not supported +# +function fs_prop_exist +{ + typeset prop=$1 + + if [[ -z $prop ]]; then + log_fail "Usage: fs_prop_exist " + + return 1 + fi + + # + # If the property is shortened column name, + # convert it to the standard name + # + case $prop in + avail) prop=available ;; + refer) prop=referenced ;; + volblock) prop=volblocksize ;; + compress) prop=compression ;; + rdonly) prop=readonly ;; + recsize) prop=recordsize ;; + reserv) prop=reservation ;; + refreserv) prop=refreservation ;; + esac + + # + # The zfs get output looks like the following + # + + # + # The following properties are supported: + # + # PROPERTY EDIT INHERIT VALUES + # + # available NO NO + # compressratio NO NO <1.00x or higher if compressed> + # creation NO NO + # ... ... + # zoned YES YES on | off + # + # Sizes are specified in bytes with standard units such as K, M, G, etc. + # + + # + # Start to extract property from the first blank line after 'PROPERTY' + # and stop at the next blank line + # + $ZFS get 2>&1 | \ + $AWK '/PROPERTY/ {start=1; next} + /Sizes/ {start=0} + start==1 {print $1}' | \ + $GREP -w "$prop" > /dev/null 2>&1 + + return $? +} + +# +# Detect if the given pool property is supported in this release +# +# 0 Yes, it is supported +# !0 No, it is not supported +# +function pool_prop_exist +{ + typeset prop=$1 + if [[ -z $prop ]]; then + log_fail "Usage: pool_prop_exist " + + return 1 + fi + # + # If the property is shortened column name, + # convert it to the standard name + # + case $prop in + avail) prop=available ;; + cap) prop=capacity ;; + replace) prop=autoreplace ;; + esac + + # + # The zpool get output looks like the following + # + + # usage: + # get <"all" | property[,...]> ... + # + # the following properties are supported: + # + # PROPERTY EDIT VALUES + # + # available NO + # capacity NO + # guid NO + # health NO + # size NO + # used NO + # altroot YES + # autoreplace YES on | off + # bootfs YES + # cachefile YES | none + # delegation YES on | off + # failmode YES wait | continue | panic + # version YES + + $ZPOOL get 2>&1 | \ + $AWK '/PROPERTY/ {start=1; next} + start==1 {print $1}' | \ + $GREP -w "$prop" > /dev/null 2>&1 + + return $? +} + +# +# check if the system was installed as zfsroot or not +# return: 0 ture, otherwise false +# +function is_zfsroot +{ + $DF -T / | $GREP -q zfs +} + +# +# get the root filesystem name if it's zfsroot system. +# +# return: root filesystem name +function get_rootfs +{ + typeset rootfs="" + rootfs=$($MOUNT | $AWK '$3 == "\/" && $4~/zfs/ {print $1}') + if [[ -z "$rootfs" ]]; then + log_fail "Can not get rootfs" + fi + $ZFS list $rootfs > /dev/null 2>&1 + if (( $? == 0 )); then + $ECHO $rootfs + else + log_fail "This is not a zfsroot system." + fi +} + +# +# get the rootfs's pool name +# return: +# rootpool name +# +function get_rootpool +{ + typeset rootfs="" + typeset rootpool="" + rootfs=$(get_rootfs) + rootpool=`$ECHO $rootfs | awk -F\/ '{print $1}'` + echo $rootpool +} + +# +# Get the sub string from specified source string +# +# $1 source string +# $2 start position. Count from 1 +# $3 offset +# +function get_substr #src_str pos offset +{ + typeset pos offset + + $ECHO $1 | \ + $NAWK -v pos=$2 -v offset=$3 '{print substr($0, pos, offset)}' +} + +# +# Get the directory path of given device +# +function get_device_dir #device +{ + typeset device=$1 + + $ECHO "/dev" +} + +# +# Get the package name +# +function get_package_name +{ + typeset dirpath=${1:-$STC_NAME} + + print "SUNWstc-${dirpath}" | /usr/bin/sed -e "s/\//-/g" +} + +# +# Get the word numbers from a string separated by white space +# +function get_word_count +{ + $ECHO $1 | $WC -w +} + +# +# To verify if the require numbers of disks is given +# +function verify_disk_count +{ + typeset -i min=${2:-1} + + typeset -i count=$(get_word_count "$1") + + if (( count < min )); then + atf_skip "A minimum of $min disks is required to run." \ + " You specified $count disk(s)" + fi +} + +# +# Verify that vfs.zfs.vol.recursive is set, so pools can be created using zvols +# as backing stores. +# +function verify_zvol_recursive +{ + if [ "`sysctl -n vfs.zfs.vol.recursive`" -ne 1 ]; then + atf_skip "Recursive ZVOLs not enabled" + fi +} + +# +# bsdmap disk/slice number to a device path +# +function bsddevmap +{ + typeset arg=$1 + echo $arg | egrep "*s[0-9]$" > /dev/null 2>&1 + if [ $? -eq 0 ] + then + n=`echo $arg| wc -c` + set -A map a b c d e f g h i j + s=`echo $arg | cut -c $((n-1))` + arg=${arg%s[0-9]}${map[$s]} + fi + echo $arg +} + +# +# Get the name of the snapshots directory. Traditionally .zfs/snapshots +# +function get_snapdir_name +{ + echo ".zfs/snapshot" +} + +# +# Unmount all ZFS filesystems except for those that are in the KEEP variable +# +function unmount_all_safe +{ + echo $(all_pools) | \ + $XARGS -n 1 $ZFS list -H -o name -t all -r | \ + $XARGS -n 1 $ZFS unmount +} + +# +# Return the highest pool version that this OS can create +# +function get_zpool_version +{ + # We assume output from zpool upgrade -v of the form: + # + # This system is currently running ZFS version 2. + # . + # . + typeset ZPOOL_VERSION=$($ZPOOL upgrade -v | $HEAD -1 | \ + $AWK '{print $NF}' | $SED -e 's/\.//g') + # Starting with version 5000, the output format changes to: + # This system supports ZFS pool feature flags. + # . + # . + if [[ $ZPOOL_VERSION = "flags" ]]; then + ZPOOL_VERSION=5000 + fi + echo $ZPOOL_VERSION +} + +# Ensures that zfsd is running, starting it if necessary. Every test that +# interacts with zfsd must call this at startup. This is intended primarily +# to eliminate interference from outside the test suite. +function ensure_zfsd_running +{ + if ! service zfsd status > /dev/null 2>&1; then + service zfsd start || service zfsd onestart + service zfsd status > /dev/null 2>&1 || + log_unsupported "Test requires zfsd" + fi +} + +# Temporarily stops ZFSD, because it can interfere with some tests. If this +# function is used, then restart_zfsd _must_ be called in the cleanup routine. +function stop_zfsd +{ + $RM -f $TMPDIR/.zfsd_enabled_during_stf_zfs_tests + if [[ -n "$ZFSD" && -x "$ZFSD" ]]; then + if /etc/rc.d/zfsd status > /dev/null; then + log_note "Stopping zfsd" + $TOUCH $TMPDIR/.zfsd_enabled_during_stf_zfs_tests + /etc/rc.d/zfsd stop || /etc/rc.d/zfsd onestop + fi + fi +} + +# Restarts zfsd after it has been stopped by stop_zfsd. Intelligently restarts +# only iff zfsd was running at the time stop_zfsd was called. +function restart_zfsd +{ + if [[ -f $TMPDIR/.zfsd_enabled_during_stf_zfs_tests ]]; then + log_note "Restarting zfsd" + /etc/rc.d/zfsd start || /etc/rc.d/zfsd onestart + fi + $RM -f $TMPDIR/.zfsd_enabled_during_stf_zfs_tests +} + +# +# Using the given , obtain the value of the property for +# the given identified by numeric id. +# +function get_tvd_prop # vdev tvd propname +{ + typeset vdev=$1 + typeset -i tvd=$2 + typeset propname=$3 + + $ZDB -l $vdev | $AWK -v tvd=$tvd -v prop="${propname}:" ' + BEGIN { start = 0; } + /^ id:/ && ($2==tvd) { start = 1; next; } + (start==0) { next; } + /^ [a-z]+/ && ($1==prop) { print $2; exit; } + /^ children/ { exit; } + ' +} + +# +# Convert a DVA into a physical block address. Prints number of blocks. +# This takes the usual printed form, in which offsets are left shifted so +# they represent bytes rather than the native sector count. +# +function dva_to_block_addr # dva +{ + typeset dva=$1 + + typeset offcol=$(echo $dva | cut -f2 -d:) + typeset -i offset="0x${offcol}" + # First add 4MB to skip the boot blocks and first two vdev labels, + # then convert to 512 byte blocks (for use with dd). Note that this + # differs from simply adding 8192 blocks, since the input offset is + # given in bytes and has the actual ashift baked in. + (( offset += 4*1024*1024 )) + (( offset >>= 9 )) + echo "$offset" +} + +# +# Convert a RAIDZ DVA into a physical block address. This has the same +# output as dva_to_block_addr (number of blocks from beginning of device), but +# is more complicated due to RAIDZ. ashift is normally always 9, but RAIDZ +# uses the actual tvd ashift instead. Furthermore, the number of vdevs changes +# the actual block for each device. +# +function raidz_dva_to_block_addr # dva ncols ashift +{ + typeset dva=$1 + typeset -i ncols=$2 + typeset -i ashift=$3 + + typeset -i offset=0x$(echo $dva | cut -f2 -d:) + (( offset >>= ashift )) + + typeset -i ioff=$(( (offset + ncols - 1) / ncols )) + + # Now add the front 4MB and return. + (( ioff += ( 4194304 >> $ashift ) )) + echo "$ioff" +} + +# +# Return the vdevs for the given toplevel vdev number. +# Child vdevs will only be included if they are ONLINE. Output format: +# +# [: ...] +# +# Valid toplevel vdev types are mirror, raidz[1-3], leaf (which can be a +# disk or a file). Note that 'nchildren' can be larger than the number of +# returned children; it represents the number of children regardless of how +# many are actually online. +# +function vdevs_for_tvd # pool tvd +{ + typeset pool=$1 + typeset -i tvd=$2 + + $ZPOOL status $pool | $AWK -v want_tvd=$tvd ' + BEGIN { + start = 0; tvd = -1; lvd = -1; + type = "UNKNOWN"; disks = ""; disk = ""; + nchildren = 0; + } + /NAME.*STATE/ { start = 1; next; } + (start==0) { next; } + + (tvd > want_tvd) { exit; } + END { print type " " nchildren " " disks; } + + length(disk) > 0 { + if (length(disks) > 0) { disks = disks " "; } + if (substr(disk, 0, 1) == "/") { + disks = disks disk; + } else { + disks = disks "/dev/" disk; + } + disk = ""; + } + + /^\t(spares|logs)/ { tvd = want_tvd + 1; next; } + /^\t (mirror|raidz[1-3])-[0-9]+/ { + tvd += 1; + (tvd == want_tvd) && type = substr($1, 0, 6); + next; + } + /^\t [\/A-Za-z]+/ { + tvd += 1; + if (tvd == want_tvd) { + (( nchildren += 1 )) + type = "leaf"; + ($2 == "ONLINE") && disk = $1; + } + next; + } + + (tvd < want_tvd) { next; } + + /^\t spare-[0-9]+/ { next; } + /^\t [\/A-Za-z]+/ { + (( nchildren += 1 )) + ($2 == "ONLINE") && disk = $1; + next; + } + + /^\t [\/A-Za-z]+/ { + (( nchildren += 1 )) + ($2 == "ONLINE") && disk = $1; + next; + } + ' +} + +# +# Get a vdev path, ashift & offset for a given pool/dataset and DVA. +# If desired, can also select the toplevel vdev child number. +# +function dva_to_vdev_ashift_off # pool/dataset dva [leaf_vdev_num] +{ + typeset poollike=$1 + typeset dva=$2 + typeset -i leaf_vdev_num=$3 + + # vdevs are normally 0-indexed while arguments are 1-indexed. + (( leaf_vdev_num += 1 )) + + # Strip any child datasets or snapshots. + pool=$(echo $poollike | sed -e 's,[/@].*,,g') + tvd=$(echo $dva | cut -d: -f1) + + set -- $(vdevs_for_tvd $pool $tvd) + log_debug "vdevs_for_tvd: $* " + tvd_type=$1; shift + nchildren=$1; shift + + lvd=$(eval echo \$$leaf_vdev_num) + log_debug "type='$tvd_type' children='$nchildren' lvd='$lvd' dva='$dva'" + case $tvd_type in + raidz*) + ashift=$(get_tvd_prop $lvd $tvd ashift) + log_debug "raidz: ashift='${ashift}'" + off=$(raidz_dva_to_block_addr $dva $nchildren $ashift) + ;; + *) + ashift=9 + off=$(dva_to_block_addr $dva) + ;; + esac + echo "${lvd}:${ashift}:${off}" +} + +# +# Get the DVA for the specified dataset's given filepath. +# +function file_dva # dataset filepath [level] [offset] [dva_num] +{ + typeset dataset=$1 + typeset filepath=$2 + typeset -i level=$3 + typeset -i offset=$4 + typeset -i dva_num=$5 + + typeset -li blksz=0 + typeset -li blknum=0 + typeset -li startoff + typeset -li inode + + eval `$STAT -s "$filepath"` + inode="$st_ino" + + # The inner match is for 'DVA[0]=<0:1b412600:200>', in which the + # text surrounding the actual DVA is a fixed size with 8 characters + # before it and 1 after. + $ZDB -P -vvvvv $dataset $inode | \ + $AWK -v level=${level} -v dva_num=${dva_num} ' + BEGIN { stage = 0; } + (stage == 0) && ($1=="Object") { stage = 1; next; } + + (stage == 1) { + print $3 " " $4; + stage = 2; next; + } + + (stage == 2) && /^Indirect blocks/ { stage=3; next; } + (stage < 3) { next; } + + match($2, /L[0-9]/) { + if (substr($2, RSTART+1, RLENGTH-1) != level) { next; } + } + match($3, /DVA\[.*>/) { + dva = substr($3, RSTART+8, RLENGTH-9); + if (substr($3, RSTART+4, 1) == dva_num) { + print $1 " " dva; + } + } + ' | \ + while read line; do + log_debug "params='$blksz/$blknum/$startoff' line='$line'" + if (( blksz == 0 )); then + typeset -i iblksz=$(echo $line | cut -d " " -f1) + typeset -i dblksz=$(echo $line | cut -d " " -f2) + + # Calculate the actual desired block starting offset. + if (( level > 0 )); then + typeset -i nbps_per_level + typeset -i indsz + typeset -i i=0 + + (( nbps_per_level = iblksz / 128 )) + (( blksz = dblksz )) + for (( i = 0; $i < $level; i++ )); do + (( blksz *= nbps_per_level )) + done + else + blksz=$dblksz + fi + + (( blknum = offset / blksz )) + (( startoff = blknum * blksz )) + continue + fi + + typeset lineoffstr=$(echo $line | cut -d " " -f1) + typeset -i lineoff=$(printf "%d" "0x${lineoffstr}") + typeset dva="$(echo $line | cut -d " " -f2)" + log_debug "str='$lineoffstr' lineoff='$lineoff' dva='$dva'" + if [[ -n "$dva" ]] && (( lineoff == startoff )); then + echo $line | cut -d " " -f2 + return 0 + fi + done + return 1 +} + +# +# Corrupt the given dataset's filepath file. This will obtain the first +# level 0 block's DVA and scribble random bits on it. +# +function corrupt_file # dataset filepath [leaf_vdev_num] +{ + typeset dataset=$1 + typeset filepath=$2 + typeset -i leaf_vdev_num="$3" + + dva=$(file_dva $dataset $filepath) + [ $? -ne 0 ] && log_fail "ERROR: Can't find file $filepath on $dataset" + + vdoff=$(dva_to_vdev_ashift_off $dataset $dva $leaf_vdev_num) + vdev=$(echo $vdoff | cut -d: -f1) + ashift=$(echo $vdoff | cut -d: -f2) + off=$(echo $vdoff | cut -d: -f3) + blocksize=$(( 1 << $ashift )) + + log_note "Corrupting ${dataset}'s $filepath on $vdev at DVA $dva with ashift $ashift" + log_must $DD if=/dev/urandom bs=$blocksize of=$vdev seek=$off count=1 conv=notrunc +} + +# +# Given a number of files, this function will iterate through +# the loop creating the specified number of files, whose names +# will start with . +# +# The argument is special: it can be "ITER", in which case +# the -d argument will be the value of the current iteration. It +# can be 0, in which case it will always be 0. Otherwise, it will +# always be the given value. +# +# If is specified, a snapshot will be taken using the +# argument as the snapshot basename. +# +function populate_dir # basename num_files write_count blocksz data snapbase +{ + typeset basename=$1 + typeset -i num_files=$2 + typeset -i write_count=$3 + typeset -i blocksz=$4 + typeset -i i + typeset data=$5 + typeset snapbase="$6" + + log_note "populate_dir: data='$data'" + for (( i = 0; i < num_files; i++ )); do + case "$data" in + 0) d=0 ;; + ITER) d=$i ;; + *) d=$data ;; + esac + + log_must $FILE_WRITE -o create -c $write_count \ + -f ${basename}.$i -b $blocksz -d $d + + [ -n "$snapbase" ] && log_must $ZFS snapshot ${snapbase}.${i} + done +} + +# Reap all children registered in $child_pids. +function reap_children +{ + [ -z "$child_pids" ] && return + for wait_pid in $child_pids; do + log_must $KILL $wait_pid + done + child_pids="" +} + +# Busy a path. Expects to be reaped via reap_children. Tries to run as +# long and slowly as possible. [num] is taken as a hint; if such a file +# already exists a different one will be chosen. +function busy_path # [num] +{ + typeset busypath=$1 + typeset -i num=$2 + + while :; do + busyfile="$busypath/busyfile.${num}" + [ ! -f "$busyfile" ] && break + done + + cmd="$DD if=/dev/urandom of=$busyfile bs=512" + ( cd $busypath && $cmd ) & + typeset pid=$! + $SLEEP 1 + log_must $PS -p $pid + child_pids="$child_pids $pid" +} diff --git a/tests/sys/cddl/zfs/include/libtest_test.sh b/tests/sys/cddl/zfs/include/libtest_test.sh new file mode 100755 index 00000000000..8e958aed1a2 --- /dev/null +++ b/tests/sys/cddl/zfs/include/libtest_test.sh @@ -0,0 +1,44 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2016 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + +atf_test_case raidz_dva_to_block_addr +raidz_dva_to_block_addr_head() +{ + atf_set "descr" "Unit tests for raidz_dva_to_block_addr" +} +raidz_dva_to_block_addr_body() +{ + . $(atf_get_srcdir)/default.cfg + + # These test cases were determined by hand on an actual filesystem + atf_check_equal 3211 `raidz_dva_to_block_addr 0:3f40000:4000 3 13` +} + +atf_init_test_cases() +{ + atf_add_test_case raidz_dva_to_block_addr +} diff --git a/tests/sys/cddl/zfs/include/logapi.kshlib b/tests/sys/cddl/zfs/include/logapi.kshlib new file mode 100644 index 00000000000..7246ceba8a2 --- /dev/null +++ b/tests/sys/cddl/zfs/include/logapi.kshlib @@ -0,0 +1,419 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)logapi.kshlib 1.2 07/03/14 SMI" +# + +# +# This is a ksh function library. It is intended to be sourced into +# other ksh scripts and not executed directly. +# + +. ${STF_SUITE}/include/stf.shlib + +# +# Send a debug message to stderr, if $STF_DEBUG set. +# +function log_debug +{ + [ -z "$STF_DEBUG" ] && return + echo "$*" >&2 +} + +# Output an assertion +# +# $@ - assertion text + +function log_assert +{ + _printline ASSERTION: "$@" +} + +# Output a comment +# +# $@ - comment text + +function log_note +{ + _printline NOTE: "$@" +} + +# Execute a positive test and exit $STF_FAIL is test fails +# +# $@ - command to execute + +function log_must +{ + log_pos "$@" + (( $? != 0 )) && log_fail +} + +# Execute a command that must exit $1 +# +# $@ - command to execute +function log_mustbe +{ + typeset exitcode_wanted=$1 + shift + + log_cmd "$@" + (( $? != $exitcode_wanted )) && log_fail +} + +# Execute a negative test and exit $STF_FAIL if test passes +# +# $@ - command to execute + +function log_mustnot +{ + log_neg "$@" + (( $? != 0 )) && log_fail +} + +# Execute a command that should only be logged if it fails. +# +# $@ - command to execute +function log_onfail +{ + eval $@ + typeset status=$? + [ $status -eq 0 ] && return + _printerror "$@" "unexpectedly exited $status" +} + +# Execute and print command with status where success equals non-zero result +# or output includes expected keyword +# +# $2-$@ - command to execute +# +# Summary: execute $@. Return 1 if any of the following hold: +# 1) The command exited 0, 127, 138, or 139 +# 2) The command's stderr included "internal error" or +# "assertion failed" +# +# return 0 if command fails, or the output contains the keyword expected, +# return 1 otherwise + +function log_neg +{ + typeset out="" + typeset logfile="$TMPDIR/log.$$" + typeset ret=1 + + while [[ -e $logfile ]]; do + logfile="$logfile.$$" + done + + "$@" 2>$logfile + typeset status=$? + out="/bin/cat $logfile" + + # unexpected status + if (( $status == 0 )); then + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status" + # missing binary + elif (( $status == 127 )); then + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status (File not found)" + # bus error - core dump + elif (( $status == 138 )); then + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status (Bus Error)" + # segmentation violation - core dump + elif (( $status == 139 )); then + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status (SEGV)" + else + $out | /usr/bin/egrep -i "internal error|assertion failed" \ + > /dev/null 2>&1 + # internal error or assertion failed + if (( $? == 0 )); then + print -u2 $($out) + _printerror "$@" "internal error or assertion failure" \ + " exited $status" + else + ret=0 + fi + + if (( $ret == 0 )); then + [[ -n $LOGAPI_DEBUG ]] && print $($out) + _printsuccess "$@" "exited $status" + fi + fi + _recursive_output $logfile "false" + return $ret +} + +# Execute and print command; unconditionally return its exit code. +# Useful for code that needs to do more specialized exit status filtering. +function log_cmd +{ + typeset logfile="$TMPDIR/log.$$" + + while [[ -e $logfile ]]; do + logfile="$logfile.$$" + done + + "$@" 2>$logfile + typeset status=$? + _printline "EXECUTED (exited $status): $@" + _recursive_output $logfile "false" + return $status +} + +# Execute and print command with status where success equals zero result +# +# $@ command to execute +# +# Summary: run $@. return 1 if its exit status was nonzero or if it printed +# "internal error" or "assertion failed" to stderr. +# print stderr on failure or if LOGAPI_DEBUG is set. +# +# return command exit status + +function log_pos +{ + typeset out="" + typeset logfile="$TMPDIR/log.$$" + + while [[ -e $logfile ]]; do + logfile="$logfile.$$" + done + + "$@" 2>$logfile + typeset status=$? + out="/bin/cat $logfile" + + if (( $status != 0 )) ; then + print -u2 $($out) + _printerror "$@" "exited $status" + else + $out | /usr/bin/egrep -i "internal error|assertion failed" \ + > /dev/null 2>&1 + # internal error or assertion failed + if [[ $? -eq 0 ]]; then + print -u2 $($out) + _printerror "$@" "internal error or assertion failure" \ + " exited $status" + status=1 + else + [[ -n $LOGAPI_DEBUG ]] && print $($out) + _printsuccess "$@" + fi + fi + _recursive_output $logfile "false" + return $status +} + +# Set an exit handler +# +# $@ - function(s) to perform on exit + +function log_onexit +{ + _CLEANUP="$@" +} + +# +# Exit functions +# + +# Perform cleanup and exit $STF_PASS +# +# $@ - message text + +function log_pass +{ + _endlog $STF_PASS "$@" +} + +# Perform cleanup and exit $STF_FAIL +# +# $@ - message text + +function log_fail +{ + _endlog $STF_FAIL "$@" +} + +# Perform cleanup and exit $STF_UNRESOLVED +# +# $@ - message text + +function log_unresolved +{ + _endlog $STF_UNRESOLVED "$@" +} + +# Perform cleanup and exit $STF_NOTINUSE +# +# $@ - message text + +function log_notinuse +{ + _endlog $STF_NOTINUSE "$@" +} + +# Perform cleanup and exit $STF_UNSUPPORTED +# +# $@ - message text + +function log_unsupported +{ + _endlog $STF_UNSUPPORTED "$@" +} + +# Perform cleanup and exit $STF_UNTESTED +# +# $@ - message text + +function log_untested +{ + _endlog $STF_UNTESTED "$@" +} + +# Perform cleanup and exit $STF_UNINITIATED +# +# $@ - message text + +function log_uninitiated +{ + _endlog $STF_UNINITIATED "$@" +} + +# Perform cleanup and exit $STF_NORESULT +# +# $@ - message text + +function log_noresult +{ + _endlog $STF_NORESULT "$@" +} + +# Perform cleanup and exit $STF_WARNING +# +# $@ - message text + +function log_warning +{ + _endlog $STF_WARNING "$@" +} + +# Perform cleanup and exit $STF_TIMED_OUT +# +# $@ - message text + +function log_timed_out +{ + _endlog $STF_TIMED_OUT "$@" +} + +# Perform cleanup and exit $STF_OTHER +# +# $@ - message text + +function log_other +{ + _endlog $STF_OTHER "$@" +} + +# +# Internal functions +# + +# Perform cleanup and exit +# +# Summary: Runs any cleanup routine registered with log_onexit. Prints a +# message and exits $1. Note: the _recursive_output does +# nothing, because the rest of this api guarantees that the +# logfile will not exist. +# $1 - stf exit code +# $2-$n - message text + +function _endlog +{ + typeset logfile="$TMPDIR/log.$$" + _recursive_output $logfile + + export STF_EXITCODE=$1 + shift + (( ${#@} > 0 )) && _printline "$@" + if [[ -n $_CLEANUP ]] ; then + typeset cleanup=$_CLEANUP + log_onexit "" + log_note "Performing local cleanup via log_onexit ($cleanup)" + $cleanup + fi + exit $STF_EXITCODE +} + +# Output a formatted line +# +# $@ - message text + +function _printline +{ + print `/bin/date +%H:%M:%S` "$@" +} + +# Output an error message +# +# $@ - message text + +function _printerror +{ + _printline ERROR: "$@" +} + +# Output a success message +# +# $@ - message text + +function _printsuccess +{ + _printline SUCCESS: "$@" +} + +# Output logfiles recursively +# +# $1 - start file +# $2 - indicate whether output the start file itself, default as yes. + +function _recursive_output #logfile +{ + typeset logfile=$1 + + while [[ -e $logfile ]]; do + if [[ -z $2 || $logfile != $1 ]]; then + /bin/cat $logfile + fi + /bin/rm -f $logfile + logfile="$logfile.$$" + done +} diff --git a/tests/sys/cddl/zfs/include/stf.shlib b/tests/sys/cddl/zfs/include/stf.shlib new file mode 100644 index 00000000000..b5e10d600bd --- /dev/null +++ b/tests/sys/cddl/zfs/include/stf.shlib @@ -0,0 +1,55 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)stf.shlib 1.2 07/04/12 SMI" +# + +STF_PASS=0 +STF_FAIL=1 +STF_UNRESOLVED=2 +STF_NOTINUSE=3 +STF_UNSUPPORTED=4 +STF_UNTESTED=5 +STF_UNINITIATED=6 +STF_NORESULT=7 +STF_WARNING=8 +STF_TIMED_OUT=9 +STF_OTHER=10 + +# do this to use the names: eval echo \$STF_RESULT_NAME_${result} +STF_RESULT_NAME_0="PASS" +STF_RESULT_NAME_1="FAIL" +STF_RESULT_NAME_2="UNRESOLVED" +STF_RESULT_NAME_3="NOTINUSE" +STF_RESULT_NAME_4="UNSUPPORTED" +STF_RESULT_NAME_5="UNTESTED" +STF_RESULT_NAME_6="UNINITIATED" +STF_RESULT_NAME_7="NORESULT" +STF_RESULT_NAME_8="WARNING" +STF_RESULT_NAME_9="TIMED_OUT" +STF_RESULT_NAME_10="OTHER" diff --git a/tests/sys/cddl/zfs/include/testenv.ksh b/tests/sys/cddl/zfs/include/testenv.ksh new file mode 100644 index 00000000000..bae66aedac3 --- /dev/null +++ b/tests/sys/cddl/zfs/include/testenv.ksh @@ -0,0 +1,21 @@ +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/include/commands.cfg + +# $FreeBSD$ + +# Environment-dependent constants. +for d in `geom disk list | awk '/Name:/ {print $3}'`; do + # Clear the GPT label first to avoid spurious create failures. + gpart destroy -F $d >/dev/null 2>&1 + if gpart create -s gpt $d >/dev/null 2>&1 ; then + gpart destroy $d >/dev/null 2>&1 || continue + DISKS=("${DISKS[@]}" "/dev/$d") #"$DISKS $d" + fi + # Don't bother testing any more if we have enough already. + # Currently we use at most 5 disks plus 1 for temporary disks. + [ ${#DISKS[@]} -eq 6 ] && break +done +export KEEP="$(zpool list -H -o name)" + +# Pull in constants. +. ${STF_SUITE}/include/constants.cfg diff --git a/tests/sys/cddl/zfs/include/testenv.kshlib b/tests/sys/cddl/zfs/include/testenv.kshlib new file mode 100644 index 00000000000..17153389203 --- /dev/null +++ b/tests/sys/cddl/zfs/include/testenv.kshlib @@ -0,0 +1,22 @@ +# vim: filetype=sh +# $FreeBSD$ + +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/include/commands.cfg + +# Environment-dependent constants. +for d in `geom disk list | awk '/Name:/ {print $3}'`; do + # Clear the GPT label first to avoid spurious create failures. + gpart destroy -F $d >/dev/null 2>&1 + if gpart create -s gpt $d >/dev/null 2>&1 ; then + gpart destroy $d >/dev/null 2>&1 || continue + DISKS=("${DISKS[@]}" "/dev/$d") #"$DISKS $d" + fi + # Don't bother testing any more if we have enough already. + # Currently we use at most 5 disks plus 1 for temporary disks. + [ ${#DISKS[@]} -eq 6 ] && break +done +export KEEP="$(zpool list -H -o name)" + +# Pull in constants. +. ${STF_SUITE}/include/constants.cfg diff --git a/tests/sys/cddl/zfs/include/translatecommands.awk b/tests/sys/cddl/zfs/include/translatecommands.awk new file mode 100644 index 00000000000..b994a4b0e7a --- /dev/null +++ b/tests/sys/cddl/zfs/include/translatecommands.awk @@ -0,0 +1,40 @@ +#! /usr/bin/awk -f +# $FreeBSD$ + +BEGIN { + print "# This file is autogenerated from commands.txt. Do not edit" + cmdstring = "export CMDS=\"" + cmdch = 1 + cmd_idx=0 +} + +# Strip comments +{ + gsub(/#.*/, "", $0) +} + +# Strip blank lines +/^[ ]*$/ { + next +} + +# Process remaining lines +{ + gsub(/%%STFSUITEDIR%%/, stfsuitedir, $1) + fullcmd = $1 + cmdname = $1 + gsub(/.*\//, "", cmdname) + CMDNAME = toupper(cmdname) + allcmds[cmd_idx] = CMDNAME + cmd_idx += 1 + printf "export %s=\"%s\"\n", CMDNAME, fullcmd +} + +# Print CMDS +END { + print "" + printf "export CMDS=\"" + for (idx in allcmds) + printf "$%s ", allcmds[idx] + print "\"" +} diff --git a/tests/sys/cddl/zfs/tests/Makefile b/tests/sys/cddl/zfs/tests/Makefile new file mode 100644 index 00000000000..a6f6b3ff1d0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/Makefile @@ -0,0 +1,89 @@ +# $FreeBSD$ + +.include + +PACKAGE= tests +TESTSDIR= ${TESTSBASE}/sys/cddl/zfs/tests + +TESTS_SUBDIRS+= acl +TESTS_SUBDIRS+= atime +TESTS_SUBDIRS+= bootfs +TESTS_SUBDIRS+= cache +TESTS_SUBDIRS+= cachefile +TESTS_SUBDIRS+= clean_mirror +TESTS_SUBDIRS+= cli_root +TESTS_SUBDIRS+= cli_user +TESTS_SUBDIRS+= compression +TESTS_SUBDIRS+= ctime +TESTS_SUBDIRS+= delegate +TESTS_SUBDIRS+= devices +TESTS_SUBDIRS+= exec +TESTS_SUBDIRS+= grow_pool +TESTS_SUBDIRS+= grow_replicas +TESTS_SUBDIRS+= history +TESTS_SUBDIRS+= hotplug +TESTS_SUBDIRS+= hotspare +TESTS_SUBDIRS+= inheritance +# Not yet ported to FreeBSD +# TESTS_SUBDIRS+= interop +TESTS_SUBDIRS+= inuse +# Not yet ported to FreeBSD +# TESTS_SUBDIRS+= iscsi +TESTS_SUBDIRS+= large_files +# Not yet ported to FreeBSD +# TESTS_SUBDIRS+= largest_pool +# link_count is not yet ported to FreeBSD. I'm not sure what its purpose is. +# The assertion message contradicts with the log_fail message. +# TESTS_SUBDIRS+= link_count +TESTS_SUBDIRS+= migration +TESTS_SUBDIRS+= mmap +TESTS_SUBDIRS+= mount +TESTS_SUBDIRS+= mv_files +TESTS_SUBDIRS+= nestedfs +TESTS_SUBDIRS+= no_space +TESTS_SUBDIRS+= online_offline +TESTS_SUBDIRS+= pool_names +TESTS_SUBDIRS+= poolversion +TESTS_SUBDIRS+= quota +TESTS_SUBDIRS+= redundancy +TESTS_SUBDIRS+= refquota +TESTS_SUBDIRS+= refreserv +# Broken on every OS +# TESTS_SUBDIRS+= rename_dirs +TESTS_SUBDIRS+= replacement +TESTS_SUBDIRS+= reservation +TESTS_SUBDIRS+= rootpool +# Not yet ported to FreeBSD +# TESTS_SUBDIRS+= rsend +TESTS_SUBDIRS+= scrub_mirror +TESTS_SUBDIRS+= slog +TESTS_SUBDIRS+= snapshot +TESTS_SUBDIRS+= snapused +TESTS_SUBDIRS+= sparse +TESTS_SUBDIRS+= threadsappend +TESTS_SUBDIRS+= truncate +TESTS_SUBDIRS+= txg_integrity +TESTS_SUBDIRS+= userquota +TESTS_SUBDIRS+= utils_test +TESTS_SUBDIRS+= write_dirs +# Not yet ported to FreeBSD +# TESTS_SUBDIRS+= xattr +TESTS_SUBDIRS+= zfsd +TESTS_SUBDIRS+= zil +# Not yet ported to FreeBSD +# TESTS_SUBDIRS+= zinject +# Not yet ported to FreeBSD +# TESTS_SUBDIRS+= zones +TESTS_SUBDIRS+= zvol +TESTS_SUBDIRS+= zvol_thrash + +# This is primarily useful for identifying which test a testid corresponds to. +# Sometimes all you might have is a pool name like 'testpool.1316'. +testids: + for i in `find ${.CURDIR} -name '*.sh' | xargs grep '^atf_test_case '|awk '{print $$2}'`; do \ + echo "$${i}: $$(echo $$i | cksum -o 2 | cut -d" " -f1)"; \ + done + +.PHONY: testids + +.include diff --git a/tests/sys/cddl/zfs/tests/acl/Makefile b/tests/sys/cddl/zfs/tests/acl/Makefile new file mode 100644 index 00000000000..fb42da2d333 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/acl +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= acl.cfg +${PACKAGE}FILES+= acl_common.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +TESTS_SUBDIRS+= cifs +TESTS_SUBDIRS+= trivial +TESTS_SUBDIRS+= nontrivial + +.include diff --git a/tests/sys/cddl/zfs/tests/acl/acl.cfg b/tests/sys/cddl/zfs/tests/acl/acl.cfg new file mode 100644 index 00000000000..e8216ee4bfa --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/acl.cfg @@ -0,0 +1,72 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)acl.cfg 1.3 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +export NISSTAFILE=$TMPDIR/nis_state +export TESTFILE=testfile${TESTCASE_ID} +export TESTFILE0=testfile0.${TESTCASE_ID} +export TESTFILE2=testfile2.${TESTCASE_ID} + +# Define super user 'admin' +export ZFS_ACL_ADMIN=admin + +export ZFS_ACL_STAFF_GROUP=zfsgrp +export ZFS_ACL_STAFF1=staff1 +export ZFS_ACL_STAFF2=staff2 + +export ZFS_ACL_OTHER_GROUP=othergrp +export ZFS_ACL_OTHER1=other1 +export ZFS_ACL_OTHER2=other2 + +# Define the current user who run 'usr_exec' +export ZFS_ACL_CUR_USER="" + +# Define global error string +export ZFS_ACL_ERR_STR="" + +# Define test file and test directory which will be operated by chmod +export testfile=$TESTDIR/testfile +export testdir=$TESTDIR/testdir + +# Define several directories for trivial ACLs function test. +export RES_DIR=$TESTDIR/RES +export INI_DIR=$TESTDIR/INIT +export TST_DIR=$TESTDIR/TEST +export TMP_DIR=$TESTDIR/TMP + +# Define test files and their attributes files number for trivial +# ACLs function test +export NUM_FILE=5 +export NUM_ATTR=10 + +# Enlarge STF_TIMEOUT +export STF_TIMEOUT=1800 diff --git a/tests/sys/cddl/zfs/tests/acl/acl_common.kshlib b/tests/sys/cddl/zfs/tests/acl/acl_common.kshlib new file mode 100644 index 00000000000..fa3a12e61dc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/acl_common.kshlib @@ -0,0 +1,638 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)acl_common.kshlib 1.4 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# FreeBSD doesn't support ZFS extended attributes. It also doesn't support the +# same ACL mechanisms Solaris does for testing. +if [[ $os_name != "FreeBSD" ]]; then + export ZFS_XATTR="true" + export ZFS_ACL="true" +else + log_note "On FreeBSD most xattr and ACL tests are disabled" +fi + +# +# Get the given file/directory access mode +# +# $1 object -- file or directroy +# +function get_mode # +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -ld $obj | $AWK '{print $1}' +} + +# +# Get the given file/directory ACL +# +# $1 object -- file or directroy +# +function get_acl # +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -vd $obj | $NAWK '(NR != 1) {print $0}' +} + +# +# Get the given file/directory ACL +# +# $1 object -- file or directroy +# +function get_compact_acl # +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -Vd $obj | $NAWK '(NR != 1) {print $0}' +} + +# +# Check the given two files/directories have the same ACLs +# +# Return 0, if source object acl is equal to target object acl. +# +# $1 source object +# $2 target object +# +function compare_acls # +{ + typeset src=$1 + typeset tgt=$2 + + (( ${#src} == 0 || ${#tgt} == 0 )) && return 1 + [[ $src == $tgt ]] && return 0 + + typeset tmpsrc=$TMPDIR/compare_acls.src.${TESTCASE_ID} + typeset tmptgt=$TMPDIR/compare_acls.tgt.${TESTCASE_ID} + + get_acl $src > $tmpsrc + get_acl $tgt > $tmptgt + typeset -i ret=0 + $DIFF $tmpsrc $tmptgt > /dev/null 2>&1 + ret=$? + $RM -f $tmpsrc $tmptgt + + if (( ret != 0 )); then + return $ret + fi + + get_compact_acl $src > $tmpsrc + get_compact_acl $tgt > $tmptgt + $DIFF $tmpsrc $tmptgt > /dev/null 2>&1 + ret=$? + $RM -f $tmpsrc $tmptgt + + return $ret +} + +# +# Check that the given two objects have the same modes. +# Return 0, if their modes are equal with each other. Otherwise, return 1. +# +# $1 source object +# $2 target object +# +function compare_modes # +{ + typeset src=$1 + typeset tgt=$2 + typeset -i i=0 + set -A mode + + (( ${#src} == 0 || ${#tgt} == 0 )) && return 1 + [[ $src == $tgt ]] && return 0 + + typeset obj + for obj in $src $tgt + do + mode[i]=$(get_mode $obj) + + (( i = i + 1 )) + done + + [[ ${mode[0]} != ${mode[1]} ]] && return 1 + + return 0 +} + +# +# Check that the given two objects have the same xattrs. +# Return 0, if their xattrs are equal with each other. Otherwise, return 1. +# +# $1 source object +# $2 target object +# +function compare_xattrs # +{ + typeset src=$1 + typeset tgt=$2 + + (( ${#src} == 0 || ${#tgt} == 0 )) && return 1 + [[ $src == $tgt ]] && return 0 + + typeset tmpsrc=$TMPDIR/compare_xattrs.src.${TESTCASE_ID} + typeset tmptgt=$TMPDIR/compare_xattrs.tgt.${TESTCASE_ID} + + get_xattr $src > $tmpsrc + get_xattr $tgt > $tmptgt + typeset -i ret=0 + $DIFF $tmpsrc $tmptgt > /dev/null 2>&1 + ret=$? + $RM -f $tmpsrc $tmptgt + + return $ret +} + +# +# Check '+' is set for a given file/directory with 'ls [-l]' command +# +# $1 object -- file or directory. +# +function plus_sign_check_l # +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -ld $obj | $AWK '{print $1}' | $GREP "+\>" > /dev/null + + return $? +} + +# +# Check '+' is set for a given file/directory with 'ls [-v]' command +# +# $1 object -- file or directory. +# +function plus_sign_check_v # +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -vd $obj | $NAWK '(NR == 1) {print $1}' | $GREP "+\>" > /dev/null + + return $? +} + +# +# A wrapper function of c program +# +# $1 legal login name +# $2-n commands and options +# +function chgusr_exec # [...] +{ + $CHG_USR_EXEC $@ + return $? +} + +# +# Export the current user for the following usr_exec operating. +# +# $1 legal login name +# +function set_cur_usr # +{ + export ZFS_ACL_CUR_USER=$1 +} + +# +# Run commands by $ZFS_ACL_CUR_USER +# +# $1-n commands and options +# +function usr_exec # [...] +{ + $CHG_USR_EXEC "$ZFS_ACL_CUR_USER" $@ + return $? +} + +# +# Count how many ACEs for the specified file or directory. +# +# $1 file or directroy name +# +function count_ACE # +{ + if [[ ! -e $1 ]]; then + log_note "Need input file or directroy name." + return 1 + fi + + $LS -vd $1 | $NAWK 'BEGIN {count=0} + (NR != 1)&&(/[0-9]:/) {count++} + END {print count}' + + return 0 +} + +# +# Get specified number ACE content of specified file or directory. +# +# $1 file or directory name +# $2 specified number +# +function get_ACE # +{ + if [[ ! -e $1 || $2 -ge $(count_ACE $1) ]]; then + return 1 + fi + + typeset file=$1 + typeset -i num=$2 + typeset format=${3:-verbose} + typeset -i next_num=-1 + + typeset tmpfile=$TMPDIR/tmp_get_ACE.${TESTCASE_ID} + typeset line="" + typeset args + + case $format in + verbose) args="-vd" + ;; + compact) args="-Vd" + ;; + *) log_fail "Invalid parameter as ($format), " \ + "only verbose|compact is supported." + ;; + esac + + $LS $args $file > $tmpfile + (( $? != 0 )) && log_fail "FAIL: $LS $args $file > $tmpfile" + while read line; do + [[ -z $line ]] && continue + if [[ $args == -vd ]]; then + if [[ $line == "$num":* ]]; then + (( next_num = num + 1 )) + fi + if [[ $line == "$next_num":* ]]; then + break + fi + if (( next_num != -1 )); then + print -n $line + fi + else + if (( next_num == num )); then + print -n $line + fi + (( next_num += 1 )) + fi + done < $tmpfile + + $RM -f $tmpfile + (( $? != 0 )) && log_fail "FAIL: $RM -f $tmpfile" +} + +# +# Cleanup exist user/group. +# +function cleanup_user_group +{ + del_user $ZFS_ACL_ADMIN + + del_user $ZFS_ACL_STAFF1 + del_user $ZFS_ACL_STAFF2 + del_group $ZFS_ACL_STAFF_GROUP + + del_user $ZFS_ACL_OTHER1 + del_user $ZFS_ACL_OTHER2 + del_group $ZFS_ACL_OTHER_GROUP + + return 0 +} + +# +# Clean up testfile and test directory +# +function cleanup +{ + if [[ -d $TESTDIR ]]; then + cd $TESTDIR + $RM -rf $TESTDIR/* + fi +} + +# +# According to specified access or acl_spec, do relevant operating by using the +# specified user. +# +# $1 specified user +# $2 node +# $3 acl_spec or access +# +function rwx_node #user node acl_spec|access +{ + typeset user=$1 + typeset node=$2 + typeset acl_spec=$3 + + if [[ $user == "" || $node == "" || $acl_spec == "" ]]; then + log_note "node or acl_spec are not defined." + return 1 + fi + + if [[ -d $node ]]; then + case $acl_spec in + *:read_data:*|read_data) + chgusr_exec $user $LS -l $node > /dev/null 2>&1 + return $? ;; + *:write_data:*|write_data) + if [[ -f ${node}/tmpfile ]]; then + log_must $RM -f ${node}/tmpfile + fi + chgusr_exec $user $TOUCH ${node}/tmpfile > \ + /dev/null 2>&1 + return $? ;; + *"execute:"*|execute) + chgusr_exec $user $FIND $node > /dev/null 2>&1 + return $? ;; + esac + else + case $acl_spec in + *:read_data:*|read_data) + chgusr_exec $user $CAT $node > /dev/null 2>&1 + return $? ;; + *:write_data:*|write_data) + chgusr_exec $user $DD if=/bin/ls of=$node > \ + /dev/null 2>&1 + return $? ;; + *"execute:"*|execute) + ZFS_ACL_ERR_STR=$(chgusr_exec $user $node 2>&1) + return $? ;; + esac + fi +} + +# +# Get the given file/directory xattr +# +# $1 object -- file or directroy +# +function get_xattr # +{ + typeset obj=$1 + typeset xattr + if (( ${#obj} == 0 )); then + return 1 + fi + + for xattr in `$RUNAT $obj $LS | \ + /usr/bin/egrep -v -e SUNWattr_ro -e SUNWattr_rw` ; do + $RUNAT $obj $SUM $xattr + done +} + +# +# Get the owner of a file/directory +# +function get_owner #node +{ + typeset node=$1 + typeset value + + if [[ -z $node ]]; then + log_fail "node are not defined." + fi + + if [[ -d $node ]]; then + value=$($LS -dl $node | $AWK '{print $3}') + elif [[ -e $node ]]; then + value=$($LS -l $node | $AWK '{print $3}') + fi + + $ECHO $value +} + +# +# Get the group of a file/directory +# +function get_group #node +{ + typeset node=$1 + typeset value + + if [[ -z $node ]]; then + log_fail "node are not defined." + fi + + if [[ -d $node ]]; then + value=$($LS -dl $node | $AWK '{print $4}') + elif [[ -e $node ]]; then + value=$($LS -l $node | $AWK '{print $4}') + fi + + $ECHO $value +} + + +# +# Get the group name that a UID belongs to +# +function get_user_group #uid +{ + typeset uid=$1 + typeset value + + if [[ -z $uid ]]; then + log_fail "UID not defined." + fi + + value=$(id $uid) + + if [[ $? -eq 0 ]]; then + value=${value##*\(} + value=${value%%\)*} + $ECHO $value + else + log_fail "Invalid UID (uid)." + fi +} + +# +# Get the specified item of the specified string +# +# $1: Item number, count from 0. +# $2-n: strings +# +function getitem +{ + typeset -i n=$1 + shift + + (( n += 1 )) + eval print \${$n} +} + +# +# This function calculate the specified directory files checksum and write +# to the specified array. +# +# $1 directory in which the files will be cksum. +# $2 file array name which was used to store file cksum information. +# $3 attribute array name which was used to store attribute information. +# +function cksum_files # +{ + typeset dir=$1 + typeset farr_name=$2 + typeset aarr_name=$3 + + [[ ! -d $dir ]] && return + typeset oldpwd=$PWD + cd $dir + typeset files=$($LS file*) + + typeset -i i=0 + typeset -i n=0 + while (( i < NUM_FILE )); do + typeset f=$(getitem $i $files) + eval $farr_name[$i]=\$\(\$CKSUM $f\) + + typeset -i j=0 + while (( j < NUM_ATTR )); do + eval $aarr_name[$n]=\$\(\$RUNAT \$f \$CKSUM \ + attribute.$j\) + + (( j += 1 )) + (( n += 1 )) + done + + (( i += 1 )) + done + + cd $oldpwd +} + +# +# This function compare two cksum results array. +# +# $1 The array name which stored the cksum before operation. +# $2 The array name which stored the cksum after operation. +# +function compare_cksum # +{ + typeset before=$1 + typeset after=$2 + eval typeset -i count=\${#$before[@]} + + typeset -i i=0 + while (( i < count )); do + eval typeset var1=\${$before[$i]} + eval typeset var2=\${$after[$i]} + + if [[ $var1 != $var2 ]]; then + return 1 + fi + + (( i += 1 )) + done + + return 0 +} + +# +# This function calculate all the files cksum information in current directory +# and output them to the specified file. +# +# $1 directory from which the files will be cksum. +# $2 cksum output file +# +function record_cksum # +{ + typeset dir=$1 + typeset outfile=$2 + + [[ ! -d ${outfile%/*} ]] && usr_exec $MKDIR -p ${outfile%/*} + + usr_exec cd $dir ; $FIND . -depth -type f -exec cksum {} \\\; | $SORT > $outfile + usr_exec cd $dir ; $FIND . -depth -type f -xattr -exec runat {} \ + cksum attribute* \\\; | $SORT >> $outfile +} + +# +# The function create_files creates the directories and files that the script +# will operate on to test extended attribute functionality. +# +# $1 The base directory in which to create directories and files. +# +function create_files # +{ + typeset basedir=$1 + + [[ ! -d $basedir ]] && usr_exec $MKDIR -m 777 $basedir + [[ ! -d $RES_DIR ]] && usr_exec $MKDIR -m 777 $RES_DIR + [[ ! -d $INI_DIR ]] && usr_exec $MKDIR -m 777 $INI_DIR + [[ ! -d $TST_DIR ]] && usr_exec $MKDIR -m 777 $TST_DIR + [[ ! -d $TMP_DIR ]] && usr_exec $MKDIR -m 777 $TMP_DIR + + # + # Create the original file and its attribute files. + # + [[ ! -a $RES_DIR/file ]] && \ + usr_exec $FILE_WRITE -o create -f $RES_DIR/file \ + -b 1024 -d 0 -c 1 + [[ ! -a $RES_DIR/attribute ]] && \ + usr_exec $CP $RES_DIR/file $RES_DIR/attribute + + typeset oldpwd=$PWD + cd $INI_DIR + + typeset -i i=0 + while (( i < NUM_FILE )); do + typeset dstfile=$INI_DIR/file.${TESTCASE_ID}.$i + usr_exec $CP $RES_DIR/file $dstfile + + typeset -i j=0 + while (( j < NUM_ATTR )); do + usr_exec $RUNAT $dstfile \ + $CP $RES_DIR/attribute ./attribute.$j + (( j += 1 )) + done + + (( i += 1 )) + done + + cd $oldpwd +} diff --git a/tests/sys/cddl/zfs/tests/acl/cifs/Makefile b/tests/sys/cddl/zfs/tests/acl/cifs/Makefile new file mode 100644 index 00000000000..e317fb94176 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/cifs/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/acl/cifs +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= cifs.kshlib +${PACKAGE}FILES+= cifs_attr_001_pos.ksh +${PACKAGE}FILES+= cifs_attr_002_pos.ksh +${PACKAGE}FILES+= cifs_attr_003_pos.ksh + +ATF_TESTS_KSH93+= cifs_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +.include diff --git a/tests/sys/cddl/zfs/tests/acl/cifs/cifs.kshlib b/tests/sys/cddl/zfs/tests/acl/cifs/cifs.kshlib new file mode 100644 index 00000000000..74bc430e602 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/cifs/cifs.kshlib @@ -0,0 +1,91 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cifs.kshlib 1.4 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +function cifs_supported +{ + if check_version "5.11" ; then + fs_prop_exist "sharesmb" + return $? + fi + return 1 +} + +# +# Create a file or direcotry +# +# $1: The type specified, "file" or "dir" +# $2: The given node name +# $3: Owner of the node +# +function create_object +{ + typeset type=$1 + typeset object=$2 + typeset owner=$3 + + destroy_object $object + + case $type in + dir) + $MKDIR -p $object + ;; + file) + $ECHO "ZFS test suites" > $object + ;; + esac + + if [[ -n $owner ]]; then + $CHOWN $owner $object + fi + return 0 +} + +# +# Destroy the given node(s) +# +# $@: The node(s) need to be destroyed +# +function destroy_object +{ + for object in $@ ; do + if [[ -e $object ]]; then + + # clear_attribute is a common function name, + # but each case should have their own implement. + log_must clear_attribute $object + log_must $RM -rf $object + fi + done + return 0 +} + diff --git a/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_001_pos.ksh new file mode 100644 index 00000000000..308f55efbce --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_001_pos.ksh @@ -0,0 +1,262 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cifs_attr_001_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib +. $STF_SUITE/tests/acl/cifs/cifs.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cifs_attr_001_pos +# +# DESCRIPTION: +# Verify the user with write_attributes permission or +# PRIV_FILE_OWNER privilege could set/clear DOS attributes. +# (Readonly, Hidden, Archive, System) +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Grant user has write_attributes permission or +# PRIV_FILE_OWNER privilege +# 4. Verify set/clear DOS attributes should succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! cifs_supported ; then + log_unsupported "CIFS not supported on current system." +fi + +test_requires ZFS_ACL ZFS_XATTR + +function cleanup +{ + for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + mtpt=$(get_prop mountpoint $fs) + log_must $RM -rf $mtpt/file.* $mtpt/dir.* + done +} + +# +# Set the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be set +# $3: Execute username +# +function set_attribute +{ + typeset object=$1 + typeset attr=${2:-AHRS} + typeset user=$3 + typeset ret=0 + + if [[ -z $object ]]; then + log_fail "Object not defined." + fi + + if [[ -n $user ]]; then + $RUNWATTR -u $user "$CHMOD S+c${attr} $object" + ret=$? + else + $CHMOD S+c${attr} $object + ret=$? + fi + + return $ret +} + +# +# Clear the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be cleared +# $3: Execute username +# +function clear_attribute +{ + typeset object=$1 + typeset attr=${2:-AHRS} + typeset user=$3 + typeset ret=0 + + if [[ -z $object ]]; then + log_fail "Object not defined." + fi + + if [[ -n $user ]]; then + $RUNWATTR -u $user "$CHMOD S-c${attr} $object" + ret=$? + else + $CHMOD S-c${attr} $object + ret=$? + fi + + return $ret +} + +# +# Grant the ace of write_attributes to the given user +# +# $1: The given user +# $2: The given node (file/dir) +# +function grant_attr +{ + typeset user=$1 + typeset object=$2 + + if [[ -z $user || -z $object ]]; then + log_fail "User($user), Object($object) not defined." + fi + + # To increase the coverage, here we set 'deny' against + # superuser and owner. + # Only grant the user explicitly while it's not root neither owner. + + if [[ $user == "root" ]]; then + log_must chmod A+user:root:write_attributes:deny $object + elif [[ $user == $(get_owner $object) ]]; then + if (( ( RANDOM % 2 ) == 0 )); then + log_must chmod A+owner@:write_attributes:deny $object + else + log_must chmod A+user:$user:write_attributes:deny \ + $object + fi + else + log_must chmod A+user:$user:write_attributes:allow $object + fi + attr_mod="write_attributes" +} + +# +# Revoke the ace of write_attributes from the given user +# +# $1: The given user +# $2: The given node (file/dir) +# +function revoke_attr +{ + typeset user=$1 + typeset object=$2 + + if [[ -z $user || -z $object ]]; then + log_fail "User($user), Object($object) not defined." + fi + + log_must chmod A0- $object + attr_mod= +} + +# +# Invoke the function and verify whether its return code as expected +# +# $1: Function be invoked +# $2: The given node (file/dir) +# $3: Execute user +# $4: Option +# +function verify_attr +{ + typeset func=$1 + typeset object=$2 + typeset opt=$3 + typeset user=$4 + typeset expect="log_mustnot" + + if [[ -z $func || -z $object ]]; then + log_fail "Func($func), Object($object), User($user), \ + Opt($opt) not defined." + fi + + # If user is superuser or has write_attributes permission or + # PRIV_FILE_OWNER privilege, it should log_must, + # otherwise log_mustnot. + + if [[ -z $user || $user == "root" || \ + $user == $(get_owner $object) || \ + $attr_mod == *"write_attributes"* ]] ; then + expect="log_must" + fi + + $expect $func $object $opt $user +} + +log_assert "Verify set/clear DOS attributes will succeed while user has " \ + "write_attributes permission or PRIV_FILE_OWNER privilege" +log_onexit cleanup + +file="file.0" +dir="dir.0" +XATTROPTIONS="H S R A" + +for fs in $TESTPOOL $TESTPOOL/$TESTFS ; do + mtpt=$(get_prop mountpoint $fs) + for owner in root $ZFS_ACL_STAFF1 ; do + + create_object "file" $mtpt/$file $owner + create_object "dir" $mtpt/$dir $owner + + for object in $mtpt/$file $mtpt/$dir ; do + for user in root $ZFS_ACL_STAFF2 ; do + for opt in $XATTROPTIONS ; do + verify_attr set_attribute \ + $object $opt $user + verify_attr clear_attribute \ + $object $opt $user + done + log_must grant_attr $user $object + for opt in $XATTROPTIONS ; do + verify_attr set_attribute \ + $object $opt $user + verify_attr clear_attribute \ + $object $opt $user + done + log_must revoke_attr $user $object + done + done + destroy_object $mtpt/$file $mtpt/$dir + done +done + +log_pass "Set/Clear DOS attributes succeed while user has " \ + "write_attributes permission or PRIV_FILE_OWNER privilege" diff --git a/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_002_pos.ksh new file mode 100644 index 00000000000..450366cd89a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_002_pos.ksh @@ -0,0 +1,280 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cifs_attr_002_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib +. $STF_SUITE/tests/acl/cifs/cifs.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cifs_attr_002_pos +# +# DESCRIPTION: +# Verify the user with PRIV_FILE_FLAG_SET/PRIV_FILE_FLAG_CLEAR +# could set/clear BSD'ish attributes. +# (Immutable, nounlink, and appendonly) +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Grant user has PRIV_FILE_FLAG_SET/PRIV_FILE_FLAG_CLEAR separately. +# 4. Verify set/clear BSD'ish attributes should succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +if ! cifs_supported ; then + log_unsupported "CIFS not supported on current system." +fi + +test_requires ZFS_ACL ZFS_XATTR + +function cleanup +{ + if [[ -n $gobject ]]; then + destroy_object $gobject + fi + + for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + mtpt=$(get_prop mountpoint $fs) + log_must $RM -rf $mtpt/file.* $mtpt/dir.* + done +} + +# +# Set the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be set +# $3: Execute username +# +function set_attribute +{ + typeset object=$1 + typeset attr=$2 + typeset user=$3 + typeset ret=0 + + if [[ -z $object ]]; then + log_fail "Object not defined." + fi + + if [[ -z $attr ]]; then + attr="uiadm" + if [[ -f $object ]]; then + attr="${attr}q" + fi + fi + + if [[ -n $user ]]; then + $RUNWATTR -u $user -p =basic${priv_mod} \ + "$CHMOD S+c${attr} $object" + ret=$? + else + $CHMOD S+c${attr} $object + ret=$? + fi + + return $ret +} + +# +# Clear the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be cleared +# $3: Execute username +# +function clear_attribute +{ + typeset object=$1 + typeset attr=$2 + typeset user=$3 + typeset ret=0 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + if [[ -z $attr ]]; then + attr="uiadm" + if [[ -f $object ]]; then + attr="${attr}q" + fi + fi + + if [[ -n $user ]]; then + $RUNWATTR -u $user -p =basic${priv_mod} \ + "$CHMOD S-c${attr} $object" + ret=$? + else + $CHMOD S-c${attr} $object + ret=$? + fi + + return $ret +} + +# +# Grant the privset to the given user +# +# $1: The given user +# $2: The given privset +# +function grant_priv +{ + typeset user=$1 + typeset priv=$2 + + if [[ -z $user || -z $priv ]]; then + log_fail "User($user), Priv($priv) not defined." + fi + priv_mod=",$priv" + return $? +} + +# +# Revoke the all additional privset from the given user +# +# $1: The given user +# +function revoke_priv +{ + typeset user=$1 + + if [[ -z $user ]]; then + log_fail "User not defined." + fi + priv_mod= + return $? +} + +# +# Invoke the function and verify whether its return code as expected +# +# $1: Function be invoked +# $2: The given node (file/dir) +# $3: Execute user +# $4: Option +# +function verify_op +{ + typeset func=$1 + typeset object=$2 + typeset opt=$3 + typeset user=$4 + typeset expect="log_mustnot" + + if [[ -z $func || -z $object ]]; then + log_fail "Func($func), Object($object) not defined." + fi + + # If user has PRIV_FILE_FLAG_SET, it could permit to set_attribute, + # And If has PRIV_FILE_FLAG_CLEAR, it could permit to clear_attribute, + # otherwise log_mustnot. + if [[ -z $user || $user == "root" ]] || \ + [[ $priv_mod == *"file_flag_set"* ]] || \ + [[ $priv_mod == *"all"* ]] ; then + expect="log_must" + fi + if [[ -d $object ]] && \ + [[ $opt == *"q"* ]] ; then + expect="log_mustnot" + fi + + if [[ $func == clear_attribute ]]; then + if [[ $expect == "log_mustnot" ]]; then + expect="log_must" + elif [[ -z $user || $user == "root" ]] || \ + [[ $priv_mod == *"all"* ]] ; then + expect="log_must" + else + expect="log_mustnot" + fi + fi + + $expect $func $object $opt $user +} + +log_assert "Verify set/clear BSD'ish attributes will succeed while user has " \ + "PRIV_FILE_FLAG_SET/PRIV_FILE_FLAG_CLEAR privilege" +log_onexit cleanup + +file="file.0" +dir="dir.0" +FLAGOPTIONS="u i a d q m" + +typeset gobject +for fs in $TESTPOOL $TESTPOOL/$TESTFS ; do + mtpt=$(get_prop mountpoint $fs) + for owner in root $ZFS_ACL_STAFF1 ; do + + create_object "file" $mtpt/$file $owner + create_object "dir" $mtpt/$dir $owner + + for object in $mtpt/$file $mtpt/$dir ; do + gobject=$object + for user in root $ZFS_ACL_STAFF2 ; do + log_must grant_priv $user file_flag_set + for opt in $FLAGOPTIONS ; do + verify_op set_attribute \ + $object $opt $user + verify_op clear_attribute \ + $object $opt $user + done + log_must revoke_priv $user + + log_must grant_priv $user all + for opt in $FLAGOPTIONS ; do + verify_op set_attribute \ + $object $opt $user + verify_op clear_attribute \ + $object $opt $user + done + log_must revoke_priv $user + done + done + destroy_object $mtpt/$file $mtpt/$dir + done +done + +log_pass "Set/Clear BSD'ish attributes succeed while user has " \ + "PRIV_FILE_FLAG_SET/PRIV_FILE_FLAG_CLEAR privilege" diff --git a/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_003_pos.ksh b/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_003_pos.ksh new file mode 100644 index 00000000000..5edd2dee931 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/cifs/cifs_attr_003_pos.ksh @@ -0,0 +1,622 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cifs_attr_003_pos.ksh 1.4 09/05/19 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib +. $STF_SUITE/tests/acl/cifs/cifs.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cifs_attr_003_pos +# +# DESCRIPTION: +# Verify the DOS attributes (Readonly, Hidden, Archive, System) +# and BSD'ish attributes (Immutable, nounlink, and appendonly) +# will provide the proper access limitation as expected. +# +# Readonly means that the content of a file can't be modified, but +# timestamps, mode and so on can. +# +# Archive - Indicates if a file should be included in the next backup +# of the file system. ZFS will set this bit whenever a file is +# modified. +# +# Hidden and System (ZFS does nothing special with these, other than +# letting a user/application set them. +# +# Immutable (The data can't, change nor can mode, ACL, size and so on) +# The only attribute that can be updated is the access time. +# +# Nonunlink - Sort of like immutable except that a file/dir can't be +# removed. +# This will also effect a rename operation, since that involes a +# remove. +# +# Appendonly - File can only be appended to. +# +# nodump, settable, opaque (These are for the MacOS port) we will +# allow them to be set, but have no semantics tied to them. +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Set the file/dir with each kind of special attribute. +# 4. Verify the access limitation works as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! cifs_supported ; then + log_unsupported "CIFS not supported on current system." +fi + +test_requires ZFS_ACL ZFS_XATTR + +function cleanup +{ + if [[ -n $gobject ]]; then + destroy_object $gobject + fi + + for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + mtpt=$(get_prop mountpoint $fs) + log_must $RM -rf $mtpt/file.* $mtpt/dir.* + done +} + +# +# Set the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be set +# +function set_attribute +{ + typeset object=$1 + typeset attr=$2 + + if [[ -z $attr ]]; then + attr="AHRSadimu" + if [[ -f $object ]]; then + attr="${attr}q" + fi + fi + + $CHMOD S+c${attr} $object + return $? +} + +# +# Clear the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be cleared +# +function clear_attribute +{ + typeset object=$1 + typeset attr=$2 + + if [[ -z $attr ]]; then + if is_global_zone ; then + attr="AHRSadimu" + if [[ -f $object ]]; then + attr="${attr}q" + fi + else + attr="AHRS" + fi + fi + + $CHMOD S-c${attr} $object + return $? +} + +# +# A wrapper function to call test function according to the given attr +# +# $1: The given node (file/dir) +# $2: The special attribute to be test +# +function test_wrapper +{ + typeset object=$1 + typeset attr=$2 + + if [[ -z $object || -z $attr ]]; then + log_fail "Object($object), Attr($attr) not defined." + fi + + case $attr in + R) func=test_readonly + ;; + i) func=test_immutable + ;; + u) func=test_nounlink + ;; + a) func=test_appendonly + ;; + esac + + if [[ -n $func ]]; then + $func $object + fi +} + +# +# Invoke the function and verify whether its return code as expected +# +# $1: Expect value +# $2-$n: Function and args need to be invoked +# +function verify_expect +{ + typeset -i expect=$1 + typeset status + + shift + + "$@" > /dev/null 2>&1 + status=$? + if [[ $status -eq 0 ]]; then + if (( expect != 0 )); then + log_fail "$@ unexpect return 0" + fi + else + if (( expect == 0 )); then + log_fail "$@ unexpect return $status" + fi + fi +} + +# +# Unit testing function against overwrite file +# +# $1: The given file node +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_writefile +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ -f $object ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $CP $TESTFILE $object + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$ECHO '$TESTSTR' > $object" + fi +} + +# +# Unit testing function against write new stuffs into a directory +# +# $1: The given directory node +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_writedir +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ -d $object ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $CP $TESTFILE $object + verify_expect $expect $CHG_USR_EXEC $user \ + $MKDIR -p $object/$TESTDIR + fi +} + +function unit_appenddata +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ ! -d $object ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$ECHO '$TESTSTR' >> $object" + fi +} + +# +# Unit testing function against delete content from a directory +# +# $1: The given node, dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_deletecontent +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ -d $object ]]; then + for target in $object/${TESTFILE##*/} $object/$TESTDIR ; do + if [[ -e $target ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$MV $target $target.new" + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$ECHO y | $RM -r $target.new" + fi + done + fi +} + +# +# Unit testing function against delete a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_deletedata +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$ECHO y | $RM -r $object" + +} + +# +# Unit testing function against write xattr to a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_writexattr +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + verify_expect $expect $CHG_USR_EXEC $user \ + $RUNAT $object "$CP $TESTFILE $TESTATTR" + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$RUNAT $object \"$ECHO '$TESTSTR' > $TESTATTR\"" + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$RUNAT $object \"$ECHO '$TESTSTR' >> $TESTATTR\"" + if [[ $expect -eq 0 ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $RUNAT $object "$RM -f $TESTATTR" + fi +} + +# +# Unit testing function against modify accesstime of a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_accesstime +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ -d $object ]]; then + verify_expect $expect $CHG_USR_EXEC $user $LS $object + else + verify_expect $expect $CHG_USR_EXEC $user $CAT $object + fi +} + +# +# Unit testing function against modify updatetime of a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_updatetime +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + verify_expect $expect $CHG_USR_EXEC $user $TOUCH $object + verify_expect $expect $CHG_USR_EXEC $user $TOUCH -a $object + verify_expect $expect $CHG_USR_EXEC $user $TOUCH -m $object +} + +# +# Unit testing function against write acl of a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_writeacl +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + verify_expect $expect $CHG_USR_EXEC $user chmod A+$TESTACL $object + verify_expect $expect $CHG_USR_EXEC $user chmod A+$TESTACL $object + verify_expect $expect $CHG_USR_EXEC $user chmod A0- $object + verify_expect $expect $CHG_USR_EXEC $user chmod A0- $object + oldmode=$(get_mode $object) + verify_expect $expect $CHG_USR_EXEC $user chmod $TESTMODE $object +} + +# +# Testing function to verify the given node is readonly +# +# $1: The given node, file/dir +# +function test_readonly +{ + typeset object=$1 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + log_note "Testing readonly of $object" + + for user in $ZFS_ACL_CUR_USER root $ZFS_ACL_STAFF2; do + if [[ -d $object ]]; then + log_must usr_exec chmod \ + A+user:$user:${ace_dir}:allow $object + else + log_must usr_exec chmod \ + A+user:$user:${ace_file}:allow $object + fi + + log_must set_attribute $object "R" + + unit_writefile $object $user 1 + unit_writedir $object $user + unit_appenddata $object $user 1 + + if [[ -d $object ]]; then + unit_writexattr $object $user + else + unit_writexattr $object $user 1 + fi + + unit_accesstime $object $user + unit_updatetime $object $user + unit_writeacl $object $user + unit_deletecontent $object $user + unit_deletedata $object $user + + if [[ -d $object ]] ;then + create_object "dir" $object $ZFS_ACL_CUR_USER + else + create_object "file" $object $ZFS_ACL_CUR_USER + fi + done +} + +# +# Testing function to verify the given node is immutable +# +# $1: The given node, file/dir +# +function test_immutable +{ + typeset object=$1 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + log_note "Testing immutable of $object" + + for user in $ZFS_ACL_CUR_USER root $ZFS_ACL_STAFF2; do + if [[ -d $object ]]; then + log_must usr_exec chmod \ + A+user:$user:${ace_dir}:allow $object + else + log_must usr_exec chmod \ + A+user:$user:${ace_file}:allow $object + fi + log_must set_attribute $object "i" + + unit_writefile $object $user 1 + unit_writedir $object $user 1 + unit_appenddata $object $user 1 + unit_writexattr $object $user 1 + unit_accesstime $object $user + unit_updatetime $object $user 1 + unit_writeacl $object $user 1 + unit_deletecontent $object $user 1 + unit_deletedata $object $user 1 + + if [[ -d $object ]] ;then + create_object "dir" $object $ZFS_ACL_CUR_USER + else + create_object "file" $object $ZFS_ACL_CUR_USER + fi + done +} + +# +# Testing function to verify the given node is nounlink +# +# $1: The given node, file/dir +# +function test_nounlink +{ + typeset object=$1 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + $ECHO "Testing nounlink of $object" + + for user in $ZFS_ACL_CUR_USER root $ZFS_ACL_STAFF2; do + if [[ -d $object ]]; then + log_must usr_exec chmod \ + A+user:$user:${ace_dir}:allow $object + else + log_must usr_exec chmod \ + A+user:$user:${ace_file}:allow $object + fi + log_must set_attribute $object "u" + + unit_writefile $object $user + unit_writedir $object $user + unit_appenddata $object $user + unit_writexattr $object $user + unit_accesstime $object $user + unit_updatetime $object $user + unit_writeacl $object $user + unit_deletecontent $object $user 1 + unit_deletedata $object $user 1 + + if [[ -d $object ]] ;then + create_object "dir" $object $ZFS_ACL_CUR_USER + else + create_object "file" $object $ZFS_ACL_CUR_USER + fi + done +} + +# +# Testing function to verify the given node is appendonly +# +# $1: The given node, file/dir +# +function test_appendonly +{ + typeset object=$1 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + log_note "Testing appendonly of $object" + + for user in $ZFS_ACL_CUR_USER root $ZFS_ACL_STAFF2; do + if [[ -d $object ]]; then + log_must usr_exec chmod \ + A+user:$user:${ace_dir}:allow $object + else + log_must usr_exec chmod \ + A+user:$user:${ace_file}:allow $object + fi + log_must set_attribute $object "a" + + unit_writefile $object $user 1 + unit_writedir $object $user + unit_appenddata $object $user + unit_writexattr $object $user + unit_accesstime $object $user + unit_updatetime $object $user + unit_writeacl $object $user + unit_deletecontent $object $user + unit_deletedata $object $user + + if [[ -d $object ]] ;then + create_object "dir" $object $ZFS_ACL_CUR_USER + else + create_object "file" $object $ZFS_ACL_CUR_USER + fi + done +} + +FILES="file.0 file.1" +DIRS="dir.0 dir.1" +XATTRS="attr.0 attr.1" +FS="$TESTPOOL $TESTPOOL/$TESTFS" + +if is_global_zone ; then + ATTRS="R i u a" +else + ATTRS="R" +fi + +TESTFILE=$TMPDIR/tfile +TESTDIR=tdir +TESTATTR=tattr +TESTACL=user:$ZFS_ACL_OTHER1:write_data:allow +TESTMODE=777 +TESTSTR="ZFS test suites" + +ace_file="write_data/append_data/write_xattr/write_acl/write_attributes" +ace_dir="add_file/add_subdirectory/${ace_file}" + +log_assert "Verify DOS & BSD'ish attributes will provide the " \ + "access limitation as expected." +log_onexit cleanup + +$ECHO "$TESTSTR" > $TESTFILE + +typeset gobject +typeset gattr +for gattr in $ATTRS ; do + for fs in $FS ; do + mtpt=$(get_prop mountpoint $fs) + $CHMOD 777 $mtpt + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + for file in $FILES ; do + gobject=$mtpt/$file + create_object "file" $gobject $ZFS_ACL_CUR_USER + test_wrapper $gobject $gattr + destroy_object $gobject + done + + for dir in $DIRS ; do + gobject=$mtpt/$dir + create_object "dir" $gobject $ZFS_ACL_CUR_USER + test_wrapper $gobject $gattr + destroy_object $gobject + done + done + done +done + +log_pass "DOS & BSD'ish attributes provide the access limitation as expected." diff --git a/tests/sys/cddl/zfs/tests/acl/cifs/cifs_test.sh b/tests/sys/cddl/zfs/tests/acl/cifs/cifs_test.sh new file mode 100755 index 00000000000..01a14aac61e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/cifs/cifs_test.sh @@ -0,0 +1,116 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case cifs_attr_001_pos cleanup +cifs_attr_001_pos_head() +{ + atf_set "descr" "Verify set/clear DOS attributes will succeed while user haswrite_attributes permission or PRIV_FILE_OWNER privilege" + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" runwattr +} +cifs_attr_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/cifs.kshlib + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cifs_attr_001_pos.ksh || atf_fail "Testcase failed" +} +cifs_attr_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/cifs.kshlib + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cifs_attr_002_pos cleanup +cifs_attr_002_pos_head() +{ + atf_set "descr" "Verify set/clear BSD'ish attributes will succeed while user hasPRIV_FILE_FLAG_SET/PRIV_FILE_FLAG_CLEAR privilege" + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" runwattr +} +cifs_attr_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/cifs.kshlib + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cifs_attr_002_pos.ksh || atf_fail "Testcase failed" +} +cifs_attr_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/cifs.kshlib + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cifs_attr_003_pos cleanup +cifs_attr_003_pos_head() +{ + atf_set "descr" "Verify DOS & BSD'ish attributes will provide theaccess limitation as expected." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" runat +} +cifs_attr_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/cifs.kshlib + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cifs_attr_003_pos.ksh || atf_fail "Testcase failed" +} +cifs_attr_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/cifs.kshlib + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case cifs_attr_001_pos + atf_add_test_case cifs_attr_002_pos + atf_add_test_case cifs_attr_003_pos +} diff --git a/tests/sys/cddl/zfs/tests/acl/cleanup.ksh b/tests/sys/cddl/zfs/tests/acl/cleanup.ksh new file mode 100644 index 00000000000..c0b6d1dc8c7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/cleanup.ksh @@ -0,0 +1,44 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/acl/acl_common.kshlib + + +cleanup_user_group + +# restore the state of svc:/network/nis/client:default +if [[ -e $NISSTAFILE ]]; then + log_must $SVCADM enable svc:/network/nis/client:default + log_must $RM -f $NISSTAFILE +fi + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/Makefile b/tests/sys/cddl/zfs/tests/acl/nontrivial/Makefile new file mode 100644 index 00000000000..c77190f6a64 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/Makefile @@ -0,0 +1,40 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/acl/nontrivial +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= zfs_acl_chmod_001_neg.ksh +${PACKAGE}FILES+= zfs_acl_chmod_002_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_aclmode_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_compact_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_delete_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_inherit_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_inherit_002_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_inherit_003_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_inherit_004_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_owner_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_rwacl_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_rwx_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_rwx_002_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_rwx_003_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_rwx_004_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_xattr_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_chmod_xattr_002_pos.ksh +${PACKAGE}FILES+= zfs_acl_cp_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_cp_002_pos.ksh +${PACKAGE}FILES+= zfs_acl_cpio_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_cpio_002_pos.ksh +${PACKAGE}FILES+= zfs_acl_find_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_ls_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_mv_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_tar_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_tar_002_pos.ksh + +ATF_TESTS_KSH93+= nontrivial_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +.include diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/nontrivial_test.sh b/tests/sys/cddl/zfs/tests/acl/nontrivial/nontrivial_test.sh new file mode 100755 index 00000000000..01abe61d532 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/nontrivial_test.sh @@ -0,0 +1,695 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_acl_chmod_001_neg cleanup +zfs_acl_chmod_001_neg_head() +{ + atf_set "descr" "Verify illegal operating to ACL, it will fail." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_002_pos cleanup +zfs_acl_chmod_002_pos_head() +{ + atf_set "descr" "Verify acl after upgrading." + atf_set "require.config" zfs_acl + atf_set "require.progs" zfs +} +zfs_acl_chmod_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_aclmode_001_pos cleanup +zfs_acl_chmod_aclmode_001_pos_head() +{ + atf_set "descr" "Verify chmod have correct behaviour to directory and file whenfilesystem has the different aclmode setting." + atf_set "require.config" zfs_acl + atf_set "require.progs" zfs +} +zfs_acl_chmod_aclmode_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_aclmode_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_aclmode_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_compact_001_pos cleanup +zfs_acl_chmod_compact_001_pos_head() +{ + atf_set "descr" "chmod A{+|=} should set compact ACL correctly." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_compact_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_compact_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_compact_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_delete_001_pos cleanup +zfs_acl_chmod_delete_001_pos_head() +{ + atf_set "descr" "Verify that the combined delete_child/delete permission forowner/group/everyone are correct." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_delete_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_delete_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_delete_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_inherit_001_pos cleanup +zfs_acl_chmod_inherit_001_pos_head() +{ + atf_set "descr" "Verify chmod have correct behaviour to directory and file whensetting different inherit strategies to them." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_inherit_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_inherit_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_inherit_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_inherit_002_pos cleanup +zfs_acl_chmod_inherit_002_pos_head() +{ + atf_set "descr" "Verify chmod have correct behaviour to directory and file whenfilesystem has the different aclinherit setting." + atf_set "require.config" zfs_acl + atf_set "require.progs" zfs +} +zfs_acl_chmod_inherit_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_inherit_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_inherit_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_inherit_003_pos cleanup +zfs_acl_chmod_inherit_003_pos_head() +{ + atf_set "descr" "Verify chmod have correct behaviour to directory and file whenfilesystem has the different aclinherit setting." + atf_set "require.config" zfs_acl + atf_set "require.progs" zfs +} +zfs_acl_chmod_inherit_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_inherit_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_inherit_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_inherit_004_pos cleanup +zfs_acl_chmod_inherit_004_pos_head() +{ + atf_set "descr" "Verify aclinherit=passthrough-x will inherit the 'x' bits while mode request." + atf_set "require.config" zfs_acl + atf_set "require.progs" zfs zpool +} +zfs_acl_chmod_inherit_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_inherit_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_inherit_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_owner_001_pos cleanup +zfs_acl_chmod_owner_001_pos_head() +{ + atf_set "descr" "Verify that the chown/chgrp could take owner/groupwhile permission is granted." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_owner_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_owner_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_owner_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_rwacl_001_pos cleanup +zfs_acl_chmod_rwacl_001_pos_head() +{ + atf_set "descr" "Verify chmod A[number]{+|-|=} read_acl/write_acl have correctbehaviour to access permission." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_rwacl_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_rwacl_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_rwacl_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_rwx_001_pos cleanup +zfs_acl_chmod_rwx_001_pos_head() +{ + atf_set "descr" "chmod A{+|-|=} have the correct behaviour to the ACL list." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_rwx_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_rwx_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_rwx_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_rwx_002_pos cleanup +zfs_acl_chmod_rwx_002_pos_head() +{ + atf_set "descr" "chmod A{+|-|=} read_data|write_data|execute for owner@, group@or everyone@ correctly alters mode bits." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_rwx_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_rwx_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_rwx_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_rwx_003_pos cleanup +zfs_acl_chmod_rwx_003_pos_head() +{ + atf_set "descr" "Verify that the read_data/write_data/execute permission forowner/group/everyone are correct." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_rwx_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_rwx_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_rwx_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_rwx_004_pos cleanup +zfs_acl_chmod_rwx_004_pos_head() +{ + atf_set "descr" "Verify that explicit ACL setting to specified user or group willoverride existed access rule." + atf_set "require.config" zfs_acl +} +zfs_acl_chmod_rwx_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_rwx_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_rwx_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_xattr_001_pos cleanup +zfs_acl_chmod_xattr_001_pos_head() +{ + atf_set "descr" "Verify that the permission of read_xattr/write_xattr forowner/group/everyone are correct." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" runat +} +zfs_acl_chmod_xattr_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_xattr_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_xattr_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_chmod_xattr_002_pos cleanup +zfs_acl_chmod_xattr_002_pos_head() +{ + atf_set "descr" "Verify that the permission of write_xattr forowner/group/everyone while remove extended attributes are correct." + atf_set "require.config" zfs_xattr + atf_set "require.progs" runat +} +zfs_acl_chmod_xattr_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_xattr_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_xattr_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_cp_001_pos cleanup +zfs_acl_cp_001_pos_head() +{ + atf_set "descr" "Verify that '$CP [-p]' supports ZFS ACLs." + atf_set "require.config" zfs_acl + atf_set "require.progs" zfs +} +zfs_acl_cp_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_cp_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_cp_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_cp_002_pos cleanup +zfs_acl_cp_002_pos_head() +{ + atf_set "descr" "Verify that '$CP [-p]' supports ZFS ACLs." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" zfs runat +} +zfs_acl_cp_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_cp_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_cp_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_cpio_001_pos cleanup +zfs_acl_cpio_001_pos_head() +{ + atf_set "descr" "Verify that '$CPIO' command supports to archive ZFS ACLs." + atf_set "require.config" zfs_acl + atf_set "require.progs" zfs +} +zfs_acl_cpio_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_cpio_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_cpio_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_cpio_002_pos cleanup +zfs_acl_cpio_002_pos_head() +{ + atf_set "descr" "Verify that '$CPIO' command supports to archive ZFS ACLs & xattrs." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" zfs runat +} +zfs_acl_cpio_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_cpio_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_cpio_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_find_001_pos cleanup +zfs_acl_find_001_pos_head() +{ + atf_set "descr" "Verify that '$FIND' command supports ZFS ACLs." + atf_set "require.config" zfs_acl +} +zfs_acl_find_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_find_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_find_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_ls_001_pos cleanup +zfs_acl_ls_001_pos_head() +{ + atf_set "descr" "Verify that '$LS' command supports ZFS ACLs." + atf_set "require.config" zfs_acl +} +zfs_acl_ls_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_ls_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_ls_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_mv_001_pos cleanup +zfs_acl_mv_001_pos_head() +{ + atf_set "descr" "Verify that '$MV' supports ZFS ACLs." + atf_set "require.config" zfs_acl +} +zfs_acl_mv_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_mv_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_mv_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_tar_001_pos cleanup +zfs_acl_tar_001_pos_head() +{ + atf_set "descr" "Verify that '$TAR' command supports to archive ZFS ACLs." + atf_set "require.config" zfs_acl + atf_set "require.progs" zfs +} +zfs_acl_tar_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_tar_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_tar_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_tar_002_pos cleanup +zfs_acl_tar_002_pos_head() +{ + atf_set "descr" "Verify that '$TAR' command supports to archive ZFS ACLs & xattrs." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" zfs runat +} +zfs_acl_tar_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_tar_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_tar_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_acl_chmod_001_neg + atf_add_test_case zfs_acl_chmod_002_pos + atf_add_test_case zfs_acl_chmod_aclmode_001_pos + atf_add_test_case zfs_acl_chmod_compact_001_pos + atf_add_test_case zfs_acl_chmod_delete_001_pos + atf_add_test_case zfs_acl_chmod_inherit_001_pos + atf_add_test_case zfs_acl_chmod_inherit_002_pos + atf_add_test_case zfs_acl_chmod_inherit_003_pos + atf_add_test_case zfs_acl_chmod_inherit_004_pos + atf_add_test_case zfs_acl_chmod_owner_001_pos + atf_add_test_case zfs_acl_chmod_rwacl_001_pos + atf_add_test_case zfs_acl_chmod_rwx_001_pos + atf_add_test_case zfs_acl_chmod_rwx_002_pos + atf_add_test_case zfs_acl_chmod_rwx_003_pos + atf_add_test_case zfs_acl_chmod_rwx_004_pos + atf_add_test_case zfs_acl_chmod_xattr_001_pos + atf_add_test_case zfs_acl_chmod_xattr_002_pos + atf_add_test_case zfs_acl_cp_001_pos + atf_add_test_case zfs_acl_cp_002_pos + atf_add_test_case zfs_acl_cpio_001_pos + atf_add_test_case zfs_acl_cpio_002_pos + atf_add_test_case zfs_acl_find_001_pos + atf_add_test_case zfs_acl_ls_001_pos + atf_add_test_case zfs_acl_mv_001_pos + atf_add_test_case zfs_acl_tar_001_pos + atf_add_test_case zfs_acl_tar_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_001_neg.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_001_neg.ksh new file mode 100644 index 00000000000..1bf213a30bd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_001_neg.ksh @@ -0,0 +1,151 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_001_neg.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_001_neg +# +# DESCRIPTION: +# Verify 1) Illegal options to chmod should fail. +# 2) Delete all the ACE will lead to fail. +# 3) Add ACE exceed 1024 will cause to fail. +# +# STRATEGY: +# 1. Loop root and non-root users +# 2. Verify all kinds of illegal option will lead to chmod failed. +# 3. Verify 'chmod A0-' will fail when try to delete all the ACE. +# 4. Verify 'chmod A+' will succeed when the ACE number exceed 1024. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-14) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify illegal operating to ACL, it will fail." +log_onexit cleanup + +test_requires ZFS_ACL + +function err_opts #node +{ + typeset A_opts="+A@ -A#- +A% =A^ =A# =A@ +A#\ asd \ + A+@ A-#- A+% A=^ A=# A=@ A+#" + + log_note "Illegal option to chmod should fail." + for A in ${A_opts[@]}; do + log_mustnot usr_exec $CHMOD ${A}owner@:read_data:allow $node + log_mustnot usr_exec $CHMOD A+ asd owner@:execute:deny $node + done + + typeset type_opts="everyone groups owner user@ users" + for tp in ${type_opts[@]}; do + log_mustnot usr_exec $CHMOD A+$tp:read_data:deny $node + done + + return 0 +} + +function del_all_ACE #node +{ + typeset node=$1 + typeset -i cnt + + cnt=$(count_ACE $node) + while (( cnt > 0 )); do + if (( cnt == 1 )); then + log_mustnot $CHMOD A0- $node + else + log_must $CHMOD A0- $node + fi + + (( cnt -= 1 )) + done + + return 0 +} + +function exceed_max_ACE #node +{ + typeset node=$1 + typeset -i max=1024 + typeset -i cnt + + cnt=$(count_ACE $node) + + # One more ACE exceed the max limitation. + (( max = max - cnt + 1 )) + while (( max > 0 )); do + if (( max == 1 )); then + log_mustnot $CHMOD A+owner@:read_data:allow $node + else + $CHMOD A+owner@:read_data:allow $node + if (($? != 0)); then + ((cnt = 1024 - max)) + log_fail "Add No.$cnt ACL item failed." + fi + fi + + (( max -= 1 )) + done + + return 0 +} + +typeset node +typeset func_name="err_opts del_all_ACE exceed_max_ACE" + +for usr in "root" "$ZFS_ACL_STAFF1"; do + log_must set_cur_usr $usr + + for node in $testfile $testdir; do + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir + + for func in $func_name; do + log_must eval "$func $node" + done + + log_must usr_exec $RM -rf $testfile $testdir + done +done + +log_pass "Verify illegal operating to ACL passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_002_pos.ksh new file mode 100644 index 00000000000..f814e5cbef7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_002_pos.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_002_pos.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_002_pos +# +# DESCRIPTION: +# Verify acl after upgrading. +# STRATEGY: +# 1. Create a low version fs. +# 2. Create a directory and chmod it. +# 3. Upgrade the fs. +# 4. Create a file under the directory and list it. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-06-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function acl_upgrade_cleannup +{ + datasetexists $ACL_UPGRADE_FS && \ + log_must $ZFS destroy -rR $ACL_UPGRADE_FS +} + +log_assert "Verify acl after upgrading." +log_onexit acl_upgrade_cleannup + +ACL_UPGRADE_FS=$TESTPOOL/acl_upgrade_fs.${TESTCASE_ID} + +test_requires ZFS_ACL + +log_must $ZFS create -o version=2 $ACL_UPGRADE_FS +mntpnt=$(get_prop mountpoint $ACL_UPGRADE_FS) +log_must $MKDIR $mntpnt/dir.${TESTCASE_ID} +log_must $CHMOD A+owner@:rwxp:f:allow,group@:rwxp:f:allow $mntpnt/dir.${TESTCASE_ID} +log_must $ZFS upgrade $ACL_UPGRADE_FS +log_must $TOUCH $mntpnt/dir.${TESTCASE_ID}/file.${TESTCASE_ID} +log_must eval "$LS -V $mntpnt/dir.${TESTCASE_ID}/file.${TESTCASE_ID} > /dev/null 2>&1" + +log_pass "Verify acl after upgrading." + diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_aclmode_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_aclmode_001_pos.ksh new file mode 100644 index 00000000000..42582de43b4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_aclmode_001_pos.ksh @@ -0,0 +1,490 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_aclmode_001_pos.ksh 1.3 08/08/15 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_aclmode_001_pos +# +# DESCRIPTION: +# Verify chmod have correct behaviour to directory and file when +# filesystem has the different aclmode setting +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different aclmode options, +# combine with the variable setting of aclmode: +# "discard", "groupmask", or "passthrough". +# 4. Verify each directories and files have the correct access control +# capability. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-03-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +test_requires ZFS_ACL + +function cleanup +{ + # Cleanup tarfile & basedir. + + (( ${#cwd} != 0 )) && cd $cwd + + if [[ -f $TARFILE ]]; then + log_must $RM -f $TARFILE + fi + + if [[ -d $basedir ]]; then + log_must $RM -rf $basedir + fi +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "filesystem has the different aclmode setting." +log_onexit cleanup + +# Define aclmode flag +set -A aclmode_flag discard groupmask passthrough + +set -A ace_prefix "user:$ZFS_ACL_OTHER1" \ + "user:$ZFS_ACL_OTHER2" \ + "group:$ZFS_ACL_STAFF_GROUP" \ + "group:$ZFS_ACL_OTHER_GROUP" + +set -A argv "000" "444" "644" "777" "755" "231" "562" "413" + +set -A ace_file_preset "read_data" \ + "write_data" \ + "append_data" \ + "execute" \ + "read_data/write_data" \ + "read_data/write_data/append_data" \ + "write_data/append_data" \ + "read_data/execute" \ + "write_data/append_data/execute" \ + "read_data/write_data/append_data/execute" + +# Defile the based directory and file +basedir=$TESTDIR/basedir; ofile=$basedir/ofile; odir=$basedir/odir +nfile=$basedir/nfile; ndir=$basedir/ndir + +TARFILE=$TESTDIR/tarfile + +# Verify all the node have expected correct access control +allnodes="$nfile $ndir" + +# +# According to the original bits, the input ACE access and ACE type, return the +# expect bits after 'chmod A0{+|=}'. +# +# $1 isdir indicate if the target is a directory +# $1 bits which was make up of three bit 'rwx' +# $2 bits_limit which was make up of three bit 'rwx' +# $3 ACE access which is read_data, write_data or execute +# $4 ACE type which is allow or deny +# +function cal_bits #isdir bits bits_limit acl_access ctrl +{ + typeset -i isdir=$1 + typeset -i bits=$2 + typeset -i bits_limit=$3 + typeset acl_access=$4 + typeset -i ctrl=${5:-0} + typeset flagr=0; flagw=0; flagx=0 + typeset tmpstr + + if (( ctrl == 0 )); then + if (( (( bits & 4 )) == 0 )); then + flagr=1 + fi + if (( (( bits & 2 )) == 0 )); then + flagw=1 + fi + if (( (( bits & 1 )) == 0 )); then + flagx=1 + fi + else + # + # Tricky here: + # (1) flagr is always set to be 1, + # (2) flagw & flagx is set to be 0 only while + # bits_limit has lower permissions than bits + # + + flagr=1 + flagw=1 + flagx=1 + + if (( (( bits & 2 )) != 0 )) && \ + (( (( bits_limit & 2 )) == 0 )) ; then + flagw=0 + fi + if (( (( bits & 1 )) != 0 )) && \ + (( (( bits_limit & 1 )) == 0 )) ; then + flagx=0 + fi + fi + + if (( flagr != 0 )); then + if [[ $acl_access == *"read_data"* ]]; then + if (( isdir == 0 )) ; then + tmpstr=${tmpstr}/read_data + else + tmpstr=${tmpstr}/list_directory/read_data + fi + fi + fi + + if (( flagw != 0 )); then + if [[ $acl_access == *"write_data"* ]]; then + if (( isdir == 0 )); then + tmpstr=${tmpstr}/write_data + else + tmpstr=${tmpstr}/add_file/write_data + fi + fi + + if [[ $acl_access == *"append_data"* ]]; then + if (( isdir == 0 )); then + tmpstr=${tmpstr}/append_data + else + tmpstr=${tmpstr}/add_subdirectory/append_data + fi + fi + fi + if (( flagx != 0 )); then + [[ $acl_access == *"execute"* ]] && \ + tmpstr=${tmpstr}/execute + fi + + tmpstr=${tmpstr#/} + + $ECHO "$tmpstr" +} + +# +# To translate an ace if the node is dir +# +# $1 isdir indicate if the target is a directory +# $2 acl to be translated +# +function translate_acl #isdir acl +{ + typeset -i isdir=$1 + typeset acl=$2 + typeset who prefix acltemp action + + if (( isdir != 0 )); then + who=${acl%%:*} + prefix=$who + acltemp=${acl#*:} + acltemp=${acltemp%%:*} + prefix=$prefix:$acltemp + action=${acl##*:} + + acl=$prefix:$(cal_bits $isdir 7 7 $acl 1):$action + fi + $ECHO "$acl" +} + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_aclmode # +{ + # Define the nodes which will be affected by inherit. + typeset aclmode=$1 + typeset node=$2 + typeset newmode=$3 + + # count: the ACE item to fetch + # pass: to mark if the current ACE should apply to the target + # passcnt: counter, if it achieves to maxnumber, + # then no additional ACE should apply. + # step: indicate if the ACE be split during aclmode. + + typeset -i count=0 pass=0 passcnt=0 step=0 + typeset -i bits=0 obits=0 bits_owner=0 isdir=0 + + if [[ -d $node ]]; then + (( isdir = 1 )) + fi + + (( i = maxnumber - 1 )) + count=0 + passcnt=0 + while (( i >= 0 )); do + pass=0 + step=0 + expect1=${acls[$i]} + expect2="" + + # + # aclmode=passthrough, + # no changes will be made to the ACL other than + # generating the necessary ACL entries to represent + # the new mode of the file or directory. + # + # aclmode=discard, + # delete all ACL entries that don't represent + # the mode of the file. + # + # aclmode=groupmask, + # reduce user or group permissions. The permissions are + # reduced, such that they are no greater than the group + # permission bits, unless it is a user entry that has the + # same UID as the owner of the file or directory. + # Then, the ACL permissions are reduced so that they are + # no greater than owner permission bits. + # + + case $aclmode in + passthrough) + expect1=$(translate_acl $isdir $expect1) + ;; + groupmask) + if [[ $expect1 == *":allow" ]]; then + expect2=$expect1 + who=${expect1%%:*} + prefix=$who + acltemp="" + reduce=0 + + # To determine the mask bits + # according to the entry type. + + case $who in + owner@) + pos=1 + ;; + group@) + pos=2 + ;; + everyone@) + pos=3 + ;; + user) + acltemp=${expect1#*:} + acltemp=${acltemp%%:*} + owner=$(get_owner $node) + group=$(get_group $node) + if [[ $acltemp == $owner ]]; then + pos=1 + else + pos=2 + fi + prefix=$prefix:$acltemp + ;; + group) + acltemp=${expect1#*:} + acltemp=${acltemp%%:*} + pos=2 + prefix=$prefix:$acltemp + reduce=1 + ;; + esac + + obits=$(get_substr $newmode $pos 1) + (( bits = obits )) + # + # permission should no greater than the group permission bits + # + if (( reduce != 0 )); then + (( bits &= $(get_substr $newmode 2 1) )) + + # The ACL permissions are reduced so that they are + # no greater than owner permission bits. + + (( bits_owner = $(get_substr $newmode 1 1) )) + (( bits &= bits_owner )) + fi + + if (( bits < obits )) && [[ -n $acltemp ]]; then + expect2=$prefix:$(cal_bits $isdir $obits $bits_owner $expect2 1):allow + else + expect2=$prefix:$(cal_bits $isdir $obits $obits $expect2 1):allow + + fi + + priv=$(cal_bits $isdir $obits $bits_owner $expect2 0) + expect1=$prefix:$priv:deny + step=1 + else + expect1=$(translate_acl $isdir $expect1) + fi + ;; + discard) + passcnt=maxnumber + break + ;; + esac + + if (( pass == 0 )) ; then + # Get the first ACE to do comparison + + aclcur=$(get_ACE $node $count) + aclcur=${aclcur#$count:} + if [[ -n $expect1 && $expect1 != $aclcur ]]; then + $LS -vd $node + log_fail "$i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect1" + fi + + # Get the second ACE (if should have) to do comparison + + if (( step > 0 )); then + (( count = count + step )) + + aclcur=$(get_ACE $node $count) + aclcur=${aclcur#$count:} + if [[ -n $expect2 && \ + $expect2 != $aclcur ]]; then + + $LS -vd $node + log_fail "$i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect2" + fi + fi + (( count = count + 1 )) + fi + (( i = i - 1 )) + done + + # + # If there's no any ACE be checked, it should be identify as + # an normal file/dir, verify it. + # + + if (( passcnt == maxnumber )); then + if [[ -d $node ]]; then + compare_acls $node $odir + elif [[ -f $node ]]; then + compare_acls $node $ofile + fi + + if [[ $? -ne 0 ]]; then + $LS -vd $node + log_fail "Unexpect acl: $node, $aclmode ($newmode)" + fi + fi +} + + + +typeset -i maxnumber=0 +typeset acl +typeset target + +cwd=$PWD +cd $TESTDIR + +for mode in "${aclmode_flag[@]}"; do + + # + # Set different value of aclmode + # + + log_must $ZFS set aclmode=$mode $TESTPOOL/$TESTFS + + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must usr_exec $MKDIR $basedir + + log_must usr_exec $MKDIR $odir + log_must usr_exec $TOUCH $ofile + log_must usr_exec $MKDIR $ndir + log_must usr_exec $TOUCH $nfile + + for obj in $allnodes ; do + maxnumber=0 + for preset in "${ace_file_preset[@]}"; do + for prefix in "${ace_prefix[@]}"; do + acl=$prefix:$preset + + case $(( maxnumber % 2 )) in + 0) + acl=$acl:deny + ;; + 1) + acl=$acl:allow + ;; + esac + + # + # Place on the target should succeed. + # + log_must usr_exec $CHMOD A+$acl $obj + acls[$maxnumber]=$acl + + (( maxnumber = maxnumber + 1 )) + done + done + + # Archive the file and directory + log_must $TAR cpf@ $TARFILE basedir + + if [[ -d $obj ]]; then + target=$odir + elif [[ -f $obj ]]; then + target=$ofile + fi + + for newmode in "${argv[@]}" ; do + log_must usr_exec $CHMOD $newmode $obj + log_must usr_exec $CHMOD $newmode $target + verify_aclmode $mode $obj $newmode + + # Restore the tar archive + log_must $TAR xpf@ $TARFILE + done + done + + log_must usr_exec $RM -rf $basedir $TARFILE + done +done + +log_pass "Verify chmod behaviour co-op with aclmode setting passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh new file mode 100644 index 00000000000..1f2bd53dd94 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh @@ -0,0 +1,274 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_compact_001_pos.ksh 1.5 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib +. $STF_SUITE/tests/acl/cifs/cifs.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_compact_001_pos +# +# DESCRIPTION: +# chmod A{+|-|=} could set compact ACL correctly. +# +# STRATEGY: +# 1. Loop root and non-root user. +# 2. Get the random compact ACL string. +# 4. Separately chmod +|-|= +# 5. Check compact ACL display as expected +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +test_requires ZFS_ACL + +log_assert "chmod A{+|=} should set compact ACL correctly." +log_onexit cleanup + +set -A a_flag owner group everyone +set -A a_access r w x p d D a A R W c C o s +set -A a_inherit_object f d +set -A a_inherit_strategy i n +set -A a_type allow deny + +typeset cifs="" + +if cifs_supported ; then + cifs="true" +fi + +# +# Get a random item from an array. +# +# $1 the base set +# +function random_select #array_name +{ + typeset arr_name=$1 + typeset -i ind + + eval typeset -i cnt=\${#${arr_name}[@]} + (( ind = $RANDOM % cnt )) + + eval print \${${arr_name}[$ind]} +} + +# +# Create a random string according to array name, the item number and +# separated tag. +# +# $1 array name where the function get the elements +# $2 the items number which you want to form the random string +# $3 the separated tag +# +function form_random_str # +{ + typeset arr_name=$1 + typeset -i count=${2:-1} + typeset sep=${3:-""} + + typeset str="" + while (( count > 0 )); do + str="${str}$(random_select $arr_name)${sep}" + + (( count -= 1 )) + done + + print $str +} + +# +# According to the input ACE access,ACE type, and inherit flags, return the +# expect compact ACE that could be used by chmod A0{+|=}'. +# +# $1 ACE flag which is owner, group, or everyone +# $2 ACE access generated by the element of a_access +# $3 ACE inherit_object generated by the element of a_inherit_object +# $4 ACE inherit_strategy generated by the element of a_inherit_strategy +# $5 ACE type which is allow or deny +# +function cal_ace # acl_flag acl_access \ + # acl_inherit_object acl_inherit_strategy acl_type +{ + typeset acl_flag=$1 + typeset acl_access=$2 + typeset acl_inherit_object=$3 + typeset acl_inherit_strategy=$4 + typeset acl_type=$5 + + tmp_ace=${acl_flag}@: + + for element in ${a_access[@]} ; do + if [[ $acl_access == *"$element"* ]]; then + tmp_ace="${tmp_ace}${element}" + else + tmp_ace="${tmp_ace}-" + fi + done + tmp_ace=${tmp_ace}: + + for element in ${a_inherit_object[@]} ; do + if [[ $acl_inherit_object == *"$element"* ]]; then + tmp_ace="${tmp_ace}${element}" + else + tmp_ace="${tmp_ace}-" + fi + done + for element in ${a_inherit_strategy[@]} ; do + if [[ $acl_inherit_strategy == *"$element"* ]]; then + tmp_ace="${tmp_ace}${element}" + else + tmp_ace="${tmp_ace}-" + fi + done + + if [[ -n $cifs ]]; then + tmp_ace=${tmp_ace}---:${acl_type} + else + tmp_ace=${tmp_ace}--:${acl_type} + fi + + print "${tmp_ace}" +} + +# +# Check if chmod set the compact ACE correctly. +# +function check_test_result # node acl_flag acl_access \ + # acl_inherit_object acl_inherit_strategy acl_type +{ + typeset node=$1 + typeset acl_flag=$2 + typeset acl_access=$3 + typeset acl_inherit_object=$4 + typeset acl_inherit_strategy=$5 + typeset acl_type=$6 + + typeset expect_ace=$(cal_ace "$acl_flag" "$acl_access" \ + "$acl_inherit_object" "$acl_inherit_strategy" "$acl_type") + + typeset cur_ace=$(get_ACE $node 0 "compact") + + if [[ $cur_ace != $expect_ace ]]; then + log_fail "FAIL: Current map($cur_ace) != \ + expected ace($expect_ace)" + fi +} + +function test_chmod_map # +{ + typeset node=$1 + typeset acl_flag acl_access acl_inherit_object acl_inherit_strategy acl_type + typeset -i cnt + + if (( ${#node} == 0 )); then + log_fail "FAIL: file name or directroy name is not defined." + fi + + # Get ACL flag, access & type + acl_flag=$(form_random_str a_flag) + (( cnt = ($RANDOM % ${#a_access[@]}) + 1 )) + acl_access=$(form_random_str a_access $cnt) + acl_access=${acl_access%/} + acl_type=$(form_random_str a_type 1) + + acl_spec=${acl_flag}@:${acl_access} + if [[ -d $node ]]; then + # Get ACL inherit_object & inherit_strategy + (( cnt = ($RANDOM % ${#a_inherit_object[@]}) + 1 )) + acl_inherit_object=$(form_random_str a_inherit_object $cnt) + (( cnt = ($RANDOM % ${#a_inherit_strategy[@]}) + 1 )) + acl_inherit_strategy=$(form_random_str a_inherit_strategy $cnt) + acl_spec=${acl_spec}:${acl_inherit_object}${acl_inherit_strategy} + fi + acl_spec=${acl_spec}:${acl_type} + + # Set the initial map and back the initial ACEs + typeset orig_ace=$TMPDIR/orig_ace.${TESTCASE_ID} + typeset cur_ace=$TMPDIR/cur_ace.${TESTCASE_ID} + + for operator in "A0+" "A0="; do + log_must usr_exec eval "$LS -Vd $node > $orig_ace" + + # To "A=", firstly add one ACE which can't modify map + if [[ $operator == "A0=" ]]; then + log_must $CHMOD A0+user:$ZFS_ACL_OTHER1:execute:deny \ + $node + fi + log_must usr_exec $CHMOD ${operator}${acl_spec} $node + + check_test_result \ + "$node" "$acl_flag" "$acl_access" \ + "$acl_inherit_object" "$acl_inherit_strategy" \ + "$acl_type" + + # Check "chmod A-" + log_must usr_exec $CHMOD A0- $node + log_must usr_exec eval "$LS -Vd $node > $cur_ace" + + $DIFF $orig_ace $cur_ace + [[ $? -ne 0 ]] && \ + log_fail "FAIL: 'chmod A-' failed." + done + + [[ -f $orig_ace ]] && log_must usr_exec $RM -f $orig_ace + [[ -f $cur_ace ]] && log_must usr_exec $RM -f $cur_ace +} + +for user in root $ZFS_ACL_STAFF1; do + set_cur_usr $user + + typeset -i loop_cnt=2 + while (( loop_cnt > 0 )); do + log_must usr_exec $TOUCH $testfile + test_chmod_map $testfile + log_must $RM -f $testfile + + log_must usr_exec $MKDIR $testdir + test_chmod_map $testdir + log_must $RM -rf $testdir + + (( loop_cnt -= 1 )) + done +done + +log_pass "chmod A{+|=} set compact ACL correctly." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_delete_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_delete_001_pos.ksh new file mode 100644 index 00000000000..4b78634f283 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_delete_001_pos.ksh @@ -0,0 +1,321 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_delete_001_pos.ksh 1.6 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_delete_001_pos +# +# DESCRIPTION: +# Verify that the combined delete_child/delete permission for +# owner/group/everyone are correct. +# +# ------------------------------------------------------- +# | Parent Dir | Target Object Permissions | +# | permissions | | +# ------------------------------------------------------- +# | | ACL Allows | ACL Denies| Delete | +# | | Delete | Delete | unspecified| +# ------------------------------------------------------- +# | ACL Allows | Permit | Permit | Permit | +# | DELETE_CHILD | | +# ------------------------------------------------------- +# | ACL Denies | Permit | Deny | Deny | +# | DELETE_CHILD | | | | +# ------------------------------------------------------- +# | ACL specifies | | | | +# | only allows | Permit | Permit | Permit | +# | write and | | | | +# | execute | | | | +# ------------------------------------------------------- +# | ACL denies | | | | +# | write and | Permit | Deny | Deny | +# | execute | | | | +# ------------------------------------------------------- +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special ACE combination to the file and directory +# 3. Try to remove the file +# 4. Verify that combined permissions for owner/group/everyone are correct. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + [[ ! -e $TESTDIR/$ARCHIVEFILE ]] && return 0 + + if [[ ! -e $target ]]; then + log_must $TAR xpf $TESTDIR/$ARCHIVEFILE + fi + + (( ${#cwd} != 0 )) && cd $cwd + cleanup_test_files $TESTDIR/basedir + log_must $RM -f $TESTDIR/$ARCHIVEFILE + return 0 +} + +#owner@ group group_users other_users +set -A users \ +"root" "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ +"$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF_GROUP" "$ZFS_ACL_STAFF2" "$ZFS_ACL_OTHER1" + +set -A access_parent \ + "delete_child:allow" \ + "delete_child:deny" \ + "write_data:allow" \ + "write_data:deny" \ + "delete_child:deny write_data:allow" \ + "delete_child:allow write_data:deny" + +set -A access_target \ + "delete:allow" \ + "delete:deny" \ + "" + +set -A a_flag "owner@" "group@" "everyone@" "user:$ZFS_ACL_STAFF1" + +log_assert "Verify that the combined delete_child/delete permission for" \ + "owner/group/everyone are correct." +log_onexit cleanup + +function operate_node #user node +{ + typeset user=$1 + typeset node=$2 + typeset ret + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + if [[ -d $node ]]; then + chgusr_exec $user $RM -rf $node ; ret=$? + else + chgusr_exec $user $RM -f $node ; ret=$? + fi + + if [[ -e $node ]]; then + if [[ $ret -eq 0 ]]; then + log_note "$node not removed, but return code is 0." + return 1 + fi + else + log_must $TAR xpf $TESTDIR/$ARCHIVEFILE + if [[ $ret -ne 0 ]]; then + log_note "$node removed, but return code is $ret." + return 1 + fi + fi + return $ret +} + +function logname #acl_parent acl_target user +{ + typeset acl_parent=$1 + typeset acl_target=$2 + typeset user=$3 + + # To super user, read and write deny permission was override. + if [[ $user == root || $acl_target == *:allow ]]; then + print "log_must" + elif [[ $acl_parent == *"delete_child"* ]]; then + if [[ $acl_parent == *"delete_child:allow"* ]]; then + print "log_must" + else + print "log_mustnot" + fi + elif [[ $acl_parent == *"write_data"* ]]; then + if [[ $acl_parent == *"write_data:allow"* ]]; then + print "log_must" + else + print "log_mustnot" + fi + else + print "log_mustnot" + fi +} + +function check_chmod_results #node flag acl_parent acl_target g_usr o_usr +{ + typeset node=$1 + typeset flag=$2 + typeset acl_parent=$3 + typeset acl_target=$2:$4 + typeset g_usr=$5 + typeset o_usr=$6 + typeset log acl_tmp + + for acl in $acl_parent ; do + acl_tmp="$2:$acl $acl_tmp" + done + acl_parent=$acl_tmp + + if [[ $flag == "owner@" || $flag == "everyone@" ]]; then + log=$(logname "$acl_parent" $acl_target $ZFS_ACL_CUR_USER) + $log operate_node $ZFS_ACL_CUR_USER $node + fi + if [[ $flag == "group@" || $flag == "everyone@" ]]; then + log=$(logname "$acl_parent" $acl_target $g_usr) + $log operate_node $g_usr $node + fi + if [[ $flag == "everyone@" ]]; then + log=$(logname "$acl_parent" $acl_target $o_usr) + $log operate_node $o_usr $node + fi + if [[ $flag == "user:"* ]]; then + typeset user=${flag#user:} + log=$(logname "$acl_parent" $acl_target $user) + $log operate_node $user $node + fi +} + +function test_chmod_basic_access #node g_usr o_usr +{ + typeset node=${1%/} + typeset g_usr=$2 + typeset o_usr=$3 + typeset flag acl_p acl_t parent + typeset -i i=0 + + parent=${node%/*} + + for flag in ${a_flag[@]}; do + for acl_p in "${access_parent[@]}"; do + i=0 + for acl in $acl_p ; do + log_must usr_exec $CHMOD A+$flag:$acl $parent + (( i = i + 1)) + done + + for acl_t in "${access_target[@]}"; do + [[ -n $acl_t ]] && \ + log_must usr_exec $CHMOD A+$flag:$acl_t $node + + log_must $TAR cpf $TESTDIR/$ARCHIVEFILE basedir + + check_chmod_results "$node" "$flag" \ + "$acl_p" "$acl_t" "$g_usr" "$o_usr" + + [[ -n $acl_t ]] && \ + log_must usr_exec $CHMOD A0- $node + done + + while (( i > 0 )); do + log_must usr_exec $CHMOD A0- $parent + (( i = i - 1 )) + done + done + done +} + +function setup_test_files #base_node user group +{ + typeset base_node=$1 + typeset user=$2 + typeset group=$3 + + cleanup_test_files $base_node + + log_must $MKDIR -p $base_node + log_must $CHOWN $user:$group $base_node + + log_must set_cur_usr $user + + # Prepare all files/sub-dirs for testing. + file0=$base_node/testfile_rm + dir0=$base_node/testdir_rm + + log_must usr_exec $TOUCH $file0 + log_must usr_exec $CHMOD 444 $file0 + + log_must usr_exec $MKDIR -p $dir0 + log_must usr_exec $CHMOD 444 $dir0 + + log_must usr_exec $CHMOD 555 $base_node + return 0 +} + +function cleanup_test_files #base_node +{ + typeset base_node=$1 + + if [[ -d $base_node ]]; then + log_must $RM -rf $base_node + elif [[ -e $base_node ]]; then + log_must $RM -f $base_node + fi + + return 0 +} + +typeset cwd=$PWD +typeset ARCHIVEFILE=archive.tar + +test_requires ZFS_ACL + +typeset -i i=0 +typeset -i j=0 +typeset target +cd $TESTDIR +while (( i < ${#users[@]} )); do + setup_test_files $TESTDIR/basedir ${users[i]} ${users[((i+1))]} + + j=0 + while (( j < 1 )); do + eval target=\$file$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + eval target=\$dir$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + (( j = j + 1 )) + done + + (( i += 4 )) +done + +log_pass "Verify that the combined delete_child/delete permission for" \ + "owner/group/everyone are correct." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_001_pos.ksh new file mode 100644 index 00000000000..d5a8020548e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_001_pos.ksh @@ -0,0 +1,193 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_inherit_001_pos.ksh 1.5 09/05/19 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_inherit_001_pos +# +# DESCRIPTION: +# Verify chmod have correct behaviour to directory and file when setting +# different inherit strategy to them. +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different inherite options. +# 4. Then create nested directories and files like the following. +# +# _ odir4 +# |_ ofile4 +# _ odir3 _| +# |_ ofile3 +# _ odir1 _| +# |_ ofile2 +# basefile | +# chmod --> basedir -| +# |_ nfile1 +# |_ ndir1 _ +# |_ nfile2 +# |_ ndir2 _ +# |_ nfile3 +# |_ ndir3 +# +# 5. Verify each directories and files have the correct access control +# capability. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-11-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if [[ -f $basefile ]]; then + log_must $RM -f $basefile + fi + if [[ -d $basedir ]]; then + log_must $RM -rf $basedir + fi +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "setting different inherit strategies to them." +log_onexit cleanup + +# Define inherit flag +set -A object_flag file_inherit dir_inherit file_inherit/dir_inherit +set -A strategy_flag "" inherit_only no_propagate inherit_only/no_propagate + +# Defile the based directory and file +basedir=$TESTDIR/basedir; basefile=$TESTDIR/basefile + +test_requires ZFS_ACL + +# Define the existed files and directories before chmod +odir1=$basedir/odir1; odir2=$odir1/odir2; odir3=$odir2/odir3 +ofile1=$basedir/ofile1; ofile2=$odir1/ofile2; ofile3=$odir2/ofile3 + +# Define the files and directories will be created after chmod +ndir1=$basedir/ndir1; ndir2=$ndir1/ndir2; ndir3=$ndir2/ndir3 +nfile1=$basedir/nfile1; nfile2=$ndir1/nfile2; nfile3=$ndir2/nfile3 + +# Verify all the node have expected correct access control +allnodes="$basedir $ndir1 $ndir2 $ndir3 $nfile1 $nfile2 $nfile3" +allnodes="$allnodes $odir1 $odir2 $odir3 $ofile1 $ofile2 $ofile3" + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit # [strategy] +{ + # Define the nodes which will be affected by inherit. + typeset inherit_nodes + typeset obj=$1 + typeset str=$2 + + log_must usr_exec $MKDIR -p $ndir3 + log_must usr_exec $TOUCH $nfile1 $nfile2 $nfile3 + + # Except for inherit_only, the basedir was affected always. + if [[ $str != *"inherit_only"* ]]; then + inherit_nodes="$inherit_nodes $basedir" + fi + # Get the files which inherited ACE. + if [[ $obj == *"file_inherit"* ]]; then + inherit_nodes="$inherit_nodes $nfile1" + + if [[ $str != *"no_propagate"* ]]; then + inherit_nodes="$inherit_nodes $nfile2 $nfile3" + fi + fi + # Get the directores which inherited ACE. + if [[ $obj == *"dir_inherit"* ]]; then + inherit_nodes="$inherit_nodes $ndir1" + + if [[ $str != *"no_propagate"* ]]; then + inherit_nodes="$inherit_nodes $ndir2 $ndir3" + fi + fi + + for node in $allnodes; do + if [[ " $inherit_nodes " == *" $node "* ]]; then + log_mustnot chgusr_exec $ZFS_ACL_OTHER1 $LS -vd $node \ + > /dev/null 2>&1 + else + log_must chgusr_exec $ZFS_ACL_OTHER1 $LS -vd $node \ + > /dev/null 2>&1 + fi + done +} + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + for obj in "${object_flag[@]}"; do + for str in "${strategy_flag[@]}"; do + typeset inh_opt=$obj + (( ${#str} != 0 )) && inh_opt=$inh_opt/$str + aclspec="A+user:$ZFS_ACL_OTHER1:read_acl:$inh_opt:deny" + + log_must usr_exec $MKDIR $basedir + log_must usr_exec $TOUCH $basefile + log_must usr_exec $MKDIR -p $odir3 + log_must usr_exec $TOUCH $ofile1 $ofile2 $ofile3 + + # + # Inherit flag can only be placed on a directory, + # otherwise it will fail. + # + log_must usr_exec $CHMOD $aclspec $basefile + + # + # Place on a directory should succeed. + # + log_must usr_exec $CHMOD $aclspec $basedir + + verify_inherit $obj $str + + log_must usr_exec $RM -rf $basefile $basedir + done + done +done + +log_pass "Verify chmod inherit behaviour passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_002_pos.ksh new file mode 100644 index 00000000000..6c250e98f35 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_002_pos.ksh @@ -0,0 +1,415 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_inherit_002_pos.ksh 1.3 08/02/27 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib +. $STF_SUITE/tests/acl/cifs/cifs.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_inherit_002_pos +# +# DESCRIPTION: +# Verify chmod have correct behaviour to directory and file when +# filesystem has the different aclinherit setting +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different inherite options, +# combine with the variable setting of aclinherit: +# "discard", "noallow", "secure" or "passthrough". +# 4. Then create nested directories and files like the following. +# +# ofile +# odir +# chmod --> basedir -| +# |_ nfile1 +# |_ ndir1 _ +# |_ nfile2 +# |_ ndir2 _ +# |_ nfile3 +# |_ ndir3 +# +# 5. Verify each directories and files have the correct access control +# capability. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-03-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset dir + + # Cleanup basedir, compared file and dir. + + if [[ -f $ofile ]]; then + log_must $RM -f $ofile + fi + + for dir in $odir $basedir ; do + if [[ -d $dir ]]; then + log_must $RM -rf $dir + fi + done +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "filesystem has the different aclinherit setting." +log_onexit cleanup + +# Define inherit flag +set -A aclinherit_flag discard noallow secure passthrough +set -A object_flag file_inherit dir_inherit file_inherit/dir_inherit +set -A strategy_flag "" inherit_only no_propagate inherit_only/no_propagate + +typeset ace_prefix1="user:$ZFS_ACL_OTHER1" +typeset ace_prefix2="user:$ZFS_ACL_OTHER2" +typeset ace_discard ace_noallow ace_secure ace_passthrough +typeset ace_secure_new + +# Defile the based directory and file +basedir=$TESTDIR/basedir; ofile=$TESTDIR/ofile; odir=$TESTDIR/odir + +test_requires ZFS_ACL + +# Define the files and directories will be created after chmod +ndir1=$basedir/ndir1; ndir2=$ndir1/ndir2; ndir3=$ndir2/ndir3 +nfile1=$basedir/nfile1; nfile2=$ndir1/nfile2; nfile3=$ndir2/nfile3 + +# Verify all the node have expected correct access control +allnodes="$ndir1 $ndir2 $ndir3 $nfile1 $nfile2 $nfile3" + +typeset cifs="" +if cifs_supported ; then + cifs="true" +fi + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit # [strategy] +{ + # Define the nodes which will be affected by inherit. + typeset inherit_nodes + typeset inherit=$1 + typeset obj=$2 + typeset str=$3 + + # count: the ACE item to fetch + # pass: to mark if the current ACE should apply to the target + # maxnumber: predefine as 4 + # passcnt: counter, if it achieves to maxnumber, + # then no additional ACE should apply. + # isinherit: indicate if the current target is in the inherit list. + # step: indicate if the ACE be split during inherit. + + typeset -i count=0 pass=0 passcnt=0 isinherit=0 maxnumber=4 step=0 + + log_must usr_exec $MKDIR -p $ndir3 + log_must usr_exec $TOUCH $nfile1 $nfile2 $nfile3 + + # Get the files which inherited ACE. + if [[ $obj == *"file_inherit"* ]]; then + inherit_nodes="$inherit_nodes $nfile1" + + if [[ $str != *"no_propagate"* ]]; then + inherit_nodes="$inherit_nodes $nfile2 $nfile3" + fi + fi + # Get the directores which inherited ACE. + if [[ $obj == *"dir_inherit"* ]]; then + inherit_nodes="$inherit_nodes $ndir1" + + if [[ $str != *"no_propagate"* ]]; then + inherit_nodes="$inherit_nodes $ndir2 $ndir3" + fi + fi + + for node in $allnodes; do + step=0 + if [[ " $inherit_nodes " == *" $node "* ]]; then + isinherit=1 + if [[ -d $node ]] ; then + step=1 + fi + else + isinherit=0 + fi + + i=0 + count=0 + passcnt=0 + while (( i < maxnumber )); do + pass=0 + eval expect1=\$acl$i + expect2=$expect1 + + # + # aclinherit=passthrough, + # inherit all inheritable ACL entries without any + # modifications made to the ACL entries when they + # are inherited. + # + # aclinherit=secure, + # any inheritable ACL entries will remove + # write_acl and write_owner permissions when the ACL entry is + # inherited. + # + # aclinherit=noallow, + # only inherit inheritable ACE that specify "deny" permissions + # + # aclinherit=discard + # will not inherit any ACL entries + # + + case $inherit in + passthrough) + ;; + secure) + if [[ $expect1 == *":allow" ]] ; then + eval expect2=\$acls$i + fi + ;; + noallow) + if [[ $expect1 == *":allow" ]] ; then + pass=1 + (( passcnt = passcnt + 1 )) + fi + ;; + discard) + passcnt=maxnumber + break + ;; + esac + + if (( pass == 0 )) ; then + acltemp=${expect2%:*} + acltemp=${acltemp%:*} + aclaction=${expect2##*:} + + if [[ -n $cifs ]]; then + expect2=${acltemp}:inherited:${aclaction} + else + expect2=${acltemp}:${aclaction} + fi + + acltemp=${expect1%:*} + + if [[ -d $node ]]; then + if [[ $expect1 == *"no_propagate"* ]] ; then + + # + # if no_propagate is set, + # then clear all inherit flags, + # only one ACE should left. + # + + step=0 + expect1="" + + elif [[ $expect1 != *"inherit_only"* ]]; then + + # + # directory should append + # "inherit_only" if not have + # + + if [[ -n $cifs ]]; then + + expect1=${acltemp}/inherit_only/inherited:${aclaction} + else + expect1=${acltemp}/inherit_only:${aclaction} + fi + elif [[ -n $cifs ]]; then + expect1=${acltemp}/inherited:${aclaction} + fi + + # + # cleanup the first ACE if the directory + # not in inherit list + # + + if (( isinherit == 0 )); then + expect1="" + fi + elif [[ -f $node ]] ; then + expect1="" + fi + + # Get the first ACE to do comparison + + aclcur=$(get_ACE $node $count) + aclcur=${aclcur#$count:} + if [[ -n $expect1 && $expect1 != $aclcur ]]; then + $LS -vd $basedir + $LS -vd $node + log_fail "$inherit $i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect1" + fi + + # Get the second ACE (if should have) to do comparison + + if (( step > 0 )); then + (( count = count + step )) + + aclcur=$(get_ACE $node $count) + aclcur=${aclcur#$count:} + if [[ -n $expect2 && \ + $expect2 != $aclcur ]]; then + + $LS -vd $basedir + $LS -vd $node + log_fail "$inherit $i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect2" + fi + fi + (( count = count + 1 )) + fi + (( i = i + 1 )) + done + + # + # If there's no any ACE be checked, it should be identify as + # an normal file/dir, verify it. + # + + if (( passcnt == maxnumber )); then + if [[ -d $node ]]; then + compare_acls $node $odir + elif [[ -f $node ]]; then + compare_acls $node $ofile + fi + + if [[ $? -ne 0 ]]; then + $LS -vd $basedir + $LS -vd $node + log_fail "Unexpect acl: $node, $inherit ($str)" + fi + fi + done +} + +typeset -i i=0 +typeset acl0 acl1 acl2 acl3 +typeset acls0 acls1 acls2 acls3 + +# +# Set aclmode=passthrough to make sure +# the acl will not change during chmod. +# A general testing should verify the combination of +# aclmode/aclinherit works well, +# here we just simple test them separately. +# + +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS + +for inherit in "${aclinherit_flag[@]}"; do + + # + # Set different value of aclinherit + # + + log_must $ZFS set aclinherit=$inherit $TESTPOOL/$TESTFS + + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + for obj in "${object_flag[@]}"; do + for str in "${strategy_flag[@]}"; do + typeset inh_opt=$obj + (( ${#str} != 0 )) && inh_opt=$inh_opt/$str + + # + # Prepare 4 ACES, which should include : + # deny -> to verify "noallow" + # write_acl/write_owner -> to verify "secure" + # + + acl0="$ace_prefix1:read_xattr/write_acl/write_owner:$inh_opt:deny" + acl1="$ace_prefix2:read_xattr/write_acl/write_owner:$inh_opt:allow" + acl2="$ace_prefix1:read_xattr:$inh_opt:deny" + acl3="$ace_prefix2:read_xattr:$inh_opt:allow" + + # + # The ACE filtered by write_acl/write_owner + # + + acls0="$ace_prefix1:read_xattr:$inh_opt:deny" + acls1="$ace_prefix2:read_xattr:$inh_opt:allow" + acls2=$acl2 + acls3=$acl3 + + + # + # Create basedir and tmp dir/file + # for comparison. + # + + log_note "$user: $CHMOD $acl $basedir" + log_must usr_exec $MKDIR $basedir + log_must usr_exec $MKDIR $odir + log_must usr_exec $TOUCH $ofile + + i=3 + while (( i >= 0 )); do + eval acl=\$acl$i + + # + # Place on a directory should succeed. + # + log_must usr_exec $CHMOD A+$acl $basedir + + (( i = i - 1 )) + done + + verify_inherit $inherit $obj $str + + log_must usr_exec $RM -rf $ofile $odir $basedir + done + done + done +done + +log_pass "Verify chmod inherit behaviour co-op with aclinherit setting passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_003_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_003_pos.ksh new file mode 100644 index 00000000000..8a398a676d6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_003_pos.ksh @@ -0,0 +1,449 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_inherit_003_pos.ksh 1.1 08/08/15 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib +. $STF_SUITE/tests/acl/cifs/cifs.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_inherit_003_pos +# +# DESCRIPTION: +# Verify chmod have correct behaviour to directory and file when +# filesystem has the different aclinherit setting +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different inherite options, +# combine with the variable setting of aclinherit: +# "discard", "noallow", "secure" or "passthrough". +# 4. Then create nested directories and files like the following. +# +# ofile +# odir +# chmod --> basedir -| +# |_ nfile1 +# |_ ndir1 _ +# |_ nfile2 +# |_ ndir2 _ +# |_ nfile3 +# |_ ndir3 +# +# 5. Verify each directories and files have the correct access control +# capability. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset dir + + # Cleanup basedir, compared file and dir. + + if [[ -f $ofile ]]; then + log_must $RM -f $ofile + fi + + for dir in $odir $basedir ; do + if [[ -d $dir ]]; then + log_must $RM -rf $dir + fi + done +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "filesystem has the different aclinherit setting." +log_onexit cleanup + +# Define inherit flag +set -A aclinherit_flag discard noallow secure passthrough +set -A object_flag "f-" "-d" "fd" +set -A strategy_flag "--" "i-" "-n" "in" + +typeset ace_prefix1="owner@" +typeset ace_prefix2="group@" +typeset ace_prefix3="everyone@" +typeset ace_discard ace_noallow ace_secure ace_passthrough +typeset ace_secure_new + +# Defile the based directory and file +basedir=$TESTDIR/basedir; ofile=$TESTDIR/ofile; odir=$TESTDIR/odir + +test_requires ZFS_ACL + +# Define the files and directories will be created after chmod +ndir1=$basedir/ndir1; ndir2=$ndir1/ndir2; ndir3=$ndir2/ndir3 +nfile1=$basedir/nfile1; nfile2=$ndir1/nfile2; nfile3=$ndir2/nfile3 + +# Verify all the node have expected correct access control +allnodes="$ndir1 $ndir2 $ndir3 $nfile1 $nfile2 $nfile3" + +typeset cifs="" +if cifs_supported ; then + cifs="true" +fi + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit # [strategy] +{ + # Define the nodes which will be affected by inherit. + typeset inherit_nodes + typeset inherit=$1 + typeset obj=$2 + typeset str=$3 + + # count: the ACE item to fetch + # pass: to mark if the current ACE should apply to the target + # maxnumber: predefine as 4 + # passcnt: counter, if it achieves to maxnumber, + # then no additional ACE should apply. + # isinherit: indicate if the current target is in the inherit list. + # step: indicate if the ACE be split during inherit. + + typeset -i count=0 pass=0 passcnt=0 isinherit=0 maxnumber=4 step=0 + + log_must usr_exec $MKDIR -p $ndir3 + log_must usr_exec $TOUCH $nfile1 $nfile2 $nfile3 + + # Get the files which inherited ACE. + if [[ $(get_substr $obj 1 1) == f ]]; then + inherit_nodes="$inherit_nodes $nfile1" + + if [[ $(get_substr $str 2 1) != n ]]; then + inherit_nodes="$inherit_nodes $nfile2 $nfile3" + fi + fi + # Get the directores which inherited ACE. + if [[ $(get_substr $obj 2 1) == d ]]; then + inherit_nodes="$inherit_nodes $ndir1" + + if [[ $(get_substr $str 2 1) != n ]]; then + inherit_nodes="$inherit_nodes $ndir2 $ndir3" + fi + fi + + for node in $allnodes; do + step=0 + if [[ " $inherit_nodes " == *" $node "* ]]; then + isinherit=1 + if [[ -d $node ]] ; then + step=1 + fi + else + isinherit=0 + fi + + i=0 + count=0 + passcnt=0 + while (( i < maxnumber )); do + pass=0 + eval expect1=\$acl$i + expect2=$expect1 + + # + # aclinherit=passthrough, + # inherit all inheritable ACL entries without any + # modifications made to the ACL entries when they + # are inherited. + # + # aclinherit=secure, + # any inheritable ACL entries will remove + # write_acl and write_owner permissions when the ACL entry is + # inherited. + # + # aclinherit=noallow, + # only inherit inheritable ACE that specify "deny" permissions + # + # aclinherit=discard + # will not inherit any ACL entries + # + + case $inherit in + passthrough) + if [[ -z $cifs ]]; then + break + fi + + action=${expect1##*:} + expect1=${expect1%:$action} + expect1=${expect1%-} + expect1=${expect1%I} + expect1=${expect1}I:$action + ;; + secure) + eval expect2=\$acls$i + ;; + noallow) + if [[ $expect1 == *":allow" ]] ; then + pass=1 + (( passcnt = passcnt + 1 )) + else + eval expect2=\$acls$i + fi + ;; + discard) + passcnt=maxnumber + break + ;; + esac + + if (( pass == 0 )) ; then + acltemp=${expect2%:*} + acltemp=${acltemp%:*} + aclaction=${expect2##*:} + + if [[ -n $cifs ]]; then + expect2=${acltemp}:------I:${aclaction} + else + expect2=${acltemp}:------:${aclaction} + fi + + acltemp=${expect1%:*} + inh=${acltemp##*:} + + if [[ -d $node ]]; then + if [[ $(get_substr $inh 4 1) == n ]]; then + + # + # if no_propagate is set, + # then clear all inherit flags, + # only one ACE should left. + # + + step=0 + expect1="" + + elif [[ $(get_substr $inh 3 1) != i ]]; then + + # + # directory should append + # "inherit_only" if not have + # + acltemp=${acltemp%i*} + if [[ -n $cifs ]]; then + + expect1=${acltemp}i---I:${aclaction} + else + expect1=${acltemp}i---:${aclaction} + fi + elif [[ -n $cifs ]]; then + acltemp=${acltemp%-} + acltemp=${acltemp%I} + expect1=${acltemp}I:${aclaction} + fi + + # + # cleanup the first ACE if the directory + # not in inherit list + # + + if (( isinherit == 0 )); then + expect1="" + fi + elif [[ -f $node ]] ; then + expect1="" + fi + + # Get the first ACE to do comparison + + aclcur=$(get_ACE $node $count compact) + aclcur=${aclcur#$count:} + if [[ -n $expect1 && $expect1 != $aclcur ]]; then + $LS -Vd $basedir + $LS -Vd $node + log_fail "$inherit $i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect1" + fi + + # Get the second ACE (if should have) to do comparison + + if (( step > 0 )); then + (( count = count + step )) + + aclcur=$(get_ACE $node $count compact) + aclcur=${aclcur#$count:} + if [[ -n $expect2 && \ + $expect2 != $aclcur ]]; then + + $LS -Vd $basedir + $LS -Vd $node + log_fail "$inherit $i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect2" + fi + fi + (( count = count + 1 )) + fi + (( i = i + 1 )) + done + + # + # If there's no any ACE be checked, it should be identify as + # an normal file/dir, verify it. + # + + if (( passcnt == maxnumber )); then + if [[ -d $node ]]; then + compare_acls $node $odir + elif [[ -f $node ]]; then + compare_acls $node $ofile + fi + + if [[ $? -ne 0 ]]; then + $LS -Vd $basedir + $LS -Vd $node + log_fail "Unexpect acl: $node, $inherit ($str)" + fi + fi + done +} + +typeset -i i=0 +typeset acl0 acl1 acl2 acl3 +typeset acls0 acls1 acls2 acls3 + +# +# Set aclmode=passthrough to make sure +# the acl will not change during chmod. +# A general testing should verify the combination of +# aclmode/aclinherit works well, +# here we just simple test them separately. +# + +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS + +for inherit in "${aclinherit_flag[@]}"; do + + # + # Set different value of aclinherit + # + + log_must $ZFS set aclinherit=$inherit $TESTPOOL/$TESTFS + + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + for obj in "${object_flag[@]}"; do + for str in "${strategy_flag[@]}"; do + typeset inh_opt=$obj + (( ${#str} != 0 )) && inh_opt=${inh_opt}${str}-- + + if [[ -n $cifs ]]; then + inh_a=${inh_opt}- + inh_b=${inh_opt}I + else + inh_a=${inh_opt} + inh_b=${inh_opt} + fi + + # + # Prepare 4 ACES, which should include : + # deny -> to verify "noallow" + # write_acl/write_owner -> to verify "secure" + # + + acl0="$ace_prefix1:rwxp---A-W-Co-:${inh_a}:allow" + acl1="$ace_prefix2:rwxp---A-W-Co-:${inh_a}:deny" + acl2="$ace_prefix3:rwxp---A-W-Co-:${inh_a}:allow" + acl3="$ace_prefix1:-------A-W----:${inh_a}:deny" + acl4="$ace_prefix2:-------A-W----:${inh_a}:allow" + acl5="$ace_prefix3:-------A-W----:${inh_a}:deny" + + + # + # The ACE filtered by write_acl/write_owner + # + + if [[ $inheri == "passthrough" ]]; then + acls0="$ace_prefix1:rwxp---A-W----:${inh_b}:allow" + acls1="$ace_prefix2:rwxp---A-W----:${inh_b}:deny" + acls2="$ace_prefix3:rwxp---A-W----:${inh_b}:allow" + acls3="$ace_prefix1:rwxp---A-W----:${inh_b}:deny" + acls4="$ace_prefix2:rwxp---A-W----:${inh_b}:allow" + acls5="$ace_prefix3:rwxp---A-W----:${inh_b}:deny" + else + acls0="$ace_prefix1:-------A-W----:${inh_b}:allow" + acls1="$ace_prefix2:-------A-W-Co-:${inh_b}:deny" + acls2="$ace_prefix3:-------A-W----:${inh_b}:allow" + acls3="$ace_prefix1:-------A-W----:${inh_b}:deny" + acls4="$ace_prefix2:-------A-W----:${inh_b}:allow" + acls5="$ace_prefix3:-------A-W----:${inh_b}:deny" + fi + + # + # Create basedir and tmp dir/file + # for comparison. + # + + log_note "$user: $CHMOD $acl $basedir" + log_must usr_exec $MKDIR $basedir + log_must usr_exec $MKDIR $odir + log_must usr_exec $TOUCH $ofile + + i=5 + while (( i >= 0 )); do + eval acl=\$acl$i + + # + # Place on a directory should succeed. + # + log_must usr_exec $CHMOD A+$acl $basedir + + (( i = i - 1 )) + done + + verify_inherit $inherit $obj $str + + log_must usr_exec $RM -rf $ofile $odir $basedir + done + done + done +done + +log_pass "Verify chmod inherit behaviour co-op with aclinherit setting passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_004_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_004_pos.ksh new file mode 100644 index 00000000000..5a74471d9e4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_inherit_004_pos.ksh @@ -0,0 +1,162 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_inherit_004_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_inherit_004_pos +# +# DESCRIPTION: +# Verify aclinherit=passthrough-x will inherit the 'x' bits while mode request. +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Set aclinherit=passthrough-x +# 4. Verify only passthrough-x will inherit the 'x' bits while mode request. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if [[ -d $basedir ]]; then + log_must $RM -rf $basedir + fi +} + +$ZPOOL upgrade -v | $GREP "passthrough\-x aclinherit support" > /dev/null 2>&1 +if (( $? != 0 )) ; then + log_unsupported "passthrough-x aclinherit not supported." +fi + +log_assert "Verify aclinherit=passthrough-x will inherit the 'x' bits while mode request." +log_onexit cleanup + +set -A aces "owner@:read_data/write_data/add_subdirectory/append_data/execute:dir_inherit/inherit_only:allow" \ + "owner@:read_data/write_data/add_subdirectory/append_data/execute::allow" \ + "group@:add_subdirectory/append_data/execute:dir_inherit/inherit_only:allow" \ + "group@:add_subdirectory/append_data/execute::allow" \ + "everyone@:add_subdirectory/append_data/execute:dir_inherit/inherit_only:allow" \ + "everyone@:add_subdirectory/append_data/execute::allow" \ + "owner@:read_data/write_data/add_subdirectory/append_data/execute:file_inherit/inherit_only:allow" \ + "group@:read_data/add_subdirectory/append_data/execute:file_inherit/inherit_only:allow" \ + "everyone@:read_data/add_subdirectory/append_data/execute:file_inherit/inherit_only:allow" + +# Defile the based directory and file +basedir=$TESTDIR/basedir + +test_requires ZFS_ACL + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit # +{ + typeset obj=$1 + + # Define the files and directories will be created after chmod + ndir1=$obj/ndir1; ndir2=$ndir1/ndir2 + nfile1=$ndir1/nfile1.c; nfile2=$ndir1/nfile2 + + log_must usr_exec $MKDIR -p $ndir1 + + typeset -i i=0 + while (( i < ${#aces[*]} )) ; do + if (( i < 6 )) ; then + log_must usr_exec $CHMOD A$i=${aces[i]} $ndir1 + else + log_must usr_exec $CHMOD A$i+${aces[i]} $ndir1 + fi + (( i = i + 1 )) + done + log_must usr_exec $MKDIR -p $ndir2 + log_must usr_exec $TOUCH $nfile1 + + $CAT > $nfile1 < +#include +int main() +{ return 0; } +EOF + + mode=$(get_mode $ndir2) + if [[ $mode != "drwx--x--x"* ]] ; then + log_fail "Unexpect mode of $ndir2, expect: drwx--x--x, current: $mode" + fi + + mode=$(get_mode $nfile1) + if [[ $mode != "-rw-r--r--"* ]] ; then + log_fail "Unexpect mode of $nfile1, expect: -rw-r--r--, current: $mode" + fi + + if [[ -x /usr/sfw/bin/gcc ]] ; then + log_must /usr/sfw/bin/gcc -o $nfile2 $nfile1 + mode=$(get_mode $nfile2) + if [[ $mode != "-rwxr-xr-x"* ]] ; then + log_fail "Unexpect mode of $nfile2, expect: -rwxr-xr-x, current: $mode" + fi + fi +} + +# +# Set aclmode=passthrough to make sure +# the acl will not change during chmod. +# A general testing should verify the combination of +# aclmode/aclinherit works well, +# here we just simple test them separately. +# + +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS +log_must $ZFS set aclinherit=passthrough-x $TESTPOOL/$TESTFS + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + verify_inherit $basedir + + cleanup +done + +log_pass "Verify aclinherit=passthrough-x will inherit the 'x' bits while mode request." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_owner_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_owner_001_pos.ksh new file mode 100644 index 00000000000..f8d71f407b1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_owner_001_pos.ksh @@ -0,0 +1,402 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_owner_001_pos.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_owner_001_pos +# +# DESCRIPTION: +# Verify that the write_owner for +# owner/group/everyone are correct. +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special write_owner ACE to the file and directory +# 3. Try to chown/chgrp of the file and directory to take owner/group +# 4. Verify that the owner/group are correct. Follow these rules: +# (1) If uid is granted the write_owner permission, +# then it can only do chown to its own uid, +# or a group that they are a member of. +# (2) Owner will ignore permission of (1) even write_owner not granted. +# (3) Superuser will always permit whatever they do. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + [[ ! -e $TESTDIR/$ARCHIVEFILE ]] && return 0 + + if [[ ! -e $target ]]; then + log_must $TAR xpf $TESTDIR/$ARCHIVEFILE + fi + + (( ${#cwd} != 0 )) && cd $cwd + cleanup_test_files $TESTDIR/basedir + log_must $RM -f $TESTDIR/$ARCHIVEFILE + return 0 +} + +#owner@ group group_users other_users +set -A users \ +"root" "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ +"$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF_GROUP" "$ZFS_ACL_STAFF2" "$ZFS_ACL_OTHER1" + +set -A a_access \ + "write_owner:allow" \ + "write_owner:deny" + +set -A a_flag "owner@" "group@" "everyone@" + +log_assert "Verify that the chown/chgrp could take owner/group " \ + "while permission is granted." +log_onexit cleanup + +# +# Get the owner of a file/directory +# +function get_owner #node +{ + typeset node=$1 + typeset value + + if [[ -z $node ]]; then + log_fail "node are not defined." + fi + + if [[ -d $node ]]; then + value=$($LS -dl $node | $AWK '{print $3}') + elif [[ -e $node ]]; then + value=$($LS -l $node | $AWK '{print $3}') + fi + + $ECHO $value +} + +# +# Get the group of a file/directory +# +function get_group #node +{ + typeset node=$1 + typeset value + + if [[ -z $node ]]; then + log_fail "node are not defined." + fi + + if [[ -d $node ]]; then + value=$($LS -dl $node | $AWK '{print $4}') + elif [[ -e $node ]]; then + value=$($LS -l $node | $AWK '{print $4}') + fi + + $ECHO $value +} + + +# +# Get the group name that a UID belongs to +# +function get_user_group #uid +{ + typeset uid=$1 + typeset value + + if [[ -z $uid ]]; then + log_fail "UID not defined." + fi + + value=$(id $uid) + + if [[ $? -eq 0 ]]; then + value=${value##*\(} + value=${value%%\)*} + $ECHO $value + else + log_fail "Invalid UID (uid)." + fi +} + +function operate_node_owner #user node old_owner expect_owner +{ + typeset user=$1 + typeset node=$2 + typeset old_owner=$3 + typeset expect_owner=$4 + typeset ret new_owner + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + + chgusr_exec $user $CHOWN $expect_owner $node ; ret=$? + new_owner=$(get_owner $node) + + if [[ $new_owner != $old_owner ]]; then + $TAR xpf $TESTDIR/$ARCHIVEFILE + fi + + if [[ $ret -eq 0 ]]; then + if [[ $new_owner != $expect_owner ]]; then + log_note "Owner not changed as expected " \ + "($old_owner|$new_owner|$expect_owner), " \ + "but return code is $ret." + return 1 + fi + elif [[ $ret -ne 0 && $new_owner != $old_owner ]]; then + log_note "Owner changed ($old_owner|$new_owner), " \ + "but return code is $ret." + return 2 + fi + + return $ret +} + +function operate_node_group #user node old_group expect_group +{ + typeset user=$1 + typeset node=$2 + typeset old_group=$3 + typeset expect_group=$4 + typeset ret new_group + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + + chgusr_exec $user $CHGRP $expect_group $node ; ret=$? + new_group=$(get_group $node) + + if [[ $new_group != $old_group ]]; then + $TAR xpf $TESTDIR/$ARCHIVEFILE + fi + + if [[ $ret -eq 0 ]]; then + if [[ $new_group != $expect_group ]]; then + log_note "Group not changed as expected " \ + "($old_group|$new_group|$expect_group), " \ + "but return code is $ret." + return 1 + fi + elif [[ $ret -ne 0 && $new_group != $old_group ]]; then + log_note "Group changed ($old_group|$new_group), " \ + "but return code is $ret." + return 2 + fi + + return $ret +} + +function logname #acl_target user old new +{ + typeset acl_target=$1 + typeset user=$2 + typeset old=$3 + typeset new=$4 + typeset ret="log_mustnot" + + # To super user, read and write deny permission was override. + if [[ $user == root ]]; then + ret="log_must" + elif [[ $user == $new ]] ; then + if [[ $user == $old || $acl_target == *:allow ]]; then + ret="log_must" + fi + fi + + print $ret +} + +function check_chmod_results #node flag acl_target g_usr o_usr +{ + typeset node=$1 + typeset flag=$2 + typeset acl_target=$2:$3 + typeset g_usr=$4 + typeset o_usr=$5 + typeset log old_owner old_group new_owner new_group + + old_owner=$(get_owner $node) + old_group=$(get_group $node) + + if [[ $flag == "owner@" || $flag == "everyone@" ]]; then + for new_owner in $ZFS_ACL_CUR_USER "nobody"; do + new_group=$(get_user_group $new_owner) + + log=$(logname $acl_target $ZFS_ACL_CUR_USER \ + $old_owner $new_owner) + + $log operate_node_owner $ZFS_ACL_CUR_USER $node \ + $old_owner $new_owner + + $log operate_node_group $ZFS_ACL_CUR_USER $node \ + $old_group $new_group + done + fi + if [[ $flag == "group@" || $flag == "everyone@" ]]; then + for new_owner in $g_usr "nobody"; do + new_group=$(get_user_group $new_owner) + + log=$(logname $acl_target $g_usr $old_owner \ + $new_owner) + + $log operate_node_owner $g_usr $node \ + $old_owner $new_owner + + $log operate_node_group $g_usr \ + $node $old_group $new_group + done + fi + if [[ $flag == "everyone@" ]]; then + for new_owner in $g_usr "nobody"; do + new_group=$(get_user_group $new_owner) + + log=$(logname $acl_target $o_usr $old_owner \ + $new_owner) + + $log operate_node_owner $o_usr $node \ + $old_owner $new_owner + + $log operate_node_group $o_usr $node \ + $old_group $new_group + done + fi +} + +function test_chmod_basic_access #node g_usr o_usr +{ + typeset node=${1%/} + typeset g_usr=$2 + typeset o_usr=$3 + typeset flag acl_p acl_t parent + + parent=${node%/*} + + for flag in ${a_flag[@]}; do + for acl_t in "${a_access[@]}"; do + log_must usr_exec $CHMOD A+$flag:$acl_t $node + + $TAR cpf $TESTDIR/$ARCHIVEFILE basedir + + check_chmod_results "$node" "$flag" \ + "$acl_t" "$g_usr" "$o_usr" + + log_must usr_exec $CHMOD A0- $node + done + done +} + +function setup_test_files #base_node user group +{ + typeset base_node=$1 + typeset user=$2 + typeset group=$3 + + cleanup_test_files $base_node + + log_must $MKDIR -p $base_node + log_must $CHOWN $user:$group $base_node + + log_must set_cur_usr $user + + # Prepare all files/sub-dirs for testing. + + file0=$base_node/testfile_rm + + dir0=$base_node/testdir_rm + + log_must usr_exec $TOUCH $file0 + log_must usr_exec $CHMOD 444 $file0 + + log_must usr_exec $MKDIR -p $dir0 + log_must usr_exec $CHMOD 444 $dir0 + + log_must usr_exec $CHMOD 555 $base_node + return 0 +} + +function cleanup_test_files #base_node +{ + typeset base_node=$1 + + if [[ -d $base_node ]]; then + log_must $RM -rf $base_node + elif [[ -e $base_node ]]; then + log_must $RM -f $base_node + fi + + return 0 +} + +typeset cwd=$PWD +typeset ARCHIVEFILE=archive.tar + +test_requires ZFS_ACL + +typeset -i i=0 +typeset -i j=0 +typeset target +cd $TESTDIR +while (( i < ${#users[@]} )); do + setup_test_files $TESTDIR/basedir ${users[i]} ${users[((i+1))]} + + j=0 + while (( j < 1 )); do + eval target=\$file$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + eval target=\$dir$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + (( j = j + 1 )) + done + + (( i += 4 )) +done + +log_pass "Verify that the chown/chgrp could take owner/group " \ + "while permission is granted." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwacl_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwacl_001_pos.ksh new file mode 100644 index 00000000000..15a7ad9ffdd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwacl_001_pos.ksh @@ -0,0 +1,262 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_rwacl_001_pos.ksh 1.5 09/05/19 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_rwacl_001_pos +# +# DESCRIPTION: +# Verify assigned read_acl/write_acl to owner@/group@/everyone@, +# specificied user and group. File have the correct access permission. +# +# STRATEGY: +# 1. Separatedly verify file and directory was assigned read_acl/write_acl +# by root and non-root user. +# 2. Verify owner always can read and write acl, even deny. +# 3. Verify group access permission, when group was assigned +# read_acl/write_acl. +# 4. Verify access permission, after everyone was assigned read_acl/write. +# 5. Verify everyone@ was deny except specificied user, this user can read +# and write acl. +# 6. Verify the group was deny except specified user, this user can read +# and write acl +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify chmod A[number]{+|-|=} read_acl/write_acl have correct " \ + "behaviour to access permission." +log_onexit cleanup + +function read_ACL # ... +{ + typeset node=$1 + typeset user + typeset -i ret + + shift + for user in $@; do + chgusr_exec $user $LS -vd $node > /dev/null 2>&1 + ret=$? + (( ret != 0 )) && return $ret + + shift + done + + return 0 +} + +function write_ACL # ... +{ + typeset node=$1 + typeset user + typeset -i ret before_cnt after_cnt + + shift + for user in "$@"; do + before_cnt=$(count_ACE $node) + ret=$?; + (( ret != 0 )) && return $ret + + chgusr_exec $user $CHMOD A0+owner@:read_data:allow $node + ret=$? + (( ret != 0 )) && return $ret + + after_cnt=$(count_ACE $node) + ret=$? + (( ret != 0 )) && return $ret + + chgusr_exec $user $CHMOD A0- $node + ret=$? + (( ret != 0 )) && return $ret + + if (( after_cnt - before_cnt != 1 )); then + return 1 + fi + + shift + done + + return 0 +} + +function check_owner # +{ + typeset node=$1 + + for acc in allow deny; do + log_must usr_exec \ + $CHMOD A0+owner@:read_acl/write_acl:$acc $node + log_must read_ACL $node $ZFS_ACL_CUR_USER + log_must write_ACL $node $ZFS_ACL_CUR_USER + log_must usr_exec $CHMOD A0- $node + done +} + +function check_group # +{ + typeset node=$1 + + typeset grp_usr="" + if [[ $ZFS_ACL_CUR_USER == root ]]; then + grp_usr=$ZFS_ACL_ADMIN + elif [[ $ZFS_ACL_CUR_USER == $ZFS_ACL_STAFF1 ]]; then + grp_usr=$ZFS_ACL_STAFF2 + fi + + log_must usr_exec $CHMOD A0+group@:read_acl/write_acl:allow $node + log_must read_ACL $node $grp_usr + log_must write_ACL $node $grp_usr + log_must usr_exec $CHMOD A0- $node + + log_must usr_exec $CHMOD A0+group@:read_acl/write_acl:deny $node + log_mustnot read_ACL $node $grp_usr + log_mustnot write_ACL $node $grp_usr + log_must usr_exec $CHMOD A0- $node +} + +function check_everyone # +{ + typeset node=$1 + + typeset flag + for flag in allow deny; do + if [[ $flag == allow ]]; then + log=log_must + else + log=log_mustnot + fi + + log_must usr_exec \ + $CHMOD A0+everyone@:read_acl/write_acl:$flag $node + + $log read_ACL $node $ZFS_ACL_OTHER1 $ZFS_ACL_OTHER2 + $log write_ACL $node $ZFS_ACL_OTHER1 $ZFS_ACL_OTHER2 + + log_must usr_exec $CHMOD A0- $node + done +} + +function check_spec_user # +{ + typeset node=$1 + + log_must usr_exec $CHMOD A0+everyone@:read_acl/write_acl:deny $node + log_must usr_exec \ + $CHMOD A0+user:$ZFS_ACL_OTHER1:read_acl/write_acl:allow $node + + # The specified user can read and write acl + log_must read_ACL $node $ZFS_ACL_OTHER1 + log_must write_ACL $node $ZFS_ACL_OTHER1 + + # All the other user can't read and write acl + log_mustnot \ + read_ACL $node $ZFS_ACL_ADMIN $ZFS_ACL_STAFF2 $ZFS_ACL_OTHER2 + log_mustnot \ + write_ACL $node $ZFS_ACL_ADMIN $ZFS_ACL_STAFF2 $ZFS_ACL_OTHER2 + + log_must usr_exec $CHMOD A0- $node + log_must usr_exec $CHMOD A0- $node +} + +function check_spec_group # +{ + typeset node=$1 + + log_must usr_exec $CHMOD A0+everyone@:read_acl/write_acl:deny $node + log_must usr_exec $CHMOD \ + A0+group:$ZFS_ACL_OTHER_GROUP:read_acl/write_acl:allow $node + + # The specified group can read and write acl + log_must read_ACL $node $ZFS_ACL_OTHER1 $ZFS_ACL_OTHER2 + log_must write_ACL $node $ZFS_ACL_OTHER1 $ZFS_ACL_OTHER2 + + # All the other user can't read and write acl + log_mustnot read_ACL $node $ZFS_ACL_ADMIN $ZFS_ACL_STAFF2 + log_mustnot write_ACL $node $ZFS_ACL_ADMIN $ZFS_ACL_STAFF2 +} + +function check_user_in_group # +{ + typeset node=$1 + + log_must usr_exec $CHMOD \ + A0+group:$ZFS_ACL_OTHER_GROUP:read_acl/write_acl:deny $node + log_must usr_exec $CHMOD \ + A0+user:$ZFS_ACL_OTHER1:read_acl/write_acl:allow $node + log_must read_ACL $node $ZFS_ACL_OTHER1 + log_must write_ACL $node $ZFS_ACL_OTHER1 + log_mustnot read_ACL $node $ZFS_ACL_OTHER2 + log_mustnot write_ACL $node $ZFS_ACL_OTHER2 + + log_must usr_exec $CHMOD A0- $node + log_must usr_exec $CHMOD A0- $node +} + +set -A func_name check_owner \ + check_group \ + check_everyone \ + check_spec_user \ + check_spec_group \ + check_user_in_group + +test_requires ZFS_ACL + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir + + typeset func node + for func in ${func_name[@]}; do + for node in $testfile $testdir; do + eval $func \$node + done + done + + log_must usr_exec $RM -rf $testfile $testdir +done + +log_pass "Verify chmod A[number]{+|-|=} read_acl/write_acl passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_001_pos.ksh new file mode 100644 index 00000000000..8f739da96ac --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_001_pos.ksh @@ -0,0 +1,141 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_rwx_001_pos.ksh 1.3 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_rwx_001_pos +# +# DESCRIPTION: +# chmod A{+|-|=} have the correct behaviour to the ACL list. +# +# STRATEGY: +# 1. loop check root and non-root users +# 2. chmod file or dir with specified options +# 3. get ACE after behaviours of chmod +# 4. compare specified ACE and excpect ACE +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "chmod A{+|-|=} have the correct behaviour to the ACL list." +log_onexit cleanup + +typeset -i trival_count=6 head=0 mid end +((mid = RANDOM % $trival_count)) +((end = trival_count - 1)) + +opts="+ - =" +nums="$head $mid $end" +set -A file_ACEs \ + "user:$ZFS_ACL_STAFF1:read_data:allow" \ + "user:$ZFS_ACL_STAFF2:write_data:allow" \ + "user:$ZFS_ACL_OTHER1:execute:allow" +set -A dir_ACEs \ + "user:$ZFS_ACL_STAFF1:list_directory/read_data:allow" \ + "user:$ZFS_ACL_STAFF2:add_file/write_data:allow" \ + "user:$ZFS_ACL_OTHER1:execute:allow" + +function test_chmod_ACE_list #$opt $num $ace-spec $node +{ + typeset opt=A$2$1 + typeset -i num=$2 + typeset ace=$3 + typeset node=$4 + typeset -i expect_count=0 + + # Get expect ACE count + case $opt in + A[0-9]*+) (( expect_count = trival_count + 1 )) ;; + A[0-9]*-) (( expect_count = trival_count - 1 )) ;; + A[0-9]*=) (( expect_count = trival_count )) ;; + *) log_fail "Error option: '$opt'" ;; + esac + + # Invoke chmod A[number]{+|-|=} file|dir + if [[ $opt == A[0-9]*+ || $opt == A[0-9]*= ]]; then + log_must usr_exec $CHMOD "$opt$ace" "$node" + else + log_must usr_exec $CHMOD "$opt" "$node" + fi + + # Get the current ACE count and specified ACE + typeset cur_ace cur_count + cur_ace=$(get_ACE $node $num) + cur_count=$(count_ACE $node) + + # Compare with expected results + if [[ $opt == A[0-9]*+ || $opt == A[0-9]*= ]]; then + if [[ "$num:$ace" != "$cur_ace" ]]; then + log_fail "FAIL: $CHMOD $opt$ace $node" + fi + fi + if [[ "$expect_count" != "$cur_count" ]]; then + log_fail "FAIL: '$expect_count' != '$cur_count'" + fi +} + +test_requires ZFS_ACL + +for user in root $ZFS_ACL_STAFF1 $ZFS_ACL_OTHER1; do + log_must set_cur_usr $user + + for opt in $opts; do + for num in $nums; do + for ace in $file_ACEs; do + ls -l $TESTDIR + log_must usr_exec $TOUCH $testfile + test_chmod_ACE_list $opt $num $ace $testfile + log_must $RM -f $testfile + done + for ace in $dir_ACEs; do + ls -l $TESTDIR + log_must usr_exec $MKDIR -p $testdir + test_chmod_ACE_list $opt $num $ace $testdir + log_must $RM -rf $testdir + done + done + done +done + +log_pass "chmod A{+|-|=} behave to the ACL list passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_002_pos.ksh new file mode 100644 index 00000000000..44b668ccb26 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_002_pos.ksh @@ -0,0 +1,261 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_rwx_002_pos.ksh 1.5 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_rwx_002_pos +# +# DESCRIPTION: +# chmod A{+|-|=} read_data|write_data|execute for owner@ group@ or everyone@ +# correctly alters mode bits . +# +# STRATEGY: +# 1. Loop root and non-root user. +# 2. Get the random initial map. +# 3. Get the random ACL string. +# 4. Separately chmod +|-|= read_data|write_data|execute +# 5. Check map bits +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "chmod A{+|-|=} read_data|write_data|execute for owner@, group@ " \ + "or everyone@ correctly alters mode bits." +log_onexit cleanup + +set -A bits 0 1 2 3 4 5 6 7 +set -A a_flag owner group everyone +set -A a_access read_data write_data execute +set -A a_type allow deny + +# +# Get a random item from an array. +# +# $1 the base set +# +function random_select #array_name +{ + typeset arr_name=$1 + typeset -i ind + + eval typeset -i cnt=\${#${arr_name}[@]} + (( ind = $RANDOM % cnt )) + + eval print \${${arr_name}[$ind]} +} + +# +# Create a random string according to array name, the item number and +# separated tag. +# +# $1 array name where the function get the elements +# $2 the items number which you want to form the random string +# $3 the separated tag +# +function form_random_str # +{ + typeset arr_name=$1 + typeset -i count=${2:-1} + typeset sep=${3:-""} + + typeset str="" + while (( count > 0 )); do + str="${str}$(random_select $arr_name)${sep}" + + (( count -= 1 )) + done + + print $str +} + +# +# According to the original bits, the input ACE access and ACE type, return the +# expect bits after 'chmod A0{+|=}'. +# +# $1 bits which was make up of three bit 'rwx' +# $2 ACE access which is read_data, write_data or execute +# $3 ACE type which is allow or deny +# +function cal_bits #bits acl_access acl_type +{ + typeset bits=$1 + typeset acl_access=$2 + typeset acl_type=$3 + set -A bit r w x + + typeset tmpbits="" + typeset -i i=0 j + while (( i < 3 )); do + if [[ $acl_access == *"${a_access[i]}"* ]]; then + if [[ $acl_type == "allow" ]]; then + tmpbits="$tmpbits${bit[i]}" + elif [[ $acl_type == "deny" ]]; then + tmpbits="${tmpbits}-" + fi + else + (( j = i + 1 )) + tmpbits="$tmpbits$(get_substr $bits $j 1)" + fi + + (( i += 1 )) + done + + print "$tmpbits" +} + +# +# Based on the initial node map before chmod and the ace-spec, check if chmod +# has the correct behaven to map bits. +# +function check_test_result #init_mode node acl_flag acl_access a_type +{ + typeset init_mode=$1 + typeset node=$2 + typeset acl_flag=$3 + typeset acl_access=$4 + typeset acl_type=$5 + + typeset -3L u_bits=$init_mode + typeset g_bits=$(get_substr $init_mode 4 3) + typeset -3R o_bits=$init_mode + + if [[ $acl_flag == "owner" || $acl_flag == "everyone" ]]; then + u_bits=$(cal_bits $u_bits $acl_access $acl_type) + fi + if [[ $acl_flag == "group" || $acl_flag == "everyone" ]]; then + g_bits=$(cal_bits $g_bits $acl_access $acl_type) + fi + if [[ $acl_flag == "everyone" ]]; then + o_bits=$(cal_bits $o_bits $acl_access $acl_type) + fi + + typeset cur_mode=$(get_mode $node) + cur_mode=$(get_substr $cur_mode 2 9) + + if [[ $cur_mode == $u_bits$g_bits$o_bits ]]; then + log_note "SUCCESS: Current map($cur_mode) ==" \ + "expected map($u_bits$g_bits$o_bits)" + else + log_fail "FAIL: Current map($cur_mode) != " \ + "expected map($u_bits$g_bits$o_bits)" + fi +} + +function test_chmod_map # +{ + typeset node=$1 + typeset init_mask acl_flag acl_access acl_type + typeset -i cnt + + if (( ${#node} == 0 )); then + log_fail "FAIL: file name or directroy name is not defined." + fi + + # Get the initial map + init_mask=$(form_random_str bits 3) + # Get ACL flag, access & type + acl_flag=$(form_random_str a_flag) + (( cnt = ($RANDOM % ${#a_access[@]}) + 1 )) + acl_access=$(form_random_str a_access $cnt '/') + acl_access=${acl_access%/} + acl_type=$(form_random_str a_type) + + typeset acl_spec=${acl_flag}@:${acl_access}:${acl_type} + + # Set the initial map and back the initial ACEs + typeset orig_ace=$TMPDIR/orig_ace.${TESTCASE_ID} + typeset cur_ace=$TMPDIR/cur_ace.${TESTCASE_ID} + + for operator in "A0+" "A0="; do + log_must usr_exec $CHMOD $init_mask $node + init_mode=$(get_mode $node) + init_mode=$(get_substr $init_mode 2 9) + log_must usr_exec eval "$LS -vd $node > $orig_ace" + + # To "A=", firstly add one ACE which can't modify map + if [[ $operator == "A0=" ]]; then + log_must $CHMOD A0+user:$ZFS_ACL_OTHER1:execute:deny \ + $node + fi + log_must usr_exec $CHMOD $operator$acl_spec $node + check_test_result \ + $init_mode $node $acl_flag $acl_access $acl_type + + # Check "chmod A-" + log_must usr_exec $CHMOD A0- $node + log_must usr_exec eval "$LS -vd $node > $cur_ace" + + if $DIFF $orig_ace $cur_ace; then + log_note "SUCCESS: original ACEs equivalence the " \ + "current ACEs. 'chmod A-' succeeded." + else + log_fail "FAIL: 'chmod A-' failed." + fi + done + + [[ -f $orig_ace ]] && log_must usr_exec $RM -f $orig_ace + [[ -f $cur_ace ]] && log_must usr_exec $RM -f $cur_ace +} + +test_requires ZFS_ACL + +for user in root $ZFS_ACL_STAFF1; do + set_cur_usr $user + + typeset -i loop_cnt=20 + while (( loop_cnt > 0 )); do + log_must usr_exec $TOUCH $testfile + test_chmod_map $testfile + log_must $RM -f $testfile + + log_must usr_exec $MKDIR $testdir + test_chmod_map $testdir + log_must $RM -rf $testdir + + (( loop_cnt -= 1 )) + done +done + +log_pass "chmod A{+|-|=} read_data|write_data|execute for owner@, group@ " \ + "oreveryone@ correctly alters mode bits passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_003_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_003_pos.ksh new file mode 100644 index 00000000000..7fd3f38e51f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_003_pos.ksh @@ -0,0 +1,152 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_rwx_003_pos.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_rwx_003_pos +# +# DESCRIPTION: +# Verify that the read_data/write_data/execute permission for +# owner/group/everyone are correct. +# +# STRATEGY: +# 1. Loop root and non-root user. +# 2. Separated verify type@:access:allow|deny to file and directory +# 3. To super user, read and write deny was override. +# 4. According to ACE list and override rule, expect that +# read/write/execute file or directory succeed or fail. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-09) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# owner@ group_users other_users +set -A users \ + "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ + "$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF2" "$ZFS_ACL_OTHER1" + +# In order to test execute permission, read_data was need firstly. +set -A a_access "read_data" "write_data" "read_data/execute" +set -A a_flag "owner@" "group@" "everyone@" + +log_assert "Verify that the read_data/write_data/execute permission for" \ + "owner/group/everyone are correct." +log_onexit cleanup + +function logname #node acl_spec user +{ + typeset node=$1 + typeset acl_spec=$2 + typeset user=$3 + + # To super user, read and write deny permission was override. + if [[ $acl_spec == *:allow ]] || \ + [[ $user == root && -d $node ]] || \ + [[ $user == root && $acl_spec != *"execute"* ]] + then + print "log_must" + elif [[ $acl_spec == *:deny ]]; then + print "log_mustnot" + fi +} + +function check_chmod_results #node acl_spec g_usr o_usr +{ + typeset node=$1 + typeset acl_spec=$2 + typeset g_usr=$3 + typeset o_usr=$4 + typeset log + + if [[ $acl_spec == "owner@:"* || $acl_spec == "everyone@:"* ]]; then + log=$(logname $node $acl_spec $ZFS_ACL_CUR_USER) + $log rwx_node $ZFS_ACL_CUR_USER $node $acl_spec + fi + if [[ $acl_spec == "group@:"* || $acl_spec == "everyone@:"* ]]; then + log=$(logname $node $acl_spec $g_usr) + $log rwx_node $g_usr $node $acl_spec + fi + if [[ $acl_spec == "everyone@"* ]]; then + log=$(logname $node $acl_spec $o_usr) + $log rwx_node $o_usr $node $acl_spec + fi +} + +function test_chmod_basic_access #node group_user other_user +{ + typeset node=$1 + typeset g_usr=$2 + typeset o_usr=$3 + typeset flag access acl_spec + + for flag in ${a_flag[@]}; do + for access in ${a_access[@]}; do + for tp in allow deny; do + acl_spec="$flag:$access:$tp" + log_must usr_exec $CHMOD A+$acl_spec $node + check_chmod_results \ + $node $acl_spec $g_usr $o_usr + log_must usr_exec $CHMOD A0- $node + done + done + done +} + +test_requires ZFS_ACL + +typeset -i i=0 +while (( i < ${#users[@]} )); do + log_must set_cur_usr ${users[i]} + + log_must usr_exec $TOUCH $testfile + test_chmod_basic_access $testfile ${users[((i+1))]} ${users[((i+2))]} + log_must usr_exec $MKDIR $testdir + test_chmod_basic_access $testdir ${users[((i+1))]} ${users[((i+2))]} + + log_must usr_exec $RM -rf $testfile $testdir + + (( i += 3 )) +done + +log_pass "Verify that the read_data/write_data/execute permission for" \ + "owner/group/everyone passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_004_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_004_pos.ksh new file mode 100644 index 00000000000..1c54151348e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_rwx_004_pos.ksh @@ -0,0 +1,155 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_rwx_004_pos.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_rwx_004_pos +# +# DESCRIPTION: +# Verify that explicit ACL setting to specified user or group will +# override existed access rule. +# +# STRATEGY: +# 1. Loop root and non-root user. +# 2. Loop the specified access one by one. +# 3. Loop verify explicit ACL set to specified user and group. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-14) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function check_access #log user node access rflag +{ + typeset log=$1 + typeset user=$2 + typeset node=$3 + typeset access=$4 + typeset rflag=$5 + + if [[ $rflag == "allow" && $access == execute ]]; then + rwx_node $user $node $access + # + # When everyone@ were deny, this file can't execute. + # So,'cannot execute' means user has the permission to + # execute, just the file can't be execute. + # + if [[ $ZFS_ACL_ERR_STR == *"cannot execute" ]]; then + log_note "SUCCESS: rwx_node $user $node $access" + else + log_fail "FAIL: rwx_node $user $node $access" + fi + else + $log rwx_node $user $node $access + fi +} + +function verify_explicit_ACL_rule #node access flag +{ + set -A a_access "read_data" "write_data" "execute" + typeset node=$1 + typeset access=$2 + typeset flag=$3 + typeset log rlog rflag + + # Get the expect log check + if [[ $flag == allow ]]; then + log=log_mustnot + rlog=log_must + rflag=deny + else + log=log_must + rlog=log_mustnot + rflag=allow + fi + + log_must usr_exec $CHMOD A+everyone@:$access:$flag $node + log_must usr_exec $CHMOD A+user:$ZFS_ACL_OTHER1:$access:$rflag $node + check_access $log $ZFS_ACL_OTHER1 $node $access $rflag + log_must usr_exec $CHMOD A0- $node + + log_must usr_exec \ + $CHMOD A+group:$ZFS_ACL_OTHER_GROUP:$access:$rflag $node + check_access $log $ZFS_ACL_OTHER1 $node $access $rflag + check_access $log $ZFS_ACL_OTHER2 $node $access $rflag + log_must usr_exec $CHMOD A0- $node + log_must usr_exec $CHMOD A0- $node + + log_must usr_exec \ + $CHMOD A+group:$ZFS_ACL_OTHER_GROUP:$access:$flag $node + log_must usr_exec $CHMOD A+user:$ZFS_ACL_OTHER1:$access:$rflag $node + $log rwx_node $ZFS_ACL_OTHER1 $node $access + $rlog rwx_node $ZFS_ACL_OTHER2 $node $access + log_must usr_exec $CHMOD A0- $node + log_must usr_exec $CHMOD A0- $node +} + +log_assert "Verify that explicit ACL setting to specified user or group will" \ + "override existed access rule." +log_onexit cleanup + +set -A a_access "read_data" "write_data" "execute" +set -A a_flag "allow" "deny" +typeset node + +test_requires ZFS_ACL + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir + log_must usr_exec $CHMOD 755 $testfile $testdir + + for node in $testfile $testdir; do + for access in ${a_access[@]}; do + for flag in ${a_flag[@]}; do + verify_explicit_ACL_rule $node $access $flag + done + done + done + + log_must usr_exec $RM -rf $testfile $testdir +done + +log_pass "Explicit ACL setting to specified user or group will override " \ + "existed access rule passed." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_xattr_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_xattr_001_pos.ksh new file mode 100644 index 00000000000..71c20e473c1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_xattr_001_pos.ksh @@ -0,0 +1,257 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_xattr_001_pos.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_xattr_001_pos +# +# DESCRIPTION: +# Verify that the read_xattr/write_xattr for +# owner/group/everyone are correct. +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special read_xattr ACE to the file and directory +# 3. Try to list the extended attributes of the file and directory +# 4. Set special write_xattr ACE to the file and directory +# 5. Try to add new extended attributes to the file and directory +# 6. Verify above operation is successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-11-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + cd $cwd + + cleanup_test_files $TESTDIR/basedir + + if [[ -e $TESTDIR/$ARCHIVEFILE ]]; then + log_must $RM -f $TESTDIR/$ARCHIVEFILE + fi + + return 0 +} + +# owner@ group group_users other_users +set -A users \ + "root" "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ + "$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF_GROUP" "$ZFS_ACL_STAFF2" "$ZFS_ACL_OTHER1" + +set -A a_access \ + "read_xattr:allow" \ + "read_xattr:deny" \ + "write_xattr:allow" \ + "write_xattr:deny" + +set -A a_flag "owner@" "group@" "everyone@" + +MYTESTFILE=$STF_SUITE/include/default.cfg + +log_assert "Verify that the permission of read_xattr/write_xattr for " \ + "owner/group/everyone are correct." +log_onexit cleanup + +function operate_node #user node acl +{ + typeset user=$1 + typeset node=$2 + typeset acl_t=$3 + typeset ret + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + + if [[ $acl_t == *read_xattr* ]]; then + chgusr_exec $user $RUNAT $node $LS > /dev/null 2>&1; ret=$? + elif [[ $acl_t == *write_xattr* ]]; then + chgusr_exec $user $RUNAT $node $CP $MYTESTFILE attr.1 ; ret=$? + + if [[ $ret -eq 0 ]]; then + log_must cleanup_test_files $TESTDIR/basedir + log_must $TAR xpf@ $TESTDIR/$ARCHIVEFILE + fi + fi + + return $ret +} + +function logname #acl_target user +{ + typeset acl_target=$1 + typeset user=$2 + typeset ret="log_mustnot" + + # To super user, read and write deny permission was override. + if [[ $user == root || $acl_target == *:allow ]] then + ret="log_must" + fi + + print $ret +} + +function check_chmod_results #node flag acl_target g_usr o_usr +{ + typeset node=$1 + typeset flag=$2 + typeset acl_target=$2:$3 + typeset g_usr=$4 + typeset o_usr=$5 + typeset log + + if [[ $flag == "owner@" || $flag == "everyone@" ]]; then + log=$(logname $acl_target $ZFS_ACL_CUR_USER) + $log operate_node $ZFS_ACL_CUR_USER $node $acl_target + fi + if [[ $flag == "group@" || $flag == "everyone@" ]]; then + log=$(logname $acl_target $g_usr) + $log operate_node $g_usr $node $acl_target + fi + if [[ $flag == "everyone@" ]]; then + log=$(logname $acl_target $o_usr) + $log operate_node $o_usr $node $acl_target + fi +} + +function test_chmod_basic_access #node g_usr o_usr +{ + typeset node=${1%/} + typeset g_usr=$2 + typeset o_usr=$3 + typeset flag acl_p acl_t parent + + parent=${node%/*} + + for flag in ${a_flag[@]}; do + for acl_t in "${a_access[@]}"; do + log_must usr_exec $CHMOD A+$flag:$acl_t $node + + log_must $TAR cpf@ $TESTDIR/$ARCHIVEFILE basedir + + check_chmod_results "$node" "$flag" \ + "$acl_t" "$g_usr" "$o_usr" + + log_must usr_exec $CHMOD A0- $node + done + done +} + +function setup_test_files #base_node user group +{ + typeset base_node=$1 + typeset user=$2 + typeset group=$3 + + cleanup_test_files $base_node + + log_must $MKDIR -p $base_node + log_must $CHOWN $user:$group $base_node + + log_must set_cur_usr $user + + # Prepare all files/sub-dirs for testing. + + file0=$base_node/testfile_rm + + dir0=$base_node/testdir_rm + + log_must usr_exec $TOUCH $file0 + log_must usr_exec $CHMOD 444 $file0 + + log_must usr_exec $RUNAT $file0 $CP $MYTESTFILE attr.0 + + log_must usr_exec $MKDIR -p $dir0 + log_must usr_exec $CHMOD 555 $dir0 + + log_must usr_exec $RUNAT $dir0 $CP $MYTESTFILE attr.0 + + log_must usr_exec $CHMOD 777 $base_node + return 0 +} + +function cleanup_test_files #base_node +{ + typeset base_node=$1 + + if [[ -d $base_node ]]; then + log_must $RM -rf $base_node + elif [[ -e $base_node ]]; then + log_must $RM -f $base_node + fi + + return 0 +} + +typeset cwd=$PWD +typeset ARCHIVEFILE=archive.tar + +test_requires RUNAT ZFS_ACL ZFS_XATTR + +typeset -i i=0 +typeset -i j=0 +typeset target + +while (( i < ${#users[@]} )); do + setup_test_files $TESTDIR/basedir ${users[i]} ${users[((i+1))]} + cd $TESTDIR + + j=0 + while (( j < 1 )); do + eval target=\$file$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + eval target=\$dir$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + (( j = j + 1 )) + done + + (( i += 4 )) +done + +log_pass "Verify that the permission of read_xattr/write_xattr for " \ + "owner/group/everyone are correct." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_xattr_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_xattr_002_pos.ksh new file mode 100644 index 00000000000..0fa8abdbaf8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_chmod_xattr_002_pos.ksh @@ -0,0 +1,252 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_xattr_002_pos.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_xattr_002_pos +# +# DESCRIPTION: +# Verify that the write_xattr for remove the extended attributes of +# owner/group/everyone are correct. +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special write_xattr ACE to the file and directory +# 3. Try to remove the extended attributes of the file and directory +# 4. Verify above operation is successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-11-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + cd $cwd + + cleanup_test_files $TESTDIR/basedir + + if [[ -e $TESTDIR/$ARCHIVEFILE ]]; then + log_must $RM -f $TESTDIR/$ARCHIVEFILE + fi + + return 0 +} + +# owner@ group group_users other_users +set -A users \ + "root" "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ + "$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF_GROUP" "$ZFS_ACL_STAFF2" "$ZFS_ACL_OTHER1" + +set -A a_access \ + "write_xattr:allow" \ + "write_xattr:deny" + +set -A a_flag "owner@" "group@" "everyone@" + +MYTESTFILE=$STF_SUITE/include/default.cfg + +log_assert "Verify that the permission of write_xattr for " \ + "owner/group/everyone while remove extended attributes are correct." +log_onexit cleanup + +function operate_node #user node acl +{ + typeset user=$1 + typeset node=$2 + typeset acl_t=$3 + typeset ret + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + + chgusr_exec $user $RUNAT $node $RM -f attr.0 ; ret=$? + + if [[ $ret -eq 0 ]]; then + log_must cleanup_test_files $TESTDIR/basedir + log_must $TAR xpf@ $TESTDIR/$ARCHIVEFILE + fi + + return $ret +} + +function logname #acl_target owner user +{ + typeset acl_target=$1 + typeset owner=$2 + typeset user=$3 + typeset ret="log_mustnot" + + # To super user, read and write deny permission was override. + if [[ $user == root || $owner == $user ]] then + ret="log_must" + fi + + print $ret +} + +function check_chmod_results #node flag acl_target owner g_usr o_usr +{ + typeset node=$1 + typeset flag=$2 + typeset acl_target=$2:$3 + typeset owner=$4 + typeset g_usr=$5 + typeset o_usr=$6 + typeset log + + if [[ $flag == "owner@" || $flag == "everyone@" ]]; then + log=$(logname $acl_target $owner $ZFS_ACL_CUR_USER) + $log operate_node $ZFS_ACL_CUR_USER $node $acl_target + fi + if [[ $flag == "group@" || $flag == "everyone@" ]]; then + log=$(logname $acl_target $owner $g_usr) + $log operate_node $g_usr $node $acl_target + fi + if [[ $flag == "everyone@" ]]; then + log=$(logname $acl_target $owner $o_usr) + $log operate_node $o_usr $node $acl_target + fi +} + +function test_chmod_basic_access #node owner g_usr o_usr +{ + typeset node=${1%/} + typeset owner=$2 + typeset g_usr=$3 + typeset o_usr=$4 + typeset flag acl_p acl_t parent + + parent=${node%/*} + + for flag in ${a_flag[@]}; do + for acl_t in "${a_access[@]}"; do + log_must usr_exec $CHMOD A+$flag:$acl_t $node + + log_must $TAR cpf@ $TESTDIR/$ARCHIVEFILE basedir + + check_chmod_results "$node" "$flag" \ + "$acl_t" "$owner" "$g_usr" "$o_usr" + + log_must usr_exec $CHMOD A0- $node + done + done +} + +function setup_test_files #base_node user group +{ + typeset base_node=$1 + typeset user=$2 + typeset group=$3 + + cleanup_test_files $base_node + + log_must $MKDIR -p $base_node + log_must $CHOWN $user:$group $base_node + + log_must set_cur_usr $user + + # Prepare all files/sub-dirs for testing. + + file0=$base_node/testfile_rm + + dir0=$base_node/testdir_rm + + log_must usr_exec $TOUCH $file0 + log_must usr_exec $CHMOD 444 $file0 + + log_must usr_exec $RUNAT $file0 $CP $MYTESTFILE attr.0 + + log_must usr_exec $MKDIR -p $dir0 + log_must usr_exec $CHMOD 555 $dir0 + + log_must usr_exec $RUNAT $dir0 $CP $MYTESTFILE attr.0 + + log_must usr_exec $CHMOD 555 $base_node + return 0 +} + +function cleanup_test_files #base_node +{ + typeset base_node=$1 + + if [[ -d $base_node ]]; then + log_must $RM -rf $base_node + elif [[ -e $base_node ]]; then + log_must $RM -f $base_node + fi + + return 0 +} + +typeset cwd=$PWD +typeset ARCHIVEFILE=archive.tar + +test_requires RUNAT ZFS_XATTR + +typeset -i i=0 +typeset -i j=0 +typeset target + +while (( i < ${#users[@]} )); do + setup_test_files $TESTDIR/basedir ${users[i]} ${users[((i+1))]} + cd $TESTDIR + + j=0 + while (( j < 1 )); do + eval target=\$file$j + test_chmod_basic_access $target ${users[i]} \ + "${users[((i+2))]}" "${users[((i+3))]}" + + eval target=\$dir$j + test_chmod_basic_access $target ${users[i]} \ + "${users[((i+2))]}" "${users[((i+3))]}" + + (( j = j + 1 )) + done + + (( i += 4 )) +done + +log_pass "Verify that the permission of write_xattr for " \ + "owner/group/everyone while remove extended attributes are correct." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cp_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cp_001_pos.ksh new file mode 100644 index 00000000000..e51c6a05c49 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cp_001_pos.ksh @@ -0,0 +1,115 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_cp_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_cp_001_pos +# +# DESCRIPTION: +# Verify that '/bin/cp [-p]' supports ZFS ACL +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special ACE to the file and directory +# 3. Copy the file/directory within and across zfs file system +# 4. Verify that the ACL of file/directroy is not changed, when you are +# inserting an ACL with a user: or group: entry on the top. +# (abstractions entry are treated special, since they represent the +# traditional permission bit mapping.) +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$CP [-p]' supports ZFS ACLs." +log_onexit cleanup + +test_requires ZFS_ACL + +log_note "Create the second zfs file system: $TESTPOOL/$TESTFS1." +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS1 +log_must $CHMOD 777 $TESTDIR1 + +# Define target directory. +dstdir=$TESTDIR1/dstdir.${TESTCASE_ID} + +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + for obj in $testfile $testdir; do + # Create source object and target directroy + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir $dstdir + + # Add the new ACE on the head. + log_must usr_exec $CHMOD \ + A0+user:$ZFS_ACL_OTHER1:read_acl:deny $obj + + cmd_str="$CP -p" + [[ -d $obj ]] && cmd_str="$CP -rp" + log_must usr_exec $cmd_str $obj $dstdir + log_must usr_exec $cmd_str $obj $TESTDIR1 + + for dir in $dstdir $TESTDIR1; do + log_must compare_modes $obj $dir/${obj##*/} + log_must compare_acls $obj $dir/${obj##*/} + done + + # Delete all the test file and directory + log_must usr_exec $RM -rf $TESTDIR/* $TESTDIR1/* + done +done + +log_pass "'$CP [-p]' succeeds to support ZFS ACLs." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cp_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cp_002_pos.ksh new file mode 100644 index 00000000000..67846fee18b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cp_002_pos.ksh @@ -0,0 +1,121 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_cp_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_cp_002_pos +# +# DESCRIPTION: +# Verify that '/bin/cp [-p@]' supports ZFS ACL & xattrs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special ACE to the file and directory +# 3. Create xattr of the file and directory +# 4. Copy the file/directory within and across zfs file system +# 5. Verify that the ACL & xattrs of the file/directroy is not changed, +# when you are inserting an ACL with user: or group: entry on the top. +# (abstractions entry are treated special, since they represent the +# traditional permission bit mapping.) +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$CP [-p]' supports ZFS ACLs." +log_onexit cleanup + +test_requires RUNAT ZFS_ACL ZFS_XATTR + +log_note "Create the second zfs file system: $TESTPOOL/$TESTFS1." +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS1 +log_must $CHMOD 777 $TESTDIR1 + +# Define target directory. +dstdir=$TESTDIR1/dstdir.${TESTCASE_ID} +MYTESTFILE=$STF_SUITE/include/default.cfg + +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + for obj in $testfile $testdir; do + # Create source object and target directroy + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir $dstdir + + log_must usr_exec $RUNAT $testfile $CP $MYTESTFILE attr.0 + log_must usr_exec $RUNAT $testdir $CP $MYTESTFILE attr.0 + + # Add the new ACE on the head. + log_must usr_exec $CHMOD \ + A0+user:$ZFS_ACL_OTHER1:read_acl:deny $obj + + cmd_str="$CP -p@" + [[ -d $obj ]] && cmd_str="$CP -rp@" + log_must usr_exec $cmd_str $obj $dstdir + log_must usr_exec $cmd_str $obj $TESTDIR1 + + for dir in $dstdir $TESTDIR1; do + log_must compare_modes $obj $dir/${obj##*/} + log_must compare_acls $obj $dir/${obj##*/} + log_must compare_xattrs $obj $dir/${obj##*/} + done + + # Delete all the test file and directory + log_must usr_exec $RM -rf $TESTDIR/* $TESTDIR1/* + done +done + +log_pass "'$CP [-p@]' succeeds to support ZFS ACLs." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cpio_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cpio_001_pos.ksh new file mode 100644 index 00000000000..461a4031236 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cpio_001_pos.ksh @@ -0,0 +1,140 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_cpio_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_cpio_001_pos +# +# DESCRIPTION: +# Verify that '$CPIO' command with -P option supports to archive ZFS ACLs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Add new ACE in ACL or change mode of file and directory +# 3. Use $CPIO to archive file and directory +# 4. Extract the archive file +# 5. Verify that the restored ACLs of file and directory identify +# with the origional ones. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + if (( ${#orig_dir} != 0 )); then + cd $orig_dir + fi + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$CPIO' command supports to archive ZFS ACLs." +log_onexit cleanup + +test_requires ZFS_ACL + +set -A ops "A+everyone@:execute:allow" \ + "A3+user:$ZFS_ACL_OTHER1:write_data:deny" \ + "A5+group:$ZFS_ACL_OTHER_GROUP:read_data:deny" \ + "A0+user:$ZFS_ACL_OTHER1:write_data:deny" \ + "A1=user:$ZFS_ACL_STAFF1:write_data:deny" \ + "A5=group:$ZFS_ACL_STAFF_GROUP:write_data:deny" + +log_note "Create second zfs file system to restore the cpio archive." +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 +log_must $CHMOD 777 $TESTDIR1 + +# Define test fine and record the original directory. +CPIOFILE=cpiofile.${TESTCASE_ID} +file=$TESTFILE0 +dir=dir.${TESTCASE_ID} +orig_dir=$PWD + +typeset user +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + typeset -i i=0 + while (( i < ${#ops[*]} )); do + log_note "Create file $file and directory $dir " \ + "in zfs filesystem. " + cd $TESTDIR + log_must usr_exec $TOUCH $file + log_must usr_exec $MKDIR $dir + + log_note "Change the ACLs of file and directory with " \ + "'$CHMOD ${ops[i]}'." + for obj in $file $dir; do + log_must usr_exec $CHMOD ${ops[i]} $obj + done + + log_note "Archive the file and directory." + cd $TESTDIR + log_must eval "usr_exec $LS | " \ + "usr_exec $CPIO -ocP -O $CPIOFILE > /dev/null 2>&1" + + log_note "Restore the cpio archive." + log_must usr_exec $MV $CPIOFILE $TESTDIR1 + cd $TESTDIR1 + log_must eval "usr_exec $CAT $CPIOFILE | " \ + "usr_exec $CPIO -icP > /dev/null 2>&1" + + log_note "Verify that the ACLs of restored file/directory " \ + "have no changes." + for obj in $file $dir; do + log_must compare_modes $TESTDIR/$obj $TESTDIR1/$obj + log_must compare_acls $TESTDIR/$obj $TESTDIR1/$obj + done + + log_must usr_exec $RM -rf $TESTDIR/* $TESTDIR1/* + + (( i = i + 1 )) + done +done + +log_pass "'$CPIO' command succeeds to support ZFS ACLs." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cpio_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cpio_002_pos.ksh new file mode 100644 index 00000000000..68d03f6f76e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_cpio_002_pos.ksh @@ -0,0 +1,144 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_cpio_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_cpio_002_pos +# +# DESCRIPTION: +# Verify that '$CPIO' command with -P@ option supports to archive ZFS ACLs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Add new ACE in ACL or change mode of file and directory +# 3. Create xattr of the file and directory +# 4. Use $CPIO to archive file and directory +# 5. Extract the archive file +# 6. Verify that the restored ACLs of file and directory identify +# with the origional ones. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + if (( ${#orig_dir} != 0 )); then + cd $orig_dir + fi + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$CPIO' command supports to archive ZFS ACLs & xattrs." +log_onexit cleanup + +test_requires RUNAT ZFS_ACL ZFS_XATTR + +set -A ops "A+everyone@:execute:allow" \ + "A3+user:$ZFS_ACL_OTHER1:write_data:deny" \ + "A5+group:$ZFS_ACL_OTHER_GROUP:read_data:deny" \ + "A0+user:$ZFS_ACL_OTHER1:write_data:deny" + +log_note "Create second zfs file system to restore the cpio archive." +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 +log_must $CHMOD 777 $TESTDIR1 + +# Define test fine and record the original directory. +CPIOFILE=cpiofile.${TESTCASE_ID} +file=$TESTFILE0 +dir=dir.${TESTCASE_ID} +orig_dir=$PWD +MYTESTFILE=$STF_SUITE/include/default.cfg + +typeset user +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + typeset -i i=0 + while (( i < ${#ops[*]} )); do + log_note "Create file $file and directory $dir " \ + "in zfs filesystem. " + cd $TESTDIR + log_must usr_exec $TOUCH $file + log_must usr_exec $MKDIR $dir + log_must usr_exec $RUNAT $file $CP $MYTESTFILE attr.0 + log_must usr_exec $RUNAT $dir $CP $MYTESTFILE attr.0 + + log_note "Change the ACLs of file and directory with " \ + "'$CHMOD ${ops[i]}'." + for obj in $file $dir; do + log_must usr_exec $CHMOD ${ops[i]} $obj + done + + log_note "Archive the file and directory." + cd $TESTDIR + log_must eval "usr_exec $LS | " \ + "usr_exec $CPIO -ocP@ -O $CPIOFILE > /dev/null 2>&1" + + log_note "Restore the cpio archive." + log_must usr_exec $MV $CPIOFILE $TESTDIR1 + cd $TESTDIR1 + log_must eval "usr_exec $CAT $CPIOFILE | " \ + "usr_exec $CPIO -icP@ > /dev/null 2>&1" + + log_note "Verify that the ACLs of restored file/directory " \ + "have no changes." + for obj in $file $dir; do + log_must compare_modes $TESTDIR/$obj $TESTDIR1/$obj + log_must compare_acls $TESTDIR/$obj $TESTDIR1/$obj + log_must compare_xattrs $TESTDIR/$obj $TESTDIR1/$obj + done + + log_must usr_exec $RM -rf $TESTDIR/* $TESTDIR1/* + + (( i = i + 1 )) + done +done + +log_pass "'$CPIO' command succeeds to support ZFS ACLs & xattrs." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_find_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_find_001_pos.ksh new file mode 100644 index 00000000000..ab17aa89b72 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_find_001_pos.ksh @@ -0,0 +1,144 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_find_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_find_001_pos +# +# DESCRIPTION: +# Verify that '$FIND' command with '-ls' and '-acl' options supports ZFS ACL +# +# STRATEGY: +# 1. Create 5 files and 5 directories in zfs filesystem +# 2. Select a file or directory and add a few ACEs to it +# 3. Use $FIND -ls to check the "+" existen only with the selected file or +# directory +# 4. Use $FIND -acl to check only the selected file/directory in the list +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + [[ -d $TESTDIR ]] && $RM -rf $TESTDIR/* + (( ${#cwd} != 0 )) && cd $cwd + (( ${#mask} != 0 )) && $UMASK $mask +} + +function find_ls_acl # +{ + typeset opt=$1 # -ls or -acl + typeset obj=$2 + typeset rst_str="" + + if [[ $opt == "ls" ]]; then + rst_str=`$FIND . -ls | $GREP "+" | $AWK '{print $11}'` + else + rst_str=`$FIND . -acl` + fi + + if [[ $rst_str == "./$obj" ]]; then + return 0 + else + return 1 + fi +} + +log_assert "Verify that '$FIND' command supports ZFS ACLs." +log_onexit cleanup + +test_requires ZFS_ACL + +set -A ops " A+everyone@:read_data:allow" \ + " A+owner@:write_data:allow" + +f_base=testfile.${TESTCASE_ID} # Base file name for tested files +d_base=testdir.${TESTCASE_ID} # Base directory name for tested directory +cwd=$PWD +mask=`$UMASK` + +log_note "Create five files and directories in the zfs filesystem. " +cd $TESTDIR +$UMASK 0777 +typeset -i i=0 +while (( i < 5 )) +do + log_must $TOUCH ${f_base}.$i + log_must $MKDIR ${d_base}.$i + + (( i = i + 1 )) +done + +for obj in ${f_base}.3 ${d_base}.3 +do + i=0 + while (( i < ${#ops[*]} )) + do + log_must $CHMOD ${ops[i]} $obj + + (( i = i + 1 )) + done + + for opt in "ls" "acl" + do + log_must find_ls_acl $opt $obj + done + + log_note "Check the file access permission according to the added ACEs" + if [[ ! -r $obj || ! -w $obj ]]; then + log_fail "The added ACEs for $obj cannot be represented in " \ + "mode." + fi + + log_note "Remove the added ACEs from ACL." + i=0 + while (( i < ${#ops[*]} )) + do + log_must $CHMOD A0- $obj + + (( i = i + 1 )) + done +done + +log_pass "'$FIND' command succeeds to support ZFS ACLs." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_ls_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_ls_001_pos.ksh new file mode 100644 index 00000000000..d9f1cd83bbb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_ls_001_pos.ksh @@ -0,0 +1,124 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_ls_001_pos.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_ls_001_pos +# +# DESCRIPTION: +# Verify that '/bin/ls' command option supports ZFS ACL +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Verify that 'ls [-dv]' can list the ACEs of ACL of +# file/directroy +# 3. Change the file/directory's acl +# 4. Verify that 'ls -l' can use the '+' to indicate the non-trivial +# acl. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + (( ${#cwd} != 0 )) && cd $cwd + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + (( ${#mask} != 0 )) && log_must $UMASK $mask +} + +log_assert "Verify that '$LS' command supports ZFS ACLs." +log_onexit cleanup + +test_requires ZFS_ACL + +file=$TESTFILE0 +dir=dir.${TESTCASE_ID} +cwd=$PWD +mask=`$UMASK` +spec_ace="everyone@:write_acl:allow" + +$UMASK 0022 + +log_note "Create file and directory in the zfs filesystem. " +cd $TESTDIR +log_must $TOUCH $file +log_must $MKDIR $dir + +log_note "Verify that '$LS [-dv]' can list file/directory ACEs of its acl." + +typeset -i ace_num=0 +for obj in $file $dir +do + typeset ls_str="" + if [[ -f $obj ]]; then + ls_str="$LS -v" + else + ls_str="$LS -dv" + fi + + for ace_type in "owner@" "group@" "everyone@" + do + $ls_str $obj | $GREP $ace_type > /dev/null 2>&1 + (( $? == 0 )) && (( ace_num += 1 )) + done + + (( ace_num < 1 )) && \ + log_fail "'$LS [-dv] fails to list file/directroy acls." +done + +log_note "Verify that '$LS [-dl] [-dv]' can output '+' to indicate " \ + "the acl existent." + +for obj in $file $dir +do + $CHMOD A0+$spec_ace $obj + + log_must eval "$LS -ld -vd $obj | $GREP "+" > /dev/null" + log_must plus_sign_check_v $obj + + log_must eval "$LS -ld -vd $obj | $GREP $spec_ace > /dev/null" + log_must plus_sign_check_l $obj +done + +log_pass "'$LS' command succeeds to support ZFS ACLs." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_mv_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_mv_001_pos.ksh new file mode 100644 index 00000000000..7718d1e2142 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_mv_001_pos.ksh @@ -0,0 +1,190 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_mv_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_mv_001_pos +# +# DESCRIPTION: +# Verify that '/bin/mv' supports ZFS ACL +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special ACE to the file and directory +# 3. Copy the file/directory within and across zfs file system +# 4. Verify that the ACL of file/directroy is not changed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + (( ${#cwd} != 0 )) && cd $cwd + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + (( ${#mask} != 0 )) && log_must $UMASK $mask +} + +function testing_mv # +{ + typeset flag=$1 + set -A obj $2 $3 + typeset -i i=0 + typeset orig_acl="" + typeset orig_mode="" + typeset dst_acl="" + typeset dst_mode="" + + if [[ $flag == "f" ]]; then + while (( i < ${#obj[*]} )) + do + orig_acl="$(get_acl ${obj[i]})" + orig_mode="$(get_mode ${obj[i]})" + if (( i < 1 )); then + log_must $MV ${obj[i]} $dst_file + dst_acl=$(get_acl $dst_file) + dst_mode=$(get_mode $dst_file) + else + log_must $MV ${obj[i]} $TESTDIR1 + dst_acl=$(get_acl $TESTDIR1/${obj[i]}) + dst_mode=$(get_mode $TESTDIR1/${obj[i]}) + fi + + if [[ "$dst_mode" != "$orig_mode" ]] || \ + [[ "$dst_acl" != "$orig_acl" ]]; then + log_fail "$MV fails to keep the acl for file." + fi + + (( i = i + 1 )) + done + else + while (( i < ${#obj[*]} )) + do + typeset orig_nested_acl="" + typeset orig_nested_mode="" + typeset dst_nested_acl="" + typeset dst_nested_mode="" + + orig_acl=$(get_acl ${obj[i]}) + orig_mode=$(get_mode ${obj[i]}) + orig_nested_acl=$(get_acl ${obj[i]}/$nestedfile) + orig_nested_mode=$(get_mode ${obj[i]}/$nestedfile) + if (( i < 1 )); then + log_must $MV ${obj[i]} $dst_dir + dst_acl=$(get_acl $dst_dir) + dst_mode=$(get_mode $dst_dir) + dst_nested_acl=$(get_acl $dst_dir/$nestedfile) + dst_nested_mode=$(get_mode $dst_dir/$nestedfile) + else + log_must $MV ${obj[i]} $TESTDIR1 + dst_acl=$(get_acl $TESTDIR1/${obj[i]}) + dst_mode=$(get_mode $TESTDIR1/${obj[i]}) + dst_nested_acl=$(get_acl \ + $TESTDIR1/${obj[i]}/$nestedfile) + dst_nested_mode=$(get_mode \ + $TESTDIR1/${obj[i]}/$nestedfile) + fi + + if [[ "$orig_mode" != "$dst_mode" ]] || \ + [[ "$orig_acl" != "$dst_acl" ]] || \ + [[ "$dst_nested_mode" != "$orig_nested_mode" ]] || \ + [[ "$dst_nested_acl" != "$orig_nested_acl" ]]; then + log_fail "$MV fails to recursively keep the acl for " \ + "directory." + fi + + (( i = i + 1 )) + done + fi +} + +log_assert "Verify that '$MV' supports ZFS ACLs." +log_onexit cleanup + +test_requires ZFS_ACL + +spec_ace="everyone@:execute:allow" +set -A orig_file "origfile1.${TESTCASE_ID}" "origfile2.${TESTCASE_ID}" +set -A orig_dir "origdir1.${TESTCASE_ID}" "origdir2.${TESTCASE_ID}" +nestedfile="nestedfile.${TESTCASE_ID}" +dst_file=dstfile.${TESTCASE_ID} +dst_dir=dstdir.${TESTCASE_ID} +cwd=$PWD +mask=`$UMASK` +$UMASK 0022 + +# +# This assertion should only test 'mv' within the same filesystem +# +TESTDIR1=$TESTDIR/testdir1${TESTCASE_ID} + +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 + +log_note "Create files and directories and set special ace on them for testing. " +cd $TESTDIR +typeset -i i=0 +while (( i < ${#orig_file[*]} )) +do + log_must $TOUCH ${orig_file[i]} + log_must $CHMOD A0+$spec_ace ${orig_file[i]} + + (( i = i + 1 )) +done +i=0 +while (( i < ${#orig_dir[*]} )) +do + log_must $MKDIR ${orig_dir[i]} + log_must $TOUCH ${orig_dir[i]}/$nestedfile + + for obj in ${orig_dir[i]} ${orig_dir[i]}/$nestedfile; do + log_must $CHMOD A0+$spec_ace $obj + done + + (( i = i + 1 )) +done + +testing_mv "f" ${orig_file[0]} ${orig_file[1]} +testing_mv "d" ${orig_dir[0]} ${orig_dir[1]} + +log_pass "'$MV' succeeds to support ZFS ACLs." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_tar_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_tar_001_pos.ksh new file mode 100644 index 00000000000..6916253d26f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_tar_001_pos.ksh @@ -0,0 +1,124 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_tar_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_tar_001_pos +# +# DESCRIPTION: +# Verify that '$TAR' command with -p option supports to archive ZFS ACLs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Add new ACE in ACL of file and directory +# 3. Use $TAR to archive file and directory +# 4. Extract the archive file +# 5. Verify that the restored ACLs of file and directory identify +# with the origional ones. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + + (( ${#cwd} != 0 )) && cd $cwd + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR/ ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$TAR' command supports to archive ZFS ACLs." +log_onexit cleanup + +test_requires ZFS_ACL + +set -A ops " A+everyone@:execute:allow" "a-x" "777" + +TARFILE=tarfile.${TESTCASE_ID}.tar +file=$TESTFILE0 +dir=dir.${TESTCASE_ID} +cwd=$PWD + +log_note "Create second zfs file system to restore the tar archive." +log_must $ZFS create $TESTPOOL/$TESTFS1 +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 + +log_note "Create a file: $file, and directory: $dir, in zfs filesystem. " +cd $TESTDIR +log_must $TOUCH $file +log_must $MKDIR $dir + +typeset -i i=0 +while (( i < ${#ops[*]} )) +do + log_note "Change the ACLs of file and directory with " \ + "'$CHMOD ${ops[i]}'." + cd $TESTDIR + for obj in $file $dir; do + log_must $CHMOD ${ops[i]} $obj + done + log_note "Archive the file and directory." + log_must $TAR cpf $TARFILE $file $dir + + log_note "Restore the tar archive." + log_must $MV $TARFILE $TESTDIR1 + cd $TESTDIR1 + log_must $TAR xpf $TARFILE + + log_note "Verify the ACLs of restored file/directory have no changes." + for obj in $file $dir; do + log_must compare_modes $TESTDIR/$obj $TESTDIR1/$obj + log_must compare_acls $TESTDIR/$obj $TESTDIR1/$obj + done + + log_must $RM -rf $TESTDIR1/* + + (( i = i + 1 )) +done + +log_pass "'$TAR' command succeeds to support ZFS ACLs." diff --git a/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_tar_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_tar_002_pos.ksh new file mode 100644 index 00000000000..8a5c95ce09f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/nontrivial/zfs_acl_tar_002_pos.ksh @@ -0,0 +1,131 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_tar_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_acl_tar_002_pos +# +# DESCRIPTION: +# Verify that '$TAR' command with -p@ option supports to archive ZFS ACLs +# & xattrs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Add new ACE in ACL of file and directory +# 3. Create xattr of the file and directory +# 4. Use $TAR cf@ to archive file and directory +# 5. Use $TAR xf@ to extract the archive file +# 6. Verify that the restored ACLs & xttrs of file and directory identify +# with the origional ones. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-12-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + + (( ${#cwd} != 0 )) && cd $cwd + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR/ ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$TAR' command supports to archive ZFS ACLs & xattrs." +log_onexit cleanup + +test_requires RUNAT ZFS_ACL ZFS_XATTR + +set -A ops " A+everyone@:execute:allow" "a-x" "777" +MYTESTFILE=$STF_SUITE/include/default.cfg + +TARFILE=tarfile.${TESTCASE_ID}.tar +cwd=$PWD + +log_note "Create second zfs file system to restore the tar archive." +log_must $ZFS create $TESTPOOL/$TESTFS1 +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 + +log_note "Create a file: $testfile, and directory: $testdir, in zfs filesystem. " \ + "And prepare for there xattr files." + +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + # Create source object and target directroy + cd $TESTDIR + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir + + log_must usr_exec $RUNAT $testfile $CP $MYTESTFILE attr.0 + log_must usr_exec $RUNAT $testdir $CP $MYTESTFILE attr.0 + + # Add the new ACE on the head. + log_note "Change the ACLs of file and directory with " \ + "'$CHMOD ${ops[0]}'." + log_must usr_exec $CHMOD ${ops[0]} $testfile + log_must usr_exec $CHMOD ${ops[0]} $testdir + + log_note "Archive the file and directory." + log_must $TAR cpf@ $TARFILE ${testfile#$TESTDIR/} ${testdir#$TESTDIR/} + + log_note "Restore the tar archive." + cd $TESTDIR1 + log_must $TAR xpf@ $TESTDIR/$TARFILE + + log_note "Verify the ACLs of restored file/directory have no changes." + for obj in $testfile $testdir; do + log_must compare_modes $obj $TESTDIR1/${obj##*/} + log_must compare_acls $obj $TESTDIR1/${obj##*/} + log_must compare_xattrs $obj $TESTDIR1/${obj##*/} + done + + log_must $RM -rf $TESTDIR/* $TESTDIR1/* +done + +log_pass "'$TAR' command succeeds to support ZFS ACLs." diff --git a/tests/sys/cddl/zfs/tests/acl/setup.ksh b/tests/sys/cddl/zfs/tests/acl/setup.ksh new file mode 100644 index 00000000000..db7041d0325 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/setup.ksh @@ -0,0 +1,66 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/acl/acl_common.kshlib + + +# check svc:/network/nis/client:default state +# disable it if the state is ON +# and the state will be restored during cleanup.ksh +if [[ `$UNAME -s` != "FreeBSD" ]]; then + log_must $RM -f $NISSTAFILE + if [[ "ON" == $($SVCS -H -o sta svc:/network/nis/client:default) ]]; then + log_must $SVCADM disable -t svc:/network/nis/client:default + log_must $TOUCH $NISSTAFILE + fi +fi + +cleanup_user_group + +# Add wheel group user +log_must add_user wheel $ZFS_ACL_ADMIN + +# Create staff group and add two user to it +log_must add_group $ZFS_ACL_STAFF_GROUP +log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF1 +log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF2 + +# Create other group and add two user to it +log_must add_group $ZFS_ACL_OTHER_GROUP +log_must add_user $ZFS_ACL_OTHER_GROUP $ZFS_ACL_OTHER1 +log_must add_user $ZFS_ACL_OTHER_GROUP $ZFS_ACL_OTHER2 + +DISK=${DISKS%% *} +default_setup_noexit $DISK +log_must $CHMOD 777 $TESTDIR + +log_pass diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/Makefile b/tests/sys/cddl/zfs/tests/acl/trivial/Makefile new file mode 100644 index 00000000000..dc85ac3f7c6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/Makefile @@ -0,0 +1,33 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/acl/trivial +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= zfs_acl_chmod_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_compress_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_cp_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_cp_002_neg.ksh +${PACKAGE}FILES+= zfs_acl_cp_003_neg.ksh +${PACKAGE}FILES+= zfs_acl_find_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_find_002_neg.ksh +${PACKAGE}FILES+= zfs_acl_ls_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_ls_002_neg.ksh +${PACKAGE}FILES+= zfs_acl_mv_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_pack_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_pax_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_pax_002_pos.ksh +${PACKAGE}FILES+= zfs_acl_pax_003_pos.ksh +${PACKAGE}FILES+= zfs_acl_pax_004_pos.ksh +${PACKAGE}FILES+= zfs_acl_pax_005_pos.ksh +${PACKAGE}FILES+= zfs_acl_pax_006_pos.ksh +${PACKAGE}FILES+= zfs_acl_tar_001_pos.ksh +${PACKAGE}FILES+= zfs_acl_tar_002_neg.ksh + +ATF_TESTS_KSH93+= trivial_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +.include diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/trivial_test.sh b/tests/sys/cddl/zfs/tests/acl/trivial/trivial_test.sh new file mode 100755 index 00000000000..f979cc30c14 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/trivial_test.sh @@ -0,0 +1,516 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_acl_chmod_001_pos cleanup +zfs_acl_chmod_001_pos_head() +{ + atf_set "descr" "Verify chmod permission settings on files and directories" +} +zfs_acl_chmod_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_chmod_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_chmod_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_compress_001_pos cleanup +zfs_acl_compress_001_pos_head() +{ + atf_set "descr" "Compress will keep file attribute intact after the file iscompressed and uncompressed" + atf_set "require.config" zfs_acl zfs_xattr +} +zfs_acl_compress_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_compress_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_compress_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_cp_001_pos cleanup +zfs_acl_cp_001_pos_head() +{ + atf_set "descr" "Verifies that cp will include file attribute when using the -@ flag" + atf_set "require.config" zfs_acl zfs_xattr +} +zfs_acl_cp_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_cp_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_cp_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_cp_002_neg cleanup +zfs_acl_cp_002_neg_head() +{ + atf_set "descr" "Verifies that cp will not include file attribute when the -@ flagis not present." + atf_set "require.config" zfs_acl zfs_xattr +} +zfs_acl_cp_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_cp_002_neg.ksh || atf_fail "Testcase failed" +} +zfs_acl_cp_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_cp_003_neg cleanup +zfs_acl_cp_003_neg_head() +{ + atf_set "descr" "Verifies that cp won't be able to include file attribute whenattribute is unreadable (except root)" + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" runat +} +zfs_acl_cp_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_cp_003_neg.ksh || atf_fail "Testcase failed" +} +zfs_acl_cp_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_find_001_pos cleanup +zfs_acl_find_001_pos_head() +{ + atf_set "descr" "Verifies ability to find files with attribute with-xattr flag and using '-exec runat ls'" + atf_set "require.config" zfs_acl zfs_xattr +} +zfs_acl_find_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_find_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_find_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_find_002_neg cleanup +zfs_acl_find_002_neg_head() +{ + atf_set "descr" "verifies -xattr doesn't include files withoutattribute and using '-exec runat ls'" + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" runat +} +zfs_acl_find_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_find_002_neg.ksh || atf_fail "Testcase failed" +} +zfs_acl_find_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_ls_001_pos cleanup +zfs_acl_ls_001_pos_head() +{ + atf_set "descr" "Verifies that ls displays @ in the file permissions using ls -@for files with attribute." + atf_set "require.config" zfs_acl zfs_xattr +} +zfs_acl_ls_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_ls_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_ls_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_ls_002_neg cleanup +zfs_acl_ls_002_neg_head() +{ + atf_set "descr" "Verifies that ls doesn't display @ in the filepermissions using ls -@ for files without attribute." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" runat +} +zfs_acl_ls_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_ls_002_neg.ksh || atf_fail "Testcase failed" +} +zfs_acl_ls_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_mv_001_pos cleanup +zfs_acl_mv_001_pos_head() +{ + atf_set "descr" "Verifies that mv will include file attribute." + atf_set "require.config" zfs_acl zfs_xattr +} +zfs_acl_mv_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_mv_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_mv_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_pack_001_pos cleanup +zfs_acl_pack_001_pos_head() +{ + atf_set "descr" "Verifies that pack will keep file attribute intact after the fileis packed and unpacked" + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" unpack pack +} +zfs_acl_pack_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_pack_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_pack_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_pax_001_pos cleanup +zfs_acl_pax_001_pos_head() +{ + atf_set "descr" "Verify include attribute in pax archive and restore with paxshould succeed." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" pax +} +zfs_acl_pax_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_pax_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_pax_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_pax_002_pos cleanup +zfs_acl_pax_002_pos_head() +{ + atf_set "descr" "Verify include attribute in pax archive and restore with tarshould succeed." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" pax +} +zfs_acl_pax_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_pax_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_pax_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_pax_003_pos cleanup +zfs_acl_pax_003_pos_head() +{ + atf_set "descr" "Verify include attribute in pax archive and restore with cpioshould succeed." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" pax +} +zfs_acl_pax_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_pax_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_pax_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_pax_004_pos cleanup +zfs_acl_pax_004_pos_head() +{ + atf_set "descr" "Verify files include attribute in pax archive and restore with paxshould succeed." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" pax +} +zfs_acl_pax_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_pax_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_pax_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_pax_005_pos cleanup +zfs_acl_pax_005_pos_head() +{ + atf_set "descr" "Verify files include attribute in cpio archive and restore withcpio should succeed." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" pax +} +zfs_acl_pax_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_pax_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_pax_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_pax_006_pos cleanup +zfs_acl_pax_006_pos_head() +{ + atf_set "descr" "Verify files include attribute in tar archive and restore withtar should succeed." + atf_set "require.config" zfs_acl zfs_xattr + atf_set "require.progs" pax +} +zfs_acl_pax_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_pax_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_pax_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_tar_001_pos cleanup +zfs_acl_tar_001_pos_head() +{ + atf_set "descr" "Verifies that tar will include file attribute when @ flag ispresent." + atf_set "require.config" zfs_acl zfs_xattr +} +zfs_acl_tar_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_tar_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_acl_tar_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_acl_tar_002_neg cleanup +zfs_acl_tar_002_neg_head() +{ + atf_set "descr" "Verifies that tar will not include files attribute when @ flag isnot present" + atf_set "require.config" zfs_acl zfs_xattr +} +zfs_acl_tar_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/../setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_acl_tar_002_neg.ksh || atf_fail "Testcase failed" +} +zfs_acl_tar_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/../acl.cfg + + ksh93 $(atf_get_srcdir)/../cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_acl_chmod_001_pos + atf_add_test_case zfs_acl_compress_001_pos + atf_add_test_case zfs_acl_cp_001_pos + atf_add_test_case zfs_acl_cp_002_neg + atf_add_test_case zfs_acl_cp_003_neg + atf_add_test_case zfs_acl_find_001_pos + atf_add_test_case zfs_acl_find_002_neg + atf_add_test_case zfs_acl_ls_001_pos + atf_add_test_case zfs_acl_ls_002_neg + atf_add_test_case zfs_acl_mv_001_pos + atf_add_test_case zfs_acl_pack_001_pos + atf_add_test_case zfs_acl_pax_001_pos + atf_add_test_case zfs_acl_pax_002_pos + atf_add_test_case zfs_acl_pax_003_pos + atf_add_test_case zfs_acl_pax_004_pos + atf_add_test_case zfs_acl_pax_005_pos + atf_add_test_case zfs_acl_pax_006_pos + atf_add_test_case zfs_acl_tar_001_pos + atf_add_test_case zfs_acl_tar_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_chmod_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_chmod_001_pos.ksh new file mode 100644 index 00000000000..48ef92f5486 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_chmod_001_pos.ksh @@ -0,0 +1,151 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_chmod_001_pos.ksh 1.5 09/01/13 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_chmod_001_pos +# +# DESCRIPTION: +# Verify chmod permission settings on files and directories, as both root +# and non-root users. +# +# STRATEGY: +# 1. Loop root and $ZFS_ACL_STAFF1 as root and non-root users. +# 2. Create test file and directory in zfs filesystem. +# 3. Execute 'chmod' with specified options. +# 4. Check 'ls -l' output and compare with expect results. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# "init_map" "options" "expect_map" +set -A argv \ + "000" "a+rw" "rw-rw-rw-" "000" "a+rwx" "rwxrwxrwx" \ + "000" "u+xr" "r-x------" "000" "gu-xw" "---------" \ + "644" "a-r" "-w-------" "644" "augo-x" "rw-r--r--" \ + "644" "=x" "--x--x--x" "644" "u-rw" "---r--r--" \ + "644" "uo+x" "rwxr--r-x" "644" "ga-wr" "---------" \ + "777" "augo+x" "rwxrwxrwx" "777" "go-xr" "rwx-w--w-" \ + "777" "o-wx" "rwxrwxr--" "777" "ou-rx" "-w-rwx-w-" \ + "777" "a+rwx" "rwxrwxrwx" "777" "u=rw" "rw-rwxrwx" \ + "000" "123" "--x-w--wx" "000" "412" "r----x-w-" \ + "231" "562" "r-xrw--w-" "712" "000" "---------" \ + "777" "121" "--x-w---x" "123" "775" "rwxrwxr-x" + +log_assert " Verify chmod permission settings on files and directories" +log_onexit cleanup + +# +# Verify file or directory have correct map after chmod +# +# $1 file or directory +# +function test_chmod_mapping # +{ + typeset node=$1 + typeset -i i=0 + + while (( i < ${#argv[@]} )); do + usr_exec $CHMOD ${argv[i]} $node + if (($? != 0)); then + log_note "usr_exec $CHMOD ${argv[i]} $node" + return 1 + fi + + usr_exec $CHMOD ${argv[((i + 1))]} $node + if (($? != 0)); then + log_note "usr_exec $CHMOD ${argv[((i + 1))]} $node" + return 1 + fi + + typeset mode + mode=$(get_mode ${node}) + + if [[ $mode != "-${argv[((i + 2))]}"* && \ + $mode != "d${argv[((i + 2))]}"* ]] + then + log_fail "FAIL: '${argv[i]}' '${argv[((i + 1))]}' \ + '${argv[((i + 2))]}'" + fi + + (( i += 3 )) + done + + return 0 +} + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + # Test file + log_must usr_exec $TOUCH $testfile + log_must test_chmod_mapping $testfile + + if [ "$ZFS_ACL" != "" ] ; then + log_must $CHMOD A+user:$ZFS_ACL_STAFF2:write_acl:allow $testfile + fi + log_must set_cur_usr $ZFS_ACL_STAFF2 + + # Test directory + log_must usr_exec $MKDIR $testdir + log_must test_chmod_mapping $testdir + + if [ "$ZFS_ACL" != "" ] ; then + # Grant privileges of write_acl and retest the chmod commands. + acl="user:$ZFS_ACL_STAFF2:write_acl:allow" + log_must usr_exec $CHMOD A+${acl} $testfile + log_must usr_exec $CHMOD A+${acl} $testdir + + log_must set_cur_usr $ZFS_ACL_STAFF2 + log_must test_chmod_mapping $testfile + log_must test_chmod_mapping $testdir + fi + + log_must set_cur_usr $user + + log_must usr_exec $RM $testfile + log_must usr_exec $RM -rf $testdir +done + +log_pass "Setting permissions using 'chmod' completed successfully." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_compress_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_compress_001_pos.ksh new file mode 100644 index 00000000000..bae12eb9b19 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_compress_001_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_compress_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_compress_001_pos +# +# DESCRIPTION: +# The function verifies that compress will keep file attribute intact +# after the file is compressed and uncompressed. +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Save all files and their attribute files cksum value, then compress +# all the files. +# 3. Move them to another directory B. +# 4. Uncompress them and calculate all the files and attribute files cksum +# 5. Verify all the cksum are identical +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Compress will keep file attribute intact after the file is " \ + "compressed and uncompressed" +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must usr_exec $COMPRESS $INI_DIR/* + log_must usr_exec $MV $INI_DIR/* $TST_DIR + log_must usr_exec $UNCOMPRESS $TST_DIR/* + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "compress/uncompress test passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_001_pos.ksh new file mode 100644 index 00000000000..8bd0f21239b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_001_pos.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_cp_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_cp_001_pos +# +# DESCRIPTION: +# Verifies that cp will include file attribute when using the -@ flag +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Save all files and their attribute files cksum value, then 'cp -@p' +# all the files to to another directory B. +# 3. Calculate all the cksum in directory B. +# 4. Verify all the cksum are identical +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that cp will include file attribute when using the -@ flag" +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while ((i < NUM_FILE)); do + f=$(getitem $i $initfiles) + + usr_exec $CP -@p $f $TST_DIR + + ((i += 1)) + done + + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "'cp -@' include file attribute passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_002_neg.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_002_neg.ksh new file mode 100644 index 00000000000..37170f2ecc9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_002_neg.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_cp_002_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_cp_002_neg +# +# DESCRIPTION: +# Verifies that cp will not include file attribute when the -@ flag is not +# present. +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Implement cp to files without '-@' +# 3. Verify attribute files will not include file attribute +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that cp will not include file attribute when the -@ flag "\ + "is not present." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + typeset f=$(getitem $i $initfiles) + usr_exec $CP $f $TST_DIR + + testfiles=$($LS -R $TST_DIR/*) + tf=$(getitem $i $testfiles) + ls_attr=$($LS -@ $tf | $AWK '{print substr($1, 11, 1)}') + if [[ $ls_attr == "@" ]]; then + log_fail "cp of attribute should fail without " \ + "-@ or -p option" + fi + + (( i += 1 )) + done + + log_must cleanup +done + +log_pass "'cp' won't include file attribute passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_003_neg.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_003_neg.ksh new file mode 100644 index 00000000000..8bf36b58b5a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_cp_003_neg.ksh @@ -0,0 +1,138 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_cp_003_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_cp_003_neg +# +# DESCRIPTION: +# Verifies that cp will not be able to include file attribute when +# attribute is unreadable (unless the user is root) +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. chmod all files'the attribute files to '000'. +# 3. Implement 'cp -@p' to files. +# 4. Verify attribute files are not existing for non-root user. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that cp won't be able to include file attribute when " \ + "attribute is unreadable (except root)" +log_onexit cleanup + +test_requires RUNAT ZFS_ACL ZFS_XATTR + +function test_unreadable_attr +{ + typeset initfiles=$($LS -R $INI_DIR/*) + + typeset -i i=0 + while (( i < NUM_FILE )); do + typeset f=$(getitem $i $initfiles) + typeset -i j=0 + while (( j < NUM_ATTR )); do + # chmod all the attribute files to '000'. + usr_exec $RUNAT $f $CHMOD 000 attribute.$j + + (( j += 1 )) + done + + # + # Implement 'cp -@p' to the file whose attribute files + # models are '000'. + # + usr_exec $CP -@p $f $TST_DIR > /dev/null 2>&1 + + typeset testfiles=$($LS -R $TST_DIR/*) + typeset tf=$(getitem $i $testfiles) + typeset ls_attr=$(usr_exec $LS -@ $tf | \ + $AWK '{print substr($1, 11, 1)}') + + case $ZFS_ACL_CUR_USER in + root) + case $ls_attr in + @) + log_note "SUCCESS: root enable to cp attribute"\ + "when attribute files is unreadable" + break ;; + *) + log_fail "root should enable to cp attribute " \ + "when attribute files is unreadable" + break ;; + esac + ;; + $ZFS_ACL_STAFF1) + case $ls_attr in + @) + log_fail "non-root shouldn't enable to cp " \ + "attribute when attribute files is " \ + "unreadable." + break ;; + *) + log_note "SUCCESS: non-root doesn't enable to "\ + "cp attribute when attribute files is "\ + "unreadable." + break ;; + esac + ;; + *) + esac + + + (( i += 1 )) + done +} + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + test_unreadable_attr + + log_must cleanup +done + +log_pass "'cp -@p' won't include file attribute passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_find_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_find_001_pos.ksh new file mode 100644 index 00000000000..74fd5e93904 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_find_001_pos.ksh @@ -0,0 +1,101 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_find_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_find_001_pos +# +# DESCRIPTION: +# Verifies ability to find files with attribute with -xattr flag and using +# "-exec runat ls". +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Verify all the specified files can be found with '-xattr', +# 3. Verify all the attribute files can be found with '-exec runat ls' +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies ability to find files with attribute with" \ + "-xattr flag and using '-exec runat ls'" +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + initfiles=$($LS -R $INI_DIR/*) + + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + ff=$(usr_exec $FIND $INI_DIR -type f -name ${f##*/} \ + -xattr -print) + if [[ $ff != $f ]]; then + log_fail "find file containing attribute fail." + else + log_note "find $f by '-xattr'." + fi + + typeset -i j=0 + while (( j < NUM_ATTR )); do + typeset af=attribute.$j + fa=$(usr_exec $FIND $INI_DIR -type f -name ${f##*/} \ + -xattr -exec runat {} ls $af \\\;) + if [[ $fa != $af ]]; then + log_fail "find file attribute fail" + fi + (( j += 1 )) + done + (( i += 1 )) + log_note "find all attribute files of $f" + done + + log_must cleanup +done + +log_pass "find files with -xattr passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_find_002_neg.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_find_002_neg.ksh new file mode 100644 index 00000000000..ad67ddc0812 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_find_002_neg.ksh @@ -0,0 +1,107 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_find_002_neg.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_find_002_neg +# +# DESCRIPTION: +# Verifies ability to find files with attribute with -xattr flag and using +# "-exec runat ls". +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Delete all the attribute files. +# 2. Verify all the specified files can not be found with '-xattr', +# 3. Verify all the attribute files can not be found with '-exec runat ls' +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "verifies -xattr doesn't include files without " \ + "attribute and using '-exec runat ls'" +log_onexit cleanup + +test_requires RUNAT ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + usr_exec $RUNAT $f $RM attribute* + (( i += 1 )) + done + + i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + ff=$(usr_exec $FIND $INI_DIR -type f -name ${f##*/} \ + -xattr -print) + if [[ $ff == $f ]]; then + log_fail "find not containing attribute should fail." + fi + + typeset -i j=0 + while (( j < NUM_ATTR )); do + fa=$(usr_exec $FIND $INI_DIR -type f -name ${f##*/} \ + -xattr -exec $RUNAT {} $LS attribute.$j \\\;) + if [[ $fa == attribute.$j ]]; then + log_fail "find file attribute should fail." + fi + (( j += 1 )) + done + log_note "Failed to find $f and its attribute file as expected." + + (( i += 1 )) + done + + log_must cleanup +done + +log_pass "find files which have no attrabute files with -xattr passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_ls_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_ls_001_pos.ksh new file mode 100644 index 00000000000..18dbf490703 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_ls_001_pos.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_ls_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_ls_001_pos +# +# DESCRIPTION: +# Verifies that ls displays @ in the file permissions using ls -@ +# for files with attribute. +# +# STRATEGY: +# 1. Create files with attribute files in directory A. +# 2. Verify 'ls -l' can display @ in file permissions. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that ls displays @ in the file permissions using ls -@ " \ + "for files with attribute." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + ls_attr=$(usr_exec $LS -@ $f | $AWK '{print substr($1, 11, 1)}') + if [[ $ls_attr != "@" ]]; then + log_fail "ls -@ $f with attribute should success." + else + log_note "ls -@ $f with attribute success." + fi + + (( i += 1 )) + done + + log_must cleanup +done + +log_pass "ls display @ in file permission passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_ls_002_neg.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_ls_002_neg.ksh new file mode 100644 index 00000000000..d99f60fa580 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_ls_002_neg.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_ls_002_neg.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_ls_002_neg +# +# DESCRIPTION: +# Verifies that ls doesn't display @ in the file permissions using ls -@ +# for files without attribute. +# +# STRATEGY: +# 1. Create files with attribute files in directory A. +# 2. Removed all attribute files. +# 3. Verify 'ls -l' can't display @ in file permission. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that ls doesn't display @ in the file " \ + "permissions using ls -@ for files without attribute." +log_onexit cleanup + +test_requires RUNAT ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + log_must usr_exec $RUNAT $f $RM attribute* + + ls_attr=$(usr_exec $LS -l $f | $AWK '{print substr($1, 11, 1)}') + if [[ $ls_attr == "@" ]]; then + log_fail "ls with attribute shouldn't success." + fi + + (( i += 1 )) + done + + log_must cleanup +done + +log_pass "ls doesn't display @ in file permissions passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_mv_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_mv_001_pos.ksh new file mode 100644 index 00000000000..b221fe0d1b3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_mv_001_pos.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_mv_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_mv_001_pos +# +# DESCRIPTION: +# Verifies that mv will include file attribute. +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Save all files and their attribute files cksum value +# 3. Move them to another directory B. +# 4. Calculate all the files and attribute files cksum +# 5. Verify all the cksum are identical +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that mv will include file attribute." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must usr_exec $MV $INI_DIR/* $TST_DIR + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "mv file include attribute passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pack_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pack_001_pos.ksh new file mode 100644 index 00000000000..d2eeef3a179 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pack_001_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_pack_001_pos.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_pack_001_pos +# +# DESCRIPTION: +# Verifies that pack will keep file attribute intact afterthe file is +# packed and unpacked. +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Save all files and their attribute files cksum value, then pack +# all the files. +# 3. Move them to another directory B. +# 4. Unpack them and calculate all the files and attribute files cksum +# 5. Verify all the cksum are identical +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that pack will keep file attribute intact after the file "\ + "is packed and unpacked" +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must eval "usr_exec $PACK -f $INI_DIR/* > /dev/null 2>&1" + log_must usr_exec $MV $INI_DIR/* $TST_DIR + log_must eval "usr_exec $UNPACK $TST_DIR/* > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "pack/unpack test passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_001_pos.ksh new file mode 100644 index 00000000000..f14b6f97941 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_001_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_pax_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_pax_001_pos +# +# DESCRIPTION: +# Verify directories include attribute in pax archive and restore with pax +# should succeed. +# +# STRATEGY: +# 1. Use mktree create a set of directories in directory A. +# 2. Enter into directory A and record all directory information. +# 3. pax all the files to directory B. +# 4. Then pax the pax file to directory C. +# 5. Record all the directories informat in derectory C. +# 6. Verify the two records should be identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify include attribute in pax archive and restore with pax " \ + "should succeed." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + [[ ! -d $INI_DIR ]] && log_must usr_exec $MKDIR -m 777 -p $INI_DIR + log_must usr_exec $MKTREE -b $INI_DIR -l 6 -d 2 -f 2 + + # + # Enter into initial directory and record all directory information, + # then pax all the files to $TMP_DIR/files.pax. + # + [[ ! -d $TMP_DIR ]] && log_must usr_exec $MKDIR $TMP_DIR + initout=$TMP_DIR/initout.${TESTCASE_ID} + paxout=$TMP_DIR/files.pax + + cd $INI_DIR + log_must eval "record_cksum $INI_DIR $initout > /dev/null 2>&1" + log_must eval "usr_exec $PAX -w -@ -f $paxout * > /dev/null 2>&1" + + # + # Enter into test directory and pax $TMP_DIR/files.pax to current + # directory. Record all directory information and compare with initial + # directory record. + # + [[ ! -d $TST_DIR ]] && log_must usr_exec $MKDIR -m 777 $TST_DIR + testout=$TMP_DIR/testout.${TESTCASE_ID} + cd $TST_DIR + log_must eval "usr_exec $PAX -r -@ -f $paxout > /dev/null 2>&1" + log_must eval "record_cksum $TST_DIR $testout > /dev/null 2>&1" + + log_must usr_exec $DIFF $initout $testout + + log_must cleanup +done + +log_pass "Directories pax archive and restre with pax passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_002_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_002_pos.ksh new file mode 100644 index 00000000000..0ed59d1c98b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_002_pos.ksh @@ -0,0 +1,103 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_pax_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_pax_002_pos +# +# DESCRIPTION: +# Verify directories which include attribute in pax archive and restore +# with tar should succeed. +# +# STRATEGY: +# 1. Use mktree create a set of directories in directory A. +# 2. Enter into directory A and record all directory information. +# 3. pax all the files to directory B. +# 4. Then tar the pax file to directory C. +# 5. Record all the directories informat in derectory C. +# 6. Verify the two records should be identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify include attribute in pax archive and restore with tar " \ + "should succeed." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + [[ ! -d $INI_DIR ]] && log_must usr_exec $MKDIR -m 777 $INI_DIR + log_must usr_exec $MKTREE -b $INI_DIR -l 6 -d 2 -f 2 + + # + # Enter into initial directory and record all directory information, + # then pax all the files to $TMP_DIR/files.pax. + # + [[ ! -d $TMP_DIR ]] && log_must usr_exec $MKDIR -m 777 $TMP_DIR + initout=$TMP_DIR/initout.${TESTCASE_ID} + paxout=$TMP_DIR/files.tar + cd $INI_DIR + log_must eval "record_cksum $INI_DIR $initout > /dev/null 2>&1" + log_must eval "usr_exec $PAX -w -x ustar -@ -f $paxout *>/dev/null 2>&1" + + # + # Enter into test directory and tar $TMP_DIR/files.pax to current + # directory. Record all directory information and compare with initial + # directory record. + # + [[ ! -d $TST_DIR ]] && log_must usr_exec $MKDIR -m 777 $TST_DIR + testout=$TMP_DIR/testout.${TESTCASE_ID} + cd $TST_DIR + log_must eval "usr_exec $TAR xpf@ $paxout > /dev/null 2>&1" + log_must eval "record_cksum $TST_DIR $testout > /dev/null 2>&1" + + log_must usr_exec $DIFF $initout $testout + + log_must cleanup +done + +log_pass "Directories pax archive and restore with pax passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_003_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_003_pos.ksh new file mode 100644 index 00000000000..9f37d294b03 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_003_pos.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_pax_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_pax_003_pos +# +# DESCRIPTION: +# Verify directories which include attribute in pax archive and restore +# with cpio should succeed. +# +# STRATEGY: +# 1. Create several files in directory A. +# 2. Enter into directory A and record all directory cksum. +# 3. pax all the files to directory B. +# 4. Then cpio the pax file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify include attribute in pax archive and restore with cpio " \ + "should succeed." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + [[ ! -d $INI_DIR ]] && log_must usr_exec $MKDIR -m 777 -p $INI_DIR + log_must usr_exec $MKTREE -b $INI_DIR -l 6 -d 2 -f 2 + + initout=$TMP_DIR/initout.${TESTCASE_ID} + paxout=$TMP_DIR/files.cpio + cd $INI_DIR + log_must eval "record_cksum $INI_DIR $initout > /dev/null 2>&1" + log_must eval "usr_exec $PAX -w -x cpio -@ -f $paxout * >/dev/null 2>&1" + + # + # Enter into test directory and cpio $TMP_DIR/files.pax to current + # directory. Record all directory information and compare with initial + # directory record. + # + [[ ! -d $TST_DIR ]] && log_must usr_exec $MKDIR -m 777 $TST_DIR + testout=$TMP_DIR/testout.${TESTCASE_ID} + cd $TST_DIR + log_must eval "usr_exec $CPIO -ivd@ < $paxout" > /dev/null 2>&1 + log_must eval "record_cksum $TST_DIR $testout > /dev/null 2>&1" + + log_must usr_exec $DIFF $initout $testout + + log_must cleanup +done + +log_pass "Directories pax archive and restore with cpio passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_004_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_004_pos.ksh new file mode 100644 index 00000000000..a7527b41d04 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_004_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_pax_004_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_pax_004_pos +# +# DESCRIPTION: +# Verify files include attribute in pax archive and restore with pax +# should succeed. +# +# STRATEGY: +# 1. Create several files which contains contribute files in directory A. +# 2. Enter into directory A and record all files cksum. +# 3. pax all the files to directory B. +# 4. Then pax the pax file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify files include attribute in pax archive and restore with pax " \ + "should succeed." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + # + # Enter into initial directory and record all files cksum, + # then pax all the files to $TMP_DIR/files.pax. + # + paxout=$TMP_DIR/files.pax + cd $INI_DIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must eval "usr_exec $PAX -w -@ -f $paxout * > /dev/null 2>&1" + + # + # Enter into test directory and pax $TMP_DIR/files.pax to current + # directory. Record all directory information and compare with initial + # directory record. + # + cd $TST_DIR + log_must eval "usr_exec $PAX -r -@ -f $paxout > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "Files pax archive and restre with pax passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_005_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_005_pos.ksh new file mode 100644 index 00000000000..53bc024c451 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_005_pos.ksh @@ -0,0 +1,111 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_pax_005_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_pax_005_pos +# +# DESCRIPTION: +# Verify files include attribute in cpio archive and restore with cpio +# should succeed. +# +# STRATEGY: +# 1. Create several files which contains contribute files in directory A. +# 2. Enter into directory A and record all files cksum. +# 3. pax all the files to directory B. +# 4. Then pax the pax file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify files include attribute in cpio archive and restore with " \ + "cpio should succeed." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + # + # Enter into initial directory and record all files cksum, + # then pax all the files to $TMP_DIR/files.pax. + # + paxout=$TMP_DIR/files.cpio + cd $INI_DIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must eval "usr_exec $PAX -w -x cpio -@ -f $paxout * >/dev/null 2>&1" + + # + # Enter into test directory and pax $TMP_DIR/files.cpio to current + # directory. Record all directory information and compare with initial + # directory record. + # + cd $TST_DIR + log_must eval "usr_exec $PAX -r -x cpio -@ -f $paxout > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must usr_exec $RM -rf * + log_must eval "usr_exec $CPIO -iv@ < $paxout > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "Files 'pax cpio' archive and restre with 'pax cpio' passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_006_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_006_pos.ksh new file mode 100644 index 00000000000..a59e7858312 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_pax_006_pos.ksh @@ -0,0 +1,111 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_pax_006_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_pax_006_pos +# +# DESCRIPTION: +# Verify files include attribute in tar archive and restore with tar +# should succeed. +# +# STRATEGY: +# 1. Create several files which contains contribute files in directory A. +# 2. Enter into directory A and record all files cksum. +# 3. 'pax ustar' all the files to directory B. +# 4. Then 'pax ustar' the pax file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify files include attribute in tar archive and restore with " \ + "tar should succeed." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + # + # Enter into initial directory and record all files cksum, + # then pax all the files to $TMP_DIR/files.pax. + # + paxout=$TMP_DIR/files.tar + cd $INI_DIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must eval "usr_exec $PAX -w -x ustar -@ -f $paxout *>/dev/null 2>&1" + + # + # Enter into test directory and pax $TMP_DIR/files.tar to current + # directory. Record all directory information and compare with initial + # directory record. + # + cd $TST_DIR + log_must eval "usr_exec $PAX -r -x ustar -@ -f $paxout > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must usr_exec $RM -rf * + log_must usr_exec $TAR xf@ $paxout + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "Files 'pax tar' archive and restre with 'pax tar' passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_tar_001_pos.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_tar_001_pos.ksh new file mode 100644 index 00000000000..60f344e7286 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_tar_001_pos.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_tar_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_tar_001_pos +# +# DESCRIPTION: +# Verifies that tar will include file attribute when @ flag is present. +# +# STRATEGY: +# 1. Use mktree create a set of directories in directory A. +# 2. Enter into directory A and record all directory information. +# 3. tar all the files to directory B. +# 4. Then tar the tar file to directory C. +# 5. Record all the directories informat in derectory C. +# 6. Verify the two records should be identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that tar will include file attribute when @ flag is " \ + "present." +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + [[ ! -d $INI_DIR ]] && $MKDIR -m 777 -p $INI_DIR + log_must usr_exec $MKTREE -b $INI_DIR -l 5 -d 2 -f 2 + + # + # Enter into initial directory and record all directory information, + # then tar all the files to $TMP_DIR/files.tar. + # + [[ ! -d $TMP_DIR ]] && usr_exec $MKDIR $TMP_DIR + initout=$TMP_DIR/initout.${TESTCASE_ID} + tarout=$TMP_DIR/files.tar + cd $INI_DIR + log_must record_cksum $INI_DIR $initout + log_must usr_exec $TAR cpf@ $tarout * + + # + # Enter into test directory and tar $TMP_DIR/files.tar to current + # directory. Record all directory information and compare with initial + # directory record. + # + [[ ! -d $TST_DIR ]] && $MKDIR -m 777 $TST_DIR + testout=$TMP_DIR/testout.${TESTCASE_ID} + cd $TST_DIR + log_must usr_exec $TAR xpf@ $tarout + log_must record_cksum $TST_DIR $testout + + log_must usr_exec $DIFF $initout $testout + + log_must cleanup +done + +log_pass "Verify tar with @ passed." diff --git a/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_tar_002_neg.ksh b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_tar_002_neg.ksh new file mode 100644 index 00000000000..7dc96448c81 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/acl/trivial/zfs_acl_tar_002_neg.ksh @@ -0,0 +1,118 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_acl_tar_002_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/acl/acl_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_acl_tar_002_neg +# +# DESCRIPTION: +# Verifies that tar will not include files attribute when @ flag is not +# present. +# +# STRATEGY: +# 1. Create several files with attribute files. +# 2. Enter into directory A and record all files cksum +# 3. tar all the files to directory B. +# 4. Then tar the tar file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be not identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verifies that tar will not include files attribute when @ flag is "\ + "not present" +log_onexit cleanup + +test_requires ZFS_ACL ZFS_XATTR + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + # + # Enter into initial directory and record all directory information, + # then tar all the files to $TMP_DIR/files.tar. + # + tarout=$TMP_DIR/files.tar + cd $INI_DIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must usr_exec $TAR cpf $tarout * + + # + # Enter into test directory and tar $TMP_DIR/files.tar to current + # directory. Record all directory information and compare with initial + # directory record. + # + cd $TST_DIR + log_must usr_exec $CP $tarout $TST_DIR + log_must usr_exec $TAR xpf $tarout + + testfiles=$($LS -R $TST_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $testfiles) + ls_attr=$($LS -@ $f | $AWK '{print substr($1, 11, 1)}') + if [[ $ls_attr == "@" ]]; then + log_fail "extraction of attribute successful w/ -@ flag" + fi + + (( i += 1 )) + done + + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_mustnot compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "Verify tar without @ passed." diff --git a/tests/sys/cddl/zfs/tests/atime/Makefile b/tests/sys/cddl/zfs/tests/atime/Makefile new file mode 100644 index 00000000000..3779549eca8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/atime/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/atime +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= atime.cfg +${PACKAGE}FILES+= atime_001_pos.ksh +${PACKAGE}FILES+= atime_002_neg.ksh +${PACKAGE}FILES+= atime_common.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +ATF_TESTS_KSH93+= atime_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +.include diff --git a/tests/sys/cddl/zfs/tests/atime/atime.cfg b/tests/sys/cddl/zfs/tests/atime/atime.cfg new file mode 100644 index 00000000000..005a4c3642c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/atime/atime.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)atime.cfg 1.3 08/08/15 SMI" +# + +export TESTCLONE=testclone${TESTCASE_ID} +export TESTSNAP=testsnap${TESTCASE_ID} + +export TESTFILE=testfile diff --git a/tests/sys/cddl/zfs/tests/atime/atime_001_pos.ksh b/tests/sys/cddl/zfs/tests/atime/atime_001_pos.ksh new file mode 100644 index 00000000000..f7f81d036cb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/atime/atime_001_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)atime_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/atime/atime_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: atime_001_pos +# +# DESCRIPTION: +# When atime=on, verify the access time for files is updated when read. It +# is available to fs and clone. To snapshot, it is unavailable. +# +# STRATEGY: +# 1. Create pool and fs. +# 2. Create '$TESTFILE' for fs. +# 3. Create snapshot and clone. +# 4. Setting atime=on on datasets except snapshot, and read '$TESTFILE'. +# 5. Expect the access time is updated on datasets except snapshot. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Setting atime=on, the access time for files is updated when read." +log_onexit cleanup + +# +# Create $TESTFILE, snapshot and clone. +# +setup_snap_clone + +for dst in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCLONE $TESTPOOL/$TESTFS@$TESTSNAP +do + typeset mtpt=$(get_prop mountpoint $dst) + + if [[ $dst == $TESTPOOL/$TESTFS@$TESTSNAP ]]; then + mtpt=$(snapshot_mountpoint $dst) + log_mustnot check_atime_updated $mtpt/$TESTFILE + else + log_must $ZFS set atime=on $dst + log_must check_atime_updated $mtpt/$TESTFILE + fi +done + +log_pass "Verify the property atime=on passed." diff --git a/tests/sys/cddl/zfs/tests/atime/atime_002_neg.ksh b/tests/sys/cddl/zfs/tests/atime/atime_002_neg.ksh new file mode 100644 index 00000000000..0f9aeaf45ee --- /dev/null +++ b/tests/sys/cddl/zfs/tests/atime/atime_002_neg.ksh @@ -0,0 +1,86 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)atime_002_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/atime/atime_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: atime_002_neg +# +# DESCRIPTION: +# When atime=off, verify the access time for files is not updated when read. +# It is available to pool, fs snapshot and clone. +# +# STRATEGY: +# 1. Create pool, fs. +# 2. Create '$TESTFILE' for fs. +# 3. Create snapshot and clone. +# 4. Setting atime=off on dataset and read '$TESTFILE'. +# 5. Verify the access time is not updated. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Setting atime=off, the access time for files will not be updated \ + when read." +log_onexit cleanup + +# +# Create $TESTFILE, snapshot and clone. +# +setup_snap_clone + +for dst in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCLONE $TESTPOOL/$TESTFS@$TESTSNAP +do + typeset mtpt=$(get_prop mountpoint $dst) + + if [[ $dst == $TESTPOOL/$TESTFS@$TESTSNAP ]]; then + mtpt=$(snapshot_mountpoint $dst) + else + log_must $ZFS set atime=off $dst + fi + + log_mustnot check_atime_updated $mtpt/$TESTFILE +done + +log_pass "Verify the property atime=off passed." diff --git a/tests/sys/cddl/zfs/tests/atime/atime_common.kshlib b/tests/sys/cddl/zfs/tests/atime/atime_common.kshlib new file mode 100644 index 00000000000..01f2f6b9887 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/atime/atime_common.kshlib @@ -0,0 +1,72 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)atime_common.kshlib 1.3 07/03/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Check if the access time for specified file is updated. +# +# $1 Given an absolute path to a file name +# +# Return value: +# 0 -> The access time is updated. +# 1 -> The access time is not updated. +# +function check_atime_updated +{ + typeset filename=$1 + + typeset before=$($LS -luD "%Y-%m-%d %R.%s" $filename | $AWK '{print $7}') + sleep 2 + log_must $CAT $filename + typeset after=$($LS -luD "%Y-%m-%d %R.%s" $filename | $AWK '{print $7}') + + if [[ $before != $after ]]; then + return 0 + else + return 1 + fi +} + +function setup_snap_clone +{ + # Create two file to verify snapshot. + log_must $TOUCH $TESTDIR/$TESTFILE + + create_snapshot $TESTPOOL/$TESTFS $TESTSNAP + create_clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE +} + +function cleanup +{ + destroy_clone $TESTPOOL/$TESTCLONE + destroy_snapshot $TESTPOOL/$TESTFS@$TESTSNAP +} diff --git a/tests/sys/cddl/zfs/tests/atime/atime_test.sh b/tests/sys/cddl/zfs/tests/atime/atime_test.sh new file mode 100755 index 00000000000..a36fc5c2eee --- /dev/null +++ b/tests/sys/cddl/zfs/tests/atime/atime_test.sh @@ -0,0 +1,86 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case atime_001_pos cleanup +atime_001_pos_head() +{ + atf_set "descr" "Setting atime=on, the access time for files is updated when read." + atf_set "require.progs" zfs +} +atime_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/atime_common.kshlib + . $(atf_get_srcdir)/atime.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/atime_001_pos.ksh || atf_fail "Testcase failed" +} +atime_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/atime_common.kshlib + . $(atf_get_srcdir)/atime.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case atime_002_neg cleanup +atime_002_neg_head() +{ + atf_set "descr" "Setting atime=off, the access time for files will not be updatedwhen read." + atf_set "require.progs" zfs +} +atime_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/atime_common.kshlib + . $(atf_get_srcdir)/atime.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/atime_002_neg.ksh || atf_fail "Testcase failed" +} +atime_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/atime_common.kshlib + . $(atf_get_srcdir)/atime.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case atime_001_pos + atf_add_test_case atime_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/atime/cleanup.ksh b/tests/sys/cddl/zfs/tests/atime/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/atime/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/atime/setup.ksh b/tests/sys/cddl/zfs/tests/atime/setup.ksh new file mode 100644 index 00000000000..3ea12f3fce9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/atime/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/bootfs/Makefile b/tests/sys/cddl/zfs/tests/bootfs/Makefile new file mode 100644 index 00000000000..e4d6570b81f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/Makefile @@ -0,0 +1,24 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/bootfs +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= bootfs.cfg +${PACKAGE}FILES+= bootfs_001_pos.ksh +${PACKAGE}FILES+= bootfs_002_neg.ksh +${PACKAGE}FILES+= bootfs_003_pos.ksh +${PACKAGE}FILES+= bootfs_004_neg.ksh +${PACKAGE}FILES+= bootfs_005_neg.ksh +${PACKAGE}FILES+= bootfs_006_pos.ksh +${PACKAGE}FILES+= bootfs_007_pos.ksh +${PACKAGE}FILES+= bootfs_008_neg.ksh +${PACKAGE}FILES+= bootfs_009_neg.ksh + +ATF_TESTS_KSH93+= bootfs_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +.include diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs.cfg b/tests/sys/cddl/zfs/tests/bootfs/bootfs.cfg new file mode 100644 index 00000000000..40f0e79f2ba --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs.cfg 1.1 07/05/25 SMI" +# + +FS=fs +export FS diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_001_pos.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_001_pos.ksh new file mode 100644 index 00000000000..0a96e110280 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_001_pos.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_001_pos.ksh 1.4 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_001_pos +# +# DESCRIPTION: +# +# Valid datasets are accepted as bootfs property values +# +# STRATEGY: +# 1. Create a set of datasets in a test pool +# 2. Try setting them as boot filesystems +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup { + destroy_pool $TESTPOOL + + if [[ -f $VDEV ]]; then + log_must $RM -f $VDEV + fi +} + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_assert "Valid datasets are accepted as bootfs property values" +log_onexit cleanup + +typeset VDEV=$TMPDIR/bootfs_001_pos_a.${TESTCASE_ID}.dat + +log_must create_vdevs $VDEV +create_pool "$TESTPOOL" "$VDEV" +log_must $ZFS create $TESTPOOL/$FS + +enc=$(get_prop encryption $TESTPOOL/$FS) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + log_unsupported "bootfs pool property not supported when \ +encryption is set to on." +fi + +log_must $ZFS snapshot $TESTPOOL/$FS@snap +log_must $ZFS clone $TESTPOOL/$FS@snap $TESTPOOL/clone + +log_must $ZPOOL set bootfs=$TESTPOOL/$FS $TESTPOOL +log_must $ZPOOL set bootfs=$TESTPOOL/$FS@snap $TESTPOOL +log_must $ZPOOL set bootfs=$TESTPOOL/clone $TESTPOOL + +log_must $ZFS promote $TESTPOOL/clone +log_must $ZPOOL set bootfs=$TESTPOOL/clone $TESTPOOL +log_pass "Valid datasets are accepted as bootfs property values" diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_002_neg.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_002_neg.ksh new file mode 100644 index 00000000000..5c9aa2c10e9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_002_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_002_neg.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_002_neg +# +# DESCRIPTION: +# +# Invalid datasets are rejected as boot property values +# +# STRATEGY: +# +# 1. Create a zvol +# 2. Verify that we can't set the bootfs to those datasets +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup { + destroy_pool $TESTPOOL +} + + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_assert "Invalid datasets are rejected as boot property values" +log_onexit cleanup + +DISK=${DISKS%% *} + +log_must $ZPOOL create $TESTPOOL $DISK +log_must $ZFS create -V 10m $TESTPOOL/vol +log_mustnot $ZPOOL set bootfs=$TESTPOOL/vol $TESTPOOL + +log_pass "Invalid datasets are rejected as boot property values" diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_003_pos.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_003_pos.ksh new file mode 100644 index 00000000000..6c6fa1544ae --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_003_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_003_pos.ksh 1.2 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_003_pos +# +# DESCRIPTION: +# +# Valid pool names are accepted +# +# STRATEGY: +# 1. Using a list of valid pool names +# 2. Create a filesystem in that pool +# 2. Verify we can set the bootfs to that filesystem +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A pools "pool.${TESTCASE_ID}" "pool123" "mypool" +typeset VDEV=$TMPDIR/bootfs_003.${TESTCASE_ID}.dat + +function cleanup { + typeset -i i=0 + while [ $i -lt "${#pools[@]}" ]; do + destroy_pool ${pools[$i]} + i=$(( $i + 1 )) + done + $RM $VDEV +} + + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_onexit cleanup + +log_assert "Valid pool names are accepted by zpool set bootfs" +create_vdevs $VDEV + +typeset -i i=0; + +while [ $i -lt "${#pools[@]}" ] +do + POOL=${pools[$i]} + log_must $ZPOOL create $POOL $VDEV + log_must $ZFS create $POOL/$FS + + enc=$(get_prop encryption $POOL/$FS) + if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + log_unsupported "bootfs pool property not supported \ +when encryption is set to on." + fi + + log_must $ZPOOL set bootfs=$POOL/$FS $POOL + RES=$($ZPOOL get bootfs $POOL | $TAIL -1 | $AWK '{print $3}' ) + if [ $RES != "$POOL/$FS" ] + then + log_fail "Expected $RES == $POOL/$FS" + fi + log_must $ZPOOL destroy -f $POOL + i=$(( $i + 1 )) +done + +log_pass "Valid pool names are accepted by zpool set bootfs" diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_004_neg.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_004_neg.ksh new file mode 100644 index 00000000000..21eca27bb2f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_004_neg.ksh @@ -0,0 +1,110 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_004_neg.ksh 1.1 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_004_neg +# +# DESCRIPTION: +# +# Invalid pool names are rejected by zpool set bootfs +# +# STRATEGY: +# 1. Try to set bootfs on some non-existent pools +# +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A pools "pool//${TESTCASE_ID}" "pool%d123" "mirror" "c0t0d0s0" "pool*23*" "*po!l" \ + "%s££%^" +typeset VDEV=$TMPDIR/bootfs_004.${TESTCASE_ID}.dat + +function cleanup { + typeset -i=0 + while [ $i -lt "${#pools[@]}" ]; do + destroy_pool ${pools[$i]} + i=$(( $i + 1 )) + done + $RM $VDEV +} + + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_assert "Invalid pool names are rejected by zpool set bootfs" +log_onexit cleanup + +# here, we build up a large string and add it to the list of pool names +# a word to the ksh-wary, ${#array[@]} gives you the +# total number of entries in an array, so array[${#array[@]}] +# will index the last entry+1, ksh arrays start at index 0. +COUNT=0 +while [ $COUNT -le 1025 ] +do + bigname="${bigname}o" + COUNT=$(( $COUNT + 1 )) +done +pools[${#pools[@]}]="$bigname" + + +create_vdevs $VDEV +typeset -i i=0; + +while [ $i -lt "${#pools[@]}" ] +do + POOL=${pools[$i]}/$FS + log_mustnot $ZPOOL create $POOL $VDEV + log_mustnot $ZFS create $POOL/$FS + log_mustnot $ZPOOL set bootfs=$POOL/$FS $POOL + + i=$(( $i + 1 )) +done + +log_pass "Invalid pool names are rejected by zpool set bootfs" diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_005_neg.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_005_neg.ksh new file mode 100644 index 00000000000..76cb7e5e651 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_005_neg.ksh @@ -0,0 +1,103 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_005_neg.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.cfg +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_005_neg +# +# DESCRIPTION: +# +# Boot properties cannot be set on pools with older versions +# +# STRATEGY: +# 1. Copy and import some pools of older versions +# 2. Create a filesystem on each +# 3. Verify that zpool set bootfs fails on each +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup { + + # + # we need destroy pools that created on top of $TESTPOOL first + # + typeset pool_name + for config in $CONFIGS; do + pool_name=$($ENV| $GREP "ZPOOL_VERSION_${config}_NAME"\ + | $AWK -F= '{print $2}') + if poolexists $pool_name; then + log_must $ZPOOL destroy -f $pool_name + fi + done + destroy_pool $TESTPOOL +} + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_assert "Boot properties cannot be set on pools with older versions" + +# These are configs from zpool_upgrade.cfg - see that file for more info. +CONFIGS="1 2 3" + +log_onexit cleanup +log_must $ZPOOL create -f $TESTPOOL $DISKS + +for config in $CONFIGS +do + create_old_pool $config + POOL_NAME=$($ENV| $GREP "ZPOOL_VERSION_${config}_NAME"\ + | $AWK -F= '{print $2}') + log_must $ZFS create $POOL_NAME/$FS + log_mustnot $ZPOOL set bootfs=$POOL_NAME/$FS $POOL_NAME + log_must destroy_upgraded_pool $config +done + +log_pass "Boot properties cannot be set on pools with older versions" diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_006_pos.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_006_pos.ksh new file mode 100644 index 00000000000..b63cb32b246 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_006_pos.ksh @@ -0,0 +1,162 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_006_pos.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_006_pos +# +# DESCRIPTION: +# +# Pools of correct vdev types accept boot property +# +# STRATEGY: +# 1. create pools of each vdev type (raid, raidz, raidz2, mirror + hotspares) +# 2. verify we can set bootfs on each pool type according to design +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +VDEV1=$TMPDIR/bootfs_006_pos_a.${TESTCASE_ID}.dat +VDEV2=$TMPDIR/bootfs_006_pos_b.${TESTCASE_ID}.dat +VDEV3=$TMPDIR/bootfs_006_pos_c.${TESTCASE_ID}.dat +VDEV4=$TMPDIR/bootfs_006_pos_d.${TESTCASE_ID}.dat + +function verify_bootfs { # $POOL + POOL=$1 + log_must $ZFS create $POOL/$FS + + enc=$(get_prop encryption $POOL/$FS) + if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + log_unsupported "bootfs pool property not supported \ +when encryption is set to on." + fi + + log_must $ZPOOL set bootfs=$POOL/$FS $POOL + VAL=$($ZPOOL get bootfs $POOL | $TAIL -1 | $AWK '{print $3}' ) + if [ $VAL != "$POOL/$FS" ] + then + log_must $ZPOOL status -v $POOL + log_fail "set/get failed on $POOL - expected $VAL == $POOL/$FS" + fi + log_must $ZPOOL destroy $POOL +} + +function verify_no_bootfs { # $POOL + POOL=$1 + log_must $ZFS create $POOL/$FS + log_mustnot $ZPOOL set bootfs=$POOL/$FS $POOL + VAL=$($ZPOOL get bootfs $POOL | $TAIL -1 | $AWK '{print $3}' ) + if [ $VAL == "$POOL/$FS" ] + then + log_must $ZPOOL status -v $POOL + log_fail "set/get unexpectedly failed $VAL != $POOL/$FS" + fi + log_must $ZPOOL destroy $POOL +} + +function cleanup { + destroy_pool $TESTPOOL + log_must $RM $VDEV1 $VDEV2 $VDEV3 $VDEV4 +} + +log_assert "Pools of correct vdev types accept boot property" + + + +log_onexit cleanup +log_must create_vdevs $VDEV1 $VDEV2 $VDEV3 $VDEV4 + + +## the following configurations are supported bootable pools + +# normal +log_must $ZPOOL create $TESTPOOL $VDEV1 +verify_bootfs $TESTPOOL + +# normal + hotspare +log_must $ZPOOL create $TESTPOOL $VDEV1 spare $VDEV2 +verify_bootfs $TESTPOOL + +# mirror +log_must $ZPOOL create $TESTPOOL mirror $VDEV1 $VDEV2 +verify_bootfs $TESTPOOL + +# mirror + hotspare +log_must $ZPOOL create $TESTPOOL mirror $VDEV1 $VDEV2 spare $VDEV3 +verify_bootfs $TESTPOOL + +## the following configurations are not supported as bootable pools in Solaris, +## but they are in FreeBSD + +# stripe +log_must $ZPOOL create $TESTPOOL $VDEV1 $VDEV2 +verify_bootfs $TESTPOOL + +# stripe + hotspare +log_must $ZPOOL create $TESTPOOL $VDEV1 $VDEV2 spare $VDEV3 +verify_bootfs $TESTPOOL + +# raidz +log_must $ZPOOL create $TESTPOOL raidz $VDEV1 $VDEV2 +verify_bootfs $TESTPOOL + +# raidz + hotspare +log_must $ZPOOL create $TESTPOOL raidz $VDEV1 $VDEV2 spare $VDEV3 +verify_bootfs $TESTPOOL + +# raidz2 +log_must $ZPOOL create $TESTPOOL raidz2 $VDEV1 $VDEV2 $VDEV3 +verify_bootfs $TESTPOOL + +# raidz2 + hotspare +log_must $ZPOOL create $TESTPOOL raidz2 $VDEV1 $VDEV2 $VDEV3 spare $VDEV4 +verify_bootfs $TESTPOOL + +log_pass "Pools of correct vdev types accept boot property" diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_007_pos.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_007_pos.ksh new file mode 100644 index 00000000000..bc49f5e1c30 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_007_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_007_neg.ksh 1.3 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_007_neg +# +# DESCRIPTION: +# +# Setting bootfs on a pool which was configured with the whole disk +# (i.e. EFI) will succeed. This is only supported on FreeBSD, not Solaris. +# +# STRATEGY: +# 1. create a pool with a whole disk +# 2. create a filesystem on this pool +# 3. verify we can set bootfs on the filesystem we just created. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-07-08) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup { + if poolexists $TESTPOOL ; then + destroy_pool "$TESTPOOL" + fi +} + +log_onexit cleanup + +DISK=${DISKS%% *} +typeset EFI_BOOTFS=$TESTPOOL/efs +typeset assert_mesg="setting bootfs on a pool which was configured with the \ + whole disk will succeed" + +log_assert $assert_mesg +create_pool "$TESTPOOL" "$DISK" +log_must $ZFS create $EFI_BOOTFS + +log_must $ZPOOL set bootfs=$EFI_BOOTFS $TESTPOOL + +log_pass $assert_mesg diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_008_neg.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_008_neg.ksh new file mode 100644 index 00000000000..a007aabcc8b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_008_neg.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_008_neg.ksh 1.2 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_008_neg +# +# DESCRIPTION: +# +# setting bootfs on a dataset which has gzip compression enabled will fail +# +# STRATEGY: +# 1. create pools based on a valid vdev +# 2. create a filesytem on this pool and set the compression property to gzip1-9 +# 3. set the pool's bootfs property to filesystem we just configured which should +# fail +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-07-08) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup { + if poolexists $TESTPOOL ; then + destroy_pool "$TESTPOOL" + fi + + if [[ -f $VDEV ]]; then + log_must $RM -f $VDEV + fi +} + +typeset assert_msg="setting bootfs on a dataset which has gzip \ + compression enabled will fail" + +typeset VDEV=$TMPDIR/bootfs_008_neg_a.${TESTCASE_ID}.dat +typeset COMP_FS=$TESTPOOL/COMP_FS + +log_onexit cleanup +log_assert $assert_msg + +log_must create_vdevs $VDEV +log_must $ZPOOL create $TESTPOOL $VDEV +log_must $ZFS create $COMP_FS + +typeset -i i=0 +set -A gtype "gzip" "gzip-1" "gzip-2" "gzip-3" "gzip-4" "gzip-5" \ + "gzip-6" "gzip-7" "gzip-8" "gzip-9" "zle" + +while (( i < ${#gtype[@]} )); do + log_must $ZFS set compression=${gtype[i]} $COMP_FS + log_mustnot $ZPOOL set bootfs=$COMP_FS $TESTPOOL + log_must $ZFS set compression=off $COMP_FS + (( i += 1 )) +done + +log_pass $assert_msg diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_009_neg.ksh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_009_neg.ksh new file mode 100644 index 00000000000..e2909423ae8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_009_neg.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)bootfs_009_neg.ksh 1.1 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: bootfs_009_neg +# +# DESCRIPTION: +# +# Valid encrypted datasets can't be set bootfs property values +# +# STRATEGY: +# 1. Create encrypted datasets in a test pool +# 2. Try setting encrypted datasets as boot filesystems +# 3. Verify failures. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-07-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup { + destroy_pool $TESTPOOL +} + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_assert "Valid encrypted datasets can't be set bootfs property values" +log_onexit cleanup + +DISK=${DISKS%% *} + +log_must $ZPOOL create $TESTPOOL $DISK +log_must $ZFS create $TESTPOOL/$FS + +enc=$(get_prop encryption $TESTPOOL/$FS) +if [ $? -ne 0 ]; then + log_unsupported "get_prop encryption $TESTPOOL/$FS failed." +else + if [ -z "$enc" ] || [ "$enc" = "off" ]; then + log_unsupported "encryption isn't set to on, this test case \ +is not supported." + else + log_mustnot $ZPOOL set bootfs=$TESTPOOL/$FS $TESTPOOL + fi +fi + + +log_must $ZFS snapshot $TESTPOOL/$FS@snap +log_must $ZFS clone $TESTPOOL/$FS@snap $TESTPOOL/clone +log_must $ZFS promote $TESTPOOL/clone +log_mustnot $ZPOOL set bootfs=$TESTPOOL/clone $TESTPOOL + +log_pass "Encrypted datasets can't be set bootfs property" diff --git a/tests/sys/cddl/zfs/tests/bootfs/bootfs_test.sh b/tests/sys/cddl/zfs/tests/bootfs/bootfs_test.sh new file mode 100755 index 00000000000..b6a9feb0f3b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/bootfs/bootfs_test.sh @@ -0,0 +1,180 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case bootfs_001_pos +bootfs_001_pos_head() +{ + atf_set "descr" "Valid datasets are accepted as bootfs property values" + atf_set "require.progs" zpool zfs +} +bootfs_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + ksh93 $(atf_get_srcdir)/bootfs_001_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case bootfs_002_neg +bootfs_002_neg_head() +{ + atf_set "descr" "Invalid datasets are rejected as boot property values" + atf_set "require.progs" zfs zpool +} +bootfs_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/bootfs_002_neg.ksh || atf_fail "Testcase failed" +} + + +atf_test_case bootfs_003_pos +bootfs_003_pos_head() +{ + atf_set "descr" "Valid pool names are accepted by zpool set bootfs" + atf_set "require.progs" zpool zfs +} +bootfs_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + ksh93 $(atf_get_srcdir)/bootfs_003_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case bootfs_004_neg +bootfs_004_neg_head() +{ + atf_set "descr" "Invalid pool names are rejected by zpool set bootfs" + atf_set "require.progs" zpool zfs +} +bootfs_004_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + ksh93 $(atf_get_srcdir)/bootfs_004_neg.ksh || atf_fail "Testcase failed" +} + + +atf_test_case bootfs_005_neg +bootfs_005_neg_head() +{ + atf_set "descr" "Boot properties cannot be set on pools with older versions" + atf_set "require.progs" zfs zpool +} +bootfs_005_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/bootfs_005_neg.ksh || atf_fail "Testcase failed" +} + + +atf_test_case bootfs_006_pos +bootfs_006_pos_head() +{ + atf_set "descr" "Pools of correct vdev types accept boot property" + atf_set "require.progs" zfs zpool +} +bootfs_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + ksh93 $(atf_get_srcdir)/bootfs_006_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case bootfs_007_pos +bootfs_007_pos_head() +{ + atf_set "descr" "setting bootfs on a pool which was configured with the whole disk will succeed" + atf_set "require.progs" zfs zpool +} +bootfs_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/bootfs_007_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case bootfs_008_neg +bootfs_008_neg_head() +{ + atf_set "descr" "setting bootfs on a dataset which has gzip compression enabled will fail" + atf_set "require.progs" zpool zfs +} +bootfs_008_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + ksh93 $(atf_get_srcdir)/bootfs_008_neg.ksh || atf_fail "Testcase failed" +} + + +atf_test_case bootfs_009_neg +bootfs_009_neg_head() +{ + atf_set "descr" "Valid encrypted datasets can't be set bootfs property values" + atf_set "require.config" zfs_encryption + atf_set "require.progs" zfs zpool +} +bootfs_009_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/bootfs.cfg + + ksh93 $(atf_get_srcdir)/bootfs_009_neg.ksh || atf_fail "Testcase failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case bootfs_001_pos + atf_add_test_case bootfs_002_neg + atf_add_test_case bootfs_003_pos + atf_add_test_case bootfs_004_neg + atf_add_test_case bootfs_005_neg + atf_add_test_case bootfs_006_pos + atf_add_test_case bootfs_007_pos + atf_add_test_case bootfs_008_neg + atf_add_test_case bootfs_009_neg +} diff --git a/tests/sys/cddl/zfs/tests/cache/Makefile b/tests/sys/cddl/zfs/tests/cache/Makefile new file mode 100644 index 00000000000..0cd3d64ef83 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/Makefile @@ -0,0 +1,29 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cache +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= cache_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cache_005_neg.ksh +${PACKAGE}FILES+= cache.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= cache_011_pos.ksh +${PACKAGE}FILES+= cache_010_neg.ksh +${PACKAGE}FILES+= cache_008_neg.ksh +${PACKAGE}FILES+= cache_004_neg.ksh +${PACKAGE}FILES+= cache_009_pos.ksh +${PACKAGE}FILES+= cache_001_pos.ksh +${PACKAGE}FILES+= cache_003_pos.ksh +${PACKAGE}FILES+= cache_007_neg.ksh +${PACKAGE}FILES+= cache_002_pos.ksh +${PACKAGE}FILES+= cache_006_pos.ksh +${PACKAGE}FILES+= cache.cfg +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cache/cache.cfg b/tests/sys/cddl/zfs/tests/cache/cache.cfg new file mode 100644 index 00000000000..072c7851237 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache.cfg @@ -0,0 +1,47 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache.cfg 1.2 09/01/13 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg +. $STF_SUITE/include/libtest.kshlib + +set_disks + +export SIZE=64M + +export VDIR=$TMPDIR/disk.${TESTCASE_ID} +export VDIR2=$TMPDIR/disk2.${TESTCASE_ID} + +export VDEV="$VDIR/a $VDIR/b $VDIR/c" +export LDEV="$DISK0" +export VDEV2="$VDIR2/a $VDIR2/b $VDIR2/c" +export LDEV2="$DISK1" + +export STF_TIMEOUT=1200 diff --git a/tests/sys/cddl/zfs/tests/cache/cache.kshlib b/tests/sys/cddl/zfs/tests/cache/cache.kshlib new file mode 100644 index 00000000000..62e53ea21fd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache.kshlib @@ -0,0 +1,182 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache.kshlib 1.4 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +function cleanup +{ + log_note "Final pool configurations:" + poolexists $TESTPOOL && log_must $ZPOOL status -v $TESTPOOL + poolexists $TESTPOOL2 && log_must $ZPOOL status -v $TESTPOOL2 + destroy_pool $TESTPOOL + destroy_pool $TESTPOOL2 +} + +# +# Try zpool status/iostat for given pool +# +# $1 pool +# +function display_status +{ + typeset pool=$1 + + typeset -i ret=0 + $ZPOOL status -xv $pool > /dev/null 2>&1 + ret=$? + + $ZPOOL iostat > /dev/null 2>&1 + ((ret |= $?)) + + typeset mntpnt=$(get_prop mountpoint $pool) + $DD if=/dev/random of=$mntpnt/testfile.${TESTCASE_ID} & + typeset pid=$! + + $ZPOOL iostat -v 1 3 > /dev/null + ((ret |= $?)) + + kill -9 $pid + + return $ret +} + +# +# Verify the give cache device have correct type and status +# +# $1 pool name +# $2 device name +# $3 device status +# $4 device type +# +function verify_cache_device +{ + typeset pool=$1 + typeset device=$2 + typeset status=$3 + typeset type=$4 + + if [[ -z $pool || -z $device || -z $status ]]; then + log_fail "Usage: verify_cache_device " \ + " [type]" + fi + + # Zpool status returns on the device name sans the /dev, so + # if the device contains /dev/ remove it. + if [[ $device =~ "^/dev/" ]]; then + device=`basename ${device}` + fi + + if [[ $WRAPPER == *"smi"* ]]; then + $ECHO $device | $EGREP "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1 + if (( $? == 0 )); then + device=${device}s2 + fi + fi + + # + # Get all the cache devices and status table like below + # + # mirror:/disks/d ONLINE mirror:/disks/e ONLINE stripe:/disks/f ONLINE + # + set -A dev_stat_tab $($ZPOOL status -v $pool | $NAWK ' + function parse_name(status) + { + if (status == "OFFLINE") + return substr($7,6) + else if (status == "UNAVAIL") + return substr($7,6) + else + return $1 + } + + BEGIN {in_cache=0} + /\tcache/ {in_cache=1} + /\tlog/ || /\tspares/ || /^$/ {in_cache=0} + + # Skip if not in a cache section + (in_cache==0) { next; } + + /\t (\/|[0-9a-zA-Z])/ { + print "stripe:" parse_name($2) " " $2; + } + + /\t (\/|[a-zA-Z])/ { + print "mirror:" parse_name($2) " " $2; + } + + # When hotspare is replacing + /\t (\/|[a-zA-Z])/ { + print "mirror:" parse_name($2) " " $2; + } + ') + + typeset -i i=0 + typeset find=0 + while (( i < ${#dev_stat_tab[@]} )); do + typeset dev=${dev_stat_tab[$i]} + typeset stat=${dev_stat_tab[((i+1))]} + + case $dev in + stripe:$device) + if [[ "$type" == 'mirror' ]]; then + log_note "Unexpected type: mirror" + return 1 + else + if [[ $stat != $status ]]; then + log_note "Status($stat) " \ + "!= Expected stat($status)" + return 1 + fi + return 0 + fi + ;; + mirror:$device) + if [[ -z "$type" || $type == 'stripe' ]]; then + log_note "Unexpected type: stripe" + return 1 + else + if [[ $stat != $status ]]; then + log_note "Status($stat) " \ + "!= Expected stat($status)" + return 1 + fi + return 0 + fi + ;; + esac + + ((i += 2)) + done + + log_note "Can not find device: $device" + + return 1 +} diff --git a/tests/sys/cddl/zfs/tests/cache/cache_001_pos.ksh b/tests/sys/cddl/zfs/tests/cache/cache_001_pos.ksh new file mode 100644 index 00000000000..837deeb626e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_001_pos.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_001_pos.ksh 1.1 08/05/14 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_001_pos +# +# DESCRIPTION: +# Creating a pool with a cache device succeeds. +# +# STRATEGY: +# 1. Create pool with separated cache devices. +# 2. Display pool status +# 3. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Creating a pool with a cache device succeeds." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + log_must $ZPOOL create $TESTPOOL $type $VDEV \ + cache $LDEV + log_must display_status $TESTPOOL + + ldev=$(random_get $LDEV) + log_must verify_cache_device $TESTPOOL $ldev 'ONLINE' + + log_must $ZPOOL remove $TESTPOOL $ldev + log_must check_vdev_state $TESTPOOL $ldev "" + + log_must $ZPOOL destroy -f $TESTPOOL +done + +log_pass "Creating a pool with a cache device succeeds." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_002_pos.ksh b/tests/sys/cddl/zfs/tests/cache/cache_002_pos.ksh new file mode 100644 index 00000000000..bd27a02af00 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_002_pos.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_002_pos.ksh 1.1 08/05/14 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_002_pos +# +# DESCRIPTION: +# Adding a cache device to normal pool works. +# +# STRATEGY: +# 1. Create pool +# 2. Add cache devices with different configuration +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Adding a cache device to normal pool works." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + log_must $ZPOOL create $TESTPOOL $type $VDEV + log_must $ZPOOL add $TESTPOOL cache $LDEV + log_must display_status $TESTPOOL + typeset ldev=$(random_get $LDEV) + log_must verify_cache_device $TESTPOOL $ldev 'ONLINE' + + log_must $ZPOOL remove $TESTPOOL $ldev + log_must check_vdev_state $TESTPOOL $ldev "" + + log_must $ZPOOL destroy -f $TESTPOOL +done + +log_pass "Adding a cache device to normal pool works." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_003_pos.ksh b/tests/sys/cddl/zfs/tests/cache/cache_003_pos.ksh new file mode 100644 index 00000000000..009a92f912e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_003_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_003_pos.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_003_pos +# +# DESCRIPTION: +# Adding an extra cache device works +# +# STRATEGY: +# 1. Create pool with separated cache devices. +# 2. Add an extra cache devices +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Adding an extra cache device works." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + log_must $ZPOOL create $TESTPOOL $type $VDEV \ + cache $LDEV + log_must $ZPOOL add $TESTPOOL \ + cache $LDEV2 + + log_must display_status $TESTPOOL + ldev=$(random_get $LDEV2) + log_must verify_cache_device $TESTPOOL $ldev 'ONLINE' + + log_must $ZPOOL remove $TESTPOOL $ldev + log_must check_vdev_state $TESTPOOL $ldev "" + + log_must $ZPOOL destroy -f $TESTPOOL +done + +log_pass "Adding an extra cache device works." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_004_neg.ksh b/tests/sys/cddl/zfs/tests/cache/cache_004_neg.ksh new file mode 100644 index 00000000000..229a2727bef --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_004_neg.ksh @@ -0,0 +1,76 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_004_neg.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_004_neg +# +# DESCRIPTION: +# Attaching a cache device fails. +# +# STRATEGY: +# 1. Create pool with separated cache devices. +# 2. Attaching a cache device for existing cache device +# 3. Verify the operation fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-03-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Attaching a cache device fails." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + log_must $ZPOOL create $TESTPOOL $type $VDEV \ + cache $LDEV + + ldev=$(random_get $LDEV) + typeset ldev2=$(random_get $LDEV2) + log_mustnot $ZPOOL attach $TESTPOOL $ldev $ldev2 + log_must check_vdev_state $TESTPOOL $ldev2 "" + + log_must $ZPOOL destroy -f $TESTPOOL +done + +log_pass "Attaching a cache device fails." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_005_neg.ksh b/tests/sys/cddl/zfs/tests/cache/cache_005_neg.ksh new file mode 100644 index 00000000000..6c3c864af99 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_005_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_005_neg.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_005_neg +# +# DESCRIPTION: +# Replacing a cache device fails. +# +# STRATEGY: +# 1. Create pool with cache devices. +# 2. Replacing one cache device +# 3. Verify replace fails +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-03-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Replacing a cache device fails." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + log_must $ZPOOL create $TESTPOOL $type $VDEV \ + cache $LDEV + sdev=$(random_get $LDEV) + tdev=$(random_get $LDEV2) + log_mustnot $ZPOOL replace $TESTPOOL $sdev $tdev + log_must verify_cache_device $TESTPOOL $sdev 'ONLINE' + log_must check_vdev_state $TESTPOOL $tdev "" + + log_must $ZPOOL destroy -f $TESTPOOL +done + +log_pass "Replacing a cache device fails." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_006_pos.ksh b/tests/sys/cddl/zfs/tests/cache/cache_006_pos.ksh new file mode 100644 index 00000000000..55e9ece06a4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_006_pos.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_006_pos.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_006_pos +# +# DESCRIPTION: +# Exporting and importing pool with cache devices passes. +# +# STRATEGY: +# 1. Create pool with cache devices. +# 2. Export and import the pool +# 3. Display pool status +# 4. Destroy and import the pool again +# 5. Display pool status +# 6. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Exporting and importing pool with cache devices passes." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + log_must $ZPOOL create $TESTPOOL $type $VDEV \ + cache $LDEV $LDEV2 + ldev=$(random_get $LDEV $LDEV2) + log_must verify_cache_device \ + $TESTPOOL $ldev 'ONLINE' + + # + # Nomal export/import operating + # + log_must $ZPOOL export $TESTPOOL + log_must $ZPOOL import -d $VDIR $TESTPOOL + log_must display_status $TESTPOOL + ldev=$(random_get $LDEV $LDEV2) + log_must verify_cache_device \ + $TESTPOOL $ldev 'ONLINE' + + # + # Destroy the pool and import again + # + log_must $ZPOOL destroy $TESTPOOL + log_must $ZPOOL import -Df -d $VDIR $TESTPOOL + log_must display_status $TESTPOOL + ldev=$(random_get $LDEV $LDEV2) + log_must verify_cache_device \ + $TESTPOOL $ldev 'ONLINE' + + log_must $ZPOOL destroy -f $TESTPOOL +done + +log_pass "Exporting and importing pool with cache devices passes." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_007_neg.ksh b/tests/sys/cddl/zfs/tests/cache/cache_007_neg.ksh new file mode 100644 index 00000000000..1bb044c0249 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_007_neg.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_007_neg.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_007_neg +# +# DESCRIPTION: +# A mirror/raidz/raidz2 cache is not supported. +# +# STRATEGY: +# 1. Try to create pool with unsupported type +# 2. Verify failed to create pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "A mirror/raidz/raidz2 cache is not supported." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + for cachetype in "mirror" "raidz" "raidz1" "raidz2" + do + log_mustnot $ZPOOL create $TESTPOOL $type $VDEV \ + cache $cachetype $LDEV $LDEV2 + ldev=$(random_get $LDEV $LDEV2) + log_mustnot verify_cache_device \ + $TESTPOOL $ldev 'ONLINE' $cachetype + log_must datasetnonexists $TESTPOOL + done +done + +log_pass "A mirror/raidz/raidz2 cache is not supported." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_008_neg.ksh b/tests/sys/cddl/zfs/tests/cache/cache_008_neg.ksh new file mode 100644 index 00000000000..0d528f86940 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_008_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_008_neg.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_008_neg +# +# DESCRIPTION: +# A mirror/raidz/raidz2 cache can not be added to existed pool. +# +# STRATEGY: +# 1. Create pool with or without cache. +# 2. Add a mirror/raidz/raidz2 cache to this pool. +# 3. Verify failed to add. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "A raidz/raidz2 cache can not be added to existed pool." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + for cachetype in "mirror" "raidz" "raidz1" "raidz2" + do + log_must $ZPOOL create $TESTPOOL $type $VDEV \ + cache $LDEV + + log_mustnot $ZPOOL add $TESTPOOL cache $cachetype $LDEV2 + ldev=$(random_get $LDEV2) + log_mustnot verify_cache_device \ + $TESTPOOL $ldev 'ONLINE' $cachetype + + log_must $ZPOOL destroy -f $TESTPOOL + done +done + +log_pass "A mirror/raidz/raidz2 cache can not be added to existed pool." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_009_pos.ksh b/tests/sys/cddl/zfs/tests/cache/cache_009_pos.ksh new file mode 100644 index 00000000000..543f4cf7dc9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_009_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_009_pos.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_009_pos +# +# DESCRIPTION: +# Offline and online a cache device succeed. +# +# STRATEGY: +# 1. Create pool with mirror cache devices. +# 2. Offine and online a cache device +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Offline and online a cache device succeed." +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + log_must $ZPOOL create $TESTPOOL $type $VDEV \ + cache $LDEV $LDEV2 + + ldev=$(random_get $LDEV $LDEV2) + log_must $ZPOOL offline $TESTPOOL $ldev + log_must display_status $TESTPOOL + log_must verify_cache_device $TESTPOOL $ldev 'OFFLINE' '' + log_note "Offline pool configuration, for reference:" + log_must $ZPOOL status -v $TESTPOOL + + log_must $ZPOOL online $TESTPOOL $ldev + log_must display_status $TESTPOOL + log_must verify_cache_device $TESTPOOL $ldev 'ONLINE' '' + + log_note "Final pool configuration, for reference:" + log_must $ZPOOL status -v $TESTPOOL + log_must $ZPOOL destroy -f $TESTPOOL +done + +log_pass "Offline and online a cache device succeed." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_010_neg.ksh b/tests/sys/cddl/zfs/tests/cache/cache_010_neg.ksh new file mode 100644 index 00000000000..6489148d254 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_010_neg.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_010_neg.ksh 1.1 08/05/14 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_010_neg +# +# DESCRIPTION: +# Verify cache device can only be disk or slice. +# +# STRATEGY: +# 1. Create a pool +# 2. Loop to add different object as cache +# 3. Verify it fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup_testenv +{ + cleanup + if [[ -n $mdconfig_unit ]]; then + $MDCONFIG -d -u $mdconfig_unit + fi +} + +log_assert "Cache device can only be disk or slice." +log_onexit cleanup_testenv + +log_must $ZPOOL create $TESTPOOL $VDEV + +# Add nomal disk +log_must $ZPOOL add $TESTPOOL cache ${LDEV} +log_must verify_cache_device $TESTPOOL ${LDEV} 'ONLINE' +# Add nomal file +log_mustnot $ZPOOL add $TESTPOOL cache $VDEV2 + +# Add md +mdconfig_dev=${VDEV2%% *} +mdconfig_unit=$($MDCONFIG $mdconfig_dev) +log_note "$MDCONFIG $mdconfig_dev" +if [[ $? -eq 0 ]]; then + log_note "$mdconfig_unit is created." +else + log_fail "Failed to execute mdconfig." +fi + +log_must $ZPOOL add $TESTPOOL cache $mdconfig_unit +log_must verify_cache_device $TESTPOOL $mdconfig_unit 'ONLINE' +log_must $ZPOOL destroy $TESTPOOL +if [[ -n $mdconfig_unit ]]; then + log_must $MDCONFIG -d -u $mdconfig_unit + mdconfig_unit="" +fi + +#Add zvol +log_must $ZPOOL create $TESTPOOL2 $VDEV2 +log_must $ZFS create -V $SIZE $TESTPOOL2/$TESTVOL +log_mustnot $ZPOOL add $TESTPOOL cache /dev/zvol/$TESTPOOL2/$TESTVOL + +log_pass "Cache device can only be disk or slice." diff --git a/tests/sys/cddl/zfs/tests/cache/cache_011_pos.ksh b/tests/sys/cddl/zfs/tests/cache/cache_011_pos.ksh new file mode 100644 index 00000000000..3091dcafc12 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_011_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_011_pos.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cache_011_pos +# +# DESCRIPTION: +# Remove cache device from pool with spare device should succeed. +# +# STRATEGY: +# 1. Create pool with cache devices and spare devices +# 2. Remove cache device from the pool +# 3. The upper action should succeed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup { + if datasetexists $TESTPOOL ; then + log_must $ZPOOL destroy -f $TESTPOOL + fi +} + +log_assert "Remove cache device from pool with spare device should succeed" +log_onexit cleanup + +for type in "" "mirror" "raidz" "raidz2" +do + log_must $ZPOOL create $TESTPOOL $type $VDEV \ + cache $LDEV spare $LDEV2 + + log_must $ZPOOL remove $TESTPOOL $LDEV + log_must display_status $TESTPOOL + + log_must $ZPOOL destroy -f $TESTPOOL +done + +log_pass "Remove cache device from pool with spare device should succeed" diff --git a/tests/sys/cddl/zfs/tests/cache/cache_test.sh b/tests/sys/cddl/zfs/tests/cache/cache_test.sh new file mode 100755 index 00000000000..f722dbf0efd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cache_test.sh @@ -0,0 +1,340 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case cache_001_pos cleanup +cache_001_pos_head() +{ + atf_set "descr" "Creating a pool with a cache device succeeds." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_001_pos.ksh || atf_fail "Testcase failed" +} +cache_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_002_pos cleanup +cache_002_pos_head() +{ + atf_set "descr" "Adding a cache device to normal pool works." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_002_pos.ksh || atf_fail "Testcase failed" +} +cache_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_003_pos cleanup +cache_003_pos_head() +{ + atf_set "descr" "Adding an extra cache device works." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_003_pos.ksh || atf_fail "Testcase failed" +} +cache_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_004_neg cleanup +cache_004_neg_head() +{ + atf_set "descr" "Attaching a cache device fails." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_004_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_004_neg.ksh || atf_fail "Testcase failed" +} +cache_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_005_neg cleanup +cache_005_neg_head() +{ + atf_set "descr" "Replacing a cache device fails." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_005_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_005_neg.ksh || atf_fail "Testcase failed" +} +cache_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_006_pos cleanup +cache_006_pos_head() +{ + atf_set "descr" "Exporting and importing pool with cache devices passes." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_006_pos.ksh || atf_fail "Testcase failed" +} +cache_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_007_neg cleanup +cache_007_neg_head() +{ + atf_set "descr" "A mirror/raidz/raidz2 cache is not supported." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_007_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_007_neg.ksh || atf_fail "Testcase failed" +} +cache_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_008_neg cleanup +cache_008_neg_head() +{ + atf_set "descr" "A raidz/raidz2 cache can not be added to existed pool." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_008_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_008_neg.ksh || atf_fail "Testcase failed" +} +cache_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_009_pos cleanup +cache_009_pos_head() +{ + atf_set "descr" "Offline and online a cache device succeed." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_009_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_009_pos.ksh || atf_fail "Testcase failed" +} +cache_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_010_neg cleanup +cache_010_neg_head() +{ + atf_set "descr" "Cache device can only be disk or slice." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1200 +} +cache_010_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_010_neg.ksh || atf_fail "Testcase failed" +} +cache_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_011_pos cleanup +cache_011_pos_head() +{ + atf_set "descr" "Remove cache device from pool with spare device should succeed" + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +cache_011_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_011_pos.ksh || atf_fail "Testcase failed" +} +cache_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cache.kshlib + . $(atf_get_srcdir)/cache.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case cache_001_pos + atf_add_test_case cache_002_pos + atf_add_test_case cache_003_pos + atf_add_test_case cache_004_neg + atf_add_test_case cache_005_neg + atf_add_test_case cache_006_pos + atf_add_test_case cache_007_neg + atf_add_test_case cache_008_neg + atf_add_test_case cache_009_pos + atf_add_test_case cache_010_neg + atf_add_test_case cache_011_pos +} diff --git a/tests/sys/cddl/zfs/tests/cache/cleanup.ksh b/tests/sys/cddl/zfs/tests/cache/cleanup.ksh new file mode 100644 index 00000000000..bfc4bd10df8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/cleanup.ksh @@ -0,0 +1,44 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 08/05/14 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +verify_runnable "global" + +cleanup +if [[ -d $VDIR ]]; then + log_must $RM -rf $VDIR +fi +if [[ -d $VDIR2 ]]; then + log_must $RM -rf $VDIR2 +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cache/setup.ksh b/tests/sys/cddl/zfs/tests/cache/setup.ksh new file mode 100644 index 00000000000..b6539068b7c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cache/setup.ksh @@ -0,0 +1,45 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 09/01/13 SMI" +# + +. $STF_SUITE/tests/cache/cache.kshlib + +verify_runnable "global" + +if [[ -d $VDEV ]]; then + log_must $RM -rf $VDIR +fi +if [[ -d $VDEV2 ]]; then + log_must $RM -rf $VDIR2 +fi +log_must $MKDIR -p $VDIR $VDIR2 +log_must create_vdevs $VDEV $VDEV2 + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cachefile/Makefile b/tests/sys/cddl/zfs/tests/cachefile/Makefile new file mode 100644 index 00000000000..a6d6e2303a6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cachefile/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cachefile +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= cachefile_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cachefile_002_pos.ksh +${PACKAGE}FILES+= cachefile_003_pos.ksh +${PACKAGE}FILES+= cachefile_001_pos.ksh +${PACKAGE}FILES+= cachefile.cfg +${PACKAGE}FILES+= cachefile.kshlib +${PACKAGE}FILES+= cachefile_004_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cachefile/cachefile.cfg b/tests/sys/cddl/zfs/tests/cachefile/cachefile.cfg new file mode 100644 index 00000000000..a27bfb22c81 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cachefile/cachefile.cfg @@ -0,0 +1,38 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cachefile.cfg 1.1 08/02/29 SMI" +# + +if [[ $os_name == "FreeBSD" ]]; then + export CPATH="/boot/zfs/zpool.cache" +else + export CPATH="/etc/zfs/zpool.cache" +fi +export CPATH1=$TMPDIR/cachefile.1.${TESTCASE_ID} +export CPATH2=$TMPDIR/cachefile.2.${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/cachefile/cachefile.kshlib b/tests/sys/cddl/zfs/tests/cachefile/cachefile.kshlib new file mode 100644 index 00000000000..79c8359d66d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cachefile/cachefile.kshlib @@ -0,0 +1,53 @@ +#!/usr/local/bin/ksh93 -p +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cachefile.kshlib 1.1 08/02/29 SMI" +# + + +# +# A function to determine if a given pool name has an entry in cachefile +# returns 1 if the pool is not in the cache, 0 otherwise. +function pool_in_cache { + + # checking for the pool name in the strings output of + # the given cachefile, default is /etc/zfs/zpool.cache + typeset cachefile=${2:-$CPATH} + + if [[ -f $cachefile ]]; then + RESULT=$($STRINGS $cachefile | $GREP -w $1) + if [ -z "$RESULT" ] + then + return 1 + fi + return 0 + else + return 1 + fi +} diff --git a/tests/sys/cddl/zfs/tests/cachefile/cachefile_001_pos.ksh b/tests/sys/cddl/zfs/tests/cachefile/cachefile_001_pos.ksh new file mode 100644 index 00000000000..0d365e9e02c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cachefile/cachefile_001_pos.ksh @@ -0,0 +1,107 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cachefile_001_pos.ksh 1.1 08/02/29 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cachefile/cachefile.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: cachefile_001_pos +# +# DESCRIPTION: +# +# Creating a pool with "cachefile" set doesn't update zpool.cache +# +# STRATEGY: +# 1. Create a pool with the cachefile property set +# 2. Verify that the pool doesn't have an entry in zpool.cache +# 3. Verify the cachefile property is set +# 4. Create a pool without the cachefile property +# 5. Verify the cachefile property isn't set +# 6. Verify that zpool.cache contains an entry for the pool +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-09-05) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + typeset file + + destroy_pool $TESTPOOL + for file in $CPATH1 $CPATH2 ; do + if [[ -f $file ]] ; then + log_must $RM $file + fi + done +} + +verify_runnable "global" + +log_assert "Creating a pool with \"cachefile\" set doesn't update zpool.cache" +log_onexit cleanup + +CPATHARG="-" +set -A opts "none" "false" "none" \ + "$CPATH" "true" "$CPATHARG" \ + "$CPATH1" "true" "$CPATH1" \ + "$CPATH2" "true" "$CPATH2" + +typeset -i i=0 + +while (( i < ${#opts[*]} )); do + log_must $ZPOOL create -o cachefile=${opts[i]} $TESTPOOL $DISKS + case ${opts[((i+1))]} in + false) log_mustnot pool_in_cache $TESTPOOL + ;; + true) log_must pool_in_cache $TESTPOOL ${opts[i]} + ;; + esac + + PROP=$(get_pool_prop cachefile $TESTPOOL) + if [[ $PROP != ${opts[((i+2))]} ]]; then + log_fail "cachefile property not set as expected. " \ + "Expect: ${opts[((i+2))]}, Current: $PROP" + fi + log_must $ZPOOL destroy $TESTPOOL + (( i = i + 3 )) +done + +log_pass "Creating a pool with \"cachefile\" set doesn't update zpool.cache" + diff --git a/tests/sys/cddl/zfs/tests/cachefile/cachefile_002_pos.ksh b/tests/sys/cddl/zfs/tests/cachefile/cachefile_002_pos.ksh new file mode 100644 index 00000000000..55a5972ab82 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cachefile/cachefile_002_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cachefile_002_pos.ksh 1.2 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cachefile/cachefile.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: cachefile_002_pos +# +# DESCRIPTION: +# +# Importing a pool with "cachefile" set doesn't update zpool.cache +# +# STRATEGY: +# 1. Create a pool with the cachefile property set +# 2. Verify the pool doesn't have an entry in zpool.cache +# 3. Export the pool +# 4. Import the pool +# 5. Verify the pool does have an entry in zpool.cache +# 6. Export the pool +# 7. Import the pool -o cachefile= +# 8. Verify the pool doesn't have an entry in zpool.cache +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-09-05) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + destroy_pool $TESTPOOL +} + +verify_runnable "global" + +log_assert "Importing a pool with \"cachefile\" set doesn't update zpool.cache" +log_onexit cleanup + +log_must $ZPOOL create -o cachefile=none $TESTPOOL $DISKS +typeset DEVICEDIR=$(get_device_dir $DISKS) +log_mustnot pool_in_cache $TESTPOOL + +log_must $ZPOOL export $TESTPOOL +log_must $ZPOOL import -d $DEVICEDIR $TESTPOOL +log_must pool_in_cache $TESTPOOL + +log_must $ZPOOL export $TESTPOOL +log_must $ZPOOL import -o cachefile=none -d $DEVICEDIR $TESTPOOL +log_mustnot pool_in_cache $TESTPOOL + +log_must $ZPOOL export $TESTPOOL +log_must $ZPOOL import -o cachefile=$CPATH -d $DEVICEDIR $TESTPOOL +log_must pool_in_cache $TESTPOOL + +log_pass "Importing a pool with \"cachefile\" set doesn't update zpool.cache" + diff --git a/tests/sys/cddl/zfs/tests/cachefile/cachefile_003_pos.ksh b/tests/sys/cddl/zfs/tests/cachefile/cachefile_003_pos.ksh new file mode 100644 index 00000000000..30ae1e7afd6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cachefile/cachefile_003_pos.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cachefile_003_pos.ksh 1.1 08/02/29 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cachefile/cachefile.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: cachefile_003_pos +# +# DESCRIPTION: +# +# Setting altroot= and cachefile=$CPATH for zpool create is succeed +# +# STRATEGY: +# 1. Attempt to create a pool with -o altroot= -o cachefile= +# 2. Verify the command succeed +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-09-10) +# +# __stc_assertion_end +# +################################################################################ + +TESTDIR=/altdir.${TESTCASE_ID} + +function cleanup +{ + typeset file + + destroy_pool $TESTPOOL + + for file in $CPATH1 $CPATH2 ; do + if [[ -f $file ]] ; then + log_must $RM $file + fi + done + + if [ -d $TESTDIR ] + then + $RMDIR $TESTDIR + fi +} + +verify_runnable "global" + +log_assert "Setting altroot=path and cachefile=$CPATH for zpool create succeed." +log_onexit cleanup + +typeset -i i=0 + +CPATHARG="-" +set -A opts "none" "none" \ + "$CPATH" "$CPATHARG" \ + "$CPATH1" "$CPATH1" \ + "$CPATH2" "$CPATH2" + + +while (( i < ${#opts[*]} )); do + log_must $ZPOOL create -o altroot=$TESTDIR -o cachefile=${opts[i]} \ + $TESTPOOL $DISKS + if [[ ${opts[i]} != none ]]; then + log_must pool_in_cache $TESTPOOL ${opts[i]} + else + log_mustnot pool_in_cache $TESTPOOL + fi + + PROP=$(get_pool_prop cachefile $TESTPOOL) + if [[ $PROP != ${opts[((i+1))]} ]]; then + log_fail "cachefile property not set as expected. " \ + "Expect: ${opts[((i+1))]}, Current: $PROP" + fi + log_must $ZPOOL destroy -f $TESTPOOL + (( i = i + 2 )) +done + +log_pass "Setting altroot=path and cachefile=$CPATH for zpool create succeed." + diff --git a/tests/sys/cddl/zfs/tests/cachefile/cachefile_004_pos.ksh b/tests/sys/cddl/zfs/tests/cachefile/cachefile_004_pos.ksh new file mode 100644 index 00000000000..74c93155bef --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cachefile/cachefile_004_pos.ksh @@ -0,0 +1,136 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cachefile_004_pos.ksh 1.2 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cachefile/cachefile.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: cachefile_004_pos +# +# DESCRIPTION: +# Verify set, export and destroy when cachefile is set on pool. +# +# STRATEGY: +# 1. Create two pools with one same cahcefile1. +# 2. Set cachefile of the two pools to another same cachefile2. +# 3. Verify cachefile1 not exist. +# 4. Export the two pools. +# 5. Verify cachefile2 not exist. +# 6. Import the two pools and set cachefile to cachefile2. +# 7. Destroy the two pools. +# 8. Verify cachefile2 not exist. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + destroy_pool $TESTPOOL2 + + mntpnt=$(get_prop mountpoint $TESTPOOL) + typeset -i i=0 + while ((i < 2)); do + if [[ -e $mntpnt/vdev$i ]]; then + log_must $RM -f $mntpnt/vdev$i + fi + ((i += 1)) + done + + destroy_pool $TESTPOOL + + for file in $CPATH1 $CPATH2 ; do + if [[ -f $file ]] ; then + log_must $RM $file + fi + done +} + + +log_assert "Verify set, export and destroy when cachefile is set on pool." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL $DISKS + +mntpnt=$(get_prop mountpoint $TESTPOOL) +typeset -i i=0 +while ((i < 2)); do + log_must create_vdevs $mntpnt/vdev$i + eval vdev$i=$mntpnt/vdev$i + ((i += 1)) +done + +log_must $ZPOOL create -o cachefile=$CPATH1 $TESTPOOL1 $vdev0 +log_must pool_in_cache $TESTPOOL1 $CPATH1 +log_must $ZPOOL create -o cachefile=$CPATH1 $TESTPOOL2 $vdev1 +log_must pool_in_cache $TESTPOOL2 $CPATH1 + +log_must $ZPOOL set cachefile=$CPATH2 $TESTPOOL1 +log_must pool_in_cache $TESTPOOL1 $CPATH2 +log_must $ZPOOL set cachefile=$CPATH2 $TESTPOOL2 +log_must pool_in_cache $TESTPOOL2 $CPATH2 +if [[ -f $CPATH1 ]]; then + log_fail "Verify set when cachefile is set on pool." +fi + +log_must $ZPOOL export $TESTPOOL1 +log_must $ZPOOL export $TESTPOOL2 +if [[ -f $CPATH2 ]]; then + log_fail "Verify export when cachefile is set on pool." +fi + +log_must $ZPOOL import -d $mntpnt $TESTPOOL1 +log_must $ZPOOL set cachefile=$CPATH2 $TESTPOOL1 +log_must pool_in_cache $TESTPOOL1 $CPATH2 +log_must $ZPOOL import -d $mntpnt $TESTPOOL2 +log_must $ZPOOL set cachefile=$CPATH2 $TESTPOOL2 +log_must pool_in_cache $TESTPOOL2 $CPATH2 + +log_must $ZPOOL destroy $TESTPOOL1 +log_must $ZPOOL destroy $TESTPOOL2 +if [[ -f $CPATH2 ]]; then + log_fail "Verify destroy when cachefile is set on pool." +fi + +log_pass "Verify set, export and destroy when cachefile is set on pool." + diff --git a/tests/sys/cddl/zfs/tests/cachefile/cachefile_test.sh b/tests/sys/cddl/zfs/tests/cachefile/cachefile_test.sh new file mode 100755 index 00000000000..04e7dc09f7e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cachefile/cachefile_test.sh @@ -0,0 +1,104 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case cachefile_001_pos +cachefile_001_pos_head() +{ + atf_set "descr" "Creating a pool with \cachefile\ set doesn't update zpool.cache" + atf_set "require.progs" zpool +} +cachefile_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cachefile.kshlib + . $(atf_get_srcdir)/cachefile.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/cachefile_001_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case cachefile_002_pos +cachefile_002_pos_head() +{ + atf_set "descr" "Importing a pool with \cachefile\ set doesn't update zpool.cache" + atf_set "require.progs" zpool +} +cachefile_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cachefile.kshlib + . $(atf_get_srcdir)/cachefile.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/cachefile_002_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case cachefile_003_pos +cachefile_003_pos_head() +{ + atf_set "descr" "Setting altroot=path and cachefile=$CPATH for zpool create succeed." + atf_set "require.progs" zpool +} +cachefile_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cachefile.kshlib + . $(atf_get_srcdir)/cachefile.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/cachefile_003_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case cachefile_004_pos +cachefile_004_pos_head() +{ + atf_set "descr" "Verify set, export and destroy when cachefile is set on pool." + atf_set "require.progs" zpool +} +cachefile_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/cachefile.kshlib + . $(atf_get_srcdir)/cachefile.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/cachefile_004_pos.ksh || atf_fail "Testcase failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case cachefile_001_pos + atf_add_test_case cachefile_002_pos + atf_add_test_case cachefile_003_pos + atf_add_test_case cachefile_004_pos +} diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/Makefile b/tests/sys/cddl/zfs/tests/clean_mirror/Makefile new file mode 100644 index 00000000000..065c726de95 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/clean_mirror +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= clean_mirror_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= clean_mirror_001_pos.ksh +${PACKAGE}FILES+= clean_mirror_002_pos.ksh +${PACKAGE}FILES+= clean_mirror_003_pos.ksh +${PACKAGE}FILES+= clean_mirror_004_pos.ksh +${PACKAGE}FILES+= clean_mirror_common.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= default.cfg +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_001_pos.ksh b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_001_pos.ksh new file mode 100644 index 00000000000..fd215372086 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_001_pos.ksh @@ -0,0 +1,67 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)clean_mirror_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/clean_mirror/clean_mirror_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: clean_mirror_001_pos +# +# DESCRIPTION: +# The primary side of a zpool mirror can be zeroed without causing damage +# to the data in the pool +# +# STRATEGY: +# 1) Write several files to the ZFS filesystem mirror +# 2) dd from /dev/zero over the primary side of the mirror +# 3) verify that all the file contents are unchanged on the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "The primary side of a zpool mirror may be completely wiped" \ + "without affecting the content of the pool" + +overwrite_verify_mirror $SIDE_PRIMARY /dev/zero + +log_pass "The overwrite had no effect on the data" diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_002_pos.ksh b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_002_pos.ksh new file mode 100644 index 00000000000..7aef5af64e7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_002_pos.ksh @@ -0,0 +1,67 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)clean_mirror_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/clean_mirror/clean_mirror_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: clean_mirror_002_pos +# +# DESCRIPTION: +# The secondary side of a zpool mirror can be zeroed without causing damage +# to the data in the pool +# +# STRATEGY: +# 1) Write several files to the ZFS filesystem in the mirrored pool +# 2) dd from /dev/zero over the secondary side of the mirror +# 3) verify that all the file contents are unchanged on the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "The primary side of a zpool mirror may be completely wiped" \ + "without affecting the content of the pool" + +overwrite_verify_mirror $SIDE_SECONDARY /dev/zero + +log_pass "The overwrite had no effect on the data" diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_003_pos.ksh b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_003_pos.ksh new file mode 100644 index 00000000000..7e998f6d285 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_003_pos.ksh @@ -0,0 +1,67 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)clean_mirror_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/clean_mirror/clean_mirror_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: clean_mirror_003_pos +# +# DESCRIPTION: +# The primary side of a zpool mirror can be mangled without causing damage +# to the data in the pool +# +# STRATEGY: +# 1) Write several files to the ZFS filesystem mirror +# 2) dd from /dev/urandom over the primary side of the mirror +# 3) verify that all the file contents are unchanged on the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "The primary side of a zpool mirror may be completely mangled" \ + "without affecting the content of the pool" + +overwrite_verify_mirror $SIDE_PRIMARY /dev/urandom + +log_pass "The overwrite did not have any effect on the data" diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_004_pos.ksh b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_004_pos.ksh new file mode 100644 index 00000000000..abecf001be2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_004_pos.ksh @@ -0,0 +1,67 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)clean_mirror_004_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/clean_mirror/clean_mirror_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: clean_mirror_004_pos +# +# DESCRIPTION: +# The secondary side of a zpool mirror can be mangled without causing damage +# to the data in the pool +# +# STRATEGY: +# 1) Write several files to the ZFS filesystem in the mirrored pool +# 2) dd from /dev/urandom over the secondary side of the mirror +# 3) verify that all the file contents are unchanged on the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "The primary side of a zpool mirror may be completely mangled" \ + "without affecting the content of the pool" + +overwrite_verify_mirror $SIDE_SECONDARY /dev/urandom + +log_pass "The overwrite had no effect on the data" diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_common.kshlib b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_common.kshlib new file mode 100644 index 00000000000..a3e47da7d7d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_common.kshlib @@ -0,0 +1,79 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)clean_mirror_common.kshlib 1.4 07/10/09 SMI" +# + +# Most of the code related to the clearing of mirrors is duplicated in all +# the test cases below this directory, barring a few minor changes +# involving the device to be affected and the 'object' to use to mangle +# the contents of the mirror. +# This code is sourced into each of these test cases. + +function overwrite_verify_mirror +{ + typeset AFFECTED_DEVICE=$1 + typeset OVERWRITING_DEVICE=$2 + + typeset atfile=0 + set -A cksums + set -A newcksums + + populate_dir $TESTDIR/file $FILE_COUNT $WRITE_COUNT $BLOCKSZ 0 + while (( atfile < FILE_COUNT )); do + cksums[$atfile]=$($CKSUM ${TESTDIR}/file.${atfile}) + (( atfile = atfile + 1 )) + done + + # unmount and export before dd + log_must $UMOUNT $TESTDIR + log_must $ZPOOL export $TESTPOOL + + # dd the primary side of the mirror + log_must $DD if=$OVERWRITING_DEVICE of=$(bsddevmap $AFFECTED_DEVICE) \ + seek=8 bs=$DD_BLOCK count=$(( DD_COUNT - 8 )) conv=notrunc + + # now remount + log_must $ZPOOL import $TESTPOOL + + atfile=0 + typeset -i failedcount=0 + while (( atfile < FILE_COUNT )); do + newcksum=$($CKSUM $TESTDIR/file.${atfile}) + if [[ $newcksum != ${cksums[$atfile]} ]]; then + (( failedcount = failedcount + 1 )) + fi + $RM -f ${files[$atfile]} + (( atfile = atfile + 1 )) + done + + if (( $failedcount > 0 )); then + log_fail "of the $FILE_COUNT files $failedcount did not " \ + "have the same checksum before and after." + fi +} diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_test.sh b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_test.sh new file mode 100755 index 00000000000..f7c3bf51ffe --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/clean_mirror_test.sh @@ -0,0 +1,133 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2018 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case clean_mirror_001_pos cleanup +clean_mirror_001_pos_head() +{ + atf_set "descr" "The primary side of a zpool mirror may be completely wipedwithout affecting the content of the pool" +} +clean_mirror_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/clean_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/clean_mirror_001_pos.ksh || atf_fail "Testcase failed" +} +clean_mirror_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/clean_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case clean_mirror_002_pos cleanup +clean_mirror_002_pos_head() +{ + atf_set "descr" "The primary side of a zpool mirror may be completely wipedwithout affecting the content of the pool" +} +clean_mirror_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/clean_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/clean_mirror_002_pos.ksh || atf_fail "Testcase failed" +} +clean_mirror_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/clean_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case clean_mirror_003_pos cleanup +clean_mirror_003_pos_head() +{ + atf_set "descr" "The primary side of a zpool mirror may be completely mangledwithout affecting the content of the pool" +} +clean_mirror_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/clean_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/clean_mirror_003_pos.ksh || atf_fail "Testcase failed" +} +clean_mirror_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/clean_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case clean_mirror_004_pos cleanup +clean_mirror_004_pos_head() +{ + atf_set "descr" "The primary side of a zpool mirror may be completely mangledwithout affecting the content of the pool" +} +clean_mirror_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/clean_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/clean_mirror_004_pos.ksh || atf_fail "Testcase failed" +} +clean_mirror_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/clean_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case clean_mirror_001_pos + atf_add_test_case clean_mirror_002_pos + atf_add_test_case clean_mirror_003_pos + atf_add_test_case clean_mirror_004_pos +} diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/cleanup.ksh b/tests/sys/cddl/zfs/tests/clean_mirror/cleanup.ksh new file mode 100644 index 00000000000..c5476609abb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/cleanup.ksh @@ -0,0 +1,47 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +$DF -t zfs -h | $GREP "$TESTFS " >/dev/null +[[ $? == 0 ]] && log_must $ZFS umount -f $TESTDIR +destroy_pool $TESTPOOL + +# Erase the partition table that we made +if [[ -n $SINGLE_DISK ]]; then + log_must cleanup_devices $MIRROR_PRIMARY +else + log_must cleanup_devices $MIRROR_PRIMARY $MIRROR_SECONDARY +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/default.cfg b/tests/sys/cddl/zfs/tests/clean_mirror/default.cfg new file mode 100644 index 00000000000..6684532b1b1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/default.cfg @@ -0,0 +1,57 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)default.cfg 1.3 08/08/15 SMI" +# + +typeset -i NUMBER_OF_DISKS=0 +for i in $DISKS; do + [[ -n $MIRROR_PRIMARY ]] && MIRROR_SECONDARY=$i + [[ -z $MIRROR_PRIMARY ]] && MIRROR_PRIMARY=$i +done + +if [[ -z $MIRROR_SECONDARY ]]; then + # We need to repartition the single disk to two slices + SINGLE_DISK=$MIRROR_PRIMARY + MIRROR_SECONDARY=$MIRROR_PRIMARY + SIDE_PRIMARY=${SINGLE_DISK}p1 + SIDE_SECONDARY=${SINGLE_DISK}p2 +else + SIDE_PRIMARY=${MIRROR_PRIMARY}p1 + SIDE_SECONDARY=${MIRROR_SECONDARY}p1 +fi + +export MIRROR_PRIMARY MIRROR_SECONDARY SINGLE_DISK SIDE_PRIMARY SIDE_SECONDARY + +export FILE_COUNT=10 +export BLOCKSZ=131072 +export WRITE_COUNT=8 +export FILE_SIZE=$(( BLOCKSZ * WRITE_COUNT )) +export MIRROR_SIZE=70 +export DD_BLOCK=$(( 64 * 1024 )) +export DD_COUNT=$(( MIRROR_SIZE * 1024 * 1024 / DD_BLOCK )) diff --git a/tests/sys/cddl/zfs/tests/clean_mirror/setup.ksh b/tests/sys/cddl/zfs/tests/clean_mirror/setup.ksh new file mode 100644 index 00000000000..f8ed2c5972b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/clean_mirror/setup.ksh @@ -0,0 +1,47 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.5 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +if [[ -n $SINGLE_DISK ]]; then + log_note "Partitioning a single disk ($SINGLE_DISK)" +else + log_note "Partitioning disks ($MIRROR_PRIMARY $MIRROR_SECONDARY)" +fi +wipe_partition_table ${SINGLE_DISK} ${MIRROR_PRIMARY} ${MIRROR_SECONDARY} +log_must set_partition ${SIDE_PRIMARY##*p} "" ${MIRROR_SIZE}m $MIRROR_PRIMARY +log_must set_partition ${SIDE_SECONDARY##*p} "" ${MIRROR_SIZE}m $MIRROR_SECONDARY + +default_mirror_setup $SIDE_PRIMARY $SIDE_SECONDARY + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/Makefile b/tests/sys/cddl/zfs/tests/cli_root/Makefile new file mode 100644 index 00000000000..521564f855a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/Makefile @@ -0,0 +1,60 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= cli.cfg +${PACKAGE}FILES+= cli_common.kshlib +${PACKAGE}FILES+= setup.ksh + +TESTS_SUBDIRS+= zdb + +TESTS_SUBDIRS+= zfs +TESTS_SUBDIRS+= zfs_clone +TESTS_SUBDIRS+= zfs_copies +TESTS_SUBDIRS+= zfs_create +TESTS_SUBDIRS+= zfs_destroy +TESTS_SUBDIRS+= zfs_diff +TESTS_SUBDIRS+= zfs_get +TESTS_SUBDIRS+= zfs_inherit +TESTS_SUBDIRS+= zfs_mount +TESTS_SUBDIRS+= zfs_promote +TESTS_SUBDIRS+= zfs_property +TESTS_SUBDIRS+= zfs_receive +TESTS_SUBDIRS+= zfs_rename +TESTS_SUBDIRS+= zfs_reservation +TESTS_SUBDIRS+= zfs_rollback +TESTS_SUBDIRS+= zfs_send +TESTS_SUBDIRS+= zfs_set +TESTS_SUBDIRS+= zfs_share +TESTS_SUBDIRS+= zfs_snapshot +TESTS_SUBDIRS+= zfs_unshare +TESTS_SUBDIRS+= zfs_unmount +TESTS_SUBDIRS+= zfs_upgrade + +TESTS_SUBDIRS+= zpool +TESTS_SUBDIRS+= zpool_add +TESTS_SUBDIRS+= zpool_attach +TESTS_SUBDIRS+= zpool_clear +TESTS_SUBDIRS+= zpool_create +TESTS_SUBDIRS+= zpool_destroy +TESTS_SUBDIRS+= zpool_detach +TESTS_SUBDIRS+= zpool_expand +TESTS_SUBDIRS+= zpool_export +TESTS_SUBDIRS+= zpool_get +TESTS_SUBDIRS+= zpool_history +TESTS_SUBDIRS+= zpool_import +TESTS_SUBDIRS+= zpool_offline +TESTS_SUBDIRS+= zpool_online +TESTS_SUBDIRS+= zpool_remove +TESTS_SUBDIRS+= zpool_replace +TESTS_SUBDIRS+= zpool_set +TESTS_SUBDIRS+= zpool_scrub +TESTS_SUBDIRS+= zpool_status +TESTS_SUBDIRS+= zpool_upgrade + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/cli.cfg b/tests/sys/cddl/zfs/tests/cli_root/cli.cfg new file mode 100644 index 00000000000..35a8c00a131 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/cli.cfg @@ -0,0 +1,55 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cli.cfg 1.3 08/08/15 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +export ZFSROOT= + +export TESTSNAP=testsnap${TESTCASE_ID} +export TESTSNAP1=testsnap1${TESTCASE_ID} +export TESTSNAP2=testsnap2${TESTCASE_ID} +export TESTCLONE=testclone${TESTCASE_ID} +export TESTCLONE1=testclone1${TESTCASE_ID} +export TESTCLONE2=testclone2${TESTCASE_ID} +export TESTCLCT=testclct${TESTCASE_ID} +export TESTCTR1=testctr1${TESTCASE_ID} +export TESTCTR2=testctr2${TESTCASE_ID} +export TESTVOL=testvol${TESTCASE_ID} +export TESTVOL1=testvol1${TESTCASE_ID} +export TESTVOL2=testvol2${TESTCASE_ID} +export TESTFILE0=testfile0.${TESTCASE_ID} +export TESTFILE1=testfile1.${TESTCASE_ID} +export TESTFILE2=testfile2.${TESTCASE_ID} + +export LONGPNAME="poolname50charslong_012345678901234567890123456789" +export LONGFSNAME="fsysname50charslong_012345678901234567890123456789" + +export VOLSIZE=150m +export BIGVOLSIZE=1eb diff --git a/tests/sys/cddl/zfs/tests/cli_root/cli_common.kshlib b/tests/sys/cddl/zfs/tests/cli_root/cli_common.kshlib new file mode 100644 index 00000000000..636135ee581 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/cli_common.kshlib @@ -0,0 +1,91 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cli_common.kshlib 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Get the checksum and size of the file. +# +function get_cksum # +{ + return $($CKSUM $1 | $AWK '{print $1 $2}') +} + +# +# Compare the check sum of target files with the original file +# + +function compare_cksum # ... +{ + typeset orig_data=$1 + typeset orig_sum=$(get_cksum $orig_data) + typeset target_sum="" + typeset bad_data_list="" + typeset -i bad_count=0 + + shift + for data in $@; do + if [[ ! -e $data ]]; then + bad_data_list="$bad_data_list $data" + (( bad_count +=1 )) + continue + fi + + target_sum=$(get_cksum $data) + if [[ $target_sum != $orig_sum ]]; then + bad_data_list="$bad_data_list $data" + (( bad_count +=1 )) + fi + done + + [[ $bad_data_list != "" ]] && \ + log_fail "Data corruptions appear during send->receive." \ + "There are total $bad_count corruptions. They are:\n"\ + "$bad_data_list" +} + +# +# Check the received dataset exists or not +# +function receive_check #... +{ + typeset bad_rst_tgts="" + + for dataset in $@; do + ! datasetexists $dataset && \ + bad_rst_tgts="$bad_rst_tgts $dataset" + done + + if [[ $bad_rst_tgts != "" ]]; then + log_fail "Restoring fails. The specified datasets"\ + "$bad_rst_tgts are not being received." + fi +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zdb/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zdb/Makefile new file mode 100644 index 00000000000..091c707550a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zdb/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zdb +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zdb_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zdb_001_neg.ksh +${PACKAGE}FILES+= zdb.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zdb/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zdb/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zdb/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zdb/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zdb/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zdb/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb.cfg b/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb.cfg new file mode 100644 index 00000000000..3ddf3ca34ab --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zdb.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb_001_neg.ksh new file mode 100644 index 00000000000..4c9b7b87cad --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb_001_neg.ksh @@ -0,0 +1,86 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zdb_001_neg.ksh 1.4 08/02/27 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zdb_001_neg +# +# DESCRIPTION: +# A badly formed parameter passed to zdb(1) should +# return an error. +# +# STRATEGY: +# 1. Create an array containg bad zdb parameters. +# 2. For each element, execute the sub-command. +# 3. Verify it returns an error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-28) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A args "create" "add" "destroy" "import fakepool" \ + "export fakepool" "create fakepool" "add fakepool" \ + "create mirror" "create raidz" \ + "create mirror fakepool" "create raidz fakepool" \ + "create raidz1 fakepool" "create raidz2 fakepool" \ + "create fakepool mirror" "create fakepool raidz" \ + "create fakepool raidz1" "create fakepool raidz2" \ + "add fakepool mirror" "add fakepool raidz" \ + "add fakepool raidz1" "add fakepool raidz2" \ + "add mirror fakepool" "add raidz fakepool" \ + "add raidz1 fakepool" "add raidz2 fakepool" \ + "setvprop" "blah blah" "-%" "--?" "-*" "-=" \ + "-a" "-f" "-g" "-h" "-j" "-k" "-m" "-n" "-p" "-p /tmp" \ + "-r" "-t" "-w" "-x" "-y" "-z" \ + "-D" "-E" "-G" "-H" "-I" "-J" "-K" "-M" \ + "-N" "-Q" "-T" "-W" + +log_assert "Execute zdb using invalid parameters." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZDB ${args[i]} + + ((i = i + 1)) +done + +log_pass "Badly formed zdb parameters fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb_test.sh new file mode 100755 index 00000000000..e75da9201b5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zdb/zdb_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zdb_001_neg cleanup +zdb_001_neg_head() +{ + atf_set "descr" "Execute zdb using invalid parameters." + atf_set "require.progs" zdb +} +zdb_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zdb.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zdb_001_neg.ksh || atf_fail "Testcase failed" +} +zdb_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zdb.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zdb_001_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs/Makefile new file mode 100644 index 00000000000..fc9ac73af68 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_malformed.cfg +${PACKAGE}FILES+= zfs_001_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_003_neg.ksh +${PACKAGE}FILES+= zfs_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_001_neg.ksh new file mode 100644 index 00000000000..21e95d7cfe6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_001_neg.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_001_neg.ksh 1.4 08/02/27 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_001_neg +# +# DESCRIPTION: +# Try each zfs(1) sub-command without parameters to make sure +# it returns an error. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A args "" "create" "create -s" "create -V" "create -s -V" \ + "destroy" "destroy -f" "destroy -r" "destroy -R" "destroy -rRf" \ + "snapshot" "snapshot -r" \ + "rollback" "rollback -r" "rollback -R" "rollback -f" "rollback -rRf" \ + "clone" "clone -p" "promote" "rename" "rename -p" "rename -r" "list blah" \ + "set" "get" "get -rHp" "get -o" "get -s" \ + "inherit" "inherit -r" "quota=" \ + "set reservation=" "set atime=" "set checksum=" "set compression=" \ + "set type=" "set creation=" "set used=" "set available=" "set referenced=" \ + "set compressratio=" "set mounted=" "set origin=" "set quota=" \ + "set reservation=" "set volsize=" " set volblocksize=" "set recordsize=" \ + "set mountpoint=" "set devices=" "set exec=" "set setuid=" "set readonly=" \ + "set zoned=" "set snapdir=" "set aclmode=" "set aclinherit=" \ + "set quota=blah" "set reservation=blah" "set atime=blah" "set checksum=blah" \ + "set compression=blah" \ + "upgrade blah" "mount blah" "mount -o" \ + "umount blah" "unmount" "unmount blah" "unmount -f" \ + "share" "unshare" "send" "send -i" "receive" "receive -d" "receive -vnF" \ + "recv" "recv -d" "recv -vnF" "allow" "unallow" \ + "blah blah" "-%" "--" "--?" "-*" "-=" + +log_assert "Badly-formed zfs sub-command should return an error." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZFS ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly formed zfs sub-commands fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_002_pos.ksh new file mode 100644 index 00000000000..d40ef6a75ff --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_002_pos.ksh @@ -0,0 +1,127 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_002_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_002_pos +# +# DESCRIPTION: +# With ZFS_ABORT set, all zfs commands should be able to abort and generate a core file. +# +# STRATEGY: +# 1. Create an array of zfs command +# 2. Execute each command in the array +# 3. Verify the command aborts and generate a core file +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + unset ZFS_ABORT + + if [[ -d $corepath ]]; then + $RM -rf $corepath + fi + for ds in $fs1 $fs $ctr; do + if datasetexists $ds; then + log_must $ZFS destroy -rRf $ds + fi + done +} + +log_assert "With ZFS_ABORT set, all zfs commands can abort and generate a core file." +log_onexit cleanup + +#preparation work for testing +corepath=$TESTDIR/core +if [[ -d $corepath ]]; then + $RM -rf $corepath +fi +log_must $MKDIR $corepath + +ctr=$TESTPOOL/$TESTCTR +log_must $ZFS create $ctr + +fs=$ctr/$TESTFS +fs1=$ctr/$TESTFS1 +snap=$fs@$TESTSNAP +clone=$ctr/$TESTCLONE +streamf=$corepath/s.${TESTCASE_ID} + +set -A cmds "create $fs" "list $fs" "snapshot $snap" "set snapdir=hidden $fs" \ + "get snapdir $fs" "rollback $snap" "inherit snapdir $fs" \ + "rename $fs $fs-new" "rename $fs-new $fs" "unmount $fs" \ + "mount $fs" "share $fs" "unshare $fs" "send $snap \>$streamf" \ + "receive $fs1 \<$streamf" "clone $snap $clone" "promote $clone" \ + "promote $fs" "destroy -rRf $fs" + +set -A badparams "" "create" "destroy" "snapshot" "rollback" "clone" "promote" "rename" \ + "list -*" "set" "get -*" "inherit" "mount -A" "unmount" "share" \ + "unshare" "send" "receive" + +if ! is_userquota_supported; then + typeset -i i=${cmds[#]} + cmds[i]="allow everyone snapshot $fs" + cmds[((i+1))]="unallow everyone snapshot $fs" + + i=${badparams[#]} + badparams[i]="allow" + badparams[((i+1))]="unallow" +fi + + +log_must $COREADM -p ${corepath}/core.%f +log_must export ZFS_ABORT=yes + +for subcmd in "${cmds[@]}" "${badparams[@]}"; do + log_mustnot $ZFS $subcmd + corefile=${corepath}/core.zfs + if [[ ! -e $corefile ]]; then + log_fail "$ZFS $subcmd cannot generate core file with ZFS_ABORT set." + fi + log_must $RM -f $corefile +done + +log_pass "With ZFS_ABORT set, zfs command can abort and generate core file as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_003_neg.ksh new file mode 100644 index 00000000000..8fc2e452334 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_003_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_003_neg.ksh 1.1 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_003_neg +# +# DESCRIPTION: +# zfs command will failed with unexpected scenarios: +# (1) ZFS_DEV cannot be opened +# (2) MNTTAB cannot be opened +# +# STRATEGY: +# 1. Create an array of zfs command +# 2. Execute each command in the array +# 3. Verify the command aborts and generate a core file +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zfs fails with unexpected scenarios." + +#verify zfs failed if ZFS_DEV cannot be opened +ZFS_DEV=/dev/zfs +MNTTAB=/etc/mnttab + +for file in $ZFS_DEV $MNTTAB; do + if [[ -e $file ]]; then + $MV $file ${file}.bak + fi + for cmd in "" "list" "get all" "mount"; do + log_mustnot eval "$ZFS $cmd >/dev/null 2>&1" + done + $MV ${file}.bak $file +done + +log_pass "zfs fails with unexpected scenarios as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_malformed.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_malformed.cfg new file mode 100644 index 00000000000..5aeb09e7675 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_malformed.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_malformed.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_test.sh new file mode 100755 index 00000000000..3d2270e28af --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs/zfs_test.sh @@ -0,0 +1,108 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_001_neg cleanup +zfs_001_neg_head() +{ + atf_set "descr" "Badly-formed zfs sub-command should return an error." + atf_set "require.progs" zfs +} +zfs_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_malformed.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_malformed.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_002_pos cleanup +zfs_002_pos_head() +{ + atf_set "descr" "With ZFS_ABORT set, all zfs commands can abort and generate a core file." + atf_set "require.progs" zfs coreadm +} +zfs_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_malformed.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_malformed.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_003_neg cleanup +zfs_003_neg_head() +{ + atf_set "descr" "zfs fails with unexpected scenarios." + atf_set "require.progs" zfs +} +zfs_003_neg_body() +{ + atf_skip "FreeBSD does not allow /dev/zfs to be renamed" + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_malformed.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_003_neg.ksh || atf_fail "Testcase failed" +} +zfs_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_malformed.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_001_neg + atf_add_test_case zfs_002_pos + atf_add_test_case zfs_003_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/Makefile new file mode 100644 index 00000000000..6fcb871b2ca --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/Makefile @@ -0,0 +1,26 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_clone +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_clone_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_clone_005_pos.ksh +${PACKAGE}FILES+= zfs_clone_008_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_clone_004_pos.ksh +${PACKAGE}FILES+= zfs_clone_001_neg.ksh +${PACKAGE}FILES+= zfs_clone_009_neg.ksh +${PACKAGE}FILES+= zfs_clone_006_pos.ksh +${PACKAGE}FILES+= zfs_clone_002_pos.ksh +${PACKAGE}FILES+= zfs_clone.cfg +${PACKAGE}FILES+= zfs_clone_007_pos.ksh +${PACKAGE}FILES+= zfs_clone_003_pos.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/cleanup.ksh new file mode 100644 index 00000000000..a7b62a544f5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_container_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/setup.ksh new file mode 100644 index 00000000000..6b700be3a28 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_container_volume_setup ${DISK} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone.cfg new file mode 100644 index 00000000000..0d014d1c73c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone.cfg 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export SNAPFS="$TESTPOOL/$TESTFS@$TESTSNAP" +export SNAPFS1="$TESTPOOL/$TESTVOL@$TESTSNAP" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_001_neg.ksh new file mode 100644 index 00000000000..cb9e5df8059 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_001_neg.ksh @@ -0,0 +1,143 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_001_neg.ksh 1.4 09/01/13 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_001_neg +# +# DESCRIPTION: +# 'zfs clone' should fail with inapplicable scenarios, including: +# * Null arguments +# * non-existant snapshots. +# * invalid characters in ZFS namesapec +# * Leading slash in the target clone name +# * The argument contains an empty component. +# * The pool specified in the target doesn't exist. +# * The parent dataset of the target doesn't exist. +# * The argument refer to a pool, not dataset. +# * The target clone already exists. +# * Null target clone argument. +# * Too many arguments. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +typeset target1=$TESTPOOL/$TESTFS1 +typeset target2=$TESTPOOL/$TESTCTR1/$TESTFS1 +typeset targets="$target1 $target2 $NONEXISTPOOLNAME/$TESTFS" + +set -A args "" \ + "$TESTPOOL/$TESTFS@blah $target1" "$TESTPOOL/$TESTVOL@blah $target1" \ + "$TESTPOOL/$TESTFS@blah* $target1" "$TESTPOOL/$TESTVOL@blah* $target1" \ + "$SNAPFS $target1*" "$SNAPFS1 $target1*" \ + "$SNAPFS /$target1" "$SNAPFS1 /$target1" \ + "$SNAPFS $TESTPOOL//$TESTFS1" "$SNAPFS1 $TESTPOOL//$TESTFS1" \ + "$SNAPFS $NONEXISTPOOLNAME/$TESTFS" "$SNAPFS1 $NONEXISTPOOLNAME/$TESTFS" \ + "$SNAPFS" "$SNAPFS1" \ + "$SNAPFS $target1 $target2" "$SNAPFS1 $target1 $target2" +typeset -i argsnum=${#args[*]} +typeset -i j=0 +while (( j < argsnum )); do + args[((argsnum+j))]="-p ${args[j]}" + ((j = j + 1)) +done + +set -A moreargs "$SNAPFS $target2" "$SNAPFS1 $target2" \ + "$SNAPFS $TESTPOOL" "$SNAPFS1 $TESTPOOL" \ + "$SNAPFS $TESTPOOL/$TESTCTR" "$SNAPFS $TESTPOOL/$TESTFS" \ + "$SNAPFS1 $TESTPOOL/$TESTCTR" "$SNAPFS1 $TESTPOOL/$TESTFS" + +set -A args ${args[*]} ${moreargs[*]} + +function setup_all +{ + log_note "Create snapshots and mount them..." + + for snap in $SNAPFS $SNAPFS1 ; do + if ! snapexists $snap ; then + log_must $ZFS snapshot $snap + fi + done + + return 0 +} + +function cleanup_all +{ + typeset -i i=0 + + for fs in $targets; do + + datasetexists $fs && \ + log_must $ZFS destroy -f $fs + + (( i = i + 1 )) + done + + for snap in $SNAPFS $SNAPFS1 ; do + snapexists $snap && \ + log_must $ZFS destroy -Rf $snap + done + + return 0 +} + +log_assert "Badly-formed 'zfs clone' with inapplicable scenarios" \ + "should return an error." +log_onexit cleanup_all + +setup_all + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS clone ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly formed 'zfs clone' with inapplicable scenarios" \ + "fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_002_pos.ksh new file mode 100644 index 00000000000..d83e663af6f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_002_pos.ksh @@ -0,0 +1,106 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_002_pos.ksh 1.2 09/01/13 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_002_pos +# +# DESCRIPTION: +# 'zfs clone -p' should work as expected +# +# STRATEGY: +# 1. prepare snapshots +# 2. make sure without -p option, 'zfs clone' will fail +# 3. with -p option, the clone can be created +# 4. run 'zfs clone -p' again, the exit code should be zero +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-05) +# +# __stc_assertion_end +# +################################################################################ + +if ! $(check_opt_support "clone" "-p") ; then + log_unsupported "'zfs clone -p' is not supported yet." +fi + +verify_runnable "both" + +function setup_all +{ + log_note "Create snapshots and mount them..." + + for snap in $SNAPFS $SNAPFS1 ; do + if ! snapexists $snap ; then + log_must $ZFS snapshot $snap + fi + done + + return 0 +} + +function cleanup_all +{ + + if datasetexists $TESTPOOL/notexist ; then + log_must $ZFS destroy -rRf $TESTPOOL/notexist + fi + + for snap in $SNAPFS $SNAPFS1 ; do + if snapexists $snap ; then + log_must $ZFS destroy -Rf $snap + fi + done + + return 0 +} + +log_assert "clone -p should work as expected." +log_onexit cleanup_all + +setup_all + +log_must verify_opt_p_ops "clone" "fs" $SNAPFS \ + $TESTPOOL/notexist/new/clonefs${TESTCASE_ID} + +if is_global_zone ; then + log_must verify_opt_p_ops "clone" "vol" $SNAPFS1 \ + $TESTPOOL/notexist/new/clonevol${TESTCASE_ID} +fi + +log_pass "clone -p should work as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_003_pos.ksh new file mode 100644 index 00000000000..cd310273447 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_003_pos.ksh @@ -0,0 +1,99 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_003_pos.ksh 1.1 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_003_pos +# +# DESCRIPTION: +# 'zfs clone -o property=value filesystem' can successfully create a ZFS +# clone filesystem with correct property set. +# +# STRATEGY: +# 1. Create a ZFS clone filesystem in the storage pool with -o option +# 2. Verify the filesystem created successfully +# 3. Verify the property is correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists $SNAPFS ; then + log_must $ZFS destroy -Rf $SNAPFS + fi +} + +if ! $(check_opt_support "clone" "-o") ; then + log_unsupported "'zfs clone -o' unsupported." +fi + +log_onexit cleanup + + +log_assert "'zfs clone -o property=value filesystem' can successfully create" \ + "a ZFS clone filesystem with correct property set." + +log_must $ZFS snapshot $SNAPFS + +typeset -i i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ $WRAPPER == *"crypto"* ]] && \ + [[ ${RW_FS_PROP[$i]} == *"checksum"* ]]; then + (( i = i + 1 )) + continue + fi + log_must $ZFS clone -o ${RW_FS_PROP[$i]} $SNAPFS $TESTPOOL/$TESTCLONE + datasetexists $TESTPOOL/$TESTCLONE || \ + log_fail "zfs clone $TESTPOOL/$TESTCLONE fail." + propertycheck $TESTPOOL/$TESTCLONE ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTCLONE + (( i = i + 1 )) +done + +log_pass "'zfs clone -o property=value filesystem' can successfully create" \ + "a ZFS clone filesystem with correct property set." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_004_pos.ksh new file mode 100644 index 00000000000..e097fef8f78 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_004_pos.ksh @@ -0,0 +1,107 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_004_pos.ksh 1.1 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_004_pos +# +# DESCRIPTION: +# 'zfs clone -o property=value filesystem' can successfully create a ZFS +# clone filesystem with multiple properties set. +# +# STRATEGY: +# 1. Create a ZFS clone filesystem in the storage pool with multiple -o options +# 2. Verify the filesystem created successfully +# 3. Verify the properties are correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists $SNAPFS ; then + log_must $ZFS destroy -Rf $SNAPFS + fi +} + +if ! $(check_opt_support "clone" "-o") ; then + log_unsupported "'zfs clone -o' unsupported." +fi + +log_onexit cleanup + +log_assert "'zfs clone -o property=value filesystem' can successfully create" \ + "a ZFS clone filesystem with multiple properties set." + +typeset -i i=0 +typeset opts="" + +log_must $ZFS snapshot $SNAPFS + +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ $WRAPPER != *"crypto"* ]] || \ + [[ ${RW_FS_PROP[$i]} != *"checksum"* ]]; then + opts="$opts -o ${RW_FS_PROP[$i]}" + fi + (( i = i + 1 )) +done + +log_must $ZFS clone $opts $SNAPFS $TESTPOOL/$TESTCLONE +datasetexists $TESTPOOL/$TESTCLONE || \ + log_fail "zfs create $TESTPOOL/$TESTCLONE fail." + +i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ $WRAPPER != *"crypto"* ]] || \ + [[ ${RW_FS_PROP[$i]} != *"checksum"* ]]; then + propertycheck $TESTPOOL/$TESTCLONE ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + fi + (( i = i + 1 )) +done + +log_pass "'zfs clone -o property=value filesystem' can successfully create" \ + "a ZFS clone filesystem with multiple properties set." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_005_pos.ksh new file mode 100644 index 00000000000..5ba0c641b2e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_005_pos.ksh @@ -0,0 +1,99 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_005_pos.ksh 1.1 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_005_pos +# +# DESCRIPTION: +# 'zfs clone -o property=value -V size volume' can successfully create a ZFS +# clone volume with correct property set. +# +# STRATEGY: +# 1. Create a ZFS clone volume in the storage pool with -o option +# 2. Verify the volume created successfully +# 3. Verify the property is correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if snapexists $SNAPFS1 ; then + log_must $ZFS destroy -Rf $SNAPFS1 + fi +} + +if ! $(check_opt_support "clone" "-o") ; then + log_unsupported "'zfs clone -o' unsupported." +fi + +log_onexit cleanup + +log_assert "'zfs clone -o property=value -V size volume' can successfully" \ + "create a ZFS clone volume with correct property set." + +log_must $ZFS snapshot $SNAPFS1 +typeset -i i=0 +while (( $i < ${#RW_VOL_CLONE_PROP[*]} )); do + if [[ $WRAPPER == *"crypto"* ]] && \ + [[ ${RW_VOL_CLONE_PROP[$i]} == *"checksum"* ]]; then + (( i = i + 1 )) + continue + fi + + log_must $ZFS clone -o ${RW_VOL_CLONE_PROP[$i]} $SNAPFS1 $TESTPOOL/$TESTCLONE + datasetexists $TESTPOOL/$TESTCLONE || \ + log_fail "zfs clone $TESTPOOL/$TESTCLONE fail." + propertycheck $TESTPOOL/$TESTCLONE ${RW_VOL_CLONE_PROP[i]} || \ + log_fail "${RW_VOL_CLONE_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTCLONE + + (( i = i + 1 )) +done + +log_pass "'zfs clone -o property=value volume' can successfully" \ + "create a ZFS clone volume with correct property set." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_006_pos.ksh new file mode 100644 index 00000000000..6759ca33d6f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_006_pos.ksh @@ -0,0 +1,105 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_006_pos.ksh 1.1 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_006_pos +# +# DESCRIPTION: +# 'zfs clone -o property=value volume' can successfully create a ZFS +# clone volume with multiple properties set. +# +# STRATEGY: +# 1. Create a ZFS clone volume in the storage pool with -o option +# 2. Verify the volume created successfully +# 3. Verify the properties are correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if snapexists $SNAPFS1 ; then + log_must $ZFS destroy -Rf $SNAPFS1 + fi +} + +if ! $(check_opt_support "clone" "-o") ; then + log_unsupported "'zfs clone -o' unsupported." +fi + +log_onexit cleanup + +log_assert "'zfs clone -o property=value volume' can successfully" \ + "create a ZFS clone volume with multiple correct properties set." + +typeset -i i=0 +typeset opts="" + +log_must $ZFS snapshot $SNAPFS1 + +while (( $i < ${#RW_VOL_CLONE_PROP[*]} )); do + if [[ $WRAPPER != *"crypto"* ]] || \ + [[ ${RW_VOL_CLONE_PROP[$i]} != *"checksum"* ]]; then + opts="$opts -o ${RW_VOL_CLONE_PROP[$i]}" + fi + (( i = i + 1 )) +done + +log_must $ZFS clone $opts $SNAPFS1 $TESTPOOL/$TESTCLONE + +i=0 +while (( $i < ${#RW_VOL_CLONE_PROP[*]} )); do + if [[ $WRAPPER != *"crypto"* ]] || \ + [[ ${RW_VOL_CLONE_PROP[$i]} != *"checksum"* ]]; then + propertycheck $TESTPOOL/$TESTCLONE ${RW_VOL_CLONE_PROP[i]} || \ + log_fail "${RW_VOL_CLONE_PROP[i]} is failed to set." + fi + (( i = i + 1 )) +done + +log_pass "'zfs clone -o property=value volume' can successfully" \ + "create a ZFS clone volume with multiple correct properties set." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_007_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_007_pos.ksh new file mode 100644 index 00000000000..2107270b901 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_007_pos.ksh @@ -0,0 +1,106 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_007_pos.ksh 1.1 09/01/13 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_007_pos +# +# DESCRIPTION: +# 'zfs clone -o version=' could upgrade version, but downgrade is denied. +# +# STRATEGY: +# 1. Create clone with "-o version=" specified +# 2. Verify it succeed while upgrade, but fails while the version downgraded. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-16) +# +# __stc_assertion_end +# +################################################################################ + +if ! $(check_opt_support "upgrade") ; then + log_unsupported "'zfs upgrade' unsupported." +fi + +if ! $(check_opt_support "clone" "-o") ; then + log_unsupported "'zfs clone -o' unsupported." +fi + +ZFS_VERSION=$($ZFS upgrade | $HEAD -1 | $AWK '{print $NF}' \ + | $SED -e 's/\.//g') + +verify_runnable "both" + +function cleanup +{ + if snapexists $SNAPFS ; then + log_must $ZFS destroy -Rf $SNAPFS + fi +} + +log_onexit cleanup + +log_assert "'zfs clone -o version=' could upgrade version," \ + "but downgrade is denied." + +log_must $ZFS snapshot $SNAPFS + +typeset -i ver + +if (( ZFS_TEST_VERSION == 0 )) ; then + (( ZFS_TEST_VERSION = ZFS_VERSION )) +fi + +(( ver = ZFS_TEST_VERSION )) +while (( ver <= ZFS_VERSION )); do + log_must $ZFS clone -o version=$ver $SNAPFS $TESTPOOL/$TESTCLONE + cleanup + (( ver = ver + 1 )) +done + +(( ver = 0 )) +while (( ver < ZFS_TEST_VERSION )); do + log_mustnot $ZFS clone -o version=$ver \ + $SNAPFS $TESTPOOL/$TESTCLONE + log_mustnot datasetexists $TESTPOOL/$TESTCLONE + cleanup + (( ver = ver + 1 )) +done + +log_pass "'zfs clone -o version=' could upgrade version," \ + "but downgrade is denied." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_008_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_008_neg.ksh new file mode 100644 index 00000000000..db525b20992 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_008_neg.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_008_neg.ksh 1.1 09/01/13 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_008_neg +# +# DESCRIPTION: +# 'zfs clone -o ' fails with bad arguments, including: +# *Same property set multiple times via '-o property=value' +# *Volume's property set on filesystem +# +# STRATEGY: +# 1. Create an array of arguments +# 2. Execute 'zfs clone -o ' with each argument +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists $SNAPFS ; then + log_must $ZFS destroy -Rf $SNAPFS + fi +} + +if ! $(check_opt_support "clone" "-o") ; then + log_unsupported "'zfs clone -o' unsupported." +fi + +log_onexit cleanup + +log_assert "Verify 'zfs clone -o ' fails with bad argument." + +log_must $ZFS snapshot $SNAPFS + +typeset -i i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + log_mustnot $ZFS clone -o ${RW_FS_PROP[i]} -o ${RW_FS_PROP[i]} \ + $SNAPFS $TESTPOOL/$TESTCLONE + log_mustnot $ZFS clone -p -o ${RW_FS_PROP[i]} -o ${RW_FS_PROP[i]} \ + $SNAPFS $TESTPOOL/$TESTCLONE + ((i = i + 1)) +done + +i=0 +while (( $i < ${#VOL_ONLY_PROP[*]} )); do + log_mustnot $ZFS clone -o ${VOL_ONLY_PROP[i]} \ + $SNAPFS $TESTPOOL/$TESTCLONE + log_mustnot $ZFS clone -p -o ${VOL_ONLY_PROP[i]} \ + $SNAPFS $TESTPOOL/$TESTCLONE + ((i = i + 1)) +done + +log_pass "'zfs clone -o ' fails with bad argument." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_009_neg.ksh new file mode 100644 index 00000000000..fdfa158ebcf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_009_neg.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_009_neg.ksh 1.1 09/01/13 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_009_neg +# +# DESCRIPTION: +# 'zfs clone -o ' fails with badly formed arguments,including: +# *Same property set multiple times via '-o property=value' +# *Filesystems's property set on volume +# +# STRATEGY: +# 1. Create an array of badly formed arguments +# 2. For each argument, execute 'zfs clone -o ' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if snapexists $SNAPFS1 ; then + log_must $ZFS destroy -Rf $SNAPFS1 + fi +} + +if ! $(check_opt_support "clone" "-o") ; then + log_unsupported "'zfs clone -o' unsupported." +fi + +log_onexit cleanup + +log_assert "Verify 'zfs clone -o ' fails with bad argument." + +log_must $ZFS snapshot $SNAPFS1 + +typeset -i i=0 +while (( $i < ${#RW_VOL_PROP[*]} )); do + log_mustnot $ZFS clone -o ${RW_VOL_PROP[i]} -o ${RW_VOL_PROP[i]} \ + $SNAPFS1 $TESTPOOL/$TESTCLONE + log_mustnot $ZFS clone -p -o ${RW_VOL_PROP[i]} -o ${RW_VOL_PROP[i]} \ + $SNAPFS1 $TESTPOOL/$TESTCLONE + ((i = i + 1)) +done + +i=0 +while (( $i < ${#FS_ONLY_PROP[*]} )); do + log_mustnot $ZFS clone -o ${FS_ONLY_PROP[i]} \ + $SNAPFS1 $TESTPOOL/$TESTCLONE + log_mustnot $ZFS clone -p -o ${FS_ONLY_PROP[i]} \ + $SNAPFS1 $TESTPOOL/$TESTCLONE + ((i = i + 1)) +done + +log_pass "Verify 'zfs clone -o ' fails with bad argument." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_test.sh new file mode 100755 index 00000000000..5e82fd885ce --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_clone/zfs_clone_test.sh @@ -0,0 +1,257 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_clone_001_neg cleanup +zfs_clone_001_neg_head() +{ + atf_set "descr" "Badly-formed 'zfs clone' with inapplicable scenariosshould return an error." + atf_set "require.progs" zfs +} +zfs_clone_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_clone_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_002_pos cleanup +zfs_clone_002_pos_head() +{ + atf_set "descr" "clone -p should work as expected." + atf_set "require.progs" zfs +} +zfs_clone_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_clone_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_003_pos cleanup +zfs_clone_003_pos_head() +{ + atf_set "descr" "'zfs clone -o property=value filesystem' can successfully createa ZFS clone filesystem with correct property set." + atf_set "require.progs" zfs +} +zfs_clone_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_clone_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_004_pos cleanup +zfs_clone_004_pos_head() +{ + atf_set "descr" "'zfs clone -o property=value filesystem' can successfully createa ZFS clone filesystem with multiple properties set." + atf_set "require.progs" zfs +} +zfs_clone_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_clone_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_005_pos cleanup +zfs_clone_005_pos_head() +{ + atf_set "descr" "'zfs clone -o property=value -V size volume' can successfullycreate a ZFS clone volume with correct property set." + atf_set "require.progs" zfs +} +zfs_clone_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_clone_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_006_pos cleanup +zfs_clone_006_pos_head() +{ + atf_set "descr" "'zfs clone -o property=value volume' can successfullycreate a ZFS clone volume with multiple correct properties set." + atf_set "require.progs" zfs +} +zfs_clone_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_clone_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_007_pos cleanup +zfs_clone_007_pos_head() +{ + atf_set "descr" "'zfs clone -o version=' could upgrade version,but downgrade is denied." + atf_set "require.progs" zfs +} +zfs_clone_007_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_007_pos.ksh || atf_fail "Testcase failed" +} +zfs_clone_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_008_neg cleanup +zfs_clone_008_neg_head() +{ + atf_set "descr" "Verify 'zfs clone -o ' fails with bad argument." + atf_set "require.progs" zfs +} +zfs_clone_008_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_008_neg.ksh || atf_fail "Testcase failed" +} +zfs_clone_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_009_neg cleanup +zfs_clone_009_neg_head() +{ + atf_set "descr" "Verify 'zfs clone -o ' fails with bad argument." + atf_set "require.progs" zfs +} +zfs_clone_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_009_neg.ksh || atf_fail "Testcase failed" +} +zfs_clone_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_clone.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_clone_001_neg + atf_add_test_case zfs_clone_002_pos + atf_add_test_case zfs_clone_003_pos + atf_add_test_case zfs_clone_004_pos + atf_add_test_case zfs_clone_005_pos + atf_add_test_case zfs_clone_006_pos + atf_add_test_case zfs_clone_007_pos + atf_add_test_case zfs_clone_008_neg + atf_add_test_case zfs_clone_009_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/Makefile new file mode 100644 index 00000000000..a951dc0b0cf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/Makefile @@ -0,0 +1,24 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_copies +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_copies_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_copies.cfg +${PACKAGE}FILES+= zfs_copies_001_pos.ksh +${PACKAGE}FILES+= zfs_copies_004_neg.ksh +${PACKAGE}FILES+= zfs_copies_005_neg.ksh +${PACKAGE}FILES+= zfs_copies.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_copies_006_pos.ksh +${PACKAGE}FILES+= zfs_copies_002_pos.ksh +${PACKAGE}FILES+= zfs_copies_003_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/cleanup.ksh new file mode 100644 index 00000000000..8441c267504 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/cleanup.ksh @@ -0,0 +1,48 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.4 08/11/03 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_copies/zfs_copies.kshlib +. $STF_SUITE/tests/cli_root/zfs_copies/zfs_copies.cfg + +if ! fs_prop_exist "copies" ; then + log_unsupported "copies is not supported by this release." +fi + +# +# umount the ufs fs if there is timedout in the ufs test +# + +if ismounted $UFS_MNTPOINT ufs ; then + log_must $UMOUNT -f $UFS_MNTPOINT + $RM -fr $UFS_MNTPOINT +fi + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/setup.ksh new file mode 100644 index 00000000000..fdb392b8293 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/setup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +if ! fs_prop_exist "copies" ; then + log_unsupported "copies is not supported by this release." +fi + +DISK=${DISKS%% *} +default_volume_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies.cfg new file mode 100644 index 00000000000..7cefd082bce --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies.cfg @@ -0,0 +1,40 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_copies.cfg 1.2 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export ZPOOL_VERSION_1_FILES="zfs-pool-v1.dat.Z" +export ZPOOL_VERSION_1_NAME="v1-pool" + +export FILESIZE=10m +export FILE=file.${TESTCASE_ID} +export SLEEPTIME=30 +export UFS_MNTPOINT=/testdir_nfs_mntpoint diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies.kshlib new file mode 100644 index 00000000000..3777c4950a4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies.kshlib @@ -0,0 +1,146 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_copies.kshlib 1.3 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Compare the value of copies property with specified value +# $1, the dataset name +# $2, the expected copies value +# +function cmp_prop +{ + typeset ds=$1 + typeset val_expect=$2 + typeset val_actual + + val_actual=$(get_prop copies $ds) + if [[ $val_actual != $val_expect ]]; then + log_fail "Expected value ($val_expect) != " \ + "actual value ($val_actual)" + fi +} + +# +# Get the value of property used via zfs list +# $1, the dataset name +# +function get_used_prop +{ + typeset ds=$1 + typeset used + + used=`$ZFS list -H -o used $ds` + used=${used%[m|M]} + if [[ $used == *K ]]; then + used=0 + fi + $ECHO $used +} + +# +# Check the used space is charged correctly +# $1, the number of used space +# $2, the expected common factor between the used space and the file space +# +function check_used +{ + typeset charged_spc=$1 + typeset -i used + typeset -i expected_cfactor=$2 + typeset -i cfactor + typeset -i fsize=${FILESIZE%[m|M]} + + (( used = ${charged_spc%[m|M]} )) + (( cfactor = used / fsize )) + if (( cfactor != expected_cfactor )); then + log_fail "The space is not charged correctly while setting"\ + "copies as $expected_cfactor." + fi +} + +# +# test ncopies on volume +# $1 test type zfs|ufs, default zfs +# $2 copies +# $3 mntp for ufs test +function do_vol_test +{ + typeset type=$1 + typeset copy=$2 + typeset mntp=$3 + + vol=$TESTPOOL/$TESTVOL1 + vol_b_path=/dev/zvol/$TESTPOOL/$TESTVOL1 + vol_r_path=/dev/zvol/$TESTPOOL/$TESTVOL1 + + log_must $ZFS create -V $VOLSIZE -o copies=$copy $vol + if fs_prop_exist "refreserv" ; then + log_must $ZFS set refreservation=none $vol + fi + if [[ $type == "ufs" ]]; then + log_must $ECHO y | $NEWFS $vol_r_path >/dev/null 2>&1 + log_must $MOUNT -F ufs -o rw $vol_b_path $mntp + else + log_must $ZPOOL create $TESTPOOL1 $vol_b_path + log_must $ZFS create $TESTPOOL1/$TESTFS1 + fi + + (( nfilesize = copy * ${FILESIZE%m} )) + pre_used=$(get_used_prop $vol) + (( target_size = pre_used + nfilesize )) + + if [[ $type == "ufs" ]]; then + log_must $MKFILE $FILESIZE $mntp/$FILE + else + log_must $MKFILE $FILESIZE /$TESTPOOL1/$TESTFS1/$FILE + fi + + post_used=$(get_used_prop $vol) + while (( post_used < target_size )) ; do + sleep 1 + post_used=$(get_used_prop $vol) + done + + (( used = post_used - pre_used )) + if (( used < nfilesize )); then + log_fail "The space is not charged correctly while setting"\ + "copies as $copy" + fi + + if [[ $type == "ufs" ]]; then + $UMOUNT $mntp + else + log_must $ZPOOL destroy $TESTPOOL1 + fi + + log_must $ZFS destroy $vol +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_001_pos.ksh new file mode 100644 index 00000000000..b11219dc043 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_001_pos.ksh @@ -0,0 +1,126 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_copies_001_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_copies/zfs_copies.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_copies_001_pos +# +# DESCRIPTION: +# Verify "copies" property can be correctly set as 1,2 and 3 and different +# filesystem can have different value of "copies" property within the same pool. +# +# STRATEGY: +# 1. Create different filesystems with copies set as 1,2,3; +# 2. Verify that the "copies" property has been set correctly +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset ds + + for ds in $fs1 $fs2 $vol1 $vol2; do + if datasetexists $ds; then + log_must $ZFS destroy $ds + fi + done +} + +log_assert "Verify 'copies' property with correct arguments works or not." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +fs1=$TESTPOOL/$TESTFS1 +fs2=$TESTPOOL/$TESTFS2 +vol=$TESTPOOL/$TESTVOL +vol1=$TESTPOOL/$TESTVOL1 +vol2=$TESTPOOL/$TESTVOL2 + +# +# Check the default value for copies property +# +for ds in $fs $vol; do + cmp_prop $ds 1 +done + +for val in 1 2 3; do + log_must $ZFS create -o copies=$val $fs1 + if is_global_zone; then + log_must $ZFS create -V $VOLSIZE -o copies=$val $vol1 + else + log_must $ZFS create -o copies=$val $vol1 + fi + for ds in $fs1 $vol1; do + cmp_prop $ds $val + done + + for val2 in 3 2 1; do + log_must $ZFS create -o copies=$val2 $fs2 + if is_global_zone; then + log_must $ZFS create -V $VOLSIZE -o copies=$val2 $vol2 + else + log_must $ZFS create -o copies=$val2 $vol2 + fi + for ds in $fs2 $vol2; do + cmp_prop $ds $val2 + log_must $ZFS destroy $ds + done + done + + for ds in $fs1 $vol1; do + log_must $ZFS destroy $ds + done + +done + +for val in 3 2 1; do + for ds in $fs $vol; do + log_must $ZFS set copies=$val $ds + cmp_prop $ds $val + done +done + +log_pass "'copies' property with correct arguments works as expected. " diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_002_pos.ksh new file mode 100644 index 00000000000..ac737d8c483 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_002_pos.ksh @@ -0,0 +1,117 @@ +#!/usr/local/bin/ksh93 +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_copies_002_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_copies/zfs_copies.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_copies_002_pos +# +# DESCRIPTION: +# Verify that the space used by multiple copies is charged correctly +# +# STRATEGY: +# 1. Create filesystems with copies set as 2,3 respectively; +# 2. Copy specified size data into each filesystem; +# 3. Verify that the space is charged as expected with zfs list, ls -s, df(1m), +# du(1) commands; +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset val + + for val in 1 2 3; do + if datasetexists $TESTPOOL/fs_$val; then + log_must $ZFS destroy $TESTPOOL/fs_$val + fi + done +} + +log_assert "Verify that the space used by multiple copies is charged correctly." +log_onexit cleanup + +for val in 1 2 3; do + log_must $ZFS create -o copies=$val $TESTPOOL/fs_$val + + log_must $MKFILE $FILESIZE /$TESTPOOL/fs_$val/$FILE +done + +# +# Sync up the filesystem +# +$SYNC + +# +# Verify 'zfs list' can correctly list the space charged +# +log_note "Verify 'zfs list' can correctly list the space charged." +fsize=${FILESIZE%[m|M]} +for val in 1 2 3; do + used=$(get_used_prop $TESTPOOL/fs_$val) + check_used $used $val +done + +log_note "Verify 'ls -s' can correctly list the space charged." +for val in 1 2 3; do + blks=`$LS -lsk /$TESTPOOL/fs_$val/$FILE | $AWK '{print $1}'` + (( used = blks / 1024 )) + check_used $used $val +done + +log_note "Verify df(1M) can corectly display the space charged." +for val in 1 2 3; do + used=`$DF -m /$TESTPOOL/fs_$val | $GREP $TESTPOOL/fs_$val \ + | $AWK -v fs=fs_$val '$4 ~ fs {print $3}'` + check_used $used $val +done + +log_note "Verify du(1) can correctly display the space charged." +for val in 1 2 3; do + used=`$DU -h /$TESTPOOL/fs_$val/$FILE | $AWK '{print $1}'` + check_used $used $val +done + +log_pass "The space used by multiple copies is charged correctly as expected. " diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_003_pos.ksh new file mode 100644 index 00000000000..f77acd8c541 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_003_pos.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_copies_003_pos.ksh 1.2 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_copies/zfs_copies.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_copies_003_pos +# +# DESCRIPTION: +# Verify that the volume space used by multiple copies is charged correctly +# +# STRATEGY: +# 1. Create volume; +# 2. Create ZFS filesystem based on the volume; +# 3. Set the copies property of volume to 1,2 or 3; +# 4. Copy specified size data into each filesystem; +# 5. Verify that the volume space is charged as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL1; then + destroy_pool $TESTPOOL1 + fi + + if datasetexists $vol; then + log_must $ZFS destroy $vol + fi +} + +log_assert "Verify that ZFS volume space used by multiple copies is charged correctly." +log_onexit cleanup +vol=$TESTPOOL/$TESTVOL1 + + +for val in 1 2 3; do + do_vol_test zfs $val +done + +log_pass "The volume space used by multiple copies is charged correctly as expected. " diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_004_neg.ksh new file mode 100644 index 00000000000..7104e6f1487 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_004_neg.ksh @@ -0,0 +1,71 @@ +#!/usr/local/bin/ksh93 +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_copies_004_neg.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_copies/zfs_copies.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_copies_004_neg +# +# DESCRIPTION: +# Verify that copies cannot be set to other value except for 1, 2 or 3 +# +# STRATEGY: +# 1. Create filesystems with copies set as any value other than 1, 2 or 3 +# 2. Verify that the create operations fail +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify that copies property cannot be set to any value other than 1,2 or 3" + +set -A badval 0 01 02 03 0 -1 -2 -3 10 20 30 4 5 6 ? * blah + +for val in ${badval[@]}; do + log_mustnot $ZFS create -o copies=$val $TESTPOOL/$TESTFS1 + log_mustnot $ZFS create -V $VOLSIZE -o copies=$val $TESTPOOL/$TESTVOL1 + log_mustnot $ZFS set copies=$val $TESTPOOL/$TESTFS + log_mustnot $ZFS set copies=$val $TESTPOOL/$TESTVOL +done + +log_pass "The copies property cannot be set to any value other than 1,2 or 3 as expected" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_005_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_005_neg.ksh new file mode 100644 index 00000000000..0f2e2048b63 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_005_neg.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_copies_005_neg.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_copies/zfs_copies.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_copies_005_neg +# +# DESCRIPTION: +# Verify that copies cannot be set with pool version 1 +# +# STRATEGY: +# 1. Create filesystems with copies set in a pool with version 1 +# 2. Verify that the create operations fail +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if poolexists $ZPOOL_VERSION_1_NAME; then + destroy_pool $ZPOOL_VERSION_1_NAME + fi + + if [[ -f $TESTDIR/$ZPOOL_VERSION_1_FILES ]]; then + rm -f $TESTDIR/$ZPOOL_VERSION_1_FILES + fi +} + +log_assert "Verify that copies cannot be set with pool version 1" +log_onexit cleanup + +$CP $STF_SUITE/tests/cli_root/zpool_upgrade/blockfiles/$ZPOOL_VERSION_1_FILES $TESTDIR +$UNCOMPRESS $TESTDIR/$ZPOOL_VERSION_1_FILES +log_must $ZPOOL import -d $TESTDIR $ZPOOL_VERSION_1_NAME +log_must $ZFS create $ZPOOL_VERSION_1_NAME/$TESTFS +log_must $ZFS create -V 1m $ZPOOL_VERSION_1_NAME/$TESTVOL + +for val in 3 2 1; do + for ds in $ZPOOL_VERSION_1_NAME/$TESTFS $ZPOOL_VERSION_1_NAME/$TESTVOL; do + log_mustnot $ZFS set copies=$val $ds + done + for ds in $ZPOOL_VERSION_1_NAME/$TESTFS1 $ZPOOL_VERSION_1_NAME/$TESTVOL1; do + log_mustnot $ZFS create -o copies=$val $ds + done +done + +log_pass "Verification pass: copies cannot be set with pool version 1. " diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_006_pos.ksh new file mode 100644 index 00000000000..719f9b8eb55 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_006_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_copies_006_pos.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_copies/zfs_copies.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_copies_006_pos +# +# DESCRIPTION: +# Verify that the volume space used by multiple copies is charged correctly +# +# STRATEGY: +# 1. Create volume +# 2. Create UFS filesystem based on the volume +# 3. Set the copies property of volume to 1,2 or 3 +# 4. Copy specified size data into each filesystem +# 5. Verify that the volume space is charged as expected +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-06) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if ismounted $mntp ufs ; then + log_must $UMOUNT $mntp + fi + + if datasetexists $vol; then + log_must $ZFS destroy $vol + fi + + if [[ -d $mntp ]]; then + $RM -rf $mntp + fi +} + + +log_assert "Verify that ZFS volume space used by multiple copies is charged correctly." +log_onexit cleanup +mntp=$UFS_MNTPOINT +vol=$TESTPOOL/$TESTVOL1 + +if [[ ! -d $mntp ]]; then + $MKDIR -p $mntp +fi + +for val in 1 2 3; do + do_vol_test ufs $val $mntp +done + +log_pass "The volume space used by multiple copies is charged correctly as expected. " diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_test.sh new file mode 100755 index 00000000000..b480821c0c9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_copies/zfs_copies_test.sh @@ -0,0 +1,196 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_copies_001_pos cleanup +zfs_copies_001_pos_head() +{ + atf_set "descr" "Verify 'copies' property with correct arguments works or not." + atf_set "require.progs" zfs +} +zfs_copies_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_copies_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_copies_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_copies_002_pos cleanup +zfs_copies_002_pos_head() +{ + atf_set "descr" "Verify that the space used by multiple copies is charged correctly." + atf_set "require.progs" zfs +} +zfs_copies_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_copies_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_copies_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_copies_003_pos cleanup +zfs_copies_003_pos_head() +{ + atf_set "descr" "Verify that ZFS volume space used by multiple copies is charged correctly." + atf_set "require.progs" zfs +} +zfs_copies_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + verify_zvol_recursive + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_copies_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_copies_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_copies_004_neg cleanup +zfs_copies_004_neg_head() +{ + atf_set "descr" "Verify that copies property cannot be set to any value other than 1,2 or 3" + atf_set "require.progs" zfs +} +zfs_copies_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + verify_disk_count "$DISKS" 1 + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_copies_004_neg.ksh || atf_fail "Testcase failed" +} +zfs_copies_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_copies_005_neg cleanup +zfs_copies_005_neg_head() +{ + atf_set "descr" "Verify that copies cannot be set with pool version 1" + atf_set "require.progs" zfs zpool +} +zfs_copies_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_copies_005_neg.ksh || atf_fail "Testcase failed" +} +zfs_copies_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_copies_006_pos cleanup +zfs_copies_006_pos_head() +{ + atf_set "descr" "Verify that ZFS volume space used by multiple copies is charged correctly." + atf_set "require.progs" zfs +} +zfs_copies_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + verify_disk_count "$DISKS" 1 + atf_skip "PR 225960 g_access leak when unmounting UFS on a zvol" + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_copies_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_copies_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_copies.kshlib + . $(atf_get_srcdir)/zfs_copies.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_copies_001_pos + atf_add_test_case zfs_copies_002_pos + atf_add_test_case zfs_copies_003_pos + atf_add_test_case zfs_copies_004_neg + atf_add_test_case zfs_copies_005_neg + atf_add_test_case zfs_copies_006_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/Makefile new file mode 100644 index 00000000000..080124a3ae6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/Makefile @@ -0,0 +1,32 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_create +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_create_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= properties.kshlib +${PACKAGE}FILES+= zfs_create_011_pos.ksh +${PACKAGE}FILES+= zfs_create_010_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_create_009_neg.ksh +${PACKAGE}FILES+= zfs_create_004_pos.ksh +${PACKAGE}FILES+= zfs_create_common.kshlib +${PACKAGE}FILES+= zfs_create_008_neg.ksh +${PACKAGE}FILES+= zfs_create_005_pos.ksh +${PACKAGE}FILES+= zfs_create_001_pos.ksh +${PACKAGE}FILES+= zfs_create_007_pos.ksh +${PACKAGE}FILES+= zfs_create_003_pos.ksh +${PACKAGE}FILES+= zfs_create_012_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_create_013_pos.ksh +${PACKAGE}FILES+= zfs_create.cfg +${PACKAGE}FILES+= zfs_create_006_pos.ksh +${PACKAGE}FILES+= zfs_create_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/properties.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/properties.kshlib new file mode 100644 index 00000000000..ec69e3d7162 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/properties.kshlib @@ -0,0 +1,83 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)properties.kshlib 1.6 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +set -A RW_FS_PROP "quota=512M" \ + "reservation=512M" \ + "recordsize=64K" \ + "mountpoint=/tmp/mnt${TESTCASE_ID}" \ + "checksum=fletcher2" \ + "compression=lzjb" \ + "atime=off" \ + "devices=off" \ + "exec=off" \ + "setuid=off" \ + "readonly=on" \ + "snapdir=visible" \ + "aclmode=discard" \ + "aclinherit=discard" \ + "canmount=off" \ + "local:department=123" + +is_global_zone && \ + set -A RW_FS_PROP ${RW_FS_PROP[*]} "sharenfs=on" + +set -A RW_VOL_PROP "volblocksize=16K" \ + "checksum=fletcher2" \ + "compression=lzjb" \ + "readonly=on" \ + "local:department=123" + +set -A RW_VOL_CLONE_PROP "checksum=fletcher2" \ + "compression=lzjb" \ + "readonly=on" \ + "local:department=123" + +set -A FS_ONLY_PROP "quota=512M" \ + "recordsize=64K" \ + "mountpoint=/tmp/mnt${TESTCASE_ID}" \ + "sharenfs=on" \ + "atime=off" \ + "devices=off" \ + "exec=off" \ + "setuid=off" \ + "snapdir=visible" \ + "aclmode=discard" \ + "aclinherit=discard" \ + "canmount=off" + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + set -A FS_ONLY_PROP ${FS_ONLY_PROP[*]} "version=1" +fi + +set -A VOL_ONLY_PROP "volblocksize=16K" "volsize=512M" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create.cfg new file mode 100644 index 00000000000..8cbf80a79ed --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create.cfg @@ -0,0 +1,56 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create.cfg 1.3 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export BYND_MAX_NAME="byondmaxnamelength\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789" + +# There're 3 different prompt messages while create +# a volume that great than 1TB on 32-bit +# - volume size exceeds limit for this system. (happy gate) +# - max volume size is 1TB on 32-bit systems (s10u2) +# - value is too large (old) + +export VOL_LIMIT_KEYWORD1="1TB on 32-bit" +export VOL_LIMIT_KEYWORD2="value is too large" +export VOL_LIMIT_KEYWORD3="volume size exceeds limit" + +set -A size "8k" "8K" "1m" "1M" "1mb" "1mB" "1Mb" "1MB" "1g" "1G" \ + "1p" "1P" "1z" "1Z" "1gb" "1gB" "1Gb" "1GB" "1pb" "1pB" "1Pb" \ + "1PB" "1zb" "1zB" "1Zb" "1ZB" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_001_pos.ksh new file mode 100644 index 00000000000..1c06a14f6da --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_001_pos.ksh @@ -0,0 +1,84 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_001_pos +# +# DESCRIPTION: +# 'zfs create ' can create a ZFS filesystem in the namespace. +# +# STRATEGY: +# 1. Create a ZFS filesystem in the storage pool +# 2. Verify the filesystem created successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +function cleanup +{ + typeset -i i=0 + while (( $i < ${#datasets[*]} )); do + datasetexists ${datasets[$i]} && \ + log_must $ZFS destroy -f ${datasets[$i]} + ((i = i + 1)) + done +} + +log_onexit cleanup + +set -A datasets "$TESTPOOL/$TESTFS1" "$TESTPOOL/$LONGFSNAME" "$TESTPOOL/..." \ + "$TESTPOOL/_1234_" + +log_assert "'zfs create ' can create a ZFS filesystem in the namespace." + +typeset -i i=0 +while (( $i < ${#datasets[*]} )); do + log_must $ZFS create ${datasets[$i]} + datasetexists ${datasets[$i]} || \ + log_fail "zfs create ${datasets[$i]} fail." + ((i = i + 1)) +done + +log_pass "'zfs create ' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_002_pos.ksh new file mode 100644 index 00000000000..2ac46024215 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_002_pos.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_002_pos.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create.cfg + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_002_pos +# +# DESCRIPTION: +# 'zfs create -s -V ' can create various-size sparse volume. +# +# STRATEGY: +# 1. Create a volume in the storage pool. +# 2. Verify the volume is created correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset -i j=0 + while [[ $j -lt ${#size[*]} ]]; do + if datasetexists $TESTPOOL/${TESTVOL}${size[j]}; then + log_must $ZFS destroy $TESTPOOL/${TESTVOL}${size[j]} + fi + ((j = j + 1)) + done +} + +log_onexit cleanup + + +log_assert "'zfs create -s -V ' succeeds" + +typeset -i j=0 +while (( $j < ${#size[*]} )); do + typeset cmdline="$ZFS create -s -V ${size[j]} \ + $TESTPOOL/${TESTVOL}${size[j]}" + + str=$(eval $cmdline 2>&1) + if (( $? == 0 )); then + log_note "SUCCESS: $cmdline" + log_must datasetexists $TESTPOOL/${TESTVOL}${size[j]} + elif [[ $str == *${VOL_LIMIT_KEYWORD1}* || \ + $str == *${VOL_LIMIT_KEYWORD2}* || \ + $str == *${VOL_LIMIT_KEYWORD3}* ]] + then + log_note "UNSUPPORTED: $cmdline" + else + log_fail "$cmdline" + fi + + ((j = j + 1)) + +done +log_pass "'zfs create -s -V ' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_003_pos.ksh new file mode 100644 index 00000000000..b7193daf966 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_003_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_003_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_003_pos +# +# DESCRIPTION: +# 'zfs create [-b ] -V ' can create a volume +# with specified blocksize, which is power of 2 between 512 - 128k. +# +# STRATEGY: +# 1. Create a volume with blocksize in the storage pool +# 2. Verify the volume created successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-11-23) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $vol && \ + log_must $ZFS destroy -f $vol +} + +log_assert "Verify creating volume with specified blocksize works." +log_onexit cleanup + +set -A options "" "-b 1k" "-b 1K" "-b 1024" "-b 1024b" +vol=$TESTPOOL/$TESTVOL + +typeset -i i=0 +while (( i < ${#options[*]} )); do + log_must $ZFS create ${options[i]} -V $VOLSIZE $vol + datasetexists $vol || \ + log_fail "zfs create ${options[i]} -V $VOLSIZE $vol fail." + + log_must $ZFS destroy -f $vol + ((i = i + 1)) +done + +log_pass "'zfs create [-b ] -V ' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_004_pos.ksh new file mode 100644 index 00000000000..39b751102ac --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_004_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_004_pos.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_004_pos +# +# DESCRIPTION: +# 'zfs create -o property=value filesystem' can successfully create a ZFS +# filesystem with correct property set. +# +# STRATEGY: +# 1. Create a ZFS filesystem in the storage pool with -o option +# 2. Verify the filesystem created successfully +# 3. Verify the property is correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTFS1 && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 +} + +log_onexit cleanup + + +log_assert "'zfs create -o property=value filesystem' can successfully create \ + a ZFS filesystem with correct property set." + +typeset -i i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ $WRAPPER == *"crypto"* ]] && \ + [[ ${RW_FS_PROP[$i]} == *"checksum"* ]]; then + (( i = i + 1 )) + continue + fi + log_must $ZFS create -o ${RW_FS_PROP[$i]} $TESTPOOL/$TESTFS1 + datasetexists $TESTPOOL/$TESTFS1 || \ + log_fail "zfs create $TESTPOOL/$TESTFS1 fail." + propertycheck $TESTPOOL/$TESTFS1 ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + (( i = i + 1 )) +done + +log_pass "'zfs create -o property=value filesystem' can successfully create \ + a ZFS filesystem with correct property set." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_005_pos.ksh new file mode 100644 index 00000000000..6313b0b7daf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_005_pos.ksh @@ -0,0 +1,101 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_005_pos.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_005_pos +# +# DESCRIPTION: +# 'zfs create -o property=value filesystem' can successfully create a ZFS +# filesystem with multiple properties set. +# +# STRATEGY: +# 1. Create a ZFS filesystem in the storage pool with multiple -o options +# 2. Verify the filesystem created successfully +# 3. Verify the properties are correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTFS1 && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 +} + +log_onexit cleanup + + +log_assert "'zfs create -o property=value filesystem' can successfully create \ + a ZFS filesystem with multiple properties set." + +typeset -i i=0 +typeset opts="" + +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ $WRAPPER != *"crypto"* ]] || \ + [[ ${RW_FS_PROP[$i]} != *"checksum"* ]]; then + opts="$opts -o ${RW_FS_PROP[$i]}" + fi + (( i = i + 1 )) +done + +log_must $ZFS create $opts $TESTPOOL/$TESTFS1 +datasetexists $TESTPOOL/$TESTFS1 || \ + log_fail "zfs create $TESTPOOL/$TESTFS1 fail." + +i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ $WRAPPER != *"crypto"* ]] || \ + [[ ${RW_FS_PROP[$i]} != *"checksum"* ]]; then + propertycheck $TESTPOOL/$TESTFS1 ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + fi + (( i = i + 1 )) +done + +log_pass "'zfs create -o property=value filesystem' can successfully create \ + a ZFS filesystem with multiple properties set." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_006_pos.ksh new file mode 100644 index 00000000000..01537d4dc39 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_006_pos.ksh @@ -0,0 +1,103 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_006_pos.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_006_pos +# +# DESCRIPTION: +# 'zfs create -o property=value -V size volume' can successfully create a ZFS +# volume with correct property set. +# +# STRATEGY: +# 1. Create a ZFS volume in the storage pool with -o option +# 2. Verify the volume created successfully +# 3. Verify the property is correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL1 && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL1 +} + +log_onexit cleanup + + +log_assert "'zfs create -o property=value -V size volume' can successfully \ + create a ZFS volume with correct property set." + +typeset -i i=0 +while (( $i < ${#RW_VOL_PROP[*]} )); do + if [[ $WRAPPER == *"crypto"* ]] && \ + [[ ${RW_VOL_PROP[$i]} == *"checksum"* ]]; then + (( i = i + 1 )) + continue + fi + + log_must $ZFS create -o ${RW_VOL_PROP[$i]} -V $VOLSIZE \ + $TESTPOOL/$TESTVOL1 + datasetexists $TESTPOOL/$TESTVOL1 || \ + log_fail "zfs create -V size $TESTPOOL/$TESTVOL1 fail." + propertycheck $TESTPOOL/$TESTVOL1 ${RW_VOL_PROP[i]} || \ + log_fail "${RW_VOL_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL1 + + log_must $ZFS create -s -o ${RW_VOL_PROP[$i]} -V $VOLSIZE \ + $TESTPOOL/$TESTVOL1 + datasetexists $TESTPOOL/$TESTVOL1 || \ + log_fail "zfs create -s -V $TESTPOOL/$TESTVOL1 fail." + propertycheck $TESTPOOL/$TESTVOL1 ${RW_VOL_PROP[i]} || \ + log_fail "${RW_VOL_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL1 + + (( i = i + 1 )) +done + +log_pass "'zfs create -o property=value -V size volume' can successfully \ + create a ZFS volume with correct property set." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_007_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_007_pos.ksh new file mode 100644 index 00000000000..4678fa93073 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_007_pos.ksh @@ -0,0 +1,106 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_007_pos.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_007_pos +# +# DESCRIPTION: +# 'zfs create -o property=value -V size volume' can successfully create a ZFS +# volume with multiple properties set. +# +# STRATEGY: +# 1. Create a ZFS volume in the storage pool with -o option +# 2. Verify the volume created successfully +# 3. Verify the properties are correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL1 && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL1 +} + +log_onexit cleanup + + +log_assert "'zfs create -o property=value -V size volume' can successfully \ + create a ZFS volume with correct property set." + +typeset -i i=0 +typeset opts="" + +while (( $i < ${#RW_VOL_PROP[*]} )); do + if [[ $WRAPPER != *"crypto"* ]] || \ + [[ ${RW_VOL_PROP[$i]} != *"checksum"* ]]; then + opts="$opts -o ${RW_VOL_PROP[$i]}" + fi + (( i = i + 1 )) +done + +log_must $ZFS create $opts -V $VOLSIZE $TESTPOOL/$TESTVOL +datasetexists $TESTPOOL/$TESTVOL || \ + log_fail "zfs create $TESTPOOL/$TESTVOL fail." +log_must $ZFS create -s $opts -V $VOLSIZE $TESTPOOL/$TESTVOL1 +datasetexists $TESTPOOL/$TESTVOL1 || \ + log_fail "zfs create $TESTPOOL/$TESTVOL1 fail." + +i=0 +while (( $i < ${#RW_VOL_PROP[*]} )); do + if [[ $WRAPPER != *"crypto"* ]] || \ + [[ ${RW_VOL_PROP[$i]} != *"checksum"* ]]; then + propertycheck $TESTPOOL/$TESTVOL ${RW_VOL_PROP[i]} || \ + log_fail "${RW_VOL_PROP[i]} is failed to set." + propertycheck $TESTPOOL/$TESTVOL1 ${RW_VOL_PROP[i]} || \ + log_fail "${RW_VOL_PROP[i]} is failed to set." + fi + (( i = i + 1 )) +done + +log_pass "'zfs create -o property=value -V size volume' can successfully \ + create a ZFS volume with correct property set." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_008_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_008_neg.ksh new file mode 100644 index 00000000000..f369d2ae881 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_008_neg.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_008_neg.ksh 1.4 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_008_neg +# +# DESCRIPTION: +# 'zfs create' should return an error with badly formed parameters. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zfs create' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1 ; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi +} + +log_onexit cleanup + +set -A args "ab" "-?" "-cV" "-Vc" "-c -V" "c" "V" "--c" "-e" "-s" \ + "-blah" "-cV 12k" "-s -cV 1P" "-sc" "-Vs 5g" "-o" "--o" "-O" "--O" \ + "-o QuOta=none" "-o quota=non" "-o quota=abcd" "-o quota=0" "-o quota=" \ + "-o ResErVaTi0n=none" "-o reserV=none" "-o reservation=abcd" "-o reserv=" \ + "-o recorDSize=64k" "-o recordsize=256K" "-o recordsize=256" \ + "-o recsize=" "-o recsize=zero" "-o recordsize=0" \ + "-o mountPoint=/tmp/tmpfile${TESTCASE_ID}" "-o mountpoint=non0" "-o mountpoint=" \ + "-o mountpoint=LEGACY" "-o mounpoint=none" \ + "-o sharenfs=ON" "-o ShareNFS=off" "-o sharenfs=sss" \ + "-o checkSUM=on" "-o checksum=SHA256" "-o chsum=off" "-o checksum=aaa" \ + "-o checkSUM=on -V $VOLSIZE" "-o checksum=SHA256 -V $VOLSIZE" \ + "-o chsum=off -V $VOLSIZE" "-o checksum=aaa -V $VOLSIZE" \ + "-o compression=of" "-o ComPression=lzjb" "-o compress=ON" "-o compress=a" \ + "-o compression=of -V $VOLSIZE" "-o ComPression=lzjb -V $VOLSIZE" \ + "-o compress=ON -V $VOLSIZE" "-o compress=a -V $VOLSIZE" \ + "-o atime=ON" "-o ATime=off" "-o atime=bbb" \ + "-o deviCes=on" "-o devices=OFF" "-o devices=aaa" \ + "-o exec=ON" "-o EXec=off" "-o exec=aaa" \ + "-o readonly=ON" "-o reADOnly=off" "-o rdonly=OFF" "-o rdonly=aaa" \ + "-o readonly=ON -V $VOLSIZE" "-o reADOnly=off -V $VOLSIZE" \ + "-o rdonly=OFF -V $VOLSIZE" "-o rdonly=aaa -V $VOLSIZE" \ + "-o zoned=ON" "-o ZoNed=off" "-o zoned=aaa" \ + "-o snapdIR=hidden" "-o snapdir=VISible" "-o snapdir=aaa" \ + "-o aclmode=DIScard" "-o aclmODE=groupmask" "-o aclmode=aaa" \ + "-o aclinherit=deny" "-o aclinHerit=secure" "-o aclinherit=aaa" \ + "-o type=volume" "-o type=snapshot" "-o type=filesystem" \ + "-o type=volume -V $VOLSIZE" "-o type=snapshot -V $VOLSIZE" \ + "-o type=filesystem -V $VOLSIZE" \ + "-o creation=aaa" "-o creation=aaa -V $VOLSIZE" \ + "-o used=10K" "-o used=10K -V $VOLSIZE" \ + "-o available=10K" "-o available=10K -V $VOLSIZE" \ + "-o referenced=10K" "-o referenced=10K -V $VOLSIZE" \ + "-o compressratio=1.00x" "-o compressratio=1.00x -V $VOLSIZE" \ + "-o version=0" "-o version=1.234" "-o version=10K" "-o version=-1" \ + "-o version=aaa" "-o version=999" + +log_assert "'zfs create' should return an error with badly-formed parameters." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZFS create ${args[i]} $TESTPOOL/$TESTFS1 + log_mustnot $ZFS create -p ${args[i]} $TESTPOOL/$TESTFS1 + ((i = i + 1)) +done + +log_pass "'zfs create' with badly formed parameters failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_009_neg.ksh new file mode 100644 index 00000000000..5113ce3b38e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_009_neg.ksh @@ -0,0 +1,139 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_009_neg.ksh 1.4 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_009_neg +# +# DESCRIPTION: +# 'zfs create ' fails with bad arguments, including: +# *Invalid character against the ZFS namespace +# *Incomplete component +# *Too many arguments +# *Filesystem already exists +# *Beyond maximal name length. +# *Same property set multiple times via '-o property=value' +# *Volume's property set on filesystem +# +# STRATEGY: +# 1. Create an array of arguments +# 2. Execute 'zfs create ' with each argument +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset -i i + typeset found + + # + # check to see if there is any new fs created during the test + # if so destroy it. + # + for dset in $($ZFS list -H | \ + $AWK '{print $1}' | $GREP / ); do + found=false + i=0 + while (( $i < ${#existed_fs[*]} )); do + if [[ $dset == ${existed_fs[i]} ]]; then + found=true + break + fi + (( i = i + 1 )) + done + + # + # new fs created during the test, cleanup it + # + if [[ $found == "false" ]]; then + log_must $ZFS destroy -f $dset + fi + done +} + +log_onexit cleanup + +set -A args "$TESTPOOL/" "$TESTPOOL//blah" "$TESTPOOL/@blah" \ + "$TESTPOOL/blah@blah" "$TESTPOOL/blah^blah" "$TESTPOOL/blah%blah" \ + "$TESTPOOL/blah*blah" "$TESTPOOL/blah blah" \ + "-s $TESTPOOL/$TESTFS1" "-b 1092 $TESTPOOL/$TESTFS1" \ + "-b 64k $TESTPOOL/$TESTFS1" "-s -b 32k $TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$BYND_MAX_NAME" + +log_assert "Verify 'zfs create ' fails with bad argument." + +datasetexists $TESTPOOL/$TESTFS || \ + log_must $ZFS create $TESTPOOL/$TESTFS + +set -A existed_fs $($ZFS list -H | $AWK '{print $1}' | $GREP / ) + +log_mustnot $ZFS create $TESTPOOL +log_mustnot $ZFS create $TESTPOOL/$TESTFS + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZFS create ${args[$i]} + log_mustnot $ZFS create -p ${args[$i]} + ((i = i + 1)) +done + +i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + log_mustnot $ZFS create -o ${RW_FS_PROP[i]} -o ${RW_FS_PROP[i]} \ + $TESTPOOL/$TESTFS1 + log_mustnot $ZFS create -p -o ${RW_FS_PROP[i]} -o ${RW_FS_PROP[i]} \ + $TESTPOOL/$TESTFS1 + ((i = i + 1)) +done + +i=0 +while (( $i < ${#VOL_ONLY_PROP[*]} )); do + log_mustnot $ZFS create -o ${VOL_ONLY_PROP[i]} $TESTPOOL/$TESTFS1 + log_mustnot $ZFS create -p -o ${VOL_ONLY_PROP[i]} $TESTPOOL/$TESTFS1 + ((i = i + 1)) +done + +log_pass "'zfs create ' fails as expected with bad argument." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_010_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_010_neg.ksh new file mode 100644 index 00000000000..e7fc2463def --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_010_neg.ksh @@ -0,0 +1,161 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_010_neg.ksh 1.4 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/properties.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_010_neg +# +# DESCRIPTION: +# 'zfs create [-b ] -V ' fails with badly formed +# or arguments,including: +# *Invalid volume size and volume name +# *Invalid blocksize +# *Incomplete component in the dataset tree +# *The volume already exists +# *The volume name beyond the maximal name length - 256. +# *Same property set multiple times via '-o property=value' +# *Filesystems's property set on volume +# +# STRATEGY: +# 1. Create an array of badly formed arguments +# 2. For each argument, execute 'zfs create -V ' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset -i i + typeset found + + # + # check to see if there is any new fs created during the test + # if so destroy it. + # + for dset in $($ZFS list -H | \ + $AWK '{print $1}' | $GREP / ); do + found=false + i=0 + while (( $i < ${#existed_fs[*]} )); do + if [[ $dset == ${existed_fs[i]} ]]; then + found=true + break + fi + (( i = i + 1 )) + done + + # + # new fs created during the test, cleanup it + # + if [[ $found == "false" ]]; then + log_must $ZFS destroy -f $dset + fi + done +} + +log_onexit cleanup + +log_assert "Verify 'zfs create [-s] [-b ] -V ' fails with" \ + "badly-formed or arguments." + +set -A args "$VOLSIZE" "$TESTVOL1" \ + "$VOLSIZE $TESTVOL1" "0 $TESTPOOL/$TESTVOL1" \ + "-1gb $TESTPOOL/$TESTVOL1" "1g? $TESTPOOL/$TESTVOL1" \ + "1.01BB $TESTPOOL/$TESTVOL1" "1%g $TESTPOOL/$TESTVOL1" \ + "1g% $TESTPOOL/$TESTVOL1" "1g$ $TESTPOOL/$TESTVOL1" \ + "$m $TESTPOOL/$TESTVOL1" "1m$ $TESTPOOL/$TESTVOL1" \ + "1m! $TESTPOOL/$TESTVOL1" \ + "1gbb $TESTPOOL/blah" "1blah $TESTPOOL/blah" "blah $TESTPOOL/blah" \ + "$VOLSIZE $TESTPOOL" "$VOLSIZE $TESTPOOL/" "$VOLSIZE $TESTPOOL//blah"\ + "$VOLSIZE $TESTPOOL/blah@blah" "$VOLSIZE $TESTPOOL/blah^blah" \ + "$VOLSIZE $TESTPOOL/blah*blah" "$VOLSIZE $TESTPOOL/blah%blah" \ + "$VOLSIZE blah" "$VOLSIZE $TESTPOOL/$BYND_MAX_NAME" \ + "1m -b $TESTPOOL/$TESTVOL1" "1m -b 11k $TESTPOOL/$TESTVOL1" \ + "1m -b 511 $TESTPOOL/$TESTVOL1" "1m -b 256k $TESTPOOL/$TESTVOL1" + +set -A options "" "-s" + +datasetexists $TESTPOOL/$TESTVOL || \ + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + +set -A existed_fs $($ZFS list -H | $AWK '{print $1}' | $GREP / ) + +log_mustnot $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL +log_mustnot $ZFS create -s -V $VOLSIZE $TESTPOOL/$TESTVOL + +typeset -i i=0 +typeset -i j=0 +while (( i < ${#options[*]} )); do + + j=0 + while (( j < ${#args[*]} )); do + log_mustnot $ZFS create ${options[$i]} -V ${args[$j]} + log_mustnot $ZFS create -p ${options[$i]} -V ${args[$j]} + + ((j = j + 1)) + done + + j=0 + while (( $j < ${#RW_VOL_PROP[*]} )); do + log_mustnot $ZFS create ${options[$i]} -o ${RW_VOL_PROP[j]} \ + -o ${RW_VOL_PROP[j]} -V $VOLSIZE $TESTPOOL/$TESTVOL1 + log_mustnot $ZFS create -p ${options[$i]} -o ${RW_VOL_PROP[j]} \ + -o ${RW_VOL_PROP[j]} -V $VOLSIZE $TESTPOOL/$TESTVOL1 + ((j = j + 1)) + done + + j=0 + while (( $j < ${#FS_ONLY_PROP[*]} )); do + log_mustnot $ZFS create ${options[$i]} -o ${FS_ONLY_PROP[j]} \ + -V $VOLSIZE $TESTPOOL/$TESTVOL1 + log_mustnot $ZFS create -p ${options[$i]} -o ${FS_ONLY_PROP[j]} \ + -V $VOLSIZE $TESTPOOL/$TESTVOL1 + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "'zfs create [-s][-b ] -V ' fails as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_011_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_011_pos.ksh new file mode 100644 index 00000000000..72487bc51e0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_011_pos.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_011_pos.ksh 1.2 09/01/13 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_011_pos +# +# DESCRIPTION: +# 'zfs create -p' should work as expecteed +# +# STRATEGY: +# 1. To create $newdataset with -p option, first make sure the upper level +# of $newdataset does not exist +# 2. Make sure without -p option, 'zfs create' will fail +# 3. Create $newdataset with -p option, verify it is created +# 4. Run 'zfs create -p $newdataset' again, the exit code should be zero +# even $newdataset exists +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-05) +# +# __stc_assertion_end +# +################################################################################ + +if ! $(check_opt_support "create" "-p") ; then + log_unsupported "'zfs create -p' option is not supported yet." +fi + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1 ; then + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS1 + fi +} + +log_onexit cleanup + +typeset newdataset1="$TESTPOOL/$TESTFS1/$TESTFS/$TESTFS1" +typeset newdataset2="$TESTPOOL/$TESTFS1/$TESTFS/$TESTVOL1" + +log_assert "'zfs create -p' works as expected." + +log_must verify_opt_p_ops "create" "fs" $newdataset1 + +# verify volume creation +if is_global_zone; then + log_must verify_opt_p_ops "create" "vol" $newdataset2 +fi + +log_pass "'zfs create -p' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_012_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_012_pos.ksh new file mode 100644 index 00000000000..85dc9cd393c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_012_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_012_pos.ksh 1.2 09/01/13 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_012_pos +# +# DESCRIPTION: +# 'zfs create -p -o version=1' should only cause the leaf filesystem to be version=1 +# +# STRATEGY: +# 1. Create $newdataset with -p option, verify it is created +# 2. Verify only the leaf filesystem to be version=1, others use the current version +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-08) +# +# __stc_assertion_end +# +################################################################################ + +if ! $(check_opt_support "create" "-p") ; then + log_unsupported "-p option is not supported yet." +fi + +if ! $(check_opt_support "upgrade"); then + log_unsupported "zfs upgrade not supported yet." +fi + +ZFS_VERSION=$($ZFS upgrade | $HEAD -1 | $AWK '{print $NF}' \ + | $SED -e 's/\.//g') + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1 ; then + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS1 + fi +} + +log_onexit cleanup + + +typeset newdataset1="$TESTPOOL/$TESTFS1/$TESTFS/$TESTFS1" + +log_assert "'zfs create -p -o version=1' only cause the leaf filesystem to be version=1." + +log_must $ZFS create -p -o version=1 $newdataset1 +log_must datasetexists $newdataset1 + +log_must check_fs_version $TESTPOOL/$TESTFS1/$TESTFS/$TESTFS1 1 +for fs in $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS ; do + log_must check_fs_version $fs $ZFS_VERSION +done + +log_pass "'zfs create -p -o version=1' only cause the leaf filesystem to be version=1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_013_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_013_pos.ksh new file mode 100644 index 00000000000..fe00580ae64 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_013_pos.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_013_pos.ksh 1.1 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create.cfg + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_013_pos +# +# DESCRIPTION: +# 'zfs create -s -V ' can create various-size sparse volume +# with long fs name +# +# STRATEGY: +# 1. Create a volume in the storage pool. +# 2. Verify the volume is created correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset -i j=0 + while [[ $j -lt ${#size[*]} ]]; do + datasetexists $TESTPOOL/${LONGFSNAME}${size[j]} && \ + log_must $ZFS destroy $TESTPOOL/${LONGFSNAME}${size[j]} + ((j = j + 1)) + done +} + +log_onexit cleanup + + +log_assert "'zfs create -s -V ' succeeds" + +typeset -i j=0 +while (( $j < ${#size[*]} )); do + typeset cmdline="$ZFS create -s -V ${size[j]} \ + $TESTPOOL/${LONGFSNAME}${size[j]}" + + str=$(eval $cmdline 2>&1) + if (( $? == 0 )); then + log_note "SUCCESS: $cmdline" + log_must datasetexists $TESTPOOL/${LONGFSNAME}${size[j]} + elif [[ $str == *${VOL_LIMIT_KEYWORD1}* || \ + $str == *${VOL_LIMIT_KEYWORD2}* || \ + $str == *${VOL_LIMIT_KEYWORD3}* ]] + then + log_note "UNSUPPORTED: $cmdline" + else + log_fail "$cmdline" + fi + + ((j = j + 1)) +done + +log_pass "'zfs create -s -V ' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_common.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_common.kshlib new file mode 100644 index 00000000000..d6b4f4abf79 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_common.kshlib @@ -0,0 +1,56 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +#!/bin/ksh -p +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_common.kshlib 1.3 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Check if the user property is identical to the expected value. +# +# $1 dataset +# $2 property string +# +function propertycheck +{ + typeset dtst=$1 + typeset propstr=$2 + + typeset prop=$($ECHO $propstr | $AWK -F= '{print $1}') + typeset expect_value=$($ECHO $propstr | $AWK -F= '{print $2}') + typeset value=$($ZFS get -H -o value $prop $dtst) + + + if [[ "$expect_value" == "$value" ]]; then + return 0 + else + return 1 + fi +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_test.sh new file mode 100755 index 00000000000..00185dbf4a0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_create/zfs_create_test.sh @@ -0,0 +1,410 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_create_001_pos cleanup +zfs_create_001_pos_head() +{ + atf_set "descr" "'zfs create ' can create a ZFS filesystem in the namespace." + atf_set "require.progs" zfs +} +zfs_create_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_002_pos cleanup +zfs_create_002_pos_head() +{ + atf_set "descr" "'zfs create -s -V ' succeeds" + atf_set "require.progs" zfs +} +zfs_create_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_003_pos cleanup +zfs_create_003_pos_head() +{ + atf_set "descr" "Verify creating volume with specified blocksize works." + atf_set "require.progs" zfs +} +zfs_create_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_004_pos cleanup +zfs_create_004_pos_head() +{ + atf_set "descr" "'zfs create -o property=value filesystem' can successfully createa ZFS filesystem with correct property set." + atf_set "require.progs" zfs +} +zfs_create_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_005_pos cleanup +zfs_create_005_pos_head() +{ + atf_set "descr" "'zfs create -o property=value filesystem' can successfully createa ZFS filesystem with multiple properties set." + atf_set "require.progs" zfs +} +zfs_create_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_006_pos cleanup +zfs_create_006_pos_head() +{ + atf_set "descr" "'zfs create -o property=value -V size volume' can successfullycreate a ZFS volume with correct property set." + atf_set "require.progs" zfs +} +zfs_create_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_007_pos cleanup +zfs_create_007_pos_head() +{ + atf_set "descr" "'zfs create -o property=value -V size volume' can successfullycreate a ZFS volume with correct property set." + atf_set "require.progs" zfs +} +zfs_create_007_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_007_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_008_neg cleanup +zfs_create_008_neg_head() +{ + atf_set "descr" "'zfs create' should return an error with badly-formed parameters." + atf_set "require.progs" zfs +} +zfs_create_008_neg_body() +{ + atf_expect_fail 'kern/221987 - ZFS does not validate the sharenfs parameter' + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_008_neg.ksh || atf_fail "Testcase failed" +} +zfs_create_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_009_neg cleanup +zfs_create_009_neg_head() +{ + atf_set "descr" "Verify 'zfs create ' fails with bad argument." + atf_set "require.progs" zfs +} +zfs_create_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_009_neg.ksh || atf_fail "Testcase failed" +} +zfs_create_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_010_neg cleanup +zfs_create_010_neg_head() +{ + atf_set "descr" "Verify 'zfs create [-s] [-b ] -V ' fails withbadly-formed or arguments." + atf_set "require.progs" zfs +} +zfs_create_010_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_010_neg.ksh || atf_fail "Testcase failed" +} +zfs_create_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_011_pos cleanup +zfs_create_011_pos_head() +{ + atf_set "descr" "'zfs create -p' works as expected." + atf_set "require.progs" zfs +} +zfs_create_011_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_011_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_012_pos cleanup +zfs_create_012_pos_head() +{ + atf_set "descr" "'zfs create -p -o version=1' only cause the leaf filesystem to be version=1." + atf_set "require.progs" zfs +} +zfs_create_012_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_012_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_012_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_013_pos cleanup +zfs_create_013_pos_head() +{ + atf_set "descr" "'zfs create -s -V ' succeeds" + atf_set "require.progs" zfs +} +zfs_create_013_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_013_pos.ksh || atf_fail "Testcase failed" +} +zfs_create_013_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_create_common.kshlib + . $(atf_get_srcdir)/properties.kshlib + . $(atf_get_srcdir)/zfs_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_create_001_pos + atf_add_test_case zfs_create_002_pos + atf_add_test_case zfs_create_003_pos + atf_add_test_case zfs_create_004_pos + atf_add_test_case zfs_create_005_pos + atf_add_test_case zfs_create_006_pos + atf_add_test_case zfs_create_007_pos + atf_add_test_case zfs_create_008_neg + atf_add_test_case zfs_create_009_neg + atf_add_test_case zfs_create_010_neg + atf_add_test_case zfs_create_011_pos + atf_add_test_case zfs_create_012_pos + atf_add_test_case zfs_create_013_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/Makefile new file mode 100644 index 00000000000..dacea20afe1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/Makefile @@ -0,0 +1,25 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_destroy +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_destroy_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_destroy_001_pos.ksh +${PACKAGE}FILES+= zfs_destroy.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_destroy_004_pos.ksh +${PACKAGE}FILES+= zfs_destroy_005_neg.ksh +${PACKAGE}FILES+= zfs_destroy_common.kshlib +${PACKAGE}FILES+= zfs_destroy_002_pos.ksh +${PACKAGE}FILES+= zfs_destroy_007_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_destroy_003_pos.ksh +${PACKAGE}FILES+= zfs_destroy_006_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/cleanup.ksh new file mode 100644 index 00000000000..7ac6c601f88 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +cleanup_testenv + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy.cfg new file mode 100644 index 00000000000..7804b6a016b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy.cfg @@ -0,0 +1,44 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export TESTFSCLONE=${TESTFS}clone +export TESTVOLCLONE=${TESTVOL}clone + +export CTR=$TESTPOOL/$TESTCTR +export FS=$CTR/$TESTFS +export VOL=$CTR/$TESTVOL +export FSSNAP=$FS@$TESTSNAP +export VOLSNAP=$VOL@$TESTSNAP +export FSCLONE=$TESTPOOL/$TESTFSCLONE +export VOLCLONE=$TESTPOOL/$TESTVOLCLONE +export STF_TIMEOUT=3600 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh new file mode 100644 index 00000000000..4f0a9af1ea7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh @@ -0,0 +1,215 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_001_pos.ksh 1.3 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_destroy_001_pos +# +# DESCRIPTION: +# 'zfs destroy -r|-rf|-R|-Rf ' should recursively destroy +# all children and clones based on options. +# +# STRATEGY: +# 1. Create test environment according to options. There are three test +# models can be created. Only ctr, fs & vol; with snap; with clone. +# 2. According to option, make the dataset busy or not. +# 3. Run 'zfs destroy [-rRf] ' +# 4. According to dataset and option, check if get the expected results. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-22) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# +# According to parameters, 1st, create suitable testing environment. 2nd, +# run 'zfs destroy $opt '. 3rd, check the system status. +# +# $1 option of 'zfs destroy' +# $2 dataset will be destroied. +# +function test_n_check +{ + typeset opt=$1 + typeset dtst=$2 + + if ! is_global_zone ; then + if [[ $dtst == $VOL || $dtst == $VOLSNAP ]]; then + log_note "UNSUPPORTED: Volume are unavailable in LZ." + return + fi + fi + + # '-f' has no effect on non-filesystems + if [[ $opt == -f ]]; then + if [[ $dtst != $FS || $dtst != $CTR ]]; then + log_note "UNSUPPORTED: '-f ' is only available for FS." + return + fi + fi + + # Clean the test environment and make it clear. + if datasetexists $CTR; then + log_must $ZFS destroy -Rf $CTR + fi + + # According to option create test compatible environment. + case $opt in + -r|-rf) setup_testenv snap ;; + -R|-Rf) setup_testenv clone ;; + -f) setup_testenv ;; + *) log_fail "Incorrect option: '$opt'." ;; + esac + + # + # According to different dataset type, create busy condition when try to + # destroy this dataset. + # + typeset mpt_dir + case $dtst in + $CTR|$FS) + if [[ $opt == *f* ]]; then + mpt_dir=$(get_prop mountpoint $FS) + make_dir_busy $mpt_dir + log_mustnot $ZFS destroy -rR $dtst + make_dir_unbusy $mpt_dir + fi + ;; + $VOL) + if [[ $opt == *f* ]]; then + make_dir_busy $TESTDIR1 + log_mustnot $ZFS destroy -rR $dtst + make_dir_unbusy $TESTDIR1 + fi + ;; + $FSSNAP) + if [[ $opt == *f* ]]; then + mpt_dir=$(snapshot_mountpoint $dtst) + init_dir=$PWD + make_dir_busy $mpt_dir + log_must $ZFS destroy -rR $dtst + log_must $ZFS snapshot $dtst + make_dir_unbusy $mpt_dir + fi + ;; + $VOLSNAP) + if [[ $opt == *f* ]]; then + mpt_dir=$TESTDIR1 + init_dir=$PWD + make_dir_busy $mpt_dir + log_must $ZFS destroy -rR $dtst + log_must $ZFS snapshot $dtst + make_dir_unbusy $mpt_dir + fi + ;; + *) log_fail "Unsupported dataset: '$dtst'." + esac + + # Firstly, umount ufs filesystem which was created by zfs volume. + if is_global_zone; then + log_must $UMOUNT -f $TESTDIR1 + fi + # Invoke 'zfs destroy [-rRf] ' + log_must $ZFS destroy $opt $dtst + + case $dtst in + $CTR) check_dataset datasetnonexists \ + $CTR $FS $VOL $FSSNAP $VOLSNAP + if [[ $opt == *R* ]]; then + check_dataset datasetnonexists \ + $FSCLONE $VOLCLONE + fi + ;; + $FS) check_dataset datasetexists $CTR $VOL + check_dataset datasetnonexists $FS + if [[ $opt != -f ]]; then + check_dataset datasetexists $VOLSNAP + check_dataset datasetnonexists $FSSNAP + fi + if [[ $opt == *R* ]]; then + check_dataset datasetexists $VOLCLONE + check_dataset datasetnonexists $FSCLONE + fi + ;; + $VOL) check_dataset datasetexists $CTR $FS $FSSNAP + check_dataset datasetnonexists $VOL $VOLSNAP + if [[ $opt == *R* ]]; then + check_dataset datasetexists $FSCLONE + check_dataset datasetnonexists $VOLCLONE + fi + ;; + $FSSNAP) + check_dataset datasetexists $CTR $FS $VOL $VOLSNAP + check_dataset datasetnonexists $FSSNAP + if [[ $opt == *R* ]]; then + check_dataset datasetexists $VOLCLONE + check_dataset datasetnonexists $FSCLONE + fi + ;; + $VOLSNAP) + check_dataset datasetexists $CTR $FS $VOL $FSSNAP + check_dataset datasetnonexists $VOLSNAP + if [[ $opt == *R* ]]; then + check_dataset datasetexists $FSCLONE + check_dataset datasetnonexists $VOLCLONE + fi + ;; + esac + + log_note "'$ZFS destroy $opt $dtst' passed." +} + +log_assert "'zfs destroy -r|-R|-f|-rf|-Rf ' should " \ + "recursively destroy all children." +log_onexit cleanup_testenv + +typeset dtst="" +typeset opt="" +for dtst in $CTR $FS $VOL $FSSNAP $VOLSNAP; do + for opt in "-r" "-R" "-f" "-rf" "-Rf"; do + log_note "Starting test: $ZFS destroy $opt $dtst" + test_n_check $opt $dtst + done +done + +log_pass "'zfs destroy -r|-R|-f|-rf|-Rf ' passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_002_pos.ksh new file mode 100644 index 00000000000..a94f23347db --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_002_pos.ksh @@ -0,0 +1,114 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_002_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_destroy_002_pos +# +# DESCRIPTION: +# 'zfs destroy ' can successfully destroy +# the specified dataset which has no active dependents. +# +# STRATEGY: +# 1. Create a filesystem,volume and snapshot in the storage pool +# 2. Destroy the filesystem,volume and snapshot +# 3. Verify the datasets are destroyed successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset -i i=0 + while (( $i < ${#data_objs[*]} )); do + datasetexists "${data_objs[i]}" && \ + $ZFS destroy -rf ${data_objs[i]} + ((i = i + 1)) + done +} + +log_assert "Verify 'zfs destroy' can destroy the specified datasets without active" \ + "dependents." +log_onexit cleanup + +if is_global_zone ; then + set -A data_objs "$TESTPOOL/$TESTFS@$TESTSNAP" "$TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTVOL1" +else + set -A data_objs "$TESTPOOL/$TESTFS@$TESTSNAP" "$TESTPOOL/$TESTFS1" +fi + +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP + +if is_global_zone ; then + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + + # Max volume size is 1TB on 32-bit systems + [[ `$UNAME -p` == "i386" ]] && \ + BIGVOLSIZE=1Tb + [[ `$UNAME -p` == "arm" ]] && \ + BIGVOLSIZE=1Tb + [[ `$UNAME -p` == "mips" ]] && \ + BIGVOLSIZE=1Tb + [[ `$UNAME -p` == "powerpc" ]] && \ + BIGVOLSIZE=1Tb + log_must $ZFS create -sV $BIGVOLSIZE $TESTPOOL/$TESTVOL1 +fi + +typeset -i i=0 +while (( $i < ${#data_objs[*]} )); do + datasetexists ${data_objs[i]} || \ + log_fail "Create || fail." + ((i = i + 1)) +done + +i=0 +while (( $i < ${#data_objs[*]} )); do + log_must $ZFS destroy ${data_objs[i]} + datasetexists ${data_objs[i]} && \ + log_fail "'zfs destroy ||' fail." + ((i = i + 1)) +done + +log_pass "'zfs destroy ||' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_003_pos.ksh new file mode 100644 index 00000000000..29dec40605b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_003_pos.ksh @@ -0,0 +1,168 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_003_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion__start +# +# ID: zfs_destroy_003_pos +# +# DESCRIPTION: +# Verify 'zfs destroy [-rR]' succeeds as root. +# +# STRATEGY: +# 1. Create two datasets in the storage pool +# 2. Create fs,vol,ctr,snapshot and clones of snapshot in the two datasets +# 3. Create clone in the second dataset for the snapshot in the first dataset +# 4. Verify 'zfs destroy -r' fails to destroy dataset with clone outside it +# 5. Verify 'zfs destroy -R' succeeds to destroy dataset with clone outside it +# 6. Verify 'zfs destroy -r' succeeds to destroy dataset without clone outside it. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-02) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +function cleanup +{ + for obj in $ctr2 $ctr1 $ctr; do + datasetexists $obj && \ + log_must $ZFS destroy -Rf $obj + done + + for mntp in $TESTDIR1 $TESTDIR2; do + [[ -d $mntp ]] && \ + log_must $RM -rf $mntp + done +} + +log_assert "Verify that 'zfs destroy [-rR]' succeeds as root. " + +log_onexit cleanup + +# +# Preparations for testing +# +for dir in $TESTDIR1 $TESTDIR2; do + [[ ! -d $dir ]] && \ + log_must $MKDIR -p $dir +done + +ctr=$TESTPOOL/$TESTCTR +ctr1=$TESTPOOL/$TESTCTR1 +ctr2=$ctr/$TESTCTR2 +ctr3=$ctr1/$TESTCTR2 +child_fs=$ctr/$TESTFS1 +child_fs1=$ctr1/$TESTFS2 +child_fs_mntp=$TESTDIR1 +child_fs1_mntp=$TESTDIR2 +child_vol=$ctr/$TESTVOL +child_vol1=$ctr1/$TESTVOL +child_fs_snap=$child_fs@snap +child_fs1_snap=$child_fs1@snap +child_fs_snap_clone=$ctr/$TESTCLONE +child_fs_snap_clone1=$ctr1/${TESTCLONE}_across_ctr +child_fs_snap_clone2=$ctr2/$TESTCLONE2 +child_fs1_snap_clone=$ctr1/$TESTCLONE1 +child_fs1_snap_clone1=$ctr/${TESTCLONE1}_across_ctr + +# +# Create two datasets in the storage pool +# +log_must $ZFS create $ctr +log_must $ZFS create $ctr1 + +# +# Create children datasets fs,vol,snapshot in the datasets, and +# clones across two datasets +# +log_must $ZFS create $ctr2 + +for fs in $child_fs $child_fs1; do + log_must $ZFS create $fs +done + +log_must $ZFS set mountpoint=$child_fs_mntp $child_fs +log_must $ZFS set mountpoint=$child_fs1_mntp $child_fs1 + +for snap in $child_fs_snap $child_fs1_snap; do + log_must $ZFS snapshot $snap +done + +if is_global_zone ; then + for vol in $child_vol $child_vol1; do + log_must $ZFS create -V $VOLSIZE $vol + done +fi + +for clone in $child_fs_snap_clone $child_fs_snap_clone1; do + log_must $ZFS clone $child_fs_snap $clone +done + + +for clone in $child_fs1_snap_clone $child_fs1_snap_clone1; do + log_must $ZFS clone $child_fs1_snap $clone +done + +log_note "Verify that 'zfs destroy -r' fails to destroy dataset " \ + "with clone dependent outside it." + +for obj in $child_fs $child_fs1 $ctr $ctr1; do + log_mustnot $ZFS destroy -r $obj + datasetexists $obj || \ + log_fail "'zfs destroy -r' fails to keep clone " \ + "dependent outside the hirearchy." +done + + +log_note "Verify that 'zfs destroy -R' succeeds to destroy dataset " \ + "with clone dependent outside it." + +log_must $ZFS destroy -R $ctr1 +datasetexists $ctr1 && \ + log_fail "'zfs destroy -R' fails to destroy dataset with clone outside it." + +log_note "Verify that 'zfs destroy -r' succeeds to destroy dataset " \ + "without clone dependent outside it." + +log_must $ZFS destroy -r $ctr +datasetexists $ctr && \ + log_fail "'zfs destroy -r' fails to destroy dataset with clone outside it." + +log_pass "'zfs destroy [-rR] succeeds as root." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_004_pos.ksh new file mode 100644 index 00000000000..e545220331c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_004_pos.ksh @@ -0,0 +1,132 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_004_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_destroy_004_pos +# +# DESCRIPTION: +# Verify 'zfs destroy -f' succeeds as root. +# +# STRATEGY: +# 1. Create filesystem in the storage pool +# 2. Set mountpoint for the filesystem and make it busy +# 3. Verify that 'zfs destroy' fails to destroy the filesystem +# 4. Verify 'zfs destroy -f' succeeds to destroy the filesystem. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-02) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +function cleanup +{ + cd $olddir + + datasetexists $clone && \ + log_must $ZFS destroy -f $clone + + snapexists $snap && \ + log_must $ZFS destroy -f $snap + + for fs in $fs1 $fs2; do + datasetexists $fs && \ + log_must $ZFS destroy -f $fs + done + + for dir in $TESTDIR1 $TESTDIR2; do + [[ -d $dir ]] && \ + log_must $RM -rf $dir + done +} + +log_assert "Verify that 'zfs destroy -f' succeeds as root. " + +log_onexit cleanup + +# +# Preparations for testing +# +olddir=$PWD + +for dir in $TESTDIR1 $TESTDIR2; do + [[ ! -d $dir ]] && \ + log_must $MKDIR -p $dir +done + +fs1=$TESTPOOL/$TESTFS1 +mntp1=$TESTDIR1 +fs2=$TESTPOOL/$TESTFS2 +snap=$TESTPOOL/$TESTFS2@snap +clone=$TESTPOOL/$TESTCLONE +mntp2=$TESTDIR2 + +# +# Create filesystem and clone in the storage pool, mount them and +# make the mountpoint busy +# +for fs in $fs1 $fs2; do + log_must $ZFS create $fs +done + +log_must $ZFS snapshot $snap +log_must $ZFS clone $snap $clone + +log_must $ZFS set mountpoint=$mntp1 $fs1 +log_must $ZFS set mountpoint=$mntp2 $clone + +for arg in "$fs1 $mntp1" "$clone $mntp2"; do + fs=`$ECHO $arg | $AWK '{print $1}'` + mntp=`$ECHO $arg | $AWK '{print $2}'` + + log_note "Verify that 'zfs destroy' fails to" \ + "destroy filesystem when it is busy." + cd $mntp + log_mustnot $ZFS destroy $fs + + log_must $ZFS destroy -f $fs + datasetexists $fs && \ + log_fail "'zfs destroy -f' fails to destroy busy filesystem." + + cd $olddir +done + +log_pass "'zfs destroy -f' succeeds as root." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_005_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_005_neg.ksh new file mode 100644 index 00000000000..eeebb072bbb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_005_neg.ksh @@ -0,0 +1,197 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_005_neg.ksh 1.3 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_destroy_005_neg +# +# DESCRIPTION: +# Separately verify 'zfs destroy -f|-r|-rf|-R|-rR ' will fail in +# different conditions. +# +# STRATEGY: +# 1. Create pool, fs & vol. +# 2. Create snapshot for fs & vol. +# 3. Invoke 'zfs destroy ''|-f ', it should fail. +# 4. Create clone for fs & vol. +# 5. Invoke 'zfs destroy -r|-rf ', it should fail. +# 6. Write file to filesystem or enter snapshot mountpoint. +# 7. Invoke 'zfs destroy -R|-rR ', it should fail. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-03) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Separately verify 'zfs destroy -f|-r|-rf|-R|-rR ' will " \ + "fail in different conditions." +log_onexit cleanup_testenv + +# +# Run 'zfs destroy [-rRf] ', make sure it fail. +# +# $1 the collection of options +# $2 the collection of datasets +# +function negative_test +{ + typeset options=$1 + typeset datasets=$2 + + for dtst in $datasets; do + if ! is_global_zone; then + if [[ $dtst == $VOL || $dtst == $VOLSNAP || \ + $dtst == $VOLCLONE ]] + then + log_note "UNSUPPORTED: " \ + "Volume is unavailable in LZ." + continue + fi + fi + for opt in $options; do + log_mustnot $ZFS destroy $opt $dtst + done + done +} + +# This filesystem is created by setup.ksh, and conflicts with the filesystems +# created from within this file +$ZFS destroy -f $TESTPOOL/$TESTFS + +# +# Create snapshots for filesystem and volume, +# and verify 'zfs destroy' failed without '-r' or '-R'. +# +setup_testenv snap +negative_test "-f" "$CTR $FS $VOL" + +# +# Create clones for filesystem and volume, +# and verify 'zfs destroy' failed without '-R'. +# +setup_testenv clone +negative_test "-r -rf" "$CTR $FS $VOL" + +# +# Get $FS mountpoint and make it busy, then verify 'zfs destroy $CTR' +# failed without '-f'. +# +# Then verify the datasets are expected existed or non-existed. +# +typeset mtpt_dir=$(get_prop mountpoint $FS) +make_dir_busy $mtpt_dir +negative_test "-R -rR" $CTR +check_dataset datasetexists $CTR $FS $VOL $VOLSNAP $VOLCLONE +log_must datasetnonexists $FSSNAP $FSCLONE + +# +# Create the clones for test environment, then verify 'zfs destroy $FS' +# failed without '-f'. +# +# Then verify the datasets are expected existed or non-existed. +# +setup_testenv clone +negative_test "-R -rR" $FS +check_dataset datasetexists $CTR $FS $VOL $VOLSNAP $VOLCLONE +log_must datasetnonexists $FSSNAP $FSCLONE + +make_dir_unbusy $mtpt_dir + +if is_global_zone; then + # + # Create the clones for test environment and make the volume busy. + # Then verify 'zfs destroy $CTR' failed without '-f'. + # + # Then verify the datasets are expected existed or non-existed. + # + setup_testenv clone + make_dir_busy $TESTDIR1 + negative_test "-R -rR" $CTR + log_must datasetexists $CTR $VOL + log_must datasetnonexists $FS $FSSNAP $FSCLONE $VOLSNAP $VOLCLONE + + # + # Create the clones for test environment and make the volume busy. + # Then verify 'zfs destroy $VOL' failed without '-f'. + # + # Then verify the datasets are expected existed or non-existed. + # + setup_testenv clone + negative_test "-R -rR" $VOL + log_must datasetexists $CTR $VOL $FS $FSSNAP $FSCLONE + log_must datasetnonexists $VOLSNAP $VOLCLONE + + make_dir_unbusy $TESTDIR1 +fi + +# +# Create the clones for test environment and make the snapshot busy. +# Then verify 'zfs destroy $snap' failed without '-f'. +# +# Then verify the datasets are expected existed or non-existed. +# +snaplist="$FSSNAP" + +setup_testenv clone +for snap in $snaplist; do + for option in -R -rR ; do + mtpt_dir=$(snapshot_mountpoint $snap) + (( $? != 0 )) && \ + log_fail "get mountpoint $snap failed." + + init_dir=$PWD + log_must cd $mtpt_dir + + log_must $ZFS destroy $option $snap + check_dataset datasetexists $CTR $FS $VOL + if [[ $snap == $FSSNAP ]]; then + log_must datasetnonexists $snap $FSCLONE + else + log_must datasetnonexists $snap $VOLCLONE + fi + setup_testenv clone + done +done + +cmds="zfs destroy -f|-r|-rf|-R|-rR " +log_pass "'$cmds' must fail in certain conditions." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_006_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_006_neg.ksh new file mode 100644 index 00000000000..58711c2f2a3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_006_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_006_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_destroy_006_neg +# +# DESCRIPTION: +# 'zfs destroy' should return an error with badly formed parameters, +# including null destroyed object parameter, invalid options excluding +# '-r' and '-f', non-existent datasets. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zfs destroy' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A args "" "-r" "-f" "-rf" "-fr" "$TESTPOOL" "-f $TESTPOOL" \ + "-? $TESTPOOL/$TESTFS" "$TESTPOOL/blah"\ + "-r $TESTPOOL/blah" "-f $TESTPOOL/blah" "-rf $TESTPOOL/blah" \ + "-fr $TESTPOOL/blah" "-$ $TESTPOOL/$TESTFS" "-5 $TESTPOOL/$TESTFS" \ + "-rfgh $TESTPOOL/$TESTFS" "-rghf $TESTPOOL/$TESTFS" \ + "$TESTPOOL/$TESTFS@blah" "/$TESTPOOL/$TESTFS" "-f /$TESTPOOL/$TESTFS" \ + "-rf /$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS $TESTPOOL/$TESTFS" \ + "-rRf $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS" + +log_assert "'zfs destroy' should return an error with badly-formed parameters." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZFS destroy ${args[i]} + ((i = i + 1)) +done + +log_pass "'zfs destroy' badly formed parameters fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_007_neg.ksh new file mode 100644 index 00000000000..8a07303f8b6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_007_neg.ksh @@ -0,0 +1,86 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_007_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_destroy_007_neg +# +# DESCRIPTION: +# 'zpool destroy' failed if this filesystem is namespace-parent +# of origin. +# +# STRATEGY: +# 1. Create pool, fs and snapshot. +# 2. Create a namespace-parent of origin clone. +# 3. Promote this clone +# 4. Verify the original fs can not be destroyed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $clonesnap; then + log_must $ZFS promote $fs + fi + datasetexists $clone && log_must $ZFS destroy $clone + datasetexists $fssnap && log_must $ZFS destroy $fssnap +} + +log_assert "Destroy dataset which is namespace-parent of origin should failed." +log_onexit cleanup + +# Define variable $fssnap & and namespace-parent of origin clone. +fs=$TESTPOOL/$TESTFS +fssnap=$fs@snap +clone=$fs/clone +clonesnap=$fs/clone@snap + +log_must $ZFS snapshot $fssnap +log_must $ZFS clone $fssnap $clone +log_must $ZFS promote $clone +log_mustnot $ZFS destroy $fs +log_mustnot $ZFS destroy $clone + +log_pass "Destroy dataset which is namespace-parent of origin passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_common.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_common.kshlib new file mode 100644 index 00000000000..61b89d759ef --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_common.kshlib @@ -0,0 +1,173 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_common.kshlib 1.3 07/03/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Create or recover a set of test environment which include ctr, vol, fs, +# snap & clone. It looks like the following. +# +# pool +# |ctr +# | |fs +# | | |fssnap +# | |vol +# | |volsnap +# |fsclone +# |volclone +# +# $1 indicate which dependent dataset need be created. Such as 'snap', 'clone'. +# +function setup_testenv #[dtst] +{ + typeset dtst=$1 + + if ! datasetexists $CTR; then + log_must $ZFS create $CTR + fi + if ! datasetexists $FS; then + log_must $ZFS create $FS + fi + # Volume test is only availible on globle zone + if ! datasetexists $VOL && is_global_zone; then + log_must $ZFS create -V $VOLSIZE $VOL + log_must $NEWFS /dev/zvol/$VOL + + if [[ ! -d $TESTDIR1 ]]; then + log_must $MKDIR $TESTDIR1 + fi + log_must $MOUNT /dev/zvol/$VOL $TESTDIR1 + fi + + if [[ $dtst == snap || $dtst == clone ]]; then + if ! datasetexists $FSSNAP; then + log_must $ZFS snapshot $FSSNAP + fi + if ! datasetexists $VOLSNAP && is_global_zone; then + log_must $ZFS snapshot $VOLSNAP + fi + fi + + if [[ $dtst == clone ]]; then + if ! datasetexists $FSCLONE; then + log_must $ZFS clone $FSSNAP $FSCLONE + fi + if ! datasetexists $VOLCLONE && is_global_zone; then + log_must $ZFS clone $VOLSNAP $VOLCLONE + fi + fi +} + +function make_dir_busy +{ + typeset dir=$1 + typeset dirfiltered=$(echo $dir | sed -Ee 's,[/\.],_,g') + + OLDPWD=$(pwd) + cd $dir + # Sleep for long enough for the test to have run through. Note that + # even if the test itself changes directory, sleep will still be on it. + $SLEEP $STF_TIMEOUT & + eval SLEEP_PID_${dirfiltered}=$! + pid=$(eval echo \$SLEEP_PID_${dirfiltered}) + cd ${OLDPWD} + log_note "Sleeping while on ${dir} in pid $pid" +} + +function make_dir_unbusy +{ + typeset dir=$1 + typeset dirfiltered=$(echo $dir | sed -Ee 's,[/\.],_,g') + typeset pid=$(eval echo \$SLEEP_PID_${dirfiltered}) + + # Safeguard in case this is used incorrectly. + [[ -z "$pid" ]] && log_fail "make_dir_unbusy called without busy?" + $KILL -15 $pid + eval SLEEP_PID_${dirfiltered}="" + log_note "Unbusied ${dir}" +} + +# Clean up the testing environment +# +function cleanup_testenv +{ + if [[ $STF_EXITCODE -eq $STF_FAIL ]]; then + $ECHO "Testcase failed; dataset listing follows:" + $ZFS list -t all -r $TESTPOOL + fi + if (( ${#init_dir} != 0 )); then + cd $init_dir + init_dir="" + fi + if is_global_zone && ismounted "$TESTDIR1" "ufs" ; then + log_must $UMOUNT -f $TESTDIR1 + fi + if [[ -d $TESTDIR1 ]]; then + log_must $RM -rf $TESTDIR1 + fi + + [[ -n "$SLEEP_PID" ]] && $KILL -15 $SLEEP_PID + + if datasetexists $CTR; then + log_must $ZFS destroy -Rf $CTR + fi +} + +# +# Delete volume and related datasets from list, if the test cases was +# runing in local zone. Then check them are existed or non-exists. +# +# $1 function name +# $2-n datasets name +# +function check_dataset +{ + typeset funname=$1 + typeset newlist="" + typeset dtst + shift + + for dtst in "$@"; do + # Volume and related stuff are unvailable in local zone + if ! is_global_zone; then + if [[ $dtst == $VOL || $dtst == $VOLSNAP || \ + $dtst == $VOLCLONE ]] + then + continue + fi + fi + newlist="$newlist $dtst" + done + + if (( ${#newlist} != 0 )); then + log_must eval "$funname $newlist" + fi +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_test.sh new file mode 100755 index 00000000000..4faa2202e93 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_destroy/zfs_destroy_test.sh @@ -0,0 +1,228 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_destroy_001_pos cleanup +zfs_destroy_001_pos_head() +{ + atf_set "descr" "'zfs destroy -r|-R|-f|-rf|-Rf ' shouldrecursively destroy all children." + atf_set "require.progs" zfs + atf_set "timeout" 3600 +} +zfs_destroy_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_destroy_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_destroy_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_destroy_002_pos cleanup +zfs_destroy_002_pos_head() +{ + atf_set "descr" "Verify 'zfs destroy' can destroy the specified datasets without activedependents." + atf_set "require.progs" zfs + atf_set "timeout" 3600 +} +zfs_destroy_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_destroy_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_destroy_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_destroy_003_pos cleanup +zfs_destroy_003_pos_head() +{ + atf_set "descr" "Verify that 'zfs destroy [-rR]' succeeds as root." + atf_set "require.progs" zfs + atf_set "timeout" 3600 +} +zfs_destroy_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_destroy_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_destroy_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_destroy_004_pos cleanup +zfs_destroy_004_pos_head() +{ + atf_set "descr" "Verify that 'zfs destroy -f' succeeds as root." + atf_set "require.progs" zfs + atf_set "timeout" 3600 +} +zfs_destroy_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_destroy_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_destroy_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_destroy_005_neg cleanup +zfs_destroy_005_neg_head() +{ + atf_set "descr" "Separately verify 'zfs destroy -f|-r|-rf|-R|-rR ' willfail in different conditions." + atf_set "require.progs" zfs + atf_set "timeout" 3600 +} +zfs_destroy_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_destroy_005_neg.ksh || atf_fail "Testcase failed" +} +zfs_destroy_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_destroy_006_neg cleanup +zfs_destroy_006_neg_head() +{ + atf_set "descr" "'zfs destroy' should return an error with badly-formed parameters." + atf_set "require.progs" zfs + atf_set "timeout" 3600 +} +zfs_destroy_006_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_destroy_006_neg.ksh || atf_fail "Testcase failed" +} +zfs_destroy_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_destroy_007_neg cleanup +zfs_destroy_007_neg_head() +{ + atf_set "descr" "Destroy dataset which is namespace-parent of origin should failed." + atf_set "require.progs" zfs + atf_set "timeout" 3600 +} +zfs_destroy_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_destroy_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_destroy_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_destroy_common.kshlib + . $(atf_get_srcdir)/zfs_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_destroy_001_pos + atf_add_test_case zfs_destroy_002_pos + atf_add_test_case zfs_destroy_003_pos + atf_add_test_case zfs_destroy_004_pos + atf_add_test_case zfs_destroy_005_neg + atf_add_test_case zfs_destroy_006_neg + atf_add_test_case zfs_destroy_007_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/Makefile new file mode 100644 index 00000000000..d86ef8c35e9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE= tests + +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_diff +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_diff_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_diff_001_pos.ksh +${PACKAGE}FILES+= zfs_diff.cfg +${PACKAGE}FILES+= zfs_diff_001_pos.golden + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/cleanup.ksh new file mode 100644 index 00000000000..d1bd2b24498 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/cleanup.ksh @@ -0,0 +1,33 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/setup.ksh new file mode 100644 index 00000000000..de7b04fc538 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/setup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff.cfg new file mode 100644 index 00000000000..01224df0ca2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff.cfg @@ -0,0 +1,30 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_001_pos.golden b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_001_pos.golden new file mode 100644 index 00000000000..dffc9b67d68 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_001_pos.golden @@ -0,0 +1,13 @@ ++ /testdir1526/dirs/create ++ /testdir1526/files/create +- /testdir1526/dirs/delete +- /testdir1526/files/delete +M /testdir1526/dirs +M /testdir1526/dirs/modify +M /testdir1526/files +M /testdir1526/files/dstdir +M /testdir1526/files/modify +M /testdir1526/files/srcdir +R /testdir1526/dirs/rename -> /testdir1526/dirs/rename.new +R /testdir1526/files/rename -> /testdir1526/files/rename.new +R /testdir1526/files/srcdir/move -> /testdir1526/files/dstdir/move diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_001_pos.ksh new file mode 100644 index 00000000000..9de8beff18a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_001_pos.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +verify_runnable "both" + +log_assert "'zfs diff' output for typical operations" + +# First create a bunch of files and directories + +#log_must ${CD} $TESTDIR +log_must ${MKDIR} ${TESTDIR}/dirs +log_must ${MKDIR} ${TESTDIR}/dirs/leavealone +log_must ${MKDIR} ${TESTDIR}/dirs/modify +log_must ${MKDIR} ${TESTDIR}/dirs/rename +log_must ${MKDIR} ${TESTDIR}/dirs/delete +log_must ${MKDIR} ${TESTDIR}/files +log_must ${TOUCH} ${TESTDIR}/files/leavealone +log_must ${TOUCH} ${TESTDIR}/files/modify +log_must ${TOUCH} ${TESTDIR}/files/rename +log_must ${TOUCH} ${TESTDIR}/files/delete +log_must ${MKDIR} ${TESTDIR}/files/srcdir +log_must ${MKDIR} ${TESTDIR}/files/dstdir +log_must ${TOUCH} ${TESTDIR}/files/srcdir/move + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@1 + +# Now modify them in different ways +log_must ${TOUCH} ${TESTDIR}/dirs/modify +log_must ${MV} ${TESTDIR}/dirs/rename ${TESTDIR}/dirs/rename.new +log_must ${RMDIR} ${TESTDIR}/dirs/delete +log_must ${MKDIR} ${TESTDIR}/dirs/create +log_must ${DATE} >> ${TESTDIR}/files/modify +log_must ${MV} ${TESTDIR}/files/rename ${TESTDIR}/files/rename.new +log_must ${RM} ${TESTDIR}/files/delete +log_must ${MV} ${TESTDIR}/files/srcdir/move ${TESTDIR}/files/dstdir/move +log_must ${TOUCH} ${TESTDIR}/files/create + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@2 + +# "zfs diff"'s output order is unspecified, so we must sort it. The golden +# file is already sorted. +LC_ALL=C $ZFS diff $TESTPOOL/$TESTFS@1 $TESTPOOL/$TESTFS@2 | ${SORT} > $TESTDIR/zfs_diff_output.txt +if [ $? -ne 0 ]; then + log_fail "zfs diff failed" +fi + +# Finally, compare output to the golden output +log_must diff $STF_SUITE/tests/cli_root/zfs_diff/zfs_diff_001_pos.golden $TESTDIR/zfs_diff_output.txt + +log_pass "'zfs diff' gave the expected output" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_test.sh new file mode 100755 index 00000000000..a69da905a3d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_diff/zfs_diff_test.sh @@ -0,0 +1,56 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_diff_001_pos cleanup +zfs_diff_001_pos_head() +{ + atf_set "descr" "zfs diff output for typical operations" + atf_set "require.progs" zfs +} +zfs_diff_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_diff.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_diff_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_diff_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_diff.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_init_test_cases() +{ + + atf_add_test_case zfs_diff_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/Makefile new file mode 100644 index 00000000000..5801f1d21ac --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/Makefile @@ -0,0 +1,29 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_get +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_get_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_get_002_pos.ksh +${PACKAGE}FILES+= zfs_get_007_neg.ksh +${PACKAGE}FILES+= zfs_get_003_pos.ksh +${PACKAGE}FILES+= zfs_get_list_d.kshlib +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_get_006_neg.ksh +${PACKAGE}FILES+= zfs_get_009_pos.ksh +${PACKAGE}FILES+= zfs_get_001_pos.ksh +${PACKAGE}FILES+= zfs_get_010_neg.ksh +${PACKAGE}FILES+= zfs_get.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_get_004_pos.ksh +${PACKAGE}FILES+= zfs_get_008_pos.ksh +${PACKAGE}FILES+= zfs_get_common.kshlib +${PACKAGE}FILES+= zfs_get_005_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/setup.ksh new file mode 100644 index 00000000000..095cbfb1a7a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_container_volume_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get.cfg new file mode 100644 index 00000000000..df1a2752396 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get.cfg @@ -0,0 +1,34 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export TESTSNAP=testsnap${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_001_pos.ksh new file mode 100644 index 00000000000..5e0789f386f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_001_pos.ksh @@ -0,0 +1,160 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_001_pos.ksh 1.6 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_get_001_pos +# +# DESCRIPTION: +# Setting the valid option and properties, 'zfs get' should return the +# correct property value. +# +# STRATEGY: +# 1. Create pool, filesystem, volume and snapshot. +# 2. Setting valid parameter, 'zfs get' should succeed. +# 3. Compare the output property name with the original input property. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A options "" "-p" "-r" "-H" +if zfs_get_list_d_supported ; then + typeset -i i=${#options[*]} + typeset -i j=0 + while (( j<${#depth_options[*]} )); + do + options[$i]=-"${depth_options[$j]}" + (( j+=1 )) + (( i+=1 )) + done +fi + +set -A zfs_props type used available creation volsize referenced \ + compressratio mounted origin recordsize quota reservation mountpoint \ + sharenfs checksum compression atime devices exec readonly setuid \ + snapdir aclmode aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots + + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + set -A zfs_props ${zfs_props[*]} version +fi + +if is_userquota_supported; then + set -A userquota_props userquota@root groupquota@root \ + userused@root groupused@root +fi + +set -A all_props -- "${zfs_props[@]}" "${userquota_props[@]}" + +set -A dataset $TESTPOOL/$TESTCTR $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTVOL@$TESTSNAP + +# +# According to dataset and option, checking if 'zfs get' return correct +# property information. +# +# $1 dataset +# $2 properties which are expected to output into $TESTDIR/$TESTFILE0 +# $3 option +# +function check_return_value +{ + typeset dst=$1 + typeset props=$2 + typeset opt=$3 + typeset -i found=0 + typeset p + + for p in $props; do + found=0 + + while read line; do + typeset item + item=$($ECHO $line | $AWK '{print $2}' 2>&1) + + if [[ $item == $p ]]; then + (( found += 1 )) + break + fi + done < $TESTDIR/$TESTFILE0 + + if (( found == 0 )); then + log_fail "'zfs get $opt $props $dst' return " \ + "error message.'$p' haven't been found." + fi + done + + log_note "SUCCESS: '$ZFS get $opt $prop $dst'." +} + +log_assert "Setting the valid options and properties 'zfs get' should return " \ + "the correct property value." +log_onexit cleanup + +# Create filesystem and volume's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +typeset -i i=0 +while (( i < ${#dataset[@]} )); do + for opt in "${options[@]}"; do + for prop in ${all_props[@]}; do + eval "$ZFS get $opt $prop ${dataset[i]} > \ + $TESTDIR/$TESTFILE0" + ret=$? + if [[ $ret != 0 ]]; then + log_fail "$ZFS get returned: $ret" + fi + check_return_value ${dataset[i]} "$prop" "$opt" + done + done + (( i += 1 )) +done + +log_pass "Setting the valid options to dataset, it should succeed and return " \ + "valid value. 'zfs get' pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_002_pos.ksh new file mode 100644 index 00000000000..cb765ecdabe --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_002_pos.ksh @@ -0,0 +1,116 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_002_pos.ksh 1.6 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_get_002_pos +# +# DESCRIPTION: +# Setting the valid option and properties 'zfs get' return correct value. +# It should be successful. +# +# STRATEGY: +# 1. Create pool, filesystem, dataset, volume and snapshot. +# 2. Getting the options and properties random combination. +# 3. Using the combination as the parameters of 'zfs get' to check the +# command line return value. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A options " " p r H + +set -A zfs_props type used available creation volsize referenced compressratio \ + mounted origin recordsize quota reservation mountpoint sharenfs \ + checksum compression atime devices exec readonly setuid snapdir \ + aclmode aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots + + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + set -A zfs_props ${zfs_props[*]} version +fi + +if is_userquota_supported; then + set -A userquota_props userquota@root groupquota@root \ + userused@root groupused@root +fi + +set -A props -- "${zfs_props[@]}" "${userquota_props[@]}" + +set -A dataset $TESTPOOL/$TESTCTR $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTVOL@$TESTSNAP + +log_assert "Setting the valid options and properties 'zfs get' return correct "\ + "value. It should be successful." +log_onexit cleanup + +# Create volume and filesystem's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +# +# Begin to test 'get [-prH] +# ' +# 'get [-prH] <-a|-d> " +# +typeset -i opt_numb=8 +typeset -i prop_numb=20 +for dst in ${dataset[@]}; do + # option can be empty, so "" is necessary. + for opt in "" $(gen_option_str "${options[*]}" "-" "" $opt_numb); do + for prop in $(gen_option_str "${props[*]}" "" "," $prop_numb) + do + $ZFS get $opt $prop $dst > /dev/null 2>&1 + ret=$? + if [[ $ret != 0 ]]; then + log_fail "$ZFS get $opt $prop $dst (Code: $ret)" + fi + done + done +done + +log_pass "Setting the valid options to dataset, 'zfs get' pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_003_pos.ksh new file mode 100644 index 00000000000..f43ea75b85e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_003_pos.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_003_pos.ksh 1.3 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_get_003_pos +# +# DESCRIPTION: +# 'zfs get' should get consistent report with different options. +# +# STRATEGY: +# 1. Create pool and filesystem. +# 2. 'zfs mount -o update,noatime .' +# 3. Verify the value of 'zfs get atime' and 'zfs get all | grep atime' +# are identical. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS mount -o update,atime $TESTPOOL/$TESTFS +} + +log_assert "'zfs get' should get consistent report with different option." +log_onexit cleanup + +log_must $ZFS set atime=on $TESTPOOL/$TESTFS +log_must $ZFS mount -o update,noatime $TESTPOOL/$TESTFS + +value1=$($ZFS get -H atime $TESTPOOL/$TESTFS | $AWK '{print $3}') +value2=$($ZFS get -H all $TESTPOOL/$TESTFS | $AWK '{print $2 " " $3}' | \ + $GREP ^atime | $AWK '{print $2}') +if [[ $value1 != $value2 ]]; then + log_fail "value1($value1) != value2($value2)" +fi + +log_pass "'zfs get' get consistent report with different option passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_004_pos.ksh new file mode 100644 index 00000000000..8d1e67ca144 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_004_pos.ksh @@ -0,0 +1,246 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_004_pos.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_get_004_pos +# +# DESCRIPTION: +# Verify 'zfs get all' can get all properties for all datasets in the system +# +# STRATEGY: +# 1. Create datasets for testing +# 2. Issue 'zfs get all' command +# 3. Verify the command gets all available properties of all datasets +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +#check 'zfs get all' supportability with the installed OS version +$ZFS get all >/dev/null 2>&1 +(( $? != 0 )) && log_unsupported "ZFS get all option is unsupported." + + +function cleanup +{ + [[ -e $propfile ]] && $RM -f $propfile + + datasetexists $clone && \ + log_must $ZFS destroy $clone + for snap in $fssnap $volsnap ; do + snapexists $snap && \ + log_must $ZFS destroy $snap + done + + if [[ -n $globalzone ]] ; then + for pool in $TESTPOOL1 $TESTPOOL2 $TESTPOOL3; do + poolexists $pool && \ + log_must $ZPOOL destroy -f $pool + done + for file in `$LS $TESTDIR1/poolfile*`; do + $RM -f $file + done + else + for fs in $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS2 $TESTPOOL/$TESTFS3; do + datasetexists $fs && \ + log_must $ZFS destroy -rf $fs + done + fi +} + +log_assert "Verify the functions of 'zfs get all' work." +log_onexit cleanup + +typeset globalzone="" + +if is_global_zone ; then + globalzone="true" +fi + +set -A opts "" "-r" "-H" "-p" "-rHp" "-o name" \ + "-s local,default,temporary,inherited,none" \ + "-o name -s local,default,temporary,inherited,none" \ + "-rHp -o name -s local,default,temporary,inherited,none" +set -A usrprops "a:b=c" "d_1:1_e=0f" "123:456=789" + +fs=$TESTPOOL/$TESTFS +fssnap=$fs@$TESTSNAP +clone=$TESTPOOL/$TESTCLONE +volsnap=$TESTPOOL/$TESTVOL@$TESTSNAP + +#set user defined properties for $TESTPOOL +for usrprop in ${usrprops[@]}; do + log_must $ZFS set $usrprop $TESTPOOL +done +# create snapshot and clone in $TESTPOOL +log_must $ZFS snapshot $fssnap +log_must $ZFS clone $fssnap $clone +log_must $ZFS snapshot $volsnap + +# collect datasets which can be set user defined properties +usrpropds="$clone $fs" + +# collect all datasets which we are creating +allds="$fs $clone $fssnap $volsnap" + +#create pool and datasets to guarantee testing under multiple pools and datasets. +file=$TESTDIR1/poolfile +typeset -i FILESIZE=104857600 #100M +(( DFILESIZE = FILESIZE * 2 )) # double of FILESIZE +typeset -i VOLSIZE=10485760 #10M +availspace=$(get_prop available $TESTPOOL) +typeset -i i=0 + +# make sure 'availspace' is larger then twice of FILESIZE to create a new pool. +# If any, we only totally create 3 pools for multple datasets testing to limit +# testing time +while (( availspace > DFILESIZE )) && (( i < 3 )) ; do + (( i += 1 )) + + if [[ -n $globalzone ]] ; then + log_must create_vdevs ${file}$i + eval pool=\$TESTPOOL$i + log_must $ZPOOL create $pool ${file}$i + else + eval pool=$TESTPOOL/\$TESTFS$i + log_must $ZFS create $pool + fi + + #set user defined properties for testing + for usrprop in ${usrprops[@]}; do + log_must $ZFS set $usrprop $pool + done + + #create datasets in pool + log_must $ZFS create $pool/$TESTFS + log_must $ZFS snapshot $pool/$TESTFS@$TESTSNAP + log_must $ZFS clone $pool/$TESTFS@$TESTSNAP $pool/$TESTCLONE + + if [[ -n $globalzone ]] ; then + log_must $ZFS create -V $VOLSIZE $pool/$TESTVOL + else + log_must $ZFS create $pool/$TESTVOL + fi + + ds=`$ZFS list -H -r -o name -t filesystem,volume $pool` + usrpropds="$usrpropds $pool/$TESTFS $pool/$TESTCLONE $pool/$TESTVOL" + allds="$allds $pool/$TESTFS $pool/$TESTCLONE $pool/$TESTVOL \ + $pool/$TESTFS@$TESTSNAP" + + availspace=$(get_prop available $TESTPOOL) +done + +#the expected number of property for each type of dataset in this testing +typeset -i fspropnum=27 +typeset -i snappropnum=8 +typeset -i volpropnum=15 +propfile=$TMPDIR/allpropfile.${TESTCASE_ID} + +typeset -i i=0 +typeset -i propnum=0 +typeset -i failflag=0 +while (( i < ${#opts[*]} )); do + [[ -e $propfile ]] && $RM -f $propfile + log_must eval "$ZFS get ${opts[i]} all >$propfile" + + for ds in $allds; do + $GREP $ds $propfile >/dev/null 2>&1 + (( $? != 0 )) && \ + log_fail "There is no property for" \ + "dataset $ds in 'get all' output." + + propnum=`$CAT $propfile | $AWK '{print $1}' | \ + $GREP "${ds}$" | $WC -l` + ds_type=`$ZFS get -H -o value type $ds` + case $ds_type in + filesystem ) + (( propnum < fspropnum )) && \ + (( failflag += 1 )) + ;; + snapshot ) + (( propnum < snappropnum )) && \ + (( failflag += 1 )) + ;; + volume ) + (( propnum < volpropnum )) && \ + (( failflag += 1 )) + ;; + esac + + (( failflag != 0 )) && \ + log_fail " 'zfs get all' fails to get out " \ + "all properties for dataset $ds." + + (( propnum = 0 )) + (( failflag = 0 )) + done + + (( i += 1 )) +done + +log_note "'zfs get' can get particular property for all datasets with that property." + +function do_particular_prop_test # +{ + typeset props="$1" + typeset ds="$2" + + for prop in ${commprops[*]}; do + ds=`$ZFS get -H -o name $prop` + + [[ "$ds" != "$allds" ]] && \ + log_fail "The result datasets are $ds, but all suitable" \ + "datasets are $allds for the property $prop" + done +} + +# Here, we do a testing for user defined properties and the most common properties +# for all datasets. +commprop="type creation used referenced compressratio" +usrprop="a:b d_1:1_e 123:456" + +do_particular_prop_test "$commprop" "$allds" +do_particular_prop_test "$usrprop" "$usrpropds" + +log_pass "'zfs get all' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_005_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_005_neg.ksh new file mode 100644 index 00000000000..ec445ec290a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_005_neg.ksh @@ -0,0 +1,140 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_005_neg.ksh 1.5 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_get_005_neg +# +# DESCRIPTION: +# Setting the invalid option and properties, 'zfs get' should failed. +# +# STRATEGY: +# 1. Create pool, filesystem, volume and snapshot. +# 2. Getting incorrect combination by invalid parameters +# 3. Using the combination as the parameters of 'zfs get' to check the +# command line return value. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A val_opts p r H +set -A v_props type used available creation volsize referenced compressratio mounted \ + origin recordsize quota reservation mountpoint sharenfs checksum \ + compression atime devices exec readonly setuid zoned snapdir aclmode \ + aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + set -A v_props ${v_props[*]} version +fi + +if is_userquota_supported; then + set -A userquota_props userquota@root groupquota@root \ + userused@root groupused@root +fi + +set -A val_pros -- "${v_props[@]}" "${userquota_props[@]}" + +set -f # Force shell does not parse '?' and '*' as the wildcard +set -A inval_opts P R h ? * +set -A inval_props Type 0 ? * -on --on readonl time USED RATIO MOUNTED + +set -A dataset $TESTPOOL/$TESTFS $TESTPOOL/$TESTCTR $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTVOL@$TESTSNAP + +typeset -i opt_numb=6 +typeset -i prop_numb=12 + +val_opts_str=$(gen_option_str "${val_opts[*]}" "-" "" $opt_numb) +val_props_str=$(gen_option_str "${val_props[*]}" "" "," $prop_numb) +val_props_str="$val_props_str -a -d" + +inval_opts_str=$(gen_option_str "${inval_opts[*]}" "-" "" $opt_numb) +inval_props_str=$(gen_option_str "${inval_props[*]}" "" "," $prop_numb) + +# +# Test different options and properties combination. +# +# $1 options +# $2 properties +# +function test_options +{ + typeset opts=$1 + typeset props=$2 + + for dst in ${dataset[@]}; do + for opt in $opts; do + for prop in $props; do + $ZFS get $opt $prop $dst > /dev/null 2>&1 + ret=$? + if [[ $ret == 0 ]]; then + log_fail "$ZFS get \ + $opt $prop $dst unexpectedly succeeded." + fi + done + done + done +} + +log_assert "Setting the invalid option and properties, 'zfs get' should be \ + failed." +log_onexit cleanup + +# Create filesystem and volume's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +log_note "Valid options + invalid properties, 'zfs get' should fail." +test_options "$val_opts_str" "$inval_props_str" + +log_note "Invalid options + valid properties, 'zfs get' should fail." +test_options "$inval_opts_str" "$val_props_str" + +log_note "Invalid options + invalid properties, 'zfs get' should fail." +test_options "$inval_opts_str" "$inval_props_str" + +log_pass "Setting the invalid options to dataset, 'zfs get' pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_006_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_006_neg.ksh new file mode 100644 index 00000000000..7989665b17c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_006_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_006_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_get_006_neg +# +# DESCRIPTION: +# Verify 'zfs get all' can deal with invalid scenarios +# +# STRATEGY: +# 1. Define invalid scenarios for 'zfs get all' +# 2. Run zfs get with those invalid scenarios +# 3. Verify that zfs get fails with invalid scenarios +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify 'zfs get all' fails with invalid combination scenarios." + +set -f # Force ksh ignore '?' and '*' +set -A bad_combine "ALL" "\-R all" "-P all" "-h all" "-rph all" "-RpH all" "-PrH all" \ + "-o all" "-s all" "-? all" "-* all" "-?* all" "all -r" "all -p" \ + "all -H" "all -rp" "all -rH" "all -ph" "all -rpH" "all -r $TESTPOOL" \ + "all -H $TESTPOOL" "all -p $TESTPOOL" "all -r -p -H $TESTPOOL" \ + "all -rph $TESTPOOL" "all,available,reservation $TESTPOOL" \ + "all $TESTPOOL?" "all $TESTPOOL*" "all nonexistpool" + +typeset -i i=0 +while (( i < ${#bad_combine[*]} )) +do + log_mustnot eval "$ZFS get ${bad_combine[i]} >/dev/null" + + (( i = i + 1 )) +done + +log_pass "'zfs get all' fails with invalid combinations scenarios as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_007_neg.ksh new file mode 100644 index 00000000000..b5bd599f702 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_007_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_007_neg.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_get_007_neg +# +# DESCRIPTION: +# 'zfs get -o' should fail with invalid column names +# +# STRATEGY: +# 1. Run zfs get -o with invalid column name combinations +# 2. Verify that zfs get returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "'zfs get -o' fails with invalid options or column names" + +set -A badargs "o name,property,value,resource" "o name" \ + "-O name,property,value,source" "-oo name" "-o blah" \ + "-o name,property,blah,source" "-o name,name,name,name,name" \ + "-o name,property,value,," "-o *,*,*,*" "-o ?,?,?,?" \ + "-o" "-o ,,,,," "-o -o -o -o" "-o NAME,PROPERTY,VALUE,SOURCE" \ + "-o name,properTy,value,source" "-o name, property, value,source" \ + "-o name:property:value:source" "-o name,property:value,source" \ + "-o name;property;value;source" + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + log_mustnot eval "$ZFS get \"${badargs[i]}\" >/dev/null 2>&1" + + (( i = i + 1 )) +done + +log_pass "'zfs get -o' fails with invalid options or column name as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_008_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_008_pos.ksh new file mode 100644 index 00000000000..0c415999eed --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_008_pos.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_008_pos.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_get_008_pos +# +# DESCRIPTION: +# Verify "-d " can work with other options +# +# STRATEGY: +# 1. Create pool, filesystem, dataset, volume and snapshot. +# 2. Getting an -d option, other options and properties random combination. +# 3. Using the combination as the parameters of 'zfs get' to check the +# command line return value. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-05-22) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! zfs_get_list_d_supported ; then + log_unsupported "'zfs get -d' is not supported." +fi + +set -A options " " "-r" "-H" "-p" "-rHp" "-o name" \ + "-s local,default,temporary,inherited,none" \ + "-o name -s local,default,temporary,inherited,none" \ + "-rHp -o name -s local,default,temporary,inherited,none" + +set -A props type used available creation volsize referenced compressratio \ + mounted origin recordsize quota reservation mountpoint sharenfs \ + checksum compression atime devices exec readonly setuid snapdir \ + aclmode aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots \ + userquota@root groupquota@root userused@root groupused@root + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + set -A all_props ${all_props[*]} version +fi + +set -A dataset $TESTPOOL/$TESTCTR $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTVOL@$TESTSNAP + +log_assert "Verify '-d ' can work with other options" +log_onexit cleanup + +# Create volume and filesystem's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +typeset -i opt_numb=16 +typeset -i prop_numb=16 +typeset -i i=0 +typeset -i item=0 +typeset -i depth_item=0 + +for dst in ${dataset[@]}; do + (( i=0 )) + while (( i < opt_numb )); do + (( item = $RANDOM % ${#options[@]} )) + (( depth_item = $RANDOM % ${#depth_options[@]} )) + for prop in $(gen_option_str "${props[*]}" "" "," $prop_numb) + do + log_must eval "$ZFS get -${depth_options[depth_item]} ${options[item]} $prop $dst > /dev/null 2>&1" + done + (( i += 1 )) + done +done + +log_pass "Verify '-d ' can work with other options" + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_009_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_009_pos.ksh new file mode 100644 index 00000000000..72e22eea9fe --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_009_pos.ksh @@ -0,0 +1,105 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_009_pos.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_get_009_pos +# +# DESCRIPTION: +# 'zfs get -d ' should get expected output. +# +# STRATEGY: +# 1. Create a multiple depth filesystem. +# 2. 'zfs get -d ' to get the output. +# 3. 'zfs get -r|egrep' to get the expected output. +# 4. Compare the two outputs, they shoud be same. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-05-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! zfs_get_list_d_supported ; then + log_unsupported "'zfs get -d' is not supported." +fi + +log_assert "'zfs get -d ' should get expected output." +log_onexit depth_fs_cleanup + +set -A all_props type used available creation volsize referenced \ + compressratio mounted origin recordsize quota reservation mountpoint \ + sharenfs checksum compression atime devices exec readonly setuid \ + snapdir aclmode aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots \ + userquota@root groupquota@root userused@root groupused@root + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + set -A all_props ${all_props[*]} version +fi + +depth_fs_setup + +mntpnt=$(get_prop mountpoint $DEPTH_FS) +DEPTH_OUTPUT="$mntpnt/depth_output" +EXPECT_OUTPUT="$mntpnt/expect_output" +typeset -i prop_numb=16 +typeset -i old_val=0 +typeset -i j=0 +typeset eg_opt="$DEPTH_FS"$ +for dp in ${depth_array[@]}; do + (( j=old_val+1 )) + while (( j<=dp && j<=MAX_DEPTH )); do + eg_opt="$eg_opt""|d""$j"$ + (( j+=1 )) + done + for prop in $(gen_option_str "${all_props[*]}" "" "," $prop_numb); do + log_must eval "$ZFS get -H -d $dp -o name $prop $DEPTH_FS > $DEPTH_OUTPUT" + log_must eval "$ZFS get -rH -o name $prop $DEPTH_FS | $EGREP -e '$eg_opt' > $EXPECT_OUTPUT" + log_must $DIFF $DEPTH_OUTPUT $EXPECT_OUTPUT + done + (( old_val=dp )) +done + +log_pass "'zfs get -d ' should get expected output." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_010_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_010_neg.ksh new file mode 100644 index 00000000000..74fe132a75e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_010_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_010_neg.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_get_010_neg +# +# DESCRIPTION: +# A negative depth or a non numeric depth should fail in 'zfs get -d ' +# +# STRATEGY: +# 1. Run zfs get -d with negative depth or non numeric depth +# 2. Verify that zfs get returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-05-22) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! zfs_get_list_d_supported ; then + log_unsupported "'zfs get -d' is not supported." +fi + +log_assert "A negative depth or a non numeric depth should fail in 'zfs get -d '" + +set -A badargs "a" "AB" "aBc" "2A" "a2b" "aB2" "-1" "-32" "-999" + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + log_mustnot eval "$ZFS get -d ${badargs[i]} $TESTPOOL/$TESTFS >/dev/null 2>&1" + (( i = i + 1 )) +done + +log_pass "A negative depth or a non numeric depth should fail in 'zfs get -d '" + + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_common.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_common.kshlib new file mode 100644 index 00000000000..d8c81742f76 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_common.kshlib @@ -0,0 +1,102 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_common.kshlib 1.3 07/03/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# According to $elements, $prefix and $separator, the function random produce +# the number of $counter combination. +# +# $1 elements which is used to get the combination. +# $2 prefix is appended to the combination +# $3 separator between the combination, such as ' ' or ',' +# $4 counter is the number of combination which you want to get. +# +function gen_option_str # $elements $prefix $separator $counter +{ + typeset elements="" + typeset prefix=${2} + typeset separator=${3} + typeset -i counter=${4:-0} + typeset -i i=0 + typeset comb_str="" + + for e in $1; do + elements[i]="$e" + (( i += 1 )) + done + (( ${#elements[@]} == 0 )) && log_fail "The elements can't be empty." + + typeset -i item=0 + typeset -i j=0 + typeset -i numb_item=0 + + # Loop and get the specified number combination strings. + i=0 + while (( i < counter )); do + j=0 + numb_item=0 + comb_str="" + + # Get random number items for each combinations. + (( numb_item = ($RANDOM % ${#elements[@]}) + 1 )) + + while (( j < numb_item )); do + # Random select elements from the array + (( item = $RANDOM % ${#elements[@]} )) + + if (( ${#comb_str} == 0 )); then + comb_str=${elements[item]} + else + comb_str=$comb_str$separator${elements[item]} + fi + (( j += 1 )) + done + + print "$prefix$comb_str" + + (( i += 1 )) + done +} + +# +# Cleanup the volume snapshot and filesystem snapshot were created for +# this test case. +# +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL@$TESTSNAP && \ + destroy_snapshot $TESTPOOL/$TESTVOL@$TESTSNAP + datasetexists $TESTPOOL/$TESTFS@$TESTSNAP && \ + destroy_snapshot $TESTPOOL/$TESTFS@$TESTSNAP + + [[ -e $TESTFILE0 ]] && log_must $RM $TESTFILE0 +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_list_d.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_list_d.kshlib new file mode 100644 index 00000000000..f441d9e0037 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_list_d.kshlib @@ -0,0 +1,94 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_list_d.kshlib 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DEPTH_FS=$TESTPOOL/depth_fs +MAX_DEPTH=3 +DS_COUNT=3 +set -A depth_options "d 0" "d 1" "d 2" "d 4" "d 32" +set -A depth_array 0 1 2 4 32 + +# +# 'zfs get -d or zfs list -d' is supported +# +function zfs_get_list_d_supported +{ + check_opt_support "get" "-d" + return $? +} + +# +# Setup multiple depths datasets, including fs, volume and snapshot. +# +function depth_fs_setup +{ + typeset -i i j k + typeset fslist + + log_must $ZFS create $DEPTH_FS + + (( i=1 )) + while (( i<=MAX_DEPTH )); do + if (( i==1 )); then + fslist=$DEPTH_FS + else + (( k=i-1 )) + fslist=$($ZFS list -rH -t filesystem -o name $DEPTH_FS|$GREP d"$k"$) + if (( $? != 0 )); then + zfs list -rH -t filesystem -o name $DEPTH_FS + log_fail "No d$k filesystem" + fi + fi + for fs in $fslist; do + (( j=1 )) + while (( j<=DS_COUNT )); do + log_must $ZFS create $fs/fs_"$j"_d"$i" + if is_global_zone ; then + log_must $ZFS create -V 8M $fs/v_"$j"_d"$i" + fi + log_must $ZFS snapshot $fs@s_"$j"_d"$i" + (( j=j+1 )) + done + done + (( i=i+1 )) + done +} + +# +# Cleanup multiple depths filesystem. +# +function depth_fs_cleanup +{ + log_must $ZFS destroy -rR $DEPTH_FS +} + + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_test.sh new file mode 100755 index 00000000000..633745657cc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_get/zfs_get_test.sh @@ -0,0 +1,323 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_get_001_pos cleanup +zfs_get_001_pos_head() +{ + atf_set "descr" "Setting the valid options and properties 'zfs get' should returnthe correct property value." + atf_set "require.progs" zfs +} +zfs_get_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_get_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_002_pos cleanup +zfs_get_002_pos_head() +{ + atf_set "descr" "Setting the valid options and properties 'zfs get' return correctvalue. It should be successful." + atf_set "require.progs" zfs +} +zfs_get_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_get_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_003_pos cleanup +zfs_get_003_pos_head() +{ + atf_set "descr" "'zfs get' should get consistent report with different option." + atf_set "require.progs" zfs +} +zfs_get_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_get_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_004_pos cleanup +zfs_get_004_pos_head() +{ + atf_set "descr" "Verify the functions of 'zfs get all' work." + atf_set "require.progs" zfs zpool +} +zfs_get_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_get_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_005_neg cleanup +zfs_get_005_neg_head() +{ + atf_set "descr" "Setting the invalid option and properties, 'zfs get' should befailed." + atf_set "require.progs" zfs +} +zfs_get_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_005_neg.ksh || atf_fail "Testcase failed" +} +zfs_get_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_006_neg cleanup +zfs_get_006_neg_head() +{ + atf_set "descr" "Verify 'zfs get all' fails with invalid combination scenarios." + atf_set "require.progs" zfs +} +zfs_get_006_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_006_neg.ksh || atf_fail "Testcase failed" +} +zfs_get_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_007_neg cleanup +zfs_get_007_neg_head() +{ + atf_set "descr" "'zfs get -o' fails with invalid options or column names" + atf_set "require.progs" zfs +} +zfs_get_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_get_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_008_pos cleanup +zfs_get_008_pos_head() +{ + atf_set "descr" "Verify '-d ' can work with other options" + atf_set "require.progs" zfs +} +zfs_get_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_008_pos.ksh || atf_fail "Testcase failed" +} +zfs_get_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_009_pos cleanup +zfs_get_009_pos_head() +{ + atf_set "descr" "'zfs get -d ' should get expected output." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +zfs_get_009_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_009_pos.ksh || atf_fail "Testcase failed" +} +zfs_get_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_010_neg cleanup +zfs_get_010_neg_head() +{ + atf_set "descr" "A negative depth or a non numeric depth should fail in 'zfs get -d '" + atf_set "require.progs" zfs +} +zfs_get_010_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_010_neg.ksh || atf_fail "Testcase failed" +} +zfs_get_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_get_list_d.kshlib + . $(atf_get_srcdir)/zfs_get_common.kshlib + . $(atf_get_srcdir)/zfs_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_get_001_pos + atf_add_test_case zfs_get_002_pos + atf_add_test_case zfs_get_003_pos + atf_add_test_case zfs_get_004_pos + atf_add_test_case zfs_get_005_neg + atf_add_test_case zfs_get_006_neg + atf_add_test_case zfs_get_007_neg + atf_add_test_case zfs_get_008_pos + atf_add_test_case zfs_get_009_pos + atf_add_test_case zfs_get_010_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/Makefile new file mode 100644 index 00000000000..7777549794e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_inherit +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_inherit_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_inherit_002_neg.ksh +${PACKAGE}FILES+= zfs_inherit_003_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_inherit_001_neg.ksh +${PACKAGE}FILES+= zfs_inherit.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/setup.ksh new file mode 100644 index 00000000000..095cbfb1a7a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_container_volume_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit.cfg new file mode 100644 index 00000000000..d189b0ed611 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit.cfg @@ -0,0 +1,30 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_001_neg.ksh new file mode 100644 index 00000000000..3a2cc031719 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_001_neg.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_inherit_001_neg.ksh 1.4 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_inherit_001_neg +# +# DESCRIPTION: +# 'zfs inherit' should return an error when attempting to inherit +# properties which are not inheritable. +# +# STRATEGY: +# 1. Create an array of properties which cannot be inherited +# 2. For each property in the array, execute 'zfs inherit' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Define uninherited properties and their short name. +typeset props_str="type creation \ + compressratio ratio mounted origin quota reservation \ + reserv volsize volblocksize volblock" + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + props_str="$props_str version" +fi + +set -A prop $props_str canmount + + +log_assert "'zfs inherit' should return an error when attempting to inherit" \ + " un-inheritable properties." + +typeset -i i=0 +for obj in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + i=0 + while [[ $i -lt ${#prop[*]} ]]; do + orig_val=$(get_prop ${prop[i]} $obj) + + log_mustnot $ZFS inherit ${prop[i]} $obj + + new_val=$(get_prop ${prop[i]} $obj) + + if [[ $new_val != $orig_val ]]; then + log_fail "${prop[i]} property changed from $orig_val " + " to $new_val" + fi + ((i = i + 1)) + done +done + +log_pass "'zfs inherit' failed as expected when attempting to inherit" \ + " un-inheritable properties." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_002_neg.ksh new file mode 100644 index 00000000000..0fb8409fd9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_002_neg.ksh @@ -0,0 +1,114 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_inherit_002_neg.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_inherit_002_neg +# +# DESCRIPTION: +# 'zfs inherit' should return an error with bad parameters in one command. +# +# STRATEGY: +# 1. Set an array of bad options and invlid properties to 'zfs inherit' +# 2. Execute 'zfs inherit' with bad options and passing invlid properties +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP; then + log_must $ZFS destroy $TESTPOOL/$TESTFS@$TESTSNAP + fi +} + +log_assert "'zfs inherit' should return an error with bad parameters in one command." +log_onexit cleanup + +set -A badopts "r" "R" "-R" "-rR" "-a" "-" "-?" "-1" "-2" "-v" "-n" +set -A props "recordsize" "mountpoint" "sharenfs" "checksum" "compression" \ + "atime" "devices" "exec" "setuid" "readonly" "zoned" "snapdir" "aclmode" \ + "aclinherit" "shareiscsi" "xattr" "copies" +set -A illprops "recordsiz" "mountpont" "sharen" "compres" "atme" "???" "***" "blah" + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP + +typeset -i i=0 +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP; do + + #zfs inherit should fail with bad options + for opt in ${badopts[@]}; do + for prop in ${props[@]}; do + log_mustnot eval "$ZFS inherit $opt $prop $ds >/dev/null 2>&1" + done + done + + #zfs inherit should fail with invalid properties + for prop in ${illprops[@]}; do + log_mustnot eval "$ZFS inherit $prop $ds >/dev/null 2>&1" + log_mustnot eval "$ZFS inherit -r $prop $ds >/dev/null 2>&1" + done + + #zfs inherit should fail with too many arguments + (( i = 0 )) + while (( i < ${#props[*]} -1 )); do + log_mustnot eval "$ZFS inherit ${props[(( i ))]} \ + ${props[(( i + 1 ))]} $ds >/dev/null 2>&1" + log_mustnot eval "$ZFS inherit -r ${props[(( i ))]} \ + ${props[(( i + 1 ))]} $ds >/dev/null 2>&1" + + (( i = i + 2 )) + done + +done + +#zfs inherit should fail with missing datasets +for prop in ${props[@]}; do + log_mustnot eval "$ZFS inherit $prop >/dev/null 2>&1" + log_mustnot eval "$ZFS inherit -r $prop >/dev/null 2>&1" +done + +log_pass "'zfs inherit' failed as expected when passing illegal arguments." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_003_pos.ksh new file mode 100644 index 00000000000..746671d7f4b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_003_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_inherit_003_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_inherit_003_pos +# +# DESCRIPTION: +# 'zfs inherit' should return an error with bad parameters in one command. +# +# STRATEGY: +# 1. Set an array of bad options and invlid properties to 'zfs inherit' +# 2. Execute 'zfs inherit' with bad options and passing invlid properties +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL ; do + if snapexists $ds@$TESTSNAP; then + log_must $ZFS destroy $ds@$TESTSNAP + fi + done + cleanup_user_prop $TESTPOOL +} + +log_assert "'zfs inherit' should inherit user property." +log_onexit cleanup + +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL ; do + typeset prop_name=$(valid_user_property 10) + typeset value=$(user_property_value 16) + + log_must eval "$ZFS set $prop_name='$value' $ds" + + log_must $ZFS snapshot $ds@$TESTSNAP + + typeset snapvalue=$(get_prop $prop_name $ds@$TESTSNAP) + + if [[ "$snapvalue" != "$value" ]] ; then + log_fail "The '$ds@$TESTSNAP '$prop_name' value '$snapvalue' " \ + "not equal to the expected value '$value'." + fi + + snapvalue=$(user_property_value 16) + log_must eval "$ZFS set $prop_name='$snapvalue' $ds@$TESTSNAP" + + log_must $ZFS inherit $prop_name $ds@$TESTSNAP + + snapvalue=$(get_prop $prop_name $ds@$TESTSNAP) + + if [[ "$snapvalue" != "$value" ]] ; then + log_fail "The '$ds@$TESTSNAP '$prop_name' value '$snapvalue' " \ + "not equal to the expected value '$value'." + fi + + +done + +log_pass "'zfs inherit' inherit user property." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_test.sh new file mode 100755 index 00000000000..1f110f52072 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_inherit/zfs_inherit_test.sh @@ -0,0 +1,107 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_inherit_001_neg cleanup +zfs_inherit_001_neg_head() +{ + atf_set "descr" "'zfs inherit' should return an error when attempting to inherit un-inheritable properties." + atf_set "require.progs" zfs +} +zfs_inherit_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_inherit.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_inherit_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_inherit_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_inherit.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_inherit_002_neg cleanup +zfs_inherit_002_neg_head() +{ + atf_set "descr" "'zfs inherit' should return an error with bad parameters in one command." + atf_set "require.progs" zfs +} +zfs_inherit_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_inherit.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_inherit_002_neg.ksh || atf_fail "Testcase failed" +} +zfs_inherit_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_inherit.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_inherit_003_pos cleanup +zfs_inherit_003_pos_head() +{ + atf_set "descr" "'zfs inherit' should inherit user property." + atf_set "require.progs" zfs +} +zfs_inherit_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_inherit.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_inherit_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_inherit_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_inherit.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_inherit_001_neg + atf_add_test_case zfs_inherit_002_neg + atf_add_test_case zfs_inherit_003_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/Makefile new file mode 100644 index 00000000000..9e38234a3f9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/Makefile @@ -0,0 +1,30 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_mount +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_mount_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_mount_004_pos.ksh +${PACKAGE}FILES+= zfs_mount_008_pos.ksh +${PACKAGE}FILES+= zfs_mount_009_neg.ksh +${PACKAGE}FILES+= zfs_mount_010_neg.ksh +${PACKAGE}FILES+= zfs_mount_011_neg.ksh +${PACKAGE}FILES+= zfs_mount_005_pos.ksh +${PACKAGE}FILES+= zfs_mount_001_pos.ksh +${PACKAGE}FILES+= zfs_mount.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_mount.kshlib +${PACKAGE}FILES+= zfs_mount_007_pos.ksh +${PACKAGE}FILES+= zfs_mount_003_pos.ksh +${PACKAGE}FILES+= zfs_mount_all_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_mount_006_pos.ksh +${PACKAGE}FILES+= zfs_mount_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/cleanup.ksh new file mode 100644 index 00000000000..26ce7c30a0b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/setup.ksh new file mode 100644 index 00000000000..167f749f724 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount.cfg new file mode 100644 index 00000000000..1c80531e773 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount.cfg @@ -0,0 +1,42 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export mountcmd=mount +export mountforce="$mountcmd -f" +export mountall="$mountcmd -a" + +export unmountcmd=unmount +export unmountforce="$unmountcmd -f" +export unmountall="$unmountcmd -a" + +export NONEXISTFSNAME="nonexistfs50charslong_0123456789012345678901234567" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount.kshlib new file mode 100644 index 00000000000..ddc097fa9bc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount.kshlib @@ -0,0 +1,135 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount.kshlib 1.3 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +function force_unmount #dev +{ + typeset dev=$1 + + ismounted $dev + if (( $? == 0 )); then + log_must $ZFS $unmountforce $dev + fi + return 0 +} + +# Create pool and ( fs | container | vol ) with the given parameters, +# it'll destroy prior exist one that has the same name. + +function setup_filesystem #disklist #pool #fs #mntpoint #type #vdev +{ + typeset disklist=$1 + typeset pool=$2 + typeset fs=${3##/} + typeset mntpoint=$4 + typeset type=$5 + typeset vdev=$6 + + if [[ -z $pool || -z $fs || -z $mntpoint ]]; then + log_note "Missing parameter: (\"$pool\", \"$fs\", \"$mntpoint\")" + return 1 + fi + + if is_global_zone && [[ -z $disklist ]] ; then + log_note "Missing disklist." + return 1 + fi + + if [[ $vdev != "" && \ + $vdev != "mirror" && \ + $vdev != "raidz" ]] ; then + + log_note "Wrong vdev: (\"$vdev\")" + return 1 + fi + + poolexists $pool || \ + create_pool $pool $vdev $disklist + + datasetexists $pool/$fs && \ + log_must cleanup_filesystem $pool $fs + + $RMDIR $mntpoint > /dev/null 2>&1 + if [[ ! -d $mntpoint ]]; then + log_must $MKDIR -p $mntpoint + fi + + case "$type" in + 'ctr') log_must $ZFS create $pool/$fs + log_must $ZFS set mountpoint=$mntpoint $pool/$fs + ;; + 'vol') log_must $ZFS create -V $VOLSIZE $pool/$fs + ;; + *) log_must $ZFS create $pool/$fs + log_must $ZFS set mountpoint=$mntpoint $pool/$fs + ;; + esac + + return 0 +} + +# Destroy ( fs | container | vol ) with the given parameters. +function cleanup_filesystem #pool #fs +{ + typeset pool=$1 + typeset fs=${2##/} + typeset mtpt="" + + if [[ -z $pool || -z $fs ]]; then + log_note "Missing parameter: (\"$pool\", \"$fs\")" + return 1 + fi + + if datasetexists "$pool/$fs" ; then + mtpt=$(get_prop mountpoint "$pool/$fs") + log_must $ZFS destroy -r $pool/$fs + + [[ -d $mtpt ]] && \ + log_must $RM -rf $mtpt + else + return 1 + fi + + return 0 +} + +# Make sure 'zfs mount' should display all ZFS filesystems currently mounted. +# The results of 'zfs mount' and 'df -F zfs' should be identical. +function verify_mount_display +{ + typeset fs + + for fs in $($ZFS $mountcmd | $AWK '{print $1}') ; do + log_must mounted $fs + done + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_001_pos.ksh new file mode 100644 index 00000000000..52f26fbb161 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_001_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_mount_001_pos +# +# DESCRIPTION: +# Invoke "zfs mount " with a regular name of filesystem, +# will mount that filesystem successfully. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is unmounted. +# 2. Invoke 'zfs mount '. +# 3. Verify that the filesystem is mounted. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must force_unmount $TESTPOOL/$TESTFS + return 0 +} + +log_assert "Verify that '$ZFS $mountcmd ' succeeds as root." + +log_onexit cleanup + +unmounted $TESTPOOL/$TESTFS || \ + log_must cleanup + +log_must $ZFS $mountcmd $TESTPOOL/$TESTFS + +log_note "Make sure the filesystem $TESTPOOL/$TESTFS is mounted" +mounted $TESTPOOL/$TESTFS || \ + log_fail Filesystem $TESTPOOL/$TESTFS is unmounted + +log_pass "'$ZFS $mountcmd ' succeeds as root." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_002_pos.ksh new file mode 100644 index 00000000000..941d151b73e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_002_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_mount_002_pos +# +# DESCRIPTION: +# Invoking "zfs mount " with a filesystem whose name is not in +# "zfs list", will fail with a return code of 1. +# +# STRATEGY: +# 1. Make sure the NONEXISTFSNAME ZFS filesystem is not in 'zfs list'. +# 2. Invoke 'zfs mount '. +# 3. Verify that mount failed with return code of 1. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset fs + for fs in $NONEXISTFSNAME $TESTFS ; do + log_must force_unmount $TESTPOOL/$fs + done +} + + +log_assert "Verify that '$ZFS $mountcmd' with a filesystem " \ + "whose name is not in 'zfs list' will fail with return code 1." + +log_onexit cleanup + +log_note "Make sure the filesystem $TESTPOOL/$NONEXISTFSNAME " \ + "is not in 'zfs list'" +log_mustnot $ZFS list $TESTPOOL/$NONEXISTFSNAME + +typeset -i ret=0 +$ZFS $mountcmd $TESTPOOL/$NONEXISTFSNAME +ret=$? +(( ret == 1 )) || \ + log_fail "'$ZFS $mountcmd $TESTPOOL/$NONEXISTFSNAME' " \ + "unexpected return code of $ret." + +log_note "Make sure the filesystem $TESTPOOL/$NONEXISTFSNAME is unmounted" +unmounted $TESTPOOL/$NONEXISTFSNAME || \ + log_fail Filesystem $TESTPOOL/$NONEXISTFSNAME is mounted + +log_pass "'$ZFS $mountcmd' with a filesystem " \ + "whose name is not in 'zfs list' failed with return code 1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_003_pos.ksh new file mode 100644 index 00000000000..6fc655bf91a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_003_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_mount_003_pos +# +# DESCRIPTION: +# Invoke "zfs mount " with a filesystem whose mountpoint property +# is 'legacy' or 'none', +# it will fail with a return code of 1 and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is unmounted. +# 2. Mount the filesystem using the various combinations +# - zfs set mountpoint=legacy +# - zfs set mountpoint=none +# 3. Verify that mount failed with return code of 1. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must force_unmount $TESTPOOL/$TESTFS + return 0 +} + +log_assert "Verify that '$ZFS $mountcmd' with a filesystem " \ + "whose mountpoint property is 'legacy' or 'none' " \ + "will fail with return code 1." + +log_onexit cleanup + +set -A mopt "legacy" "none" + +typeset -i ret=0 +typeset -i i=0 + +while (( i < ${#mopt[*]} )); do + unmounted $TESTPOOL/$TESTFS || \ + log_must cleanup + + log_must $ZFS set mountpoint=${mopt[i]} $TESTPOOL/$TESTFS + + $ZFS $mountcmd $TESTPOOL/$TESTFS + ret=$? + (( ret == 1)) || \ + log_fail "'$ZFS $mountcmd $TESTPOOL/$TESTFS' " \ + "unexpected return code of $ret." + + log_note "Make sure the filesystem $TESTPOOL/$TESTFS is unmounted" + unmounted $TESTPOOL/$TESTFS || \ + log_fail Filesystem $TESTPOOL/$TESTFS is mounted + + ((i = i + 1)) +done + +log_pass "Verify that '$ZFS $mountcmd' with a filesystem " \ + "whose mountpoint property is 'legacy' or 'none' " \ + "will fail with return code 1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_004_pos.ksh new file mode 100644 index 00000000000..cfc369932e8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_004_pos.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_004_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_mount_004_pos +# +# DESCRIPTION: +# Invoke "zfs mount " with a filesystem +# which has been already mounted, +# it will fail with a return code of 1 +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is unmounted. +# 2. Invoke 'zfs mount '. +# 3. Verify that the filesystem is mounted. +# 4. Invoke 'zfs mount ' the second times. +# 5. Verify the last mount operation failed with return code of 1. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must force_unmount $TESTPOOL/$TESTFS + return 0 +} + +typeset -i ret=0 + +log_assert "Verify that '$ZFS $mountcmd ' " \ + "with a mounted filesystem will fail with return code 1." + +log_onexit cleanup + +unmounted $TESTPOOL/$TESTFS || \ + log_must cleanup + +log_must $ZFS $mountcmd $TESTPOOL/$TESTFS + +mounted $TESTPOOL/$TESTFS || \ + log_unresolved "Filesystem $TESTPOOL/$TESTFS is unmounted" + +$ZFS $mountcmd $TESTPOOL/$TESTFS +ret=$? +(( ret == 1 )) || \ + log_fail "'$ZFS $mountcmd $TESTPOOL/$TESTFS' " \ + "unexpected return code of $ret." + +log_note "Make sure the filesystem $TESTPOOL/$TESTFS is mounted" +mounted $TESTPOOL/$TESTFS || \ + log_fail Filesystem $TESTPOOL/$TESTFS is unmounted + +log_pass "'$ZFS $mountcmd ' with a mounted filesystem " \ + "will fail with return code 1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_005_pos.ksh new file mode 100644 index 00000000000..dbdd398b769 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_005_pos.ksh @@ -0,0 +1,100 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_005_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_mount_005_pos +# +# DESCRIPTION: +# Invoke "zfs mount " with a filesystem +# but its mountpoint is currently in use, +# it will fail with a return code of 1 +# and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is unmounted. +# 2. Apply 'zfs set mountpoint=path '. +# 3. Change directory to that given mountpoint. +# 3. Invoke 'zfs mount '. +# 4. Verify that mount failed with return code of 1. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must force_unmount $TESTPOOL/$TESTFS + return 0 +} + +typeset -i ret=0 + +log_assert "Verify that '$ZFS $mountcmd' with a filesystem " \ + "whose mountpoint is currently in use will fail with return code 1." + +log_onexit cleanup + +unmounted $TESTPOOL/$TESTFS || \ + log_must cleanup + +[[ -d $TESTDIR ]] || \ + log_must $MKDIR -p $TESTDIR + +cd $TESTDIR || \ + log_unresolved "Unable change directory to $TESTDIR" + +$ZFS $mountcmd $TESTPOOL/$TESTFS +ret=$? +(( ret == 1 )) || \ + log_fail "'$ZFS $mountcmd $TESTPOOL/$TESTFS' " \ + "unexpected return code of $ret." + +log_note "Make sure the filesystem $TESTPOOL/$TESTFS is unmounted" +unmounted $TESTPOOL/$TESTFS || \ + log_fail Filesystem $TESTPOOL/$TESTFS is mounted + +log_pass "'$ZFS $mountcmd' with a filesystem " \ + "whose mountpoint is currently in use failed with return code 1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_006_pos.ksh new file mode 100644 index 00000000000..5e51a89c0ef --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_006_pos.ksh @@ -0,0 +1,138 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_006_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_mount_006_pos +# +# DESCRIPTION: +# Invoke "zfs mount " with a filesystem +# which mountpoint be the identical or the top of an existing one, +# it will fail with a return code of 1 +# +# STRATEGY: +# 1. Prepare an existing mounted filesystem. +# 2. Setup a new filesystem and make sure that it is unmounted. +# 3. Mount the new filesystem using the various combinations +# - zfs set mountpoint= +# - zfs set mountpoint= +# 4. Verify that mount failed with return code of 1. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must force_unmount $TESTPOOL/$TESTFS + + datasetexists $TESTPOOL/$TESTFS1 && \ + cleanup_filesystem $TESTPOOL $TESTFS1 + + [[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must force_unmount $TESTPOOL/$TESTFS + + return 0 +} + +typeset -i ret=0 + +log_assert "Verify that '$ZFS $mountcmd ' " \ + "which mountpoint be the identical or the top of an existing one " \ + "will fail with return code 1." + +log_onexit cleanup + +unmounted $TESTPOOL/$TESTFS || \ + log_must force_unmount $TESTPOOL/$TESTFS + +[[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR + +typeset -i MAXDEPTH=3 +typeset -i depth=0 +typeset mtpt=$TESTDIR + +while (( depth < MAXDEPTH )); do + mtpt=$mtpt/$depth + (( depth = depth + 1)) +done + +log_must $ZFS set mountpoint=$mtpt $TESTPOOL/$TESTFS +log_must $ZFS $mountcmd $TESTPOOL/$TESTFS + +mounted $TESTPOOL/$TESTFS || \ + log_unresolved "Filesystem $TESTPOOL/$TESTFS is unmounted" + +log_must $ZFS create $TESTPOOL/$TESTFS1 + +unmounted $TESTPOOL/$TESTFS1 || \ + log_must force_unmount $TESTPOOL/$TESTFS1 + +while [[ -n $mtpt ]] ; do + (( depth == MAXDEPTH )) && \ + log_note "Verify that '$ZFS $mountcmd ' " \ + "which mountpoint be the identical of an existing one " \ + "will fail with return code 1." + + log_must $ZFS set mountpoint=$mtpt $TESTPOOL/$TESTFS1 + log_mustnot $ZFS $mountcmd $TESTPOOL/$TESTFS1 + + unmounted $TESTPOOL/$TESTFS1 || \ + log_fail "Filesystem $TESTPOOL/$TESTFS1 is mounted." + + mtpt=${mtpt%/*} + + (( depth == MAXDEPTH )) && \ + log_note "Verify that '$ZFS $mountcmd ' " \ + "which mountpoint be the top of an existing one " \ + "will fail with return code 1." + (( depth = depth - 1 )) +done + +log_pass "'$ZFS $mountcmd ' " \ + "which mountpoint be the identical or the top of an existing one " \ + "will fail with return code 1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_007_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_007_pos.ksh new file mode 100644 index 00000000000..98da3177d70 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_007_pos.ksh @@ -0,0 +1,152 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_007_pos.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_mount_007_pos +# +# DESCRIPTION: +# The following options can be set on a temporary basis using the -o option +# without affecting the on-disk property. The original on-disk value will be +# restored when the file system is unmounted and mounted. +# +# PROPERTY MOUNT OPTION +# atime atime/noatime +# exec exec/noexec +# readonly ro/rw +# setuid setuid/nosetuid +# +# STRATEGY: +# 1. Create filesystem and get origianl property value. +# 2. Using 'zfs mount -o' to set filesystem property. +# 3. Verify the property was set temporarily. +# 4. Verify it will not affect the property that is stored on disk. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-02) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + if ! ismounted $TESTPOOL/$TESTFS; then + log_must $ZFS mount $TESTPOOL/$TESTFS + fi +} + +log_assert "Verify '-o' will set filesystem property temporarily, " \ + "without affecting the property that is stored on disk." +log_onexit cleanup + +set -A properties "atime" "exec" "readonly" "setuid" + +# +# Get the specified filesystem property reverse mount option. +# +# $1 filesystem +# $2 property +# +function get_reverse_option +{ + typeset fs=$1 + typeset prop=$2 + + # Define property value: "reverse if value=on" "reverse if value=off" + set -A values "noatime" "atime" \ + "noexec" "exec" \ + "rw" "ro" \ + "nosetuid" "setuid" + + typeset -i i=0 + while (( i < ${#properties[@]} )); do + if [[ $prop == ${properties[$i]} ]]; then + break + fi + + (( i += 1 )) + done + if (( i >= ${#properties[@]} )); then + log_fail "Incorrect option: $prop" + fi + + typeset val + typeset -i ind=0 + val=$(get_prop $prop $fs) || log_fail "get_prop $prop $fs" + if [[ $val == "on" ]]; then + (( ind = i * 2 )) + else + (( ind = i * 2 + 1 )) + fi + + $ECHO ${values[$ind]} +} + +fs=$TESTPOOL/$TESTFS +cleanup + +for property in ${properties[@]}; do + orig_val=$(get_prop $property $fs) + (($? != 0)) && log_fail "get_prop $property $fs" + + # Set filesystem property temporarily + reverse_opt=$(get_reverse_option $fs $property) + log_must $ZFS mount -o update,$reverse_opt $fs + + cur_val=$(get_prop $property $fs) + (($? != 0)) && log_fail "get_prop $property $fs" + + if [[ $orig_val == $cur_val ]]; then + log_fail "zfs mount -o update,$reverse_opt " \ + "doesn't change property." + fi + + # unmount & mount will revert property to the original value + log_must $ZFS unmount $fs + log_must $ZFS mount $fs + + cur_val=$(get_prop $property $fs) + (($? != 0)) && log_fail "get_prop $property $fs" + if [[ $orig_val != $cur_val ]]; then + log_fail "zfs mount -o update,$reverse_opt " \ + "change the property that is stored on disks" + fi +done + +log_pass "Verify '-o' set filesystem property temporarily passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_008_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_008_pos.ksh new file mode 100644 index 00000000000..facddbe7ba6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_008_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_008_pos.ksh 1.3 09/01/13 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_mount_008_pos +# +# DESCRIPTION: +# 'zfs mount -O' allow the file system to be mounted over an existing +# mount point, making the underlying file system inaccessible. +# +# STRATEGY: +# 1. Create two filesystem fs & fs1, and create two test files for them. +# 2. Unmount fs1 and set mountpoint property is identical to fs. +# 3. Verify 'zfs mount -O' will make the underlying filesystem fs +# inaccessible. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-02) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + ! ismounted $fs && log_must $ZFS mount $fs + + if datasetexists $fs1; then + log_must $ZFS destroy $fs1 + fi + + if [[ -f $testfile ]]; then + log_must $RM -f $testfile + fi +} + +log_assert "Verify 'zfs mount -O' will override existing mount point." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS; fs1=$TESTPOOL/$TESTFS1 + +cleanup + +# Get the original mountpoint of $fs and $fs1 +mntpnt=$(get_prop mountpoint $fs) +log_must $ZFS create $fs1 +mntpnt1=$(get_prop mountpoint $fs1) + +testfile=$mntpnt/$TESTFILE0; testfile1=$mntpnt1/$TESTFILE1 +log_must $MKFILE 1M $testfile $testfile1 + +log_must $ZFS unmount $fs1 +log_must $ZFS set mountpoint=$mntpnt $fs1 +log_must $ZFS mount $fs1 + +# Create new file in override mountpoint +log_must $MKFILE 1M $mntpnt/$TESTFILE2 + +# Verify the underlying file system inaccessible +log_mustnot $LS $testfile +log_must $LS $mntpnt/$TESTFILE1 $mntpnt/$TESTFILE2 + +# Verify $TESTFILE2 was created in $fs1, rather then $fs +log_must $ZFS unmount $fs1 +log_must $ZFS set mountpoint=$mntpnt1 $fs1 +log_must $ZFS mount $fs1 +log_must $LS $testfile1 $mntpnt1/$TESTFILE2 + +# Verify $TESTFILE2 was not created in $fs, and $fs is accessible again. +log_mustnot $LS $mntpnt/$TESTFILE2 +log_must $LS $testfile + +log_pass "Verify 'zfs mount -O' override mount point passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_009_neg.ksh new file mode 100644 index 00000000000..ac97249e101 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_009_neg.ksh @@ -0,0 +1,127 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_009_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_mount_009_neg +# +# DESCRIPTION: +# Try each 'zfs mount' with inapplicable scenarios to make sure +# it returns an error. include: +# * Multiple filesystems specified +# * '-a', but also with a specific filesystem. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +multifs="$TESTFS $TESTFS1" +datasets="" + +for fs in $multifs ; do + datasets="$datasets $TESTPOOL/$fs" +done + +set -A args "$mountall $TESTPOOL/$TESTFS" \ + "$mountcmd $datasets" + +function setup_all +{ + typeset fs + + for fs in $multifs ; do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "$fs" \ + "${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID}/$TESTPOOL/$fs" + done + return 0 +} + +function cleanup_all +{ + typeset fs + + cleanup_filesystem "$TESTPOOL" "$TESTFS1" + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + [[ -d ${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID} ]] && \ + $RM -rf ${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID} + + + return 0 +} + +function verify_all +{ + typeset fs + + for fs in $multifs ; do + log_must unmounted $TESTPOOL/$fs + done + return 0 +} + +log_assert "Badly-formed 'zfs $mountcmd' with inapplicable scenarios " \ + "should return an error." + +log_onexit cleanup_all + +log_must setup_all + +log_must $ZFS $unmountall + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS ${args[i]} + ((i = i + 1)) +done + +log_must verify_all + +log_pass "Badly formed 'zfs $mountcmd' with inapplicable scenarios " \ + "fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_010_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_010_neg.ksh new file mode 100644 index 00000000000..515f2572109 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_010_neg.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_010_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_mount_010_neg +# +# DESCRIPTION: +# Verify that zfs mount should fail when mounting a mounted zfs filesystem or +# the mountpoint is busy +# +# STRATEGY: +# 1. Make a zfs filesystem mounted or mountpoint busy +# 2. Use zfs mount to mount the filesystem +# 3. Verify that zfs mount returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-9) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if ! ismounted $fs; then + log_must $ZFS mount $fs + fi +} + +log_assert "zfs mount fails with mounted filesystem or busy mountpoint" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +if ! ismounted $fs; then + log_must $ZFS mount $fs +fi + +log_mustnot $ZFS mount $fs + +mpt=$(get_prop mountpoint $fs) +log_must $ZFS umount $fs +curpath=`$DIRNAME $0` +cd $mpt +log_mustnot $ZFS mount $fs +cd $curpath + +log_pass "zfs mount fails with mounted filesystem or busy moutpoint as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_011_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_011_neg.ksh new file mode 100644 index 00000000000..5f3819d59b3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_011_neg.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_011_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_mount_011_neg +# +# DESCRIPTION: +# Verify that zfs mount should fail with bad parameters +# +# STRATEGY: +# 1. Make an array of bad parameters +# 2. Use zfs mount to mount the filesystem +# 3. Verify that zfs mount returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-9) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP; then + log_must $ZFS destroy $TESTPOOL/$TESTFS@$TESTSNAP + fi + + if is_global_zone && datasetexists $TESTPOOL/$TESTVOL; then + log_must $ZFS destroy $TESTPOOL/$TESTVOL + fi +} + +log_assert "zfs mount fails with bad parameters" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +set -A badargs "A" "-A" "-" "-x" "-?" "=" "-o *" "-a" + +for arg in "${badargs[@]}"; do + log_mustnot eval "$ZFS mount $arg $fs >/dev/null 2>&1" +done + +#verify that zfs mount fails with invalid dataset +for opt in "-o abc" "-O"; do + log_mustnot eval "$ZFS mount $opt /$fs >/dev/null 2>&1" +done + +#verify that zfs mount fails with volume and snapshot +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_mustnot eval "$ZFS mount $TESTPOOL/$TESTFS@$TESTSNAP >/dev/null 2>&1" + +if is_global_zone; then + log_must $ZFS create -V 10m $TESTPOOL/$TESTVOL + log_mustnot eval "$ZFS mount $TESTPOOL/$TESTVOL >/dev/null 2>&1" +fi + +log_pass "zfs mount fails with bad parameters as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_all_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_all_001_pos.ksh new file mode 100644 index 00000000000..67a6c4711d7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_all_001_pos.ksh @@ -0,0 +1,197 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_all_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# __stc_assertion_start +# +# ID: zfs_mount_all_001_pos +# +# DESCRIPTION: +# Verify that 'zfs mount -a' succeeds as root. +# +# STRATEGY: +# 1. Create a group of pools with specified vdev. +# 2. Create zfs filesystems within the given pools. +# 3. Unmount all the filesystems. +# 4. Verify that 'zfs mount -a' command succeed, +# and all available ZFS filesystems are mounted. +# 5. Verify that 'zfs mount' is identical with 'df -F zfs' +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A fs "$TESTFS" "$TESTFS1" +set -A ctr "" "$TESTCTR" "$TESTCTR/$TESTCTR1" "$TESTCTR1" +set -A vol "$TESTVOL" "$TESTVOL1" + +function setup_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + while (( i < ${#ctr[*]} )); do + + path=${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID}/$TESTPOOL + if [[ -n ${ctr[i]} ]]; then + path=$path/${ctr[i]} + + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}" "$path" \ + "ctr" + fi + + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}/${vol[j]}" \ + "$path/${vol[j]}" \ + "vol" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}/${fs[j]}" \ + "$path/${fs[j]}" + ((j = j + 1)) + done + + ((i = i + 1)) + done + + return 0 +} + +function cleanup_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + ((i = ${#ctr[*]} - 1)) + + while (( i >= 0 )); do + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + cleanup_filesystem "$TESTPOOL" \ + "${ctr[i]}/${vol[j]}" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + cleanup_filesystem "$TESTPOOL" \ + "${ctr[i]}/${fs[j]}" + ((j = j + 1)) + done + + [[ -n ${ctr[i]} ]] && \ + cleanup_filesystem "$TESTPOOL" "${ctr[i]}" + + ((i = i - 1)) + done + + [[ -d ${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID} ]] && \ + $RM -rf ${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID} +} + +function verify_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + while (( i < ${#ctr[*]} )); do + + path=$TESTPOOL + [[ -n ${ctr[i]} ]] && \ + path=$path/${ctr[i]} + + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + log_mustnot mounted "$path/${vol[j]}" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + log_must mounted "$path/${fs[j]}" + ((j = j + 1)) + done + + log_must mounted "$path" + + ((i = i + 1)) + done + + return 0 +} + + +log_assert "Verify that 'zfs $mountall' succeeds as root, " \ + "and all available ZFS filesystems are mounted." + +log_onexit cleanup_all + +log_must setup_all + +log_must $ZFS $unmountall + +log_must $ZFS $mountall + +verify_all + +log_note "Verify that 'zfs $mountcmd' will display " \ + "all ZFS filesystems currently mounted." + +verify_mount_display + +log_pass "'zfs $mountall' succeeds as root, " \ + "and all available ZFS filesystems are mounted." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_test.sh new file mode 100755 index 00000000000..7ccbfc0aabd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_mount/zfs_mount_test.sh @@ -0,0 +1,372 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_mount_001_pos cleanup +zfs_mount_001_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $mountcmd ' succeeds as root." + atf_set "require.progs" zfs +} +zfs_mount_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_002_pos cleanup +zfs_mount_002_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $mountcmd' with a filesystemwhose name is not in 'zfs list' will fail with return code 1." + atf_set "require.progs" zfs +} +zfs_mount_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_003_pos cleanup +zfs_mount_003_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $mountcmd' with a filesystemwhose mountpoint property is 'legacy' or 'none' \will fail with return code 1." + atf_set "require.progs" zfs +} +zfs_mount_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_004_pos cleanup +zfs_mount_004_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $mountcmd 'with a mounted filesystem will fail with return code 1." + atf_set "require.progs" zfs +} +zfs_mount_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_005_pos cleanup +zfs_mount_005_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $mountcmd' with a filesystemwhose mountpoint is currently in use will fail with return code 1." + atf_set "require.progs" zfs +} +zfs_mount_005_pos_body() +{ + [[ `uname -s` = "FreeBSD" ]] && atf_skip "Unlike Illumos, FreeBSD allows the behavior the prohibition of which is tested by this testcase" + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_006_pos cleanup +zfs_mount_006_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $mountcmd 'which mountpoint be the identical or the top of an existing one \will fail with return code 1." + atf_set "require.progs" zfs +} +zfs_mount_006_pos_body() +{ + [[ `uname -s` = "FreeBSD" ]] && atf_skip "Unlike Illumos, FreeBSD allows the behavior the prohibition of which is tested by this testcase" + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_007_pos cleanup +zfs_mount_007_pos_head() +{ + atf_set "descr" "Verify '-o' will set filesystem property temporarily,without affecting the property that is stored on disk." + atf_set "require.progs" zfs +} +zfs_mount_007_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + atf_expect_fail "PR 115361 zfs get setuid doesn't reflect setuid state as set by zfs mount" + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_007_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_008_pos cleanup +zfs_mount_008_pos_head() +{ + atf_set "descr" "Verify 'zfs mount -O' will override existing mount point." + atf_set "require.progs" zfs +} +zfs_mount_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_008_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_009_neg cleanup +zfs_mount_009_neg_head() +{ + atf_set "descr" "Badly-formed 'zfs $mountcmd' with inapplicable scenariosshould return an error." + atf_set "require.progs" zfs +} +zfs_mount_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_009_neg.ksh || atf_fail "Testcase failed" +} +zfs_mount_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_010_neg cleanup +zfs_mount_010_neg_head() +{ + atf_set "descr" "zfs mount fails with mounted filesystem or busy mountpoint" + atf_set "require.progs" zfs +} +zfs_mount_010_neg_body() +{ + [[ `uname -s` = "FreeBSD" ]] && atf_skip "Unlike Illumos, FreeBSD allows the behavior the prohibition of which is tested by this testcase" + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_010_neg.ksh || atf_fail "Testcase failed" +} +zfs_mount_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_011_neg cleanup +zfs_mount_011_neg_head() +{ + atf_set "descr" "zfs mount fails with bad parameters" + atf_set "require.progs" zfs +} +zfs_mount_011_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_011_neg.ksh || atf_fail "Testcase failed" +} +zfs_mount_011_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_all_001_pos cleanup +zfs_mount_all_001_pos_head() +{ + atf_set "descr" "Verify that 'zfs $mountall' succeeds as root,and all available ZFS filesystems are mounted." + atf_set "require.progs" zfs +} +zfs_mount_all_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_all_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_mount_all_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_mount.kshlib + . $(atf_get_srcdir)/zfs_mount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_mount_001_pos + atf_add_test_case zfs_mount_002_pos + atf_add_test_case zfs_mount_003_pos + atf_add_test_case zfs_mount_004_pos + atf_add_test_case zfs_mount_005_pos + atf_add_test_case zfs_mount_006_pos + atf_add_test_case zfs_mount_007_pos + atf_add_test_case zfs_mount_008_pos + atf_add_test_case zfs_mount_009_neg + atf_add_test_case zfs_mount_010_neg + atf_add_test_case zfs_mount_011_neg + atf_add_test_case zfs_mount_all_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/Makefile new file mode 100644 index 00000000000..3220cadfc36 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/Makefile @@ -0,0 +1,26 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_promote +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_promote_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_promote_006_neg.ksh +${PACKAGE}FILES+= zfs_promote_003_pos.ksh +${PACKAGE}FILES+= zfs_promote_common.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_promote_007_neg.ksh +${PACKAGE}FILES+= zfs_promote.cfg +${PACKAGE}FILES+= zfs_promote_002_pos.ksh +${PACKAGE}FILES+= zfs_promote_004_pos.ksh +${PACKAGE}FILES+= zfs_promote_008_pos.ksh +${PACKAGE}FILES+= zfs_promote_005_pos.ksh +${PACKAGE}FILES+= zfs_promote_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/setup.ksh new file mode 100644 index 00000000000..61f282cda9e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_volume_setup ${DISK} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote.cfg new file mode 100644 index 00000000000..c91fc779a70 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote.cfg @@ -0,0 +1,46 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export FILESIZE=1m + +export TESTSNAP3=testsnap3.${TESTCASE_ID} +export TESTSNAP4=testsnap4.${TESTCASE_ID} +export TESTSNAP5=testsnap5.${TESTCASE_ID} +export TESTFILE3=testfile3.${TESTCASE_ID} + +export CLONEFILE=clonefile.${TESTCASE_ID} +export CLONEFILE1=clonefile1.${TESTCASE_ID} +export CLONEFILE2=clonefile2.${TESTCASE_ID} +export CLONEFILE3=clonefile3.${TESTCASE_ID} + + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_001_pos.ksh new file mode 100644 index 00000000000..156a026cbf3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_001_pos.ksh @@ -0,0 +1,139 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_promote_001_pos +# +# DESCRIPTION: +# 'zfs promote' can promote a clone filesystem to no longer be dependent +# on its "origin" snapshot. +# +# STRATEGY: +# 1. Create a snapshot and a clone of the snapshot +# 2. Promote the clone filesystem +# 3. Verify the promoted filesystem become independent +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists $csnap; then + log_must $ZFS promote $fs + fi + snapexists $snap && \ + log_must $ZFS destroy -rR $snap + + typeset data + for data in $file0 $file1; do + [[ -e $data ]] && $RM -f $data + done +} + +function testing_verify +{ + typeset ds=$1 + typeset ds_file=$2 + typeset snap_file=$3 + typeset c_ds=$4 + typeset c_file=$5 + typeset csnap_file=$6 + typeset origin_prop="" + + + snapexists $ds@$TESTSNAP && \ + log_fail "zfs promote cannot promote $ds@$TESTSNAP." + ! snapexists $c_ds@$TESTSNAP && \ + log_fail "The $c_ds@$TESTSNAP after zfs promote doesn't exist." + + origin_prop=$(get_prop origin $ds) + [[ "$origin_prop" != "$c_ds@$TESTSNAP" ]] && \ + log_fail "The dependency of $ds is not correct." + origin_prop=$(get_prop origin $c_ds) + [[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency of $c_ds is not correct." + + if [[ -e $snap_file ]] || [[ ! -e $csnap_file ]]; then + log_fail "Data file $snap_file cannot be correctly promoted." + fi + if [[ ! -e $ds_file ]] || [[ ! -e $c_file ]]; then + log_fail "There exists data file losing after zfs promote." + fi + + log_mustnot $ZFS destroy -r $c_ds +} + +log_assert "'zfs promote' can promote a clone filesystem." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +file0=$TESTDIR/$TESTFILE0 +file1=$TESTDIR/$TESTFILE1 +snap=$fs@$TESTSNAP +snapfile=$TESTDIR/$(get_snapdir_name)/$TESTSNAP/$TESTFILE0 +clone=$TESTPOOL/$TESTCLONE +cfile=/$clone/$CLONEFILE +csnap=$clone@$TESTSNAP +csnapfile=/$clone/$(get_snapdir_name)/$TESTSNAP/$TESTFILE0 + +# setup for promte testing +log_must $MKFILE $FILESIZE $file0 +log_must $ZFS snapshot $snap +log_must $MKFILE $FILESIZE $file1 +log_must $RM -f $file0 +log_must $ZFS clone $snap $clone +log_must $MKFILE $FILESIZE $cfile + +log_must $ZFS promote $clone +# verify the 'promote' operation +testing_verify $fs $file1 $snapfile $clone $cfile $csnapfile + +log_note "Verify 'zfs promote' can change back the dependency relationship." +log_must $ZFS promote $fs +#verify the result +testing_verify $clone $cfile $csnapfile $fs $file1 $snapfile + +log_pass "'zfs promote' reverses the clone parent-child dependency relationship"\ + "as expected." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_002_pos.ksh new file mode 100644 index 00000000000..32b033cd5f0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_002_pos.ksh @@ -0,0 +1,114 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_002_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_promote_002_pos +# +# DESCRIPTION: +# 'zfs promote' can deal with multiple snapshots in the origin filesystem. +# +# STRATEGY: +# 1. Create multiple snapshots and a clone of the last snapshot +# 2. Promote the clone filesystem +# 3. Verify the promoted filesystem included all snapshots +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists $csnap1; then + log_must $ZFS promote $fs + fi + + typeset ds + typeset data + for ds in $snap $snap1; do + log_must $ZFS destroy -rR $ds + done + for file in $TESTDIR/$TESTFILE0 $TESTDIR/$TESTFILE1; do + [[ -e $file ]] && $RM -f $file + done +} + +log_assert "'zfs promote' can deal with multiple snapshots in a filesystem." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +snap=$fs@$TESTSNAP +snap1=$fs@$TESTSNAP1 +clone=$TESTPOOL/$TESTCLONE +csnap=$clone@$TESTSNAP +csnap1=$clone@$TESTSNAP1 + +# setup for promote testing +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE0 +log_must $ZFS snapshot $snap +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE1 +log_must $RM -f $testdir/$TESTFILE0 +log_must $ZFS snapshot $snap1 +log_must $ZFS clone $snap1 $clone +log_must $MKFILE $FILESIZE /$clone/$CLONEFILE + +log_must $ZFS promote $clone + +# verify the 'promote' operation +for ds in $csnap $csnap1; do + ! snapexists $ds && \ + log_fail "Snapshot $ds doesn't exist after zfs promote." +done +for ds in $snap $snap1; do + snapexists $ds && \ + log_fail "Snapshot $ds is still there after zfs promote." +done + +origin_prop=$(get_prop origin $fs) +[[ "$origin_prop" != "$csnap1" ]] && \ + log_fail "The dependency of $fs is not correct." +origin_prop=$(get_prop origin $clone) +[[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency of $clone is not correct." + +log_pass "'zfs promote' deal with multiple snapshots as expected." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_003_pos.ksh new file mode 100644 index 00000000000..e23209893d3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_003_pos.ksh @@ -0,0 +1,146 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_003_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_promote_003_pos +# +# DESCRIPTION: +# 'zfs promote' can deal with multi-point snapshots. +# +# STRATEGY: +# 1. Create multiple snapshots and a clone to a middle point snapshot +# 2. Promote the clone filesystem +# 3. Verify the origin filesystem and promoted filesystem include +# correct datasets separated by the clone point. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists ${csnap[2]}; then + log_must $ZFS promote $fs + fi + + typeset ds + typeset data + for ds in ${snap[*]}; do + snapexists $ds && \ + log_must $ZFS destroy -rR $ds + done + for data in ${file[*]}; do + [[ -e $data ]] && $RM -f $data + done + +} + +log_assert "'zfs promote' can deal with multi-point snapshots." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +clone=$TESTPOOL/$TESTCLONE + +# Define some arrays here to use loop to reduce code amount + +# Array which stores the origin snapshots created in the origin filesystem +set -A snap "${fs}@$TESTSNAP" "${fs}@$TESTSNAP1" "${fs}@$TESTSNAP2" "${fs}@$TESTSNAP3" +# Array which stores the snapshots existing in the clone after promote operation +set -A csnap "${clone}@$TESTSNAP" "${clone}@$TESTSNAP1" "${clone}@$TESTSNAP2" \ + "${clone}@$TESTSNAP3" +# The data will inject into the origin filesystem +set -A file "$TESTDIR/$TESTFILE0" "$TESTDIR/$TESTFILE1" "$TESTDIR/$TESTFILE2" \ + "$TESTDIR/$TESTFILE3" +snapdir=$TESTDIR/$(get_snapdir_name) +# The data which will exist in the snapshot after creation of snapshot +set -A snapfile "$snapdir/$TESTSNAP/$TESTFILE0" "$snapdir/$TESTSNAP1/$TESTFILE1" \ + "$snapdir/$TESTSNAP2/$TESTFILE2" "$snapdir/$TESTSNAP3/$TESTFILE3" +csnapdir=/$clone/$(get_snapdir_name) +# The data which will exist in the snapshot of clone filesystem after promote +set -A csnapfile "${csnapdir}/$TESTSNAP/$TESTFILE0" "${csnapdir}/$TESTSNAP1/$TESTFILE1" \ + "${csnapdir}/$TESTSNAP2/$TESTFILE2" + +# setup for promote testing +typeset -i i=0 +while (( i < 4 )); do + log_must $MKFILE $FILESIZE ${file[i]} + (( i>0 )) && log_must $RM -f ${file[((i-1))]} + log_must $ZFS snapshot ${snap[i]} + + (( i = i + 1 )) +done +log_must $ZFS clone ${snap[2]} $clone +log_must $MKFILE $FILESIZE /$clone/$CLONEFILE +log_must $RM -f /$clone/$TESTFILE2 +log_must $ZFS snapshot ${csnap[3]} + +log_must $ZFS promote $clone + +# verify the 'promote' operation +for ds in ${snap[3]} ${csnap[*]}; do + ! snapexists $ds && \ + log_fail "The snapshot $ds disappear after zfs promote." +done +for data in ${csnapfile[*]} $TESTDIR/$TESTFILE3 /$clone/$CLONEFILE; do + [[ ! -e $data ]] && \ + log_fail "The data file $data loses after zfs promote." +done + +for ds in ${snap[0]} ${snap[1]} ${snap[2]}; do + snapexists $ds && \ + log_fail "zfs promote cannot promote the snapshot $ds." +done +for data in ${snapfile[0]} ${snapfile[1]} ${snapfile[2]}; do + [[ -e $data ]] && \ + log_fail "zfs promote cannot promote the data $data." +done + +origin_prop=$(get_prop origin $fs) +[[ "$origin_prop" != "${csnap[2]}" ]] && \ + log_fail "The dependency is not correct for $fs after zfs promote." +origin_prop=$(get_prop origin $clone) +[[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency is not correct for $clone after zfs promote." + +log_pass "'zfs promote' deal with multi-point snapshots as expected." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_004_pos.ksh new file mode 100644 index 00000000000..7407a6a29b2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_004_pos.ksh @@ -0,0 +1,152 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_004_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_promote_004_pos +# +# DESCRIPTION: +# 'zfs promote' can deal with multi-level clones. +# +# STRATEGY: +# 1. Create multiple snapshots and multi-level clones +# 2. Promote a clone filesystem +# 3. Verify the dataset dependency relationships are correct after promotion. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if snapexists ${c1snap[1]}; then + log_must $ZFS promote $clone + fi + + typeset ds + typeset data + for ds in ${snap[*]}; do + snapexists $ds && \ + log_must $ZFS destroy -rR $ds + done + for data in ${file[*]}; do + [[ -e $data ]] && $RM -f $data + done +} + +log_assert "'zfs promote' can deal with multi-level clone." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +clone=$TESTPOOL/$TESTCLONE +clone1=$TESTPOOL/$TESTCLONE1 + +# Define some arrays here to use loop to reduce code amount + +# Array which stores the origin snapshots created in the origin filesystem +set -A snap "${fs}@$TESTSNAP" "${fs}@$TESTSNAP1" "${fs}@$TESTSNAP2" "${fs}@$TESTSNAP3" +# Array which stores the snapshots existing in the first clone +set -A csnap "${clone}@$TESTSNAP3" "${clone}@$TESTSNAP4" "${clone}@$TESTSNAP5" +# Array which stores the snapshots existing in the second clone after promote operation +set -A c1snap "${clone1}@$TESTSNAP3" "${clone1}@$TESTSNAP4" "${clone1}@$TESTSNAP5" +# The data will inject into the origin filesystem +set -A file "$TESTDIR/$TESTFILE0" "$TESTDIR/$TESTFILE1" "$TESTDIR/$TESTFILE2" \ + "$TESTDIR/$TESTFILE3" +cdir=/$TESTPOOL/$TESTCLONE +# The data will inject into the first clone +set -A cfile "${cdir}/$CLONEFILE" "${cdir}/$CLONEFILE1" "${cdir}/$CLONEFILE2" +c1snapdir=/$TESTPOOL/$TESTCLONE1/$(get_snapdir_name) +# The data which will exist in the snapshot of the second clone filesystem after promote +set -A c1snapfile "${c1snapdir}/$TESTSNAP3/$CLONEFILE" \ + "${c1snapdir}/$TESTSNAP4/$CLONEFILE1" \ + "${c1snapdir}/$TESTSNAP5/$CLONEFILE2" + +# setup for promote testing +typeset -i i=0 +while (( i < 4 )); do + log_must $MKFILE $FILESIZE ${file[i]} + (( i>0 )) && log_must $RM -f ${file[((i-1))]} + log_must $ZFS snapshot ${snap[i]} + + (( i = i + 1 )) +done +log_must $ZFS clone ${snap[2]} $clone + +log_must $RM -f /$clone/$TESTFILE2 +i=0 +while (( i < 3 )); do + log_must $MKFILE $FILESIZE ${cfile[i]} + (( i>0 )) && log_must $RM -f ${cfile[(( i-1 ))]} + log_must $ZFS snapshot ${csnap[i]} + + (( i = i + 1 )) +done + +log_must $ZFS clone ${csnap[1]} $clone1 +log_must $MKFILE $FILESIZE /$clone1/$CLONEFILE2 +log_must $RM -f /$clone1/$CLONEFILE1 +log_must $ZFS snapshot ${c1snap[2]} + +log_must $ZFS promote $clone1 + +# verify the 'promote' operation +for ds in ${snap[*]} ${csnap[2]} ${c1snap[*]}; do + ! snapexists $ds && \ + log_fail "The snapshot $ds disappear after zfs promote." +done +for data in ${c1snapfile[*]}; do + [[ ! -e $data ]] && \ + log_fail "The data file $data loses after zfs promote." +done + +origin_prop=$(get_prop origin $fs) +[[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency is not correct for $fs after zfs promote." +origin_prop=$(get_prop origin $clone) +[[ "$origin_prop" != "${c1snap[1]}" ]] && \ + log_fail "The dependency is not correct for $clone after zfs promote." +origin_prop=$(get_prop origin $clone1) +[[ "$origin_prop" != "${snap[2]}" ]] && \ + log_fail "The dependency is not correct for $clone1 after zfs promote." + +log_pass "'zfs promote' deal with multi-level clones as expected." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_005_pos.ksh new file mode 100644 index 00000000000..dc7e09afa27 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_005_pos.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_005_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_promote_005_pos +# +# DESCRIPTION: +# The original fs was unmounted, 'zfs promote' still should succeed. +# +# STRATEGY: +# 1. Create pool, fs and snapshot. +# 2. Create clone of fs. +# 3. Unmount fs, then verify 'zfs promote' clone still succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $fssnap ; then + datasetexists $clone && log_must $ZFS destroy $clone + log_must $ZFS destroy $fssnap + fi + if datasetexists $clone ; then + log_must $ZFS promote $fs + log_must $ZFS destroy $clone + log_must $ZFS destroy $fssnap + fi +} + +log_assert "The original fs was unmounted, 'zfs promote' still should succeed." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +clone=$TESTPOOL/$TESTCLONE +fssnap=$fs@fssnap + +log_must $ZFS snapshot $fssnap +log_must $ZFS clone $fssnap $clone +log_must $ZFS unmount $fs +log_must $ZFS promote $clone +log_must $ZFS unmount $clone +log_must $ZFS promote $fs + +log_pass "Unmount original fs, 'zfs promote' passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_006_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_006_neg.ksh new file mode 100644 index 00000000000..0559e64d72d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_006_neg.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_006_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_promote_006_neg +# +# DESCRIPTION: +# 'zfs promote' will fail with invalid arguments: +# (1) NULL arguments +# (2) non-existent clone +# (3) non-clone datasets: +# pool, fs, snapshot,volume +# (4) too many arguments. +# (5) invalid options +# +# STRATEGY: +# 1. Create an array of invalid arguments +# 2. For each invalid argument in the array, 'zfs promote' should fail +# 3. Verify the return code from zfs promote +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +snap=$TESTPOOL/$TESTFS@$TESTSNAP +set -A args "" \ + "$TESTPOOL/blah" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$snap" \ + "$TESTPOOL/$TESTVOL" "$TESTPOL $TESTPOOL/$TESTFS" \ + "$clone $TESTPOOL/$TESTFS" "- $clone" "-? $clone" + +function cleanup +{ + if datasetexists $clone; then + log_must $ZFS destroy $clone + fi + + if snapexists $snap; then + destroy_snapshot $snap + fi +} + +log_assert "'zfs promote' will fail with invalid arguments. " +log_onexit cleanup + +snap=$TESTPOOL/$TESTFS@$TESTSNAP +clone=$TESTPOOL/$TESTCLONE +log_must $ZFS snapshot $snap +log_must $ZFS clone $snap $clone + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS promote ${args[i]} + + (( i = i + 1 )) +done + +log_pass "'zfs promote' fails with invalid argument as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_007_neg.ksh new file mode 100644 index 00000000000..306f316f7de --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_007_neg.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_007_neg.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_promote_007_neg +# +# DESCRIPTION: +# 'zfs promote' can deal with conflicts in the namespaces. +# +# STRATEGY: +# 1. Create a snapshot and a clone of the snapshot +# 2. Create the same name snapshot for the clone +# 3. Promote the clone filesystem +# 4. Verify the promote operation fail due to the name conflicts. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-05-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + snapexists $snap && \ + log_must $ZFS destroy -rR $snap + + typeset data + for data in $TESTDIR/$TESTFILE0 $TESTDIR/$TESTFILE1; do + [[ -e $data ]] && $RM -f $data + done +} + +log_assert "'zfs promote' can deal with name conflicts." +log_onexit cleanup + +snap=$TESTPOOL/$TESTFS@$TESTSNAP +clone=$TESTPOOL/$TESTCLONE +clonesnap=$TESTPOOL/$TESTCLONE@$TESTSNAP + +# setup for promte testing +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE0 +log_must $ZFS snapshot $snap +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE1 +log_must $RM -f $TESTDIR/$TESTFILE0 +log_must $ZFS clone $snap $clone +log_must $MKFILE $FILESIZE /$clone/$CLONEFILE +log_must $ZFS snapshot $clonesnap + +log_mustnot $ZFS promote $clone + +log_pass "'zfs promote' deals with name conflicts as expected." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_008_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_008_pos.ksh new file mode 100644 index 00000000000..f20a29c2eb8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_008_pos.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_008_pos.ksh 1.1 07/05/25 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_promote_008_pos +# +# DESCRIPTION: +# 'zfs promote' can successfully promote a volume clone. +# +# STRATEGY: +# 1. Create a volume clone +# 2. Promote the volume clone +# 3. Verify the dependency changed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-02-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if snapexists $csnap; then + log_must $ZFS promote $vol + fi + + log_must $ZFS destroy -rR $snap +} + +log_assert "'zfs promote' can promote a volume clone." +log_onexit cleanup + +vol=$TESTPOOL/$TESTVOL +snap=$vol@$TESTSNAP +clone=$TESTPOOL/volclone +csnap=$clone@$TESTSNAP + +if ! snapexists $snap ; then + log_must $ZFS snapshot $snap + log_must $ZFS clone $snap $clone +fi + +log_must $ZFS promote $clone + +# verify the 'promote' operation +! snapexists $csnap && \ + log_fail "Snapshot $csnap doesn't exist after zfs promote." +snapexists $snap && \ + log_fail "Snapshot $snap is still there after zfs promote." + +origin_prop=$(get_prop origin $vol) +[[ "$origin_prop" != "$csnap" ]] && \ + log_fail "The dependency of $vol is not correct." +origin_prop=$(get_prop origin $clone) +[[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency of $clone is not correct." + +log_pass "'zfs promote' can promote volume clone as expected." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_common.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_common.kshlib new file mode 100644 index 00000000000..26b5e64d438 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_common.kshlib @@ -0,0 +1,48 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_common.kshlib 1.3 07/03/14 SMI" +# + +# +# Check whether the operating filesystem support 'zfs promote' or not +# +function unsupport_check +{ + typeset srch_str="unrecognized command" + typeset tmpout=$TMPDIR/tmpout.${TESTCASE_ID} + typeset -i ret + + $ZFS promote >$tmpout 2>&1 + $GREP "$srch_str" $tmpout >/dev/null 2>&1 + ret=$? + + $RM -f $tmpout + + return $ret +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_test.sh new file mode 100755 index 00000000000..bfea7b496ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_promote/zfs_promote_test.sh @@ -0,0 +1,248 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_promote_001_pos cleanup +zfs_promote_001_pos_head() +{ + atf_set "descr" "'zfs promote' can promote a clone filesystem." + atf_set "require.progs" zfs +} +zfs_promote_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_promote_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_promote_002_pos cleanup +zfs_promote_002_pos_head() +{ + atf_set "descr" "'zfs promote' can deal with multiple snapshots in a filesystem." + atf_set "require.progs" zfs +} +zfs_promote_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_promote_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_promote_003_pos cleanup +zfs_promote_003_pos_head() +{ + atf_set "descr" "'zfs promote' can deal with multi-point snapshots." + atf_set "require.progs" zfs +} +zfs_promote_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_promote_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_promote_004_pos cleanup +zfs_promote_004_pos_head() +{ + atf_set "descr" "'zfs promote' can deal with multi-level clone." + atf_set "require.progs" zfs +} +zfs_promote_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_promote_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_promote_005_pos cleanup +zfs_promote_005_pos_head() +{ + atf_set "descr" "The original fs was unmounted, 'zfs promote' still should succeed." + atf_set "require.progs" zfs +} +zfs_promote_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_promote_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_promote_006_neg cleanup +zfs_promote_006_neg_head() +{ + atf_set "descr" "'zfs promote' will fail with invalid arguments." + atf_set "require.progs" zfs +} +zfs_promote_006_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_006_neg.ksh || atf_fail "Testcase failed" +} +zfs_promote_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_promote_007_neg cleanup +zfs_promote_007_neg_head() +{ + atf_set "descr" "'zfs promote' can deal with name conflicts." + atf_set "require.progs" zfs +} +zfs_promote_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_promote_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_promote_008_pos cleanup +zfs_promote_008_pos_head() +{ + atf_set "descr" "'zfs promote' can promote a volume clone." + atf_set "require.progs" zfs +} +zfs_promote_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_008_pos.ksh || atf_fail "Testcase failed" +} +zfs_promote_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_promote_common.kshlib + . $(atf_get_srcdir)/zfs_promote.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_promote_001_pos + atf_add_test_case zfs_promote_002_pos + atf_add_test_case zfs_promote_003_pos + atf_add_test_case zfs_promote_004_pos + atf_add_test_case zfs_promote_005_pos + atf_add_test_case zfs_promote_006_neg + atf_add_test_case zfs_promote_007_neg + atf_add_test_case zfs_promote_008_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_property/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/Makefile new file mode 100644 index 00000000000..5db427eb06b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_property +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_property_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_set_property_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_property.cfg +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_property/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_property/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_property.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_property.cfg new file mode 100644 index 00000000000..2a02aa1f2f1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_property.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_property.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_property_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_property_test.sh new file mode 100755 index 00000000000..6f01d23d496 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_property_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_set_property_001_pos cleanup +zfs_set_property_001_pos_head() +{ + atf_set "descr" "Verify each of the file system properties." + atf_set "require.progs" zfs +} +zfs_set_property_001_pos_body() +{ + atf_skip "Due to changing zfs ls output, test needs a re-write." + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_property.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_set_property_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_set_property_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_property.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_set_property_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_set_property_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_set_property_001_pos.ksh new file mode 100644 index 00000000000..0eb1257f7e8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_property/zfs_set_property_001_pos.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_set_property_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_set_property_001_pos +# +# DESCRIPTION: +# For each property verify that it accepts on/off/inherit. +# +# STRATEGY: +# 1. Create an array of properties. +# 2. Create an array of possible values. +# 3. For each property set to every possible value. +# 4. Verify success is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A options "on" "off" "inherit" +set -A args "compression" "checksum" "mutable" "atime" + +log_assert "Verify each of the file system properties." + +log_untested "Due to changing zfs ls output, test needs a re-write." + +typeset -i i=0 +typeset -i j=0 + +while [[ $i -lt ${#args[*]} ]]; do + j=0 + while [[ $j -lt ${#options[*]} ]]; do + log_must $ZFS ${args[i]}=${options[j]} $TESTPOOL/$TESTFS + + $ZFS ls -L | $GREP "${args[i]}" | $GREP "${options[j]}" + [[ $? -ne 0 ]] && \ + log_fail "Unable to verify ${args[i]}=${options[j]}" + + log_note "Verified ${args[i]}=${options[j]}" + + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "zfs properties were set correctly." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/Makefile new file mode 100644 index 00000000000..b20acbe4700 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/Makefile @@ -0,0 +1,26 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_receive +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_receive_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_receive_004_neg.ksh +${PACKAGE}FILES+= zfs_receive_001_pos.ksh +${PACKAGE}FILES+= zfs_receive_009_neg.ksh +${PACKAGE}FILES+= zfs_receive_005_neg.ksh +${PACKAGE}FILES+= zfs_receive_008_pos.ksh +${PACKAGE}FILES+= zfs_receive.cfg +${PACKAGE}FILES+= zfs_receive_007_neg.ksh +${PACKAGE}FILES+= zfs_receive_002_pos.ksh +${PACKAGE}FILES+= zfs_receive_006_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_receive_003_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/cleanup.ksh new file mode 100644 index 00000000000..db372c2000f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/setup.ksh new file mode 100644 index 00000000000..6d380766a3a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/setup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} +if is_global_zone; then + default_volume_setup $DISK +else + default_setup $DISK +fi diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive.cfg new file mode 100644 index 00000000000..a32b4ed6765 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive.cfg @@ -0,0 +1,36 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export PARTSIZE=1g +export BLOCK_SIZE=512 +export WRITE_COUNT=8 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_001_pos.ksh new file mode 100644 index 00000000000..aa816885dc4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_001_pos.ksh @@ -0,0 +1,188 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_001_pos.ksh 1.4 08/02/27 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_001_pos +# +# DESCRIPTION: +# Verifying 'zfs receive [] -d ' works. +# +# STRATEGY: +# 1. Fill in fs with some data +# 2. Create full and incremental send stream +# 3. Receive the send stream +# 4. Verify the restoring results. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-06) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset -i i=0 + + datasetexists $rst_root && \ + log_must $ZFS destroy -Rf $rst_root + while (( i < 2 )); do + snapexists ${orig_snap[$i]} && \ + log_must $ZFS destroy -f ${orig_snap[$i]} + log_must $RM -f ${bkup[$i]} + + (( i = i + 1 )) + done + + log_must $RM -rf $TESTDIR1 +} + +function recreate_root +{ + datasetexists $rst_root && \ + log_must $ZFS destroy -Rf $rst_root + if [[ -d $TESTDIR1 ]] ; then + log_must $RM -rf $TESTDIR1 + fi + log_must $ZFS create $rst_root + log_must $ZFS set mountpoint=$TESTDIR1 $rst_root +} + +log_assert "Verifying 'zfs receive [] -d ' works." +log_onexit cleanup + +typeset datasets="$TESTPOOL/$TESTFS $TESTPOOL" +set -A bkup "$TMPDIR/fullbkup" "$TMPDIR/incbkup" +orig_sum="" +rst_sum="" +rst_root=$TESTPOOL/rst_ctr +rst_fs=${rst_root}/$TESTFS + +for orig_fs in $datasets ; do + # + # Preparations for testing + # + recreate_root + + set -A orig_snap "${orig_fs}@init_snap" "${orig_fs}@inc_snap" + typeset mntpnt=$(get_prop mountpoint ${orig_fs}) + set -A orig_data "${mntpnt}/$TESTFILE1" "${mntpnt}/$TESTFILE2" + + typeset relative_path="" + if [[ ${orig_fs} == *"/"* ]]; then + relative_path=${orig_fs#*/} + fi + + typeset leaf_fs=${rst_root}/${relative_path} + leaf_fs=${leaf_fs%/} + rst_snap=${leaf_fs}@snap + + set -A rst_snap "$rst_root/$TESTFS@init_snap" "$rst_root/$TESTFS@inc_snap" + set -A rst_snap2 "${leaf_fs}@init_snap" "${leaf_fs}@inc_snap" + set -A rst_data "$TESTDIR1/$TESTFS/$TESTFILE1" "$TESTDIR1/$TESTFS/$TESTFILE2" + set -A rst_data2 "$TESTDIR1/${relative_path}/$TESTFILE1" "$TESTDIR1/${relative_path}/$TESTFILE2" + + typeset -i i=0 + while (( i < ${#orig_snap[*]} )); do + log_must $FILE_WRITE -o create -f ${orig_data[$i]} \ + -b $BLOCK_SIZE -c $WRITE_COUNT + log_must $ZFS snapshot ${orig_snap[$i]} + if (( i < 1 )); then + log_must eval "$ZFS send ${orig_snap[$i]} > ${bkup[$i]}" + else + log_must eval "$ZFS send -i ${orig_snap[(( i - 1 ))]} \ + ${orig_snap[$i]} > ${bkup[$i]}" + fi + + (( i = i + 1 )) + done + + log_note "Verifying 'zfs receive ' works." + i=0 + while (( i < ${#bkup[*]} )); do + if (( i > 0 )); then + log_must $ZFS rollback ${rst_snap[0]} + fi + log_must eval "$ZFS receive $rst_fs < ${bkup[$i]}" + snapexists ${rst_snap[$i]} || \ + log_fail "Restoring filesystem fails. ${rst_snap[$i]} not exist" + compare_cksum ${orig_data[$i]} ${rst_data[$i]} + + (( i = i + 1 )) + done + + log_must $ZFS destroy -Rf $rst_fs + + log_note "Verifying 'zfs receive ' works." + i=0 + while (( i < ${#bkup[*]} )); do + if (( i > 0 )); then + log_must $ZFS rollback ${rst_snap[0]} + fi + log_must eval "$ZFS receive ${rst_snap[$i]} <${bkup[$i]}" + snapexists ${rst_snap[$i]} || \ + log_fail "Restoring filesystem fails. ${rst_snap[$i]} not exist" + compare_cksum ${orig_data[$i]} ${rst_data[$i]} + + (( i = i + 1 )) + done + + log_must $ZFS destroy -Rf $rst_fs + + log_note "Verfiying 'zfs receive -d ' works." + + i=0 + while (( i < ${#bkup[*]} )); do + if (( i > 0 )); then + log_must $ZFS rollback ${rst_snap2[0]} + fi + log_must eval "$ZFS receive -d -F $rst_root <${bkup[$i]}" + snapexists ${rst_snap2[$i]} || \ + log_fail "Restoring filesystem fails. ${rst_snap2[$i]} not exist" + compare_cksum ${orig_data[$i]} ${rst_data2[$i]} + + (( i = i + 1 )) + done + + cleanup +done + +log_pass "Verifying 'zfs receive [] -d ' succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_002_pos.ksh new file mode 100644 index 00000000000..53a3199985d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_002_pos.ksh @@ -0,0 +1,122 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_002_pos +# +# DESCRIPTION: +# Verifying 'zfs receive ' works. +# +# STRATEGY: +# 1. Fill in volume with some data +# 2. Create full and incremental send stream +# 3. Restore the send stream +# 4. Verify the restoring results. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-06) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset -i i=0 + typeset ds + + while (( i < ${#orig_snap[*]} )); do + snapexists ${rst_snap[$i]} && \ + log_must $ZFS destroy -f ${rst_snap[$i]} + snapexists ${orig_snap[$i]} && \ + log_must $ZFS destroy -f ${orig_snap[$i]} + [[ -e ${bkup[$i]} ]] && \ + log_must $RM -rf ${bkup[$i]} + + (( i = i + 1 )) + done + + for ds in $rst_vol $rst_root; do + datasetexists $ds && \ + log_must $ZFS destroy -Rf $ds + done +} + +log_assert "Verifying 'zfs receive ' works." +log_onexit cleanup + +set -A orig_snap "$TESTPOOL/$TESTVOL@init_snap" "$TESTPOOL/$TESTVOL@inc_snap" +set -A bkup "$TMPDIR/fullbkup" "$TMPDIR/incbkup" +rst_root=$TESTPOOL/rst_ctr +rst_vol=$rst_root/$TESTVOL +set -A rst_snap "${rst_vol}@init_snap" "${rst_vol}@inc_snap" + +# +# Preparations for testing +# +log_must $ZFS create $rst_root +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 +log_must $ZFS set mountpoint=$TESTDIR1 $rst_root + +typeset -i i=0 +while (( i < ${#orig_snap[*]} )); do + log_must $ZFS snapshot ${orig_snap[$i]} + if (( i < 1 )); then + log_must eval "$ZFS send ${orig_snap[$i]} > ${bkup[$i]}" + else + log_must eval "$ZFS send -i ${orig_snap[(( i - 1 ))]} \ + ${orig_snap[$i]} > ${bkup[$i]}" + fi + + (( i = i + 1 )) +done + +i=0 +while (( i < ${#bkup[*]} )); do + log_must eval "$ZFS receive $rst_vol < ${bkup[$i]}" + ! datasetexists $rst_vol || ! snapexists ${rst_snap[$i]} && \ + log_fail "Restoring volume fails." + + (( i = i + 1 )) +done + +log_pass "Verifying 'zfs receive ' succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_003_pos.ksh new file mode 100644 index 00000000000..7bc33516d25 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_003_pos.ksh @@ -0,0 +1,107 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_003_pos +# +# DESCRIPTION: +# 'zfs recv -F' to force rollback. +# +# STRATEGY: +# 1. Create pool and fs. +# 2. Create some files in fs and take a snapshot1. +# 3. Create another files in fs and take snapshot2. +# 4. Create incremental stream from snapshot1 to snapshot2. +# 5. fs rollback to snapshot1 and modify fs. +# 6. Verify 'zfs recv -F' can force rollback. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for snap in $snap2 $snap1; do + datasetexists $snap && log_must $ZFS destroy -rf $snap + done + for file in $ibackup $mntpnt/file1 $mntpnt/file2; do + [[ -f $file ]] && log_must $RM -f $file + done +} + +log_assert "'zfs recv -F' to force rollback." +log_onexit cleanup + +ibackup=$TMPDIR/ibackup.${TESTCASE_ID} +fs=$TESTPOOL/$TESTFS; snap1=$fs@snap1; snap2=$fs@snap2 + +mntpnt=$(get_prop mountpoint $fs) || log_fail "get_prop mountpoint $fs" +log_must $MKFILE 10m $mntpnt/file1 +log_must $ZFS snapshot $snap1 +log_must $MKFILE 10m $mntpnt/file2 +log_must $ZFS snapshot $snap2 + +log_must eval "$ZFS send -i $snap1 $snap2 > $ibackup" + +log_note "Verify 'zfs receive' succeed, if filesystem was not modified." +log_must $ZFS rollback -r $snap1 +log_must eval "$ZFS receive $fs < $ibackup" +if [[ ! -f $mntpnt/file1 || ! -f $mntpnt/file2 ]]; then + log_fail "'$ZFS receive' failed." +fi + +log_note "Verify 'zfs receive' failed if filesystem was modified." +log_must $ZFS rollback -r $snap1 +log_must $RM -rf $mntpnt/file1 +log_mustnot eval "$ZFS receive $fs < $ibackup" + +# Verify 'zfs receive -F' to force rollback whatever filesystem was modified. +log_must $ZFS rollback -r $snap1 +log_must $RM -rf $mntpnt/file1 +log_must eval "$ZFS receive -F $fs < $ibackup" +if [[ ! -f $mntpnt/file1 || ! -f $mntpnt/file2 ]]; then + log_fail "'$ZFS receive -F' failed." +fi + +log_pass "'zfs recv -F' to force rollback passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_004_neg.ksh new file mode 100644 index 00000000000..1dedd43c9e4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_004_neg.ksh @@ -0,0 +1,119 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_004_neg.ksh 1.4 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_004_neg +# +# DESCRIPTION: +# Verify 'zfs receive' fails with malformed parameters. +# +# STRATEGY: +# 1. Denfine malformed parameters array +# 2. Feed the malformed parameters to 'zfs receive' +# 3. Verify the command should be failed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-06) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset snap + typeset bkup + + for snap in $init_snap $inc_snap $init_topsnap $inc_topsnap ; do + snapexists $snap && \ + log_must $ZFS destroy -Rf $snap + done + + for bkup in $full_bkup $inc_bkup $full_topbkup $inc_topbkup; do + [[ -e $bkup ]] && \ + log_must $RM -f $bkup + done +} + +log_assert "Verify that invalid parameters to 'zfs receive' are caught." +log_onexit cleanup + +init_snap=$TESTPOOL/$TESTFS@initsnap +inc_snap=$TESTPOOL/$TESTFS@incsnap +full_bkup=$TMPDIR/full_bkup.${TESTCASE_ID} +inc_bkup=$TMPDIR/inc_bkup.${TESTCASE_ID} + +init_topsnap=$TESTPOOL@initsnap +inc_topsnap=$TESTPOOL@incsnap +full_topbkup=$TMPDIR/full_topbkup.${TESTCASE_ID} +inc_topbkup=$TMPDIR/inc_topbkup.${TESTCASE_ID} + +log_must $ZFS snapshot $init_topsnap +log_must eval "$ZFS send $init_topsnap > $full_topbkup" + +log_must $ZFS snapshot $inc_topsnap +log_must eval "$ZFS send -i $init_topsnap $inc_topsnap > $inc_topbkup" + +log_must $ZFS snapshot $init_snap +log_must eval "$ZFS send $init_snap > $full_bkup" + +log_must $ZFS snapshot $inc_snap +log_must eval "$ZFS send -i $init_snap $inc_snap > $inc_bkup" + +set -A badargs \ + "" "nonexistent-snap" "blah@blah" "$snap1" "$snap1 $snap2" \ + "-d" "-d nonexistent-dataset" \ + "$TESTPOOL/fs@" "$TESTPOOL/fs@@mysnap" "$TESTPOOL/fs@@" \ + "$TESTPOOL/fs/@mysnap" "$TESTPOOL/fs@/mysnap" \ + "$TESTPOOL/nonexistent-fs/nonexistent-fs" \ + "-d $TESTPOOL/nonexistent-fs" "-d $TESTPOOL/$TESTFS/nonexistent-fs" + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + for bkup in $full_bkup $inc_bkup $full_topbkup $inc_topbkup ; do + log_mustnot eval "$ZFS receive ${badargs[i]} < $bkup" + done + + (( i = i + 1 )) +done + +log_pass "Invalid parameters to 'zfs receive' are caught as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_005_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_005_neg.ksh new file mode 100644 index 00000000000..c7cb20bb1fe --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_005_neg.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_005_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_005_neg +# +# DESCRIPTION: +# Verify 'zfs receive' fails with unsupported scenarios. +# including: +# (1) Invalid send streams; +# (2) The received incremental send doesn't match the filesystem +# latest status. +# +# STRATEGY: +# 1. Preparation for unsupported scenarios +# 2. Execute 'zfs receive' +# 3. Verify the results are failed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-06) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset snap + typeset bkup + + for snap in $init_snap $inc_snap; do + snapexists $snap && \ + log_must $ZFS destroy -f $snap + done + + datasetexists $rst_root && \ + log_must $ZFS destroy -Rf $rst_root + + for bkup in $full_bkup $inc_bkup; do + [[ -e $bkup ]] && \ + log_must $RM -f $bkup + done +} + +log_assert "Verify 'zfs receive' fails with unsupported scenarios." +log_onexit cleanup + +init_snap=$TESTPOOL/$TESTFS@initsnap +inc_snap=$TESTPOOL/$TESTFS@incsnap +rst_root=$TESTPOOL/rst_ctr +rst_init_snap=$rst_root/$TESTFS@init_snap +rst_inc_snap=$rst_root/$TESTFS@inc_snap +full_bkup=$TMPDIR/full_bkup.${TESTCASE_ID} +inc_bkup=$TMPDIR/inc_bkup.${TESTCASE_ID} + +log_must $ZFS create $rst_root +log_must $ZFS snapshot $init_snap +log_must eval "$ZFS send $init_snap > $full_bkup" + +log_note "'zfs receive' fails with invalid send streams." +log_mustnot eval "$ZFS receive $rst_init_snap < /dev/zero" +log_mustnot eval "$ZFS receive -d $rst_root $inc_bkup" +#make changes on the restoring filesystem +log_must $TOUCH $ZFSROOT/$rst_root/$TESTFS/tmpfile +log_mustnot eval "$ZFS receive $rst_inc_snap < $inc_bkup" +log_mustnot eval "$ZFS receive -d $rst_root < $inc_bkup" + +log_pass "Unsupported scenarios to 'zfs receive' fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_006_pos.ksh new file mode 100644 index 00000000000..b3512e129a1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_006_pos.ksh @@ -0,0 +1,122 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_006_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_006_pos +# +# DESCRIPTION: +# 'zfs recv -d ' should create ancestor filesystem if it does not +# exist and it should not fail if it exists +# +# STRATEGY: +# 1. Create pool and fs. +# 2. Create some files in fs and take snapshots. +# 3. Keep the stream and restore the stream to the pool +# 4. Verify receiving the stream succeeds, and the ancestor filesystem +# is created if it did not exist +# 5. Verify receiving the stream still succeeds when ancestor filesystem +# exists +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for snap in $snap2 $snap1; do + datasetexists $snap && log_must $ZFS destroy -rf $snap + done + for file in $fbackup1 $fbackup2 $mntpnt/file1 $mntpnt/file2; do + [[ -f $file ]] && log_must $RM -f $file + done + + if is_global_zone; then + datasetexists $TESTPOOL/$TESTFS/$TESTFS1 && \ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS/$TESTFS1 + else + datasetexists $TESTPOOL/${ZONE_CTR}0 && \ + log_must $ZFS destroy -rf $TESTPOOL/${ZONE_CTR}0 + fi + +} + +log_assert "'zfs recv -d ' should succeed no matter ancestor filesystem \ + exists." +log_onexit cleanup + +ancestor_fs=$TESTPOOL/$TESTFS +fs=$TESTPOOL/$TESTFS/$TESTFS1 +snap1=$fs@snap1 +snap2=$fs@snap2 +fbackup1=$TMPDIR/fbackup1.${TESTCASE_ID} +fbackup2=$TMPDIR/fbackup2.${TESTCASE_ID} + +datasetexists $ancestor_fs || \ + log_must $ZFS create $ancestor_fs +log_must $ZFS create $fs + +mntpnt=$(get_prop mountpoint $fs) || log_fail "get_prop mountpoint $fs" +log_must $MKFILE 10m $mntpnt/file1 +log_must $ZFS snapshot $snap1 +log_must $MKFILE 10m $mntpnt/file2 +log_must $ZFS snapshot $snap2 + +log_must eval "$ZFS send $snap1 > $fbackup1" +log_must eval "$ZFS send $snap2 > $fbackup2" + +log_note "Verify 'zfs receive -d' succeed and create ancestor filesystem \ + if it did not exist. " +log_must $ZFS destroy -rf $ancestor_fs +log_must eval "$ZFS receive -d $TESTPOOL < $fbackup1" +is_global_zone || ancestor_fs=$TESTPOOL/${ZONE_CTR}0/$TESTFS +datasetexists $ancestor_fs || \ + log_fail "ancestor filesystem is not created" + +log_note "Verify 'zfs receive -d' still succeed if ancestor filesystem exists" +is_global_zone || fs=$TESTPOOL/${ZONE_CTR}0/$TESTFS/$TESTFS1 +log_must $ZFS destroy -rf $fs +log_must eval "$ZFS receive -d $TESTPOOL < $fbackup2" + +log_pass "'zfs recv -d ' should succeed no matter ancestor filesystem \ + exists." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_007_neg.ksh new file mode 100644 index 00000000000..cb7ac0bcc52 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_007_neg.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_007_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_007_neg +# +# DESCRIPTION: +# 'zfs recv -F' should fail if the incremental stream does not match +# +# STRATEGY: +# 1. Create pool and fs. +# 2. Create some files in fs and take snapshots. +# 3. Keep the incremental stream and restore the stream to the pool +# 4. Verify receiving the stream fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for snap in $snap2 $snap1; do + datasetexists $snap && log_must $ZFS destroy -rf $snap + done + for file in $ibackup $mntpnt/file1 $mntpnt/file2; do + [[ -f $file ]] && log_must $RM -f $file + done +} + +log_assert "'zfs recv -F' should fail if the incremental stream does not match" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +snap1=$fs@snap1 +snap2=$fs@snap2 +ibackup=$TMPDIR/ibackup.${TESTCASE_ID} + +datasetexists $fs || log_must $ZFS create $fs + +mntpnt=$(get_prop mountpoint $fs) || log_fail "get_prop mountpoint $fs" +log_must $MKFILE 10m $mntpnt/file1 +log_must $ZFS snapshot $snap1 +log_must $MKFILE 10m $mntpnt/file2 +log_must $ZFS snapshot $snap2 + +log_must eval "$ZFS send -i $snap1 $snap2 > $ibackup" + +log_must $ZFS destroy $snap1 +log_must $ZFS destroy $snap2 +log_mustnot eval "$ZFS receive -F $fs < $ibackup" + +log_must $MKFILE 20m $mntpnt/file1 +log_must $RM -rf $mntpnt/file2 +log_must $ZFS snapshot $snap1 +log_mustnot eval "$ZFS receive -F $snap2 < $ibackup" + +log_pass "'zfs recv -F' should fail if the incremental stream does not match" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_008_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_008_pos.ksh new file mode 100644 index 00000000000..bd4865d9a94 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_008_pos.ksh @@ -0,0 +1,162 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_008_pos.ksh 1.3 08/02/27 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_008_pos +# +# DESCRIPTION: +# Verifying 'zfs receive -vn [] +# and zfs receive -vn -d ' +# +# STRATEGY: +# 1. Fill in fs with some data +# 2. Create full and incremental send stream +# 3. run zfs receive with -v option +# 3. Dryrun zfs receive with -vn option +# 3. Dryrun zfs receive with -vn -d option +# 4. Verify receive output and result +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-14) +# +# __stc_assertion_end +# +################################################################################ +function cleanup +{ + for dset in $rst_snap $rst_fs $orig_snap; do + if datasetexists $dset; then + log_must $ZFS destroy -fr $dset + fi + done + + for file in $fbackup $mnt_file $tmp_out; do + if [[ -f $file ]]; then + log_must $RM -f $file + fi + done + + if datasetexists $TESTPOOL/$TESTFS; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + fi +} + +verify_runnable "both" +log_assert "Verifying 'zfs receive -vn [] " \ + "and zfs receive -vn -d '" + +log_onexit cleanup + +typeset datasets="$TESTPOOL/$TESTFS $TESTPOOL" +typeset rst_fs=$TESTPOOL/$TESTFS/$TESTFS +typeset fbackup=$TMPDIR/fbackup.${TESTCASE_ID} +typeset tmp_out=$TMPDIR/tmpout.${TESTCASE_ID} + +for orig_fs in $datasets ; do + typeset rst_snap=$rst_fs@snap + typeset orig_snap=$orig_fs@snap + typeset verb_msg="receiving full stream of ${orig_snap} into ${rst_snap}" + typeset dryrun_msg="would receive full stream of ${orig_snap} into ${rst_snap}" + + if ! datasetexists $orig_fs; then + log_must $ZFS create $orig_fs + fi + + typeset mntpnt + mntpnt=$(get_prop mountpoint $orig_fs) + if [[ $? -ne 0 ]] ; then + log_fail "get_prop mountpoint $orig_fs failed" + fi + + typeset mnt_file=$mntpnt/file1 + + log_must $MKFILE 100m $mnt_file + log_must $ZFS snapshot $orig_snap + log_must eval "$ZFS send $orig_snap > $fbackup" + + for opt in "-v" "-vn"; do + if datasetexists $rst_fs; then + log_must $ZFS destroy -fr $rst_fs + fi + log_note "Check ZFS receive $opt []" + log_must eval "$ZFS receive $opt $rst_fs < $fbackup > $tmp_out 2>&1" + if [[ $opt == "-v" ]]; then + log_must eval "$GREP \"$verb_msg\" $tmp_out >/dev/null 2>&1" + if ! datasetexists $rst_snap; then + log_fail "dataset was not received, even though the"\ + " -v flag was used." + fi + else + log_must eval "$GREP \"$dryrun_msg\" $tmp_out >/dev/null 2>&1" + if datasetexists $rst_snap; then + log_fail "dataset was received, even though the -nv"\ + " flag was used." + fi + fi + done + + log_note "Check ZFS receive -vn -d " + if ! datasetexists $rst_fs; then + log_must $ZFS create $rst_fs + fi + log_must eval "$ZFS receive -vn -d -F $rst_fs <$fbackup >$tmp_out 2>&1" + typeset relative_path="" + if [[ ${orig_fs} == *"/"* ]]; then + relative_path=${orig_fs#*/} + fi + + typeset leaf_fs=${rst_fs}/${relative_path} + leaf_fs=${leaf_fs%/} + rst_snap=${leaf_fs}@snap + dryrun_msg="would receive full stream of ${orig_snap} into ${rst_snap}" + + log_must eval "$GREP \"$dryrun_msg\" $tmp_out > /dev/null 2>&1" + + if datasetexists $rst_snap; then + log_fail "dataset $rst_snap should not existed." + fi + log_must $ZFS destroy -Rf $rst_fs + + cleanup +done + +log_pass "zfs receive -vn [] and " \ + "zfs receive -vn -d ' succeed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_009_neg.ksh new file mode 100644 index 00000000000..df86deed267 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_009_neg.ksh @@ -0,0 +1,132 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_009_neg.ksh 1.2 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_receive_009_neg +# +# DESCRIPTION: +# Verify 'zfs receive' fails with bad options, missing argument or too many +# arguments. +# +# STRATEGY: +# 1. Set a array of illegal arguments +# 2. Execute 'zfs receive' with illegal arguments +# 3. Verify the command should be failed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset ds + + if snapexists $snap; then + log_must $ZFS destroy $snap + fi + for ds in $ctr1 $ctr2 $fs1; do + if datasetexists $ds; then + log_must $ZFS destroy -rf $ds + fi + done + if [[ -d $TESTDIR2 ]]; then + $RM -rf $TESTDIR2 + fi +} + +log_assert "Verify 'zfs receive' fails with bad option, missing or too many arguments" +log_onexit cleanup + +set -A badopts "v" "n" "F" "d" "-V" "-N" "-f" "-D" "-VNfD" "-vNFd" "-vnFD" "-dVnF" \ + "-vvvNfd" "-blah" "-12345" "-?" "-*" "-%" +set -A validopts "" "-v" "-n" "-F" "-vn" "-nF" "-vnF" "-vd" "-nd" "-Fd" "-vnFd" + +ctr1=$TESTPOOL/$TESTCTR1 +ctr2=$TESTPOOL/$TESTCTR2 +fs1=$TESTPOOL/$TESTFS1 +fs2=$TESTPOOL/$TESTFS2 +fs3=$TESTPOOL/$TESTFS3 +snap=$TESTPOOL/$TESTFS@$TESTSNAP +bkup=$TESTDIR2/bkup.${TESTCASE_ID} + +# Preparations for negative testing +for ctr in $ctr1 $ctr2; do + log_must $ZFS create $ctr +done +if [[ -d $TESTDIR2 ]]; then + $RM -rf $TESTDIR2 +fi +log_must $ZFS create -o mountpoint=$TESTDIR2 $fs1 +log_must $ZFS snapshot $snap +log_must eval "$ZFS send $snap > $bkup" + +#Testing zfs receive fails with input from terminal +log_mustnot eval "$ZFS recv $fs3 /dev/null 2>&1 + if (( $? != 0 )); then + log_mustnot eval "$ZFS recv ${validopts[i]} $fs2 $fs3 < $bkup" + else + log_mustnot eval "$ZFS recv ${validopts[i]} $ctr1 $ctr2 < $bkup" + fi + + (( i += 1 )) +done + +# Testing with bad options +i=0 +while (( i < ${#badopts[*]} )) +do + log_mustnot eval "$ZFS recv ${badopts[i]} $ctr1 < $bkup" + log_mustnot eval "$ZFS recv ${badopts[i]} $fs2 < $bkup" + + (( i = i + 1 )) +done + +log_pass "'zfs receive' as expected with bad options, missing or too many arguments." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_test.sh new file mode 100755 index 00000000000..6fe927fae82 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_receive/zfs_receive_test.sh @@ -0,0 +1,257 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_receive_001_pos cleanup +zfs_receive_001_pos_head() +{ + atf_set "descr" "Verifying 'zfs receive [] -d ' works." + atf_set "require.progs" zfs +} +zfs_receive_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_receive_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_002_pos cleanup +zfs_receive_002_pos_head() +{ + atf_set "descr" "Verifying 'zfs receive ' works." + atf_set "require.progs" zfs +} +zfs_receive_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_receive_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_003_pos cleanup +zfs_receive_003_pos_head() +{ + atf_set "descr" "'zfs recv -F' to force rollback." + atf_set "require.progs" zfs +} +zfs_receive_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_receive_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_004_neg cleanup +zfs_receive_004_neg_head() +{ + atf_set "descr" "Verify that invalid parameters to 'zfs receive' are caught." + atf_set "require.progs" zfs +} +zfs_receive_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_004_neg.ksh || atf_fail "Testcase failed" +} +zfs_receive_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_005_neg cleanup +zfs_receive_005_neg_head() +{ + atf_set "descr" "Verify 'zfs receive' fails with unsupported scenarios." + atf_set "require.progs" zfs +} +zfs_receive_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_005_neg.ksh || atf_fail "Testcase failed" +} +zfs_receive_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_006_pos cleanup +zfs_receive_006_pos_head() +{ + atf_set "descr" "'zfs recv -d ' should succeed no matter ancestor filesystemexists." + atf_set "require.progs" zfs +} +zfs_receive_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_receive_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_007_neg cleanup +zfs_receive_007_neg_head() +{ + atf_set "descr" "'zfs recv -F' should fail if the incremental stream does not match" + atf_set "require.progs" zfs +} +zfs_receive_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_receive_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_008_pos cleanup +zfs_receive_008_pos_head() +{ + atf_set "descr" "Verifying 'zfs receive -vn []and zfs receive -vn -d '" + atf_set "require.progs" zfs +} +zfs_receive_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_008_pos.ksh || atf_fail "Testcase failed" +} +zfs_receive_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_009_neg cleanup +zfs_receive_009_neg_head() +{ + atf_set "descr" "Verify 'zfs receive' fails with bad option, missing or too many arguments" + atf_set "require.progs" zfs +} +zfs_receive_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_009_neg.ksh || atf_fail "Testcase failed" +} +zfs_receive_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_receive.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_receive_001_pos + atf_add_test_case zfs_receive_002_pos + atf_add_test_case zfs_receive_003_pos + atf_add_test_case zfs_receive_004_neg + atf_add_test_case zfs_receive_005_neg + atf_add_test_case zfs_receive_006_pos + atf_add_test_case zfs_receive_007_neg + atf_add_test_case zfs_receive_008_pos + atf_add_test_case zfs_receive_009_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/Makefile new file mode 100644 index 00000000000..8e78f0cf302 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/Makefile @@ -0,0 +1,31 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_rename +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_rename_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_rename_002_pos.ksh +${PACKAGE}FILES+= zfs_rename_006_pos.ksh +${PACKAGE}FILES+= zfs_rename_012_neg.ksh +${PACKAGE}FILES+= zfs_rename.cfg +${PACKAGE}FILES+= zfs_rename_013_pos.ksh +${PACKAGE}FILES+= zfs_rename_003_pos.ksh +${PACKAGE}FILES+= zfs_rename_007_pos.ksh +${PACKAGE}FILES+= zfs_rename_001_pos.ksh +${PACKAGE}FILES+= zfs_rename_004_neg.ksh +${PACKAGE}FILES+= zfs_rename_008_pos.ksh +${PACKAGE}FILES+= zfs_rename_009_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_rename_005_neg.ksh +${PACKAGE}FILES+= zfs_rename.kshlib +${PACKAGE}FILES+= zfs_rename_010_neg.ksh +${PACKAGE}FILES+= zfs_rename_011_pos.ksh +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/cleanup.ksh new file mode 100644 index 00000000000..d3878d0ed24 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/cleanup.ksh @@ -0,0 +1,43 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup_noexit + +if [[ -d $TESTDIR2 ]]; then + $RM -rf $TESTDIR2 + if (( $? != 0 )); then + log_unresolved Could not remove $TESTDIR2 + fi +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/setup.ksh new file mode 100644 index 00000000000..866b297b9bf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/setup.ksh @@ -0,0 +1,48 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup_noexit "$DISK" "true" "true" + +if [[ -d $TESTDIR2 ]]; then + $RM -rf $TESTDIR2 + if (( $? != 0 )); then + log_unresolved Could not remove $TESTDIR2 + fi +fi +log_must $ZFS create $TESTPOOL/$DATAFS +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$DATAFS +log_must eval "$DD if=$IF of=$OF bs=$BS count=$CNT >/dev/null 2>&1" + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename.cfg new file mode 100644 index 00000000000..d8ce9ae98f4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename.cfg @@ -0,0 +1,41 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename.cfg 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export DATAFS=datafs${TESTCASE_ID} +export DATA=$TESTDIR2/data.${TESTCASE_ID} +export IF=/dev/urandom +export OF=$DATA +export BS=512 +export CNT=2048 +export VOL_R_PATH=/dev/zvol/$TESTPOOL/$TESTVOL +export VOLDATA=$TESTDIR2/voldata.${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename.kshlib new file mode 100644 index 00000000000..0d1dc6e7e0d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename.kshlib @@ -0,0 +1,117 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename.kshlib 1.5 07/10/09 SMI" +# + +function additional_setup +{ + # Create testfile + log_must $CP $DATA $TESTDIR/$TESTFILE0 + log_must $CP $DATA $TESTDIR1/$TESTFILE0 + + # Create snapshot + if ! snapexists $TESTPOOL/$TESTFS@snapshot; then + log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot + log_must $ZFS clone $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTFS-clone + fi + + # Create file system + datasetexists $TESTPOOL/$TESTFS1 || \ + log_must $ZFS create $TESTPOOL/$TESTFS1 + + # Create testfile + log_must $CP $DATA $(get_prop mountpoint $TESTPOOL/$TESTFS1)/$TESTFILE0 + + # Create container + datasetexists $TESTPOOL/$TESTCTR1 || \ + log_must $ZFS create $TESTPOOL/$TESTCTR1 + log_must $CP $DATA $(get_prop mountpoint $TESTPOOL/$TESTCTR1)/$TESTFILE0 + + # Create data in zvol + if is_global_zone; then + log_must eval "$DD if=$DATA of=$VOL_R_PATH bs=$BS count=$CNT \ + >/dev/null 2>&1" + else + log_must $CP $DATA $(get_prop mountpoint $TESTPOOL/$TESTVOL)/$TESTFILE0 + fi + +} + +function rename_dataset # src dest +{ + typeset src=$1 + typeset dest=$2 + + log_must $ZFS rename $src $dest + + # + # Verify src name no longer in use + # + log_mustnot datasetexists $src + log_must datasetexists $dest +} + +function cleanup +{ + typeset -i i=0 + while ((i < ${#dataset[*]} )); do + if ! datasetexists ${dataset[i]}-new ; then + ((i = i + 1)) + continue + fi + + if [[ ${dataset[i]}-new != *@* ]] ; then + $ZFS rename ${dataset[i]}-new ${dataset[i]} + if [[ $? -ne 0 ]]; then + typeset newfs=${dataset[i]}-new + typeset oldfs=${dataset[i]} + typeset mntp=$(get_prop mountpoint $newfs) + log_must $ZFS destroy -f $newfs + log_must $ZFS create -p $oldfs + log_must $ZFS set mountpoint=$mntp $oldfs + fi + else + log_must $ZFS destroy -fR ${dataset[i]}-new + fi + + ((i = i + 1)) + done +} + +function cmp_data #<$1 src data, $2 tgt data> +{ + typeset src=$1 + typeset tgt=$2 + + $CMP $src $tgt >/dev/null 2>&1 + + return $? +} + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_001_pos.ksh new file mode 100644 index 00000000000..e51921a733f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_001_pos.ksh @@ -0,0 +1,121 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_001_pos.ksh 1.4 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rename/zfs_rename.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rename_001_pos +# +# DESCRIPTION: +# 'zfs rename' should successfully rename valid datasets. +# As a sub-assertion we check to ensure the datasets that can +# be mounted are mounted. +# +# STRATEGY: +# 1. Given a file system, snapshot and volume. +# 2. Rename each dataset object to a new name. +# 3. Verify that only the new name is displayed by zfs list. +# 4. Verify mountable datasets are mounted. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-06-29) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +set -A dataset "$TESTPOOL/$TESTFS@snapshot" "$TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$TESTCTR/$TESTFS1" "$TESTPOOL/$TESTCTR1" \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTFS-clone" +set -A mountable "$TESTPOOL/$TESTFS1-new" "$TESTPOOL/$TESTFS@snapshot-new" \ + "$TESTPOOL/$TESTCTR/$TESTFS1-new" "$TESTPOOL/$TESTFS-clone-new" + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit cleanup + +log_assert "'zfs rename' should successfully rename valid datasets" + +additional_setup + +typeset -i i=0 +while (( i < ${#dataset[*]} )); do + rename_dataset ${dataset[i]} ${dataset[i]}-new + + ((i = i + 1)) +done + +log_note "Verify mountable datasets are mounted in their new namespace." +typeset mtpt +i=0 +while (( i < ${#mountable[*]} )); do + # Snapshot have no mountpoint + if [[ ${mountable[i]} != *@* ]]; then + log_must mounted ${mountable[i]} + mtpt=$(get_prop mountpoint ${mountable[i]}) + else + mtpt=$(snapshot_mountpoint ${mountable[i]}) + fi + + if ! cmp_data $DATA $mtpt/$TESTFILE0 ; then + log_fail "$mtpt/$TESTFILE0 gets corrupted after rename operation." + fi + + ((i = i + 1)) +done + +#verify the data integrity in zvol +if is_global_zone; then + log_must eval "$DD if=${VOL_R_PATH}-new of=$VOLDATA bs=$BS count=$CNT >/dev/null 2>&1" + if ! cmp_data $VOLDATA $DATA ; then + log_fail "$VOLDATA gets corrupted after rename operation." + fi +fi + +# rename back fs +typeset -i i=0 +while ((i < ${#dataset[*]} )); do + if datasetexists ${dataset[i]}-new ; then + log_must $ZFS rename ${dataset[i]}-new ${dataset[i]} + fi + ((i = i + 1)) +done + +log_pass "'zfs rename' successfully renamed each dataset type." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_002_pos.ksh new file mode 100644 index 00000000000..893ecdba977 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_002_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_002_pos.ksh 1.3 07/07/31 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rename/zfs_rename.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rename_002_pos +# +# DESCRIPTION: +# 'zfs rename' should successfully be capable of renaming +# valid datasets back and forth multiple times. +# +# STRATEGY: +# 1. Given a file system, snapshot and volume. +# 2. Rename each dataset object to a new name. +# 3. Rename each dataset back to its original name. +# 4. Repeat steps 2 and 3 multiple times. +# 5. Verify that the correct name is displayed by zfs list. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-06-29) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +set -A dataset "$TESTPOOL/$TESTFS@snapshot" "$TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$TESTCTR/$TESTFS1" "$TESTPOOL/$TESTCTR1" \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTFS-clone" + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit cleanup + +log_assert "'zfs rename' should successfully rename valid datasets" + +additional_setup + +typeset -i i=0 +typeset -i iters=10 + +while ((i < ${#dataset[*]} )); do + j=0 + while ((j < iters )); do + rename_dataset ${dataset[i]} ${dataset[i]}-new + rename_dataset ${dataset[i]}-new ${dataset[i]} + + ((j = j + 1)) + done + + if [[ ${dataset[i]} == *@* ]]; then + data=$(snapshot_mountpoint ${dataset[i]})/$TESTFILE0 + elif [[ ${dataset[i]} == "$TESTPOOL/$TESTVOL" ]] && is_global_zone; then + log_must eval "$DD if=$VOL_R_PATH of=$VOLDATA bs=$BS count=$CNT >/dev/null 2>&1" + data=$VOLDATA + else + data=$(get_prop mountpoint ${dataset[i]})/$TESTFILE0 + fi + + if ! cmp_data $DATA $data; then + log_fail "$data gets corrupted after $iters times rename operations." + fi + + ((i = i + 1)) +done + +log_pass "'zfs rename' renamed each dataset type multiple times as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_003_pos.ksh new file mode 100644 index 00000000000..067394d85fb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_003_pos.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_003_pos.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rename_003_pos +# +# DESCRIPTION: +# 'zfs rename' can address the abbreviated snapshot name. +# +# STRATEGY: +# 1. Create pool, fs and snap. +# 2. Verify 'zfs rename' support the abbreviated snapshot name. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + datasetexists $snap && log_must $ZFS destroy $snap +} + +log_assert "'zfs rename' can address the abbreviated snapshot name." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS; snap=$fs@snap +set -A newname "$fs@new-snap" "@new-snap" "new-snap" + +log_must $ZFS snapshot $snap +log_must datasetexists $snap + +typeset -i i=0 +while ((i < ${#newname[*]} )); do + log_must $ZFS rename $snap ${newname[$i]} + log_must datasetexists ${snap%%@*}@${newname[$i]##*@} + log_must $ZFS rename ${snap%%@*}@${newname[$i]##*@} $snap + + ((i += 1)) +done + +log_pass "'zfs rename' address the abbreviated snapshot name passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_004_neg.ksh new file mode 100644 index 00000000000..ccd21d2b29f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_004_neg.ksh @@ -0,0 +1,125 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_004_neg.ksh 1.4 07/07/31 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rename/zfs_rename.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rename_004_neg +# +# DESCRIPTION: +# 'zfs rename' should fail when this dataset was changed to an existed +# dataset name or datasets are of different types. +# For example, a filesystem cannot be renamed as a volume. +# +# STRATEGY: +# 1. Given a file system, snapshot and volume. +# 2. Rename each dataset object to a different type. +# 3. Verify that only the original name is displayed by zfs list. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-06-29) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +# +# This array is a list of pairs: +# item i: original type +# item i + 1: new type +# +set -A bad_dataset $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTCTR1 \ + $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTCTR/$TESTFS1 \ + $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS1 \ + $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTCTR1 $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTCTR1 $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTCTR1 $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTCTR1 $TESTPOOL/$TESTCTR/$TESTFS1 \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTCTR1 \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR1 \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR/$TESTFS1 \ + $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTCTR1 \ + $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTCTR/$TESTFS1 \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%c \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%d \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%x \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%p \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%s \ + $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTFS@snapshot/fs + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit cleanup + +log_assert "'zfs rename' should fail when datasets are of a different type." + +additional_setup + +typeset -i i=0 +while ((i < ${#bad_dataset[*]} )); do + log_mustnot $ZFS rename ${bad_dataset[i]} ${bad_dataset[((i + 1))]} + log_must datasetexists ${bad_dataset[i]} + + log_mustnot $ZFS rename -p ${bad_dataset[i]} ${bad_dataset[((i + 1))]} + log_must datasetexists ${bad_dataset[i]} + + ((i = i + 2)) +done + +#verify 'rename -p' can not work with snapshots + +log_mustnot $ZFS rename -p $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTFS@snapshot2 +log_must datasetexists $TESTPOOL/$TESTFS@snapshot +log_mustnot $ZFS rename -p $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTFS/$TESTFS@snapshot2 +log_must datasetexists $TESTPOOL/$TESTFS@snapshot + +log_pass "'zfs rename' fails as expected when given different dataset types." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_005_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_005_neg.ksh new file mode 100644 index 00000000000..9dc22ee0adb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_005_neg.ksh @@ -0,0 +1,105 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_005_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rename/zfs_rename.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rename_005_neg +# +# DESCRIPTION: +# 'zfs rename' should fail when the dataset are not within the same pool +# +# STRATEGY: +# 1. Given a file system, snapshot and volume. +# 2. Rename each dataset object to a different pool. +# 3. Verify the operation fails, and only the original name +# is displayed by zfs list. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-13) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function my_cleanup +{ + poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + [[ -e $TESTDIR/$TESTFILE1 ]] && \ + log_must $RM -f $TESTDIR/$TESTFILE1 + cleanup +} + +set -A src_dataset \ + "$TESTPOOL/$TESTFS1" "$TESTPOOL/$TESTCTR1" \ + "$TESTPOOL/$TESTCTR/$TESTFS1" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTFS@snapshot" "$TESTPOOL/$TESTFS-clone" + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit my_cleanup + +log_assert "'zfs rename' should fail while datasets are within different pool." + +additional_setup + +typeset FILESIZE=64m +log_must $TRUNCATE -s $FILESIZE $TESTDIR/$TESTFILE1 +create_pool $TESTPOOL1 $TESTDIR/$TESTFILE1 + +for src in ${src_dataset[@]} ; do + dest=${src#$TESTPOOL/} + if [[ $dest == *"@"* ]]; then + dest=${dest#*@} + dest=${TESTPOOL1}@$dest + else + dest=${TESTPOOL1}/$dest + fi + log_mustnot $ZFS rename $src $dest + log_mustnot $ZFS rename -p $src $dest + + # + # Verify original dataset name still in use + # + log_must datasetexists $src +done + +log_pass "'zfs rename' fail while datasets are within different pool." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_006_pos.ksh new file mode 100644 index 00000000000..eaffb474450 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_006_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_006_pos.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rename/zfs_rename.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rename_006_pos +# +# DESCRIPTION: +# 'zfs rename' can successfully rename a volume snapshot. +# +# STRATEGY: +# 1. Create a snapshot of volume. +# 2. Rename volume snapshot to a new one. +# 3. Rename volume to a new one. +# 5. Verify that the rename operations are successful and zfs list can +# list them. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-02-05) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit cleanup + +log_assert "'zfs rename' can successfully rename a volume snapshot." + +vol=$TESTPOOL/$TESTVOL +snap=$TESTSNAP + +log_must eval "$DD if=$DATA of=$VOL_R_PATH bs=$BS count=$CNT >/dev/null 2>&1" +if ! snapexists $vol@$snap; then + log_must $ZFS snapshot $vol@$snap +fi + +rename_dataset $vol@$snap $vol@${snap}-new +rename_dataset $vol ${vol}-new +rename_dataset ${vol}-new@${snap}-new ${vol}-new@$snap +rename_dataset ${vol}-new $vol + +#verify data integrity +for input in $VOL_R_PATH ${VOL_R_PATH}@$snap; do + log_must eval "$DD if=$input of=$VOLDATA bs=$BS count=$CNT >/dev/null 2>&1" + if ! cmp_data $VOLDATA $DATA ; then + log_fail "$input gets corrupted after rename operation." + fi +done + +log_must $ZFS destroy $vol@$snap + +log_pass "'zfs rename' can rename volume snapshot as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_007_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_007_pos.ksh new file mode 100644 index 00000000000..3279b4769fb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_007_pos.ksh @@ -0,0 +1,170 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_007_pos.ksh 1.2 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rename_007_pos +# +# DESCRIPTION: +# Rename dataset, verify that the data haven't changed. +# +# STRATEGY: +# 1. Create random data and copy to dataset. +# 2. Perform renaming commands. +# 3. Verify that the data haven't changed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Check if current system support recursive rename +$ZFS rename 2>&1 | grep "rename -r" >/dev/null 2>&1 +if (($? != 0)); then + log_unsupported +fi + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS ; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + fi + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + $RM -f $SRC_FILE $DST_FILE +} + +function target_obj +{ + typeset dtst=$1 + + typeset obj + typeset type=$(get_prop type $dtst) + if [[ $type == "filesystem" ]]; then + obj=$(get_prop mountpoint $dtst)/${SRC_FILE##*/} + elif [[ $type == "volume" ]]; then + obj=/dev/zvol/$dtst + fi + + print $obj +} + +log_assert "Rename dataset, verify that the data haven't changed." +log_onexit cleanup + +# Generate random data +# +BS=512 ; CNT=2048 +SRC_FILE=$TMPDIR/srcfile.${TESTCASE_ID} +DST_FILE=$TMPDIR/dstfile.${TESTCASE_ID} +log_must $DD if=/dev/random of=$SRC_FILE bs=$BS count=$CNT + +fs=$TESTPOOL/$TESTFS/fs.${TESTCASE_ID} +fsclone=$TESTPOOL/$TESTFS/fsclone.${TESTCASE_ID} +log_must $ZFS create $fs + +obj=$(target_obj $fs) +log_must $CP $SRC_FILE $obj + +snap=${fs}@snap.${TESTCASE_ID} +log_must $ZFS snapshot $snap +log_must $ZFS clone $snap $fsclone + +# Rename dataset & clone +# +log_must $ZFS rename $fs ${fs}-new +log_must $ZFS rename $fsclone ${fsclone}-new + +# Compare source file and target file +# +obj=$(target_obj ${fs}-new) +log_must $DIFF $SRC_FILE $obj +obj=$(target_obj ${fsclone}-new) +log_must $DIFF $SRC_FILE $obj + +# Rename snapshot and re-clone dataset +# +log_must $ZFS rename ${fs}-new $fs +log_must $ZFS rename $snap ${snap}-new +log_must $ZFS clone ${snap}-new $fsclone + +# Compare source file and target file +# +obj=$(target_obj $fsclone) +log_must $DIFF $SRC_FILE $obj + +if is_global_zone; then + vol=$TESTPOOL/$TESTFS/vol.${TESTCASE_ID} ; volclone=$TESTPOOL/$TESTFS/volclone.${TESTCASE_ID} + log_must $ZFS create -V 100M $vol + + obj=$(target_obj $vol) + log_must $DD if=$SRC_FILE of=$obj bs=$BS count=$CNT + + snap=${vol}@snap.${TESTCASE_ID} + log_must $ZFS snapshot $snap + log_must $ZFS clone $snap $volclone + + # Rename dataset & clone + log_must $ZFS rename $vol ${vol}-new + log_must $ZFS rename $volclone ${volclone}-new + + # Compare source file and target file + obj=$(target_obj ${vol}-new) + log_must $DD if=$obj of=$DST_FILE bs=$BS count=$CNT + log_must $DIFF $SRC_FILE $DST_FILE + obj=$(target_obj ${volclone}-new) + log_must $DD if=$obj of=$DST_FILE bs=$BS count=$CNT + log_must $DIFF $SRC_FILE $DST_FILE + + # Rename snapshot and re-clone dataset + log_must $ZFS rename ${vol}-new $vol + log_must $ZFS rename $snap ${snap}-new + log_must $ZFS clone ${snap}-new $volclone + + # Compare source file and target file + obj=$(target_obj $volclone) + log_must $DD if=$obj of=$DST_FILE bs=$BS count=$CNT + log_must $DIFF $SRC_FILE $DST_FILE +fi + +log_pass "Rename dataset, the data haven't changed passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_008_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_008_pos.ksh new file mode 100644 index 00000000000..3658edc2b59 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_008_pos.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_008_pos.ksh 1.2 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rename_008_pos +# +# DESCRIPTION: +# zfs rename -r can rename snapshot recursively. +# +# STRATEGY: +# 1. Create snapshot recursively. +# 2. Rename snapshot recursively. +# 3. Verify rename -r snapshot correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Check if current system support recursive rename +$ZFS rename 2>&1 | grep "rename -r" > /dev/null 2>&1 +if (($? != 0)); then + log_unsupported +fi + +function cleanup +{ + typeset -i i=0 + while ((i < ${#datasets[@]})); do + if datasetexists ${datasets[$i]}@snap ; then + log_must $ZFS destroy ${datasets[$i]}@snap + fi + if datasetexists ${datasets[$i]}@snap-new ; then + log_must $ZFS destroy ${datasets[$i]}@snap-new + fi + + ((i += 1)) + done +} + +log_assert "zfs rename -r can rename snapshot recursively." +log_onexit cleanup + +set -A datasets $TESTPOOL $TESTPOOL/$TESTCTR \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS +if is_global_zone; then + datasets[${#datasets[@]}]=$TESTPOOL/$TESTVOL +fi + +log_must $ZFS snapshot -r ${TESTPOOL}@snap +typeset -i i=0 +while ((i < ${#datasets[@]})); do + log_must datasetexists ${datasets[$i]}@snap + + ((i += 1)) +done + +log_must $ZFS rename -r ${TESTPOOL}@snap ${TESTPOOL}@snap-new +i=0 +while ((i < ${#datasets[@]})); do + log_must datasetexists ${datasets[$i]}@snap-new + + ((i += 1)) +done + +log_must $ZFS destroy -rf ${TESTPOOL}@snap-new + +log_pass "Verify zfs rename -r passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_009_neg.ksh new file mode 100644 index 00000000000..54f58c63e0b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_009_neg.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_009_neg.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rename_009_neg +# +# DESCRIPTION: +# A snapshot already exists with the new name, then none of the +# snapshots is renamed. +# +# STRATEGY: +# 1. Create snapshot for a set of datasets. +# 2. Create a new snapshot for one of datasets. +# 3. Using rename -r command with exists snapshot name. +# 4. Verify none of the snapshots is renamed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Check if current system support recursive rename +$ZFS rename 2>&1 | grep "rename -r" >/dev/null 2>&1 +if (($? != 0)); then + log_unsupported +fi + +log_assert "zfs rename -r failed, when snapshot name is already existing." + +set -A datasets $TESTPOOL $TESTPOOL/$TESTCTR \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS +if is_global_zone; then + datasets[${#datasets[@]}]=$TESTPOOL/$TESTVOL +fi + +log_must $ZFS snapshot -r ${TESTPOOL}@snap +typeset -i i=0 +while ((i < ${#datasets[@]})); do + # Create one more snapshot + log_must $ZFS snapshot ${datasets[$i]}@snap2 + log_mustnot $ZFS rename -r ${TESTPOOL}@snap ${TESTPOOL}@snap2 + log_must $ZFS destroy ${datasets[$i]}@snap2 + + # Check datasets, make sure none of them was renamed. + typeset -i j=0 + while ((j < ${#datasets[@]})); do + if datasetexists ${datasets[$j]}@snap2 ; then + log_fail "${datasets[$j]}@snap2 should not exist." + fi + ((j += 1)) + done + + ((i += 1)) +done + +log_pass "zfs rename -r failed, when snapshot name is already existing passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_010_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_010_neg.ksh new file mode 100644 index 00000000000..7ddd41f41e1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_010_neg.ksh @@ -0,0 +1,93 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_010_neg.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rename_010_neg +# +# DESCRIPTION: +# The recursive flag -r can only be used for snapshots and not for +# volumes/filesystems. +# +# STRATEGY: +# 1. Loop pool, fs, container and volume. +# 2. Verify none of them can be rename by rename -r. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Check if current system support recursive rename +$ZFS rename 2>&1 | grep "rename -r" >/dev/null 2>&1 +if (($? != 0)); then + log_unsupported +fi + +log_assert "The recursive flag -r can only be used for snapshots." + +set -A datasets $TESTPOOL $TESTPOOL/$TESTCTR \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS +if is_global_zone; then + datasets[${#datasets[@]}]=$TESTPOOL/$TESTVOL +fi + +for opts in "-r" "-r -p"; do + typeset -i i=0 + while ((i < ${#datasets[@]})); do + log_mustnot $ZFS rename $opts ${datasets[$i]} \ + ${datasets[$i]}-new + + # Check datasets, make sure none of them was renamed. + typeset -i j=0 + while ((j < ${#datasets[@]})); do + if datasetexists ${datasets[$j]}-new ; then + log_fail "${datasets[$j]}-new should not exists." + fi + ((j += 1)) + done + + ((i += 1)) + done +done + +log_pass "The recursive flag -r can only be used for snapshots passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_011_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_011_pos.ksh new file mode 100644 index 00000000000..71bf65a0c3b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_011_pos.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_011_pos.ksh 1.2 09/01/13 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rename/zfs_rename.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rename_011_pos +# +# DESCRIPTION +# 'zfs rename -p' should work as expected +# +# STRATEGY: +# 1. Make sure the upper level of $newdataset does not exist +# 2. Make sure without -p option, 'zfs rename' will fail +# 3. With -p option, rename works +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-05) +# +# __stc_assertion_end +# +############################################################################### + +if ! $(check_opt_support "create" "-p") ; then + log_unsupported "-p option is not supported yet." +fi + +verify_runnable "both" + +function additional_cleanup +{ + if datasetexists $TESTPOOL/notexist ; then + log_must $ZFS destroy -Rf $TESTPOOL/notexist + fi + + if datasetexists $TESTPOOL/$TESTFS ; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + fi + log_must $ZFS create $TESTPOOL/$TESTFS + + if is_global_zone ; then + if datasetexists $TESTPOOL/$TESTVOL ; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTVOL + fi + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + fi +} + +log_onexit additional_cleanup + +log_assert "'zfs rename -p' should work as expected" + +log_must verify_opt_p_ops "rename" "fs" "$TESTPOOL/$TESTFS" \ + "$TESTPOOL/notexist/new/$TESTFS1" + +if is_global_zone; then + log_must verify_opt_p_ops "rename" "vol" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/notexist/new/$TESTVOL1" +fi + +log_pass "'zfs rename -p' should work as expected" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_012_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_012_neg.ksh new file mode 100644 index 00000000000..c1f68f0c173 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_012_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_012_neg.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rename_012_neg +# +# DESCRIPTION: +# 'zfs rename' should be failed with bad option, null target dataset, +# too many datasets and long target dataset name. +# +# STRATEGY: +# 1. Create a set of ZFS datasets; +# 2. Try 'zfs rename' with various illegal scenarios; +# 3. Verify 'zfs rename' command should be failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "'zfs rename' should fail with bad option, null target dataset and" \ + "too long target dataset name." + +set -A badopts "r" "R" "-R" "-rR" "-Rr" "-P" "-pP" "-Pp" "-r*" "-p*" "-?" "-*" \ + "-" "-o" +set -A datasets "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS@$TESTSNAP" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCTR/$TESTFS1" "$TESTPOOL/$TESTVOL" + +longname="$(gen_dataset_name 260 abcdefg)" + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +for ds in ${datasets[@]}; do + for opt in ${badopts[@]}; do + log_mustnot $ZFS rename $opt $ds ${ds}-new + done + log_mustnot $ZFS rename $ds + log_mustnot $ZFS rename $ds ${ds}-new ${ds}-new1 + log_mustnot $ZFS rename $ds ${ds}.$longname +done + +log_pass "'zfs rename' fails with illegal scenarios as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_013_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_013_pos.ksh new file mode 100644 index 00000000000..befe912a098 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_013_pos.ksh @@ -0,0 +1,105 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_013_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rename_013_pos +# +# DESCRIPTION: +# zfs rename -r can rename snapshot when child datasets +# don't have a snapshot of the given name. +# +# STRATEGY: +# 1. Create snapshot. +# 2. Rename snapshot recursively. +# 3. Verify rename -r snapshot correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Check if current system support recursive rename +$ZFS rename 2>&1 | grep "rename -r" > /dev/null 2>&1 +if (($? != 0)); then + log_unsupported +fi + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTCTR@snap-new ; then + log_must $ZFS destroy -f $TESTPOOL/$TESTCTR@snap-new + fi + + if datasetexists $TESTPOOL/$TESTCTR@snap ; then + log_must $ZFS destroy -f $TESTPOOL/$TESTCTR@snap + fi + + if datasetexists $TESTPOOL@snap-new ; then + log_must $ZFS destroy -f $TESTPOOL@snap-new + fi + + if datasetexists $TESTPOOL@snap ; then + log_must $ZFS destroy -f $TESTPOOL@snap + fi +} + +log_assert "zfs rename -r can rename snapshot when child datasets" \ + "don't have a snapshot of the given name." + +log_onexit cleanup + +log_must $ZFS snapshot $TESTPOOL/$TESTCTR@snap +log_must $ZFS rename -r $TESTPOOL/$TESTCTR@snap $TESTPOOL/$TESTCTR@snap-new +log_must datasetexists $TESTPOOL/$TESTCTR@snap-new + +log_must $ZFS snapshot $TESTPOOL@snap +log_must $ZFS rename -r $TESTPOOL@snap $TESTPOOL@snap-new +log_must datasetexists $TESTPOOL/$TESTCTR@snap-new +log_must datasetexists $TESTPOOL@snap-new + +log_must $ZFS destroy -f $TESTPOOL/$TESTCTR@snap-new +log_must $ZFS destroy -f $TESTPOOL@snap-new + +log_pass "Verify zfs rename -r passed when child datasets" \ + "don't have a snapshot of the given name." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_test.sh new file mode 100755 index 00000000000..9975e6cc888 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rename/zfs_rename_test.sh @@ -0,0 +1,383 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_rename_001_pos cleanup +zfs_rename_001_pos_head() +{ + atf_set "descr" "'zfs rename' should successfully rename valid datasets" + atf_set "require.progs" zfs +} +zfs_rename_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_rename_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_002_pos cleanup +zfs_rename_002_pos_head() +{ + atf_set "descr" "'zfs rename' should successfully rename valid datasets" + atf_set "require.progs" zfs +} +zfs_rename_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_rename_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_003_pos cleanup +zfs_rename_003_pos_head() +{ + atf_set "descr" "'zfs rename' can address the abbreviated snapshot name." + atf_set "require.progs" zfs +} +zfs_rename_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_rename_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_004_neg cleanup +zfs_rename_004_neg_head() +{ + atf_set "descr" "'zfs rename' should fail when datasets are of a different type." + atf_set "require.progs" zfs +} +zfs_rename_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_004_neg.ksh || atf_fail "Testcase failed" +} +zfs_rename_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_005_neg cleanup +zfs_rename_005_neg_head() +{ + atf_set "descr" "'zfs rename' should fail while datasets are within different pool." + atf_set "require.progs" zfs +} +zfs_rename_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_005_neg.ksh || atf_fail "Testcase failed" +} +zfs_rename_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_006_pos cleanup +zfs_rename_006_pos_head() +{ + atf_set "descr" "'zfs rename' can successfully rename a volume snapshot." + atf_set "require.progs" zfs +} +zfs_rename_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_rename_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_007_pos cleanup +zfs_rename_007_pos_head() +{ + atf_set "descr" "Rename dataset, verify that the data haven't changed." + atf_set "require.progs" zfs +} +zfs_rename_007_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_007_pos.ksh || atf_fail "Testcase failed" +} +zfs_rename_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_008_pos cleanup +zfs_rename_008_pos_head() +{ + atf_set "descr" "zfs rename -r can rename snapshot recursively." + atf_set "require.progs" zfs +} +zfs_rename_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_008_pos.ksh || atf_fail "Testcase failed" +} +zfs_rename_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_009_neg cleanup +zfs_rename_009_neg_head() +{ + atf_set "descr" "zfs rename -r failed, when snapshot name is already existing." + atf_set "require.progs" zfs +} +zfs_rename_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_009_neg.ksh || atf_fail "Testcase failed" +} +zfs_rename_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_010_neg cleanup +zfs_rename_010_neg_head() +{ + atf_set "descr" "The recursive flag -r can only be used for snapshots." + atf_set "require.progs" zfs +} +zfs_rename_010_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_010_neg.ksh || atf_fail "Testcase failed" +} +zfs_rename_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_011_pos cleanup +zfs_rename_011_pos_head() +{ + atf_set "descr" "'zfs rename -p' should work as expected" + atf_set "require.progs" zfs +} +zfs_rename_011_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_011_pos.ksh || atf_fail "Testcase failed" +} +zfs_rename_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_012_neg cleanup +zfs_rename_012_neg_head() +{ + atf_set "descr" "'zfs rename' should fail with bad option, null target dataset andtoo long target dataset name." + atf_set "require.progs" zfs +} +zfs_rename_012_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_012_neg.ksh || atf_fail "Testcase failed" +} +zfs_rename_012_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_013_pos cleanup +zfs_rename_013_pos_head() +{ + atf_set "descr" "zfs rename -r can rename snapshot when child datasetsdon't have a snapshot of the given name." + atf_set "require.progs" zfs +} +zfs_rename_013_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_013_pos.ksh || atf_fail "Testcase failed" +} +zfs_rename_013_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rename.kshlib + . $(atf_get_srcdir)/zfs_rename.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_rename_001_pos + atf_add_test_case zfs_rename_002_pos + atf_add_test_case zfs_rename_003_pos + atf_add_test_case zfs_rename_004_neg + atf_add_test_case zfs_rename_005_neg + atf_add_test_case zfs_rename_006_pos + atf_add_test_case zfs_rename_007_pos + atf_add_test_case zfs_rename_008_pos + atf_add_test_case zfs_rename_009_neg + atf_add_test_case zfs_rename_010_neg + atf_add_test_case zfs_rename_011_pos + atf_add_test_case zfs_rename_012_neg + atf_add_test_case zfs_rename_013_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/Makefile new file mode 100644 index 00000000000..8ce768b174b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_reservation +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_reservation_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_reservation.cfg +${PACKAGE}FILES+= zfs_reservation_001_pos.ksh +${PACKAGE}FILES+= zfs_reservation_002_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation.cfg new file mode 100644 index 00000000000..25278ead688 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_reservation.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_001_pos.ksh new file mode 100644 index 00000000000..884eef3a77b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_001_pos.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_reservation_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_reservation_001_pos +# +# DESCRIPTION: +# Exceed the maximum limit for a reservation and ensure it fails. +# +# STRATEGY: +# 1. Create a reservation file system. +# 2. Set the reservation to an absurd value. +# 3. Verify the return code is an error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +RESERVATION="reserve" + +function cleanup +{ + if datasetexists $TESTPOOL/$RESERVATION ; then + log_must $ZFS unmount $TESTPOOL/$RESERVATION + log_must $ZFS destroy $TESTPOOL/$RESERVATION + fi +} + +log_onexit cleanup + +log_assert "Verify that a reservation > 2^64 -1 fails." + +log_must $ZFS create $TESTPOOL/$RESERVATION + +log_mustnot $ZFS set reservation=18446744073709551615 $TESTPOOL/$RESERVATION + +log_pass "Unable to set a reservation > 2^64 - 1" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_002_pos.ksh new file mode 100644 index 00000000000..50e7f0e5ce7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_002_pos.ksh @@ -0,0 +1,101 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_reservation_002_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_reservation_002_pos +# +# DESCRIPTION: +# A reservation of 'none' (which is an alias for 0) should be allowed. This +# test verifies that is true. +# +# STRATEGY: +# 1. Create a new file system in the test pool. +# 2. Set the reservation to 'none'. +# 3. Verify the associated reservation is indeed 0. +# 4. Repeat with reservation set to 0. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Use a unique value so earlier test failures will not impact this test. +RESERVATION="reserve"-${TESTCASE_ID} +RESERVATION2="reserve2"-${TESTCASE_ID} + +function cleanup +{ + typeset FS + for FS in $TESTPOOL/$RESERVATION $TESTPOOL/$RESERVATION2 + do + if datasetexists $FS ; then + log_must $ZFS unmount $FS + log_must $ZFS destroy $FS + fi + done +} + +log_onexit cleanup + +log_assert "Ensure a reservation of 0 or 'none' is allowed." + +log_must $ZFS create $TESTPOOL/$RESERVATION +log_must $ZFS create $TESTPOOL/$RESERVATION2 + +log_must $ZFS set reservation=0 $TESTPOOL/$RESERVATION +log_must $ZFS set reservation=none $TESTPOOL/$RESERVATION2 + +for FS in $TESTPOOL/$RESERVATION $TESTPOOL/$RESERVATION2 +do + + reserve=`$ZFS get -pH reservation $FS | $AWK '{print $3}'` + if [[ $reserve -ne 0 ]]; then + log_fail "ZFS get -p reservation did not return 0" + fi + + reserve=`$ZFS get -H reservation $FS | $AWK '{print $3}'` + if [[ $reserve != "none" ]]; then + log_fail "ZFS get reservation did not return 'none'" + fi +done + +log_pass "Successfully set reservation to 0 and 'none'" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_test.sh new file mode 100755 index 00000000000..e14585cc42c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_reservation/zfs_reservation_test.sh @@ -0,0 +1,82 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_reservation_001_pos cleanup +zfs_reservation_001_pos_head() +{ + atf_set "descr" "Verify that a reservation > 2^64 -1 fails." + atf_set "require.progs" zfs +} +zfs_reservation_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_reservation_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_reservation_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_reservation_002_pos cleanup +zfs_reservation_002_pos_head() +{ + atf_set "descr" "Ensure a reservation of 0 or 'none' is allowed." + atf_set "require.progs" zfs +} +zfs_reservation_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_reservation_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_reservation_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_reservation_001_pos + atf_add_test_case zfs_reservation_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/Makefile new file mode 100644 index 00000000000..6cb54ca9599 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_rollback +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_rollback_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_rollback_003_neg.ksh +${PACKAGE}FILES+= zfs_rollback_002_pos.ksh +${PACKAGE}FILES+= zfs_rollback_common.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_rollback_004_neg.ksh +${PACKAGE}FILES+= zfs_rollback_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_rollback.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/cleanup.ksh new file mode 100644 index 00000000000..6179df35da6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +$MOUNT | grep -q "/dev/zvol/$VOL" > /dev/null 2>&1 +if (( $? == 0 )); then + log_must $UMOUNT -f $TESTDIR1 +fi + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/setup.ksh new file mode 100644 index 00000000000..2bc1412e1ee --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} +default_volume_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback.cfg new file mode 100644 index 00000000000..09b1bbbe484 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback.cfg @@ -0,0 +1,53 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rollback.cfg 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/cli.cfg + +export FS=$TESTPOOL/$TESTFS +export VOL=$TESTPOOL/$TESTVOL + +export FSSNAP0=$FS@$TESTSNAP +export FSSNAP1=$FS@$TESTSNAP1 +export FSSNAP2=$FS@$TESTSNAP2 + +export VOLSNAP0=$VOL@$TESTSNAP +export VOLSNAP1=$VOL@$TESTSNAP1 +export VOLSNAP2=$VOL@$TESTSNAP2 + +export FSCLONE0=$FS$TESTCLONE +export FSCLONE1=$FS$TESTCLONE1 +export FSCLONE2=$FS$TESTCLONE2 + +export VOLCLONE0=$VOL$TESTCLONE +export VOLCLONE1=$VOL$TESTCLONE1 +export VOLCLONE2=$VOL$TESTCLONE2 + +export STF_TIMEOUT=1800 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_001_pos.ksh new file mode 100644 index 00000000000..f6ef41439e4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_001_pos.ksh @@ -0,0 +1,181 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rollback_001_pos.ksh 1.4 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rollback_001_pos +# +# DESCRIPTION: +# 'zfs rollback -r|-rf|-R|-Rf' will recursively destroy any snapshots +# more recent than the one specified. +# +# STRATEGY: +# 1. Create pool, fs & volume. +# 2. Separately create three snapshots or clones for fs & volume +# 3. Roll back to the second snapshot and check the results. +# 4. Create the third snapshot or clones for fs & volume again. +# 5. Roll back to the first snapshot and check the results. +# 6. Separately create two snapshots for fs & volume. +# 7. Roll back to the first snapshot and check the results. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "'zfs rollback -r|-rf|-R|-Rf' will recursively destroy any " \ + "snapshots more recent than the one specified." +log_onexit cleanup_env + +# +# Create suitable test environment and run 'zfs rollback', then compare with +# expected value to check the system status. +# +# $1 option. +# $2 the number of snapshots or clones. +# $3 the number of snapshot point which we want to rollback. +# +function test_n_check #opt num_snap_clone num_rollback +{ + typeset opt=$1 + typeset -i cnt=$2 + typeset -i pointcnt=$3 + typeset dtst + + (( cnt > 3 || pointcnt > cnt )) && \ + log_fail "Unsupported testing condition." + + # Clean up the test environment + datasetexists $FS && log_must $ZFS destroy -Rf $FS + if datasetexists $VOL; then + $MOUNT | grep -q "/dev/zvol/$VOL" > /dev/null 2>&1 + (( $? == 0 )) && log_must $UMOUNT -f $TESTDIR1 + + log_must $ZFS destroy -Rf $VOL + fi + + # Create specified test environment + case $opt in + *r*) setup_snap_env $cnt ;; + *R*) setup_clone_env $cnt ;; + esac + + all_snap="$TESTSNAP $TESTSNAP1 $TESTSNAP2" + all_clone="$TESTCLONE $TESTCLONE1 $TESTCLONE2" + typeset snap_point + typeset exist_snap + typeset exist_clone + case $pointcnt in + 1) snap_point=$TESTSNAP + exist_snap=$TESTSNAP + [[ $opt == *R* ]] && exist_clone=$TESTCLONE + ;; + 2) snap_point=$TESTSNAP1 + exist_snap="$TESTSNAP $TESTSNAP1" + [[ $opt == *R* ]] && exist_clone="$TESTCLONE $TESTCLONE1" + ;; + esac + + typeset snap + for dtst in $FS $VOL; do + # Volume is not available in Local Zone. + if [[ $dtst == $VOL ]]; then + if ! is_global_zone; then + break + fi + fi + if [[ $opt == *f* ]]; then + # To write data to the mountpoint directory, + write_mountpoint_dir $dtst + opt=${opt%f} + fi + + if [[ $dtst == $VOL ]]; then + log_must $UMOUNT -f $TESTDIR1 + log_must $ZFS rollback $opt $dtst@$snap_point + log_must $MOUNT \ + /dev/zvol/$TESTPOOL/$TESTVOL $TESTDIR1 + else + log_must $ZFS rollback $opt $dtst@$snap_point + fi + + for snap in $all_snap; do + if [[ " $exist_snap " == *" $snap "* ]]; then + log_must datasetexists $dtst@$snap + else + log_must datasetnonexists $dtst@$snap + fi + done + for clone in $all_clone; do + if [[ " $exist_clone " == *" $clone "* ]]; then + log_must datasetexists $dtst$clone + else + log_must datasetnonexists $dtst$clone + fi + done + + check_files $dtst@$snap_point + done +} + +typeset opt +for opt in "-r" "-rf" "-R" "-Rf"; do + # + # Currently, the test case was limited to create and rollback + # in three snapshots + # + log_note "Create 3 snapshots, rollback to the 2nd snapshot " \ + "using $opt." + test_n_check "$opt" 3 2 + + log_note "Create 3 snapshots and rollback to the 1st snapshot " \ + "using $opt." + test_n_check "$opt" 3 1 + + log_note "Create 2 snapshots and rollback to the 1st snapshot " \ + "using $opt." + test_n_check "$opt" 2 1 +done + +log_pass "'zfs rollback -r|-rf|-R|-Rf' recursively destroy any snapshots more "\ + "recent than the one specified passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_002_pos.ksh new file mode 100644 index 00000000000..7f60df639f2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_002_pos.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rollback_002_pos.ksh 1.4 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rollback_002_pos +# +# DESCRIPTION: +# 'zfs rollback -f' will force unmount any filesystems. +# +# STRATEGY: +# 1. Create pool & fs. +# 2. Create the snapshot of this file system. +# 3. Write the mountpoint directory of this file system. +# 4. Make sure 'zfs rollback -f' succeeds. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "'zfs rollback -f' will force unmount any filesystems." +log_onexit cleanup_env + +# Create a snapshot of this file system: FSSNAP0 +setup_snap_env 1 + +# +# Write file and make the mountpoint directory busy when try to unmount +# the file system that was mounted on it. +# +write_mountpoint_dir ${FSSNAP0%%@*} + +log_must $ZFS rollback $FSSNAP0 +log_must $ZFS rollback -f $FSSNAP0 +log_must datasetexists $FSSNAP0 + +$PKILL ${DD##*/} + +check_files $FSSNAP0 + +log_pass "'zfs rollback -f' force unmount any filesystem passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_003_neg.ksh new file mode 100644 index 00000000000..e613b2d4533 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_003_neg.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rollback_003_neg.ksh 1.5 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rollback_003_neg +# +# DESCRIPTION: +# Separately verify 'zfs rollback ''|-f|-r|-rf|-R|-rR will fail in +# different conditions. +# +# STRATEGY: +# 1. Create pool and file system +# 2. Create 'snap' and 'snap1' of this file system. +# 3. Run 'zfs rollback ""|-f ' and it should fail. +# 4. Create 'clone1' based on 'snap1'. +# 5. Run 'zfs rollback -r|-rf ' and it should fail. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $PKILL ${DD##*/} + for snap in $FSSNAP0 $FSSNAP1 $FSSNAP2; do + if snapexists $snap; then + log_must $ZFS destroy -Rf $snap + fi + done +} + +log_assert "Separately verify 'zfs rollback ''|-f|-r|-rf will fail in " \ + "different conditions." +log_onexit cleanup + +# Create snapshot1 and snapshot2 for this file system. +# +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP1 + +# Run 'zfs rollback ""|-f ' and it should fail. +# +log_mustnot $ZFS rollback $TESTPOOL/$TESTFS@$TESTSNAP +log_mustnot $ZFS rollback -f $TESTPOOL/$TESTFS@$TESTSNAP + +# Create 'clone1' based on 'snap1'. +# +create_clone $TESTPOOL/$TESTFS@$TESTSNAP1 $TESTPOOL/$TESTCLONE1 + +# Run 'zfs rollback -r|-rf ' and it should fail. +# +log_mustnot $ZFS rollback -r $TESTPOOL/$TESTFS@$TESTSNAP +log_mustnot $ZFS rollback -rf $TESTPOOL/$TESTFS@$TESTSNAP + +log_pass "zfs rollback ''|-f|-r|-rf will fail in different conditions " \ + "passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_004_neg.ksh new file mode 100644 index 00000000000..dcff3de5755 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_004_neg.ksh @@ -0,0 +1,100 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rollback_004_neg.ksh 1.2 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_rollback_004_neg +# +# DESCRIPTION: +# 'zfs rollback' should fail when passing invalid options, too many +# arguments,non-snapshot datasets or missing datasets +# +# STRATEGY: +# 1. Create an array of invalid options +# 2. Execute 'zfs rollback' with invalid options, too many arguments +# or missing datasets +# 3. Verify 'zfs rollback' return with errors +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset ds + + for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + if snapexists ${ds}@$TESTSNAP; then + log_must $ZFS destroy ${ds}@$TESTSNAP + fi + done +} + +log_assert "'zfs rollback' should fail with bad options,too many arguments," \ + "non-snapshot datasets or missing datasets." +log_onexit cleanup + +set -A badopts "r" "R" "f" "-F" "-rF" "-RF" "-fF" "-?" "-*" "-blah" "-1" "-2" + +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + log_must $ZFS snapshot ${ds}@$TESTSNAP +done + +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + for opt in "" "-r" "-R" "-f" "-rR" "-rf" "-rRf"; do + log_mustnot eval "$ZFS rollback $opt $ds >/dev/null 2>&1" + log_mustnot eval "$ZFS rollback $opt ${ds}@$TESTSNAP \ + ${ds}@$TESTSNAP >/dev/null 2>&1" + log_mustnot eval "$ZFS rollback $opt >/dev/null 2>&1" + # zfs rollback should fail with non-existen snapshot + log_mustnot eval "$ZFS rollback $opt ${ds}@nosnap >/dev/null 2>&1" + done + + for badopt in ${badopts[@]}; do + log_mustnot eval "$ZFS rollback $badopt ${ds}@$TESTSNAP \ + >/dev/null 2>&1" + done +done + +log_pass "'zfs rollback' fails as expected with illegal arguments." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib new file mode 100644 index 00000000000..7ab7d14570f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib @@ -0,0 +1,305 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rollback_common.kshlib 1.6 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# Get file sum +# +# $1 full file name +function getsum #fname +{ + (( ${#1} == 0 )) && \ + log_fail "Need give file name." + return $($SUM $1 | $AWK '{print $1}') +} + +# Define global variable checksum, get the original file sum. +# +origsum=$(getsum /etc/passwd) + +# +# Setup or recover the test environment. Firstly, copy /etc/passwd to ZFS file +# system or volume, then make a snapshot or clone. Repeat up to three times. +# +# $1 number of snapshot. Note: Currently only support three snapshots. +# $2 indicate if it is necessary to create clone +# +function setup_snap_env +{ + typeset -i cnt=${1:-3} + typeset createclone=${2:-"false"} + + if datasetnonexists $FS; then + log_must $ZFS create $FS + log_must $ZFS set mountpoint=$TESTDIR $FS + fi + # Volume can't be created in Local Zone. + if datasetnonexists $VOL && is_global_zone; then + log_must $ZFS create -V $VOLSIZE $VOL + fi + + # Make sure $VOL is volume + typeset type=$(get_prop type $VOL) + if datasetexists $VOL && \ + [[ $type == 'volume' ]]; then + # + # At the first time, Make a UFS file system in volume and + # mount it. Otherwise, only check if this ufs file system + # was mounted. + # + log_must eval "$ECHO "y" | \ + $NEWFS /dev/zvol/$VOL > /dev/null 2>&1" + + [[ ! -d $TESTDIR1 ]] && log_must $MKDIR $TESTDIR1 + + # Make sure the ufs filesystem hasn't been mounted, + # then mount the new ufs filesystem. + $MOUNT | grep -q "/dev/zvol/$VOL" > /dev/null 2>&1 + if (( $? != 0 )); then + log_must $MOUNT \ + /dev/zvol/$TESTPOOL/$TESTVOL $TESTDIR1 + fi + fi + + # Separately Create three snapshots for file system & volume + typeset -i ind=0 + typeset dtst + for dtst in $FS $VOL; do + # Volume can be created in Local Zone. + if [[ $dtst == $VOL ]]; then + if ! is_global_zone; then + break + fi + fi + + ind=0 + while (( ind < cnt )); do + case $dtst in + $FS) + eval typeset snap=\$FSSNAP$ind + eval typeset clone=\$FSCLONE$ind + eval typeset fname=\$TESTDIR/\$TESTFILE$ind + ;; + $VOL) + eval typeset snap=\$VOLSNAP$ind + eval typeset clone=\$VOLCLONE$ind + eval typeset fname=\$TESTDIR1/\$TESTFILE$ind + ;; + esac + + if datasetnonexists $snap; then + log_must $CP /etc/passwd $fname + # + # Take the snapshot with the zvol unmounted so + # that its filesystem's state will be + # consistent. + # + mount -u -o ro /dev/zvol/$TESTPOOL/$TESTVOL + log_must $ZFS snapshot $snap + mount -u -o rw /dev/zvol/$TESTPOOL/$TESTVOL + fi + if [[ $createclone == "true" ]]; then + if datasetnonexists $clone; then + log_must $ZFS clone $snap $clone + fi + fi + (( ind += 1 )) + done + done +} + +function setup_clone_env +{ + setup_snap_env $1 "true" +} + +# +# Clean up the test environmnet +# +# $1 number of snapshot Note: Currently only support three snapshots. +# +function cleanup_env +{ + typeset -i cnt=${1:-3} + typeset -i ind=0 + typeset dtst + typeset snap + + $PKILL ${DD##*/} + + $MOUNT | grep -q "/dev/zvol/$VOL" > /dev/null 2>&1 + if (( $? == 0 )); then + log_must $UMOUNT -f $TESTDIR1 + fi + + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1/* + + for dtst in $FS $VOL; do + for snap in $TESTSNAP $TESTSNAP1 $TESTSNAP2; do + if snapexists $dtst@$snap; then + log_must $ZFS destroy -Rf $dtst@$snap + fi + done + done + + # Restore original test environment + if datasetnonexists $FS ; then + log_must $ZFS create $FS + fi + if datasetnonexists $VOL ; then + if is_global_zone ; then + log_must $ZFS create -V $VOLSIZE $VOL + else + log_must $ZFS create $VOL + fi + fi +} + +# +# check if the specified files have specified status. +# +# $1 expected status +# $2-n full file name +# If it is true return 0, else return 1 +# +function file_status +{ + (( $# == 0 )) && \ + log_fail "The file name is not defined." + + typeset opt + case $1 in + exist) opt="-e" ;; + nonexist) opt="! -e" ;; + *) log_fail "Unsupported file status." ;; + esac + + shift + while (( $# > 0 )); do + eval [[ $opt $1 ]] || return 1 + shift + done + + return 0 +} + +function files_exist +{ + file_status "exist" $@ +} + +function files_nonexist +{ + file_status "nonexist" $@ +} + +# +# According to snapshot check if the file system was recovered to the right +# point. +# +# $1 snapshot. fs@snap or vol@snap +# +function check_files +{ + typeset dtst=$1 + + if [[ $(get_prop type $dtst) != snapshot ]]; then + log_fail "Parameter must be a snapshot." + fi + + typeset fsvol=${dtst%%@*} + typeset snap=${dtst##*@} + if [[ $(get_prop type $fsvol) == "filesystem" ]]; then + ind="" + else + ind="1" + fi + + eval typeset file0=\$TESTDIR$ind/\$TESTFILE0 + eval typeset file1=\$TESTDIR$ind/\$TESTFILE1 + eval typeset file2=\$TESTDIR$ind/\$TESTFILE2 + + case $snap in + $TESTSNAP2) + log_must files_exist $file0 $file1 $file2 + + typeset sum0=$(getsum $file0) + typeset sum1=$(getsum $file1) + typeset sum2=$(getsum $file2) + if [[ $sum0 != $origsum || \ + $sum1 != $origsum || sum2 != $origsum ]] + then + log_fail "After rollback, file sum is changed." + fi + ;; + $TESTSNAP1) + log_must files_exist $file0 $file1 + log_must files_nonexist $file2 + + typeset sum0=$(getsum $file0) + typeset sum1=$(getsum $file1) + if [[ $sum0 != $origsum || $sum1 != $origsum ]] + then + log_fail "After rollback, file sum is changed." + fi + ;; + $TESTSNAP) + log_must files_exist $file0 + log_must files_nonexist $file1 $file2 + + typeset sum0=$(getsum $file0) + if [[ $sum0 != $origsum ]]; then + log_fail "After rollback, file sum is changed." + fi + ;; + esac +} + +# According to dataset type, write file to different directories. +# +# $1 dataset +# +function write_mountpoint_dir +{ + typeset dtst=$1 + typeset dir + + if [[ $dtst == $FS ]]; then + dir=$TESTDIR + log_must ismounted $dir + else + dir=$TESTDIR1 + log_must ismounted $dir "ufs" + fi + $DD if=/dev/urandom of=$dir/$TESTFILE1 & + log_must $SLEEP 3 +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_test.sh new file mode 100755 index 00000000000..14a566a074a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_rollback/zfs_rollback_test.sh @@ -0,0 +1,144 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_rollback_001_pos cleanup +zfs_rollback_001_pos_head() +{ + atf_set "descr" "'zfs rollback -r|-rf|-R|-Rf' will recursively destroy anysnapshots more recent than the one specified." + atf_set "require.progs" zfs + atf_set "timeout" 1800 +} +zfs_rollback_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rollback_common.kshlib + . $(atf_get_srcdir)/zfs_rollback.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rollback_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_rollback_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rollback_common.kshlib + . $(atf_get_srcdir)/zfs_rollback.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rollback_002_pos cleanup +zfs_rollback_002_pos_head() +{ + atf_set "descr" "'zfs rollback -f' will force unmount any filesystems." + atf_set "require.progs" zfs + atf_set "timeout" 1800 +} +zfs_rollback_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rollback_common.kshlib + . $(atf_get_srcdir)/zfs_rollback.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rollback_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_rollback_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rollback_common.kshlib + . $(atf_get_srcdir)/zfs_rollback.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rollback_003_neg cleanup +zfs_rollback_003_neg_head() +{ + atf_set "descr" "Separately verify 'zfs rollback ''|-f|-r|-rf will fail indifferent conditions." + atf_set "require.progs" zfs + atf_set "timeout" 1800 +} +zfs_rollback_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rollback_common.kshlib + . $(atf_get_srcdir)/zfs_rollback.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rollback_003_neg.ksh || atf_fail "Testcase failed" +} +zfs_rollback_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rollback_common.kshlib + . $(atf_get_srcdir)/zfs_rollback.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rollback_004_neg cleanup +zfs_rollback_004_neg_head() +{ + atf_set "descr" "'zfs rollback' should fail with bad options,too many arguments,non-snapshot datasets or missing datasets." + atf_set "require.progs" zfs + atf_set "timeout" 1800 +} +zfs_rollback_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rollback_common.kshlib + . $(atf_get_srcdir)/zfs_rollback.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rollback_004_neg.ksh || atf_fail "Testcase failed" +} +zfs_rollback_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_rollback_common.kshlib + . $(atf_get_srcdir)/zfs_rollback.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_rollback_001_pos + atf_add_test_case zfs_rollback_002_pos + atf_add_test_case zfs_rollback_003_neg + atf_add_test_case zfs_rollback_004_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/Makefile new file mode 100644 index 00000000000..0824b7ad8bd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/Makefile @@ -0,0 +1,21 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_send +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_send_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_send_003_pos.ksh +${PACKAGE}FILES+= zfs_send_002_pos.ksh +${PACKAGE}FILES+= zfs_send.cfg +${PACKAGE}FILES+= zfs_send_001_pos.ksh +${PACKAGE}FILES+= zfs_send_004_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/cleanup.ksh new file mode 100644 index 00000000000..db372c2000f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send.cfg new file mode 100644 index 00000000000..865de67e8e5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send.cfg @@ -0,0 +1,36 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_send.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export PARTSIZE=1g +export BLOCK_SIZE=512 +export WRITE_COUNT=8 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_001_pos.ksh new file mode 100644 index 00000000000..5ae36b0fb19 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_001_pos.ksh @@ -0,0 +1,140 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_send_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_send_001_pos +# +# DESCRIPTION: +# Verify 'zfs send' can create valid send streams as expected. +# +# STRATEGY: +# 1. Fill in fs with some data +# 2. Create a full send streams with the fs +# 3. Receive the send stream and verify the data integrity +# 4. Fill in fs with some new data +# 5. Create an incremental send stream with the fs +# 6. Receive the incremental send stream and verify the data integrity. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-06) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for snap in $init_snap $inc_snap $rst_snap $rst_inc_snap; do + snapexists $snap && \ + log_must $ZFS destroy -f $snap + done + + datasetexists $rst_root && \ + log_must $ZFS destroy -Rf $rst_root + + for file in $full_bkup $inc_bkup \ + $init_data $inc_data + do + [[ -e $file ]] && \ + log_must $RM -f $file + done + + [[ -d $TESTDIR1 ]] && \ + log_must $RM -rf $TESTDIR1 + +} + +log_assert "Verify 'zfs send' can create valid send streams as expected." +log_onexit cleanup + +init_snap=$TESTPOOL/$TESTFS@init_snap +inc_snap=$TESTPOOL/$TESTFS@inc_snap +full_bkup=$TMPDIR/fullbkup.${TESTCASE_ID} +inc_bkup=$TMPDIR/incbkup.${TESTCASE_ID} +init_data=$TESTDIR/$TESTFILE1 +inc_data=$TESTDIR/$TESTFILE2 +orig_sum="" +rst_sum="" +rst_root=$TESTPOOL/rst_ctr +rst_snap=$rst_root/$TESTFS@init_snap +rst_inc_snap=$rst_root/$TESTFS@inc_snap +rst_data=$TESTDIR1/$TESTFS/$TESTFILE1 +rst_inc_data=$TESTDIR1/$TESTFS/$TESTFILE2 + + +log_note "Verify 'zfs send' can create full send stream." + +#Pre-paration +log_must $ZFS create $rst_root +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 +log_must $ZFS set mountpoint=$TESTDIR1 $rst_root + +log_must $FILE_WRITE -o create -f $init_data -b $BLOCK_SIZE -c $WRITE_COUNT + +log_must $ZFS snapshot $init_snap +$ZFS send $init_snap > $full_bkup +(( $? != 0 )) && \ + log_fail "'$ZFS send' fails to create full send" + +log_note "Verify the send stream is valid to receive." + +log_must $ZFS receive $rst_snap <$full_bkup +receive_check $rst_snap ${rst_snap%%@*} +compare_cksum $init_data $rst_data + +log_note "Verify 'zfs send -i' can create incremental send stream." + +log_must $FILE_WRITE -o create -f $inc_data -b $BLOCK_SIZE -c $WRITE_COUNT -d 0 + +log_must $ZFS snapshot $inc_snap +$ZFS send -i $init_snap $inc_snap > $inc_bkup +(( $? != 0 )) && \ + log_fail "'$ZFS send -i' fails to create incremental send" + +log_note "Verify the incremental send stream is valid to receive." + +log_must $ZFS rollback $rst_snap +log_must $ZFS receive $rst_inc_snap <$inc_bkup +receive_check $rst_inc_snap +compare_cksum $inc_data $rst_inc_data + +log_pass "Verifying 'zfs receive' succeed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_002_pos.ksh new file mode 100644 index 00000000000..81a0837512a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_002_pos.ksh @@ -0,0 +1,152 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_send_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_send_002_pos +# +# DESCRIPTION: +# Verify 'zfs send' can generate valid streams with a property setup. +# +# STRATEGY: +# 1. Setup property for filesystem +# 2. Fill in some data into filesystem +# 3. Create a full send streams +# 4. Receive the send stream +# 5. Verify the receive result +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + snapexists $snap && \ + log_must $ZFS destroy $snap + + datasetexists $ctr && \ + log_must $ZFS destroy -r $ctr + + [[ -e $origfile ]] && \ + log_must $RM -f $origfile + + [[ -e $stream ]] && \ + log_must $RM -f $stream +} + +function do_testing # +{ + typeset property=$1 + typeset prop_val=$2 + + log_must $ZFS set $property=$prop_val $fs + log_must $FILE_WRITE -o create -f $origfile -b $BLOCK_SIZE -c $WRITE_COUNT + log_must $ZFS snapshot $snap + $ZFS send $snap > $stream + (( $? != 0 )) && \ + log_fail "'$ZFS send' fails to create send streams." + $ZFS receive -d $ctr <$stream + (( $? != 0 )) && \ + log_fail "'$ZFS receive' fails to receive send streams." + + #verify receive result + ! datasetexists $rstfs && \ + log_fail "'$ZFS receive' fails to restore $rstfs" + ! snapexists $rstfssnap && \ + log_fail "'$ZFS receive' fails to restore $rstfssnap" + if [[ ! -e $rstfile ]] || [[ ! -e $rstsnapfile ]]; then + log_fail " Data lost after receiving stream" + fi + + compare_cksum $origfile $rstfile + compare_cksum $origsnapfile $rstsnapfile + + #Destroy datasets and stream for next testing + log_must $ZFS destroy $snap + if is_global_zone ; then + log_must $ZFS destroy -r $rstfs + else + log_must $ZFS destroy -r $ds_path + fi + log_must $RM -f $stream +} + +log_assert "Verify 'zfs send' generates valid streams with a property setup" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +snap=$fs@$TESTSNAP +ctr=$TESTPOOL/$TESTCTR +if is_global_zone; then + rstfs=$ctr/$TESTFS +else + ds_path=$ctr/${ZONE_CTR}0 + rstfs=$ds_path/$TESTFS +fi +rstfssnap=$rstfs@$TESTSNAP +snapdir="$(get_snapdir_name)/$TESTSNAP" +origfile=$TESTDIR/$TESTFILE1 +rstfile=/$rstfs/$TESTFILE1 +origsnapfile=$TESTDIR/$snapdir/$TESTFILE1 +rstsnapfile=/$rstfs/$snapdir/$TESTFILE1 +stream=$TMPDIR/streamfile.${TESTCASE_ID} + +set -A props "compression" "checksum" "recordsize" +set -A propval "on lzjb" "on fletcher2 fletcher4 sha256" \ + "512 1k 4k 8k 16k 32k 64k 128k" + +#Create a dataset to receive the send stream +log_must $ZFS create $ctr + +typeset -i i=0 +while (( i < ${#props[*]} )) +do + for value in ${propval[i]} + do + do_testing ${props[i]} $value + done + + (( i = i + 1 )) +done + +log_pass "'zfs send' generates streams with a property setup as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_003_pos.ksh new file mode 100644 index 00000000000..806a7d2b7bf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_003_pos.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_send_003_pos.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_send_003_pos +# +# DESCRIPTION: +# 'zfs send -i' can deal with abbreviated snapshot name. +# +# STRATEGY: +# 1. Create pool, fs and two snapshots. +# 2. Make sure 'zfs send -i' support abbreviated snapshot name. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + datasetexists $snap1 && log_must $ZFS destroy $snap1 + datasetexists $snap2 && log_must $ZFS destroy $snap2 +} + +log_assert "'zfs send -i' can deal with abbreviated snapshot name." +log_onexit cleanup + +snap1=$TESTPOOL/$TESTFS@snap1; snap2=$TESTPOOL/$TESTFS@snap2 + +set -A args "$snap1 $snap2" \ + "${snap1##*@} $snap2" "@${snap1##*@} $snap2" + +log_must $ZFS snapshot $snap1 +log_must $ZFS snapshot $snap2 + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_must eval "$ZFS send -i ${args[i]} > /dev/null" + + (( i += 1 )) +done + +log_pass "'zfs send -i' deal with abbreviated snapshot name passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_004_neg.ksh new file mode 100644 index 00000000000..3da25669913 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_004_neg.ksh @@ -0,0 +1,123 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_send_004_neg.ksh 1.5 08/02/27 SMI" +# + +. $STF_SUITE/tests/cli_root/cli_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_send_004_neg +# +# DESCRIPTION: +# Verify 'zfs send' fails with malformed parameters. +# +# STRATEGY: +# 1. Define malformed parameters in array +# 2. Feed the parameters to 'zfs send' +# 3. Verify the result +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-06) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset snap f + + for snap in $snap1 $snap2 $snap3; do + snapexists $snap && \ + log_must $ZFS destroy -f $snap + done + + for f in $tmpfile1 $tmpfile2; do + if [[ -e $f ]]; then + $RM -f $f + fi + done +} + +fs=$TESTPOOL/$TESTFS +snap1=$fs@snap1 +snap2=$fs@snap2 +snap3=$fs@snap3 + +set -A badargs \ + "" "$TESTPOOL" "$TESTFS" "$fs" "$fs@nonexisten_snap" "?" \ + "$snap1/blah" "$snap1@blah" "-i" "-x" "-i $fs" \ + "-x $snap1 $snap2" "-i $snap1" \ + "-i $snap2 $snap1" "$snap1 $snap2" "-i $snap1 $snap2 $snap3" \ + "-ii $snap1 $snap2" "-iii $snap1 $snap2" " -i $snap2 $snap1/blah" \ + "-i $snap2/blah $snap1" \ + "-i $snap2/blah $snap1/blah" \ + "-i $snap1 blah@blah" \ + "-i blah@blah $snap1" \ + "-i $snap1 ${snap2##*@}" "-i $snap1 @${snap2##*@}" \ + "-i ${snap1##*@} ${snap2##*@}" "-i @${snap1##*@} @${snap2##*@}" \ + "-i ${snap1##*@} $snap2/blah" "-i @${snap1##*@} $snap2/blah" \ + "-i @@${snap1##*@} $snap2" "-i $snap1 -i $snap1 $snap2" \ + "-i snap1 snap2" "-i $snap1 snap2" \ + "-i $snap1 $snap2 -i $snap1 $snap2" \ + "-i snap1 $snap2 -i snap1 $snap2" + +log_assert "Verify that invalid parameters to 'zfs send' are caught." +log_onexit cleanup + +log_must $ZFS snapshot $snap1 +tmpfile1=$TESTDIR/testfile1.${TESTCASE_ID} +log_must $TOUCH $tmpfile1 +log_must $ZFS snapshot $snap2 +tmpfile2=$TESTDIR/testfile2.${TESTCASE_ID} +log_must $TOUCH $tmpfile2 +log_must $ZFS snapshot $snap3 + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + log_mustnot eval "$ZFS send ${badargs[i]} >/dev/null" + + (( i = i + 1 )) +done + +#Testing zfs send fails by send backup stream to terminal +for arg in "$snap1" "-i $snap1 $snap2"; do + log_mustnot eval "$ZFS send $arg >/dev/console" +done + +log_pass "Invalid parameters to 'zfs send' are caught as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_test.sh new file mode 100755 index 00000000000..0da9ed41bd2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_send/zfs_send_test.sh @@ -0,0 +1,132 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_send_001_pos cleanup +zfs_send_001_pos_head() +{ + atf_set "descr" "Verify 'zfs send' can create valid send streams as expected." + atf_set "require.progs" zfs +} +zfs_send_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_send.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_send_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_send_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_send.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_send_002_pos cleanup +zfs_send_002_pos_head() +{ + atf_set "descr" "Verify 'zfs send' generates valid streams with a property setup" + atf_set "require.progs" zfs +} +zfs_send_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_send.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_send_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_send_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_send.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_send_003_pos cleanup +zfs_send_003_pos_head() +{ + atf_set "descr" "'zfs send -i' can deal with abbreviated snapshot name." + atf_set "require.progs" zfs +} +zfs_send_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_send.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_send_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_send_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_send.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_send_004_neg cleanup +zfs_send_004_neg_head() +{ + atf_set "descr" "Verify that invalid parameters to 'zfs send' are caught." + atf_set "require.progs" zfs +} +zfs_send_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_send.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_send_004_neg.ksh || atf_fail "Testcase failed" +} +zfs_send_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_send.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_send_001_pos + atf_add_test_case zfs_send_002_pos + atf_add_test_case zfs_send_003_pos + atf_add_test_case zfs_send_004_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/Makefile new file mode 100644 index 00000000000..faec06da391 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/Makefile @@ -0,0 +1,44 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_set +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_set_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_set_common.kshlib +${PACKAGE}FILES+= onoffs_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= mountpoint_001_pos.ksh +${PACKAGE}FILES+= share_mount_001_neg.ksh +${PACKAGE}FILES+= user_property_004_pos.ksh +${PACKAGE}FILES+= canmount_002_pos.ksh +${PACKAGE}FILES+= readonly_001_pos.ksh +${PACKAGE}FILES+= zfs_set_001_neg.ksh +${PACKAGE}FILES+= user_property_001_pos.ksh +${PACKAGE}FILES+= snapdir_001_pos.ksh +${PACKAGE}FILES+= canmount_003_pos.ksh +${PACKAGE}FILES+= reservation_001_neg.ksh +${PACKAGE}FILES+= compression_001_pos.ksh +${PACKAGE}FILES+= cache_001_pos.ksh +${PACKAGE}FILES+= zfs_set_003_neg.ksh +${PACKAGE}FILES+= canmount_001_pos.ksh +${PACKAGE}FILES+= property_alias_001_pos.ksh +${PACKAGE}FILES+= version_001_neg.ksh +${PACKAGE}FILES+= zfs_set.cfg +${PACKAGE}FILES+= cache_002_neg.ksh +${PACKAGE}FILES+= mountpoint_002_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= checksum_001_pos.ksh +${PACKAGE}FILES+= mountpoint_003_pos.ksh +${PACKAGE}FILES+= user_property_002_pos.ksh +${PACKAGE}FILES+= zfs_set_002_neg.ksh +${PACKAGE}FILES+= user_property_003_neg.ksh +${PACKAGE}FILES+= ro_props_001_pos.ksh +${PACKAGE}FILES+= canmount_004_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cache_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cache_001_pos.ksh new file mode 100644 index 00000000000..b5a5f304fef --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cache_001_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_001_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: cache_001_pos +# +# DESCRIPTION: +# Setting a valid primarycache and secondarycache on file system or volume. +# It should be successful. +# +# STRATEGY: +# 1. Create pool, then create filesystem & volume within it. +# 2. Setting valid cache value, it should be successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" +set -A values "none" "all" "metadata" + +log_assert "Setting a valid {primary|secondary}cache on file system and volume, " \ + "It should be successful." + +typeset -i i=0 +typeset -i j=0 +for propname in "primarycache" "secondarycache" +do + while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + set_n_check_prop "${values[j]}" "$propname" "${dataset[i]}" + (( j += 1 )) + done + (( i += 1 )) + done +done + +log_pass "Setting a valid {primary|secondary}cache on file system or volume pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cache_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cache_002_neg.ksh new file mode 100644 index 00000000000..66dabac9c66 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cache_002_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cache_002_neg.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: cache_001_pos +# +# DESCRIPTION: +# Setting invalid primarycache and secondarycache on file system or volume. +# It should fail. +# +# STRATEGY: +# 1. Create pool, then create filesystem & volume within it. +# 2. Setting invalid {primary|secondary}cache value, it should fail. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" +set -A values "12345" "null" "not_existed" "abcd1234" + +log_assert "Setting invalid {primary|secondary}cache on fs and volume, " \ + "It should fail." + +typeset -i i=0 +typeset -i j=0 +for propname in "primarycache" "secondarycache" +do + while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + log_mustnot $ZFS set $propname=${values[j]} ${dataset[i]} + (( j += 1 )) + done + (( i += 1 )) + done +done + +log_pass "Setting invalid {primary|secondary}cache on fs or volume fail as expeced." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_001_pos.ksh new file mode 100644 index 00000000000..53179e8a5a6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_001_pos.ksh @@ -0,0 +1,137 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)canmount_001_pos.ksh 1.5 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: canmount_001_pos +# +# DESCRIPTION: +# Setting valid canmount to filesystem, it is successful. +# Whatever is set to volume or snapshot, it is failed. +# 'zfs set canmount=on|off ' +# +# STRATEGY: +# 1. Setup a pool and create fs, volume, snapshot clone within it. +# 2. Loop all the valid mountpoint value. +# 3. Check the return value. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A dataset_pos \ + "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCLONE" + +if is_global_zone ; then + set -A dataset_neg \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTFS@$TESTSNAP" \ + "$TESTPOOL/$TESTVOL@$TESTSNAP" "$TESTPOOL/$TESTCLONE1" +else + set -A dataset_neg \ + "$TESTPOOL/$TESTFS@$TESTSNAP" "$TESTPOOL/$TESTVOL@$TESTSNAP" +fi + + +set -A values "on" "off" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTFS@$TESTSNAP + fi + if snapexists $TESTPOOL/$TESTVOL@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTVOL@$TESTSNAP + fi + + [[ -n $old_ctr_canmount ]] && \ + log_must $ZFS set canmount=$old_ctr_canmount $TESTPOOL/$TESTCTR + [[ -n $old_fs_canmount ]] && \ + log_must $ZFS set canmount=$old_fs_canmount $TESTPOOL/$TESTFS + + unmount_all_safe > /dev/null 2>&1 + log_must $ZFS mount -a +} + +log_assert "Setting a valid property of canmount to file system, it must be successful." +log_onexit cleanup + +typeset old_fs_canmount="" old_ctr_canmount="" + +old_fs_canmount=$(get_prop canmount $TESTPOOL/$TESTFS) +[[ $? != 0 ]] && \ + log_fail "Get the $TESTPOOL/$TESTFS canmount error." +old_ctr_canmount=$(get_prop canmount $TESTPOOL/$TESTCTR) +[[ $? != 0 ]] && \ + log_fail "Get the $TESTPOOL/$TESTCTR canmount error." + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_must $ZFS snapshot $TESTPOOL/$TESTVOL@$TESTSNAP +log_must $ZFS clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE +log_must $ZFS clone $TESTPOOL/$TESTVOL@$TESTSNAP $TESTPOOL/$TESTCLONE1 + +for dataset in "${dataset_pos[@]}" ; do + for value in "${values[@]}" ; do + set_n_check_prop "$value" "canmount" "$dataset" + if [[ $value == "off" ]]; then + log_mustnot ismounted $dataset + log_mustnot $ZFS mount $dataset + log_mustnot ismounted $dataset + else + if ! ismounted $dataset ; then + log_must $ZFS mount $dataset + fi + log_must ismounted $dataset + fi + done +done + +for dataset in "${dataset_neg[@]}" ; do + for value in "${values[@]}" ; do + set_n_check_prop "$value" "canmount" \ + "$dataset" "false" + log_mustnot ismounted $dataset + done +done + +log_pass "Setting canmount to filesystem pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_002_pos.ksh new file mode 100644 index 00000000000..bfb98d69ce6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_002_pos.ksh @@ -0,0 +1,170 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)canmount_002_pos.ksh 1.2 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: canmount_002_pos +# +# DESCRIPTION: +# Setting valid canmount to filesystem, it is successful. +# Whatever is set to volume or snapshot, it is failed. +# 'zfs set canmount=noauto ' +# +# STRATEGY: +# 1. Setup a pool and create fs, volume, snapshot clone within it. +# 2. Set canmount=noauto for each dataset and check the retuen value +# and check if it still can be mounted by mount -a. +# 3. mount each dataset(except volume) to see if it can be mounted. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-03-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# check if the testing box support noauto option or not. +$ZFS get 2>&1 | $GREP -w canmount | $GREP -w noauto >/dev/null 2>&1 +if (( $? != 0 )); then + log_unsupported "canmount=noauto is not supported." +fi + +set -A dataset_pos \ + "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCLONE" + +if is_global_zone ; then + set -A dataset_neg \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTFS@$TESTSNAP" \ + "$TESTPOOL/$TESTVOL@$TESTSNAP" "$TESTPOOL/$TESTCLONE1" +else + set -A dataset_neg \ + "$TESTPOOL/$TESTFS@$TESTSNAP" "$TESTPOOL/$TESTVOL@$TESTSNAP" +fi + +function cleanup +{ + i=0 + while (( i < ${#dataset_pos[*]} )); do + ds=${dataset_pos[i]} + if datasetexists $ds; then + log_must $ZFS set mountpoint=${old_mnt[i]} $ds + log_must $ZFS set canmount=${old_canmount[i]} $ds + fi + (( i = i + 1 )) + done + + ds=$TESTPOOL/$TESTCLONE + if datasetexists $ds; then + mntp=$(get_prop mountpoint $ds) + log_must $ZFS destroy $ds + if [[ -d $mntp ]]; then + $RM -fr $mntp + fi + fi + + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTFS@$TESTSNAP + fi + if snapexists $TESTPOOL/$TESTVOL@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTVOL@$TESTSNAP + fi + + $ZFS unmount -a > /dev/null 2>&1 + log_must $ZFS mount -a + + if [[ -d $tmpmnt ]]; then + $RM -fr $tmpmnt + fi +} + +log_assert "Setting canmount=noauto to file system, it must be successful." +log_onexit cleanup + +set -A old_mnt +set -A old_canmount +typeset tmpmnt=/tmpmount${TESTCASE_ID} +typeset ds + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_must $ZFS snapshot $TESTPOOL/$TESTVOL@$TESTSNAP +log_must $ZFS clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE +log_must $ZFS clone $TESTPOOL/$TESTVOL@$TESTSNAP $TESTPOOL/$TESTCLONE1 + +typeset -i i=0 +while (( i < ${#dataset_pos[*]} )); do + ds=${dataset_pos[i]} + old_mnt[i]=$(get_prop mountpoint $ds) + old_canmount[i]=$(get_prop canmount $ds) + (( i = i + 1 )) +done + +i=0 +while (( i < ${#dataset_pos[*]} )) ; do + dataset=${dataset_pos[i]} + set_n_check_prop "noauto" "canmount" "$dataset" + log_must $ZFS set mountpoint=$tmpmnt $dataset + if ismounted $dataset; then + $ZFS unmount -a > /dev/null 2>&1 + log_must mounted $dataset + log_must $ZFS unmount $dataset + log_must unmounted $dataset + log_must $ZFS mount -a + log_must unmounted $dataset + else + log_must $ZFS mount -a + log_must unmounted $dataset + $ZFS unmount -a > /dev/null 2>&1 + log_must unmounted $dataset + fi + + log_must $ZFS mount $dataset + log_must mounted $dataset + log_must $ZFS set canmount="${old_canmount[i]}" $dataset + log_must $ZFS set mountpoint="${old_mnt[i]}" $dataset + (( i = i + 1 )) +done + +for dataset in "${dataset_neg[@]}" ; do + set_n_check_prop "noauto" "canmount" "$dataset" "false" + log_mustnot ismounted $dataset +done + +log_pass "Setting canmount=noauto to filesystem pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_003_pos.ksh new file mode 100644 index 00000000000..017ae5f750d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_003_pos.ksh @@ -0,0 +1,131 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)canmount_003_pos.ksh 1.2 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: canmount_003_pos +# +# DESCRIPTION: +# While canmount=noauto and the dataset is mounted, +# zfs must not attempt to unmount it. +# +# STRATEGY: +# 1. Setup a pool and create fs, volume, snapshot clone within it. +# 2. Set canmount=noauto for each dataset and check the return value +# and check if it still can not be unmounted when the dataset is mounted +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-09-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# check if the testing box support noauto option or not. +$ZFS get 2>&1 | $GREP -w canmount | $GREP -w noauto >/dev/null 2>&1 +if (( $? != 0 )); then + log_unsupported "canmount=noauto is not supported." +fi + +set -A dataset_pos "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCLONE" + +function cleanup +{ + i=0 + cd $pwd + while (( i < ${#dataset_pos[*]} )); do + ds=${dataset_pos[i]} + if datasetexists $ds; then + log_must $ZFS set mountpoint=${old_mnt[i]} $ds + log_must $ZFS set canmount=${old_canmount[i]} $ds + fi + (( i = i + 1 )) + done + + ds=$TESTPOOL/$TESTCLONE + if datasetexists $ds; then + mntp=$(get_prop mountpoint $ds) + log_must $ZFS destroy $ds + if [[ -d $mntp ]]; then + log_must $RM -fr $mntp + fi + fi + + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTFS@$TESTSNAP + fi + + unmount_all_safe > /dev/null 2>&1 + log_must $ZFS mount -a +} + +log_assert "While canmount=noauto and the dataset is mounted,"\ + " zfs must not attempt to unmount it" +log_onexit cleanup + +set -A old_mnt +set -A old_canmount +typeset ds +typeset pwd=$PWD + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_must $ZFS clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE + +typeset -i i=0 +while (( i < ${#dataset_pos[*]} )); do + ds=${dataset_pos[i]} + old_mnt[i]=$(get_prop mountpoint $ds) + old_canmount[i]=$(get_prop canmount $ds) + (( i = i + 1 )) +done + +i=0 +while (( i < ${#dataset_pos[*]} )) ; do + dataset=${dataset_pos[i]} + if ismounted $dataset; then + log_must cd ${old_mnt[i]} + set_n_check_prop "noauto" "canmount" "$dataset" + log_must mounted $dataset + fi + (( i = i + 1 )) +done + +log_pass "Setting canmount=noauto to filesystem while dataset busy pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_004_pos.ksh new file mode 100644 index 00000000000..d341659fdb8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/canmount_004_pos.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)canmount_004_pos.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: canmount_sharenfs_001_pos +# +# DESCRIPTION: +# Verify canmount=noauto work fine when setting sharenfs or sharesmb. +# +# STRATEGY: +# 1. Create a fs canmount=noauto. +# 2. Set sharenfs or sharesmb. +# 3. Verify the fs is umounted. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-05-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +# properties +set -A sharenfs_prop "off" "on" "rw" +set -A sharesmb_prop "off" "on" +if check_version "5.11" ; then + set -A sharesmb_prop ${sharesmb_prop[*]} "name=anybody" +fi + +function cleanup +{ + log_must $ZFS destroy -rR $CS_FS +} + +function assert_unmounted +{ + mnted=$(get_prop mounted $CS_FS) + if [[ "$mnted" == "yes" ]]; then + canmnt=$(get_prop canmount $CS_FS) + shnfs=$(get_prop sharenfs $CS_FS) + shsmb=$(get_prop sharesmb $CS_FS) + mntpt=$(get_prop mountpoint $CS_FS) + log_fail "$CS_FS should be unmounted" \ + "[canmount=$canmnt,sharenfs=$shnfs,sharesmb=$shsmb,mountpoint=$mntpt]." + fi +} + +log_assert "Verify canmount=noauto work fine when setting sharenfs or sharesmb." +log_onexit cleanup + +CS_FS=$TESTPOOL/$TESTFS/cs_fs.${TESTCASE_ID} +oldmpt=$TESTDIR/old_cs_fs.${TESTCASE_ID} +newmpt=$TESTDIR/new_cs_fs.${TESTCASE_ID} + +log_must $ZFS create -o canmount=noauto -o mountpoint=$oldmpt $CS_FS +assert_unmounted + +for n in ${sharenfs_prop[@]}; do + log_must $ZFS set sharenfs="$n" $CS_FS + assert_unmounted + for s in ${sharesmb_prop[@]}; do + log_must $ZFS set sharesmb="$s" $CS_FS + assert_unmounted + + mntpt=$(get_prop mountpoint $CS_FS) + if [[ "$mntpt" == "$oldmpt" ]]; then + log_must $ZFS set mountpoint="$newmpt" $CS_FS + else + log_must $ZFS set mountpoint="$oldmpt" $CS_FS + fi + assert_unmounted + done +done + +log_pass "Verify canmount=noauto work fine when setting sharenfs or sharesmb." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/checksum_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/checksum_001_pos.ksh new file mode 100644 index 00000000000..aa150e245ee --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/checksum_001_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)checksum_001_pos.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: checksum_001_pos +# +# DESCRIPTION: +# Setting a valid checksum on a pool, file system, volume, it should be +# successful. +# +# STRATEGY: +# 1. Create pool, then create filesystem and volume within it. +# 2. Setting different valid checksum to each dataset. +# 3. Check the return value and make sure it is 0. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +enc=$(get_prop encryption $TESTPOOL/$TESTFS) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + log_unsupported "checksum property can not be changed when \ +encryption is set to on." +fi + +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" +set -A values "on" "off" "fletcher2" "fletcher4" "sha256" + +log_assert "Setting a valid checksum on a file system, volume," \ + "it should be successful." + +typeset -i i=0 +typeset -i j=0 +while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + set_n_check_prop "${values[j]}" "checksum" "${dataset[i]}" + (( j += 1 )) + done + (( i += 1 )) +done + +log_pass "Setting a valid checksum on a file system, volume pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cleanup.ksh new file mode 100644 index 00000000000..250c5b635c5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_container_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/compression_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/compression_001_pos.ksh new file mode 100644 index 00000000000..45381dfcdc9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/compression_001_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)compression_001_pos.ksh 1.3 07/06/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: compression_001_pos +# +# DESCRIPTION: +# Setting a valid compression on file system or volume. +# It should be successful. +# +# STRATEGY: +# 1. Create pool, then create filesystem & volume within it. +# 2. Setting valid value, it should be successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" +set -A values $(get_compress_opts zfs_set) + +log_assert "Setting a valid compression on file system and volume, " \ + "It should be successful." + +typeset -i i=0 +typeset -i j=0 +for propname in "compression" "compress" +do + while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + set_n_check_prop "${values[j]}" "$propname" "${dataset[i]}" + (( j += 1 )) + done + (( i += 1 )) + done +done + +log_pass "Setting a valid compression on file system or volume pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_001_pos.ksh new file mode 100644 index 00000000000..30001b0057d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_001_pos.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mountpoint_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: mountpoint_001_pos +# +# DESCRIPTION: +# Setting valid mountpoint to filesystem, it is successful. +# Whatever is set to volume, it is failed. +# 'zfs set mountpoint=|legacy|none ' +# +# STRATEGY: +# 1. Setup a pool and create fs, ctr within it. +# 2. Loop all the valid mountpoint value. +# 3. Check the return value. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if is_global_zone ; then + set -A dataset \ + "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTVOL" +else + set -A dataset "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" +fi + +set -A values "$TESTDIR2" "legacy" "none" "$TESTDIR_NOTEXISTING" + +function cleanup +{ + log_must $ZFS set mountpoint=$old_ctr_mpt $TESTPOOL/$TESTCTR + log_must $ZFS set mountpoint=$old_fs_mpt $TESTPOOL/$TESTFS + [[ -d $TESTDIR2 ]] && log_must $RM -r $TESTDIR2 + [[ -d $TESTDIR_NOTEXISTING ]] && log_must $RM -r $TESTDIR_NOTEXISTING +} + +log_assert "Setting a valid mountpoint to file system, it must be successful." +log_onexit cleanup + +old_fs_mpt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +[[ $? != 0 ]] && \ + log_fail "Get the $TESTPOOL/$TESTFS mountpoint error." +old_ctr_mpt=$(get_prop mountpoint $TESTPOOL/$TESTCTR) +[[ $? != 0 ]] && \ + log_fail "Get the $TESTPOOL/$TESTCTR mountpoint error." + +if [[ ! -d $TESTDIR2 ]]; then + log_must $MKDIR $TESTDIR2 +fi + +typeset -i i=0 +typeset -i j=0 +while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + if [[ ${dataset[i]} == "$TESTPOOL/$TESTVOL" ]]; then + set_n_check_prop "${values[j]}" "mountpoint" \ + "${dataset[i]}" "false" + else + set_n_check_prop "${values[j]}" "mountpoint" \ + "${dataset[i]}" + fi + (( j += 1 )) + done + cleanup + (( i += 1 )) +done + +log_pass "Setting mountpoint to filesystem pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_002_pos.ksh new file mode 100644 index 00000000000..0d6a3719cc7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_002_pos.ksh @@ -0,0 +1,110 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mountpoint_002_pos.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: mountpoint_002_pos +# +# DESCRIPTION: +# If ZFS is currently managing the file system but it is currently unmoutned, +# and the mountpoint property is changed, the file system remains unmounted. +# +# STRATEGY: +# 1. Setup a pool and create fs, ctr within it. +# 2. Unmount that dataset +# 2. Change the mountpoint to the valid mountpoint value. +# 3. Check the file system remains unmounted. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A dataset "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" + +set -A values "$TESTDIR2" "$TESTDIR_NOTEXISTING" + +function cleanup +{ + log_must $ZFS set mountpoint=$old_ctr_mpt $TESTPOOL/$TESTCTR + log_must $ZFS set mountpoint=$old_fs_mpt $TESTPOOL/$TESTFS + log_must $ZFS mount -a + [[ -d $TESTDIR2 ]] && log_must $RM -r $TESTDIR2 + [[ -d $TESTDIR_NOTEXISTING ]] && log_must $RM -r $TESTDIR_NOTEXISTING +} + +log_assert "Setting a valid mountpoint for an unmounted file system, \ + it remains unmounted." +log_onexit cleanup + +old_fs_mpt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +[[ $? != 0 ]] && \ + log_fail "Unable to get the mountpoint property for $TESTPOOL/$TESTFS" +old_ctr_mpt=$(get_prop mountpoint $TESTPOOL/$TESTCTR) +[[ $? != 0 ]] && \ + log_fail "Unable to get the mountpoint property for $TESTPOOL/$TESTCTR" + +if [[ ! -d $TESTDIR2 ]]; then + log_must $MKDIR $TESTDIR2 +fi + +typeset -i i=0 +typeset -i j=0 +while (( i < ${#dataset[@]} )); do + j=0 + if ismounted ${dataset[i]} ; then + log_must $ZFS unmount ${dataset[i]} + fi + log_mustnot ismounted ${dataset[i]} + while (( j < ${#values[@]} )); do + set_n_check_prop "${values[j]}" "mountpoint" \ + "${dataset[i]}" + log_mustnot ismounted ${dataset[i]} + (( j += 1 )) + done + cleanup + (( i += 1 )) +done + +log_pass "Setting a valid mountpoint for an unmounted file system, \ + it remains unmounted." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_003_pos.ksh new file mode 100644 index 00000000000..5a2dc548bbe --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/mountpoint_003_pos.ksh @@ -0,0 +1,116 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mountpoint_003_pos.ksh 1.5 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: mountpoint_003_pos +# +# DESCRIPTION: +# Verify FSType-specific option works well with legacy mount. +# +# STRATEGY: +# 1. Set up FSType-specific options and expected keywords array. +# 2. Create a test ZFS file system and set mountpoint=legacy. +# 3. Mount ZFS test filesystem with specific options. +# 4. Verify the filesystem was mounted with specific option. +# 5. Loop check all the options. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-01-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + ismounted $tmpmnt && log_must $UMOUNT $tmpmnt + [[ -d $tmpmnt ]] && log_must $RM -rf $tmpmnt + [[ -n $oldmpt ]] && log_must $ZFS set mountpoint=$oldmpt $testfs + ! ismounted $oldmpt && log_must $ZFS mount $testfs +} + +log_assert "With legacy mount, FSType-specific option works well." +log_onexit cleanup + +# +# /mnt on pool/fs read/write/setuid/devices/noexec/xattr/atime/dev=2d9009e +# +# FSType- FSType- +# specific Keyword specific Keyword +# option option +# +set -A args \ + "devices" "/devices/" "nodevices" "/nodevices/" \ + "exec" "/exec/" "noexec" "/noexec/" \ + "nbmand" "/nbmand/" "nonbmand" "/nonbmand/" \ + "ro" "read only" "rw" "read/write" \ + "setuid" "/setuid/" "nosetuid" "/nosetuid/" \ + "xattr" "/xattr/" "noxattr" "/noxattr/" \ + "atime" "/atime/" "noatime" "/noatime/" + +tmpmnt=/tmpmnt.${TESTCASE_ID} +[[ -d $tmpmnt ]] && $RM -rf $tmpmnt +testfs=$TESTPOOL/$TESTFS +log_must $MKDIR $tmpmnt +oldmpt=$(get_prop mountpoint $testfs) +log_must $ZFS set mountpoint=legacy $testfs + +typeset i=0 +while ((i < ${#args[@]})); do + log_must $MOUNT -t zfs -o ${args[$i]} $testfs $tmpmnt + msg=$($MOUNT | $GREP "^$tmpmnt ") + + # In LZ, a user with all zone privileges can never with "devices" + if ! is_global_zone && [[ ${args[$i]} == devices ]] ; then + args[((i+1))]="/nodevices/" + fi + + $ECHO $msg | $GREP "${args[((i+1))]}" > /dev/null 2>&1 + if (($? != 0)) ; then + log_fail "Expected option: ${args[((i+1))]} \n" \ + "Real option: $msg" + fi + + log_must $UMOUNT $tmpmnt + ((i += 2)) +done + +log_pass "With legacy mount, FSType-specific option works well passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/onoffs_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/onoffs_001_pos.ksh new file mode 100644 index 00000000000..2007e0871ad --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/onoffs_001_pos.ksh @@ -0,0 +1,106 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)onoffs_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: onoffs_001_pos +# +# DESCRIPTION: +# Setting a valid value to atime, readonly, or setuid on file +# system or volume. It should be successful. +# +# STRATEGY: +# 1. Create pool and filesystem & volume within it. +# 2. Setting valid value, it should be successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS mount -a +} + +log_onexit cleanup + +set -A props "atime" "readonly" "setuid" +set -A values "on" "off" + +if is_global_zone ; then + set -A dataset "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTVOL" +else + set -A dataset "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" +fi + +log_assert "Setting a valid value to atime, readonly, or setuid on file" \ + "system or volume. It should be successful." + +typeset -i i=0 +typeset -i j=0 +typeset -i k=0 +while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#props[@]} )); do + k=0 + while (( k < ${#values[@]} )); do + if [[ ${dataset[i]} == "$TESTPOOL/$TESTVOL" && \ + ${props[j]} != "readonly" ]] + then + set_n_check_prop "${values[k]}" "${props[j]}" \ + "${dataset[i]}" "false" + else + set_n_check_prop "${values[k]}" "${props[j]}" \ + "${dataset[i]}" + fi + + (( k += 1 )) + done + (( j += 1 )) + done + (( i += 1 )) +done + +log_pass "Setting a valid value to atime, readonly, or setuid on file" \ + "system or volume pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/property_alias_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/property_alias_001_pos.ksh new file mode 100644 index 00000000000..3b847d03f16 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/property_alias_001_pos.ksh @@ -0,0 +1,158 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)property_alias_001_pos.ksh 1.4 09/01/13 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: property_alias_001_pos +# +# DESCRIPTION: +# Verify the properties with aliases also work with those aliases +# +# STRATEGY: +# 1. Create pool, then create filesystem & volume within it. +# 2. Set or retrieve property via alias with datasets. +# 3. Verify the result should be successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function set_and_check # +{ + typeset ds=$1 + typeset setprop=$2 + typeset setval=$3 + typeset chkprop=$4 + typeset getval + + log_must $ZFS set $setprop=$setval $ds + if [[ $setval == "gzip-6" ]]; then + setval="gzip" + fi + getval=$(get_prop $chkprop $ds) + + case $setprop in + reservation|reserv ) + if [[ $setval == "none" ]]; then + [[ $getval != "0" ]] && \ + log_fail "Setting the property $setprop" \ + "with value $setval fails." + elif [[ $getval != $setval ]]; then + log_fail "Setting the property $setprop with" \ + "with $setval fails." + fi + ;; + * ) + [[ $getval != $setval ]] && \ + log_fail "Setting the property $setprop with value \ + $setval fails." + ;; + esac +} + +log_assert "Properties with aliases also work with those aliases." + +set -A ro_prop "available" "avail" "referenced" "refer" +set -A rw_prop "readonly" "rdonly" "compression" "compress" "reservation" "reserv" +set -A chk_prop "rdonly" "readonly" "compress" "compression" "reserv" "reservation" +set -A size "512" "1024" "2048" "4096" "8192" "16384" "32768" "65536" "131072" + +pool=$TESTPOOL +fs=$TESTPOOL/$TESTFS +vol=$TESTPOOL/$TESTVOL +typeset -l avail_space=$(get_prop avail $pool) +typeset -l reservsize +typeset -i i=0 + +for ds in $pool $fs $vol; do + for propname in ${ro_prop[*]}; do + $ZFS get -pH -o value $propname $ds >/dev/null 2>&1 + (( $? != 0 )) && \ + log_fail "Get the property $proname of $ds failed." + done + i=0 + while (( i < ${#rw_prop[*]} )); do + case ${rw_prop[i]} in + readonly|rdonly ) + for val in "on" "off"; do + set_and_check $ds ${rw_prop[i]} $val ${chk_prop[i]} + done + ;; + compression|compress ) + for val in $(get_compress_opts zfs_set); do + set_and_check $ds ${rw_prop[i]} $val ${chk_prop[i]} + done + ;; + reservation|reserv ) + (( reservsize = $avail_space % $RANDOM )) + for val in "0" "$reservsize" "none"; do + set_and_check $ds ${rw_prop[i]} $val ${chk_prop[i]} + done + ;; + esac + + (( i = i + 1 )) + done + if [[ $ds == $vol ]]; then + for propname in "volblocksize" "volblock" ; do + $ZFS get -pH -o value $propname $ds >/dev/null 2>&1 + (( $? != 0 )) && \ + log_fail "Get the property $propname of $ds failed." + done + fi +done + +for ds in $pool $fs; do + for propname in "recordsize" "recsize"; do + for val in ${size[*]}; do + if [[ $propname == "recordsize" ]]; then + set_and_check $ds $propname $val "recsize" + else + set_and_check $ds $propname $val "recordsize" + fi + done + done +done + +log_pass "The alias of a property works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/readonly_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/readonly_001_pos.ksh new file mode 100644 index 00000000000..f123addc5fa --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/readonly_001_pos.ksh @@ -0,0 +1,172 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)readonly_001_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: readonly_001_pos +# +# DESCRIPTION: +# Setting readonly on a dataset, it should keep the dataset as readonly. +# +# STRATEGY: +# 1. Create pool, then create filesystem and volume within it. +# 2. Setting readonly to each dataset. +# 3. Check the return value and make sure it is 0. +# 4. Verify the stuff under mountpoint is readonly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for dataset in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL ; do + snapexists ${dataset}@$TESTSNAP && \ + log_must $ZFS destroy -R ${dataset}@$TESTSNAP + done +} + +function initial_dataset # $1 dataset +{ + typeset dataset=$1 + + typeset fstype=$(get_prop type $dataset) + + if [[ $fstype == "filesystem" ]] ; then + typeset mtpt=$(get_prop mountpoint $dataset) + log_must $TOUCH $mtpt/$TESTFILE0 + log_must $MKDIR -p $mtpt/$TESTDIR0 + fi +} + + +function cleanup_dataset # $1 dataset +{ + typeset dataset=$1 + + typeset fstype=$(get_prop type $dataset) + + if [[ $fstype == "filesystem" ]] ; then + typeset mtpt=$(get_prop mountpoint $dataset) + log_must $RM -f $mtpt/$TESTFILE0 + log_must $RM -rf $mtpt/$TESTDIR0 + fi +} + +function verify_readonly # $1 dataset, $2 on|off +{ + typeset dataset=$1 + typeset value=$2 + + if datasetnonexists $dataset ; then + log_note "$dataset not exist!" + return 1 + fi + + typeset fstype=$(get_prop type $dataset) + + expect="log_must" + + if [[ $2 == "on" ]] ; then + expect="log_mustnot" + fi + + case $fstype in + filesystem) + typeset mtpt=$(get_prop mountpoint $dataset) + $expect $TOUCH $mtpt/$TESTFILE1 + $expect $MKDIR -p $mtpt/$TESTDIR1 + $expect $ECHO 'y' | $RM $mtpt/$TESTFILE0 + $expect $RMDIR $mtpt/$TESTDIR0 + + if [[ $expect == "log_must" ]] ; then + log_must $ECHO 'y' | $RM $mtpt/$TESTFILE1 + log_must $RMDIR $mtpt/$TESTDIR1 + log_must $TOUCH $mtpt/$TESTFILE0 + log_must $MKDIR -p $mtpt/$TESTDIR0 + fi + ;; + volume) + $expect eval "$ECHO 'y' | $NEWFS /dev/zvol/$dataset > /dev/null 2>&1" + ;; + *) + ;; + esac + + return 0 +} + +log_onexit cleanup + +log_assert "Setting a valid readonly property on a dataset succeeds." + +typeset all_datasets + +log_must $ZFS mount -a + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_must $ZFS clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE + +if is_global_zone ; then + log_must $ZFS snapshot $TESTPOOL/$TESTVOL@$TESTSNAP + log_must $ZFS clone $TESTPOOL/$TESTVOL@$TESTSNAP $TESTPOOL/$TESTCLONE1 + all_datasets="$TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCLONE $TESTPOOL/$TESTCLONE1" +else + all_datasets="$TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTCLONE" +fi + + +for dataset in $all_datasets; do + for value in on off; do + set_n_check_prop "off" "readonly" "$dataset" + initial_dataset $dataset + + set_n_check_prop "$value" "readonly" "$dataset" + verify_readonly $dataset $value + + set_n_check_prop "off" "readonly" "$dataset" + cleanup_dataset $dataset + done +done + +log_pass "Setting a valid readonly property on a dataset succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/reservation_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/reservation_001_neg.ksh new file mode 100644 index 00000000000..1e5345059cd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/reservation_001_neg.ksh @@ -0,0 +1,116 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_001_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_001_neg +# +# DESCRIPTION: +# Valid reservation values should be positive integers only. +# +# STRATEGY: +# 1) Form an array of invalid reservation values (negative and +# incorrectly formed) +# 2) Attempt to set each invalid reservation value in turn on a +# filesystem and volume. +# 3) Verify that attempt fails and the reservation value remains +# unchanged +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify invalid reservation values are rejected" + +set -A suffix "b" "k" "m" "t" "p" "e" "K" "M" "G" "T" "P" "E" "kb" "Mb" "Gb" \ + "Tb" "Pb" "Eb" "KB" "MB" "GB" "TB" "PB" "EB" + +set -A values '' '-1' '-1.0' '-1.8' '-9999999999999999' '0x1' '0b' '1b' '1.1b' + +# +# Function to loop through a series of bad reservation +# values, checking they are when we attempt to set them +# on a dataset. +# +function set_n_check # data-set +{ + typeset obj=$1 + typeset -i i=0 + typeset -i j=0 + + orig_resv_val=$(get_prop reservation $obj) + + while (( $i < ${#values[*]} )); do + j=0 + while (( $j < ${#suffix[*]} )); do + + $ZFS set \ + reservation=${values[$i]}${suffix[$j]} $obj \ + > /dev/null 2>&1 + if [ $? -eq 0 ] + then + log_note "$ZFS set \ + reservation=${values[$i]}${suffix[$j]} $obj" + log_fail "The above reservation set returned 0!" + fi + + new_resv_val=$(get_prop reservation $obj) + + if [[ $new_resv_val != $orig_resv_val ]]; then + log_fail "$obj : reservation values changed " \ + "($orig_resv_val : $new_resv_val)" + fi + (( j = j + 1 )) + done + + (( i = i + 1 )) + done +} + +for dataset in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCTR $TESTPOOL/$TESTVOL +do + set_n_check $dataset +done + +log_pass "Invalid reservation values correctly rejected" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/ro_props_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/ro_props_001_pos.ksh new file mode 100644 index 00000000000..d7422339c74 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/ro_props_001_pos.ksh @@ -0,0 +1,163 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)ro_props_001_pos.ksh 1.4 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: ro_props_001_pos +# +# DESCRIPTION: +# Verify that read-only properties are immutable. +# +# STRATEGY: +# 1. Create pool, fs, vol, fs@snap & vol@snap. +# 2. Get the original property value and set value to those properties. +# 3. Check return value. +# 4. Compare the current property value with the original one. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A values filesystem volume snapshot -3 0 1 50K 10G 80G \ + 2005/06/17 30K 20x yes no \ + on off default pool/fs@snap $TESTDIR +set -A dataset $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS@$TESTSNAP \ + $TESTPOOL/$TESTVOL@$TESTSNAP + +typeset ro_props="type" +ro_props="$ro_props creation" +ro_props="$ro_props compressratio" +ro_props="$ro_props mounted" +ro_props="$ro_props origin" +# Uncomment these once the test ensures they can't be changed. +#ro_props="$ro_props used" +#ro_props="$ro_props available" +#ro_props="$ro_props avail" +#ro_props="$ro_props referenced" +#ro_props="$ro_props refer" + +typeset snap_ro_props="volsize" +snap_ro_props="$snap_ro_props recordsize" +snap_ro_props="$snap_ro_props recsize" +snap_ro_props="$snap_ro_props quota" +snap_ro_props="$snap_ro_props reservation" +snap_ro_props="$snap_ro_props reserv" +snap_ro_props="$snap_ro_props mountpoint" +snap_ro_props="$snap_ro_props sharenfs" +snap_ro_props="$snap_ro_props checksum" +snap_ro_props="$snap_ro_props compression" +snap_ro_props="$snap_ro_props compress" +snap_ro_props="$snap_ro_props atime" +snap_ro_props="$snap_ro_props devices" +snap_ro_props="$snap_ro_props exec" +snap_ro_props="$snap_ro_props readonly" +snap_ro_props="$snap_ro_props rdonly" +snap_ro_props="$snap_ro_props setuid" + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + snap_ro_props="$snap_ro_props version" +fi + +function cleanup +{ + poolexists $TESTPOOL && log_must $ZPOOL history $TESTPOOL + datasetexists $TESTPOOL/$TESTVOL@$TESTSNAP && \ + destroy_snapshot $TESTPOOL/$TESTVOL@$TESTSNAP + datasetexists $TESTPOOL/$TESTFS@$TESTSNAP && \ + destroy_snapshot $TESTPOOL/$TESTFS@$TESTSNAP +} + +log_assert "Verify that read-only properties are immutable." +log_onexit cleanup + +# Create filesystem and volume's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +# Make sure any history logs have been synced. They're asynchronously +# pushed to the syncing context, and could influence the value of some +# properties on $TESTPOOL, like 'used'. Fetching it here forces the sync, +# per spa_history.c:spa_history_get(). +log_must $ZPOOL history $TESTPOOL + +typeset -i i=0 +typeset -i j=0 +typeset cur_value="" +typeset props="" + +while (( i < ${#dataset[@]} )); do + props=$ro_props + + dst_type=$(get_prop type ${dataset[i]}) + if [[ $dst_type == 'snapshot' ]]; then + props="$ro_props $snap_ro_props" + fi + + for prop in $props; do + cur_value=$(get_prop $prop ${dataset[i]}) + + j=0 + while (( j < ${#values[@]} )); do + # + # If the current property value is equal to values[j], + # just expect it failed. Otherwise, set it to dataset, + # expecting it failed and the property value is not + # equal to values[j]. + # + if [[ $cur_value == ${values[j]} ]]; then + log_mustnot $ZFS set $prop=${values[j]} \ + ${dataset[i]} + else + set_n_check_prop ${values[j]} $prop \ + ${dataset[i]} false + fi + (( j += 1 )) + done + done + (( i += 1 )) +done + +log_pass "Setting uneditable properties fail, as required." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/setup.ksh new file mode 100644 index 00000000000..491e9e1fa03 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} +default_container_volume_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/share_mount_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/share_mount_001_neg.ksh new file mode 100644 index 00000000000..ace3d14c395 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/share_mount_001_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)share_mount_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: share_mount_001_neg +# +# DESCRIPTION: +# Verify that we cannot share or mount legacy filesystems. +# +# STRATEGY: +# 1. Set mountpoint as legacy or none +# 2. Use zfs share or zfs mount to share or mount the filesystem +# 3. Verify that the command returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-9) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS set mountpoint=$oldmpt $fs +} + +log_assert "Verify that we cannot share or mount legacy filesystems." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +oldmpt=$(get_prop mountpoint $fs) + +for propval in "legacy" "none"; do + log_must $ZFS set mountpoint=$propval $fs + + log_mustnot $ZFS mount $fs + log_mustnot $ZFS share $fs +done + +log_pass "We cannot share or mount legacy filesystems as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/snapdir_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/snapdir_001_pos.ksh new file mode 100644 index 00000000000..5fb2e63bef1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/snapdir_001_pos.ksh @@ -0,0 +1,128 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)snapdir_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: snapdir_001_pos +# +# DESCRIPTION: +# Setting a valid snapdir on a dataset, it should be successful. +# +# STRATEGY: +# 1. Create pool, then create filesystem and volume within it. +# 2. Create a snapshot for each dataset. +# 3. Setting different valid snapdir to each dataset. +# 4. Check the return value and make sure it is 0. +# 5. Verify .zfs directory is hidden|visible according to the snapdir setting. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-02-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for dataset in $all_datasets; do + snapexists ${dataset}@snap && \ + log_must $ZFS destroy ${dataset}@snap + done +} + +function verify_snapdir_visible # $1 dataset, $2 hidden|visible +{ + typeset dataset=$1 + typeset value=$2 + typeset mtpt=$(get_prop mountpoint $dataset) + typeset name + + CTLDIR=".zfs" + + for name in `$LS -a $mtpt`; do + if [[ $name == $CTLDIR ]]; then + if [[ $value == "visible" ]]; then + return 0 + else + return 1 + fi + fi + done + + if [[ $value == "visible" ]]; then + return 1 + else + return 0 + fi +} + + +typeset all_datasets + +if is_global_zone ; then + all_datasets="$TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL" +else + all_datasets="$TESTPOOL $TESTPOOL/$TESTFS" +fi + +log_onexit cleanup + +for dataset in $all_datasets; do + log_must $ZFS snapshot ${dataset}@snap +done + +log_assert "Setting a valid snapdir property on a dataset succeeds." + +for dataset in $all_datasets; do + for value in hidden visible; do + if [[ $dataset == "$TESTPOOL/$TESTVOL" ]] ; then + set_n_check_prop "$value" "snapdir" \ + "$dataset" "false" + else + set_n_check_prop "$value" "snapdir" \ + "$dataset" + verify_snapdir_visible $dataset $value + [[ $? -eq 0 ]] || \ + log_fail "$dataset/.zfs is not $value as expect." + fi + done +done + +log_pass "Setting a valid snapdir property on a dataset succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_001_pos.ksh new file mode 100644 index 00000000000..fb3b73e41be --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_001_pos.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)user_property_001_pos.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: user_property_001_pos +# +# DESCRIPTION: +# ZFS can set any valid user defined property to the non-readonly dataset. +# +# STRATEGY: +# 1. Loop pool, fs and volume. +# 2. Combine all kind of valid characters into a valid user defined +# property name. +# 3. Random get a string as the value. +# 4. Verify all the valid user defined properties can be set to the +# dataset in #1. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "ZFS can set any valid user defined property to the non-readonly " \ + "dataset." +log_onexit cleanup_user_prop $TESTPOOL + +typeset -i i=0 +while ((i < 10)); do + typeset -i len + ((len = RANDOM % 32)) + typeset user_prop=$(valid_user_property $len) + ((len = RANDOM % 512)) + typeset value=$(user_property_value $len) + + for dtst in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + log_must eval "$ZFS set $user_prop='$value' $dtst" + log_must eval "check_user_prop $dtst $user_prop '$value'" + done + + ((i += 1)) +done + +log_pass "ZFS can set any valid user defined property passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_002_pos.ksh new file mode 100644 index 00000000000..085868d64ac --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_002_pos.ksh @@ -0,0 +1,136 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)user_property_002_pos.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: user_property_002_pos +# +# DESCRIPTION: +# User defined property are always inherited from its parent dataset +# directly. +# +# STRATEGY: +# 1. Create pool, fs, volume, fsclone & volclone. +# 2. Get random user property name and set to the pool +# 3. Verify all dataset user property inherit from pool. +# 4. Set intermediate dataset and verify its children will inherit user +# property from it directly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + datasetexists $new_vol && log_must $ZFS rename $new_vol $vol + + typeset dtst + for dtst in $new_fsclone $new_volclone $fsclone $volclone \ + $fssnap $volsnap; do + if datasetexists $dtst; then + log_must $ZFS destroy -f $dtst + fi + done + + cleanup_user_prop $pool +} + +# +# Verify options datasets (3-n) inherit from the inherited dataset $2. +# +# $1 user property +# $2 inherited dataset +# $3-n datasets +# +function inherit_check +{ + typeset prop=$1 + typeset inherited_dtst=$2 + shift 2 + [[ -z $@ ]] && return 1 + + typeset inherited_value=$(get_prop $prop $inherited_dtst) + for dtst in $@; do + typeset value=$(get_prop $prop $dtst) + typeset source=$(get_source $prop $dtst) + if [[ "$value" != "$inherited_value" || \ + "$source" != "inherited from $inherited_dtst" ]] + then + return 1 + fi + + shift + done + + return 0 +} + +log_assert "User defined property inherited from its parent." +log_onexit cleanup + +pool=$TESTPOOL; fs=$pool/$TESTFS; vol=$pool/$TESTVOL +fssnap=$fs@snap; volsnap=$vol@snap; +log_must $ZFS snapshot $fssnap +log_must $ZFS snapshot $volsnap +fsclone=$pool/fsclone; volclone=$pool/volclone +log_must $ZFS clone $fssnap $fsclone +log_must $ZFS clone $volsnap $volclone + +prop_name=$(valid_user_property 10) +value=$(user_property_value 16) +log_must eval "$ZFS set $prop_name='$value' $pool" +log_must eval "check_user_prop $pool $prop_name '$value'" +log_must inherit_check $prop_name $pool $fs $vol $fsclone $volclone + +new_fsclone=$fs/fsclone; new_volclone=$fs/volclone +log_must $ZFS rename $fsclone $new_fsclone +log_must $ZFS rename $volclone $new_volclone +log_must inherit_check $prop_name $pool $fs $new_fsclone $new_volclone + +log_note "Set intermediate dataset will change the inherited relationship." +new_value=$(user_property_value 16) +log_must eval "$ZFS set $prop_name='$new_value' $fs" +log_must eval "check_user_prop $fs $prop_name '$new_value'" +log_must inherit_check $prop_name $fs $new_fsclone $new_volclone + +log_pass "User defined property inherited from its parent passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_003_neg.ksh new file mode 100644 index 00000000000..36f71fb4a28 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_003_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)user_property_003_neg.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: user_property_003_neg +# +# DESCRIPTION: +# ZFS can handle any invalid user defined property. +# +# STRATEGY: +# 1. Loop pool, fs and volume. +# 2. Combine all kind of invalid user property names. +# 3. Random get a string as the value. +# 4. Verify all the invalid user defined properties can not be set to the +# dataset in #1. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "ZFS can handle invalid user property." +log_onexit cleanup_user_prop $TESTPOOL + +typeset -i i=0 +while ((i < 10)); do + typeset -i len + ((len = RANDOM % 32)) + typeset user_prop=$(invalid_user_property $len) + ((len = RANDOM % 512)) + typeset value=$(user_property_value $len) + + for dtst in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL ; do + log_mustnot $ZFS set $user_prop=$value $dtst + log_mustnot check_user_prop $dtst \"$user_prop\" \"$value\" + done + + ((i += 1)) +done + +log_pass "ZFS can handle invalid user property passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_004_pos.ksh new file mode 100644 index 00000000000..829820556ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/user_property_004_pos.ksh @@ -0,0 +1,115 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)user_property_004_pos.ksh 1.4 09/05/19 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: user_property_004_neg +# +# DESCRIPTION: +# User property has no effect to snapshot until 'Snapshot properties' supported. +# +# STRATEGY: +# 1. Verify user properties could be transformed by 'zfs snapshot' +# 2. Verify user properties could be set upon snapshot. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + if datasetexists $fssnap ; then + log_must $ZFS destroy -f $fssnap + fi + done + cleanup_user_prop $TESTPOOL +} + +function nonexist_user_prop +{ + typeset user_prop=$1 + typeset dtst=$2 + + typeset source=$(get_source $user_prop $dtst) + typeset value=$(get_prop $user_prop $dtst) + if [[ $source == '-' && $value == '-' ]]; then + return 0 + else + return 1 + fi +} + +log_assert "User property has no effect to snapshot until 'Snapshot properties' supported." +log_onexit cleanup + +typeset snap_property= + +$ZPOOL upgrade -v | $GREP "Snapshot properties" > /dev/null 2>&1 +if (( $? == 0 )) ; then + snap_property="true" +fi + +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + prop_name=$(valid_user_property 10) + value=$(user_property_value 16) + log_must eval "$ZFS set $prop_name='$value' $fs" + log_must eval "check_user_prop $fs $prop_name '$value'" + + log_must $ZFS snapshot $fssnap + + if [[ -n $snap_property ]] ; then + log_mustnot nonexist_user_prop $prop_name $fssnap + + log_must eval "$ZFS set $prop_name='$value' $fssnap" + log_mustnot nonexist_user_prop $prop_name $fssnap + else + log_must nonexist_user_prop $prop_name $fssnap + log_mustnot eval "$ZFS set $prop_name='$value' $fssnap" + log_must nonexist_user_prop $prop_name $fssnap + fi +done + +log_pass "User properties has effect upon snapshot." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/version_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/version_001_neg.ksh new file mode 100644 index 00000000000..4f4c08a5d65 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/version_001_neg.ksh @@ -0,0 +1,109 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)version_001_neg.ksh 1.2 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: version_001_neg +# +# DESCRIPTION: +# Valid version values should be positive integers only. +# +# STRATEGY: +# 1) Form an array of invalid reservation values (negative and +# incorrectly formed) +# 2) Attempt to set each invalid version value in turn on a +# filesystem and volume. +# 3) Verify that attempt fails and the version value remains +# unchanged +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! fs_prop_exist "version" ; then + log_unsupported "version is not supported by this release." +fi + +log_assert "Verify invalid version values are rejected" + +set -A values '' '-1' '-1.0' '-1.8' '-9999999999999999' \ + '0x1' '0b' '1b' '1.1b' '0' '0.000' '1.234' + +# +# Function to loop through a series of bad reservation +# values, checking they are when we attempt to set them +# on a dataset. +# +function set_n_check # data-set +{ + typeset obj=$1 + typeset -i i=0 + typeset -i j=0 + + orig_val=$(get_prop version $obj) + + while (( $i < ${#values[*]} )); do + $ZFS set version=${values[$i]} $obj > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + log_note "$ZFS set version=${values[$i]} $obj" + log_fail "The above version set returned 0!" + fi + + new_val=$(get_prop version $obj) + + if [[ $new_val != $orig_val ]]; then + log_fail "$obj : version values changed " \ + "($orig_val : $new_val)" + fi + + (( i = i + 1 )) + done +} + +for dataset in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCTR $TESTPOOL/$TESTVOL +do + set_n_check $dataset +done + +log_pass "Invalid version values correctly rejected" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set.cfg new file mode 100644 index 00000000000..fe63d73a48a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_set.cfg 1.2 07/01/09 SMI" +# +. $STF_SUITE/tests/cli_root/cli.cfg + +export TESTDIR_NOTEXISTING=${TEST_BASE_DIR%%/}/testdir_notexisting${TESTCASE_ID} + +export STF_TIMEOUT=1200 #ro_prop_001_pos need more time diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_001_neg.ksh new file mode 100644 index 00000000000..746ac307ae3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_001_neg.ksh @@ -0,0 +1,93 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_set_001_neg.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_set_001_neg +# +# DESCRIPTION: +# Setting invalid value to mountpoint, checksum, atime, readonly, setuid, +# or canmount on a file system, volume. It should be failed. +# +# STRATEGY: +# 1. Create pool, then create file system & volume within it. +# 2. Setting invalid value, it should be failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A props "" "mountpoint" "checksum" "compression" "atime" "readonly" \ + "setuid" "canmount" + +set -A values "" "mountpoint" "checksum" "compression" "atime" "readonly" \ + "setuid" "0" "-?" "-on" "--on" "*" "?" "Legacy" "NONE" "oN" \ + "On" "ON" "ofF" "OFf" "oFF" "Off" "OfF" "OFF" "LzJb" "lZJb" "LZjB" \ + "blad" "default" "TESTPOOL" "$TESTPOOL/$TESTCTR" \ + "$TESTPOOL/$TESTCTR/$TESTFS" "$TESTPOOL/$TESTFS" +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" + +log_assert "Setting invalid value to mountpoint, checksum, compression, atime,"\ + "readonly, setuid, or canmount on a file system file system or volume." \ + "It should be failed." + +typeset -i i=0 +typeset -i j=0 +typeset -i k=0 +while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#props[@]} )); do + k=0 + while (( k < ${#values[@]} )); do + set_n_check_prop "${values[k]}" "${props[j]}" \ + "${dataset[i]}" false + (( k += 1 )) + done + (( j += 1 )) + done + (( i += 1 )) +done + +log_pass "Setting invalid value to mountpoint, checksum, compression, atime, " \ + "readonly, setuid, or canmount on file system or volume pass." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_002_neg.ksh new file mode 100644 index 00000000000..30347134392 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_002_neg.ksh @@ -0,0 +1,76 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_set_002_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_set_002_neg +# +# DESCRIPTION: +# 'zfs set' should fail with invalid arguments +# +# STRATEGY: +# 1. Create an array of invalid arguments +# 1. Run zfs set with each invalid argument +# 2. Verify that zfs set returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-9) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "'zfs set' fails with invalid arguments" + +set -A editable_props "quota" "reservation" "reserv" "volsize" "recordsize" "recsize" \ + "mountpoint" "checksum" "compression" "compress" "atime" \ + "devices" "exec" "setuid" "readonly" "zoned" "snapdir" "aclmode" \ + "aclinherit" "canmount" "shareiscsi" "xattr" "copies" "version" + +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP; do + for badarg in "" "-" "-?"; do + for prop in ${editable_props[@]}; do + log_mustnot eval "$ZFS set $badarg $prop= $ds >/dev/null 2>&1" + done + done +done + +log_pass "'zfs set' fails with invalid arguments as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_003_neg.ksh new file mode 100644 index 00000000000..dd924552c5e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_003_neg.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_set_003_neg.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_set_003_neg +# +# DESCRIPTION: +# 'zfs set mountpoint/sharenfs' should fail when the mountpoint is invlid +# +# STRATEGY: +# 1. Create invalid scenarios +# 2. Run zfs set mountpoint/sharenfs with invalid value +# 3. Verify that zfs set returns expected errors +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-9) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if [ -e $badpath ]; then + $RM -f $badpath + fi + if datasetexists $TESTPOOL/foo; then + log_must $ZFS destroy $TESTPOOL/foo + fi +} + +log_assert "'zfs set mountpoint/sharenfs' fails with invalid scenarios" +log_onexit cleanup + +badpath=$TMPDIR/foo1.${TESTCASE_ID} +$TOUCH $badpath +longpath=$(gen_dataset_name 1030 "abcdefg") + +log_must $ZFS create -o mountpoint=legacy $TESTPOOL/foo + +# Do the negative testing about "property may be set but unable to remount filesystem" +log_mustnot eval "$ZFS set mountpoint=$badpath $TESTPOOL/foo >/dev/null 2>&1" + +# Do the negative testing about "property may be set but unable to reshare filesystem" +log_mustnot eval "$ZFS set sharenfs=on $TESTPOOL/foo >/dev/null 2>&1" + +# Do the negative testing about "sharenfs property can not be set to null" +log_mustnot eval "$ZFS set sharenfs= $TESTPOOL/foo >/dev/null 2>&1" + +# Do the too long pathname testing (>1024) +log_mustnot eval "$ZFS set mountpoint=/$longpath $TESTPOOL/foo >/dev/null 2>&1" + +log_pass "'zfs set mountpoint/sharenfs' fails with invalid scenarios as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_common.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_common.kshlib new file mode 100644 index 00000000000..f3b98d27170 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_common.kshlib @@ -0,0 +1,253 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_set_common.kshlib 1.7 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +set -A VALID_NAME_CHAR a b c d e f g h i j k l m n o p q r s t u v w x y z \ + 0 1 2 3 4 5 6 7 8 9 ':' '-' '.' '_' +set -A INVALID_NAME_CHAR A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ + '`' '~' '!' '@' '#' '$' '%' '^' '&' '(' ')' '+' '=' \ + '|' '{' '[' ']' '}' ';' '"' '<' ',' '>' '?' '/' \ + ' ' +set -A ALL_CHAR ${VALID_NAME_CHAR[*]} ${INVALID_NAME_CHAR[*]} + +# +# Firstly, set the property value to dataset. Then checking if the property +# value is equal with the expected value, according to the expected result. +# +# $1 property value +# $2 property name +# $3 dataset +# $4 expected result +# +function set_n_check_prop +{ + typeset expect_value=$1 + typeset prop=$2 + typeset dataset=$3 + typeset expect_result=${4:-true} + typeset old_value="" + typeset cur_value="" + + [ -n "$prop" ] && old_value=$(get_prop $prop $dataset) + if [ "$expect_result" = "true" ]; then + log_must $ZFS set $prop=$expect_value $dataset + else + log_mustnot $ZFS set $prop=$expect_value $dataset + fi + [ -n "$prop" ] && cur_value=$(get_prop $prop $dataset) + + err="ERROR: Dataset '$dataset': '$prop' value '$cur_value'" + if [ "$expect_result" = "true" ]; then + [ "$expect_value" = "gzip-6" ] && expect_value="gzip" + case "$prop" in + reservation|reserv|quota) + if [ "$expect_value" = "none" -a "$cur_value" != "0" ]; then + err="$err should not be set!" + log_fail "$err" + return + fi + ;; + esac + if [ "$cur_value" != "$expect_value" ]; then + err="$err should have changed to '$expect_value'!" + log_fail "$err" + fi + else + if [ "$expect_value" != "" -a "$cur_value" != "$old_value" ]; then + err="$err should be unchanged at '$old_value'!" + log_fail "$err" + fi + fi +} + +# +# Cleanup all the user properties of the pool and the dataset reside it. +# +# $1 pool name +# +function cleanup_user_prop +{ + typeset pool=$1 + typeset dtst=$($ZFS list -H -r -o name -t filesystem,volume $pool) + + typeset user_prop + for dt in $dtst; do + user_prop=$($ZFS get -H -o property all $dtst | grep ":") + + typeset prop + for prop in $user_prop; do + $ZFS inherit $prop $dt + (($? != 0)) && log_must $ZFS inherit $prop $dt + done + done +} + +# +# Random select charactor from the specified charactor set and combine into a +# random string +# +# $1 character set name +# $2 String length +# +function random_string +{ + typeset char_set=${1:-VALID_NAME_CHAR} + typeset -i len=${2:-5} + + eval typeset -i count=\${#$char_set[@]} + + typeset str + typeset -i i=0 + while ((i < len)); do + typeset -i ind + ((ind = RANDOM % count)) + eval str=\${str}\${$char_set[\$ind]} + + ((i += 1)) + done + + $ECHO "$str" +} + +# +# Get vaild user defined property name +# +# $1 user defined property name length +# +function valid_user_property +{ + typeset -i sumlen=${1:-10} + ((sumlen < 2 )) && sumlen=2 + typeset -i len + ((len = RANDOM % sumlen)) + typeset part1 part2 + + while true; do + part1="$(random_string VALID_NAME_CHAR $len)" + if [[ "$part1" == "-"* ]]; then + continue + fi + break + done + ((len = sumlen - (len + 1))) + + while true; do + part2="$(random_string VALID_NAME_CHAR $len)" + if [[ -z $part1 && -z $part2 ]]; then + continue + fi + break + done + + $ECHO "${part1}:${part2}" +} + +# +# Get invaild user defined property name +# +# $1 user defined property name length +# +function invalid_user_property +{ + typeset -i sumlen=${1:-10} + ((sumlen == 0)) && sumlen=1 + typeset -i len + ((len = RANDOM % sumlen)) + + typeset part1 part2 + while true; do + part1="$(random_string VALID_NAME_CHAR $len)" + ((len = sumlen - len)) + part2="$(random_string INVALID_NAME_CHAR $len)" + + # Avoid $part1 is *:* and $part2 is "=*" + if [[ "$part1" == *":"* && "$part2" == "="* ]]; then + continue + fi + break + done + + $ECHO "${part1}${part2}" +} + +# +# Get user property value +# +# $1 user defined property name length +# +function user_property_value +{ + typeset -i len=${1:-100} + ((len < 1 )) && len=1 + + typeset value=$(random_string ALL_CHAR $len) + + $ECHO "$value" +} + +# +# Check if the user property is identical to the expected value. +# +# $1 dataset +# $2 user property +# $3 expected value +# +function check_user_prop +{ + typeset dtst=$1 + typeset user_prop="$2" + typeset expect_value="$3" + typeset value=$($ZFS get -p -H -o value "$user_prop" $dtst 2>&1) + + if [[ "$expect_value" == "$value" ]]; then + return 0 + else + return 1 + fi +} + +# +# Get source of the dataset +# +function get_source +{ + typeset prop=$1 + typeset dataset=$2 + typeset source + + source=$($ZFS get -H -o source $prop $dataset) + if (($? != 0)); then + log_fail "Unable to get $prop source for dataset $dataset" + fi + + $ECHO "$source" +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_test.sh new file mode 100755 index 00000000000..f106a150051 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_set/zfs_set_test.sh @@ -0,0 +1,765 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case cache_001_pos cleanup +cache_001_pos_head() +{ + atf_set "descr" "Setting a valid {primary|secondary}cache on file system and volume,It should be successful." + atf_set "timeout" 1200 +} +cache_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_001_pos.ksh || atf_fail "Testcase failed" +} +cache_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case cache_002_neg cleanup +cache_002_neg_head() +{ + atf_set "descr" "Setting invalid {primary|secondary}cache on fs and volume,It should fail." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +cache_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/cache_002_neg.ksh || atf_fail "Testcase failed" +} +cache_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case canmount_001_pos cleanup +canmount_001_pos_head() +{ + atf_set "descr" "Setting a valid property of canmount to file system, it must be successful." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +canmount_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/canmount_001_pos.ksh || atf_fail "Testcase failed" +} +canmount_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case canmount_002_pos cleanup +canmount_002_pos_head() +{ + atf_set "descr" "Setting canmount=noauto to file system, it must be successful." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +canmount_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/canmount_002_pos.ksh || atf_fail "Testcase failed" +} +canmount_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case canmount_003_pos cleanup +canmount_003_pos_head() +{ + atf_set "descr" "While canmount=noauto and the dataset is mounted, zfs must not attempt to unmount it" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +canmount_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/canmount_003_pos.ksh || atf_fail "Testcase failed" +} +canmount_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case canmount_004_pos cleanup +canmount_004_pos_head() +{ + atf_set "descr" "Verify canmount=noauto work fine when setting sharenfs or sharesmb." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +canmount_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/canmount_004_pos.ksh || atf_fail "Testcase failed" +} +canmount_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case checksum_001_pos cleanup +checksum_001_pos_head() +{ + atf_set "descr" "Setting a valid checksum on a file system, volume,it should be successful." + atf_set "timeout" 1200 +} +checksum_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/checksum_001_pos.ksh || atf_fail "Testcase failed" +} +checksum_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case compression_001_pos cleanup +compression_001_pos_head() +{ + atf_set "descr" "Setting a valid compression on file system and volume,It should be successful." + atf_set "timeout" 1200 +} +compression_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/compression_001_pos.ksh || atf_fail "Testcase failed" +} +compression_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case mountpoint_001_pos cleanup +mountpoint_001_pos_head() +{ + atf_set "descr" "Setting a valid mountpoint to file system, it must be successful." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +mountpoint_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mountpoint_001_pos.ksh || atf_fail "Testcase failed" +} +mountpoint_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case mountpoint_002_pos cleanup +mountpoint_002_pos_head() +{ + atf_set "descr" "Setting a valid mountpoint for an unmounted file system,it remains unmounted." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +mountpoint_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mountpoint_002_pos.ksh || atf_fail "Testcase failed" +} +mountpoint_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case mountpoint_003_pos cleanup +mountpoint_003_pos_head() +{ + atf_set "descr" "With legacy mount, FSType-specific option works well." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +mountpoint_003_pos_body() +{ + atf_expect_fail "The devices property is not yet supported on FreeBSD" + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mountpoint_003_pos.ksh || atf_fail "Testcase failed" +} +mountpoint_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case onoffs_001_pos cleanup +onoffs_001_pos_head() +{ + atf_set "descr" "Setting a valid value to atime, readonly, setuid or zoned on filesystem or volume. It should be successful." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +onoffs_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/onoffs_001_pos.ksh || atf_fail "Testcase failed" +} +onoffs_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case property_alias_001_pos cleanup +property_alias_001_pos_head() +{ + atf_set "descr" "Properties with aliases also work with those aliases." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +property_alias_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/property_alias_001_pos.ksh || atf_fail "Testcase failed" +} +property_alias_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case readonly_001_pos cleanup +readonly_001_pos_head() +{ + atf_set "descr" "Setting a valid readonly property on a dataset succeeds." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +readonly_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/readonly_001_pos.ksh || atf_fail "Testcase failed" +} +readonly_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_001_neg cleanup +reservation_001_neg_head() +{ + atf_set "descr" "Verify invalid reservation values are rejected" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +reservation_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_001_neg.ksh || atf_fail "Testcase failed" +} +reservation_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case ro_props_001_pos cleanup +ro_props_001_pos_head() +{ + atf_set "descr" "Verify that read-only properties are immutable." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +ro_props_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/ro_props_001_pos.ksh || atf_fail "Testcase failed" +} +ro_props_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case share_mount_001_neg cleanup +share_mount_001_neg_head() +{ + atf_set "descr" "Verify that we cannot share or mount legacy filesystems." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +share_mount_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/share_mount_001_neg.ksh || atf_fail "Testcase failed" +} +share_mount_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapdir_001_pos cleanup +snapdir_001_pos_head() +{ + atf_set "descr" "Setting a valid snapdir property on a dataset succeeds." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +snapdir_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapdir_001_pos.ksh || atf_fail "Testcase failed" +} +snapdir_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case user_property_001_pos cleanup +user_property_001_pos_head() +{ + atf_set "descr" "ZFS can set any valid user defined property to the non-readonlydataset." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +user_property_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/user_property_001_pos.ksh || atf_fail "Testcase failed" +} +user_property_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case user_property_002_pos cleanup +user_property_002_pos_head() +{ + atf_set "descr" "User defined property inherited from its parent." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +user_property_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/user_property_002_pos.ksh || atf_fail "Testcase failed" +} +user_property_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case user_property_003_neg cleanup +user_property_003_neg_head() +{ + atf_set "descr" "ZFS can handle invalid user property." + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +user_property_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/user_property_003_neg.ksh || atf_fail "Testcase failed" +} +user_property_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case user_property_004_pos cleanup +user_property_004_pos_head() +{ + atf_set "descr" "User property has no effect to snapshot until 'Snapshot properties' supported." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1200 +} +user_property_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/user_property_004_pos.ksh || atf_fail "Testcase failed" +} +user_property_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case version_001_neg cleanup +version_001_neg_head() +{ + atf_set "descr" "Verify invalid version values are rejected" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +version_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/version_001_neg.ksh || atf_fail "Testcase failed" +} +version_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_set_001_neg cleanup +zfs_set_001_neg_head() +{ + atf_set "descr" "Setting invalid value to mountpoint, checksum, compression, atime,readonly, setuid, zoned or canmount on a file system file system or volume. \It should be failed." + atf_set "timeout" 1200 +} +zfs_set_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_set_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_set_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_set_002_neg cleanup +zfs_set_002_neg_head() +{ + atf_set "descr" "'zfs set' fails with invalid arguments" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +zfs_set_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_set_002_neg.ksh || atf_fail "Testcase failed" +} +zfs_set_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_set_003_neg cleanup +zfs_set_003_neg_head() +{ + atf_set "descr" "'zfs set mountpoint/sharenfs' fails with invalid scenarios" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +zfs_set_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_set_003_neg.ksh || atf_fail "Testcase failed" +} +zfs_set_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_set_common.kshlib + . $(atf_get_srcdir)/zfs_set.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case cache_001_pos + atf_add_test_case cache_002_neg + atf_add_test_case canmount_001_pos + atf_add_test_case canmount_002_pos + atf_add_test_case canmount_003_pos + atf_add_test_case canmount_004_pos + atf_add_test_case checksum_001_pos + atf_add_test_case compression_001_pos + atf_add_test_case mountpoint_001_pos + atf_add_test_case mountpoint_002_pos + atf_add_test_case mountpoint_003_pos + atf_add_test_case onoffs_001_pos + atf_add_test_case property_alias_001_pos + atf_add_test_case readonly_001_pos + atf_add_test_case reservation_001_neg + atf_add_test_case ro_props_001_pos + atf_add_test_case share_mount_001_neg + atf_add_test_case snapdir_001_pos + atf_add_test_case user_property_001_pos + atf_add_test_case user_property_002_pos + atf_add_test_case user_property_003_neg + atf_add_test_case user_property_004_pos + atf_add_test_case version_001_neg + atf_add_test_case zfs_set_001_neg + atf_add_test_case zfs_set_002_neg + atf_add_test_case zfs_set_003_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/Makefile new file mode 100644 index 00000000000..01f5efc52db --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/Makefile @@ -0,0 +1,28 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_share +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_share_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_share_003_pos.ksh +${PACKAGE}FILES+= zfs_share_006_pos.ksh +${PACKAGE}FILES+= zfs_share_002_pos.ksh +${PACKAGE}FILES+= zfs_share_007_neg.ksh +${PACKAGE}FILES+= zfs_share.cfg +${PACKAGE}FILES+= zfs_share_004_pos.ksh +${PACKAGE}FILES+= zfs_share_009_neg.ksh +${PACKAGE}FILES+= zfs_share_010_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_share_009_pos.ksh +${PACKAGE}FILES+= zfs_share_005_pos.ksh +${PACKAGE}FILES+= zfs_share_001_pos.ksh +${PACKAGE}FILES+= zfs_share_008_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/setup.ksh new file mode 100644 index 00000000000..3bc69250e30 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# Make sure NFS server is running before testing. +setup_nfs_server + +DISK=${DISKS%% *} +default_container_volume_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share.cfg new file mode 100644 index 00000000000..8828c0134ab --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export SNAPROOT="$(get_snapdir_name)" +export NONEXISTFSNAME="nonexistfs50charslong_0123456789012345678901234567" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_001_pos.ksh new file mode 100644 index 00000000000..24c363b3886 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_001_pos.ksh @@ -0,0 +1,163 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_001_pos +# +# DESCRIPTION: +# Verify that 'zfs set sharenfs' and 'zfs share' shares a given dataset. +# +# STRATEGY: +# 1. Invoke 'zfs set sharenfs'. +# 2. Verify that the file system is shared. +# 3. Invoke 'zfs share'. +# 4. Verify that the file system is shared. +# 5. Verify that a shared filesystem cannot be shared again. +# 6. Verify that share -a succeeds. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A fs \ + "$TESTDIR" "$TESTPOOL/$TESTFS" \ + "$TESTDIR1" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTDIR2" "$TESTPOOL/$TESTFS-clone" + +function cleanup +{ + typeset -i i=0 + while (( i < ${#fs[*]} )); do + log_must $ZFS set sharenfs=off ${fs[((i+1))]} + unshare_fs ${fs[i]} + + ((i = i + 2)) + done + + if mounted $TESTPOOL/$TESTFS-clone; then + log_must $ZFS unmount $TESTDIR2 + fi + + datasetexists $TESTPOOL/$TESTFS-clone && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS-clone + + if snapexists "$TESTPOOL/$TESTFS@snapshot"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS@snapshot + fi +} + + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# share the mountpoint and then verify it has been shared. +# +function test_share # mntp filesystem +{ + typeset mntp=$1 + typeset filesystem=$2 + + not_shared $mntp || \ + log_fail "File system $filesystem is already shared." + + log_must $ZFS set sharenfs=on $filesystem + is_shared $mntp || \ + log_fail "File system $filesystem is not shared (set sharenfs)." + + # + # Verify 'zfs share' works as well. + # + log_must $ZFS unshare $filesystem + is_shared $mntp && \ + log_fail "File system $filesystem is still shared." + + log_must $ZFS share $filesystem + is_shared $mntp || \ + log_fail "file system $filesystem is not shared (zfs share)." + + log_note "Sharing a shared file system fails." + log_mustnot $ZFS share $filesystem +} + +log_assert "Verify that 'zfs share' succeeds as root." +log_onexit cleanup + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot +log_must $ZFS clone $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTFS-clone +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$TESTFS-clone + +typeset -i i=0 +while (( i < ${#fs[*]} )); do + test_share ${fs[i]} ${fs[((i + 1))]} + + ((i = i + 2)) +done + +log_note "Verify 'zfs share -a' succeeds." + +# +# Unshare each of the file systems. +# +i=0 +while (( i < ${#fs[*]} )); do + unshare_fs ${fs[i]} + + ((i = i + 2)) +done + +# +# Try a zfs share -a and verify all file systems are shared. +# +log_must $ZFS share -a + +i=0 +while (( i < ${#fs[*]} )); do + is_shared ${fs[i]} || \ + log_fail "File system ${fs[i]} is not shared (share -a)" + + ((i = i + 2)) +done + +log_pass "'$ZFS share [ -a ] ' succeeds as root." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_002_pos.ksh new file mode 100644 index 00000000000..0bdcd7689e4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_002_pos.ksh @@ -0,0 +1,86 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_002_pos +# +# DESCRIPTION: +# Verify that "zfs share" with a non-existent file system fails. +# +# STRATEGY: +# 1. Make sure the NONEXISTFSNAME ZFS file system is not in 'zfs list'. +# 2. Invoke 'zfs share '. +# 3. Verify that share fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset fs + for fs in $NONEXISTFSNAME $TESTFS ; do + log_must unshare_fs $TESTPOOL/$fs + done +} + +typeset -i ret=0 + +log_assert "Verify that "zfs share" with a non-existent file system fails." + +log_onexit cleanup + +log_mustnot $ZFS list $TESTPOOL/$NONEXISTFSNAME + +$ZFS share $TESTPOOL/$NONEXISTFSNAME +ret=$? +(( ret == 1)) || \ + log_fail "'$ZFS share $TESTPOOL/$NONEXISTFSNAME' " \ + "failed with an unexpected return code of $ret." + +log_note "Make sure the file system $TESTPOOL/$NONEXISTFSNAME is unshared" +not_shared $TESTPOOL/$NONEXISTFSNAME || \ + log_fail "File system $TESTPOOL/$NONEXISTFSNAME is unexpectedly shared." + +log_pass "'$ZFS share' with a non-existent file system fails." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_003_pos.ksh new file mode 100644 index 00000000000..193ffd6f8d0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_003_pos.ksh @@ -0,0 +1,124 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_003_pos +# +# DESCRIPTION: +# Invoking "zfs share " with a file system +# whose sharenfs property is 'off' , will fail with a +# return code of 1 and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS file system is unshared. +# 2. Mount the file system using the various combinations +# - zfs set sharenfs=off +# - zfs set sharenfs=none +# 3. Verify that share failed with return code of 1. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A fs \ + "$TESTDIR" "$TESTPOOL/$TESTFS" \ + "$TESTDIR1" "$TESTPOOL/$TESTCTR/$TESTFS1" + +function cleanup +{ + typeset -i i=0 + while (( i < ${#fs[*]} )); do + log_must $ZFS inherit -r sharenfs ${fs[((i + 1))]} + log_must unshare_fs ${fs[i]} + + ((i = i + 2)) + done +} + + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# to share a legacy mountpoint and then verify the share fails as +# expected. +# +function test_legacy_share # mntp filesystem +{ + typeset mntp=$1 + typeset filesystem=$2 + + not_shared $mntp || \ + log_fail "File system $filesystem is already shared." + + if is_global_zone ; then + log_must $ZFS set sharenfs=off $filesystem + not_shared $mntp || \ + log_fail "File system $filesystem is still shared (set sharenfs)." + fi + + $ZFS share $filesystem + ret=$? + (( ret == 1)) || \ + log_fail "'$ZFS share $filesystem' " \ + "unexpected return code of $ret." + + not_shared $mntp || \ + log_fail "file system $filesystem is shared (zfs share)." +} + +log_assert "Verify that '$ZFS share' with a file system " \ + "whose sharenfs property is 'off' " \ + "will fail with return code 1." +log_onexit cleanup + +typeset -i i=0 +while (( i < ${#fs[*]} )); do + test_legacy_share ${fs[i]} ${fs[((i + 1))]} + + ((i = i + 2)) +done + +log_pass "Verify that '$ZFS share' with a file system " \ + "whose sharenfs property is 'off' fails." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_004_pos.ksh new file mode 100644 index 00000000000..a58605a9d46 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_004_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_004_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_004_pos +# +# DESCRIPTION: +# Verify that a file system and its snapshot are shared. +# +# STRATEGY: +# 1. Create a file system +# 2. Set the sharenfs property on the file system +# 3. Create a snapshot +# 4. Verify that both are shared. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@snapshot; then + log_must $ZFS destroy $TESTPOOL/$TESTFS@snapshot + fi + + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + log_must unshare_fs $TESTPOOL/$TESTFS +} + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# share the mountpoint and then verify a snapshot of the mounpoint +# is also shared. +# +function test_snap_share # mntp filesystem +{ + typeset mntp=$1 + typeset filesystem=$2 + + not_shared $mntp || \ + log_fail "File system $filesystem is already shared." + + log_must $ZFS set sharenfs=on $filesystem + is_shared $mntp || \ + log_fail "File system $filesystem is not shared (set sharenfs)." + + log_must $LS -l $mntp/$SNAPROOT/snapshot + # + # Verify 'zfs share' works as well. + # + log_must $ZFS unshare $filesystem + log_must $ZFS share $filesystem + + is_shared $mntp || \ + log_fail "file system $filesystem is not shared (zfs share)." + + log_must $LS -l $mntp/$SNAPROOT/snapshot +} + +log_assert "Verify that a file system and its snapshot are shared." +log_onexit cleanup + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot +test_snap_share $TESTDIR $TESTPOOL/$TESTFS + +log_pass "A file system and its snapshot are both shared as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_005_pos.ksh new file mode 100644 index 00000000000..c0d4d2e41f9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_005_pos.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_005_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_005_pos +# +# DESCRIPTION: +# Verify that NFS share options are propagated correctly. +# +# STRATEGY: +# 1. Create a ZFS file system. +# 2. For each option in the list, set the sharenfs property. +# 3. Verify through the share command that the options are propagated. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + is_shared $TESTPOOL/$TESTFS && \ + log_must unshare_fs $TESTPOOL/$TESTFS +} + +set -A shareopts \ + "ro" "ro=machine1" "ro=machine1:machine2" \ + "rw" "rw=machine1" "rw=machine1:machine2" \ + "ro=machine1:machine2,rw" "anon=0" "anon=0,sec=sys,rw" \ + "nosuid" "root=machine1:machine2" "rw=.mydomain.mycompany.com" \ + "rw=-terra:engineering" "log" "public" + +log_assert "Verify that NFS share options are propagated correctly." +log_onexit cleanup + +cleanup + +typeset -i i=0 +while (( i < ${#shareopts[*]} )) +do + log_must $ZFS set sharenfs="${shareopts[i]}" $TESTPOOL/$TESTFS + + option=`get_prop sharenfs $TESTPOOL/$TESTFS` + if [[ $option != ${shareopts[i]} ]]; then + log_fail "get sharenfs failed. ($option != ${shareopts[i]})" + fi + + $SHARE | $GREP $option > /dev/null 2>&1 + if (( $? != 0 )); then + log_fail "The '$option' option was not found in share output." + fi + + ((i = i + 1)) +done + +log_pass "NFS options were propagated correctly." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_006_pos.ksh new file mode 100644 index 00000000000..4e8c4297680 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_006_pos.ksh @@ -0,0 +1,119 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_006_pos.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_006_pos +# +# DESCRIPTION: +# Verify that a dataset could not be shared but filesystems are shared. +# +# STRATEGY: +# 1. Create a dataset and file system +# 2. Set the sharenfs property on the dataset +# 3. Verify that the dataset is unable be shared. +# 4. Add a new file system to the dataset. +# 5. Verify that the newly added file system be shared. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTCTR + if mounted $TESTDIR2; then + log_must $ZFS unmount $TESTDIR2 + fi + + datasetexists $TESTPOOL/$TESTCTR/$TESTFS2 && \ + log_must $ZFS destroy $TESTPOOL/$TESTCTR/$TESTFS2 + + typeset fs="" + for fs in $mntp $TESTDIR1 $TESTDIR2 + do + log_must unshare_fs $fs + done +} + +# +# Main test routine. +# +# Given a mountpoint and a dataset, this routine will set the +# sharenfs property on the dataset and verify that dataset +# is unable to be shared but the existing contained file systems +# could be shared. +# +function test_ctr_share # mntp ctr +{ + typeset mntp=$1 + typeset ctr=$2 + + not_shared $mntp || \ + log_fail "Mountpoint: $mntp is already shared." + + log_must $ZFS set sharenfs=on $ctr + + not_shared $mntp || \ + log_fail "File system $mntp is shared (set sharenfs)." + + # + # Add a new file system to the dataset and verify it is shared. + # + typeset mntp2=$TESTDIR2 + log_must $ZFS create $ctr/$TESTFS2 + log_must $ZFS set mountpoint=$mntp2 $ctr/$TESTFS2 + + is_shared $mntp2 || \ + log_fail "File system $mntp2 was not shared (set sharenfs)." +} + +log_assert "Verify that a dataset could not be shared, " \ + "but its sub-filesystems could be shared." +log_onexit cleanup + +typeset mntp=$(get_prop mountpoint $TESTPOOL/$TESTCTR) +test_ctr_share $mntp $TESTPOOL/$TESTCTR + +log_pass "A dataset could not be shared, " \ + "but its sub-filesystems could be shared as expect." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_007_neg.ksh new file mode 100644 index 00000000000..fa4dd3db4b1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_007_neg.ksh @@ -0,0 +1,99 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_007_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_007_neg +# +# DESCRIPTION: +# Verify that invalid share parameters and options are caught. +# +# STRATEGY: +# 1. Create a ZFS file system. +# 2. For each option in the list, set the sharenfs property. +# 3. Verify that the error code and sharenfs property. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup { + if is_global_zone; then + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + fi +} + +set -A badopts \ + "r0" "r0=machine1" "r0=machine1:machine2" \ + "-g" "-b" "-c" "-d" "--invalid" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL\$TESTCTR\$TESTFS1" + +log_assert "Verify that invalid share parameters and options are caught." +log_onexit cleanup + +typeset -i i=0 +while (( i < ${#badopts[*]} )) +do + log_note "Setting sharenfs=${badopts[i]} $i " + log_mustnot $ZFS set sharenfs="${badopts[i]}" $TESTPOOL/$TESTFS + + $SHARE | $GREP $option > /dev/null 2>&1 + if (( $? == 0 )); then + log_fail "An invalid setting '$option' was propagated." + fi + + # + # To global zone, sharenfs must be set 'off' before malformed testing. + # Otherwise, the malformed test return '0'. + # + # To non-global zone, sharenfs can be set even 'off' or 'on'. + # + if is_global_zone; then + log_note "Resetting sharenfs option" + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + fi + + ((i = i + 1)) +done + +log_pass "Invalid share parameters and options we caught as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_008_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_008_neg.ksh new file mode 100644 index 00000000000..b0bb72b641c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_008_neg.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_008_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_008_neg +# +# DESCRIPTION: +# Verify that sharing a dataset other than filesystem fails. +# +# STRATEGY: +# 1. Create a ZFS file system. +# 2. For each dataset in the list, set the sharenfs property. +# 3. Verify that the invalid datasets are not shared. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +if is_global_zone ; then + set -A datasets \ + "$TESTPOOL/$TESTVOL" "$TESTDIR" +fi + +log_assert "Verify that sharing a dataset other than filesystem fails." + +typeset -i i=0 +while (( i < ${#datasets[*]} )) +do + log_mustnot $ZFS set sharenfs=on ${datasets[i]} + + option=`get_prop sharenfs ${datasets[i]}` + if [[ $option == ${datasets[i]} ]]; then + log_fail "set sharenfs failed. ($option == ${datasets[i]})" + fi + + not_shared ${datasets[i]} || \ + log_fail "An invalid setting '$option' was propagated." + + log_mustnot $ZFS share ${datasets[i]} + + not_shared ${datasets[i]} || \ + log_fail "An invalid dataset '${datasets[i]}' was shared." + + ((i = i + 1)) +done + +log_pass "Sharing datasets other than filesystems failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_009_neg.ksh new file mode 100644 index 00000000000..fb63dd38841 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_009_neg.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_009_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_share_009_neg +# +# DESCRIPTION: +# Verify that zfs share should fail when sharing a shared zfs filesystem +# +# STRATEGY: +# 1. Make a zfs filesystem shared +# 2. Use zfs share to share the filesystem +# 3. Verify that zfs share returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-9) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset val + + val=$(get_prop sharenfs $fs) + if [[ $val == on ]]; then + log_must $ZFS set sharenfs=off $fs + fi +} + +log_assert "zfs share fails with shared filesystem" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +sharenfs_val=$(get_prop sharenfs $fs) +mpt=$(get_prop mountpoint $fs) +if [[ $sharenfs_val == off ]]; then + log_must $ZFS set sharenfs=on $fs +fi + +$SHARE | $GREP $mpt >/dev/null 2>&1 +if (( $? != 0 )); then + log_must $ZFS share $fs +fi + +log_mustnot $ZFS share $fs + +log_pass "zfs share fails with shared filesystem as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_009_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_009_pos.ksh new file mode 100644 index 00000000000..4f2877117d6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_009_pos.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_009_pos.ksh 1.2 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_share_009_pos +# +# DESCRIPTION: +# Verify that umount/rollback/destroy fails does not unshare the shared +# file system +# +# STRATEGY: +# 1. Share the filesystem via 'zfs set sharenfs'. +# 2. Try umount failure, and verify that the file system is still shared. +# 3. Try rollback failure, and verify that the file system is still shared. +# 4. Try destroy failure, and verify that the file system is still shared. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-04-28) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + log_must cd $origdir + + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + unshare_fs $TESTPOOL/$TESTFS + + if snapexists "$TESTPOOL/$TESTFS@snapshot"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS@snapshot + fi + + if datasetexists $TESTPOOL/$TESTFS/fs2 ; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS/fs2 + fi +} + +log_assert "Verify umount/rollback/destroy fails does not unshare the shared" \ + "file system" +log_onexit cleanup + +typeset origdir=$PWD + +# unmount fails will not unshare the shared filesystem +log_must $ZFS set sharenfs=on $TESTPOOL/$TESTFS +log_must is_shared $TESTDIR +if cd $TESTDIR ; then + log_mustnot $ZFS umount $TESTPOOL/$TESTFS +else + log_fail "cd $TESTDIR fails" +fi +log_must is_shared $TESTDIR + +# rollback fails will not unshare the shared filesystem +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot +if cd $TESTDIR ; then + log_mustnot $ZFS rollback $TESTPOOL/$TESTFS@snapshot +else + log_fail "cd $TESTDIR fails" +fi +log_must is_shared $TESTDIR + +# destroy fails will not unshare the shared filesystem +log_must $ZFS create $TESTPOOL/$TESTFS/fs2 +if cd $TESTDIR/fs2 ; then + log_mustnot $ZFS destroy $TESTPOOL/$TESTFS/fs2 +else + log_fail "cd $TESTDIR/fs2 fails" +fi +log_must is_shared $TESTDIR/fs2 + +log_pass "Verify umount/rollback/destroy fails does not unshare the shared" \ + "file system" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_010_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_010_neg.ksh new file mode 100644 index 00000000000..15a12c6dbed --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_010_neg.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_010_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_share_010_neg +# +# DESCRIPTION: +# Verify that zfs share should fail with bad parameters +# +# STRATEGY: +# 1. Make an array of bad parameters +# 2. Use zfs share to share the filesystem +# 3. Verify that zfs share returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-9) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "zfs share fails with bad parameters" + +fs=$TESTPOOL/$TESTFS +set -A badargs "A" "-A" "-" "-x" "-?" "=" "-a *" "-a" + +for arg in "${badargs[@]}"; do + log_mustnot eval "$ZFS share $arg $fs >/dev/null 2>&1" +done + +#zfs share failed when missing arguments or invalid datasetname +for obj in "" "/$fs"; do + log_mustnot eval "$ZFS share $obj >/dev/null 2>&1" +done + +log_pass "zfs share fails with bad parameters as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_test.sh new file mode 100755 index 00000000000..d7abce6f938 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_share/zfs_share_test.sh @@ -0,0 +1,296 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_share_001_pos cleanup +zfs_share_001_pos_head() +{ + atf_set "descr" "Verify that 'zfs share' succeeds as root." + atf_set "require.progs" zfs svcs +} +zfs_share_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_share_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_002_pos cleanup +zfs_share_002_pos_head() +{ + atf_set "descr" "Verify that zfs share with a non-existent file system fails." + atf_set "require.progs" zfs svcs +} +zfs_share_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_share_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_003_pos cleanup +zfs_share_003_pos_head() +{ + atf_set "descr" "Verify that '$ZFS share' with a file systemwhose sharenfs property is 'off' \will fail with return code 1." + atf_set "require.progs" zfs svcs +} +zfs_share_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_share_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_004_pos cleanup +zfs_share_004_pos_head() +{ + atf_set "descr" "Verify that a file system and its snapshot are shared." + atf_set "require.progs" zfs svcs +} +zfs_share_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_share_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_005_pos cleanup +zfs_share_005_pos_head() +{ + atf_set "descr" "Verify that NFS share options are propagated correctly." + atf_set "require.progs" zfs share svcs +} +zfs_share_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_share_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_006_pos cleanup +zfs_share_006_pos_head() +{ + atf_set "descr" "Verify that a dataset could not be shared,but its sub-filesystems could be shared." + atf_set "require.progs" zfs svcs +} +zfs_share_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_share_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_007_neg cleanup +zfs_share_007_neg_head() +{ + atf_set "descr" "Verify that invalid share parameters and options are caught." + atf_set "require.progs" zfs share svcs +} +zfs_share_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_share_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_008_neg cleanup +zfs_share_008_neg_head() +{ + atf_set "descr" "Verify that sharing a dataset other than filesystem fails." + atf_set "require.progs" zfs svcs +} +zfs_share_008_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_008_neg.ksh || atf_fail "Testcase failed" +} +zfs_share_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_009_neg cleanup +zfs_share_009_neg_head() +{ + atf_set "descr" "zfs share fails with shared filesystem" + atf_set "require.progs" zfs share svcs +} +zfs_share_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_009_neg.ksh || atf_fail "Testcase failed" +} +zfs_share_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_009_pos cleanup +zfs_share_009_pos_head() +{ + atf_set "descr" "Verify umount/rollback/destroy fails does not unshare the sharedfile system" + atf_set "require.progs" zfs svcs +} +zfs_share_009_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_009_pos.ksh || atf_fail "Testcase failed" +} +zfs_share_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_010_neg cleanup +zfs_share_010_neg_head() +{ + atf_set "descr" "zfs share fails with bad parameters" + atf_set "require.progs" zfs svcs +} +zfs_share_010_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_010_neg.ksh || atf_fail "Testcase failed" +} +zfs_share_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_share.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_share_001_pos + atf_add_test_case zfs_share_002_pos + atf_add_test_case zfs_share_003_pos + atf_add_test_case zfs_share_004_pos + atf_add_test_case zfs_share_005_pos + atf_add_test_case zfs_share_006_pos + atf_add_test_case zfs_share_007_neg + atf_add_test_case zfs_share_008_neg + atf_add_test_case zfs_share_009_neg + atf_add_test_case zfs_share_009_pos + atf_add_test_case zfs_share_010_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/Makefile new file mode 100644 index 00000000000..dcfd64999ce --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/Makefile @@ -0,0 +1,24 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_snapshot +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_snapshot_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_snapshot_005_neg.ksh +${PACKAGE}FILES+= zfs_snapshot_001_neg.ksh +${PACKAGE}FILES+= zfs_snapshot_004_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_snapshot_002_neg.ksh +${PACKAGE}FILES+= zfs_snapshot_006_pos.ksh +${PACKAGE}FILES+= zfs_snapshot_007_neg.ksh +${PACKAGE}FILES+= zfs_snapshot_003_neg.ksh +${PACKAGE}FILES+= zfs_snapshot.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/cleanup.ksh new file mode 100644 index 00000000000..e2ccfb86862 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_container_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/setup.ksh new file mode 100644 index 00000000000..eb1c316dfae --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_container_volume_setup ${DISK} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot.cfg new file mode 100644 index 00000000000..1f99bb8ea5c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot.cfg @@ -0,0 +1,37 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot.cfg 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/cli.cfg + +export SNAPFS="$TESTPOOL/$TESTFS@$TESTSNAP" +export SNAPFS1="$TESTPOOL/$TESTVOL@$TESTSNAP" +export SNAPDIR="$TESTDIR@$TESTSNAP" +export SNAPDIR1="$ZFSROOT/$SNAPFS1" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_001_neg.ksh new file mode 100644 index 00000000000..1820b351cf8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_001_neg.ksh @@ -0,0 +1,132 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot_001_neg.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_snapshot_001_neg +# +# DESCRIPTION: +# Try each 'zfs snapshot' with inapplicable scenarios to make sure +# it returns an error. include: +# * No arguments given. +# * The argument contains invalid characters for the ZFS namesapec +# * Leading slash in snapshot name +# * The argument contains an empty component. +# * Missing '@' delimiter. +# * Multiple '@' delimiters in snapshot name. +# * The snapshot already exist. +# * Create snapshot upon the pool. +# (Be removed since pool is treated as filesystem as well) +# * Create snapshot upon a non-existent filesystem. +# * Too many arguments. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A args "" \ + "$TESTPOOL/$TESTFS@blah*" "$TESTPOOL/$TESTFS@blah?" \ + "$TESTPOOL/$TESTVOL@blah*" "$TESTPOOL/$TESTVOL@blah?" \ + "/$TESTPOOL/$TESTFS@$TESTSNAP" "/$TESTPOOL/$TESTVOL@$TESTSNAP" \ + "@$TESTSNAP" "$TESTPOOL/$TESTFS@" "$TESTPOOL/$TESTVOL@" \ + "$TESTPOOL//$TESTFS@$TESTSNAP" "$TESTPOOL//$TESTVOL@$TESTSNAP" \ + "$TESTPOOL/$TESTFS/$TESTSNAP" "$TESTPOOL/$TESTVOL/$TESTSNAP" \ + "$TESTPOOL/$TESTFS@$TESTSNAP@$TESTSNAP1" \ + "$TESTPOOL/$TESTVOL@$TESTSNAP@$TESTSNAP1" \ + "$SNAPFS" "$SNAPFS1" \ + "blah/blah@$TESTSNAP" + +function setup_all +{ + log_note "Create snapshots and mount them..." + + for snap in $SNAPFS $SNAPFS1 ; do + if ! snapexists $snap ; then + log_must $ZFS snapshot $snap + fi + done + + return 0 +} + +function cleanup_all +{ + typeset -i i=0 + + while (( i < ${#args[*]} )); do + + for snap in ${args[i]}; do + snapexists $snap && \ + log_must $ZFS destroy -f $snap + + done + + (( i = i + 1 )) + done + + for mtpt in $SNAPDIR $SNAPDIR1 ; do + [[ -d $mtpt ]] && \ + log_must $RM -rf $mtpt + done + + return 0 +} + +log_assert "Badly-formed 'zfs snapshot' with inapplicable scenarios " \ + "should return an error." +log_onexit cleanup_all + +setup_all + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS snapshot ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly formed 'zfs snapshot' with inapplicable scenarios " \ + "fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_002_neg.ksh new file mode 100644 index 00000000000..f26b5f45139 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_002_neg.ksh @@ -0,0 +1,111 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot_002_neg.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_snapshot_002_neg +# +# DESCRIPTION: +# "zfs snapshot -r" fails with invalid arguments or scenarios. +# The invalid scenarios may include: +# (1) The child filesystem already has snapshot with the same name +# (2) The child volume already has snapshot with the same name +# +# STRATEGY: +# 1. Create an array of invalid arguments +# 2. Execute 'zfs snapshot -r' with each argument in the array, +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset snap + + for snap in $TESTPOOL/$TESTCTR/$TESTFS1@$TESTSNAP \ + $TESTPOOL/$TESTCTR/$TESTVOL@$TESTSNAP; + do + snapexists $snap && \ + log_must $ZFS destroy $snap + done + + datasetexists $TESTPOOL/$TESTCTR/$TESTVOL && \ + log_must $ZFS destroy -rf $TESTPOOL/$TESTCTR/$TESTVOL + +} + +log_assert "'zfs snapshot -r' fails with invalid arguments or scenarios. " +log_onexit cleanup + +set -A args "" \ + "$TESTPOOL/$TESTCTR@$TESTSNAP" "$TESTPOOL/$TESTCTR@blah?" \ + "$TESTPOOL/$TESTCTR@blah*" "@$TESTSNAP" "$TESTPOOL/$TESTCTR@" \ + "$TESTPOOL/$TESTFS/$TESTSNAP" "blah/blah@$TESTSNAP" \ + "$TESTPOOL/$TESTCTR@$TESTSNAP@$TESTSNAP" + +# setup preparations +log_must $ZFS snapshot $TESTPOOL/$TESTCTR/$TESTFS1@$TESTSNAP + +# testing +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS snapshot -r ${args[i]} + + ((i = i + 1)) +done + +# Testing the invalid senario: the child volume already has an +# identical name snapshot, zfs snapshot -r should fail when +# creating snapshot with -r for the parent +log_must $ZFS destroy $TESTPOOL/$TESTCTR/$TESTFS1@$TESTSNAP +if is_global_zone; then + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTCTR/$TESTVOL +else + log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTVOL +fi +log_must $ZFS snapshot $TESTPOOL/$TESTCTR/$TESTVOL@$TESTSNAP + +log_mustnot $ZFS snapshot -r $TESTPOOL/$TESTCTR@$TESTSNAP + +log_pass "'zfs snapshot -r' fails with invalid arguments or scenarios as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_003_neg.ksh new file mode 100644 index 00000000000..ffd94166433 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_003_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot_003_neg.ksh 1.1 07/07/31 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_snapshot_003_neg +# +# DESCRIPTION: +# "zfs snapshot" fails with bad options,too many arguments or too long +# snapshot name +# +# STRATEGY: +# 1. Create an array of invalid arguments +# 2. Execute 'zfs snapshot' with each argument in the array, +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "'zfs snapshot' fails with bad options, or too many arguments. " + +set -A badopts "r" "R" "-R" "-x" "-rR" "-?" "-*" "-123" + +# set too long snapshot name (>256) +l_name="$(gen_dataset_name 260 abcdefg)" + +for ds in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCTR $TESTPOOL/$TESTVOL; do + for opt in ${badopts[@]}; do + log_mustnot $ZFS snapshot $opt $ds@$TESTSNAP + done + + log_mustnot $ZFS snapshot $ds@snap $ds@snap1 + log_mustnot $ZFS snapshot -r $ds@snap $ds@snap1 + + log_mustnot $ZFS snapshot $ds@$l_name + log_mustnot $ZFS snapshot -r $ds@$l_name +done + +log_pass "'zfs snapshot' fails with bad options or too many arguments as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_004_neg.ksh new file mode 100644 index 00000000000..75d16ca9054 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_004_neg.ksh @@ -0,0 +1,111 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot_004_neg.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_snapshot_004_neg +# +# DESCRIPTION: +# Verify recursive snapshotting could not break ZFS. +# +# STRATEGY: +# 1. Create deeply-nested filesystems until it is too long to create snap +# 2. Verify zfs snapshot -r pool@snap will not break ZFS +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-08) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $initfs ; then + log_must $ZFS destroy -rf $initfs + fi +} + +log_assert "Verify recursive snapshotting could not break ZFS." +log_onexit cleanup + +initfs=$TESTPOOL/$TESTFS/$TESTFS +basefs=$initfs +typeset -i ret=0 len snaplen +while ((ret == 0)); do + $ZFS create $basefs + $ZFS snapshot $basefs@snap1 + ret=$? + + len=$($ECHO $basefs| $WC -c) + if ((ret != 0)); then + log_note "The deeply-nested filesystem len: $len" + # + # Make sure there are at lease 2 characters left + # for snapshot name space, otherwise snapshot name + # is incorrect + # + if ((len >= 255)); then + if datasetexists $basefs; then + log_must $ZFS destroy -r $basefs + fi + basefs=${basefs%/*} + len=$($ECHO $basefs| $WC -c) + fi + break + else + log_note "ZFS snapshot suceeded. len: $len" + fi + + basefs=$basefs/$TESTFS +done + +# Make snapshot name is longer than the max length +((snaplen = 256 - len + 10)) +snap=$(gen_dataset_name $snaplen "s") +log_mustnot $ZFS snapshot -r $TESTPOOL@$snap + +log_must datasetnonexists $TESTPOOL@$snap +while [[ $basefs != $TESTPOOL ]]; do + log_must datasetnonexists $basefs@$snap + basefs=${basefs%/*} +done + +log_pass "Verify recursive snapshotting could not break ZFS." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_005_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_005_neg.ksh new file mode 100644 index 00000000000..1f5acf4c93e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_005_neg.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot_005_neg.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_snapshot_005_neg +# +# DESCRIPTION: +# Long name filesystem with snapshot should not break ZFS. +# +# STRATEGY: +# 1. Create filesystem and snapshot. +# 2. When the snapshot length is 256, rename the filesystem. +# 3. Verify it does not break ZFS +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-09) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify long name filesystem with snapshot should not break ZFS." + +initfs=$TESTPOOL/$TESTFS/$TESTFS +basefs=$initfs +typeset -i ret=0 len snaplen +while ((ret == 0)); do + $ZFS create $basefs + $ZFS snapshot $basefs@snap1 + ret=$? + + if ((ret != 0)); then + len=$($ECHO $basefs | $WC -c) + log_note "The deeply-nested filesystem len: $len" + + # + # Make sure there are at lease 2 characters left + # for snapshot name space, otherwise snapshot name + # is incorrect + # + if ((len >= 255)); then + if datasetexists $basefs; then + log_must $ZFS destroy -r $basefs + fi + basefs=${basefs%/*} + len=$($ECHO $basefs| $WC -c) + fi + break + fi + + basefs=$basefs/$TESTFS +done + +# Make snapshot name length match the longest one +((snaplen = 256 - len - 1)) # 1: @ +snap=$(gen_dataset_name $snaplen "s") +log_must $ZFS snapshot $basefs@$snap + +log_mustnot $ZFS rename $basefs ${basefs}a +log_mustnot $ZFS rename $basefs ${basefs}-new +log_mustnot $ZFS rename $initfs ${initfs}-new +log_mustnot $ZFS rename $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS-new + +log_pass "Verify long name filesystem with snapshot should not break ZFS." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_006_pos.ksh new file mode 100644 index 00000000000..a57b05d4f4f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_006_pos.ksh @@ -0,0 +1,143 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot_006_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_snapshot_006_pos +# +# DESCRIPTION: +# User property could be set via creation time by 'zfs snapshot -o' +# +# STRATEGY: +# 1. Create snapshot and give '-o property=value' +# 2. Verify the snapshot be created and user property have been set. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + if datasetexists $fssnap ; then + log_must $ZFS destroy -rf $fssnap + fi + done + cleanup_user_prop $TESTPOOL +} + +function nonexist_user_prop +{ + typeset user_prop=$1 + typeset dtst=$2 + + typeset source=$(get_source $user_prop $dtst) + typeset value=$(get_prop $user_prop $dtst) + if [[ $source == '-' && $value == '-' ]]; then + return 0 + else + return 1 + fi +} + +log_assert "User property could be set upon snapshot via 'zfs snapshot -o'." +log_onexit cleanup + +typeset snap_property= + +$ZPOOL upgrade -v | $GREP "Snapshot properties" > /dev/null 2>&1 +if (( $? != 0 )) ; then + log_unsupported "Snapshot properties not supported on current system." +fi + +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + prop_name=$(valid_user_property 10) + value=$(user_property_value 16) + + log_must eval "$ZFS snapshot -o $prop_name='$value' $fssnap" + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + + log_must $ZFS destroy -f $fssnap + + prop_name2=$(valid_user_property 10) + value2=$(user_property_value 16) + + log_must eval "$ZFS snapshot -o $prop_name='$value' -o $prop_name2='$value2' $fssnap" + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + log_mustnot nonexist_user_prop $prop_name2 $fssnap +done + +cleanup + +prop_name=$(valid_user_property 10) +value=$(user_property_value 16) + +log_must eval "$ZFS snapshot -r -o $prop_name='$value' $TESTPOOL@snap" +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + + log_must $ZFS destroy -rf $fssnap +done + +cleanup + +prop_name2=$(valid_user_property 10) +value2=$(user_property_value 16) + +log_must eval "$ZFS snapshot -r -o $prop_name='$value' -o $prop_name2='$value2' $TESTPOOL@snap" +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + log_mustnot nonexist_user_prop $prop_name2 $fssnap + + log_must $ZFS destroy -rf $fssnap +done + +log_pass "User property could be set upon snapshot via 'zfs snapshot -o'." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_007_neg.ksh new file mode 100644 index 00000000000..952940896ef --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_007_neg.ksh @@ -0,0 +1,146 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot_007_neg.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_snapshot_007_pos +# +# DESCRIPTION: +# 'zfs snapshot -o' cannot set properties other than user property +# +# STRATEGY: +# 1. Create snapshot and give '-o property=value' with regular property. +# 2. Verify the snapshot creation failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR $TESTPOOL ; do + typeset fssnap=$fs@snap + if datasetexists $fssnap ; then + log_must $ZFS destroy -rf $fssnap + fi + done + cleanup_user_prop $TESTPOOL +} + +function nonexist_user_prop +{ + typeset user_prop=$1 + typeset dtst=$2 + + typeset source=$(get_source $user_prop $dtst) + typeset value=$(get_prop $user_prop $dtst) + if [[ $source == '-' && $value == '-' ]]; then + return 0 + else + return 1 + fi +} + +log_assert "'zfs snapshot -o' cannot set properties other than user property." +log_onexit cleanup + +typeset ro_props="type used available avail creation referenced refer compressratio \ + mounted origin" +typeset snap_ro_props="volsize recordsize recsize quota reservation reserv mountpoint \ + sharenfs checksum compression compress atime devices exec readonly rdonly \ + setuid zoned" + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + snap_ro_props="$snap_ro_props version" +fi + + +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR $TESTPOOL ; do + typeset fssnap=$fs@snap + prop_name=$(valid_user_property 10) + value=$(user_property_value 16) + + log_must eval "$ZFS snapshot -o $prop_name='$value' $fssnap" + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + + log_must $ZFS destroy -f $fssnap + + prop_name2=$(valid_user_property 10) + value2=$(user_property_value 16) + + log_must eval "$ZFS snapshot -o $prop_name='$value' -o $prop_name2='$value2' $fssnap" + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + log_mustnot nonexist_user_prop $prop_name2 $fssnap + + log_must $ZFS destroy -f $fssnap +done + +cleanup + +prop_name=$(valid_user_property 10) +value=$(user_property_value 16) + +log_must eval "$ZFS snapshot -r -o $prop_name='$value' $TESTPOOL@snap" +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR $TESTPOOL ; do + typeset fssnap=$fs@snap + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap +done + +cleanup + +prop_name2=$(valid_user_property 10) +value2=$(user_property_value 16) + +log_must eval "$ZFS snapshot -r -o $prop_name='$value' -o $prop_name2='$value2' $TESTPOOL@snap" +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR $TESTPOOL ; do + typeset fssnap=$fs@snap + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + log_mustnot nonexist_user_prop $prop_name2 $fssnap +done + +log_pass "'zfs snapshot -o' cannot set properties other than user property." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_test.sh new file mode 100755 index 00000000000..7d654e922af --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_snapshot/zfs_snapshot_test.sh @@ -0,0 +1,207 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_snapshot_001_neg cleanup +zfs_snapshot_001_neg_head() +{ + atf_set "descr" "Badly-formed 'zfs snapshot' with inapplicable scenariosshould return an error." + atf_set "require.progs" zfs +} +zfs_snapshot_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_snapshot_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_snapshot_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_snapshot_002_neg cleanup +zfs_snapshot_002_neg_head() +{ + atf_set "descr" "'zfs snapshot -r' fails with invalid arguments or scenarios." + atf_set "require.progs" zfs +} +zfs_snapshot_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_snapshot_002_neg.ksh || atf_fail "Testcase failed" +} +zfs_snapshot_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_snapshot_003_neg cleanup +zfs_snapshot_003_neg_head() +{ + atf_set "descr" "'zfs snapshot' fails with bad options, or too many arguments." + atf_set "require.progs" zfs +} +zfs_snapshot_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_snapshot_003_neg.ksh || atf_fail "Testcase failed" +} +zfs_snapshot_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_snapshot_004_neg cleanup +zfs_snapshot_004_neg_head() +{ + atf_set "descr" "Verify recursive snapshotting could not break ZFS." + atf_set "require.progs" zfs +} +zfs_snapshot_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_snapshot_004_neg.ksh || atf_fail "Testcase failed" +} +zfs_snapshot_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_snapshot_005_neg cleanup +zfs_snapshot_005_neg_head() +{ + atf_set "descr" "Verify long name filesystem with snapshot should not break ZFS." + atf_set "require.progs" zfs +} +zfs_snapshot_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_snapshot_005_neg.ksh || atf_fail "Testcase failed" +} +zfs_snapshot_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_snapshot_006_pos cleanup +zfs_snapshot_006_pos_head() +{ + atf_set "descr" "User property could be set upon snapshot via 'zfs snapshot -o'." + atf_set "require.progs" zfs zpool +} +zfs_snapshot_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_snapshot_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_snapshot_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_snapshot_007_neg cleanup +zfs_snapshot_007_neg_head() +{ + atf_set "descr" "'zfs snapshot -o' cannot set properties other than user property." + atf_set "require.progs" zfs +} +zfs_snapshot_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_snapshot_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_snapshot_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_snapshot_001_neg + atf_add_test_case zfs_snapshot_002_neg + atf_add_test_case zfs_snapshot_003_neg + atf_add_test_case zfs_snapshot_004_neg + atf_add_test_case zfs_snapshot_005_neg + atf_add_test_case zfs_snapshot_006_pos + atf_add_test_case zfs_snapshot_007_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/Makefile new file mode 100644 index 00000000000..68d6e21eb33 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/Makefile @@ -0,0 +1,28 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_unmount +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_unmount_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_unmount_003_pos.ksh +${PACKAGE}FILES+= zfs_unmount_all_001_pos.ksh +${PACKAGE}FILES+= zfs_unmount_006_pos.ksh +${PACKAGE}FILES+= zfs_unmount_002_pos.ksh +${PACKAGE}FILES+= zfs_unmount_007_neg.ksh +${PACKAGE}FILES+= zfs_unmount.cfg +${PACKAGE}FILES+= zfs_unmount_004_pos.ksh +${PACKAGE}FILES+= zfs_unmount_009_pos.ksh +${PACKAGE}FILES+= zfs_unmount_005_pos.ksh +${PACKAGE}FILES+= zfs_unmount_001_pos.ksh +${PACKAGE}FILES+= zfs_unmount_008_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_unmount.kshlib + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount.cfg new file mode 100644 index 00000000000..68142060678 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount.cfg @@ -0,0 +1,42 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export mountcmd=mount +export mountforce="$mountcmd -f" +export mountall="$mountcmd -a" + +export unmountcmd=unmount +export unmountforce="$unmountcmd -f" +export unmountall="$unmountcmd -a" + +export NONEXISTFSNAME="nonexistfs50charslong_0123456789012345678901234567" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount.kshlib new file mode 100644 index 00000000000..abae67ac8b0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount.kshlib @@ -0,0 +1,76 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount.kshlib 1.2 07/01/09 SMI" +# + +function do_unmount #cmd #opt #mnt #expect +{ + typeset cmd=$1 + typeset opt=$2 + typeset mnt=$3 + typeset -i expect=${4-0} + typeset -i ret + typeset -i wasmounted=1 + + mounted $mnt || wasmounted=0 + + if (( expect == 0 )) ; then + log_must $ZFS $cmd $opt $mnt + + log_must unmounted $mnt + + log_note "Successfully $ZFS $cmd $opt $mnt" + + else + log_note "$ZFS $cmd $opt $mnt" + + $ZFS $cmd $opt $mnt + ret=$? + if (( ret != expect)); then + log_fail "'$ZFS $cmd $opt $mnt' " \ + "unexpected return code of $ret." + fi + + if (( wasmounted == 1 )) ; then + log_must mounted $mnt + else + log_must unmounted $mnt + fi + log_note "Mount status of $mnt not changed." + fi +} + +function cleanup +{ + [[ -n $cwd ]] && cd $cwd + + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + mounted $TESTPOOL/$TESTFS || \ + log_must $ZFS $mountcmd $TESTPOOL/$TESTFS +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_001_pos.ksh new file mode 100644 index 00000000000..54ba2eec9eb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_001_pos.ksh @@ -0,0 +1,130 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_unmount_001_pos +# +# DESCRIPTION: +# Creates a file system and verifies that it can be unmounted +# using each of the various unmount options and sub-command +# variants. +# +# STRATEGY: +# 1. Create and mount a file system as necessary. +# 2. Umount the file system using the various combinations. +# - With force option. +# - Without force option. +# - Using the unmount sub-command. +# - Using the umount sub-command. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +function cleanup +{ + mounted $TESTDIR2 && \ + log_must $ZFS umount -f $TESTDIR2 + + datasetexists $TESTPOOL/$TESTFS2 && \ + log_must $ZFS destroy $TESTPOOL/$TESTFS2 + + [[ -d $TESTDIR2 ]] && \ + log_must $RM -rf $TESTDIR2 +} +function do_unmount +{ + typeset cmd=$1 + typeset opt=$2 + typeset mnt=$3 + + [[ ! -d $TESTDIR2 ]] && \ + log_must $MKDIR $TESTDIR2 + + if ! datasetexists $TESTPOOL/$TESTFS2 ; then + log_must $ZFS create $TESTPOOL/$TESTFS2 + log_must $ZFS set mountpoint=$TESTDIR2 \ + $TESTPOOL/$TESTFS2 + fi + + unmounted $TESTPOOL/$TESTFS2 && \ + log_must $ZFS mount $TESTPOOL/$TESTFS2 + + log_must $ZFS $cmd $options $mnt + + unmounted "$mnt" || \ + log_fail "Unable to unmount $options $mnt" + + log_note "Successfully unmounted $options $mnt" +} + +log_onexit cleanup + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$TESTFS2" "$TESTDIR2" + +log_assert "Verify the u[n]mount [-f] sub-command." + +typeset -i i=0 +typeset -i j=0 +typeset -i k=0 +while [[ $i -lt ${#cmd[*]} ]]; do + j=0 + while [[ $j -lt ${#options[*]} ]]; do + k=0 + while [[ $k -lt ${#dev[*]} ]]; do + do_unmount "${cmd[i]}" "${options[j]}" \ + "${dev[k]}" + + ((k = k + 1)) + done + + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "zfs u[n]mount [-f] completed successfully." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_002_pos.ksh new file mode 100644 index 00000000000..b68b9ae38d6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_002_pos.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_unmount/zfs_unmount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unmount_002_pos +# +# DESCRIPTION: +# If invoke "zfs unmount [-f]" with a filesystem|mountpoint +# whose name is not in "zfs list", +# it will fail with a return code of 1 +# and issue an error message. +# +# STRATEGY: +# 1. Make sure that the non-existent ZFS filesystem|mountpoint +# not in 'zfs list'. +# 2. Unmount the file system using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 3. Unmount the mountpoint using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 4. Verify the above expected results of the filesystem|mountpoint. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$NONEXISTFSNAME" "${TEST_BASE_DIR%%/}/$NONEXISTFSNAME" + +function do_unmount_multiple #options #expect +{ + typeset opt=$1 + typeset -i expect=${2-0} + + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#cmd[*]} )); do + j=0 + while (( j < ${#dev[*]} )); do + log_note "Make sure ${dev[j]} is not in 'zfs list'" + log_mustnot $ZFS list ${dev[j]} + + do_unmount "${cmd[i]}" "$opt" \ + "${dev[j]}" $expect + + ((j = j + 1)) + done + + ((i = i + 1)) + done +} + +log_assert "Verify that '$ZFS $unmountcmd [-f] ' " \ + "whose name is not in 'zfs list' will fail with return code 1." + +log_onexit cleanup + +typeset -i i=0 + +while (( i < ${#options[*]} )); do + do_unmount_multiple "${options[i]}" 1 + ((i = i + 1)) +done + +log_pass "'$ZFS $unmountcmd [-f] ' " \ + "whose name is not in 'zfs list' failed with return code 1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_003_pos.ksh new file mode 100644 index 00000000000..7cb635c5532 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_003_pos.ksh @@ -0,0 +1,123 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_unmount/zfs_unmount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unmount_003_pos +# +# DESCRIPTION: +# If invoke "zfs unmount [-f]" with a filesystem|mountpoint +# whose mountpoint property is 'legacy' or 'none', +# it will fail with a return code of 1 +# and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is mounted. +# 2. Apply 'zfs set mountpoint=legacy|none '. +# 3. Unmount the file system using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 4. Unmount the mountpoint using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 5. Verify the above expected results of the filesystem|mountpoint. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$TESTFS" "$TESTDIR" +set -A mopts "legacy" "none" + +function do_unmount_multiple #options #expect #mountpoint +{ + typeset opt=$1 + typeset -i expect=${2-0} + typeset mopt=$3 + + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#cmd[*]} )); do + j=0 + while (( j < ${#dev[*]} )); do + [[ -n $mopt ]] && \ + log_must $ZFS set mountpoint=$mopt ${dev[0]} + + do_unmount "${cmd[i]}" "$opt" \ + "${dev[j]}" $expect + + cleanup + + ((j = j + 1)) + done + + ((i = i + 1)) + done +} + +log_assert "Verify that '$ZFS $unmountcmd [-f] ' " \ + "whose mountpoint property is 'legacy' or 'none' " \ + "will fail with return code 1." + +log_onexit cleanup + +typeset -i i=0 +typeset -i j=0 + +while (( i < ${#mopts[*]} )); do + j=0 + while (( j < ${#options[*]} )); do + do_unmount_multiple "${options[j]}" 1 "${mopts[i]}" + ((j = j + 1)) + done + ((i = i + 1)) +done + +log_pass "'$ZFS $unmountcmd [-f] ' " \ + "whose mountpoint property is 'legacy' or 'none' " \ + "will fail with return code 1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_004_pos.ksh new file mode 100644 index 00000000000..3777ca7f37f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_004_pos.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_004_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_unmount/zfs_unmount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unmount_004_pos +# +# DESCRIPTION: +# If invoke "zfs unmount [-f]" with a specific filesystem|mountpoint, +# which is not currently mounted, +# it will fail with a return code of 1 +# and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is mounted. +# 2. Invoke 'zfs unmount '. +# 3. Verify that the filesystem is unmounted. +# 4. Unmount the file system using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 5. Unmount the mountpoint using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 6. Verify the above expected results of the filesystem|mountpoint. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$TESTFS" "$TESTDIR" + +function do_unmount_multiple #options #expect +{ + typeset opt=$1 + typeset -i expect=${2-0} + + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#cmd[*]} )); do + j=0 + while (( j < ${#dev[*]} )); do + unmounted ${dev[j]} || \ + log_must $ZFS $unmountforce ${dev[j]} + + do_unmount "${cmd[i]}" "$opt" \ + "${dev[j]}" $expect + + ((j = j + 1)) + done + + ((i = i + 1)) + done +} + +log_assert "Verify that '$ZFS $unmountcmd [-f] ' " \ + "with an unmounted filesystem will fail with return code 1." + +log_onexit cleanup + +typeset -i i=0 + +while (( i < ${#options[*]} )); do + do_unmount_multiple "${options[i]}" 1 + ((i = i + 1)) +done + +log_pass "'$ZFS $unmountcmd [-f] ' " \ + "with an unmounted filesystem failed with return code 1." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_005_pos.ksh new file mode 100644 index 00000000000..43ed06e3fda --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_005_pos.ksh @@ -0,0 +1,127 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_005_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_unmount/zfs_unmount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unmount_005_pos +# +# DESCRIPTION: +# If invoke "zfs unmount" with a specific filesystem|mountpoint +# that have been mounted, but it's currently in use, +# it will fail with a return code of 1 +# and issue an error message. +# But unmount forcefully will bypass this restriction and +# unmount that given filesystem successfully. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is mounted. +# 2. Change directory to that given mountpoint. +# 3. Unmount the file system using the various combinations. +# - Without force option. (FAILED) +# - With force option. (PASS) +# 4. Unmount the mountpoint using the various combinations. +# - Without force option. (FAILED) +# - With force option. (PASS) +# 5. Verify the above expected results of the filesystem|mountpoint. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$TESTFS" "$TESTDIR" + +function do_unmount_multiple #options #expect +{ + typeset opt=$1 + typeset -i expect=${2-0} + + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#cmd[*]} )); do + j=0 + while (( j < ${#dev[*]} )); do + mounted ${dev[j]} || \ + log_must $ZFS $mountcmd ${dev[0]} + + cd $TESTDIR || \ + log_unresolved "Unable change dir to $TESTDIR" + + do_unmount "${cmd[i]}" "$opt" \ + "${dev[j]}" $expect + + cleanup + + ((j = j + 1)) + done + + ((i = i + 1)) + done +} + +log_assert "Verify that '$ZFS $unmountcmd ' " \ + "with a filesystem which mountpoint is currently in use " \ + "will fail with return code 1, and forcefully will succeeds as root." + +log_onexit cleanup + +cwd=$PWD + +typeset -i i=0 + +while (( i < ${#options[*]} )); do + if [[ ${options[i]} == "-f" ]]; then + do_unmount_multiple "${options[i]}" + else + do_unmount_multiple "${options[i]}" 1 + fi + ((i = i + 1)) +done + +log_pass "'$ZFS $unmountcmd ' " \ + "with a filesystem which mountpoint is currently in use " \ + "will fail with return code 1, and forcefully will succeeds as root." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_006_pos.ksh new file mode 100644 index 00000000000..df5a31f4f89 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_006_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_006_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unmount_006_pos +# +# DESCRIPTION: +# Re-creating zfs files, 'zfs unmount' still succeed. +# +# STRATEGY: +# 1. Create pool and filesystem. +# 2. Recreating the same file in this fs for a while, then breaking out. +# 3. Verify the filesystem can be unmount successfully. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if ! ismounted $TESTPOOL/$TESTFS ; then + log_must $ZFS mount $TESTPOOL/$TESTFS + fi +} + +log_assert "Re-creating zfs files, 'zfs unmount' still succeed." +log_onexit cleanup + +# Call cleanup to make sure the file system are mounted. +cleanup +mntpnt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +(($? != 0)) && log_fail "get_prop mountpoint $TESTPOOL/$TESTFS" + +typeset -i i=0 +while (( i < 10000 )); do + $CP $STF_SUITE/include/libtest.kshlib $mntpnt + + (( i += 1 )) +done +log_note "Recreating zfs files for 10000 times." + +log_must $ZFS unmount $TESTPOOL/$TESTFS + +log_pass "Re-creating zfs files, 'zfs unmount' passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_007_neg.ksh new file mode 100644 index 00000000000..1bcbcfb6761 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_007_neg.ksh @@ -0,0 +1,124 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_007_neg.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/cli_root/zfs_unmount/zfs_unmount.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_unmount_007_neg +# +# DESCRIPTION: +# Try each 'zfs unmount' with inapplicable scenarios to make sure +# it returns an error. include: +# * Multiple filesystem|mountpoint specified +# * '-a', but also with a specific filesystem|mountpoint. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +multifs="$TESTFS $TESTFS1" +datasets="" + +for fs in $multifs ; do + datasets="$datasets $TESTPOOL/$fs" +done + +set -A args "$unmountall $TESTPOOL/$TESTFS" \ + "$unmountcmd $datasets" + +function setup_all +{ + typeset fs + + for fs in $multifs ; do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "$fs" \ + "${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID}/$TESTPOOL/$fs" + done + return 0 +} + +function cleanup_all +{ + typeset fs + + cleanup_filesystem "$TESTPOOL" "$TESTFS1" + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + [[ -d ${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID} ]] && \ + $RM -rf ${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID} + + return 0 +} + +function verify_all +{ + typeset fs + + for fs in $multifs ; do + log_must mounted $TESTPOOL/$fs + done + return 0 +} + +log_assert "Badly-formed 'zfs $unmountcmd' with inapplicable scenarios " \ + "should return an error." +log_onexit cleanup_all + +log_must setup_all + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS ${args[i]} + ((i = i + 1)) +done + +log_must verify_all + +log_pass "Badly formed 'zfs $unmountcmd' with inapplicable scenarios " \ + "fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_008_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_008_neg.ksh new file mode 100644 index 00000000000..ae0564b7c81 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_008_neg.ksh @@ -0,0 +1,157 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_008_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_unmount_008_neg +# +# DESCRIPTION: +# Verify that zfs unmount should fail with bad parameters or scenarios: +# 1. bad option; +# 2. too many arguments; +# 3. null arguments; +# 4. invalid datasets; +# 5. invalid mountpoint; +# 6. already unmounted zfs filesystem; +# 7. legacy mounted zfs filesystem +# +# STRATEGY: +# 1. Make an array of bad parameters +# 2. Use zfs unmount to unmount the filesystem +# 3. Verify that zfs unmount returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-9) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for ds in $vol $fs1; do + if datasetexists $ds; then + log_must $ZFS destroy -f $ds + fi + done + + if snapexists $snap; then + log_must $ZFS destroy $snap + fi + + if [[ -e $TMPDIR/$file ]]; then + $RM -f $TMPDIR/$file + fi + if [[ -d $TMPDIR/$dir ]]; then + $RM -rf $TMPDIR/$dir + fi + +} + +log_assert "zfs unmount fails with bad parameters or scenarios" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +vol=$TESTPOOL/vol.${TESTCASE_ID} +snap=$TESTPOOL/$TESTFS@snap.${TESTCASE_ID} +set -A badargs "A" "-A" "F" "-F" "-" "-x" "-?" + +if ! ismounted $fs; then + log_must $ZFS mount $fs +fi + +log_must $ZFS snapshot $snap +if is_global_zone; then + log_must $ZFS create -V 10m $vol +else + vol="" +fi + +# Testing bad options +for arg in ${badargs[@]}; do + log_mustnot eval "$ZFS unmount $arg $fs >/dev/null 2>&1" +done + + +#Testing invalid datasets +for ds in $snap $vol "blah"; do + for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt $ds >/dev/null 2>&1" + done +done + +#Testing invalid mountpoint +dir=foodir.${TESTCASE_ID} +file=foo.${TESTCASE_ID} +fs1=$TESTPOOL/fs.${TESTCASE_ID} +$MKDIR $TMPDIR/$dir +$TOUCH $TMPDIR/$file +log_must $ZFS create -o mountpoint=$TMPDIR/$dir $fs1 +curpath=`$DIRNAME $0` +cd $TMPDIR +for mpt in "./$dir" "./$file"; do + for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt $mpt >/dev/null 2>&1" + done +done +cd $curpath + +#Testing null argument and too many arguments +for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt >/dev/null 2>&1" + log_mustnot eval "$ZFS unmount $opt $fs $fs1 >/dev/null 2>&1" +done + +#Testing already unmounted filesystem +log_must $ZFS unmount $fs1 +for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt $fs1 >/dev/null 2>&1" + log_mustnot eval "$ZFS unmount $TMPDIR/$dir >/dev/null 2>&1" +done + +#Testing legacy mounted filesystem +log_must $ZFS set mountpoint=legacy $fs1 +log_must $MOUNT -t zfs $fs1 $TMPDIR/$dir +for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt $fs1 >/dev/null 2>&1" +done +$UMOUNT $TMPDIR/$dir + +log_pass "zfs unmount fails with bad parameters or scenarios as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_009_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_009_pos.ksh new file mode 100644 index 00000000000..0ba9a1f5623 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_009_pos.ksh @@ -0,0 +1,141 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_009_pos.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_unmount_009_pos +# +# DESCRIPTION: +# Verify that zfs unmount and destroy in a snapshot directory will not cause error. +# +# STRATEGY: +# 1. Create a file in a zfs filesystem, snapshot it and change directory to snapshot directory +# 2. Verify that 'zfs unmount -a' will fail and 'zfs unmount -fa' will succeed +# 3. Verify 'ls' and 'cd /' will succeed +# 4. 'zfs mount -a' and change directory to snapshot directory again +# 5. Verify that zfs destroy snapshot will succeed +# 6. Verify 'ls' and 'cd /' will succeed +# 7. Create zfs filesystem, create a file, snapshot it and change to snapshot directory +# 8. Verify that zpool destroy the pool will succeed +# 9. Verify 'ls' 'cd /' 'zpool list' and etc will succeed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-07-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + DISK=${DISKS%% *} + + for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + typeset snap=$fs@$TESTSNAP + if snapexists $snap; then + log_must $ZFS destroy $snap + fi + done + + if ! poolexists $TESTPOOL && is_global_zone; then + log_must $ZPOOL create $TESTPOOL $DISK + fi + + if ! datasetexists $TESTPOOL/$TESTFS; then + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + fi +} + +function restore_dataset +{ + if ! datasetexists $TESTPOOL/$TESTFS ; then + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must cd $TESTDIR + $ECHO hello > world + log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP + log_must cd $(get_snapdir_name)/$TESTSNAP + fi +} + + +log_assert "zfs fource unmount and destroy in snapshot directory will not cause error." +log_onexit cleanup + +for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + typeset snap=$fs@$TESTSNAP + typeset mtpt=$(get_prop mountpoint $fs) + + log_must cd $mtpt + $ECHO hello > world + log_must $ZFS snapshot $snap + log_must cd $(get_snapdir_name)/$TESTSNAP + + log_mustnot $ZFS unmount -a + log_must $ZFS unmount -fa + log_mustnot $LS + log_must cd / + + log_must $ZFS mount -a + log_must cd $mtpt + log_must cd $(get_snapdir_name)/$TESTSNAP + + if is_global_zone || [[ $fs != $TESTPOOL ]] ; then + log_must $ZFS destroy -rf $fs + log_mustnot $LS + log_must cd / + fi + + restore_dataset +done + +if is_global_zone ; then + log_must $ZPOOL destroy -f $TESTPOOL + log_mustnot $LS + log_must cd / +fi + +log_must eval $ZFS list > /dev/null 2>&1 +log_must eval $ZPOOL list > /dev/null 2>&1 +log_must eval $ZPOOL status > /dev/null 2>&1 +$ZPOOL iostat > /dev/null 2>&1 + +log_pass "zfs fource unmount and destroy in snapshot directory will not cause error." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_all_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_all_001_pos.ksh new file mode 100644 index 00000000000..f06a816c10d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_all_001_pos.ksh @@ -0,0 +1,209 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_all_001_pos.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/cli_root/zfs_unmount/zfs_unmount.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_unmount_all_001_pos +# +# DESCRIPTION: +# Verify that 'zfs unmount -a[f]' succeeds as root. +# +# STRATEGY: +# 1. Create a group of pools with specified vdev. +# 2. Create zfs filesystems within the given pools. +# 3. Mount all the filesystems. +# 4. Verify that 'zfs unmount -a[f]' command succeed, +# and all available ZFS filesystems are unmounted. +# 5. Verify that 'zfs mount' is identical with 'df -F zfs' +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A fs "$TESTFS" "$TESTFS1" +set -A ctr "" "$TESTCTR" "$TESTCTR1" "$TESTCTR/$TESTCTR1" +set -A vol "$TESTVOL" "$TESTVOL1" + +function setup_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + while (( i < ${#ctr[*]} )); do + + path=${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID}/$TESTPOOL + if [[ -n ${ctr[i]} ]]; then + path=$path/${ctr[i]} + + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}" "$path" \ + "ctr" + fi + + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}/${vol[j]}" \ + "$path/${vol[j]}" \ + "vol" + ((j = j + 1)) + done + fi + j=0 + while (( j < ${#fs[*]} )); do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}/${fs[j]}" \ + "$path/${fs[j]}" + ((j = j + 1)) + done + + ((i = i + 1)) + done + + return 0 +} + +function cleanup_all +{ + typeset -i i=0 + typeset -i j=0 + + ((i = ${#ctr[*]} - 1)) + + while (( i >= 0 )); do + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + cleanup_filesystem "$TESTPOOL" \ + "${ctr[i]}/${vol[j]}" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + cleanup_filesystem "$TESTPOOL" \ + "${ctr[i]}/${fs[j]}" + ((j = j + 1)) + done + + [[ -n ${ctr[i]} ]] && \ + cleanup_filesystem "$TESTPOOL" "${ctr[i]}" + + ((i = i - 1)) + done + + [[ -d ${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID} ]] && \ + $RM -rf ${TEST_BASE_DIR%%/}/testroot${TESTCASE_ID} +} + +function verify_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + while (( i < ${#ctr[*]} )); do + + path=$TESTPOOL + [[ -n ${ctr[i]} ]] && \ + path=$path/${ctr[i]} + + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + log_must unmounted "$path/${vol[j]}" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + log_must unmounted "$path/${fs[j]}" + ((j = j + 1)) + done + + log_must unmounted "$path" + + ((i = i + 1)) + done + + return 0 +} + + +log_assert "Verify that 'zfs $unmountall' succeeds as root, " \ + "and all available ZFS filesystems are unmounted." + +log_onexit cleanup_all + +log_must setup_all + +typeset opt +for opt in "-a" "-fa"; do + log_must $ZFS $mountall + + if [[ $opt == "-fa" ]]; then + mntpnt=$(get_prop mountpoint ${TESTPOOL}/${TESTCTR}/${TESTFS}) + cd $mntpnt + log_mustnot $ZFS unmount -a + fi + + log_must $ZFS unmount $opt + + if [[ $opt == "-fa" ]]; then + cd /tmp + fi + + log_must verify_all + log_note "Verify that 'zfs $mountcmd' will display " \ + "all ZFS filesystems currently mounted." + log_must verify_mount_display + +done + +log_pass "'zfs mount -[f]a' succeeds as root, " \ + "and all available ZFS filesystems are unmounted." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_test.sh new file mode 100755 index 00000000000..ce2a85b8934 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unmount/zfs_unmount_test.sh @@ -0,0 +1,310 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_unmount_001_pos cleanup +zfs_unmount_001_pos_head() +{ + atf_set "descr" "Verify the u[n]mount [-f] sub-command." + atf_set "require.progs" zfs +} +zfs_unmount_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_unmount_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_002_pos cleanup +zfs_unmount_002_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $unmountcmd [-f] 'whose name is not in 'zfs list' will fail with return code 1." + atf_set "require.progs" zfs +} +zfs_unmount_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_unmount_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_003_pos cleanup +zfs_unmount_003_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $unmountcmd [-f] 'whose mountpoint property is 'legacy' or 'none' \will fail with return code 1." + atf_set "require.progs" zfs +} +zfs_unmount_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_unmount_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_004_pos cleanup +zfs_unmount_004_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $unmountcmd [-f] 'with an unmounted filesystem will fail with return code 1." + atf_set "require.progs" zfs +} +zfs_unmount_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_unmount_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_005_pos cleanup +zfs_unmount_005_pos_head() +{ + atf_set "descr" "Verify that '$ZFS $unmountcmd 'with a filesystem which mountpoint is currently in use \will fail with return code 1, and forcefully will succeeds as root." + atf_set "require.progs" zfs +} +zfs_unmount_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_unmount_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_006_pos cleanup +zfs_unmount_006_pos_head() +{ + atf_set "descr" "Re-creating zfs files, 'zfs unmount' still succeed." + atf_set "require.progs" zfs +} +zfs_unmount_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_unmount_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_007_neg cleanup +zfs_unmount_007_neg_head() +{ + atf_set "descr" "Badly-formed 'zfs $unmountcmd' with inapplicable scenariosshould return an error." + atf_set "require.progs" zfs +} +zfs_unmount_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_unmount_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_008_neg cleanup +zfs_unmount_008_neg_head() +{ + atf_set "descr" "zfs unmount fails with bad parameters or scenarios" + atf_set "require.progs" zfs +} +zfs_unmount_008_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_008_neg.ksh || atf_fail "Testcase failed" +} +zfs_unmount_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_009_pos cleanup +zfs_unmount_009_pos_head() +{ + atf_set "descr" "zfs fource unmount and destroy in snapshot directory will not cause error." + atf_set "require.progs" zfs zpool +} +zfs_unmount_009_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_009_pos.ksh || atf_fail "Testcase failed" +} +zfs_unmount_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_all_001_pos cleanup +zfs_unmount_all_001_pos_head() +{ + atf_set "descr" "Verify that 'zfs $unmountall' succeeds as root,and all available ZFS filesystems are unmounted." + atf_set "require.progs" zfs +} +zfs_unmount_all_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_all_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_unmount_all_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unmount.kshlib + . $(atf_get_srcdir)/zfs_unmount.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_unmount_001_pos + atf_add_test_case zfs_unmount_002_pos + atf_add_test_case zfs_unmount_003_pos + atf_add_test_case zfs_unmount_004_pos + atf_add_test_case zfs_unmount_005_pos + atf_add_test_case zfs_unmount_006_pos + atf_add_test_case zfs_unmount_007_neg + atf_add_test_case zfs_unmount_008_neg + atf_add_test_case zfs_unmount_009_pos + atf_add_test_case zfs_unmount_all_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/Makefile new file mode 100644 index 00000000000..bd58561f438 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_unshare +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_unshare_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_unshare_003_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_unshare_002_pos.ksh +${PACKAGE}FILES+= zfs_unshare.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_unshare_005_neg.ksh +${PACKAGE}FILES+= zfs_unshare_001_pos.ksh +${PACKAGE}FILES+= zfs_unshare_004_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/setup.ksh new file mode 100644 index 00000000000..3bc69250e30 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# Make sure NFS server is running before testing. +setup_nfs_server + +DISK=${DISKS%% *} +default_container_volume_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare.cfg new file mode 100644 index 00000000000..871d4a1592d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unshare.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export NONEXISTFSNAME="nonexistfs50charslong_0123456789012345678901234567" +export NONEXISTMOUNTPOINT="/nonexistmountpoint_0123456789" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_001_pos.ksh new file mode 100644 index 00000000000..2dc4f5a24c3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_001_pos.ksh @@ -0,0 +1,195 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unshare_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unshare_001_pos +# +# DESCRIPTION: +# Verify that 'zfs unshare ' unshares a given shared +# filesystem. +# +# STRATEGY: +# 1. Share filesystems +# 2. Invoke 'zfs unshare ' to unshare zfs file system +# 3. Verify that the file system is unshared +# 4. Verify that unsharing an unshared file system fails +# 5. Verify that "zfs unshare -a" succeeds to unshare all zfs file systems. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset -i i=0 + while (( i < ${#mntp_fs[*]} )); do + log_must $ZFS set sharenfs=off ${mntp_fs[((i+1))]} + + ((i = i + 2)) + done + + if mounted $TESTPOOL/$TESTCLONE; then + log_must $ZFS unmount $TESTDIR2 + fi + + [[ -d $TESTDIR2 ]] && \ + log_must $RM -rf $TESTDIR2 + + if datasetexists "$TESTPOOL/$TESTCLONE"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTCLONE + fi + + if snapexists "$TESTPOOL/$TESTFS2@snapshot"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS2@snapshot + fi + + if datasetexists "$TESTPOOL/$TESTFS2"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS2 + fi +} + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# unshare the filesystem via argument +# and then verify it has been unshared. +# +function test_unshare # +{ + typeset mntp=$1 + typeset filesystem=$2 + typeset prop_value + + prop_value=$(get_prop "sharenfs" $filesystem) + + if [[ $prop_value == "off" ]]; then + not_shared $mntp || + log_must $UNSHARE -F nfs $mntp + log_must $ZFS set sharenfs=on $filesystem + is_shared $mntp || \ + log_fail "'$ZFS set sharenfs=on' fails to make" \ + "file system $filesystem shared." + fi + + is_shared $mntp || \ + log_must $ZFS share $filesystem + + # + # Verify 'zfs unshare ' works as well. + # + log_must $ZFS unshare $filesystem + not_shared $mntp || \ + log_fail "'zfs unshare ' fails" + + log_must $ZFS share $filesystem + + log_must $ZFS unshare $mntp + not_shared $mntp || \ + log_fail "'zfs unshare ' fails" + + log_note "Unsharing an unshared file system fails." + log_mustnot $ZFS unshare $filesystem + log_mustnot $ZFS unshare $mntp +} + + +set -A mntp_fs \ + "$TESTDIR" "$TESTPOOL/$TESTFS" \ + "$TESTDIR1" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTDIR2" "$TESTPOOL/$TESTCLONE" + +log_assert "Verify that 'zfs unshare [-a] ' succeeds as root." +log_onexit cleanup + +log_must $ZFS create $TESTPOOL/$TESTFS2 +log_must $ZFS snapshot $TESTPOOL/$TESTFS2@snapshot +log_must $ZFS clone $TESTPOOL/$TESTFS2@snapshot $TESTPOOL/$TESTCLONE +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$TESTCLONE + +# +# Invoke 'test_unshare' routine to test 'zfs unshare '. +# +typeset -i i=0 +while (( i < ${#mntp_fs[*]} )); do + test_unshare ${mntp_fs[i]} ${mntp_fs[((i + 1 ))]} + + ((i = i + 2)) +done + +log_note "Verify '$ZFS unshare -a' succeds as root." + +i=0 +typeset sharenfs_val +while (( i < ${#mntp_fs[*]} )); do + sharenfs_val=$(get_prop "sharenfs" ${mntp_fs[((i+1))]}) + if [[ $sharenfs_val == "on" ]]; then + not_shared ${mntp_fs[i]} && \ + log_must $ZFS share ${mntp_fs[((i+1))]} + else + log_must $ZFS set sharenfs=on ${mntp_fs[((i+1))]} + is_shared ${mntp_fs[i]} || \ + log_fail "'$ZFS set sharenfs=on' fails to share filesystem." + fi + + ((i = i + 2)) +done + +# +# test 'zfs unshare -a ' +# +log_must $ZFS unshare -a + +# +# verify all shared filesystems become unshared +# +i=0 +while (( i < ${#mntp_fs[*]} )); do + not_shared ${mntp_fs[i]} || \ + log_fail "'$ZFS unshare -a' fails to unshare all shared zfs filesystems." + + ((i = i + 2)) +done + +log_pass "'$ZFS unshare [-a] ' succeeds as root." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_002_pos.ksh new file mode 100644 index 00000000000..b728595c636 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_002_pos.ksh @@ -0,0 +1,194 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unshare_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unshare_002_pos +# +# DESCRIPTION: +# Verify that 'zfs unshare [-a] ' is aware of legacy share. +# +# STRATEGY: +# 1. Set 'zfs set sharenfs=off' +# 2. Use 'share' to share given filesystem +# 3. Verify that 'zfs unshare ' is aware of legacy share +# 4. Verify that 'zfs unshare -a' is aware of legacy share. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-28) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset -i i=0 + while (( i < ${#mntp_fs[*]} )); do + is_shared ${mntp_fs[i]} && \ + log_must $UNSHARE -F nfs ${mntp_fs[i]} + + ((i = i + 2)) + done + + if mounted $TESTPOOL/$TESTCLONE; then + log_must $ZFS unmount $TESTDIR2 + fi + + [[ -d $TESTDIR2 ]] && \ + log_must $RM -rf $TESTDIR2 + + if datasetexists "$TESTPOOL/$TESTCLONE"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTCLONE + fi + + if snapexists "$TESTPOOL/$TESTFS2@snapshot"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS2@snapshot + fi + + if datasetexists "$TESTPOOL/$TESTFS2"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS2 + fi +} + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# to verify 'zfs unshare' is aware of legacy share. +# +function test_legacy_unshare # +{ + typeset mntp=$1 + typeset filesystem=$2 + + log_must $ZFS set sharenfs=off $filesystem + not_shared $mntp || \ + log_fail "'zfs set sharenfs=off' fails to make ZFS filesystem $filesystem unshared." + + log_must $SHARE -F nfs $mntp + is_shared $mntp || \ + log_fail "'share' command fails to share ZFS file system." + # + # Verify 'zfs unshare ' is aware of legacy share. + # + log_mustnot $ZFS unshare $filesystem + is_shared $mntp || \ + log_fail "'zfs unshare ' fails to be aware" \ + "of legacy share." + + # + # Verify 'zfs unshare ' is aware of legacy share. + # + log_mustnot $ZFS unshare $mntp + is_shared $mntp || \ + log_fail "'zfs unshare ' fails to be aware" \ + "of legacy share." +} + + +set -A mntp_fs \ + "$TESTDIR" "$TESTPOOL/$TESTFS" \ + "$TESTDIR1" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTDIR2" "$TESTPOOL/$TESTCLONE" + +log_assert "Verify that 'zfs unshare [-a]' is aware of legacy share." +log_onexit cleanup + +log_must $ZFS create $TESTPOOL/$TESTFS2 +log_must $ZFS snapshot $TESTPOOL/$TESTFS2@snapshot +log_must $ZFS clone $TESTPOOL/$TESTFS2@snapshot $TESTPOOL/$TESTCLONE +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$TESTCLONE + +# +# Invoke 'test_legacy_unshare' routine to verify. +# +typeset -i i=0 +while (( i < ${#mntp_fs[*]} )); do + test_legacy_unshare ${mntp_fs[i]} ${mntp_fs[((i + 1 ))]} + + ((i = i + 2)) +done + + +log_note "Verify '$ZFS unshare -a' is aware of legacy share." + +# +# set the 'sharenfs' property to 'off' for each filesystem +# +i=0 +while (( i < ${#mntp_fs[*]} )); do + log_must $ZFS set sharenfs=off ${mntp_fs[((i + 1))]} + not_shared ${mntp_fs[i]} || \ + log_fail "'$ZFS set sharenfs=off' unshares file system failed." + + ((i = i + 2)) +done + +# +# Share each of the file systems via legacy share. +# +i=0 +while (( i < ${#mntp_fs[*]} )); do + $SHARE -F nfs ${mntp_fs[i]} + is_shared ${mntp_fs[i]} || \ + log_fail "'$SHARE' shares ZFS filesystem failed." + + ((i = i + 2)) +done + +# +# Verify that 'zfs unshare -a' is aware of legacy share +# +log_must $ZFS unshare -a + +# +# verify ZFS filesystems are still shared +# +i=0 +while (( i < ${#mntp_fs[*]} )); do + is_shared ${mntp_fs[i]} || \ + log_fail "'$ZFS unshare -a' fails to be aware of legacy share." + + ((i = i + 2)) +done + +log_pass "'$ZFS unshare [-a]' succeeds to be aware of legacy share." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_003_pos.ksh new file mode 100644 index 00000000000..a01e30a6f3d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_003_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unshare_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unshare_003_pos +# +# DESCRIPTION: +# Verify that a file system and its dependent are unshared when turn off sharenfs +# property. +# +# STRATEGY: +# 1. Create a file system +# 2. Set the sharenfs property on the file system +# 3. Create a snapshot +# 4. Verify that both are shared +# 5. Turn off the sharenfs property +# 6. Verify that both are unshared. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@snapshot; then + log_must $ZFS destroy $TESTPOOL/$TESTFS@snapshot + fi + + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS +} + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# unshare the mountpoint and then verify a snapshot of the mounpoint +# is also unshared. +# +function test_snap_unshare # +{ + typeset mntp=$1 + typeset filesystem=$2 + typeset prop_value + + prop_value=$(get_prop "sharenfs" $filesystem) + + if [[ $prop_value == "off" ]]; then + is_shared $mntp || \ + $UNSHARE -F nfs $mntp + log_must $ZFS set sharenfs=on $filesystem + fi + + log_must $ZFS set sharenfs=off $filesystem + + not_shared $mntp || \ + log_fail "File system $filesystem is shared (set sharenfs)." + + not_shared $mntp@snapshot || \ + log_fail "Snapshot $mntpt@snapshot is shared (set sharenfs)." +} + +log_assert "Verify that a file system and its dependent are unshared." +log_onexit cleanup + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot +test_snap_unshare $TESTDIR $TESTPOOL/$TESTFS + +log_pass "A file system and its dependent are both unshared as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_004_neg.ksh new file mode 100644 index 00000000000..3e39a8a976a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_004_neg.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unshare_004_neg.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unshare_004_neg +# +# DESCRIPTION: +# Verify that "zfs unshare" issue error message with badly formed parameter. +# +# STRATEGY: +# 1. Define badly formed parameters +# 2. Invoke 'zfs unshare' +# 3. Verify that unshare fails and issue error message. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A opts "" "$TESTPOOL/$NONEXISTFSNAME" "$NONEEXISTMOUNTPOINT" "-?" "-1" \ + "-a blah" "$TESTPOOL/$TESTFS $TESTPOOL/$TESTFS1" \ + "-f $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$TESTFS $TESTDIR" "-f $TESTPOOL/$TESTFS $TESTDIR" \ + "${TESTDIR#/}" "-f ${TESTDIR#/}" + +log_assert "Verify that '$ZFS unshare' issue error message with badly formed parameter." + +shareval=$(get_prop sharenfs $TESTPOOL/$TESTFS) +if [[ $shareval == off ]]; then + log_must $ZFS set sharenfs=on $TESTPOOL/$TESTFS +fi + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZFS unshare ${args[i]} + + ((i = i + 1)) +done + +#Testing that unsharing unshared filesystem fails. +mpt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +log_must $ZFS unshare $TESTPOOL/$TESTFS +for opt in "" "-f"; do + log_mustnot eval "$ZFS unshare $opt $TESTPOOL/$TESTFS >/dev/null 2>&1" + log_mustnot eval "$ZFS unshare $opt $mpt >/dev/null 2>&1" +done + +#Testing zfs unshare fails with legacy share set +log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS +for opt in "" "-f"; do + log_mustnot eval "$ZFS unshare $opt $TESTPOOL/$TESTFS >/dev/null 2>&1" + log_mustnot eval "$ZFS unshare $opt $mpt >/dev/null 2>&1" +done + +log_pass "'$ZFS unshare' fails as expected with badly-formed parameters." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_005_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_005_neg.ksh new file mode 100644 index 00000000000..4f220b2ca56 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_005_neg.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unshare_005_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unshare_005_neg +# +# DESCRIPTION: +# Verify that unsharing a dataset and mountpoint other than filesystem fails. +# +# STRATEGY: +# 1. Create a volume, dataset other than a ZFS file system +# 2. Verify that the datasets other than file system are not support by 'zfs unshare'. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A datasets \ + "$TESTPOOL" "$ZFSROOT/$TESTPOOL" \ + "$TESTPOOL/$TESTCTR" "$ZFSROOT/$TESTPOOL/$TESTCTR" \ + "$TESTPOOL/$TESTVOL" "/dev/zvol/$TESTPOOL/$TESTVOL" + +log_assert "Verify that unsharing a dataset other than filesystem fails." + +typeset -i i=0 +while (( i < ${#datasets[*]} )) +do + log_mustnot $ZFS unshare ${datasets[i]} + + ((i = i + 1)) +done + +log_pass "Unsharing datasets other than filesystem failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_test.sh new file mode 100755 index 00000000000..1499b9e5382 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_unshare/zfs_unshare_test.sh @@ -0,0 +1,152 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_unshare_001_pos cleanup +zfs_unshare_001_pos_head() +{ + atf_set "descr" "Verify that 'zfs unshare [-a] ' succeeds as root." + atf_set "require.progs" zfs unshare svcs +} +zfs_unshare_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unshare_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_unshare_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unshare_002_pos cleanup +zfs_unshare_002_pos_head() +{ + atf_set "descr" "Verify that 'zfs unshare [-a]' is aware of legacy share." + atf_set "require.progs" zfs unshare share svcs +} +zfs_unshare_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unshare_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_unshare_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unshare_003_pos cleanup +zfs_unshare_003_pos_head() +{ + atf_set "descr" "Verify that a file system and its dependent are unshared." + atf_set "require.progs" zfs unshare svcs +} +zfs_unshare_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unshare_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_unshare_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unshare_004_neg cleanup +zfs_unshare_004_neg_head() +{ + atf_set "descr" "Verify that '$ZFS unshare' issue error message with badly formed parameter." + atf_set "require.progs" zfs svcs +} +zfs_unshare_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unshare_004_neg.ksh || atf_fail "Testcase failed" +} +zfs_unshare_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unshare_005_neg cleanup +zfs_unshare_005_neg_head() +{ + atf_set "descr" "Verify that unsharing a dataset other than filesystem fails." + atf_set "require.progs" zfs svcs +} +zfs_unshare_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unshare_005_neg.ksh || atf_fail "Testcase failed" +} +zfs_unshare_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_unshare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_unshare_001_pos + atf_add_test_case zfs_unshare_002_pos + atf_add_test_case zfs_unshare_003_pos + atf_add_test_case zfs_unshare_004_neg + atf_add_test_case zfs_unshare_005_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/Makefile new file mode 100644 index 00000000000..e0ca28b6e1a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/Makefile @@ -0,0 +1,25 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zfs_upgrade +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_upgrade_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_upgrade.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zfs_upgrade_004_pos.ksh +${PACKAGE}FILES+= zfs_upgrade_001_pos.ksh +${PACKAGE}FILES+= zfs_upgrade_005_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_upgrade.kshlib +${PACKAGE}FILES+= zfs_upgrade_006_neg.ksh +${PACKAGE}FILES+= zfs_upgrade_003_pos.ksh +${PACKAGE}FILES+= zfs_upgrade_007_neg.ksh +${PACKAGE}FILES+= zfs_upgrade_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/cleanup.ksh new file mode 100644 index 00000000000..7789fef5acb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 07/10/09 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "both" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/setup.ksh new file mode 100644 index 00000000000..8eaae20b636 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/setup.ksh @@ -0,0 +1,46 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 07/10/09 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +# This should have been set by the .cfg script - verify it's set to something +# (we check that something later on) +if [ -z "$ZFS_VERSION" ] +then + log_unresolved "Unable to determine ZFS Filesystem version of this machine" +else + log_note "This machine is running ZFS Filesystem version $ZFS_VERSION" +fi + +default_setup "$DISK" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade.cfg b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade.cfg new file mode 100644 index 00000000000..1cc5d1a071e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib new file mode 100644 index 00000000000..b0c31a6fb2f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib @@ -0,0 +1,196 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade.kshlib 1.3 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# For zfs create. +# When pool version is 15, fs whose version is 4 can be created. +# +set -A zpl_create_versions 3 4 5 +set -A spa_create_versions 9 15 24 + +# +# For zfs upgrade +# +set -A zpl_upgrade_versions 3 4 5 +set -A spa_upgrade_versions 9 15 24 + +function get_pool_version #pool +{ + typeset pool=$1 + typeset vs=$(get_pool_prop version $pool) + if [ "$vs" = "-" ]; then + echo 5000 + else + echo "$vs" + fi +} + +function default_setup_datasets #rootfs +{ + typeset rootfs=$1 + typeset pool=${rootfs%%/*} + typeset -i vp=$(get_pool_version $pool) + typeset -i version + typeset -i m + typeset -i spa_version + typeset -i zpl_version + + for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + + (( m=0 )) + (( spa_version=0 )) + while (( m < ${#zpl_create_versions[@]} )); do + (( zpl_version=${zpl_create_versions[m]} )) + if (( version == zpl_version )); then + (( spa_version=${spa_create_versions[m]} )) + break + fi + (( m+=1 )) + done + if (( spa_version != 0 )) && (( vp < spa_version )); then + log_mustnot $ZFS create -o version=${version} ${current_fs} + continue + fi + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + + for subversion in $ZFS_ALL_VERSIONS ; do + typeset subverfs + eval subverfs=\$ZFS_VERSION_$subversion + + (( m=0 )) + (( spa_version=0 )) + while (( m < ${#zpl_create_versions[@]} )); do + (( zpl_version=${zpl_create_versions[m]} )) + if (( subversion == zpl_version )); then + (( spa_version=${spa_create_versions[m]} )) + break + fi + (( m+=1 )) + done + if (( spa_version != 0 )) && (( vp < spa_version )); then + log_mustnot $ZFS create -o \ + version=${subversion} ${current_fs}/$subverfs + else + log_must $ZFS create -o \ + version=${subversion} ${current_fs}/$subverfs + fi + done + done +} + +function default_cleanup_datasets #rootfs +{ + typeset rootfs=$1 + + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + + if datasetnonexists $rootfs ; then + log_must $ZFS create $rootfs + fi +} + +function default_check_zfs_upgrade #rootfs +{ + typeset rootfs=$1 + typeset pool=${rootfs%%/*} + typeset -i vp="$(get_pool_version $pool)" + typeset -i m + typeset -i spa_version + typeset -i zpl_version + typeset newv + typeset -i df_ret + + $DF -t zfs / > /dev/null 2>&1 + df_ret=$? + + for newv in "" $ZFS_VERSION; do + default_setup_datasets $rootfs + if [[ -n $newv ]]; then + opt="-V $newv" + else + newv=$ZFS_VERSION + fi + + (( m=0 )) + (( spa_version=0 )) + while (( m < ${#zpl_upgrade_versions[@]} )); do + (( zpl_version=${zpl_upgrade_versions[m]} )) + if (( newv == zpl_version )); then + (( spa_version=${spa_upgrade_versions[m]} )) + break + fi + (( m+=1 )) + done + + if (( df_ret != 0 )); then + if (( spa_version != 0 )) && (( vp < spa_version )); then + log_mustnot eval '$ZFS upgrade $opt -a > /dev/null 2>&1' + log_must eval '$ZPOOL upgrade $pool > /dev/null 2>&1' + vp="$(get_pool_version $pool)" + fi + + log_must eval '$ZFS upgrade $opt -a > /dev/null 2>&1' + + for fs in $($ZFS list -rH -t filesystem -o name $rootfs) ; do + log_must check_fs_version $fs $newv + done + fi + + default_cleanup_datasets $rootfs + done +} + +function check_fs_version #filesystem version +{ + typeset fs=$1 + typeset -i version=${2:-$ZFS_VERSION} + + if [[ -z $fs ]]; then + log_fail "No filesystem specified." + fi + + typeset -i curv=$(get_prop version $fs) + if (( curv != version )); then + return 1 + fi + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_001_pos.ksh new file mode 100644 index 00000000000..1763c784819 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_001_pos.ksh @@ -0,0 +1,154 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade_001_pos.ksh 1.2 08/08/15 SMI" +# +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_upgrade_001_pos +# +# DESCRIPTION: +# Executing 'zfs upgrade' command succeeds, it should report +# the current system version and list all old-version filesystems. +# If no old-version filesystems be founded, it prints out +# "All filesystems are formatted with the current version." +# +# STRATEGY: +# 1. Prepare a set of datasets which contain old-version and current version. +# 2. Execute 'zfs upgrade', verify return 0, and it prints out +# the current system version and list all old-version filesystems. +# 3. Remove all old-version filesystems, then execute 'zfs upgrade' again, +# verify return 0, and get the expected message. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + log_must $ZFS create $rootfs + + for file in $output $oldoutput ; do + if [[ -f $file ]]; then + log_must $RM -f $file + fi + done +} + +log_assert "Executing 'zfs upgrade' command succeeds." +log_onexit cleanup + +rootfs=$TESTPOOL/$TESTFS +typeset output=$TMPDIR/zfs-versions.${TESTCASE_ID} +typeset oldoutput=$TMPDIR/zfs-versions-old.${TESTCASE_ID} +typeset expect_str1="This system is currently running ZFS filesystem version" +typeset expect_str2="All filesystems are formatted with the current version" +typeset expect_str3="The following filesystems are out of date, and can be upgraded" +typeset -i COUNT OLDCOUNT + +$ZFS upgrade | $NAWK '$1 ~ "^[0-9]+$" {print $2}'> $oldoutput +OLDCOUNT=$( $WC -l $oldoutput | $AWK '{print $1}' ) + +old_datasets="" +for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + + if (( version != $ZFS_VERSION )); then + old_datasets="$old_datasets ${current_fs} ${current_clone}" + fi +done + +if is_global_zone; then + log_must $ZFS create -V 100m $rootfs/$TESTVOL +fi + +log_must eval '$ZFS upgrade > $output 2>&1' + +# we also check that the usage message contains at least a description +# of the current ZFS version. +log_must eval '$GREP "${expect_str1} $ZFS_VERSION" $output > /dev/null 2>&1' +$ZFS upgrade | $NAWK '$1 ~ "^[0-9]+$" {print $2}'> $output +COUNT=$( $WC -l $output | $AWK '{print $1}' ) + +typeset -i i=0 +for fs in ${old_datasets}; do + log_must $GREP "^$fs$" $output + (( i = i + 1 )) +done + +if (( i != COUNT - OLDCOUNT )); then + $CAT $output + log_fail "More old-version filesystems print out than expect." +fi + +for fs in $old_datasets ; do + if datasetexists $fs ; then + log_must $ZFS destroy -Rf $fs + fi +done + +log_must eval '$ZFS upgrade > $output 2>&1' +log_must eval '$GREP "${expect_str1} $ZFS_VERSION" $output > /dev/null 2>&1' +if (( OLDCOUNT == 0 )); then + log_must eval '$GREP "${expect_str2}" $output > /dev/null 2>&1' +else + log_must eval '$GREP "${expect_str3}" $output > /dev/null 2>&1' +fi +$ZFS upgrade | $NAWK '$1 ~ "^[0-9]+$" {print $2}'> $output +COUNT=$( $WC -l $output | $AWK '{print $1}' ) + +if (( COUNT != OLDCOUNT )); then + $CAT $output + log_fail "Unexpect old-version filesystems print out." +fi + +log_pass "Executing 'zfs upgrade' command succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_002_pos.ksh new file mode 100644 index 00000000000..ba9fb352412 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_002_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade_002_pos.ksh 1.1 07/10/09 SMI" +# +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_upgrade_002_pos +# +# DESCRIPTION: +# Executing 'zfs upgrade -v ' command succeeds, it should +# show the info of available versions. +# +# STRATEGY: +# 1. Execute 'zfs upgrade -v', verify return value is 0. +# 2, Verify all the available versions info are printed out. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if [[ -f $output ]]; then + log_must $RM -f $output + fi +} + +log_assert "Executing 'zfs upgrade -v' command succeeds." +log_onexit cleanup + +typeset output=$TMPDIR/zfs-versions.${TESTCASE_ID} +typeset expect_str1="Initial ZFS filesystem version" +typeset expect_str2="Enhanced directory entries" + +log_must eval '$ZFS upgrade -v > /dev/null 2>&1' + +$ZFS upgrade -v | $NAWK '$1 ~ "^[0-9]+$" {print $0}'> $output +log_must eval '$GREP "${expect_str1}" $output > /dev/null 2>&1' +log_must eval '$GREP "${expect_str2}" $output > /dev/null 2>&1' + +log_pass "Executing 'zfs upgrade -v' command succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_003_pos.ksh new file mode 100644 index 00000000000..725293219bd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_003_pos.ksh @@ -0,0 +1,118 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade_003_pos.ksh 1.2 09/06/22 SMI" +# +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_upgrade_003_pos +# +# DESCRIPTION: +# Executing 'zfs upgrade [-V version] filesystem' command succeeds, +# it could upgrade a filesystem to specific version or current version. +# +# STRATEGY: +# 1. Prepare a set of datasets which contain old-version and current version. +# 2. Execute 'zfs upgrade [-V version] filesystem', verify return 0, +# 3. Verify the filesystem be updated as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + log_must $ZFS create $rootfs +} + +function setup_datasets +{ + datasets="" + for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + datasets="$datasets ${current_fs} ${current_clone}" + done +} + +log_assert "Executing 'zfs upgrade [-V version] filesystem' command succeeds." +log_onexit cleanup + +rootfs=$TESTPOOL/$TESTFS +typeset datasets + +typeset newv +for newv in "" "current" $ZFS_ALL_VERSIONS; do + setup_datasets + for fs in $datasets ; do + typeset -i oldv=$(get_prop version $fs) + + if [[ -n $newv ]]; then + opt="-V $newv" + if [[ $newv == current ]]; then + newv=$ZFS_VERSION + fi + else + newv=$ZFS_VERSION + fi + + if (( newv >= oldv )); then + log_must eval '$ZFS upgrade $opt $fs > /dev/null 2>&1' + log_must check_fs_version $fs $newv + else + log_mustnot eval '$ZFS upgrade $opt $fs > /dev/null 2>&1' + log_must check_fs_version $fs $oldv + fi + done + cleanup +done + +log_pass "Executing 'zfs upgrade [-V version] filesystem' command succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_004_pos.ksh new file mode 100644 index 00000000000..687adc2f6ef --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_004_pos.ksh @@ -0,0 +1,122 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade_004_pos.ksh 1.2 09/06/22 SMI" +# +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_upgrade_004_pos +# +# DESCRIPTION: +# Executing 'zfs upgrade -r [-V version] filesystem' command succeeds, +# it upgrade filesystem recursively to specific or current version. +# +# STRATEGY: +# 1. Prepare a set of datasets which contain old-version and current version. +# 2. Execute 'zfs upgrade -r [-V version] filesystem', verify return 0, +# 3. Verify the filesystem be updated recursively as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + log_must $ZFS create $rootfs +} + +function setup_datasets +{ + datasets="" + for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + + for subversion in $ZFS_ALL_VERSIONS ; do + typeset subverfs + eval subverfs=\$ZFS_VERSION_$subversion + log_must $ZFS create -o version=${subversion} \ + ${current_fs}/$subverfs + done + datasets="$datasets ${current_fs}" + done +} + +log_assert "Executing 'zfs upgrade -r [-V version] filesystem' command succeeds." +log_onexit cleanup + +rootfs=$TESTPOOL/$TESTFS + +typeset datasets + +typeset newv +for newv in "" "current" $ZFS_VERSION; do + setup_datasets + for topfs in $datasets ; do + if [[ -n $newv ]]; then + opt="-V $newv" + if [[ $newv == current ]]; then + newv=$ZFS_VERSION + fi + else + newv=$ZFS_VERSION + fi + + log_must eval '$ZFS upgrade -r $opt $topfs > /dev/null 2>&1' + + for fs in $($ZFS list -rH -t filesystem -o name $topfs) ; do + log_must check_fs_version $fs $newv + done + done + cleanup +done + +log_pass "Executing 'zfs upgrade -r [-V version] filesystem' command succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_005_pos.ksh new file mode 100644 index 00000000000..7d50b9960d4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_005_pos.ksh @@ -0,0 +1,126 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade_005_pos.ksh 1.3 09/06/22 SMI" +# +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_upgrade_005_pos +# +# DESCRIPTION: +# Executing 'zfs upgrade [-V version] -a' command succeeds, +# it upgrade all filesystems to specific or current version. +# +# STRATEGY: +# 1. Prepare a set of datasets which contain old-version and current version. +# 2. Execute 'zfs upgrade [-V version] -a', verify return 0, +# 3. Verify all the filesystems be updated as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + log_must $ZFS create $rootfs +} + +function setup_datasets +{ + datasets="" + for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + + for subversion in $ZFS_ALL_VERSIONS ; do + typeset subverfs + eval subverfs=\$ZFS_VERSION_$subversion + log_must $ZFS create -o version=${subversion} \ + ${current_fs}/$subverfs + done + datasets="$datasets ${current_fs}" + done +} + +log_assert "Executing 'zfs upgrade [-V version] -a' command succeeds." + +$DF -t zfs / > /dev/null 2>&1 +if (( $? == 0 )) ; then + log_unsupported "This case should not run on ZFS root system" +fi + +log_onexit cleanup + +rootfs=$TESTPOOL/$TESTFS + +typeset datasets + +typeset newv +for newv in "" "current" $ZFS_VERSION; do + setup_datasets + if [[ -n $newv ]]; then + opt="-V $newv" + if [[ $newv == current ]]; then + newv=$ZFS_VERSION + fi + else + newv=$ZFS_VERSION + fi + + log_must eval '$ZFS upgrade $opt -a > /dev/null 2>&1' + + for fs in $($ZFS list -rH -t filesystem -o name $rootfs) ; do + log_must check_fs_version $fs $newv + done + cleanup +done + +log_pass "Executing 'zfs upgrade [-V version] -a' command succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_006_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_006_neg.ksh new file mode 100644 index 00000000000..6d6af1ec7a6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_006_neg.ksh @@ -0,0 +1,72 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade_006_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_upgrade_006_neg +# +# DESCRIPTION: +# Verify that invalid upgrade parameters and options are caught. +# +# STRATEGY: +# 1. Create a ZFS file system. +# 2. For each option in the list, try 'zfs upgrade'. +# 3. Verify that the operation fails as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A args "" "-?" "-A" "-R" "-b" "-c" "-d" "--invalid" \ + "-V" "-V $TESTPOOL/$TESTFS" "-V $TESTPOOL $TESTPOOL/$TESTFS" + +log_assert "Badly-formed 'zfs upgrade' should return an error." + +typeset -i i=1 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS upgrade ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly-formed 'zfs upgrade' fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_007_neg.ksh new file mode 100644 index 00000000000..665138a21b7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_007_neg.ksh @@ -0,0 +1,73 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade_007_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_upgrade_007_neg +# +# DESCRIPTION: +# Verify that version should only by '1' '2' or current version, +# non-digit input are invalid. +# +# STRATEGY: +# 1. For each invalid value of version in the list, try 'zfs upgrade -V version'. +# 2. Verify that the operation fails as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A args \ + "0" "0.000" "0.5" "-1.234" "-1" "1234b" "5678x" + +log_assert "Set invalid value or non-digit version should fail as expected." + +typeset -i i=0 +while (( i < ${#args[*]} )) +do + log_mustnot $ZFS upgrade -V ${args[i]} $TESTPOOL/$TESTFS + ((i = i + 1)) +done + +log_pass "Set invalid value or non-digit version fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_test.sh new file mode 100755 index 00000000000..e6c2f0c048f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zfs_upgrade/zfs_upgrade_test.sh @@ -0,0 +1,225 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_upgrade_001_pos cleanup +zfs_upgrade_001_pos_head() +{ + atf_set "descr" "Executing 'zfs upgrade' command succeeds." + atf_set "require.progs" zfs nawk +} +zfs_upgrade_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_upgrade_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_upgrade_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_upgrade_002_pos cleanup +zfs_upgrade_002_pos_head() +{ + atf_set "descr" "Executing 'zfs upgrade -v' command succeeds." + atf_set "require.progs" zfs nawk +} +zfs_upgrade_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_upgrade_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_upgrade_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_upgrade_003_pos cleanup +zfs_upgrade_003_pos_head() +{ + atf_set "descr" "Executing 'zfs upgrade [-V version] filesystem' command succeeds." + atf_set "require.progs" zfs +} +zfs_upgrade_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_upgrade_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_upgrade_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_upgrade_004_pos cleanup +zfs_upgrade_004_pos_head() +{ + atf_set "descr" "Executing 'zfs upgrade -r [-V version] filesystem' command succeeds." + atf_set "require.progs" zfs +} +zfs_upgrade_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_upgrade_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_upgrade_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_upgrade_005_pos cleanup +zfs_upgrade_005_pos_head() +{ + atf_set "descr" "Executing 'zfs upgrade [-V version] -a' command succeeds." + atf_set "require.progs" zfs +} +zfs_upgrade_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_upgrade_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_upgrade_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_upgrade_006_neg cleanup +zfs_upgrade_006_neg_head() +{ + atf_set "descr" "Badly-formed 'zfs upgrade' should return an error." + atf_set "require.progs" zfs +} +zfs_upgrade_006_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_upgrade_006_neg.ksh || atf_fail "Testcase failed" +} +zfs_upgrade_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_upgrade_007_neg cleanup +zfs_upgrade_007_neg_head() +{ + atf_set "descr" "Set invalid value or non-digit version should fail as expected." + atf_set "require.progs" zfs +} +zfs_upgrade_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_upgrade_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_upgrade_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_upgrade.cfg + . $(atf_get_srcdir)/zfs_upgrade.kshlib + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_upgrade_001_pos + atf_add_test_case zfs_upgrade_002_pos + atf_add_test_case zfs_upgrade_003_pos + atf_add_test_case zfs_upgrade_004_pos + atf_add_test_case zfs_upgrade_005_pos + atf_add_test_case zfs_upgrade_006_neg + atf_add_test_case zfs_upgrade_007_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool/Makefile new file mode 100644 index 00000000000..1f7165d564f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_001_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool.cfg +${PACKAGE}FILES+= zpool_003_pos.ksh +${PACKAGE}FILES+= zpool_002_pos.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool.cfg new file mode 100644 index 00000000000..92c1a14a889 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_001_neg.ksh new file mode 100644 index 00000000000..ea9f52cfa4e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_001_neg.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_001_neg.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_001_neg +# +# DESCRIPTION: +# A badly formed sub-command passed to zpool(1) should +# return an error. +# +# STRATEGY: +# 1. Create an array containg each zpool sub-command name. +# 2. For each element, execute the sub-command. +# 3. Verify it returns an error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A args "" "create" "add" "destroy" "import fakepool" \ + "export fakepool" "create fakepool" "add fakepool" \ + "create mirror" "create raidz" "create raidz1" \ + "create mirror fakepool" "create raidz fakepool" \ + "create raidz1 fakepool" "create raidz2 fakepool" \ + "create fakepool mirror" "create fakepool raidz" \ + "create fakepool raidz1" "create fakepool raidz2" \ + "add fakepool mirror" "add fakepool raidz" \ + "add fakepool raidz1" "add fakepool raidz2" \ + "add mirror fakepool" "add raidz fakepool" \ + "add raidz1 fakepool" "add raidz2 fakepool" \ + "setvprop" "blah blah" "-%" "--" "--?" "-*" "-=" + +log_assert "Execute zpool sub-command without proper parameters." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL ${args[i]} + + ((i = i + 1)) +done + +log_pass "Badly formed zpool sub-commands fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_002_pos.ksh new file mode 100644 index 00000000000..944eb8ffb17 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_002_pos.ksh @@ -0,0 +1,110 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_002_pos.ksh 1.2 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_002_pos +# +# DESCRIPTION: +# With ZFS_ABORT set, all zpool commands should be able to abort and generate a core file. +# +# STRATEGY: +# 1. Create an array of zpool command +# 2. Execute each command in the array +# 3. Verify the command aborts and generate a core file +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + unset ZFS_ABORT + + if [[ -d $corepath ]]; then + $RM -rf $corepath + fi + if poolexists $pool; then + log_must $ZPOOL destroy -f $pool + fi +} + +log_assert "With ZFS_ABORT set, all zpool commands can abort and generate a core file." +log_onexit cleanup + +#preparation work for testing +corepath=$TESTDIR/core +if [[ -d $corepath ]]; then + $RM -rf $corepath +fi +$MKDIR $corepath + +pool=pool.${TESTCASE_ID} +vdev1=$TESTDIR/file1 +vdev2=$TESTDIR/file2 +vdev3=$TESTDIR/file3 +log_must create_vdevs $vdev1 $vdev2 $vdev3 + +set -A cmds "create $pool mirror $vdev1 $vdev2" "list $pool" "iostat $pool" \ + "status $pool" "upgrade $pool" "get delegation $pool" "set delegation=off $pool" \ + "export $pool" "import -d $TESTDIR $pool" "offline $pool $vdev1" \ + "online $pool $vdev1" "clear $pool" "detach $pool $vdev2" \ + "attach $pool $vdev1 $vdev2" "replace $pool $vdev2 $vdev3" \ + "scrub $pool" "destroy -f $pool" + +set -A badparams "" "create" "destroy" "add" "remove" "list *" "iostat" "status" \ + "online" "offline" "clear" "attach" "detach" "replace" "scrub" \ + "import" "export" "upgrade" "history -?" "get" "set" + +$COREADM -p ${corepath}/core.%f +export ZFS_ABORT=yes + +for subcmd in "${cmds[@]}" "${badparams[@]}"; do + $ZPOOL $subcmd >/dev/null 2>&1 + corefile=${corepath}/core.zpool + if [[ ! -e $corefile ]]; then + log_fail "$ZPOOL $subcmd cannot generate core file with ZFS_ABORT set." + fi + $RM -f $corefile +done + +log_pass "With ZFS_ABORT set, zpool command can abort and generate core file as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_003_pos.ksh new file mode 100644 index 00000000000..479b9c1d465 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_003_pos.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_003_pos.ksh 1.1 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_003_pos +# +# DESCRIPTION: +# Verify debugging features of zpool such as ABORT and freeze/unfreeze +# should run successfully. +# +# STRATEGY: +# 1. Create an array containg each zpool options. +# 2. For each element, execute the zpool command. +# 3. Verify it run successfully. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Debugging features of zpool should succeed." + +log_must $ZPOOL -? > /dev/null 2>&1 + +if is_global_zone ; then + log_must $ZPOOL freeze $TESTPOOL +else + log_mustnot $ZPOOL freeze $TESTPOOL + log_mustnot $ZPOOL freeze ${TESTPOOL%%/*} +fi + +log_mustnot $ZPOOL freeze fakepool + +ZFS_ABORT=1; export ZFS_ABORT +$ZPOOL > /dev/null 2>&1 +typeset ret=$? +unset ZFS_ABORT +# Note: "/bin/kill -l $ret" will not recognize the signal number. We must use +# ksh93's builtin kill command +if [ `kill -l $ret` != "ABRT" ]; then + log_fail "$ZPOOL not dump core by request." +fi + +log_pass "Debugging features of zpool succeed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_test.sh new file mode 100755 index 00000000000..b41c748cba5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool/zpool_test.sh @@ -0,0 +1,107 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_001_neg cleanup +zpool_001_neg_head() +{ + atf_set "descr" "Execute zpool sub-command without proper parameters." + atf_set "require.progs" zpool +} +zpool_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_002_pos cleanup +zpool_002_pos_head() +{ + atf_set "descr" "With ZFS_ABORT set, all zpool commands can abort and generate a core file." + atf_set "require.progs" zpool coreadm +} +zpool_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_003_pos cleanup +zpool_003_pos_head() +{ + atf_set "descr" "Debugging features of zpool should succeed." + atf_set "require.progs" zpool +} +zpool_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_001_neg + atf_add_test_case zpool_002_pos + atf_add_test_case zpool_003_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/Makefile new file mode 100644 index 00000000000..5825e0e593f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/Makefile @@ -0,0 +1,28 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_add +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_add_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_add.cfg +${PACKAGE}FILES+= zpool_add.kshlib +${PACKAGE}FILES+= zpool_add_001_pos.ksh +${PACKAGE}FILES+= zpool_add_002_pos.ksh +${PACKAGE}FILES+= zpool_add_003_pos.ksh +${PACKAGE}FILES+= zpool_add_004_pos.ksh +${PACKAGE}FILES+= zpool_add_005_pos.ksh +${PACKAGE}FILES+= zpool_add_006_pos.ksh +${PACKAGE}FILES+= zpool_add_007_neg.ksh +${PACKAGE}FILES+= zpool_add_008_neg.ksh +${PACKAGE}FILES+= zpool_add_009_neg.ksh +${PACKAGE}FILES+= zpool_add_010_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/cleanup.ksh new file mode 100644 index 00000000000..083ab9e34bd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +cleanup_devices $DISKS + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/setup.ksh new file mode 100644 index 00000000000..9b6adb17007 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/setup.ksh @@ -0,0 +1,52 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +verify_runnable "global" + +if [[ -n $DISK ]]; then + # + # Use 'zpool create' to clean up the infomation in + # in the given disk to avoid slice overlapping. + # + cleanup_devices $DISK + + partition_disk $SIZE $DISK 7 +else + for disk in `$ECHO $DISKSARRAY`; do + cleanup_devices $disk + partition_disk $SIZE $disk 7 + done +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.cfg new file mode 100644 index 00000000000..40e04d0a05e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.cfg @@ -0,0 +1,69 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add.cfg 1.3 08/08/15 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg +. $STF_SUITE/include/libtest.kshlib + +export DISK_ARRAY_NUM=0 +export DISK_ARRAY_LIMIT=4 +export DISKSARRAY="" + +# +# Variables for zpool_add_006 +# +export STF_TIMEOUT=2400 +export VDEVS_NUM=300 +export FILE_SIZE=100 #100mb + +set_disks + +export FILESIZE="100m" +export FILESIZE1="150m" +export SIZE="150m" +export SIZE1="250m" + +export FILEDISK=filedisk${TESTCASE_ID} +export FILEDISK0=filedisk0${TESTCASE_ID} +export FILEDISK1=filedisk1${TESTCASE_ID} +export FILEDISK2=filedisk2${TESTCASE_ID} +export FILEDISK3=filedisk3${TESTCASE_ID} + +export VOLSIZE=64mb + +export BYND_MAX_NAME="byondmaxnamelength\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.kshlib new file mode 100644 index 00000000000..c3b657d2ddf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add.kshlib @@ -0,0 +1,154 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add.kshlib 1.3 07/03/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# check if the contains ... +# +# $1 pool +# $2..n ... +# +# Return 0 if are contained in the ; 1 if not used; 2 if pool +# name is missing +# +function iscontained +{ + typeset pool=$1 + typeset vdev + + if [[ -z $pool ]]; then + log_note "Missing pool name." + return 2 + fi + + shift + + for vdev in $@; do + +# remove /dev/dsk in vdev if there is + $ECHO $vdev | $GREP "^/dev/" >/dev/null 2>&1 + (( $? == 0 )) && \ + vdev=${vdev##*/} + + $ZPOOL status "$pool" | $AWK '$1 == vdevname {exit 1}' \ + vdevname=$vdev >/dev/null 2>&1 + (( $? != 1 )) && \ + return 1 + done + + return 0; + +} + +# +# Find the storage device in /etc/fstab +# +function find_vfstab_dev +{ + typeset vfstab="/etc/fstab" + typeset tmpfile="$TMPDIR/fstab.tmp" + typeset vfstabdev + typeset vfstabdevs="" + typeset line + + $CAT $vfstab | $GREP "^/dev/" >$tmpfile + while read -r line + do + vfstabdev=`$ECHO "$line" | $AWK '{print $1}'` + vfstabdev=${vfstabdev%%:} + vfstabdevs="$vfstabdev $vfstabdevs" + done <$tmpfile + + $RM -f $tmpfile + $ECHO $vfstabdevs +} + +# +# Find the storage device in /etc/mnttab +# +function find_mnttab_dev +{ + typeset mnttab="/etc/mnttab" + typeset tmpfile="$TMPDIR/mnttab.tmp" + typeset mnttabdev + typeset mnttabdevs="" + typeset line + + $MOUNT | $GREP "^/dev/" >$tmpfile + while read -r line + do + mnttabdev=`$ECHO "$line" | $AWK '{print $1}'` + mnttabdev=${mnttabdev%%:} + mnttabdevs="$mnttabdev $mnttabdevs" + done <$tmpfile + + $RM -f $tmpfile + $ECHO $mnttabdevs +} + +# +# Save the systme current dump device configuration +# +function save_dump_dev +{ + + typeset dumpdev + typeset swapdev + typeset swapdevs="" + typeset tmpfile="$TMPDIR/swapinfo.tmp" + + dumpdev=`readlink /dev/dumpdev` + swapinfo | $GREP "^/dev/" >$tmpfile + while read -r line + do + swapdev=`$ECHO "$line" | $AWK '{print $1}'` + swapdev=${swapdev%%:} + swapdevs="$swapdev $swapdevs" + done <$tmpfile + $ECHO "$dumpdev $swapdevs" +} + +# +# Common cleanup routine for partitions used in testing +# +function partition_cleanup +{ + log_note "Cleaning up partitions..." + if [[ -n $DISK ]]; then + partition_disk $SIZE $DISK 7 + else + typeset disk="" + for disk in $DISK0 $DISK1; do + partition_disk $SIZE $disk 7 + done + fi +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_001_pos.ksh new file mode 100644 index 00000000000..c27329d8156 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_001_pos.ksh @@ -0,0 +1,148 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_001_pos.ksh 1.4 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_001_pos +# +# DESCRIPTION: +# 'zpool add ...' can successfully add the specified +# devices to the given pool +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add spare devices to the pool +# 3. Verify the devices are added to the pool successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2005-09-27) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +log_assert "'zpool add ...' can add devices to the pool." + +log_onexit cleanup + +set -A keywords "" "mirror" "raidz" "raidz1" "spare" + +typeset diskname=${disk#/dev/} +typeset diskname0=${DISK0#/dev/} +typeset diskname1=${DISK1#/dev/} + +case $DISK_ARRAY_NUM in +0|1) + pooldevs="${diskname}p1 \ + /dev/${diskname}p1 \ + \"${diskname}p1 ${diskname}p2\"" + mirrordevs="\"/dev/${diskname}p1 ${diskname}p2\"" + raidzdevs="\"/dev/${diskname}p1 ${diskname}p2\"" + + ;; +2|*) + pooldevs="${diskname0}p1\ + \"/dev/${diskname0}p1 ${diskname1}p1\" \ + \"${diskname0}p1 ${diskname0}p2 ${diskname1}p2\"\ + \"${diskname0}p1 ${diskname1}p1 ${diskname0}p2\ + ${diskname1}p2\"" + mirrordevs="\"/dev/${diskname0}p1 ${diskname1}p1\"" + raidzdevs="\"/dev/${diskname0}p1 ${diskname1}p1\"" + + ;; +esac + +typeset -i i=0 +typeset vdev +eval set -A poolarray $pooldevs +eval set -A mirrorarray $mirrordevs +eval set -A raidzarray $raidzdevs + +while (( $i < ${#keywords[*]} )); do + case ${keywords[i]} in + ""|spare) + for vdev in "${poolarray[@]}"; do + create_pool "$TESTPOOL" "${diskname}p6" + log_must poolexists "$TESTPOOL" + log_must $ZPOOL add -f "$TESTPOOL" ${keywords[i]} \ + $vdev + log_must iscontained "$TESTPOOL" "$vdev" + destroy_pool "$TESTPOOL" + done + + ;; + mirror) + for vdev in "${mirrorarray[@]}"; do + create_pool "$TESTPOOL" "${keywords[i]}" \ + "${diskname}p4" "${diskname}p5" + log_must poolexists "$TESTPOOL" + log_must $ZPOOL add "$TESTPOOL" ${keywords[i]} \ + $vdev + log_must iscontained "$TESTPOOL" "$vdev" + destroy_pool "$TESTPOOL" + done + + ;; + raidz|raidz1) + for vdev in "${raidzarray[@]}"; do + create_pool "$TESTPOOL" "${keywords[i]}" \ + "${diskname}p4" "${diskname}p5" + log_must poolexists "$TESTPOOL" + log_must $ZPOOL add "$TESTPOOL" ${keywords[i]} \ + $vdev + log_must iscontained "$TESTPOOL" "$vdev" + destroy_pool "$TESTPOOL" + done + + ;; + esac + + (( i = i+1 )) +done + +log_pass "'zpool add ...' executes successfully" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_002_pos.ksh new file mode 100644 index 00000000000..0a1b2ae8a1c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_002_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_002_pos.ksh 1.5 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_002_pos +# +# DESCRIPTION: +# 'zpool add -f ...' can successfully add the specified +# devices to given pool in some cases. +# +# STRATEGY: +# 1. Create a mirrored pool +# 2. Without -f option to add 1-way device the mirrored pool will fail +# 3. Use -f to override the errors to add 1-way device to the mirrored +# pool +# 4. Verify the device is added successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +log_assert "'zpool add -f ...' can successfully add" \ + "devices to the pool in some cases." + +log_onexit cleanup + +create_pool "$TESTPOOL" mirror "${disk}p1" "${disk}p2" +log_must poolexists "$TESTPOOL" + +log_mustnot $ZPOOL add "$TESTPOOL" ${disk}p3 +log_mustnot iscontained "$TESTPOOL" "${disk}p3" + +log_must $ZPOOL add -f "$TESTPOOL" ${disk}p3 +log_must iscontained "$TESTPOOL" "${disk}p3" + +log_pass "'zpool add -f ...' executes successfully." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_003_pos.ksh new file mode 100644 index 00000000000..df2bd34da9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_003_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_003_pos.ksh 1.4 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_003_pos +# +# DESCRIPTION: +# 'zpool add -n ...' can display the configuration without +# adding the specified devices to given pool +# +# STRATEGY: +# 1. Create a storage pool +# 2. Use -n to add a device to the pool +# 3. Verify the device is not added actually +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup + + [[ -e $tmpfile ]] && \ + log_must $RM -f $tmpfile +} + +log_assert "'zpool add -n ...' can display the configuration" \ + "without actually adding devices to the pool." + +log_onexit cleanup + +tmpfile="$TMPDIR/zpool_add_003.tmp${TESTCASE_ID}" + +create_pool "$TESTPOOL" "${disk}p1" +log_must poolexists "$TESTPOOL" + +$ZPOOL add -n "$TESTPOOL" ${disk}p2 > $tmpfile + +log_mustnot iscontained "$TESTPOOL" "${disk}p2" + +str="would update '$TESTPOOL' to the following configuration:" +$CAT $tmpfile | $GREP "$str" >/dev/null 2>&1 +(( $? != 0 )) && \ + log_fail "'zpool add -n ...' is executed as unexpected" + +log_pass "'zpool add -n ...'executes successfully." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_004_pos.ksh new file mode 100644 index 00000000000..f3764575c62 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_004_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_004_pos.ksh 1.6 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_004_pos +# +# DESCRIPTION: +# 'zpool add ...' can successfully add a zfs volume +# to the given pool +# +# STRATEGY: +# 1. Create a storage pool and a zfs volume +# 2. Add the volume to the pool +# 3. Verify the devices are added to the pool successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2005-09-29) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool "$TESTPOOL" + + datasetexists $TESTPOOL1/$TESTVOL && \ + log_must $ZFS destroy -f $TESTPOOL1/$TESTVOL + poolexists $TESTPOOL1 && \ + destroy_pool "$TESTPOOL1" + + partition_cleanup + +} + +log_assert "'zpool add ...' can add zfs volume to the pool." + +log_onexit cleanup + +create_pool "$TESTPOOL" "${disk}p1" +log_must poolexists "$TESTPOOL" + +create_pool "$TESTPOOL1" "${disk}p2" +log_must poolexists "$TESTPOOL1" +log_must $ZFS create -V $VOLSIZE $TESTPOOL1/$TESTVOL + +log_must $ZPOOL add "$TESTPOOL" /dev/zvol/$TESTPOOL1/$TESTVOL + +log_must iscontained "$TESTPOOL" "/dev/zvol/$TESTPOOL1/$TESTVOL" + +log_pass "'zpool add ...' adds zfs volume to the pool successfully" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_005_pos.ksh new file mode 100644 index 00000000000..4f02d884ac3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_005_pos.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_005_pos.ksh 1.4 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_005_pos +# +# DESCRIPTION: +# 'zpool add' should return fail if +# 1. vdev is part of an active pool +# 2. vdev is currently mounted +# 3. vdev is in /etc/vfstab +# 3. vdev is specified as the dedicated dump device +# +# STRATEGY: +# 1. Create case scenarios +# 2. For each scenario, try to add the device to the pool +# 3. Verify the add operation get failed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-29) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + poolexists "$TESTPOOL1" && \ + destroy_pool "$TESTPOOL1" + + if [[ -n $saved_dump_dev ]]; then + log_must eval "$DUMPADM -u -d $saved_dump_dev > /dev/null" + fi + + partition_cleanup +} + +log_assert "'zpool add' should fail with inapplicable scenarios." + +log_onexit cleanup + +mnttab_dev=$(find_mnttab_dev) +vfstab_dev=$(find_vfstab_dev) +saved_dump_dev=$(save_dump_dev) +dump_dev=${disk}p3 + +create_pool "$TESTPOOL" "${disk}p1" +log_must poolexists "$TESTPOOL" + +create_pool "$TESTPOOL1" "${disk}p2" +log_must poolexists "$TESTPOOL1" +log_mustnot $ZPOOL add -f "$TESTPOOL" ${disk}p2 + +log_mustnot $ZPOOL add -f "$TESTPOOL" $mnttab_dev + +log_mustnot $ZPOOL add -f "$TESTPOOL" $vfstab_dev + +log_must $ECHO "y" | $NEWFS /dev/$dump_dev > /dev/null 2>&1 +log_must $DUMPADM -u -d /dev/$dump_dev > /dev/null +log_mustnot $ZPOOL add -f "$TESTPOOL" $dump_dev + +log_pass "'zpool add' should fail with inapplicable scenarios." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_006_pos.ksh new file mode 100644 index 00000000000..decdc01af2c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_006_pos.ksh @@ -0,0 +1,161 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_006_pos.ksh 1.5 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_006_pos +# +# DESCRIPTION: +# 'zpool add [-f]' can add large numbers of file-in-zfs-filesystem-based vdevs +# to the specified pool without any errors. +# +# STRATEGY: +# 1. Create assigned number of files in ZFS filesystem as vdevs and use the first +# file to create a pool +# 2. Add other vdevs to the pool should get success +# 3 Fill in the filesystem and create a partially written file +# as vdev +# 4. Add the new file into the pool should be failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-09) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + + datasetexists $TESTPOOL/$TESTFS && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + if [[ -d $TESTDIR ]]; then + log_must $RM -rf $TESTDIR + fi + + partition_cleanup +} + + +# +# Create a pool and fs on the assigned disk, and dynamically create large +# numbers of files as vdevs.(the default value is ) +# the first file will be used to create a pool for other vdevs to be added into +# + +function setup_vdevs # +{ + typeset disk=$1 + typeset -i count=0 + typeset -i largest_num=0 + typeset -i slicesize=0 + typeset vdev="" + + fs_size=$(get_available_disk_size $disk) + + # 64M is the minimum size for the pool + (( largest_num = fs_size / (1024 * 1024 * 64) )) + if (( largest_num < $VDEVS_NUM )); then + # Minus $largest_num/20 to leave 5% space for metadata. + (( vdevs_num=largest_num - largest_num/20 )) + file_size=64 + vdev=$disk + else + vdevs_num=$VDEVS_NUM + (( file_size = fs_size / (1024 * 1024 * (vdevs_num + vdevs_num/20)) )) + if (( file_size > FILE_SIZE )); then + file_size=$FILE_SIZE + fi + # Plus $vdevs_num/20 to provide enough space for metadata. + (( slice_size = file_size * (vdevs_num + vdevs_num/20) )) + wipe_partition_table $disk + set_partition 0 "" ${slice_size}m $disk + vdev=${disk}p1 + fi + + create_pool $TESTPOOL $vdev + [[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR + log_must $MKDIR -p $TESTDIR + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +# Create a pool first using the first file, and make subsequent files ready +# as vdevs to add to the pool + + vdev=${TESTDIR}/file.$count + VDEV_SIZE=${file_size}m + log_must create_vdevs ${TESTDIR}/file.$count + create_pool "$TESTPOOL1" "${TESTDIR}/file.$count" + log_must poolexists "$TESTPOOL1" + + while (( count < vdevs_num )); do # minus 1 to avoid space non-enough + (( count = count + 1 )) + log_must create_vdevs ${TESTDIR}/file.$count + vdevs_list="$vdevs_list ${TESTDIR}/file.$count" + done + unset VDEV_SIZE +} + +log_assert " 'zpool add [-f]' can add large numbers of vdevs to the specified" \ + " pool without any errors." +log_onexit cleanup + +if [[ $DISK_ARRAY_NUM == 0 ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +vdevs_list="" +vdevs_num=$VDEVS_NUM +file_size=$FILE_SIZE + +setup_vdevs $disk +log_must $ZPOOL add -f "$TESTPOOL1" $vdevs_list +log_must iscontained "$TESTPOOL1" "$vdevs_list" + +log_pass "'zpool successfully add [-f]' can add large numbers of vdevs to the" \ + "specified pool without any errors." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_007_neg.ksh new file mode 100644 index 00000000000..ba2baddd7d9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_007_neg.ksh @@ -0,0 +1,84 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_007_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_007_neg +# +# DESCRIPTION: +# 'zpool add' should return an error with badly-formed parameters, +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool add' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-29) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + + partition_cleanup +} + +log_assert "'zpool add' should return an error with badly-formed parameters." + +log_onexit cleanup + +set -A args "" "-f" "-n" "-?" "-nf" "-fn" "-f -n" "--f" "-blah" \ + "-? $TESTPOOL ${disk}p2" + +create_pool "$TESTPOOL" "${disk}p1" +log_must poolexists "$TESTPOOL" + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL add ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool add' badly formed parameters fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_008_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_008_neg.ksh new file mode 100644 index 00000000000..39ebeeb665b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_008_neg.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_008_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_008_neg +# +# DESCRIPTION: +# 'zpool add' should return an error with nonexistent pools or vdevs +# +# STRATEGY: +# 1. Create an array of parameters which contains nonexistent pools/vdevs +# 2. For each parameter in the array, execute 'zpool add' +# 3. Verify an error is returned +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-29) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + + partition_cleanup +} + +log_assert "'zpool add' should return an error with nonexistent pools and vdevs" + +log_onexit cleanup + +set -A args "" "-f nonexistent_pool ${disk}p2" \ + "-f $TESTPOOL nonexistent_vdev" + +create_pool "$TESTPOOL" "${disk}p1" +log_must poolexists "$TESTPOOL" + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL add ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool add' with nonexistent pools and vdevs fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_009_neg.ksh new file mode 100644 index 00000000000..f0854ed7a41 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_009_neg.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_009_neg.ksh 1.4 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_009_neg +# +# DESCRIPTION: +# 'zpool add' should return fail if vdevs are the same or vdev is +# contained in the given pool +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add the two same devices to pool A +# 3. Add the device in pool A to pool A again +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-29) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + + partition_cleanup + +} + +log_assert "'zpool add' should fail if vdevs are the same or vdev is " \ + "contained in the given pool." + +log_onexit cleanup + +create_pool "$TESTPOOL" "${disk}p1" +log_must poolexists "$TESTPOOL" + +log_mustnot $ZPOOL add -f "$TESTPOOL" ${disk}p2 ${disk}p2 +log_mustnot $ZPOOL add -f "$TESTPOOL" ${disk}p1 + +log_pass "'zpool add' get fail as expected if vdevs are the same or vdev is " \ + "contained in the given pool." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_010_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_010_pos.ksh new file mode 100644 index 00000000000..3578340bfca --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_010_pos.ksh @@ -0,0 +1,56 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +log_assert "'zpool add' can add devices, even if a replacing vdev with a spare child is present" + +log_onexit cleanup + +create_pool $TESTPOOL mirror ${DISK0} ${DISK1} +# A replacing vdev will automatically detach the older member when resilvering +# is complete. We don't want that to happen during this test, so write some +# data just to slow down resilvering. +$TIMEOUT 60s $DD if=/dev/zero of=/$TESTPOOL/zerofile bs=128k +log_must $ZPOOL replace $TESTPOOL ${DISK0} ${DISK2} +log_must $ZPOOL add $TESTPOOL spare ${DISK3} +log_must $ZPOOL replace $TESTPOOL ${DISK0} ${DISK3} +log_must $ZPOOL add $TESTPOOL spare ${DISK4} + +log_pass "'zpool add ...' executes successfully, even when a replacing vdev with a spare child is present" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_test.sh new file mode 100755 index 00000000000..83c422047f4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_test.sh @@ -0,0 +1,313 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_add_001_pos cleanup +zpool_add_001_pos_head() +{ + atf_set "descr" "'zpool add ...' can add devices to the pool." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_add_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_add_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_002_pos cleanup +zpool_add_002_pos_head() +{ + atf_set "descr" "'zpool add -f ...' can successfully add devices to the pool in some cases." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_add_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_add_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_003_pos cleanup +zpool_add_003_pos_head() +{ + atf_set "descr" "'zpool add -n ...' can display the configuration without actually adding devices to the pool." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_add_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_add_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_004_pos cleanup +zpool_add_004_pos_head() +{ + atf_set "descr" "'zpool add ...' can add zfs volume to the pool." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2400 +} +zpool_add_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_zvol_recursive + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_004_pos.ksh || atf_fail "Testcase failed" +} +zpool_add_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_005_pos cleanup +zpool_add_005_pos_head() +{ + atf_set "descr" "'zpool add' should fail with inapplicable scenarios." + atf_set "require.progs" dumpadm zpool + atf_set "timeout" 2400 +} +zpool_add_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 1 + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_005_pos.ksh || atf_fail "Testcase failed" +} +zpool_add_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_006_pos cleanup +zpool_add_006_pos_head() +{ + atf_set "descr" "'zpool add [-f]' can add large numbers of vdevs to the specified pool without any errors." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2400 +} +zpool_add_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_006_pos.ksh || atf_fail "Testcase failed" +} +zpool_add_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_007_neg cleanup +zpool_add_007_neg_head() +{ + atf_set "descr" "'zpool add' should return an error with badly-formed parameters." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_add_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_007_neg.ksh || atf_fail "Testcase failed" +} +zpool_add_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_008_neg cleanup +zpool_add_008_neg_head() +{ + atf_set "descr" "'zpool add' should return an error with nonexistent pools and vdevs" + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_add_008_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_008_neg.ksh || atf_fail "Testcase failed" +} +zpool_add_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_009_neg cleanup +zpool_add_009_neg_head() +{ + atf_set "descr" "'zpool add' should fail if vdevs are the same or vdev iscontained in the given pool." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_add_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_009_neg.ksh || atf_fail "Testcase failed" +} +zpool_add_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +# Regression test for PR 225546. "zpool add" asserts if the pool contains a +# replacing vdev with a spare child. +# Assertion failed: (nvlist_lookup_string(cnv, "path", &path) == 0), file /usr/home/alans/freebsd/head/cddl/contrib/opensolaris/cmd/zpool/zpool_vdev.c, line 694. /usr/tests/sys/cddl/zfs/tests/cli_root/zpool_add/zpool_add_010_pos.ksh[54]: log_must[69]: log_pos: line 206: 27710: Abort(coredump) +atf_test_case zpool_add_010_pos cleanup +zpool_add_010_pos_head() +{ + atf_set "descr" "'zpool add' can add devices, even if a replacing vdev with a spare child is present" + atf_set "require.progs" zpool +} +zpool_add_010_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/zpool_add_010_pos.ksh || atf_fail "Testcase failed" +} +zpool_add_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_add.kshlib + . $(atf_get_srcdir)/zpool_add.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_add_001_pos + atf_add_test_case zpool_add_002_pos + atf_add_test_case zpool_add_003_pos + atf_add_test_case zpool_add_004_pos + atf_add_test_case zpool_add_005_pos + atf_add_test_case zpool_add_006_pos + atf_add_test_case zpool_add_007_neg + atf_add_test_case zpool_add_008_neg + atf_add_test_case zpool_add_009_neg + atf_add_test_case zpool_add_010_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/Makefile new file mode 100644 index 00000000000..1e705543779 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_attach +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_attach_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_attach_001_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_attach.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/cleanup.ksh new file mode 100644 index 00000000000..b5a6a6c0f9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/setup.ksh new file mode 100644 index 00000000000..e4db7febd63 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach.cfg new file mode 100644 index 00000000000..e645431c4ab --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_attach.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach_001_neg.ksh new file mode 100644 index 00000000000..98cf10c7ea2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach_001_neg.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_attach_001_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_attach_001_neg +# +# DESCRIPTION: +# Executing 'zpool attach' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool attach' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-f" "-?" "-z fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "$TESTPOOL" "-t $TESTPOOL/$TESTFS" "-t $TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "-t $TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "-t $TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" \ + "fakepool fakedevice" "fakepool fakedevice fakenewdevice" \ + "$TESTPOOL fakedevice" "$TESTPOOL $DISKLIST" \ + "$TESTPOOL fakedevice fakenewdevice fakenewdevice" \ + "-f $TESTPOOL" "-f $TESTPOOL/$TESTFS" "-f $TESTPOOL/$TESTFS $DISKLIST" \ + "-f $TESTPOOL/$TESTCTR" "-f $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-f $TESTPOOL/$TESTCTR $DISKLIST" "-f $TESTPOOL/$TESTVOL" \ + "-f $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-f $TESTPOOL/$TESTVOL $DISKLIST" \ + "-f $DISKLIST" \ + "-f fakepool fakedevice" "-f fakepool fakedevice fakenewdevice" \ + "-f $TESTPOOL fakedevice fakenewdevice fakenewdevice" \ + "-f $TESTPOOL fakedevice" "-f $TESTPOOL $DISKLIST" + +log_assert "Executing 'zpool attach' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL attach ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool attach' command with bad options failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach_test.sh new file mode 100755 index 00000000000..07181d679ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_attach/zpool_attach_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_attach_001_neg cleanup +zpool_attach_001_neg_head() +{ + atf_set "descr" "Executing 'zpool attach' with bad options fails" + atf_set "require.progs" zpool +} +zpool_attach_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_attach.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_attach_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_attach_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_attach.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_attach_001_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/Makefile new file mode 100644 index 00000000000..f9b16c4a296 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/Makefile @@ -0,0 +1,21 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_clear +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_clear_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_clear_003_neg.ksh +${PACKAGE}FILES+= zpool_clear_002_neg.ksh +${PACKAGE}FILES+= zpool_clear.cfg +${PACKAGE}FILES+= zpool_clear_001_pos.ksh +${PACKAGE}FILES+= zpool_clear_004_pos.ksh +${PACKAGE}FILES+= zpool_clear_005_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear.cfg new file mode 100644 index 00000000000..e29c7282015 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear.cfg @@ -0,0 +1,37 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_clear.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export FILESIZE=100m +export STF_TIMEOUT=2100 +export BLOCKSZ=$(( 1024 * 1024 )) +export NUM_WRITES=40 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_001_pos.ksh new file mode 100644 index 00000000000..8c054215c85 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_001_pos.ksh @@ -0,0 +1,110 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_clear_001_pos.ksh 1.3 07/02/06 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_clear_001_pos +# +# DESCRIPTION: +# Verify 'zpool clear' can clear pool errors. +# +# STRATEGY: +# 1. Create various configuration pools +# 2. Make errors to pool +# 3. Use zpool clear to clear errors +# 4. Verify the errors has been cleared. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-10) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + for file in `$LS $TMPDIR/file.*`; do + log_must $RM -f $file + done +} + + +log_assert "Verify 'zpool clear' can clear errors of a storage pool." +log_onexit cleanup + +#make raw files to create various configuration pools +fbase=$TMPDIR/file +log_must create_vdevs $fbase.0 $fbase.1 $fbase.2 +set -A poolconf "mirror $fbase.0 $fbase.1 $fbase.2" \ + "raidz1 $fbase.0 $fbase.1 $fbase.2" \ + "raidz2 $fbase.0 $fbase.1 $fbase.2" + +function test_clear +{ + typeset type="$1" + typeset vdev_arg="" + + log_note "Testing ${type} clear type ..." + [ "$type" = "device" ] && vdev_arg="${fbase}.0" + + corrupt_file $TESTPOOL1 /$TESTPOOL1/f + log_must $ZPOOL scrub $TESTPOOL1 + wait_for 20 1 is_pool_scrubbed $TESTPOOL1 + log_must pool_has_errors $TESTPOOL1 + + # zpool clear races with things that set error counts; try several + # times in case that race is hit. + wait_for 10 1 pool_clear_succeeds $TESTPOOL1 $vdev_arg +} + +for devconf in "${poolconf[@]}"; do + # Create the pool and sync out a file to it. + log_must $ZPOOL create -f $TESTPOOL1 $devconf + log_must $FILE_WRITE -o create -f /$TESTPOOL1/f -b 131072 -c 32 + log_must $SYNC /$TESTPOOL1 + + test_clear "device" + test_clear "pool" + + log_must $ZPOOL destroy -f $TESTPOOL1 +done + +log_pass "'zpool clear' clears pool errors as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_002_neg.ksh new file mode 100644 index 00000000000..33919006bb6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_002_neg.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_clear_002_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_clear_002_neg +# +# DESCRIPTION: +# A badly formed parameter passed to 'zpool clear' should +# return an error. +# +# STRATEGY: +# 1. Create an array containing bad 'zpool clear' parameters. +# 2. For each element, execute the sub-command. +# 3. Verify it returns an error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL1 && \ + log_must $ZPOOL destroy -f $TESTPOOL1 + [[ -e $file ]] && \ + log_must $RM -f $file +} + +log_assert "Execute 'zpool clear' using invalid parameters." +log_onexit cleanup + +# Create another pool for negative testing, which clears pool error +# with vdev device not in the pool vdev devices. +file=$TMPDIR/file.${TESTCASE_ID} +log_must create_vdevs $file +log_must $ZPOOL create $TESTPOOL1 $file + +set -A args "" "-?" "--%" "-1234567" "0.0001" "0.7644" "-0.7644" \ + "blah" "blah $DISK" "$TESTPOOL c0txdx" "$TESTPOOL $file" \ + "$TESTPOOL c0txdx blah" "$TESTPOOL $file blah" + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZPOOL clear ${args[i]} + + ((i = i + 1)) +done + +log_pass "Invalid parameters to 'zpool clear' fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_003_neg.ksh new file mode 100644 index 00000000000..d22b659b9d1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_003_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_clear_003_neg.ksh 1.3 07/02/06 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_clear_003_neg +# +# DESCRIPTION: +# Verify 'zpool clear' cannot used on an available spare device. +# +# STRATEGY: +# 1. Create a spare pool. +# 2. Try to clear the spare device +# 3. Verify it returns an error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL1 && \ + log_must $ZPOOL destroy -f $TESTPOOL1 + + for file in `$LS $TMPDIR/file.*`; do + log_must $RM -f $file + done +} + + +log_assert "Verify 'zpool clear' cannot clear error for spare device." +log_onexit cleanup + +# make raw files to create a spare pool +fbase=$TMPDIR/file +log_must create_vdevs $fbase.1 $fbase.2 $fbase.3 $fbase.4 +log_must create_pool $TESTPOOL1 raidz $fbase.1 $fbase.2 $fbase.3 spare $fbase.4 +log_mustnot $ZPOOL clear $TESTPOOL1 $fbase.4 + +log_pass "'zpool clear' works on spare device failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_004_pos.ksh new file mode 100644 index 00000000000..7b7e4cb5561 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_004_pos.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_clear_004_pos +# +# DESCRIPTION: +# Verify 'zpool clear' can clear errors on spare devices. +# +# We don't need to check whether 'zpool clear' actually clears error counters. +# zpool_clear_001_pos will do that. We just need to check that it doesn't +# return an error when used on a spare vdev. This is really a test for whether +# zpool_find_vdev() from libzfs can work on a spare vdev. Note that we're +# talking about he mirror-like "spare-0" vdev, not the leaf hotspare vdev. +# +# STRATEGY: +# 1. Create a pool +# 2. Activate a spare +# 3. Verify that "zpool clear" on the spare returns no errors +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2013-06-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + for file in `$LS $TMPDIR/file.*`; do + log_must $RM -f $file + done + + restart_zfsd +} + + +log_assert "Verify 'zpool clear' works on spare vdevs" +log_onexit cleanup + +# Stop ZFSD so it won't interfere with our spare device. +stop_zfsd + +#make raw files to create various configuration pools +fbase=$TMPDIR/file +log_must create_vdevs $fbase.0 $fbase.1 $fbase.2 +VDEV1=$fbase.0 +VDEV2=$fbase.1 +SDEV=$fbase.2 +typeset devlist="$VDEV1 $VDEV2 spare $SDEV" + +log_note "'zpool clear' clears leaf-device error." + + +log_must $ZPOOL create -f $TESTPOOL1 $devlist +log_must $ZPOOL replace $TESTPOOL1 $VDEV1 $SDEV +log_must $ZPOOL clear $TESTPOOL1 "spare-0" + +log_pass "'zpool clear' works on spare vdevs" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_005_pos.ksh new file mode 100644 index 00000000000..059c1c56b5c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_005_pos.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright 2012-2018 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# Portions taken from: +# ident "@(#)replacement_001_pos.ksh 1.4 08/02/27 SMI" +# +# $Id$ +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/include/libgnop.kshlib + +function is_pool_unavail # pool +{ + is_pool_state "$1" "UNAVAIL" +} + +log_assert "A pool can come back online after all disks are failed and reactivated" + +set_disks +typeset ALLDISKS="${DISK0} ${DISK1} ${DISK2}" +typeset ALLNOPS=${ALLDISKS//~(E)([[:space:]]+|$)/.nop\1} + +log_must create_gnops $ALLDISKS +for type in "raidz" "mirror"; do + # Create a pool on the supplied disks + create_pool $TESTPOOL $type $ALLNOPS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + # Disable all vdevs. The pool should become UNAVAIL + log_must destroy_gnop $DISK0 + log_must destroy_gnop $DISK1 + log_must destroy_gnop $DISK2 + wait_for 5 1 is_pool_unavail $TESTPOOL + + # Renable all vdevs. The pool should become healthy again + log_must create_gnop $DISK0 + log_must create_gnop $DISK1 + log_must create_gnop $DISK2 + + # Manually online the pool + log_must $ZPOOL clear $TESTPOOL + + wait_for 5 1 is_pool_healthy $TESTPOOL + + destroy_pool $TESTPOOL + log_must $RM -rf /$TESTPOOL +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_test.sh new file mode 100755 index 00000000000..467d6000a91 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_clear/zpool_clear_test.sh @@ -0,0 +1,151 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_clear_001_pos cleanup +zpool_clear_001_pos_head() +{ + atf_set "descr" "Verify 'zpool clear' can clear errors of a storage pool." + atf_set "require.progs" zpool zfs + atf_set "timeout" 2100 +} +zpool_clear_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/zpool_clear_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_clear_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_clear_002_neg cleanup +zpool_clear_002_neg_head() +{ + atf_set "descr" "Execute 'zpool clear' using invalid parameters." + atf_set "require.progs" zpool + atf_set "timeout" 2100 +} +zpool_clear_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/zpool_clear_002_neg.ksh || atf_fail "Testcase failed" +} +zpool_clear_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_clear_003_neg cleanup +zpool_clear_003_neg_head() +{ + atf_set "descr" "Verify 'zpool clear' cannot clear error for available spare devices." + atf_set "require.progs" zpool + atf_set "timeout" 2100 +} +zpool_clear_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/zpool_clear_003_neg.ksh || atf_fail "Testcase failed" +} +zpool_clear_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zpool_clear_004_pos cleanup +zpool_clear_004_pos_head() +{ + atf_set "descr" "Verify 'zpool clear' can work on spare vdevs" + atf_set "require.progs" zpool + atf_set "timeout" 2100 +} +zpool_clear_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/zpool_clear_004_pos.ksh || atf_fail "Testcase failed" +} +zpool_clear_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zpool_clear_005_pos cleanup +zpool_clear_005_pos_head() +{ + atf_set "descr" "'zpool clear' can online an UNAVAIL pool after all vdevs have reappeared" + atf_set "require.progs" gnop zpool +} +zpool_clear_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + verify_disk_count "$DISKS" 3 + ksh93 $(atf_get_srcdir)/zpool_clear_005_pos.ksh || atf_fail "Testcase failed" +} +zpool_clear_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_clear.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_clear_001_pos + atf_add_test_case zpool_clear_002_neg + atf_add_test_case zpool_clear_003_neg + atf_add_test_case zpool_clear_004_pos + atf_add_test_case zpool_clear_005_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/Makefile new file mode 100644 index 00000000000..c6d23dae265 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/Makefile @@ -0,0 +1,41 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_create +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_create_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_create_003_pos.ksh +${PACKAGE}FILES+= zpool_create_020_pos.ksh +${PACKAGE}FILES+= zpool_create_017_neg.ksh +${PACKAGE}FILES+= zpool_create_013_neg.ksh +${PACKAGE}FILES+= zpool_create_016_pos.ksh +${PACKAGE}FILES+= zpool_create_012_neg.ksh +${PACKAGE}FILES+= zpool_create_006_pos.ksh +${PACKAGE}FILES+= zpool_create_002_pos.ksh +${PACKAGE}FILES+= zpool_create_021_pos.ksh +${PACKAGE}FILES+= zpool_create_007_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_create_014_neg.ksh +${PACKAGE}FILES+= zpool_create_010_neg.ksh +${PACKAGE}FILES+= zpool_create_019_pos.ksh +${PACKAGE}FILES+= zpool_create_008_pos.ksh +${PACKAGE}FILES+= zpool_create_004_pos.ksh +${PACKAGE}FILES+= zpool_create_009_neg.ksh +${PACKAGE}FILES+= zpool_create_022_pos.ksh +${PACKAGE}FILES+= zpool_create.cfg +${PACKAGE}FILES+= zpool_create_005_pos.ksh +${PACKAGE}FILES+= zpool_create_001_pos.ksh +${PACKAGE}FILES+= zpool_create_023_neg.ksh +${PACKAGE}FILES+= zpool_create.kshlib +${PACKAGE}FILES+= zpool_create_015_neg.ksh +${PACKAGE}FILES+= zpool_create_011_neg.ksh +${PACKAGE}FILES+= zpool_create_018_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/cleanup.ksh new file mode 100644 index 00000000000..0014ca9f237 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/cleanup.ksh @@ -0,0 +1,45 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +clean_blockfile "$TESTDIR $TESTDIR0 $TESTDIR1" + +for pool in $TESTPOOL2 $TESTPOOL1 $TESTPOOL; do + if poolexists $pool; then + destroy_pool $pool + fi +done + +cleanup_devices $DISKS + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/setup.ksh new file mode 100644 index 00000000000..8292e3d5829 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/setup.ksh @@ -0,0 +1,53 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.4 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +verify_runnable "global" + +if [[ -n $DISK ]]; then + # + # Use 'zpool create' to clean up the infomation in + # in the given disk to avoid slice overlapping. + # + cleanup_devices $DISK + + partition_disk $SIZE $DISK 7 +else + for disk in `$ECHO $DISKSARRAY`; do + cleanup_devices $disk + + partition_disk $SIZE $disk 7 + done +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create.cfg new file mode 100644 index 00000000000..4fe7496baaf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create.cfg @@ -0,0 +1,77 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create.cfg 1.5 08/08/15 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg +. $STF_SUITE/include/libtest.kshlib + +export DISK_ARRAY_NUM=0 +export DISK_ARRAY_LIMIT=4 +export DISKSARRAY="" + +# +# Variables for zpool_create_005 +# +export STF_TIMEOUT=2400 +export VDEVS_NUM=300 +export FILE_SIZE=100 #100mb +export MD_OVERHEAD=10 # 10% +export POOL_MINSIZE=64 # the minimum size(64m) to create a storage pool + +set_disks + +export FILESIZE="100m" +export FILESIZE1="150m" +export SIZE="200m" +export SIZE1="250m" + +export FILEDISK=filedisk${TESTCASE_ID} +export FILEDISK0=filedisk0${TESTCASE_ID} +export FILEDISK1=filedisk1${TESTCASE_ID} +export FILEDISK2=filedisk2${TESTCASE_ID} +export FILEDISK3=filedisk3${TESTCASE_ID} + +export BYND_MAX_NAME="byondmaxnamelength\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789" + +export TOOSMALL="toosmall" + +export TESTPOOL4=testpool4.${TESTCASE_ID} +export TESTPOOL5=testpool5.${TESTCASE_ID} +export TESTPOOL6=testpool6.${TESTCASE_ID} + +export CPATH="$TMPDIR/cachefile.${TESTCASE_ID}" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create.kshlib new file mode 100644 index 00000000000..864039b2c0f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create.kshlib @@ -0,0 +1,131 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create.kshlib 1.4 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Given a pool vdevs list, create the pool,verify the created pool, +# and destroy the pool +# $1, pool name +# $2, pool type, mirror, raidz, or none +# $3, vdevs list +# +function create_pool_test +{ + typeset pool=$1 + typeset keywd=$2 + typeset vdevs + eval set -A diskarray $3 + + for vdevs in "${diskarray[@]}";do + create_pool $pool $keywd $vdevs + log_must poolexists $pool + destroy_pool $pool + done +} + +# +# Create a ufs file system and make a vdev file on it +# +# $1, disk name to create ufs file system +# $2, file name +# +function create_blockfile +{ + typeset disk=$1 + typeset file=$2 + typeset dir=`$DIRNAME $file` + + if [[ -d $dir ]]; then + ismounted $dir ufs && log_must $UMOUNT -f $dir + else + log_must $MKDIR -p $dir + fi + + log_must $NEWFS $disk + log_must $MOUNT $disk $dir + log_must create_vdevs $file +} + +# +# Umount the ufs filesystem and remove the mountpoint +# $1, the mount point +# +function clean_blockfile +{ + typeset dirs=$1 + + for dir in $dirs; do + if [[ -d $dir ]]; then + if ismounted $dir ufs; then + log_must $UMOUNT -f $dir + fi + log_must $RM -rf $dir + fi + done +} + +# +# Find the storage device in /etc/vfstab +# +function find_vfstab_dev +{ + typeset vfstab="/etc/vfstab" + typeset tmpfile="$TMPDIR/vfstab.tmp" + typeset vfstabdev + typeset vfstabdevs="" + typeset line + + $CAT $vfstab | $GREP "^/dev" >$tmpfile + while read -r line + do + vfstabdev=`$ECHO "$line" | $AWK '{print $1}'` + vfstabdev=${vfstabdev%%:} + vfstabdevs="$vfstabdev $vfstabdevs" + done <$tmpfile + + $RM -f $tmpfile + $ECHO $vfstabdevs +} + +# +# Save the systme current dump device configuration +# +function save_dump_dev +{ + + typeset dumpdev + typeset fnd="Dump device" + + dumpdev=`$DUMPADM | $GREP "$fnd" | $CUT -f2 -d : | \ + $AWK '{print $1}'` + $ECHO $dumpdev +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_001_pos.ksh new file mode 100644 index 00000000000..543e5a01e58 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_001_pos.ksh @@ -0,0 +1,133 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_001_pos.ksh 1.4 09/05/19 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_001_pos +# +# DESCRIPTION: +# 'zpool create ...' can successfully create a +# new pool with a name in ZFS namespace. +# +# STRATEGY: +# 1. Create storage pools with a name in ZFS namespace with different +# vdev specs. +# 2. Verify the pool created successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && destroy_pool $TESTPOOL + + clean_blockfile "$TESTDIR0 $TESTDIR1" +} + +log_assert "'zpool create ...' can successfully create" \ + "a new pool with a name in ZFS namespace." + +log_onexit cleanup + +set -A keywords "" "mirror" "raidz" "raidz1" + +typeset diskname0=${DISK0#/dev/} +typeset diskname1=${DISK1#/dev/} + +case $DISK_ARRAY_NUM in +0|1) + typeset disk="" + if (( $DISK_ARRAY_NUM == 0 )); then + disk=$DISK + else + disk=$DISK0 + fi + typeset diskname=${disk#/dev/} + create_blockfile ${disk}p5 $TESTDIR0/$FILEDISK0 + create_blockfile ${disk}p6 $TESTDIR1/$FILEDISK1 + + pooldevs="${diskname}p1 \ + /dev/${diskname}p1 \ + \"${diskname}p1 ${diskname}p2\" \ + $TESTDIR0/$FILEDISK0" + raidzdevs="\"/dev/${diskname}p1 ${diskname}p2\" \ + \"${diskname}p1 ${diskname}p2 ${diskname}p3\" \ + \"${diskname}p1 ${diskname}p2 ${diskname}p3 \ + ${diskname}p4\"\ + \"$TESTDIR0/$FILEDISK0 $TESTDIR1/$FILEDISK1\"" + mirrordevs=$raidzdevs + ;; +2|*) + create_blockfile ${DISK0}p5 $TESTDIR0/$FILEDISK0 + create_blockfile ${DISK1}p5 $TESTDIR1/$FILEDISK1 + + pooldevs="${diskname0}p1\ + \"/dev/${diskname0}p1 ${diskname1}p1\" \ + \"${diskname0}p1 ${diskname0}p2 ${diskname1}p2\"\ + \"${diskname0}p1 ${diskname1}p1 ${diskname0}p2\ + ${diskname1}p2\" \ + \"$TESTDIR0/$FILEDISK0 $TESTDIR1/$FILEDISK1\"" + raidzdevs="\"/dev/${diskname0}p1 ${diskname1}p1\" \ + \"${diskname0}p1 ${diskname0}p2 ${diskname1}p2\"\ + \"${diskname0}p1 ${diskname1}p1 ${diskname0}p2\ + ${diskname1}p2\" \ + \"$TESTDIR0/$FILEDISK0 $TESTDIR1/$FILEDISK1\"" + mirrordevs=$raidzdevs + ;; +esac + +typeset -i i=0 +while (( $i < ${#keywords[*]} )); do + case ${keywords[i]} in + "") + create_pool_test "$TESTPOOL" "${keywords[i]}" "$pooldevs";; + mirror) + create_pool_test "$TESTPOOL" "${keywords[i]}" "$mirrordevs";; + raidz|raidz1) + create_pool_test "$TESTPOOL" "${keywords[i]}" "$raidzdevs" ;; + esac + (( i = i+1 )) +done + +log_pass "'zpool create ...' success." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_002_pos.ksh new file mode 100644 index 00000000000..98dbec79f1c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_002_pos.ksh @@ -0,0 +1,121 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_002_pos.ksh 1.5 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_002_pos +# +# DESCRIPTION: +# 'zpool create -f ...' can successfully create a +# new pool in some cases. +# +# STRATEGY: +# 1. Prepare the scenarios for '-f' option +# 2. Use -f to override the devices to create new pools +# 3. Verify the pool created successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + for pool in $TESTPOOL $TESTPOOL1 $TESTPOOL2 $TESTPOOL3 $TESTPOOL4 \ + $TESTPOOL5 $TESTPOOL6 + do + poolexists $pool && destroy_pool $pool + done + + clean_blockfile "$TESTDIR0 $TESTDIR1" + + for file in $TMPDIR/$FILEDISK0 $TMPDIR/$FILEDISK1 $TMPDIR/$FILEDISK2 + do + if [[ -e $file ]]; then + $RM -rf $file + fi + done +} + +log_onexit cleanup + +log_assert "'zpool create -f ...' can successfully create" \ + "a new pool in some cases." + +function create_fails_without_force +{ + log_mustnot $ZPOOL create $TESTPOOL $* + create_pool $TESTPOOL $* + destroy_pool $TESTPOOL +} + +[ -n "$DISK" ] && disk=$DISK || disk=$DISK0 + +create_pool "$TESTPOOL" "${disk}p1" +log_must $ZPOOL export $TESTPOOL +log_note "'zpool create' without '-f' will fail " \ + "while device is belong to an exported pool." +create_fails_without_force "${disk}p1" + +log_assert "'zpool create' mirror without '-f' will fail " \ + "when vdevs are different sizes." +VDEV_SIZE=84m +create_vdevs $TMPDIR/$FILEDISK0 +unset VDEV_SIZE +log_must create_vdevs $TMPDIR/$FILEDISK1 +create_fails_without_force mirror $TMPDIR/$FILEDISK0 $TMPDIR/$FILEDISK1 + +log_assert "'zpool create' mirror without '-f' will fail " \ + "when devices are different types." +create_vdevs $TMPDIR/$FILEDISK0 +log_mustnot $ZPOOL create "$TESTPOOL4" "mirror" $TMPDIR/$FILEDISK0 ${disk}p3 +create_fails_without_force mirror $TMPDIR/$FILEDISK0 ${disk}p3 + +log_assert "'zpool create' without '-f' will fail " \ + "while device is part of potentially active pool." +create_vdevs $TMPDIR/$FILEDISK1 $TMPDIR/$FILEDISK2 +create_pool "$TESTPOOL5" "mirror" $TMPDIR/$FILEDISK1 $TMPDIR/$FILEDISK2 +log_must $ZPOOL offline $TESTPOOL5 $TMPDIR/$FILEDISK2 +log_must $ZPOOL export $TESTPOOL5 +create_fails_without_force $TMPDIR/$FILEDISK2 + +log_pass "'zpool create -f ...' success." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_003_pos.ksh new file mode 100644 index 00000000000..962c045b3a5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_003_pos.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_003_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_003_pos +# +# DESCRIPTION: +# 'zpool create -n ...' can display the configuration without +# actually creating the pool. +# +# STRATEGY: +# 1. Create storage pool with -n option +# 2. Verify the pool has not been actually created +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + [[ -e $tmpfile ]] && \ + log_must $RM -f $tmpfile +} + +tmpfile="$TMPDIR/zpool_create_003.tmp${TESTCASE_ID}" + +log_assert "'zpool create -n ...' can display the configureation" \ + "without actually creating the pool." + +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +# +# Make sure disk is clean before we use it +# +create_pool $TESTPOOL ${disk}p1 > $tmpfile +destroy_pool $TESTPOOL + +$ZPOOL create -n $TESTPOOL ${disk}p1 > $tmpfile + +poolexists $TESTPOOL && \ + log_fail "'zpool create -n ...' fail." + +str="would create '$TESTPOOL' with the following layout:" +$CAT $tmpfile | $GREP "$str" >/dev/null 2>&1 +(( $? != 0 )) && \ + log_fail "'zpool create -n ...' is executed as unexpected." + +log_pass "'zpool create -n ...' success." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_004_pos.ksh new file mode 100644 index 00000000000..eea1feda631 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_004_pos.ksh @@ -0,0 +1,94 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_004_pos.ksh 1.4 08/11/03 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_004_pos +# +# DESCRIPTION: +# 'zpool create [-f]' can create a storage pool with large number of +# file-in-zfs-filesystem-based vdevs without any errors. +# +# STRATEGY: +# 1. Create assigned number of files in ZFS filesystem as vdevs +# 2. Creating a new pool based on the vdevs should get success +# 3. Fill in the filesystem and create a partially writen file as vdev +# 4. Add the new file into vdevs list and create a pool +# 5. Creating a storage pool with the new vdevs list should be failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +VDEVS_POOL=create_004_pool + +function cleanup +{ + destroy_pool $VDEVS_POOL + destroy_pool $TESTPOOL2 + destroy_pool $TESTPOOL1 + destroy_pool $TESTPOOL + [ -d "$TESTDIR" ] && log_must $RM -rf $TESTDIR +} + +log_assert "'zpool create [-f]' can create a pool with $VDEVS_NUM vdevs " \ + "without any errors." +log_onexit cleanup + +log_note "Creating storage pool with $VDEVS_NUM file vdevs should succeed." +vdevs_list="" +file_size=$FILE_SIZE + +[ -n "$DISK" ] && disk=$DISK || disk=$DISK0 +create_pool $TESTPOOL $disk +$ZFS create -o mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +for (( i = 0; $i < $VDEVS_NUM; i++ )); do + log_must create_vdevs $TESTDIR/vdev.${i} + vdevs_list="$vdevs_list $TESTDIR/vdev.${i}" +done + +create_pool $TESTPOOL1 $vdevs_list +destroy_pool $TESTPOOL1 + +log_pass "'zpool create [-f]' with $VDEVS_NUM vdevs success." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_005_pos.ksh new file mode 100644 index 00000000000..b1b41e5731e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_005_pos.ksh @@ -0,0 +1,122 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_005_pos.ksh 1.3 08/02/27 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_005_pos +# +# DESCRIPTION: +# 'zpool create [-R root][-m mountpoint] ...' can create an +# alternate root pool or a new pool mounted at the specified mountpoint. +# +# STRATEGY: +# 1. Create a pool with '-m' option +# 2. Verify the pool is mounted at the specified mountpoint +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + log_must $ZPOOL destroy -f $TESTPOOL + + for dir in $TMPDIR/zpool_create_005_pos $TESTDIR1; do + [[ -d $dir ]] && $RM -rf $dir + done +} + +log_assert "'zpool create [-R root][-m mountpoint] ...' can create" \ + "an alternate pool or a new pool mounted at the specified mountpoint." +log_onexit cleanup + +set -A pooltype "" "mirror" "raidz" "raidz1" "raidz2" + +#prepare raw file for file disk +TDIR=$TMPDIR/zpool_create_005_pos +FBASE=$TDIR/file +log_must $MKDIR $TDIR +log_must create_vdevs $FBASE.0 $FBASE.1 $FBASE.2 $FBASE.3 +#Remove the directory with name as pool name if it exists +[[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL + +for opt in "-R $TESTDIR1" "-m $TESTDIR1" \ + "-R $TESTDIR1 -m $TESTDIR1" "-m $TESTDIR1 -R $TESTDIR1" +do + i=0 + while (( i < ${#pooltype[*]} )); do + #Remove the testing pool and its mount directory + poolexists $TESTPOOL && \ + log_must $ZPOOL destroy -f $TESTPOOL + [[ -d $TESTDIR1 ]] && $RM -rf $TESTDIR1 + log_must $ZPOOL create $opt $TESTPOOL ${pooltype[i]} \ + $FBASE.1 $FBASE.2 $FBASE.3 + mpt=`$ZFS mount | $EGREP "^$TESTPOOL[^/]" | $AWK '{print $2}'` + (( ${#mpt} == 0 )) && \ + log_fail "$TESTPOOL created with $opt is not mounted." + mpt_val=$(get_prop "mountpoint" $TESTPOOL) + [[ "$mpt" != "$mpt_val" ]] && \ + log_fail "The value of mountpoint property is different\ + from the output of zfs mount" + if [[ "$opt" == "-R $TESTDIR1" ]]; then + expected_mpt=${TESTDIR1}/${TESTPOOL} + elif [[ "$opt" == "-m $TESTDIR1" ]]; then + expected_mpt=${TESTDIR1} + else + expected_mpt=${TESTDIR1}${TESTDIR1} + fi + [[ ! -d $expected_mpt ]] && \ + log_fail "$expected_mpt is not created auotmatically." + [[ "$mpt" != "$expected_mpt" ]] && \ + log_fail "$expected_mpt is mounted on ${mpt} instead of $expected_mpt." + + [[ -d /$TESTPOOL ]] && \ + log_fail "The default mountpoint /$TESTPOOL is created" \ + "while with $opt option." + + (( i = i + 1 )) + done +done + +log_pass "'zpool create [-R root][-m mountpoint] ...' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_006_pos.ksh new file mode 100644 index 00000000000..1045e7c832d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_006_pos.ksh @@ -0,0 +1,141 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_006_pos.ksh 1.6 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_create_006_pos +# +# DESCRIPTION: +# Verify zpool create succeed with multiple keywords combination. +# +# STRATEGY: +# 1. Create base filesystem to hold virtual disk files. +# 2. Create several files >= 64M. +# 3. Verify 'zpool create' succeed with valid keywords combination. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + datasetexists $TESTPOOL && destroy_pool $TESTPOOL +} + + +log_assert "Verify 'zpool create' succeed with keywords combination." +log_onexit cleanup + +create_pool $TESTPOOL $DISKS +mntpnt=$(get_prop mountpoint $TESTPOOL) + +typeset -i i=0 +while ((i < 10)); do + log_must create_vdevs $mntpnt/vdev$i + + eval vdev$i=$mntpnt/vdev$i + ((i += 1)) +done + +set -A valid_args \ + "mirror $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 $vdev5" \ + "mirror $vdev0 $vdev1 mirror $vdev2 $vdev3 mirror $vdev4 $vdev5" \ + "mirror $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 $vdev5 \ + spare $vdev6" \ + "mirror $vdev0 $vdev1 mirror $vdev2 $vdev3 mirror $vdev4 $vdev5 \ + spare $vdev6 $vdev7" \ + "mirror $vdev0 $vdev1 spare $vdev2 mirror $vdev3 $vdev4" \ + "raidz $vdev0 $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5" \ + "raidz $vdev0 $vdev1 raidz1 $vdev2 $vdev3 raidz $vdev4 $vdev5" \ + "raidz $vdev0 $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5 \ + spare $vdev6" \ + "raidz $vdev0 $vdev1 raidz1 $vdev2 $vdev3 raidz $vdev4 $vdev5 \ + spare $vdev6 $vdev7" \ + "raidz $vdev0 $vdev1 spare $vdev2 raidz $vdev3 $vdev4" \ + "raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5" \ + "raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \ + raidz2 $vdev6 $vdev7 $vdev8" \ + "raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \ + spare $vdev6" \ + "raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \ + raidz2 $vdev6 $vdev7 $vdev8 spare $vdev9" \ + "raidz2 $vdev0 $vdev1 $vdev2 spare $vdev3 raidz2 $vdev4 $vdev5 $vdev6" + +set -A forced_args \ + "$vdev0 raidz $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5" \ + "$vdev0 raidz2 $vdev1 $vdev2 $vdev3 raidz2 $vdev4 $vdev5 $vdev6" \ + "$vdev0 mirror $vdev1 $vdev2 mirror $vdev3 $vdev4" \ + "$vdev0 mirror $vdev1 $vdev2 raidz $vdev3 $vdev4 \ + raidz2 $vdev5 $vdev6 $vdev7 spare $vdev8" \ + "$vdev0 mirror $vdev1 $vdev2 spare $vdev3 raidz $vdev4 $vdev5" \ + "raidz $vdev0 $vdev1 raidz2 $vdev2 $vdev3 $vdev4" \ + "raidz $vdev0 $vdev1 raidz2 $vdev2 $vdev3 $vdev4 spare $vdev5" \ + "raidz $vdev0 $vdev1 spare $vdev2 raidz2 $vdev3 $vdev4 $vdev5" \ + "mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 raidz2 $vdev4 $vdev5 $vdev6" \ + "mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 \ + raidz2 $vdev4 $vdev5 $vdev6 spare $vdev7" \ + "mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 \ + spare $vdev4 raidz2 $vdev5 $vdev6 $vdev7" \ + "spare $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 raidz $vdev5 $vdev6" + +i=0 +while ((i < ${#valid_args[@]})); do + log_must $ZPOOL create $TESTPOOL1 ${valid_args[$i]} + $SYNC; $SYNC + log_must $ZPOOL destroy -f $TESTPOOL1 + + ((i += 1)) +done + +i=0 +while ((i < ${#forced_args[@]})); do + log_mustnot $ZPOOL create $TESTPOOL1 ${forced_args[$i]} + log_must $ZPOOL create -f $TESTPOOL1 ${forced_args[$i]} + $SYNC; $SYNC + log_must $ZPOOL destroy -f $TESTPOOL1 + + ((i += 1)) +done + +log_pass "'zpool create' succeed with keywords combination." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_007_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_007_neg.ksh new file mode 100644 index 00000000000..ae8dd4bb901 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_007_neg.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_007_neg.ksh 1.5 08/11/03 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_007_neg +# +# DESCRIPTION: +# 'zpool create' should return an error with badly formed parameters. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool create' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +set -A args "" "-?" "-n" "-f" "-nf" "-fn" "-f -n" "--f" "-e" "-s" \ + "-m" "-R" "-m -R" "-Rm" "-mR" "-m $TESTDIR $TESTPOOL" \ + "-R $TESTDIR $TESTPOOL" "-m nodir $TESTPOOL $disk" \ + "-R nodir $TESTPOOL $disk" "-m nodir -R nodir $TESTPOOL $disk" \ + "-R nodir -m nodir $TESTPOOL $disk" "-R $TESTDIR -m nodir $TESTPOOL $disk" \ + "-R nodir -m $TESTDIR $TESTPOOL $disk" \ + "-blah" "$TESTPOOL" "$TESTPOOL blah" "$TESTPOOL c?t0d0" \ + "$TESTPOOL c0txd0" "$TESTPOOL c0t0dx" "$TESTPOOL cxtxdx" \ + "$TESTPOOL mirror" "$TESTPOOL raidz" "$TESTPOOL mirror raidz" \ + "$TESTPOOL raidz1" "$TESTPOOL mirror raidz1" \ + "$TESTPOOL mirror c?t?d?" "$TESTPOOL mirror $disk c0t1d?" \ + "$TESTPOOL RAIDZ ${disk}p1 ${disk}p2" \ + "$TESTPOOL ${disk}p1 log ${disk}p2 \ + log ${disk}p3" \ + "$TESTPOOL ${disk}p1 spare ${disk}p2 \ + spare ${disk}p3" \ + "$TESTPOOL RAIDZ1 ${disk}p1 ${disk}p2" \ + "$TESTPOOL MIRROR $disk" "$TESTPOOL raidz $disk" \ + "$TESTPOOL raidz1 $disk" \ + "1tank $disk" "1234 $disk" "?tank $disk" \ + "tan%k $disk" "ta@# $disk" "tan+k $disk" \ + "$BYND_MAX_NAME $disk" + +log_assert "'zpool create' should return an error with badly-formed parameters." +log_onexit default_cleanup_noexit + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL create ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool create' with badly formed parameters failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_008_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_008_pos.ksh new file mode 100644 index 00000000000..de98816e202 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_008_pos.ksh @@ -0,0 +1,158 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)zpool_create_008_pos.ksh 1.5 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_008_pos +# +# DESCRIPTION: +# 'zpool create' have to use '-f' scenarios +# +# STRATEGY: +# 1. Prepare the scenarios +# 2. Create pool without '-f' and verify it fails +# 3. Create pool with '-f' and verify it succeeds +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if [[ $exported_pool == true ]]; then + if [[ $force_pool == true ]]; then + log_must $ZPOOL create -f $TESTPOOL ${disk}p1 + else + log_must $ZPOOL import $TESTPOOL + fi + fi + + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + + if poolexists $TESTPOOL1 ; then + destroy_pool $TESTPOOL1 + fi + + # + # recover it back to EFI label + # + wipe_partition_table $disk +} + +# +# create overlap slice 0 and 1 on $disk +# +function create_overlap_slice +{ + typeset format_file=$TMPDIR/format_overlap.${TESTCASE_ID} + typeset disk=$1 + + $ECHO "partition" >$format_file + $ECHO "0" >> $format_file + $ECHO "" >> $format_file + $ECHO "" >> $format_file + $ECHO "0" >> $format_file + $ECHO "200m" >> $format_file + $ECHO "1" >> $format_file + $ECHO "" >> $format_file + $ECHO "" >> $format_file + $ECHO "0" >> $format_file + $ECHO "400m" >> $format_file + $ECHO "label" >> $format_file + $ECHO "" >> $format_file + $ECHO "q" >> $format_file + $ECHO "q" >> $format_file + + $FORMAT -e -s -d $disk -f $format_file + typeset -i ret=$? + $RM -fr $format_file + + if (( ret != 0 )); then + log_fail "unable to create overlap slice." + fi + + return 0 +} + +log_assert "'zpool create' have to use '-f' scenarios" +log_onexit cleanup + +typeset exported_pool=false +typeset force_pool=false + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +# overlapped slices as vdev need -f to create pool + +# Make the disk is EFI labeled first via pool creation +create_pool $TESTPOOL $disk +destroy_pool $TESTPOOL + +# Make the disk is VTOC labeled since only VTOC label supports overlap +log_must labelvtoc $disk +log_must create_overlap_slice $disk + +log_mustnot $ZPOOL create $TESTPOOL ${disk}p1 +log_must $ZPOOL create -f $TESTPOOL ${disk}p1 +destroy_pool $TESTPOOL + +# exported device to be as spare vdev need -f to create pool + +log_must $ZPOOL create -f $TESTPOOL $disk +destroy_pool $TESTPOOL +log_must partition_disk $SIZE $disk 6 +create_pool $TESTPOOL ${disk}p1 ${disk}p2 +log_must $ZPOOL export $TESTPOOL +exported_pool=true +log_mustnot $ZPOOL create $TESTPOOL1 ${disk}p3 spare ${disk}p2 +create_pool $TESTPOOL1 ${disk}p3 spare ${disk}p2 +force_pool=true +destroy_pool $TESTPOOL1 + +log_pass "'zpool create' have to use '-f' scenarios" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_009_neg.ksh new file mode 100644 index 00000000000..7b70cd6cf63 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_009_neg.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_009_neg.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_create_009_neg +# +# DESCRIPTION: +# Create a pool with same devices twice or create two pools with same +# devices, 'zpool create' should failed. +# +# STRATEGY: +# 1. Loop to create the following three kinds of pools. +# - Regular pool +# - Mirror +# - Raidz +# 2. Create two pools but using the same disks, expect failed. +# 3. Create one pool but using the same disks twice, expect failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset dtst + typeset disk + + for dtst in $TESTPOOL $TESTPOOL1; do + poolexists $dtst && destroy_pool $dtst + done +} + +log_assert "Create a pool with same devices twice or create two pools with " \ + "same devices, 'zpool create' should fail." +log_onexit cleanup + +typeset opt +for opt in "" "mirror" "raidz" "raidz1"; do + typeset disk="$DISKS" + (( ${#opt} == 0 )) && disk=${DISKS%% *} + + typeset -i count=$(get_word_count "$disk") + if (( count < 2 && ${#opt} != 0 )) ; then + continue + fi + + # Create two pools but using the same disks. + create_pool $TESTPOOL $opt $disk + log_mustnot $ZPOOL create -f $TESTPOOL1 $opt $disk + destroy_pool $TESTPOOL + + # Create two pools and part of the devices were overlapped + create_pool $TESTPOOL $opt $disk + log_mustnot $ZPOOL create -f $TESTPOOL1 $opt ${DISKS% *} + destroy_pool $TESTPOOL + + # Create one pool but using the same disks twice. + log_mustnot $ZPOOL create -f $TESTPOOL $opt $disk $disk +done + +log_pass "Using overlapping or in-use disks to create a new pool fails as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_010_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_010_neg.ksh new file mode 100644 index 00000000000..3484d29b03e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_010_neg.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_010_neg.ksh 1.3 07/02/06 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_010_neg +# +# DESCRIPTION: +# 'zpool create' should return an error with VDEVsof size <64mb +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool create' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-30) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "'zpool create' should return an error with VDEVs <64mb" + +verify_runnable "global" + +function cleanup +{ + poolexists $TOOSMALL && destroy_pool $TOOSMALL + poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + + poolexists $TESTPOOL && destroy_pool $TESTPOOL + + [[ -d $TESTDIR ]] && $RM -rf $TESTDIR +} +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +create_pool $TESTPOOL $disk +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +VDEV_SIZE=63m +log_must create_vdevs $TESTDIR/file1 $TESTDIR/file2 +unset VDEV_SIZE + +set -A args \ + "$TOOSMALL $TESTDIR/file1" "$TESTPOOL1 $TESTDIR/file1 $TESTDIR/file2" \ + "$TOOSMALL mirror $TESTDIR/file1 $TESTDIR/file2" \ + "$TOOSMALL raidz $TESTDIR/file1 $TESTDIR/file2" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL create ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool create' with badly formed parameters failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_011_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_011_neg.ksh new file mode 100644 index 00000000000..214d9e74f18 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_011_neg.ksh @@ -0,0 +1,140 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)zpool_create_011_neg.ksh 1.5 08/11/03 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_011_neg +# +# DESCRIPTION: +# 'zpool create' will fail in the following cases: +# existent pool; device is part of an active pool; nested virtual devices; +# differently sized devices without -f option; device being currently +# mounted; devices in /etc/vfstab; specified as the dedicated dump device. +# +# STRATEGY: +# 1. Create case scenarios +# 2. For each scenario, try to create a new pool with the virtual devices +# 3. Verify the creation is failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + for pool in $TESTPOOL $TESTPOOL1 + do + destroy_pool $pool + done + + if [[ -n $saved_dump_dev ]]; then + log_must $DUMPADM -u -d $saved_dump_dev + fi +} + +log_assert "'zpool create' should be failed with inapplicable scenarios." +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi +pooldev1=${disk}p1 +pooldev2=${disk}p2 +mirror1="${disk}p2 ${disk}p3" +mirror2="${disk}p4 ${disk}p5" +raidz1=$mirror1 +raidz2=$mirror2 +diff_size_dev="${disk}p6 ${disk}p7" +vfstab_dev=$(find_vfstab_dev) +specified_dump_dev=${disk}p1 +saved_dump_dev=$(save_dump_dev) + +lba=$(get_partition_end $disk 6) +set_partition 7 "$lba" $SIZE1 $disk +create_pool "$TESTPOOL" "$pooldev1" + +# +# Set up the testing scenarios parameters +# +set -A arg "$TESTPOOL $pooldev2" \ + "$TESTPOOL1 $pooldev1" \ + "$TESTPOOL1 $TESTDIR0/$FILEDISK0" \ + "$TESTPOOL1 mirror mirror $mirror1 mirror $mirror2" \ + "$TESTPOOL1 raidz raidz $raidz1 raidz $raidz2" \ + "$TESTPOOL1 raidz1 raidz1 $raidz1 raidz1 $raidz2" \ + "$TESTPOOL1 mirror raidz $raidz1 raidz $raidz2" \ + "$TESTPOOL1 mirror raidz1 $raidz1 raidz1 $raidz2" \ + "$TESTPOOL1 raidz mirror $mirror1 mirror $mirror2" \ + "$TESTPOOL1 raidz1 mirror $mirror1 mirror $mirror2" \ + "$TESTPOOL1 mirror $diff_size_dev" \ + "$TESTPOOL1 raidz $diff_size_dev" \ + "$TESTPOOL1 raidz1 $diff_size_dev" \ + "$TESTPOOL1 mirror $mirror1 spare $mirror2 spare $diff_size_dev" \ + "$TESTPOOL1 $vfstab_dev" \ + "$TESTPOOL1 ${disk}s10" \ + "$TESTPOOL1 spare $pooldev2" + +typeset -i i=0 +while (( i < ${#arg[*]} )); do + log_mustnot $ZPOOL create ${arg[i]} + (( i = i+1 )) +done + +# now destroy the pool to be polite +log_must $ZPOOL destroy -f $TESTPOOL + +# create/destroy a pool as a simple way to set the partitioning +# back to something normal so we can use this $disk as a dump device +log_must $ZPOOL create -f $TESTPOOL3 $disk +log_must $ZPOOL destroy -f $TESTPOOL3 + +log_must $DUMPADM -d /dev/$specified_dump_dev +log_mustnot $ZPOOL create -f $TESTPOOL1 "$specified_dump_dev" + +# Also check to see that in-use checking prevents us from creating +# a zpool from just the first slice on the disk. +log_mustnot $ZPOOL create -f $TESTPOOL1 ${specified_dump_dev}s0 + +log_pass "'zpool create' is failed as expected with inapplicable scenarios." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_012_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_012_neg.ksh new file mode 100644 index 00000000000..345437ba3e2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_012_neg.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)zpool_create_012_neg.ksh 1.1 07/05/25 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_012_neg +# +# +# DESCRIPTION: +# 'zpool create' will fail with formal disk slice in swap +# +# +# STRATEGY: +# 1. Get all the disk devices in swap +# 2. For each device, try to create a new pool with this device +# 3. Verify the creation is failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-04-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi + +} +typeset swap_disks=`$SWAP -l | $GREP "c[0-9].*d[0-9].*s[0-9]" | \ + $AWK '{print $1}'` + +log_assert "'zpool create' should fail with disk slice in swap." +log_onexit cleanup + +for sdisk in $swap_disks; do + for opt in "-n" "" "-f"; do + log_mustnot $ZPOOL create $opt $TESTPOOL $sdisk + done +done + +log_pass "'zpool create' passed as expected with inapplicable scenario." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_013_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_013_neg.ksh new file mode 100644 index 00000000000..730a0213512 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_013_neg.ksh @@ -0,0 +1,116 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)zpool_create_013_neg.ksh 1.2 08/02/27 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_013_neg +# +# +# DESCRIPTION: +# 'zpool create' will fail with metadevice in swap +# +# STRATEGY: +# 1. Create a one way strip metadevice +# 2. Try to create a new pool with metadevice in swap +# 3. Verify the creation is failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-04-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + # cleanup SVM + $METASTAT $md_name > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + $SWAP -l | $GREP /dev/md/$md_name > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + $SWAP -d /dev/md/$md_name + fi + $METACLEAR $md_name + fi + + $METADB | $GREP $mddb_dev > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + $METADB -df /dev/$mddb_dev + fi + + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi + +} + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +typeset mddb_dev=${disk}p1 +typeset md_dev=${disk}p2 +typeset md_name=d0 +typeset MD_DSK=/dev/md/d0 + +log_assert "'zpool create' should fail with metadevice in swap." +log_onexit cleanup + +# +# use metadevice in swap to create pool, which should fail. +# +$METADB | $GREP $mddb_dev > /dev/null 2>&1 +if [[ $? -ne 0 ]]; then + log_must $METADB -af $mddb_dev +fi + +$METASTAT $md_name > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + $METACLEAR $md_name +fi + +log_must $METAINIT $md_name 1 1 $md_dev +log_must $SWAP -a $MD_DSK +for opt in "-n" "" "-f"; do + log_mustnot $ZPOOL create $opt $TESTPOOL $MD_DSK +done + +log_pass "'zpool create' passed as expected with inapplicable scenario." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_014_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_014_neg.ksh new file mode 100644 index 00000000000..12d80285683 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_014_neg.ksh @@ -0,0 +1,103 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)zpool_create_014_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_014_neg +# +# +# DESCRIPTION: +# 'zpool create' will fail with ordinary file in swap +# +# STRATEGY: +# 1. Create a regular file on top of UFS-zvol filesystem +# 2. Try to create a new pool with regular file in swap +# 3. Verify the creation is failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-04-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if datasetexists $vol_name; then + $SWAP -l | $GREP $TMP_FILE > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + log_must $SWAP -d $TMP_FILE + fi + $RM -f $TMP_FILE + log_must $UMOUNT $mntp + $ZFS destroy $vol_name + fi + + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi +} + +log_assert "'zpool create' should fail with regular file in swap." +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +typeset pool_dev=${disk}p1 +typeset vol_name=$TESTPOOL/$TESTVOL +typeset mntp=$TMPDIR +typeset TMP_FILE=$mntp/tmpfile.${TESTCASE_ID} + +create_pool $TESTPOOL $pool_dev +log_must $ZFS create -V 100m $vol_name +log_must $ECHO "y" | $NEWFS /dev/zvol/$vol_name > /dev/null 2>&1 +log_must $MOUNT /dev/zvol/$vol_name $mntp + +log_must $MKFILE 50m $TMP_FILE +log_must $SWAP -a $TMP_FILE + +for opt in "-n" "" "-f"; do + log_mustnot $ZPOOL create $opt $TESTPOOL $TMP_FILE +done + +log_pass "'zpool create' passed as expected with inapplicable scenario." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_015_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_015_neg.ksh new file mode 100644 index 00000000000..b463b381151 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_015_neg.ksh @@ -0,0 +1,103 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)zpool_create_015_neg.ksh 1.2 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_015_neg +# +# +# DESCRIPTION: +# 'zpool create' will fail with zfs vol device in swap +# +# +# STRATEGY: +# 1. Create a zpool +# 2. Create a zfs vol on zpool +# 3. Add this zfs vol device to swap +# 4. Try to create a new pool with devices in swap +# 5. Verify the creation is failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-04-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + # cleanup zfs pool and dataset + if datasetexists $vol_name; then + $SWAP -l | $GREP /dev/zvol/$vol_name > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + $SWAP -d /dev/zvol/${vol_name} + fi + fi + + destroy_pool $TESTPOOL1 + destroy_pool $TESTPOOL +} + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +typeset pool_dev=${disk}p1 +typeset vol_name=$TESTPOOL/$TESTVOL + +log_assert "'zpool create' should fail with zfs vol device in swap." +log_onexit cleanup + +# +# use zfs vol device in swap to create pool which should fail. +# +create_pool $TESTPOOL $pool_dev +log_must $ZFS create -V 100m $vol_name +log_must $SWAP -a /dev/zvol/$vol_name +for opt in "-n" "" "-f"; do + log_mustnot $ZPOOL create $opt $TESTPOOL1 /dev/zvol/${vol_name} +done + +# cleanup +log_must $SWAP -d /dev/zvol/${vol_name} +log_must $ZFS destroy $vol_name + +log_pass "'zpool create' passed as expected with inapplicable scenario." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_016_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_016_pos.ksh new file mode 100644 index 00000000000..0f96a96f4c3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_016_pos.ksh @@ -0,0 +1,100 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_016_pos.ksh 1.2 08/08/15 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_016_pos +# +# +# DESCRIPTION: +# 'zpool create' will success with no device in swap +# +# +# STRATEGY: +# 1. delete all devices in the swap +# 2. create a zpool +# 3. Verify the creation is successed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-04-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL + + #recover swap devices + FSTAB=$TMPDIR/fstab_${TESTCASE_ID} + $RM -f $FSTAB + for sdisk in $swap_disks; do + $ECHO "$sdisk - - swap - no -" >> $FSTAB + done + if [ -e $FSTAB ] + then + log_must $SWAPADD $FSTAB + fi + $RM -f $FSTAB + if [ $dump_device != "none" ] + then + log_must $DUMPADM -u -d $dump_device + fi +} + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi +typeset pool_dev=${disk}p1 +typeset swap_disks=`$SWAP -l | $GREP -v "swapfile" | $AWK '{print $1}'` +typeset dump_device=`$DUMPADM | $GREP "Dump device" | $AWK '{print $3}'` + +log_assert "'zpool create' should success with no device in swap." +log_onexit cleanup + +for sdisk in $swap_disks; do + log_must $SWAP -d $sdisk +done + +log_must $ZPOOL create $TESTPOOL $pool_dev + +log_pass "'zpool create' passed as expected with applicable scenario." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_017_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_017_neg.ksh new file mode 100644 index 00000000000..3c2e238e925 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_017_neg.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)zpool_create_017_neg.ksh 1.1 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_017_neg +# +# +# DESCRIPTION: +# 'zpool create' will fail with mountpoint exists and is not empty. +# +# +# STRATEGY: +# 1. Prepare the mountpoint put some stuff into it. +# 2. Verify 'zpool create' over that mountpoint fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi + + if [[ -d $TESTDIR ]]; then + log_must $RM -rf $TESTDIR + fi +} + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +typeset pool_dev=${disk}p1 + +log_assert "'zpool create' should fail with mountpoint exists and not empty." +log_onexit cleanup + +if [[ ! -d $TESTDIR ]]; then + log_must $MKDIR -p $TESTDIR +fi + +typeset -i i=0 + +while (( i < 2 )); do + log_must $RM -rf $TESTDIR/* + if (( i == 0 )); then + log_must $MKDIR $TESTDIR/testdir + else + log_must $TOUCH $TESTDIR/testfile + fi + + log_mustnot $ZPOOL create -m $TESTDIR -f $TESTPOOL $pool_dev + log_mustnot poolexists $TESTPOOL + + (( i = i + 1 )) +done + +log_pass "'zpool create' fail as expected with mountpoint exists and not empty." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_018_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_018_pos.ksh new file mode 100644 index 00000000000..2f200ec9fa1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_018_pos.ksh @@ -0,0 +1,120 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_018_pos.ksh 1.4 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_018_pos +# +# DESCRIPTION: +# +# zpool create can create pools with specified properties +# +# STRATEGY: +# 1. Create a pool with all editable properties +# 2. Verify those properties are set +# 3. Create a pool with two properties set +# 4. Verify both properties are set correctly +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + destroy_pool $TESTPOOL + + if [[ -f $CPATH ]] ; then + log_must $RM $CPATH + fi +} + +log_onexit cleanup +log_assert "zpool create can create pools with specified properties" + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +# we don't include "root" property in this list, as it requires both "cachefile" +# and "root" to be set at the same time. A test for this is included in +# ../../root. +set -A props "autoreplace" "delegation" "cachefile" "version" +set -A vals "off" "off" "$CPATH" "3" + +if pool_prop_exist autoexpand ; then + set -A props ${props[*]} "autoexpand" + set -A vals ${vals[*]} "on" +fi + +typeset -i i=0; +while [ $i -lt "${#props[@]}" ] +do + log_must $ZPOOL create -o ${props[$i]}=${vals[$i]} $TESTPOOL $disk + RESULT=$(get_pool_prop ${props[$i]} $TESTPOOL) + if [[ $RESULT != ${vals[$i]} ]] + then + $ZPOOL get all $TESTPOOL + log_fail "Pool was created without setting the ${props[$i]} property" + fi + destroy_pool $TESTPOOL + (( i = i + 1 )) +done + +# pick two properties, and verify we can create with those as well +log_must $ZPOOL create -o delegation=off -o cachefile=$CPATH $TESTPOOL $disk +RESULT=$(get_pool_prop delegation $TESTPOOL) +if [[ $RESULT != off ]] +then + $ZPOOL get all $TESTPOOL + log_fail "Pool created without the delegation prop." +fi + +RESULT=$(get_pool_prop cachefile $TESTPOOL) +if [[ $RESULT != $CPATH ]] +then + $ZPOOL get all $TESTPOOL + log_fail "Pool created without the cachefile prop." +fi + +log_pass "zpool create can create pools with specified properties" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_019_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_019_pos.ksh new file mode 100644 index 00000000000..646669921fd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_019_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_019_pos.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_019_pos +# +# DESCRIPTION: +# +# zpool create cannot create pools specifying readonly properties +# +# STRATEGY: +# 1. Attempt to create a pool, specifying each readonly property in turn +# 2. Verify the pool was not created +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-24) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi +} + +log_onexit cleanup + +log_assert "zpool create cannot create pools specifying readonly properties" + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +set -A props "available" "capacity" "guid" "health" "size" "used" +set -A vals "100" "10" "12345" "HEALTHY" "10" "10" + +typeset -i i=0; +while [ $i -lt "${#props[@]}" ] +do + # try to set each property in the prop list with it's corresponding val + log_mustnot $ZPOOL create -o ${props[$i]}=${vals[$i]} $TESTPOOL $disk + if poolexists $TESTPOOL + then + log_fail "$TESTPOOL was created when setting ${props[$i]}!" + fi + i=$(( $i + 1)) +done + +log_pass "zpool create cannot create pools specifying readonly properties" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_020_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_020_pos.ksh new file mode 100644 index 00000000000..d9f7ed89f15 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_020_pos.ksh @@ -0,0 +1,123 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_020_pos.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_create/zpool_create.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_020_pos +# +# DESCRIPTION: +# +# zpool create -R works as expected +# +# STRATEGY: +# 1. Create a -R altroot pool +# 2. Verify the pool is mounted at the correct location +# 3. Verify that cachefile=none for the pool +# 4. Verify that root= for the pool +# 5. Verify that no reference to the pool is found in /etc/zfs/zpool.cache + +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + poolexists $TESTPOOL && destroy_pool $TESTPOOL + [[ -d ${TESTPOOL}.root ]] && log_must $RM -rf /${TESTPOOL}.root +} + +log_onexit cleanup + +log_assert "zpool create -R works as expected" + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +$RM -rf /${TESTPOOL}.root +log_must $MKDIR /${TESTPOOL}.root +log_must $ZPOOL create -R /${TESTPOOL}.root $TESTPOOL $disk +if [ ! -d /${TESTPOOL}.root ] +then + log_fail "Mountpoint was not create when using zpool with -R flag!" +fi + +FS=$($ZFS list $TESTPOOL) +if [ -z "$FS" ] +then + log_fail "Mounted filesystem at /${TESTPOOL}.root isn't ZFS!" +fi + +log_must $ZPOOL get all $TESTPOOL +$ZPOOL get all $TESTPOOL > $TMPDIR/values.${TESTCASE_ID} + +# check for the cachefile property, verifying that it's set to 'none' +$GREP "$TESTPOOL[ ]*cachefile[ ]*none" $TMPDIR/values.${TESTCASE_ID} > /dev/null 2>&1 +if [ $? -ne 0 ] +then + log_fail "zpool property \'cachefile\' was not set to \'none\'." +fi + +# check that the root = /mountpoint property is set correctly +$GREP "$TESTPOOL[ ]*altroot[ ]*/${TESTPOOL}.root" $TMPDIR/values.${TESTCASE_ID} > /dev/null 2>&1 +if [ $? -ne 0 ] +then + log_fail "zpool property root was not found in pool output." +fi + +$RM $TMPDIR/values.${TESTCASE_ID} + +# finally, check that the pool has no reference in /etc/zfs/zpool.cache +if [[ -f /etc/zfs/zpool.cache ]] ; then + REF=$($STRINGS /etc/zfs/zpool.cache | $GREP ${TESTPOOL}) + if [ ! -z "$REF" ] + then + $STRINGS /etc/zfs/zpool.cache + log_fail "/etc/zfs/zpool.cache appears to have a reference to $TESTPOOL" + fi +fi + + +log_pass "zpool create -R works as expected" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_021_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_021_pos.ksh new file mode 100644 index 00000000000..353bf71aa5f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_021_pos.ksh @@ -0,0 +1,106 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_021_pos.ksh 1.2 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_021_pos +# +# DESCRIPTION: +# 'zpool create -O property=value pool' can successfully create a pool +# with correct filesystem property set. +# +# STRATEGY: +# 1. Create a storage pool with -O option +# 2. Verify the pool created successfully +# 3. Verify the filesystem property is correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-27) +# +# __stc_assertion_end +# +################################################################################ + +if ! $(check_zpool_opt_support "create" "-O") ; then + log_unsupported "-O option is not supported yet." +fi + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL +} + +log_onexit cleanup + +log_assert "'zpool create -O property=value pool' can successfully create a pool \ + with correct filesystem property set." + +set -A RW_FS_PROP "quota=512M" \ + "reservation=512M" \ + "recordsize=64K" \ + "mountpoint=/tmp/mnt${TESTCASE_ID}" \ + "checksum=fletcher2" \ + "compression=lzjb" \ + "atime=off" \ + "devices=off" \ + "exec=off" \ + "setuid=off" \ + "readonly=on" \ + "snapdir=visible" \ + "aclmode=discard" \ + "aclinherit=discard" \ + "canmount=off" \ + "sharenfs=on" + +typeset -i i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + log_must $ZPOOL create -O ${RW_FS_PROP[$i]} -f $TESTPOOL $DISKS + datasetexists $TESTPOOL || \ + log_fail "zpool create $TESTPOOL fail." + propertycheck $TESTPOOL ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + destroy_pool $TESTPOOL + (( i = i + 1 )) +done + +log_pass "'zpool create -O property=value pool' can successfully create a pool \ + with correct filesystem property set." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_022_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_022_pos.ksh new file mode 100644 index 00000000000..1713c8a610e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_022_pos.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_022_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_create/zfs_create_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_022_pos +# +# DESCRIPTION: +# 'zpool create -O property=value pool' can successfully create a pool +# with multiple filesystem properties set. +# +# STRATEGY: +# 1. Create a storage pool with multiple -O options +# 2. Verify the pool created successfully +# 3. Verify the properties are correctly set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-27) +# +# __stc_assertion_end +# +################################################################################ + +if ! $(check_zpool_opt_support "create" "-O") ; then + log_unsupported "-O option is not supported yet." +fi + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL +} + +log_onexit cleanup + +log_assert "'zpool create -O property=value pool' can successfully create a pool \ + with multiple filesystem properties set." + +set -A RW_FS_PROP "quota=512M" \ + "reservation=512M" \ + "recordsize=64K" \ + "mountpoint=/tmp/mnt${TESTCASE_ID}" \ + "checksum=fletcher2" \ + "compression=lzjb" \ + "atime=off" \ + "devices=off" \ + "exec=off" \ + "setuid=off" \ + "readonly=on" \ + "snapdir=visible" \ + "aclmode=discard" \ + "aclinherit=discard" \ + "canmount=off" \ + "sharenfs=on" + +typeset -i i=0 +typeset opts="" + +while (( $i < ${#RW_FS_PROP[*]} )); do + opts="$opts -O ${RW_FS_PROP[$i]}" + (( i = i + 1 )) +done + +log_must $ZPOOL create $opts -f $TESTPOOL $DISKS +datasetexists $TESTPOOL || log_fail "zpool create $TESTPOOL fail." + +i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + propertycheck $TESTPOOL ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + (( i = i + 1 )) +done + +log_pass "'zpool create -O property=value pool' can successfully create a pool \ + with multiple filesystem properties set." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_023_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_023_neg.ksh new file mode 100644 index 00000000000..889094e1616 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_023_neg.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_023_neg.ksh 1.1 09/05/19 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_023_neg +# +# DESCRIPTION: +# 'zpool create -O' should return an error with badly formed parameters. +# +# STRATEGY: +# 1. Create an array of parameters with '-O' +# 2. For each parameter in the array, execute 'zpool create -O' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-27) +# +# __stc_assertion_end +# +################################################################################ + +if ! $(check_zpool_opt_support "create" "-O") ; then + log_unsupported "-O option is not supported yet." +fi + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL +} + +log_onexit cleanup + +set -A args "QuOta=none" "quota=non" "quota=abcd" "quota=0" "quota=" \ + "ResErVaTi0n=none" "reserV=none" "reservation=abcd" "reserv=" \ + "recorDSize=64k" "recordsize=32M" "recordsize=256" \ + "recsize=" "recsize=zero" "recordsize=0" \ + "mountPoint=/tmp/tmpfile${TESTCASE_ID}" "mountpoint=non0" "mountpoint=" \ + "mountpoint=LEGACY" "mounpoint=none" \ + "sharenfs=ON" "ShareNFS=off" "sharenfs=sss" \ + "checkSUM=on" "checksum=SHA256" "chsum=off" "checksum=aaa" \ + "compression=of" "ComPression=lzjb" "compress=ON" "compress=a" \ + "atime=ON" "ATime=off" "atime=bbb" \ + "deviCes=on" "devices=OFF" "devices=aaa" \ + "exec=ON" "EXec=off" "exec=aaa" \ + "readonly=ON" "reADOnly=off" "rdonly=OFF" "rdonly=aaa" \ + "zoned=ON" "ZoNed=off" "zoned=aaa" \ + "snapdIR=hidden" "snapdir=VISible" "snapdir=aaa" \ + "aclmode=DIScard" "aclmODE=groupmask" "aclmode=aaa" \ + "aclinherit=deny" "aclinHerit=secure" "aclinherit=aaa" \ + "type=volume" "type=snapshot" "type=filesystem" \ + "creation=aaa" "used=10K" "available=10K" \ + "referenced=10K" "compressratio=1.00x" \ + "version=0" "version=1.234" "version=10K" "version=-1" \ + "version=aaa" "version=999" + +log_assert "'zpool create -O' should return an error with badly formed parameters." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL create -O ${args[i]} -f $TESTPOOL $DISKS + ((i = i + 1)) +done + +log_pass "'zpool create -O' should return an error with badly formed parameters." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_test.sh new file mode 100755 index 00000000000..068942dc472 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_create/zpool_create_test.sh @@ -0,0 +1,677 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_create_001_pos cleanup +zpool_create_001_pos_head() +{ + atf_set "descr" "'zpool create ...' can successfully createa new pool with a name in ZFS namespace." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_002_pos cleanup +zpool_create_002_pos_head() +{ + atf_set "descr" "'zpool create -f ...' can successfully createa new pool in some cases." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_003_pos cleanup +zpool_create_003_pos_head() +{ + atf_set "descr" "'zpool create -n ...' can display the configureationwithout actually creating the pool." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_004_pos cleanup +zpool_create_004_pos_head() +{ + atf_set "descr" "'zpool create [-f]' can create a storage pool with large numbers of vdevswithout any errors." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2400 +} +zpool_create_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_004_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_005_pos cleanup +zpool_create_005_pos_head() +{ + atf_set "descr" "'zpool create [-R root][-m mountpoint] ...' can createan alternate pool or a new pool mounted at the specified mountpoint." + atf_set "require.progs" zpool zfs + atf_set "timeout" 2400 +} +zpool_create_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_005_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_006_pos cleanup +zpool_create_006_pos_head() +{ + atf_set "descr" "Verify 'zpool create' succeed with keywords combination." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_006_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_007_neg cleanup +zpool_create_007_neg_head() +{ + atf_set "descr" "'zpool create' should return an error with badly-formed parameters." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_007_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_007_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_008_pos cleanup +zpool_create_008_pos_head() +{ + atf_set "descr" "'zpool create' have to use '-f' scenarios" + atf_set "require.progs" zpool format + atf_set "timeout" 2400 +} +zpool_create_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_008_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_009_neg cleanup +zpool_create_009_neg_head() +{ + atf_set "descr" "Create a pool with same devices twice or create two pools withsame devices, 'zpool create' should fail." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_009_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_010_neg cleanup +zpool_create_010_neg_head() +{ + atf_set "descr" "'zpool create' should return an error with VDEVs <64mb" + atf_set "require.progs" zfs zpool + atf_set "timeout" 2400 +} +zpool_create_010_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_010_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_011_neg cleanup +zpool_create_011_neg_head() +{ + atf_set "descr" "'zpool create' should be failed with inapplicable scenarios." + atf_set "require.progs" dumpadm zpool + atf_set "timeout" 2400 +} +zpool_create_011_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_011_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_011_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_012_neg cleanup +zpool_create_012_neg_head() +{ + atf_set "descr" "'zpool create' should fail with disk slice in swap." + atf_set "require.progs" zpool swap + atf_set "timeout" 2400 +} +zpool_create_012_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_012_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_012_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_013_neg cleanup +zpool_create_013_neg_head() +{ + atf_set "descr" "'zpool create' should fail with metadevice in swap." + atf_set "require.progs" metadb metaclear metastat zpool metainit swap + atf_set "timeout" 2400 +} +zpool_create_013_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_013_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_013_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_014_neg cleanup +zpool_create_014_neg_head() +{ + atf_set "descr" "'zpool create' should fail with regular file in swap." + atf_set "require.progs" zfs swap zpool + atf_set "timeout" 2400 +} +zpool_create_014_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_014_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_014_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_015_neg cleanup +zpool_create_015_neg_head() +{ + atf_set "descr" "'zpool create' should fail with zfs vol device in swap." + atf_set "require.progs" zfs zpool swap + atf_set "timeout" 2400 +} +zpool_create_015_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_015_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_015_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_016_pos cleanup +zpool_create_016_pos_head() +{ + atf_set "descr" "'zpool create' should success with no device in swap." + atf_set "require.progs" dumpadm swapadd zpool swap + atf_set "timeout" 2400 +} +zpool_create_016_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_016_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_016_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_017_neg cleanup +zpool_create_017_neg_head() +{ + atf_set "descr" "'zpool create' should fail with mountpoint exists and not empty." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_017_neg_body() +{ + [ `uname -s` = "FreeBSD" ] && atf_skip "FreeBSD does not consider creating pools on non-empty mountpoints a bug" + + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_017_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_017_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_018_pos cleanup +zpool_create_018_pos_head() +{ + atf_set "descr" "zpool create can create pools with specified properties" + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_018_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_018_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_018_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_019_pos cleanup +zpool_create_019_pos_head() +{ + atf_set "descr" "zpool create cannot create pools specifying readonly properties" + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_019_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_019_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_019_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_020_pos cleanup +zpool_create_020_pos_head() +{ + atf_set "descr" "zpool create -R works as expected" + atf_set "require.progs" zfs zpool + atf_set "timeout" 2400 +} +zpool_create_020_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_020_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_020_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_021_pos cleanup +zpool_create_021_pos_head() +{ + atf_set "descr" "'zpool create -O property=value pool' can successfully create a poolwith correct filesystem property set." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_021_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_021_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_021_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_022_pos cleanup +zpool_create_022_pos_head() +{ + atf_set "descr" "'zpool create -O property=value pool' can successfully create a poolwith multiple filesystem properties set." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_022_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_022_pos.ksh || atf_fail "Testcase failed" +} +zpool_create_022_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_023_neg cleanup +zpool_create_023_neg_head() +{ + atf_set "descr" "'zpool create -O' should return an error with badly formed parameters." + atf_set "require.progs" zpool + atf_set "timeout" 2400 +} +zpool_create_023_neg_body() +{ + atf_expect_fail 'kern/221987 - ZFS does not validate the sharenfs parameter' + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_create_023_neg.ksh || atf_fail "Testcase failed" +} +zpool_create_023_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_create.kshlib + . $(atf_get_srcdir)/zpool_create.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_create_001_pos + atf_add_test_case zpool_create_002_pos + atf_add_test_case zpool_create_003_pos + atf_add_test_case zpool_create_004_pos + atf_add_test_case zpool_create_005_pos + atf_add_test_case zpool_create_006_pos + atf_add_test_case zpool_create_007_neg + atf_add_test_case zpool_create_008_pos + atf_add_test_case zpool_create_009_neg + atf_add_test_case zpool_create_010_neg + atf_add_test_case zpool_create_011_neg + atf_add_test_case zpool_create_012_neg + atf_add_test_case zpool_create_013_neg + atf_add_test_case zpool_create_014_neg + atf_add_test_case zpool_create_015_neg + atf_add_test_case zpool_create_016_pos + atf_add_test_case zpool_create_017_neg + atf_add_test_case zpool_create_018_pos + atf_add_test_case zpool_create_019_pos + atf_add_test_case zpool_create_020_pos + atf_add_test_case zpool_create_021_pos + atf_add_test_case zpool_create_022_pos + atf_add_test_case zpool_create_023_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/Makefile new file mode 100644 index 00000000000..05847ff4d95 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/Makefile @@ -0,0 +1,21 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_destroy +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_destroy_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh + +${PACKAGE}FILES+= zpool_destroy.cfg +${PACKAGE}FILES+= zpool_destroy_001_pos.ksh +${PACKAGE}FILES+= zpool_destroy_002_pos.ksh +${PACKAGE}FILES+= zpool_destroy_003_neg.ksh +${PACKAGE}FILES+= zpool_destroy_004_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/cleanup.ksh new file mode 100644 index 00000000000..496e5fce294 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/cleanup.ksh @@ -0,0 +1,33 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy.cfg new file mode 100644 index 00000000000..a073a558a50 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_destroy.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export DISK=${DISKS%% *} +export PART_SIZE=500m diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_001_pos.ksh new file mode 100644 index 00000000000..b4b608a5d92 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_001_pos.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_destroy_001_pos.ksh 1.7 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_destroy_001_pos +# +# DESCRIPTION: +# 'zpool destroy ' can successfully destroy the specified pool. +# +# STRATEGY: +# 1. Create a storage pool +# 2. Destroy the pool +# 3. Verify the is destroyed successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL2 + destroy_pool $TESTPOOL1 + destroy_pool $TESTPOOL + wipe_partition_table $DISK +} + +set -A datasets "$TESTPOOL" "$TESTPOOL2" + +log_assert "'zpool destroy ' can destroy a specified pool." + +log_onexit cleanup + +partition_disk $PART_SIZE $DISK 2 + +create_pool "$TESTPOOL" "${DISK}p1" +create_pool "$TESTPOOL1" "${DISK}p2" +log_must $ZFS create -s -V $VOLSIZE $TESTPOOL1/$TESTVOL +create_pool "$TESTPOOL2" "/dev/zvol/$TESTPOOL1/$TESTVOL" + +typeset -i i=0 +while (( i < ${#datasets[*]} )); do + log_must poolexists "${datasets[i]}" + log_must $ZPOOL destroy "${datasets[i]}" + log_mustnot poolexists "${datasets[i]}" + ((i = i + 1)) +done + +log_pass "'zpool destroy ' executes successfully" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_002_pos.ksh new file mode 100644 index 00000000000..fd0d405bf76 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_002_pos.ksh @@ -0,0 +1,122 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_destroy_002_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_destroy_002_pos +# +# DESCRIPTION: +# 'zpool destroy -f ' can forcely destroy the specified pool. +# +# STRATEGY: +# 1. Create a storage pool +# 2. Create some datasets within the pool +# 3. Change directory to any mountpoint of these datasets, +# Verify 'zpool destroy' without '-f' will fail. +# 4. 'zpool destroy -f' the pool +# 5. Verify the pool is destroyed successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + [[ -n $cwd ]] && log_must cd $cwd + + if [[ -d $TESTDIR ]]; then + ismounted $TESTDIR + (( $? == 0 )) && \ + log_must $UNMOUNT $TESTDIR + log_must $RM -rf $TESTDIR + fi + + destroy_pool $TESTPOOL +} + +set -A datasets "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTVOL" \ + +log_assert "'zpool destroy -f ' can forcely destroy the specified pool" + +log_onexit cleanup + +typeset cwd="" + +create_pool "$TESTPOOL" "$DISK" +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $MKDIR -p $TESTDIR +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +log_must $ZFS create $TESTPOOL/$TESTCTR +log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTFS1 +log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + +typeset -i i=0 +while (( $i < ${#datasets[*]} )); do + datasetexists "${datasets[i]}" || \ + log_fail "Create datasets fail." + ((i = i + 1)) +done + +cwd=$PWD +log_note "'zpool destroy' without '-f' will fail " \ + "while pool is busy." + +for dir in $TESTDIR /$TESTPOOL/$TESTCTR /$TESTPOOL/$TESTCTR/$TESTFS1 ; do + log_must cd $dir + log_mustnot $ZPOOL destroy $TESTPOOL + + # Need mount here, otherwise some dataset may be unmounted. + log_must $ZFS mount -a + + i=0 + while (( i < ${#datasets[*]} )); do + datasetexists "${datasets[i]}" || \ + log_fail "Dataset ${datasets[i]} removed unexpected." + ((i = i + 1)) + done +done + +destroy_pool $TESTPOOL +log_mustnot poolexists "$TESTPOOL" + +log_pass "'zpool destroy -f ' success." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_003_neg.ksh new file mode 100644 index 00000000000..92cf393cb2a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_003_neg.ksh @@ -0,0 +1,70 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_destroy_003_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_destroy_003_neg +# +# DESCRIPTION: +# 'zpool destroy' should return an error with badly formed parameters, +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool destroy' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +set -A args "" "-f" "-? $TESTPOOL" "nonexistent_pool" \ + "$TESTPOOL abcd" "abcd $TESTPOOL" + +log_assert "'zpool destroy' should return an error with badly-formed parameters." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL destroy ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool destroy' badly formed parameters fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_004_pos.ksh new file mode 100644 index 00000000000..17c1b90e12d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_004_pos.ksh @@ -0,0 +1,146 @@ +#!/usr/local/bin/ksh93 -p +# +# Copyright 2015 Spectra Logic Corporation. +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_destroy_004_pos +# +# DESCRIPTION: +# 'zpool destroy -f ' can forcibly destroy the specified pool, +# even if that pool has running zfs send or receive activity. +# +# STRATEGY: +# 1. Create a storage pool +# 2. For each sleep time in a set: +# 2a. For each destroy type (same pool, sender only, receiver only): +# - Create a dataset with some amount of data +# - Run zfs send | zfs receive in the background. +# - Sleep the amount of time specified for this run. +# - 'zpool destroy -f' the pool. +# - Wait for the send|receive to exit. It must not be killed in +# order to ensure that the destroy takes care of doing so. +# - Verify the pool destroyed successfully +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && destroy_pool $TESTPOOL + poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1 +} + +function create_sender +{ + cleanup + create_pool "$TESTPOOL" "$DISK0" + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $MKDIR -p $TESTDIR + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must dd if=/dev/zero of=$TESTDIR/f0 bs=1024k count=$datasz + log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap1 +} + +function create_sender_and_receiver +{ + create_sender + create_pool "$TESTPOOL1" "$DISK1" +} + +function send_recv_destroy +{ + sleeptime=$1 + recv=$2 + to_destroy=$3 + who_to_destroy="$4" + + # The pid of this pipe line is that of zfs receive + # + ( $ZFS send -RP $TESTPOOL/$TESTFS@snap1 | $ZFS receive -Fu $recv/d1 ) & + sndrcv_start=$(date '+%s') + rcvpid=$! + sndpid=$(pgrep -P $rcvpid) + + log_must sleep $sleeptime + log_note "post sleep: $(ps -p ${sndpid},${rcvpid} -o command)" + + destroy_start=$(date '+%s') + log_must $ZPOOL destroy -f $to_destroy + destroy_end=$(date '+%s') + dtime=$((destroy_end - destroy_start)) + log_note "Destroy of $who_to_destroy took ${dtime} seconds." + + log_note "post destroy: $(ps -p ${sndpid},${rcvpid} -o command)" + + # Wait for send and recv to exit. + # + wait $sndpid + snderr=$? + wait $rcvpid + rcverr=$? + wait_end=$(date '+%s') + wtime=$((wait_end - sndrcv_start)) + log_note "send|receive took ${wtime} seconds to finish." + + # KSH: "wait pid" exit status of 127 means that process never existed + # or already completed; ksh's wait only returns the status of the + # child process if the child was running when the wait was issued. + # Therefore, we can not imply much about the interruption of the + # send | recv by zpool destroy -f + # + # The real test of success is simply that the pool was destroyed. + # + log_note \ + "Destruction of ${who_to_destroy}: send ${snderr}, recv ${rcverr}" + + log_mustnot $ZPOOL list $to_destroy +} + +function run_tests +{ + log_note "TEST: send|receive to the same pool" + create_sender + send_recv_destroy $sleeptime $TESTPOOL $TESTPOOL SAME_POOL + + log_note "TEST: send|receive to different pools, destroy sender" + create_sender_and_receiver + send_recv_destroy $sleeptime $TESTPOOL1 $TESTPOOL SENDER + + log_note "TEST: send|receive to different pools, destroy receiver" + create_sender_and_receiver + send_recv_destroy $sleeptime $TESTPOOL1 $TESTPOOL1 RECEIVER +} + +log_assert "'zpool destroy -f ' can force destroy active pool" +log_onexit cleanup +set_disks + +# Faster tests using 1GB data size +datasz=1000 +log_note "Running fast tests with 1000MB of data" +for sleeptime in 0.1 0.3 0.5 0.75 1 2 3; do + run_tests +done + +# A longer test that simulates a more realistic send|receive that exceeds +# the size of arc memory by 1/3 and gets interrupted a decent amount of +# time after the start of the run. +arcmem=$(sysctl -n vfs.zfs.arc_max) +# ARC will use 2xdatasz memory since it caches both the src and dst copies +datasz=$((arcmem / 1048576 * 2 / 3)) +log_note "Running longer test with ${datasz}MB of data" +sleeptime=15 +run_tests + +log_pass "'zpool destroy -f ' successful with active pools." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_test.sh new file mode 100755 index 00000000000..d24c16e4a21 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_destroy/zpool_destroy_test.sh @@ -0,0 +1,129 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_destroy_001_pos cleanup +zpool_destroy_001_pos_head() +{ + atf_set "descr" "'zpool destroy ' can destroy a specified pool." + atf_set "require.progs" zfs zpool +} +zpool_destroy_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_destroy.cfg + + verify_zvol_recursive + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/zpool_destroy_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_destroy_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_destroy_002_pos cleanup +zpool_destroy_002_pos_head() +{ + atf_set "descr" "'zpool destroy -f ' can forcely destroy the specified pool" + atf_set "require.progs" zfs zpool +} +zpool_destroy_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_destroy.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/zpool_destroy_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_destroy_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_destroy_003_neg cleanup +zpool_destroy_003_neg_head() +{ + atf_set "descr" "'zpool destroy' should return an error with badly-formed parameters." + atf_set "require.progs" zpool +} +zpool_destroy_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_destroy.cfg + + ksh93 $(atf_get_srcdir)/zpool_destroy_003_neg.ksh || atf_fail "Testcase failed" +} +zpool_destroy_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_destroy_004_pos cleanup +zpool_destroy_004_pos_head() +{ + atf_set "descr" "'zpool destroy -f' should work on active pools." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2000 +} +zpool_destroy_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_destroy.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/zpool_destroy_004_pos.ksh || atf_fail "Testcase failed" +} +zpool_destroy_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_destroy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_destroy_001_pos + atf_add_test_case zpool_destroy_002_pos + atf_add_test_case zpool_destroy_003_neg + atf_add_test_case zpool_destroy_004_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/Makefile new file mode 100644 index 00000000000..087f0d6aa62 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_detach +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_detach_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_detach.cfg +${PACKAGE}FILES+= zpool_detach_001_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/cleanup.ksh new file mode 100644 index 00000000000..b5a6a6c0f9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/setup.ksh new file mode 100644 index 00000000000..e4db7febd63 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach.cfg new file mode 100644 index 00000000000..68a9c850205 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_detach.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach_001_neg.ksh new file mode 100644 index 00000000000..c8e9be414ff --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach_001_neg.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_detach_001_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_detach_001_neg +# +# DESCRIPTION: +# Executing 'zpool detach' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool detach' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-?" "-t fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" + +log_assert "Executing 'zpool detach' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL detach ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool detach' command with bad options failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach_test.sh new file mode 100755 index 00000000000..e33bf7f0e75 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_detach/zpool_detach_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_detach_001_neg cleanup +zpool_detach_001_neg_head() +{ + atf_set "descr" "Executing 'zpool detach' with bad options fails" + atf_set "require.progs" zpool +} +zpool_detach_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_detach.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_detach_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_detach_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_detach.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_detach_001_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/Makefile new file mode 100644 index 00000000000..d2f6f321446 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_expand +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_expand_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_expand_003_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_expand_002_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_expand.cfg +${PACKAGE}FILES+= zpool_expand_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/cleanup.ksh new file mode 100644 index 00000000000..dff86e31599 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/setup.ksh new file mode 100644 index 00000000000..3989fd70d79 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/setup.ksh @@ -0,0 +1,42 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +if ! pool_prop_exist "autoexpand"; then + log_unsupported "zpool autoexpand is not support on testing machine" +fi + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand.cfg new file mode 100644 index 00000000000..1cf5a8114fb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand.cfg @@ -0,0 +1,47 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_expand.cfg 1.1 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg +org_size=1g +exp_size=2g + +export org_size +export exp_size + +VFS=$TESTPOOL/$TESTFS +export VFS + +EX_1GB=1073741824 +EX_3GB=3221225472 + +export EX_1GB +export EX_3GB + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_001_pos.ksh new file mode 100644 index 00000000000..dd407aae371 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_001_pos.ksh @@ -0,0 +1,138 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_expand_001_pos.ksh 1.2 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zpool_expand_001_pos +# +# DESCRIPTION: +# Once zpool set autoexpand=on poolname, zpool can autoexpand by +# Dynamic LUN Expansion +# +# +# STRATEGY: +# 1) Create a pool +# 2) Create volume on top of the pool +# 3) Create pool by using the zvols and set autoexpand=on +# 4) Expand the vol size by 'zfs set volsize' +# 5) Check that the pool size was expanded +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + for i in 1 2 3; do + if datasetexists $VFS/vol$i; then + log_must $ZFS destroy $VFS/vol$i + fi + done +} + +log_onexit cleanup + +log_assert "zpool can be autoexpanded after set autoexpand=on on LUN expansion" + +for i in 1 2 3; do + log_must $ZFS create -V $org_size $VFS/vol$i +done + +for type in " " mirror raidz raidz2; do + + log_must $ZPOOL create -o autoexpand=on $TESTPOOL1 $type \ + /dev/zvol/$VFS/vol1 \ + /dev/zvol/$VFS/vol2 \ + /dev/zvol/$VFS/vol3 + + typeset autoexp=$(get_pool_prop autoexpand $TESTPOOL1) + if [[ $autoexp != "on" ]]; then + log_fail "zpool $TESTPOOL1 autoexpand should on but is $autoexp" + fi + + typeset prev_size=$(get_pool_prop size $TESTPOOL1) + + for i in 1 2 3; do + log_must $ZFS set volsize=$exp_size $VFS/vol$i + done + + $SYNC + $SLEEP 10 + $SYNC + + typeset expand_size=$(get_pool_prop size $TESTPOOL1) + + # check for zpool history for the pool size expansion + if [[ $type == "mirror" ]]; then + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "internal vdev online" | \ + $GREP "(+${EX_1GB})" >/dev/null 2>&1 + + if [[ $? -ne 0 ]] ; then + log_fail "pool $TESTPOOL1" \ + " is not autoexpand after LUN expansion" + fi + else + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "internal vdev online" | \ + $GREP "(+${EX_3GB})" >/dev/null 2>&1 + + if [[ $? -ne 0 ]] ; then + log_fail "pool $TESTPOOL1" \ + " is not autoexpand after LUN expansion" + fi + fi + + log_must $ZPOOL destroy $TESTPOOL1 + + for i in 1 2 3; do + log_must $ZFS set volsize=$org_size $VFS/vol$i + done + +done + +log_pass "zpool can be autoexpanded after set autoexpand=on on LUN expansion" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_002_pos.ksh new file mode 100644 index 00000000000..dabcbbe06a1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_002_pos.ksh @@ -0,0 +1,142 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_expand_002_pos.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zpool_expand_002_pos +# +# DESCRIPTION: +# After zpool online -e poolname zvol vdevs, zpool can autoexpand by +# Dynamic LUN Expansion +# +# +# STRATEGY: +# 1) Create a pool +# 2) Create volume on top of the pool +# 3) Create pool by using the zvols +# 4) Expand the vol size by zfs set volsize +# 5 Use zpool online -e to online the zvol vdevs +# 6) Check that the pool size was expaned +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + for i in 1 2 3; do + if datasetexists $VFS/vol$i; then + log_must $ZFS destroy $VFS/vol$i + fi + done +} + +log_onexit cleanup + +log_assert "zpool can expand after zpool online -e zvol vdevs on LUN expansion" + +for i in 1 2 3; do + log_must $ZFS create -V $org_size $VFS/vol$i +done + +for type in " " mirror raidz raidz2; do + log_must $ZPOOL create $TESTPOOL1 $type \ + /dev/zvol/$VFS/vol1 \ + /dev/zvol/$VFS/vol2 \ + /dev/zvol/$VFS/vol3 + + typeset autoexp=$(get_pool_prop autoexpand $TESTPOOL1) + if [[ $autoexp != "off" ]]; then + log_fail "zpool $TESTPOOL1 autoexpand should off but is $autoexp" + fi + + typeset prev_size=$(get_pool_prop size $TESTPOOL1) + + for i in 1 2 3; do + log_must $ZFS set volsize=$exp_size $VFS/vol$i + done + + for i in 1 2 3; do + log_must $ZPOOL online -e $TESTPOOL1 /dev/zvol/$VFS/vol$i + done + + $SYNC + $SLEEP 10 + $SYNC + + # check for zpool history for the pool size expansion + if [[ $type == " " || $type == "mirror" ]]; then + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "internal vdev online" | \ + $GREP "(+${EX_1GB})" >/dev/null 2>&1 + + if [[ $? -ne 0 ]]; then + log_fail "pool $TESTPOOL1" \ + " is not autoexpand after LUN expansion" + fi + else + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "internal vdev online" | \ + $GREP "(+${EX_3GB})" >/dev/null 2>&1 + + if [[ $? -ne 0 ]] ; then + log_fail "pool $TESTPOOL1" \ + " is not autoexpand after LUN expansion" + fi + fi + + typeset expand_size=$(get_pool_prop size $TESTPOOL1) + + log_must $ZPOOL destroy $TESTPOOL1 + + for i in 1 2 3; do + log_must $ZFS set volsize=$org_size $VFS/vol$i + done + +done + +log_pass "zpool can expand after zpool online -e zvol vdevs on LUN expansion" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_003_neg.ksh new file mode 100644 index 00000000000..5a7fa55a39d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_003_neg.ksh @@ -0,0 +1,128 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_expand_003_neg.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zpool_expand_003_neg +# +# Description: +# Once set zpool autoexpand=off, zpool can *NOT* autoexpand by +# Dynamic LUN Expansion +# +# +# STRATEGY: +# 1) Create a pool +# 2) Create volumes on top of the pool +# 3) Create pool by using the zvols and set autoexpand=off +# 4) Expand the vol size by zfs set volsize +# 5) Check that the pool size is not changed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + for i in 1 2 3; do + if datasetexists $VFS/vol$i; then + log_must $ZFS destroy $VFS/vol$i + fi + done +} + +log_onexit cleanup + +log_assert "zpool can not expand if set autoexpand=off after LUN expansion" + +for i in 1 2 3; do + log_must $ZFS create -V $org_size $VFS/vol$i +done + +for type in "" mirror raidz raidz2; do + log_must $ZPOOL create $TESTPOOL1 $type \ + /dev/zvol/$VFS/vol1 \ + /dev/zvol/$VFS/vol2 \ + /dev/zvol/$VFS/vol3 + + typeset autoexp=$(get_pool_prop autoexpand $TESTPOOL1) + if [[ $autoexp != "off" ]]; then + log_fail "zpool $TESTPOOL1 autoexpand should off but is $autoexp" + fi + + typeset prev_size=$(get_pool_prop size $TESTPOOL1) + + for i in 1 2 3; do + log_must $ZFS set volsize=$exp_size $VFS/vol$i + done + + $SYNC + $SLEEP 10 + $SYNC + + # check for zpool history for the pool size expansion + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "internal vdev online" >/dev/null 2>&1 + + if [[ $? -eq 0 ]]; then + log_fail "pool $TESTPOOL1" \ + " is not autoexpand after LUN expansion" + fi + + typeset expand_size=$(get_pool_prop size $TESTPOOL1) + + if [[ "$prev_size" != "$expand_size" ]]; then + log_fail "pool $TESTPOOL1 size changed after LUN expansion" + fi + + log_must $ZPOOL destroy $TESTPOOL1 + + for i in 1 2 3; do + log_must $ZFS set volsize=$org_size $VFS/vol$i + done + +done + +log_pass "zpool can not expand if set autoexpand=off after LUN expansion" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_test.sh new file mode 100755 index 00000000000..042c0b07e29 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_expand/zpool_expand_test.sh @@ -0,0 +1,110 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_expand_001_pos cleanup +zpool_expand_001_pos_head() +{ + atf_set "descr" "zpool can be autoexpanded after set autoexpand=on on LUN expansion" + atf_set "require.progs" zfs zpool +} +zpool_expand_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_expand.cfg + + verify_zvol_recursive + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_expand_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_expand_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_expand.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_expand_002_pos cleanup +zpool_expand_002_pos_head() +{ + atf_set "descr" "zpool can expand after zpool online -e zvol vdevs on LUN expansion" + atf_set "require.progs" zfs zpool +} +zpool_expand_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_expand.cfg + + verify_zvol_recursive + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_expand_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_expand_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_expand.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_expand_003_neg cleanup +zpool_expand_003_neg_head() +{ + atf_set "descr" "zpool can not expand if set autoexpand=off after LUN expansion" + atf_set "require.progs" zfs zpool +} +zpool_expand_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_expand.cfg + + verify_zvol_recursive + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_expand_003_neg.ksh || atf_fail "Testcase failed" +} +zpool_expand_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_expand.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_expand_001_pos + atf_add_test_case zpool_expand_002_pos + atf_add_test_case zpool_expand_003_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/Makefile new file mode 100644 index 00000000000..ebbeb662a76 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/Makefile @@ -0,0 +1,21 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_export +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_export_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_export.cfg +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_export_001_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_export_004_pos.ksh +${PACKAGE}FILES+= zpool_export_003_neg.ksh +${PACKAGE}FILES+= zpool_export_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export.cfg new file mode 100644 index 00000000000..baeafdc9778 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_export.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_001_pos.ksh new file mode 100644 index 00000000000..9f99c5cd356 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_001_pos.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_export_001_pos.ksh 1.3 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_export_001_pos +# +# DESCRIPTION: +# Exported pools should no longer be visible from 'zpool list'. +# Therefore, we export an existing pool and verify it cannot +# be accessed. +# +# STRATEGY: +# 1. Unmount the test directory. +# 2. Export the pool. +# 3. Verify the pool is no longer present in the list output. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset dir=$(get_device_dir $DISKS) + + datasetexists "$TESTPOOL/$TESTFS" || \ + log_must $ZPOOL import -d $dir $TESTPOOL + + ismounted "$TESTPOOL/$TESTFS" + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +log_assert "Verify a pool can be exported." + +log_must $ZFS umount $TESTDIR +log_must $ZPOOL export $TESTPOOL + +poolexists $TESTPOOL && \ + log_fail "$TESTPOOL unexpectedly found in 'zpool list' output." + +log_pass "Successfully exported a ZPOOL." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_002_pos.ksh new file mode 100644 index 00000000000..dd4b3bb6350 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_002_pos.ksh @@ -0,0 +1,94 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_export_002_pos.ksh 1.3 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_export_002_pos +# +# DESCRIPTION: +# The 'zpool export' command must fail when a pool is +# busy i.e. mounted. +# +# STRATEGY: +# 1. Try and export the default pool when mounted and busy. +# 2. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset dir=$(get_device_dir $DISKS) + cd $olddir || \ + log_fail "Couldn't cd back to $olddir" + + datasetexists "$TESTPOOL/$TESTFS" || \ + log_must $ZPOOL import -d $dir $TESTPOOL + + ismounted "$TESTPOOL/$TESTFS" + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS + + [[ -e $TESTDIR/$TESTFILE0 ]] && \ + log_must $RM -rf $TESTDIR/$TESTFILE0 +} + +olddir=$PWD + +log_onexit cleanup + +log_assert "Verify a busy ZPOOL cannot be exported." + +ismounted "$TESTPOOL/$TESTFS" +(( $? != 0 )) && \ + log_fail "$TESTDIR not mounted. Unable to continue." + +cd $TESTDIR || \ + log_fail "Couldn't cd to $TESTDIR" + +log_mustnot $ZPOOL export $TESTPOOL + +poolexists $TESTPOOL || \ + log_fail "$TESTPOOL not found in 'zpool list' output." + +log_pass "Unable to export a busy ZPOOL as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_003_neg.ksh new file mode 100644 index 00000000000..9a5f793bd87 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_003_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_export_003_neg.ksh 1.2 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_export_003_neg +# +# DESCRIPTION: +# 'zpool export' should return an error with badly formed parameters, +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool export' +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + typeset dir=$(get_device_dir $DISKS) + datasetexists "$TESTPOOL/$TESTFS" || \ + log_must $ZPOOL import -d $dir $TESTPOOL + + ismounted "$TESTPOOL/$TESTFS" + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +set -A args "" "-f" "-? $TESTPOOL" "-QWERTYUIO $TESTPOOL" + +log_assert "'zpool export' should return an error with badly-formed parameters." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL export ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool export' badly formed parameters fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_004_pos.ksh new file mode 100644 index 00000000000..1df52d9ac91 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_004_pos.ksh @@ -0,0 +1,117 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_export_004_pos.ksh 1.2 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_export_004_pos +# +# DESCRIPTION: +# Verify zpool export succeed or fail with spare. +# +# STRATEGY: +# 1. Create two mirror pools with same spare. +# 2. Verify zpool export one pool succeed. +# 3. Import the pool. +# 4. Replace one device with the spare and detach it in one pool. +# 5. Verify zpool export the pool succeed. +# 6. Import the pool. +# 7. Replace one device with the spare in one pool. +# 8. Verify zpool export the pool fail. +# 9. Verify zpool export the pool with "-f" succeed. +# 10. Import the pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-03-10) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + restart_zfsd + + mntpnt=$(get_prop mountpoint $TESTPOOL) + datasetexists $TESTPOOL1 || log_must $ZPOOL import -d $mntpnt $TESTPOOL1 + datasetexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + datasetexists $TESTPOOL2 && destroy_pool $TESTPOOL2 + typeset -i i=0 + while ((i < 5)); do + if [[ -e $mntpnt/vdev$i ]]; then + log_must $RM -f $mntpnt/vdev$i + fi + ((i += 1)) + done +} + + +log_assert "Verify zpool export succeed or fail with spare." +log_onexit cleanup +# Stop ZFSD because it interferes with our manually activated spares +stop_zfsd + +mntpnt=$(get_prop mountpoint $TESTPOOL) + +typeset -i i=0 +while ((i < 5)); do + log_must create_vdevs $mntpnt/vdev$i + eval vdev$i=$mntpnt/vdev$i + ((i += 1)) +done + +log_must $ZPOOL create $TESTPOOL1 mirror $vdev0 $vdev1 spare $vdev4 +log_must $ZPOOL create $TESTPOOL2 mirror $vdev2 $vdev3 spare $vdev4 + +log_must $ZPOOL export $TESTPOOL1 +log_must $ZPOOL import -d $mntpnt $TESTPOOL1 + +log_must $ZPOOL replace $TESTPOOL1 $vdev0 $vdev4 +log_must $ZPOOL detach $TESTPOOL1 $vdev4 +log_must $ZPOOL export $TESTPOOL1 +log_must $ZPOOL import -d $mntpnt $TESTPOOL1 + +log_must $ZPOOL replace $TESTPOOL1 $vdev0 $vdev4 +log_mustnot $ZPOOL export $TESTPOOL1 + +log_must $ZPOOL export -f $TESTPOOL1 +log_must $ZPOOL import -d $mntpnt $TESTPOOL1 + +log_pass "Verify zpool export succeed or fail with spare." + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_test.sh new file mode 100755 index 00000000000..cfb49d1f8b5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_export/zpool_export_test.sh @@ -0,0 +1,132 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_export_001_pos cleanup +zpool_export_001_pos_head() +{ + atf_set "descr" "Verify a pool can be exported." + atf_set "require.progs" zfs zpool +} +zpool_export_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_export.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_export_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_export_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_export.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_export_002_pos cleanup +zpool_export_002_pos_head() +{ + atf_set "descr" "Verify a busy ZPOOL cannot be exported." + atf_set "require.progs" zfs zpool +} +zpool_export_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_export.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_export_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_export_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_export.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_export_003_neg cleanup +zpool_export_003_neg_head() +{ + atf_set "descr" "'zpool export' should return an error with badly-formed parameters." + atf_set "require.progs" zfs zpool +} +zpool_export_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_export.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_export_003_neg.ksh || atf_fail "Testcase failed" +} +zpool_export_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_export.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_export_004_pos cleanup +zpool_export_004_pos_head() +{ + atf_set "descr" "Verify zpool export succeed or fail with spare." + atf_set "require.progs" zpool +} +zpool_export_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_export.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_export_004_pos.ksh || atf_fail "Testcase failed" +} +zpool_export_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_export.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_export_001_pos + atf_add_test_case zpool_export_002_pos + atf_add_test_case zpool_export_003_neg + atf_add_test_case zpool_export_004_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/Makefile new file mode 100644 index 00000000000..bbf123b85a6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/Makefile @@ -0,0 +1,21 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_get +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_get_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_get_002_pos.ksh +${PACKAGE}FILES+= zpool_get_003_pos.ksh +${PACKAGE}FILES+= zpool_get.cfg +${PACKAGE}FILES+= zpool_get_001_pos.ksh +${PACKAGE}FILES+= zpool_get_004_neg.ksh +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/cleanup.ksh new file mode 100644 index 00000000000..9fdf9435910 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 08/05/14 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +verify_runnable "both" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/setup.ksh new file mode 100644 index 00000000000..05ab19d8b5e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/setup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 08/05/14 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib +verify_runnable "both" + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get.cfg new file mode 100644 index 00000000000..3f4ad97c6b6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get.cfg @@ -0,0 +1,71 @@ +#!/bin/ksh -p +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_get.cfg 1.6 09/06/22 SMI" +# + +# $FreeBSD$ + +# Set the expected properties of zpool +typeset -a properties=( + "size" + "capacity" + "altroot" + "health" + "guid" + "version" + "bootfs" + "delegation" + "autoreplace" + "cachefile" + "failmode" + "listsnapshots" + "autoexpand" + "dedupditto" + "dedupratio" + "free" + "allocated" + "readonly" + "comment" + "expandsize" + "freeing" + "fragmentation" + "leaked" + "feature@async_destroy" + "feature@empty_bpobj" + "feature@lz4_compress" + "feature@multi_vdev_crash_dump" + "feature@spacemap_histogram" + "feature@enabled_txg" + "feature@hole_birth" + "feature@extensible_dataset" + "feature@embedded_data" + "feature@bookmarks" + "feature@filesystem_limits" + "feature@large_blocks" + "feature@sha512" + "feature@skein" + # "feature@edonr" Edonr is not yet implemented on FreeBSD +) diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_001_pos.ksh new file mode 100644 index 00000000000..de3994b040c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_001_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_get_001_pos.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_get_001_pos +# +# DESCRIPTION: +# +# Zpool get usage message is displayed when called with no arguments +# +# STRATEGY: +# 1. Run zpool get +# 2. Check that exit status is set to 2 +# 3. Check usage message contains text "usage" +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-06) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "Zpool get usage message is displayed when called with no arguments." + +$ZPOOL get > /dev/null 2>&1 +RET=$? +if [ $RET != 2 ] +then + log_fail "\"zpool get\" exit status $RET should be equal to 2." +fi + +OUTPUT=$($ZPOOL get 2>&1 | $GREP -i usage) +RET=$? +if [ $RET != 0 ] +then + log_fail "Usage message for zpool get did not contain the word 'usage'." +fi + +log_pass "Zpool get usage message is displayed when called with no arguments." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_002_pos.ksh new file mode 100644 index 00000000000..8d79b54a5d7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_002_pos.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_get_002_pos.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_get/zpool_get.cfg + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_get_002_pos +# +# DESCRIPTION: +# +# zpool get all works as expected +# +# STRATEGY: +# +# 1. Using zpool get, retrieve all default values +# 2. Verify that the header is printed +# 3. Verify that we can see all the properties we expect to see +# 4. Verify that the total output contains just those properties + header. +# +# Test for those properties are expected to check whether their +# default values are sane, or whether they can be changed with zpool set. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "Zpool get all works as expected" + +typeset -i i=0; + +if ! is_global_zone ; then + TESTPOOL=${TESTPOOL%%/*} +fi + +log_must $ZPOOL get all $TESTPOOL +$ZPOOL get all $TESTPOOL > $TMPDIR/values.${TESTCASE_ID} + +log_note "Checking zpool get all output for a header." +$GREP ^"NAME " $TMPDIR/values.${TESTCASE_ID} > /dev/null 2>&1 +if [ $? -ne 0 ] +then + log_fail "The header was not printed from zpool get all" +fi + + +while [ $i -lt "${#properties[@]}" ] +do + log_note "Checking for ${properties[$i]} property" + $GREP "$TESTPOOL *${properties[$i]}" $TMPDIR/values.${TESTCASE_ID} > /dev/null 2>&1 + if [ $? -ne 0 ] + then + log_fail "zpool property ${properties[$i]} was not found\ + in pool output." + fi + i=$(( $i + 1 )) +done + +# increment the counter to include the header line +i=$(( $i + 1 )) + +COUNT=$($WC $TMPDIR/values.${TESTCASE_ID} | $AWK '{print $1}') +if [ $i -ne $COUNT ] +then + log_fail "Length of output $COUNT was not equal to number of props + 1." +fi + + + +$RM $TMPDIR/values.${TESTCASE_ID} +log_pass "Zpool get all works as expected" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_003_pos.ksh new file mode 100644 index 00000000000..0c1166a29b8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_003_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_get_003_pos.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_get/zpool_get.cfg + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_get_003_pos +# +# DESCRIPTION: +# +# Zpool get returns values for all known properties +# +# STRATEGY: +# 1. For all properties, verify zpool get retrieves a value +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "Zpool get returns values for all known properties" + +if ! is_global_zone ; then + TESTPOOL=${TESTPOOL%%/*} +fi + +typeset -i i=0; + +while [ $i -lt "${#properties[@]}" ] +do + log_note "Checking for ${properties[$i]} property" + log_must eval "$ZPOOL get ${properties[$i]} $TESTPOOL > $TMPDIR/value.${TESTCASE_ID}" + $GREP "${properties[$i]}" $TMPDIR/value.${TESTCASE_ID} > /dev/null 2>&1 + if [ $? -ne 0 ] + then + log_fail "${properties[$i]} not seen in output" + fi + $GREP "^NAME " $TMPDIR/value.${TESTCASE_ID} > /dev/null 2>&1 + # only need to check this once. + if [ $i -eq 0 ] && [ $? -ne 0 ] + then + log_fail "Header not seen in zpool get output" + fi + i=$(( $i + 1 )) +done + +$RM $TMPDIR/value.${TESTCASE_ID} +log_pass "Zpool get returns values for all known properties" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_004_neg.ksh new file mode 100644 index 00000000000..5d8ce214c40 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_004_neg.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_get_004_neg.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_get_004_neg +# +# DESCRIPTION: +# +# Malformed zpool get commands are rejected +# +# STRATEGY: +# +# 1. Run several different "zpool get" commands that should fail. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "Malformed zpool get commands are rejected" + +if ! is_global_zone ; then + TESTPOOL=${TESTPOOL%%/*} +fi + +set -A arguments "$TESTPOOL $TESTPOOL" "$TESTPOOL rubbish" "-v $TESTPOOL" \ + "nosuchproperty $TESTPOOL" "--$TESTPOOL" "all all" \ + "type $TESTPOOL" "usage: $TESTPOOL" "bootfs $TESTPOOL@" \ + "bootfs,bootfs $TESTPOOL" "name $TESTPOOL" "t%d%s" \ + "bootfs,delegation $TESTPOOL" "delegation $TESTPOOL@" + +for arg in $arguments +do + log_mustnot $ZPOOL get $arg +done + +log_pass "Malformed zpool get commands are rejected" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_test.sh new file mode 100755 index 00000000000..ddd29e8b098 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_get/zpool_get_test.sh @@ -0,0 +1,130 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_get_001_pos cleanup +zpool_get_001_pos_head() +{ + atf_set "descr" "Zpool get usage message is displayed when called with no arguments." + atf_set "require.progs" zpool +} +zpool_get_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_get.cfg + + ksh93 $(atf_get_srcdir)/zpool_get_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_get_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_get_002_pos cleanup +zpool_get_002_pos_head() +{ + atf_set "descr" "Zpool get all works as expected" + atf_set "require.progs" zpool +} +zpool_get_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_get.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_get_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_get_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_get_003_pos cleanup +zpool_get_003_pos_head() +{ + atf_set "descr" "Zpool get returns values for all known properties" + atf_set "require.progs" zpool +} +zpool_get_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_get.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_get_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_get_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_get_004_neg cleanup +zpool_get_004_neg_head() +{ + atf_set "descr" "Malformed zpool get commands are rejected" + atf_set "require.progs" zpool +} +zpool_get_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_get.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_get_004_neg.ksh || atf_fail "Testcase failed" +} +zpool_get_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_get.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_get_001_pos + atf_add_test_case zpool_get_002_pos + atf_add_test_case zpool_get_003_pos + atf_add_test_case zpool_get_004_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_history/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/Makefile new file mode 100644 index 00000000000..8752b63ae34 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_history +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_history_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_history_001_neg.ksh +${PACKAGE}FILES+= zpool_history_002_pos.ksh +${PACKAGE}FILES+= zpool_history.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_history/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/cleanup.ksh new file mode 100644 index 00000000000..bd026cc21f5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +$ZPOOL history > /dev/null +(($? != 0)) && log_unsupported + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_history/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/setup.ksh new file mode 100644 index 00000000000..491e9e1fa03 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} +default_container_volume_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history.cfg new file mode 100644 index 00000000000..d189b0ed611 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history.cfg @@ -0,0 +1,30 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_001_neg.ksh new file mode 100644 index 00000000000..077ea783d9e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_001_neg.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_history_001_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_history_001_neg +# +# DESCRIPTION: +# Verify 'zpool history' can deal with non-existent pools and garbage +# to the command. +# +# STRATEGY: +# 1. Create pool, volume & snap +# 2. Verify 'zpool history' can cope with incorret arguments. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +snap=$TESTPOOL/$TESTFS@snap +clone=$TESTPOOL/clone + +set -A neg_opt "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTVOL" "-t $TESTPOOL" \ + "-v $TESTPOOL" "$snap" "$clone" "nonexist" "TESTPOOL" + +function cleanup +{ + datasetexists $clone && log_must $ZFS destroy $clone + datasetexists $snap && log_must $ZFS destroy $snap +} + +log_assert "Verify 'zpool history' can deal with non-existent pools and " \ + "garbage to the command." +log_onexit cleanup + +log_must $ZFS snapshot $snap +log_must $ZFS clone $snap $clone + +for opt in "${neg_opt[@]}"; do + log_mustnot eval "$ZPOOL history $opt > /dev/null" +done + +log_pass "'zpool history' command line negation test passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_002_pos.ksh new file mode 100644 index 00000000000..25233cef3f0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_002_pos.ksh @@ -0,0 +1,70 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_history_002_pos.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_history_002_pos +# +# DESCRIPTION: +# Verify zpool history can handle options [-il] correctly. +# +# STRATEGY: +# 1. Create varied combinations of option -i & -l. +# 2. Verify 'zpool history' can cope with these combination correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-11-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +$ZFS 2>&1 | $GREP "allow" > /dev/null +(($? != 0)) && log_unsupported + +log_assert "Verify zpool history can handle options [-il] correctly." + +options="-i -l -il -li -lil -ili -lli -iill -liil" + +for opt in $options; do + log_must eval "$ZPOOL history $opt $TESTPOOL > /dev/null 2>&1" +done + +log_pass "Verify zpool history can handle options [-il] passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_test.sh new file mode 100755 index 00000000000..6468f3b5e10 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_history/zpool_history_test.sh @@ -0,0 +1,82 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_history_001_neg cleanup +zpool_history_001_neg_head() +{ + atf_set "descr" "Verify 'zpool history' can deal with non-existent pools andgarbage to the command." + atf_set "require.progs" zfs zpool +} +zpool_history_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_history.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_history_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_history_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_history_002_pos cleanup +zpool_history_002_pos_head() +{ + atf_set "descr" "Verify zpool history can handle options [-il] correctly." + atf_set "require.progs" zfs zpool +} +zpool_history_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_history.cfg + + verify_disk_count "$DISK" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_history_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_history_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_history_001_neg + atf_add_test_case zpool_history_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/Makefile new file mode 100644 index 00000000000..8885c9a3983 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/Makefile @@ -0,0 +1,43 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_import +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_import_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_import_006_pos.ksh +${PACKAGE}FILES+= zpool_import_002_pos.ksh +${PACKAGE}FILES+= zpool_import_missing_003_pos.ksh +${PACKAGE}FILES+= zpool_import_all_001_pos.ksh +${PACKAGE}FILES+= zpool_import.cfg +${PACKAGE}FILES+= zpool_import_corrupt_001_pos.ksh +${PACKAGE}FILES+= zpool_import_destroyed_001_neg.ksh +${PACKAGE}FILES+= zpool_import_destroyed_002_neg.ksh +${PACKAGE}FILES+= zpool_import_012_pos.ksh +${PACKAGE}FILES+= zpool_import_013_neg.ksh +${PACKAGE}FILES+= zpool_import_007_pos.ksh +${PACKAGE}FILES+= zpool_import_003_pos.ksh +${PACKAGE}FILES+= zpool_import_rename_001_pos.ksh +${PACKAGE}FILES+= zpool_import_missing_002_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_import_010_pos.ksh +${PACKAGE}FILES+= zpool_import_014_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_import_011_neg.ksh +${PACKAGE}FILES+= zpool_import_missing_004_pos.ksh +${PACKAGE}FILES+= zpool_import_missing_005_pos.ksh +${PACKAGE}FILES+= zpool_import_005_pos.ksh +${PACKAGE}FILES+= zpool_import_009_neg.ksh +${PACKAGE}FILES+= zpool_import_missing_001_pos.ksh +${PACKAGE}FILES+= zpool_import_008_pos.ksh +${PACKAGE}FILES+= zpool_import_004_pos.ksh +${PACKAGE}FILES+= zpool_import.kshlib + +SUBDIR+= blockfiles + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/Makefile new file mode 100644 index 00000000000..4462afe8637 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/Makefile @@ -0,0 +1,12 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= README +${PACKAGE}FILES+= unclean_export.dat.bz2 + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/README b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/README new file mode 100644 index 00000000000..853afdfcdbf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/README @@ -0,0 +1,31 @@ +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +Unless otherwise noted, all files in this distribution are released +under the Common Development and Distribution License (CDDL). + +This directory contains compressed blockfiles for zpool import testing. diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/unclean_export.dat.bz2 b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/blockfiles/unclean_export.dat.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..a7e042b523dfe2b85ae62b82ed4ab98fd9c09462 GIT binary patch literal 14161 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/cleanup.ksh new file mode 100644 index 00000000000..c7da5449150 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/cleanup.ksh @@ -0,0 +1,62 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +for pool in "$TESTPOOL" "$TESTPOOL1"; do + datasetexists $pool/$TESTFS && \ + log_must $ZFS destroy -Rf $pool/$TESTFS + destroy_pool "$pool" +done + +ismounted $DEVICE_DIR ufs +(( $? == 0 )) && log_must $UMOUNT -f $DEVICE_DIR + +for dir in "$TESTDIR" "$TESTDIR1" "$DEVICE_DIR" ; do + [[ -d $dir ]] && \ + log_must $RM -rf $dir +done + +# recreate and destroy a zpool over the disks to restore the partitions to +# normal +case $DISK_COUNT in +0|1) + log_note "No disk devices to restore" + ;; +*) + log_must cleanup_devices $ZFS_DISK1 + log_must cleanup_devices $ZFS_DISK2 + ;; +esac + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/setup.ksh new file mode 100644 index 00000000000..d179e99dfdc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/setup.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.4 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +for dev in $ZFS_DISK1 $ZFS_DISK2 ; do + log_must cleanup_devices $dev +done + +typeset -i i=0 +if [[ $DISK_COUNT -lt 2 ]]; then + partition_disk $PART_SIZE $ZFS_DISK1 $GROUP_NUM +fi + +create_pool "$TESTPOOL" "$ZFSSIDE_DISK1" + +if [[ -d $TESTDIR ]]; then + $RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR + $MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR +fi + +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +# Limit the filesystem size to 32GiB; this should be sufficient. +(( MAXSECTS = 32 * 1024 * 1024 )) +NUMSECTS=`diskinfo ${ZFSSIDE_DISK2} | awk '{print $4}'` +if [[ $NUMSECTS -gt $MAXSECTS ]]; then + NUMSECTS=$MAXSECTS +fi + +$ECHO "y" | $NEWFS -s $NUMSECTS $ZFSSIDE_DISK2 >/dev/null 2>&1 +(( $? != 0 )) && + log_untested "Unable to setup a UFS file system" + +[[ ! -d $DEVICE_DIR ]] && \ + log_must $MKDIR -p $DEVICE_DIR + +log_must $MOUNT $ZFSSIDE_DISK2 $DEVICE_DIR + +i=0 +while (( i < $MAX_NUM )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$i + (( i = i + 1 )) +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import.cfg new file mode 100644 index 00000000000..2847fdf840f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import.cfg @@ -0,0 +1,135 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + + +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import.cfg 1.6 08/11/03 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg +. $STF_SUITE/include/libtest.kshlib + +set -A disk_array $(find_disks $DISKS) +case "${#disk_array[*]}" in +0) + # + # on stf_configure, disk_freelist returns empty. + # + DISK_COUNT=0 + ;; +1) + # We need to repartition the single disk to two slices. + DISK_COUNT=1 + ZFS_DISK1=${disk_array[0]} + ZFSSIDE_DISK1=${ZFS_DISK1}p1 + ZFS_DISK2=${disk_array[0]} + ZFSSIDE_DISK2=${ZFS_DISK2}p2 + ;; +*) + # We don't need to repartition anything + DISK_COUNT=2 + ZFS_DISK1=${disk_array[0]} + ZFSSIDE_DISK1=${ZFS_DISK1} + ZFS_DISK2=${disk_array[1]} + ZFSSIDE_DISK2=${ZFS_DISK2} + ;; +esac + +export DISK_COUNT ZFS_DISK1 ZFSSIDE_DISK1 ZFS_DISK2 ZFSSIDE_DISK2 + +export FS_SIZE=2gb +export FILE_SIZE=64m +export PART_SIZE=128m +export MAX_NUM=5 +export GROUP_NUM=3 +export DEVICE_DIR=${TMPDIR}/dev${TESTCASE_ID} +export BACKUP_DEVICE_DIR=/bakdev${TESTCASE_ID} +export DEVICE_FILE=disk +export DEVICE_ARCHIVE=${TMPDIR}/archive${TESTCASE_ID}.tar +# MYTESTFILE can be any file that exists and we have r access to +export MYTESTFILE=$STF_SUITE/include/default.cfg + +# NB: It's easier just to repeat the expansion patterns than to reuse. +for (( num=0 ; $num < $GROUP_NUM ; num += 1 )); do + eval export VDEV\${num}F="${DEVICE_FILE}${num}" + eval export VDEV\${num}="${DEVICE_DIR}/${DEVICE_FILE}${num}" + DEVICE_FILES="$DEVICE_FILES ${DEVICE_DIR}/${DEVICE_FILE}${num}" +done +export DEVICE_FILES +for (( num = GROUP_NUM ; $num < $MAX_NUM ; num += 1 )); do + eval export VDEV\${num}F="${DEVICE_FILE}${num}" + eval export VDEV\${num}="${DEVICE_DIR}/${DEVICE_FILE}${num}" +done + +export ALTER_ROOT=/alter${TESTCASE_ID} +export STF_TIMEOUT=2400 + +export ZPOOL_VERSION=$(get_zpool_version) + +# Version 1 pools +export ZPOOL_VERSION_1_FILES="zfs-pool-v1.dat" +export ZPOOL_VERSION_1_NAME="v1-pool" + +# Version 2 pools +export ZPOOL_VERSION_2_FILES="zfs-pool-v2.dat" +export ZPOOL_VERSION_2_NAME="v2-pool" + +# This is a v3 pool +export ZPOOL_VERSION_3_FILES="zfs-pool-v3.dat" +export ZPOOL_VERSION_3_NAME="v3-pool" + +# This is a v6 pool +export ZPOOL_VERSION_6_FILES="zfs-pool-v6.dat" +export ZPOOL_VERSION_6_NAME="v6-pool" + +# This is a v7 pool +export ZPOOL_VERSION_7_FILES="zfs-pool-v7.dat" +export ZPOOL_VERSION_7_NAME="v7-pool" + +# This is a v8 pool +export ZPOOL_VERSION_8_FILES="zfs-pool-v8.dat" +export ZPOOL_VERSION_8_NAME="v8-pool" + +# This statement builds up a list of configurations we should be able to +# upgrade, for each pool version. Once we've built this variable, we'll +# call the functions above for each value. +case $ZPOOL_VERSION in +6) + CONFIGS="6" + ;; +7) + CONFIGS="6 7" + ;; +8) + CONFIGS="6 7 8" + ;; +*) + # we should be able to upgrade pools of version 1, 2 & 3 + # but we should also log a note about the unknown pool version + CONFIGS="6 7 8" + ;; +esac +export CONFIGS diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import.kshlib new file mode 100644 index 00000000000..43ff35efa26 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import.kshlib @@ -0,0 +1,35 @@ +# vim: filetype=sh +# Common routines used by zpool_import*. + +# $FreeBSD$ + +function setup_missing_test_pool # +{ + typeset tvd_type=$1 + + setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 \ + "" $tvd_type + log_must $CP $MYTESTFILE $TESTDIR1/$TESTFILE0 + log_must $ZPOOL export $TESTPOOL1 +} + +function recreate_missing_files +{ + destroy_pool $TESTPOOL1 + log_must $RM -rf $DEVICE_DIR/* + for (( devnum=0 ; $devnum < $MAX_NUM ; devnum += 1 )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$devnum + done +} + +function cleanup_missing +{ + log_note "State of pools at the end of the test:" + poolexists $TESTPOOL1 && log_must $ZPOOL status $TESTPOOL1 + log_note "State of $DEVICE_DIR at the end of the test:" + log_cmd $ZPOOL import -d $DEVICE_DIR + destroy_pool $TESTPOOL1 + log_must $RM -rf $DEVICE_DIR/* + [[ -d $ALTER_ROOT ]] && log_must $RM -rf $ALTER_ROOT + [[ -d $BACKUP_DEVICE_DIR ]] && log_must $RM -rf $BACKUP_DEVICE_DIR +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_002_pos.ksh new file mode 100644 index 00000000000..4b0ac28b7eb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_002_pos.ksh @@ -0,0 +1,166 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_002_pos.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_002_pos +# +# DESCRIPTION: +# Verify that an exported pool cannot be imported +# more than once. +# +# STRATEGY: +# 1. Populate the default test directory and unmount it. +# 2. Export the default test pool. +# 3. Import it using the various combinations. +# - Regular import +# - Alternate Root Specified +# 4. Verify it shows up under 'zpool list'. +# 5. Verify it contains a file. +# 6. Attempt to import it for a second time. Verify this fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" +set -A options "" "-R $ALTER_ROOT" +set -A mtpts "$TESTDIR" "$TESTDIR1" + + +function cleanup +{ + typeset -i i=0 + while (( i < ${#pools[*]} )); do + poolexists ${pools[i]} && \ + log_must $ZPOOL export ${pools[i]} + + datasetexists "${pools[i]}/$TESTFS" || \ + log_must $ZPOOL import ${devs[i]} ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + + [[ -e ${mtpts[i]}/$TESTFILE0 ]] && \ + log_must $RM -rf ${mtpts[i]}/$TESTFILE0 + + ((i = i + 1)) + done + + cleanup_filesystem $TESTPOOL1 $TESTFS + + destroy_pool $TESTPOOL1 + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT +} + +log_onexit cleanup + +log_assert "Verify that an exported pool cannot be imported more than once." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +typeset -i j=0 +typeset basedir + +function inner_test +{ + typeset pool=$1 + typeset target=$2 + typeset devs=$3 + typeset opts=$4 + typeset mtpt=$5 + + log_must $ZPOOL import ${devs} ${opts} $target + log_must poolexists $pool + log_must ismounted $pool/$TESTFS + + basedir=$mtpt + [ -n "$opts" ] && basedir="$ALTER_ROOT/$mtpt" + + [ ! -e "$basedir/$TESTFILE0" ] && \ + log_fail "ERROR: $basedir/$TESTFILE0 missing after import." + + checksum2=$($SUM $basedir/$TESTFILE0 | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "ERROR: Checksums differ ($checksum1 != $checksum2)" + + log_mustnot $ZPOOL import $devs $target +} + +while (( i < ${#pools[*]} )); do + log_must $CP $MYTESTFILE ${mtpts[i]}/$TESTFILE0 + + log_must $ZFS umount ${mtpts[i]} + + j=0 + while (( j < ${#options[*]} )); do + typeset pool=${pools[i]} + typeset vdevdir="" + + log_must $ZPOOL export $pool + + [ "$pool" = "$TESTPOOL1" ] && vdevdir="$DEVICE_DIR" + guid=$(get_config $pool pool_guid $vdevdir) + log_must test -n "$guid" + log_note "Importing '$pool' by guid '$guid'" + inner_test $pool $guid "${devs[i]}" "${options[j]}" ${mtpts[i]} + + log_must $ZPOOL export $pool + + log_note "Importing '$pool' by name." + inner_test $pool $pool "${devs[i]}" "${options[j]}" ${mtpts[i]} + + ((j = j + 1)) + done + + ((i = i + 1)) + +done + +log_pass "Able to import exported pools and import only once." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_003_pos.ksh new file mode 100644 index 00000000000..0eda0eb794f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_003_pos.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_003_pos +# +# DESCRIPTION: +# Destroyed pools are not listed unless with -D option is specified. +# +# STRATEGY: +# 1. Create test pool A. +# 2. Destroy pool A. +# 3. Verify only 'import -D' can list pool A. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + log_must $RM $VDEV0 $VDEV1 +} + +log_assert "Destroyed pools are not listed unless with -D option is specified." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 +log_must $ZPOOL destroy $TESTPOOL1 + +# +# 'pool:' is the keywords of 'zpool import -D' output. +# +log_mustnot eval "$ZPOOL import -d $DEVICE_DIR | $GREP pool:" +log_must eval "$ZPOOL import -d $DEVICE_DIR -D | $GREP pool:" + +log_pass "Destroyed pool only can be listed with -D option." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_004_pos.ksh new file mode 100644 index 00000000000..7e7765e25e1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_004_pos.ksh @@ -0,0 +1,110 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_004_pos.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_004_pos +# +# DESCRIPTION: +# Destroyed pools devices was moved to another directory, it still can be +# imported correctly. +# +# STRATEGY: +# 1. Create test pool A with several devices. +# 2. Destroy pool A. +# 3. Move devices to another directory. +# 4. Verify 'zpool import -D' succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + log_must $RM -rf $DEVICE_DIR/* +} + +function perform_test +{ + target=$1 + + assert_pool_in_cachefile $TESTPOOL1 + log_must $ZPOOL destroy $TESTPOOL1 + + log_note "Devices was moved to different directories." + log_must $MKDIR -p $DEVICE_DIR/newdir1 $DEVICE_DIR/newdir2 + log_must $MV $VDEV1 $DEVICE_DIR/newdir1 + log_must $MV $VDEV2 $DEVICE_DIR/newdir2 + log_must $ZPOOL import -d $DEVICE_DIR/newdir1 -d $DEVICE_DIR/newdir2 \ + -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy -f $TESTPOOL1 + + log_note "Devices was moved to same directory." + log_must $MV $VDEV0 $DEVICE_DIR/newdir2 + log_must $MV $DEVICE_DIR/newdir1/* $DEVICE_DIR/newdir2 + log_must $ZPOOL import -d $DEVICE_DIR/newdir2 -D -f $target + log_must $ZPOOL destroy -f $TESTPOOL1 + + # Revert at the end so this test can be rerun. + log_must $MV $DEVICE_DIR/newdir2/$VDEV0F $VDEV0 + log_must $MV $DEVICE_DIR/newdir2/$VDEV1F $VDEV1 + log_must $MV $DEVICE_DIR/newdir2/$VDEV2F $VDEV2 +} + +log_assert "Destroyed pools devices was moved to another directory," \ + "it still can be imported correctly." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 $VDEV2 +log_note "Testing import by name '$TESTPOOL1'." +perform_test $TESTPOOL1 + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 $VDEV2 +log_must $ZPOOL status $TESTPOOL1 +log_must $ZDB -C $TESTPOOL1 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +log_note "Testing import by GUID '${guid}'." +perform_test $guid + +log_pass "Destroyed pools devices was moved, 'zpool import -D' passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_005_pos.ksh new file mode 100644 index 00000000000..fd46c965e2b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_005_pos.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_005_pos.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_005_pos +# +# DESCRIPTION: +# Destroyed pools devices was renamed, it still can be imported correctly. +# +# STRATEGY: +# 1. Create test pool A with several devices. +# 2. Destroy pool A and rename devices name. +# 3. Verify 'zpool import -D' succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "Destroyed pools devices was renamed, it still can be imported " \ + "correctly." +log_onexit cleanup + +function perform_test +{ + typeset target=$1 + + assert_pool_in_cachefile $TESTPOOL1 + log_must $ZPOOL destroy $TESTPOOL1 + + log_note "Testing some devices renamed in the same directory." + log_must $MV $VDEV0 $DEVICE_DIR/vdev0-new + log_must $ZPOOL import -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy -f $TESTPOOL1 + + log_note "Testing all devices moved to different directories." + log_must $MKDIR -p $DEVICE_DIR/newdir1 $DEVICE_DIR/newdir2 + log_must $MV $VDEV1 $DEVICE_DIR/newdir1/vdev1-new + log_must $MV $VDEV2 $DEVICE_DIR/newdir2/vdev2-new + log_must $ZPOOL import -d $DEVICE_DIR/newdir1 -d $DEVICE_DIR/newdir2 \ + -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy -f $TESTPOOL1 + + # Restore the vdevs to their old location so this can be re-run + log_note "Restoring vdev files for any further runs." + log_must $MV $DEVICE_DIR/vdev0-new $VDEV0 + log_must $MV $DEVICE_DIR/newdir1/vdev1-new $VDEV1 + log_must $MV $DEVICE_DIR/newdir2/vdev2-new $VDEV2 +} + +log_note "Testing import by name." +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 $VDEV2 +perform_test $TESTPOOL1 + +log_note "Testing import by GUID." +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 $VDEV2 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +perform_test $guid + +log_pass "Destroyed pools devices was renamed, 'zpool import -D' passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_006_pos.ksh new file mode 100644 index 00000000000..ee8626ebb9c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_006_pos.ksh @@ -0,0 +1,107 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_006_pos.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_006_pos +# +# DESCRIPTION: +# For mirror, N-1 destroyed pools devices was removed or used by other +# pool, it still can be imported correctly. +# +# STRATEGY: +# 1. Create mirror with N disks. +# 2. Destroy this mirror. +# 3. Create another pool with N-1 disks which was used by this mirror. +# 4. Verify import mirror can succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL2 + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "For mirror, N-1 destroyed pools devices was removed or used " \ + "by other pool, it still can be imported correctly." +log_onexit cleanup + +function perform_test +{ + typeset target=$1 + + assert_pool_in_cachefile $TESTPOOL1 + log_must $ZPOOL destroy $TESTPOOL1 + + create_pool $TESTPOOL2 $VDEV0 $VDEV2 + log_must $ZPOOL import -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy $TESTPOOL1 + + log_must $ZPOOL destroy $TESTPOOL2 + log_must $RM -rf $VDEV2 + log_must $ZPOOL import -d $DEVICE_DIR -D -f $target + + # Restore the vdev. + log_must create_vdevs $VDEV2 +} + +log_note "Testing import by name." +create_pool $TESTPOOL1 mirror $VDEV0 $VDEV1 $VDEV2 +perform_test $TESTPOOL1 + +log_note "Testing import by GUID." +create_pool $TESTPOOL1 mirror $VDEV0 $VDEV1 $VDEV2 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +perform_test $guid + +log_pass "zpool import -D mirror passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_007_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_007_pos.ksh new file mode 100644 index 00000000000..ad03559f61d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_007_pos.ksh @@ -0,0 +1,111 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_007_pos.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_007_pos +# +# DESCRIPTION: +# For raidz, one destroyed pools devices was removed or used by other +# pool, it still can be imported correctly. +# +# STRATEGY: +# 1. Create a raidz pool A with N disks. +# 2. Destroy this pool A. +# 3. Create another pool B with 1 disk which was used by pool A. +# 4. Verify import this raidz pool can succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL2 + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "For raidz, one destroyed pools devices was removed or used by " \ + "other pool, it still can be imported correctly." +log_onexit cleanup + +function perform_test +{ + typeset target=$1 + + assert_pool_in_cachefile $TESTPOOL1 + log_must $ZPOOL destroy $TESTPOOL1 + + log_must $ZPOOL create $TESTPOOL2 $VDEV0 + log_must $ZPOOL import -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy $TESTPOOL1 + + log_must $ZPOOL destroy $TESTPOOL2 + log_must $RM -rf $VDEV0 + log_must $ZPOOL import -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy $TESTPOOL1 + + log_note "For raidz, two destroyed pool's devices were used, import failed." + log_must create_vdevs $VDEV0 + log_must $ZPOOL create $TESTPOOL2 $VDEV0 $VDEV1 + log_mustnot $ZPOOL import -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy $TESTPOOL2 +} + +log_note "Testing import by name." +log_must $ZPOOL create $TESTPOOL1 raidz $VDEV0 $VDEV1 $VDEV2 $VDEV3 +perform_test $TESTPOOL1 + +log_note "Testing import by GUID." +log_must $ZPOOL create $TESTPOOL1 raidz $VDEV0 $VDEV1 $VDEV2 $VDEV3 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +perform_test $guid + +log_pass "zpool import -D raidz passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_008_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_008_pos.ksh new file mode 100644 index 00000000000..96beb8af8de --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_008_pos.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_008_pos.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_008_pos +# +# DESCRIPTION: +# For raidz2, two destroyed pool's devices were removed or used by other +# pool, it still can be imported correctly. +# +# STRATEGY: +# 1. Create a raidz2 pool A with N disks. +# 2. Destroy this pool A. +# 3. Create another pool B with two disks which were used by pool A. +# 4. Verify import this raidz2 pool can succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL2 + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +function perform_test +{ + typeset target=$1 + + assert_pool_in_cachefile $TESTPOOL1 + log_must $ZPOOL destroy $TESTPOOL1 + + log_must $ZPOOL create $TESTPOOL2 $VDEV0 $VDEV1 + log_must $ZPOOL import -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy $TESTPOOL1 + + log_must $ZPOOL destroy $TESTPOOL2 + log_must $RM -rf $VDEV0 $VDEV1 + log_must $ZPOOL import -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy $TESTPOOL1 + + log_note "For raidz2, more than two destroyed pool's devices were used, " \ + "import failed." + log_must create_vdevs $VDEV0 $VDEV1 + log_must $ZPOOL create $TESTPOOL2 $VDEV0 $VDEV1 $VDEV2 + log_mustnot $ZPOOL import -d $DEVICE_DIR -D -f $target + log_must $ZPOOL destroy $TESTPOOL2 +} + +log_assert "For raidz2, two destroyed pools devices was removed or used by " \ + "other pool, it still can be imported correctly." +log_onexit cleanup + +log_note "Testing import by name." +log_must $ZPOOL create $TESTPOOL1 raidz2 $VDEV0 $VDEV1 $VDEV2 $VDEV3 +perform_test $TESTPOOL1 + +log_note "Testing import by GUID." +log_must $ZPOOL create $TESTPOOL1 raidz2 $VDEV0 $VDEV1 $VDEV2 $VDEV3 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +perform_test $guid + +log_pass "zpool import -D raidz2 passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_009_neg.ksh new file mode 100644 index 00000000000..2eda68fecd8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_009_neg.ksh @@ -0,0 +1,115 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_009_neg.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# __stc_assertion_start +# +# ID: zpool_import_009_neg +# +# DESCRIPTION: +# Try each 'zpool import' with inapplicable scenarios to make sure +# it returns an error. include: +# * A non-existent pool name is given +# * '-d', but no device directory specified +# * '-R', but no alter root directory specified +# * '-a', but a pool name specified either +# * more than 2 pool names is given +# * The new pool name specified already exists +# * Contain invalid characters not allowed in the ZFS namespace +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A args "blah" "-d" "-R" "-a $TESTPOOL" \ + "$TESTPOOL ${TESTPOOL}-new ${TESTPOOL}-new" \ + "$TESTPOOL $TESTPOOL1" \ + "$TESTPOOL ${TESTPOOL1}*" "$TESTPOOL ${TESTPOOL1}?" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" + +function cleanup +{ + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#pools[*]} )); do + + poolexists ${pools[i]} && \ + log_must $ZPOOL export ${pools[i]} + + datasetexists "${pools[i]}/$TESTFS" || \ + log_must $ZPOOL import ${devs[i]} ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + + ((i = i + 1)) + done + + cleanup_filesystem $TESTPOOL1 $TESTFS + + destroy_pool $TESTPOOL1 +} + +log_onexit cleanup + +log_assert "Badly-formed 'zpool import' with inapplicable scenarios " \ + "should return an error." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 + +log_must $ZPOOL export $TESTPOOL + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZPOOL import ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly formed 'zpool import' with inapplicable scenarios " \ + "fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_010_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_010_pos.ksh new file mode 100644 index 00000000000..be074b58f3b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_010_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_010_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_010_pos +# +# DESCRIPTION: +# 'zpool -D -a' can import all the specified directories destroyed pools. +# +# STRATEGY: +# 1. Create a 5 ways mirror pool A with dev0/1/2/3/4, then destroy it. +# 2. Create a stripe pool B with dev1. Then destroy it. +# 3. Create a raidz2 pool C with dev2/3/4. Then destroy it. +# 4. Create a raidz pool D with dev3/4. Then destroy it. +# 5. Create a stripe pool E with dev4. Then destroy it. +# 6. Verify 'zpool import -D -a' recover all the pools. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset dt + for dt in $poolE $poolD $poolC $poolB $poolA; do + destroy_pool $dt + done + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "'zpool -D -a' can import all the specified directories " \ + "destroyed pools." +log_onexit cleanup + +poolA=poolA.${TESTCASE_ID} +poolB=poolB.${TESTCASE_ID} +poolC=poolC.${TESTCASE_ID} +poolD=poolD.${TESTCASE_ID} +poolE=poolE.${TESTCASE_ID} + +log_must $ZPOOL create $poolA mirror $VDEV0 $VDEV1 $VDEV2 $VDEV3 $VDEV4 +log_must $ZPOOL destroy $poolA + +log_must $ZPOOL create $poolB $VDEV1 +log_must $ZPOOL destroy $poolB + +log_must $ZPOOL create $poolC raidz2 $VDEV2 $VDEV3 $VDEV4 +log_must $ZPOOL destroy $poolC + +log_must $ZPOOL create $poolD raidz $VDEV3 $VDEV4 +log_must $ZPOOL destroy $poolD + +log_must $ZPOOL create $poolE $VDEV4 +log_must $ZPOOL destroy $poolE + +log_must $ZPOOL import -d $DEVICE_DIR -D -f -a + +for dt in $poolA $poolB $poolC $poolD $poolE; do + log_must datasetexists $dt +done + +log_pass "'zpool -D -a' test passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_011_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_011_neg.ksh new file mode 100644 index 00000000000..6888d1c2a85 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_011_neg.ksh @@ -0,0 +1,94 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_011_neg.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_011_neg +# +# DESCRIPTION: +# For strip pool, any destroyed pool devices was demaged, zpool import -D +# will failed. +# +# STRATEGY: +# 1. Create strip pool A with three devices. +# 2. Destroy this pool B. +# 3. Create pool B with one of devices in step 1. +# 4. Verify 'import -D' pool A will failed whenever pool B was destroyed +# or not. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + destroy_pool $TESTPOOL2 + + # + # Recreate virtual devices to avoid destroyed pool information on files. + # + log_must $RM -rf $VDEV0 $VDEV1 $VDEV2 + log_must create_vdevs $VDEV0 $VDEV1 $VDEV2 +} + +log_assert "For strip pool, any destroyed pool devices was demaged," \ + "zpool import -D will failed." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 $VDEV2 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +typeset target=$TESTPOOL1 +if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." +fi +log_must $ZPOOL destroy $TESTPOOL1 +log_must $ZPOOL create $TESTPOOL2 $VDEV2 + +log_mustnot $ZPOOL import -d $DEVICE_DIR -D -f $target + +log_must $ZPOOL destroy $TESTPOOL2 +log_mustnot $ZPOOL import -d $DEVICE_DIR -D -f $target + +log_pass "Any strip pool devices damaged, pool can't be import passed." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_012_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_012_pos.ksh new file mode 100644 index 00000000000..65ca2af590a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_012_pos.ksh @@ -0,0 +1,194 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_012_pos.ksh 1.4 09/05/19 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_012_pos +# +# DESCRIPTION: +# Once a pool has been exported, it should be recreated after a +# successful import, all the sub-filesystems within it should all be restored, +# include mount & share status. Verify that is true. +# +# STRATEGY: +# 1. Create the test pool and hierarchical filesystems. +# 2. Export the test pool, or destroy the test pool, +# depend on testing import [-Df]. +# 3. Import it using the various combinations. +# - Regular import +# - Alternate Root Specified +# 4. Verify the mount & share status is restored. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-11-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" +set -A options "" "-R $ALTER_ROOT" +set -A mtpts "$TESTDIR" "$TESTDIR1" + + +function cleanup +{ + typeset -i i=0 + + while (( i < ${#pools[*]} )); do + if poolexists ${pools[i]} ; then + log_must $ZPOOL export ${pools[i]} + log_note "Try to import ${devs[i]} ${pools[i]}" + $ZPOOL import ${devs[i]} ${pools[i]} + else + log_note "Try to import $option ${devs[i]} ${pools[i]}" + $ZPOOL import $option ${devs[i]} ${pools[i]} + fi + + if poolexists ${pools[i]} ; then + is_shared ${pools[i]} && \ + log_must $ZFS set sharenfs=off ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + fi + + ((i = i + 1)) + done + + destroy_pool $TESTPOOL1 + + if datasetexists $TESTPOOL/$TESTFS ; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + fi + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT +} + +log_onexit cleanup + +log_assert "Verify all mount & share status of sub-filesystems within a pool \ + can be restored after import [-Df]." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 +for pool in ${pools[@]} ; do + log_must $ZFS create $pool/$TESTFS/$TESTCTR + log_must $ZFS create $pool/$TESTFS/$TESTCTR/$TESTCTR1 + log_must $ZFS set canmount=off $pool/$TESTFS/$TESTCTR + log_must $ZFS set canmount=off $pool/$TESTFS/$TESTCTR/$TESTCTR1 + log_must $ZFS create $pool/$TESTFS/$TESTCTR/$TESTFS1 + log_must $ZFS create $pool/$TESTFS/$TESTCTR/$TESTCTR1/$TESTFS1 + log_must $ZFS create $pool/$TESTFS/$TESTFS1 + log_must $ZFS snapshot $pool/$TESTFS/$TESTFS1@snap + log_must $ZFS clone $pool/$TESTFS/$TESTFS1@snap $pool/$TESTCLONE1 +done + +typeset mount_fs="$TESTFS $TESTFS/$TESTFS1 $TESTCLONE1 \ + $TESTFS/$TESTCTR/$TESTFS1 $TESTFS/$TESTCTR/$TESTCTR1/$TESTFS1" +typeset nomount_fs="$TESTFS/$TESTCTR $TESTFS/$TESTCTR/$TESTCTR1" + +typeset -i i=0 +typeset -i j=0 +typeset basedir + +for option in "" "-Df" ; do + i=0 + while (( i < ${#pools[*]} )); do + pool=${pools[i]} + guid=$(get_config $pool pool_guid) + j=0 + while (( j < ${#options[*]} )); do + typeset f_share="" + if ((RANDOM % 2 == 0)); then + log_note "Set sharenfs=on $pool" + log_must $ZFS set sharenfs=on $pool + log_must is_shared $pool + f_share="true" + fi + + if [[ -z $option ]]; then + log_must $ZPOOL export $pool + else + log_must $ZPOOL destroy $pool + fi + + typeset target=$pool + if (( RANDOM % 2 == 0 )) ; then + log_note "Import by guid." + if [[ -z $guid ]]; then + log_fail "guid should not be empty!" + else + target=$guid + fi + fi + log_must $ZPOOL import $option \ + ${devs[i]} ${options[j]} $target + + log_must poolexists $pool + + for fs in $mount_fs ; do + log_must ismounted $pool/$fs + [[ -n $f_share ]] && \ + log_must is_shared $pool/$fs + done + + for fs in $nomount_fs ; do + log_mustnot ismounted $pool/$fs + log_mustnot is_shared $pool/$fs + done + + if [[ -n $f_share ]] ; then + log_must $ZFS set sharenfs=off $pool + log_mustnot is_shared $pool + fi + + ((j = j + 1)) + done + + ((i = i + 1)) + done +done + +log_pass "All mount & share status of sub-filesystems within a pool \ + can be restored after import [-Df]." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_013_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_013_neg.ksh new file mode 100644 index 00000000000..91f3d59499b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_013_neg.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_013_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_013_neg +# +# DESCRIPTION: +# For pool may be in use from other system, +# 'zpool import' will prompt the warning and fails. +# +# STRATEGY: +# 1. Prepare rawfile that are created from other system. +# 2. Verify 'zpool import' will fail. +# 3. Verify 'zpool import -f' succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +POOL_NAME=unclean_export +POOL_FILE=unclean_export.dat + +function uncompress_pool +{ + log_note "Creating pool from $POOL_FILE" + log_must $BZCAT \ + $STF_SUITE/tests/cli_root/zpool_import/blockfiles/$POOL_FILE.bz2 \ + > $TMPDIR/$POOL_FILE + return 0 +} + +function cleanup +{ + poolexists $POOL_NAME && log_must zpool destroy $POOL_NAME + [[ -e $TMPDIR/$POOL_FILE ]] && rm $TMPDIR/$POOL_FILE + return 0 +} + +log_assert "'zpool import' fails for pool that was not cleanly exported" +log_onexit cleanup + +uncompress_pool +log_mustnot zpool import -d $TMPDIR $POOL_NAME +log_must zpool import -d $TMPDIR -f $POOL_NAME + +log_pass "'zpool import' fails for pool that was not cleanly exported" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_014_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_014_pos.ksh new file mode 100644 index 00000000000..71c084d70ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_014_pos.ksh @@ -0,0 +1,66 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_014_pos +# +# DESCRIPTION: +# "'zpool import' can import destroyed disk-backed pools" +# +# STRATEGY: +# 1. Create test pool A. +# 2. Destroy pool A. +# 3. Verify 'import -D' can import pool A. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2013-03-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Destroyed pools are not listed unless with -D option is specified." + +log_must $ZPOOL create $TESTPOOL ${DISKS[0]} +log_must $ZPOOL destroy $TESTPOOL +log_mustnot $ZPOOL import $TESTPOOL +log_must $ZPOOL import -D $TESTPOOL +log_must poolexists $TESTPOOL + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_all_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_all_001_pos.ksh new file mode 100644 index 00000000000..e1f4421c739 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_all_001_pos.ksh @@ -0,0 +1,238 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_all_001_pos.ksh 1.5 08/11/03 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_all_001_pos +# +# DESCRIPTION: +# Verify that 'zpool import -a' succeeds as root. +# +# STRATEGY: +# 1. Create a group of pools with specified vdev. +# 2. Create zfs filesystems within the given pools. +# 3. Export the pools. +# 4. Verify that import command succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A options "" "-R $ALTER_ROOT" + +typeset -i number=0 +typeset -i id=0 +typeset -i i=0 +typeset checksum1 +typeset unwantedpool + +function setup_single_disk #disk #pool #fs #mtpt +{ + typeset disk=$1 + typeset pool=$2 + typeset fs=${3##/} + typeset mtpt=$4 + + setup_filesystem "$disk" "$pool" "$fs" "$mtpt" + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE0 + + log_must $ZPOOL export $pool + + [[ -d $mtpt ]] && \ + $RM -rf $mtpt +} + +function cleanup_all +{ + typeset -i id=0 + + # + # Try import individually if 'import -a' failed. + # + for pool in `$ZPOOL import | $GREP "pool:" | $AWK '{print $2}'`; do + $ZPOOL import -f $pool + done + + for pool in `$ZPOOL import -d $DEVICE_DIR | $GREP "pool:" | $AWK '{print $2}'`; do + log_must $ZPOOL import -d $DEVICE_DIR -f $pool + done + + while (( id < number )); do + if ! poolexists ${TESTPOOL}-$id ; then + (( id = id + 1 )) + continue + fi + + if (( id == 0 )); then + log_must $ZPOOL export ${TESTPOOL}-$id + + [[ -d /${TESTPOOL}-$id ]] && \ + log_must $RM -rf /${TESTPOOL}-$id + + log_must $ZPOOL import -f ${TESTPOOL}-$id $TESTPOOL + + [[ -e $TESTDIR/$TESTFILE0 ]] && \ + log_must $RM -rf $TESTDIR/$TESTFILE0 + else + cleanup_filesystem "${TESTPOOL}-$id" $TESTFS + + destroy_pool ${TESTPOOL}-$id + fi + + (( id = id + 1 )) + done + + [[ -d $ALTER_ROOT ]] && \ + $RM -rf $ALTER_ROOT +} + +function checksum_all #alter_root +{ + typeset alter_root=$1 + typeset -i id=0 + typeset file + typeset checksum2 + + while (( id < number )); do + if (( id == 2 )); then + (( id = id + 1 )) + continue + fi + + if (( id == 0 )); then + file=${alter_root}/$TESTDIR/$TESTFILE0 + else + file=${alter_root}/$TESTDIR.$id/$TESTFILE0 + fi + [[ ! -e $file ]] && \ + log_fail "$file missing after import." + + checksum2=$($SUM $file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + (( id = id + 1 )) + done + + return 0 +} + + +log_assert "Verify that 'zpool import -a' succeeds as root." + +log_onexit cleanup_all + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +log_must $ZPOOL export $TESTPOOL +log_must $ZPOOL import $TESTPOOL ${TESTPOOL}-0 +log_must $CP $MYTESTFILE $TESTDIR/$TESTFILE0 +log_must $ZPOOL export ${TESTPOOL}-0 +[[ -d /${TESTPOOL}-0 ]] && \ + log_must $RM -rf /${TESTPOOL}-0 + +# +# setup exported pools on normal devices +# +number=1 +while (( number <= $GROUP_NUM )); do + if [[ `$UNAME -s` != "FreeBSD" ]]; then + if (( number == 2)); then + (( number = number + 1 )) + continue + fi + fi + set_partition $number "" $PART_SIZE ${ZFS_DISK2} + + setup_single_disk "${ZFS_DISK2}p${number}" \ + "${TESTPOOL}-$number" \ + "$TESTFS" \ + "$TESTDIR.$number" + + (( number = number + 1 )) +done + +# +# setup exported pools on raw files +# +for disk in $DEVICE_FILES +do + + setup_single_disk "$disk" \ + "${TESTPOOL}-$number" \ + "$TESTFS" \ + "$TESTDIR.$number" + + (( number = number + 1 )) +done + +while (( i < ${#options[*]} )); do + + log_must $ZPOOL import -d /dev -d $DEVICE_DIR ${options[i]} -a -f + + # destroy unintentional imported pools + typeset exclude=`eval $ECHO \"'(${KEEP})'\"` + for unwantedpool in $($ZPOOL list -H -o name \ + | $EGREP -v "$exclude" | $GREP -v $TESTPOOL); do + log_must $ZPOOL export $unwantedpool + done + + if [[ -n ${options[i]} ]]; then + checksum_all $ALTER_ROOT + else + checksum_all + fi + + id=0 + while (( id < number )); do + if poolexists ${TESTPOOL}-$id ; then + log_must $ZPOOL export ${TESTPOOL}-$id + fi + (( id = id + 1 )) + done + + (( i = i + 1 )) +done + +log_pass "'zpool import -a' succeeds as root." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_corrupt_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_corrupt_001_pos.ksh new file mode 100644 index 00000000000..01a1650ed9a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_corrupt_001_pos.ksh @@ -0,0 +1,130 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_014_pos +# +# DESCRIPTION: +# Verify that a disk-backed exported pool with some of its vdev labels +# corrupted can still be imported +# STRATEGY: +# 1. Create a disk-backed pool +# 2. Export it +# 3. Overwrite one or more of its vdev labels +# 4. Use zdb to verify that the labels are damaged +# 5. Verify 'zpool import' can import it +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2013-03-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +# ZFS has four vdev labels per vdev +typeset -i N_VDEV_LABELS=4 +# Size of a single label, in bytes +typeset -i VDEV_LABEL_SIZE=$(( 256 * 1024)) + + +# +# The authoritative version of this calculation can be found in the function of +# the same name in vdev_label.c. The rounding of psize is based on the +# calculation in vdev_disk_read_rootlabel in vdev_disk.c +# +# arg1: vdev size in bytes +# arg2: label index, 0 through 3 +# +function vdev_label_offset +{ + typeset -il psize=$1 + typeset -i l=$2 + typeset -il offset + typeset -il roundsize + + roundsize=$(( $psize & -$VDEV_LABEL_SIZE )) + if [[ $l -lt $(( N_VDEV_LABELS / 2 )) ]]; then + offset=$(( l * $VDEV_LABEL_SIZE)) + else + offset=$(( l * $VDEV_LABEL_SIZE + $roundsize - $N_VDEV_LABELS * $VDEV_LABEL_SIZE )) + fi + echo $offset +} + +log_assert "Verify that a disk-backed exported pool with some of its vdev labels corrupted can still be imported" + +typeset -i i +typeset -i j +set -A DISKS_ARRAY $DISKS +typeset DISK=${DISKS_ARRAY[0]} +typeset PROV=${DISK#/dev/} +typeset -il psize=$(geom disk list $PROV | awk '/Mediasize/ {print $2}') +if [[ -z $psize ]]; then + log_fail "Could not determine the capacity of $DISK" +fi + +for ((i=0; $i<$N_VDEV_LABELS; i=$i+1 )); do + log_must $ZPOOL create -f $TESTPOOL $DISK + log_must $ZPOOL export $TESTPOOL + + # Corrupt all labels except the ith + for ((j=0; $j<$N_VDEV_LABELS; j=$j+1 )); do + typeset -il offset + + [[ $i -eq $j ]] && continue + + log_note offset=vdev_label_offset $psize $j + offset=$(vdev_label_offset $psize $j) + log_must $DD if=/dev/zero of=$DISK bs=1024 \ + count=$(( $VDEV_LABEL_SIZE / 1024 )) \ + oseek=$(( $offset / 1024 )) \ + conv=notrunc + done + + typeset -i num_labels=$( $ZDB -l $DISK | $GREP pool_guid | wc -l ) + if [[ $num_labels -ne 1 ]]; then + $ZDB -l $DISK + log_fail "Expected 1 vdev label but found $num_labels" + fi + + log_must $ZPOOL import $TESTPOOL + destroy_pool $TESTPOOL +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_destroyed_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_destroyed_001_neg.ksh new file mode 100644 index 00000000000..1593fbfc224 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_destroyed_001_neg.ksh @@ -0,0 +1,66 @@ +#!/usr/local/bin/ksh93 +# +# Copyright (c) 2017 Spectra Logic Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer, +# without modification. +# 2. Redistributions in binary form must reproduce at minimum a disclaimer +# substantially similar to the "NO WARRANTY" disclaimer below +# ("Disclaimer") and any redistribution must be conditioned upon +# including a substantially similar Disclaimer requirement for further +# binary redistribution. +# +# NO WARRANTY +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGES. +# +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +set_disks + +# A destroyed pool cannot be imported, even if an out-of-date non-destroyed +# label is present +# +# This situation arose when a user activated a spare, removed the spare disk, +# destroyed the pool, reinserted the spare disk, and then tried to import the +# pool. Since the pool was destroyed, nothing should've happened. But the +# spare disk had a non-destroyed label, so zpool tried to import it. A panic +# ensued. +# +# More generally, this situation can happen any time the following things happen: +# 1) A disk gets removed with its label intact +# 2) The pool's configuration changes +# 3) The pool gets destroyed +# 4) Somebody tries to import the pool + +log_must $ZPOOL create -f $TESTPOOL mirror ${DISK0} ${DISK1} + +# Offline a disk so it's label won't get updated by the upcoming destroy +log_must $ZPOOL offline $TESTPOOL ${DISK0} + +# Now change the pool's configuration, so DISK0's label will be out-of-date +log_must $ZPOOL attach $TESTPOOL ${DISK1} ${DISK2} + +# Destroy the pool, so DISK1's and DISK2's labels will be in the destroyed +# state, leaving DISK0's label as the most recent non-destroyed label +log_must $ZPOOL destroy $TESTPOOL + +# Now try to import the pool. It should fail. +log_mustnot $ZPOOL import $TESTPOOL + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_destroyed_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_destroyed_002_neg.ksh new file mode 100644 index 00000000000..e6f4d049784 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_destroyed_002_neg.ksh @@ -0,0 +1,59 @@ +#!/usr/local/bin/ksh93 +# +# Copyright (c) 2017 Spectra Logic Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer, +# without modification. +# 2. Redistributions in binary form must reproduce at minimum a disclaimer +# substantially similar to the "NO WARRANTY" disclaimer below +# ("Disclaimer") and any redistribution must be conditioned upon +# including a substantially similar Disclaimer requirement for further +# binary redistribution. +# +# NO WARRANTY +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGES. +# +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +set_disks + +# "zpool import" will not show destroyed pools, even if out-of-date +# non-destroyed label is present +# +# This situation can happen any time the following things happen: +# 1) A disk gets removed with its label intact +# 2) The pool gets destroyed +# 3) Somebody run "zpool import" to see importable pools + +log_must $ZPOOL create -f $TESTPOOL mirror ${DISK0} ${DISK1} + +# Offline a disk so it's label won't get updated by the upcoming destroy +log_must $ZPOOL offline $TESTPOOL ${DISK0} + +# Destroy the pool, so DISK1's and DISK2's labels will be in the destroyed +# state, leaving DISK0's label as the most recent non-destroyed label +log_must $ZPOOL destroy $TESTPOOL + +# Now try to import the pool. It should fail. +if $ZPOOL import | $GREP -q $TESTPOOL; then + $ZPOOL import + log_fail "ERROR: Destroyed pool visible" +else + log_pass +fi diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_001_pos.ksh new file mode 100644 index 00000000000..aa224d5d5d8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_001_pos.ksh @@ -0,0 +1,171 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_missing_001_pos.ksh 1.4 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/cli_root/zpool_import/zpool_import.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_missing_001_pos +# +# DESCRIPTION: +# Once a pool has been exported, and one or more devices are +# damaged or missing (d/m), import should handle this kind of situation +# as described: +# - Regular, report error while any number of devices failing. +# - Mirror could withstand (N-1) devices failing +# before data integrity is compromised +# - Raidz could withstand one devices failing +# before data integrity is compromised +# Verify those are true. +# +# STRATEGY: +# 1. Create test pool upon device files using the various combinations. +# - Regular pool +# - Mirror +# - Raidz +# 2. Create necessary filesystem and test files. +# 3. Export the test pool. +# 4. Remove one or more devices +# 5. Verify 'zpool import' will handle d/m device successfully. +# Using the various combinations. +# - Regular import +# - Alternate Root Specified +# It should be succeed with single d/m device upon 'raidz' & 'mirror', +# but failed against 'regular' or more d/m devices. +# 6. If import succeed, verify following is true: +# - The pool shows up under 'zpool list'. +# - The pool's health should be DEGRADED. +# - It contains the correct test file +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A vdevs "" "mirror" "raidz" +set -A options "" "-R $ALTER_ROOT" + +function perform_inner_test +{ + typeset action=$1 + typeset import_opts=$2 + typeset target=$3 + typeset basedir + + $action $ZPOOL import -d $DEVICE_DIR ${import_opts} $target + [[ $action == "log_mustnot" ]] && return + + log_must poolexists $TESTPOOL1 + + health=$($ZPOOL list -H -o health $TESTPOOL1) + [[ "$health" == "DEGRADED" ]] || \ + log_fail "ERROR: $TESTPOOL1: Incorrect health '$health'" + log_must ismounted $TESTPOOL1/$TESTFS + + basedir=$TESTDIR1 + [[ -n "${import_opts}" ]] && basedir=$ALTER_ROOT/$TESTDIR1 + [[ ! -e "$basedir/$TESTFILE0" ]] && \ + log_fail "ERROR: $basedir/$TESTFILE0 missing after import." + + checksum2=$($SUM $basedir/$TESTFILE0 | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "ERROR: Checksums differ ($checksum1 != $checksum2)" + + log_must $ZPOOL export $TESTPOOL1 +} + +log_onexit cleanup_missing + +log_assert "Verify that import could handle damaged or missing device." + +CWD=$PWD +cd $DEVICE_DIR || log_fail "ERROR: Unable change directory to $DEVICE_DIR" + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +while :; do + typeset vdtype="${vdevs[i]}" + + typeset -i j=0 + while (( j < ${#options[*]} )); do + typeset opts="${options[j]}" + [ -n "$vdtype" ] && typestr="$vdtype" || typestr="stripe" + + # Prepare the pool. + setup_missing_test_pool $vdtype + guid=$(get_config $TESTPOOL1 pool_guid $DEVICE_DIR) + log_note "*** Testing $typestr tvd guid $guid opts '${opts}'" + + typeset -i count=0 + for device in $DEVICE_FILES ; do + log_mustnot poolexists $TESTPOOL1 + log_must $RM -f $device + + (( count = count + 1 )) + + action=log_must + case "$vdtype" in + 'mirror') (( count == $GROUP_NUM )) && \ + action=log_mustnot + ;; + 'raidz') (( count > 1 )) && \ + action=log_mustnot + ;; + '') action=log_mustnot + ;; + esac + + log_note "Testing import by name; ${count} removed." + perform_inner_test $action "${opts}" $TESTPOOL1 + + log_note "Testing import by GUID; ${count} removed." + perform_inner_test $action "${opts}" $guid + done + + recreate_missing_files + (( j = j + 1 )) + done + (( i = i + 1 )) + (( i == ${#vdevs[*]} )) && break +done + +log_pass "Import could handle damaged or missing device." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_002_pos.ksh new file mode 100644 index 00000000000..7f2da86f651 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_002_pos.ksh @@ -0,0 +1,150 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_missing_002_pos.ksh 1.4 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/cli_root/zpool_import/zpool_import.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_missing_002_pos +# +# DESCRIPTION: +# Once a pool has been exported, and one or more devices are +# move to other place, import should handle this kind of situation +# as described: +# - Regular, report error while any number of devices failing. +# - Mirror could withstand (N-1) devices failing +# before data integrity is compromised +# - Raidz could withstand one devices failing +# before data integrity is compromised +# Verify that is true. +# +# STRATEGY: +# 1. Create test pool upon device files using the various combinations. +# - Regular pool +# - Mirror +# - Raidz +# 2. Create necessary filesystem and test files. +# 3. Export the test pool. +# 4. Move one or more device files to other directory +# 5. Verify 'zpool import -d' with the new directory +# will handle moved files successfullly. +# Using the various combinations. +# - Regular import +# - Alternate Root Specified +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A vdevs "" "mirror" "raidz" +set -A options "" "-R $ALTER_ROOT" + +log_onexit cleanup_missing + +log_assert "Verify that import could handle moving device." + +log_must $MKDIR -p $BACKUP_DEVICE_DIR +cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR" + +typeset -i i=0 +typeset -i count=0 +typeset action + +function try_import # [opts] +{ + typeset action=$1; shift + typeset poolish="$1"; shift + log_note "try_import action=$action poolish=$poolish opts='$1'" + if [ -z "$1" ]; then + $action $ZPOOL import -d $DEVICE_DIR $poolish + else + $action $ZPOOL import -d $DEVICE_DIR $1 $poolish + fi + [ "$action" = "log_mustnot" ] && return + log_must $ZPOOL export $TESTPOOL1 +} + +while :; do + typeset vdtype="${vdevs[i]}" + + typeset -i j=0 + while (( j < ${#options[*]} )); do + typeset opts="${options[j]}" + + [ -n "$vdtype" ] && typestr="$vdtype" || typestr="stripe" + setup_missing_test_pool $vdtype + guid=$(get_config $TESTPOOL1 pool_guid $DEVICE_DIR) + log_note "*** Testing $typestr tvd guid $guid opts '${opts}'" + + typeset -i count=0 + for device in $DEVICE_FILES ; do + log_mustnot poolexists $TESTPOOL1 + log_must $MV $device $BACKUP_DEVICE_DIR + + (( count = count + 1 )) + + action=log_mustnot + case "${vdevs[i]}" in + 'mirror') (( count < $GROUP_NUM )) && \ + action=log_must + ;; + 'raidz') (( count == 1 )) && \ + action=log_must + ;; + esac + + log_note "Testing import by name; ${count} moved." + try_import $action $TESTPOOL1 "$opts" + + log_note "Testing import by GUID; ${count} moved." + try_import $action $guid "$opts" + done + + log_must $RM -f $BACKUP_DEVICE_DIR/* + recreate_missing_files + ((j = j + 1)) + done + ((i = i + 1)) + (( i == ${#vdevs[*]} )) && break +done + +log_pass "Import could handle moving device." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_003_pos.ksh new file mode 100644 index 00000000000..41abbbee4f2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_003_pos.ksh @@ -0,0 +1,239 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_missing_003_pos.ksh 1.4 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_missing_003_pos +# +# DESCRIPTION: +# Once a pool has been exported, but one or more devices are +# overlapped with other exported pool, import should handle +# this kind of situation properly. +# +# STRATEGY: +# 1. Repeat 1-3, create two test pools upon device files separately. +# These two pools should have one or more devices are overlapped. +# using the various combinations. +# - Regular pool +# - Mirror +# - Raidz +# 2. Create necessary filesystem and test files. +# 3. Export the test pool. +# 4. Verify 'zpool import -d' with these two pools will have results +# as described: +# - Regular, report error while any number of devices failing. +# - Mirror could withstand (N-1) devices failing +# before data integrity is compromised +# - Raidz could withstand one devices failing +# before data integrity is compromised +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-10) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A vdevs "" "mirror" "raidz" + +function verify +{ + typeset pool=$1 + typeset fs=$2 + typeset mtpt=$3 + typeset health=$4 + typeset file=$5 + typeset checksum1=$6 + + typeset myhealth + typeset mymtpt + typeset checksum2 + + log_must poolexists $pool + + myhealth=$($ZPOOL list -H -o health $pool) + + [[ $myhealth == $health ]] || \ + log_fail "$pool: Incorrect health ($myhealth), " \ + "expected ($health)." + + log_must ismounted $pool/$fs + + mymtpt=$(get_prop mountpoint $pool/$fs) + [[ $mymtpt == $mtpt ]] || \ + log_fail "$pool/$fs: Incorrect mountpoint ($mymtpt), " \ + "expected ($mtpt)." + + [[ ! -e $mtpt/$file ]] && \ + log_fail "$mtpt/$file missing after import." + + checksum2=$($SUM $mymtpt/$file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + return 0 + +} + +function cleanup +{ + cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR" + + for pool in $TESTPOOL1 $TESTPOOL2; do + if poolexists "$pool" ; then + cleanup_filesystem $pool $TESTFS + destroy_pool $pool + fi + done + + [[ -e $DEVICE_ARCHIVE ]] && log_must $TAR xf $DEVICE_ARCHIVE +} + +function cleanup_all +{ + cleanup + + # recover dev files + typeset i=0 + while (( i < $MAX_NUM )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done + + log_must $RM -f $DEVICE_ARCHIVE + cd $CWD || log_fail "Unable change directory to $CWD" + +} + +log_onexit cleanup_all + +log_assert "Verify that import could handle device overlapped." + +CWD=$PWD + +cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR" +log_must $TAR cf $DEVICE_ARCHIVE ${DEVICE_FILE}* + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +typeset -i j=0 +typeset -i count=0 +typeset -i num=0 +typeset vdev1="" +typeset vdev2="" +typeset action + +while (( num < $GROUP_NUM )); do + vdev1="$vdev1 ${DEVICE_DIR}/${DEVICE_FILE}$num" + (( num = num + 1 )) +done + +while (( i < ${#vdevs[*]} )); do + j=0 + while (( j < ${#vdevs[*]} )); do + + (( j != 0 )) && \ + log_must $TAR xf $DEVICE_ARCHIVE + + typeset -i overlap=1 + typeset -i begin + typeset -i end + + while (( overlap <= $GROUP_NUM )); do + vdev2="" + (( begin = $GROUP_NUM - overlap )) + (( end = 2 * $GROUP_NUM - overlap - 1 )) + (( num = begin )) + while (( num <= end )); do + vdev2="$vdev2 ${DEVICE_DIR}/${DEVICE_FILE}$num" + (( num = num + 1 )) + done + + setup_filesystem "$vdev1" $TESTPOOL1 $TESTFS $TESTDIR1 \ + "" ${vdevs[i]} + log_must $CP $MYTESTFILE $TESTDIR1/$TESTFILE0 + log_must $ZFS umount $TESTDIR1 + poolexists $TESTPOOL1 && \ + log_must $ZPOOL export $TESTPOOL1 + + setup_filesystem "$vdev2" $TESTPOOL2 $TESTFS $TESTDIR2 \ + "" ${vdevs[j]} + log_must $CP $MYTESTFILE $TESTDIR2/$TESTFILE0 + log_must $ZFS umount $TESTDIR2 + poolexists $TESTPOOL2 && \ + log_must $ZPOOL export $TESTPOOL2 + + action=log_must + case "${vdevs[i]}" in + 'mirror') (( overlap == $GROUP_NUM )) && \ + action=log_mustnot + ;; + 'raidz') (( overlap > 1 )) && \ + action=log_mustnot + ;; + '') action=log_mustnot + ;; + esac + + $action $ZPOOL import -d $DEVICE_DIR $TESTPOOL1 + log_must $ZPOOL import -d $DEVICE_DIR $TESTPOOL2 + + if [[ $action == log_must ]]; then + verify "$TESTPOOL1" "$TESTFS" "$TESTDIR1" \ + "DEGRADED" "$TESTFILE0" "$checksum1" + fi + + verify "$TESTPOOL2" "$TESTFS" "$TESTDIR2" \ + "ONLINE" "$TESTFILE0" "$checksum1" + + cleanup + + (( overlap = overlap + 1 )) + + done + + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "Import could handle device overlapped." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_004_pos.ksh new file mode 100644 index 00000000000..9655b77e461 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_004_pos.ksh @@ -0,0 +1,101 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_missing_004_pos +# +# DESCRIPTION: +# Once a pool has been exported and one or more devices are missing +# "zpool import" with no pool argument should exit with error code 0. +# +# STRATEGY: +# 1. Create test pool upon device files using the various combinations. +# - Striped pool +# - Mirror +# - Raidz +# 2. Export the test pool. +# 3. Remove one or more devices +# 4. Verify 'zpool import' will handle missing devices successfully. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2013-07-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A vdevs "mirror" "raidz" "" + +function cleanup +{ + destroy_pool $TESTPOOL1 + log_must $RM -rf $DEVICE_DIR/* +} + +function recreate_files +{ + cleanup + typeset -i i=0 + for (( ; $i < $GROUP_NUM; i += 1 )); do + log_must create_vdevs ${DEVICE_DIR}/${DEVICE_FILE}$i + done + log_must $SYNC +} + +log_onexit cleanup + +log_assert "Verify that zpool import succeeds when devices are missing" + +typeset rootvdev +typeset option +log_must $MKDIR -p $DEVICE_DIR +for rootvdev in "${vdevs[@]}"; do + recreate_files + poolexists $TESTPOOL1 || \ + create_pool $TESTPOOL1 "${rootvdev}" $DEVICE_FILES + + # Remove all devices but the last, one at a time + for device in ${DEVICE_FILES% *} ; do + poolexists $TESTPOOL1 && log_must $ZPOOL export $TESTPOOL1 + log_must $RM -f $device + log_must $ZPOOL import -d $DEVICE_DIR + done +done + +log_pass "zpool import succeeded when devices were missing" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_005_pos.ksh new file mode 100644 index 00000000000..9ff138c3b90 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_missing_005_pos.ksh @@ -0,0 +1,124 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2016 Spectra Logic All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_import_missing_005_pos +# +# DESCRIPTION: +# Verify that a pool can still be imported even if its devices' names +# have changed, for all types of devices. This is a test of vdev_geom's +# import_by_guid functionality. +# STRATEGY: +# 1. Create a supply of file-backed md devices +# 2. Create a disk-backed pool with regular, cache, log, and spare vdevs +# 3. Export it +# 4. Cause all the md devices names to change +# 5. Verify 'zpool import' can import it +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2015-01-4) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify that all types of vdevs of a disk-backed exported pool can be imported even if they have been renamed" + +# Create md devices so we can control their devnames +# Use high devnames so we'll be unlikely to have collisions +typeset -i REGULAR_U=4000 +typeset -i LOG_U=4001 +typeset -i CACHE_U=4002 +typeset -i SPARE_U=4003 +typeset -i REGULAR_ALTU=5000 +typeset -i LOG_ALTU=5001 +typeset -i CACHE_ALTU=5002 +typeset -i SPARE_ALTU=5003 +typeset REGULAR=${TMPDIR}/regular +typeset LOG=${TMPDIR}/log +typeset CACHE=${TMPDIR}/cache +typeset SPARE=${TMPDIR}/spare + +function cleanup +{ + destroy_pool $TESTPOOL + $MDCONFIG -d -u $REGULAR_U 2>/dev/null + $MDCONFIG -d -u $LOG_U 2>/dev/null + $MDCONFIG -d -u $CACHE_U 2>/dev/null + $MDCONFIG -d -u $SPARE_U 2>/dev/null + $MDCONFIG -d -u $REGULAR_ALTU 2>/dev/null + $MDCONFIG -d -u $LOG_ALTU 2>/dev/null + $MDCONFIG -d -u $CACHE_ALTU 2>/dev/null + $MDCONFIG -d -u $SPARE_ALTU 2>/dev/null + $RM -f $REGULAR + $RM -f $CACHE + $RM -f $LOG + $RM -f $SPARE +} +log_onexit cleanup + +log_must $TRUNCATE -s 64m $REGULAR +log_must $TRUNCATE -s 64m $LOG +log_must $TRUNCATE -s 64m $CACHE +log_must $TRUNCATE -s 64m $SPARE +log_must $MDCONFIG -t vnode -a -f $REGULAR -u $REGULAR_U +log_must $MDCONFIG -t vnode -a -f $LOG -u $LOG_U +log_must $MDCONFIG -t vnode -a -f $CACHE -u $CACHE_U +log_must $MDCONFIG -t vnode -a -f $SPARE -u $SPARE_U + +log_must $ZPOOL create $TESTPOOL md$REGULAR_U log md$LOG_U cache md$CACHE_U spare md$SPARE_U +log_must $ZPOOL export $TESTPOOL +# Now destroy the md devices, then recreate them with different names +log_must $MDCONFIG -d -u $REGULAR_U +log_must $MDCONFIG -d -u $LOG_U +log_must $MDCONFIG -d -u $CACHE_U +log_must $MDCONFIG -d -u $SPARE_U +log_must $MDCONFIG -t vnode -a -f $REGULAR -u $REGULAR_ALTU +log_must $MDCONFIG -t vnode -a -f $LOG -u $LOG_ALTU +log_must $MDCONFIG -t vnode -a -f $CACHE -u $CACHE_ALTU +log_must $MDCONFIG -t vnode -a -f $SPARE -u $SPARE_ALTU + +log_must $ZPOOL import $TESTPOOL +zpool status $TESTPOOL +log_must check_state $TESTPOOL md${REGULAR_ALTU} ONLINE +log_must check_state $TESTPOOL md${LOG_ALTU} ONLINE +log_must check_state $TESTPOOL md${CACHE_ALTU} ONLINE +log_must check_state $TESTPOOL md${SPARE_ALTU} AVAIL + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_rename_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_rename_001_pos.ksh new file mode 100644 index 00000000000..84d13957585 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_rename_001_pos.ksh @@ -0,0 +1,181 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_rename_001_pos.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_mount/zfs_mount.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_rename_001_pos +# +# DESCRIPTION: +# An exported pool can be imported under a different name. Hence +# we test that a previously exported pool can be renamed. +# +# STRATEGY: +# 1. Copy a file into the default test directory. +# 2. Umount the default directory. +# 3. Export the pool. +# 4. Import the pool using the name ${TESTPOOL}-new, +# and using the various combinations. +# - Regular import +# - Alternate Root Specified +# 5. Verify it exists in the 'zpool list' output. +# 6. Verify the default file system is mounted and that the file +# from step (1) is present. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" +set -A options "" "-R $ALTER_ROOT" +set -A mtpts "$TESTDIR" "$TESTDIR1" + + +function cleanup +{ + typeset -i i=0 + while (( i < ${#pools[*]} )); do + if poolexists "${pools[i]}-new" ; then + log_must $ZPOOL export "${pools[i]}-new" + + [[ -d /${pools[i]}-new ]] && \ + log_must $RM -rf /${pools[i]}-new + + log_must $ZPOOL import ${devs[i]} \ + "${pools[i]}-new" ${pools[i]} + fi + + datasetexists "${pools[i]}" || \ + log_must $ZPOOL import ${devs[i]} ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + + [[ -e ${mtpts[i]}/$TESTFILE0 ]] && \ + log_must $RM -rf ${mtpts[i]}/$TESTFILE0 + + ((i = i + 1)) + + done + + cleanup_filesystem $TESTPOOL1 $TESTFS $TESTDIR1 + + destroy_pool $TESTPOOL1 + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT +} + +function perform_inner_test +{ + target=$1 + + log_must $ZPOOL import ${devs[i]} ${options[j]} \ + $target ${pools[i]}-new + + log_must poolexists "${pools[i]}-new" + + log_must ismounted ${pools[i]}-new/$TESTFS + + basedir=${mtpts[i]} + [[ -n ${options[j]} ]] && \ + basedir=$ALTER_ROOT/${mtpts[i]} + + [[ ! -e $basedir/$TESTFILE0 ]] && \ + log_fail "$basedir/$TESTFILE0 missing after import." + + checksum2=$($SUM $basedir/$TESTFILE0 | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + log_must $ZPOOL export "${pools[i]}-new" + + [[ -d /${pools[i]}-new ]] && \ + log_must $RM -rf /${pools[i]}-new + + target=${pools[i]}-new + if (( RANDOM % 2 == 0 )) ; then + target=$guid + fi + log_must $ZPOOL import ${devs[i]} $target ${pools[i]} +} + +log_onexit cleanup + +log_assert "Verify that an imported pool can be renamed." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +typeset -i j=0 +typeset basedir + +while (( i < ${#pools[*]} )); do + guid=$(get_config ${pools[i]} pool_guid) + log_must $CP $MYTESTFILE ${mtpts[i]}/$TESTFILE0 + + log_must $ZFS umount ${mtpts[i]} + + j=0 + while (( j < ${#options[*]} )); do + log_must $ZPOOL export ${pools[i]} + + [[ -d /${pools[i]} ]] && \ + log_must $RM -rf /${pools[i]} + + log_note "Testing import by name." + perform_inner_test ${pools[i]} + + log_must $ZPOOL export ${pools[i]} + + log_note "Testing import by GUID." + perform_inner_test $guid + + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "Successfully imported and renamed a ZPOOL" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_test.sh new file mode 100755 index 00000000000..76e6728ee64 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_import/zpool_import_test.sh @@ -0,0 +1,589 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_import_002_pos cleanup +zpool_import_002_pos_head() +{ + atf_set "descr" "Verify that an exported pool can be imported and cannot be imported more than once." + atf_set "require.progs" zfs zpool sum zdb + atf_set "timeout" 2400 +} +zpool_import_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_003_pos cleanup +zpool_import_003_pos_head() +{ + atf_set "descr" "Destroyed pools are not listed unless with -D option is specified." + atf_set "require.progs" zpool zfs + atf_set "timeout" 2400 +} +zpool_import_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_004_pos cleanup +zpool_import_004_pos_head() +{ + atf_set "descr" "Destroyed pools devices was moved to another directory,it still can be imported correctly." + atf_set "require.progs" zpool zfs zdb + atf_set "timeout" 2400 +} +zpool_import_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_004_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_005_pos cleanup +zpool_import_005_pos_head() +{ + atf_set "descr" "Destroyed pools devices was renamed, it still can be importedcorrectly." + atf_set "require.progs" zpool zfs zdb + atf_set "timeout" 2400 +} +zpool_import_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_005_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_006_pos cleanup +zpool_import_006_pos_head() +{ + atf_set "descr" "For mirror, N-1 destroyed pools devices was removed or usedby other pool, it still can be imported correctly." + atf_set "require.progs" zpool zfs zdb + atf_set "timeout" 2400 +} +zpool_import_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_006_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_007_pos cleanup +zpool_import_007_pos_head() +{ + atf_set "descr" "For raidz, one destroyed pools devices was removed or used byother pool, it still can be imported correctly." + atf_set "require.progs" zpool zfs zdb + atf_set "timeout" 2400 +} +zpool_import_007_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_007_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_008_pos cleanup +zpool_import_008_pos_head() +{ + atf_set "descr" "For raidz2, two destroyed pools devices was removed or used byother pool, it still can be imported correctly." + atf_set "require.progs" zpool zfs zdb + atf_set "timeout" 2400 +} +zpool_import_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_008_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_009_neg cleanup +zpool_import_009_neg_head() +{ + atf_set "descr" "Badly-formed 'zpool import' with inapplicable scenariosshould return an error." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2400 +} +zpool_import_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_009_neg.ksh || atf_fail "Testcase failed" +} +zpool_import_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_010_pos cleanup +zpool_import_010_pos_head() +{ + atf_set "descr" "'zpool -D -a' can import all the specified directoriesdestroyed pools." + atf_set "require.progs" zpool zfs + atf_set "timeout" 2400 +} +zpool_import_010_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_010_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_011_neg cleanup +zpool_import_011_neg_head() +{ + atf_set "descr" "For strip pool, any destroyed pool devices was demaged,zpool import -D will failed." + atf_set "require.progs" zpool zfs zdb + atf_set "timeout" 2400 +} +zpool_import_011_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_011_neg.ksh || atf_fail "Testcase failed" +} +zpool_import_011_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_012_pos cleanup +zpool_import_012_pos_head() +{ + atf_set "descr" "Verify all mount & share status of sub-filesystems within a poolcan be restored after import [-Df]." + atf_set "require.progs" zfs zpool zdb share + atf_set "timeout" 2400 +} +zpool_import_012_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_012_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_012_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_013_neg +zpool_import_013_neg_head() +{ + atf_set "descr" "'zpool import' fails for pool that was not cleanly exported" + atf_set "require.progs" zfs zpool +} +zpool_import_013_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/zpool_import_013_neg.ksh || atf_fail "Testcase failed" +} + + +atf_test_case zpool_import_014_pos cleanup +zpool_import_014_pos_head() +{ + atf_set "descr" "'zpool import' can import destroyed disk-backed pools" + atf_set "require.progs" zfs zpool +} +zpool_import_014_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/zpool_import_014_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_014_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_all_001_pos cleanup +zpool_import_all_001_pos_head() +{ + atf_set "descr" "Verify that 'zpool import -a' succeeds as root." + atf_set "require.progs" zfs zpool sum + atf_set "timeout" 2400 +} +zpool_import_all_001_pos_body() +{ + atf_skip "This test relies heavily on Solaris slices. It could be ported, but that is difficult due to the high degree of obfuscation in the code" + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_all_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_all_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_missing_001_pos cleanup +zpool_import_missing_001_pos_head() +{ + atf_set "descr" "Verify that import could handle damaged or missing device." + atf_set "require.progs" zfs sum zpool zdb + atf_set "timeout" 2400 +} +zpool_import_missing_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_missing_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_missing_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_missing_002_pos cleanup +zpool_import_missing_002_pos_head() +{ + atf_set "descr" "Verify that import could handle moving device." + atf_set "require.progs" zpool zfs zdb + atf_set "timeout" 2400 +} +zpool_import_missing_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_missing_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_missing_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_missing_003_pos cleanup +zpool_import_missing_003_pos_head() +{ + atf_set "descr" "Verify that import could handle device overlapped." + atf_set "require.progs" zpool sum zfs + atf_set "timeout" 2400 +} +zpool_import_missing_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_missing_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_missing_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zpool_import_missing_004_pos +zpool_import_missing_004_pos_head() +{ + atf_set "descr" "Verify that zpool import succeeds when devices are missing" + atf_set "require.progs" zfs zpool + atf_set "timeout" 300 +} +zpool_import_missing_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/zpool_import_missing_004_pos.ksh || atf_fail "Testcase failed" +} + +atf_test_case zpool_import_missing_005_pos +zpool_import_missing_005_pos_head() +{ + atf_set "descr" "Verify that zpool import succeeds when devices of all types have been renamed" + atf_set "require.progs" mdconfig zfs zpool + atf_set "timeout" 300 +} +zpool_import_missing_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/zpool_import_missing_005_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case zpool_import_rename_001_pos cleanup +zpool_import_rename_001_pos_head() +{ + atf_set "descr" "Verify that an imported pool can be renamed." + atf_set "require.progs" zfs zpool sum zdb + atf_set "timeout" 2400 +} +zpool_import_rename_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_rename_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_rename_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zpool_import_corrupt_001_pos cleanup +zpool_import_corrupt_001_pos_head() +{ + atf_set "descr" "Verify that a disk-backed exported pool with some of its vdev labels corrupted can still be imported" + atf_set "require.progs" zfs zpool zdb + atf_set "timeout" 2400 +} +zpool_import_corrupt_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/zpool_import_corrupt_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_import_corrupt_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_import.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zpool_import_destroyed_001_neg cleanup +zpool_import_destroyed_001_neg_head() +{ + atf_set "descr" "'zpool import' will not show destroyed pools, even if an out-of-date non-destroyed label remains" + atf_set "require.progs" zpool +} +zpool_import_destroyed_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + + verify_disk_count "$DISKS" 3 + ksh93 $(atf_get_srcdir)/zpool_import_destroyed_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_import_destroyed_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + + destroy_pool "$TESTPOOL" + cleanup_devices "$DISKS" +} + +atf_test_case zpool_import_destroyed_002_neg cleanup +zpool_import_destroyed_002_neg_head() +{ + atf_set "descr" "'zpool import' will not show destroyed pools, even if an out-of-date non-destroyed label remains" + atf_set "require.progs" zpool +} +zpool_import_destroyed_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/zpool_import_destroyed_002_neg.ksh || atf_fail "Testcase failed" +} +zpool_import_destroyed_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + + destroy_pool "$TESTPOOL" + cleanup_devices "$DISKS" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_import_002_pos + atf_add_test_case zpool_import_003_pos + atf_add_test_case zpool_import_004_pos + atf_add_test_case zpool_import_005_pos + atf_add_test_case zpool_import_006_pos + atf_add_test_case zpool_import_007_pos + atf_add_test_case zpool_import_008_pos + atf_add_test_case zpool_import_009_neg + atf_add_test_case zpool_import_010_pos + atf_add_test_case zpool_import_011_neg + atf_add_test_case zpool_import_012_pos + atf_add_test_case zpool_import_013_neg + atf_add_test_case zpool_import_014_pos + atf_add_test_case zpool_import_all_001_pos + atf_add_test_case zpool_import_missing_001_pos + atf_add_test_case zpool_import_missing_002_pos + atf_add_test_case zpool_import_missing_003_pos + atf_add_test_case zpool_import_missing_004_pos + atf_add_test_case zpool_import_missing_005_pos + atf_add_test_case zpool_import_rename_001_pos + atf_add_test_case zpool_import_corrupt_001_pos + atf_add_test_case zpool_import_destroyed_001_neg + atf_add_test_case zpool_import_destroyed_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/Makefile new file mode 100644 index 00000000000..09c126d5447 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_offline +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_offline_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_offline_002_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_offline_001_pos.ksh +${PACKAGE}FILES+= zpool_offline.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/cleanup.ksh new file mode 100644 index 00000000000..b5a6a6c0f9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/setup.ksh new file mode 100644 index 00000000000..e4db7febd63 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline.cfg new file mode 100644 index 00000000000..92b86c249ce --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_offline.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_001_pos.ksh new file mode 100644 index 00000000000..64749a8d10f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_001_pos.ksh @@ -0,0 +1,138 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_offline_001_pos.ksh 1.3 09/05/19 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_offline_001_pos +# +# DESCRIPTION: +# Executing 'zpool offline' with valid parameters succeeds. +# +# STRATEGY: +# 1. Create an array of correctly formed 'zpool offline' options +# 2. Execute each element of the array. +# 3. Verify use of each option is successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) +set -A disks $DISKLIST +typeset -i num=${#disks[*]} + +set -A args "" "-t" + +function cleanup +{ + # + # Ensure we don't leave disks in the offline state + # + for disk in $DISKLIST; do + log_must $ZPOOL online $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "Unable to online $disk" + fi + + done +} + +log_assert "Executing 'zpool offline' with correct options succeeds" + +log_onexit cleanup + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 +typeset -i j=1 + +for disk in $DISKLIST; do + i=0 + while [[ $i -lt ${#args[*]} ]]; do + if (( j < num )) ; then + log_must $ZPOOL offline ${args[$i]} $TESTPOOL $disk + check_state $TESTPOOL $disk "offline" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match offline state" + fi + else + log_mustnot $ZPOOL offline ${args[$i]} $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi + fi + + (( i = i + 1 )) + done + (( j = j + 1 )) +done + +log_note "Issuing repeated 'zpool offline' commands succeeds." + +typeset -i iters=20 +typeset -i index=0 + +for disk in $DISKLIST; do + i=0 + while [[ $i -lt $iters ]]; do + index=`expr $RANDOM % ${#args[*]}` + log_must $ZPOOL offline ${args[$index]} $TESTPOOL $disk + check_state $TESTPOOL $disk "offline" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL is not offline." + fi + + (( i = i + 1 )) + done + + log_must $ZPOOL online $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi +done + +log_pass "'zpool offline' with correct options succeeded" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_002_neg.ksh new file mode 100644 index 00000000000..713ba57674d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_002_neg.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_offline_002_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_offline_002_neg +# +# DESCRIPTION: +# Executing 'zpool offline' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool offline' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-?" "-t fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "-t $TESTPOOL" "-t $TESTPOOL/$TESTFS" "-t $TESTPOOL/$TESTFS $DISKLIST" \ + "-t $TESTPOOL/$TESTCTR" "-t $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-t $TESTPOOL/$TESTCTR $DISKLIST" "-t $TESTPOOL/$TESTVOL" \ + "-t $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-t $TESTPOOL/$TESTVOL $DISKLIST" \ + "-t $DISKLIST" \ + "-f $TESTPOOL" "-f $TESTPOOL/$TESTFS" "-f $TESTPOOL/$TESTFS $DISKLIST" \ + "-f $TESTPOOL/$TESTCTR" "-f $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-f $TESTPOOL/$TESTCTR $DISKLIST" "-f $TESTPOOL/$TESTVOL" \ + "-f $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-f $TESTPOOL/$TESTVOL $DISKLIST" \ + "-f $DISKLIST" \ + "-ft $TESTPOOL" "-ft $TESTPOOL/$TESTFS" \ + "-ft $TESTPOOL/$TESTFS $DISKLIST" \ + "-ft $TESTPOOL/$TESTCTR" "-ft $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-ft $TESTPOOL/$TESTCTR $DISKLIST" "-ft $TESTPOOL/$TESTVOL" \ + "-ft $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-ft $TESTPOOL/$TESTVOL $DISKLIST" \ + "-ft $DISKLIST" \ + "-tf $TESTPOOL" "-tf $TESTPOOL/$TESTFS" \ + "-tf $TESTPOOL/$TESTFS $DISKLIST" \ + "-tf $TESTPOOL/$TESTCTR" "-tf $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-tf $TESTPOOL/$TESTCTR $DISKLIST" "-tf $TESTPOOL/$TESTVOL" \ + "-tf $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-tf $TESTPOOL/$TESTVOL $DISKLIST" \ + "-tf $DISKLIST" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" + +log_assert "Executing 'zpool offline' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL offline ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool offline' command with bad options failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_test.sh new file mode 100755 index 00000000000..2e31238091f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_offline/zpool_offline_test.sh @@ -0,0 +1,82 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_offline_001_pos cleanup +zpool_offline_001_pos_head() +{ + atf_set "descr" "Executing 'zpool offline' with correct options succeeds" + atf_set "require.progs" zpool +} +zpool_offline_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_offline.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_offline_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_offline_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_offline.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_offline_002_neg cleanup +zpool_offline_002_neg_head() +{ + atf_set "descr" "Executing 'zpool offline' with bad options fails" + atf_set "require.progs" zpool +} +zpool_offline_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_offline.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_offline_002_neg.ksh || atf_fail "Testcase failed" +} +zpool_offline_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_offline.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_offline_001_pos + atf_add_test_case zpool_offline_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_online/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/Makefile new file mode 100644 index 00000000000..06d92adafe9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_online +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_online_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_online.cfg +${PACKAGE}FILES+= zpool_online_002_neg.ksh +${PACKAGE}FILES+= zpool_online_001_pos.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_online/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/cleanup.ksh new file mode 100644 index 00000000000..b5a6a6c0f9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_online/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/setup.ksh new file mode 100644 index 00000000000..e4db7febd63 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online.cfg new file mode 100644 index 00000000000..e98bec592a4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_online.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_001_pos.ksh new file mode 100644 index 00000000000..1d9c848c2fe --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_001_pos.ksh @@ -0,0 +1,126 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_online_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_online_001 +# +# DESCRIPTION: +# Executing 'zpool online' with valid parameters succeeds. +# +# STRATEGY: +# 1. Create an array of correctly formed 'zpool online' options +# 2. Execute each element of the array. +# 3. Verify use of each option is successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" + +function cleanup +{ + # + # Ensure we don't leave disks in temporary online state (-t) + # + for disk in $DISKLIST; do + log_must $ZPOOL online $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "Unable to online $disk" + fi + + done +} + +log_assert "Executing 'zpool online' with correct options succeeds" + +log_onexit cleanup + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +for disk in $DISKLIST; do + i=0 + while [[ $i -lt ${#args[*]} ]]; do + log_must $ZPOOL offline $TESTPOOL $disk + check_state $TESTPOOL $disk "offline" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match offline state" + fi + + log_must $ZPOOL online ${args[$i]} $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi + + (( i = i + 1 )) + done +done + +log_note "Issuing repeated 'zpool online' commands succeeds." + +typeset -i iters=20 +typeset -i index=0 + +for disk in $DISKLIST; do + i=0 + while [[ $i -lt $iters ]]; do + index=`expr $RANDOM % ${#args[*]}` + log_must $ZPOOL online ${args[$index]} $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi + + (( i = i + 1 )) + done +done + +log_pass "'zpool online' with correct options succeeded" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_002_neg.ksh new file mode 100644 index 00000000000..2760aa34ded --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_002_neg.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_online_002_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_online_002_neg +# +# DESCRIPTION: +# Executing 'zpool online' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool online' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-30) +# +# __stc_assertion_end +# +################################################################################ +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-?" "-e fakepool" "-v fakepool" "-ev fakepool" "-ve fakepool" \ + "-t $TESTPOOL" "-t $TESTPOOL/$TESTFS" "-t $TESTPOOL/$TESTFS $DISKLIST" \ + "-t $TESTPOOL/$TESTCTR" "-t $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-t $TESTPOOL/$TESTCTR $DISKLIST" "-t $TESTPOOL/$TESTVOL" \ + "-t $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-t $TESTPOOL/$TESTVOL $DISKLIST" \ + "-t $DISKLIST" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" + +log_assert "Executing 'zpool online' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL online ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool online' command with bad options failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_test.sh new file mode 100755 index 00000000000..8955925ccc7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_online/zpool_online_test.sh @@ -0,0 +1,82 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_online_001_pos cleanup +zpool_online_001_pos_head() +{ + atf_set "descr" "Executing 'zpool online' with correct options succeeds" + atf_set "require.progs" zpool +} +zpool_online_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_online.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_online_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_online_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_online.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_online_002_neg cleanup +zpool_online_002_neg_head() +{ + atf_set "descr" "Executing 'zpool online' with bad options fails" + atf_set "require.progs" zpool +} +zpool_online_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_online.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_online_002_neg.ksh || atf_fail "Testcase failed" +} +zpool_online_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_online.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_online_001_pos + atf_add_test_case zpool_online_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/Makefile new file mode 100644 index 00000000000..0187bf60813 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_remove +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_remove_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_remove_001_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_remove.cfg +${PACKAGE}FILES+= zpool_remove_002_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_remove_003_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/cleanup.ksh new file mode 100644 index 00000000000..15c71e16bd8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +cleanup_devices $DISKS + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/setup.ksh new file mode 100644 index 00000000000..c328d811786 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/setup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +verify_runnable "global" + +partition_disk $SIZE $DISK 6 + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove.cfg new file mode 100644 index 00000000000..f88b9da7d85 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_remove.cfg 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg + +export DISK=${DISKS%% *} +export SIZE="200m" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_001_neg.ksh new file mode 100644 index 00000000000..3c45ca151ae --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_001_neg.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_remove_001_neg.ksh 1.2 08/11/03 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_remove_001_neg +# +# DESCRIPTION: +# Verify that 'zpool can not remove device except inactive hot spares from pool' +# +# STRATEGY: +# 1. Create all kinds of pool (strip, mirror, raidz, hotspare) +# 2. Try to remove device from the pool +# 3. Verify that the remove failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-18) +# +# __stc_assertion_end +# +################################################################################ + +typeset disk=${DISK} +typeset vdev_devs="${disk}p1" +typeset mirror_devs="${disk}p1 ${disk}p2" +typeset raidz_devs=${mirror_devs} +typeset raidz1_devs=${mirror_devs} +typeset raidz2_devs="${mirror_devs} ${disk}p3" +typeset spare_devs1="${disk}p1" +typeset spare_devs2="${disk}p2" + +function check_remove +{ + typeset pool=$1 + typeset devs="$2" + typeset dev + + for dev in $devs; do + log_mustnot $ZPOOL remove $dev + done + + destroy_pool $pool + +} + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi +} + +set -A create_args "$vdev_devs" "mirror $mirror_devs" \ + "raidz $raidz_devs" "raidz $raidz1_devs" \ + "raidz2 $raidz2_devs" \ + "$spare_devs1 spare $spare_devs2" + +set -A verify_disks "$vdev_devs" "$mirror_devs" "$raidz_devs" \ + "$raidz1_devs" "$raidz2_devs" "$spare_devs1" + + +log_assert "Check zpool remove can not remove " \ + "active device from pool" + +log_onexit cleanup + +typeset -i i=0 +while [[ $i -lt ${#create_args[*]} ]]; do + log_must $ZPOOL create $TESTPOOL ${create_args[i]} + check_remove $TESTPOOL "${verify_disks[i]}" + (( i = i + 1)) +done + +log_pass "'zpool remove fail as expected .'" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_002_pos.ksh new file mode 100644 index 00000000000..323c94b90ae --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_002_pos.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_remove_002_pos.ksh 1.1 07/07/31 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_remove_002_pos +# +# DESCRIPTION: +# Verify that 'zpool can only remove inactive hot spare devices from pool' +# +# STRATEGY: +# 1. Create a hotspare pool +# 2. Try to remove the inactive hotspare device from the pool +# 3. Verify that the remove succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-18) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + destroy_pool $TESTPOOL +} + +log_onexit cleanup +typeset disk=${DISK} + +typeset spare_devs1="${disk}p1" +typeset spare_devs2="${disk}p2" + +log_assert "zpool remove can only remove inactive hotspare device from pool" + +log_note "check hotspare device which is created by zpool create" +log_must $ZPOOL create $TESTPOOL $spare_devs1 spare $spare_devs2 +log_must $ZPOOL remove $TESTPOOL $spare_devs2 + +log_note "check hotspare device which is created by zpool add" +log_must $ZPOOL add $TESTPOOL spare $spare_devs2 +log_must $ZPOOL remove $TESTPOOL $spare_devs2 +log_must $ZPOOL destroy $TESTPOOL + +log_pass "zpool remove can only remove inactive hotspare device from pool" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_003_pos.ksh new file mode 100644 index 00000000000..9b6f55156b6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_003_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_remove_003_pos.ksh 1.2 08/11/03 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_remove_003_pos +# +# DESCRIPTION: +# Verify that 'zpool can remove hotspare devices from pool when it state +# switch from active to inactive' +# +# STRATEGY: +# 1. Create a hotspare pool +# 2. Try to replace the inactive hotspare device to active device in the pool +# 3. Try to detach active (spare) device to make it inactive +# 3. Verify that the zpool remove succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-18) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + restart_zfsd + + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi +} + +# Stop ZFSD because it interferes with our manually activated spares +stop_zfsd + +log_onexit cleanup +typeset disk=${DISK} + +typeset spare_devs1="${disk}p1" +typeset spare_devs2="${disk}p2" +typeset spare_devs3="${disk}p3" +typeset spare_devs4="${disk}p4" + +log_assert "zpool remove can remove hotspare device which state go though" \ + " active to inactive in pool" + +log_note "Check spare device which state go through active to inactive" +log_must $ZPOOL create $TESTPOOL $spare_devs1 $spare_devs2 spare \ + $spare_devs3 $spare_devs4 +log_must $ZPOOL replace $TESTPOOL $spare_devs2 $spare_devs3 +log_mustnot $ZPOOL remove $TESTPOOL $spare_devs3 +log_must $ZPOOL detach $TESTPOOL $spare_devs3 +log_must $ZPOOL remove $TESTPOOL $spare_devs3 + +log_pass "'zpool remove device passed as expected.'" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_test.sh new file mode 100755 index 00000000000..2cbcd955494 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_remove/zpool_remove_test.sh @@ -0,0 +1,107 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_remove_001_neg cleanup +zpool_remove_001_neg_head() +{ + atf_set "descr" "Check zpool remove can not removeactive device from pool" + atf_set "require.progs" zpool +} +zpool_remove_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_remove.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_remove_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_remove_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_remove.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_remove_002_pos cleanup +zpool_remove_002_pos_head() +{ + atf_set "descr" "zpool remove can only remove inactive hotspare device from pool" + atf_set "require.progs" zpool +} +zpool_remove_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_remove.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_remove_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_remove_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_remove.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_remove_003_pos cleanup +zpool_remove_003_pos_head() +{ + atf_set "descr" "zpool remove can remove hotspare device which state go though active to inactive in pool" + atf_set "require.progs" zpool +} +zpool_remove_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_remove.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_remove_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_remove_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_remove.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_remove_001_neg + atf_add_test_case zpool_remove_002_pos + atf_add_test_case zpool_remove_003_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/Makefile new file mode 100644 index 00000000000..59dd9846bf0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_replace +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_replace_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_replace_001_neg.ksh +${PACKAGE}FILES+= zpool_replace_002_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_replace.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/cleanup.ksh new file mode 100644 index 00000000000..b5a6a6c0f9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/setup.ksh new file mode 100644 index 00000000000..e4db7febd63 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace.cfg new file mode 100644 index 00000000000..6d85532146b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_replace.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_001_neg.ksh new file mode 100644 index 00000000000..d19e26a6b14 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_001_neg.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_replace_001_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_replace_001_neg +# +# DESCRIPTION: +# Executing 'zpool replace' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool replace' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-f" "-?" "-z fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "$TESTPOOL" "-t $TESTPOOL/$TESTFS" "-t $TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "-t $TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "-t $TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" \ + "fakepool fakedevice" "fakepool fakedevice fakenewdevice" \ + "$TESTPOOL fakedevice" "$TESTPOOL $DISKLIST" \ + "$TESTPOOL fakedevice fakenewdevice fakenewdevice" \ + "-f $TESTPOOL" "-f $TESTPOOL/$TESTFS" "-f $TESTPOOL/$TESTFS $DISKLIST" \ + "-f $TESTPOOL/$TESTCTR" "-f $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-f $TESTPOOL/$TESTCTR $DISKLIST" "-f $TESTPOOL/$TESTVOL" \ + "-f $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-f $TESTPOOL/$TESTVOL $DISKLIST" \ + "-f $DISKLIST" \ + "-f fakepool fakedevice" "-f fakepool fakedevice fakenewdevice" \ + "-f $TESTPOOL fakedevice fakenewdevice fakenewdevice" \ + "-f $TESTPOOL fakedevice" "-f $TESTPOOL $DISKLIST" + +log_assert "Executing 'zpool replace' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL replace ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool replace' command with bad options failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_002_neg.ksh new file mode 100644 index 00000000000..03cd222efad --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_002_neg.ksh @@ -0,0 +1,40 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +log_assert "'zpool replace' should fail if the new device is too small" + +log_must $TRUNCATE -s 1024m bigfile +log_must $TRUNCATE -s 512m smallfile + +log_must $ZPOOL create $TESTPOOL $PWD/bigfile +log_mustnot $ZPOOL replace $TESTPOOL $PWD/bigfile $PWD/smallfile + +log_pass "'zpool replace' should fail if the new device is too small" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_test.sh new file mode 100755 index 00000000000..f8f85d16807 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_replace/zpool_replace_test.sh @@ -0,0 +1,79 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_replace_001_neg cleanup +zpool_replace_001_neg_head() +{ + atf_set "descr" "Executing 'zpool replace' with bad options fails" + atf_set "require.progs" zpool +} +zpool_replace_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_replace.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_replace_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_replace_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_replace.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zpool_replace_002_neg cleanup +zpool_replace_002_neg_head() +{ + atf_set "descr" "'zpool replace' should fail if the new device is too small" + atf_set "require.progs" zpool +} +zpool_replace_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_replace.cfg + + ksh93 $(atf_get_srcdir)/zpool_replace_002_neg.ksh || atf_fail "Testcase failed" +} +zpool_replace_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_replace.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_replace_001_neg + atf_add_test_case zpool_replace_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/Makefile new file mode 100644 index 00000000000..7fc238b2025 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_scrub +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_scrub_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_scrub_001_neg.ksh +${PACKAGE}FILES+= zpool_scrub_004_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_scrub_005_pos.ksh +${PACKAGE}FILES+= zpool_scrub.cfg +${PACKAGE}FILES+= zpool_scrub_003_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_scrub_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/cleanup.ksh new file mode 100644 index 00000000000..963d13b8b7e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +destroy_mirrors diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/setup.ksh new file mode 100644 index 00000000000..95a1c426213 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/setup.ksh @@ -0,0 +1,45 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.4 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +default_mirror_setup_noexit $DISK1 $DISK2 + +mntpnt=$(get_prop mountpoint $TESTPOOL) +typeset -i i=0 +while ((i < 10)); do + log_must $MKFILE 500M $mntpnt/bigfile.$i + ((i += 1)) +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub.cfg new file mode 100644 index 00000000000..c5d4e38a365 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub.cfg @@ -0,0 +1,34 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_scrub.cfg 1.3 07/10/09 SMI" +# +. $STF_SUITE/tests/cli_root/cli.cfg + +export DISK1=$($ECHO $DISKS | $AWK '{print $1}') +export DISK2=$($ECHO $DISKS | $AWK '{print $2}') diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_001_neg.ksh new file mode 100644 index 00000000000..ccde48731aa --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_001_neg.ksh @@ -0,0 +1,76 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_scrub_001_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_scrub_001_neg +# +# DESCRIPTION: +# A badly formed parameter passed to 'zpool scrub' should +# return an error. +# +# STRATEGY: +# 1. Create an array containing bad 'zpool scrub' parameters. +# 2. For each element, execute the sub-command. +# 3. Verify it returns an error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A args "" "-?" "blah blah" "-%" "--?" "-*" "-=" \ + "-a" "-b" "-c" "-d" "-e" "-f" "-g" "-h" "-i" "-j" "-k" "-l" \ + "-m" "-n" "-o" "-p" "-q" "-r" "-s" "-t" "-u" "-v" "-w" "-x" "-y" "-z" \ + "-A" "-B" "-C" "-D" "-E" "-F" "-G" "-H" "-I" "-J" "-K" "-L" \ + "-M" "-N" "-O" "-P" "-Q" "-R" "-S" "-T" "-U" "-V" "-W" "-X" "-W" "-Z" + + +log_assert "Execute 'zpool scrub' using invalid parameters." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL scrub ${args[i]} + + ((i = i + 1)) +done + +log_pass "Badly formed 'zpool scrub' parameters fail as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_002_pos.ksh new file mode 100644 index 00000000000..d32ef918c05 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_002_pos.ksh @@ -0,0 +1,66 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_scrub_002_pos.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_scrub_002_pos +# +# DESCRIPTION: +# Verify scrub -s works correctly. +# +# STRATEGY: +# 1. Create pool and fill with hundreds data. +# 2. zpool scrub the pool +# 3. Verify zpool scrub -s succeed when the system is scrubbing. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-08) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify scrub -s works correctly." + +log_must $ZPOOL scrub $TESTPOOL +log_must $ZPOOL scrub -s $TESTPOOL +log_must is_pool_scrub_stopped $TESTPOOL + +log_pass "Verify scrub -s works correctly." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_003_pos.ksh new file mode 100644 index 00000000000..5181e8d1dcc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_003_pos.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_scrub_003_pos.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_scrub_003_pos +# +# DESCRIPTION: +# scrub command terminates the existing scrub process and starts +# a new scrub. +# +# STRATEGY: +# 1. Setup a pool and fill with data +# 2. Kick off a scrub +# 3. Check the completed percent and invoke another scrub +# 4. Check the percent again, verify a new scrub started. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function get_scrub_percent +{ + typeset -i percent + percent=$($ZPOOL status $TESTPOOL | $GREP "^ scrub" | \ + $AWK '{print $7}' | $AWK -F. '{print $1}') + if is_pool_scrubbed $TESTPOOL ; then + percent=100 + fi + $ECHO $percent +} + +log_assert "scrub command terminates the existing scrub process and starts" \ + "a new scrub." + +log_must $ZPOOL scrub $TESTPOOL +typeset -i PERCENT=30 percent=0 +while ((percent < PERCENT)) ; do + percent=$(get_scrub_percent) +done + +log_must $ZPOOL scrub $TESTPOOL +percent=$(get_scrub_percent) +if ((percent > PERCENT)); then + log_fail "zpool scrub don't stop existing scrubbing process." +fi + +log_pass "scrub command terminates the existing scrub process and starts" \ + "a new scrub." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_004_pos.ksh new file mode 100644 index 00000000000..e8b4c7346d1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_004_pos.ksh @@ -0,0 +1,76 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_scrub_004_pos.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_scrub_004_pos +# +# DESCRIPTION: +# Resilver prevent scrub from starting until the resilver completes +# +# STRATEGY: +# 1. Setup a mirror pool and filled with data. +# 2. Detach one of devices +# 3. Verify scrub failed until the resilver completed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Resilver prevent scrub from starting until the resilver completes" + +log_must $ZPOOL detach $TESTPOOL $DISK2 +log_must $ZPOOL attach $TESTPOOL $DISK1 $DISK2 +log_must is_pool_resilvering $TESTPOOL +log_mustnot $ZPOOL scrub $TESTPOOL + +while true; do + if is_pool_resilvered $TESTPOOL ; then + $SLEEP 3 + break + fi +done + +log_must $ZPOOL scrub $TESTPOOL + +log_pass "Resilver prevent scrub from starting until the resilver completes" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_005_pos.ksh new file mode 100644 index 00000000000..667205d86ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_005_pos.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_scrub_005_pos.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zpool_scrub_005_pos +# +# DESCRIPTION: +# When scrubbing, detach device should not break system. +# +# STRATEGY: +# 1. Setup filesys with data. +# 2. Detaching and attaching the device when scrubbing. +# 3. Try it twice, verify both of them work fine. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-16) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "When scrubbing, detach device should not break system." + +log_must $ZPOOL scrub $TESTPOOL +log_must $ZPOOL detach $TESTPOOL $DISK2 +log_must $ZPOOL attach $TESTPOOL $DISK1 $DISK2 + +while true ; do + if is_pool_resilvered $TESTPOOL ; then + $SLEEP 3 + break + fi +done + +log_must $ZPOOL scrub $TESTPOOL +log_must $ZPOOL detach $TESTPOOL $DISK1 +log_must $ZPOOL attach $TESTPOOL $DISK2 $DISK1 + +log_pass "When scrubbing, detach device should not break system." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_test.sh new file mode 100755 index 00000000000..4e0bbbd9cf2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_scrub/zpool_scrub_test.sh @@ -0,0 +1,157 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_scrub_001_neg cleanup +zpool_scrub_001_neg_head() +{ + atf_set "descr" "Execute 'zpool scrub' using invalid parameters." + atf_set "require.progs" zpool +} +zpool_scrub_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_scrub_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_scrub_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_scrub_002_pos cleanup +zpool_scrub_002_pos_head() +{ + atf_set "descr" "Verify scrub -s works correctly." + atf_set "require.progs" zpool +} +zpool_scrub_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_scrub_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_scrub_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_scrub_003_pos cleanup +zpool_scrub_003_pos_head() +{ + atf_set "descr" "scrub command terminates the existing scrub process and starts a new scrub." + atf_set "require.progs" zpool +} +zpool_scrub_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_scrub_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_scrub_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_scrub_004_pos cleanup +zpool_scrub_004_pos_head() +{ + atf_set "descr" "Resilver prevent scrub from starting until the resilver completes" + atf_set "require.progs" zpool +} +zpool_scrub_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_scrub_004_pos.ksh || atf_fail "Testcase failed" +} +zpool_scrub_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_scrub_005_pos cleanup +zpool_scrub_005_pos_head() +{ + atf_set "descr" "When scrubbing, detach device should not break system." + atf_set "require.progs" zpool +} +zpool_scrub_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_scrub_005_pos.ksh || atf_fail "Testcase failed" +} +zpool_scrub_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_scrub.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_scrub_001_neg + atf_add_test_case zpool_scrub_002_pos + atf_add_test_case zpool_scrub_003_pos + atf_add_test_case zpool_scrub_004_pos + atf_add_test_case zpool_scrub_005_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_set/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/Makefile new file mode 100644 index 00000000000..22b601daddd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/Makefile @@ -0,0 +1,17 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_set +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_set_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_set_002_neg.ksh +${PACKAGE}FILES+= zpool_set_003_neg.ksh +${PACKAGE}FILES+= zpool_set_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_001_pos.ksh new file mode 100644 index 00000000000..894a2cef21d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_001_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_set_001_pos.ksh 1.3 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_set_001_pos +# +# DESCRIPTION: +# +# Zpool set usage message is displayed when called with no arguments +# +# STRATEGY: +# 1. Run zpool set +# 2. Check that exit status is set to 2 +# 3. Check usage message contains text "usage" +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zpool set usage message is displayed when called with no arguments" + +$ZPOOL upgrade -v 2>&1 | $GREP "bootfs pool property" > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "Pool properties not supported on this release." +fi + +$ZPOOL set > /dev/null 2>&1 +RET=$? +if [ $RET != 2 ] +then + log_fail "\"zpool set\" exit status $RET should be equal to 2." +fi + +OUTPUT=$($ZPOOL set 2>&1 | $GREP -i usage) +if [ $? != 0 ] +then + log_fail "Usage message for zpool set did not contain the word 'usage'." +fi + +log_pass "zpool set usage message is displayed when called with no arguments" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_002_neg.ksh new file mode 100644 index 00000000000..adde0464256 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_002_neg.ksh @@ -0,0 +1,144 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_set_002_neg.ksh 1.3 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_set_002_neg +# +# DESCRIPTION: +# +# Malformed zpool set commands are rejected +# +# STRATEGY: +# 1. Create an array of many different malformed zfs set arguments +# 2. Run zpool set for each arg checking each will exit with status code 1 +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-03-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +# note to self - need to make sure there isn't a pool called bootfs +# before running this test... +function cleanup { + destroy_pool bootfs + $RM $TMPDIR/zpool_set_002.${TESTCASE_ID}.dat +} + +$ZPOOL upgrade -v 2>&1 | $GREP "bootfs pool property" > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "Pool properties not supported on this release." +fi + + +log_assert "Malformed zpool set commands are rejected" + +if poolexists bootfs +then + log_unsupported "Unable to run test on a machine with a pool called \ + bootfs" +fi + +log_onexit cleanup + +# build up an array of bad arguments. +set -A arguments "rubbish " \ + "foo@bar= " \ + "@@@= +pool " \ + "zpool bootfs " \ + "bootfs " \ + "bootfs +" \ + "bootfs=bootfs/123 " \ + "bootfs=bootfs@val " \ + "Bootfs=bootfs " \ + "- " \ + "== " \ + "set " \ + "@@ " \ + "12345 " \ + "€にほんご " \ + "/ " \ + "bootfs=bootfs /" \ + "bootfs=a%d%s " + + +# here, we build up a large string. +# a word to the ksh-wary, ${#array[@]} gives you the +# total number of entries in an array, so array[${#array[@]}] +# will index the last entry+1, ksh arrays start at index 0. +COUNT=0 +while [ $COUNT -le 1025 ] +do + bigname="${bigname}o" + COUNT=$(( $COUNT + 1 )) +done + +# add an argument of maximum length property name +arguments[${#arguments[@]}]="$bigname=value" + +# add an argument of maximum length property value +arguments[${#arguments[@]}]="bootfs=$bigname" + +# Create a pool called bootfs (so-called, so as to trip any clashes between +# property name, and pool name) +# Also create a filesystem in this pool +VDEV=$TMPDIR/zpool_set_002.${TESTCASE_ID}.vdev +log_must create_vdevs $VDEV +log_must $ZPOOL create bootfs $VDEV +log_must $ZFS create bootfs/root + +typeset -i i=0; +while [ $i -lt "${#arguments[@]}" ] +do + log_mustnot eval "$ZPOOL set ${arguments[$i]} > /dev/null 2>&1" + + # now also try with a valid pool in the argument list + log_mustnot eval "$ZPOOL set ${arguments[$i]}bootfs > /dev/null 2>&1" + + # now also try with two valid pools in the argument list + log_mustnot eval "$ZPOOL set ${arguments[$i]}bootfs bootfs > /dev/null" + i=$(( $i + 1)) +done + +log_pass "Malformed zpool set commands are rejected" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_003_neg.ksh new file mode 100644 index 00000000000..69c5a597aa2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_003_neg.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_set_003_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_set_003_neg +# +# DESCRIPTION: +# +# zpool set cannot set a readonly property +# +# STRATEGY: +# 1. Create a pool +# 2. Verify that we can't set readonly properties on that pool +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL + $RM $TMPDIR/zpool_set_003.${TESTCASE_ID}.dat +} + +set -A props "available" "capacity" "guid" "health" "size" "used" +set -A vals "100" "10" "12345" "HEALTHY" "10" "10" + +$ZPOOL upgrade -v 2>&1 | $GREP "bootfs pool property" > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "Pool properties not supported on this release." +fi + + + +log_onexit cleanup + +log_assert "zpool set cannot set a readonly property" + +VDEV=$TMPDIR/zpool_set_003.${TESTCASE_ID}.vdev +log_must create_vdevs $VDEV +log_must $ZPOOL create $TESTPOOL $VDEV + +typeset -i i=0; +while [ $i -lt "${#props[@]}" ] +do + # try to set each property in the prop list with it's corresponding val + log_mustnot eval "$ZPOOL set ${props[$i]}=${vals[$i]} $TESTPOOL \ + > /dev/null 2>&1" + i=$(( $i + 1)) +done + +log_pass "zpool set cannot set a readonly property" + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_test.sh new file mode 100755 index 00000000000..348e27c1052 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_set/zpool_set_test.sh @@ -0,0 +1,77 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_set_001_pos +zpool_set_001_pos_head() +{ + atf_set "descr" "zpool set usage message is displayed when called with no arguments" + atf_set "require.progs" zpool +} +zpool_set_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + + ksh93 $(atf_get_srcdir)/zpool_set_001_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case zpool_set_002_neg +zpool_set_002_neg_head() +{ + atf_set "descr" "Malformed zpool set commands are rejected" + atf_set "require.progs" zpool zfs +} +zpool_set_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + + ksh93 $(atf_get_srcdir)/zpool_set_002_neg.ksh || atf_fail "Testcase failed" +} + + +atf_test_case zpool_set_003_neg +zpool_set_003_neg_head() +{ + atf_set "descr" "zpool set cannot set a readonly property" + atf_set "require.progs" zpool +} +zpool_set_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + + ksh93 $(atf_get_srcdir)/zpool_set_003_neg.ksh || atf_fail "Testcase failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_set_001_pos + atf_add_test_case zpool_set_002_neg + atf_add_test_case zpool_set_003_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_status/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/Makefile new file mode 100644 index 00000000000..cd8d2328971 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_status +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_status_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_status.cfg +${PACKAGE}FILES+= zpool_status_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_status_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_status/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_status/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status.cfg new file mode 100644 index 00000000000..5fbd0429b05 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_status.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_001_pos.ksh new file mode 100644 index 00000000000..8db50bdf92c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_001_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_status_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_status_001_pos +# +# DESCRIPTION: +# Executing 'zpool status' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool status' options +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A args "" "-?" "-x fakepool" "-v fakepool" "-xv fakepool" "-vx fakepool" \ + "-x $TESTPOOL/$TESTFS" "-v $TESTPOOL/$TESTFS" "-xv $TESTPOOL/$TESTFS" \ + "-vx $TESTPOOL/$TESTFS" + +log_assert "Executing 'zpool status' with bad options fails" + +typeset -i i=1 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL status ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool status' command with bad options failed as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_002_pos.ksh new file mode 100644 index 00000000000..a313f8af598 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_002_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_status_002_pos.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_status_002_pos +# +# DESCRIPTION: +# Executing 'zpool status' with correct options succeeds +# +# STRATEGY: +# 1. Create an array of correctly formed 'zpool status' options +# 2. Execute each element of the array. +# 3. Verify use of each option is successful. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +typeset testpool +if is_global_zone; then + testpool=$TESTPOOL +else + testpool=${TESTPOOL%%/*} +fi + +set -A args "" "-x" "-v" "-x $testpool" "-v $testpool" "-xv $testpool" \ + "-vx $testpool" + +log_assert "Executing 'zpool status' with correct options succeeds" + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_must $ZPOOL status ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool status' with correct options succeeded" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_test.sh new file mode 100755 index 00000000000..df9a1377b99 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_status/zpool_status_test.sh @@ -0,0 +1,82 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_status_001_pos cleanup +zpool_status_001_pos_head() +{ + atf_set "descr" "Executing 'zpool status' with bad options fails" + atf_set "require.progs" zpool +} +zpool_status_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_status.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_status_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_status_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_status.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_status_002_pos cleanup +zpool_status_002_pos_head() +{ + atf_set "descr" "Executing 'zpool status' with correct options succeeds" + atf_set "require.progs" zpool +} +zpool_status_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_status.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_status_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_status_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_status.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_status_001_pos + atf_add_test_case zpool_status_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/Makefile new file mode 100644 index 00000000000..0b8cf24d147 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/Makefile @@ -0,0 +1,29 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_upgrade +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_upgrade_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_upgrade_003_pos.ksh +${PACKAGE}FILES+= zpool_upgrade_007_pos.ksh +${PACKAGE}FILES+= zpool_upgrade_006_neg.ksh +${PACKAGE}FILES+= zpool_upgrade_002_pos.ksh +${PACKAGE}FILES+= zpool_upgrade.cfg +${PACKAGE}FILES+= zpool_upgrade_004_pos.ksh +${PACKAGE}FILES+= zpool_upgrade_008_pos.ksh +${PACKAGE}FILES+= zpool_upgrade_005_neg.ksh +${PACKAGE}FILES+= zpool_upgrade_009_neg.ksh +${PACKAGE}FILES+= zpool_upgrade.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_upgrade_001_pos.ksh + +SUBDIR+= blockfiles + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/Makefile b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/Makefile new file mode 100644 index 00000000000..0d73edae1b9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/Makefile @@ -0,0 +1,65 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= README +${PACKAGE}FILES+= zfs-broken-mirror1.dat.Z +${PACKAGE}FILES+= zfs-broken-mirror2.dat.Z +${PACKAGE}FILES+= zfs-pool-v1.dat.Z +${PACKAGE}FILES+= zfs-pool-v10.dat.Z +${PACKAGE}FILES+= zfs-pool-v11.dat.Z +${PACKAGE}FILES+= zfs-pool-v12.dat.Z +${PACKAGE}FILES+= zfs-pool-v13.dat.Z +${PACKAGE}FILES+= zfs-pool-v14.dat.Z +${PACKAGE}FILES+= zfs-pool-v15.dat.Z +${PACKAGE}FILES+= zfs-pool-v1mirror1.dat.Z +${PACKAGE}FILES+= zfs-pool-v1mirror2.dat.Z +${PACKAGE}FILES+= zfs-pool-v1mirror3.dat.Z +${PACKAGE}FILES+= zfs-pool-v1raidz1.dat.Z +${PACKAGE}FILES+= zfs-pool-v1raidz2.dat.Z +${PACKAGE}FILES+= zfs-pool-v1raidz3.dat.Z +${PACKAGE}FILES+= zfs-pool-v1stripe1.dat.Z +${PACKAGE}FILES+= zfs-pool-v1stripe2.dat.Z +${PACKAGE}FILES+= zfs-pool-v1stripe3.dat.Z +${PACKAGE}FILES+= zfs-pool-v2.dat.Z +${PACKAGE}FILES+= zfs-pool-v28.dat.Z +${PACKAGE}FILES+= zfs-pool-v2mirror1.dat.Z +${PACKAGE}FILES+= zfs-pool-v2mirror2.dat.Z +${PACKAGE}FILES+= zfs-pool-v2mirror3.dat.Z +${PACKAGE}FILES+= zfs-pool-v2raidz1.dat.Z +${PACKAGE}FILES+= zfs-pool-v2raidz2.dat.Z +${PACKAGE}FILES+= zfs-pool-v2raidz3.dat.Z +${PACKAGE}FILES+= zfs-pool-v2stripe1.dat.Z +${PACKAGE}FILES+= zfs-pool-v2stripe2.dat.Z +${PACKAGE}FILES+= zfs-pool-v2stripe3.dat.Z +${PACKAGE}FILES+= zfs-pool-v3.dat.Z +${PACKAGE}FILES+= zfs-pool-v3hotspare1.dat.Z +${PACKAGE}FILES+= zfs-pool-v3hotspare2.dat.Z +${PACKAGE}FILES+= zfs-pool-v3hotspare3.dat.Z +${PACKAGE}FILES+= zfs-pool-v3mirror1.dat.Z +${PACKAGE}FILES+= zfs-pool-v3mirror2.dat.Z +${PACKAGE}FILES+= zfs-pool-v3mirror3.dat.Z +${PACKAGE}FILES+= zfs-pool-v3raidz1.dat.Z +${PACKAGE}FILES+= zfs-pool-v3raidz2.dat.Z +${PACKAGE}FILES+= zfs-pool-v3raidz21.dat.Z +${PACKAGE}FILES+= zfs-pool-v3raidz22.dat.Z +${PACKAGE}FILES+= zfs-pool-v3raidz23.dat.Z +${PACKAGE}FILES+= zfs-pool-v3raidz3.dat.Z +${PACKAGE}FILES+= zfs-pool-v3stripe1.dat.Z +${PACKAGE}FILES+= zfs-pool-v3stripe2.dat.Z +${PACKAGE}FILES+= zfs-pool-v3stripe3.dat.Z +${PACKAGE}FILES+= zfs-pool-v4.dat.Z +${PACKAGE}FILES+= zfs-pool-v5.dat.Z +${PACKAGE}FILES+= zfs-pool-v5000.dat.Z +${PACKAGE}FILES+= zfs-pool-v6.dat.Z +${PACKAGE}FILES+= zfs-pool-v7.dat.Z +${PACKAGE}FILES+= zfs-pool-v8.dat.Z +${PACKAGE}FILES+= zfs-pool-v9.dat.Z +${PACKAGE}FILES+= zfs-pool-v999.dat.Z +${PACKAGE}FILES+= zfs-pool-vBROKEN.dat.Z + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/README b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/README new file mode 100644 index 00000000000..741af2641ea --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/README @@ -0,0 +1,34 @@ +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)README 1.1 07/03/14 SMI" +# + +Unless otherwise noted, all files in this distribution are released +under the Common Development and Distribution License (CDDL). + +This directory contains compressed blockfiles for zpool upgrade testing. diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..8e0b7ea48aa0f5392d4a58966297520d8e99a300 GIT binary patch literal 43027 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..0b68f7edb5292577e568edb4263e10cef577de68 GIT binary patch literal 82255 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v10.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v10.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..b2723de64c252a92f5835e79f0c55439b51b5f50 GIT binary patch literal 84381 zcmWh!d3+4#|9_rmj-9$u8Mg3NcE+U6W-aEf9c5X%bV>Jzuors zmwW#AN&4L1ZeIFw@72$6nIUrE(VA-S&=RUsuzpqdHey57T-aUIg+qu6}PCx$j?zg=X_wB1Ju1>uaJb8lP_|`LN znIUY`^EJ~v)3TSFARj%#O3E>htWAmSrViQKV;F*Hfmv6w|eS{lh178whTV zkp`ITN5RGLSstiRrBNdu9^+jhKH!DI+tf|An5FMDs>umNF{ z0*^)mn11hke5XmJ6|rUcIXf{cKfACzy|m#Dh6k<Oy|mOPF<}So{YV$FJ*90DrmH^czjc=(4(uGgd^*3QI%@IW zos}>Co+`t^2I8TWYcXN(9W-DzwaIUJM5@>Ei*a#P=N09FN3NYMv)AJOE11!t6R|~T zxEoPa9&;h&>bHLVqlWxZ=w1z1KHh^LZkj#w!W79{;O%~q1P{NF8uxVOLax+o3;m=XTABmW$&Rk|FoX?{ms9=i>d#; zdj8|A|6aHKdg#A5uU`KC-+#a)16_`S!hD3wl~G88!e;the5Fix$f+}o@s-*dWwu8{ zon^7FOfc=>2IQRe-|8z*$lYNW)o?cWq;HwMa))VZ&bhE=-}3av9hQX+=c4}ct-z+8 z{ED3V*sy06Ik`LiH#gMBXFgjgR_+Ykn{z&C%(GQ_jXQ%+G@MUa{A{&k+GV?#bD_)D zXO)GyyTX2KxX}INvo+4jT|dRjI<~%#wV4pG6q_>QcKRJ_b68iA6`gPHKygl`XQiJm zlfD-fES-z>7r8th>%3K1i1;Hq$>X5;vure!Mb!gUp86Cj>jH&UG3{*yM7GFE8$s>~^lz zlZnXFvOF=(YtmK7L8FBW{^`?lqhjCL@R_ePW#D*}_-d!MUqv13e;85oTu}pjeX?HM zWkyywLSI&~S-;eQkR}k&TC~@4=krFcXcyDJpkHCCBJ7ihsoX)yFprFy7guwbY-XR8#!$dz>_IbBIX_blmYyMp_sBarPuW8A8FdJW0$ zH{jZRVTbPgVprIRyK4)IC(sLOSM*rgc}@S8dzM_D;!k>A(~sUoSELJUt!EceuiKfQ zrY$cqjM(8nUl=fW-#fbDWk0ax#xFKbcQ`wj?w>M$zb)~7$C)smX(HASbKw3>0t_@! z{_yRKU0*0B&Idt^GrM!ru!`~X799HY@%!}p9n`Q>5;Ig-(INOQJt9Z2{#kpj_s+T% zQqPIO|J2mCyP~Ykv;)|ym`O9^1=8H#wGf6-&c=fx{K%*u$=E>E}Dn ze71UG&xxhk$1bvZ7&0fXN=xzC<-t5lI97-nd`z|N4Db$;RIrqoh?zckhBr;DrK z+0chs!{eM|>hkfnF*ohkXL3!Qm&Lc0MeJSG51scL!qBYwJ~qe}RnZkTEj z*S*((^7W<*v=lDUEsF83d^kvKGH9L+=J4J`%zpQ zsgD)u_UU9dT-m?pFT;paY9}0U!rpN%N-6<&x3ycig>jljmpekP*-HZnTo+nW8o9OV zY{D5>Hb#_CYMai`bIG!yO_;x3?8+Kx8Cga)35V7$TD=ATImQ}iOuu^eN@S|L-K+f3 zj&B<7>L#?hR4QbD+p_uzACaV77xUd2lv1vk`)+F|bg7{cdu{d1^6=Kp0bhR=BNOT- z(k*El5c-F*I*)c3?~seSo3qjMBFrtSS=OOm)xFQ(3kvcMNV2T`Ab9#hzmU9sy+;l! z@5Sv3Z)xe%p>l_D5Em0z)374U)_EOUJl^k0jVq+oz1B#V`A&CBP1U{MFHY*7H1%t>vQOZETA0 zF4?l{gT;ZMUNRq-(QM2l0_!!EN&u#rD)Y5_*r&iWPGroOauLHS4}8yS*)7a7b)I0a z>eD>my4DLj2voL*F$?B%ir!CT#>iZbV!EK{TQD3WgEhdo-Geej5CEX1>#}!S`ZP1z zSIZpHe9LPFyy>RLTBmRm1TI7}FDBL&!c>U{r^K$e8_f#(olpmqC5wu+d!crM>1P!l z6ip8VU1w2$z)lU3sjY5PilmRjxoje3azi{+S0^}ogdfqgvVC;{l&Ez+{kIae zjp%kdnHV>^FHj=|5Gt7_+Nr+S`V)qIot7IOR&*PC%GPZOm2uStp>B|?QZrQDR7E#U zGFC`v7@@pQY8Y>56Rme89dPS<*{$mc{8iEa>!ltRu8plO7)dM_M9S&W_mZh6$H8)u zx+)r)6r+Qu%rgDb%^0x0o2dI&unv}Ch}&(@_i65DE%q43tA-OQ*G;59!thSI-X&Q3 zx(zdB+gEPmK*2iuSHoce**r_?udh$2E|_EIEMAibQ%^)R!OH~zU53|uhgh~#(;3u!{8lmoC-AOk}bn2hkV**vHo~M75*`JB&GOru2 zpk+M!i9Gj!+cZ0Ib9i+D0;XCwdqdV&I=Rz6{TfmC4PgUB@UB`mQnnmab@vpyT7nuh zgz>1szGcG}NAr9t+isn2H~e8Y1QBDMo9d}r1c7~^P?D;D;zpgE@EoudN|q9do$LiM zH#VHe&>k-5Qq5b4euf*?*$pdz;k2))Nn%z=x(FZW;jvs7Oh??tG-BK6u=i)|1qzBUt|xvjU}q?Pp_dyrpr~}vbWcZ=E+XO&vwIN>61639seD( zthJ-(9!s*KzbP@(CDSC8?Ev5dMgL4NZROz$FZ+WBM0w~GY~qDcuS0i6RTtEHbVkYe zk&}v1EtH`9SOp_}bc4wL;X`)?!@C}4sgoY)VR%eq!C2y9gn`xm)dh^lybS9nICbf& zbvLhftF#$g+={-$Y5LvHF0J`ibvmIXGUYToxny2LsHzFH&Ad9`!G_z|mUN1rL? zED3&(8M_EScf#pj-8?(@+H0MM;X_sb{lG7b)ddgS+-H(8*{%1(Y=|U}wOdBm;Z@!` zofw{btfxKfb=h#+P9KnsUn*R;6)W2IIhy~n^z)g+JmwvM$@LoBW8+@Q(kQVmg^lwV z4GMS(=v$(pyWQmSa36~L>CQvptMPyRm>}NRB$~E)nHtQkkxVp3xdPSO3A@@2FEO~~ zfj{xgRUX`x%nhnJ>)$WgNn3vMQ6@!KP1bGYxp>jAL7k&2<}pN9Q_K`Otr38+<98A~ z)-(L^34?I+d}gu}OaUB^;W63la-(`5d(F+H^R&NR_nnXW%WnP72dV-5ng>QNTn1`g z9dR>bG7#$?FV!D2A~5&kEpJKVk(p zE?k(@#+VFZ@Rep)SF!evwXT`J}Z)$ z7d&@LF%PmEpL>lTIsvOtXa4~)cKREllbz;ryLpzp_0j$_uXYvqxy^k0#eTeB0$!cs={@GPfNGfYZxKiZaBBt{){83>- zczwBtw%bjJ=)EF4#hKq7!>&$!6mL#7oom}wa1j{7-6oSl9pjm54>g%*b`iZ>G4*va zlx*4UG=&r67rZGLF#9k(>NE~ZKL27@f!%G6b8@|xv3*7J38&de>e2~J^1%BT3{j0A zDC|tpa6&Mz7SI{Hetyx#=er7uh&4>r%@>Vl0JqUi|Kg#C`9Q2<>BWO%9_tP}t@x;7 z4>eHM7i0YoqG5C8r9XBReB?9F@)+NEnOOp@vs0OF+WilE%nm#8%p1G$v~2zcpb*}; zUA7K)Gak?7Q>NbH=a&AeF-x!pc$phcOSFQDJ^B_OJzQdk%V<6Zmoe-im`92Fi9Gd> zV7mS4e^0+$@spDq`_e*5miI+^t=rgv81BmEX5MlhvsZnbh=HGCyvA$Cj$W#sU6th3 zRTorChA%Pd-c|4( zF)k7HaZc*WJY;n0mACgymMDM?k44j1!P1u)HwngSLY=n5XU^+6pJp}xU~x-e&))Jj z4;;!f8x?k}4xN7)*2>-PZHOdSZ>WO>I8ZE33Kv=ZORc2ynF95-Y&n3Siu(e35?bGv(U3 z|K&rg51w$sy@VY_(8-?PUHkOZnxujC80I*2UyHOVS$|he{{ZWC1wK-l#UhGzQ|dzV zbwwZS1w>R}sEm5L%mZX7(^^`p;uy?Y)|RFi|4) zjcTrNqTzP%$U~p?T(Sdn&&OFY9N=RgsPygyXs&1-N`NG_UR>Ji$aHHA!yE)$oR=Dm zO?%z+UtZ%xV0=VOy<~b5un@1MGhic7_a{bMC6MfM zSmk9-sq|^yv`95C1n2;u+VPByH{Jrq+|Lgizv=zYD(D3!TA(j`%om*Sn1@@Z&`vi9 z0^DyB_pKAP>!?o?j0P`Uub7w0zSPuS&CB#5Ze&+bsK~AJvS*!IxiNpL`hPu^OOiF% z3!#jLcr3@{sp|yL*{K(!|MKoC7%H-#xvisB{d2;+Em+nHe+(6M{vlwJpx-DMjw$dX zSw9zB!V)a{oZsd}_db$jsT7Rg32?Y*JxBDrywq@!y9q2?MG&G`vL&z!vq?_tXQFu! zpq~l4x$ph`zg-2}ykNYY*8Rjr3QQ-3o9zYls`*{Qm8j-2p1TW-uL0ZL$rb@!4~0%~ z{#*M^&*t4`BAbpXxeZQZG=XOoss~1*o4w#;S31!j64OA;dZ%gj74|2){_w*;e*Wyz zxTO(U5{*mEPT0lKJ{|2+L${SKQDHjZ^FS>zT?a#f`GKP&hI14oqcq8Uua4!I=0pF* zSf7*{Zo1Ob*@u971>RFYEVkEBIvhE#^c^QHI=V}6t`uJ6T4*;JT&4z)34jdw=4MAsF?=P{H;KuMM4X|iaFxm_^Yg-aAkbbmRV*$H87IM> zB-umX!v-D<0QzsSz6!38qw>o>0M=HA1%rQt;B4}i0ydEzm_14?NAe^w{I3vZfK_t~zJFWiSu_rbvY z!oj;49|_@Iv4CBmIM0GDAgUFns$2pNF9s$#u)MS@Pgmk@5xRaTtbgC87lu0u=ha24 z(JGwpq3UrwK)YpKGI3xu4kTbSOY-N-=6Sh$uoq#HaFl|kcqsmE&(_H1-TLG*J!aDg zDnvPwrMzsU4-CZJYN9dIJ{Y0Ij`*mSC_A8#$H3-_WD z$(HPT7hAo=P(zn1U>h{5-Yz)M4Ueb{E}JQs`Sl~8ufE;)YnhDpR9C}byRLE8H6Qgs z6@7~E#UNDhr=i)-{Zf}K!YNqKgJcZH;rHk@$Id-{O(hG~Mx5qmzY+Ya$`*T>v&57G zbZTHFYOk16aD>42An~^-oeb(73EqyM`K8aaJ{ivXT%j^tCgdF2>mmYvtIpjep zcGFv3dXH`pHblS~DysRcD?pMOl2|UqMb)iXu!Hf(VUx;eS%_m%yE(rupLJ^aIlCN#fn_f zIcTVAiU3w%*aSjEFjZyC%N8rTdS(5j^#}WYod8C4M~_2VjzyTTB~IF$V@_oWz_y$tIJBk(`K6@lb{sP^su@}`(n+6D~@)v5tA7^6n!p($>ziNrQh+a>?! zrHo)@9V;KBmkP+I7O21HJ|IUo-s}7IQ8Y?mPB}U@vFl_*K7iOllZaYI7AU)GvX`Et zbZmp40y@3a?A4FMsdo02YRev2v@$bntOWprWU3+^J;qjI0rXy#2T-q|%)0Ik?!~If z4h4047uZ_`cN9}v>5@ySgI6r*%r4(;#bu1h-gC99Wv9t{K>B#C5zrq~AtXGZw2Ne@ zbR<-gi*J$zQZqUG4id2g7+7OMnX9vaS%?+#IS)Yoitbrs<0;^_#PxhYFwL zKu@WkWVsC}3IFI{xWM}4Uf^obtpzp7=Ih|#G}9|beKXTp0Xb-i{Hy5bfSEa}K`f1Q zLM;POVZ=K{e{39;z|K*ECF*S{q-UAGS3ao(x@jT@)oUlj;;Rd-V%t3oZY)c)o4UJV zC3copB}3};nMYR(JRL9VT8WOQZ!4firzfEiR2VQ+fi#gR1j3%uMFQ6XdsZ;_u)YCI za^6@P|7b+ihCd8qS+1M)5wnx_$aF>7djhu|qZYVK3GtLh*^N%(31_bpwgyh{K&O&v z`}AVhuTS;K6zIiDte0s}blGJSJ=QS5HR)~vSV7rDt~-oVs1s^LeVGAJ`|1QceMXKL zfu3*4>ak+MBenw$Gm*J6)sw`_?8gH4z|~$b4p)+#^dX7gKuLDX1Q>0D$FTk;8KW8w z7^xZZmcCy%mH{u@U5Rp1ze>^9%b;W}#tALD*~G+^juMRXU}u#Xi~~!+3~W9KgmiX2 z)}In>i!-`R;1cLTAUe%8kx>3hq#gVx7-$$F>9>+lr*0P!7r}I|+4M>GCf#6(Zt8gd z?S9wPj@!U6g{eT3u?d4jg?WhC3fM!`Z7NulNBt-8X=RaEHwPyd>ega&Rhb!>_Y_9% zj%aQlErKCL+fkFkbS2huG+6XPEy>vGYTY~d#OJ?zQ=EV! zpqpqO=QuWzO_2fv%cc_Z5E7??EyP?xM8T9?$9qAF91uqhaDo&^$^8%Cq`f@dr-!O< zQMxtIKa((DX`G@<4zvo)ul~G`473}MVk-w%s|%NacJ}eN9i1C?#~hnoxOu2sKZj&u z>Yzkz0JLaWg*z)u90?>;sAPQ(QZYT5uo0BM&w^dFk4X{&vP0crBR=}I<2E)=)wh;T z;q}K|$i@}}TPyXU(?VQq6MYugs!6C%`={NC!75;Kf)cl-LJ&LcUv+NYc2|akCMf>t zy7v^zgVOPUDFt1;x?k16T+~o%-maAzZRk(mxx1RajGJekvcur5M&$Eh%m zOjW4kb=pb%S2D&?dA`(6KyYsQiA0E{??}`*SEz(OfA?6}+NZSTc%4wixTT0n*K98u zGqzI={6&rOQYH~BRjk^brO*mwQ;ZiNQ%gURskl)O2c{pr+}(*7!APUI04{d5uc5BW z8XwTa*r;g(Q-!KBy zL4qVw?B%c{0l>2)I*uyva(Pe_GEMmOnLJxZjf~pmFkeWliUtxY*3l_XH}G4%x3p)x zc?z)Db&pgw7mZOgObl&e`;g%Dvh02%KQHomQ*MHQ&l~Fp6mOy-L;5E`;;s~_aQ+W$~q7#9~wD$LSW~) z26~{|#S1!_gk47r4{s>ZRn%7mrRC*b?s4?8U4i{@P;%K=J1~HaTVWqLM5PMdbWf55 zz;ZQ|FO8MWBORa?tWo|w&b7}_Y>6ac6x z#4yRxu8C?>Bi)q7JDVIko*lolV1B}}F?RihI!0vf;J^kLikVd~u7bIw=uBlfKI2*? z)B{&4+|kmvonR}8w4r;FrL~!??s0UGkf1A;`I}l=rQ4=$A{Z+~O906h1Ys2$C&5=B zM=+_xPoN6=1;l~DzFCixFZ~c{eNNlUg1sOe#QIRJ5H*kL>oYVf;WqU5c(8#)c-Z2) zcrQwlY$h~7fzQE?+M@$DFD%@wr4$t|-p0JEpcYrONRLBv-vY5TTt=WfdMTdTWeOl?!X1H^A zP|4~;&w8C{81?K-pCq0g=Xk3Y=AW=ul~Fu12K1KDDWI{Y#iQE*LYrU_0fnWrWfSKL zQ{f~WRjn&mqWJzLRo1`mX623Px8t44`qNTSLF~IkuY)n3e#<=Hl=tcDWv+)h`R>aQawCKC0g&Q^B^OxH6%0`+fBr8~mfw z|BE+raq$i1TX4Yiox;(TJ^VWSlFi%>S~Ov3+o}Px;}$!2c!NTUhqXupU^2qhT(IHn zaLF*ZF0o60Y`5_>Hw0E zxrgm-=R+hLoG97ogw~~0=~+_0kTVUq8Z5NnTdHMU5j^zzPXnZ@a!<}~< zSB*W~ap`$adhq3YqjOikf4I|`^R?+AkM9*UuKwU~>YMXQy3Kfhd~W6H!=1A(G^B@i zyg#|I@{_||mtOFuhYh+vEqBfS!`;qYXi5)%|Ne}|HD4d@@#cb>9{L866%!__Xok4~`6da|vf8 z7$5F9)pe2^2<$j1FoJpqz=0&KmJx7Bwrd2@u@0^6^H?q`CA2u}nG06gEn2Q#mPm?M z{xRH}5+GaB&;&cv;$Xe&9mLND3+&8OnCxQ;1bt651sEIaVj6T<_Lr&gs_CYqA6+}; ztJK2HVX{7ZZ;YzTAx5ujHb&)+_IdCYwyET8UN=w4By180X>b+0VcOL0IrKO=xxIx;$f#g{ko>R17}+R7)=T&3_wwM@ zQupI~UryU`6)0Kvx4j;)2!NuySC29KUrk*nk7ei0`nyxzuN%C*TS zM{Iul$H&Kvx)!)mq3X+~Vm4L{YCti-CV@_(HA2xVQ~1(01lrrtT9_`=lFZjAPE1)`QFf@vp$}lHWckHmc2b3^CQ5PzHbKeo=>R8% z(XnO4(vSmNGIR;1JGO0Q6N@d5rp~AOqj%{c|65dPT0g7{a$QOfO$gxkK7H7v-s$uuC0e2;0ZPE}PMuxi`7#77LtK_TmX$*%O;5@$LVfQ2 zef`V$i8JmI=Lgx{=D|;>aL~4Ogn80|-PtWa0tGSjq+LZ-Yrb@K|89A6UU<>28MSLp zz#gYhuH6vcYo~rV91zLAErm4=mUwOqG%0jvIXIo_qOhW0I|2NHt$+%&v#cXaMxBJQ z@4vr8E|5V|4jU~~38nfbW&=qqOc)`B5GqJP_PUS?uuuKFS6Qr6_X73^U=B*}o!ADe zi}5jKrqV;#TStGo>o_D=$2Xmw(o!5$=A5_w%6HQ;hj#cjCvxA!`JS~m?q-hbFzMsa zxqaE&b(|NSR?aHme-*Hm`1{rp66r0qcy(#mm;*%jIK9|ujm+WL7f=HCwClY=s_8bk*7;=Lue%g(7Kp_{!d5de zlC2?C@aWq}Pmys-ku9YQygC85%gI_T1)Rzc2i9^J#@(V_=&P`yGfwuMe|CGxp2b44 zeEbQ?f7y>$&&U5bNjAsvnO>d20msuDi zFT2woj{I4lN1ay;vewC?6)o_B2e9VWcMPsyg0?TA^0BUESF9aOa_RE=>{EkZL8EAx z0y?#zVT!c^1^d8E*rAPmOXgJ25ns5RKGd5s8tZtNEa}3AbZS5i*z}6n$jCc5y$0@4 z!d?-rjnW4g+EA*@)VO-8R{H3i?hpFC3YtJIAm$^$!2j>z;?T}z1W&7Qzx-`7N>6oy25^bxoN0GU8TnRu^mlOv1=CxIyt1PN@pl2oW$ zs4yjETIP_cSe;ao5Gt1S+1@z2bXzvaCE@91(O~XdIIfsFg)Lm^J02ziMpUpXRO=~< z7J~MY=tA9o0P?^n<;u@r4fdwY|00qujZjgXiv^SpSOwVLZhV6^i+xrOjDQR5Ku}WM zD_tbGxOBQgUy1Cpu%*cHbs8BY8SQl)o$LXk|LDsMyXN!~Wx81Ur%PF)+tS4qF3~SB zvctJ{%ecD8!WR3Ic+D}(KrQ|^5tzyyl&=nSrR zU5{tKPJS?Lh`oGf-Ii^v9hj`(U)MmtZPp!Hwm(%fw*@A+W-RGr3JEOLXSRz`%pn@VaQ0H zonFTfW~<~MM?pom6t5!-Y!yiyU~W3vwJ@0kcy9UmZ0B)G3$qIB`+ngjxxipZ5p-$5UoP`g zxZ}W{&IW8SSGXEiQ7MYRX$}I#H4O4vatKnH@A288#Tz}1Q(bAi?&M%oG2{Vt#g#6@ zUrFduG)S>V)n&Rt2Q{SF)x*wquj|?d9?7RKwS}(pKWdCtbb=|Yh+0iER~*X+=q3R} z-p{>d>rUeDVXvyzO4nkUj=~u-{25G$rdx(Qd{nw1l=(qO2!dJC#_e@+RWyY32aL)8H1m6w@UgVx_lYttTIl-)I$=Z-t#c-^mZSRVC($nr1{ zpfZ_jY?#WM!xX+4{;K|b{#?wEM-R_VxIsT9TEi|%;Wjx+7Sg{6rV^6vVVg)w4*LlR zwv|p-Z3T{YBICn!8<}N)`2Oo0Z_3-Urd@iwxt=(Tpl{@0wQRCzn(nXy`XgeiC@pg8 z6pTD{4(1=AsoInRq!jSO?dBEq?kR>Fby`C_PnjGBXY7t^`MBj#-k|mQE1SV^h!R^YD>6tI0IO?IwSAuX%ovMqk z$=jlQb@lI0KMXngumc7+0mqdk`QR_E;5;p%=jQ>tY;3^2R73+h}rXSqd&!Khyk7<-mjrXvnxKsL$CJA`SJV`5+&>(o9L>9YxspfQtnPfnCVFq{VT4QRF!?=+tR2_QgZHc&1S;$*$R5R&X;+dz*YEu%np z=Bt$%0#^fiD!wj;B5ES&4XC5kcU!Z(EC$7jzhceNqTpnoeiA4e1c;#!jahqTAzIIT zkdx>=@&p|L-Q1K1MH0bj;b1ul6`{>$0w&2)L)ow&fNtR!4;VzY8c5nVDgro3lwh$@A^%HMerZJUm=?5rGZE_rEhb(Lvd5#O(gQzrEN8u1 zN}nN^8`36$WbuUxHf`2gh52AJ$?$SFQK53{2$K#b5>8|lhG#1lJDY&60hTZo z)Gwf;&omG00_i?+JWK-_P8bJHU+aRA8qR=3?LVMz<;)tsYDi}cL^=&rl3t2#12{V{ zme9HA`FoTQc?;eL2y1ik^GG+|R15~-4nBi@-XpnB&e79-;t8c{Wpws?Ua)%MY7&Dr z$x{^-h0#$k0x$gm=FS=ndP$TIeW6U9`&pF!9m;5oX9?Gh+os1gLUbbTsm@1v`< z)FetWB!e4@*2aE7tpKS$3kQy2B+=F2XJT;k@yl4(g1d+ZB>?fLHUEL4{iaA0G;zEh zP#(};(Vk``?)@t)2DwUiuh|D0Il(iey1Zyd=u5*E%A_PpFrDh8Xfaj-Ri$tqCXgDB z{Y7I1RZrT2jLN8G82N()n4)wLOnF@@$4@M7INj$xrJKYZKwEK?mzF^cNp+fOVrBPZ@98{5z=+|6S=3XdpbR|KA1KGL<|Fc6>z+q~u)t%cOdscWO&18FK% zf(nV=ZE8Zi66^L|qt1~qHN!?Mp05%tf-~jw!G)Mxe z3RMjTf)rw&1a^Xg9ws04ABe{6P1poRejj#a#nYP|H_-VA6PrvsaSV3oE_#zE>n8=I6lFnn8Eqniokn)UmA|VRz*7+PSmI{UZy9?C%ru&9rjz( z!)>ge_6YQJGct7&v#Q>Nx_xADnr$Pmj$dO7N?!Jo#H#unRH6ilCUwY%O1j(hKx+!O z^J#h7Dd4Y~8c`t#utvEUgMhib6h_a+xSReE~qM({Dol;9-jz_hF{ z>N_5HA-6^@zbLq#>ixu0FRkmSmE)c|ho! zC2B|WGKscpkMW}7FI1_k4(?d613ssgk}w5r1LL)0s=JQ<#EEWwA@~NzXw!q#rvZVo zS%L9Nv5baTi+B~jK@pmi9kKml)nzW_~W z367DtHoy?8+%!HGw0H*_ z(L-O4|7pUV7JuBnnq-KEeCi$C8=G6HXwucKtEK)TT~)27sUPA+T7*XcBd|STF-db; zx50mu@4wGjyf*N5#}VAA=&nYqY<>l%5It{cK;6OFW4e6sLfogD%xoL^=PMM1jtajy0v1;P;4INIsBGH650bgk*<(0K5ckE($WL6T~Wpibi$UIWJ|N=Iz0hWJ63 zngUb%{-B%0lu-XF-H48+YH*UEuLnCxxWat_og_xlO@f6=Cjukpf2Cx3Kvm-HUA9I3 zg(2;62PfAgzNf^B@i)Ou+?xkg(><&8U&KC!L31w7RKbmZAwok0#L=2-Fko;hsHA1dm-rPY*c*61}tp z-o@=a-~kn$SANez+IUW^U>rZ#-}HIyR84 zEyiRpjC8|)&PUgkpN}#1=sS|=(*=Sqnlv`%qd3x)H(X!2yLw=vb_zZuZwVAYy%j$X zs00SU0bM2av9>ST;w>QEu73c%1UdKC!Yq;wKq2g;MDjXi6C;!#qq$X?AV6Cb+^xg{ zgJ<|_f;>8tc0RlMz;&<~bh29#;5HnpaD^xuTgjQU%~#sz$OU=SMNw~uq7v$gc9wLlXdH<00%h~v&lcP@1GtwUUK=gCyV2rB0_6`Z zz)+((AT8W42K7J#yaU<-gGi>Pys=I-7ef0U-`;|1C@2xUF&X}?2ojq>6#*+TcoJ&~ z&9m3Fnm+o_L{r~^DAke++i)zgIKhFijL`8}%%qR~h(>NZL6{o91f1Q@xm(P@L82s@ zM+650eK88XALFyyp-t&YbhY!?hui)RXqfjq=pq{fsR^VPfQ?`yNEA?M-b@Tdb2Yet z{Uy`}5wSb9Zd8Dx@k2?-ustn%3(C=05+;~5hphw&E&I0 zxIns+yGKhHkXKi~^~28=%r^E!SCteWt!TH3@ge(LUhl`hGyrTdT;HX+3KR}}bcuAq1x^3t;l1^wRb)AH%5NK51QCk$XP)TTK8Ua!1%*Jjhk?VkTB#eJWqbxqNq#Kv=Z z;7`y?GF4Dt;W+z{czWLL`i#I+am$rxr?m)XgG^;yEqX$%k`_Da@SG5)kh)BaKr2y( z^par}e5r{AX3`RG{EvGJ@{Nm07-s9K)L*oodxCaC-U3`9P%)6qH_=#-wUa4Adz6lf zp$PnljfxQzKHc)aMVn6d`9^brI)&PxRh7xTCc$KKqoZ))0IRG|K+zz?!^yBCNwBk% zkP&zHSf5jkyX&Vd99a=GRhuj~QFD}NqHhI0%j*lQNTp*4=vL}`;_v1(k*a)q3Fe|S zU{l!$7zlnFHUDXeVZeuTX&=>{*nFG`cGCW)J|7On7G9qRzEPsRumtG)2VlJy{zekr zMp@&B-p&tZmNcI)S&!`0MAF4>uot|Ats<^y|zquUhN1{oNKqQeE$=Dr*;RL7UIYKze2i`{C;zt$wB9MTA8@)mgNg$@1 zKD)7f!C_M#H~^qF$qb)qF^k29K2~}ti5B#p631)2Jx6(KBAi6sP-47n;j9+?q^#`5 z;`mW%%7>e%e3Ip>_VjoFdbt^eT6u$(HO){;)_rNHfo2ftq1sk=#>e5T338BT3N?@$ zt#q)PlaZiUBts$9LD9N4jfln3ytM?jC>;sN2IG}piHN2iDaphr!K>#Z2Cf)FH}|{g zr!PmfN;|CK#Qz|YH1uAi1gRzyx~n9qnw@iM>gkUNY8~bTu)~GL@i(#H`Q>R3DP1Sl#QpJjyj>P1*hebdvNUJVmUVD#Icw{O-hP8J zaW{b~gaS5UYdSR-^vFQ9)B@a%x3;1RCB$cKjomWs)4i#|)It!h)^gM+LTPV%QNf@S z){w}IQ&n>s*n;P`nQOrzCERUz1uu{oC)@yjO5C`jLwEGW#BNw~$tl?4)L@ju8hW?- zEhRBNjattJ%_;NSN9`pk64eGj$(gzDljF+{iCK2G5_}4Jiv}BNN5Xl{?ViS+y~jvk zF^KjoP0x-3y?vI5Q8P)pTkl1GKdRhY-~%g3rkfEoY)#aL70?HYHjiRL7_2*I@q(es z#21_Q!QLR;V{FuPU4WBnYZv_6vVnYI2v9mG(_ar-d?VhjDUZ_{_nQO3jQjweQX#>5 zr@l7Ru?vdE=M*Qc$-Fx)q!VEz5C?COPo7y-%Dy_zX>^0#N~iz=wM!@PRPpD7a410a zR1C>-Th+C5l9uc($N>*XlGjoUbCnKS*a&wMUbbuiDY&!S*a}$C-N%$@xj+X18qpdY z?4)zhQxGo)kNN!Q^e?9GzrC+^`oVqspYA&~{m^gw-|SPSdy)=V_Sa88JpDk_{)XvC z_8mys-#Got-wtH$_f9{W^u>_<*QXzw{>8Zeqv*`zp=#eS{+!uuW9-T{MTMCViV!CW zZBi;KX_9(-%`QbH9a1Smy?U!RG^It2ecv6s5Q?I*Oi{^9Oc9FoJHNkt%*^LA=ggev zIrn{C-|HT6UvTl$ES|VOxMVCVQY;BBHP22Ej|7(mXQzorgUg?0XNzUQ6=T`eVtH_- zc}|CTD!3{*XHYyFT>Ug>Ts$9KGnTU;25i(kmzqgn*9PYrW>VO7Pjf9YmD%-Uxz3q1 zc7u7ISEeSrF*q+EQ@05&u$*ei_E06Tg>wlGELaeg7ecdP1&ta^RqLV?6$G| z>P#zkyLmxJrY-wd&i0*vsmmt^Wuc8AoiQ!;&rPS;g_WR&c!|Yi0 zho_|$+41b*u~O&kB=(4TnOAl)`(tofK=v*6r>AAS>=gFrv9ic)5qs3UJR$o5`%7?n zT6P9|>}h#+b|zaoR$iT*%a)l}bYvH@zXn$fW|y+ZpH_@#SF$I@Di*R)w%ojun$y7k z7F=nV)58A#w9+D{ojo~L>73KWo-(iU%IRVM2(Ajq>0?hnt>WeMvuDPtB6B3{S@Y_I zoDufV;OexTQTDH=)!8{R_S{%?b&i}pZ(h@pGsXTLTr-$6%U*a|GoCZg{xepykOMf_ zjzP^Oa3D5nm`mZ{#HdBCG6$>kopWg%0;AR|SCd0z*9PS3a!BG@UamfeEUk^qrE@5Z zx`bR4jsm+bE!UKzD6Y%SWpb3Hb=A369A!p*N3JbLg&J7QII7b6gD3n+&F6N2E#m0j=H$PB5x~4L)ze+=grY%GVh+TuoDo4h~ zq|YMrMI2K`YeN15jv2c(EkA=}E^f`v&*U(qt=0Lt944c!BfpTdlHE3#U&^r%w~gml zaxA573;8I=iqTFjXyB}3w;L9;aID4c76t7b8)>_9K^MoC@!YGRhqIdfJfNVDvqt=! zSJ2O~lRl3ukZ|l79SH>^oVDzZw1QENgSaERK*n*Dc2pP0IZlkuj)E!9I(Fw^!7RsF z+&Nw_&vB7p6NZ_t#cNrE^xUS+Zi$Z1Y25FabA&u+Cc;Qv3$=%3)5m2bh zbr-+j73y<6q%R^1>0D37%Y;G`?k4ujv_ezvX7S7HLMC^M^ksFS6?ZG6yQ9#SyN%sF zSZL4n5_gXmI&rs4yB7*!t~aBHTI9yv!R|3E^5pIm_gEBd<@!i_oQu4+B*9cfa&?b&-JU&*<$a z3gsSP_YM|?a|6V^<3$nNgVNrGB81Cg^ihjrxQEz%hQ+bmKyjZ%aXk01w9mOXi5tXt z<5ir@J;HtyP<)GfRQ!floWlJ}`X;hi#68A%n^63K`#1Y-T5$$9So}7-IFrkkzO63K z<#HJBI*JRqT=u)c;!-Y8{BFFslFOIATPQ}k0!BZzq=74B_Zyb9a6`oX7A5W6*57nhsym-cNN2x9EDtmaa)Sj0h9v&}s;w4Il7fNAX5@Uo~=El3m9x*KQb-IRWeEMxI*F+L@f1@UgPKc$r& z{hKyR# zz{_LH3@ciA`C^$xMLVxRDs!&r;uSK!dR6rBir8NRD*AZE;;+1leqM?6Yh;ClSIQVq zs2JguvB%RYMtSAp@$3p2uR=OrT_NXHGA24Irg&BCiNT6lUbT2)ykeeLBb`{N0DP1o zr&bd9wQRXzC52xnmRnRR^XsK@=SmvCf$`0&Qj_1v{uWTF%Wo2Y<5lYOo2B0(E9v|e z#`lCu6aF*y_q0k=eyjLFg>F|DANYx=O(BXUud|h4Kg3GlNy({6X=|cvS>{ zNIJ7nh43YeS!#6*|2=!wusW9iK|E_w9nT+@&N^2o@kbaxy{eP>AK5iGT8{ zQ}~~yKO?I}{87fQgz5+UFYI4w)fxOT@vrRaOukh5tGYUuFJsJgR2TBUvgZb?OZnsC zx$){s{)BXHp&I4O8S~Vd2L3npykSiX|GRkJqNbfcDV=w&>Ecf@etXsQ@PDv>2h{ZO zr^UZ{HU0b<>F>xI34fNckWe$i|H)oRs~P405-()e$oO;8h3XnPf1dHDqh^Z#oBe07 zW|qGo{xe=P&;KL+vrq#BfC*Hw&K}|bBa|Y*Wdci7S%8-T7nFvz6wr25Q$XZE2T@&& zSb+GbzJM%)&Y^Sxg^5cjQpn-5zv_w)w&qL5)Q?vE>^HKlVVvHFEEx-TG75H^2f)z4_b9EwtDN`}A?t#FJqjT(54rc!5JpqHfjyI&SU)0I%c0(_9~C%cQgiBM0!JCOrd}>^Vybr5 zPYKp>REO$k167kbFl&Na}5o=o+`1{2{Xj{4mOQ{m=J^_&K#aEna6rol?M zm8sF$U@P3l(HLs57kXuCOf)zNx63sCG{8b{jO1^06Yk(>8Z~+fcV=o@Hf|OA$TVFV zy@k7&TH70U33qd}4mSD;_hf4E8~ug8GOcrsETJD$JFziHxR;}SxAB;8U#50WBS*Mj zrd`u05c)H9IvYcU2RJ%Ijp4$8Or43w2;o7Q&Ywm^$YScMHpK`JadeHEVugX3x|U7x z!oxCMm!>3P5OdM?rexs}&Z2`&w}eMC7x9}?gn!8voof;ak1-b~Ha!sj%~^c6DMJ{X zxj3gOQ^=Mru4&2@a+rFZO@%@(M{lU9RLINJn`o*O@@0B|noyyDsju4HAQW=+jhb78 zA({G?&F#YDGJTikE@3FsV0&|q@C3);U~`}FWTpYXxnCG2GdR~Q5r#7j6Prhbr#Oap zn@5GGGYxZ^Wx_Ku!Vh{1*L?OR^>BTIeCM%%zDf zCLxzOOYgRrhFr;9n$yAziIXj@X|W24XBv05*oIu?7!S4Bha_YgPqa9NB+88cw7?-r zOcT{-ZXwq=CPvRZL#}61gz=DI34S0dI>QHua0dVl0sgHvI%I5y5Ln_4tjxMIg7&Ji zFfHf}NfGgfb?Xbf(f*! zSv(p75FiIT+LoaBW55c*>@*R6m5&n3>~O0-s)X`S9LfR*H3{+UACd9zMx~f~t|bpy zuk!^q1*cd*9(7iG<{@wfJ0B}Iob>}(Zd!!v0BQioTBHg4zSs@^`--e^2g(3vXhFBA zxkUhvB6fR&4aa-+Z>Bk%yk!kA-2Td#%!$_hFN zxmSr$i9j0wdXVm(gN@U*&^+G$coEZ43Cb<#;5hoW6-~l16Ge<@ z1saR!78`&8Ql-2i7OFXa%f6$B#e+pbC^>OdoW#BGU2p zY81pKr}LG~)K=GXogI@3S+41w%)%f3t~WbZ7AhEQsPD3{RZLyi*(I@|rn*YI>_Szl zT<5x+rl$4X!a7$^kx|EUH2HBrce$xcLVhbly5Oe`qt#0`EGClaS$m6VQNg1FQ|krA20*d29S%oSeZ6-INH*_ zdbD+&vsF>?RDBs8x+HZ2`Q;_sC8?fzFV7Y(9q_byxvtRIVAF<|uC_~mds@D{RX7>J z+}~;Fre5V%ui#~?dDU#oivzk^+>Lnfal3Za#;_MUs7@B~7IrN;C-o5s&M;X{QN{$X zy38&vj)$5gfl#o=6{4@~0Iv`_OQj1sT}T;l_I-KX)@Iu#jTg^tZGUf#>)c?wn!9QH z%iFeV&Tis&zYVqfy7jN_AzM2GuQS~*ZS4SZ_d+$RuDj76 z6;>u~X20++)KOUxgs}kY1VqVBXuT>-PR4HmtB^bUz!vZyO_haj*$s&llOQ3iO`9Nq zXSPP$y!Lm$uytRz?Vrw1h3*48j`xffdKm0H-=nj7(>kxaJ)c82opnCgZCd1+wNu>r zs&G^4PL0m7!pU~8itc43JZ*d8%Sl_vd;7r`PeYvtHcxbaKduj(Vmu1a>r$8pPj!Gd zB*X6ldMyvOI-Cf_q z{IT`xp14>16MLWUIsYp7$Ck6}ntM+C@Z&o6_IONf%W|vfrlMY1E@uK=R-0elINY5% zrNbqT;=^8?CIK0^hhW&L42(VW;VMWVJfcBU^;}Lw4FHskvqqF?6jPw}!`i_2^Q*@{ z{Lk(Yzy5nQyK2wSEADFlmHXRX<*q*Pb>F*JmZ9te`*U7b6!B8`*SxM-&Esz9?&&HZ zzgXcxPl8v%sv~W-QNWwl0%_t5FfmT)b96PT9>K@e>LNy^ibHp|Snc*#JPMb?NG&1n zojzvtLx)iv(O@35q`v)>dgU!bZB6cyO6b3rT!H`oXGO@mt^?=PW=@3sc6>wFxESfe z?j1pUDK8H8;=aRcVR!w$;pfo@XuF<0`{5!o(IRyG(5_XalXSt}GEhpUf{3o&E#xT- z{xzE4VsRwozw5Ku7f69dDJFb>_0cBETX(k(v$VBX(1iY~~Oj=ZTvuO2W@Q6$09-q0>! zwI=j8sSC;>6Oh26z5*ORNr?r7CS(D1{`uqSt7l18;2pq8s#thU7qoL60p!>es$r36;N=y^F2h`G1GEr9N#GFBfH79Abd3U_ zMg;0?fRLmlY|m7OaROzk9}HtJq2rwdSE?XIbR~kzg(%3yJz&18_yk|YU$ys1QSVCs z;{%l^1X;dAum39POFemK;E>(Bb^Fs_^X=XaoIF1uEP1=m(XzX)MO3-c1|x+dys=Zm zcw+=-5By-fw+kDr0gABMmR55Q0%B$ZO0jeIIcKo1F)_*ohf_xIC|(z^rwKI3yY(C( zc&m;;mcX?InC$c=Q{}{#b-Nm$C;(lho5&&ntj?aCG7{lKF~`B82$H|30Tap?(3xtW zEXVQ%;YnZPUFJJu*JpqAsUS~l1i}F6`=)a?)hM|y^7xgkuHWR9({ToeyFq~K)dQxI zJ}QpeboehNgMNBfA>qx2H3r^6{EqD<*AJL(eRIyn0Hr>l?3n(e0Cv6cEvDygb9fmYoLrNpa`+#t0!tf+zM=3J&MaxU z6=1>7Wy?+99>S$RkIBQQ;sEXM?QaS2!?VEut<}j#XAk=x`ZPlU!5ZLxG3t$L$LF1V zno7)l3y@vwustj90dIIYl}N+*BCOCwJ9OaQuP3`-7uff2 zi|ZaJv48V*|L}+6a7&A@-hrZ7%e1)RS9PV9yfFN5W%#P>_=3)^{Oz!ES7*>Nx*)K- zlY$&yN006J6Gft%_4Ylm!6TTzfgqp@E3m! zP=V8kBJAdT&3A-`I#3gH2A+kx^Ww?FjUgVqh)L?{nRBnh&IBSQl5OF7gEa8rDxNt= zgNLu0{R6Jej2J|@(dP@a5KIgt!5HfkKA3E+3ZP1;1YQMG3cD52wXDi`=pGh90)@Dp zsDlSC16N4<>JHfg2}+?+AK;qdj?y!q+pFxp&7UC;)rWl>h@Vk)EohZI%}`EE4MH%} z>~z7%bF(vnJJjDRC-7UL^-h9`GIPZ;d~Sl}FnsFR;6HJn9Dfd+y|qC#@l;R;_PJP6 zgdTv_u^2>|6E+&m3?f$8-Qg4AVLY$}xi*dgClf!Rr~XceZyPQsm`wWb-LUu+JK(mC zV&2-LRN#g$Iz@=S69>xI@)vIZ`BYctZV`7W`RwY+B)2Vt%iI+tZc4x(uDGa#C{o}( zFYNvSQEk_&3FaQIFd0oB6;6i=|lJW~|h z_+ES*I|vm(#Q3Z`4c6s97ysQxK$UOcr|=|n9ZHe_O@vHO?_HvXJkWuJSKP?jWMg(P`g%n)G7edqMwhaLL1`(PSF$kZ5EWs>75Dxz?BirK6!@I62nB2f` zu^0Su<3voYgqe@OsK6owj6j;GYrs8iux=CwLsP9dWZx*z9W+MM5?+CIE_-M&R?GPT zAfiTq46JRzo6rM+A&V4`vx+tW)MHjBQ4&z}#Fe)fI05CMVjC6FBmDDQ|M_rd{XZ%I zBNaso)CJPAAM3bbG_*X>8VrKf#dH2qKvGqh84O|=tXxX8M=kg zSPvePv#%)8fRhf4LZYRDO>1pd&@sH^*DJ*&;O|JCOLK;%aGJ2A2vmNuTZ2n-SOLas zCx6@dN@;*(MWF2cgq(f?S_WSNs)%3@9R?0bO1c;}p@JyJww3OBACK`_*QYf|;lq8k zO-T!(c4L)0?i?^@;1t$|?!cu$OX0;yzfC9}7{8<%4?cq%B8M>OB0RZ=Y70zDFf<}5 zl!_E916s(J^%%mU50QXM(#91Q%M70|%{qar&7+j#8^DuaiQ`Zyg@lT|APL^uVd-uq z3hvPwJWS}vu}du_@X zf<7hBRv|?0FLw%#n*x(?MF7jZI zT-?c$6}tfMjLteJyqyA@JhtT8YOS%d>V$w7tdBs-$Q^_%S$@iujg^UjgO|ZnK=lS| z5d(k)LTIQ0s!I77hjv8ddjK
B*Drzd!A4>feO@8hHrsy-UnjU8}J*Hf%Kf+(TL~4 z7XSsDEVvD*$W`P!*4}m=2!>Ww#391g=^%hYDc>x^iKrGjvQF0;7<7Ck(Xp;?5gI!P z34Zc{8JP5qS*_hWKJFxd%5E+<(uH@Z3?tJ)x&n*=FM^|jaA!%#+Eox;lWr+rCk6-5 zjbdyH1LJqfwE;LAYru4XF<2xfc41BW!cjt{+`vSOK-NwLkAU7uRe(pe1v@`-5B^gO zi@{h~ejQPudv44BFiD62#(_FmED&u`aRQ9d{rqZAfUFek{0_=)E&{&bzDsEPvSc9e zr-1a)_AnUOpk%on;X1#wc60=qNB?&>M{A$H+0u4ZaO&j8;tF*j&;%m*rV4lx?us5= zX2~GRz>}0mAnjyZ`Q#yp@rwu}n0N8imZjKrkDxe)njFV~1E6tq*;!Y)?@o0YE!F977%8IuxYk>nh@wUZQD=xpqJV@W2PWFwhowwJ*V8 z(#|eWq649hSJmXOH(p?g%~%BWX#80{22S=kAIp5*KzAW(h#?(dfYtci+1i50LsphV z3KpSyr0fC`@vUV>@(YXCQ{yQh3M~0&iP#j4ITAO7-vsevjL=x5gBI*qL>*Z-op98* z%&@MVWA(9UY4T~Xi><6_*sqD&tX3?=`tQxh$Y}ie?E|*QRZ_*h^BO?u=}bP_q6MG{ zXglr*^y+%`MpugbzNP^z{sKTCm?QuOHehfBC!h!bYdH^9Lv{1D==gb`+3*_l_`3mL z=S+KM(z>ya#0FFm@Ih%`@xink4A)r{5>9bm9RiN`hwY3zyoHpCmJhGgi9eKHS z0Q&BG<_%nS|Md8gC@MN}_vJBwRNM7019FxM>eV!tdxl8BCV7m1jL_4D`hHo)eIi_d zgK)nh&Ro{T#4dCV!HE=0aE(%}s%M0eokz&i8kR)oC|T_gBYeX7N%@rgf8$8xib`il zb-d!=y&DI9bq<;+i}XyqhT?A#5(Yj8>%v@TfNE-Ax>PC~aDVfN?|$|J+vTr!qvC+mAcK>2kpGOiK{xP+$MI?Wg^@V|H@wEB;LmE+g+B^xt0 zs863Sy0tA}wf0gm#@q%&QZ#-&q5=zGG8Wq$CjJ{fTC4(U#75RcZ_srqA5TxYsIpRk zQAy?)8_NJoPy)~pXrROtauYNUg`*nC_&|tG&o*_3X~Ah}?MFcveS4F!zxqYh)(c0y z><{10w@Y0eq?4;!bwPWB)4*-n4yR>iI&V}vFGP5`+z;pZc`sAybgTZj5a;E&JcCSk zGS}4|Rn?3St8+N~U}8tGL6Gh_)g|#)>)Zw&(03WEHPbawgX2@{ybfnh?0T|RsT-!| z8Gqet+u+XSo-5x06NCl7H0>#bLQP+irnWo&sTX5;j%*)^s;jr4wlBWS>&W4!vi4u#j(*`d zycEc5^ySRzMY9gkhrICpC$xW-$cL&8y-Z?4JXHJB1$CvdO!LFD_A$mDKi^+!d#`7# z^Yyd(wwN{5v4{Wkdw!|&p!m>CK#Yxts`1rv+^w?}UsW2NctcgOaB^GYmQWZZ%D3{I zP#u3YEgXH=b@K4SKQT5=yYIT^OHQ0$3FLAmf1NEpO4{JEQ=Pc!7=f)v|1w`w;)tUD*h>&v zfqI!Pmy)wa;Ij2|H^PiO?|D6HTf6V?>rKZ7UoNgexA$k}8OT2WoW47_EA&CN+~7Ye zJ$-vB`W` z7=*?L)@zd{Ce&a0%qN6BFuZc_1a0W;jXTpP=RIOmic?HaTpj*oxDsN0C=V-j&hNnj zW1l9^|M&qNi`4*WrqOL5FHN0qUItFZ@}HIW9Fq3yO)s7M^&v5~1w6Xf?q}1OdUT1~ zFEjow&t~J}zIIzc+1#;TC9(Zp?dc?-BpSl6{`XH;dfzc@5i3l3TF<& z^&Q(X^K-oS*JSJ%_+Z@MR`_XViU<~-@ZUHy{x{%9;?1g)c%Lfyi8T;9lw1aS~7B@^kmNP_N?eds+G`XGcwdWp0pX1a$j9Y;DTG02^rSZ$BY3T$DYJpPHaxa4^FaRxuk_OvXavLlif$bervEP&>o73N zaRju3E+S3r_}_auQ4EnW=(7eyi#I?fO*hCmbNJ&~XNTv&!#eO1=)#S_4}q;KKy(FO zldu74P)PwUuG$%GzRO8P@Xhu3hw+7#GKR+C6=jqsB-{(jbJVItfhNUh|A;EP&pzylNc%rqh2+_|+2I=2R(<0~(n*A~>?{7eQNfB^ty$pj%7 z05}+&Lc>sXxy_0_Iyf_xYsb0^#2FgMUwZKD<4*0qb5C9O82>qucWOzC+AiV(`{LPL z#<3I#=oNwQYc=35F?rb)O)^SCsrg{9PYNKRzqClQ??*A}&;Xc&q0QQ$cIQKWLw9jXBUe8oJp=jMpMk zvh5%gcpP;?*C6>^yZr_ldN?D`(+TC;eS&K?2Kq5Vcfx1pwGEZ>2L-PZfY?rN*!KLj z7n$!vTVshJ-~Ncvc*LC-zC&5B%9e+iX-HMG;w!wOdp>PHN#A==gttgkmZvZLVmI)>=W#0sX-ImrQ4#sKesuDR?t z6s|cI9J?%sQCQG+`%OMGzsd@jG4>(A8d9oSGoP*(UNMzx+Cbu*RjU8uD~lJS%ZX)r zt5O%YsIqJxo!uybo`}qMu#UI1AaAHuXvJpEf!M8HRk9M;1hH4u%lo(n;RVY{^;w^-y@@|-Brcyvck9aw6SF~_LscS{|4l( zA+tUFv}2n8MZc-qwc+i=B*9^N>@RuK#o?;NUOd-AIG{Jox2*+CoE2 zs5CY7jduDZoGKo;0Jvr20~zC#kx$o`6Xv9sE_k#(AcI#C3ELWM=4Q1fHhSNCl-z#8 zvvT@_wtJ|+Y2kiWp6-k%O>%WEAQZm|evqBq`DwHsvL+urGw4NnfL~;ol~|9PnB#%! zYK=icXxBa^y!PqBMO(mv2imWDP5$Xb;fl$Z zMoooG9yxLvj9W>{>IQksD#(PC)@;|{o z9dq#?S;($-asOHy%Eb5Gt6u#27+dSSZ$+QBv;MZ8pS275 z*JREIj{wTVt!=|Mzbuaa`(a6gsdd5EH5n^cZ(f*>D&E)}Xd8OF>qqqJiwm3MUN^iB zM90#~=3cKZUkJF^yJolcvSBq6fFu-v#H7U&8cl9=C>F{Gzrkt&j!XbV4LAt8f%4>Ew~I>D zNlAx)lP>po)`Q!uOv1u$^B3-8AhN0|K!rkqnAhe5~YwI;$nVEF7d)C$Q2yN%m5^-e<8Xi39wt*lhYUITkR zGd8#V-XICY^izif_8bVjZ18a2W|LXtR`4-5ah9#dazpAQuezp!?gQLKg zRm-6hNUIJhI6w8jjZo@G@)dWVw>`#N0mb*9wFz$+m;QN9KvoO((Es=7#%+?u*%crL z6>0rsjHv&!$iCh9BGkS@9xtb>?pfDI;(~onny8+@>l{91ox_qKtYnHG%_%+pRZUU< z?_}j)Iv`j*;L~84sf=KatA?)Xcwt zF5$6}+x`P37-M6GM%pADQ6pR5_^gYC$MIrIEGn#Otswvb=bOORcbi*b3Oq|FW8n=i z;A|h0#U|F;H#X(t;l)Js)*&N?3K@zddap1!x(MC*u5N>>oKaL`gVQ>v^CDgl|H`Q> ziuR|P(FT(7i_E)$%KC&wn-brF??J0xBrmmEWL9>>Of?PPc<=fT{+y}|67)xc<52eB>f%YFN-fa!Hs3Gz?LAg@%hK-Qv837 zeto9sK|QzGy>%*@R|!d-M}o+QoDF)kXWw++403Rj)9kt7d|EI(X(*wZR-C@s?wz?=o?CL`ciNxphDPMYsL^c=RiG zZ5i#)g%%{ryrALnU|6W6jOFiQX?iQAx#{t6SeVZic{!x~m zw*<|y$0K3kKIODSX_kJso-}tn9t}GwDQ6ujw+y_M-`w?B8FtF2LUgFxl6$MHx##g% zScIfPd1%fu?v}V&{&*rR(x;LZU}TkitEqYT@nqO(NhK@5#p>QIS@X!_>98oDDp9}z ztGruX&C18$!=fcs%77@Vnp^VbiN~{HF+SC_z%;A2TO-ZWkLSY9NUB+ZTq@E+$t3d=d>Uv+jBJuq zy<5yO7xVv?G_a1i*xXB{x0q+@@-O>57aciZlb5=`g_fzuzan|AJQ8J7lgenZ&NSdB z`n;eWO|xlB4Q{c|G~!>CykH$Ix9LyiwK!!O^OJlUMMt}B##19(+%ir0$&yCp(K(yn zsb~w5N#UpXG|_^LY_)GEv~0>;!M`SHVg{+X8iTasqwu{qng+u{~RrZqp+r-gRh$S(PIQ%g{$E&sNpg>~G;?%r)#OK_$= zKh39Abo_u_-tDdyR;C00j-*w2Jj$--w!DRx>BLX>kGWP0%LN!pYr=Inmo2CZl&!Wa0+Xu(GI+G(WL3z=U0 z`w|%|*u~y7jog}$xrzV4=aneX8uFTD`jw$y=NMwH6_!V|H!AE_E(y{ zUz&OAjm)k5$C7r|U*-0JY1XZ&ncMl9KCeZ8b=z~(oLbW}efe3E*UG=+~wpL~a z@be^ZmCU*IzthlGaVCSG@6$zN898X*NoZ}zJi;%Kbg@`24yJcfTAMP1_)mS_iC705 ztnQ??wqzdX7fRkKSy2w2cLc4n%wT?zPdAO7=HPedNoz-D2)|g;&0?231m4MS?aE~F zOMKpo*xe4?J7ujsnH+wpvE*4&Y|PGm;%D}DNC+%(6wJ0q>rnNj>I zNgs<_?%024qIEVihF|T|FXDDPj^CMWozINr*GT%6+&RbJcYqXRp?tBAoW?V9(oQEy z@mc5iwGugt=i+3VPL`6gF7WGo21L9APFCp#QjM&O{CdfNk{9LVnNGn-vIKsE&mb){ z&B-s_T&kOOng3ie$OL^8|@b8)_xPM4Zz-Qd6U`5+2A;GCDfUrNjRm)|V;pbU$0 zu1RM|t+P`3Ej}M<{50pb^kAudRvN!m@{z?ackWN;Nu9FN`BI-xB7V2?czUGNEh~fH zCi$e~&pH22N2N%XfG_hIp@kc{Xx~kcZpwPVe1)X(!WM{O&%H?#asLcS=TCC(B&|@8(PQXNmZ4 zd=#RS-7eg_Wm5mFT>e{$LV0q|CGM_R%E-#+clju3r;J>a?>0$;vYztaNtCQpF0S|P z%A~=WVcSIVVRnG5~ zjIkohUHk7&NF%c<`F%d)qKIzS@w>Cqn5=4kzhqn)G3WaGE;h_1OU#%1Owb~Y+_W=D zZ5OiY_ydv&R-}uYX$HA1A*+Eu=<`(+dBDvo!=NoO>ji&E@>Llb<>r||X-mm!;t%^w z(oUzj`DK{5-N<^${~(!Uoi29^%&=}t&1&I)^qCT!?sns5IJKo`N%@~7Q_9nGZgCk% zn;=WZAMu%{MH#s#XLz?g%4+9-mQ1svT-@(v{2xW<9?#VO$MLyTz7dj2E+Hz#Mk<6@ z?#58bT~tW1xou)oCPMCaa><=tY%aSH3b`+180M}h*NtuxmEV5<@3F_u&N=VT`}2N1 zU$2kd5Vo2XvS#_S2IX?S_O;VcP4#%ldjHQ26zY20YtNy&YIewm<+d6+|N78t-yur% zR0yYk+aKM0eg1XeP*e3x2-osg4SMSO=IgMb*6O*C&Hi5-=-uo4uQ5aI)e9k8mOE+@ z(gtG1@k3qJpF+O&@AyaP8ps!?4fRzog?zL8T@&GApkACeG*JB|M;M##41Ud_`fgMi|up_yuK$glpr zji~7WWM;ReuZl-T%k`nXX}RF>`38`bWsF<=>iTE{3(m z?4gb7?U23xzZ=g`hHb?QLtE85A%86YsYT`+4i&Eq{ixmz`P=``KeE|yzIbbBr}|IG zKTF;)a>{VCcxUKO^}mq){{4-}UBmri08iWmAOH{m5F-s1D-mJ}V)+q#bN~#a3zje8 z1!Q6c5&RH7BE|)*ULwU5!5%~i(D^tR6xgstfhmp^LI^_mfl>Kj+Y%L~B=#`k0G%He z)eQD1(O^npMGyxe0>r2(a6pL;Qx+?VI7AoVMD2njOTbJ8tT;jlA_#mgeIvERf~ky^ zK>SA+ggw{2QCwojRKZFj4nqzQpS#?sEpcM1VNW20=?6H^Q8(I3Jee9;DTD~*ATT=r z#!!hb^9oiPafE&l7TtVfz9f*TgOx>yLJkq5r*3SPgfaE8rx9ZGL!9W{8~Y^~CK#)L z5Qhi>W2BA5O5>R(*fWTubRk%bu919c8q)%+jF5o*M~rbXQZLP8T4T>4j?w?)#Gs4} zOG}t`SQUgMzL9MymT8Z@h&WE?iABvu9;J0mC#)Lc1VotlV#+9>w2A441tCt- zg*h*FjUr3inVwh;gcL*s7%Od@TH43-!fGN;(M4dfy2iz&Or|gP3PKukgc$2$TwBU! z`eU^aGV~*ySd?*F=>jtltAmh*hyvsCjfYBCmVf7KGA!5Y1 zDdWx39cBd903lBo@e8X*+v;;?vK6Ztan;drbG z;tb>{G2X>Qy-aF232TN>q95hNqf89T6o%8V76@gC1n_0PiEWw6a26JVI7^p+y=*q| zDAO3u!&)QGL5>k$PMHLh=?oWQZ4l?_$2c!{O(M&{!zEZdgbG9wm>_MMT4pg^fxU&e zK$nCi=$aOn*$rc{_6Xj7j+o$LT3hBcT!VE$sM3#f5>TdXWuC)zSSN%U+C|V2RD9^JRgtUP|W3ws}Ni7o|8(lwJWPaE#TdLc9+r-(@|X6og6!vk0!#AW&^P7=z@u)JiL ziS7d2Km+cmo@X z(4)(7Qc&h?X4NGk{pD*7U-oZv73?TBv)G71L z@}1#7*k=esx;!U!*L=U6H=xF05MYP`FiqM*tU_o+5ceE$gRTHe)3uPV5FZi3#UP9z zio`S*3-t=A5fNN0!kDheNkdr}Rw#^!YGj2A1Az;ZdP6 zB85vrm_d|?=~ET~6*?obxDW=>gdR)me{<6a|d>E}6_yO#SEm=Q3p1YrkJ0cJ@< z#46)QOmJn0n{*XemM%oTGHt{HSAn<%xj@Wvfv8vJjacKV5Vz?UI9Vu&VP(mP9S)1I zhg<|^=R<5Ou_N|4JmL=hA}qTZ;!#;Q;)JU~I6zd1*;9~!%BB%F90}n_SLI~yLLw{M zM?7(L2q%adFh|-dwX$!-3)g^frmMknbghajnIpb93c>{fB<8qS)mE}c{BbmdD;>zm zL0Pp`E{p`?nhgB_A3FS7+gET6QTjkleQMC5*m%cy+_=mYryh!t>vr4N8@o_i2IOB#5@;k z^(v{+BwP>T0sRsu4`ppwr7)U?>qB@!G=Z=3t!=ARMze5qgg0Fi_Nv+1qe^2m4>y4D zfm|lOnz9b4(ittp4I&=WFLPe)T1QraM|o-y!WVJ{m@f@Yt+E)cz>Odt(XYVrb)m&o zcB5Dv3-K6om6-1Wt*vqzt-*~W{ODIX`6y^xmFH+3j*ak#XaNiIp+i-^qZHf}0!G(@ z6*NQVs{%)xa5D%vM4MPJ1>LL)8*RnSAp+>yoPu5Geidf49k+l8gy;YZrESEj<43!2 zpAbQG9ay2RjeK?5Xdi9~5e&ITEOfC^ug)7CzlCBFYYPRvHt{Y|JHV~l@Jz~+6O+aaEco+#kd#5A0m=& z$SK~n-LK{eId}jP0|5g|r0vA8LM%Z%KQf9AhLz~r$z#P?LU=*sbI1*1iHn^&R*EHp zKZuN`-{6#>>{c9ab!Hi1Xw10GZkyWQpQUlU(!urWx6+uv34vKyd*LK zVoEG?xmk;KVyWRzAQS1PoHEqSHmoO0122V4f|voz^KTAeeOXuV(#T}G8LYhd<~%l# zrGuA6ra;Vzyr(3`( zbZ^Py(pVOFWn>1#l33w#OC6WTvc{i7X3{M=6{uT=xDu8fUIm#2fdDJ>Z`tCoEPMP# zWHucFt8BjIfvaOV;nk2i5G!Kk)U5zq6Uz+`Lgvz~IF-A%B6003PrL>)4`L0hlD?ga z>tlK0HIc9A*03tw+r>C0%NKtInGb;yt6Xl^;@B*IycV*64&_v#ZnxnUSb=yQWFf=` zSe<`+2)DvQ;B}EjbQ@T8^X+-u7Ap*|k9-ZWC00+}-o)*&BJc*tV!AD-diVA|4lstn zgOMc=J0MotUJNfZ7K1lJmeTEDSY3O0y!co=-UL|&xk<#j*sJ5E#**-6$a4Bk4i;r^ zh*ua(!&@LLAh&?He0y8G%2*a2f~=(9g5jF&J@6W1d3bAN734M%H)S7y*BL9s+aRmy zw>h|7`$#-^tORd|#6s+WcspD0mknk?sH^G~b!W2aYx2-H;@RBatw5 zXA>Vb){4K2tff102)lRo@tCo8yeF~_;smUbb`T@Pk9FbiBkSo-uo_(lc|zJ)AKnYu z0C6VPxHza2^2P@6K1ed%nNx#uFeH?WG4Z}g3d99S%y+OQV8>Ya$4DyO1x9Rk@F3KU zvGM*$8pM@IoN@>tG>y&R;mAh1D~Gu25J_ksTfhe*n;>pLlC)zgp>J#nAB=oMcY~31 z9g7Lfu@yW5*$iPo?#>~h9NP#BV_WzzWGmz@ur}Xuh_EvD1CK(! zrQe0sHapG}w#Ihw5y*EC4`S_<<0fHe><|7KvW@P+soizlCjiC)1Prnr;t8yib`q-* z8W$uyM|RM8hac%W$=8UF3lUaTP)qk`D1EHn=#~);Nu;5ps|p=-!+L zlyh5+=ePzT4>Whp(^|6)_qjH=ptTIBj>SR(%GI956e0ZJa{zEMuE*&C=~5Kf-(SmtcXr}TPw<0H%q;r^(aA^FwfAgq&I6l{ z1*uQpo^7E_a-L2#Jt)(2xeyB7d(Y4Y)i zb?mwI?jwS1FSuqWxX|C`AOM>=+yBi=2y@-Jc*FLDicHpVIzNA0gUMu>2ww>moi$sk z?2W!^b*f6_5~dNmiliHOmp0sV#`)igy?8sjp6=$Ye^LQllVsHZD9N6r2YS03y|1J< z1YUTOd`uK1kQ*|g{!#eo)2gc_rKMwlNAz*RWP6Qgs75sT20+qB91#1ebKud5OUL}| zc%#EvK+>xoYp01zdwJK~Onj6tXP%lH<34VhX+15o$?KMeR4eMfyEN6D*dFGEDVX3+ ziE=#5%8ZL(43S5~%k`%w2mE8T9&m_^DW3px)8vc@z)riR;4@>}r})Y+0k81`62WK* zzPnB;b{rvm9gCp(FDdM}^N^DdV3+l)epR~0gul#opIS0|@=Y=ySg(_xJvfedL)PKj z9C*TWyS)ByDE?v3<+fAbkUyHA$-M)4OxC`4y#3&7_V@h9t)g)8Kco%vir)eZ|6YuI+ScrmTKm;8 z;xn%P-(z55>5D;s-(AP?^;I>$apUN>{KK*UqbpK?qm1}iliOtn1oM1tuBhZoCMWoq zc9uOFHp`TBI#MHe;$L(0+jbkz%XJs5cKyEp{3oruSN_5i`ta-J17JnY{*rUcL}X&zd(J&5sAo6aK6|2c5?dawMH;I}4xk#} zrKXd{RhtNpWPUxK?UB42rBJ6OCsi}N)srm#ygPq+b4JCvT)>VuqE!YAEb8+Hg%7fNr z7ew-+3IIzYvLOc)dO1^{x?2w3Jyv^sobIREo3n@_zTLjdbLvcd@zXZ{BQ0|NWSz%) z?QdB=|DsDiLOj{e$J4ludMG932iU6vxNCFVMo4!|H0l38qp1McR> zWfD2&QECc$bhb#qRT||%3aocL)GZS*$*aeph@) z&ta0}A8p>bmlr7)3-!-QulR@3Qu$uP#7Z6-1GXl2lLno< zYCN?xtnxm07(94e7w5cCw2B-(VZTm!-gj%j^i4Sj#yni{SdZf+DWc5CAAYlqt|0+bYoStvt{nr{&Uh!dXp{kGgU|XpVAOx zd0bOa_F!)cd_n6~X&YlTHv8=EQTyQ1IB|U&nFt=-9)tq`(|3n86qupL(%aih z@V5GoMc*%Neu?^FB)uRQFmSz7<`d%)EzGa=(UG$O6L0Ao)CGk<7ojEp%t&-_wy|zpEl{pE|trI$+#+==D!%N8{7= zcTeXPB92&eEAGM$Pd-Dpb^yx^m?-X=P+zfHL*xqWo;1lu4 zLPlPdbmYyVKnLG%&$tHTpKjKhqT%b&GMdNa%yj_Lvhv@aG(`)T9Q+s?7;OQRKgJdB zSMy{MdhSnVrKQMYH}hG>~=UlXQL(2oU+y z^|+#M`{S8G@r9K{`5Z$jKxWf!X=T8%Ljb0H&l%I8f1MHXs&I_TJ0g`^uL=r~ca@^dQAut$GaLZVl?vmMMCQRg29r8#-|gPa zq^=$}@It!IE5ZOnnfR>e&Cm?AVLdlflBeKzJuB{NnCAm%@NV zc1C5eLxL}k-=adsK4a=6AZ_rY#G%MO&5c5Fu->v23&K6q5#nyyHy=J&+k3#Nr7$)PxyytRO^Gx4A;+>$bT~7xU4|;7fG>@sjwI zqOhx%huj{B003FeuNZNj zB_W)ff$kO7+W!HBMw3^ojC^#j6y=LHE>}hKbOHbXp{pnN+QwEpe<}O-Y7EaLeyO8` zWY;UE!#e&!5}BlHE>|H6P{5U6cUS`lJFF9ofrr=a6MJ+O&Vm%2tIO|=9}qN(8g7o2pbok?R(%+MtJs8`(+!lv z`nx%j^d>6T$B`Ueq-?9rUGrM<#G{jY$o=M4X#m(W_lGdQsX8rU>&X3Rty*9Z8o51CMbdxj}413vvAmHntF`F)*(&u6X()9+~ zmq2cl0T_TMH$%Pr`e4y=ikeEZ(ro=tQNX@yms*n==7YY*+zZvrCp5ho_wOlBCSG)F z1b>Kc8WT|BZh#)VY5g#J;~-B;by9@$TC>noC})W^>*#sCv4tI*hvDy(Qu_}^oO+z(~jN;TnWGW-sbKM^`#zaU~xMr zyB;;;&%HX4vfexU<#7=8&FoAdNNb{Cy^H!KA>_@QMV@-1om=S2m|et&e0am1L6G!M z7Fi9sFTV?!ezPzWPP*<`Ed2j+AF{_I6Ie=D9ZL$j53J0E{MY=_IRXwo`6Hicx{@FA z`_19mXpr%*(!HVN6(fXP^VgXKkl93W%h1@04dQaM+-w@@#;>xy;qDxwYk&Y}{QfJN zhNkP|^6SBWolx1%&hkDvzp$?=H~HklQSZ%}{$Foi@nb15riA54W0zPP@wH7SpSBLi zD%PVWdZX@b*Lw<$uN&M2oQyqU{0!h4@JHy9z9B?p9kphjcyBK#M220!l-Nc*RW#mv zFtd0~b<+6Mw)|zZg+*TJLt8zo%Nv8|6l~GB>#siwXcD$A>ko}@$H$s=3VV%gHU7%l z0CQ(I$hSH_-yO3vbbX%0eF>;Sr!`6{huXIE&I-%CQ$R+PYoAg^)!rb?p_#NJAJI@3 zxuwidI6K;ZaPCNSTDbB4>!ZQ#x#LG<&+Q1sot^5uhf@fWdf_E|cL$#~CL+c83lw&~ zRxuo^nA}`we4=={&K{tvZ_NM5FQU>|OWEs}K(DU;$l>2UargSoPG!;#r^gA-auv~W zZN?Xhx6VpWFIPCdos@pE%cJ<}y<8ir~1!(Z#3cU8rJ-OY;v?mwtUzdPTj}73Fa}9r-J@ z>&#(gxo3j?@$;o(Nlipkdh${Er}I;nKN)9S)F!zrofA>bP-)XCYtBiD@2XcS`>daV zHjz<&yPc|&(K?Z%Y@6|Cs$AYm!gDQ`vi8?9Rl{xv;j8R>~B;Y7lLxLwsL__2=}j5lwTb?QNuHfns|{*}=bniu59 zLgUQ-T>jU6EIsmP7y8V1+hU==0@F78_{bO2YkA?+m2^)sLdl=<7*Q zHvnD=Q9&Ns=RFT<&AyIO?s>GZ6EGflWZ)oNpe1S^JiMe+C);FoL!?AtENTP%#B;Q< zO-HQe(44?x;~#L=OG9x56~ztv=X8~u#dk7qbYZ z=gln@A>|ea{tr3NH8544jklhGeOa3C#+s6xZZJl3(^XfFBl5FPU5fTKi}$vCQo7eK z{O6mfOB=E0jY8Qa1qHtvk?jLVbD}z|levz+A;Z@xzn?|6)tF&EZ#imOobtNjaxlHE z$t>$L*RgDR4|ZKbthMQq)tD+ng5Q%|_>*|hHCoS#y>Kd5ONG*P1P^$h)7tTOHX!iP zHQ9>A=LqxW)9zn3|4x(@?El^S7AXe9%p7~J;HYQO#}P%zbVSEGnZm=<($S|YKHdnP zjDGaym#0{5hMs(dsAq6uSmkr2xpPkp`*@N+&jlM(Hp5qXp%LtKk^Kqz)&7k~E1msZ z1krMY|R-7CBGb}>i10JuDr*}qe>6OsY@ZWrer9B}IUOr4YbLLhHZcn49k} z+{>;zAA6Q1aSLwMwCj-q`sY}&x9`ro_tWix3(26(iG9^WU;d3mHMS|wUfGfjD@i=W z-TxN#vpsada7#`~yztOzL7C?VI^q|e!)2Sq1`d)0PCh@@am3whONM=P;d-4oe`@sj$w5Q_?5%kL$!6&C2aw>}8(~$zmQmT9?+M(mQE!7U z!utVuXYr+*Cp}dHZm&I-Z$lmGtbhGp{10|KbIm~HL+a7aH>VvM@Ap0Hk{aw^B!q+aN~9Vm)}Kr+c}oL55_^cnB(0OSQLza3@BYj!l53Q{ z^nHcw*r&5xsi4hTbouccUmg~rojN;7<978e&;LkE_;$xCT1a_$O|)uHBAGtnx4m;` zWxZa|evMCdGd~@%6g07TSBlvT5W*~F0~IYPA_iligq%O)Q{KY{q7Pae`=o&JwKP4} zPw~0X%8oa)my}a;0G_c~U!e=nDIK$;9|M0KnbeJtJN+c}rPY*InNQ>QUcHEKroVMa zot+npktf5kpIuKseo_$k(n8ZCF9)>}@AcjE%n&8mfcx>R=G&H+UYo&t196+PKT1_@ zy=z%1-#iokIgZfxhx_c;aolR6>9*LT^xp=20icm~8Jy|XyIo9rv-v%*=timVq$QS3 z*tK{@-vf_WN9jj+sA7sg;VIC>UtT-7%gR{oYl2b$^}<~6e1f*zemd{bAd)I1A3ligR}&G{W(kb#-2UMhKV zF}&gGk8cu3-vV7t12ls2RLED)jVq?VZ0xkGJw5XM;p)%H`>3mL$GdFQ*EdHCVk9RM zP)Z0Z*Om(0$;SkK>z|}!uC>HD0*9dOC$s)}N^Adhr0W6KTEn9gu0_ftMe0}VEQ!@FU*?p}ODl@*=eEx|qw7dGgeGpzn9D7kzfRy0e zjcIqNC+yrQJQk?fldytm_~iU`VS3rvj&yuFA)uS0C~+V>{EpI8Tm_S|Hy2Cpmy6)9?3RiN3|&^-`xDnoIoJ{ril1$-6L*0d?-l zv7oQb`)33d4vBjr#?J~INt!klT;u~w)O!kUO+HmjDuKLJ-`{@EKAe(!J@SrF^gKW5 zV$CmrhHDCh&QTeUI!PEWOhecD))H|228GwO5Co_ zbC_3eNuzlfwnur@r9;a8f>%$-P}`yw-hV#jfNZ}!=rnTRX-}7jY5CWQ;k>`uSGdxu z$(9dtFV&?#lI@bxij_7`#!OixD{_6BZ>H4+_&q%Hv%2`X^bBZW`44cn8zoPw5 zh8I8Re1@;1ULi4Xg9wy8)&RiNe(0=MMBfdmx#6XrLYkp{=m~0eNdKvG-|LwAEBdYE&1xRL>CzR0nG{ zJ#cW~>VQi0G(ET}_a@&yXdl_M@D|qJ7N+>W=mkx?XnozucGeH|_|lMW{vXCYbkHZf zOP}klom$jeaOq;$@tVUa2il%bcQ-5;)(x_GXSIIG{`j1n(Y%m#+Izh6{AkhY7~)Bq z_AK(_)>o-Q5d(v5#H)@E<`Jd0YtM^3&06DoK}fB2_S3knEwk}7W-V6!ZHK*kVBH-@ zS?fz~hId6S$GW*MZTtzkMqnRX*WF&|IM>-fr!Up+D0XnNN923QA&X7_L8kl+Mo_48 zTk!oci=X~?C$1Mn&45J}{x;io#@2b}Zke%@g_J@YV<+Aw1U{HJ@Za31(0SjpEsu=p z+$rXllM+3XHZPz^<$LnV0t;l-80-I1L!IB3%qdJ-Nl|5vg>Df;OVf@SOn{DScE%m! zZZSfiyf*@TP`n})BE4aZ+iyWH>Ra63)oPsi7LJXV6^?t-66kZ!Qn^qa=>M|yd;O!U=^u@Ci036h z`YV~jy-z0NzPsCdJ#{>8X()My`{D@o->eA??o-u**8a& zE>oKggw!=9qJ=i1MO?#*(lhTJJ9G7$y_<=4ZGdh<#H;(uj!@lBEy^>`zu}V?nn1j?T@)KK0I0DZT!2B3G$6vIvdsQ zrWeDzslE5k2lU%s^H28|ZTy38-JDXbMdYPg$Q@MP{zK~g?V_<6>NK!d>%RLmE`;=O z4(pMhtM6ucMXWLW@=M)*o3cX3dW+?!V&uP{I?eijYusw!K9v8**5xTod-w3l^zn<~ zE8denXAg8G-K||3aCne61G7pxYuoSBZx!Hj%eP?n_9+x=0X`i}-iPgGRGYJ_DzRnRh;U~Pa z^6uNtB?nVh2#YtLC%|Iz!HQ?oHJ1}B>~H0`G(0+UE!tbnS5O8HlhPo40-#&v+ zBAflm)Vo{)u!W5gG`U#hlSzksu9VQM!U+NbFK#x9V{Eu{lIy)DOBRlb~OUqUK-8yK>_ zW=^8{RynagdY4thMrCDPuY7kG&|C1(06n%#Dj*|{;3Fe*HaxDvi$DGKqa^L01Ac6> zwyLgV2S=Wy#w_0Aaa0^bvFU#{e*M%RF3*9n+Yin^)yMwwm@KU`>_0+nJMGfOSoji1ZVI2VhJ&;V3WgXf zUl8Qx@Yw-4oToj`Gq%2jkz2#(tOH2e(*>K1oi7pOcj5B`0bK39f_(;H8AEOlU$71Y z>Btm{4GJyCkl%-Y90-K#=oQKjiZ92LyTU(N2a$AK3)KgumXpXm;fn)7Tpe_w;h@5D z8o4ig$vPNxt)S3$P-QubOb`D&5DdT8Qs^)UoLb^6x7%-@_Tu2@aUmghI zUfU~-90V_ykeT5t)(DWUOi}8f#c~CCBz$!M0oTg^Tn4`P2L*|D68bEWe@4b#3YF}O;Z-wtzM}Q1uic^RBmY2xi z!ha7$zzy_@i-(xYE94*HyVg%h2Cl`mL+s@Z@^<*%z*DXPy0~p|5Uh)1AUP)E>5z0Z703(VEMwb{e z6;{M4LMTD#bI^@~5?iLqiX`PQ>Hy<8{6a568L{Wzr z(cBw*C6P?ue6wHx1vIkL>-2{AQ`!q)-s(| z)F>xV!i*POBXnsS({n|GB83ux#)6CsN{5)fD_1Des3VM6xN%GAJTq`bha!s-g~pML zr%N}PVJrHS(_^1YKr0T(V+EQ9(&U6F{Z~WwyiE6?@7>)Nw`v+_a_4 zW4La`iK2!&0Zk;CPL~A?H?6o)K&X?9M6T&xS>$m0iYG+_B?V0anaPx=4)?8iQ8ZDf z7)fw5z4GE==87-n3Q8KvbMU#A*ABB+{3%)}8AdYK3|-zfys#2T(Lu>VQ$XegLN6o1aYmb9dTN%p*Wya z8QEM2y0UG=bG44*gi?d%fUF8Chemu?DHInJkdXtoYN?zb30!TW@a%rjT$0sv<>pA( zYAc23!eiuet@bMSM=-1H6rMQ_ng_C$sS+EFU+tpsJZp?RxV2uD{Ak*0ABATngT5kJ zyH=@>=B*A;cn&YdE3P%V%5bz~l}X_lub}xLXhD_jD0Y=a;rXE$`EY1UmB(n^Dx1Qy zDM1TJ(CMmx(WccI3eP>nDBwc(sv<|*R~INeQxCKdWFu3ZI@-6oMB#aD7=>^fz3Spo z=IRQCXMuqhk!)P6Ye(6u8x)>1g;B({L07kpF05`*c!m+^YmjY0_0Z_b>JJLf$H90F zw{5AOAKhBrq44Y#&|;G9boJ)w&gvfu&-K74=GyL6?~el3092kC0a^mGlfjCygw_P9 zJdXgQ1a7B?m1l{s2~m0IKD3l%=ZaNlNv(-cc|<*c9a;vuS%9@= zsjNv-dHgw}41Ti(>%r1klcMslaA-N{<}@~drL!hW<v|-6_D^j$zmAsXX3~frsB|!F!C=tvOM77#@^Bx-*Rr7;9Q{qw?rD z27!BL4<9+!zUE2gL2J+&kb?{%b*yjAi^^lk7&UMQJwovqbIq4ZLAgMQBnMYQ?HGH_ zpGrfyGKgFUG@)&5VJ(o_gmQzDK#m0jp0=}wpf;o286>!43t@h2Yb}i0inBB<|B9*kP9;~rsu46u%&wxc|ubs#618nJPq^%&}V)ICNW+)1xSeq4M#p4x@t zWqXjETx-0w)B_<_OdYpaub_^g9x*6z z7d>L}xZOII%0fMcQb|0_q;}kCy@ooD@?%iBE@)!gxaWEum5uU;(m<{S#G!HDbqaL~ z#e-1bt}Vp*@xb*a>I@1FZ6vu)6F0}h)?2A_r~pPI*L9D$KaN>%r!JrZp-mt+8IssU zJWq7{gbHFb!QJ#o@)K$6ebgmXF!T+{&6T7+k+(iT{elW%yy3c`Nrn?8>rCnj3IS~f zxfhUZC$Q@*>KY2kXokDDkUS>p*4fkzR4BBCk1A7%g1)JyPUE`}zWP z3l#=!1>KdYO`YglU!s0Pg)>^=clBzECz$Ii)E_7m^eySGYi;cWdwqktjY2cta_^#R z+a?y)x2QX)2q+J?DySWrSXuu;-9m7-a6Qp=hHQlmahedC7mEVAS5RlmR@soG9Y()kyocXwsq4S(DR9zgyoDG#0(w+Hv7J)kWYKu*BVz>qsD} z%5`x-0pC%<@QZxl8Y8f{o{egC(dd^t1wLfHk;2hLrc)Q!<@2K|Cv|?_x_&UJs7q5& ztzLkd4L(Pc@Jr-$!Nm;f6}cdO-eT|H}q;4glzI z?8B{)AV2ZodQGZUjRkB1bvrSLAQ<}izo>g^LZwpcd4C1{3VyW(+ZZ^?3p%um){s9JFWffL+JxQ^)F`cgY>rL^d4sR<{UoJivaLw z;84nmYi7jHGV37X)nhln+vXas1mf}k;C^qYXFK4;#@MtYya1>Z4c*lE2dhpe4yAYN zybD%}VO?dvH$BmEQ11(gkpfML%t+nfNWHDP`=GY;uvf|z^WRf#3TK7&$7}yfec8*W z^-2x8-R^_Xul?-xs@K}QSS=QclFj;C=bT#KYh-lH_15-!U)JB#xpJiq0Dz3lRA1Ixi!b2<-b&UN???L z`pi67%14bcquv^Ot6vqyrtUl+H9d#F#-iYbaqg``V5R|p~oimLKZa@VC&?)Q4^ zo)MgJ21)4nL1U`{6y{Ixu^WF*`;#L9Q8FEjh1fu)l%GCwa0mB=jc(wgk0@yH*-Q%g zuKV}6V6B?z!t6JS>80dr+V2#R+xt=$J%hSGDP(A4wG4lTe8hzC5FObIxZ9}O;IHl* zAKJOz@NgE6o_$jgv5l*KBCI6v;ww4Yefe}`&etzt(XD*G7XpL;9|}y_^{#Szt%|DVaVeu<-*C|BsV_3|w6khu-bPiSwv?J#pPmF- z5WDO}8y{dP;Mzy?Z~vef)}M~GhjZSgJ$IJ_o}1)bF28y>Rg`zogT)!*8q-21&SYdn z(T_$mM%HC&8Jw?t!QE9PP)6N9m5L8$7k<9|9`?w)-`(Y6p%Z(c@rA0ehZuwM+5K8^ zekgFJiZexgvfdTsa$j@TPQ1~;`p4N%+mxqMRc>go&pR+Uqz|M4fwEY_5&WO5634PLa-Z#Cwlbh(r0 za(9xT<=|>8*f;t31)ymvxY#Jg(e>ZfnAy@)y82vF;bXSa!y5N9XZ&sk(_Ny2$y(=n zQ%wYH{p#cOuElAlopjavnyDfazTPr7^+cvu-Ay=sK*e~DPPMyRE8783nj}%beLDJ? zs{FaI`1TFZlUqF#YoB+5RV+=)+GuC{d8YmDtP3HF_wv2opU8~QWGNf?hi82DPJr2c z8(dHAWYgocX(pd9)&-?pST(6SOA?3DUd&|y9lqu6G@KRJL(QgYO`ADaG+GkKuyf!1 zhcXOZ{}sC20-qQ6wUUMj^b7P=aIo6OGZY512sK7mY_9l(Z!}r9mpuC6*a7|@CZ9c$ zNPd3hms_#%-L$IDqf6=Vy@~bgqlT;RBj3+ml$&v|>a8rFo`Ti;g-t(he+7b09DF$X z6Snv8{}s9je$=?>#f5{tqKz+IZ^)I3p7O+6T{VKsAp0=p?oOq_RyZ>2EuS`0rqkB_ z&u|DK&SY$M)2wl{%<2*meiYmMLU4OcIV!vTo*Y9vG_mIP_$0gtsYjXNP)H~2h%Mv4 z;f=`IW=wk{$j!V}j(RF!47t%v-Tam##cq8&aUk(m?7!w?m?!Bdt2$xD`vJ#8r>EoG zyFdyW_3N@P0{8%@T9Vy)eaguOnaS*p8U)uhTkZo_L6mHzF~SQP(D@>yG&J~d;=#G8 zzfqgBYEh@)pGmRk&as&Tf{3Q#7UryCU)+brm?yb+-!z%duxBM3Lmj)_KN)P!&3YK+ zh5Z00B(|1+x)@a3WF7=+yy$cRwDR2$ky|WgR@VzT1wCU75%r~ zlkLL4wbs_%p-alvn@j#|mSELQX7~p=-vdbL>GVM-j|YpjtLh{2`Puq9omOI`LucPe zELh4PaEgDz_fE_Q^F3PD)0TTkCrghvmK7DYXfLW4`1oI*RT{tOVm(GNCLs5}dm?!` zdIE#uUxKg2=y-}NYB=Vt3!Dp)35jc0HBze6%*{Bd@%g!gC?9ER%g_jZ0bXAuO_kR>MLfu94&#Q^b0U7W;ynwh(Um@8nWbqI-K6XMDIj;jQ}5Kg^t9`AWq7CZoXt&Ynfu2@F^5xAUI0Jn*-l!-15VE+##`yKG zA4koFjcwLOrb!($<}n{{=gO!(6G=(ujYPy732-rIf}d!pVOexb^O|R>qFz({02_U1 zS^jg!1>xy_qN0Rp-)3sQ^Zoq9O!MCNobx>AIp@y3_kEjYC09SvEzR}S*!S<` z%m-1y_Iaf`-yb@e_YBChkI>PU!du_;L;ghVbJKV|t&?&ud$`uT z^F)MhgI=?fmf8LIFS+c%hRt{ObW2{uSif(L zP!zt|)R#Ll<@kh}i5-KPL&*cz72Q&+%zA8Y;Ofg*)VwGa{MBCUW3Be7c?A>j_~-_s zun88-cy~D_Vy4!d*%0pZC}(A`<-wM-%=cuq`a|b+E5|;Tllo1L|2^%SQ{lB&&sSMn z@1S)^KV{M$`uv{HXa6J>xk-1prU=$0>`Uu%$h-M+4v}`|sZCk(os8V`mGv{-&5ZBX zRDSo)nU~k7z0|<)McUJv9aU|&vT`@%+s-17_EkRJ(R_N}sg;xF+a-`vok-du;IjL0{`1d81HFTK-2GO# zbR19j{JwX}fsMg_S`7;+S7G59ICEX)=^lOhvO~Y?#lp2kkJph7(*~PP`m@W;GU}Zu z?M{c?%)MXoQKssH>Xf*9a$m@t!M_9l4n>FG-4tt0(a2U$Qv1B9wR0MOWB<~P`{Y`; z25|q1jjNqysqO`7e!9)`tOuO$Qb*gcaZ{|S^CP}UEuF3A!%hXykU|sa+T>eM!my%qApyAEkDQ=%03=4T~ zWnlkkTI)~^WA(+73l%fgkHoC2bd;s9k2>Q%A@l5AUjM8ZxT(87dN4XSC2*B{vq_}x z9L<~Rxa8K9RrVuan{vAEHCxq>-~|OHqrHuOkLdXDY4H(F_m@+y=Zs0REbS=P@>joy zBeXl)_ttEe&Tm>t@O|%=>isqTw`{r%=6mNJ`HQR1dKlIn@z2U=f?4emKJ?7$u_uGh4gxchKX_SVI0j+*BR--?PFOZKnvA2IRRt9i382E2=Hl(mQYk2wP0d*)mm z@oqz7dHed_k>X`Yn?t)=^k-*8-_<`^cd#yb zPg-=_5#y@YF$bqtpI_^7=)lgT$IgPkmML2c5h^}olG1Txh-qp-N?F~O))(Ieky9t> zn+|F__@zz~cHZlRGW8F0BGs3!Pn!F6z}{u!r$*1-?Q%Bd(mmmv#@*`nBPs(Y*{+Zd zs9*DS+M%HFhdDQ?b574qcI)@%h;!EBtY15H&q>*`@UIVVU5GAi>VK8?Ogd5b#6Iz@ z5yr+-gC7X>6#4m+;sEIa?*G-q;8kZtYqjCYY)^}bb~_uMr-v&L$LTQzg! z@uTnTzOYD>xpkTbo=$X4(Rb$@%fV|Tizj{ZVJ|(ltN-OSd*9El>~F2d)8?jp-jKd8 zFy%tI=B1-Uc5Y7DUe)TAbyV-wt>uQ#4m}f2*o@_!T)F)-^7NEh^-8ZLhc+y1 zxDlvTb~6S2xYW90$;PUNzQ85v!^A7=HTSOgGWGHD{>;11(&w{-W$VgL7z=%V8O6R_ zF1G)X;rG$h#CEjr;CF|Y7QK}YZTY<7Q|#!;9=U~C`vck@?8-^-k$-&NXJhPmmK zW%Ex&@MFKXuDiI=wK8{tONrnV-;ug~WB;bC@z-@+GlqnyH~*}Cs^J{`=0>USry*^8 zQ%pqh4I-CvKDREnoHzvmJm&t-SjxMyQkGp<8)BDt7S?Sgpx*2bmCyw6#64&bcu+6O8azOm# z2GNrj^fZ;Us^u9TwA}?_MBQ;!pqu==V<-IdTA&9m#8y$R?eO_rDkSR z>47@iyPqFF^L!AR+a393!K5t#rxL#<{0_bGr!x7ge)N-o2f9UfqG$j3@t~rInB0Hx z?&hJ1dsda4Ta)q9bjqxVcV8xGX>Dq*v_<%zL+!bz-=41h-VQ6%9r=87f%Z|&$}si% z{eR3ijWeqpS$Q<)-Kwg;`&Hv7KzVp~;ZocFfpxy}Xn*3w<)&#rud3eJ)M-5Z8@hDm zw1tZjf7`-p_hzko_VgxOE2mG=e%Ai>$>5Hhe>223(W1wfMc7EI&H z)6y%YwW~g@o02&zVM%VX71dU?Zd3B#gvTk?gtcR;{marJ8yxaJ?TL?eva@n2i~2pk zwJgGBRnNB-zo!09?kPR<&B1AjO_KErQ+2Nocf%HTxNeGh;4*)?Vd{&6w|`IAaO3dL z*S$AgT&Ek;zGb^x7v9;k5}vCWDV$7y_#L_LL9hEEf$d6psFbXWkZF?bL6D+<`#9=-j@wG5fDyav0WhXhW}Wf6|?PGp*)zA4fN7 zRJ}Yr?$8p&DuLeJ=QEpb?t6RKFRxJd>P**9&)uJz>{*j{we!Bj;*{%)?b0Ln4n*JC zb!5zZk54zw6&z|Bv8Vd*MB|5}2FO~L432Fox;?^Sdfw_+R;H~!pF~fG)c@+;)9wCg zq$eSIFQmNpzDh0MuCidAw;eS)VrbE;wefxq z%Bg?66OE$MXZ{@Asa8jcuSXv(pZ6##alp>{1>I^jH#{=+kde!~?ctk?okD#y_pD5q zztCkwYFV4a2dy9d<(LwlmY@BH+Pr-H2&G@{aq9h(LaP_I=a%l z!zoc4gLkLhcdZqRiOPN2>vJoE`$qaU+%oHz2| zvS}r2%2NUZFI>1Ye|G2=v~#$u*ndlN-lL%CSEK%km%b3n2UDR6w0@n(#xXvz@J)=o zZEHa47nF1@+NW*!k@SMV;cc6~Jg>}r;xl3dEYupf)%o6%)pKu{9H+gbm;M>^y6FhJUV+UWZ;D6m%dtfoAtc8cg@jj>pS~b z4);iGGk8%q;olLzklQ<7ojyiN>jLo$`%n3Yobc5%I=&#|YmX>jlHzB${Z*AFDwHPN zw(`HSihXsr?##Kp719~=R)ia^?cZUltxe0KKKYH9OAG>vAZbs#hknpej zcCLEhG|sc(Q%2dAe`R<4b~o;X?-Ajtox?9qb&vbzlei%Fp}b1m_+|frYq@#S1#qWB zR)e73t=B{xBZLLV!rtUJgtUA0nv3Ivunt(xn~H|8_VK;e;shZq&n17OXb`ne>9rRp z31QVN&$m{MiS2WGox~}^xiYvBAfWMd`=VYqG2GrIfNT4~jXCW>y&mEWAuRnQe;d^( zh33*roGFAAnLOWRLF>7#cZ~SB5Ee=bdzar>-M*)Hy!eC=)-TF=SJ5bMkL;ZwJ|%=@ zh2-xPjjDF6cZxV$2&?^gzPI{q*unMA5T6w;mca$;fZui3Sl`E`3J>sQAa`VdhsnGtWx6n(W)u2qqKLE_>K@34+;Ai&~&=v zb?-LuJ>hBrTni0u%IWyryHor?7%YR!n^8^Dj+)**;)lXD0=QzC)gL@62 zp>Tr?F6agPvFkKaaN;82Mgd%-3;yHTX|9M9mk2{;aM>;D&*V;fMUuEwxJdw4(z5;t zI^7g$;^)H6GPpRF|0kr=OOYuq7j6;2^{$FPVV&a@C&aIWTV-$wOYuk4IYp5zel6T4 zfU8nge-k_BD9(%D3jdSAg{FYNr#lxZE{op_w+rCfQSjfK&LG8g@kikf8C(vE`YY{R zuec@tEZix8D?C|$Wu4m;_rza?u+LLiMgHIF&OM5U;!5Fe0bGZv_$%*>R6G_}3BzP? zX+`l@)rlzz#5KY_f`^`!R{spUI7N~8hj6d#VOV9rKfA6ZMX9(>xKEImQyKivvnx|k zF8(PDm*vSTqyA0q%2vDY-gohDx zzE%7S>w2iD6#o-O$nxdi6#qnB1&SJRvoKQd*t5z?p4e5Ys1vse56K>fRRzdTcfD3L zh}(sS1>&5lV0lj0XT=|Jr!Yz;mRCi|rCl|OW^uPLS|IVP&XUWz8Wio~Uf~g$Bn-~^ ztGk*N-D0IsD3InHVW zkcgHQhJDX(4(aw%noIOVjNoa`_loAQ?(s@%iGhffJ(Yh~G>f{YDD5RiB2G}``NOIu zv3rivNn$MGWkq2>0$NUYFH*WmOhhq);+!ABEjismN)L&tC{|W1{}I(9?Ow0+l9-F) z1SOueSuL{eZOSncOHsV6B&;^SrMi2Ma=gS^lpuJPQ(Ms@?~YVXkl2b~A1ZmRqD9q> zDW^#6MM;8E&pNAC!yZmKL*gJxmX(IVwp4aKNy<4ACsB%^ET=BG)w3s4IbY%;N|lw# z>!MmG_hc&k{C`0ffr@o>!tmmO} zjRe;9mc5YI!-HNu1vYrOzehI8dD|;38E5EI}r&$>( zfdyLyvYcNPZStOOWwd0H2yVlZ|5CK6dQcxGf#p60uRR;A+6{Yk`X~vkhADd;))3Hc z*K5?rNoI)PUb38q;C9bm^S(FBX5XmpWJKTmn4Cu1_f_D8?)L4y>5MJ5?F~( z_BO0BzdfYat1nXm3)KnUKj1eQ4yy!ZTV)sfgc zr|-N3RsoZ}5BnX^ak_U=-(?9bk|p?%^Ej_Q#1uJ5}gfhCp% zA3dA0I%K`u`tC_qi{M6%u%`Tu>fSwl4<&0vaDPQkQ$>foH?r@sWSt0ZdyqFNI#j(_ zUx8%32<}Gk{A1N=sNnjFBpXF=lR(&?fKEF_QeUZLlL)Te=lluo^i*W_l}omW;F7xh zPgLh*MRwn7$u<#O>Gu4a)hSS1?t3rUE`kftVSn>GLln3AK1+6r;JR?m--^yK#lyZz z$!-x`u9g2)bcz%OeKnFjqKAS?&wo~3iHg#`I>|m!o~$zLUqIJs#p}KX$$rrz!MB`$ z!Cg6u&wYO+2Sxd^Z}NXpT~b9&U$X=@0~Azw%Cov;iiW;+$zhRLRuv}C@2XZb_jOC6 zMG`@Ej=Z8vuITPlO5lk^S+!iQ=u#mMUME_x~Z8P=BHQ?1<7KVAwq;0k`_v{m%Tm681uq;P+#?3cVv(W6pg{ZpiH z`=+456Lv5&?Bn`pNa5~A88iq1y>@*`{d1&n^Pd1}esHg6UuOS&Dcl<;gEAh~JGn2r ze~}b!9TPxh&gvEPUG85dg*&TcP;B#iL;7y@2T9?^BLURUir%okhy81$a9@rLN}{4y z)K}2IUJAFZ2%ySYDH8ii`!`A9t_~R#t^md9zSsTRq;S)N0BTXNBB$?j|4u2~6Ci`~ z5~Yy#)%5R?J``07pkibxWPJ_&`=yUW-(*k(@)gy6&Ha(m$D%3$=z4`h-q+n9EtQC> zWgyiGg{lv!Flm9PMgZz-r8MlPzgOqdG5rD}rVztT&+VbpImNW$Akn^e{QS!F{mI zjOx1dqX=3Hd2dvow12(omh`g-D!!*8t54RyO?6NDRRo1NOp)JL-M>fmP+BR1`k14r z=#%$Hsvb+LL{PTm3Pqo)A5#@bYeY~@Je5}chAK`~B>f=*kq=V_^xLVDRHf275om9Y zGPvJUm8mM1{uF^E%9T<5lU3QO*HUN=1%P~3zd&_a^?sJk)5evmOVVkin*j8*C_8+z#+kx%G zc451*Fl-OD7q&(V$M$0fu!C3x7Kt6g4r5VRGK~aEyROJ1C6C7>va@jK^ZI zSS${U#}cqaED1}-Qm|Ak4NJ!|u%lQeb__d?Wnm|!Omjmu=Cgj>>_pv zyNq4Iu431)>(~wKCYFQU!fs=Cu)Ekj>^}AY%f%jIdDtT?AA5|6F$pHc3a}?wA@&q2 z!iupH>={;ym0{1Z7g#y=5_^Tou-Did>@D^Vdyjp_>+STCl)lvp1I zWXBM$hO6TPa1C4&*TS`N9ef}@2-n5+aDChWH^hzb!MHI#1UJEl;-!j7;f zh7k^gBjH3i6E1`+;YPR68ng7Vn1B5{ehOk5$Z64!|9#0}ymkwe@f zZWDKiyTm=>KJkFaB_0xa#3Le~cua^12_Yp4h$loL@subciir~98Bt1<5zmPiL^<)2 zctyyF*Tfs*E%AF1eiFZk2BMMp zO*9dIh`+=?LQXUjEkrBPMzj+hL?_WjbQ3*9FQFimL?6*ls0c)=k?Q0CQiIeawMcDJ zha5-_B6UeUQlB&+4M`(%FlkHEGKgG7t|o)YHRM`y z9T`HdCpVBA$xw0=xtZKTZY8&o|B>6t9pp}O7rC1ZBlnPd$$exvxt}~h9wZ~kNb(SQ zn2aK$$s?qY6pvYdQLz9MDhYw`{G zmV8IPCqIxM$xq~G@(cNutRO4NZ)6o&P1ca#$sc4bSx45BKgnNY1KCLaCY#7VqNI6l?lndobxl!)a zaB2kQL5-wFQJ$0+32)Cy`P6-2F~R#U;$8fq=IjtZgHQyZv_ zR4BEH+DvVswo==u|ETTM4r(X0i`q?vQG2Mp)IKVl+D{#z4pI?RBz1^7Ohr-A)DcQZ zi71T1DS{#?ilQloVkwT|sTeAjilgGG1S*kAqLQf;DwRs3(y0vUD3wVaqmENq)CuY& zb&5JoWm9LUv(!22JavJ(NL`{XQ&*^~)HUilb%VM|IqdyJ*A4MVyc9CMwL=!)N|?uRZhL6UQsgYHT8yiOTDAsQy-|0 z)F!%NrfR6~)DNnbs-xM!+=l2gr83)M=s zQSDR*)k$?x-Bb_NODQNN)kpPHDhknRv^qV2)}S?MEn1t_p$F1~XkA*5)~5|)phwc9 zXiwUU_NIO4(exO4EIp3)rN`5Lv_Bm{PoO8#ljzCx6nZK>jh;@=pl8yv=-KofdM+JE z&!gwl3+RQkfL=r|rkBu5>1FhCdIi0b4x(4ltLb2R4ZW6LM~Bes=?(NoI+Wf-Z>G1< zTj_1|fAn^G2fdTtMenA==somadLJE5@23yY2k8hpl0HNqrlaU+`UowgMKng^G(nRz zMbk7xvouHZbPOF!$I2wBtl+L7&(Z}g5`UHKFK1H9Vv*|PR zS^6A(p1wd|q%YBz=_~YA`Wk(mzCqulbLd<2ZTb#3&W`UhQ0*U|O#Px=?#KsVCA=_dLQ{g?hn%jssig>I$W=ytk;?xefu zZn}r=r4_W2?xXu@6^$4*Mx7bJXfT?L7NgDRFaw!Ej4q?c=rab4A!Ec0W{jC3j0rQ8 zF=fmcbH;+PWULr##)h$F>==7y7~{Y=GER&$3GnWZu<}ve`1{VgG>Yy$sA%1Gf_-5bA%BxA_ik{hG0mBVrYh8ScYSG zCWeV+;+S|Qfk|YNm}Dk}NoCTQbS8s2%49OfnBzh$BdYfFjA&~dBPMj zPnja7m?>eNF{Mly^PG9Xlrt}xSB#8#&AegWGVhr8%m?Np^NIP)d||#a6-*`bjj3X) znHuIh^Mk2n>X>@wC-aMGU>cdIcC0-+jCEigStr(+bzxmuH`bjU&W>O`*pcig)|2&Oy;&c2G&_bJ%Z_7x z+3~C&>(2(T6WEFDBz7`8g`LVyW2dt-*qQ7sb~ZbQoy!KY^Vs?90(K!QU>C8A*(K~! zb{V^zUBRwogV(o5u_5ewb_2VS4P`g6o7pYwR(2cvAG@91!R};tvAfwY zb`QIk-N%Nr``H8RK{kSoWDl{2*(f%eJ;DlE5sR@nORywMu{6uDEX%Px8^gx3acn%B zz$UUuY%-g|rm|^lI-9{BWi#1h>~S`WJ;9!2PqC-jZ1xO$mOaOwXD_f9*-PwY_6mEI zy~bW=Z?HGn9QGD_o4v!{W$&@~*#~Sc`;g6JAF=uDV^+*cSSee;K4A;lr)&{h%$Bgv z*iyEPea^mM%h{LgD^|w7X5X-H*>~)F_5=Ho{ltD|zp!7~3bvB{##XV_Yz_OJ{lV6< zb!BMa<-XmVO!ZYww>)@JJ~L_o9$tHSp}Q|=gE0--kc9Nnj6E7<;HQo+<4B9^XCG% z3EV_(5;vKf!cFC-anrdO+)Qp3H=CQo&E*2QdE9(%0k@D7aErLb+!Agnw~SlPt>9L2 zLEI{CH5bgS;ns5NxDakVw}IQpg>sv?&D<7lE4PjNkK4}e;C6DmxZPYBw};!y?c>6^ z{oDcWAQ!_lf(=ec`@x6}_k*kD>bQFDC-;kM z;2OE#Tod<)`^){~E7^TzxT-h>~@oAPG7Id8#R@>aYxZ^PU2cDy}5jCbH2 zc_-ePci~-mH{P8e&X3?d_>uf5-jny@y?GygG(UzP%a7xI`SH9T@6QMD6ZnbzBz`hK zg`dh#$MCUy93Rgo@QHj9pUkK5seBrr&S&sP z`Aq&8f1J2UBUdk8nPxwOqDPP1F^CkQib0`-_Z`i&>LekXeh`#l17UPnjJu@HQKu zzSZoDnVx$5gxImuG-sIo4T?9@jJc#4Wp-V2mYFAfW}aDy`a-k*pr>ZXLT9QQ#AJtA z4_Iw>(kxr^Z0IwyD`u1M-XE~uxOZ8Mu|mT8uwep~&#`aSirT4Q5Q zo1IrbVs>9WT7A{*!)6FwHVZW?QD3miBWAAImf3gA(js2&&NUl5?U7lj*>kf4vm4Yu z?k+Sli_uUkG4lxhFQ!)gM8pTPpJp0rZ{bMq&4}3_&5UCPs2L8ZF#BdUIHp;B?>Mg* ztpO3^>dnGpzVNXzaWU~R2{DN=NioSWDKT%U5+`FsKokd|JlHPJ9t}f&2#1J!qGu58 zb;wF;H8n(vyd!>a~lfDRzJ{+*Z<_r#&UQJD7+bO;SaQ_xqG1~yv)U+$rk z>Z5FUt9%rL+`-zX=9MC;Ky-Dq?dEd$0!B8^S0(hiy+O_nrk%IX|C5)Q=4J2MYG#_yXH>K-I|MbA2AQtj6|^ztt-gM*yoVeVb%sD3^mkbx@U0`hxQ3l9;S0k=oQYO19L*;tN>_1E-@4Y#P* zI-@x@w#e*?W`d=Uy|LQ%*e5oGMXqL^X1=CaQ>yty^QmUB<}=MQ&3P8r^cO=EtVh1a3Rv6*bdG_CD-i|$)u5&DcQA4>orDx93~fdW(FEJKF=p1`nijB?aVTno z<)6O+E}dXK3u8thL*xUPn4t>P=#q{)kOMl6exM$-8xXsRHlPI%`?0b6TuUM56Hz8G z>^>lM4o$NwN0ZTMs{k~@a1`2acN=);4zni*&H;a$fG@GgTBn+S@A@pZ%kDW+hZ*wG z0;dD$6B-W8It>55K#M^I$}RfP7qI6Jx-g^(xdC?9z^4wh4c^%ntD$CXNm)8mUEVv0A)VtX8~Mq81&y zPve=|E3ml`y)aw?9{C^!(ZG^6IQn|~ycLt)X2Ve9Cf= zwnN;6LC@3@VDrlvfX_6v2{2S@6@yXeQvI4WBw|90*>$0HkrW zZD^|7eZXuaa54prgbZy*CFqT|ThLLk_#cwNtqq@1mzo@+eH}8c88|f&vabd**&JO! z#=ED*6~OpRWC59d3Ei6LgY+y{jW2;LIsoVi(FD+&-SElL5QBe6j*QTJG#-sZe<8mq zxAU=`R^ghHbr+y`*j&CGVv`4!WusK!-z>Bjoww>ma{z^psDrNt%x9oY)`?)jAjto_ zdU~-*?%h_6@LOl3W>twEm<|ITo<~LC$#39K2iQ0g{X`4x_d`^0*yxu559$E}L!=kb zAD0N0zXz0W&-^wB7DPk_mKQ*szJnT7pc=z#kedhWYT+15Axr$x=s{1>`*9a-ZQ>K$ zCppXjFZP1Zry*hohkQdFLpm&CAo}r0iW1@PLGbz(>w$C(s^dObl{$8y zmoO#_GW7<;*H?cInrEE>ntB0VYuc;;JD&hAc0iom5N`JriLCab74df=PJ@Ay-F6v% ze<7zD0iSBC9J?K;?EjWSHeNvw(Ff4ve=zc>kFK$&^$!2+xO?E^Qiz-YI8p?t?S#k- zf}ibZ1e&0)aLolf=K&w)B8^GmVC`_=$S`312AvNUe(~|{X?j!Ph$o>&+(QROcls?i znFlyGK$SQMQF;^?3dqleh>Zo@ia|?KQNFEw%!asU?u3y6Fn$E^=_a5~0lpVdFO1s? z@pJ-RN}MG1h3=W^*?58Wo`D#=0gjB)pE>kT`~vq2uDs3^sN z{7%TKN$4?D(N4`VXp6IZf(PIo1j_gb4Ma}HHgKF8_}?91PITaZkV|2Z71p3ge(2DU z>&RuwTkvBGXxFV3iSc(~ECt!U&Sj4GGN|Go!QbzYsW0a41Xeg88|`w4`aAS-=y`}K zh61!I&=;p|2@9>lh6JFmw&wq@YM?ijXurBYc-D(@peheTdSJy4(Dgf@o)1jD!HTV5 z(+;#`VB6T)z+M4F`Gqk9pBM?+6N(sZ6sPrkhY%)~$?;lnHdmm?6JNe3;}bwT~cK>b(>QDUGAaB%8L@Pm;J zkkM0s1)jj<`=B$^V00BIPd_khnZ;W8%`o)D$Q8xdkA&DXgUU}tUBfOU+;ML-sz=pB z-`Wm?JPH9eorTYy0PK`V-BJksLm<+G<2^@-aXHA&tsQW`fP78HB;IzPXtV@!w$!i$ zJ%(I$gg(O@vULZFL*8+Zp?)rfKE)QbSa$%^pMX{lL(?pGq37}Eoyy!vQxkZdjPAP) zLPdeEz}jP07LYGipqB)2PYW{fEHM8UQUg9_pk+2yz7T^1ZBPtLKz|l!LnHjVUA+&w zy-Lee;G&0<8gQ`0&=pwp6Y|*zT^y*RRsa8*9KSg67Vsbgc%KB_;4)y!3aAx1Q&)lA z60K&iRvl1gAclt^|8#*FGRTBfi2p0p{eSdbOcO2LP8(c>_i{j$oMChkN?i2-wsMQ87?21#MW0>;O$mB#*h0m;>`qLq1wUP#tUNUMzt-gCJk3!IHzE z7KgxtUBIbkV7UX#@OfwjD9~~^+6qwGlochhYXti->D%7aK2u>q`D|)Cet}*eZ``sbEkaNo*&)Xr&XF(f+;inCt-if@X z7K2(mg7=JOje%pm2A;7-a_<^+N&iKB3D~|D?X?~UHNek53mDM=$k>BrOCVoaz%~iI zw*=MI2W_|qvv#8^I$>a6ig{dOz2&_aC7cH_klz(*nxHLx5ba>VPl&SZbI_{)-oVxp@be|ie?osU zT9>#Me6|M8cPF?f-2j{KO^*R}OgDcA74$c#Q!&!Ae+~F826lf!*0D8U?@7p$DG<9a z&s5ItOD1CCy2?rvD4LoW5U(p3fZ!oG<})4Fk(JLKQp%YQ?~OmyNX`KZ4M7l&Jke z%@Xw6&+<&tb+9`Ss%9(9YmOYXVql&;h{#K|cJ$ujDjJh83(YaUiCjPjE&%QiAqxK) zV~zz$A6&yVKR}$s$kb5@S$qUgdg9sMI`v7BV0B<*lUM-rcw-{`>0o`*1ygoE| zOH!d_>fp<0tB!&GKFjTZtUu({Qi$ghqygDd3DH{*wPhu;88~&&UWngiK=2h>8JlXg;cSjDgBFAFNITyn%O+CF<^rQ2AIXc>Dk|Zx1kR6y(n~bUW5BIm9wt za}(fmAJ{ko?05&(IHRSp2Jo4Uz?x3*@i}Ci3h>&F-Xu350ngi300N2DYt~T+4l`cwgD~OWf^Eg$$A5NbAmFsL48wu2Z90k7tOS6*Pt2H=Ck(7vQ=?w1k*K!Zlx zYzLf1>HE7Up^pjoAeOlaPa(=HpccrrV}O~az_d)rtsvBG-JX2az24~x94Qzya~NcV98jBUD8lrr>(%2IZ*YK znnTd9afI~uYGJn=)0 z(+{AxYAwjc>7!P}lrUfw34O)+p}uHpTtqUNv~#F^;&8Ah6FKPI2Zf`7S>KV*pyTL~ zju^aNZPgAHzYZNW{RzF^9JF9iMsl}>se$hQ)f|}D2do_nTr#(CNSqCk^Z+iBfb%9` zV=`#tRaD~t7)6is^InIrlus6aoIw?wDCaIXRybI0GI~1bT_n^D1`zy)a;&yNm)8xs z@dZ>M9GG(nnBL(0Az9*1m@m|P2v~(f6tBT}U$orEA2d2aZ(#xpuP>mV_G|p&?I)vY z#*XN8Tz-n!eWEoB$C#67k}MB-f?m(vjH0ZDq05t;poUCMNP+%d0X$X$G6m=>?722F zB^)q#AG#ATZGgG{0pDP?TC^&GglPCcuka6IbRSgeJIwq7mBr-7jDRc%g53EJolLoB z5w3X{`n5Jd$O{mvu=EF%BJ{=JYXS5H8(j{A^*U&-$t3U+*5iQ~ZURJiq8#rJDUaO~ z60Nm|L#}*=cVeJQegaPi7(D@v8G&?@RS<7An~l)_HiBLahkQ-|c1=cp*7H&>ySogH zgh+k{EpY}*_W?JKLPYCy7O##1oq7an`UQP=P0-qoPWxAZRX3s9)Q^>?ECG*G0L|r~ zrQd-GM^LjbY%GC7lB|)T!+XfPa!~S1uCBoMlPGRYo!&V#+u9&i%fity1^OH@sOcD^ z#W3;`%pU_*y@l#~05xjQ9)tm(KpP>F#b7}SRL>?fSdU8mX&z$q7P`jmdhMX4(SYS1 zs3td1r=c}ucO;Cz0#T2J_!vSQH@M6IkFLTQ;nu{nsYUQz$0Nv+_rU#?pcl=cU_+>Bc-UOE z4*?Y3qeT|80l5Yg@7Dm;vcW_hco_j%7pAi)2AklPZOCx8WsVsi>x8~fmc2-wlrfjfxGAQ{M;LI6Nq_=S7 zu<_<#)mHf52Bb4snK}e`X_Cf39LrJRxR;>yPawLH(BW(c8#{q@2jKJO2-ycfMZN&~ zG!E)d6WGF_6MFa3nqBPT|AN|{1HWGY)?(mhV9*NS*S!=1qSysE*+OLthxu1&-+@e< z3`*xa&@Sds+Ie@*wiLSM6v%o3F!K}47BO&{<$5^#@qmb}9e5P-{XP7yAF|>Ve49BR zqIV1UCz|j+?Ul=UM|(j2+>j~gf>k%LkT zh7)L`*~rv9Dj!;i7!tp-o>Y^s=XAqM`VEe@QgUMlu zb+P_w_K;yU5suJpc0k@j&Op}x0QJs=JpB&&`Ud^-KL8mbwGx7N_7H(knE(2qj5MM7 zNBae6iNRLz_&faB3=A%TYTmC)AY=Hh#}Rswm(YQmBL@rfbseB>>(CFIo#}b*DTX_2 z>OesYfFs+{i$Noy{w)E26@cy!i0XX6Z5hn{0Sy?Ei6-b?gg)ac8f!2({kqG?!Iscb z_CSO!P>yj5_$YTafvWx$)fnKw*&6t5Bjjij977%S#R(WFME*Kg(&xoq)9*7XMz=Kv zLKGC}qU{AZ8yA3vc|zt(p+acD%-K-)H-lY{!0=VT*LrwA*i!+{ZYcY!UP z!2F@B65WcY9E50$fviAQvB1Qg;O#m%UNmq*1{E_)w>F)3F|~gOT&#qs-9?L=U2&2FI@e)tU}xgX^t6 zLDrv-e-F_cjkfw21%$d*0#>nrdpWwFygK6y%=`qR5(@LooaPV8X)$;=Fy#%5NC$g7 zp;n4O`9H#ELV)9^!M`P-jos$sP_pBMjCn2*_W6)IMZ<F!U`6AvNoV%kOe$M#t>;b-WxYJ9Rp>1>}U*@PPbkH z_2Lv7arCgchYoCE2AEYj8A0{?f`(1-)aRkAo(g;`2em&33NaRi52axC?eMt>VEA&R zHq`LwDfb550RLc!?#rP9m@^3&kb$ywH-eI`0UL{uciK_lw-3B)rF}ZEJ8^q#ZLDsR ze_8`5(e3~DGf;gp3arV(e5SuD^{SdM@ z6zZ%mMAXWC33?X(6<9OZCK2-H1N3QSCI=_11--G;y$2emyE`TwKZ-%^?1r2W0Z+dJ zwiPgQBWP=XdhGvm57?J8`ZDw;uc0S*gzreZ&?5L2eZ0U4H(BbU8zei6d#0hgo9F& zyc=L!cHi$wfxYk1$T9~TyvB(c(;`ocKL1Sk1ia!rIJbbob9R>z@g6^XmHVP}iR!3o z3Cy(x10&hqK0ppx#EPTMpD?g19(^ZZk=O^Cq4-|1FZv#16pBem=Q54o_!1}h@toXp zlkaVlB-;YB^Q%BfdqGl;vrEr;|SX1WbH^lC)%*ZhT4+}>3f(zANd(o^< z#E;;F9Y=u#!kcMyT_DzFTy+S8oQ$0MPe|?MA|6|QC@q}#>edWzI^HMqHMiys_|LI zKI(rexEHlbl%I?|=^;Jja<_AGi{ENDiMt|6ct#T#-T{mCay-wze4$EZVa&L<+4)Fj zD5K-=V% z#QqmXX^O7P+LBK6iWFFikAU_wdG4|p)u&6(l4+%t^o7ki{qXRA!TX8rWO@N7+>%fj znJ#Bd&X7xnPq-}0LoPc$VV8@+!>N6Jc|}mHwv_~x%v{Ov^ek14W53r)8%xMLTV+zv zHT8{%Ox$da^+d9A7gnSV`l$Si{K%ri>?)P&7v@if-&WM`E4;fOm1)6uTIT zk1IGP4K^t)$9F6PDqfb}%;$ zMZ9K54X#(0U(I~sY^IG@wlnzGxp;Z1@eLUhV#r)$xN;j+J0)Jl3qk4+diJ>u1$Pvru`g@%i{c8sRG=2K0La+GGj;e1`1a;@^F+eT%K#y9Q@O^i~{6Ay_R3(Z!; zA(~aXVWTJO+UqvxYLzRM^~&CwFN4QxT9lLHCTZeyNt)LA{Lem=HimbTuN$UnCXD@D z^Q|&1Zi(iJ;WNV~&?WZoOuLE+r&G zV>x%Eu28d2w_kTacTjgo_pPo?cUYIc?u=q3=)G5zf=wCjn8nF@2THPlhwI^07z*`) z@t09;5q`atT*BQ{*c~CmHNTcmFNiGK4E7WAl`!PK^|$oLqrHt`lq-G^%enG|{Z4w3 zH8nU#jsK!v(c;zqlDsZoKu0R}4|Kl8`)AOf%X7C$Tj{^W{qXu_a?@xTZX3m1FG(B6 z$W2ce(L*kj+|peti7eWN-umaoNRIC=nc|vD650*7er1(OxY};`c~w3y(U74o*N)3o0!J9s4N7i7g7_sH5}9GMmA(u-#RMj1zCMZ5IP>gO`mxPMlh zOMF(MOGMG-(h78xVRi-9EBNEiY;mTOf=0&l0nc(6elKgFc@it!Pp3KL>4iT`)|MF? z8zgJzW(BGjy3Eqf&&pIU%$lQ}sbAqTOK)tjG;5v9@~n+6Wy$GTT9+J`wORQtrA2Ml z9&)B=n*0*jliqWi1dxcHQ*g`vsC@|a_yHg3hCa8ULhj})l) zs>H?DvVzCbyYC3xqr->m(4(U)D;-Ji*+CaL%ir7B=`A^Db4NeT=ceOO&JBNfPNa7j zS+sFgEZwjcPq`pbwkL3iKm3aAPmtJB7H8yb6hN@NCZtC{h2z5`jr?!Jfd}*s9x~z=6zKgxAhg)~8J_V;b_I;2O z%5!<9`2r4ngqwdvKDG_($ZV%1+r&^mU*)B93ss_uS)|A@ICwuv3_BDZ5prSLe;;_4 z`xkk07%uu5SG+|_ci@$8#j4U|t*1I9;Ctl^?MC%S6-EZLwOuPJ_4BmV`llw(O;WY_ zktOOS+H!T8wnDvJJ6z06S85mQ+l)5A&__a&f=3 zbO+rypS5XhdV=+Bt01nL10SY4gpsuNGv5Zr7|3gGB=0cN)(mzwCh%^BmrrKS5Y}5K z#^s&4<}vPZjE*#WU=%56863+X$1C~lvPrbTQ|MIB>2<$QJ*V6#y$&zfk3X29#4qp~ zSE?RGKIu+w-tYBN-Nb7{b4Oa_vX(MXj9?|*@_(0fXTM4VpPbw-Fr)+xFOb;&E6G1Q znWv8g+L5?a5%k;3=&6OZzAjqI`T8PX4=p)aF;~^i^Jl3KsX`SasmsTBKxavG3q?Is ze4-W$Ni+&R9cv#>I(*Hn@pRyAqn4JKR<X)IU<@R zI=k~Y-*i|KEZ+wX3+PZ)#{RyI=cg?p*UTGcTd4C&a+`1z2=oEEn*fPG9>g_p87coJ^Kh_9w}E!{-3GQ{hlu z98_p>!ao|1sv@z}keQ=U;F0i;;rm%eQuWwXyqGiX$1<8M;Q=!);vWBn)>QTKUh8J# z)Q$T?F}PnMmCVF9d(wwCm+a^IL*%2bnSE6MHpY`;!8B(qG?ou#;47>^EcY@~{k3z{W zbYs3R$R_JKO&o#EvzYl9SKWkBsy?UT;V1Gee|B|V_Hyex@O5S6An6vZ#T$pX*y6OW z>Ds%&;+ogb_|J9DU-9gGFa78>V|*=DAsedy^*X7qL6tv%S{&nP*m0_~5At$8!L>_S z%SLwFY&*L6C8{Zb$A@kFWl7+7)umpk#t-{=!K~MrXL(9$KCb-~H1p-A!T;oljR$Pj zpq6YB-%-|X34SZlpn>m=>hqq~SuLDde~_vyH~168Jm*}k(b5)&z0xzFAAXnR7=&M3 zrXmlx_w$FO2VJV1t*SKDaQER4n0JsoGX*DjN?)+4h?33SpW(#!jJ?_41ghQD%^cr>QjcFX0on-(CThf*M%K-V9pwNTZjh#;OpP1?0s1qunfF1DoZW|5zBk-85R(I)9CX5^}%X=G8ljX81uY1ibGV*^g zz8{|i{e;KPMG5WbUJs<5e;ZxG4_Et@d0MGntjr(3S*Az#!q;BN=f&|=ZMfPD67d|n zr!Y8N5=vGB_eRe3&X>{5kGwx1l-zryh&q%dqg_?YLdD(#FXHL#W}s-s1n3UC?g z`chW9K9zCBBc)Hb3Rv7(>Be(TMHJ_>O>0iPk>BCMvso8K|$&}%ipR&uT?n`RE(X=Y&Fkh=lXApe@#wlXw9Xr+={Nngy1V?t! z^S+eS@O;$e3%6&Y{WF21Yr;HJjaLP`apKKFA!`hs@r&zJfV=HfZ-;cv-wInaHG!^k zsCW==$mf4(I>Yaqnv40ZiotZk=U{iLv|M;N1Rpv@O}4_@2I{+rs;&XynV_!HKb0MR z-*K1glbHK8GgUiXek@$hZmv+1y>ctCQV|D!r=rc}gz+Y-*&yx87vn73=wA<{w`+^O zvAT&T0iM$h_My}A>a)(_ReE%C8FlTYijTnBpKh5*twPbgJ~~=%TA9N1!_}s>Pe5t3 zl-VapOTbNVc`m*o*)S;8BSZpp|8b9?06aI!lgM%@N+@O@7t3_D3huMdmTNx0;OUP^ zrv)(ECvdl_5gzz5s~;GVZY9I}0JWwAan%;G(st?FZAa~U7-V9%k9S>X6iE8fYnhjNLMycF;TU5Hg^ne@Bg@)AP@h|B% z`y5tMCm&pS1T}phxPmTIgEt&Ud1FhK*M{e|D!!$Lk&J1F<9WzvGfp*dUVmlHJh`;rNo^yiw)$T87RrDtPJw%D)s9p$nk1OT5?mRtdZ^e${C_2xC z?6vUm4EtU{LT-;g`ElCxt6l8bsyK{CEs`KNB{e9L&;id`*)-Q@oIadMOO}NhVC7lc z1I{?1fCuX5qIEf6>z>`Yu0O7lCY>#fBW~j)GhCO^?fK^rfKE3D1@!^w%-s{*U*zU2LT zK|P&>ew6Rug3wS0ZmZQbS4I{DV?Z@KNX6W*CI z`dWC@U4C%OH+3Qvac|0aJKXdBaC#tty(Pt55|4SE>Ml}KE8ACn((r|PM=x+l=lw4j z+t>Im{GTdr6)iY;7^-)hZs$1@{l2VwT>Ecbn^7=3ZYh7m&Tp3gDWB#K%l{2!z6VKT zM^gpQKcVypUQx1-QS#Jky#7_4r~Y#3F9uJe22eRycr-)q*rc)73E3CH=P_=m#xHvI z2tX|Z(M+2ADR~)sy>2=uuTgS2dosAc5EIjz2E~@^*=1Ldxr_H)rB{{n^xA7WOMiP0 zSz(vsvAS+MJXnOfRyZuN*=o}UcVpSf7LvnOu=oysFQ*o-=w0XKC!Ph+G3QwLxL?L= z6m`RMD{6~56OAO54P-q{tn-3VyyttlZWP}?k8wxfP*1t~4~Z!>;Dq9dZbw9}uYbk7 z-tev`tGX)HsyEi|^0sIIzM`*6f$Q!3XQ6>zw(D7k1LL|;?-)6rd#LUa?D-yDjIgUg z&k^h?QGPLRlwOg8S>0l%GdPihzwm$ho8d5C+#VL3OPkPY3bWv~XyYcQ^IUM+XkEit6J$S(K0^E>1 zx=PMi?IZ6td8KS;Fem3y^4({i z8(2vvFdoghW{vc>DWy*ryI;4QRX>gHdjkKSD_KQDQQM#3<(K`MnYZB{$JmEKg|4)a zb;QEo4gHVPS+eU7g$H-Q{Y4q6x_>=`4%;3Z}R~|W}qqQZt;BcJtCz;Ws z3tl35#}a<_OlipAojOq)>frSX(n*BG_&s(@bv$D`*S;M}jjG;3s@qNm>Ww?_EGnq2 zs>^P8os*V7y6-(1uU3peh^jg}wTBvLJh|WE2jqOgH9x7STbKVB?0bv{#4J53O%A`X64C4s)K$ zX>|*{`Vj};!4)>BG#&o_1}9hNG=k|x_Axu(gDyN&HW+=Zz?_9XtdL8bbLd_op2XbdP2Ry~SJx-SbD+hbt!8cyW z=1CK&Y$e}6Eq^+#Qa9AMFryyb9>9ZrS&=C@U>Ljl8HOGs*&R1KhDXPek9vzsVLEAi zP~cZov6-LLaBUdr)wyn>cr|=wlx21jZVzU~YK4W@b5N?QA4mo4sQ+koKHlSASxU~k zhGf-q^E)8Fi@T)9sp`?*Ht7B#IYBG)eHC<@95gshI(6$Ke-|&sAuS}-{9666#`~rt5V`yV=ajU`|Z?fR31jkXRp@frF zzMOX4PQDsL7Z?R{Pe=-XOH%KQstf4*VQt5{ZVlUOB8ytNlXTETK^<;HOyJ6yq^x}Q zITBVn;I$?a=by%IKc%`#$un2^_m$j)!;O1b?J`_(?1vMP$0IcS(!$)Mk+V=Sl?W^T zj!#y$fNLN%DwdT&-Z;OyLD_f`d<><=BDrXd%r5sGq8_Gd@t-O_Gad_1 z_p|PGtgI1FJXqJ**n#I<^FYND-SrQ6XqSVdHAq%T8_sbbM`>f#H|Y@zWQM7VpFN3# zOCfOLuY&NVHs1RY7@dVvWu%N4p2p6lL+wOIy9=h{19Nflbd>X|A&N7{Hj4<{Xf9kC zQ}jtw9q-P7c}iJrnk4ts-C3O%J5q?=`>)`_h!PxR4{Gq08Qq6a=XE%Ymjqk7H2nfj z@5tQYD6iGjJxDF7IVrx|O}pYW7Q7Z-)gH~ANgpZHT9;SE>~ZYv*P_wXbRBy=L3i(u{~l!BNr@kW?gisX zFd`A9ZE6_V{FwKCMvB=|JC4y#po3JYk6%X32hp`Qfa6Jemk-LG&6DjH@jPF6@&q3$ z5f9z<#yKeMbF#yG+e{L8Q^R_&-)o$}fA8SchbVNkyi2HoGcR%Qa4GTKh@J`=FQah^ zy~_ryt8v`{b&hyT$AFWZ{Kkt{lWo)2^1S-%5BF?H{=q%}k~6wGyeY2gO=E0rWYHsf z&m=n9Elr@M5}#}*cLNN>y80d1te}&R4jcg5VREe`2p69VSAweYn%=?L`Ec=yIA#aH zkYy&}c!ooSY$^GlGPU`$!dAsT=k=U&8*$nQnP0zE z#?-kKnbG0$N!3H>)laDYS+v@>+8Qr2hlkfBxc>Www~d!ehk*Y&%hjBnqU1*lEj5{o zY8T^liBvXOe$6|tNJXXXxl25RbkLWYezPs%sqNW0MKXO@}x;{jYK5hvWjXd3>m zX3V~_xw-`~jRNqEpA|uL-rcf?Pn;~N&`s+7oZj)Wu(RTef)v)5Bu@1| zHh)wXSyX^We~jN6<;^mjA?ItprdEsjlOz=y8}41W!uuYQR{a9}m%-{o61C~;<|H`W z3X`(vq4D^YOVxd@%9K7nxvIflGo-;}4&U1YXO8E;h8uqTjEr?@^`=4K(~o3w7)Qco z&F}PHO2635Nd4${TX?OTLMiR_Q$Xx4*TsV468>#;a@ahXIggRXG@RLEtl!WRGSFq& zq97QMO!9w&MsJaiJ5aT~n{EY5g+1N9^X9_lqp0&LqiP|Sc2nTAeU$7#Y$&RY%h ze+WP5(6V;(L{%dv%_tn`2o+hx+#Bh@p`zH-nbX2Vw9{J}Yj?s(rHcW6w-hFAka)wO#+_)BWG=kjstH!;jW{zdLtB^6TFoJ@CVR=kDPj4*%@nm5&NOE&1i! z&p!I`f6D1q(IY-TbnVlk9}d2L{`12>A9LOM_QMg!KK|v)vcKAXIe+YbzwQtwN8_; zvOi4jY-zbxm9<xDi`Bq#Zi^$s4HDUUwt$k;)$(f~IxBM9HltehI;`_7nVJAs^ zhi~doE_5dk&PJ9#d%Rs{E@Ta}&6jF^^{}6CZ^#MA4x-DdAH*$Vx=UURjT>=A@X|R$ zql>+x{YwGuU6s;D-8Ce2F?ciXT@;SbMn?RWE53h^sTaWSe7#4u^A%)$L};11Mq-bG znDonl61rE$4U6o4!7gGzc!1`gfGgi~wAsXs8AaOA%uSEtkS#1eT!el5e{sjNF8oQroqPuvzWRm0dn=zqzLG{q|elVX6PNY7Rs4dlskJxy?FNc&;R}df(p1?f+7N#&r?xY17Z6I+~OLQ?vh()oDlHX zE~sqZhC0ilK)EFBbNyfk(9U7_-ezc(BpyS_BA_&>A9yPehRE`T-a$@&~Q5D zNnoWc>=IYz*2hOYsLajV)p2t}edqoU-gU0o6}&(9O!9;Ws|qgc3O&|vCUwz+)rzp& zb}sj9&#e#E6y@!X__5(^pX2LFPsOdBLn}ZjxM|F)sZSsGz{G-^VJ($R)C9LRYzh_n zEWpBtJ3U6#9cr}?86?aR|2xs6a?Y9|bJmWr6sF&d`J`c`sZupfa5hs1olMuCAXsSI z2~T*ldOummOrXori<&ID-TBRk$#WfBs}s1z5_q-L6LhJHN-V7trsO2Veo!{p)Y4&9 zdSY|OECqEGrT3@j4hG>kC@ban5wX+eZa|Kev9kj2&n~5?w?S6OII^6{i4UDwHbkry zSB0ei&>^=~j%{(`=oUQeR>~dgcm2*StHONO*82Vhsyk{v3EGK0K}pSKuJsoEkJBv_ zNO0^u$n~r`8<~eINNfB~CJtxG0YhYcLhxQ?Xupnr_*&v5sZ&BhrI3wMgA;3j3!lyD z(tcVXw6sGJ1pS6>!gVYkp_@=o>5);YVf zD#n(cHhnF!8KINtk=468K5VUEOEC9R#?6>lh}`8KSUd9>G+k6zq!b#*c!HIEy}v3R zwcw{8cAV-a^|zH|%~$gGh0@Fjrew^Hh_R~+Hyvc%Ii`X-isAQ!PZiIFp0bbawr6MX zrlge_$Rh~eY}z5#^V*YsUlUdmS98yR(r z+2+ss;7QOM|DvD|r6w5u5E=(pBBoqoO#!evlAk0dRCy$&2Vb;@&<(!qxTSOWQt8y| z!5_OUA4VD`DYq<(+gH}^>anWJg?M^Qz)iP{)|cy>W71S6=qERuE_f_|`{XW31H`$O zmPypk10&}g9MgaPxX+k5o+87|ic7n;NEx{^YpRV`R^#!~*zOH+Hv%hX25Qz0N@9Bv zBVM|=xx?oTr_#}S%d`_WV?G0fn}4F;osJ-A1@TZF74xzdAkJ-vVMj$%ugaaaVM!~@ zF>rPFqUNX{8W=|tgcHYZy3~9AECVfBt+|6OxDpOL`Jlp_7;o;JOQiIj70Ft5n71q| zTzkMQEEp`l)s8kZH>bL5Yoy6nOSgRYY&@7U=_2)wXWRKDbiYqmH6A|PaLllNy63vm z(Fp2JqYlED>YGs&`|3JfmnvUT5+q-1mULs?it%|7KUU3~)vbTlniA=>7+!fUMD)KK zb{!a(RYA)owX$eqHkalr?>v7e;@kB}q^yZo@ zNmAEj)@tDoTit0HdYbUCy0f{T02UamWxL0qcTvDtMKjbX?QJ{8CYQaQ}v^)X$|g{q~%W zUQj8Ad73L?o{^{>wNLK6-g>>D6olr1>|X0#47#v0D#&}P|0~!!u9UJ}DH@!9UAD~i zW`#1!u-LYp#%Ak|<&7aIZYx-kcN9cK)(nmFsLT+uODGYSTc3STMJgcD5a2>odWjwG z_AwKcrFZscH=Z#nP9{p^?sT$b+tC^#e65)jz+?bnlGAcbMAPkNB3o*l!W2KVPfB6F zpJ{5qOBY0Csis6H?e|-2Mc(ZvKyC= z9O0)Q`V3ZCxal%}?4;rY!VSAH0kiocXtvYQ5*Q-$#K|xL<`czKR<$y*r7+lQUgiTi z8klUSzn3h3E8Kgku*E4w%h0D;PuhiTF8-bjw)jjznELbf!s@c@#@p8STtYi$2NS~% zLWwS8QNZ#-fty@F@iP#cUWnXE!j4phCc-&nQ0II1Yg=~XUQ?l;$#qhGh51Z|8v-EN zM-Nch4a9ob%bmpBG0{5TF9_JML^7=OGPk9*x7xEBJFyFW)^|0uR<^t$qkWix0fATe z7AKhDx8{qM5egk?7m_fy*axy*@TubEu4OfTU|J*c6I|R6etu4X--PLN0qYQj_t}ND zPWDR~edOmC%bd*#3Vnt@6u!B2b+@kBjlH=$8t)@aoXa{;HqKKlf7(sUTwIFJ9AT%w z@)~QsC?sGh1JpJr>Mw#t>iU-tWZib420t^&NuAf&Zxn8z-SVkKoexlrvgMg-SPbZ! zcEkJF92Kyv6D?Q7&7=Bl=8Ko#c2dus^Z7F?SGf{m9O^Rb z9Fyinx1`Nq6lXOu=6Q-?zG$9075z)74KhbWI?hhN@SA=Pz`Yt6s#;!ia;AVWl~5g3 zc>UUk!7YUsRsM-6EECOhv2e`Kex#Vz`^@!{@r;)`r@<|X`HG(+A?8xiSg#nq3+w>N zS&bpg9*Ip9xe0duSDBgRNBIP5eq$Gfo)r*wOVl+@*e)XXWY#62jR7{k|1Pnma0sEd zYUqJv7^RwzxvX(M!=efy*-rf#U_-p-*}2{==1)o} zgBaa1FL*(&-O$s^c><k{#^6eT{nXC98Zb9v;SIm}mY3=I>X!G~J{;F1%m9#fvUz?!Ohh+) zOdpq_nh1>|+G;m$@$#cp^I<=`NVe9=mUk87EcDSQ5$d=k;cd~>CGgtks;Q9}{XXPV zO)E9wDPdj&tn-|vI+3#36Ap>oZ(cf+)LdC5H=eONCEDj@I|aaOyYU~t<){Sh0ZQ}o zTLU0pw2H)hK;}KthIt}m)hz!k`XAd;7!xob(#$~t%lmdvZMTkd3BTuBR=EtLWWJcd zd781x&j$I~;V#2KnQHca5-~zwb zKLN~e8FO8h8|2f0-Q>m)<1Ju5CJXgW_J+tG^%}NHrbuGqZgbrO^fpOoaI(_^!f8Lp zy7ZAZO?>(pXes>JrK1N3v#V2`KvGQ;C2pDvP8GSAT?U8Cdc<#t^;!nWphUKg^Kt95 z4|{%=8+%(GVYGp;_Zhy;ZdeM~Au?Ky*^(>J>|+;5>@3N0NfXZc4I>D>d-b-xGY-$4 zAN9b?Jhk)PoyLx$AxT{LTfo!-o9#aRl&o(lyjkUcb24`|y41xl@bW*4wdc+cYJAJs zqK+BsGB20uT$k}xJN?8DR6F+}7S>9z!OO{nKOpeN4(M+k&PW^MM@JqXKvD2dB*H)|OF5p%GK3Osz z(dZB_(})d|0_cfCZw^?-IjKZ1dR090O5UKxE2ghBKLs8l$qk2{l$USv131r*On;{FhiiA?$Sf z!8rl=mz{M1>*f>Z{|s8BVarnu`h2ECe&aO1aiW(yh50DSxL&iwicF$t-2kkLhC0Y} zYrxvYfAPlk%*N%0w+3DZyX2r|wzy{9F3jnT`__rlK-cRi&U{b&^z)R2e3bh2iCwD!&`ZCv2CzPqAP@WTdyq2|gDn_P!*l<#W zgT^vm!cFoTgZ+GgYWTp<9+sF0r=^GX)Bgr$HV!eX8eFPcTd?7(B4{!)NTyOu^9e9T zqHH24RH=um*=jfCIE`O=*C$5*Vl7=>`5Hs1<_QFy%{Sfk(sTWW&3N`vJJS4&Az=Pb zfj4FDg$AN9vu5D0kIbjX)qa~8pys*QJAQhOXmJ8-jb>cpG9H$MV|HHh>&U}S3{csA z=J)f$-@}_jGS7^&nO?(8m{WLDgfm6(+)wof=7Mp^sUeir#x z&scKnzrQ~0rg@_&e?aR4n2Kn#Q#UfzH4&h=Y`DNT?;hpc%lJ={Nl0 zvn(No<(M8xm>D9PCkt3)3w``w8cW+PFUAMhH2=6(cn?$cisc7@x~syc#LN>@1+XrY z_=k3*>=Jg$rcD@qCL34z_{|y`E#2?>^1wevSU1{P)^B|iFb{mj2rmAR57lr?P#=Ku2UAk3REz*7bZ)0qTc3RV&>{;hJIbi;Y2xZtZLZrIc z`9gp!Dm7`#rPUe617z-+Y`p9lD+{Zxb+MuSQe-PNNrts@W;>OxnDao#fZ=FXY&-kIpIp54PDk`l zmP0{tB&rakiD*q0+fHvHpyfb;V$CCb5wb~iy5}X8t{_QC=r;}KM8qbsUvpFLvR_Ie z8{Lz<{8?i1GrAD6xeG*d5{?3|zXm!Kd_2zUz91R=^aBuFQI}niQGI@(lP*;#9{#io z?a2ypaffA#qkNp*5SnFif$!9iD0c)94uy&`I0m9~JqdQ>OU(gS>O&k^NpUWrh1dzL zN_44B( z5KeT0Q6#9zT>?yJ-Q5Ux35ZoF&BsN^u{?E4qV^1at9?NA`D7b>oiObnlo$lrsxa>n zTRu+o@tJa>#LZPBr{F0PI}wCP+!zqj?w&;~jpn#1mDkE$qunylm3pQh^-_5snk$(* zW8??@rKr*k^E7m7!~iGQr^Y10g%XN^{R%4W>lOrT87i0$2fEl?H8`VO=i(A~R3$@U z>vi`W!WGFGE_#+mU8XX8NX<%bPuvygG<3+_=EC5*9(M4hCOENol1Xs)3ZP(FOaUA= zj)ECZW}#{+r7VR04R^utVB%}hQ+3B-&8@;PH%~|9K6TODva6kiiUyiy?1=-DAfWSAzs< zvJ7OLP(;6^SZELvK-un&1YMP_BC4s1oV{}1Cu|Q44^bms;6Aq4>2I;A9W2qPjlhsQ zPn0?>M@A>tD%)$|&vH;9^^!!@zPaE~bmN&&FBpuutwDn%wmarC-LKoJw~1NNsV(Xm zPSA!ab%K|E0y@Yr#|bu>W<7iVyVGCj7MsRDbknu;Gy()_u53+qhdPm4i2>AG0c#HK z;()PAn9ChZOdsR^4z8<8w+|D$4)CbAw=sXK9sMZV#b2ni^VD<@Gau)8fr7&^j91tk zG{uf`aCZ&#Rl^sT-`sn?a!=gR?8l0g#ttV82ANe%IDiu5q$_K&S>|fg;MQ`Tn(c0r z4Ekx-GB@(mE8HjAz0>9{bcD^7!3D@y!FVmCo{A#orDJ+EK^9o;<-`2uDA=`@A+uxh zabCc@sXWw94emMmxaCeySONJm@U~)XD4*=(>T$GVX^2c$P#NSM0e1)N*E(V2u`&?l zL*b@^loq)8To}yV!ptl3ifrE{F zdeDrvq1`Uilk2Q5W{A?E0*=*S1GWa3Q>$RBdtQJqsY`9@vWCP4JQ+@Fu*_-f#(O1g z7r$>VY#H0Xot_~_R)Fb>_2VqcPd`>|&!}GZ#`ZG_?bI<{_{c{+5g3 z_YV1c7WJ!^qFeC@(J-+Nc)89Rm5W9Z=zyY~>ZVY3FhQfM0Y^ZA9NrnkUrAj!eeluj z&lF=VWzq~C2`6zMl+dMcnG@W@DJtxI0JM7gOXi#`(Fb@8i#)S1s=c%QukG*jT4=yi z{ifEeG&^S`){Vf4EduE((*3o4Ww=zEze#2qn5zICitFpu^QUBu-Wr4#S?*+;Hjz$# zdJBQU9txQAvaDrvKQ&A(k0WqmU7QULR-=!WzXo77i6{d@aYQaix;k)3>wQ=1A5zE( z_XtrqQYZSEw4R5S>ljaeD|f8~JqUFViK=C-+^?N+DoiDMN49K|`QE!eIBR^@6B`f~ zxvf0+juNDSZg%S>*n7&hL@m@;K3$_5+?jrOUlmJn56$ohFlF@g;P<9k?wsQ7+Xwn6 z-FB5=sNHx%HuFp!(692Bow&=y(2k;jkw*DCD!a{o+Kyj;@$!%f&kuRy8yFV|dxXaM z;Z*0rnk$DvU3-J(j{^>+fCz_KYT z+J>5CTOJ(hW$wFUT}+`CTTk`CsHQG|@4>aFzo0>mWNsjd1?V>*2A7Z0tch}xi|&NE zBuch}JkYy}nkYq0@hro}`ANY=Oo;aJ&9P^j3oA)l5=_$~R9vDvekzE9V_x76Y-BdfUk*k^WBZYgwpqkMx-&H%Hh4 z#aLKAM-}GRS*lPoHtqqui#h0aXotTFnd1msY&Q_lwScmy##*-^oATup1zaIQZFyg( zm6t^yQ%zVNj!}$_Sz%S6E8&l#K*U7z%6Si%$;3DXN;P&qaU_Am1e^ez zVrYQf+tCWi)aro><=oqA>XD8=7=QO`8iN+G<+ zhJXm#gZ#|aEK5Q9?9j&TmX{w1H*uy!57L+dG~6fjsSB@#cGXx3Y?AOwmbsSwi^R-# zM@p8Zb&`#a$NE`!>Q?-mJ$H$fFn^(3*WXogMt}<@QMK-|*tjt{%EqQEe4#s0rH8vi z{8T>@?5Cn!plIgd+mWk#cBrNzeZoXt7IVWiKG8kJ2kMC>m+K=VpC>f}<`SWZT0T9- z1-JmT-2UvVW9@x@ZTor2`PokofBpOz=&OaUBX*l{Fab6?>#*Va^7F39k54bD75m;C ze*N7MbGpsC?n-@A>2S#1$BV9Jbx-2{l0xRgOod)g1~@=Zjg>sl$6HR+#qd-;iS-RE zJ_RmO*@`tPL2BThD6s+Ro2CJ->`@|5?M%)dQeGxr@nlCCfHS^l{fbs`z^?0SjDsh| zJL?;2ZRXuW{3aI!(<(kAL7$x(7qud`L*j~@bp^-S@)3Tw@8@oo`x|RV{))hqcL(l# z`>UMqr-r<_E3f+9^iMkfRKKn1_`F@CuD|;|D;PunIwXI&TLpYxxEyq{fg z@5)PY2`S7ze{glS(Y)r+j0sh#2kap=H}B7#h_qydIZzc+8a6zsqHsjSx^;%wXLch4xWP|Tg>!f9{?rv!wvdFj$-;uamYDH55FTIt zbi(z2M=ZPhzvo|l-QM@VwqKv0U-tBW|2_X2IDkomdD!HGnS^)1ZW?m|NBXFxM0B7L znjz2K&BvT1HU~9BGhc8I@NqAQvvu1uZ@0bQni8cgZPpg=d~Fa+p7A?tNj!&%Vf|r(F)q`R0Ck zEARTEPo6GwSnoCuys+}AFZRW0><~>iv+^oUpTuR>S2{X$yE)`UucBXVJ}_71FH@uK zrfIm8LA{5BX;hTgG^@^`vdwY_?ff`9S0zW}QeUbO1+NV)4QYvq@N=VabOU??^ZV-h zl+l}&$Y7AIqW4Tjyll&_Ahq=u={C)^2g`1nssT&c5&VTz|KFjr*_Xrj|) z=AOHw2&QF)=*~Ck*aW%+c<;nsE}Fu^Jy@YeAODsarn5Nz@>p zbzD}A9o&$keN?Gtn(U5kqIor@9p1QP+9!)u)SDpY+^rg|Fn|q}%rmv)8uyWXOpBbU z(!b)M`f?+NTkB3nFe7kqk$Wj&b7Ai)R={*i`ONaZ=2Q7`eDjJ6uFxG1r@gp8IxhL{ zZ`umeg3}9|-^=g8|2<98@JH*%(x=A#p8Q6qLu)=bGIt!1Cyehl^Y&r;%?A?%1yeZj zvC`ogDsu_PvuKI!p~mpA)WtS|SRb`X3R>*x3D^ud(MLtgvHq5))5VFVQH?46x9ktJ z%-y}9|DUqdebB#0#i{=&8(%lQvbOuDdq2Ov>H3k^7M-7MNIlJf;LW$z7iP4?znxmF zh1KISY;D7o6O5Lb`8t=N08GJ9k|GN|qSySBJKg)gJ}O9rP&I0GGYj_yg{RNITC5pa z!klM21LOcE$y!5txtLp0PzDvLnHsVzWz;>Qqx1RCnc%F10=i>A$AIO-LfGTD7eVQO z^SblZcSmG(ZRa{l5h+y07p5xQrHuX)=-*F>U1)SmJhev3SUr88R`_slx=7dbi!7ot zG^Q#nwt+dIhNXDSgtfclZ75QrPTYQ3vP=esCc05cyY=;e!SUd)X+3(Ck58gN?+sPg z@|?e&pyC>jww^8Qked#2zeSV2d$eT`C7_F{fnULXpA<3lR+04Ho=ImK_eLmGtjx%u zOD1sb*3Z)uZbw6sVm)`{OF{7sBw{KMAqi|ZNt4>#>P4b?rv;$L?zDr71TL`nCU8g!IS1^ zESL?zf3UtPM%b;3K&r;QwV`8;8)@cB5bt19l~ZtfdUVtwu`5R7H0CHAjwihY(~16% zAx)H|3X4ehO6nDjF97phMhCPHLA6@60;an5ZTWk&E48Q&VzpmmjYunR8B-)%Up)Gw@=3ypU$QZc}A-c-5it)orKPTRxdc{hE?cY{lzm4 z0b>d5FL6Tv0#pgH^wf?ly|yWC`wdTygk)m#b33%)>*WJ3!xPwI1769n5%vjKd3QKK z(Xs_oy%p+ncZAHOMwU>_9YnnVUHq^W+mg!TpnJ^FR(;UuU%*Q6QCVY+zy9|%SECyCATWce(GZmxm30*uvQ zfAp9ceW$uoN08tKPfudVcAEn9CepDL7b?a}ZUdp-#Zi^0qn{UvC{tu#xI#_ybCcy> zhi_bct*3vcLX6ok5i_qVu{mIp52b)u9`@`O)(U9Xs;xM!fW0ci{BkqUH!wpHJUU?6 zt%~EV;0ftnL<_3eQodMZPGvJME?$~Ys#mKxgE2jH8@E%6rnlT+?>_bdA0qWl>^v2>*-d~ zGnbyEggLPdp!Tf3gxe*D3wX;&_P4r@UM^9AYWZZDbL#SoIi+?C-jn;$nJd{(cEVwp zuR@#G280>XvFRg{$}l2C&%X3H2Np^0L=E1BXHiE-q%Fg>|-tg zD&QXPH1%=!RP>$FAh6i0N$Ffh}BW7kB^tdc63>eYR7N5b_e5772N|J zTii=kx+%*q7C{e%Fs2}T!ipOQ!ijPz5oyITz# zIxv_NbA?SSirqj>i_PD6cGl#OPzNK7GY?3op; z(Q$3H2@4Kug^AeU;MS>PKC%HeA3uExx~M`un&{_-y8)(~pvjK1x-qL>w<)U^;;NKhCYy)6P{7zjLV%_HsljEHl^I8SsZ@{dmb#( ziN(Vz<_c`IQ#U|ZtvlKa8nQaKQoALC(>?w}c2Qk;6PzxY^RWZd1ib0ER~_~3*UX)G zK?13E)wO%nj{&IvV1Dv&A;{IR&8|oOR8`jOKS15{73>{8uWWVboM6~t zvJn(GseA5jx$rwl*Kb*R+z)I?aG4TTkH%xengO5fe_T}eMbX)TSSZaJ=tNI7Ybkyc zo6<21P{mq@DKNpMy9B9(xu?;&<$~9G(iY_SKvx8gU*sA3HEY9BCl*lbNt|72U=#2PQ3FP&HuwadOf6-Hei9qlLMCZ>Q5b@3x_m7 z-JSXg*cJLm#Vk@5A5#bpH9ncJBi<1<&qq~|s3NpP79HhbK6urg)=sYr0WPpaGp?$G zW!$%FxZjh4E%{lS7qM6R+`02Sedcl+$2%Fj%sQzFUOn}L0p=(0eaG?~5#-^{Hn3c> zoCteWf*b3M5)%g^li-Q3|4leG>kvI$6Y~wrfF;}Ar-5oxSQQQP3TNw}ABM`YHjrtD z7BJ8Ob}H5+cmIn|-}!H_E45A${~xnVjag|j`h}RTdj=CEfk8f|48s$i;UaYsQnfHu zvO1|`g}+p1YC^y4c>JR%+lPXnc!LvK0rax@kS6Iw$OCh+O#{zSe>})#$bpkb2Ycy9 z;F6rASzW!h?f|X6@p0ooxStZ>X&j3!1eAlNVB8cim~;&McmO2nPo`&LN3p(7ABDS# z9!Dinw}ZkL7d$p zgH+PZSHrspD^9JDpbjKb|;C#*ysV(}XiQ71BQ zFx$EO^KBuoP(0O>L;&Q~|JLu6MOt(Sh@|0aEFlIOjGsH@e!sJW-(RJxcZ!B z7UOTyb9fb%$UtFf=q4$CO9qrZW<_wKNZc#H6`|LO73*J4Bu)ivB3h3-x=d2JX_BlJ zrl9q5vSL02V{s3sSw&}o%}14iz98IXw!vX!$Yy+XwVH7J4)O~qcFQW|p!n|fZ1dC+gWqL0+?VLB7S9OZfE$}5l z%;*_BGRmFpmK5|BiSok=>O8qIS-*qdgRD@?GwOyMq?k@ngD^uPj+8etu`VG+|9oMX zQ_)blr;l0;dy#l2Jq7Ip2?5HEUM7-gSOeaW2L_M}A>6}G(J1GaGk2oCeREu{RV^+A z=)-Y< zDuTy};5F65H;L6px4?t4eqWqm*+wy7w1I;YJII2cdRdnKis@YbYlnCRRE-%8;+<43 z9EUp*^JOsmVt0jZ2~Nd*0;XITLi9RgI_ly#XxA>jyIyBt2wru+2iSZGC`Ge>RRkI;>0EUMu$TrS507E?1xACYZ>O*qOa1i;s_U9?{K ze+7%pf%tqKx?URJWsz(Sq;7IIp6TpjGN^X4bSNmKz5_kf=1%Yg=%ZLRQU~RJnlX_Y zgKa)eK)+#|{mYSH3mMUD&s;P8!;qd-J{lx<^M5iLxo{W%?`}%Q@7q}#?E!tAumXHZ zIs?N(P%QT&6&Ju+a^6Ar4~rnsZta^+BE7O^`|U2*%s=u93&ZHP;anQ zyp~6OiF;{%R^czd=lnV?1+YVc!IXx3VQUd}3uLOsltDa*$5a(sD4Tp-ER@Wi?Eqyi{L!a)yvBjvq?8Q)eg^q{vuTkhRd0nxfp}yqy{{blsm@L)OpCrRwBx zCwc_t;ZRw4hTZ`KoV*SFBnR2}>+muVyvBRrQ&P2Au&sNzHsOnZmv{FNy#=koi=>Ow zu!qu38PV8;9$`^4wxh=d(UPGQc!=)bltP{edKm(KPd-hGJGDMR1s|BxsaNsSDch=% zANR&w2AZg&Fz|y3ayKtbqUt~=#ZU=KNH>>Ih0c=hekh>EDK{QRXX*N-r{9=?I$*tN zP(z&|z-4U*E94|SoIx8v7matJUvNK}uBZNyBNb~I>I2qxPB^vUW%sAf_WJ^_*^SpwEts)`^{*n`dx{D@tQ66DB$p8j{(dv)cW3=}=K8!#?Lqex!`<$!3Q zcSaw9B9N(>qEM~e(QXt5N64KC@}q~c5TL85IeQ!L6h4yX$p%^H>47pYLLMc_DHv>o zf1kI>lmMoYPJmB=BV>bmwFm5gBUQR~)t@c-#q5MQ_oWa^VP_H2uHY9YCpndr(drP-;aD>HzPWYWQz@`^AxD%keY?t5^Py>>^%X5&G z@LnznK9h}hLy@kKqEx-|(G};7-|)@m0Xsl%(=!x=lYAyG)R#oj;->}?)+;QA7{ms2 zJ+TlN6<7uS#0HhyqyNyclMfc4?>l|9e;=go$ejRm3O1j*h9LRmJUqU zQ48i2Sh@5^ol1=YwNkba&x!SA(_YpJRXCh{u(JDFz=G}ya>46zf0xM)HsFG}1}`kY z-Tmgv`b~})Zvr~_>mAC=Radspi{mQLQ#n($B#o{C>2_u#HB;^w;OC+G)F43l z&=hDSom7jKeO%_W;p4V!nU>O3{tOk#Q008+I}k3K9Ml=WD!T4@mpELkkJ^Ge_|-4K zO=1i%N5Ow!e5Y6Px_vVB^DVmg>P$lXRsx%d(pQn6)@yd2XQbli(oQI zRHpiM1(>F=Q>f1{jb~h4)HtN8?*~6>AKzIs($ojCy^3x@2023%6!-x!`i%`B@9f|$ zU=19L&HCi5{deEVe{B=uX30@@{gI=|AYkyK@rm8^Urxbyaws2NKyh-gj~)V&Nmp4= zVKN9(j}}BP*w^^)^YL->z|7V^!8d2Ju|a?i^$_$KVeT}8?VyULO@_Ol^_#t2b<)H|JV7YLf-;rfbxC@ZcQ%XoVFBb|wYtNxv*aZ52U3JJ?7~Bm@1t zo!Sfj?0RS9rjGdc!AuTXnvEp1cw~$IWX34naO>bQ9;HgK5gP>RkginOT7CLs^-XH? z_%3(85FKGZ5-OlusfD;_fYoccvR;chf!2_CI~zbjasn|qs-ns1hvsx3la*aT6095c z;=r=bx~Lf>(Kc8N;_W6GelN#(sYFyK_f(7oMUnvomagkbte7gGW`RLI_7PkL`uPkg zr4g;{BC$0h0c0rPGUb+IMWG4&{NDM0Q3LgvPWqr4Me49($kEX|$<77PHPQnM0@Wwt zjo-=}H=*EAz(rB9B-W`%ANe2&Ly3yQLpxDZ;05{VSvCiLq_Z@Gsp)|8vH~)KNLTUX zZEq9}NRmT<9VDpG4(k|;2$GN$M~J%S+aq@;FRs94IL>9s05S;HkVstzeMRmOob&39 z@Ji$Sag|~KC4mW&*$W)#S7KL<0)#s`=_>=umZQJX18qs}?X(tBL6L*J9~bR##!N{N zYN!?*r=nW081wrH z!pon@y#p4227`eF>;Wyfw+0+8BuBf1f>oa8fq{AXXdq6u{|0y4x6k|j;%&4G3$7o2 zp_;sF8-!dCFUJywz&0GCtaiZtI7PBnz;AH^wzg2&Ah%6>o)V9ZUVW{;2zCtRo*^vi zB3OpU$jBBd1ysMwVNgrCNeHptL#-r8p4zyP`kkG=yaJrj*WB+G!cw4vS~_@D=V_`2 zWXgw*QqMpJNhcN?d?6gl_AG_cs;4eelCs`>z)-X!~&KeyzAHdHdS^ zEyW8F238uvdcUQ)8-#{Tx=r3ZK1-~X(5S=){m z`#}j#RxLGjiMvFNso_gJ2i4RXp`^S`&8!hiDw21OstGPxUb1syjjd$G!JV^eqDoe_ z?Oa+Tl~gA0T3eG?@@~nl?KMdys}An^xF)4!b=$6!HTIG<$-5hC(o5be*?ptNQL^^n z?)x74&;=qE7=osAh%@w!9A%5@=7+e?a4ggEZLa6chrIWk`GGu zPCQUhvgzR7SqBPBHn;6vdO#_uO5V5jz?70LCHuA?C@R@{aNoxVN=vr2?K^qERZ^Y2 zzwyBQk`GJv-#AcKvi;!x`v(@6>}cEn;s7pDlWQyoD@t~j)WjV8KZ>qA5UTy{f6vS? zgTWM)2vbz98T&4ADiycFt!}Ao?J{Q;MyM>Ow5WvpYav_OC^H!Q&aq_47?etgsZ^K= zMI}k^dH?i}IdjhUJkRI(EYHLR-OGJsnj0T=H+Tr5arEL0OT2Nebh^#pA}MY%##fjFpmT<9$54k|Iu^APj~l?LVc z3HpM{a`QNX!JzW-yl8jYClHO2)J!AwwX zP{EL3HmEMQU_vk-R6ky@AOI{J)T#+dtcDptf#p}`9dbEW4x$NXwDKF7fXcJ ztj?g~A)!4>l3P3>bYgXl7cU55R=079TAnMbC#Xa(&yDpgx5PAWJL~y)iF2M8tJk>H zBX2kBMNp|hgH3 zLE~~sUMTBLQ29_^1Zya_d?GKBH9TIvkcYCQ#uaM$=UH!qD)jQ>SnqNxO!MPe@5d{g z^OIO3#+4rVH&`EnD*f_PSRZpMIr-_VPve!*`B|({eF>`3D`;bV&8;yl z5VNMoYn%(ZSu@799tFLuZ$Y(w1%0gVxwV{vLDrA)+UNo)Yu30fpxkjNfU6EsbToDg+c(}D;_XpCmHLRVxFt68tm4OuK` zHZ9zaXvmtK3%w9c#uJai-N+Kw6Td=lWU1f@r_cvkCVLWH7=UOoS`rG6Aj?@TnT3If zwxA`y5J7ZgEp>%FWCf#DQW%QpvRa1qKEBqAzP*C`1uDqfM>oJhGD2rdJe) ztP-@D7R4h5vNq?UB*c)>?oo6DSBw4HdvsA2V#IiwQ1k%#i}f_K z=n-Npc$!}%L>RKCbwwhC$>@+2l^`apj-jFo#8l8RQB;GN$vPH_FvOf8Rx55sELdW_ z;x@!mAT}))BUUo8b8$Cf&FJ(f?nP`^oqolAh^?TLQ#^>+$vUHprHDO4l2AN?IItv{ z#iNL$K$2f9N7l(Cb;VPN6QfH~JcF!fbqy8IBF=)YiQ;+0Mb@=Y4A?l^p;kg-Z(w!n zl~C9l1>L44RQ4uWw{r=N?aJu!DA8nZX7%`$XtB2ldN?I3*jr^i(Is@Y8{=6*i6Psa z^(?c*i2b+VS$+wVy-oJ4uEd;OieTG@H_K~|q$SseS2pwF}{o_$!>=UkS=KEinIQFeoUl=a%LEQNhc@S0PW&OR=C z9bJ~i4rKHvls#adVD)E~Jz@t5`t!?#Y?iFQu1v&67z2{B5;mJPFjQ8-<_HER%4*nL z*}y^>#^x~w)ykXM!K^{O@-}veV9>N&%;w7moy)t~p^P^k<-P2atT%q;ee5v78&3Hk zJ6!fAx?IYRU<@UckFZa%hBC`X*{20V`Q>u<8QD->`4l^nF)S&cVMnoshstN!(SqTL z@_BZQYcTBt-hS&UJ&s`H$?tWmwHILmv$j0lcL>wVQ zCaEgnjh z)G#I`)ia!0*5pw2ET>K|IZ-{&sh3SIRO2cLV@j=t#BE?r>D5rUje;rD8Y;I*HsxGH z<2EzCc+_ZepRm68)o5{B1YbBcE4Zz)FVQu0ZX4rkLX9D}o%J=d#)$h=@HM}N$?cGR zt*bHTiW$?A8f$JRYkH{0o+}YdPt-VZyJXV~H88iEF{4)N%I#sz=+(M$p9yA6YqxWs z%VwNwy|}%MZyvR~xi47X{A#_qF9qK?wLaWevTxC~0o*>u_k`Lb+}Et{nYDr3e!=(r zT7)|w`(9Ve;|?-@NNPj5Z&*KuY9qKqf*%vLk=$X~kA+&4D`m{8)t%?QWzFi<#c|&W zW=-qjx$kAO&UH!L5ynrCx*OaNte<{$Dcp~OpPagM?kCyL=(;TKC}S?6?g4j!3_LY|l=PXU4aF)f~=5aMDhcw{*ggVA{uCLs|s9Zp&m2G)ed48X3fKOm|>hrP!kd-F(;n7ocITWc{CxvL?Rr;Ct>8zOjmLh@uoBu`&X{?mZ+=uC=w<9Xgn zgreUV$6F<&m^H@p4CEA-#w4C0Q^~XO25&W@QZ26=XJ)tDwJ&z`B4 z*fhd(K-BIujq)6YY6VSl-a5HjebW@riK*VzG{akus1G;I@|=b0lTGtH7rFYMCJ+oW zY3j|S;0*{(znK!eQAjgurUq}4(_ETq!LH0jp3R!Un~_ES&04`*gp0V%D}uMm7sWKw zgWZ^m6Ppc#-I2w2nvH`07A`JmW(IGQFRpJk58lqy=xVkO-hpUTH=J*Q0cGU=b980E zpGPEz;Ee$anm7-Ji@{D1Gj)elu?Avo)WQ_Ks4E(y;3x8A45fz9ulj07}dPYG7$Mpa9$i5TW z2FZT+_+Yy>3Jytk8-W`nO&YFRk^l*XXy7J*L|{AdG}g5ir0XcbrE!EBVhVhX2%5pC zZ4Q`%5#{SSUK5Ez$VQ16&e|qFQN+}#U>>E>bUj-KbWc)MD9~PykuLddbNr6QGEqpClEDE5K=Fd~ zaN>+ig3>$JVkDH9fkFV_?uc!aDH}%+Xt5691k?cjT2exx(q-n|B*XjnVRfl~An5wC zEK905`_WJ~;>DIYlJ?1Wd#z>E254B7A}->_W2u z6zaPjTZF2Mua%-8pqB}{EKX8&RiI{+21BA&2>oZ1QJ>HG5mOATfJm@@FzAL90WNy( z23N4-V$Gev!jdFX)oj7#32C|lt^q(I)r!Pxs3J^!u;pL$lLD9r9{^6Kln_z4{PoF< z<;y@MU5!G7QB^PI7tMn}>p<68u*cR;xyRiEJ5mV`2z6+#(A)+{| z=n6m^rwgIT`}00AQ-rb`>C?;G_ryhylGYPTx?v*X-R?YgyIDKmm-N ziNkND3Vtfo9}ocAatc_te<-9)smHhVTAp$;+1l|UBs9|Gct_9IvUro2jv>o(p~=;b zHEbFLd^&JL9b%SPI9l)yI z$5cf;ZrLC<)e%p8t(qq$b?hQ83DD~GApxQn`$H=ckm%Z;+Sy+qRKW=Rb0J9ldbgO4 zS^|g)`NJkt3WF}^QK|yyB}`%^8}aJ;p;awQbp~uI(&ec?08{XC>B==kP0YoB0Cy~W z#cE8+oeI<4E6jB|DaAGE)*78;t7md+9r1R4Bh^N~bJz5c0(~s}#j3Hp&MF&$iTgo=+K0gsD*{f^fa91Y z9Rxx@JXc`SG291a>GfVjya|9*t%P_UDACQ#3AX`mG4mmO?q1)$!lgB!_=V7c+vzvm zmu_}O^2_oQ6F24mTRa+R7AyH>o`8$v;vHH zY7`G37ER!O@L(hmcb)?vz^=OG)b!AxQY1tIQZWc11DK4ei3v6yYN+u(lTKKHZYF{_ z!}i^T2gJOt4^H5SM8qHUalF$d;Qvf_6m)I0nj3U1?%G`ZYu>S=tJrFO(E52-snr7F zoYOToJvZo5-Zk>|^StRN$%$eDX1hyV&!0-S=<1|>_!4gy-a-ef0~AAvGp)b*Bzbf# zyk4Z%YkwQdYgdwLn4vXNABeC9#-~LozHH{`O1F0p>7Y9(siitQlKw)+5%sTJx{<3r-6uio;YzAw~gX4 zFO)W=;sfChylajI&k{lnK5x@`7H@6-W}C|MdTTS^?bY4U)|OFjjOPs{7CW}PJeP!8 zcWzgI{>)mpcKh|#q?tJR21?5}H(Q=o4haq3C_U2y`Ga!UbWmmW+3E@!a)g5lcqi|Y zhC^ZAUn$T>LhsGRNA{>RtVkkP;D&@{bVUsEEW8-7*zK}1RG+od{K@_=2wm$q!5%%x z)R;Z01mWRsCukSE4aN7(7-AZ91w-iFo}KCIDJ?(XHB$BF=ljkF_^1yOV}h5j)EWlg z;lFomp|luaYs~SvP648K6Pk&pCj)$TC2w%B0W=Q*Np#dT?;n1zJG%86e(^G(BlRMa zT)r(`sihBU7Q3?-<8^5RHQ>xCnx@hr7>anNjGpNRD2Rg~5&s4G$Jx4A<_~2B0AYQ* z4=hDvlJ;B&1VXM4-7Eb$M98AkK<7WPGz6wJEdzLgAdr9(4Cs)@vP&?y0VcH+U;-Ti z7}3iZ1rgsa<9;Gao`n+FM+A!i1S?8koP!C{HL<>q8x_DFD&7{A;V>noN?3Bl5C&)d z`yXa#4?+RSi$Dhx4d<;^KO+1~An;bxz`l)zn%-obC^tjK39zYKy9S+yO6!;fK*{@06J+#OHfzR8-nodz!~Z5s0VCJEFSazL(as~wNVpyk26~i|nr33=)YEWSNDWL|9&eq-xJq6j`9toG~-&|eu$bwrL9P8I-|>0Axc`oAzHX39`%vLBNbhRvh~;UYKcd!&;L~1P zx>^;{sQ*t$;Q*5Is$Ypo_GdRs47Z8agR%!m~}_1r?938c(pGy9MHy5 zN5EzRFo`8>1fCmIW;ID@&h|r_UaA2Su14TOYV2B7Z}Cn*#oIFwwd3B-6`;cw2Uv8_ zYoS9YIRQ1)QR?1BgkZI9+%AW})mrrTxPtO%1>`oc2s~l}DWM51WrKJ`9h84&@4X}f z#d+#+y=UPlIkJ}MiRobm!_Yx=F$}yRJs9d%n}=wai86pF*fIVC1ylhHdDIgR5L&({DIdd>kNVoC4USl7i$XL8-T*)&G!OoU4U>TR!0mq*VaB(>PYXzDeD3M; zP2Fq(^$i*B@nxPGxCpa+AoGD)@V5zt24?mj$RoQ+XpCO#RoLYE+ z`(|3sK}l~$f^~3rGo*@L7Ai_T6=5<^_XaoN7+28uCPxF{782qM+A6vd1{_d!u!=R| z@KONOBZka4r1g8n6b| zum$f$01iz7Xwq zhi)fR@N-u9MvsJ-N(FPnbv>f;X6hQNf#uj59D;jgeJP0oy9a2nJ&&D;r~wT>C;(as zig&2epo@Xc@t}=B!7jaZZo!|}axXQi_YB;j2tp}xV1TJ75sQF=lz`6_=yFq%HStw2 z{u~T}3G<59l9EX#iveteS+`;xH>`0se_1_&~)z;)+*V01rLCS5hSVhCFpU4 zy9Cs{Ta4L?{`dZc8#ew~&-Eq$N9#4n2nP~$6c>)Sbs0IB7eQ*U$`nybD1%p^d+R^w zPya3^imp5Mue9{ZG5)_zh`;ni|C4U;0x-b?%xJm0TW-E2wtC5fE7`~ zlA8wR>J-u>Sn7q_Azqa)68QuIIV@X^!A`WxP+N}d@Es0Y~5d?K$Cw2Y`%oJ>=RCg2q#o~BGKs*QI%MB}t z=f1xGtr*|-HDSZh$<-r&@V=#BPPDF2#Z1bHV_)(Y(P~=BXhPBvb-+alUJwsZuM#kX z3)b(Bb|P*cPy%)f*Yxqqr-Yr~HY_evL_ya5Lh#)LPoz*203QAGT@|h*Qk;kIJu2NN zEeM1_`v8URk9(GjbWIG18!-@|MFOEPUh-y%RW>vXhyYdPJQZ)Oet_J)Jf=l^?IR%w zOxMRQ-?UH%79j=zoQFzqUHc3Kp5bR%F#x>6?b{|b%WQy=mtq#=fX2Xw<_J;P@+8$1 z`o#vtDP_@clD&#KJ`j&PXlKz?z(t6H5h#S6H_0Mp7#DRFXi5>__ab6I_%dMe_1`Zb z>B=5_WK-BpG(+RX4w>F(3R_@heCS2j^O#o&4!|5Hq=09rZw`H3>-^6+@x869e3zNg z@b6#*ECFc>AOB0mY7{6CC3{f}K^sg1Ib@Op45k!(K(U^+GoFwVm*Hh>gx3>hJH#)3 zsq9#`zDNnEJ68A-%m=oC<4pXEoxJkbVs&${3apnZ^b)EpT>^kt>-G@i>B~BbxBUUE zVx+hT){^cegPs2>@feBi6|hpb{(7Lj7I>}fZY2W(&EP61g)IUI-XQL5bUdC-JP7=Z z@uWWsSOF*!`i!3TB07OWOha^B3p!F!ze9HyalFt35YLbLp}1ed5TEA>K+g&UVoI3p zUNG?%|Ac?RKaNgbSKHbrRxRr$ju3u>by)sq@-*0RLY?;4J8%f7w?Gthw4#+8n{%TE7^d=gi&GI{0;P-!*sQ_*D2P9b8P1^hA?}w16^ABnx z-D@V+h{(SdRM5X+!=dr$Q8>EgQsCEA%qY#0gcW+4zh|e!e6X7asL~HS@;8@ zojPqz6R1D+HW{Sg7)%vxv;a@Bl~UkJn8Q2%$uOL>SYl2|A^^;VXX!~u#!RyCXEcjB ziPR0p)92!ttG0H$3I>Z4qwFCLy-+v)xDg*$+<==Oku>PSFITQ{HwXrWIR zW5n*|+oZ?O2=Z9T{jKXBe!j7_qbv5K(h4KjwN2MEmYZ)aJaf^+JN#7x_HQf@Pi$Pg z)~_b*b9IR@qh?oY$GVg0>%AsPC_b+xE5AN-TwJ?$NeX|~kCiw%{p-hqN%G`~#k#(@ z2c7?%nG`E*hn|-yVAu8@xLUZluGZia>w5qj;z3JbI~*-SYXJ%M--ttEx)%;sP=Kd= z<@jO(2*#`8_?*Jj^1V|>t>{zgfm1$ba@q9;lZ^StCiTPpCN;BqO|K@+oPMh{y_&L` zSM^+Xsed2;b!Pn?8g9f!wdmkR#i6YKF+ltGbaZd5T(7Af^@;_oS7&LA@}Yj4$Rtu9 zK^IlYqML)WHh#5u#SDi%-5<26@P7U6XDomD9*&B~FXJ?b#*xn3AzMvA(E{w(I&?+* zCjeEV{ks@nR(`l!dl%RZ%)P=dKm+R(l2%h+ok`XLN;AHkMrHcLj@BdsZp5Eb8SmYq zh(}J@uonEaO{LI1@GhC^zek6;OOZ!$iL|O0ALy4vT23}@ zo3@;{a@k6r?yj*ZXk<+b!mPW*{OOizyE`~@VeRCQ*y%srQsZz(5`&Ar_KA|}>4C^~ z>XO*WuaWD!B*WA1ot*zjx~83+TnfYk(?28O`Yz%OvDR6?OK0Xyjf+dC!OYv5jsBe) zGvr!Wzh~LZ;;4=4JqKo}>(}4u`7ymLYSS>T9W1HcTHo_$+Tiy_eS93&jQZQ9r(j0w zw|iGl@{IcW?f#OEnNLpJ%$`-x7_RsDf0e;xy=TnxUo%Fvm{@1NKl6Jv6Der1pFM-5 zReu(h7j+`*2D)v#RE>$?$?38vfDCknYnXDb4}7$(%HtFdOnlc-qc#r!tVWmCH!zE< z?zgweN50T$r~IV~Kh$}=aH;YSvgDM@U}<%8XNA`AQoEK;>A!=+=yK8h@*%oiTr@}; z)I{5_g+w9^@5H>(UuLwh} z-q>0y(;@hccLae)hQYsfFY`|F-|QHBWfG<`@)~`e5tgisgezsL)Vv8UzYK>DyqOA* zPY<7bLxP7@p&3XYma?7J5&SMq>>#fgx@_kpiYOo?*!}wa@_O4+`vz5@HJDOP*3*rZ z>H=Nqt|V|Ld^GA$(ohTh_r3qAgN@kujwkg)&ak{Q;`vZd;pfhf=aBvEgbDxG5cXp= z0F+@Od`ORmKBdAfwEksp^6XEj-+d2W*iq;dpJ5I3duP;I0HZ%tqpuG8E>i&NH-^i= zTwe61j{Od&;xBd#&x9`th;d1MNYI^#xe7qVhzF`8y@r}6p;mZGFM#z2g zF5n|KktbF9@ljRv#)!e}I9nxMYHY7Eac(Uzk9f_Dz20hTUl?`C2-JkDOS~-xmZ3Hh zLd5s2_DFr!x?!~i8sPjG-)a9nPX%r9f>{L@>hUS^a|E{NSt=g3Va4+Jo=qt$|c-qZTx0>EDDlgWadG@X>!U(-Oyt2B&Of5bw zdULp^^9TL+?Gb0v&s+x(Y8Cy*aF#WljDQlTch+X&wLWfkE>uh44_rda*C(XCAFWWN zS;PWa#kvKZ*7qi146j5oNtfW1lsNrubk5|?c7Ll;HUA>m6$J|(Z41Cs~!PhyXkczuy!yHxc+Hm-A{98 zf;DjYNy4`fec0?!xI?Yt?O4NMs)@_U3(MX4>5INBIrT68Kd%MQ_SD@B|KNY>FAgQ{ z!=no0p?$96wz{DDTk0=4m4|irX?*9O^7VN6_QUC)Mp*Lnb{9CnIVD*+{n|RPhxbLn zIS`37``Ee232!P95VMKtQ?!L3;br$NQ%?D}a=b(1xJ8)WhJ_50+lq zkGao)J>ha6bO}=egt`&jATod;CHD&hENPl>R2-3y9{SCg7+WAf!quQ#b+l6w(EDgMXo# zQz}N}83F>vQHQfLAN5c&N~RM~PzU@mLXy7dxItp!XaE39BT<1VgyI?!`gA|{yrDVX zul39Y*RA9A;#O{n!&!Ks#8U^AwcyN21;_ZEna zw$~r`)sv_mzmoNGpKKoVRZ-9~j;rG3O@KtePF{jSe6?T=2!dZl{oow+EzyNznrYw< zg(8-XpG2)TfR)Nh7zKvpP$o37D!fN23($%7ijSZOQVwbbtE0M8Dvvr9NJBVxX8K;`V=CUe1A!#;kL?xT9#b+Pj>bc# zec&yelW|E7yi}(=4P5|WfTwBE4z!m>A!VqzA;06{H5z{T;P?jwYRs!cS8q_<$ zN+g{5!C5^+i53vxQ-VI&lTD3#wqdLnQnuv7WV#AX1%N3ag%07O^eS|bxtf;!U|`nK zdcfH?K4G)V_UeyH(kHUx{c&A-)}EKXo51{p-_d9rfEBAjBK-(_8dwgD@ZAX@|SNM-NzsOpO1L*qo zX?|Xb2Nb{RWSOY1h%Ksa3-C>{j9XSiJ*K!Eq-|&d&Qn$?TH>)6iuaE`Y*?N8H6Ug$ z|2Czpb0PeB*%Az>JJEQ~5n+0He7X-X^O?3x+x zGKP{Of=gFtZs@$cmfS{!zdQpwo$S&Mp%!FN@$TrCvIt+N>noJ$@i{75@BbkO!G)Ft zpzV3BwT1t_;mc42zs7M$w_sydtIkr?e?CH33J=i>lET{zG-$7$k*+$8Xm6SNZ!d@& z+41!mxLIR|tv0(}-p()X0Zyl~YAjHr#2ag;?LR;S`4QTlXK6$TwTRa`T? z&1CXca>so&M5Pa^bE1H#cpz1-h#?UJKr8+#E~4jsd~$!}E@2KbN0T@1{n%_tH3B}$ z0bmKL2&h2IOA#ZwQAR*0N`*IV7LvpU>iOj3rj9fKsm6u!?->~K213b6)*Llq%@?RH{H*Q;b$7^TGU)wcL zE9+ml)A;wnN1|O6W9E`8$~!JRXxw!-*Zki$<3Y_s%Dxv;H@dtPcV>k#^>+(-`%;*44O~F zV%+J5vKg(N1$||`o5~!%rLwzhUk;aC%O(GMUbb4+$QIk?4^?({et*F#uN`PP{nd6A zs8!8N<_?s98z?!$T|b%Gp!#;rkOm>?$JFUXb_bsL6}$@z?xFo6@uxFk6G>Y5jyzloo zyX^Wh7sF-cCuLP{iO88w%fU>J=jWFLj3x8md5{Jw9U9DA;x;I&*ZncexljI>$>&bp zy1}UV=Z7J9S!=Z`Y;w5ljYfq#^~346wN*nAiPOi1wh^*^z}$Ow-!so7{;N66Xz2X0 zoA<4@TgL^|x8_#Ye))kZFVqeVOsbN-AllTTS!(2|deWWFqz1cR>!vr%3b~rjD*B1c zCNk)ox;E?-Nv~TsJonlC7I)QgHme;G%R^ zkGHN)PyeL6b?a)CuScbEkxMpR9Qcp>F?od1VDj^Cg&lR>1J})-ZjG1qzZvR3ytj_2 zkN+l4>xb#DXMa`%*C>3{x!pCe1(;7eyuHVB+GL}j*40^l;p+4$@G(7*Db^R9Fj^+l_q*SFethl2B+;{*PDTAF;72zuwDgB$GKGn>1# zF2y(1n!GSFT;Y zRSlwT`SRoJ2q8M-!r5VWi8SXRt36|hX0(;VB3Ki9dmKV%zl_8MYr13&K1nn>euI_B zo>wDot6V>DooT0KqVe2RHeKolpd^hNPOlgY-pxA#c_`KEc@NC}izQgSL{uLY#yKpn%uk`~{(an{$ z{=@1kTGKV=3n5C(qT(^1lcuz!+2;z(g(^M)YP}PY;ItPc%`1&OymG&i zP=$AdOq>JL@T!?u8V5l7YH$vxa11efx{?{zzqMt=-lSKdz5QL}V zzmV~)6$1W-VjivlO_L5`*#?RK$ji<~pfugZ0f)mC0{gEK?}Cr;`{foiJf#}<>@^e( z(Gr#6dJo(i7eStfE^Z^PBVf#cMM+SW;v=%NwkvuF)s$+5TOO8eZq+1W6)I-L7(;x^#7dNV?2iz z_?B))$Pj&CrOMS)Um7wssnD7VdXmzXmcVm04ry7cbfqK>*Ofz0PoLYXnia5S2V|~E z9Xzpx4%`|feKzRci#eD7vjB=ld(Tr=zAC?E^Zr-NXi2>&;#NhgUEP@KF}N26de z>h@1n@x#XoGJRyjOWo;&XjEG)>QPWa!Z+9rCLv~h%jQ)S6+c9rZ%EY9746v5p!2^% zkcy-iK2IQF3a@CP4JWTLBYxpX=ZGq$o0z4lrtq#w3wvxZ`(i&UXxWY@NM6~R)me)l9SUVVJU67B8&9J7Y`S%uqH*f4 zjrCVUI(?5MO~2pp%2eSt!5hoYs#+6HT!IUQeC^mOIwY+=W=ua9|LQ60Q>oHf1F1je z_a0QdN++qI5@J+m-5z6+!@Cz-K#=8vb`n;v7*Nej2Oi8Pi-`jQpbsm0i){MzkVR!m zI(k_%AqNcr3fUs(fgYfPudB}dMbrXu3WjCe=F99#-mL?LHY)p(Z5x;CTmv}HZ1oS=G|%lcwO1JEY3zh2r`;8~H`>gX=*@_E84ly{3NbCr73C{c|+__W9Z!?i(Y$Eq0JRN z&%}qVM-Qu-rIj5wRK`>kj%{6kG=1k}-_qsRe|`Iyb$Yz{vEI5bxj)PX$8QcOUK}es znbzPX-1^c=_F`ayt=d$o*PK*Me)Vgj{hQInpiNib`g)RbEFM&R`{r~JUEiQL#5v+^ z$*jy6^tza^zD=(qsp$CYCi#i)DQwG4T|>#i!4!(tXZK(K<2Y{W&3t~XbeVPh=c8|~ zTr90M-1p49D|sNc{`2>j91Zlvz;pAUK;Ja&m$(x9WIe!Mm{%s-AQMVMS!aBk#{6LL zMbWlq;+pE?!$+GY{62L4j5u{)#vY1LW;d1JJxXpEL|&l%j9~~A&m}uwO*_Z^xg}JPVy%|JTU4i{|9wYD-^sfx_N%Rn)UWe} z>o$Il#_E2ZZHz5xnn6GF+U#V1 zeSQ5c?9wXx#XgUv;ac7Y8kE%idGXEfR^FV9um^5>U!}J$9dM?nPbVGI`gm3EJNchOTrVV$lc15L(Ue&jp8@-fRw+XDA zh_)X)gN?mqM*VI&btk)v(Ke<-KR0(C+^Zw5dR$<2Y}~-`tEP5bY4yMQq@GyA4e{SP z=a_MQRO+gHZmbbW`t20$Y!uz~&>icEzGV5jl|k=QqwcO>x{82Zu>X8@<(^;pQ8vvw z??UO90uxn!e4}+l!Of#7Gz-Tqu0CC*zlNetw*^W%{(HN2i=jd4qSetST(9c46kM|h5eCK|oTB-zoZGtpjo2A>7$}0B z(UGpV^yxhx$kUs?EnkdNHO=XF!c0s*X~!Ba%-;hW>hBJ({>MDo{YWi)adNb6TaLd` z@c55X!Q4L|w_iR4@`jIj+?@S(rs=|Ozsot5-uHqyw^F_ruYUTG04kfy{Raz@1Ah?L zjQ>7u)YM$>ZxK9Yr)o6+m&T$PzYWLVg{h@#?TMKGM4}$_^$twIZK@C{-ALoMsLl#J6{SO zk-d-}CC!7O5|`LjGl}F!UShl6Q$E^hyfeQ|@Y^mUK;AB~Zk3_}W^T ztKoZUvG?tN;SQvDXhF#hjX_nsh;2lBTxy?1-w@{$9~hCmNa8>87-yR%^f2PF_TMjr z3e8%)A1MG0sb}&UK1m3z!HESPc^O!mg|BI*LXjZongZsMrPfVJ0VN2ma1-cW)j^#w zas{bPb3DGs!fg=BsyIgsq%44aC{;x(0AS`>Hy=Y)=`~jpasf(a#&X? zCwM6}Kq=5IKtew$HjjCS?b8BOs2S=3p3>3;R78-2-R@e1p9A{z2ShgI@h`kmmcSu%@wG5c^nB-*`R=-+QPnLOJu|8OBBroCS7KWFwQ8HhnPzCy+wN6q+Z+!TtK zluh8DZO4!RM|1rYnwXMJ;-7PG5C-fwH^ZqnYPKRjw!J|faN67@g)XLLQ~2lI8<_`F z%{^0$#G2X4{0r@k$iXUe{}gkvRyLJ?(Y;A{u-}}UVlQ5it;WC9-XuRbXC9LRi|N@k zew=$V^N_YhVv3vCFncloa(gp!$kF0XikH|ZTa$mq{fY3Z!t4_DgSEw6ZxUj z7WF9sV)JY*e!P1N^Khy~S4yDRI$N86t-S>~TxBtw!V}wPuiz)Rw+avUTTG@zh@GjcLF}E>sK(;wQ#a+xirfrpYyG?u~+me5~U5p%a zw7PSvZ6XS#O@kM~oAVwL0UoxA5<`_s9cJTf3yvJCm~A z_z&ElF;Apgd!`z7-pKx&|FHcTa-z!GKh?Z5C3`zR+x@xlM87pR)xI-5+k>Ce{#<@y z&N?O)?##;e;y-flWd>>6B&ND`KFHq5f85@S1UcH=N%iV{l)amu>;6I*wBM#6)w@%e zy@xMoe<2S#ZBw5b&?(CH<_q0lGFhoMU8#YcCE5G=dF?L|R+Y_gDzCF5+lQa;{z}N| zx0y_h=&Z^1;}^8QlC$P){-mOvSatwkPxeo~0{kGh+iq64o4!^v8K+c}CjY-2grP(}wh5I0rqivU%*48Px~km>gcGSktA`;dBA_> zJ|+y^?`W2hBH5mk&41oLCJ#OB=#r5o@ydCGd&kF_CsQ3gGagBH=j8HVw2vbvs~r6^ zL=x{DA^)YjOn9>2k(*H=@yW^OziOAsPtG~UWMGnj91*|IUCs>CUYD5BCOMK*#DCo` zN5UM}-O1>d1m=|R``tea!}hN$$mo+GIc5BT_RsRL)9dOpq!M0E1%J?ef*GE=t}A0y z5}H%Rf73pJgjcN_&X|%!NqP9(x<4793(dj!Quirl zgtn7x#>1=D&0QB8=GYWR|Jb6`zAk4eej#5vQG8GU;7O zIc@wA_pi)TsZO4mMqM{@p7KAme??AJIr(RrcctWr`5)bZOt>p6r<*_OKEph%y*@G1t?NO~GyYin4076W{hds&u17h&|3}fe$20wZaeOWn z<(4G3B2tRYCAsI8>oSDgZ@Hz|h)rx_F5f81U2?zM#^$!owWx%~7=|&oO1W-ylTd#9 z{k=UtkI(k`yw5rBbDpo)J96FnR|C@hdSj{UXhYpp|zn@HsKo>Je@raDICruB{r zs_^<~Y49kqZZ?wjVJ8&Td3~`oe6+o8E|P8iy8$)JX`e@rcGoRLZhiQ@iQ2nwZS= zS^sT_b2n-%V~lRr?L_W>_`4a0H0mi^8r`njjXbdarxIUiG+MSg`m=5?^6!U#q4AwY zi)GuRyLAVV|Ev!i;%AMv%63N&>i$I@e&7`Ndq#(402%T#Y7y5r7{B^WYO^jl;@yXfhZf_%R9(D`C$#zTB85hY^AEfq8+6 zQYIPYR-V+ub{5rL-a znaNg)jHP1C;PT*;_*8c@)k=x6bc_XDfpU_SiZnB-lpD*$SivuVMS)KW&Fm_b#&R)W zxFSUq`lQp$r&4XK0AmBc2-U@X7QEAW91loxDr?l_*BX~ zqta@u8sh-JOc8@V)iW=vv>(G@oZwf$r}0nS%^NFS#~LusaAnGA)>EW;Po?iz6UG&; z0u~3R6`GG$29FUj?r;V`m|(ajSPJ;8(88_?Ge*bUhhL*eL7#P6_*6BGF)*QUEwD8H*{nraRr}Z+ z1_sxrNVA^pS;SZMjxAxr;W}U$;BzUyu~knro2bI^=V%f+hgv0Y3o z+z>2_&zQB`s@fepz{J6gD6*`KJn@Eer#tW2bpQMKH-2sRaN29^hA6Ot=;J0x(<3I-}ZZ z`~o%`ZcVuW&DOIntF|9k!sf!kU`2ekyLDr=>$nOwAAXaf$jU}q_f-3it6>Y^HsFiE zoI>l->fmurY#|&%xd_eav|g+ZAJ@Sa!)?Kr@Hw;ATh-Cy2G~-#9pw@$XV3bu8a-}| zEr;8Km4LZYVBwn7aWiZs{1!zCnyUwvt;rm>!dAl_z?bp4?qJoLf^i#cE!>fEnU#wK z8`YGL+hZ|sC-4$0IUIgS!iQdt2B{|rN9Fz8qk-W zHa@j#69w2|co6t1{^hJqSgp=PF?IxgmvWW$a?d8d)_9^EOM?f4HGzdvkc?WZiE8XP z{2oOUTBrvptF@oNVCnGt;A{9ocSvKc>qG-~3LZka#wtWYdTMwa7PP1nvRE5F(T<&i!@%13qFKmRZS+Jpb^#tn(PkCxK@Mxt6TR3acsN)G zSS)2LT$ei0hy4V9K+%B~>)FcIWljuYm*Ej$U3{^-t!iDt#4z?NJd&czDn{BG)s;`s zu&Z!5SPxiIXlqx8nV@6W;RuQzw4~G4r><#&f!%~hf%Wkvv$kP%?GtlYHvAz)pH;GF z8(-Huv4q`*M}rN3rBZeob%PVj*zfQdiUG7#&#tVFHnEER2}gpj<4fJ`8tWJno7f#V zigKM*inQygTbkI$?!sfihQP8yyV1JUiJ#a#_#=uTw5-!^v2J@}7kdDY0~_JXX6?4> zb|((7|KRZyBUag--C-So4!{8rXs|J`T*_V;!$;@EaU&8a#?W#-ds&PKoe#&0NCcbU z%iZl&F%onE+)+dl#e`Lkv^T=Y(M524h-9!Su%gi34x>aD!yQNbM=^y~blUr1)aVj8 z0mNhQ4SdC{eHccEE`t+7q)=|KD)#K-F~)Q`oCqQnYzC~9x|M;kqF=y?BA!sppp|;J z$}skHC7c-IDcBre>3*vb<4RY-i6hb|=B!HOtsaaoT@5FJNC#U0s|s(8VuI$f8(5tMwdYv6*x$+yz87*cxB$?x2b-pxfXsB629!tZJl#5w@Iek5fYAg2BL= zLI*o6hVF#Bg2IR({T~IO^?PIAWFe@__|rgE$l8m7H5bkqu8

ASlPXSPG971u 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..f8d01534da4b90aba4495a33d6e1d62c38ec5090 GIT binary patch literal 94841 zcmWh!d3+4#|9_rm&b=r1=AIlPh?qn~5)rcmL9mWiX!JYoTNgo!@@x_Wq3e#LItWsf zrJ*UR6Ba?*u2w6Kwj)B*x>lPKivH&J|GxIQKA+F~^L~Hc6a9$`AbmuhTdpf*13DJg zyLX>o$;A!anRjf@g*Dc$)9=(D+k5F_zR&820mrK@Z%iC%6RzwW@WuXb zcVx`_^Umcj4t)QqSgMa4SW|s%Z{Eg^W3SYF_TvHj-hrPCJaO=+Lj_+<|K-YwLpP2} z=T}D#I(hi!7gK*cIQHtv&u@R}xOe4~L0=yE<#h4ifBtgy%cH-2g9$@aey#iN`SO5H z?>E#QyLZVIH)vP>SI6&Pt?WAE*M_gY`2Bmi&zh*gr)vKAv3kUz_rE=L;^7VVgsZ#8 zjsWDWMdMSv0e1(N^&Z)L_grp2d+1P|{Z6O5?QVAg6|PKO%^&@GF(=z59prei_ft54 zC1ZT}lhnBnsy@6onMY1lm%}CI@OmeCr)=7YeiCX!F;ahHw;FIM`~$b`w_+3|Fp=ZD z*P?AtsleaFXX`^;D}YgCqNda`k}ZfW`t+l>k(Fx5l_iuwdghtBCUBkA%QIZlaxsY|`(Rs6b@Z~gq1!-2%eHZS%!0!8v;6}dv4HhHqa%_| zu@l5p8rZrtHtzo3(z(7){uugsW7p3-_hRzSc|T8!iA8tSPa`L88h0tAsD9YRGGee4 zzhWU$Vqj6TbJFJErYZfxW{Ov0Rw7@hT1Bs2{oAe?8~$j&bM6n*rif`7tD+NhiXW`*$-{2VUKdNhX(H z-VLWUJfp%tC~JIrre@ONXBQ(DK6-YEUzzk*ef-v$e_c*IaQLq)Nnbwt>#A@m>F}b$)TD=*FxUzZC!e`HNqdym|jH4|Xnm^740iW%8?*s;#qM z{ZW13$g4jOfBEFqL-(cRe;?J{nEmhL+TV}-`{c}vC;vWGm@cnY&09Zs`?BT0(YLQ2efjk5zrIUd z{(Ieeqpg}3qIvrE>!F`PRTnTcFVUSqhYssVg322SH6{^ zaSyjL&l4N=tUND&kN?(sPeRtSRrZQKfd}#~bR6?+bwR_P;4kYhBrkflMw%$ka_kNN zwSb`dXIwB<^W-pg0yEm%yXz5eMTUgK+FN`3r*rxkt^^cUd&0|(v4)I^IpZeYwa)uu z2P=tDH-+B46igIy64kwNW!8{q?2xunYY$wOw#a76yAvDq6{n!0I%8Z!>iX4ZOmQFX zHINOG<(ijBNw*uIV~^=uZ(WDjab}@>eDsdCvLMx|&&P4>`r5M0Kc5XOIOteEsRD#- zdA6LXhy{7&sN3;j*dmV)iL74UVN;By=ixo3J=OhlYQ=Tdsd0v(pntc|SM{EmJ{-QE z*T;BJUOVc{IIz=K)xt3Va(OVyO$e`b7STORqY4rxyr=8Twxvnh71Lesn^$W3Llmc(thNy(lMs| zh{g4`xN|9SVflP$I(yy-a4dWuTNC~dMJgOcS)YrN^?p>SNLytN}+wg>Ut_0(Y2*C1@?uO!XfZWAQ2<+#z3v#1m2Wfp7vm1&#gEy;6Z~_9r`v3K zg$on+GLi!re^p?Q*W-gPa=9I<{Af!{Q}|B>E20FOImQ?pxwl;8>g(8$kFWFk%9M$- zBDjc$1@**B|0BdXYHR>`pthi7z0GiIZ6f##O#?Ycz3AsL<3b|#u#6FnV=Roh{;eaGlc%uSp0EsYg}+a;<@yW!rE@dCDg~> ze&K3emla9HcOv6w^Eok0za=;-%#Jh5=Ma;cOHG#gzJAx8$PsAMJy%PFgxzLct21K! z)Rl+E6>@a_sf!yzh?F#VjypjG}H{dvS>-*TR;<_ZT8^e9fkg0bg4tMU8bZgFX zv4JJZykff&xolSVbF5zM(;2LA%)OerV**!38rQEvwiK7?0?$WEDyrNefVzQQ;1OE7YVzZ>nOjLqLxGwg{vC~qm4G0>WD z#6@(GbiGy6Sk?TFTR)hGGdTSR?8<=L!W9Y#5K$j5GRyS0yw1ZLR@+T;71G4B8|_pB zM|<7ov)pioXFr!no6CugIRjK@%9JHX7P1K~YidH6PS!Dz!@Bfdm^|KL+N&~$mmALr z`h_4FswiKDaf+`0W^_?SpQ)(SK7W%n!xN;d2ZkN854u$xj&PVT3b)p+Sks(H1Y zX!aT1vT?DXf30l$!%JZC7c5I|=w?XlQo(XUvcx;s zG_Oe+y^F~$EEcI}BI(5X3=FQgs6-!pteSq4b#vXi9IxR|g^iN+tfbrQFc+x0kHpQz zt7O02!eh$jj~#|AFGVOuKgqJvyXg@RRfYLTF&}hO7hJ?NpM|rV-f_?`6ccl051Ctd z+f9EV!^_=_;~nJpK!;`1W=t$oh%bC>M>ncg*mS}0jaPR-)KHE1{@9)&e~O-cx*dw) zv>iprrX6A)F$MRminb&Xi5%auNbHYT=W=n>|jgOGx@VqVWeG9VqE`yI>Nqv`W-XUU$=t?gHI;yD44#Z1byLo(s$fyQxG4oY(xD zo4%py`q|M50bRr9N*}e|VU*nH8!xC4Xe64>dW|pep|5WB^0drymgy>6C(suKda8pO zB3eFlnA`hUQ6R_qD4VK#EV2dkfp$COPcMg`;LIM*B+2?Nc1xRNeksy9cHLw*{hdHI z0d|LM^5;NTkv2KVKODNN;^^jWHEeESnTu*vbjO60zFt!ZZ+IjhXb}v#bn$Dx zdA4`iM=t$UnKYbcZ9dB$+4#r{(t-IoM#m*~2PV7u=;Z=+Mj;OZh?R;LSL=SAep+^; z>m0LBpaycfBX&>&s1*)U70pj2V0EGOuIK@F%ZDO!TctD-Ai3*u9_4u2QG+G)i-PXB zEGvCv5rDLv{>DMPi|N_C>4}f&z)^Lo@qIgZDp6Z_(;9GbTtkkdlW8P?lQ{h+9FZ%* z-(B!SU^pQ#3pxE9-elrTUx}6)S%1! zap_jek$YT3HU?FIz9ujhhw1X+h6jBLAN!0eCBqlkV&K^#m;Qukc*s%z6JP;PUAOD{ za{5)+a7?iD=jfrTi5A}N+3?--K84*yL@VeyCW`H*<9K)~HVov5Ih?7pk40&$ef1sJGiPow9fFNVT)Hro=<73Ez4V_;jPHr`RSDH%{YE#rOR@Chh~Gs> z*!8o(k13HkjzOjh$zm4Rdes6X;|LMh~UjYXa>3NZcD!cv*RmZu^_j!G6N7heePP&K?4(#``SH&Cif9dJzMp1$x z#Bphc3flpbguxdM-2s>Gs$|NNiM}q&WW~H681LBiOI3QaQfe7{)7Pg^QcQ~-`ZaFm zCl@gW8xDw;T|5|w4WW`g6Oi225Pm8wwN z+)T2ajSx^*z_d6_-#mo-Bzl$1wCDAGeY$@+<6Lan^vf?d`xI6xqGMqDb z<554rHgQa=0`pYz9mTNIYyQJ)Vg&Pjk@_I(H2Agd$%1%Xk*+X7SwOiNU zVX6W|u?*`R>?((8G1fov>a40c3mDsfcsuTFj%TxOi)?!AMF)7xk207A3}1UeAD4;n zGCz6ATRh7;Op4u*s8X{f9pfT0R&jSeYR;Q|dX>-EIoMLqvo&sJj+;$$lUG#3PCztx zDXUegzADbh|~QDKm1sB)W zWb`7=hn`C&{SPh2-p}#8W0`L!qh)p;Hb3-%TXw@(2kK%6%XrH+mt~izD|4`q9j0$n z^uVQG=PtYc{^QhHr#XrF??cmBH?zr&zT%0m-MSRFWuZiOa95Uw!wo)Wn%z|4)BotA z8^FW1x7nV5Sk=YIcHMTbK3djoljx6Rs+$iaf_g$W8@=TFF6tCdPIT!$77X!Ti}llI z-}WgS<1=&=%{i)JgPloo>)%t*G7&mBU6zk25zHPxw1d-K6$}qV@R=Pb?!U9Y$@X;9 zKT+8WfMOKmOx`$NVt?aI?|X@Oj_rcUp#ZMLma#IMt-y6YeLJ5ivwhS5e*5m^)zzaU z!yUKz49607Q=$T<3wp0=J^}O{e3otMh%2&w5N6)xK(M~}MNZq6S*K69V4Gx^=R)6b zhPME2l8Hwy%NB(?&r^AB@S{NgBS5oY0S;4~-SSqrxp(NR+kFbZ7K|;NxlI8#e6R-V zYwf0yoME8AXYZMs{kJvAR&yPOLzUZS8-8V10~>mtzcogno1Y_Hlg`E5}m1u z)J}uyH(?ECt(3CBayXsRHKqpKU#rhql63by1DP6KqLxet?-O$Q2WRDwZ;0 z0dJb?jJBe0WJ{vcjy1{|oI(Ad2Ipczo;y)B9*%n4g`5dfuwJc8tp{0JbK+bI$m}|* zocp1od-z@ z$uWoIpj=oe=_DuXrgn?utnLmrr~GP)i|nWRXLRZ*k&A3{D7_9u-yxPtYz^q12VSdz z)!RoabRrDTKu#PKvEze0ZtP3F z{8Q(veAf-N!5f)5;}8jSY6;?uV??fnvVm}qGe|JHv0fy`h`~Ec(_Jiyxi;#g zh$a&K6n&!@F|lIpv*N;iqkQaC8`p+RqG34hA)D`DGvCCG|w1(?B~f zJKh#h0H&v;e`jtwr)#XE>}Y~$Z7rSPA~uQb-SC_ky#x%EjBePag-#GbYt{t2@n=}D zo(#kfjk$l6_bgwN##8S|x}8L_7pip>U@ps=`q15L5|orgcu|VB;$T3VK_`2se9@GT z6UBF=xQ`;DJnh&9oTchqz}iMWP{Kv$Tn7;3v0yX6dLb}?a7OnG>gNCtzza>}9v+$l-%SrWwTa;gaUlc+F92B zP?shw9s9$eR7=xe^bau2j>3QgoN>qRtm+l}A!K9Tk7L{7Djuib9scmWqhS74| zfPH`R$$tTJAXwnA{EArzb6<>TE)7!%0d}vRbV}ib(pb0gxGlm?zK26M;cg0;SvNIw z^Tpxmx02%>WR5Ml9`3_*8<;PW^?-51P#N7JM!Vo0FC05k(XVB$#SwC@3*A1`#G~9PQOEJm;EZS1c(PfXoPMl#No6l%sN}-#u=oAVx0frLsL@#p%_He_GBv4e^s}c#YtC!lL`cHL+E5sw)otmAWmeyiC z)Vr(1*3n9C(KrqyIaX1E%2B06A1-MxGbPS$9QlcC&PHaD{YL+)}l2@%XEr-I+Oc)HO9C z9)tj5J4`O7&Wk~ZHMPdLfzS!mQ6=g%(OzIw7%vbj)$12vo?vL3@?S%Q=R#;JvF!!A z2xAk;atUyy5hv&}V3vvAAbJ1_R;lY^lpA^Y;6ltuXzK9$ujSLFwKdLhcHoSTNK_>DDOIE*5{kKD!5GlSi*lSz_QuDxH zVq~Cmia?YM>QN0_%y${XB;T{yHn4@r4nd*ciIaK5@rUQd3cYN!n*xPBe(%*xqna(A^+*U{W z=)F>C5uE3?lwqTtMj-kO%2Q3A!MzLSb>7_hRx$vVxger^+$t$Nq9n?ze}XgI^exe3 zC#K3M3WhdPGEX{StQu#li)=)XV?OEk)7ELHXWO`9=D7&(luBNh1$uC3FbJzD9qG`o zutnuD*Lb4`ggF?xF1wuAqMY|Yn>6tEKb!dEp*ZAlNeZVcs}p3hyJTnqA*!BLy36pn zV$c*NN&iIQywvY%ptY0|4S{v6Z};EVj?=?#&!?Vm%LciJ6m#D0UV?GDGr+~fxcj}r zNs6J)7V4mFfU3mfyk;AN$!<^vCp*Yjim4vkITHu(bjZ^9 zoD2p#%mZO!B|+f;WBgaA{x|Qy<5=dTY$lyLpJjGkra<0QQ9)_CUGKrVVy5Wn*wMsH zA2S;Y`RbobW^+@lF+$8?$?iB>fJ3pq)fV5vg!5zu>gO;H2c~M&6^BnP zb;wk2XBS@UVgq>C`|gAbhad3C2YIrpB;lp$xvhOQwHSxz;Tc*1Q9>O^qcp_?n50&FOV4`^Ac%JKjw0Bb!et9qOsID)-tMqYfBf7u-l+$ChT4-~$=hP{~B` z7OSvCX0n`#)g<-%sr|PaZH3Rpj9PF|3YGB~u-k}@5;~^@M0Y#807e(g zAIf|0q6A52|NQj*aL3gMvg8A=J_*JY@BBtZ70BW=_a4yEOSA()0^sZlymp1rY!F*M>8YZ{Eu9y}}=E>%zVrC_51R;+IRttX|-iE$*4pr~&nBSovX`wTmL*LMHJ znfayLKEuIoLo&8vFh})oBbG_Vw@SN4`Y$;u-`&+gE`lbOhHCH<=UhqaAUO%ucK>(! zZ;!8jbo%IvH)qxEuUG%}Y|zrHM_=~*rltFvgTMWAb?NP+|9Lw4UUN9zB^QP+vZwN|dO zs%%xt`sn9Gm74X;CUWHy*7J+X_D$t1vAr{XO20c{BxQKT-MjowqR}a4Uh-7d`q#$} zu3TM~5;xtmw%)JDIkHzpqK#SLHeR#>Fd%W&TtDtn$Tt4mh$iAaT~Z8FLvHo?OXv2x zbX}bZ1(an$fIHUSusR?~Xf4~`c5YehyX@*v+f=BGML-9JCF=X#P271fr9=tcGhEUS zj#>VO(vv}Z_6*;&`rT{oCp&D8I-nSLtWICQ;(}XrbOeen02JDoYD+}A|5;RU29C2O zRV-hf7kqWk=xygv4@^FMxgtmoNF zZ5h!I?|szp@xRA&f2Z*YYl@3XX?%Zwe=yefZvr{jIk z)>|{HfZkO*@W{SbD{t*>TYQ z&+<1PI{wbtD+QUIX59b0Ve{$ZquySTGLzQaKbF7c>haMzSEpunK6HPpn;EM_b0Aj@ zo(RXwzzsqQh$=kcbE2=q*s64K&|@VQpqYxE10g)5L^C#=I=$ubIa^2KvP!t{lq-h% zx*!*Hs$uyh{CZs_&T65SH3t-xkaid)f)@G=V2vfWZ&!Ya=In-_tGg?mlEQq4qXha7 zh1&_O3K(A(=7M1|$i|dFW!PXny+;mQ0`}?O89a2xE~DpyNrIUwv$WIFGU_*pD1e<* z<_hkaN2bVOEx5PK;xC4=L^q!BmL{uUB7QTj;rr3a+}2<>ndS^FCPLM9U}Z-h8J$QX zuPH<>3UV1_#n?hD1(ZN66ilMC#+RJm`zH<8QN58Rz{@W9XcTN)>m3&W>%JWL(T3p(fz4(s2&*0J!yAslpU&z5c5EH3hv8j)8yg*QzHoiHeu z1M6>A@Vd#nqw@d8>-`q4V#}llbJjAmB_%s%WVQPpPE$f(Scd z_mU0}okukB0oP%!gQ(r6FDFx!z?RZDiEZB7d+K*vZV6n7zndbR9b3R>iq7GjiHBAy zp|$9i63mspE5kbq@-d8}w~rPax(0FDFK%S({mpi3-G;QHb$7isI^j*F6TS%cHLrflcJk}K_R}w7WR|% z3VFw=a~O_*9xlWwrq?A#45r#r8>u!qA~C;h=b>NFoH^uiKzqS-pXsdF9gvs!aO2TM z4$D~$l&H&cxSM#FC(CT1EU{JO9HpWw@<1!Sy4$F*2Q~3~3ywg1w8M?B>0Cp2(cp@V zb9veQpzUThoP2MlytZbW-%k&2P24f-$603w*M4^GWG6PQG@l>P)yZ0+lc#rX;KRg zD@0lDL7$3UYQZlm$KiPbIS>RCP}7tt;pEnUnyzW=_?{7Ay;n|4mQR^dzW2K(GPGah z-qIp^#Si1MhO`G_v$^Dda~U}7{u#hIbNdKlwk#z}#JrR^l+I+4tvs-%E| zQj6E(t;+z^PBEkn{WbRNUNq+}Xwlj(9Ejt(iCr*iueJ{(#`{bwu)mLL5~-TfeW`|v zb&1khv%+wtXb6|Zp^r0BN>1lseWwFIX31z$5uN&h@pyY@zbW))|F-MN@5mq2C}nv_o9fyI`kZ+J=7D>%+#y0eNlh`tGRz z^1`wYN*9Zk=DI9_7$t>FCDQ+Yh|f9DOF8UL$r7LCU3@>Cehc=`EYUQ83w7Pa2bXtt z;6ggO*mN5bmvon`Gx1<>qq?q#53QFXJtZRra<&rUVjvC*M1c;r$u=>2%+0K08BwztR>!#O<7U7#g{3PS4Ud?|8fNsMYR;&3~9%yaQ$i(D_GG;M<{lC;6b2X0eU9a52-Kh|kMl~_2}rptgX zOuL9;uj#O}sV{K}b0dMtOI1RPOr>Ea10}m(o>5Y3$=^Xh#nTaIZ(Trh{s0m{6H%z5 z|8<0pLsi(ivoT81|AjSz+gSp4z&wfWSC=7?WhzrvI>NW3a`8OI;AzLW!353xp=7z? zG(Z`93LHFB7gCINsKHtdg!9Cs zlHu;zx)Wg;)O00W$;_0jmbxCb%q|g?L%YjZ)B5>3UzxMkM@+`dqB?yeu^F(uGsR2y zb_Q31pFm(f(FdDJ8*L{COQCk>1PP9;CvnvKwr+OR z$TN4q0Ex(}BLy;q|JYZO2~6)hK{1-fYyY1q*5B^D`FDe7-;ZaY#tNrG+C_)U(N!?p zMM_E#N0ec*736Z%9nox{FR4}|=q#Im#XlatzVK~lZfj?|Nv~u%8av3A43z6Izp@GS z)K=bTbdKZo!*L7;3VAjk4)S$4g!KhPy>w;DqECeb8FlBU5r-wZNUIc<#5!XOS*b-L zoTD&CNLP{zL@w7Dcbk}Q%Pyu&+_|T(4vB>i;5remP{MPGAtH6gM%Kd9BCDdFGIaaV z&5%;7_?6Gupaew_9lm|mIFGCWI%`R>oop421@tv3=uy!O!KhdCJbmK0 zwH0(%>DO9ZqpiDsTlvw;nWr%ZKJX0)KkQ7Bb^bV{mi!chdgmOO9k1v(IvIbzh4}x5 zNeNczEJ@#15<@;`mW|+(U#QUnF#w|^94?_c$&`3&)^(H%EF9uN*dsj1L5a?kMvXD) zLFq_9hRyz?`Q5NXQVj}f06{L30=u`6fAYbiGvBLA zfUd%CFGas>zr1z4(S?&`6bHDSnxJp=iiW8aCo&#Q^wYaje1KrRdfy39PWkF@$|E8M7UfXyXpltdTIMIH=!qGqAPFTl-B_f3>BMKJv3Rp7q4>4UuiD(J1*e&Hm4Q0|Lj&L;;)RLO%G7(%#3;L`{m`YjAbHBz6S4ekDn8 z&U!K%?GwA&Srzmb6ICJ*9Mf(|-wc)jJuq!Tc{s_zJVMto&69257DyJzDs54E~jW#QUL6B;M zPkJbWSKHD&U<9ND`eJ0)7Xym2R z5)Ej~Yy#h`6cpnl;mk!#Yhaq={|#u;z4JJ;nC0^rFUxsxRBAJ z&S4hNJS9lhRlx~3TQb?<&q_y!&WKVKgM)kx{c(GsuLi$rcTKpo2x;#&sjy)8`&Mnc z?Ld+P6@mYWqvz^)G)1)f^gQf>W8}~C!9yk5#}uJ+VyuEjf*9Oc0r9X<4EBaDS`qEc zm}tsJzXDDLn#Bni6>V(ty-3-i74`zX1j}pUAxN{6dFVDUNajtb5~RvNAWr1H&qn;J zJ&qqHHxZe9oSjjK$H3~-(B%|Hu9p=c1#8b(4L{H#R)`oy=VcSYIVDNed$nUy5)_Hqzzh~@=p?2CkTLsLu3sYmcFD=B+7nNN z0ho2Yi3It$lL(6lLFw!=RiJtt0ay`z0y=w5GSP;+@~{9!Xy>)mSYcCnV!)D_pJ2jH zmciL#oUE@UniVZ?HPf~dt58OGT!~Q0spyQ7VP}>EIRSJTBH$5aZu{7%Yn;uH~96KQJ)R55!?hBD!^PcWu%U?KO?!^R=*- zsN;Km4cuauoAeUjiVRPXAQ;C;`griAsCjxY@vrgAaqw39m8Mhmw{9lyQ<5FDjPkXL zX;DFEMbnpZiJRie^YAtJNZI%gYei2%97p(wCt@$Gv%=k%KByLkkQ>%?mQf%YrOiO7 zJ7ATl;j;sc0A>y;aI(V5Ad!ErFxYqo7+s7?Rf6ZBs4DqLMSD1B*v)<5-R~Hc$Yf(UC!xBZWu&q!J(&g0DwH%x?j;Kc-V0P;y5Q+uBmZL5p z&ShwTad_5dwgD^!7N4FYMk_kZR)D)os=(xf)5@*-^epmFlim%A;3?2uWCeIejKP}G zpcxOF`$aWeFNO-V8!b@+JQfGoC~6VnM(gg~tLN&AogyLVeLerUnkee?;g8?<(p)@f zJ>K}hI2B9)zA7Z3A3%s>hfEy5@Iy=1YI30|!A`a;?g=*MXVNzaTd0L%wrJS|{uVb{sfa0)#VAoTTwBFBUPC-t z(UL?#qX%(H=n>Zk6Z?sUm8eS0^qHFB2&J7uRuKsmIt3=d6!D+QmNxW193YX3hJV4T zhPFFFJ08tMLzuXmdGBj!k&Sh==sf7)Hp;|UrKhUl=1$NaQz}}GNnceA`1VF;4DIN9 z5a?!ig3tVXcL$!`5Tu2h@sZZ>eHNqh5ObAO3>A3vJLs~UA#RD85-}B=#Efd0h%N#n zXMX+OK#<{`+pfYJKg5@J5Ij`~!Q{~rG*B@B;wok&O>xOpdb-#=RE~2nSu~r%=>l+} zXeAn(cNYISA$ve!JZe!mPW$EmFl8_BBl?MN&a)#Ck9%NUE-2O{X~UV)#|q2q5>XGJ zl)JkNC7O$3Lq4@?0 z;c0^>=70F=X7W{q9H}n=J;ZLDVJec9csElpY!VK0S&W);#j2zSKGC2@=YgMz9o&SQ z_*?Yte~`C%#6GtD!VYkclFEZkFdf8VXyU~mYO2jV0MGB1k zrEtKg)HSgY(Jt0S%)udor5>&TX%2l2G~sZcZV4Eme13qgf)zMZw3NYf8tG%2!Bnvw z0979g_b1-uxR7^ndyzN;fnJtHrz_5S4`lk-X7mI^NkkQZtmk_OR91fPXwjvlCBtsD~e?*E5t`n^|&dtn3JAUHb#7^|SlH?W&(6}unR3Mc}Ru<4$x}AfEN3!pYt(-yo?fdAlVo~T8CC?Q(2uyaWB;Q$SfXeHBOJdAFF zx_)#4A>kN1;UMzF6kb0Sy$3q;rh2qYF}lnWyo9w;JHJ4j;tkc3Bw6DfL>ruj!(FB{ zbXjC%OC@T;QSw2jRz`26nXRx@48~d;b6*VMbk$nVSKZuCzsn#$K1Yf~I0(^1V9&65s(#NC3rS)b*2V#WT6$4l z#tYJv02w|)_Z8sQSlvs21Pw_h;T~>XE^GjcG^ba`eT^;KmYyRY$94B<3;lw7DzF&+ zgM-~>0p3$UE5jyS2b#Z&M4G__P=O#vBso|~w8u{WV*M`9@=(rP0e=IuOxk0>#UP)B zhxx!GYE8` z@@m)92-^9WBw{;eeJ~Ks6O+6~H(Y^7v>Tl)XV*E7lO(*Vr26!tGXu^GUoJu1pC zT#4gk&8#4m9ARHj&6bTNt(V*pt*PM;Wl%m47F|KWskqlW;l9)ht7I>aCcC?q}* zN8Y7&66z2WuQgHklt5K`zdoX$J3euDQ^HUGpd#W|oT*;@7VS`gMwa>@hRI&!15_~dpp)$I!QNZic~l-s%RM~-Ds$R?w+P3tP)pBfJ^Bof~!S$0D;Fo_{{lS^aa%e&=vTQE{2y{M2dXrV#m z4ykBavvSjwjVA|@yqN?)Y1qirpqan=IdmR$H>#sVPen77c5d@X^hIQ>L=+M{iu2M1 z=)973D#t%$3f3H*0w8d_VrDghD)`K4!~>C5*9?gq0`wwzUF(9vWWo)H0_}q?p6Dy4 zNZXS?_FRCP=mgxD zO-x->nYH1hff04pNZ6Ss8HmGpwB~&#{CF(Jup4kkp#Q>Ma4gC~a)_Tr*{Me%bpDcD0C;T*RM)meZ@wbwf zDP}w6(E4lYN4l7hKvzvDL%YNnPRsGDVk~dT2BH$>uv7yHclOa~8t*sb>L^m#zvouk zt>hz09A-WCZ6fWmchn4r5g6Vfvc*VA?;##u`ag!QJf7+QkH0_L*jzJmW|$~ti^-AO zr&3fxw+gLNsokR}(np9&j!s=t`IcYg$bEm@N6siJ$0{Ootf(mI_xac3VV}?TdGGyx zp08nD1TXwC*a5})0~odtkR0&ksBqk_@QNJbL{o?Y$56mb-Uz;;R3J~q|3a)V)d5VQ z>RvJ!Bg4oR3DAxLiU4r%ZAjj48&ypLwkMn4g`81cggmE_gUTQZ`S=_dvvBILk97^} zt2$uA+h^pwpp}TWm|Skh7!Tj<N5d%>e zBZ{k$g~>tqc+^;cQLn6%uf|_iW-{5WCVB0dmh85Zd4riY?Dpq*Q<)Czj`6(3Oqkti zl23l&!tOemulK@@{rY*n=?iyu_jtb33omw$NrA_UUF%62Giu_Lt`+ zysZ1|(eaY-tW@@xNojmm8vEa#%B++=TBCqWRJ0bKd;Qno?!nOudK|LvKLIM+Oucb ze@|8oX3wz~pI1#~FR=fOS1o1(4xppt94vLtM)h(qT`dDO%~9mwC8$#lg+riMd*rBb zWZ2byIa(aqjA~vEl|z(Nhv(2ZBzjGJjuA(WU6Yctk|Uo{la<5ZC`f85bC?`OdTo1- zB}a)}JD6j`A!pQ1tsRM>TTxo#ZQj5^a?cg_+?ol~wCM~z(9|BhSaF%8?WaV-=I+BLUTmgql zZ*0#E;^?v)2XjL>dKryVxnUfAN#kNJ!lBWd$S8BL}y<2Z(rCa0H) z93y(O$IBa>{h+JCeE6SR@1yz zj)kPvDX)`bNpJJW>)}|j+x+tSIMx|$yu5zST1i`Yo|t1pZ;#I#=Gd~^Q}V_*b{Xwi zc@rFaNqc3Ul;c3}XwRGFII=qi^X52C868u33mj)j$6_Af!t_pZK7qTA-Km#P;;zr= zG|gA!Zjf|3i_&3@xo;LY8W@rGC6!`&-+6JEgLdeh&=7x;7c zvEQZ?1aS9fyv-`$a1Th{Ru%}jKJ?!9f*`IhyLYf4gzJ~lJ5>H zzmG3WU*gZZ!~T*|62QBg@g=K-!@DQ>QduJ4-KUSXmjv-1utx_= zLU<_|qf;eeyoZv}#S(;ErRGX}tfj$5TqvdCxP(vr0308ItkJ(i~nUUD95f z&wIg^43-x2vN9x7rRBVAiDa=9<>k;P$YpiBT=s-sSrhMN#)N5ED=$wn;Z)Yi%coCz zl=bim*pq%`eZ0bqNnTk$uShZ(UMA)h)2HIghIu9Isg$xYUTMZuR@nrvOfpqjCgqjW zr`yYBc@^yG!Lm7CWybVW*#fUhGQC&^_$XaUE+_D-*;2i762B%xYFe(yua!uh$|?Lh z`ZteqHGVz&n_syWzairrubj$nlza;>r}3NU-{Z@T_|5F^Ddj8qEg9dl${GAulJAw} zOnxhUroG&f-^QL9EVtpeXUt5MJMcRsGmGUgzmq;ou5jUZv1j!v-1x6EW=$*H`Q4IP zrwT8A5B-Nn#V-CE_7A@bZ~ohiAG``5ey`+5cm<2!NBCuQHkcC1ajfd7nQjnGdf_<&V*S$5*EDzp{U)RHpOC zGk#}PX7VMH-<6d){0aJ>_R4(zB>T@`Wifv$f!%j|MjctR@DUmk7Tj3O3GiL|7)+B<^N^>8?2h+FJ}Cks#@Uxll)t(0s_DQ$|#nd z<^X+^B*0|?GgMK4p8(D%ML=Lco~W8Yh65c$wFI)65Fe#tz7}*Ir3pw3Tmot&kmKMU zqALaRnYe6}fgvee70MJSGVmR!r9g>;A3|*eL5^_!2d&G0fj+Ou67Zqa0vR< zZUWUzf?2h@V95l*x!Oyh#*p!>-X&1y$Q-Qp7HDM3@T+|UniDeTt62gqhHOH$zd)NK z`>;AduryOPyP6}=nUJlj76_;eVn=n5K$k-tstyt8WfG^W!vy*h#DCR@fW{yx*F*^n zI3)d=Si!PPl37ihz;J@(T$3m;V#s;c+z>41$Q`Un7OcpW3pqN zV8b9M)D8=5Ipl}6V*URVx)ZFqAuLX9bQN<)PX+fm5dPbnSw`c|!SL zEfB&CigF!6xQ;{7uOkW9XHv}S6onfmD9&{hp$kLBvrbL8k)v|3PD{8cQ-xng6}nES zoUfw^-59C~bw4sm;r>jG?0Syyz=TFsy+G*0(CnxW68ds9hw4Lw zewmun^=XtubUhn; zgr_*V2OIl@r!#f=js3#l3ElIJVqpkFFQIW*c!s0*uyIUyHd8OVaY7h6p;y%?6^1eN zI~r$&=Q#R9jdQ~AO#SJ`1>yM#{eO)>gfM8zO$1Q{ho;{|5?#oonKdbjA}46hO%zcS z!@#piO%%;BIM}2mx|nIeZ=#A~CJfFu(L}L~WeH72qD!1*51UqsE@v*wZeob8Of0Kv zVv6Dzh8<0oqN^Okp(Yzqe5T=alY=N>!th@cEJ|b;DL1=_k~l{C&2FM=nMP*K?xO1x zM$XM%q8p6mp3S>NH#y4>HhYV1WiID8`-pB&EI;4O5+yTMBsBYr?r>H-Yz`3J&0LY) z%n{w2SW(q15Zz}OcQgly9&n6@nnOe>na0!2VWNi<#{ZfTQ7U7la!Zux5oe`-ORVT| z=1Q}cIMI`dmCh}RqBO=T&z2ja|2V4-wj_(5X0GD5+!sBYSarT7Rg}&!NoYwE{f}ev zuq9peJkun*B~z3!VN%tSBg$mZJ6iHZFF5p}mSRy>CVjf4T$DXQ|JQ+6AjfWn7@$m~d^HN3gl1 zCM7sPyTCRvgGks3RMDFn5Gl2r#dyYs))C+bZ*e>8%KP&npo*y~%H`L+qAGnj0av2| zqP0buN(8uHu%gsR%@~ttX^<3u zibPJuTtpSrUd%LWeUm1GzDd@S0VbVTIOC$W3<6OA72sju4N74cVDXEdRkfXX8kCBZ z=S>g@s;DwT3V;A`dvD+c9%0f4vkKJ6%A%N4;h9H46n!+*P&aju?}G=HOhW=70nCv6 z29^MRmKY#&B(y0F2K3~B9aYiX#983dq5S?Et7Y zD^(HXe8k*w3h2WD=~1!P9eoG^yFel;FUF6x=c5Yi@&1mNykjVYbSm~XSXZv$v}jDk zHn5EXAQ-3tCQt#8C4hjr0J!U%>5pT9#8wAz2L%LxxB{4ffQ_37ERZ8df=Pm1Aw*?# zj^hS^bOp#!ZnX!1n6ow#tOt8{D$>9<@TuGh4+__fC_*;)+ksycfuNlTlws^su~)-V z5H27Q1{AyF;2Kip4)rV}!m2d<7+x7!L&5Il2ULS zHh3N|r#Wl@0+>R16VisqlszaBM**@3#KL#x&9=TFfKhmd3PACVvb$^Ez#tVk3%~;Y zT%h`2=FTqVJoQQDk*@tg8mkEcjK8QWZ3^yEn9pEab zJ-6{y7uQnf+@|cV!#H%hufW_8_(&07jh@P$Iyr23J{Yv2LH9Jkahm-vD%xDMb*w+zeHw*ts4CSi%NN zuB2l_MK&M6e~**tR8Yj0jSRqaw^kr4m1)8joIGt~Z`Z{jg9mO)x*KQp9=IEJ^JWcn zUCp{%g3Oh+*>?xdT5{djcJ~G?+qTW3`+bo0i%p^3r)RBow;6YT3bIx580~s%Y55m; zcPZBy>H?S7*JpomFl92?lA!?vuUV+qx6MbeHLxTRtn9dxKNTlq33-Ea1{5g>dbmPL z28tSpoK(RbY5}TP&jcV~RU$#^$49Wa354!lvk-0D`JUlf+ez1F-83ufZ98Imj0-mV z?g;K)Wwo_p$NBEnR_=dy#B?vSGSJ=G-Luxp&T;2~uC7DNCgI|4spTE7&1L34X2q8< zJ_umXKF@#M*JosCUVCGYA$Ci!n?MoU98A0XO#mz?5nMnRSZxSj2NJyGY2XxU%aTvT zm*Ujh+%kGr{_t?zQTE2#%IAe!(VHNv1Kho3J*TYv&h35GbH?gm#oo_7q8}Ez-g~53Zh*z@>>d=mAvfVkT5}!;104-OB!Vk zL}C64VHkS(-<}6p#kLGllpf#SBZiHo#C{No>PkZ&0o_xF96kQMu{(88$@|aS3M>BK zJ^0?*0)g({CB2OWLdU)I-V0Wu3LnF_F{gt59Q1o2)Anh; zxzu;G!qe={y@IJQY>Ryj>m!X2z@{XK6=--Bm_)&%q3!4jM7A7j1FeR)({X+<20f`b zU*L#tSMGj$>eM!0owwaqK@V74d#ejB46rQv>I))u4{hjcE{O6yw6m|n>f(TpeqUKZ z^n*iYeKc#&$xZCu_#Z|}nXTR8QxMJ1_{~E8v4LHZ_B}8bkC;1!iy(I@tKkjYLY1j>3sS;t7ij7hpY3D;|)g<}s}}Scl?r zy;U}7`(HgR&?rllV$Vnk=uj*+0Da_)E*7IGh_z21YjAOavHuEEo4rs zftz3{tgQlq5oeT0=-&KOyMoMUEk`IUomRlZ;b4~8JCWtk0@F|#H{(oW|HDth4g#fN zH%sX8c+^Hp?$68tavc-|pxbO6LfL7;qhopRAmrYIMq#VSx`_()ybJ#6_2T%b@Z8Ub zx&g}XqpfiQ8S48>KOYYSIKNN&ndW=qyxalLrxhoH-#;v5PHz9u^`wyEb@Ji+|5-ClCFiF7m&&Z=0(-k4tzwJl!h7McTP%ADG>ad z>{4+~Dha_Aib`tud1RZww2Qb6T|zN?MVMbMCndN+n^BcSg7>Re8%Em9jB$TKu{Kka zP=7J-t}HDsd+j<(=pWokAT`{WKBx*)bBM)4kEn57C=8zi)@-CC4=^HztSPaBX+>YJ zo~2W2f|sX~(rla7sy;ev{Ax|oHn>rVuzrS6EgwSEf?LbgthI-$x37!%k0^=INyG#7 zto7d=_PD>UeTTvz5&VL1oe?9K|3WyazFP+kA;~JLksfLh*PJKflaeBVK_^6j&0H`d zXarQ@|5N}CnVm4u>OYPhwb({Rg9R$s_U@0&-Uk%%E`%&=c!Px3!%W;cmd%BD7LbxC zKn9fsa_e!rIV*1g5)#7Pv+|H1sJ{d(Q-n#ZL*K2Szi>wD zMO@qJnAP$*@Du4u@Lu;q8Vs-;02%n^_W59kM^Zw)lMk+w7^p8ioh}b(Qn-A8WV9tO%1tD1JTEiQQgb6O*_u z4~jycp|TY4Lrsh3NCfHFJCE&>TZ%kj{Vc9=0QMMH7$^0(eQ!7#i+7Tmz6qB&j+ zY<3l5+=-!?Kfs7~xn3b72%-gOf?}}x)@5z(dt8xt^)S>3u&fph3}f!9YLddGndgtq zk|A$ZITWV`!eCj1Yy%DfY#<@+lNva@hiL!ZCjz5@;x8ARPrbkApT&5;ZI^fD|Mz}g0mAifde=UcipnUyuf4; z1eT_*!Gka~)e)yAroa@IY$BLkM~3BdARi?&Y04@n1hHT#0Wg5RxCZKQ&yl6o$~Hg> z(kpoOt*RC)Q9x?<%Tr>m&xVviTbnWkC|I;zwEuj54M^DrQ32ZGd==0zD;T6=AJ275 zfXbra<_un{BmhJ(+6vhK9ITJ_dO_DLWmzETvKE3vm02$9F%U&?0EWAl!We`cT&F5k z)&e)sy`S+uKmiaa_#4BI5jxXgS4=l!=e^#hk-@oH2|+R20APl9K3k zABz78fFcIS5nCGG2y`Knb(>oI2VeF$qKtm4>TswfB6)U#gIiL!FHTDczljk8;L@S@Fx%rGGqk7uqMDjcE}?FWp@X05T-_bj0TAa2Kv4KD=f*FWd3U_M_4s)05}8V zq@-ow-4ZAVfF9emLZ@ApKn2mMIV-^@oL21wVRCr%cC{HB+JbI&Rh%W_VOjWUHf{mN zf+1>OM@lH-8yiLlAXE=(#qG8Yi@*8m>yLT=?FtU|NhL0Bw&zFW;jkWM825XvB7()H zbb%rToA)Qlr(o;>+gc9k0Y!BZ5{wXH@jUc*Ih5u_o0kPpF}M{-gYVCfj7zyNE??Wk zZq>l!t+?XghSmrpXa(YwijR_01qGYrV5ssDI}7p$6tI?ww|Red21pg_zHT`SCt@*d z54$_eJ#OL~wj@L$vqK39)eV}4aNxK%22~(@h>)=ia)^;&~AVe_{CjfnW6*^Bcz#7zoBF7-m2tVDujK$R~@#t+z$U~D|V0w4>Hg?8nm zWn}+gVprfMJ&boGs;Ht*yLT3F=HEHg#ttMbf{Ln#q_K>@Sy z_9Otki_D>^lmf3G`$ndH#`GfyG9F~Jm?!`?^+?l_u zhsz)HJ9^Y6Bl}ngYyvlK2Em~JKGtrr{tY@I0sb^_Vi7`cyEf(yu8jfbXMmSE5z9&k zBeIFaOMw*Z!kFC##1lTi=uFDC`*e^#U*(AHARGjf4IJ!k5U+1*vOB7`%XKP8bwCjc zD6rX6huoG6a0T_SVGhQ9#i>-Ib=S13&_F4{=9_|r1C5}FiOJZA7=dG&JyhXzFKQ58 zbmvmB(0NlP=#$lgWxYY%*hLp8XXUatpYOE~fJq%_of0Zjhs)UK(1{0NXX5HqqJ!KU z)R>7CNesZbr;rp119~){i|_jpN)C1wE23oBb=zy7umf3H@{lg5`g`1OeBPIi;=`~w zo{<@31nyXVjRWp8M;uIP*lX&dP@-p<{3dyMSO!bPqr>+deK9<}nk7d9QuNuK#uvAF zumenP#bS&WOe{;hfKqAry7M;?O|jxEgrd|=Sr+aQstF(%dSp#zB{_p~7$;U#!$Ig8 z81zh-#ZpKZx=@Gh5dvlESg@?%f5iJlq-s(|3s}O0#3rv#BvdvLXEcS!%g{1aMz3AK z$WI^c`PrqOTXq6(R8{P|1kyrfn75XIVk}s2s}|c^11)bgem*x-X$onLUJt@Xu9p-2 zuIp%ksJ6%56bdB9)!GuI*A~?R=DiH`TA}fkj*i&5axv|9C8^cwIh+`QQH+v4ihw8s z{=>di#By3c>K%cNr}4lRyUILNU~6WE<=K~5n58PSpfUqZ+GadX7VM1#H=x~tns8tS zSX(5c*QEd+SP=dyVdZm}Db`N}t-!KVK`h+tNJ>;n!;PUX%A{GK-h&PCVd4CqvU{@3 zTFC3B7kd)dJWct0Haef$;_G8#+86qwpslnw>`+qZ1N!erKLe{+36cDUaj9!VxN;oM(Si&gpRIEV_!14iB*Kf+z6 zaa0LZriB%HFK4$?Xpc95@8J9pPKy7#SjC^lgMBF4F{BJVKyK}@HH23vTp~Aem)p|By=n-ks@^gh7W?Crry@TL8Nn2C%=SZjl2ziPlvB3aL?^}8 zAG(B7GmZX5thSxFAA9KIew*^4=<^?gU@bB+?&Hzo;TT%#$9Zer!HZQNZ@^Tim{%W9 z%~=a#Mn8sz=r6_?f`~bqU#$M8OLMwG5c5;Kjgbd%`*f{xOaJmLnZ!$Y!1?s_c#4hB zx|JS#Q9!G|^T|v2+~&wS`joonm3#FNI4LYD_Mw`5*^gd1P`~i$g0QyuaKCxHJBs&e z_;~oPu%kGj-!f}y@YT-*|IZ}Zafo++Eg69LC5`5aO~QLlmoHkZ&@GDZzFYEHEJP|x z^!u}GTz{4Q`TF}JQdGGtRh1&wlz0SJ`L{Ftbk%a2S|_P*GVvJ)1vWCEk5K6 z9C)O%%jd+D*FnnK> zC6C_61Dny*z}L1B@Tn=g+Yhj(Fj^WoR3g1k>1ZxuT6A39^*T^e^0Pmb9K80Sq`O&d zDiDV(^oNsioe%G&{T+QT!k6OVh$;AX>VZzHF})xaJMvIe*81Q_uR6J7c0u~3ln32r zkArtHyI$b-2CcTct`O(3$@NKI*T=EGWA=6cPRQCoIWG5F>1)sS3l71)*V>_+H1=!9 zuaARvmNxHmnci~yKkTl)mIfUxB}XKC;NYhg-H*QZ1RVm_5AKmYMzij9pCZ;o1eZGK zPQ^RL*#GIS0Ju{!mg^rpB5%J9yn4*XsizW4qu-@v?TF#O>cO7isRyM%KfRqudv5q< zq~HCNvF)yb_W0c~6c-#i-UD8iYWu#J+G9*t)|K?1YPMUU zn>V%jSLTz~8-J#q>ak-#m|lIL_dm(obCQ+|pX@{rO31#?vUL18_)8%JaFOrN)@@$T zo(v2~vP6@G=X|TC4r=CL?a2xG(~V`xxEkJ>q8xUgwYVQ3~2i%|7aXQKR)`M5%W5#*-<~I|((<&ABeXk!Amte_Tmdb0BLp|S|*ov9M5aKnfHO_m05?L&0e&`ui{J^8S4 z)70q;wghA_oUho0JO4>TPMg?i`2AColh*7c)Jc~D3kPgyd^RJtw)^8gJa@ZOc>tg! z_{M0>-iw&rWU{$@x!$Qx+qt^D$D6;UhwO2HfQILl#(MUBM^G8!gfItVv*K>^?Mc^O zzYW2PCVGdDZz48c|D4-49wN|k@QYz3^fvzaEc3lMVm(+tXf~aAy9o~%-`$XShv*a| zv+J9l=M6s?W`a8ok8s8v*NH9Hi8#6uNOOqlUgb$kZJ`qg`2A1_Dfbrp~F z%n*DcfX7$;NIpxjd?}07u{tA`faC!f?5&WwJ2P^$_syU2N4T1^$(2VU_a#)_etQJ3 zCBGy{SmA;MzsL&ieI>a%BE^_iRm$_#q&X%Xa+96sMpxA80Yp=JG*;tcn<*waH2V2Z zFRyR1UlT=QhMu8D%I7@J8kERX5EsDg zvM|KlGgokEPe(0Ql%WB8%%BQQ&?XKkOeM*+U=QWahjS(+u6H&7Y+5IK0~OPJQWZO8 zD1hY-z-$e;s;d>7X7C zr2x6P$)k$&V|Zi}#&E7Y+r8CN0B}GS!KR3_AX?s&>5qVO`c_^T5PA^MHzALca3s#8 zwJbt`@ltPvd+UHv*v|Y_scMwF)+w*DCY7zjQltGp$bG5R{6q(FbMB(2>wVx82K9R# zj(qD{K-A5h)~s8B_@pW&Qe_D*p?i6TN{fG>7a5 zL=3sELe+laG>`451mI?ZK5OKFzUk}P@D{upjM3wmq0cIAKvn5zrTjV^+8Xm^2BUT+ z$J=BT;r}VO8;=?)lRzw#?R2gGe@EYFCIsTH{q2d_|KOXt z?#9yVu29vsx31kteYIPqQRMA%?4gD*CLm6->=USrJyd6YSX%`WY#LrF4<*IMx&++S zF~4)nj`qv(ZTq>M>p%6EX1^Sriu`rywLF-qJgZL?4-%oKU*CTHJh#L7xjuPvgQb){ zr!qnV=77!;M?0^EVef!U>ii zU$-bjo!_sFRV*A1e`tAEABTR4ndzSI0-@n56%P+~D&O+{rn6k*?}|Vb$F!jy&#%Y7 zv41=MeH^aqoT2|V`*!*deBLfRfIJWleOjsud_My)CbhtEaPo1zrwoF%%G`83M2e-m zK4sLZ((DY3f2&c#zqvfuKbLT>aZ8V0$}j`?R3W;3{DE68aX4$W{~^bmmwZxTCZ!(; zUAaXK8-2C$@+X%r`D9Chk;m(-m@%hCzp=P$=?8L*mVRGzNuf#yHWs>Q;>5o`s;&;V zMs_SapWWO$eW2ikn)zj&`nY8}U5`R`#;x41cK)(seX+im@EK`)+@F0E2TUM3T*E+{m1)No;B?;qF+|;xExm}j~g;uSn=PVKQfE$d=0H1I)9YDHCpXlSm&yB{zp;c z!C^BMi}@?iu0@<6*||-BR2h1PgaS+PS-}(M5pBh%!dVQ~r$So@&z+U25F(F>QGb)f z`!R~EMx{IjId@M~SBPVo6ilk5A-{qn|NKpo>j5>+rc?@9Q>qUys()mG^@!Oz)%cPk z_=<+pzZ5|njsxpnlt2FWddf#!*82C(I7HLq?5$Ny5caQ0aIBaGyB zQFrds7}x}4Q}NQhg3F=Uo3Jy_wAo8#@RajUmw}fWeW18_MXfC509x@4geyb|kATDX z%}r@Y935(hq`(+9LM+Hjjjt-;b7J>nm7OE4axAQeMs3_jY8Bd}m#du--CuYY!z`8V z%iN8R4(~IUBkhedzpH*cZW~NJvQ(uZ+3kQ)eBUjc+s6M68+|kC-NpHJQ|-}Z3i#jQ z>#5Ie9@m;&RJ|R35Y76uc`75_lcTy4_cFW~6x_Il`>3%s?3591O}JsHEqcA{^V%&g z1eUfhBtp!eaK%t3o;81Uj6-HR1I$3XlitOS0l0MF2Ews-+%UFh*t|t+=(1gd=I8yn z9X0_A7QeOmamc2CySF+*#4glF%YUhY?R5wyF^Dc=1eU5^7;SJ-yZWAT9c7fwqI3=l z3!I#uJj(41a6Pc>J$dQXW{X1y)4I@Dn+=#NtEzOP;XCfB5GOTa0r<~wn78bCWHo_g zb28ujwbqXSr%ex+PJlNyu0~x^?fb80Zz9)ud%O*B&9oX^dI*#>_&&KJY;-%hU}d5@ z6q|$nc$|?6E^(?>#$EMloM(NA{)${YJbhs9-_I(Wy9Ie727+L`E_emm)deP2oCVvRd?|UudXv~8ek>zsK$BH@mYuk zrirRqpmCPqCW1>eH)32P3XTusvfo*GZ0Rj8!xQ8b)rN73Kt5H=4T!6oryfIE$iHQw zw5nhFeRtPENa%5JIYNu3m`W3X{??N+Iu=`&Vw(t1L~5citrG$A=yeupZ}h5~TwD(G zWkb-ua5EJ{Oy2dvL_uMZHLQbdR@<`S7WcQw>az$Q0lP3;VA-J#Ec5TTWUM+r9o<{<~!|!!>C|~;7 zaPmpz_SrH1gw>*sXTsCQo+qP8vrT*#$1J@+S6{fk`COj#gLHPm;k(*~gq+6rhLhiZ z281$9D)oF5@*4XMr-i@9LKU5G`mPBzjh_s^f1C3@yWrTOcRQh@@ynBM=D)Q~lm5*FsVngRw;hz6Pjl9w4I~hofdB8Lf5`|H zHl-;gF1pJ46I5}Vk^AtPVKuy}?b`Pm6vJmppPMd0&LV@7HR4#ZQt`C|`1RmD((Q1E zx{Z9)m`K%m4V@FgwvT-Dm~AhKyNZ55BSGiU^!{BuN^F@0p+$`n5ox!PW|+eWzP0t$ zMjSrqI$T2aZ8z=3z~9%AIZ?PR+Hai03{KwKy86q~Kw8O8nsrjuGkK0A7iS+>hjjP^ zcxVLN-O#of>l z-#z&~GFwkQv)gy~c|4tTWkLR;%!yNlc0LcX;`bI^^ihzP#GVSxD`J^_*R<6PdaI(b z@j`I*3Ek9fX0b22-wGw=r^I%0Fe}F=ctssZlhi?y(puJivR{$b{a#zyZ>KQ!^WbyR znw2>gt9?jTk#hE5bZg0He`&|{ZJQVd>Sb4a8>TGBa`Ep*i2EYd^LkTTJgnzl-qUNC zICi>d-Tepc?F#R72=C=4V^1G(`k4AU{={g07br+t23Hd8>)=Rod~gZ2;X-n2bWX3VacNOLdb@4n*kLwkJy`OOH5l+L(b*dAA(aa z7x6zVshs#7<>$cEd&Kn$Xb4@pOkO>jU!L~(N#a4-Rpp;YzO9T7cYyV_bsl=U%5vCu zoO0%}!={u^6G^>Hs=6Q85;ng<7Je?c-rM|VxB{#{^Sx}vuFM=flkPrZ4(31^@Hu4u zos=U#roLvBrg0oBM{@+il>{3N+)O&uvc7Wocji742+=V4S#ykDbR6&l=TUiD~wFdV9?*4#DraXjgIDz-t-^^pH0&v)4fJVtG_X>wi=wdr)8bpTQoAX5!lq?+QTwS+5Nx zew0ZZ1xjB!{(}Pc)q105;_TyYtpndAbKEE-$KbGMZZD2>FM5F*n&|k+hXSmK;ASp)>{{e1Kyu5g$$i zamtzzhb#Fnh^YqetN`;tmjzkqoHhdd$6GW=zwa_okFVbVX);k z3F%(m%RD7lyi5PsYGY#H#wz{!7asp0zUQCYIQQY8a8bkizAC)fM7UP9s57Dr zVi*+k=%Tz}l~%*2ryaRAZz3TV4P(K7Pt)!m{nnSbFRg^DVSmLhx#Kb3BR}1cwt8^U z}JvZH?v)X)Iy%BAFwL!8_~x2Uq3VGRhB)i1x#?~>E}t6)mj%s9Wtrd&_7 zy|CD)zt%>x`g~XYw$`Aoh1;@%T3=0D@UA{y`%edMbWvhD*o|I6Y=R*Nq&(!`hPp?Z z1_6@#O+KOKs>Y6yW@In|X6yH3IjG9ygVg$)pXRQNfPc#nAv8D?JuAy zcCu#c9kpzM$|eCv@5`?t$6gOy_jc(xV(#X^+8!@^=f=#QH6wz=pi-E&yWM0j$&y$K zki-$9LE2QNig#2LVgIu0i8s;ZMk{jGr^^i!wiwJrJc8-|tC$MfcRs9F9W6~UzBrBtF&-ew>P2@G-*-#3>U#l-BAH66Vh*kS9OX4z?{8JjOl zUZ#-r9-T-lGgUcrRgF0QbvUrUDUf9(Qf($@y42v!lVnQ+4mu_-*#`ujXO>~tb(0@h z`BFdqk^RP}%hm;XH|!biW*W>rzS7mUO!q=z6B{J7yY5v{dp)_#Jld`Fpno2DOH43z zQ_8U0g$6hOwA*C&B2~^NC&TU_cB%D%rRrn3mU21MWqC=X?oPg*ojR-1w;t6PR|PSp z!r|?m)c>ia_55e};DT56>9p0CO>CY=x*n4mNz$}AYjmZZu9Y!Ej+L27I$C|se}AX` zI}OHLIiqtCgyu`fd?^MeuGK1-8pYUzu8T=K$XsTdL{;2xq!1b77Od;K!>?D%hjPJ4 z`}*~DE!t?7(K~PZ&F^v6kxOfCrqz-UYc8cKwHR%Sq?X-HJ1OuV_ z^QE<0Uaj62*_dmqN*@pNDXUK8<4qKacdj*7Kl6WMYVwYnKe>DPlSolb=J2V`__sIv z$>Gb(uyj+|z;06q8$HI>yF{7bX{cskzpAiTFKlZi@pI%%b!pl;igQy*_tuM3yKaPU zMu(A{D|?b1+*_ucu3g!DU}UOYX^DZ_G+}z#^?LhAT{&b;vvxm41OH#JeodSIaZ%{6 zI}R#ONv_u!HQytDw_AR#+_0^kwEKGIW)g_^a-B02t1M0*yN)k^Kb+_l5pyp{{0PuO z$~G^5#DBS2>wc7~s_}nO{hLe-MBle0HyrQ~$=$oY#$n9p4l~B}fy0uY(yZ%;+Wdx3 z@3_?aAb&E#xFX=w<_jJvoem}Sl23o--dsQIu&DP)8aEof>vQh6pMdAE=~0*{e(%E@ zYUAJLLgt&d9=ey~+`LNB>w>)8jimC;DH^n6mlS9?#>&0X>;Cvv1 z_@r))RFzH={FDj$!4E_QCZLL`o)j>Af(9{=v*>c#(T$HSx35sx2z6DfkNj37px9K1 zT~N)jqgc#A1>HZ^MA&gs;f#y{@=ZzRurBgH7h*qH!%s&Jz&kD+yhR4#M!QwPbAUq} z>XsnNESxvA19KG67t%;LurzKrXmFO^JI@5_Q9oERbRBYP@D2TowIWFLIt3gUG2Nw zlCr(V`+x7QWOgY*;4xqWW!6swB)$&ASwqptL!WChnbT2}>?DT1TXX&CfUj)}v~vnyI(!z3p1nZe818+G#94WZREPthcE^ z?bTmBVY?iX+v6=_lw8z%Me)Va{LeTk{`qD;5`eh>G9W-lPZ&t0FBp;-Lnl*kb;*Mr zdG5~#7;Dca6@X}4mW@`{QnoNK$D+SmEtbyji;+1rm1=YVva^L-VK|{ zvmDWfTRMmD?f=>K{MPPD+b=W!r|M0-p?tu<|9kBFp6nzfWhhIsj#6YslqFG7wjnbp z%nZrcvM<@PWeXu@Bl|M;WyZdI?8ch1CP`GDdA{Fse&_l933F!7eb05h->=stfEk8c z0lH#q&*if0!cmpeGHi-Jh`$*ahV_l5Sb!6T+Yec~kfGQs^`T!8HH6V?cG z)kTkxDdWjm`NH3-K#@KZeH}gE_I&l+GvE!K$CD|PJ^$mOQK!?+m7f`$YL+YCWDYKF zi3cTIfaX2Gj=6n%`O{tJd63u&n?J!^rf{vw0AfThVyXD#`BGalcP#z#5fbHo;;r$F zSW{UmpE+A(j#94p&!C656hDv?=iz(eYUKjNI6i~uJl%WgY_8Sv38H?{O`ZIbee?i+ z|K@LY!TGrE&JfU5pY_P9>fc{Q^YUtk0L3q3hu48^r+?BP^32Vb&olV$TsxAJVv``E znR|Zaq=J{&BH!lDb8>olVI!TSWR|sjDzx?&C$EFCaVvk!0@e#|g3uD|a(wEu)4f-; z9=wpdTnJbsC>dV^C`6v$FXE*7CEOFt-ej+k%)a!#Jh;vv8IjP_%A&wU+c=Up(N=g? z#1*dd@%;FAZW+HK?RGXfW^-d<$mED(o1X+DTJkI4XiQvTTR-^~s-=T`Hk$Cf$Dm-F zy3K}4)ftsM2l)5MhomL|`6xMHPx5a9*0^njEp-KsHe!^KI+GY@EQ4L)-&e#G>DozM zNz5|-_(p~Nyu0{0kZ*YIc_zR@rWP>o@hAdQi)_Fo9}3_kgL>F9*3&?pkxb`Uu$|u_ z`MJ+QM}Art=gtU1`16fa@6mJxAZPO#EUe(5>R+WChzJJAg947>2c?$|gp@cdBSvp{ z6|h*a%Uw=&&g3kH4BiMV$R2V~yfiM%!PV>}d{Z#LY51uk*h(~jE8?}l&CG(~VcU(X zR$?<;W)b=~%L+z@ofS2G#ml+3-yB~-6)ajjRlKGy5y1WPjTD4ZusZBsdfn=*63^qv z;~OIdUo8CK+SOtlJn@mEH)jie412=$eI-12Cn67T`USn!j>@r-Vazm{h4_Q`Grcu$ zxiVqjy0iE?53-G7FV~xthh*>X8Mu;RRlF{K}bIv&Afr+J~%1a|wYNr5)+T)O? zCbs$T!Hhecx;JMS{!6039@E74Gex=LTxZUm514@It!j*kW(>r!urL8{C&U_nX(~77G(& zmb~@@xpcy%Qa*L~;0F9Hui@)y<>UhPqL=VzOn0)x+Y)F-mLhj1n&86c%|d%jQe})& zL?4#CyxqcdGfU0T!}-~;7`yNU`_9+VOfZlqW1-6Sdo<2nn7Qw*N!!aJv#N`wWlqMX z%&4s0-cOFY_f?d}Urn6RaPxCA3|f7dB>nXhDm3G+p? z=y{8rQ*yCk{NpET8t4>X!5S97WMUiH)%*o$FQuAWO!IeOL!01}XM&u2Rra1NtdiN# zzGX*Cf$LhIvpuh}eoP)R{8Z#i@I=*&nLcBk_s<=ulZ2~XzCI%XO=cZPhTl1hwY#s^ zJL3y&mtRZXH*9bY+5=}wS0fHtRs4!|j6mEvQ_VAzc8#5Bgvf@ux_?!)HA1jLUE`^*gTAbeP%*Nf>FX3)) z`g%Txe^?}+!aN)aV6 zv%v8fW83h!AaehK$mLYVI7Pioc~j?eF)toQ$!e^BRxF4ZZLi3V+qW~x*^Gd5in3_+ zg8*#+(pz(Tl`Cs$QyFl`?oU@&O;QV2CPqM9^J_5ewP^OaZ4}Wh^g^bA#Ce z6bb~~jue%b`LBKx_KlyuB~IuEVU@{G&Tbuu^60PvPfB0U0+6vgjAY;uFEe0(-M`6! zov#0?v-y5ij(G|T|8hyd!*)AIZ00B7{Stt_r*Ysvqr@J#L{B^Ge%umu(M9e5 zY7zN%mz`R4qssVdAnK4|K_;5zDrj?qE)N!A0;EawHTVTUhRg^F*rN-FeL;JGDxjCo zvgZ<>w!`=h!)c?-pNcz_jHTHg2}89x=@)``xo?x zZhyNC@kZWG!hXFs0Pvq= zb87F_G^4xOuZ2}eih8E28zg5=jR`;$(I5-ZZDIKa6D&s|iww7k`Uc&QpoLWkIqP`V zk&D0xqbJMHfh7BDfH1*&Bk*vbG~Kd=>~^Ud)DMq4e|xAd{ZqHf%}-Z`ERM&oXaR9P z@>oX*-#{e%+w5~1um^JBa(Ai}pqB^EeB>5iiBj(DSSu$c*t!ex+VcO18qoJx66PQL zV$39W73hrOqpzjOeP-D2oAz(m*!)$onexujpnN8osWQI*&^3_~bi%^NMyN^r`VD>{ z9|~L9?P9~8XP;UEg(h%8Wq=3#0)%I}M_pHZKAu`!vxAJs9%{nX6)YUy`5Hm8B}YPH zj6ExqPh?An^f}7UzQqcgQ1g)%=K#rZEo*zVaP9MoQt1}A60m@fQa>^xtMp|-!rHS^ zG(B_R{>kBZv#VfI8C9w`-dcQRT-w7}yil9Ez`|=0dS1+mA;#NE%MK!*AZiii#9zXg zH4{z_f!xXu?@3tcxx%dULhgE&ghT#CV?A;|KgaM3>Ta8aSH6a^Bz$m$q4wq0^={e$ zqrq^&2gF+_gh_tGmn}8HWVmEy?8-MSzk_&PLwv%0i%O?62OL?Nc-kmf#G;isgAmcDI_RT){3)~ z*E;f>UUfmgMSQ7^)rE55iR(%RLWME+wo6Cv$(Kt{#Cn)me`v6fFH^EIFK3@fRWkM~ z;xKw#hO{y)SFwKU0h=f)zaLSSZe?GtX`NaQ{aF%V@w0T$%BTFQb#A$a`UeiH;<6np zzw+x7SsoT=${MV!%f+ly%8ji*dff9XpRsf)v#~ytKW1JG7*@x+^65Fh2I(bn+4sgF<;TNWMubpNYVHzYkb2L~(?eV>-?@El|v4 z$B>zHx7W^9XjBj`c!oKdftZw7{~oTS%HosxBf5scA;ig~uvAolyX=kcfc&lbq$Wto zhQtdI+eqh-g>!F1CSk5Jnu20Sk*lt*w^}nF-HTt<`XO#R=xh{o%kYECy*sPg1Uh+$ zW@XtJFU&NlDb?Fk4j77y{igP%u(t7>^jQryQ=Q1HpnGp*9Muczhl|*RZ>xkR zjdnUdvwB!7QVG|*?E?}q>n*))DLOq;5%*gC!&}*bjq>aywSdusIOKV=%)${bId>}w zjM#g31!j4_PxpAF?~Z94mxaY2s=ItJFq=^AewLcOpm+FwK5u7v;J<%wM#f@a-!zAkxX<$YLrdF-)nFm_vog#e z5!Uy~eTIx>Rs!Y$(@myVO)A5}`UVwH-ZzdVE0SVZ`;yn%s#YLe}W+Wh6uKLQI^MB{3O_am0-(PoqRAro% zxvFGxEvzW_j_k!43-x+gqs4P~>a$hb<=v%Nn|{kldbKN1vPpf?PXh#@0oilO?blMm z9Yz<6QY^GY<%O2g?v!P^jW(ACS3!^DJyUL9kO#*4wA{12%}VX8z1!JEb6~oxAKzQB zsdkB*-_<%T`qBrv_$Ec~p`tFX<$_^OY&-qn@{fDHip}PQTGGW?Bd~&^1B2;{e}pvm z9diT#Mwb%x!rF@yt4mr2#Rc~Ph_|y?QlhOKX$L>A5^q5*?u*88*B?O0_|pu`4{8_AAz*#utC+3;kKwF*AX3w znGCY~EDPw;_y`P;EBD4->5AanWCKS!3BZ<}7WO)Fc~lyx_pNXQrtS-H87t*u7t12@ z?cKiq0c;sX-Xy50xk!s+`7BmbBR$*fRoaLt6 zSyeObI6~ia-(@6=<-;?!!YxaHBE*OO`^Durc5HdL{Oh@rH@55#)@okfHTuN0^?g$S zpxxz|$GzZm)MNrOL_^Y!?&%m31prkI1R!F?hkUQc37m6eRt<;m@}+=*tJr^#SP+Sc zE}l#c0)XyFT}}ZSuPVE^gP7juk5LK$#KU73sx${^9e~tw zNnD4Bk-ctinE*UMD{x9*IiL0ZzQ@GG(BcAMr63GgA%NGG?%taO`Tz;L(n@ZNA;!sV zKoDWu>kx8w_tTc}!&?}I6^?gWb zylpvX!+?9(^J9T#O!-&P6qm$+gP&v*lHfW-7)lKIe!H1z7_Q3*fdWNNY1_j zRvs-k0uF!$H>dhchG_v1+1=U?_kbEZGIy>jq z0dt?tg!4C$ULn*dsq~IzYG2r8ml^BE7lyq}N|#>B2ZZ}l>W!Q-RY%C*Uz2rrrDVtqdOpHxgVbKIa zLBoPCnp@o{-LAQ?!kSR3d7n*H*xIdx(dCod$c%@bP;OcDT;+_K!CQfbMWu@ZH!nQ; z94qkPZ#2WeijtwF@b9y?;5V4gWC<9ymxA|IXB6V#9LAZx6B8O6ej1Gd0Xe!r~2 zv=Zm=0vacu>h2Y}V*Rc)jLQ)i4m94@Hra7u^ddOdH^z z%{=bBOnEeV3y~2iGtB`f!&wz z@<~OhPiM?+bHhK|X#EWj9sMa+P_5_wTrYLq?o4shq)7q(^Zn91t{Re7bR~Gu=~Jn9 z@-N1GpArC>lRL^{!DL4@FXLy}sc-Ighvt)DNY61FbikeiB(U5`FYaG| zT5L1;uqO7cau689DX zX;JW;(!T=g#eD%B0N!@Tvg>CUN`D=I=(k3sq_JPFFRoPFWmxbjwv3hc8I&GoCEFq| z>!kDOC%J@swSRp5vvBRHdHPXJ`Nv%$w9+zXp)vzJM=|PT^S>Ve`TdzdR|Yb3HXsCP z)X97F)VM+&3F%=tLJYwDgz*6g$Dq_c0;idYIA7AB< zW{vOWAb;?gfWIWG_k#quovt&H&vrl_xC@Ovrgz3>Sm<;%ZNm7>J}yYeCMa0{Q#rp) zf~#@R=d`CQQD##e#k(o_j1kryq^FexTU#bTLKvjVk<{_}>C(1UvR)f z8uzSic6;)V8N!v>OvHfZ;I&9@h4NiKK-)fd+jh{6lO34hKm?ZEn*E@>mh4zt{pnRX zD67VNwsdJW3&W=}p^Y^1PAm$s8 z4z+~Ysmd*Xe`sUn{0!2owr+N=a>pMIHdij#dEslPX16L2{R1h@+Y13+t+lk-y~-nhdP=3dnB_H8 zyD@uEdF&rVX+bPDcrDiM%^p?$@qZ0%tz4Y(+O0jB{ZskRKbX?Gy?E?(T1(GvZ~zJm zB`ed!ym{-`=9q8{s1OPnLDTk@uH&0y!!e;kp>35kJ8zXbkvT3L3o4A#woUJn8q~?m z@!{A|;m~&Fr7UmrI>k9590w|b(vDba@OG$EofE;)D-qC+%B2}^uR5(c2^@u8xioyyB%K8bZEb8QSZjFUP*0e%#r;p8 zta5GUg;#yu+#?(q^^QW>UORpfTu+{J#QlGLvc&q{IcMBeR3?RrSl51;S3f)l$El;T zpaYfbb}#YuQ*)j;O;k2zV4MEDYptivdE>NDInY7n|CV!pf$Z1ewrHfcTzXM`$* zj#O^g`KmOC%*Xw2foyvtz}KKbW#=We17toQXMrk(jw^o?^Gj?nnWxi7s4~hp;+wW# zUW3JaDb5O24xOm{X6J`*u$`~K*`PjACbqu?__a1T&J%F9s0!$$@@AIbPy>9v8fS;9 zq)Z|<8~hdG6rS?m_U5tQX#;kijB`X0pi|0QV*b31 zQS+U+XDA|N3h}={(R?q?8AXClS8mz)t2AcJQ*o}SD$4ZsR)D`jWB&Xw4vwmZ&M0qZ z`I|SE&X40fP@gF?i0uY{hepEu6pp^wh0a!P&-i;a*3Hl1kf>V9?DqDte{dsto`&;A z)j{W!cf?SMjlJ`$xEH8;${b=x8juYs0AZ@A!>xO zfjH0(kZw*|Fu@n0MxkFT59|U|nllz)_!86@ttXeKP!;ww;-(9O!9GXY-BbqkO1{{z@;|2z%|ZYD1{;t8lJ=$7)K zSYTpv?}9U)gqo&oAr7?z^O}bj;P`6P40OBl&@K?)JhkA7uR+aHwzm%h0$ZDD3*PuT z)Esn2`BzrpQ1ixuFTMdaPuW5IY6x6x-djN9n@|hT-O67xfxFE|3$O4ks71=|_OIi> z(`H~1izlOK&^_fNu~)n;Y>VOecGMDO4{@aZO1gz_F$&*_T84hFJhFSG(ju}LhwnzM zP`+;;1-vq7ky%W__o7yz`^vwwUYWNjE~eu9QEQZa#P5bz4lSyS8F(sc9r~m4_slD= z7Olk`{2=NJ<;V8#<5$5gki~rbFlqyOpnNPAl-OdjScD%%eWe^AjmCxQgFL{iggu{L>E3YaL$Pz#pKFp?@p?*#+ZUrxv&Hho}?E-|c?^!L6;d z#XbBH>JRjv@@ZD^Q0vCx0sa{Em+}vB+7P_hy0>_Q|AYDmJ*_;Q3EpizTKt3mhdQO4 zZl4|ppSA)tdRq`pUt@v+ar(T?Mq?r{ph0xw7@&idCiBtQ2y}@A41@#h>9~Rjjf+4( z*gysC0D*K(nGAg|!iHvoF@QnYSaY%>O^CpOW~MSAL5)}kvMNo4z=dXkG2%e8STC{` zO@hFKW~DOjfKIT%WC%@$z=vjoF@YJxLlVg*G&zC*nw`poWY7u8BU{iE2|{QN7&DH+ zJ_Jv;rClZnqdBR}I}Cv#tz<`ki{d$SE01gAioUd@wdJlXxg^TNKTRAdBXwvLTstLZ#c1 zXeI(w0Gk5fspZRQ4UFz)*v>e3}J85iJDc05fNYnzxnGtO!czGgJ;F zb7QDO8-Zp^xQrHtapIU~L%rJSXpabB^jRwB4)aN9a2uKCNKi$Kz_`FH;$ewxy)%zVlZwTi+vcrZHnee&_s(QV*)hE{+H;@D^D|NXU=atL?P7pQ_e z>?h&D?U1E>f(2R;CIsdXk4S7cSt=sjM_;50Avts+^4cwyN(okICD<7phkeBVjpZr` zHt0*#GdmoC5v}cxO9X-~`Z7!y%$XfA)DB;&CfK2sslrIk#)!ps@1;7zBQzLx7RNao zvD=PbY9c&At5DDGaGpe*wquvb1V^+gOa#m&{)V?BYN?a(41I+vg5=V9Bi)g-)Jt$i zUxkU{xa{AkbYv`139e{0s^|_^;2VRE{H0+69IXx$19NA;G4Ci{8Yg(5HK<}p?#4F` z9fYMRf+t!NCXVBtedEi{Ovep-S%X1V*-Y(3bWHXtXX&3e1}wIn=SS zbU+9|>rthUyp55I9eYbhgjZ;Nm^6-eHgdP)Xz35(HQInGy~BGFdD=lQ&=Rp|2uudd zCmzMy$+pZy3`HAKWsrP2QPQ1!%WTAO^bOcK9G`uZN~g#&7x4}HCiUD7UtkoykFv~1 zj6xg1WWoH|QRbbB%RSQW#|hX+<2!AaFB8+z zP^$cnKwxxhr{l6JF#`>QDS!pDqlY@-%j(1|v>8y7HGTh^1&Nm=gF*c8qyf>9Q5E9BoZiLY`@iap)o} z+Y&3#Hn2;$GqW*XU3JTkh&c2EDqVkY5)<4-UUnoB(6+G4U}5pt#ID|DXCevxka`(O zue9cM4KKrq)o44IGEUe&7T-0sOz*Iw?WxK;!hx}^U9@FyVjcPs3=BS-9Xr&uvFuB1 zKtHB}k!KrY7rXYB(ZnY76POC_>}>3A*U|DTVhh@VsXh)bTSVTOI zx0`JxoY;xRQ=)_5P^Q}Y?JJHWzS8yWsaVp&+D{;hbv=jBpj!0mfLAT6G60sNU z47&;z&5kqgR$NIX_M=^>SCOKPaSq+8D;Y#8+7+gT6P=Co>egDxAr7M5sA@Z+Cvm~u zkd=JmFd7b12aAcvCw7~x6cIdTmGiB>uD;yFw1@(s&)&)r@elenj7}fTChqnet^6VWL(}P_9qE(A(;i?IAORRGjE)x?2}Y_MOL{;ESNB=;f_pTl0mP`Dj$gr6ArrpK9`+j z-mADOMB>0iP;Vg5H6}Uqs;-KVxG-;EH*x1?le~JhRwYP0m`Li)opUEi!M%`G84@2R z3T6bB6@Q!9YqBaw62L@LjgYcBZ}WOBRuxG?m>AeCoUHv@e6Q{5Ws)!^mP&VU1io$U zbzD^?iD2Sjx54ML-wyS{SJg>kn0V@K{B&N|-dNDN?>M*`bfHYD>C|Nrypk z^0UcaeRZpkNMOu6Ds)HwBssW`yy{3&#bm%>U@N61cFIuS#;Pw#8}pt@my9%~ zEcWfKqDi`#T$nlT!feWJ-_hzTl0GJnYQA&fB;~XZSi_Pan0%N8SW!Hcx1Vh-oOAZD5d^Q}dZj4*|;dpJe=RF!^_wK&pk%m?bd9mT*@gMOK{B$5fH2zDQQF+0_~ zUvVv!WQr-K-bY?+Om*m2UCSWBFeNZc+{M{cuYRqy9MWCPN2=w{#go+Fe#lxr$pTXf zvjQuLrzQ5AtQC>&W6G#jNF|-Lync(dQj!&>9A=GEvQNYJ+pblRY%rgw);mgpX|4T^ zYXp)lrUGUIzLcFd)DK^)CfQ*ssW!+vmgQq^& zxpb0t+K*i$lN>Pwm@W9Scseg7YORy>3`3;;&z4Y{lC;)Ka>kHg4{?|6(^V)LYgCde zri%J-=W<}W0VRKJm;}dE!|cGy+3Dt#(zS7t2j(-?4yoLj?m!`|O_4k?H86Xe@@%>n zrEYDGL|1oE?RS(<(t|1FH5$nqQwMtl28+K-r1Y-Q*#=BK^$`-R^Dd7vytYB|#WcVk zWEa; z$&jYxzh*rTKcRNL;n^DSL zX5>9HYvSzJl^NefQ^FBSAup!uFF)24w0#ExW?XhjL*iqQBYzdjyS4=uhQFlX%;M=o z7XOnRQEEP0pzV$IPOkHjSAIYOs5yx9RmszRmtAVEKF_=ZJaNU&WIi0&a@9QFo4HL5 za5bpPpC0BCu~65^k{?KSHLGfQIPU3D!lJnIbO7vTUxl0g@3Loih)lLJi0TSg`~2`~ zqQkmoSa#ol=RLow#)k`WMfG0=bNC0j+~z}WOMxH-tk)?;W`p~lT(tuaU+%sX))s%C zHh9;qtZG7(Zr!$tuxITZgu6L}&Q3d@lgQUudH;J5>(;KeJYD=9tq^RVt1*=8_EZ0> z=uc|E8@;hypP@;&;hTGzM{%z-&uirs53#_VuKyCn%e?MZ;b0pd+Hu3l{GA4{!RrQ$ z`Rv0i<~KE%>`*^0eSw7K>j83bA$3kM00=8FT*=1_L*TON0$J?w64)D-bVS++0IQ3L z0gyMhZ&nq607%L8YRRm9Y9x!1U?KmAz#tR$yqy5zHra@-4;sNN(|CI3zX|kYNFDs$K*~e)>%yjiz_!^?xpJ1c7i2oho-T`?>7LTy80nj znfqM{bfx(BDAs+!w0yhw@MD1Wnev&Z9fMI{a8(Q>=j;$OnT+=vg(Q!hBLgH#CH@S04fp43hXT_xkhkyPOcK?R*>S#&Va58jr`H@piV{fU3=< zPwyv2J;JE?m&=&LKLP3bmvYO7LcerWP2mrzwwH*8ld?k`)jWo~nN5e!HYKXLU!0Y|V z(8QMsHCAnQ5v;2WE!W&ruBy-O=wX-Z$jx%=T*`ActjKI!rM06|2l4BaEJ9aPT0F_D zH=SFCBszU{Sl0gZ2U`H+K=2NPw*Wt63}0M2nkP}_w)IO4{N+qS1A+_#EhfZmPVt9n|1 zN7%z}W}mei>3-r=9Z}GRaNh8lEgqOle{)z}S>HG3@pV>OUIR*xqYj3m1a73F_o%-Ur z`=Cp;>Dgzu*KS*<)?4d7M}9MXFFwS*boi39fqOm%XsMW8*pFTs|>Uxeg(2$<1WRou-n(G%7z22>pWa1JIS(4Y)-!c1mHPk9H><;{5dG%bDZ86HL`&vN?6!QDFbgzld zq6FJW?bmF>{9}KkUNyHx4~E%mA&_5Yp?u91m+q^i&ZKKD@TO z=J@t>J@~vsx}!ks28A)_ix=oWY#{j-O)gfbZp?utA*Uzg2l?~A{dWWdL5Wk+VNYns zU;d~5!AvlT93F7ZQP`z_>`S-H`VHn~e|Uwg|M}oJ__WabELCalrwV6n#7Uc9`g8j(v1s&_>$Je2?`tk6Id zEg_jmA7-s?Ur_p$F}j%6>yg+GmfjdwCw-@JA1~N|n?Qi}<8Wca2Opz{Z)|L;3uvEF z>ZLN|jx?0xS;OJRV7^Pq&!YsM^_3@4Z*Cc>^UsDhMTN?!W{Qo7IvXDdDo3Y%;$Sc? zya7nBUi^W}ihj&gVk8;z%K8rN!XaLp^6CbXf%TKd$o-0^8W;L0ur8Z*8{(5*8&3;$ z5=ZPUR~wt@B-0V5(?#l;tO9K%dK>$h05h$gM@n*?D@0s^-#%l%>58ddS^ z;5_`XDAW|47+F6Aah6aT%Y5uJ`auT50|IE zls-slH+*()&8L4h9D~V<2{mGig9F9)kZ>#~@=^)GaV=S^CC3bE9jJ!8f-b4NT!@VegD zjyUsUkAdYbyO64?$tBN9KevGAw^C)@zNR!!-dVzbz8-t=)gTW#rZVlm^QRC}^0mT_ zRUcE))QTJ1Tb;@_@cvIV<@>gn()+f#mlM-_yiU&SgS;^fy0f_|yGGZkj4Y}4=MjYx zE>D=TnO~@3>vw*XVi?1oOW|d*f3Z!if0b*(&~yQ;R$@-=q|O%*FpAl1@_+J$HTS|$ z2jlRMEzFT_(1KHC-r4+1%+iow~9^BK(`bfE#k@L zz*qlKa}6V^&We@+ujn510zFNTyUG*CnQZ=|Lz_SVJDDraQgdPUrTh4y!i&1*H(!wW zTH^}k9m!vXBc0dRbH$e#_U2-D%zl*z{-?*;b`{dtGyh{J7nqI`aLo1pfMJ9?)_4ZaH*;A?xSw-!X*Q zuUiN0ao;@y6(kjpof+fwXRsdO0ad#WjWRJ%Fi0-9aU1nH_x9d`9Q}Qu-_wSXwzo^RVZS#K% z%5T51o_1axG}z2*GfI>Gm(q%YT^<<`-JGO$<}5zk&xGgd_uUa}9g5s~zC5Cm+G{2u zA0XI+wlGj2XWYw)a+x~@0rZ5y;Nt~9yGY5G)-Itg2yRE z)jwb06@#Cfs{E^amtat)el)sln^yBDQ{_zTS4yS&#?U3RV@{|84FZ(4lGHc7sx}_N zpp<{FRh8;$)B($1@9dnFg;hg>b?TT(JV(HiOv>6X*b}@1+~p-48rWI?omDraLwsLa6lcUS{mFG#lqK#DB<>b@BUXh@QV81 z)9g-m06NA@K7Pi)CsdoYpwduc=|gbm$iIx#)Kl#ROs||_s&}`cBDI;cp29-@m4uCn zbqnRICx|`B;knWcH2U6I0Pn}bhrB^1~vqY@!Ih}tvPMA3Br#@K|5S_}p zZo}`37`ZE_X(L@4UmSa^wp*z0vGQ%uSK?C96P$3_7;$jI&og=E?C%8T+xOMihq>|#> z_wh*P`SIG34+_{c2L;FN_{p-658iDv{-J*6k0*>0uF6@G_$DEr!!@)`OTo5{?7S1w zecYRc#|oQI2l^T`Fr@c}>2k$0xJ;?yJ0#yu<~pzJnO=@TOz{Anwy61y_}&IQJE?c;<%`?XJ>wbg7h25eAlwG+_~2Unlf z7)@m~BM%=!Q>x)+S@jLK(U}8_F0MbctnMF_GzK)Y#k0BS8F1A?F=xVC!0qB>_wcmO|8JC`#Zh;5 zom0~FPy3N5FU>(jwYpB2Oa6Ui6&Bl`gphm@Br>Wc|3;|8{9}u{6S`K@FM#XUq*Akp z(Wf8ICiJg=^Wf2&n!${v(KOfIP3K3OT+osf)4rb|M>x7zLrj)i5M_EZ`(jx#c3pkz zkui5riN^ybU^2;f`_>P!1*KZ=H_g9*=_L0UP3OnZLvIkGqo94(!XME~7eH|n0sos# z=NKSfz1I%JUqmuQg7n)9miT;1wWv)TAc@GNj+_f?szLGB$0Zhk{Qpv`hRy*pzFOLs zC3AT!BR_RaJ_TrgB04#ec8rL~x|{Roc2!>n{5Y6k;hhfbytz{F!w*Q(eI(VuQG)Mp z+9>#`F%y~9D1~(3j;RB7&H>~=HvLB#(Y$?;De4EGCa<$8GnuqMK`cg2&n&o~v%>}% z6#4A%@=hK77cT|)oSH(^W#~4LC;-d+jPZMjh+&S54WCMsXeYNUtG(l9TaDc_$FvzT zP&pFr+$r$ z_}{OlIY-ul4w6-!c7?Jhf3KUy1>Zi9nkILqF47|ulfKDdJJRpGjIHcEg}^V@qJBCv z{)J2r?Xq!B4!x`YF6VMn)O`AFv(=%JxCZLybC+zvk?3zm{>yg;-%r`bUXUVvjkfO% zlm*M=9o?6Z-xnmt8LL4cknfAvEPRj7HS@>dJtLkq`INq=F`=b+uCAV1u2+n&PjW*nn>A<^ z!ylIYE9c%>$<<#yvpHqlJ#kSgyH8}~<<)ZW`j}O7ysYgNmb;8SE-U1VG;{C&UJB_- zco^=v%$^CGK9lkEa0#EW{UEi~u$VcP;#q!hG@2Qow(#dxm3VC8tzT;o#9rTdSbh1K z@aO4M^}%P?0`2QsbN*hcPl zE~#Fa+3Au}*jtJe?Og3dRDX{>?wa%s{@z*_4 zW!I~NvA@B5cO$PD#5u!6^4lCcGsbM3>~;cXhBDO1G5n>Y6Z^ky zN>B&!Era20>7%dXW$^p3tLfykuZ_I_HKu{3M@ES)IIv? z?Qg$6bx=3Vjnv9T8GRAApDkyPoanhR1<#6pk2^I-p#O<74)Pg$yzEe;aeN1hP5(yG z8n*0`;VtQD-2|5sA9}3%Q$6&l3XR97DetSjKdr&&5ew6^cew6pc?Rq>yfOUIGWbKh z;r7TilSgbc?rYPb`YTaow*~!|1*S^{+@i+1Z{x2H7;Ga+6yjZzLY%M`su-aakoRF%}n%LR8AUu$fK@ zX*LALwW33aK^Z+1`k-jdW@oAq3YJXC|74{Azx4SV8*`U-|NUv;aZfh4u=*Aps;m=W zc>Rhi@OcINd3)nBTIb*WfqZWfWVx97ZXIe%N6K<7KYCnyLvlQG2K`F+w&h9w__zUl zo!_PQT6Snye$dLJ?}Q_pM+!U=7wDz#^OSuwf6R!2duJrn>*ZIy}(wB5d zu#(_S*Sj~&s1h+YrGID6exsB-W)uE$s(YerK4x}Z?>dxvQC&XJ6mz4-Y&;nuq=A?u zAqM4GU2F1)Td)}=H}P7rAtr>q(^BEI?Q2Kx&*1+<(s>6p@qKMP6uYQjD;C6tT~Rtx zr710;HwEkv(tF4f*d7u{fFP(Shy_t;7K$K<4G~dMq)1gkM5!uLM9Rx=-v4%X_LjMK z=FHyvob!3cYmVA4RgbFc__(2fUB7OZrhR3{rnM>W>LYj407tD@sz;nUuf;8_eMGOe zh_*V%V@^?C9qT}ckrQWIbdWtg&-Y24-WxPK>`!ry;x+k^LuQNRo2t1NON>MbWrtqe zGQJmj@W3#m?$&B$(gMY)D?A}`h`~9^Y4K6&u;Bo(&br>t=EXon>uKvQmH*kCZbx)uFj3xPdj&#gUcwuztdQijC9WiG9;*w|8^S2(k zKIiGouea!psBt7%STFk?#_1ea09h81*6>Q(5=Qdq=c~UHFV4{h5;P`@3Hei}Lq5tnL|z zq%2^Z4Su{%$M@g{=B)4TQ`?cVwy*xPPGJ9#U-$CR+mU+K&1pwQiN^6NljY}5>~N*7 zXoQZJa0x#%@|SoWs62cAt$s$nt82LOr00u??+w@9nq=I6NR-w-^DO*BAOKE&nU|Nk z`S+r$m+oYxI{Vsp>4EM)`W3aR3$`UCy>dQ%gYDULOT8D`StYvqDrDRF5wE7(&feoL zS$BkGzNfRf`WS{a;)%mDifsjvNn=Sh7Q?{-!GJ9;6v_2SNZO-Y6K1*c1Et*rC% zeLHpydnrKi>2kd}Kl2v)E!w>x*{BB1cmo`7y3-nt2h}$&ESH|XH*%u*&s#rBN(*BbEl=c(OZvcr>!6TpB{gtV(FaTB{{rm zU;gfZ^?MR$XplF$KInz5zQa4OLG5qf*f&}{n7-*z*z@QkYbfVVR^RLT^XkB9%$#IXNqVmgZ+3#FxALH8VT+zPdC+7VDw z^h&s6WoJ`qh1z5F`)N6ILr~9Y^$#y9G;SOhEe)EtcslTDb<~BQkP-iVdjCAZ@yJ!S zU-rLt7ixT1o*QI`#oQ2|&meEOp|Zqqa=z|~dpEQ}r`G{O>Y7!=7_)s2`@_F@zYaE8 zsjoRuTe$CpX3UrU{a^AmmpvC=vOH<@?7|0%OQ=bO^_ummd!N3jjQc+PYeHzGWtmpT zzpOv&d^2L6S?IfBp=SNocv6AZ)j7Za{P6}X$~FW)&z(6b{{B%Ew#6vhm5~0tBUATl zNPptZr~upcSEr=+3WBeK-WNinFD-Y*j=Bx%k-qi~E;kKoxjO^AktsLETs`Z3`phw4 zN6D4;?Dd5+IIH&+Bf5omU9S$D3A2B4A%(rEm{Nb3{wg+SYt_lR)c%5-iKPx2I@@T@ zRmFF`*mXv`mO4LbZcu6)Nb3UGn+?xTTyeaZn)~$Rg}Mj*`liWyukBdfPrI)^beGO1 zf2AHFKFY{VTz0Cg?#p5GaKM{Hyzz+aP&ED3+_h&UC7?XOv^#IjE5m!O{iX#1z@2_f zgR$99yKALuVqf@0kGJ)uXYUsU-#gns$}e4Hw&s(MSIm|lE%LCR+pn)FcU@o4m_9}7 zI_U3G5XA9rZ(PnS_Y3ZtJ>XW5ebj1xlA-s%L!R{y*jd@RN1wVj^(E=Pj_g`R4=@bz zeCE1aw_0g*CHv*?B}HKze_{upmh#}sy?5*t#^-sure|`Jb+huiL`~Gc_XGAm@QY`C3$5L=k>c~Zf2;lZbH!cPuQxmprL-75{Dz33CFKc>Kr3WrQW&mpD#@o=fTm5rj0)8Y#DjGi9olio88C`mFEWh3}^b zyANz5%V&TL*AkuQ^#z4rej{yL^lSlmW9TDIqx9U3qxPw5o_Ta%Qr`Z(Kl@_dfuXa& ztLVU)80*-(+$-!MFV&^7qTreb;b*VGCCS4bDiy?Cw65{c2Yu+JtcR={#{#@`j^>4w z+~#`EcRiUzYm{7gU+0>Ybu^_R@J(u*1-H9b)OPCtL$Icl()g1YzOC#-yL7NlpsF^O zIzEILDGOAXX-@+NO)FcvcUTI77hA-nb#o;CwVnaH?wvi2 zRFwUAQ8*S(SlheW?t|#t;^MSpgDl!d&k+9+b3nDLF3l7x?Ebi9z%lhA&|qOq5Y&`* zw{r&it@D6Y)YNl_e|=FI9QrF6TR3;S<$_PIEh|IHHvD$Hb1mYP<^IcWY9>u~EpLjn zZUfd@KK!`5MJ3?p{T$PYQ{whD!I#zZD@Ob7{|$E~VGfU+=k$&^eR@^+F=TwpgI(^@ z%fd$p@Y{2wY63lJ)Y^T1v7i?6m>6$bZoGqS<@!0iZ@J0d4Q($M1sks~&+GWf#I=Wx zOoqQyL^3A+e0gYhXhiq@)Q+l^(cM;^vDA>$SEo5O57y7QwyG`gd+VQn55yDb_JfUD z@fDlXLs(WjpZ%xyYNht|k_wA-+$;9vN!JSjtLB*Aw${3}_g&f8mI7sfn%s2u3s$<( zp{HY83uXy4&n?~Z0!p{5{2F|6;;cyh^nslR{cjQ7vQ94N&M)CTk3DkGu(P0U&&?3? zb56UL$nR@arf2-p3*BdEXz3D&tn>`*WW75TM!j@FHYZ0ubTIQ)eO+}Y-F!~Gs}5ng zP4O-1JNxY>hL>Lv;!zKq>RanGIXzqdXuO*@iB8RLzje)xV7=o{=YZCy8@(;G!S}3I zApGd)UTsoIZzX4NjP=QEQ0wCQi1M;kpP)hK(Jv3*2mZ))wR$wzo;p}2=mdUijT0j- z&zO^39BdSPF&h^DodTjBg?!2w{5bma;mG7aMZ~Id4lXHobOv*o+oicY^OSkS|zc~NZw?WZtxS>a3Vp1U8*M|LM)aCFx`-29Sv z_p*C{Ysr%wwn^Z?hDKRZua4R+m_2ACHAzsNA>5% z70qi~uBF||DtwmzvL61Hye>2M+K@8qWJ28u_T>`V#r-KQ>u*zhV|pmRuZ=U-mhNnQ z;nBUJI_m{3b3C+e!!GYtp2kJ1?w#quv$$hjVoNaiwMbp2(kZ#~^>7#oGKJ}(& zlfQ-G^-Cmi{U1;LL%X_`Iu;!`zR&aRzUhlkiVU;)!}({#W?s38ZCQ!0CVOtMr}(!c z?kxJeH@oQ7;@`OA8il$WN|(aJLJ0q?yv%bX)c;e%;Z~nO(v= zuq*!G+wmiL^x2JZtx*jf_K9})D-?jU`LBN4MImtoJ3kXfMG;-0OBTmm3 zoTJas^S;)aD~j`}VwU&0w9u9eE#H;2(m$&EbhQpPJD<+~>ye^eUKc!n--`27YIASI z6(Z!P+~c=T-Xxf~Y`n45Q+BIj`N`YHz7`C;k8R!pNnm1_Xp!3<&Q`#46^*97yT;>Q>isPLEk%{q0ec%>J^PAGunF#s_G@ z7l|wt+vw@`goC`DPA5}q^MW&%fFFN6TNtIG0{%3#7;SXyH_e|QfMq$S3m21yBo&@4 z+V8VbmRDz#4U+c9+7FGk!^;Uwi#KVigu=|W4};{fKfz9xIz?80U-xgIBK^rV;*vWn zhN?*Y(HlRiq)eVwe`u9)_3ANqF`;5(19ul2aKC9~>Q9vBT&X}-!>Yu@&zW0~8nhXJi$wjWM132OV&A*ss& zHr1<_94?DN+A>1o>omVFtm~Sqxhl5Xx_-dbr10Uk`u_D!w2P? zMo-(GPA|7|vpq@rdxeAW(stX<<8HOWPX~YPwODq;ropF^`mVub-SP_ugx6!LUtGKu zbEx_sZQW4r+QsN1!t5()qqN&?`~OV2@=#^F>)=-}d)#zI>TROol6=qL!Jl5?J1y$d zWF!n7@ceg+z7V`^os=HtHnX4K=l%IA7zD-x{c2`PRo3=OhkuTK|93aYKQ24C!S|D7 z`1N?`qRB1kLFZ?m06ab>zk*z^USTwtoQh>NLb~g|5Kw!W5Pyk zpW8U~*x6@K-BRAtQoLEc=E|d+gD2vkonu<2`w9d zKJTYq*!l>=YOHWv1S|qXYWLO`VdU`h1r@2Acsb7=oNfjD*Nhfk(qtT|Vfkh~ z>(YGsUzXmZqP<_~FM9putsP+ZUle~fSz3}V{lf`X+pV=9|I#5{^A9ta8zV`3T+M`$O+FP1;7QECQ>$v~5 zA%OgDqBRAW#jDx=7wBtH0UsLPn$1Wmk{Q?cjy6P4ew{6Q!5A)5J-UaW>I-K*S+N9U zdOy%Rs+C*tH)Zq;sbi<(wFl!R`*YX$rcWFk>`XDzE`EELrLwh=zsn)+TM>JB5%}k5 zu1P?Hss;Ehj8jppN{Gxq7?8dzVdU_FY-^Pbfx2UQ&r+^@C~)k(iPm}q=Hy!2vWk-U zy|Rqq5;#z&+sy19rR$PQ3|}LV@^-BXwXwAHnTy_BL4}}_Y~RiGC4XtF=Pp|G?%|EM z|8k=mZOxWi|8x@4I_}O>5Tbo6D60x)3LNF7PgA$&CHubaZ7lgx6+T=#zh;l*S=oDv zb^4!@U$$id^EC-sjSaiX7mn-%GRjm5)Vv42ZMz2RN9RYBy*uzaI?rgZlk(fpx-vqm zdgJ1?D(`*MM~CiM3&gVsr-I4Z+lmKv-O`$P1uZGxJN7c~TjN~$R7y~u-8yOI;+sQ9 z7`^6`hEbtW@DAMQGX-IL9xJ>5yK}*Kr;b{K3a}7->~yScXu=l?W^xJJHtp`{bK+;U9%er@J}b?R?v_W{9&~vTU+Y? zCq!4?_9UxL{PSx6TArdg|IM{R<v1#%=D@{4g_RD|Qmb#`NXb8HQTR=+W z^f!I|u9T~+Wcaz}M>Wt`<{tI^BC7dO6J`mX=N_okfQ)tWh0S9Zo?ceOvG4QSYN zU3(yCcy}57o)vyNW7w|UnOFY`XdjQO zD^lzgyf8b1^&TGhF)7dwqL-ahp6I;L>su?}8Cx1u>&~fcG_LqH7RHVU8>!9-9Q6eP zs#<#heSxryc>9}!U*+KDZ>9cLKSY5IJwfOEo;8k+{vM7joqqIa(c|(wwIgN?>Jy2@ z+>s5zsc*D{Lgw@>2v;Krk}IXN$KG!JcyfP-|EA1@59TpxI_bAUn(hzyFZgF~>3=>U zv!*%Z+Pi}Wle?pg=p&a6d2>Pq1hr<>e#q!x%Wom#9Eq!M+OOKw+RYP`6DGFtS z*V<+R#l11xfZD4Gh2NVi78mRwKN~A0Zli5F)6=X!vD$-NKUVoRFD*IQ+3f02Ej>3b z>tw*3qk-*H4hxqAE^}?l2PS~gEgHmKnMo^a$>RXeu7uH;UeOw01T#OGoYNOnv#+UVDu@K7P*G8Mf;wzko+0 ziRm^OFgRxM&zWS|9e08Z9*0D%Z)@jvYi*(a`l|xr{eA<-owsUMyHfk3 zS03@xUbx}p!@H*k6BZ957i!{jey7^ks09CD{81TLKDvFk%k*ip4>eB}e<}-u{O;4< z@q-j)%!``>rp z<1tfuE!UzPKN&F#U0aMM|07V3+_Y*fq?7Yg$7^UwGkL+KISs*#mf?^`%T%6B3BElp z{~Yy`G^RVTc53l-^z`%cj;LQXV~h#2DedX_>6hhSqkfbA=1m-#(w#m({kr^H)KJae z!3ki>YC3)TUHSK@KcsQp$%|8@>6_Da!n?$p}pxapVEU(0_-{jHf`%vhFPo_;s|z5Gwq zIB7C(>d187^vCJG@{y>2HIsu=z;yZa=jos2V^I^NnHgQ2u9^Nm{il39YO-c#kcZQs zrhiV4l}|*?%qMTUWqNRWY?g#Zieb4|j1dTvr&;&FE4}fN%IcNb|f>xk4co4J!Z9zNG z9&`W?frmjy&i#uJwY$f8}tEvK|jzR3;>USN5Mca2n+^~fycoU z;7RZlcp5wdhJc|U84Lp{AQhy6bdUiuK^DjcIUpD0fqYN^3c+wt1Oi|LCbNC zOb4%kSHWxGbua_G0cL_X!CT;MFbm8EbHH3M54;231@D3P!F;d)ECh?d2VgN+0zL#w z!7}g>SPni0pMX!nXW(1Pf!*MD@CVof_JVz2KR5smf@2R%jcv9ohlygmyu@p*_%E zNEg}%?T7RreaHYZgp43#$OJNl4nSs*Ib;D@LROG9bP%$EY#}?y9&&&VL5Cqn$O&?W zTp(A72$3K+$Q|;4JRvX08}fmCAwS3;3V@D4N1;F{2nvRdLC2vJ&`IbNbQ(GXg+QSY z8480a5EY_9bcg{lAr{1jI1m@&L3~I6388RE1OZS4B!(iPC{g)j(*Bv3RY zg=A0+6bs2A1r!IxLkW-)N`%frNl-F$4muBAfKs4~&?P7pN`o##>ChGEDs&CH4rM?$ zpiJl{bPKu-WkK0c4wMV!L3g0L&^_orln)g^g-{Xn04jz`podT?R0chQ%Av>56X+@Q z40;Y#Krf(5=p|GIy@INt*U%g2EmQ-&gWf~6&48X~|duqvzutHZP4+3*~AE<6vO4=;ch!W!@*crm;L{tsRXFN2rEE8vyzDp(U< z4X=UM!s}oycs;BQZ-6(#o8Zmx7FY+~3U7nA!#m)e@Gf{aya(P3>%#ls{jeUa4;#RS zun}wwo4}^<0oV*Shb>@B*b26W55hLEEo=wd!w&Ev_%Q4UJHgJd3+xILVG`^HyTcx^ zC+r1#!#=Pt><9b90q_y{C>#g}!NKq`_&9t5J_(&m=6nJAsh~iU;vJQ#c(7X1%ogI!!QD)Fb3nW1dfKKundlYV_`Y0faBnJ zI006|iSSuC2~LL3!RO%%a0+}8z67VjY4Bw@9liozg|ETa;SBf&oC)8AZ^5_WEI1p^ zfpg(J_zrv*z6alj^Wg%x5H5lrz{PM0{17gM%iu?FIs6!Y0zZYH!O!6e_yt@Ezl5vc zS8z4_8h!)6g=^q<@O!ux{s7m(^>72+2!Di|;AXf5ZiU<6cK8$g8U6xyz@6|{xC{OU zcf;S|A8-%c3-`hO@Blmr|Ac?Rzu_VH4?GNyz@zXO{1+aF|G^XRBs>LA!vsVHQAN}c zbz~MY8<~U5Mdl&%kp;*?L<3obEJl_f{~=3}Wyo@51+o%Zg=iwHku}I#WF4Y~tVgtw z4ai1h6S5iEg6JSyk!{F!WCyYn*@f&z_8@x^-5G29{fHi-j~F0^h!J9pm>{Oe0mKY3 zM=TIa#0s%S4k9*)EnLC=!SSA;HKox2jL<-gpUXi zArg*=5CDll#7HC(g@6czzzBk%2!`N@1c^qZhzyBAVi7r_K;n>iBmq$(iO5+b2}wrI zA?J|`ND6WhxrC%5X~<GrL2{8if@AX+_$QcH|TC8To>AAf3opqzn0mbR*x9A4m_F95Afw0_@)sFL{vi{{Br=6eBLq|hRYlcMb#xXw8=ZsBMdzXO z(FN#2R0CavE=HH2|Dj9KW$1Er1-cSlg=(U!(KYB=bRDXNu1B@e4d_O66S^7Qg6g1K z(QW8=GU34G1AJs$kQ3KQvHA0P16VwzvfSRG^s0C_?TA|kHLDUAd zMeR^~)B!z&9!4EeC)62rL0wTINaN)CcuN{ZM~206l^pMFY_wG#EXG z9!F20C(%>rY4i*lf`+1GGz_JnRFsC&Q3lFHStuLjpj?!P@=*aQM8i=L3ZN0F7>z`u zP!NSs7)4MN#ZVlTpwXxlm7y_cEGkD8XdD`kCZI|*5j~40p~>hu^gMb2O+hcBm(Wx+ z4ZVz}qgT+Y=r!~@nt|RxGtryqE%Y{;g=V8UXfB$E-a+r8_t5)jK3aelqDANfv=}Wx zAEKpb8Ttq%*gR}Lwg6j*X<&=6#n=+; zKWr(s3|o$^z*b_bFimVVwgy{^t;4ji^_Vuc0o#ae!Zu@DFdb|wwhh~k?Z9?oyRhBZ z9&9hBi|xbqV|tiAW`G%DMwl^Xf|+6mFf+^?v%oAdE6f@@h}mGam>p)1Ibesd!1@a`Cz`7ALfq*U`Mc{SRfXJ1!KpsqVb$1c><#u7tHIu3@3C6!16GICV+~j%_7Q8snz0tF6>G!V zu}|1%>K^($i9Klf>!*N`KN8?glhR5KsxExpD zadw`Hk^f@*6cRa*nYExl-?*@fPwEn>F)6oS;R2H7%=6rFYL&f&JVi}rc3P25RA~w1S+qp*99oEv6?Yh*R+)wF!>Ws?Qg4lawWH_%GBn`kSoHLVNC+h|(WCFBj(&$%lc zwpzdB9&^#B?Y6FBwwRdE46LikX0$GoS}ucNMe8@&&-y7+jruG4B{CJ8Md`EJ$ZHN; zi95)uzykMwg4ygT!5MEA;bHLtKwYQ-{Nl#@86PH!Ptx4P66?R*)$Aq0b!;E;T7W^D z9kx<9FHBQt;y#DRr^R?LCdj?F02;jIVW-9S{4~P~{194-_fzY=zz$*f;ax&=wu0v8 zojw;k=V=yziSQ!rgP#px5N0LZ!~5%EBW&~YW>1#r{;`m^aKm z$_qT0BW4TPVFJL#l^-T&S04}q3w*>ve^&_j&*z;x3SePR#1cT?Um7L@V#8jD$W(tX`m#u0`X@l?vnsL!XykPXZ~JRS zeiv#-{s6A}3<$SGe&ubAaQYQr`Ng^RJqpW!Cy=5cW{=ZL-XV2nqDN=J(AD%#A1}6awL)`7%>8 z$`f-7iWTLhxedjR;zp=3KWK1hrhUD+6NM1aY)&Awn&-{=Wd6mx)4a>vhvG-+GaoQN zN*OX=U^#3)YW~;!-^@3sDDgysg*`uva*jx&Xjq)pXHqCm`vW+XbfSs#dJ7M}mhD!H z4Ym=KQ>u}aZMFs$Mi%#o1w@R}OqWvH=qLHB2qX)43r`Cl-vo-EMSw*Yy^2WXpQBu$ z^wPsDs1|0PX%vn{Bk=+Uun=1a!=s#Gi^HCO>4o}*1Q*XNN^xW^1@L9srdZ@t(k#*~ zu39{#Xm852D5qpwiM0L9#Jt<19jc=Z{(!KP0wfHzbQGMFT-Dj zFVKG-{x-aib5!C_HDdkbtg~zmXo~pld(c3g`k%#Y>R--rMz3|Xr-9`ns?GsZO9H{n z(!z2%)!Nd=($3Ps^01|orHkc;D0j=1e!k9IqK3i&h7R?x*OoQgsW4+F6=l#Y8?1Gy z`l|b>iwFWs52_(mYi)Bz$kF9#tSv5cD$*2HnrR8yIE+d6;hv7>7VChCZC0%vI zlWIiWCO$4l2fPbJ~GS&EsVWZ?TmwhNm2*nt)02mgy1sO#_9*-Dz(XOfYD~>Z}pq;#qJNI z({A&DTPKUVSLQ^ICBj5 zA)mA2a?daW$n#A;P^a;F>J6(#Y7;ffO53EB8cNnN`9#gPS|AB$ex(|iES7wy#&G+n zDB>s#P)2(;X`ad?8Lq% zi4tF-m3m*J-IN>x_VFA6d!aA;kkA!y5|V(|-gjvCC0@Xqg9+l(?1Q`s3sTrai34xF z>$u-B;2G_yq=L4?wUTxk5U{U`t0dmMh5nK3HxfE8EN+)P6obM&{tO-})Du1xcT1j&)7c_kpCnGmaUGN-hfUIU`lN)JIR25G2b}yz zC3ETX>1o0OcC&a&(ki|Vl(KIKZvyJk$NWPKPWXQl&yW5tE)A<ve1Bc~8J{;{Pk?gQXMk4pq*yz8THL|j6n);YTG-7F_pzsMkAB8e`a?duqrbS~ zK8?bC(M`aAk^0dJpLXDye;rRVGSfeZJ`rXS-3{~zRVlr|=E!{ipTe&yRQeJkoxY5- zGtw#giN7Z2l=(P7ik<*UeDouyg`UxCDc;c&j=s?wDLXjTJ`)!6BldD)=^EjSBhExG z311qKNM9D7?eW>iBl1{;X1F!yn~#gj>Ar#Z6YzVfA2CBB^;pOyDN}I}4`oVBAr+Bdof0?abKsDW+FQjPM z5(wUWfzxK&4|F|?dU|g3ZrhLaNDj!cvuLHC;JaFUqNhfNgxlDL@%;iGM}Maqda}YV znRCJi={&x*r?0J$FNz4Xjo@G5{G;=HC+Q8*1V$buNB=IR(ureRK$*)3)R@m$$hd|t zVt}@=?NWxsHhkF%Mj0p0Ho-R0_Ibbs+nP{q#?R=DjC9)oLmkEq+X397@>K8;Txljr2@ulH4$Tu$kcYxtoeJY8+&Ydn8-C^@1X4 ziD8-as+z9ILb_k1;iWGMk{XIUyrS&V7_i+HMgw;|rpf?}x}r7}Gf%Y8OJJA7AbAB# z#dgM`RbF#r&)Ch6eIQ+Esu7#621}K8I)WC`6NU%txv5OrL5ie;RA;MdMuPMWqnGrK zA*DVyjiDCX)iVwV{*am&qa;g#1Lq%Uhk3g6jon4+HL0alH{*uX&Z?Jjjp}GM$jFv{ zw$ruGo{6-%)NZ>Ub_W*D2q+eVc2kTW3<5J*UzMrOjFHY^PT9?4E?|0F-85CVZ?b)E zx`Y{Ml`mb!ER?Q`eJEWJ8y0KI)Ur2Y#u;ieomm^1O(aaZ&EAc*jj0p6llh!+&2GQF zBXgUnF7pI|9NQ$?B`cBckx^o!W4#y$n4S9OOdAJhmc0W%mdJ9q50CY-2Vx^V#j*WN zF!ljqkcq_lvm&LmSS)s@>{{$@*-EB2^RscSb3cBDi(37}KRUmllE^gfODU6kf{EK# zOKYe+ZjbYFLZ5TIJwdWTmBu`0e~R2Fjp8;-AugXe=`3V+QgN=DOPQ6JDdR4cfXsY* zITvBZaWy4Bq>0?e_AyL|Tw%Y)C4ng+pJmqA|B-HT8Ihu9DNL1Z+g+}6|4G~JC#4 zbB)YZ@|{r4b(5TNdClA?d&}G+qr22G*T!y_U5}N-;<3jh^w@>5kw-o=S+R)*aj|U< z39;pjv#}Csa_mk)@665|X6g!@nBEQqg0I7r-4Jt_xzcKsS<85CdcxtH^t3~W1KB~# zisGQcYMptO!8+*v*( zlF3KiR1T>fI?bAW$X~R=%~L>O1&UCwm4}Xt)*RxpPKo%eV8L!T5i7y#q#%lAa95f}`l$fNy~z?onZ0-}&_^EN zE(CsZ>E0Ykkb#wK8DJx`Ivg$`)4aroW$W3?h5lklvYB1%f=YtK+u7@cyV>3{UG^FA zW}&|kF4Y^jCAvO#p?|lk?BRZ3jfNk`cJY=qDRA~WFL9v z(cMDT7!^vNa8u-c|7J&>$e(~i^pNmy^m1Y!Z%ND`5BJy~=^i}|$UWA?{N-J=dFOv1 za*{VEVkc*w)BNy-5&JmHoZ{$)oCLZFN6Tqfj2UNT#3Fso2=B`oE)77B7Hd|CwHfXzDGFTPC*>g@BpV1oFJ!T zP6HlBgi}rzqr*7iMpVvHi~Ru%&edohML=OY-H2|}=W()$BBv;d*eS{>FFJ@H#gS0X zN5(jn5#yY6Je5w*h*Hix!g;3^8nK)-C$Z%fr>AR<`({S2GC9lHb)Ygj%jrBPH*$u1 z$iEwTnN#8v8SWo&ox=~d(n%IEe?czit>TvnaHe8W2SH7G3SxyMGa=4&IlV>}ekjtHo zxz?;R@`ujJ&c58o&X=46xHeonZV>mT^DKpv^>Bnt?L(X^mnm;!Gtsnt7JH z(q+A*B{rV9QF4jX7|??p)bu>|N#qZa#CV^+PVvWr<9OHXU1_sVet%@psunn=P;8&Xw!Y=F49)Uyxrh z-*Okr-*Ic0-6rpuAD96WHPLK^ilQcNEKXhVhLsX$t70Kupg$rwBUz+S2flNSWDa5z z*?eGt%#^HDEMdEfgN17qJa1c>hj^NNNGA4dBA+ZPc^4Kz4VV2|; zEk_dJ9xjU!-<1%B3UR)~g6F015}p;?@!Z4wg%X(~Z^BO|;~q#A%VozEZoF5taQ4Zt zx3p?Wl8mgN2@y6^7|hEPx6$s2Pw@mot|DAG+Yu0U(ZpfliXXHxafG6u)(_;!(%3^Z zR8c9uCzB}hWeLJUS)%Z_q(mgSkBWfP)5qI(T@b}Et<@1Sp{BR;bG~$Cqn1~V=>6`Oq#M0H)d$}~P%)b&@9(~x>!1HM|lP`?n@~fhoh=OqMI2!`MzZdD~8OiS=K8S?*?w-fu z28hx8U&J9IRW+9Xm#D8A#~=1c;1~NQ@{{;;NY@UW=bsP1$iEbj7O;$Tng2fYDqoAF zP1;Bz5N`5s^S6<9kam&wknZsJk@QFgq|yL9u7zVt8s9n`X=YW%FAujPb#WX>?*g1i zE~FJwJr*^7uKK08a?ghFw==8xj=xD-%Wn-oHPhc2(uYN45`{ElDnfchV3FGSe3FnP zB1Mo4rHl19MHR)B7=DXe&SKe3^ZWQGEC>0qq~H8_64O#i8sR6C#`rw>U->$t;RGdP zrE;BEMWCXhCQvt`qn8zZ=Ps>#mzvL&C<)Y=vhibkerCjWFR(?bTd98Kx5nQzN6R=o%vpB4E zhf?K10=ZYZ{J7w%T+BKppou~SDPAm5s#lhrDG-u5f;)1aAf6Q=N@V4E0fKX^3#{Nn zGZ3{yxTs7XExN{fEWg2e>?Ie)3M%9?h9vR?L6V5;RxQ6EdLut4cqdO0q>0i+mj%~E z?Ow5NH$?Gn8G=r)B)8k5TY_v+w&2a8T)`E$yMp@y8)dmNM0r|ipd6Bi#aAd#DMRC5 zC_~~q_$wU%OV57oUybfT|U(UQiXTW&nZF_sxFBY*FN&YWKa)IWq<++WAbo7%ki7!YdoSb@sAab((cQ2 ze5%DovfJz=;m`PCNxb6!D7p%;sM;p_0@9))h)4=3BG?#+jS7klNZKtbDuS@EEH))8 zuq=4Hg9b(H?(XjH?)dbd|KVX_ckg}QnKS2{nY+M}pZc{(N-WhErT#1u(o0kS6e*cg zLnR z-DQ36VzYv4`k-Pwc|fsEL1skrf|sfH^<8vhb4L_+*EtqE(T^&Q$bGK&Sz)FfU;I1O zqrg(rzTilI?}8b*Y(&R`E76?_?6q|R9kh;`Hrhcex)((0dKS29Qe)gTW}7L zejsA>ibD}cB3uFy^3|M*i0pGVB0y8zx2xt_#Epns5kCC`HBQleHIE}U^_jWidBl|P zHh~$syC(U?cEg8jMr!5{4bw2=M{80;$7udVAY>A0W;Q`%X+B9~6=@UMJTh9-GSWVB zEOLl!6WKPhUF0;4Tjb1@;e*;ocDM45><}pwFVrs3{Oy~l=^nX6vs80-{L+=lns-UH z#VfUGE59V!1~wL7$j#C`89y^{m1gzI36X0xGd69|yc&Q|t|l(h3KeLkMFyJcH3-d$ zoD&JY6uBTWF>-NahwyUE@<=)c*Q7@F=tpZbkynZZ&8o;Xk?SHiMCL~3M>?6-XzDb@ zk%mZPWO-ymL7%1DHB{s-jYS?GX`Q!Ub5Qef(WuatdEXY<4tB_kSUNRlao$_A@5NtM zT-W#n-_%?#DDb|cITJZA?7rq=y!O+Q*hq2 z!EUjUh2J!uv0oy8X?$YgecWO@#a2#0875IaC09x|47SLaFrs2<#EAC=tvB}0NX;|f z=oG~)b<7x;;gsQ=F*IXF)T}7~sF4|A84IGqGdg69%ka%u8Z|Mab4JkOt0l{ad?-mY zYq`-jsQvZxsC1}#1>;-0vO0-c6mS;yrrIi;>&%g@f(}=?Kl1>vdO465iowy)lR$6w6 zSU4{&DPv)pTDT}}eM#=})Qo3&!zb1iHWY3wNl(*d7?(Fhttu$jwT6u;sO(`KVDoU&(zhj{ z#&F|_(mN&BOU4^tm%J>wQ8L;XWsEdN8z&mWjAM+Gjj_hD#(6~v#>XYojc-b38Y7HT zjI)iSj4{R;#s$V%#zf;B<3i(H<6`4{<5FX?G0B)>Tx66&N0f{-`Bbv3s8@b+(esq& z3oSB#mb^*%U1FE~aba7%Rl2TdSpKRacfGm6Q@^h0UkV!=o3$#(D$!TpF?oH?^sLI* zhJtoN{#3(@C3~_~r|-*pSX7BRnk~8-uJ0(5JqV!pTXYo@aR^tv77Ryqs@U+>}|Nw=J$r zJ(1{?8xT>SdN1E4cdPz))}#EOq$l|glD%?Wi+yrQ!(P3G?m}kgT+R@lBpABoPDuKi zuNYeEPV3v~stw(WYYm&D>kX)2i{Vb{RsH?cW{cit?l62xw=MXR{xvf>DWurGpmC%_ zL1=NCg0_pC3yvAa7Mp2K8q75VbnopIsa+Iv zHg{XNR=YeVTRYuiwRUFUTJ27qbgZJ=qbwq6@-u|>N#W`E4Vm?WL; z;2qjyF(+b9#q8B?FF2sBHN6ybCFY2BU%_#$RnjT#{g{U_k7FJWzo>npxvX_6>|64} zOjmkK`!(iL!GFc~wa?^B5jxde&^nRwbjJ1w^rL~KVfPd3$AL|gSoAA8Ab8+jE zU4s{v>^1wY{SZl(evbU9F){hA;Yv}~f063oW?5Zg*NnH!>VbO2+GMpy{bKF1Oa`>f z8XVg?tERVO*6~ucbn?=6SsTq}Wgi~wo;5dncy_O>nF+Cli?S06@0KL>)|U1w$z0kw zVQJp5@{sH|gL-Do&mLLswmhsHpD>{OQSUM3v{{DnOUbaTXDP$8ev~ZEvCeFs{61y9 zQCsvmB{io_a#~J-aZS;m6f$;wQIXNc5TDiD&`Gbvwlw7A6c%;SlSZ#}+PEOAmp(D8 zw_Y&18v5xs=eVcN&aX5wMb*Yru|xFdV#T7NnVnNd=#%n?riW(kFjg1!N?n;>2mcgl zoPJ93q|Ax>Aj8%r(U}7cpJQY7dy3-q`*Nn}4;J~3J6v?p$YfnM9xsYaJz2CMeNpCk z!!6^|%nLbKeuN=OA7!Y|a*x}Z6>E56yis&?(ybz&{!;!lLx%oA&P+p9{%ix8{J~h4 zzrfItzd>J=nX6x7cw2NXYgc}Gda~g^+fe}84e^@X09@r z6kF%=`V0A7YU{Eb!yy=3^Bd_sRN^-ku!^h>Gz$`X}07i;FMo zzGAp8t~gZpFz#{O7+nf_9%sMO6iv{*jcc=VcG;)6A&b7oJrDB#y5*MF|mM8t9YCEdAe&0TEsU)t>Rn9JH{{3E!DZi{~YKZ?-`$}bF)g*b&UUK zn7<-RXIh%A^BJ{TS8KXfXI0)e-cXjO`)FELR;U{qkChecM#fLk!d#(a%DA#tXhOVD zwm{41_T(zXaq*R9l5TqZgy9vs`7s#<^W)RBjb-)l3ec*8MqS*dnStANQ#S2DyLCC* z4_%&h!;fpxY|ux++wxn1@HZL93p@ebMV<3Gkf(X`FJZP70K zcl>|x|KdMrOG}$Jy(~Cw)+xJvc?TE&?7U5_61rs%HSdvKG@(~^?`*e(e%YQ0?}NtW z%`>hTa;kK2_PFxSCBw4kWzR_P&Ps?KmEA8ZC}Bau*z7?G6S9XTOv+BlPEHt|keX08 zI3_zTyE#h8&P$$=C`k1xv+NVrf`9rol3>OiYVqVLB`uTZOI0)?jO~b=Z1r1D1p3VtH6T zR)B593Nbyl2`j>iu@cOHm10J$3@gVrV;F{G1V&;MMq>=dVjRX}0w!V-CSwYwVii~= zR)tk#HCQcHht*>Z*cNOn)`)Gxny~HI4s0j33)_wD!S-VNu>IHp>>zdsJB%H{j$+5K z05p>>>6D zdyGB7o?_3i=hzGECH4w?jlIF%V(+l`*az$*_6hrpeZjtB->~o459}xQ3;T`z!T!Vk zV*fCNo8YFn8Qu&x$1QM6+zPkGZE#z>Ic|ryz+2+2aC^Kp?tnYuZEz>NE$)oB!(DJ! z+zoffJ#bIFJ?@2j<34x?yd&<5cf$Sf&bU7wfOo;W;@$A>cn`cM-U|=Jd*glZzIZ=8 z2=9*v;{))4_#k{RJ_H|%55q(7;rIxABp!-~;iK@;csM==-mG;TJ|3TdPsAtT5qKmX zg-^z#@fbW7kHh2f1bhlU6`zJr$7kR(@mct6d=5SrpNG%K7vKx=M0^px7+-=X;Y;yl z_;NfMUxBCKsrX7f4Nu24cm|${Yw;{xhiBuf@YVPld@a5XUypCVbMRa|56{O7@QrvO zuE#gwMR+k@f*bHs+=!Rq<@jbC!*QIzNu0uIoWWU~!+Bi5MO?yVT)|bm0Y_)dHmz8l|z@5T4w`|$(#LHrPY7(ap^#gE~~@e}w- z{1ko~KZBpe&*A6s3;0F+5`G!Kf?vh2;n(pS_)Yv4ejC4o-^K6Y_wfh#L;Ml`7=MC4 z#h>BN@fY|@{1yHhe}lip-{J4^5BNv?6aE?hf`7%o;otEe_)q*7{u}>;|A+s@|KW%* zAxsG~q8VXMSP+(k6=6--5Vk~f!j5P`v?N*)_C#yKfp8?+5Kcr}!kK7CxDc*{8v$?D zLUiBKYp7)6XG!ih1&SYjM8o|r&PBqk9NL?jVKOeUg< z7$TO4BjSk!VhS;pm_|$|W)L%pS;TB&4l$RQN6aS{5DSS!ViB>JSVANbONnK~aw3^n zL8K6=#7ZKKNGCKz29ZfH8BNR$!f#AX5`aDpI6f+A>wAy|SVctRjVLLy{BAylG*s3fY0YNCdyCF+QJ zqJh{#Y$Y0rZA25Xo!CL_Bz6(Ii9N(#Vjr=eI6xdE4iSfmBg9eS7;&69L7XH`5vPeW z#987Tah|w9TqG_Lmx(LHRpJ_Powz~VByJJ6i95ty;vR9IctAWP9ubd;C&W|Y8S$KW zLA)eh5wD3i#9QJW@t*iVd?Y>*pNTKTSK=G-o%ligBz_UUi9ZDVjUw@nK%@z2N}7?) zNORJHv?Q%aYtn|aC7Y9WWDBw-*^0C$Tayl?BiV*@BHNPAWINJ@bS2$LchZCOB-@i- zq&Mk9b|5>FzGNrTkL*nPlL2HGvMbq*>`wL|dy>7#K(aU4hwMxCBZJ8PWH32^97ql# z2a`j{q2w?!gd9$eAV-p+WEeS$98HFkW5}`OIC4BWft*NAA|uF1GK!o`Mw2mQEEz|} zlL_P$aw<8EoKDUlXOgqX+2kB@E;)~!Pc9%Al8NLZaxuAtOd^+(%gE(qGP#0GAydhf zWEz=HYRC*Slhl$~q>jucSCOm9HRM`y9l4&|K<1FSWFDDM7LXgsLQ+p|B8$jkvV=5{ zrKFK8Bg@InBu3&SL6Rgz(j-H&BuDb3K#HV9%A`W7WCdACR*}_Y4OvUpk@aK)xrN+H zHj>-OCUQHugWO5(B6pK}$i3t~azA;1JV+iQ50gj8qvSF2IC+9RNuDB4lV`}Y&@ zd4ar0ULr4(SIDd6HS#)ngS<)JB5#v-$h+h{@;>>1d`LbbACphWr{pv8Ir)NoNxmXq zlW)kkP3=a--ZS56Y8jPkB+^ln>Q` z>PY!gohU!5Gv!YOP+h35R5z+S)r0Cu^`Zi)-c%o|FV&9AByI5mPANrh5j)F^5+6;6$z#!};`@zexrA~lJMpdzU#YBCi~#Za+S92HL`P*bR> z)HG^3HG`T-&7x*gbEvu0JZe6*fLcf;Qj4g?)DkL*T1qXWmQ%^p3Mz$4rB+gDR63=h zGN?>SOJz|yDw|qGt)|vcYpHeAdTIleL*-I=R6bQeZKMh*J++A{qKc^!%0QJ;MyiY| zr#4d9$#Zv+$QW7Oo3Z+sNR3%kKRZ}%oEmcR=Qw`J>YAe-9ZKIl~ z?bHrxC$)>(P3@ufQv0a=)B)-sb%;7l9ifg=$Ef4f3F;(uiaJf5q0Un0sPohX>LPWC zx=dZ6u2R>i>(mYECUuLtP2HjHQunC))C1}v^@w^*J)xdb!r3+g5Hih51Gq25yO zsQ1(d>Lc}u`b>SHzEa<)@6-?KC-sZ^P5q(%qyAF=C`6mkrnDK|j5en&XiM6Pwx(@p zTe>-IN4KC`(yeHFx;5=UJJM}vC%P@|Ot+(5Xjj^ecBegPPr5zrMSIgebO*X4?Mru} z{pilLKOI1Kp}W%E=4y1e2edxY)KRSr+PY2Tj=z;VgdN4hN9!d|RL+Ii3 z2zn$PN{7*-=+SgIJ%%1jkE6%a6X=QbBszkQq@(D`bTl19$I@|hJe@#Kp{LT*=;`zf zdL})Ko=wl8=hE}&`Sb#MA)QDsq8HOk=p=e6y^LN?C(|qF6grh&NvF~2w1&>0GifcI zMeFEndKJBzUPG^?*U{_g4Rj8jOXtz~bOF7QE~NGJCc20&rb}o8T}m72GP<1JOk*@o z6EsOvG)*%!OLH_&3$#c}v`j0sN>|X8bQN7q*U+_e9bHd1&|B!ObR)fuZlbr-JLsMC zE_ye;hu%x?qxaJX=!5hj`Y?TjK1v^>kJBgUlk_S2G<}9XOP{09(--KA^df9U_{zw|#EF(!;DW5zUN%oz*DlCff}85_oyY0lU& zEtr-}E5@E_%{VZQOdH0DY0Ee>?HCuvm2qR-84t#jY0r2u-i!~^f$7NjGMyMdrZeNu z1TbBgu1q(kJJW;d$@F3ZnchqvrZ3Zv31a#)!OQ?=ATx*=%nV_MGQ*eBrsE$smwHHIx~Zr$;@JA zGjo`^%sgg3vw&I1Br=Pb#mo{WiCM}lW0o_?%nBxjNo7_tX-qn!VKSIZM$2R|IwqT0 z#jIx5Fl(80%z9=6lf&dPc}zZ2z-(j+89lR!DPoG562`!kGDfD1DQ7k_7=tqeLoyUY zGYrEr9K$mLBQg>rGYX?J6-*^l#Z)sjOf6H#)H4mt7G^8c$ZTVpnC;9CW+$_Y+0E=> z_A>jJ{mcR8AajU0%p75kGRK(X%n9ZsbBa05oMFx~=a}=%1?D1iiMh;NVXiXQnCr|9 z<|cECxy{^R?lSk7`^*F8A@hiN%sgS9GS8Uj%nRlv^NM-RykXul@0j<@2j(O5iTTWY zVZJionD5LF<|p%u`OW-c{$u_!{}{xYu%@gT+l)15Em%v|inV5KSX;I^Ysa==Te7WK zd$u*}z&f&RSSPkE>&&)eU07Gvjdf=|SWmV+>&1GrK5PfJBkRj{V*S|8tUnvTc451+ z-PrDI54I=Uiw$IZvwhgUY(F-L?av0Y1K5G=Aa*c2gdNHbV?)^C>?AgVjbx+P$!s(m!^X04Y&@I5PGP6A)7a_k40a|vi=EBRVdt{* z*!k=Nb|IU{E@Bt6OV}iKDZ7ka&L*=f*c3LEUCE}g>8ys$fIolGvRSN-&1P4ztJyW| zT6P_~p54Iau(@m=o6i=o8`(lu&u(Ii*kZPXHL#_uku77(+087*;w-_EEXC3+!?G;L z@~ps$ti;N!!m4ZqTgg_j)ocx0%hs{=Yy-Q6-O4ty+t?;{JG+D3$?jrzvwPUR>^^os zdw@O29%2u(N7$q6G4?onf<4KeVo$SY*t6_8_B?xmy~ti-FSA$JtL!!QI(vh?$=+gb zvv=6L>^=5A`+$AOK4KrUPuQpIGxj&f-v0=eE?AFeOgj|<}ZbHUsIZXh>^8_W&ihH}HW5N} z_lf(=ec`@x-?;DG5AG-T zi~G&};r`?Pa{oBQoA9Q*8Q+XI=Ph_k-io*8ZFpP0Id8|e;9K&oczeDz@4!3qZFncX zE$_^?<6U@H-i>$XJ$O&PJ@3VP^FDkBz9a9;cjEo{&b&V#z<1%h^4<9Ed=I`S--{3A zd-HwxzI;DEi0{t_^8@&S{2+cXKZGC35934l;rs}GBp=F$@uT?Bd^kUbAIp#9$MX~T ziTor!f{)~*_{n@UAH&D;aeO?Vz)#_)^3(X~{0x33KZ~Eu&*A6t^Z5Dv0)8Q%$S>j- z^Go<7eks3-i0Q4xh{C z@%elKzmYHG_53Ejh%e?#cmrR`8~HN6oZrl2JkAq5$x}SdGd#<4JkJZf$VwR|04&o}T}_^o^+zm0F=xAQyro%}9-H@}D9%kSg&^9T5Y{2~4@e}q5E zALEbnC-{^6DgHEnhCj=n24{{xW}szsg_Zuk$zfoBS>QHh+h|%irVg^AGrk z{3HG`|Ac?aKjWYCFZh@IEB-bAhJVYycT2{xkoD|H^;kzwGr?T25G(~N!CJ5pY=!26ozOyPDYO#oh1PSSPF(HV8RFu8=3>3kAYP zp-|8Zn}i~vSSS$;LaAUB%7k)Zvw#V>KnSEj3ADfntiTDpAPAx$39_IFs!$->=1SeyM*1s9$~MrPuMRU5Dp55gu}uS;izy-I4+zJ zP70@l)500ytZ+^^FI*5V3YUb-!WH4Fa80-_+z@UGw}jim9pSEUPq;5U5FQGTgvY`Y z;i>RUcrLsUUJ9>-*TNg&t?*8GFMJR_3ZI0}!WZGI@J;wG{1AQ$zl7hyAK^dYukcSm zqKRlKnu*OsbJ0Sy6s<&S(MGftn~Qd03$dlxO0*YSiw>fr*hX{`+ltO&JJCgS72QO4 z(L?kU+lyYJx9B5w5Ic&#Vkgm0>@50=0b&=itJqEKF7^<6ioL`@vA5Vq>?`&YgT($~ zusA>*C=L<_i$lbr;xI8p94?L!M~b0hm^extEryF@#IfQyalAM|oG4BbBg9BCN}Mc4 zi!oxX7$?Sy3E~uSsyI!YF3u2VinGMo;v8|VI8U4}E)W-riQ*!0vA9G`5|@h0#N}eL zxI#=3Q^l2HnwTzX#0)W0)QVZ6PRtfpiL1pm;#zT?xL({K=7_mso|rEdh#SR1Q7>*1 zi^O8FL^Oz{qERdp%f-ziCgLI?k|HJ2A|tXQC-R~oilQXSq9Uqdg;*(8iPd6_SS!|v z^|0Ii$}zx;xX~KctSiWo)S-s zXT-DOIq|%BLA)ql5-*Ea#H->p@w#|JyeZxiZ;N-tyW&0ZzW6|VC_WM&i%-O-;xqBN z_(FUsz7k)HZ^XCaJMq2vLHsCw5tbSL+UB@k^-gPQXi?W)K3bM`b)vm0BN8! zNE$2+k%mgcq!4MiG(s9Fg-T)4C~345E{&1KO5>#Q(gbOuG)an(BBdy4vJ@@FNU>6! z6fY%6Q>3ZVG-lnN!iv`H$Gilq|C zAeBl+sZ1)DHcOaF>7;Z@IxU@%&PwN` z^U?+BqI5~REM1YVO4p?8(hcdRbW6G|-I4A}_oVyM1L>jkNO~+ik)BG=r03EL>812a zdM&+?-b(MJ_tFRHqx4DoEPau_O5ddK(hupU^h^3J{gM8Y{!0HOB%8>lvYFgWHkU1A zOW8`cmThEPxw&j7w~$-Ptz>(-wd^1}%57vPxvlIhx079DSJ_Q=mpx=pxxMTqd&@p@ z2f3r{D|eFp#vMjk7VlgG;wYSH%5ieMoFGq; zr^?gh>GBMDraViYEzgnX%Jby;@&b9GoG34n7t2fJBzdX4OkOT0%PZs*IaOXMr^)HE zM$V8kWv!eg>*Q>CmAqPBBd?X$$?N3}a*muU=gIkUfxJ;Jl=bo^xkxUSOJsvwDjVf8 zxm?~XV=^uiGAUCsEi*DJb22XrvM5WkEGx1qSICuem0T^?$hC5vTrW4sTjZ^Bqr6RS zlDEq{`L=vVzAN98@5>M5hw>x&vHV1SDnFB-%P-`Y@+B& zzmwm~ALNhnC;7AdMgA&(lfTP9{!jiZ|C5noqL?aXN;Ab=u}~}(E5%x| zQEZjwik;FzX{oeQ?3LDvgW{;PQJj>vinG#AaZy|qH^m*^{?=1zuXrimijUGk>8SWB zofJQ%v*ND=C|#7UN;jpu(nIN~^il$q-bx>(uhLHmQu-^w$^d1cGDsP$3{i$E!;}zZ zxH3W+se~$F$|z;D60VF<#wz2K@yY~cqB2Q|P$HEmWwH{j#3->!oD#1jC{vWF$~0xV zGDDfE%u;46bCkKtJY~MJKv}3HDvOlG$`U0>S*k2kmMh813MEBJRaPo#O1h#^GL%e3 zt7IuUC0kjgtX9@2Yn64%dS!!>qvR@iO1@H{Y*Y#ry|PIuQi_!l#h{cbMx{(CS2in{ zf-8hVDwIMijKV6M!YhIzDv}~AilQnNN~KbzR4X+~tx~7dD-FsPWvkMtY*U()?aB^i zr?N}gt?W_uD*KfE$^qq|a!5I>98r!c$CTsB3FV}6N;$2ZQO+vol=I33<)U&)xvX4K zt}54*>&gw~rgBTUt=v)WD)*H8$^+%0@<@3M?@;_yd8Ry9UMMe>SITSUjq+A`r@U7_ zC?Azi%4g+^@>Th!d{=%bKb2p~Z{?5jpYm7vry$itHC4^jW~#Yrp<1d|sZf*A z{nY@qi`rG~rgm3*s6EwQYM|O%?W6Wp`>8={e>GSgpbk_Ase{!a>QHr<8lnzYN2nv! zP&G^)rH)p^)iLT=bsYTC^#paII!TRCBh@H%vKp<%sIh9C8m}g(Q`D*IGYW~n+g zTV18DR@bO&)phE6b%UCt=BjyWzFMGeR0~zTx=Afki`5d;S6tAt9b zluE0N%Bq~otAZ-3k}9i;s;U)grCOy{t2Jt^TBp{l4eAzktJJD|Mx=Y=y z?os!u`_%pF0rjAINIk3`QID#})Z^+2^`v@AJ*}Qm&#LFt^XdilqIyZatX@&Cs@K%( z>J9a#dP}{n-cj$W_tg991NEW$NPVn6QJ<>M)aU98^`-hseXYJx->UD__v#1rqxwnx ztbS3ys^@!Nx15S@_ew?U&_Hwy{X<7l9BSWUH5!X{`?Hra7i<#(rPi%p}dZ zt8<1kW=fcjsL(mA*N1C9P?|OyH`9m9qa7wViSrAE1gdV9dsU8kx&s-p>f;q{M&SXg_+3_ zXQSzqBL4~-v(wI}`<-=OGB%}OUd1=~F%MNiS1=W91y{jW2o+x95%VK}-Cy()ZAP6@ zC_0G3(HUgv_y%o6v(aZ%5BF@*3^WE!Ll<3tJEeY1A6Ip?*k44agk@q8;cPvP47CBD4veMm(zNu+V>Sz*DaeXs{KJ za?wOI06j-T&>A$Tqq)~x^d4oRspj6Ok9Q7whD>~{Q6kitb3Ifs)+e*oGc*T|y@2kc zv#{DU_}JFh0*yx_P*;dXi*8uD>N82nV4FH zpb}JWdj`?4I|fk=@STU+p~>hjoEZzTr=aTyM-k`&tT1kXnaM4eE|wk5U%BlFbaNSC zUga86S?fB)JjUJ4L_e=IH{5)z`FQhrmXpjQ%_p13n8%qXm`^pIZa&kzg`Kr~qI)0Y zh)w~**|6$)G!huv6OiwTypStuf*szX5Ht*p>fO`chy?Tk?Loug>m%gi`NGZ4bV#ME zORZ&L?;vyByuHh8mm?PQTvFW@xKx@~o7bAxn{P2M4PWZA!+e+d9`k+X2h10`-)z=| zZge&T`$6s2qjXTp7j&W3T2PHYBG66L-SLsrS2PQ)w0ULq4sCDYFvu?8X2&DuouG0P zVE<}sHt0LrjgF(sps)}$A26{2PP{>LZ8o5TEiwV2wy;hm5>ac<|0)7}YAb!w0ziDH z-%*q_W-p+44c4Ln<&8d}HG_u8L_gsHht6mo4-S4@K za7}c3;!@@M5zu|^vbb-uo0G}Uj^UM;O($4PvWT>pY!PD-XOUnr)ndAZADU?~+hVRo zNo8TP5F~rgL;=VeEr&?GfssQ|MvD|r8P&kfCxKBbQ84722@X;XkrRMN?a&9o?v-N$ z&iLWLrU#JG&6YGW1Lr7i?S^vD6FAQos^yO2(PsNT$PcNAL8fS(`$@pG=fWqNaCaB0 zdW($8`%s;*iVe=AT^lXOxPGhjFj>;!jmt@k(-!wynWOU-7cDMZ#JS$ExMgw2;-19= zi$uTK?T(n=L`th&z=^?ryHGKx=z>!$=q(pT!7hWLQVUTLT7lkn(Avyt6^m+tCuin8 zsu&dTx!q*c9=L8h;wzwd5qY9Kbh~dGw8*KQeKooPICnuF$N_an<&Nvn_#xZT-RJ?8 zp;hkS4WjEN^AOj2E(_f@I3rZ!>Q>R;T&_A`G01XKRfB7)+g8^w%h8r&EXP?+u$*KW zX*t=_7sXh{SteLoSM4zw3##r94(kAVy$Vb|3*K7;y4{L8w!H&2bq4(eK~s8XuxEPbt7xYfEgS%y`*n)F^6Rkg=*pXIp@=ID^+ z5zAwiCg_CaDa$jK&D=fQE?Jg2&u>?5*Td(GNl(~qIx2^#m!sUa)qv?s)CzsFbOfgf zMGHFV0l6t?)$ne}4k;U|{bvL`wsJ#T`+P$$otnjWhO_=T#748;IT${Oeqx z|Aa5#bZ5}oHdgNTE@V|_YYUTkZfuq8YU5UG*>xfO@?5pKiLtM}o2$vNg|^iz-4N<+ z)z>P>D%fhE)z@I1TZq*Nt5B;^R^e8As_ao&_}K9_zyund85jf_J_MXC0i=V_Z(za} zaE%+SrUOzlfw|S_HsJg`s&8<0WfN#P6cqdzvf7FcBNEvEAIfrd0mn3=X2W-&(Wcqp z>1WV)$oIHO3Ow2bDt7QaRcYgM#QX}Nb1GyLasvMO0^j=q7ayW5VA&1GG!QaR2M6In z89NdDE*-i8>jwhUy1<^gs!7#MA#rA8xa%TcDFx zr>)LfowvGZ6=-VWe%U{NB_lwnTF2x;nm3}o-tE1g-R=b*P+3>4!oW&IPx)skt zrn`q)Cx*{*A8S3{dZKlNwcggXy2*Am^hPcCvmbOBcVN$bm`hedCwk#K05Ez1G4ukb zWS~olpbuA=N^U||dB(f**9XW)zuP}fA5ZYaop z9(3hUsNif+Qzyv!siOxP)_i)+Y46$1jcBP~7Wmsw$aXV)-3uKq3-)t@E@%g5#e+8g z!gpr|PD8_6Q|NQ&UFZ|i)l_)j_3(yRQ=on<>d`(PR5!<~3Hr`2;B`Cbmqu{rgJ?~^ zZ;;#bcJsmepZ=d~u9h{ypj`u6j3lT_VDmw!CDH?;`+yq*nl~XAQ1D0Smd8NB!7z*U zY4dK#B-GSF=TFw;LcSubG!Phb|%8vUgvJYZ(cCSYz3pmGavFmlJ|0AT+$~9+%n;(z`-uInGH;RguLPHC8q>rT63`aK8UG(n**StKy(BJ zws`_E=K*(qgOBLZ7bgy$xix+d)Nm6xask@C;Xv(Z$aW0q!44SV0%&-^wZKK-`Z1`$ zG{M7a%g zl!%UdBmmw;aC{YHJ{O`a1$93GudK6itMh@g7s4K`5pM4ey1=3S8O`lL!?S^1Ey0U_ zK>qeEGa&EDs0_|LX^KGvnMmJPs7(Q1-Zms3BB_U%P2l;N!0bBUiU#JP1kkTF_|kgI z`EdLXP{ruB*|5i{4*k$?j}4ut1$cVC13s((7Ruk6<^53Yv^)a6tP6dAE9jdG~;A-8FbMP1N z*Q&~ewSA#JG)yu%E$x79fxg-8Pg-Zf**d83sFv|o$ADA+02?!Op=~B=?>i64ZfENH zz*$95LkTjc+POh5`-3tE+5mH!!1+$w$R0lK&mrn!nCcF+Yy@{p1+Aa-d0y8$;BCuC zaONCX^#ZzSzX8se3tci3GMtP$!fxfj_(ovjLYVO1fNEdD+D{>04{#nE|7P`p0k1o) z8nOc>rm4`yJE9$KW1*|`1qMDs>5kXY3{49_ycitw17r~oJgJ4fyP;GMP2GmtCR+pa zrTb13kwxJ*|BzzP+*feZZpgp?zQ9usDFd7q-m6Uru&}=m2p>no zY9{!HLd`dV$Cv_xU$p87&cCk1SJ2cr(DMYSw+*mrPsmSH+9tj(0vOZ;+&uuAkfF0Y z0%dtXrc1zEUqI|ea3h}%wa|+Xfw%2-nGJnGbdtamw+=AWJ@%T>`XsO}2He95t~xe= zk1s$cW4b}y?^>@#<2|22f9(VK47Jh$%WJ{sjDT5-pv?N79Z$7912OLaPHzH^T}FMK zjshRrLEL(9u*-E_K#}WUs`xs%9=iB3@Wf}RTb-+C$NFB-oo}PYPA`DFnGjo_$|W!> z3`JybN2qiJu)_((wg2oY!TMUrqYAX%V;o+8z-zaQ2&!-Z1$BoQw*!CEVciOJ)ZYN- zH}5zSl=~Rm=K@ru44yv;{Z@umB-GYxYh74?rS&P`C%M@Zj=Bx2Btp0N4O7cMI4Tvc zhn#IX03YV|9|xJ<0408hj1s{+tNd@fWYjg;jsz{7fkz5p#RKhen0_RPt_yludmdt5 z4a&+!j=rmbVQYY4o57L3Lx&%LN?lqvga+8yJb}kXK#ew`{o{{=M_lu02c3Qv_~th> zzlsEJKMZ-~Kr}9pSq%8d1<2#yut^Og0}{Lrf(P6V83f(&yRR+qF9y{808I%obL2r4 ziQr;i7x+LehC*&EI%An$H?2NCz|Q|RWOfJGGX$p7p$@IlXX_^LlOFY7T2?{b0$`Ur zpn#>oB45z+#ITd-^1N&HJp1v}fKQ&_oza2T`D*FA)1oz+eG* z?mz2daIM8CDbTlSc>R6QfdHCGLGK5rL1&fFm*}dI|Dm4VnGjnToD&3l{y-jfMey7l zKyDrAVio#abG%`CeUt5FIOiM63BCs?)S{IBV*s~fu4Uk7<-nPffIuzW&VYEgz!Y!{ z5%K>4vlaBIp7xsET!Zdbd)-_*&r?Dug5{LCkBv*Ea^Sc8pwgM-Tf&aniL#tZwlKcVvk?9urGvAns zh92No2fz~+!VKsON45YCI-tLudqF2FvUnW0q1Cr``;oJ4TZpj&>I?s7vFfb%9{tw zbim&jRA0Rdt!?%WCW=h(j?1uj1~T_#;g*1!xj`@EQC;&O&_s`hL6sxwz1>~`tD;bg zj>CbwFQDJOfC}V5UFO21U<3Ey>IK%x0zUeK&!2^i#=?|;1|I*7HqINerF%e?_k7Sr zJz%#Aa=eV%+1*0@>yv=@MNs$spyKnu^HKhB!1cb+eSMJPqoT%nK3j$ZR>?3$U5CeQ z;L0l&8Bh<~Ft{SjL(Z;CKu7(+^TtEm9`G3hx@3@hr;Wg_cyzws#)i0nw|*^wbEm+y zj)1do@B0F|1a}8yp8!_R;ItZw3$xiLJc4B_v=*YkTmmU%;%FC^c{( zL|Xtjm;(Q-A%Zf{@GqEMV!(4f(CaPd!EGJ`4{-F>BXDc5*IU2hJ}F3SmgHHC{&ot6 z$3p=tE$F8k`1El&)+eMLI@o_Vu$mtD0*$k7vz3Ev$Dxm=QvDQ&whsEhGMJ(=p%0!0 zZ_e%y*Y15c!UX;S7!V99w?$4CUjUicX!+K5UPsKon=C$+x9$sAl!ETu0QLC} zFCc#ds3sY*{s*f@LydKS^blZOZTpQ|%{n#NezTYg_vdYig1kPUy4oD~x1iUS(8YqF z8~%o~br3}a;2DXUfi5?oKzQ%j?OVD5L&l>Wp1FXDW%Ex1TtTNQbm!5at_QHzRfx9+ zSYFi16qLCSG}*i+F!pu76I;Dt*Nq+v;W~FLe9nLx&Vdd!*E#~-i&!{(6jbpybaf1H z(81cFHtF75pnu)2{<;pjG3cUIzT0U@vomt~d*nRw%!*J#u;6^NXcv#SQsE;GCb&iD{;P4APC=AZo-tvgY zGk7Kz5UuiiwzX@(KZmh^U8`0ll6D4_@LCV)_fM z_I%n<*wAF_3JiD+v%yVZ@^D~H4#e~UW`S^UwFkh+U1)=+AKGbt2z1$iy4$Y-=QZ;^ z+P8gU4CMQtTNQc%^UB+}k z>%XYB6sA%=bQ6C-$OU}%A#lowPW5^Zj^7PXo&d2s!+G}$Qc)>+^HL5n$R9n6iFW_N|@{ z+D{D6fUbJD|3{c_CUm+FYnXulXxrWeFY-p+hTeht9)TQ2TV+5jdr|9@8vlrZ7HwXE z-`qeA=49`sHLGC`XJN1I!1OVw)bTZF&B4X>XfO4B~VC-g4 z%}3zQWyos{WW5LcRxaCBHw_79l{m5ZMQ4i?Nb79_V z2hnSxUJGFFa_IU4+U^Pd2-hCHp|1Bq-`;T4h{`;FXMovey35VAslEk4UT;c^Urvw zQ{#%m;OnR0h&t$FS0JN+rOTln>*4vzt>4=pF*o=818iLeT_7B?4g-`X!P{aJHjz70f_)m^&+TYGn*FhYyogG6e=u0 zJrhIoQ)r-TckrJb-exdm z{ROsp0DezVgT+qBZF-%**WOmaO($UIOMqz{y4w)j_9#m8yaE1CKn@VE;$KLJ;Eq19pS{(toiIUIsa9|B&l zk=uxuO@}L*Y=3$DMbB+QeUgE{Bru!>2e=CJg{z+)x=k=T6dVl^`9W2#pc8hBp^Dvm zTW$Yaan`#l;w;U~Ip}Rh(DzpGvoQ~wHUZm) z2HdRa;MxSWoC}b7T;7+GTKt0WyCC>U#_B?EurnW$2gvP+a8JrZN8aZT6tU zE*8LpW#IcI&{0one0S@rH(u=RjldN0)ilw~9+ zn=P8+Z6*UJr8DS(4y-PP4n7&(Pf<1U`WT+c29*7TM)c$N0I7&*LypdhG7;WOsmn-H zLC8fr8|m58lS*gFK7)c>r?tDpoa@ME2&dJ%;N2i{)e3~qMo$*7W)xX<#x%wd?6bmi zuYVmK_d2siaPK0U+N8OBU&RQ2qP>CCU;&OaJatE6sq8O#Vp<QGzNMr7LM_wD z@qRSa;yW5Geh_+WX4+zX+6!oVjC0*pw$RomlKSq;^WmP@Ryn3{3+_}LI>Ktz>bVB19yAnMH`9Q zCT1^x{Mi=pf0cC%5ck6GO1G65om{9yCcPyRA99vR*U4MWS1_w9qg{oG*;Hn$R4Z?R zrg!XwRvCl%d5GktOf<*D>WgF8OFj;1=-MbJts3M=!6VR{g=+MK6BAMN=0u-Lx4kJ| zp-r;D<%0KqbKg>5KQS$5rYn*%Gn1dKXZ8VnqVYGZYzDvb$n|J; zQ&W-}%*SGeI(#p6MYDs?L>@)=))G~pU=x}+69f$RI-NFxJ&7Hw?dfs_d<>M=t(E4l z4cA>RfxG9*j#3h^SNo`I4qk0u$Omu~0*+qE!H^mdQw9RgQ|npEjgA3jy9`FBT-ONH zdH_g$Zyrtkx}Yyh$%~dgR0V>2;aG;^B!1zp5*YlbWU`!bj5E)q<7}aFRbW1s>-rGg z&wRCxIe>1QhArb6x0JEg_2^CICbO@9f=-)dc9fO=SxIa3`%mibh{o)MciI!dFmUe$e*##;Z8 zCR)=%Gup4EX1HHFzde3^HGY2WG#AP`S$EJZ_p9@3X4O&C&3>lFUb<=)`uR1p`{5J6 z6Mn&(bj>KgNq!$|hG?vt4b;3T8?2eGndUcCvv}t3tLwY3)a=(?DcfQ_TJxmriPhJB zKU)7_z27=nldWoIHAOQ>Gfk7B8Sl5wZ-d`#O_*k$Cijcoen+h5Yfe}zdVHw~)-2Ri z&8lv{R%2~d;P$&dYP?N;9KMu}ch%_^s<*aS1v6*LONZ~! z{@F6SppH9p#MaQ+)G2;s{tkzSvdpaBek5FPNbHZGvQwt2unZOecm+Jt}s#S{5-{H-*o6UoRv z&N#ngebL}@srk0-EE)mgjj{ie)X+#yhxQS{UNPIel?mok`c{Rj6<5nu0SmR;6rL5k z6r=S4R-RL=toqun&}IjGtDPRON^4YnubmUHPP?gSjDK)&lB;XRXU-#Fga!U=gNZ#* zuB~#}|0R85KeKLzORr)a*{k%H%Ml&4lgp>YG$_7TzKfd9$%l@6vO>-5geKvPx>K1Z z^4CPwx3xV+&flS~L8wY+I@K8op7KZOVD@9E&$MOe(H8Ds$*$mSQ70MZK16yJ_G_2# zVvjHAfpYwp+FS<4F7~`!{weuu;vwy4JgC>%HYDJMcB%G$fT!wT?c;!_0it^mV6A%{ zpwPVyu-8rTKc=){RW0ZstE2jY9tZE$=*&0hYQ5Z29>G_|qgqSoLQ%4}{S{RD6ErM2 z{m1gfI-}DXaCVezJoP>YcK*U^e1e`oMcdY(bANN?TJROgh*wa*U-|X5VjUwbl*=yR z24#h{Rp-D=y@RTiVqt}~zOQa^#qSk0w*7U>EBXZ%1!n4o1P<4I5_rLOlx}3;7~SZ= z^%X{^WE4J?3|=#D(?9cEhdy3pueFLE=akx0(L`_X2v4IwUiJwA+3#h5OGSALP9CG> zrS2|w&H|S=(fVk*Wq~Y;+sgWG(>a{^nV!yPz~PtVb%JB<-Db-u<$E3fnY}{vn!qS~ zjc$})r@K}WX!UJenq7Ch0-Z6iNLLnE5opv^1(xgPM2;sbj#Timgai$YYetvtD;`=4 zE6J5Ny02Vcz?b!4i;^(aM^wTQ9E@bgw-qKYlvwR#`LXmQ zjJX9m+R~A~A9_7>i+o-f!xg#IV|dX$ZG`1x+bBz(okG93Vu7W`)=qz`+~3MkA5d|} z+FRwSchmc;JoSMpAN?u2({}#)+4`%ttJwS3ii6WKI(bP_J^Lb0d`~DjNQ0#@(iEA_ z>dx4Fj1JA=+Uatra7@J@5b1!j55`5+Q`P0D*w?Idsqd&x=BN^%EVsi0A0_-TXtv~g zo2Y%g*|lPS>9~X(OOwjlYNX!AD%w6IV3ul;#m{Q2eu*WPe?oPl{!7&qeMkGw_S5uB zR5SJ0N9wRgj%3gGL3R&XCaY2wa=O@E%9On&!qlb0 z39j|bZxNi;{)}XMo|NnCXg`pl4zk7ecidf0A8mMR+(90_wKKI>h`-UsqUHqu6cO!{ z7Zt7GT@o769(_E3;~fnv{|5bohi?tLWl&j0NDIdh5HS$_=*E7t1!qp1Vn*?O zkW8sq-tG*J<5PIN$Gn>J#|Em_2aU1FTuZ&BWo4pYlp)V9&T!1~U1gf>M~39eBnMAb zYeSa0n?qYeFNbu8B*O%CvSG6NUPT!0`ywlxZrtHhiu*{3nIxH>h0Hr!Uc`6~uK>S( ztog3@CD?un<|G+kS?)zQDDv2C^`?_VOJU zXLLoTQ+uiS)r*|CV``XmSCHmn~a-R&rMc-mMAMjlm5?fTLIJ{06WCdaa&V`B6wp zXiw^sAkP(5bh(YPfKSP-3=8wFxCVmJ{5%aTUm|}M$8t>(-65`YUD?=*WQ%=AAN=+_ zs~UuFjAYmEz=fg@i7E?%b3fo=~jjoRgUxa@X?HH%}^8mWHW<={8p?1GT@hlMbcFd_p`)=>1H^ zNOJLjJe~45!&%0B;#fuwC(1jQ6lb@pk2rssZaE_z-M3lV%WBnum_rih(x1$(g3X%sb1DYMJUQ)HApo>pi(Ebm|N#u@GB7?h1u6L0f7qpur5$lKySz|11PK1D}2`97_B#-~{t z`gXR*Q%(%F=X>H)?yw)b$l9#ri{zK=Wzxv@kBq5g-y066*0L9{w(hN+Tei6XgF6mk%LiGcMf|M58Hu^YDdPtls=UsSl6mzWwn8*?~{#Hy5A1}idim!I+Hl_8P*AQ#9eW1DIw!LlxY743D7jJw#V6}@cmpEei8-fs2)SD zlE~aEUiZU2{(u|Zjyh$KgO@gcg6coO&PmXoS$MwcNN~Nw3cAcwYVif$kX_lLK*^eF zOYA=qV@EvBFc`aobA)x`-(e_>9m6~8q_%Wwb$#h2o9^`LF7Vu)DF5T#b-00T|BI)si^;{$xD%q{uNw6fZf^RXNGZ_umX_}V6KLf1P?<`V%6zLd|# ztBq)D8F{}hJA?mZecv&2EYB7nsXiFI#c`^`ZhFKyRB1U%*phvfmP|y0m+8`~Y#a6X z02*2i8pVp=Qh{w1(PByKTdm-1`;@MmTN?8^$Ovmi@i`d#dBjWdl~w90%1XVLH|kJ~ zGS#r&YVnHhS~H)!u7j*NoK6eW(yDkSt6MF$_RGLT0#6*M$@>s6S&kN80=@mY(~41| zz-UCxvfu`VKiGQeVC`WdtBXNcD|0-o+Riy=gxgWpdegBLcWvj%<}~W_Cs{ZYY*#Zm z_M9n7OogXWI<;gaG@4#ZVai;wGl%%LpwiK@!!w1HJaHw6HJJY9X!nC*ESe6SKjF^a$< zGlTUNg48eUGexU8i{JlUPAiLRItKscmLhj-m0-YyNL$F>B3Cpjo|V4jq-{r777=tI zPnG0a!@BFa_l$IRi>*}$PtBX}*iFWUr^^7RboOsWxc8BuK9MS}!V$hz4B*deywlTT z2iclI9t_g6_I*$@ryLNbVHIQHrG}_IWw3Iz_MEhJU&J^I;9-VTYwR6vq7>c0@f`U$ zq<59pVsy$;52un-?Y7`J;v>~D4X9O*xNG_~A~R>P&V`C&xDb^Tln#-}aZNQJlhMbTQ`ppA>&Zu23%_y*~>?dBIVr)K2c59NIyhg$Kg# zy0sPR_sqq=Wc8zVA%-k22=9yj@iX%wekb=+%t4J&b&vnh%t`*hgr@ zS{z(8=<#Khsm$vl>kaon$(^uvj)Uc;Wk+rH|HnImX9ii_XwE50P}Gg!cCeR<-n+ay zpEz6Lz1Q(|5Z|GpL#?OJ%twK@*Dk4b;}k_fWl%O1%oBlBBLKbqLk8J5V+C)0omuN7M>Xp);qjW2=c(Xe zAKcmIsYdgk7rm(clX#mfa}}@cd3r;3Ijxhho@wOc55~(yk#-Wna^_27trxjp;oJ*k z{gjtcXVB_=x|Uj4-D&oDyFKEGXDVpY@kGUC{LyJtrZ17i(a&8#%nxyG<#<%*3eUQe z`GKL;C`~AMTO}zK7sc1<--tJ$w>=$ZFRJ|y*GHCp3rg2<&4`i@IEW6)Q8kIhMyGJ< zu!CB*Lmifgy)jyr#`b`xlWHG;lGVYT`29Q_dK@$Wq+6ug!>2<--JD{Fnh(-4Jd=L* zpLci8499`MT4v&zgFJ&=YaIw{XG)T)lDqeY|E0ZAx3X?6XUeDA^9if+I(nFg2N(&% z2KEmkBmL32wrKQvnXCXkd4H4b@%cGmaeVEcbvjmh8wJvUneoI?MGm&d%#ojs|MGe} z9JBZ&CXYlLJ4$HW4WiDZPDje_RBtk7tGjSt1xk9hXan80mqQOHW(CO?2ezUz$MGM3 zF>W)m7g=UT-Rr>H+A@tLu`WzC9=^ZEvGZA;{r}|rz#hhLWS}_+wm*<9WzWHa8ogP{ z8YZDjKY@!a(yZX;y1V(oK4s*E{Uxqrp9ANyk)A|Ynzjero?`YlFv%!y!bTEJGAqxJ zarOP`=F}^2A?N*zh<_3MIE9+;l~xg7h+DK0eGY)L`NZ6hj1@%h9JF2Dhg5mpuKvvO zv@%;g&E8eKtInX2l_KuWsK-;e?{HnWl(lV@Mw?tvRF0yL6zA&u(meWNZADPL+LiH+ z#d+}F6WPfb={eAlt*CcQVFg{tO%5D2qL{g&@w^XrcT06%LfyA!qtknoav&J^#W#}^%IDHYGkmo7c(|F?0|PcC}?Z3@tY*wbc5?})rYCNCnbh`39c$(j{yy9l=-no z#3{u>4riM@<$=FFHE4&53_z_Wv#u^R|JLnC55lO#(9%X$fFA=xZuBM(y#9$i4MHdr5!bV z>OF?}ZUnx;x2%tBTR+s2t@enSR6Qr-vNUQ>$dS<9;37(TRP2*a+GM32zzHUxy;|7w z2#5EnL?-&z2O5n|u4t%FYAg8qRq8N&eJOj|9FX#t*CUt}00)=T`8K+I%6e3i9_6J; ziCSA9McuW;aZ0)cv_dPM5rLJ=H{T_H*&zWD&*gGatK?suIio4x;0usp`H#A~`|NAUF-dxH)BnJD5#Pcv)0h+fX;bBniBxJ`Y7WpKkKn>M`C zd3Exg52IFt;^eq}aIlBxU^M+aSvlvm0~8z+O>LoefxNIiRKG2#LE(;Hu$36qW_NcY z*o)Tmmd2!8_`PRx*)&ZyIR6mA&Yc>92K2qZT&Nh-ps&AVvxzG|6_eq6haAuy0|wrC zzQU>Zr@y{W>_ka!wU z*f%mH;agtkD&EkC%FvA(ol=H5TyMw;$_~3KdHL};tc9|#;Cfh3Ig`Ir45|I2GMM24 zY~YhQ-Tz?keK}!xs19rx!Rf;&Nl4l(i^6^kctBplQQ!zN-xHNs39HhhlVnBOVia#F zYWfH2wM#xPYu7k9NUPF_y_SEF1YXl6(;uT9OHkr!&hetf#^^;4-a!N-I8FFj-;Y`r zi+kmO#;*!iSF2F>9aL=r-fGb8>b0j-!sC$Nq^;krfnnAtm{D~n5ez}k82hT`K^ zHI@}zD2b*fhjjcsKRnugd161!{x{bA9nT03AZt76WuM^@T!X73{LrqWGO&%Nab!`L zY8c2&N0aCv?mb3C6Jc(t9sC(-2?H<6%9oPmnh&?0qNu+}QrOLu84aUMMknV!zsN?r zAgY-fa1V8TEMcX;hQ1=243s}P$f|=i5&R=Fy?sE`+t$WF1Gj{T3Q>XS^_giGfEoypN-=PmOY;FM7ssgZz8WJ zl|y8??Gd{1oRVY^GlUv`=R2dZB?xcLm>;OoZ~QFE`E;o*-tHs0!E^f~=v?dJ=0cmI zO1cyH9@Xs;$mw5rv%W)v(a9gBeI)zyqhTn~ppOs9_8$c+scT1h5ww^1FW|1iSld$n z;kb~4sMOY9AaSf z_0~5U8ykI!!&C|4rLO1wnW*MpGTtFbHbJ~L9BraZ=ZJS5LI!1?#Es2atX$5$*!Zm(mM5j&anI^*Alb@NMBAL_@sV|V$_ z)`*+@r=|}+CC8(Xc(w;NNon4f5$)KKl#|y+?}Ol{LSi#)YXTZO7rEBnCObZ4G^^`B zbl7y%=MJoWtVoTV$vv}(b_Pl@*SIRA0N#0ms#L@DL*E}dTT>$kVyc4g7C6ACHfU3> zZ*$pdx0WbRu>KN|KG|juoHmE=lEFoX4>hTOiM7J^~zna;5ZRH#`R}~Zz0D0ZALNr7?&mqGMvJ#ZIp$v z?GB$*PtB8XUte9Fg1i>VcGn!#=sV*79j1gPC<_LF!N%kjXkkq^D2soHn zdyLbHn<(&V@V!5&Tv|ux$iz0$C|NRE67K!YVV!z|lP6m5E}W#Z-Ba zpJ94lE^@AJTf6sg%C|bX`t{+J>IOxsak2GB?3^qTzT^6N>jLVejF1 zb6{wD{Ei*j^oc4Xwgfsv3Qm6nYqJkNCgG}7IJKJ?hVoU6D`*RsrpCG*iB)g)b)koT zD=E6*P}|gRshtWI`bo3Uv#@KnWq0sGW_}4zMlnX8!ktzBHtep-R?jeo#;%c{lQP9p z@Jdn>e`B^vIPoa*HoD`fOp`_{4J&b?=XR7~#(qb}@U+2l@e5M8c+=5#G3G<=n1~PP z27fnDpPAruYRGTWFX@2flsuNW;PcYzP|cB-wb|-n?VLO8hhG_F=VvlLn10`bRdu8; zkJzaMQn3k1Unf6-i8thG`=?~MSz`7P8%~m4K-YX3;LeT%?d(xj&z}agiN879xD+oF zNW^Q{P5g^uPeeyrk?BBr+4jJZqbjXxQ9*+2seoJNGv z8-C*bOvZdc%}wmmO$9zj)0o?viff7PD;&q))O|GAvGFp&_zsc&ac8_e=_dPSM^baC z^I44BeJNpb?|T*K#VslV3UmEPsgy(4xTUM4d~XHuGMQ{2$G1 BO(XyS literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..4ae51c47bbbfb22d85aaca4dd8405d9a3445bf5e GIT binary patch literal 86301 zcmWh!dq5P`+dk*ab?>uWm#YJ!A|kGeTom!FS5(UNPD(l|DxukGq z;~mj#HA^zH!5gSlTUlaKjY>&sw)(R|qx$Cii$9jxJ?FgVectDNo_D&vBLifN&haUY zWqfc_ezR})x%EQ#akV+e_FUNH7+BQSd~9#iR&m6}=&{H5UD}>Fxjz5W@%>kJIOkoi z9s9w7&)?2?`EJ{#4-S6$E-o|1j5|^H)!v-#NzY$Cap;?a?!DvQ8TVoRw}9#HQG1PM!Gmo4Uz|XMKL^!+Y0! z^RDcA=97sZcI|m}jWTo5+tOQFBgAtiT5T z#4O5l`XL+Dx79u(>V@XGrl@5hS7+hhnJH>?ak;C>yPLuK4Qi;n^+T(UA-MbNa|E6Y1W)<>}zX$C@6kS6-LGv_+Atx>g=g zfSFvu$Sn%u!Y%!iqY55xn2m4Mm&C7^Vt01zDGicFM=tLA_yzpts-mCY<9-{m;NXo1 z2YbG~c}bl*09cey+(af~@dj=MGDo+0`DJwe@X z1U`LI`rNPknNPCnT52af_cGWpMFiFX4ely~nR4H$v3+A-y18`H;{F#SU%tPzJa}5- zGJnsgd+y5*<1Y{R=H&OA-ajM#8TFnEX>HEN|Ik|%+_L*$eHpRh{^ZABSx2-zTJ`Mg z+J_fohIB6dcH8CtBQEu#4tCzEN`KIKTOO10q`i9jk|#gcEIj(;m)aE%p4?H^r#$W0 zw`0lEU+WGYeR}uE$p=sG`I=JxzJKD{lD~gzxO4RH2dDpf@b~X3*RLyZKK!Mwht0j- z?|Rgd{(IN|{A2q4^Z4rYm;U*qb>aK}{MokR_kaG<*7y6jvwg=)|32wB`2N37@1Okr z-@gM*{r>BEeC?(G{^`8){(t{={q_5Q{{gcCxEvKl1_+<4pzvmu9USlqRSMlJr_neg zQ0iz=*!1Q`>#9JRXx`0_$vGReGfPMKR$|^Ka$}o^ zM?R7(bN9uEUuqsb_|Z1GYF|RHv6sfpc=UQr%f6oJmo7cK>d|(^ygzZw*vpf4KB}(E z-Jdl5(&cHV9=+kK+Mm2|?3EecKYFvFWq-Kgy2L|l8 z)Usgk|K9RfEeKgRBKr17F(Ryx^i~4wc)tr+8ZOueFD0uN-;5{=P~j)w)+u5!dqZ=kt5syhkQ}a4QQGZxeD23QE z2(?(G)|{F2?srqzAxSsQ**S4sdPiyZXu;Y$C*EQ#p+U3V@LY)&a@c)tNYNa+TP3!P zf7FrWy8I>oxO;HDRB915W)e@?4wQKNmWrEJhTIP73XJaA>7}rLPV7{fWEMD?A^eAL zj2voBc+&|z4P|T}nGBQXn4EqpXeK!uo9$)BEhgdX{pI0jv1O(LObdL#RXnj~g}odU zInCg~QEO)s$7MnunG&p{|Lvp&fU7QDAJM$Ml+_8um$z zeYK^0VuLGs(~FB;xh8@}E^*_4B!4eFe7(YcdWEm@(A05PPV7?uwrb>@UUp& z4a;?*cS&l3mldaYkF55haca&I9YCH5Yp( zXN)cFW<_3Q#2Zcf*QG4Mwo&_Tg%0tT#(Tc18d^1iyCpM8A1&S3M~brz1LeK`)V5Bl z6j4&fw(SK zSTQ>HT(>@jXSs2W<&#D#=2qwEOx|rx5az;1PT0e2FCSAd5B*RAPv3rK!J_YP^5=;+ zrr{xaG2vX~iq=t~LGo7T$a(zJ5;is z_r|dEbECh^s9=|fYbL~|N6xLh5cZ>&PEqz6AMviRB4_E6HG3>SwQ|83f%1~JIPj^+ z{|~d*fpx*uwYA0hFADTwA9yN2+KGx~!&|`cp<=q?x1}i7BckPHg)0VBvuvsM8!II+ z0ML9537tOWEk8@ibTQ@z2Dps`jS`lQkWFt(Fw|{bq_N|irn^44l9a6n6abb!4P%== zwEV81gMf;)^fEy(C^c0S5xSw>r5)ZpNkXRqjnYiu0#n+OMzzVDGst_Z6^1VD~!V$Es;d zz|y92`Ra^!{9ppM^%g8`PBejRu5K-DTFPb$%yNZ##z~El*|`c8uF|Yt#1_PV`2$YELZ*3qX11;3^{(|c8y6B3?~HJV>f@z&s>tK zk|gvhK;Hx7YHeF}asEir@|~aMWXhq@wCH}}0rr^?1K z5B;`g!I@*527!?Z`<#UOt47wzm&v9L0X|%?wJG#k0aW_g0&G0*H!Rf5iGqy?W@XTu zTZ;2DoUC8Ab^*&+Y+B%9VtwWZBKTcooU$cG2t)*L{l^Wzd!DIZZuQPjT9|%eI$A`a0&H z1`P9nnOEWKZuVavou%;@^CLBWFb0Pd{#DQB-+tZI<$&uX@ReY>FBt0l=1jqM%8%N7 z*14kTvEO=6Fn{9V&PXP^%D%0b8-13MB*|8v)3o3CxnfT7)5{g}8JWu0U?_$orLxC< zQ=Vw>8(Gx(2e;g{z&0Ce2hMQVl); zRKtFSoh@2wJm%2AlBqj$nl8|FK6Jxp{aZ1=A)8LR*|Ab#W&m6g`8uC%uhTd)U|8bh zRf+#CU>qwMex2{QH(%%(m{mRhxtdU6=X}VH7G4-37&PX|pc&0)=Y+XZ89Rh&wugj0 zv|M@_JeNw$coKMtfF(Zqh3&MU7!zc4k62bDWjBpt7y0-Gg?(4x)@gLS8*bL%Y+!gr zHuY6KPd&yfD%#@aR42F5Ny{>IW#d8n4ATa|G{$2sB2bg~ZEh}?P-{iQPN(U8H#(tl z>wUKACqbQJJR{O8@SNXPpto= zLZ$f(GXedKleU?T*^A7tdDvS4EOn7ZgQ;$>iy z@9i6&31fkw=M_V&o9=&aXwwCFMKfQJ!D!6Kh=zTN)j$kixWT6w82yHIPIjeaIYHoi z3bPoSM-WsqSg6{6D1EZf$Mc~wcy^@(4@t8r2oK)1&z(6V_87VpBo!&v9!^_V5EvlC zSKJ6rv^)s#Z%fu&$Ejw`_M-}kRQTGJp-ubwF)GVC!BHn8VCy%2+f<)vvP5s!z%s=k zc=$b{!H8F_R;Z83v*(0Q%Zu{`;rVQA=@&5kr*P{OOQ>iI*3bmmy4nM5XSp;Vlj~$A zHCQ)GhRx0o-<~1#B|2e!?r@)zjQtZ-I%Ce2`V%+oeLbK2z0^1qTQ)KY5}?0z+QtdO zcEDXH#`oNPdOO(_ipii_KNml{@p3+rICsDz_~^GK6z=5ay6JZT+bq$409%{D9}(ed zjosy@Kk{3jA#7{U#{J`k6shsKA@xVJQ>YQdJZb#<=lal_D50%yAIVakeZnPVolGua5+Kf%_0xC;GoCM?C=2IT- z9S!azjNs-Xl+`DRZBum4=4e0!{yO2C1JqUt)C)b|0Z35I`69#mK)4gsVB>U;As~SY z$+qX-$%H-OsbUW0>RR?2M!LHmuV0}E51W74{$)E+C*M) z!X2J3zsMij^t0thjoaz5%&4@a`Akoo%u-@<%4S=@Ad5z~o6GcocG>u~o8K?OwZItl z+nAo&XnrvD`RW6T63t_c`Jh$Tz3ZNb)aPVRS);gWAvgls*hfT2H(X&Piq z5loX5)0={U!j@|UMho;)8AwjEpjgNG>F=?1Ca^p&nJ@TEHpx2w?{8NY=idRe(+BPD zFVcNnqQdr)EkDZ^yKK2CF;0PWG-IdXUWJfSl{)Zy7Q`jXoh<}n)mT2K8 zq#<23EXRg-Bu2rOEt+|RSVjf*ox$`fOzl=oudcNA0Pws-Ckvl>vd1*d=iik1{T@pS zuzb1DxWL0*7x@kk(YcI(aFD`9_FX!1t1i_$4=`YkKt3n zG*+cv*LbhT(&6L3_uKaRjEDWJo=N%5Q=I>;(>hHxDGD9w(Tg2@Mz*zR2AgUv@gXBX z25kCR1Sb@(z{eS#=J9^+@vPtNM(YJX`q7VSHNzKv+a!frDw~9W@u`Om6}dAWQ<}>9 zoo2-k>pe`I$p7GZ_)>Ac>REUoVEz!$+XZHp2YxJ4m$3DIfcw*Dy&AB16@HT_n}D&} zkNO0t!M~4gnvYgUXgA=h{kAB9PLbL7J?ow$I;dKH75Hxi_7N}*2!Qug+on9jY2P0& z7UxgX_S z9*D)5^Hi{Gn&hx2bZ^>kor0EQ?rWE!lm0@rWKp9OBhjDX{wD=@Q4>A%Bmz6p4|9bh zs2D?!3;EfFzN+XQsWRIJk~H`u`R5NbRxw@%=?-d-YU}X69I$k`21@W%F$9+uD~9&Q zY!N*GwuIrSj@{#M_c|~X*b~8OnN3yum9QURhXfXymWp**EaetTQ9XY zOhJ<+{wVJ5gJUEru`EqAP4RZCWU3?~+S^BmZ4jliPs}*LGz`LraYC0Wg^j$(^TCt}NGkS&0rT6hQ*ucEas;G~xy+a#!rLR|!gJh~0A z(dZn3e}WVqI+Sp?cdl%y(CLC+JAzN6!2*5v=HNW;t!b6T;etv z8!aBXzZ#;I=6l#;0$ahW%8hr{FO;kqFwDQ|*=*^lq-FU|9F_y`is7B!Ufr#GK<`Rw54OtGT8&+HExDE64#H(J!EMb3sfE-X%%y%X zC-a&3t6^>~Pi5pXho4VuO!t=^Q4F540UCd~(NIYxg772A;YQEGB#GPlB24wFqf_2# zUOJItwcy&aR2`_iseoFdf)Z~ZzbzMb&!I&Sg#HrY@rmT?I_Ta|k9l!pT z@tB(AXDVFw4qb4F$c4*%CL`|aXBT7Cf-)pi9!!uR9uriBa{cC8-i%hL{a%p0?e=hE zry8Ylp(J!9#i&M2b=Gla;z&hP08e`%V82l#J*7jWq`t1yI_?WKCXllK1!woGp*2)J z326p;pC5qw<#s5Rtd{Ar)ej)gULuZiY8f_9X^a+``RcTxWqsAO8w)O1fu1C^28>Zm z9gV|Uxoa9qfXe`11&5ZvSz1Jw_qhNlAVMNF5tz)75=`yH(adiCU_XEtg>v0 z4DNcF4%Az**HXc5CKqQ{QmG`g7Ebfc=b=e{=>yG}^JR}^`3Ma3P`_z0U1XITq zu7ZsyF3k|x83Y8XTsn@z{xUGbC=V2*$eNQ+-Ws{(N_HY}+vwA1sMGqWF*uQtKZl*( z7d=phVH!P2hX68LWbb>;8T4vw6icULSD(W2NcN1z7D8Gw)?k~2R1kb3RuF7ET};NT zd?h*rWsB4_FrWiQiiXtEm&mN54tr)wDTqygoWg{t2AO+=!|s>Gc@S!hsMPPMslhu( z)XyM21AZpbk4rfx_W&pPCQqxbj1Dgr4IAOGX7-4t<8_|EWkF{mT7HRl!?h{rfnQpXJ4P$GbD!f+q@ zSd0pI^XtcSzZ&C#ziUy+UZ=``?S-A(RUMyA1Dy00l>uCxMwgdOSFD3wy+zbb32mqP zIk|>kh0K&MB)dXoR2oaXLj&9w*m2q$BQw?if7KGDa0jSknVw{y8MZ1x#jwCXvFio> znM+!|YZuDA(%|;9Rw*N-ZH*TnJ(=2xeq(yBF}lJ598_**JlTCj+=DILY@~F6jFM z)2@KUrO&&$1a+8%xc3`rB4I-z9^AntYN!n+2d2K(y!0z}lgOMvi}Z@#*uNwyO6~Rl zlxRS03@t=&OO~$Emn85=?eC{P&?pIX^Y{9@-kO>6ugU>0>$hwqjL4cuWMSDH!LSx& z2Ix<4)M7H&M}Gm+ob-Djwi%Ao4Amea&~Mip>+eqtm*^0ZUdichRCU?&PW>|Yx6{E= zw-cqKWEO$s25P4WMwU5r2L=x7K`lg0Zcp-gTvHEYTWOM;UDFun=PqKp1!OsGr*L>D+yG4XL6pF^5xrr4MT_-8 zE9RHEoE`LlyXU@>Z!cqhZ0y}ZJ(hTx8ZVfB0g0;KQJ9Z_e7B{fF+}mW9#Vc3D;wLr z{R8lV^gRDu)Utesi_Sm^gwBFXJm9`7R$#8-*g7Jr{3_B@puO1YB>g4+Pq=#18)Mbj zN^k!tse5%)4vh#?Q`%pE|6*e+{9TC(l)fzJ-A|gXV=8Hl*qE*gEuN7ZD1IG|cIlOL%o5W~$X^`GKVylAk6(JftE7vVOgIO1WW!2?eaQx{bm=`H}F4s=p8``{pft5B6uCkM1Q+$V9WEr(>bGFyqU z#>?rjfyEl;yFSrJ0EJB(af}1bk{q&kWWZeRjmbmj!Ofm+QFqOyBvnHfK+s51;DBww+ZxL9x(I4(%vPAO>A%(g@Zpu^H;&$T^%GC}gUdgB{PuWsPIC8~bL2&H z`CiwGzmNX(&nF~3VEnOhe2MA(n?p~NKEo$^odM(bjh1G(NU_zFQ35jq=m~flSgr!A zk6UxkDp52JuA=5+{wlDE)FXAX-RQJ;`(?zd4Yr!n&v@hH#sr%7I)&9EL?_?q8Z^9O zpUAhI9YJ{e!`Z`_lR^lZH|j)X>y=sKLhEs8+Hg;^Ttve!9CvGhcp@%SD zrj$OQs>AaH)1Oz8xYN80w{j&HEv6toytp%1wE4EwY`A zVQ-0zChwyAKlSfl-dORu5Y>O4`AhR_bIAXG2R(yx8!UfSy=zacxcGx0Os?T6kldBN zkNy4Uv+Jlu30o?}iaE}RUE!-7mhGGSSCy}*xHsc$D)r3i%?g{@><} zH`Diw)=Gp=Pnx=IIpQrDf2?=*g}RK;!?&ikY@B(l&)N&VjIb-Wp3B{|=vdz~7aB6c z@7;R7Wz*_o{r(<^i*CQzviXx^>Hl8TGNL!#UYfh*%CXGsrjCr5!?#~)*>dC9khM*LjMyu;SLSZL zcWmgHrp}CR_in%1vi0v{!~SgonWCxPn=6}+yRw`4%(y=7>ssWf<0IBK3z_lb+c)HH z>vMe6nPx|3_eJfSTeb~3KIY$MF*9LP`?lQI#~&Y?eJL@s$Km!jT3(-deEix=&di=y z+TY6EzUcTfXD(%A_PW>pPRsV`kCw*KO95A2+QV(0qHf;IJjEdm;5lqw-1tiisuW|| z%En*ecB&IE2jxh@RrQwP3L*nICAKvfZE2Ad}K z`=;Xd>$Wi57c*->xFjNMy5HER1P;S|2Q}v+w~UCD?B^t^gG|CRGe}Y%J9pZ^b1aUa z9o^vl5#DR%$R`wG+yM;bQ1NpYby;vp-*wzAKb&j(;xuTPAqw z+xtJz21d4gIovTOAknT5>ngu{G-K|S#fSQy>~Zq`n?F99S$f5D>B_bTEQVO-A2k~5 z5Q`b7cfPRAISsfAK> z+s;>jvBk^q+#@lh4n>OeEl3f1GO?W~wI6tUURm@;xKVQyP+`ifU6bUac?W(rk2fgaJ4^^An``66k^l}ko}?~xP(d$fMy(5$<|G_ zHo#FbkX7Ezys1RxQGI-AeO_6Vkz&zevfv1jpX3_E(@Afd%c*#Pst?l6x^>EwFQ`>= z$1))Bv`*nqz?r{AZrRjNW5bE%D(UA3J-q`1)Cw&!5sU|X`J5y_IIf20m3^CIq}8w- z^oJT;*{|r;!l5om=`GJg&y(lId=)wlS#_d=Ka$%9RQF&rSb!m>q&@gfNox~$6Xyr@CZJ7#;# zPPLy8{4E8Al)fmLXW?N0*-pfEmBj>DvpS@KnoGI`pe~Y}cJ<)VQuXjJzkTD$-{`V< zz;MEN2!}xxHfEryAXY0KFEE|1%o^%H5Z&w*-PHGlmC$TVjV!hJ4Qc6jmcRXhXb1#P z0{r)&PbGXu4LL#VermKUtAm;;hNxhP2v0S3Q<#<7h*P8lQ)^DXkdgAT2+VtV!3tc1 zDp`YMDK2%p>FUN{8GfR@dO8P$tmsY7V^Y-ZhSJ5V zsaEZS;c)GzcB+rWwy9>Gx=UiKOEYEW-?zBG%=6P|Ovd}nOI*E6=rrt5%T@r}BRD|T zg%vx7{bZ8|80&zLXq*D3y5SxY^Y_i&-aCJQ396}DS3&4X(I|U|iPQs}>SwD|{(NbO zn>|gwJ_On{uKND-5>tFJHq%<0*U1#Thy9nrdDA(gKwq+-Pc`rxKVv zdW!$j(3Rz(N! za&GApI#`J=e)l;)Ya|2Qlpd=N5biT9APx`uPoZl{rx7&HYb@ceYQZPK6u0^4^7Nm~ zk47`+y`d__fA!}a;1vzYV6JDj0oZwF!XvYvTH|@!34#;h_u8s|Uj9Npn5Y67%~gW$ zgVieZlWa|AX<=);w^vXeFYwR~z@G5VP|yRMT!>y%xcobtcSUU3#Ce!8Iy{k7$!vCI z1?Yi_y%i;kHdW2+1VeE|I~Wo$S2PAYsW}=`0v2fK{J;q|tNn6F3mBp@LEip(aJ0(o zqoUm0fW}X0I#rD>Kr`I@0ub!y&I40&Szp00_r~;V=BE7-S=2n=lA|uG#2|@TPU zBvdGEIAlm@1QPoW1|=kZA9uHL=#%?z-fXxJ&6s+G!@h8*D`Oksi!0V2m^n-n`aykwTpEszqVRJ{?FLo)^B~R@topwEG?Y6^L)uVT(ewLJHIXw53Bd>qEd2KCG z9OY!7-|}o@4`t?Gk~t6db6?hoZbHAVMkat>ZqV#4kQi+scue_;7WBurxZ6Ato1R=NwQ4k0ImQ&;{#teT5?b%XdO{;JD$!^1C!aoTFgk) zU9-LphSfle6q|rv4Il}m3EXWQ*<6;S(4F4M8hV>#Yqi|ZJ#}KB%QvIo-yw_M`}XH^ zwyJA`Pe#vK{zk_p?4-_KzZL$%q8A^UPBJIkrvYW=a??w{_8qI940&$CgEq4kRN@VH z8Veh*KTmZNxg*pp#d5q+kIx#>UQj9o*c?}SC3qQxmQ#Ji%*HHL;1Bk>x#QTk`?cJu z*|#P8yCXm8zft=9OP6Bv7vA21 zrA`$#z%<1o;w(2DPk1+2BysWHNFVy1gdU-~OOMAFGn1eGkz1DePgCix5u2|5#ZTEO zYO{kY&i;AMxM)s4GdS;yn05}RmMe3H99jS3&$rJSjE!@`!Q#zPW-!#RU;4xv=5@&; zQ$2|Jdl08khqeEn2N4AI{LI$*2iF1{pS)8*Df3Sq!FzkKa(RbXHMwNaNyl&nh)Rlug2^5JUGQ!v#bnsCyK z+Sm<1=ZNLhCvPWa7)K|*1E#lgsc-?X2bct^gbWm{&1eFM^O^FgV0`Nul>mQLjWSfh zEmctU{T2WJ-TRYi8YSrSSi1bc`3)V^WwlogdW_!0g7R3SP7~my+5o4f0&6Y&?0T}# zS_oF)VS}s>^ladgcF;_nbBE1(1QSa1*CY6`MfWvv5GN~lGH3>PNkwi z1b%8MU*)YUFgxIRm39Mj$mhgJ9{fs80is|Hp&nyeHM_wE60O21;HU}(mMja#i8(>H zn4j8=5`O}+YF{UOOy!esm6qcd6QgDt3D4=r!zIEAfc3%V^y8RO*-Gjk@-#i<3w@ou z-%v%#q>scqKq}}SFw4lLh6(!O=iw+1Dg;pN>*v-`qd^K;0$>Wzr#}l8%)9x#|Km9L z4d|g7j!=hjjP8{V%TYr-Y{9cX?zB3Wgi@d3ewgm0DnSp0X+eGPcat2iud|O!b?f5l z7%;#CPQZ^$y)dFt7Uo5GAAFBL-p~0^U9IS5GFH8dof>kZdVgV_9`{B}Ir#t;33~Zy z3B}=Hk69eG5%+W(?!%+_>%F(G!rdUzgIcINAjC&CC!D?MaqNzUb{y&f&G7C!!2wDF z&MVOY^BUBX*hGE`+6xBwYyo_3#8d5^gO?Ittw4ExY{ z&t>zqVCy6Nfw1^Q7K&H_vaI7bo!R2OuRYfI@P z)KZe=ner+aLlOXNht(uey<*w8q;cs@)PbguAx`E#?5#$~;4xUKW;&T@)JozteS!0V z=%YN~J9VhaAAweq766^pHO%3pH#geH4Z(aZXj1!m=t4b@(&XS@V3D3F44_UDT}Ld3 z{nmZ+&=i1175ZW}f^p5qn!}>Q*WlcEVEoge^u;kSxy=cx&|;#FHGc$SzHpwBPhzKTJ_JIF8r zT}9uL?oKKhF}G)Uj?DpQi9wB>4@c`f$s&WVNva#P!ByY!0W)~zTQE%I^U+d*d|zME zFVW(O0}e3XR}S-lV#tvp3UdN%C%qN@%bq2X0+QgwFJlOoue(3BKN~8684vTBAERoV zCIK@PeA|L8%UaBE<1!1%ZaFj%Q*bsOIn?1J0=qI8dR$%m#9K%XHI&r!m{vxVHqucFIGWLVVxcU)tgI{qRHfK;dm{wp8 zH4=!bDWH3KS-?O521%MV18r1$`-VP1uDKCULif!mIy=Y*Xea@FNb4#R)nv(PMjv3_ zV?3c(HOkG_p^0RW$af+e$FBi%R^SUG$P z)<SpjhqiamQC*-7-wz@&Hl0iEKMurAA}QLzSz&RK|y1!lIuNs2d{(Vxvk8 z1Id2#RaiuZ_&<54`nkrX&`?XU>L6_FqqvNZ=j22U%Hy~ich<^~PaY;5;{E-*2;_i);SE|Vdi z&J$}3drbA@mxB;MYg{FC6Gqjmudbi?%rvy(G>?@>jac*;3HsG-@>nr?kqq-&ODG=^ z-FXMzuwPEVR4QD8Gn^&~rGXefqfu^s>VoxyooY1D&46F^i?74zL;~@pEc6Ga09>=; z;Ql!gyECX|Bn-1WI0}k;)0nCUCW5NK4bsC2Q(-E$IISXDgwsSz2`o~Lswq{sA02Z3 zG(G%giBHw@<<|!2r;d{#*_IEk;dqtFrAk1Sj#=T^#G-I*=ob*8p>o(m9T=!MvSV`N z8}ZG_)C{tCJC(m_Ge{HZW_?!18OpR$Z-PXbF9gk-LI@?Gh54E4VQ0;x#--aVRq!Nv zW|FP0pIf!av+u$`i9TU%MvZEm%;$nb>HsGr&e)?Ge3mu(q=sR`+|l|1`#McDQb?RW zi@NnQJXE9eU^W>l^HtOjfDh0eu;Lsom_|}#LAHku3`!v{tSlJLe155$$5!&jP>|sU z8tg|{m2E>hW)j_U`{tQJglj=3K%|c@fpLYG;y{dsw;GYZw)M7P(nDv*%@Ua&bk4~(?CO{>kWRfAF1}Ycus!0X9)~5ZIr4yGS znztDI@nfWuNd}WtR<_o_G5Z@1=?gT1-afOSH{eD$*NX0|J%Hsr{2vJq7^~oi*sf9% z=ulHtU`F+-Jzyv96Nl595e%` z$rb`XA;4`2z&&8nHoglsOuY0~2%VBZfM#x|F5+aLp(X#8nl4*tbd~f8&=_1LG_jmU z8c75bQqW&&-+;M*nzi|>4I%!1KkEz9OI9DXx6BoQ7#yuo?QoZ(&$Bk5k91N>x2_7o zy;Y-zSRDe`RI2Cx>nrtb4h0sB*1&#OMMY9jP6G@2`SxGu(WeN~ez~F{H^0?8e0U4(Vs2zPhu8$5n0Ot2rjBXv^!(~|g?k~Nb zNzf;HUjK23%147ynDawCtBVYh^{q^}5HGQX)Omu&(v`h`QhQ;#>ovM#0`8g$g&vs# z3#jdYuQt-u|3HkJzlyqHPUhD{-NTV!=SZ+c<$Zb=vINfwD*co8jyFk+pL($^L9*P3 z$3QVM-bassLDO+!g|5fJ6KEC)adOG}XJH=e`6+j=+mcFy%EC+>v7SatbQW~91TH3F zey$uA>d9Wrt<6pt+r)dIWU z5CCOrlw{0D`hL8x0FIBi$^OHen6K(fAEYLq%K(Nd1SR5MhDrw)Sw zn9o8UkfxaOsLx1Gf8f`>sosqnOfr;+?rQr%q1sDkBs7A&v5n4}pf~3Lc7ZY+2MiJ# zgp)K;W zEy7(O)u)$smpEZ#aC`I)5U1+L8bkK>1|_JC#Hv&q(udBl0U#OM6{Z#XL9pMHkG2p_ zL<-F z+>jPKS z!G3cG3R9h$fkvN!!A|-#$ke+RS_U5yKx|VYTq^SGtWpcj!lTh4si-FDz?MS=MQ;@y z*mbC|XlMO_qlXq3y?ytZ^+O-mS~7my7l#9eTFDx@dpVp;`4cMF;8+Evc_9I(YZc z+Ipp^E~$P?{l20@MfJPt>x$~@>yOqSDLQ<&{!G2E=t$DxFX~Sey;pSj$NK-H=*;7p z{vSC0+4gZ?oBOsRVQ$hY$CUf7d`l&^sAPAJ6fsh%#7LrqqLR&hmTPk>cM|2QbTEXL zqa44_@8OU4<6}M_J3jmD{eHfV)dm+AvK9*KgG**vTZNq9Qa!dLt2MYRn61w03@$HZ z8?w5CD`wf&tp4Ciy&@0RP;ganksoU$xVo^2!Ws*%nJtQDO$FEL6(_N#gI@&~XS03= zzb-5;X3YiH%@#MZ7K7{cN_tuR;D+Fm3D#P0V`0exYa_U6wq%P15IK6Kl5CL34K7t@ z3lp0QOAXoL#Fp7oYc`VDs#oU0mL;|Ym-(?3iS31D6t*g{W40`sjV5;Ll_#;ah+V z3M7sOS7#Rm5kD4I7Z;I;pJuBYi)h3#y_(*lP~v!S%|uZIaiXwhp(u(tIa{+;#2`-T z)k+q}6F&#nsuw2^zZBLQ7AF$F&emENGl|oBuRMy=h~I)=`4wjnzZbru6lW2C%)W{) z&L#fTd!1CAPn-#Uon2f&oGpA^T+Al&W?wfJmlEgn>UxVSiSxmA6UDW}g~Gap;(Fq* z*}AP_4slVhUb3W>xD;HkUeZZiF03~!=_dZ3t+y`eC-U_gJW7U$e}WtQN=Aq)g$h+Mx?MUo(k zODR<)3GukmrD&2cra7rpizGs9&MwsJNE*D3tuh7)jp>vuk0rkan^<4a*Zrn!HZyawbU&)8$c~M%qQ} z@+;3EX|uX0N&1+#z2%i8 z1LE6>@>-H1>+M2$J;{jocB`C2GRAaER;>->_1ge2CX?U5O;y zVFo-ZWy$u$0l!K`vIA>?QmIOI|7X z$Kq->naKOtSY1jcVLtU%SCYxZPZQO(WD4ukLUlcv%KNlc%^}k;W0EzkWIAz7y{40V zku_#m(@hTHjak?9lS47%9yLScFygph%?LT1HBPA+BVXc;N7qb|BQO(5HPhtF#EI;h zpX4j7iQ<|$awKn}v1XARg_-QF;ghctCnsvw$kD9Hg_;d=3~zF)2B0u7Qic_xfrmSm`lz7Z%k6KyEb>e5gT1CnY)@MqsD&;2cb9615l7RV=RI5d~ zMf{Rot3$cX`cho0Pr1YU(pYOuNyL2Ztu?3IC4QZ##Zr=3Ul(dEDapLATeUa}6EiLO z%8rskoK}D3L`h{$8@_U*+~ZAKzw)A_VZM31@}}G;e)D_fLrG_SqrCE^Jm7tceubxG zV7@243Z!Hbzh}P+qC8}MFMdU$JmP(Cd_|*VVSeIIj zdc~mRVtz`#j;A~!{#1XRKzYjgY4|#klE?dL{hCS1$IN)VPNO^{&iK8~pgd>IP+n(I zUhrn3U*}Q^FtbUo^C>Thv)Qi;D21%q;@4~ni#OZ&x|G7k@OocYQi_PYiPyE1Vis@V zbv>no$J=_%p_F3gBv##r>RAS~m>V_y)#CgBE5lS^{ zo>DhPso~8>*G*AsF$+m`)09`lh3vYYl-I0<;<`CX9dDtrZjn-t`PEy;r!)|MP1LPX z8d<*<>NY4%ykA>&0F{GTl&lA-T;ig7y)dCMg)+voy)E~U{=*C>?Pt4z>#(e4w@o#ox0dCrSq{X^XJYZ{@hur?`8W7JjNW^~gObq%wX)HF?9CvIgo{iOb7Z521oQUCF_ z8k-iW8<_3hCO&nOxINLdM%`jH+gT-*rG+}*sG6#xxk>EKT9hxW`Uc%9*iOs>A zIL0(_eMBF}oF+j+OmeU^NjBma$C4&BhuG%eXh?lfifczhkw6Wu6HS^88gbodGIO8} z*NY~rFW|}brpb{6{JB0fdA0zR>q}FZ6NusBX^Q%S$=pDi5=k(J8$?rP3zl$6G?h8Q zCN7PpsxQ>X4W+4(geJKWG58qEo`oor#F=0uw2 zoUlzZlcuFF;@O-=+eH%bZ_c1;vqh-QS+w1AA~DUmG#!1>K^GPz}%wvQy4)AEzH zpDkI^GDkZwC)w1pNVC+J>TBWCtVmLmEo(Guw$!hd4VulI)OHI%$LS-bT0y!k38~R4 zOh3p*8nuek56vNMT9I@+eUxXbEZv@j@^4k7JFrpIR#m#=94e+2O?T3lPHxqrJCmey zT6O3yZ0V9#eY)$MbW^J_B&f>twVKo2NivhISh@#W=2xpF-E&T6yA?`e~BFWLpH?kFD^lEsE|xr?B0|pyTxw zrP|}^1d^ggdjkCoThXXJksdIoXw%N52kI+%wx`k0l9c@0GwA2oO4Rl&`uRDfnD$(H zkiK$qdp`XFNjayzfF8_NE@@}eiF3+L?WJ^*zDi$vC7n!CnQX76Q`joM+Ux1mIhE~p z4xOg2D%H_Sr;}7QpgiA2wyIG_H$7xd)uyAL9;&bA*)c>9BdPg!jL^f`YSfM~`lUIw zn2srWguZ%m$29#iNj<0IC;bXr9U~c-OhBD$+E@#B2oJys&T}1gAbFm2D0Cc+4U<4&3)IY=(K#C2)!Wfg%Kq5fJY2jQg z?6f#KJH-RYa)x21D7zugoF%j zZS-Qt+$~Oj!hO8U$hzFkCnC>GSFY(@@uMOtjTq0zT$U9&Y#I+E*)qCm*XBAsiEwJ5= z8CBi-3TJM_!K*d83Ak(hQ{U|g5g8MBj1Y*fkYBlZw_7m|EqFs0G_GJUO-~Vcu{(!N zD+o)be_!1ACN5v`3E0~y5!%8zZ%*sZ%y<)Zoqpy-hK8UnqUT17!piRCp1_b%l7+?{ z;_@ilqNIlu@@Yc|lV@{rLI9QDqX>)Kp+N*SCdcbh*e;6}0K(X?IL3&umN`tBv2u_! zctQnI12>{Xw-_s_B0)eBPJjzwfpHJ+hk2|d|N8O0$gCjg*n3&GTjc(uAkK6F zLKwX`({W$HByi4thK&l8y;9-8+520F0o?Sh24G|W<|UqR9?6izNt6PQaaJ_^2HXfR z#*0P3PT&LvfZX1TW^eG)r3z6Y4*fu>-VW}ZB@%})<)|?95C8$#R|<=QY2`h5Ay5m? z#@&8zfJ6l2lyHbe#9tg#wcynY0~k-xAb_0wf;?~>+^Kw!x$n{&L2mYj&tl&vCBRBN z9@q>0h`0gA87fSvxzsU^5l&#bLxQ_m|NW2I52g1{fm%Qi7x4_J1ll>klt_fI3h?QP zh|Z47gu?-uy$7sf1!VWCM4@75NvKkVtlth(fL9+n_K&4u6vBm(l6XJ^@Z$U!J8%@y z&Dg*AO$2EDZNWh3!18bchqbmkcb>e0w$YHe7xHaPqqe`2yQOM-0K8g`^Rh>Qr}(&j zdr$CK#sY1BNq@KLjulH4aNW!iIB*BF2*r6Fuz@{R2N(xzk|t08@(syE3`n9j;UkD` zh6zX075Uao$pDkny$crk*(MTvR{>r{RSsNB)pRKn07Ll7cqtGJ50y0*nd`a|YRQ2A z1oTV=OrWQ{Xfkr@nkjf_+0j_*!Jr}+;1ud~xm^@EEtm=@<23U9cb$BU+iff=j<|K! zq*MwCoPbm)5uX#kaC>kt9KsW4vgmYPs%*x+)J_UmYkRq@ZaE+Y(;G*Lcm1hw@B-L_ zuH}v#r$_Srl`0Y^g#i{rl;(B{2?u_6AMEQnA8O0A4*}tT#3sskP~FEC4}?Awg*eIB-Bd0XB0mCBF|0J3&5{^FAo-WYMvb_oT2> z^T(Rr)53fWj`zI}4LeOfKKVW(%&+M9ulG@5{`1GT-!sDS20l{5@nHnAkH&C9*qI_9 zqv6D`fO#LAVP;sM!3oddw6L?}6aK>)VdsiYP=~X^&d;BS8O{w0GB}w$oF8_9d@^Ua zAS}4(WXUi)j5vR?X}C0uWN@l)xH61PJ~cU98%8NQ^=r63j5>d6dzceOGw_xA&>BW3 z`#z8~y_iIT5Iqt1-ccq){umBr9J&kU$&f+HbarUy$asNXFnf*yQotK#4@C4xr}aW< z%tdf6A8vQi3aS4g2)FddwXy?OZa!|RBTV&h1~iO-{56w`nT%=^c6wgQYH zt(>Za><2F3hQh>40ZSDv28;$ffV2NCG7Yc7we1m=g~xq)^2A99X?-!u9X0(y85ZRR zc)wGE#q_weL<@4;I@EFSKaXqxt&yu(1{Mj)GnPZhMUi;m48w>6WA`27Ji$pI;bDwI zTl-&9Y8F+ND8`5qEK2nd71R#57)R-kp8hGw1W1stOG6W6!ZJBBQ^J*qz5e@|Vs>yi zP696?47tN>XhH>uQ-A;xUDzc7X1O7;9~R+{>rak#QCGHokxVhssxveg4jz9NHsgTk z!sCYa=n8-A_>(((j@lbE5n1|fkN7zJ@!g>FojC%KS7dP%gfR?&&Q3JsV+l%zvLFEN zf)q$wc>xHAKGB1}q6LY8(JPS*wI?wMM&8|E8F2P&_WU=wk6qthsv*6j0332Ec=96{ z>x115KE1BV&G%cdi9cIlrE^^gVVeuh;lSu>Bw8~7#$X)03)+3E49}Xqb`Sun9BE!J zBt*jIzexLjg70xCB_n|Ga7R2T5ByMV{TP+_>6?WkjgkX?2)8Xlm42G8t~pJf{InL{ zSVa9)L<^a9Ly3>d#Ey$gPxp{213vFX^u~n%IIK!94EBYMHQOPK`zj8z>`gHfK-mic z>1G@?6`ui+o4ScarV9b05*i6(Fx$?nsM_A@7R7n0(AZ4qRdH$dzY3fv+L!8($@W zpA~<*t?T+0&CJK=nIlcy8)~Th0YO-Y#M3{0Q0|)fNB}%nV|g|F1)kRooW^PNL*YLt zCEhPpc?hi`1Nhb0akid}Ts!#k>8EwXGDEpkLm0A1;&QtX_$YJPr~<7jiG|?Ta^e=J+wjOMVZGYrP$t1XK;Kyc@u- zsy%j;>5Hn=*bEUH%($pHd{GJ%{o}xNQW#@}%+GAj;|60VA_a0k<4VzY!2fFX zHg^VomgLI!qSkUjoPZ(a=I7D94nW*$&kj!eXp;%x#yMF5=O0z%h~p%J;AtFVv_KTl z$$%V#IK)Z7dU5N5RDLxM7bgX_=Q(>N_ z))jY8eIAd%8Qh_spIo!UQ60Z1aJ3rMLEu3U8gd4W?}t8+1(5J#0Hi>7Tl``Oa>{HW zY--&9&l{%3xRGyFFoLj+*^A7`{1@)(XFU25z*#5*G#DJ%`#~cJRu}Fzp}`(~R{dc0 zf*2U<4onFE@C`1IOWK}>!Lrn#D<%UFG6T@?yzm?1pxtSweSjCP`s0v=E%ScewD0BP z3-@Ebl@%s5+@XSS+&yy4dC;}`hAO1IHgEvi(qW(_QwtB0-~eYg8Xg5`aSkxVf5Q4j z#BxDJ_zCEj0*r6*mkE>%jqeW&6N)G~W9MEuGSe}_@wg%T=<+>5kT3?Tg?2ac5|ITY z7@}xIC47}(FeJtVa15#3?>oL1Tn;XNSn@r(Fk$m{&iT9R_sGbgPB=~wC&>U_I13vK zRsxCs21rO^^#)8zE9zmHknI!l;nF$QNQvn@_T`X;ESn$w>zQx-*zW>gEzP@BfZ!gd zQl{qkz~xH|k7IsJt^fN-MNB@ZS!@ve(lfk1L85K<#Qu&hr5yrpnrSkzM!l$-uj2b$ zdlxI_#<2I6sp8yEqYjr)>d@54Wp!mN^jaSbHso&osL%V--+JqsKH1iP zWAj1de6wlvQ!}u2uPrCX?4v;JK{X&E{2H7&p&>jY3TG~atMm(3!h3KB`X$#6(k_X8 zR^Uz;JQC{HJE&<4-H;`Vjj{e|7 zbJ_wiF!{Azf8?Xy`oBK~D9lREu7cs6#HCkyZi@O>ijr+3FZkCU7k>wI zwTL9>OM{Yt@P0rG9`g~07a2pSTtJxIQJ6;BmPDhBzsN_nc_f8^0(EiFN(0Wo88O1Y z0yjCb{erRx<$a2a;(UO2+5&*p!#Es8W5}~^#+YJTZG47v6|9k2-?g}{jRpx{#cbRC zpo7J~wl96`IYSUXQ;Glqp??5JssIs#Q$bs50KcI%nGgx4hJ#Eh-f%|%&Je`I+!;?Y ztt!8$nAOsb-24#~38?`k^Q1@!{5Q?hA|b}#Hy;`a;rz+@h)9Us|C*1AgdqL)JR=g~ z@lp%%kq~;+0u^^p)%-d^BDLi||j zS8F7MiZy<9MnY8B=vQ|n1b}UR^+!Ui*Ynpk*(R%jB$RXqkv4{B>&%u zb?LQSe&njWjN2@~PF+;S>j(b;L0AUaiGXcd3+iC^MQ>teDPxLyZLO8?|(Y>Yq&EkJO?71>|9Xc{G+%c%pgijp}- z-4H5w#i#yTJj)Tc;nsmiYXx&!{1^4P4;+!xzf>(<@po2#?bvWJW>_zo){A>JKLS6i z%Wt>51$3iandbJ3C+fxeq(|iaqEJSNp+!S3*P}gV=|Ge#r>kKpI0`u_o%L<=A8JyX z)3JF#rb*iPM`*nm8ezAD;V!th)&XWXxf1D->6;tkrEL#D+w0QXEqwsN(v|bvb=iJH z9N%670^#B|T@_0Pu{Tva`vAJ7D>Cr%a%R0+pL9MTS1%qT)eg$}1HU?0V0$>=*~tPc zKkV>C=q&5Pg#9=+%UWE$;K1#x?hXo!CK>H&Ce`8{$fc_7^$1Pn-gEf}-;IPTk zLwyoa`(mWgpJMAJn7wzvS%1W2FBG~Jv!Wtef9r7V3%oL?zo`Q(a5g#8iSbIC zxEyI!m{@}Zqn`zae%wJtnDcjYHFgiW@^{-VD0EH&@(s?Vpgw;u$3a6nBm2;%W3se4 z%*o0*M%w2Ce?x*X_yV+__WCuL2k!s3BL>mQ*NMHkXK0eI%f|IOEi6)(I;{LzM8 zQS1B)*k5(_642*k8Aqg~1E=|x{m}Bt^D?AkNEb}sw3MX1&jXeIo@#oZ1D*s1P> zMCi&+TjkPz%<7Y?j_8PYzu#QF;4f`H)6#IU_2ChBWeL zSA#fb>?SDq>{3Zv3wS;Mw&zqbSdw%*dFm!;YAV_XZ9Pc4E%o^hsDJsEKQx?F3Nu0k zt!ct8p7;{EhK8-Z_;P0rZJWL@zI)l2yJKfK9X$lIyivvf=7Qw^?`Eazr03U3c4Z#9a(ntFv^&?L4|_4ltTf zQ7@vl?ifk0J?pYEm6Gv-_gP5*-*1ACb#pwwUjv`qx#Wq+Uq{E5w*HV=-^s1({n4?m z&W+QZ`LM2TyMBM{1F+lL3HRXW>K;Z;2`c_kL1V6lG?%@AB~P)VwS6W zIj^^&JgaO|Ss!W)E^E`!hXT4MtbCP*d5z{=0 zN|@Uf(*g~*cEz+#qBh`tn*mZX;$L?(wKt)r&hBdJXhI1i`mD}N$zbEn4F4!>sM*>W{&~BhYWsPV|7k;&dux=>gSJeW{8Jn1wmsT^#5R>s<9Fit09{zw)^&tJzB$W zJ1puB{MNP}Z9Yg90SIh(vj1V1rmCZS=BF=Mn&1c$K`8VDbV{5`B+3psAg-HZR*vZ)kXW4-!l z%{Vp}TrXKO;wm%@UR#Q>apaIJw@aEFIMLSI6)_IRmyNb-VjP%9Jhuac+@@fL+njBO zsnV%UQ_lBf6shm6&2loT01;=Cwk<9DIKt-swsfl<(B)vmhxvq{$-36@BDG(<4~zwjsRgp>XcTuboqm9{&5b?gwu+>-5i& z(nd$O{2KrYV^m@z8B=}ztJ3(h3D7iLAr_eenNK57jDbwZey0dyWeOQ@zChK6B>+YY z`PgWVC=C&WqLtZhIbAi5b^pXSdJpYu#Q&u%>W+KYECadZP{KfGM>fNla~t?W7I8uh z!Fzv|M>JYLzyUyv5af>@?peEp$Dya1B%u0DE%??a;fNEK=lx}nu?j*%{~G!gBj`9; zyaO5lxR3sk|Fts2%C{a%pvBgxZ>QY1PhN4yNoAvvLTd+AKDWVo82@o({GbSqBJI>? zgRSpZ-EoS3>Lm*u(A^kYl#ki4Ho;3t$rcE)A4x3XV!b&EC#9)>&%YxTs1o-o3dhvwjOU9uZ=5FGrD<^gvu+ z;23NPy3Y@C6q(5i5?UbS{=D3UJAvo)Fl*M1o-l_gT^`4s&XqS#-MiTW62>&3qWv72|iHPFcw_jeZJY-Z^#^hR*9(wTh z)W$bJG4>?RKikGjb&V?XT?y=q4KWMIwxp?zJQ4f6=ir-5hJZY`U)+M(cxrN&%>K9m zkcl?8)mn2yi|m(ii|YZ?&}O!~5*p1WuY;%KG;K5R&R*IP()l9KL2?|%HVg0Sb#+yG zTBIGk8fRvki+A_ZiIC9}{SMxZJ7AlPHjUj?;D#5C2E*dqZ40K3B6Stz@D9_riiQi6#kGS)_+v~AR-P}KF2Idz1IzF}O#NDUbFpfHfw)$%3V)JmfK><; z8y5H+*8;x6`!Wq{6)MG61eW5O!3Mk^(+I1`7n2u+UE_jWJf3M>t7tB6A&9!h0o(9r zm?l`IQ1N4eJFYc>UHCwzX{}PFc(|a+wMMW9e~xK}RpyJQ3))_500;0vO!Hc0bBSuf z!`JG;_xNDu9;`~J#IPXYS{*owCowH*RVpP`1nJjagX4G#b1znvFCi}!d+inY8Bb$k zYgNr9Ere38)q>yf7n%F8YN3+Hgq~ch0cY@`%>A`$m6G8?W!I{~d3-qY09KtZnJ&b= zRs}BMBbb)8>gH0_LIc+-!9VybOe?HLsMN5~=W7+B1( zXug!ZFf6_dgb^4_TrJuhX(5b?F9ih%aZFq6j!@(=;T`cMpa>zJd9ZdzB{E#tB)%Aw zAlzUc!tUfF(}iv0i$D}1foWH}(;QVTd^nyB$`Nie?XjAns9|A3JPTAJBr+XpH7ijo z!u0q;P>qnpbi``$QSu_O@h`z01SZp|R?A%4LL?==0Nh1LWjbSbg-Rb2c@qBu)Fq@b zU21n#N{5S-#XkoP2Bc*;DC z)eV(BCc5K#4(LqCXCA55t&|NHHMyP*x)Yu=k7D)svgx9>*B^t22?b2=T0L{QYSF{j zv%vodh0Oo3m{7T4QNr~{;0Xeod8`&wDYqg@zy1(BO(04`Pu23yDa6JtSBfMsw#u|kx42ylfeh<7%sAu}s8dWN+h%H@D1+Nksnf_Q~ zzJk0s>_!S0OW-i^wZ`U(7UHNIOz=9PnMuH!geo2r-*F=uyhUhbo~bpdR16n4xse3k zCA2dGu%>*)baC4ocfk}wCo{0t)Lf}r{P2xL@IK)U^DNdZRB2e8aN`b`N$6&tt2L`s zS`nw;xD7rg^fJ$5&G}0560tXKflmni%%ECxb7c#Olp6`)Gr}PA0(MWR@-c}gH*SJ2 z2}8`_+C7!Z;SyyxZh%FEVI~o4!BEB8}XnXrxY&O@%8Wi+lV}AH*L~0KB$tfeXY> z`)_ihC44`ieohMjAPKa9GSC3`IX<8?7OqM{T8OAz?`gh42-vZf8y_we3*ummPue%W z3WqMk;UwTZM;R}MmOwkrz!jktwmCx$cjnNQuKHUsc=)5&8@4I)Rx5;SO>&?-kY{xl zN9w&Cv0q#`6o9&(0bj;(O~6Zl0r(UDP!LhC8;KJtmFO38^FjkW zz#6bP^aTw}31+~~0F99A=Or}`ddxXRi*5i6nEw2GQM1465P%l`eDMO}v;BUg=Axyq z)FNEZ^)N&I28^S|5voPB!t!CQ3^@+J6HzMl^ML!oD?m6P#F1ynpb^+vg0XZM0I1*; zrWBZWKb{l^t$`JZMnB~QBFxELP*_^QI>OFsr^Y~}6H*us0CJ!-7dd*f{r7jI@JKAU ze14nZ_T{O2v^>zSWud4Dz!)kVnVx$;b*407B2Kqpu}Fq43c$I5yOfWvAo5!)?Dfz> z=UYN{dJHgcn%Mn!`V4S+1epOS0@?}Uv4&4imMZm23Jdj1^OStWL>XGS>DSy;p`HdT z?8D7-U%28A6Ov(jHPHWN$JP8k$Zd_5lcR^ zH^uSCMKRr^pANSXu=JfqdC!A9-E<3OTyGoL%h_4cUm%Wxr#fY3Zk5>qIP1f^bB~Gx zi?VqMYWo>a)r?Opx@zgE3*NZZW|#lezAPesJyK7-n*vh;4(8aS$_jh}*RV1ocU0}; z7>+3}AO3TDzXwDo7{OA%c${ZPxTNV8$|B(U_A(6DrN<-3K!Z237j8eckNo1EQas{0 zCN(AZIduE=2FHq7;^XBlEGx&2b8Nf*G++ro9J0*cC3o*uu9ikFA>}mEm#udMxN;|@ zEtV6AvJ*N|sc#Az-!X*soY|McUURnFoh^51|5N*_FRmufeU4@6Hp`K3U$oDE>XKU= zah$K)F5d^f#C?3~Pj3Kxymj`2`nQcl|7K_I&U6x26cS$4zx}7}-xmt>kNn*XMZxqt z0eb}>A4ly3PLo8O6x?qQ+273yqd!~o=r(*VKYDwtZFXlcy(q#{+^Ags((Rho`Y)aX z&Ugt>mM?b*Uek6RM_Fp9^^b4afpCHCYn*&)R;Gj&omzaUD0NQXK_Sn6sWs!wkaoCi z&Fz3V>KBGdR)P%H_=bqb?eVt0otQE%_M{yqUH)d`c$-LoFTFTJ25odsk#L7?roqJ_ zbC(F9NW7vPT(kWK!`?*MSR5yKQkDff&9MLUz@$6KciMC(f}EIYuc|rO9rpbi#<(1e zO3bns%{!68O*j^6d_-{-fpQSYOGVXp2DXY|l{RlFxBq^657-g(=cVZp)b?%RHqKMZ z;g_9;oq|rVc*bx0^G|Yyh=E}>nPsna0>usF zm3Aaj+TMM+bhs*rKr*eCj|EHYV@{`;m~fD3n~KVxEE62^o<2=!?F@=n-R`SNp?@eit8a1y_z0yUg>&uc>I{*Q-y$ly0N)|< z>z$O-05u+Xs&xNOu!CCOi^DsBU~iEGWtqefhj(WlFAWu-M=Y)=$Rx7tk89pQ^$VYs z70HlC0-GrjxI0h`r@`lfhMb>CkF1RQXn zK4s9SGLSmhg9%`(l?e^_69Qt=*^0dhWD48VX zK>QkZ_)#aV)$Fe7j$Oz|>*f zMSYWF00}%}!_xdxR)~!tAp(JxB;$^3uE zCz1s8tNSMbj10}=OQVXRb^0zUdz0U_RR%Ppx;iiO_dQikNgiwO|Jsil^9fDd6aAB! zh{7*Fw|6W63Ix@wg7ujzxN+m9n}m z^f7-ib&d|A1%A$7P=i5{Sr6SW#GHmR?AfMnvswlO;L0v zXdzM+m6FXZJz!fvjQQwSD9FgU>Fr{=ODWm0Dlc{u{HTy-HRE55SdvCOr}C6F`m%A zmsx?9^1ES?1^Al8lwdG30eo zM<7|=Mf{t;>6T(f+Cg=&fTy=|2P8=AnTp?feh^hM3G~An?fwz|RPB6P&!ZjuCAzb9o{zy3>a*6NZ zr#OGxvwbW-aM_JBbj|Cz%6LkPQ^Yjw$f6I_&f>Hdm|VK6%Kxv4dsl@1QJ1x}v`uGR z{;g%HeKKB$Q1@4ge8BUXJ>WS5V8pnuWI+8Hs_1vgRc}r`dv9{gnSIK+UH5p398C7CGsoj) zc%r+9E;;q7i;~vMRKW{{bHcu=6<7S;JlD*)sH6MbQn*w76wDuB=DbJA(}X)WM|Zrs zKkh!^cIu)B}$#I&VOI;Y|yE-LKH4wVl5bLHL-=UrJ| zM>L(&RF9VLz5u(#IGR7V1Rd(hO)*2y>OkJH~d&E&^OpBc?h^Rd>|O~2%l^DTV&^uDCT!>PLz z(ikquXV2h@ZkBW(UJwdT`|P+9XvPu6eYt1lf{+I6_Sfy2NL|9#Xf5s0znT2b+4b~? z@;xUqz*F)VgY=F!iD%0PQLotXcDHwj-8&Dj@vAKVRZ!`B$kadpE(b7MoR6$zNR$eA zX}?Q;{I>7e`@$5C+^>L zIlk+AIn+@seEg)^(S$>mqneAUOPzK6(_03t6e(Bkx95Yz(U*xwZW~CXNpzKe^Eskz zT$1H9jIj}j>a6}&c*JqEFyE_D?;R|aL4PP3s??Q2wjh<0h zdbex#v)|J6nc~pXE=FJPYsSt#Gd$eCri;}IHljWldpq`QRXSv!R43egHZXaGaRhgH za5jVEi+`gomXY%MrB;meQ4w~&urS6M-s<9$f4n?QsW9ras6oI3zDwt`d%%9Ba=!aT zlyf@Q`QF))p2Y&FV@PXdj=9ZH$IU`7cS{!Gq}r(rqwdW>z2)Pt9wz!o8}3dQb{^iv zFF!EDRsB!W;9YvJi-s+MdU5nB+qY5E=m87{)m}`=EcV~gISC-4aDG;{oXnktA+(e{q%g(-tCtsfKF3t&&RJA3q3g7 z-Fy})lX|NxEwJ3gCWF$A{64pQ6qmo@f5edfAiEoOPWCqfC(JzTV`2|fGW0*1m}Q>$ zPt{4z>{RCbTh7@>WhobGhwv+^?=$SWowW@sQrFwPPkk49^B|<#Rm=F@#r3Y%fMGHv zP1jM3BQ}Mgt-78sHv5!$tUE;8{2gJYG3(rdzErB!TXSt8nV?s-@lFB=@;+cd(!09LqB&T?PD@XE$$fMwP{C2Y4<~%U3hx#N_cVzDA36sr-_11TupODFW z**SgE&?qLu|LuwIj%KO1hK9~5o7iRyyQ03oU{opek{pLkUf#dd-8i6x@A=R%1m6IX zB96Je(++-j=Y)VFxz`N#K*>Gw+=g_{z9#)(Z9{S<&D}-2Vled;suo+WaW&JuoBmy< zB5TGl7?Ci~&L9Bxz@*XR%rRfeNs|Vkz2}4Wa(Q;w?dhOmOiTK`o|EU!{!YI<+I{w% z#idMPMx>f|$i00}&4Zw3{)cdw7)}X~!Ub2HF(eD#zuLVDy+#er)fggN`|87eZ|{C5 zRpdDjtB{gFTq0E{gQbybxDp^v;S9&_8r+4Uk*_jBv^ zGc%2>LHGAsCx4eIy#>#FHzPm#<2v@d#-vzDI)mspJNrM>Qy(D-AQJTb-xb5)Q$FJ*|@u%^*Wlq{+UmWGha<}c8~dfPO$vV-ivAg$Tit~#!5%wOD zG>0Df{Dh+m*oH)r46F?NmEG%e(ZDOAvHSqhz4IBZ?sklQfZe&aK&Z{9I_9dI&F);Y z$1i^jy;#@lduZ#?{+;=*<-{lRi$^RbA8LAxKmVHga;C>p2D?gnaJlFH_sbQ}GAH7} zIoOf=Gu_TOohjypHrcS${S6t}9$qgp-YL(F#QPt#c=SNs9l6`WEdRo&EbYo(k*tUA zASYC+L}_e@D7kn2p*+JCw~I0Sp+hxT5q9Ts8zbQS{-Yz#b9R9b4NpD(+jIQIhUxIk z&mqde{i9i09(S}pmgisY>XyQ<=4OfX3hZ_)=Q@ig3ox~Olqu|a{eKjlg!i2 zX58=s$%R0~4@3ZH7Lg{B0qCNBRg%UzV=77eB$tyzixn1H1n1dr#)9n{uS)_>Z(b{j zgED{#@cuGaAv%24TT4tVTXXb1ln&Zm^8du+r>8Wv3EQG+uSA9GpLR+D<(bc8$9tPv ze@ZX0l;_3&W;c)L+EsaVHg8cGHi;^y@QjDSh`lH-zB$_3LWb#G)mw^H5>ErF%L9K4 zQ)W`A2HDLM{xPiG36vHGWwnmE?71ecEUnz&@6e#;)m zA=02OIgULsfE@OuVmB`B^h0lSq1er1OL1){cuTT8-FfWqb{FB$q zN1ogC2hM;t(KngLFk?V+CguwQY zUy;`IB(+4_kGb9YcaoMlQrc+_>eSh!+B9_73D7{kV}y!r+E$$KztaC2tfpn860XKG znaTyu4fkTvv&6on?Wk|rbylz1C;(`&s4nFT?WIGC5-*dF$+ z!h{8Qa_L3@d-|C@Hm#Qrfzp0Cj^n3Ak2CX8|2RLC$xI-jNbj-4T-QIoaN3yx($XUn zNel%$q?)>`p~HXaqeUjKHNw3{(NAZCj3gg3#V0OV4(eano+LwXq-TDtjSGZ^RsUt1 zduypBq?_hAL9mT%0ZKq}54fY?0dQeH3b=w;?0Ykzp0eB7>FRWLo%H|)p(t#cKOiSh z-FbiFdixRVLm>L_KG#;Af_3@&YXB%0==~g+>t5Vmgd>Qz47vS8AugLBG@;KNpFGY=( z*YW_%#vrb>WEIh<4fylZ@4HxNhV8ig0lE%42C7Ziu&lxls5+{B=uBVaLslrev{P>I z7$$&H2|+_j21P>10(K|8>~X!R#F40BdXf@Z-&8N{j1x&P3Y@)uBdup0fnZkr-!Y!b zYQk`k$})J>s=lz;Ak!T|!j6D{G*XkF4l>nI10i&gO>a!|x+Xg9#_P|cz}a$ll7vZi zBjh#%bvRFKCH7aZgR;vf%U-+ROc~FKM!-6=Q?l_6n;XsiK}D6&(l*+w|`4SGJN0b`cb+( zFK5cBgfQubjbb;F9&n6JpUf}jncYCg`T(&<hh_fT5eRY)0E+`NzE0OSK z9!6vG6c%^OCz%p0nINQ8LT&u~5hE~oZBp_;#2eQU(ul}foDUJ7l!Ve)M4=-k$4@IX z=ALOj*sBnoKjNHzRE~s)EpE^3!M%8O)#9lMuG(nZZ;V(*$vu zrGib3H*nc9)C{x@6dl6GT%l>oLsA|2<n0aNF!QADDS^h^o1Z>4f5HLqF0 z&>;n~WHd5)5D+;VZE3oC;hA$%4vH$l2fZ6tlA*#_UQG1SpQEkrQ0y zlz&3Bx>=)%c+0TIe8e9!e&UC+I3#%!m7!|@k=&uVxiB8+n`_JrmbFBTx5q#8m1#@q ziQXR3#zkN#PW*g3EqG{m!$U!V9UCoI7@VetfM|GMqGR1YUcAWXA$SI`IW5c#wzZ^> zvRs9!nrp0PIs)R@)Ze$>_7#v#WtYe&*&h;);Tk-CFX)_9Jt(Rtq+qf}&H}z>8cpiM zaNtBw$aBe8O33+5TCa0_iRi`IcjMIFekdT;3}-CUVL95{iPC#*TxbWzw~1-Mc>327 z)-My3TMy6z);gF+Nrzfs+4jOkEfM+!Srel9ec407lqQaQrn3agV9h%uacb7h6aTMzF*r#`j)8nn!iEbnE_M@vSYjN(ocm@BQFPzu$t8x~+n z3w%eI-Ky#3@OxIJjkhoYh0DBXSJS>U5&EB^fKbe`3T}bujAn@t9GFa+4aOSLrLc6)HvQ@pV!-HR-1Gb1=AuA#OF+!s84KPJ3&iXyI@{R zx+FFHz65y=l@~M~0@avcJJ7*w6QfT3_pTsLR;$Qig-G>D_)Aup{BF^iR_#IdIfK#_ zRusR2LjFIPH1r>5ek2GD7zN{`G4-z>o;RRoNHBG!tMC;#&LlaMHh56bxTF^;Wfqoe ztuwEWD&)E~WQr?Z7I|q|GN9xloG5s5MO1tM8q5N)N%EtRrv8DV-demq)5A7>bJltw zm{g{QndCYXXy4>@e!$7~m0j^ij=NSQEKA4jNeVF;g?Rro!Nh_iLCGv0o^xFwEH*F|WQ~q@?xw$E~1RwAAj8D>XjEpA6OZLXh$2 z$xilnjq+$R0PhH_{hM2fkG@ULrt9!64~|6;nZ6T1IOh{PBj4A1u!3FT@c@Dv zXPqK`ZOxJa9f!juZzKw3sWf>~%MwkUy+fqrXd~H5CNs^Te8X9RUuX64WluYKzu$c* zk%!5^V)^{rkQN~uFAc?~vwlbSg4x5^*+tS4mHF0M753?Z;ceoosq30U1p%|}Wr@() zdqp3#&ss61>VO5z{W3@ixdh1q5>Sji7vXpznAfIZlNYT>oc(_KKUNvykB$n3c}H3< zB|%WyUn6z7%Xp$CDFS?e0k8zYxXq~3*v+of(JWz`%P*Civp9M!mv*LIU+SY1Ql^ls zi6Ie}uEnVSopH`0pR_Rz17#5MFymir1Cxbw46 zjSqnt=~kj>D3`0~^pOo~Da(NW`$EEa>L5?9h4n~HRh3mR*rIj=6Wg{8gJ%qYHDp}H&i z_Hz*w=m0XHu~3o(Si+jV`(>D!R->qolw<0w9;|7X8D;;hcw!QEsOu!N~`lwD`fin+r3KME-lb#D+)_+x!GIz{w zJ7-yD_$94hO`$-06VM%U{^&;Y<>sn7{JKsRQn|wk%=JUi8k{B92mNz>@S}x zNK`IM$#g%k$0ZMEXwOyK>bIAQ&to1%%!wME64n^0qE{GbL!2(WN%0^+T9sZ1XaRU( zJ13edv!`w#G5Uc(n22)N_>5;*R@S*12$WLKtFp%v_eG@=)w0tmR`lvx0hn-O3Q1Lz zw?JD_xvn-xnGlTK@l^qO~$t?40k$zrMQ87dXV~PK#S-H_jWp$`jKJ zI`EzAX>%I$;ntF>teUlS3~fwnL$p|X|1}hE!`uPh+n@}0)0QhW%qr9cg`?ocY9%+s z7s9BrJVo!>#+Ep6*t9R-(QpFkP#VS&$UjJ-$5d4%@sRav#t&FR`BLWT;)bHGUX`F{ z!11gzFK$!WFmG5{>8JO>DMxq3QD&}y9vIA!nKw90oilHh&ql?P*C@FMjPRy)4~Gqe z+L{at%D?HRmw!oa3-n0-vTov1DYo!3HS?S{HWoB!2ESPil|Vlzbv#kwdyPfnin?h>3dZ9FT|IvH)0$xOx`~lDVM?Z zc#olU5O>f9GVfoSY9a{p;gZm;kuGCrh8a_}$1LVC)h#~7R_x~^-RJUP-K8VUF@@YN zq^gg)W2K=B^L8k72-Dp~m?sxMzyhE_WgB`UgLS)_%%ZC8H6D*WKK{_pW6u?GW4E_y4-bEW+36!VDe$9af8FjnbK2^C{Y9r*@02or zxzuGtf$H|TvEwr#z8VwkZVbJF>ZO?hCq%mNqBn*-Wq=w(U+pet9 zSvxkFgGZ`1cFY?!RvXNzln43qm%K z02Dz<+G=f>93Xglk`Zp&!*4!PV`pH0yyJ6b6j0edZ^2h%rb*@8u7k=!()aMe^1mtz zT|Q?zA&5IN3Ix<33h^>OJ@~gO6%NFf6OOLJ`&8-A87Ha)=`7?cr=;7 z*sHI_%=EH`MN8HBtnv3#%UdAf<)y-J2G9BN_Th-m--zFQ7l?y>LELAA&cUWD#oDrF zNc-vd>V_gFYPZ_ay1n{&;RP7Rr3#WF9$4oSKq%y11K+Mr+E5K300g}bWoh0C+LVeO zR~bEQT3YL^@8o>fNE72U#^z}%R*O7-zs+;!N#V*=lp-L2sBs46j&<=6DX&@CriyjU zhI>x$Qrt*lDr?Mm6~Oz`e-8fMqLhb@{kpR1%jcE(uiSr*_W7F>5*dI}V5ct!McR-a z@+BT7u!*mhUiwu+C48skQ`xKZ{=A0B(79YLWj|W>wpH9rrbbeAg9A_R;Rr1k$bFMu zz5f+Fy(GlB5_mcs2BEB5(JbQJCGL4j>g=l$J4L+pq)t?Q1=-d6hEqg(YVsFlE12lW zEdG1n?g?fEj8wZhEt+oIQjuXz@AoSc7ZuC3=SiHt6y{o47S|aqx^R%*Y1e#i98nUx ztoywvdy>uC=kJR=mZgsjCI=>*k9`C%5`T^B=>%Oh0xi_WS>MP zvvBykAfEs_@iF>{Gd&#X*?(^A%66iv$#AuzSBQWkMs;-FxV$!YY1yeu_qgpt$6%YS zSK_9&n^RKao3iBFK@2koP($>5IX4~Po?z4EYS&)xtbbC`jnAdb8TU)r=3Bk@?Cgng z6MZ|uVy(1Ydu_nGrIX@hVUFNiWF7Fhuib(rjDzm?aPZv3mEBU+-4gq{r5=TZkLk#` znOK4ToTRgfFX3|zwk18FR-Iya#A)lxArUTzl7MPdJp%CHgzLQt3LOOu>=nv(mKsVO zQp%z;z6_Vy3e;jQyKq|F2~pl|4|r-E)>|*y0c23oAm2ii1khmKs6Hjv*OXKC0^)IQ zoBeA3#iw!=l53?zn=w}l%7%1AxAs}+HOG0yIF5---6G5aHh6uxjJ<*6%$;7XyUfA0 zBBUfy_;)J94!dDt;ie+WSBfLqWkTF8roMVf^hBOy_32aNIEHx-XbpffUpG?KfOwFYd4g`T~5pv_#}`@-re1DR7nJwD13xykYO0yRI4S}RIPIv(SbCQwWy>eP*X z9ZPLE&jjuwNF(nmo%QXw8txw2Dx}`~Iw~|=EtZuT>*t04RQj-7UfGqR5z{P(-eNb^Fu4R~U(~bb2(wv6AW1>z3qF+ubeJ_($qQdym78;n zCr`J1%Q7mHSK00Ane@bB+6Y1~tzuhjZRGwHY0p)OmQtRQSxM2nYdsz&n_vk7*_{FG>H^YWnRel*du!_2Yt3_c175wuIaWEM2CRLJHv2| z1z~{2Kx@_9hNt^(BZ&#tS>wE|a=z($m+MM1)+$#8WI=KAF=hkBnytagcyi>Erzr>O z1w>S2w^3-7l6yuk+!$WjMdQ9y=VKi1a4r0WBi(fKBgX3xZWETu+mvc_yenYRQN1Y; z(1rH-no{;s1P-B%dO8U%x+yD0PtUzz>*N;XmE%gq@-qkpZr$(FBq&4ALDfYe>$7x5|y_yuI! z<#S3;_nN-mbjQ<>v?*dWz4VdfE5^^=t#AkA#@DOJ+|Xn@r(VRsR{pR#)$qA;^bP@8 zeJ5Gv#DCTCz({h^Pt{|_T)*R zKun+SU)!#rv!cF-?l$(VS|jd8nnXAC=4)53) zM~v(bBC1tc(SmXVtr(5O``^7L8rN6VoH*~rGHbEXot=5gS(Y_j$oxnpDu`n!ctV>t z4aQGJ?@U(Odz1NHY*^CnGRaSaIPtW=JzJUQ*x^=rgmQwKRt$8G#8E!?;yM^CoND>Qa<&C{#ojMNFGM%hI8942 zHZJiwAo2aLv41MV#)>qdZE+4LLGYTKntZq<=?I~eUzWN3GTZl;w_Ta9zjDlvZGZQH zv{TPbaK9IB2pUtJ#u1Nb@0r_j^-$a$Y8aDF@XKr3GfhABzi&EzJ9fI~q}`UZlFTi? z;khzPefse~c>C-5EpC|&TxeJnt1AEo+<;}*>dS7*jpU^>KasH6H6?B?{XEPGrWrj~ z+C(l>m{o^%5oUPuQ4y7kWF^3H21^BPpu2ZG`H6MVtP?PVH(MQ#+N{aDs68FAAWGLOv4O00BO}+Lw@y)=bkAPCbh?ZaAO)6Nk1hYC z-{nN1d&MlX8NzEOTM?^|1Oo#To?OBJ6O03f<^!kP&%W*oSn7bo393PUzsgr^{*-w~ zwY*x%IfcwOU`ETG`nvwdd;~aF(EQj@uir7>Xx`mRIfHrHp@GDl#Xr!E`&kLeOEpT9D`J}wq`k-w(f-AN7wr5;2F{O}e|Iv3jfOq+GwO?BkO81fo5?fY+^<-AjO zCTM=Fy~yXf)-LRlGw(iDc`*Ay4=RGF>P?_^e(-YC3xLdAwoCUdb|@;m^vn+bjJ&ju-b<9RCpn!3fDAlozFQen6gkZrwS#yA^CD9Oyjn;NJo|teVQVYZ z*uodbE7UJ$A&CtH6MuLPgdQY(ksr6fjx<8+X0Q!L6iG-I)DPY{b?8eSxw3|M^y+t@q%C#TDyqTvgPI zV2*AGT_GmMoz|;4T*Ff!lm9+E=`k+1(3`mdn6Q3w3>xGGf0DmIE06|Z95DpAA*qW!KbHltQM1+(|@h8MOw6eW^{naVj z12NWe9P$sCLc0>Y(5;trul;ZGWgVmma8Ug3Oaev#pZjp_`lI&i=cCa;qzs$5RLRx zNLTNYj~jaP8s>uyikn~duc?&*8!+8)07W*+z^C&xbP^{ZwZ3-{v3GC42<%H}#)WE2 z85v&bcF7u3=dz$rUC0~kCpW1l#zcBR{ipUSblBMW8v{be%{W$1-~g|34G}kG z0ZHiGK%e=tlCNRe;?Dk{9`o;Xj^cAGyw!l`LfrpVEYW;Nx_o!#wRw~qi)g|yf}l4G z&d7GPBmx9CM3f0ru(ZSTet)%umqGmrRPg4(|9!cJr&;v4+6jRY3Np{>!#_3M{3+&L z2!l)_!Zh)`QNesD0Wea%MKa19>|!dzo~q5xi>egVVAOwDAs=ty%9c~-xBQ5TUjSR( zF0(;x^9_%43kssK1oVW)HNUm9Py(1ObRMw=TpjoaFX4_pO&f&1ehPN`<$%adSs@_1QXri zE{M?faa(fosrci;S~t*X!8yQ;ddWq(s9pz!E%CX}aZk`XIbVZ_&M5UdE=Tlp&*?_~ znpT?R$-EG*T@+?-3?dM#Hkla<-5%MDP7D~c`pWApYWU(TMW`Qn-s8A+df}+YdqO>q z?-$7x+PLv}!j<+`1w8@z#?Y-N4M2w1k+ElSn~_$BkM!+t$$A7eYsAh{V7Bir&8{^`H4^6-y(KAi8L|zuy6X$8;@#HO-V9t z;^t2>p_^OQT<`};1XT}N1EN;#x~U5#OJ?EZSKFEXEY*)^rEE&LI0PfIqgODyu1mx zA7A1#c^~C;hDYs#Ef(Q8G8XW;Ut<&LnBiWyLTC@&IBu?iZZqZ-wS|WYe1~lwR?y47 z%H~0AOUx?ddqojr`MVe918pT`ufW1%z4(0GKV!7$zWUHr&fkRlCicGNaWm?&Jp$DcX-$A0^bQ zwykRl2JA`cY%vu+8^gsm9TB1(MnytqiBoI0o+|5{nj-@yu~$tCW-IqTvk0)jy-jk*C!DHF83=6fPzmz2IEiuiKeN3iYU;kWpA zp(qe#G>MnlrUuKfA z1>5%0{^vqGP;MClV3(9Fg2(_k#5bF5fZ_@}orUua$%5_IiSBpXH`UW*_w5p0`1fCb z^l$w@0t6BiM)^<>Y*Rcy1UBgsRST&BE+COM#e=##9G=yeQB-owui`(e4z^kU;yX{% z>3DsIOL(l&r)o)d1+{3LLG`CrAd&zOGC$~MiW5j7g<&Rv7I1mbTN9C(dNfCOrqjRp}GHH*#CNymmeeDYL!c#K8TnQ z7@6GQ+w$}0#6JUmB1pLy^IUb97Gw!uf*5cUV}`VM%&*vZLW7ZM&;$}Ne>bdus-Yz} zr#hb_^?FMP*cqDgU!J`$j#l9f4GTjQGMF0X=81nBQGu~eRUZ~H zIK88CMH`Ultn8Y@1Pq2Q?-28fhy|ZWBY`gfvz~*US5UT%PwjFftb|F2ga3AzD61Zl zRiujWS7OrpXLqpqSe9fuw zIw!h3VbAx+LFMgzZg)X)UP)yds`3Pu;nNM9I=M%4PI@ye9$yK>09y<;#nAS|%7Z3XEwqKEm zRdEh6v1>=__p|S&T%tePjB*vxj>OuOaqm2FJ&5|X%bP(40l`7<9Z@JcG+06|g;P7F zdGM=E7`sv{Rj^JMBTI7e5Z-$5C0+}4tdlXvO6t_-j{8o!Kd7sN2!TJy&yygoHtGLCFsV*s-YlR0IPjYJF-wF=;oum9=AYh z@nHY1W3Bm;FP6ba=AiI_;atlG4}5)>EPxe_Ips}j%9x<+_=J+hO;?Id$95SRPCFKcB(mSo|yyzkOORlpL&Tf0lnnK^_$ozjjcF; zxY%=$aSrKz%H}|a)$^6sV}*&j+9VSo{rhG2bzKN~5+_C^YJy?$py-!}a|W>il{Zy< zGNz=%Y&OT9w~N=$P~j)}1pO|by4qC z@T7SRT)eO2w_GX=zLDc+K(mdp+e_#7XfCS2v_KwpFCOd$6ajCdsS5j|SELy+{Y-li zmr-I?Syt-;Z_=CTvNA)}znC6OyWIEe0KjXpj@dCYr9-77d{gp(nM zhaov?@M>qBpYE}F)zSnLHHzu5NVFKqA<{!5hE%3jBx3@GSU$q-2j)P9QMg0H_ADh#>|+0oLkcyJ{9&?T}j+ z4*489nq{M3Z$~~~VU@$OooYO4nS%u6P0dHzaxeKNW)JSekfG~j*%dgsvXcqVW4@-| zo?T0G6b{l9?TLx~7JKyddyNw>|0?lkDWqa=ZAo}#mZDB@=#cR;r-m+pavW^2ZLG>* z2K}t16lA-x+F#$ivLvc_j58dD()L#0gW;?8E@wQ}nRBDJfE!f*JT4Y@5%q1v;h@ld z<~4=b-pjU}$ac!y7`Cn9)zDG}mE}J!JF4=r&+j)cS40a&aa&L&2^gYj05_sn^$TP^ zMaU}Ihl8qi&TfO`k-_dH^ekD~V^+2S)igpN_l%#sEMGmwe#_&+Ku}bRp3mYuz%szH z6$(S$IHmFrT=g4^$wnoL)*;eYyeY*foZj5Z5B*#u@19 zNDAceB!ut3hv5bsud30AbtiU@YgnPxB^iX7e7T&;$etMu)xm`$Z-D7+_Kf_2jHbW( zB?3pSmy&_&{MtFchE45i>-Y^OR{fa8i?eipFDsOIip@YaKx7~w2?C~p5kPrzyEFYs zqzQkNj(6I9@jMmn3YM6cNX?QNsok6O6bfjFC7IVf%6ZJ70f?cmiZ55e?kK&Gyz#aD zbFVGKXDl8$;StZ7vDdZ{o-h6f!REGnF<(6re%J+F_bx&3Ad9FkQK}Qz$on2!V*joB zSILxn8X~MEaj-=H=F9+Lez%;zqe9?&ml4DM7f&3ieINn2w`=t(3Dx5aMM2WYJsrnA z`0x6-bwow@AAe@tukqzwXf?hF2pZKPO_~z{><{z{5FmsV_o|ZBxyF+^c0_`m^Dm?0 ze~Ajx{6^lH9oD}kU+3gd1|I0YjJ(!w@EV?iOd|O!z0S!4WMI6thvev$pHn1A^Tvt< z?enX!Gp1ud_0x=SG!C?nBEiJ#!Z<^0Iajhv0kh2hYhox?jZnCFeBQ`plpXKQUr`J$ zf^~-K%U?=*w zL(7+!BmYfzz74Otgg+HkNQ!7sUg(57j2eKT%anR!F?`zLjKVlJZrY5+9jdPrfz!+SHG zpaw^@j5$XDL<;*9wH=11lP zI=YMY4dGJIZ=8O5%Jqe()NORQfBim?Ebe=k)TfA$j)VhKev81`V-O-O84`w}v2Tme z$CA7F&8uD)g-$d%1YemLO`D{qsAT>$oH090x^WjpqR3olo+v`^rGeQ)c`f#`{Qn7! z@a2uqANJRKx9zVcro2`t(w!M_=(r&^;=$&W$CNM-m}xk4hN0(Pyz{w3fdf=kQFix& z!5K#tIl?bFMd=O!Je~i zVfRdc?Ux2n#;Z73)o*BC=FHO$&h3jKZ7z=c%W(Ez5FU)sX^ULBvam>8yOgh+^GN(c z_Ngr^p-F@1XY&ZQ0}_9dIDK|J&d-kk29OTp=6f{-q606kr;y12-i{JJ)t9Q&#lr8} zOVYg--sYvJI9A$h^ zpX5x7zH07!+RgHBGcgBdKwm(-tcwBvMbaR$h!g|Vv&+nM2?@Xj$m@S3jZ0W4AlBp6%>)hT}R;!paJmD1nxwks5ihOh!#x<5QHOy zuK*|unC!ecnl6#sF#E84iid8&oGuS3XA)kv6q~cEG+zP|D9d=iqR_&H;cCo~L8SMPkBCyu5b^Q^1IUZD zj1YiD8J1FgR3ndoj1aC|f<+K+iVlO`c9px4sb!2|)O2PGoXqNw3i>^L>xL4XM1#*&0mZvaqi zG9UrW3WCD^um^K)T2|{B>sQ=EL;yyF1fPJ8SqX3lQ*aZ)oMA{%6pNZc2q*Ab0GCl8 zh6|ES$T~pEP{DCAvwW^UHg1!_HZThe!!G5C`-z|+IPDmi3J?HDpu`(g zHIM|Poor#yH^eeTav>L3xhR6LPYb=GQ9g38U@4Y=1AL4%Y@RU?fD?|Ii%Nzvi1<}* zm^{D_12nK7P#X}R;|v%*oC1c2hv=y`07ipXM|e$WL7&H-DNK7R%3(;(O;@LQf*hIe zz;F^U@C6WocU#dS(APi~cpWf;vBL4_!0u=XNOYjAH~Ik4iCr?H&Bbj+SsTCD`)SH& z#)v^9MZolvmHy%jm<^gdhI-&0fKVwL0seUea2yMq3-AU?2?zk;!#rVP8wlQr0fI1{ zKk)8Eu!$llZmeI8I<{(RzO;ep&Vf9d8V`-W4Wtu~gNV&w*dT)g7B-V~VZbWTmn1{? zP8;O`)B%uzaA7sxltJId23_Av)G?vnH&SF!wRfuwG^yMWFC%jUS_pc5J~Sy2vIFJ@ zEg{MTEFi2GdlCE=gcP6(i#lWoN*)__wP~+2hZG@$VOnYQyfv8UWZ^-+Xkw?U{Z-u; zE-T|`F>GK3iLYxML20U^+_seUnCRPLy_~phZwYr9TRM+^lc6@>t!`Afqx^7c8QQ0D zjTLw{StAOwD9QZs>d36{^h^2yXroqq{A@}}j{#ioya)=z8EzYO&2~6C^5$$vHy(3& ztsgkkYI^Y1F5eLiT&9-ZS@tZak7VK_)bP{zZuITG)SIcO2|aJ^=CYL-oMYhvga;^7 z7LqwSeL;<%H7256Qn)tk>eL)_7g%{J4}CM;x0d4V)679pw$+)1pDoA4WpY+Ga#p22~(WfBm;cWRM+ zTFm4)GPAz)&c*c?Li;1Eu!1@})yw1!NK%wm#ozh3(4EvTE&V;&x{w2M|Ej&|>N}G5 zIi$QaW;*?DTfXuWxr7?6P24QIX*@U*hCVM=8{_l!i}hLrtD&88Pa*O~hEJEEg;7IQ z+I&zU4dV>Gd!OP{8^-F+DgJq4&l^LYxSoIm#3;41g5CMR<4--5hS1 zHWUI-YOJNuB;kZEC>$ohy`O*V#Yqg>G$Sv(To_5`QMKD$JDs(8&nUeY1-k*u=1cZiJ`3AwoOB z3yPHKrQ5>0gj>9QOV5tafu`C^&Pb#gZBI~wXwMrG8}-f!Z(+x>$}=)#;7>(5_Cf*5 zsW?`27{f6BVdRm$b_^(&8V;V6{#Xu)+I4ile;Y)X`!1NKf08Qd_)C1vF;?1vt%{u& zBJXQSyy_=wEw2M`AX!F0nppidVuzFO#93AEyIC_a81vwr;MWXjh01$oGrAv9Q@x)= zgr-^|RbzDra@c0GkBn}AKMpz{;;;@UiH!-`MDZfS^UyTCMbwCR#!tfHn?1g5pI$Uc zGGxh2A|FKEgW9%ScGS?2I&5ZKj{3NfH_GfyezMbaxUApHXZZbVdGkaZuCiZzIvr*I z@5X;w#xzHGjvg2ty|I<`@=x8sHk9-iAc>1nKmX)6lS!~y-lfVDiN83IUaiq8_TO++WLfG2##5v z8+#Q$uB(6!cxXDVWBTRb_rF%o*Y3WyDV5N!*B?dRuRd#=-dD*YY<*+z_9MOcGdNwW z-ttk9TF0iIlN5M->o>US5;M!uT(4QdY_xB&Q+AOSVa~Q(k2;!XL53q@){q3E$=Bkl z&iSoVYp*{9Fp9C1j?FeXz82ai2l2Xvi*j^cw5OJNsrs96vWe47XJ8%>q_B`M#36b^7&Z zo^yG=S7#yA|JpBy^zf@4P~ z5*xG^pF~hs|G7MT3>qmDn|nU*6S-->{F{L-8B@rD7+U{k*!H-zkN6o{Olz~jc+pjb zPIVavb`vg#`*csa9aQW;g1fG1{FOi3#gESG@1A|TY(Z*%^F%XM&}FY8B5whl?#G>9 zwU&M(uRs`)qeME_KfLSA9!*~F{7>$fJ*!gu}r zUXuCu?FQ8R$31EKOJ_#7KI-q*b=BP}4loqd`R}V%b9ekk(7S#H8Z9EVi1(7=zh7;> zvV3#HXd**>gYr356nV3Mia?O+1+OdW^Bv?UkuzGL=Kn=Ut;3?HkjS21rCC+ zxk0oa{5(S@BP@rSlZ?nsL89_j!PxN=h-C<_;v8bR!HQXFH+n8)cqmOyMqT9eCw>cT zB%NcxWWHav#4|>0Gmyt`yPLOw4VSY1W7aN)Gi@g{fz80Bni~JdqZy z^!N9Ydp&cTV>_BRX@P?;jNuXG9qF^g=L&*&;wMU&q>}Q894h4@-Q#k8dYt69N=7{q z$&2nrx42ZcR7mIjb@`Z^(Kha)+qFDH{jzWzKL0_x{O_KR zf)U4zBx>cAYGUlb)O$55!6EH7`LaS#Yldr^V9Tg$y|2x zUmLTYz3hdYBW+mgZl&GUj5F|B`qp{aWg@^P86(9OU^=iUN-($!!-mKZE@6RhfnkA+ zs8@jzS}8!9j&K7DRwZAdyx?_7UDiio9S2Mr=v!iesE^}?26CDBa2%i{df_3OB^ zz|VOdr*ffrBd4*+1EY}2o_XtIC+N~LoqJPwYN&rYBxb!U@_b(PRUmeYjLfsuEm8X=Bu(22xQrl4M zU|4{Ff`#-@nho~b@4x-C&)t3R?m6%CyyrP*_{ziYQWKt}CoGoTt@v`dswI4RYexIh zgrm9Iy~T%xWf9BM75kjkD|25}{H|v|9_^wzwRyGrPVN9%<->-vkyV=Z0k=Lr&AooW z?r8I|S)tk$0hjv>9$i(@Gs8Gt;iXFmC{owvTB4)t&BtaB$Oz|R^TOlXS6VE4V+xZp zf&*tI4$A9M*|DLWC#-o~9jHtk@^#U_!70-5ZzrceWk=ci;-UL^nZN&(;7gBrPurny z!zyL6k={LO+WQ!HTaq*tvPrUz#W~%&_}C7%O6_|C@Bn&w_mbI7wGFabV%c+ieBkqa z>g}0Mu22VLJ5vREpNp8%=JLn>)3dev1_AAXK7e!JcyPyP>ls!@q+=QS&n0sm;@drt za4ad1T0!PRdv3a6#a=zAx< zGOR>J4ul9F7^rzb4S4wWDLGSzwPmLHnP`A zyQhtBKQ`FaA=CGjv$gL()yDR5JrZ9&Zu&kXT(()ZA|pR@XnM!I_D0E#1N#!R$G2r!PUkwMe*fY2kMiyjGez6YKHAP{iR`AO-pgEJTWlGTJ0WxO zvdEw_I#>$CuHHLCEf%=v2lZOp5pV$V>Z6Tsl_lPX7Ebm*m&Inaot|L3tfcq6Z5gvN znvYn=Tb&qIX({4-E)8KV1%N=Js}Qtm^uwKB-6Jyg=Qu zsfKfrS+oAc9XjJZ-dVjVx99%Yk(0jC59(c>yz^T4j?=&U;}+a~3gxU=L6y9FzUOB* ztHwG%Rpz+L#Ou4;oTi4;78E)RW$JHD+7OdMIRG)x`_D%G%wQ?X(&W z$gCWTt!nNpwpc~mUi7rOIC)lDnBq->y~{)KPx$n!Nu}(KO~-zIy!dTR$bakXp}4WD zz4N~f3A?|EF51`9yw0=n`5c3T?2!uB*nCg1xf?e2eUiP4-e|ca`FWQvYyRW}Yo9%g z4T+qXnpAf@dDHaVbE|C={=Ast+rO#Hnklz>eEwWMemAzi-g!8CoS0F0`sXV!wAydW zrr6_yLJ_~-rA1944<48c?2GSt0i!bd7k3Zsl-%Cs;fgc8^PlIO%s&5XkX3TT3DZC! zUn?44jhoo6zdB0>^e%o^V7Hnt^G^u_;IgG-rKmiG-abfjo)^(|L$%5 zqKfzKbKXt(vgygik>^5vrjGD$w?)UIHV1y*tN7zxMW6q9?#DLHGxO?qBzND`DTSVc zx=z7wWq$qsFZ2W8b#8t0F`wyAk>}6s_6!IvPZ}0AI2)Zyolc(cC+q<1H#)GrhrLhe zR9U605?Cyo?3Vx7s?>V8%~aV^nZLJdoUNm^ht*(9W9ca{Rc70I%%`aC*@w&y2U5b? zCWjkUV~GiC%pVH&H`k8Ows<-Korc>MPUt7I3>L`7-t>yIa*~B{53I^$<5qQ%^>?## zvzljp#j0SxrB2!ZefrSon(*Wf2VJWVOm~m6**1T@z3u&vW!d{y0RsXZy`2tP)X#CU z$FhzYJZ=+eYv~hNU6a+tb(eK1?(Qvfva_V+{ns`X&bYr;7Pw+oyz`Il<-I)3Nf-R@ zn25{gir&BRwgw!5@otVD25(uq)hR0)Sm*6&Ywgo1uYKa=MY4E{aIIZN&(O}p+q=mA z$-eEVn5}ENOLcZQ@Ar9#jmI?qn1nkXvpxPkJbF}S^*Cw6v^1BpL%T-J=HKl2ZDX~| zZ?-Id=zcos@h=ys{Oap{-huXl>X3a_2h(nk`5(6|;npeE;%OPb=IlRo?~DJ6v7eq# z$-IBkKK*yqKTqd4HoIg%-0OF5?5qv{W;nYQhZe3^-}cLKuZXUHo4PaVe%1!V?Z}*2 z6>;_1sXR%~>?6O$vah_C;Yx+m&k*2WOaBwIj5VtrofzNn-Xe(E~~IUyCv^@XXy zQIE3x40nt<%8HEo;?&TnMK*jqtdcA84@CMbrr?+HK`F%=_@w7t7CHY6{YocsmG!;S(`)DX}LueHT6xY z$D=G9sa6-{8Y-IVO{t0~T~>g>GHPb7kTqDEpHaPX2J2LVY~y|%JqXGaRf9Y{2cNOo zT9#*%WbNFKKhk97n>Z)gQ5$?NUU6|C7eP}Uic0l^&x zzqAo-o>*;=wX<|ZtvotJ*e1%TfyE~l0(MvJ;;b{Q1(|*MGjvC|F)qxv=)|LL3C3sC z&3>M&>G_4g>sPwH8)WU(fOuyveAe4K!uE=FiR?CG381~+vsmWV-qz}Pd9rL@Mt`84 zrbD(RaMRn$9$1U)t<8?x;qJQqa~EsB`jDd=zq-}zwYfDaznyhv((0od`sY0Nbxmws z+g7eS`1sfsC^6X4q^{So?QDTdS~vUMa*@X@6M1ur*7ESJ$^oZd*9TIz~^I&lL87x>|8iuHuzxK zs*=G0nehcn3$SSF%abU-9AJcQ`0I#v72^+VxDEI>9I%sx28OqDbqe2LU$QCZ;H<|$ zhczDc<0JasA04o6jPST;z>gi1qk%8U-gc_dmyE7|DBFY zQDas{hfGDvQ@1W*JC`=zanHT&P)qi83F^9ZCmh|nW@K@u)7BZ))!{JzNn<;A z!mZ50w~0G_8$nOYoZo=)#xuLSqB~tv??w*1R;CDd@bLb6=1YjvnKPf5?yD!=Pd)NB z-s51SSLd%^cQs7<=)!G%QvIpnW!kT(f86_fN%!p%s}lOm-H;#EaBoyo($CG|JI6L2 zi0pH%FqoM3s7Juq9l=i5BOd|t6G!Yl+s^i!dm2>Qi37fEhB}-&|9Xur`mE`VR?}uZ zO4aIHXsot6ay9aY=E$1RfU^$^J*$20i$+C80~a#v)a(yLb&tjYZy#4SR*!y@Yz}x? z^|JB0=M%5;3u9JmZ8|)4zih4YeCy?(Gd3+_d*Eb)6?ob+-K!+wpgtwH@XwB*N4*%$ z+itKstb5ewcy)YZ=QBy;{XN2tbYE0>a>vIbD{p-3Uzad(wPxX4e}gtP`ipwmZ12Ol z(VO1A4qtzS?^~+bRWhkI^~jctYDb^0m9m)?o5PjS7r&MnwlELVT%PapnQ%YTyZEZd zfyQf(e`u^-sSZzxcTk9P(|6CJP3s$u^hv()ZGN>Uytwn{x7`mx`ZJ4*r`1r6*R66l z)oq>{k-n>Vgke$B;Pmc_;z`rp_cq>-`SK+ETIDgfv*$x2^(k3*ztpFY1yNZ)c79Gc zKcQ=Q*!Rl9=JWiKnFl>no@MtfQ||gQq{d}n=-d|uQ7)gdN) za9h-cE2^~jU$y7$t(v1-(`Tpxo=XP3@sGLIG9i8b+J5haaig;PmMUa+Et9>5xy>GS zzScdnX2JfM=|@k6Uz=_IbRawC&wwzme)gMgzFT&A&!8SFN)w;=OkEfGU&iOnSbG`s z*F6jed?Ul%<~|BDj9={$w7>JQRet!l9K~L~ye{Z!>VGY^t-V6##oD{QS07qjrEBQw zmAL%YpnY@Se+;=`IUAYo#SpuMjI!x^^TV*v& zW(|NLb{PYmWW%irt#&7G&zKb5H?Ffsyxiel2oWX$p^?sd`uG*4?ZC2z$;Ey{G^ckb zNA$OoT?*Z|&CYt5ruU`QRwZk>F4?f+W;1j|NDK> zp7vILE#B2v6PB)zH~y;l^CEoZbhXzYpFXiq94szx^6}eK$6NgQmf_cye!NkZ6SgmP zvRCGQ$C_*M-@6YmwTt|Sg1zro<-Q(P5K^AKFFe)Lt95`p_WFeIsvo^6+u78=fEI5q=)J;l#qW20K{InAea?#E?&6WrjDH~QF~%`qK`@Y{A_m^nH(>-U5!Z~la7r!NQ` zSmY6H^}xnfmNm;Ba4vTC?&x?7>9EG43L23y#;u*3B_O`1?B4uQvhWP&IFr9uX&>X( zKDA3D-n3lQxCue(jdl4>RRQ&h$L{T4Jal*N>ocGGR|FjffsN}%yPLgNp`nw z&&Stea;ie!|GRl^uE)I#qaEgTJJr^=soieySec#AN#m~DZw?(acfRo4Cgc4~$EICC z{FUF>VHN2-oA zvoij|xrE4zHwu2Aukt_Y9M#hQ1?LzMzt^_>$1tmD(-*~Y)gT+k0wv5)CQY_V9 zHGGIH)71sGcxa*(%jDPGKgN{l>w;P)YR)Q_>#v1;Oe-s@3vHRIIj2}5zpnmRP-du$ zXqln8ppfgY8$KG#%ymGEwEBae6gdyt`A@#{E{+a~Edi^cKXJfgtKBFa2lc?~O-*(S&uHfrmwrtnjQ*6-R z4$1MXh^^0V3DP`JY?R+o=lE5q>+@RnX_6Fv`a6c4$O>J3aZ9KsS>Z2FaLl_$FwI#)Y162_;RABqF|Ulqe4AQ!FXC)w3GojM9)gg_^#zIZC;)p)Y@YPtYY|JngYibk`@^tra&IZ2mrSX^MpW>)KJ>;9G zA+|BwSgNU09FuF*-~0^f#yn%Cra=*@*BHJ<8gz}t#u`nN;<#MvUKC@{HV{Fox6biXcT~uH&G&UJcnl^<}uQL=G4dzD6K$g~Gv>?xLFLthRXtFoi zYOR%^J|m>qv&OZ_(PXc+RYLN|>SDhd_a-M(XKi~Wtbc5Y`>mPPi4N>u+OBJr;?ICQ~&V$t8Vf&jn?*7()wqHACZ4` zO@Ss4t&@_GKX?Bb^H<*#WSXe$r)2fdLw=_HEouriP1U+6Ir$6q&w{^(rU=sv?EodO ze_{A({A+FkOx{{Ir67Ol{>%BFLo;ETryZyi^)EwydH!>47EFt@gO!r}mHL<8KlkQn z(=zQ)rAq(G@GJ7)tmZhAk9N57g#5Mp@0fq`=6KT@?MUTG{p%2m1UH~L(d4Tgtvn@v zqqevthcqXf{Iz41r}b|Pzm5Nt%^9XZt%ovN{?@(3xt4E!Y1*zGuRNoF8&cv~8{3?1 z3erwgo|V5-m-yAHoAXTjw3C%F`gews$XZ=YGbV7U)-=*Jp+N zNvkcg80|%9XDBbo_3A$bwT9*<({b%gWvpIr_+zX!H_KW9t+z5xp6zb&o^xoiZ$-3o zlo$2cA*G&mt}TwOgm#|tlKj28)UVFH#i^CiE>K?9zc-Xd*3D{hYZbJMlvm^*+{ z@Lw0N{eYnLgn$v>*g3hF{yrna8bu25dre>9XC>y$0tt#Mi( zWxV{8d%1Hx-?FIniguOqhW=AXxo3TBi%)C3*5a2X|Ew)9w%*pRQ{K{lHk3!! z>skU^6Scm|+j2{V8dI-t32J?ywKR40mZCGQzNjU%HCgMgOpsgZ$bx!9OGInBcC%8g zx0Hs)dUFfVnxVCHMCEzzmCg+gMxynpcB}HPJ};!wv%%FUw7%4CSKgC%x*2! zhAC6!U)9xqjcQ|FYo#_^nWq10sE%yZ8H-zMv=Pd5`8Rh%Orzdd+FGYQrqt-ag&5Kr zi;Oj`P1@s1t-MHWC}=bon_5j;g;J+4G8l}FW}~c4rUR52@?!TI=Ozb}eVeTgQa;uf zhtzmBxtbi?>~)CpiTt~|#;?iU+9V`7if> z&dt1OQQKghqc1-5zU zqLpvuCGNE`&3aQ%+eF=2zNNrkkktwuos_vXJOa4b)ThMGUMYPS(T~O-ve+;$8 zX0r)s^VY>Fv*o4kb+``N;E%Mg*wl%t&%FlWW*`~Dwv?jLs>TWA7eGhegK}$$$ za+|*{L1}4680w8J%GQjwKwY9TPi|p3XCvSGvTeKWp7M*{LR_B4*w*Z}Al(CHzTCn^ zenxd`UfVuhlCnT=p_fRbuC=%=RF|wQlv@}h#;9*CZ41+-D!=M2B#>q-YOQID(4{NC z$t}2EU^KKgwH?=Kl|_0BR2z-vR+$;lWhjf~7W8#CIkefE5#1BzcfAErJx#7{j%Gsl zRQW@0!AL)odz+J)(LGoG)LURL(lo2h%`E6%Du2l>NETy~w+%O+(7jgv)?2_S%@ok) zVUE^W8qIPG-V~TZ+NPS%>9Uj-=Uzjz(WGqiHpl6*m8EhEDmb_DZHvrTbRU$K%~D8< zXKQSmk2zlVNom=`s9XG6)os4!+d4}RNN;%^BU^QCf#yVAp3=hj?#7r_eOr+Efi7QZ zA>t5YT5C~Ts5x0zsI>5-+E~zPXp1nX>%J*1v}G_FTg`2NIYU>hw6KZ0$+^wJOqieQ zekd&9R?*qa zn_rrL=`5(Nw=9gOIo6zQF4b8;O>VhYKeO7LXRg#)-g&*{=SP}#=3;Y=&hkpgEx#zn ztT&gM>vWcXjNWpQG;@);#@wW{EU4V_y#lkr++;TCEZ5UpJ{rwtv&EzW z1O@?vfg!+9U>GnQ7y*m~MggONF~C^B-Ey=u4j2zi044&HfXToVV5(($WIEsp%mBQA znZPW-8<-8u0pmR<*a7SWc3D)4yMaBxUW>?VKM)Lr0HMGEi(2at5C$9u z!hs_|1aK5M21EkKfha%$C;F1jq!Q0?&Zwzzg6d@CtYhyaC<{o z4`c)Hfe*k(;1lo}$N_SJJm3qE4-^1}z*pcKPy`eM-+>>%Pv95u8z=$(0Hr_~P!3c8 zl|U6x4H$qL;4knGs0HePdY}Pl1e$HlRfk1hxn5KzpzQ z*b(dmb_TnET|o!X5$pzb2YY}$!Cqi*un*`2_67Ta&Y%m}9~=O>f^Oh{;6QK?I2arP z4h4sS!@&{YNN^N58XNHdpa2z-uoB&P)CxMf}Dd1Fa8aN&F1ZRL=;7o89=nc*W z=YVs;dEk6-0k{xc1TF@bfJ?z;;Bs&UC@FAE4 zJ_3`$6fhM`1Jgkbs0DRk2KX3!0%n3w!Drxe@CEo1dIij$IzwHc zu8;%d2z7(HLp`9LP%o%A)CY2c`a=C6XUGNW4-J4^AvfqhXdpBQ8Vn7AhC;)j;m`5E1Xa}?t+64tcyP-YMUT7b*9}0#-pit-lbPzfOg+Yg*aOemW0Ud>oL6OjLC<;c^a6Sby@FmtZ=ko(J17g%L)p-K=mYc-`UHK3a-du& z5BdV-Lj_PF^cDIB6+y+&cjyQ76Z!@HhDxA6P$^Ufl|vO!B~%4fLk6e@`V0MoYN0x) z9%_IZp(dyqYJrT932KGfATuO`tzc`|2DXLU!R=u?*dFcxcZ55^o#8HUSJ(k|guB7r z;T~{LxEI_T?gKl)ec^tvGwcHQhX=r}up9gzJP;lP4~B=pL*ZfYaCihf5*`JQhR48T zEj?EccpN+)o&ZmTC&829DezQy8ay5LglE8B@Jx6X>+04$HH;&MfehY z8NLEvg|ETa;duB4d=tI}--hqN39uSYgzv)l;QR0c_#vDGKZ29t6gU-5gVSLRtc7)O z2K*R)0%yWc;b-u3_yznDeg(gV-@tF-cW@T0hqK}L@CW!K{0aUH=fJse9{dH)hYR3B z_$&MkE`p2U@9+=!C;SWk4VS=w;8M5@E{7}NO1KKHh7E8H{1^TQ*TQvhJ=_2{!cA~9 z+yWb66Wj{7!Dd*7SRvMk4PuM5L)s&Dh&|E)>4u80HTh;&1`BR!CwNH3%} z(g$%u`Xc=hXT$~Rj|@Ou5jW&NWFRsK8H@};h9bj|;m8PNBr*yajf_FYBJPL>G7cG! zOh6_glaR^C6l5wg4VjL3A~O&#WF|5T@kVANbC9{nJY+ty09lAELKY)Skfq2nWI3_| zkt06HN@NwX8d-y^Mb;tf5np5jvJvq^{E||v=`bN?Snd@ebIiX zGwOo&M+cy;s2lnpIuIR%4n~KdL(yUAaC8JZ5*>w(M#rFIQFqh>9fyubC!iD2N$6yB z3OW^?hE7L4(HW>0Iuo6RdZV+^Ip|z;9y%XgfG$KAp^MQa=u&hUx*T1B%26M5CAtb- zjjlo0qU+H0s4uz!-H7_3{^%xjGa7&fqFd0d=r(jax&z&b?m~mm-RK^4FS-xij|QV5 zXefFBJ%}Dc!_dQMIC=z)K#!uw&`9(+8iguQB?_P*3ZXEHpeTx=I7*--N})8$pe)Lv zJSw0fDxoU$1bPxZg`P&E(KF~-GzL9~o<}dBv1lB65xs<7Mz5e((QD{+G#s2P=ER+u$r zgV|#3u=bc8W{-8iI%1u$&R7?$E9QVXV%@OrSP!fx)(h*6^}(F5zF0rZ8FRt)3TaK;3#@1kKv31yb z%op2$ZN&UAe{2)B84JJyu`SqEY#X*6+kx%Gc40x-Zfp;>7u$#J$AYmCEEGF{9mEb{ zVc20T96N$VU`MfISR{5Fi^3F`5(6+0gD@CFFciZu93wCiqc9p{Fc#x59uqJTlQ0!_ z0y~MF!cJq+*ct3B7K5F`&SMv_SS${^h+V=iV^^@N*fs1r7LVP)Zeq8v+t?i}0aIg% z*j?-%b{~6yJ;ai*M_4kJf~8__&R(&?u&20H{yP{ zKfVdyj0fO>_!fLCz75}w@4$EByYL`SN8t)wi32!@LpY2hIErI9juSYEQ#g$?IE!;Qj|;enOSlR@fuF=r;ivIv z{0x2;kHOF3=kW`8EFOnn#4q8O@hkXM{2G28kH>G|H}PBeZTt?NfUEID{4RbEzmGq_ zAL2>)BRm;T!Bg=xJRR5IT3m-`;E(YqcqaZ7e}+HDU*IqCSNLoE4gMB?hiBn>JR5(H zf51QDpYYFk4xWqW;a~84yZ|r6zvAEUBD@&?j{m@a;=l0UcnSUoFU8C7a=Zes#H;XX z+<@2MfAN2KEnbJ$;|+Kt-h?;fEw~Xk;jMTZZpLMV6=6--5Vk}+qCH_p*b^OyjzlM- zGhs1nB^(Gxq8rhj=t1-(dJ(;eK7iBZI8Vhk~sa3?&7am09H0x^-8L`){85L1b1#B{=wm_c|EGl^M*H!+)-L(C=S z5%Y-!#6n^bv6xswEG3o^%ZU|)obVx5603;S#2R8Pv5r_z_!1k4jf5ZJPi!JK69GgZ zv4z-5Y$LW4JBXdcE+UB7P3$4|68nh#L@*ITgc1jcgTx^sj5th$6Gw;$;wW*9h$M~^ zQG|j}5&!`b5CIbiff5*j69hpL6hRXV!4e$769OR;5}_ha5GRRK#Aza$I76HzVu*9Z zdEx>QOT-ZuiA%&~;tFw9#1|r;C?E=nuf#W^h$tq$6F-Qb#4qAEQ9}G7N(syO2T?&(5>-SsVIXRVzr;VH zmZ&4@i3XyPXd;@47Q#rF2utshFcUJ;inJzeNL#WU*`Bl`?a2;gN3s*yne0M#B^^jd zvK!f*>_PS0 zxtLr+E+vwoso zJII~nE;5MRP3|H0lKaU0WH1>*hLQ)!gXAGHj66(+lSjx1@+f(Xj3kefQKW)Yk^l*k z5DAkAiINzJlLSeU6iJf|$&wt&lL9G{5~(6jkSEDg7ky)gk%qHKHAIOj7C-O6yL*|ls|pqU-BPWOV*L~WCPhq zHj&L_3uz=xWGmT5nn@XDMOjlelr7bcYERiw_EZO|Bh`uOOm(5UQVx_O)s5;-^`LrE zy{O()AIgd9OZB6iDHp0gHGp!Z+^GMkfz%*sFg1i4N)4liQzNL6)F^5+HHI2XxlG zDS{#?ilQloVkwT|DS;9xiBeG~sFTzw>NFKiouSTBG1NKgJavJJwdhbTQkSU9)D`L~ zb&a}C#Zxz^o764pHg$(epwv_%b(gwF-KQQ<52+;T5tU4(P^nZJl}>3WEv2I}sK?Y3 zDwBFjJ)@peFQ}K)E9y1%hI&iAqp~PHl}){;K2RU2Pt<2Bhsve$s4rALRX`O|U#V|Y z5miimr+!dBsbAD@s)YJOl~QF?IaNVbQdLwnWuR)Pztlgfma3!bsRpW%YNDE{7RpGO zs8*_tGE*|zingY0Xj{4+-JZ6i?dcA5N4gW;neIY&r5$KTx*Oe{?m_pYd(pk=KC~0v zm+nV9(=K#>dI0T8yV3vA1L;BZV0s8WlpaP8r$^8u=~47(dJH|5cBeh)arAh40zHwQ zL{Fxt&{OGY^mN*jo(evpA^g?5XpV80h z7xYW|75$oiL%*fp(OI;f&ZghfALx(tC;Bs;L+8?Y^cOmxE}#qPuk<&%h%TnT(?95+ z^e_51T|)n%OX)JYoUWiN=_>3vHxLbSvFPn`s$i z#aJ^oj4jiSY0ua(_Dlz+Bh!iL%yeP8G7gL*(~arQ^k8~2y_nuiAI6F4%k*QM85gEM zGk|er+?fBEfy^LgFf)W1$_!(MGb5Oh%qV6wGlm(#vEqCnIlXDbCfy8L^8*jC`Q338Gr#9h=Cb|K^cs}8G<1hilG^XVHu9$8G#WQ ziBT~pn3K#Y<}?${oMFx~G0ZvUJad7GW#X8N%q8YBbA`FeTw|^?@yre8CUc9q&D>!U z7&Vi~+-2@D_n8OGLneuN#3VB*Oe&Mcq%#^u%jlR4<}vex$z+}~&zR@T3+5&Bih0ev zVcs(Dm@G!mWHaxX56nmA6Z4tLVRD%~<_nY06flL%SLPd2#1u2%nIFtg<`?suDPjIF zrA!%9&Qvg!Ochhj7?>L7FY}M7W$KuErh#c>nwVy$g)uTFrj==9%#4h+Vy#&l)|PF@ zwrA~Fd$t4Hk?q8GX1lOmSqIjU?Z$Rzd$2v(UTkl+59`GCW&5$ttP9(p9l*M>ZtQ>T zKz0y2m>t3nWrwlD*%9nWb`(3B9m9@g-B}NI96O$!z)oZ*v6I;;>{NCdJDv4pXRu!E zOm-IQ&CX`$uyfgY?0j|syO3SPE@qdoOW9@Ya&`qPXMNa}>?(FOyM|rMu4C7;zU&5e zBkRZdvzyq>Yyca`Zeh2w+t}^w4t6KIiw$CTvwPUR>^^os8_b5Vq3i+nAbW@nV-K_8 z>=8DCJ<1+qBiZ9@6susBEWm;+#KJ7XqAbSZEWwg2#nLRpvMk5)tiXz_#H!d6>`C?% zdzy`A&#-6N81@`{p1r`vvT^K1_7Z!Uy~18)ud&zJc=iT+lfA{>X78{GteQ<^@3QyU z`|JbuA)CZLVw2evHkD0d(^(CxWp!)@`<{)Q`-}a}mau==QnrjOXDirB zwu-H04Qvhjm;J}qvUO}d+rT!mO>8sU!Wvl<+sd}FW>&^oan_s-XUnzY+H-cCJ=cNj z$aUg6b6vQuoCD{`b>q5oJ-D7+FRnM&hjZfka{V}G&V}pG4d7fkH|{@fAUB8`%njj& za>Kac+z4(YH;Nn0jp4>}?wkiVjvLQS;3jgDxXIiUZYnp8o6dQ1GdM49CO3=o=4Nwq zxVhXsZa%kwTgWZq7IRCurQ9-ZIk$q7b3WWkZWXthTf?p8)^Y1OUv2}pk@MsHxlP<= zE`STb;$=%{^b9cA|PR%89ce#7qeeMDGkW1no zamic?m&&Da>70hsayl-9d(1uIGP$SRGwwO}f_urm;$CxaxVPLpE{oH1+1z{X1NV{p z#C_&+xLhue`@-dO1zaKbmHWmOamCzs?g#gi`^Ej{O1M8XM?Rh)ip6|eS~ zAH|R6$M9o$ciw{^$B*YH@Duq-{A7L#Kb4=xPv<@P8N3%ilb^+V^RxLm{9Jw>Kc8Q~ zFXR{Ti}@w|Qhph~oL|Aqc^`fyzlvYYui@A7>-hD&FTa7`$oujB{3d=gAHWClTllT~ zHhw$5gWt*T;)D3z{2qQUzmMO~2lF9(D1U%I$RFav_``fSe}s?VkMhU(Nd7n<#VdFv z5AYxl@i33@D39?tPw*s9@ifoyEYI;gFYqES@hbiVf094NpXQ_aGyGXThCj!j=P&TF zd>ns~zrZ2mp}f&a*V;y?2_d@i5I zf8q1_0=|&{%75dF_+tJ$|AYU@|Kfl1CHx=0lrQ7U`3k<0ui~qD17E}c<^S=ud>voU zH}H*o6W`3Y@J8OmxAJYgnU@Jxg0*1rW)a#6mW&+1Ug#in6gml=g)Tx@!9j2ox(VHd z9zsu{m(W}2BRC0tg?@sw;3D)F1_-W#oA947P#7c(7KR8zg<-;QVT3SJ7$uAr#t35t zcfms#CyW;+2or@#!en8JFjbf)Ocy+b8G@HEQxA`!udqSbDEJBf!X{y}5Fi8!TZFB`HetK4L)a#>Pgu_C(a72g@jta+wNa45;B`5@?00^J}39x_& zsDKH$KnSEj3ADfntiTDpAPAx$2`b@)a8fuWoED;mGs0ORMmQ&&7cK~~LY#0>xFlQ_ zt_W9!Yr=IQUbrFL6mAK(g*!rmpcWE^yTU!;zVJYJC?pAwgk&K_NEOnAbU`C%1)Y!~ zJQkh^nZi@ynebeAA-oh`39p4W!du~;kR|AaY~j7|LHHe!_SKJ_O6#Ybhag(@N3=jjwE#g*jo48%vA?_4+i9zCSagVrH z+$ZiAgT)XrR6HOa6c34E;$bmdJR(MjN5x}eq97>Vr=@7=jC59tk5h~jsij2eu5?ejFFlYRN=ecqDOpO9Ql&I0UD8NeNhf7UkEJJ4ru0;LCOwy4NH3*V z(rf9B^j3N&Wl4G|TY4{jkUmPEq|Z{0lq=;)U!;7gKq{2JO5da+saX0h{g8f2zog$% ziS$P*mCB@YsY0rhs-$YkAk|2JrGHYbR43I-4N{}jBsEJdl2I~Atx}t0mSid`m9@%7 zWvgnZYOk_W*{eFJI;uLUI;*;swSx>tEQ-? zs-~%?t2|XRR9>o?s#z*;)oj%q)m+s))qK?g)k4)G)ne5W)l$_m)pFGem0abcTB%y4 zTCG~6TB};8TCeg|ZBT7g`KkO>n^c=s0jfaN7S&eOHr0034%JT8E>)0fw`z}SuWFxa zzbaT2q6$?VP#shqQiZ7wtHM=BR1vEGRdf|#QMFBUK)SnO=@JVNLG%Ly?83mpM5P1; zWf!}}M7_PlvP-w!ov4U`-QC^ofBwfu#oc?~J9FloGxOeEcXOCI%v@$3GoM+&EW{_S zFJ_i7OPOWNa%KgylF4OOF{_z1%vxq0v!2OgHZU8RP59g(mf;wl5g3t?7$uX>6flKM z5u;*?88xF}N|;inj45X-m`bLKsb*@JTBeSvXBwEz%ob)VvyIu#>|k~>yO`a~9%e7I zkJ-;0U=A{en8VBw<|uQFInJD5PBN#MM&>kghB?bLG3S_O<~(zOxyW2%TA0hs73L~) zjk(U;U~V$EnA^-9<}P!Oxz9Xc9x{)Z$IKJvDf5hZ&b(k=GOw7|%p2w{^NxAXd|*B@ zpP0|g7v?MTjrq>}V16>cnBUAF<}dS)Ay$jkW?Qj3tS+m^>azx{A#21MvnH%5YsQ+h z7OW*}#agpAtSxKD+OrO&D7hch-aTWW88#)`#_F{aAlCfDL3@vq5Yd zwk_L^ZO?XKgV_)^l;!fqJBgjlCbCo5 zsq8d1iA`ox*i<%+ozAAS8SD&pCY#A-v9s9OY&I)r6>JVWhn>sLW9PFA*oEvOb}_qz zUCJ(Fm$NI_m257%ie1gFVb`+j*!654yMf)vZekghWjU5-1y*DwR>|hG1#BT(#H!e0 zR?TYI61J2rW6RkJwvw%4tJxa1maSv!*#>qqyM^7#ZezEzJJ_A^ZiXJ?`&)`-XkXzGL6BAJ~uVC-yV@ zh5gEYW52UM*q`h#_BZ>7{mcGiiPPe=xmKJGr_1Sa`kVo0$Qg0QoC#;jnQ`Wv1!u`w zan_s-XUo}f_M8Lf$T@M&oD1j5xp6Yio%7&4IWNwe^Wl6sKhB>E-~zeUToBiWYs8~8_EsihI1phcy1&&iW|+1;l^?a+&FGLH-VeTP2whViQE)!DmRTw z;*z-(E|p8;rgQ0B1~-G7$z^g`+$?T3m(9sJ1((Ck;pTGlxcS@yZXvgbTg)xtmU7Fu z<=hHxC6~*s;#PBOxV79mZatUBZQwR?n>dDJIgaBwffG52Q*!xS0awTsaVoBuQ*#=w zge&FBxN@$7tK_P+*WMK5xJq@3lk$!O!4l@|k=VKZ~EuXY+Di!RPRE___Q%em=i|U&t@w7xPQ_rTj8}IlqEm z$>;K`_|^Oxel5R_U(e_98~Ba=cIDdja$)DmI`P2Lv{w&|bpW~bP^ZW(=B7cc*;V<)7_^bRi{yKkyzscX?Z}WHf zyZk-=KL3D!$UovA^H2Dv{4@SJ|AK$Xzv5r>Z}_+TJN`ZYf&a*V;y?3W_^mxG+M97e)%BgwetnVXTlKj1$HS6NHJvBw@0UC`=Ki3e$unAz4TfQiU{O zx{xkp2s4D4LZ*-<%o1h`*@9e92sy$WVXiPwm@h0477B}m#ljL{sjy5~F02q%3c126 zVYRSESSzd()(d&U24SPHNniw4-~?U}1W}L#rI0Ta2!%qCpc0A&wV)A7gi@hQC>JV( zN})=q7HWiAp-!k58idWl7GbNfP1r8%5OxZ?gx$g(VXv@H*e@Iq4hn~a!@?2asBla; zE}Rff3a5ld;k0l@I4d*>=Y(eAyl_FdC|nX+gv-Je;i_;=xGvlfZVI=A+rk~;u5eGd zFFX()3Xg=x!V}@C@Jx6vybxXruY}ja8{w_+PIxbT5Izc@gwMhk;j8dX_%8eqehR;Y z-@+f^ukcSGQA^YoTZuZNuBa#Kiw2^hXe1hoCZefmCYp;DqNQjhT8lQKt!O9Oiw>fr z=p;IeE~2aGCdx#2(L?kUy+m)(NAwl_M1L_r3=~_7L1G)Rt=LX%FLn@v#Sk%6>?nqb zoy2f4LhLL?ie1F6;(ub47%g@ayNf-t7v&7kAwkQ`BVvaaRoGZ=~=Zg!(h2kP{vA9HBDlQY3iz~#HVy?JKTrI8< z*NW@J^A5*d*dIgu9yQ4}RnDdvj>Vxd?hs>EVZEo#IPu~aM*%f$+@QmhiI z#Tv0ztP|_S263~vMcgWG6Ss>y#GT?Uakscf+$-)A_lpO_gW@6auy{l~DjpM$izmdB z;wiCFJT0CP&x%drIk8zhFJ2HYikHL|@v?YDyeeK3uZuUto8m3;ws=RpE8Y|Dix0$y z;v?~~_(XgvJ`odg(vq~LR+5gSE9pu4l7VC>8A-;HiDW97N#>G;WGPum){>26E7?i*l7r+ZIZ4iv zi{vV~NixY@@{l|wFUec-k$fdT$zKYP0;Seckkm$ME47o_OC6+ODMSjDI!a+uCn;Qt zkUC3|QWvSK^q&+ZMN8eJ?otn_rxYW_O1-4sQXi?W)KBU!4Uh&(gQUUI5GhU?Dh-o{ zOCzLsX{0nt8ZC{H#!3m&IBC2zL7FH{k|s-u(iCZ`G)+p9lBE(h6y%lq;>0R!eK7wbD9i zy_6?ykTy!2Bt~K-PU0m&5+zAeO8HWOR45fmDydjfOB$&}DwWEla;ZY9l&Yj^sYa@m z>ZE$9LE0>Bk+w?Pr0voUX{WSH+AZyo_DcJt{n7#Hpmaz&EFF=KO2?$*(h2FLbV_QJ zPD^K`vr?0EPHL9UOBbYz(j}=yx-4Chu1eRW>(UMBrgTfXE!~msO82Du(gW$C^hkOv zJ&{`2Z2M(eOT#Z|mxMlzEnIs__qAyXttCUcOR+RM={G*B`@E+`^$2pkfU-Z`E~h8tZ+l#s+F*AgCwISnoUz^Ffg{ne|g5|_gHvS z3w5X1ktujAC1q9MDP4Sw8mgj027cMJo?4TdmW}yIF7yHGxmugJ_50W13+3ly;IHIpXuI?$b;%$FCJ+={AOZC>r^+*xsc+dhAAaS>fwFvYp7z^BsPa($oE+Qfw}&<{k;N83BKioNal zUU!PyeaGintz}4_Z8Y&3I4UZ^}5}?v}vpE4#y9Udv*8gE;ae$cvLqeDcrG- zuditb8bI4g@_SFG@mcdPXfNHP)dBUCh`e+SAJHxn=_KNPIM|yG`IdL?n18sFlT&!U zk!*rO-sz#zM$32l{xt1~S#COddU^(WMtUZCW_lKSR(dvic6ttaPI}9;?Hpx#-Ldvq zT8Qt9ilho^h8C{kQ~A`;#sz%O?LGPxP>E|d&=PusZ-v@JH35g|p;;b0jH@IP4y3=fyM)H#YM=v9hi61 zXb%*>0_rcW+zEbUF|jo{`R+nL!BU7S_-ajLOqJ;A|=yHXr%?`#+b*Do^BE9@Bp9m zzTMLbNbUk2-qY<1@~m5+uQ%YzTrjjfl_5Jhe!2$Ek0dYnU0-0Vq%9OoQ(Y$kI(wD?*AX85 z3oMN$BHC*f=CqBjk9iOE`=ADmi2V#b8Q9Bf5M_n02Hpxf?=iZd52|%%@@ho86tVV0 zy4%NhCCratlgfc&oDxa=$oIKhwn<$;+7XX$-}A3f7) z>+VB6aIP24Axr;Oq~q(3tL}okUv+MaC`Lg;8(^Jl?To!FigmSHr?&)>5Xu++!#_n^;( zVE-WSXD-&Q^smLE)%Y?16WVG}(xcq>iTi2F0jE09A805AELe?xV@nrw_rrIrjXvUg z0(#?G91Cz@t*;4wHUV-a$g?Yb(;q;F zUJESG(ILvBQ!(Yhb&Ba+a`LJFf7b8^TlzZc8>;>WddV}qhuHogyEjy7+dIhtu_sZJ z^Yp^0vggoTK9F0PoPugMz!8&x-cRUKg^%B~K^AABIX5u)4bY9DxY1qVt4(yfZ*JjL zohERcA%EyKKXiuo3H)mXy!J?F7dmM%1YD0NYdQy~NF@KPPt?QuH0{k^6j)`)Lp8B* znw2yG7`>r9R3aIEmjbsrO%AxiSno+@n-NJpt)g|d0f;J^qUIbcY;QIf${3ARH_}n?L;{UQppuE|^#yBR`p!qZ#fZ)d z^>GAluGA$f265z4diKx%uWI?H@RU{tEic%I;~LR3a=}&&HJffh{gUX(@XiS$)R7Ey zuY@nL)R%DDOKh zOL7EC+u$(MDGtZprCi4*OF3%l4!$2kCYSMytN<^fp-N|{wd++%%5O{SC(S6js>KaCumEWDVq0+5^_AERsxe1}1j?6q)8j4+d-i>fh*~fibw;k0xZy3N*5RNt%LEI_a6)CEVY<(Aq7_ zMUKzVKZ6|XG3^PduJ{7=G79sHn~@%P++!#r`jY>KhUgB!v$^mZXYb9x?k+S~ZK(uv ze)PD74`#6e(?igk;Fse!6rIu<2(RCY%KZT|iqIwB;`uC~o>TA?jP{MpCHuj*X&rKD z2i8wOt`D^{312&!e<60VTYCP7iA>LAw{KZb9S_C-3)iMhw_QfsdV7ub8%>VRaXV^6 zblm8qQKQk4v5Va;jZ6`bF?!Q9bc>(#*|h;zHA*>Z{SO*>L<{_Np@RyjurDgO4C?L< zBsIF7iY(!g3&5^h$m2RZyJpG*FyIzG!@t734Y<(*9y13kUIFe;jJF|^9q=}Hx|LsB z6r=kMTCj!^#+&)h))+)V=efY>G5mHu`sH;f>NKW-d~~40WQXfl;L6j%q`srp26i;M zju~%}ZxJ|JMuqSMulz0GXgXBz64yLPIzA2X$ElbS@=)&?1)k^y*Sm(Ont}~vVXEOV z14EXCza29x|9o~pSdwvyahkDoni$PS(t4!zXD7cQEJ$;VVnL;J{1s;0U<_^(l=jc>>6tokwK zSy;Smlq}U+n+_TuHjZ~bZhX?X(b!gRlC0VIete|kDcv;anIo&fAb9&8nqU}v(FY3pdx#&nPed;-D6t%!CT1;8B_pt9=` z-F^DzI?Yl77W;woXxe3(oA6atF8gdU)$PFaL7o4p%qBA7+hl$w0VdxwgG}0*v^NPh z2{j2b2{-9%(#7P4Dn_>}^!x{X@+dlGEb5*~H+xtC4{I>fTdy-7wFYyxxK&`X-Hl4z z1ZU^NLyEifEq<;0SoTAe?4CG4sTe-nR_m;)&z!&6t>~j{yvwwJFS2)$>4e=OxOsJ2 zP;rc|5?l$OM61DI&UoN(4cZ!E{ur^mCz)xcZU{KjXg&v6O$Rm;!8HxJXCJ^cvXMN={IZj0r=E*|?1ixRs6fiJOLWH|kIae|6yI=c3ZCY^q_|Javf>{m znfcaQxyAc(X1cdB)iu>OH8eFgH8nLiwKTOhwKcUjbu<-oZGzKE#M;~8pf3HKXm`HhmtuT-7V8jWM#;<^8Sa(6a-uo<1p1G#uv z<%jw`!vTD$EMrFC8=opLU@WGJ1BhxH+-Y;)Tuj@w1t(DZjiY_?@%prI&C%7*Zb_UJZYxN=rO0?ydy8UbWKqa%LhSM#VAD-H zl@Je=Nw$4ZA#ET#tl%e*j6_#D;`Pql0&yjwLIxDXMmYR@ zFaGU;e9Pml?YCJJ!O<{dy4%BDBc>;-9N`r2fn5X~wJqk2f53Au@H9m}{)j#Y6&h27 zPmx6jbVS5AsNAu1_~jghIv7XWL9Ks*S3D*93*OwW?bRhCAB!JlWqTZJmFLFZ1ylphG6UgdQgk=&eS?UxMZVz#Glt+rua=!#4V zX=L&^O`bI;n~VLdgpV}B<4Y)0H^RIK z`Ib>HbTMr+ZFCqb3d%CDUJU17ikL-28%~>YmIf*{iS$$1K+{~~{=c8Y9N38dB?qfJ z0h7ycucy{~Q2WkwcKUWOZ$B6?gc^smXnFz#9y^p=Fs%ZexB$r3z?CMTHi=-pl}#_` z!2(KkHS;d~1m&%R>K+p_twr+|(e(lr_UKI3v@Wq@T#>5GOBbCW7u7$D92>C8BdF^W z&30Tz>n4xPZqdxd)$$PcZo1zwS7U>2>53jbH7pKm&GM~5cYjMa{Z@kk`|;dJ>>%PO zamZM8p7kBlKn&jxYu=)WK}aFTL#oRC(Nd$5d~0IS185;Z2k*Q z+`zsefc~0hQ)NIjJ#g-$H-Ro`qSUY8$!CEBqvne|>6F%RdQ!Ls4B3e~{KPee(>JSY zSm6d%&Zlb6Yjk4t#FDA9?BeBM_VJN>q41NGW;N5>7|ymEEM<|~0Gz!9HP``Gs8F$! zVDwg+ADXOMLUM!l)Xn4__<=h%F40&uh-9j^G|eCZewz>ePk|?IfomtwQLo+9EnT5D zhJP%8{&>{u4n4BF4_5JyT6pGIj} zqY=Lh?wjw^5!`nN-qyI%J0KQ~ed7=)Tj}bEey}cJ!N?(nk8N|nr1oIKN79r?q?LFU zKe3K$;lzhL1Y9o)Yw5f6E6B z>3UJB)|(pN}nUDG0@R_#1x2brUNuzfy3vi-ow~N7x|xc zJ!qkao{&Ln3 zxq;mcUy`oRGFLzJsy4LT`V6TCHn~@Tp}YR?sKxfAKWiDDJ7zHyl^B(Cu{h6qqyA@N zdrY2X36^YE?zT=vUTu(P0Gw$8oVypY{u~=d2i%716Fn%(f`?APjM@dxyc1e!=f8qV zOJ|`oZ*$!1bPG=U7m6BzJ~GKP0p~A6ejUNFv89bgdDb83!MG?~yB=|m#4IWeba z2OH>#$-k10_`X8K=(PEBPsu%??mk8l8qWsU)^jdg)ry_O}8PWcbZPhrg)Y)`U`Bl2y-e zygOppO6R6$f7Rdulk{4$A32!P6c!bPK!*Es4mbL0be1g3P*RwP@x5qxv!rvb7pUzvBWtAD}{q z;FPy81AfNJUvV8rR7eZ1Hsb$2?$uP5jBjV@02T>|vJS^>aFwTBLL?^O%L#QL6-7rn zpF<9|bl9L6^Yb&>W09;{p3_;A$r8-Det z=-m&_*hKCg4{2&zPC;xdeA{Q}E@uyDwFO!KfnQ`pbsqG5T$K8l;~8`gZQ!~J{oo`z zMhNzYE_gl*80F#dP~-i^hE(sU!6PL=)g1TXlU4fv-+^d9p@SBVVAf%JuH{L)dd#Jv zg}1Ro&`^N;SX8*dbT#I8HToP^S;vZ3&{i(u(~8f%{qCpiZG-vNexKuV4K9D}J; z-5wK21?t_C*4P|Eu3Mlc{ecQ~3H3K>1y!%IW-$nc zD||)(YtkvKYqBa8JU@$PP1K2W-Ajr2_CIvb)zs{N8k}(b{~U@x2LMNnv$5-LdZ`mJ z*s%1f&OSI?5cF{giam#Y?I~1j6JqR#s=on~)u`lDbp4%hwkvQ)ebmj)D}{o~>TD`v+0425pq3hrv&mVX;PXc_+0|5JCc7R92m&3 z@=jdgL#lv276q&p)Bey&@R>YZ{Wx@)3e_&^zmr^x%h7`^smF{cbr<+)-Tz(Lobm2X zZB1@MuhqCiT^(LYk3C1CrW~%qdrCO3|?VtXV6{uj<5O;^;<0%sZvug9r4+zBw8wJq0dah+;Q< z^)KpjE#Nm)+yVHW!S#%g`;EjX^)2+q0`GgM5DWdVsB;GHuMUM87UFfH%h&}pVU7(T zC;Mf_s*MZw9IPVNzqcVol{b_V5u*Dv5G-CMzd^;oaZ-{3s zWlWs{cKxSTsPnPk?~TlsfsK6(7SXsFq56No($~N;1`&_NeURH!oE8KoUc##ug=O<8 zVpvXTo^=q;9O_e_`W0?^6Mi|PU;<{%hjdq~6Ed=fl6FHe-o-`X6}WOKB91Rx7I;cI z9FZecBig1KM=i$8ag#FqpF=PGfuA|%Jw3Yb-3RXKgGd^wXGxTL0~DQ(N~tl8 z+{GN2jf(6qdx?4kR?O&`hAaF7cdh}i1%}TMb0Sg2$v{;Cec&D z`Rg>q&<%NhM0VCtlLFBXp#I}pG?yH6{7#?`Rrwz`uEhG|aL(X}fvCu<_$icWbRJj_ z1mpIi_dJ0r?-$xuS{i+i>j*B|dA;`D4FpC)QCR__oQ%MdlbEnRBbL8O0qBB{bezET z5A+?Jai(gIZ*e~GaaYtn7qdijSR?!@%<3Xm_;1W!RM8u|A-lkjm@B*M+o%+3PjJ8y z+V2d#&I2=A!%3FHG1r0BO0dNiJFWI`iq*inBV9N1hcDhktxkgb^OL_`$FCGa;J=SB5&UQ6e&mzJfyY{2S$tr*PE{RxG7jxf1R8?ki4l%#Q z3RYP64}9<$4R#p-??&$*5(w>@!@s`|?OPF}dmBs}51qNwN~2MRooJ|EK04YuoIRYr zxOG)KWp|@g)N?r8=qPEal2vBF_W>MK1Owj|KF3v~>9g_%uKO5Rj-g7kDvMY+#1b5_ z)%_dv$y38*?RC$km&Ltgucd={h5ioo?FgMl8a;zX|L9Mpsv@&Nf0c@SQOAE>l+=%d`M9jAO>b!F;T`3Pl@ z!${><`LE#X+OMj9>n14m^~Njz%5_67$tNk8zDN zqp_=<3r5a?S1iS!ub|`%beR9(23c^+wlqV(3i_~{uo&*Ov+6$XCJlg^(!j+J#qTth zMrXj--Qa~7V2o?*#q>J_Gsq9j=TC8scIm6(oewcrRHMQ#3;I+!;7$l$HGm`iXZsSp zK3V@GTzVfhSWAfYga0XTu*Ou)`CJaJjoDJ|T!t!xDa*3f(X zFm&`4^iG)oCSAl;b{e%tv-p&X>oo>r)BxJj$f>sa@^sD+u;l4@GWO(!WL>tB0u+O6I$aA!?3tVdgo|%Q5f7Y zP^HONsIQ?9{{!}B*n@4LD9e2~Dugy9W?@hF2xV1f>XSoHM*M?v|Db~(h9fSf6umH7;Bf?#MN$0g>PkHw%n6C` zyJmEYap)V?a61;=^AY$I4So9|8e1rtC9gReRM7-iSpbF0=s@LrN?Eb?B=8a0?kC{f#N^GkVN@WT|Vmr>F*u?&j1B zooO;0>jg45!!&*vj_MWAWDt(%%P1pGUE_%E{0W_ZJS{AFiK{f372^1H!1XST_gRac zslook08Gn*bJ-!Dx4I{cI1e+1f6ry`-Xdgt3zhk5v>#RKV)G14 zGXS3+5o@@N^qrTNf5pVI8E$;ctp@#agZ(Mw^Z^wagb7=(g2jBf3aehmnl-3I3+63L ztec5v-O`d(M;%*S8^LZJoZ|vTj3T>=1Yr9ObBet35hmF8=yAI+S?om4&2%rMnKCmK z>Z3qvdSVF>yo>%EOXrG{phg~X{RJ`-^75uV$~>Ig4{Lo#2YZKmVpC|~$QI2XI&0A4 zz6W)DihHmRX^GiBdgHnPx>=4m8|jU4E%Mgjh2yL65F;bp`A}&=xrRl3TkSIRLKK}5 z9p0Y+R5!wFULcm&!1y7qa~o4YaNGW+VhUt57elz;!67;{e z*i}6W!7L6BnMw7j#`!BSwdjNQBk3b%iZbwWk$wp}<9P2>vk~Zo-x2Q`3JSYJTd|8e zj8(S-mnUWlOftKz*OcIWEmh`8?ZMz@c+L2X-z8d>*~YF9au_l@N_~4mD`3zBln!A| z!u{ZgP{?cO0{3}Qn?U^J zK>bbIkj7v%xDii*=JQZ@9<%p4?46=$<#Yw~>Wa?qi~A9u!NT@nz+udx!DMNdjZ6&? ze?QyV-s7N?Y8!3UKp?xEE(|ZND1}15;wnq=Q8ZFQ)D^xa1u$S%=Ij4N6y346x0e zX$O5Q0WX)J*DL};{isDx1Fp+m=X!sKk}6ScFLZ)0;K3o}o=@EqS~MM9?g8;un7MY5 zPHHW5vmGv)EgBt~9MBFb8-ltF*JX@q5mz+MeTA9I5PKfW z^a`u7xL=YU;e>gq2!678Y>UR9mb+JxflGJVV>^dpvo$~#uNlvHj*j68^je`eLvtf| ztl@{uMv+rei$-mh=avuG&c{^P70j4K7k!ne>r~7~XW(p|k?BU{aR_W4g(&LLd1Enw zU9SkPjnQoz7L{&!Pol+0OvjTj;7m+Qc6>4ykdKKOP?)Sms4H+}BFGz=9me@@#8sN>-`-0D9KkR-0 z%a@TUsD(Mae1+Zw@O_Y1EEru89Z|!DMb=ox{8mM%3KV7&&-du6ic-yT>#kC`9X5(p z^;XSy>!*rv>~0tZjSo^?qRB3OaJ?r`r(;51y#ZL&fo7WL0tH8ERikklquoF|C#q}i zVIPr8J4e~;iL}J%o>v=EJH9~&{R4Hl(AkJ}$ZiJuRw?QFxzHGObDb;I2NV~5gu3D| z=bS}VTJ>y%2I5nVao!r#W*qXxE1~N9i6Kz4nv!Z#D)Ov1ROC`oML5nGL3dLNP`609 z)d6U0eaT;}WsXNy!aJ+Ljd(H)wFKtu>__#(ji1!}#6GKcia4Wcke$ia)d~!2_C2q1 zmSq@UQpseORdVBADleIjOj}(B&od@{r41^KSF{JVhA$mL4?I~i+Rz<$!e5Z!?hchK zME9FdFDDh+PH5;Yo77Nioa+8p^`gE*&d1>2+O3Mm$n=ZH$&898%9@PLinY~Ofx!LJ zBj^pY(SMKO@7D0d<={g+YFl;JE*oCFOE$82uWWSj0ofthxZ(p9o$&g-4bJidXMHO1E)|pKaJ@3HYXXpbi#oQZ zA$5o0#5{C;oeZ2CaJ^FS!fDvehBtnj8r~Iu$y!mIl|QXPks~%_n#?j;SFA9ZW3r)m zp~-AR{wyhQ(3 zVu#d*K96gz>xntk3u)S{Q}@XUOVVt?S4FF3D&Um!#lwmZ#02JL_&wDNm1$& z%qqRW7gN+~4*aGkc1+F4;S*GCN3+dZOz_?l`U%IrU$lu@{FC5KAMh5c*Tr`oBgR{9 zZZM9jvCw+hV54O!iM&VWDb%yWQ^Fz<>09iFF>jh=Z}!JDb_YkT za?5~^N1->>fcyW!71D8kCz)iklU2*0?rCWn{27I=HV8AC2^A&lLqk7s-JZy1G5XQE z%9XT6HW>Tr@4)#g{fSrCe8My^1ar(pJZ27*BjIBI9J`?Ezu{#cy$9jBRI)O@fRztn z9`eDI*VQ&zWrR$ufL=K@IG;eQg7tgTI2;?_c@Xa3jRLYUP~BGI{7O-wXt?9`oRMWy zWw#OW5zK7~;L&(^?i;vig!N5KP%=%=(s`)iee~ojxJo|ekT|EOP)I11R`zI^DocuY zi)fD+*Q9o%;}PS)#vsJ=yjB;n`~o`;LL=W%+uMjI2#CFhrVdPxQtM#?6lt|~Z`6Dc z`kgoUHo(RZ9Pr0f=SnXM9O2iO(f5lG%|oX?z}uF7shaCP*E})g$;vDm>PNqU`{W}U zIoXG`z`w#0m#WL*R}y$;U3e2$Jy+MFF$V8$q8|sxeSwnC(H)N~Kmhv*Ag#cWgW!Mx z$f_&&eGidTqZ`e%?v2;nPtx$j#)f)4YD2E}qf+-Hy6K23j{J-g;1KIeUcnj0LT6Fv zDTd(c%epA_)k+Vtw!93dbj9z_WNI9N>-{CKu=U7j1?o_YcNiGs4$AHSt0`bHd2YUe zyB4d^a|(gnKpZmwRsVu1!VMJ_u}A8hFx+81opZkh2Jgco*@&Vm+~*2Krzfj^V6xZ` z6q{Wl@W^)5=@;rYgI1d3KLx?LWALX5)P*}C`27&mPCacLG@RVa{Y^`+ULOE1AXZO(6qzdp&(Sz9NhR14E_&w?MlfN_qLqUsziP5;5SF`{1WV) zEZ_!Nn&E+hLQ&3R)#;Jyy=rokH~ zqf6XDXL+ZeOJ*+J%{~H&ygjmc6lp16CM> zzFv=4Ah(0j)&H+KjTzQl*9yGqRq_TJI83J6R=DS#k2^f$u!A&(LtYplqxtGh~do`CbY z&B-b^-03`w<0k@{xdB}$wQ~sO$<3&Q10{Q0KxZl;t%yTL*-(846x*stmA$53 z_}>PjaMc*p|8L?h%x}Hnt_x6+1>n#D`aJD*_#njYfl7~oYG;zynC7~C)bwi+gQ@8< zCJ}S|xd$#|JgX}(UJOUAN33^^GAP6=94bTqQN_{niWW^F=9hfTq7&$(TMpg#B4j@i z%>GGk9V;-o7oom*H-)n+qPcE+zMvehV9QN|%4Z{U1I%U;ocbg@{wJ9mmQx?cx5yte zFWo841l?-Mv@FedhI#{MQdaINOl&NL720Z<|$tsZ>uj^Nha=n>9^(;_IdG!>*!69jX^%T%ur0yUEwh8 zOec@fLX6#@Qyz{#A7?egBSyh3!!ac(GIroS3jYvoIaF0nYpqPcv`BRNak&5RoVGi; zQbup3=~$ruIG{Hk^MZl`u$t`@g?b(Gt)vNI+2|LT*`cf`{Q8o58*@cZ)UpPibObZ+ zBDnKzoORGD8`TMg~ zaRM1dd$IX-sB(L_z&rGpvB>)V^jh;p;P6>;D2h@~^4|?dO9%76pf3KX)pPpiWliCJ z2TYW>SH2!t_`!o-;Mw)=gQ;zpO-1;Yt2&*rOFN8v;AXgEb041fszL$BJc4V@L0{bo zHUv{wv#o`DX;#k#mcQU7xK~k%_nOQ|)PGKen@7e?qp?Htpuf91QRu@t$Z#=^nog@U zZ!7l#sVek|kF^SQ7pz!Z-i>0cmY{kT=(6chvNk;~%qR1-DfDmFKl<9^FLGZ9y?wS5 zlmBl02Ilz`49B!^4T`w{wO@cPmqFVjE&RY{yaydueCM5r%G|@;8;p+7oSLlq0*2g$ zOW-}=btj#Jvkc(X5@xa);7mIxrvN-zq~4Dy(G_bZf_2^TY>z=vYJc$W16+KlDr4GW z%q=6~jP_852O_--PjT(PfG#vibC>?< z2h-9jbPj7zAlnfYlz^!verMnetN+JCt=+TyH=)M(pEY5>u!m7&&ex}QRbML?;D0(; zkTT7MUTh60JV~!z7L%E3II#SL>9ZZ;n+cS>aE`YAW7=#ULg8DTp`iKL=bD1+J?VSz zf8et@eT&PZqg8e|b|v}M9-)IN&*_;@D9zcri{9!dtE}u@pz9Z-%i%bo(8mX2iex}Q zfv8*4Khvd9Qfp*9fzGD*0hK-I3>A|U>QPXjJvebi8BU9_TYm=C#YILAed-ZP6JsOk zY0W!m=`woOXgXOfS9jTwqO0`n3lt*I57VJ?19V(R>_^I=>r%`gjnv;|Kb{}sJsLXr zLd)vwpxLwA+wELu_nEZnjjgshKkzKTRg*9&pMtaeaI>SQ9j{>Lpt3wkLHV^%MnFxn zYCk+`1*VD@l^vi5^Ry-4+PtX@&DXY7I@@M#TJ%_|BC;p^@z2`8KHHLty(n zeDOR&4MR(8no*@8J|B?_-sfsK51csxjPsz~AB8hE-!VRdHGGkODsnzY zbG9qg-)L0oHS?vU+0r5H_P7Z^dmfNgLa(dPL+}n#+ok5U=tz<9-4N=Vovb3PzQ$~u z-}Kb=*zMYqlVK=w+zeiv`2W0%^P}M(8$!B5JI&!ez*e?2O1%wrVDo#=o(t@&@lO4> zG_y(%yjn^bDGO=W*5%+|Z~DHi9J&3*wTm#19<0BCM^i8ZY}vI5F|?ycrruuG+Osjs zc7ogSh;Rw`tcN}KV=#ZSMKtyma=eR04WGIUTu!5F?M22t5!q(ca46+kPt+T0I2XFa zec~(!tiBvE%qF%vNFFXr(M=vD23X%tv?6<()uYCA(+(+}KTNFR*)B0E>a z*O7j^eM4th2e!ZQ{S8O_iH@+{okNyaac&0UUP0BH`|q45OF>=JQStey7pu0DUVqLy zFkA<)WCPqDx*tY1$%t+t zwW=*0ldKwzj+0jGr>noi4^f{&=A$r!tU?ss;c2euyQZi`GA5vC)H@urg$F&cTbUEJ veE?1A8Hs6qB88dWLI#VW86{ZIn%V?Tft#Pk(Kr15RMgVMT}7zg8?gF+1T8i= literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..4f36f67c106f818443c4201a31aae0106448e0c5 GIT binary patch literal 86277 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%0A#24Z# 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

?V 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror3.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror3.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..363628e86f89933d36a0ef7a9062463960fe5e12 GIT binary patch literal 86319 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 ZLncAfPvQJKfo3%gl(w@B8GHlX_#aC!=M(?{ literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..6290398f49da3ea0c91648d54874c77d6dc01144 GIT binary patch literal 72903 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 DNS-7T literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..0b4ce2cc23dc7c80fc9d18b36622034671076b60 GIT binary patch literal 67753 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 UoN?82b-_>MxM3%9`Wi_8KQFJ4oB#j- literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz3.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz3.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..9dbd653d0a4567cfa8a3f658b6703897c8c8a223 GIT binary patch literal 72119 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
  • o9 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..60a161cab5763ad3796c2fe19604c275b96f2577 GIT binary patch literal 50441 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⪼ohq@$asLCP(P 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 Jv=2nX{{sql;->%r literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..cc532872678ade4d45b2818250dc72e2fc18ad42 GIT binary patch literal 50223 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 uWEo119-2e34ZBesX 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ª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 Cf%T&R literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..bb34970a3d7afa4993eb1ce6b578740643039630 GIT binary patch literal 83157 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 Re#7DUt-$Ag>CXcio(By*4_SYX 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

      w25_{ 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
      |U4zlzKz^3ebdR+fL>NS(8(B*2O-VPEH^h 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 PaSb#20~T!nEeiP`-&9}C literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..bff2ecd108973964dc903c74cb213cb50ef40eea GIT binary patch literal 96249 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..a703a7ca749c6fa70822fb0d4854d6fa678e751b GIT binary patch literal 103399 zcmWh!dwdMn`#xvxd!O7l7cse!NW>r{A&IjQ1flCv;@T0ns8p9Ksq5J!hzJ%zit2S`%%wH<_}stomQQ&fNR`zxQ%CcB?AIq&Rv^46SN!N&~RmV0E!g;nIXRz@xR7H^h(FH~#X`T~{}Yldo(W z_}T8Swx)gX=+5QO_I&**DmAtnbgb_B&fE>1CR{nT_uDwBb^ppIgFip?(-*~mKKkkE=ZAlhiARmS_*L#k zK>69vKl}X1{Y##h!Q1mr9({1Ny8FzZn@@iB>(_GMRgptZ9sBLux)J*)es${j@3*{@ zuWldm#fd+DtpDKmpTGLz^QXU5)5y1bk9RxwPx6<)|9baIX2QOGmBqDPE(cF75FA&$ zQ-NedduhnM=)jQF^u!6 zrSEJTwqhCm8;ii@DZ@!Nwxt`H6ncdN#M}lrU`_A!QJ%H16=#Rpa_;tz36MFk0`PLo zS~x7-;2*60c`>fl=ZW?wx{lh}Zc5dpOCfWchFvTtKRo&AN;so!7oOV!*-s5`zK>cK zT#(CGOGfmts!KGr7f&8EW_QV`g1vE@i6e3?$&{qA;giar^|Q}$R zI+ky5qtAB+BzXDw6cxCj@UtWSQva|b?W4UXHq3hWpyTi5AI~`6XXuEbnJM+r%SFHQ zdtHc9{G!7&Cfvhx@m*&ky0lKZ7}5C-S5sCw(OznrQpR0h@b8J4@jEtN8GQK5iG%hf zD9snQJU{dDP4ToXGf$ip!JOs4iS77X`3V<-Cm-l~DRMyCq-7yj(9z4bn#a4YJPm92 zwBdgXLT8*FJnDx}Z&mjn*d1(bDn*eK7JYX0Ye(v9*ZJS07SFyIKL4?L>8;dW=Wd)K zI<~20A+y@#zsf6;U$)k6p7rv# zx;=+pK05IElb64HFD1WveC*b&SAW$1dg#@YhQFV@daAHpUTfz=-hch9spH|-&zn=9 zzW&oUpv%86Zj65a-~Zj7e)!+N?#zGs@89Z*E^pdeHoyPopVmEx-@JVM`O`PAv`bz7 zd;Q|p`~Ush_UqyQ-n{<%>3{zLvkcf=g$UCymnRb;O$yUXbMuul)iJlxI94mMH_J?F zQ=@f(Rw|flxBH1_%W>gL)Gsh2MgUGRK^Y~B?=VBnSETb@_d zLdDo{y}Z}?DBC# z*&j3UO>Q!!6_``Kba(IF<+G)o{{Qfe)afYdZ3PeqK_NCg+QnhE8YBE z{*72#VAqnj=yMPv--$7%EX@Y>-;uSmi^KJj?Lx4Ce9?_D3x z?HjhQ9q8UXn{!kP!Z-0`Z;x-S6)5Ca#Y)z4?^jVp1=Tne)g(vS^*s1dV%*&s_a9#LsmGKrxf}v=aaU6Uy=6=)H&R5 z*%kl0;tF<_!(!�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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz3.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz3.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..0e0fa0be796903052cd322b3b9696bf89153a880 GIT binary patch literal 99425 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

      <`DO5T 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 b{A>fpeR0j3)OEdtx~?~RhN9kqEh_mx%OdlK literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..ab9f4b4ca95ceeeececf374f83b96866a5a0ae39 GIT binary patch literal 66485 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

      3n^Dki1l(}pcBdO^SB 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 z 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

      mUt#Y|)C>44nT`~8762U)(?)*ZaBzr*T6#)xK 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 P+uZsYntB(uDCPeFn#t0i literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..63a1882252f6fdb3642d18202f36736891c22fcc GIT binary patch literal 69699 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..cd1c13828f00322175850064e9230353f51a55d3 GIT binary patch literal 113405 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

      4{UL95jd`0zT^e0L8}#~l1!Hx) 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 LB7ytdvS9c>O2nyG literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..0616fcc145cb00a96886352b10c9d9eb1cf00c19 GIT binary patch literal 71439 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..ca21f8511d2bf0a20e2a8a394473c3aea4618bf1 GIT binary patch literal 71457 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%0DQ?<`TI+hlhHjL< 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror3.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror3.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..ba31451a5388e5e7dfc262a0001feeef244100d5 GIT binary patch literal 71455 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%0D1FA1HlA+_xC5vYPSNm% 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz1.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz1.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..2ac5260bab39b49eb7ca78cac5a9e29e2bbf62a6 GIT binary patch literal 67695 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 G=>GtiVks5? literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..631658e2f16b72d3b859bead15492d7e76fac793 GIT binary patch literal 67771 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%0A6?BOYHQT=6IQHvfeD{V%+P-zZ%rEj{Vh6oQm zAGjz5QLGDm0_Yf@_C4Nk6H|YAjeUSA*+qufnMP&9r*{T5Er9zi`YKUdD{8CknlrMd zx6c&H!)^lohe%!r+9P(NFQRTbw2FgT=>~I!O*@VcYMR1Sxs6`}O{zl=?Qo%sy(Sx0 z+713P-Q8{6EmA9a?I<4|iS!#>rWnQKH~ou?ud@y*USk)uYgE#pF(-)C13;b6=o0kzT$&R;;%}a+wbP&Rj&x+m!dfKh4R-dK zTXWu0{$%5xl?}Q7D3n(M>i`8^?0XhCPu5HnG+VLBtdOJ&Xe83l%l36Ko7`}N8+5af zMYVh9G~@;e#7}OJr)Zui+I@=gje{ENVk8Irgl94x+F7Eh-AZFG1U7gLSpcSu<(K~Q zbxA|6AE5Is#_<+1tAnW)>xVfsw~^)_Y^wG$Geq4hnf%giO!LBcAN_}$KDBA@!*N+n zY20czoT_k>eN2wRa2DNtJ7e=2R*9rmGR;FKSuxIYz@aYv !~puZpIp3#uoALz2& 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

      >4;o#%P&v`e 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 ShWC!c_fN^u#T=Y8ll~8A%3>@4 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz21.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz21.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..5957973a94098ba928bcc6cb3492ce2dfe862a09 GIT binary patch literal 70207 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz22.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz22.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..77de3d686d6914f2d71b9b1f69b9943184f0e62c GIT binary patch literal 70163 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 Mg)ANPF^*OAf79n6u>b%7 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz3.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz3.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..9f7716e41c6d3d269fc1708e6c5192b13774c125 GIT binary patch literal 67749 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%0AKcUjL@?#PpZ>RSTEmazAS$E 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe2.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe2.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..7c57b69587e520700b9df6ccece6dfefc146337f GIT binary patch literal 58073 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 LZg9j3X3+luK&`+S literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v4.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v4.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..8a90b5f006f8d005079889a3b53cf0cd9bda0a69 GIT binary patch literal 106121 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

          r$IgOl7 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 az%8s6u0w6^z=IR?s7;yi#{bTc$o~Pwmb6s> literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5000.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5000.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..da4982db985b3acbfda50dda784ae0f1b299b37d GIT binary patch literal 56867 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

          wwO^* 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v6.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v6.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..a476c091a367139e5ff3702cade4c6ed5b7c901e GIT binary patch literal 101989 zcmWh!d3;RQ+dt>rb@rQmWWAAuAmm1ZAmU5}LFga|f=g44wUY{BYtJN>*vB4gFHK3U zL$wV>Z!Aqp`s-*dp~1DaDD6-xRQ0{@KlA6D&pqcn-{-qLCuX|`AY){XSE()MgW49< zdv~5$BEk^0VE%^S(XBRd}@1Eb*?~C0( zY)zl>sOkGJ_Wbw>E;mN?KU#h9)0}l}$DBX<`OkZtpZ4G0|I59X_vL>v`NsJ#_gy_C zpIH_);H&-Dz9{;6@0bf;9r)#I*WL5m2Yh|-#y6#ZJ-Tt>>qECbF;9ph!`{Iv-~;Su zpMHJ#Zk;D?z>eHwNA6#!Or3JG;n)|y{iyU>9zF2*(T6`*58XHRhvQ%Ve%1T#g&hOG z`Rd6pH8Xy{`NKC~|9NX`+yle@z7aHx`nyKn=!Pezo|?EGl3KoP;vMI;@|juN+qSaa zyH@E~gg@^Fg_t}WS%?K>Yitwu{-7;grn7A`r}_wf32VayIDO&8?@C~TD9n3y&4(gC zI8pl@21pbE)8Oc9FA=M6m9d9s-(E!d+;uHto{bRRg*!#hazj?)?XdSRtzla*PdE&g z<%sXZt&I0AHUD?AwFefR*m-*;{jfe7m=>^H;7JPN z(m)3~B+>&XH9Tb^K2Yrbb?VH=PwT`bNzdxzH%)!^ed3<|&(0@({rK4hsV?cShP10w z|N0^QxBY+pFXQFozkbAA`{%ywuxZaP=CnTW{HNS5PoDqm?A!jurMwZ-UR=(9|G zXx0{nO>e$k(fVNXofTdFXuj*|+u_x{^&_Ugx?lPJ!B@X-oBhYD-;^aCUO%YXH2w9% z>OBWvKidEGAFqG+)^+&j@zJZ(|9MjL+rfYSIPvn2fBsatKmNMp z|K2>m`oVwyHve|$zqfB*{`ud3z^ni+M@8X&!sjX|tX^fi`Q5?_g>IcwYaHb-vo|Pg zm-<@kTz|P}-pTjPIUTsgzc4X(r*TC6>Cof;Mbe6$=J#{XgkSeBPH)(0on3z>`n7)v zHt!Oa0S}A{$8ywt*J<=aR+4*w(I}K^W)Z+v#h@?C9@Xv%_rP4 z<-PXP_mQVkBcsAWf|`Im6_;-V%e)>@|?X7Za=)+tiaX#w^zLe&~N zmN?p`fH~Q!`-Q1E0EUVWF23f_e_SEzBc&-QMm81wBl}y139SUl~{_&`!s5lmlB(uKdlR|0_~M74KP>q6qNX+g!JwWKazNMv|uP!ppGyKAV zVc^&N-YH-CR<6Lkf+ku==|7_l~H{E%Ml|t zozB}Wc^?;<0=XSOUH#&(gq#-H-S_|0>dThDhvW=3onB$6-xb>JG!xM1ST*cYDBa(e z75brj1@VihB{-e%z{u#7V?a{ZDy%OrDY`uGS( zX6lv?9u6$9tASmFGX+Ca*fvMi$dlSxOL_px#-B#~oDYKn#j-K}4Ix*nX*TdcQAqSA z+bnGwI9^NI77$o3I_$46t}HAXAHm8?GMZ|QW2FZvHVY-(qy$7586_Cxx|ig@!f)55m&1nJ)3~r z7Mv9{)Q&)|$Jo8;Hnp#YEB@!x86#3ht=v=JCsT4TlRb((w{i*nX6K6BiaX)J-pADW z>B`RAl%N|GEJ%7vKCaioy8ii^TfLQV3vUN*kU$I1&hkEIdqvEz$l@|?o3p)T!FMXC zF3+&zVdi0WE5(s)znGGsbL*fIK9qw7&X1&1n%Dx?tFL$=(2^BqkZrh<| z(t7QoH|FROwimoRA<CiKnpb1%Y!6RK){`#&b6}a|H2($Q#f8T0UfWgGQtsupI~l?54k;=4 zU4)}mri$2n*o0h$5RFwt>WK?|h^h4+^B*qok=Oc}z-0kzxQ7{osnneEppt@KnpIW| z8lY$SXoJVLRAs&rxh8?F5scY>RP3T(NQ~?&9_Y7zBcL~~Mfr9|-8n`CmO>|$F0t4A z+@P0X;|Cwh{61h?40xYnps<-zjpfRcdCj=46UR8=Q5SgWG4oFAa+O=+ zv3}}g{skN-SVLS4i>Wk`-Qz-L zGea$6Z?PtOi zKG8G!vLEf1O>-4yBQR%pDB1Pyj?z`8l7b^D)#&6}^k(L{3}1@$hoU)G0l&z$uEaPL zSdr5(QL>DY3^FkH^0EKLuP`2)e=ZRWBD7fmOEu6=Vuz~cL@yQQgJ(Tll9zUhhR+p# zhKP1(;9Eky&@6BLwudw0mCIw-B@Epuj;jn2X3OJfIB08cVVXK_+?{b@7a^M>({57$ zF*;icp(4#n>?&{G9*=2~X4J3^LfAz^Z&X+-qV^BF)ZI69@fp67`Ao_5qrm+k0-wgL z6uDSn9i;Ks;%PUweeE<3a~d;z=B+OC;I1j`ZJ76J>{!=^&Kt&2wOqlgEzKJ?04F!$ znp8L`pnCHt<~ILKGh9&ta&zCRtXXBM@6-J-^OJ{eN$ht;%U6Exs-J5kRW6uO09}mB z#acz{e8G@|ZEsZWfNE`!%`-G(guuV?pp72WS`0f$);iJrhu8L*0Ze2;jAzUGMaKL| z$tZw7JW~0hp8_v(Uysb|`(j-1(@#$H6Y>-oqXLsCyuw_Ai{9YP`%$)TbTSuY8%(ir z8Y4=KT|$lDcd1KYUjcBz$rdW+To*H4GOqM+aek`1(>PHxUX~cMW-~a^Zo#_EYkhz> z8(!^VN(z2)ayMmbxZjlIGEBs19Y#NRU@Kx8iSQ)VL$A&yPRqS+{}T<223(mOf7QjmGn8 z)IqP=C(xCIJ}mX$>W2qq_7UM1$Y`z8v{XHC<9yG$&kQp?fbYy^DkjBgcni!wD~wIy zTFKUEf$AW#L$u0kB5iXr&%M+)oA>>9eo693+Yv>-#@q~-rBtM!`ly9|<9Wq=O0fMd z&_uG$bXwnYnm%`08zjR8joEm9ZLDco@*H}%22ObRcVt_WfR9l_8<-YfUz8+L8g4Iqm$^*VosBab1d>7Z> zOV1IgW#81im{D-u!^OB@j!?Bpvsrx9VFm2RhE{;`dd!^4HVELU#zcwy0o4@YH)Q#a zAMD<1!{H5uw$^@0O@F(znn5$*jA~%~N2u zgg)_sFP&B>nVVh42`=m?rwcry9(cEw5F6tA}|X!0n}9eLR0p@-_2#KYhw;sq>-EgqK}RTiK8)qbkib zO*OX0>^mxFaDgVlbX&ExcJV)Jb)U}9tb5PaQZ@F$^a2mpR%PctJHu%flgqNz!(No> zuUynz!8F)!8R;~>!YE|dnYvtDH*DHwk71wFw%G#@c=&%^);%J(&1*a>GaUrbq_HDC zT!DIYjA-7ivAg7khq?N08)VTq1AyLM>t5{)BbnaF=3c60vTWH&OjG>UlOEI80{ov~ zs`E36n%Q{LcV|XHlgwuTTd4pfKU*e%eHi9=%y;p;20tiqaq*aOyXY;1<-C^3ifw}T zlYb{spzY9bpZP$)t*cxLyv-Y~OVn-N(tng~ZorTpJE^B=uL~UZ?1YZ*?|Ds)-n?!E zB>LE67*yOg)&TAgFXW{G9R_x;yKlayTK;kxKi$L@3v9E`@|)98;X%#f%v@sb4A}1_ z+YL!q^R_u&Uhw_o{Xyry8rB^b{}X z1uRa9yX4|N5CSj#A9CH867^f8NQ_*k*Boi4xl9*YTNZ;j#30 z8ouzG9=fW@vo~e#u?z;_Z^9%H?J~TP z`He2V^GA2D%_#WN&rJ7Q-LfTDuwC6iweuSud3nXfRQ_uEM=?ftEul{Cgwt?YKvnDS zkNT)b#&71=qGdTjsU9}LW3)(IU!P&JXiFCP1OXwB?X*m>vh82V<|Yre`q@vM zrYf&#xN!Zc_k64mdA#6DfzRd6{pM>bb;r*pe)8;x83hiB8RatmqVTtTe1_Ac5H?PwK60}2 z2-nSJe1|XuvfRu6BhV%#U|jIz#t>k&6a=$^9iMA`o~p;l^!5B(?x3m`@?sqTqzm5Yx^5ar$W3|TD3}?hcNrg0wk0ULn^2*HN&NE&50SS zF7&8}0~F&ucd>_i>qzjj9TYSl4A7~NJFSQwq#3izx;l-IVM_tTE8+Rn$JlzQ)_Tva zp1GL=fuEbMb_di!HS94M=Ni7THnWjgsRV13AX(Pp)_&ARGz7c5ss0g$Sxo?2KXN+l>$4Xx)+5Gs%0M1D?PaX;3q z@ke2*Xnc*sOVN8`*c)n?3OlGBRM4G7Jch9nv)<83q<5>~RWMNG)1h}=|Ia+HPsY#n zaAviu1Tthgvb>cG?I2w-SEvMK!(kY#suet7o)%MCJ`vLm7&X$07OogdHkvOkIk}V> zA#&@HQ#N4;BrZgS7>-bEAJw)>r2T4ODaqChS+zaVnKv3&;~pcKeuZtOE~&X&^PoIe zv-og=#{Q&+t)S+rMmsV3*lldc|N9Qc<2W>jZX?3|aJEe6VpihrTB)qF&m8=S+N1~U zBQ3hQ{Mbt)fM!4YQn9Cj78pFj0X$ob1G7O#kNGi9N(4`cxqvK551P_<{CV^#u%0NJ zCIT;}MOdzc$q;yr@7Kn-&|o#HiR!3vnK0Z*PgISKsGYp4YTU5r(Sa!~n%%OCb*XV) z_E#ln8~UQJ34maMoriC|LESO1<1n5n((IL}y8@HouoKIVl>4*ca4%itNNMIYV)RfB zg?d|S)WJ`T+D1mp*8aGAJ=aHx$#4$_U^r~sOjT$dC-iA7E;tItc0&W@ph|ZOk$(*X z8qsa7-$@Yb;xinKb3hUX5}6|cm00rGcg5G=pS_WDeQco7NsrW`7M5{dTc+AWW~Rzz z!_aUi0JU5_k_auJOo2ZR1542%kpf^AD16* z8yEX838{inBPRRQ_#ApA4w{dKD{v#3{$}<5yEXYRU!Z>4LVMVbs!&iqNI}2EUHB10$fK7MD_~|ns zvWmI zS=*_iXDeB#grTbSj(bVoh98IAKUvjR;qq%Ec=jBzUILxMxKS{@9&FYuQ&G2anz%)Y zjv~R&DVp$uU^fNrRY!hz!B<>RsU`zvzs6LR$9pbnFkYvgicNz7g!Q9ioTZ1)|f4 zE>sp1V>LVcugTL_-92qP?dVd0G+9WbD2-a>4z;r;B^o2U!uVl&I{jL1aiToW15d*g zVX{NE)BQ?6?-F}!z;XCUG*m;u3A5jw&>t*PO`YG(lvEyoxd%AK3p%T) z66Gs~XA^%r8yQp)lwTGqfS-s|kLCdbK%G@Xq{CXoEPF5H0hCuVAYpW{>*8;c_kw72@bd6r{!E>Q{~0tJITj9OgTV6K|W)e+Cqc}aVVksD3%O0zL6?c!+d)0 zifg`g`X`TZt}Tu%958McL?fXl~7q-5b<)iOeI0U`JpjbwWlt?!JCQ)u?no{8f&b3Ue_y;_g<;%u?v}Wg{iahi+c)*U#5< zTXi?k9DEH{P|M|1H|eJ8?g5p{wwPkcD|cYy1Q5zo)8*)3H>GRz+J>c{9a&!-xhdpJ zgH;Wvq~C%ldwG&T4R<7$QrpQuo*Ln_ww=&9hg$|LUN;B$x&4C3?u&WFkzs@VwqHRP z8TAoSE{Vf*bS+;ByO9ucxeWNK&(a=H196xO<@k*0#3X}Bs&w>X>E7VZi-6%6ch zc`Shf2$Rq<8F}_j@){4SNeVk%Hs!eo_{@_@Hv${AFUp3i#RYp|h?AZJLbkbcG}}Z% z3DjUUpn#+U?hXlZ_MfD@^Ayfhm@AHU6>ztvGnCui3JgCF=#Ts)G#GXi0fs3G9HEBg z!d@c%$Q`E9-BnvX@g1`WxU~};R4wy?Lj(nIPWwaBql8W*CJqgE1bb;tHZ`C;5Br^? zeGz>VMAuV^g5?yBv9p^*R8uxVF_GF3sUH_w`)K9eGFz4-O7a@i=xR98XAnV?k?y8i6go$1Q3ZNMQT}!pIuD4^6X5_ zCY4zt;+3>odMA)tq99;+rd zQ@<#51}u0lYtF$Z=^aiIripThyi(gVpVGOrx!mM4R;vHZqad+e0z2pO!-=T~q+xnK ziF29vAGkU*qVBUOABo0>za8O4`h{J3qr3paNOvsH7(}YFtgVaxA8eD8t?y(!8iMtb zfA;DdrOWeWH!lvDJK)g69w)22yx4m)I?&Gc8tDdTH$7_-Dx^HtbRUs``VAb z&4zr?yLV7$84&l??5&;ENe}>q_eyIK_9ea{;Y5mw=#u zZ-*K-c3Qq_9CW)4UgT{Kq?NpF%LW$54nMd5!MBI*FrR8~2b7PLj`RG0jYHoUy9p~o z&v_F=>spR9YZIR)?P3nLOf8x)=BR1^d&nR8ydz5Ktd+qVWRZFe}~)Y(d%&)*r? zu(bQ()^E=$>A}nI49;CP;BcGFbJgh~`|b>DST_1_yN}L!(?c)Z8JW9$%Hj5>&ef!c z{eEXm!}58Dli!|G)9t3a<8xOmKb(^JU443sc6Z-vSh4kR>PO%C(!&Sbos_$B-{DTD zzH3a6m~wYo!^&?CcX|7rmL9qMZgK9a3x~UA);&m%+IM$m!>V5ncmJr)pB{bT?ws7! zzaQ>#s;)Ub=J&e`8dm>vxaZqC&{Z_ubLVs9xyWa=^W% zxog@T>3yo+-ZgH@y_F4Xx*zHLwqEQSzx>{s+_eLa^vnD{v1`JRz?0;1Y>)a>sm3QO^lJ zuG+C|9rv+l&2_sxRyzpcp-Dt1P_}4X=s+UcB8Mg3|LjfhDpM-yvrYN+h`YT&Eyl@q z>I)E-SH1u+MUF&`Y9|Mn^`=J=cT@$e&_eg4l)c)sTC;rmBqg7zj?Np-wANxhPjQtc8q+ z3Gs3=m?;?M!&jt;~RmkRua@cQX&j?661){vEn`}QwFsmyWo=JbKKb{l|)@3g3S)d|Yk` zuAqMWL43R^c-p9>tdF}b28tS4Nq-@SHXLlTv((T`Z!)~V<#z5>F`5fi+pnO-%C5(_3HX9T?}QUlZ)C9qRgm-{?W3T>MQEu5j6eKT#fgfW|PX zhWZsm2A7orI2E)K*>E-dgjfHXq2rL z<+Nrv;b!Z>c@SZzCJFE$$ly^onZa&JJHT`voZev#*b@TGPFiac0rxqvZ+mB;N}qga|J8rxHh zkp|f?9ja0}YUU~-CXpJ+V(2kqzXkK z=9^R3W)Dj5z$pAZs%lW=fUj*G=tNfmJSk?02dH_Fc>8H&<_NrgOF4zzc#f<8+@Wwq%VzGnFlGd1)DF$z%Wncu&6x=msJS~a}6 zY`CHmrfz_-fS|~7E3oawJ$Uvj5(dhnG;@a0=4Br!AvNxI@P#Q|bJIJFBN1s;IuV?T zBQ*LGT@b)Dk)m;HneHVEm&jm=KZrZkgHmiRL`5EcKaT(Nrz_jmep@wDh7Z(WiP|Rf zc_>$;x78*S^fTsMsEsZ>aF0fA21X~`Ssu2~9bL_2YJnNai93G0db)TLs>N~9WQ^0Y z(QVXVG-2aGnrPVOh^^=L15`qFlllI&l!t1T?ZK#}V#{%K`tw23?V9-~ph_LAjqp>+ zB3)D#MK}Q44P=L4QmX{2#67~!V{ zcV<8KU9f9J8KYVfao1{go)$C}<@n7fU`P&=sBkX#=p{S9d0rRJFW!DcoOLx`kk@Ty z!F=^_5dBN=wdB*qVG>*01-8B&EL5y3&Kd+AT~k{BMsKeQnt5cfI(nNaHgO8 zlUP@PK2Es1w!MrFgD{@F2aIK~jh`N_gk_ULKV9R_NT+@yW`34i+}Z8u%#Cf(wTGMv3&5zav{;p~h^7sAhel=VGC&B(DGuOKcrmG3{&UylC;4m55 z-EnrRy&BR`W_PhwFw9OjD53kw2Z}x%%GIzY4Bm`R`1anw)5Rk}xMoi$$ub>?X_Z-{ z+Sgz2n#?``oe2Ab(qaV_g$?;?3#>23(kRb)C4SDhA5dz1BfhXY0{^)Z59ujR*nE zhrb2{BYjHuZ;&p~3&qiHa!w?q~;4g&cHZ z+ecu>d>l{@rikIe?f{=DQU%ptMMhm;zUc0Ue7KsSpb0AU!9kuKN6AX#jAgR0g6g4| zKT=zH*#Ir#0n7(fw;634sUOGQoVW1q5bCRIAQG*U`_+P;vh6g?tbnI=CkwCw%&hJ1 zL1wu{4WUFP_@pg=N$sFJzcbD*C`a$gaJU>@jr6ScIWbGRu}W36H7Pc8Z5JNQ&{{0i zfyH*u-7}G?6^+^RH-8)Oc!c#6I2}hlE+6ZK`_&i?omP!`Wf@LG77lGjpC~~|;A+{o zQ*dHEx;*94(0^CB3X)(7X8)6e{9r7gp1I8)D3TWXN;A0Ypr^<-;gGX#5i^M}#Lr$* z3{~YF#FxLl?QNg>Hj%5RBA*-c0i8|W15@ z#^=;%5TU#iM-loamLX(f$h|^@g2{=fAA3jDJ*w`ChC&L`(t8Nu0s6CW# zB`{cTM8FJKHPZz%U?b*;B^QK}cpp-!FVx_lt-48qd*J`ZyUn%5#nv}e`HthajhCp7 zq>E%L0KZ|2&nf|;LeW@=Ok~x&^a&IRf<$&36%9Dg&f7Cel~Jw&4B|mc?QRjegHv4Z z+Ci~iQYKaBR}oHgHvCaf*G>1(STO1@b|LCa!X(>5G+S;}DMW^)t57iCqmE-jvFUJ+ zY8R~Yk?z+iEDb`{RA8lH5}7&_=1{BgyCr-RwfLuyYEu>y;fodwN2$3hx+_#ZRgAle zzy%fD-UmI@Ae@42H1#(bpFlT47w(C5=XV$}c}&yG+1lW+_ij_|i9pzFsyz;=;x2(S z(!*=c0I8s}V5--dc(m8B0>$8V3bzd=gBC6(sT4XsUD7nCXg%}cy2kfr|6m#MSChL_ z_}JcBz=YWh9QEmy!dcTT1#wq>on~3aQs6y8%xX~62&Xdln z9tM^Hi)724HxLJ7!$LhA%JkC&wgv6|e1jCSqI12iGgG%HRx<16B~I}h)2Z3SsF+3S zZ)}##CE!0$lxE1MjsiPCdDH~lk~|xRuo@woT?>KwI7En_owssWYG5ec@WYJOhJsS$ zP7rSZaJNNoEerwImRVT!@}22>9m=wb`02_OQq+klI7cClW4*;MEKm9U9Kdr(8-sN2J9f+NGeCh;Qe2kr1r zo488qN8H6@JsPwYupZt2D^cSFsucOu48J82{SJ%*c!*Z-+@BCRw=8bV_gF= z7;Yi8P{%@wv=hyZ+`noYKP#a_po_%K@AW0=M3^LCA)#K|swL39=r79&y*tx>bb^|Q zQ?V@xOzG1};9=3y_u8}<1Px_mbHVl^Xh;7JLx3o zg+Qs@0Jp8%WdfWg7kGoCb;gR;;20;xgR{i$p&uZFdSx)RrJ|s=_$e);Js^m@dOmlf zUO+U^t1QK7)8`yPoM3qfxFEsz`g1s24Zt85{qM$_iulP)=mtu$?MJUjOU>2@M+L=s z3>YzLcY$iwrPZN()CzEy#QLdpm}!o3>FLmLmE?%0VrJdwOy~>{4uTchMg6F@bW(*> zEor0aIW^}=hVQE%X(iy?wF zALRnk#g)KMF)#B9Dj28dMe{-EwtbtDjx5Ku#cND<__^9zUOy0(kO0-Jq4!h~vw3j( z23|9osWzakY_`K~B+Y3}rvgAn|0VmfySIx2sI%|{L8O5}(WDEo7Ud8uc@Ni6HZ?_~ z=EKJ%$*DV)Z*VKjWxyGL@+0qx)3=L@e-5C20!D;e?p{gWP3zzJUI8zg{KXo>Mn%ScVqCNanJ^)K%Wvd^tN~#7iI!YoG zvlBfdZJfqD-~oaRTq{fgCb@3;!`;J0d9uNA|77`m+SC`7lBIdw(^Nz0h_i8F3UX_ zr1o&Jk>Dz^(%nz3wlxiyz+HlENvMx0&`T!H%O6Fza7%xQ59|P|XX?2GO{_lX(}CIm zsFLt7+(CeN^&9zaORETL7xuu$Bw!({^Qdg# zO`W#n!7oXm%sb)#^m9N(@H>)(bz6N4=^@yfP$`HYdBQqI=vRHMjM!4e>9umt|DMGLm)RJs1q1Mawg``@)q1`l-` zn^awHNoq2-Ig2t0)M%Ni!ySdDDoOx>PNrHPmx*(MDk$AL&i9_kY?WKd=0fTnRsTseV(V4j0iLTLt`Za0?H}K`HB!B-V?@si{ku=&)NL#B;d~H45ucS;K9^ z@`vCa?5J{*IbHwE)`DR@=nOa?s04rLkjGVZvVLYMEr^HDak?1I!=G`8hs^=s0Heo} zmdu4;y7+({JpopcuSC5-05Lc8nKHDs)8+&} zFD2c)yhW`=7>(8E!uHulk(m4ybg)eZ_>s7Lfcg7q={1!T(R8aRkB zSZ}Q~2sZ{5RaiYlyuB$-hrc&_$`au#H zzAeQ?=OZ)d>>W25%)*^DJ{LxU1SfxVeTY0B=``(q94qTEI$7=MqkUAEnj}+=R1OKy ztR<$6m{I9SU6*z6KqsgstUgsa`;U9`U*+$1_6DtGssL=jdv}>K^bHB~nrJEq>%n~@ z)DhWhJxZNcQv}|uN4&fY&!Ug(d(3Woy>i;M0Y~&o@nM_DVVJtSi`SxnD{4o5vV$`cCj=pBCN|)ii$wI&g67{ z-L{Mt;2yBKT8EOWfKu2(Agd9YA%6I+RyF+sBd7g9ba5a??*oA7N`3CqWP!e?gMglS zRVPfq=>nBV4aITbRtdzT)`q!^+gdsn9MhZWza)WNEJ7V{g327#Khumk5f)-WWg>w~ zO%|9)xE!>8X}Sa}u}wPqV6*uCKYy>yL)&pjyvmExNs?;NV5yquG0^$v)fUgqxv-gh zv4RR9&Rh$~^Y2NW95nPo7Jm|S||%1K$C7Tc z{+w@F!nMw&(Vv7n?jGUHU=@}mkO*d7fRd>mjKOW?yb=njL0I3H0U#C}3qTjtKvf5U zkHGAgGXs@WN8%my82t(oBs!m3s>BJ<%nrsK#k;rRP!LBxsR57Gj^u?0%qGFI>8QLi z!SE=kC^ld108H6vG!7z62^EY(Gz(4fxFaw&fEyrFGCW7W>v9LZ0lictax|5Xlf2uR zomth7o7d)3bJbr7E-l?Kbywk~VI;47q+MwdVn=_#)G--6~J+o}4y=>8-{ zwqbM%L<*L(I;U+bF=x@_)*UodqZd%L3L8)*N%k1x!Sux2oy*ETeSUwyGuzQ!H%SMt z{)AyZ=p>pNsXJ;LFMAZk?Xk(09JC0G-E4_R8wukX6G|N*l7ID(1$DjC{5l{#1&5Cq zOVD{$*Kv000Z!5#IM7Hg1^stYCy70P$qVMH$r`_c@?h7Cm1R|b-)Sd5Ckb3S_*G^79Trrb{`}D9EDO~;@lc`(Q_D%R zVyvQEK%e5kaFhx$Wd?K9E`n`7icvT0VlRO}oJr^^wDa?`vkT77`AO9Qp$K&)nZ9ki zL3^Db8}d;Zq2<1(;ZkB2bx(Z}NyV^+T7thC-YR<6{fDDAXB_}DNqZHR>iP(ZU@G`r zcYAbHypBaD%0+ESx`xc~9W`9i4`2(?$HfU8LOKy!aP_mBPwE&a*mHpvb;RsSB2;EQ z?60==T8q#Q)#gXl08G{m8SqIyXy>7x!)`c+RAtRe+8E>QtAY8rZz@YbUtn-m`t)1Z z-DkN6wu5Ld@IrlDP=y8Pow1C{$mspH`)3!_pceXtHu`!zRdt)fkKFNTg4%mduTAY- zIvl2ET5SJW*Wt9vD@^eJQFQHbF=qe&bDn2z z)ih1InC?SKOl6P?$%Bwv2CWUrpe4<7 zsP3IOtu0Jc-ETj=p-`!69DF9XFj@5=^~|Bd6xG8MXNn5dsz>c-stWb0rom_H3o}&B zsb^aXvs5i7&b}^Or+VCewzm+gtb@x$MO#!)Qpp0gS8gb_s=5bPc7+rEydlc-V+yI7x$>XwqNKiCfh~Eip(4}Qn9{fftoV0 zp=P0)?qH+MVl_v0G0yC&=Bh3xnI&qT>7v%`t>$-J++dcf1+q)I<^Z*w>e3-|klNmK zsmL6xcIdcNWtOXjvdi`6FtwxVa*H`qEizqxZH`hqbzJT>GitG{T68i-?X0TyJsGR+ zW2z24IbH42Q5}6!p>~yBi8~puc2iwRI+>t$H(k-5OjP&nxU%7-QZ13y6-S`LG{3nYa31()j_g< za!(yq4^sVe=v2OXu<4(oQw3^S$3Io4%<5p-_4-q#>JZiSmQ!WwP}B9-rz+G#I95x1?1)QdNJbq)k1_R9{rmsUF=?UsYmLN6Bv1mvpJesBX5DbgQFHH(!_Z zsK<8P>@5KeBeRG~Iht`Qi*KnwGu~tgEfs1ebXcNG#hMt|t+-NG%|z9$q*94ylIfPV z)LS#TX_RJW$DQ6%Mx&55h)&07W~mx{PseIzn;Jq-PuI-pXox(^#XFHHyw`(JWRq`ku+wEHO2Pp2^WH?P!cXW6&ha z9>ks5tNBj#An8n=W|`@M_RK-e@{R`^&KNZ*vWK~6j%rq@9v(WAuSqpMEIL!5QFT15 zI%C$TWsmC5lxj4pM=fW{G+NW6*Jmm;x{gP^XIPD1)+9Pxtw~cg`JS!Sq??*T&(>*H zb~HtwwP-SA&2eWNG^&6YjQEep_YS3Nyc z7Np%_dRkN#tlio1w5m+5&5=E;FALM|Qax)ai`3?tp1m%M((dkf)?3DC4YF3zxftyp zRjcp0SnW@y*3fg)wLf>XMxRq?_sX8for~A*Q$0^Qm!SQ{^jv!`QTuDh^9|>e+C15d z+;hp=-&8LSolDW~H@zr2r`8_mcu{puuRSPxS${4=`@8C8%egG=A=As(=hkTtcf9O9 zhqXpoo9O%&?H{T(-}BkpKTU0+=X112I@+So8?;Ad|Hhr)tNly$Z_@cZ?J?88+Vcms z$26Hkkag6bFVz;RI$F+`X^Tu9 zug_O#i#s}c&$C*ytW#88tv#vg^ewN|o-%cYme*-ZIy$4vE!tAqtGMz8?P=Akr1D1X z8Ph9md6V{R$EywHR&AN=b#8g9_MGbVq4GBEdDH8n@=k4e$Lp$co3=vsroOyOTd8`} zQr@ktGQD|S-lM(H@us&NbgaxKs^I7@s%*X$0^KE(Ewn|Jg}fbN>=-Jyyg-9M&xMHRui>mBc^D&)F4+57s6 zFx?H+`<9AGUA^i3>xwAd&5rlI6^zaz>k?JQ=x(XHd@Eyhw@qE4mD6>1I=Z4O6}kr5 zhq%gk-Cfm(q{;-{J<|tmWuoqW$A=A-N?oJuV{T=#?t$v#p~@89L(|8iO117$$H%Hl zy{<|2slGBp*R1-~QkkV|F@1VnxlZ@E<5O=X)>&oUqN**rC#r7Ws%+g;Q+H@pj_z4U zcXX9O*DCuQSG8C7T=hArDo^*q^jTYVQ1`Oq^M)#;u1)qOx9X_wU)7gGRr$Jh)0d*E z0$oSPm#QkWu2c5E`l?dhE7kv6s>*b)P5*mcRiS&+@xR_GR%es-h%Qv?-l}?hFVyPZ znR-Gm)al-L^h95<=(=S8#a(F7eNg?EbfHoA(e$78LX+-O$A23xSasd9-rNhVy3eZK zLl@d~UrfD47dmzS>*%ezVAJ);zSdvp(*39U+H#>=*K7Lv`a+NHYsc5#3!sN!aAJv^ zM-6_gKu;CG5LT!sb<9{+tmg!iypfcPYP5(Ytabs?vEF)qC)&tL^@3n(Hyfb0Q&Wf8 zAiaG7Rm=wK9XhECtXwY)Cg6UU-ce0IW+U~Y0{RUbrFZJ2zp{*89L#aL7^8PqbNnvG z>iZOMhFqMkcj@Gey{OQ;26Ja#jMuxVxr;6)=-msrx{HbWzMb5S7nOQRFmLz8WW9%) zclct8-m`#Ld{M3U>f~LxsMmW3^KV|v(EF(Qk1uBFeGB++F0Rx2b@IPn#CmD4!0FN! zeLuCp?^3qDe}Q1gr5wF~r(oJMA`JGU|hZ z?RQ@~svo4bKYS@)Ke)iY_)>vh)@gs?l35=d>~Ql^sXj#Q@c2@hKD5B$&7}(ckWPoM zmsq_#Sm<=QT0c}R^t)WEA66h7a=A`Fyi+*#vPB;j>^SpsgMNhCana>QeRzSR?sAhp zqSJBXWvf0iShV|ctA3|_;ROybf@UTWt%=K*y-lwF8vs_)8otC`sf0u zH_L`UWPPMe>hch(#EO9e$|4s@de@`)xxw1o#L_8;6X%p4Xi>f7Q zlM0-5)!u27JDoRHOVeV5`|Pd`NSmVWbGSMvZE8WE;_BeEX`Ov8RLj$*2fN&?4ojP% zc6nSKnHE>z@}@c}ZDyy-*J>tB5$x)8B_?f_+STt$Y})Js*CAJ?r_Jef9eYKQ79Z?3 z^GbZ$H)^*9+BTGA$w4efO2*w0Uax!&g$$<`=jZUs0zm=ybnu zMW2=!-1p{{jI@R7zK^eDr6m>geRE}9+M>?BU$5XaWw6AlW=q;)wZyL`J8emUWJpa; z+R{$R*cwAxaurYucc;Ps}aB2Cxn^|gjg(+7JyU9C<_Q+xYe ztxZcW@E&rtE^TF}_t>kJw2WY%nO7UqR;hg!U2ROuEb!4?ZAx3+>9g^wH7zUHclXuS zv^8qq!&lqV))x2{U+ql$zSH-@Ra@G+V85GJyVBOH{T^TKPTNr6_vUI(+Qv@5uU8=* z2TPr5Iq93!QomY3`sM=ZkXm8-51rDnwc_+G!Tn~|x~6Yc_ghpeN#9n`Pgm=m{$ppq zjkVJB?BM>pYXj1^tNS0W4NBip(7(7gIDKbl{|mM9^qgS-o3&x-yVU-VYa`Qh3;f^I zMy2oW^#5ARq#J?*oUX;B?@o>0)aV@4=L%Q zJb27AeQ>(CPLW_j_#%?YvcZT&fKH*d4?YSG`bH4sD-yeGs)3h*baDRE-O zKbYymy6;;)WSrer;<22;y2!Z+;<9uvy)Yl*FS&1$>F6%+o!cf_|Cs?YM)v3*ADO$s zxAr)3{TQK)?+5}c5yP`@*X#Xi(dTj7{*<@^2j-6(Ac5X-q-^Kpc{j!(6eQpP0;+6L zN6QAz+FeLT#J2 z+o=e17YO0E_jGTi*Igggctku%N&kE)!#qa_zmBh*F3KAaPa);-XVi!E;}+pXRG7+D z3~~8K2R?cczyRia;*er{ArnIQ&1v3DQzT^H_%Mv4ca#DVb}|Igvj_ETD)Rf;?%|Cy7IVn^07f6u0TV0cH!4)dVUB#s%gu{zp<|cyz3gQp ze1{I~SzgbGv3K`Z1pazWlm0~=?SR_ef9Z@ax%uY(|C&h6(DlB@du++IkHi047ybBV z$I9MyWB+&a%kUm==F`odm0yI+^_$$T-YCY)Vi(ri#2mTC&-ky0aj-aMaAq(=EcO}P zG2<3kgkii_%=Z>?7jMkCugI}$u66f2I_n+fL)Gp1tN_C|4e;-#`E!9#cEjzhphS+q z#dIkWV}S*fKx{*RVt`?hlI)Q!4nk&!E_%i0 z5prP+9R{1)V>~G_tK9Z?938)zqYNy*S%<|+hXm*iqAY_Z-1=iHqCtS%nKv8)ne1X0 z-a+Hx>&r0Pm;untIx<2jk!_4rqF{Ri9ASCg^gWD>zYGOc#uuSbB6G#G!8e9XR0x(d zqQgsXldT7Q@KJ(gppNANItol!@I=%Vw*v*_@ilCR}}$vn5;rw0<~EMv=y73vk+-y%pbU zzm_tNLUBI5t>iw+yXKw2do^xygI_7nar_*M%W1*-S#uitbxkUqwV*+|YSOD&yBqqg zLN{hDZ3z4@Ib`;)4GvvXUd^6q85DM#;YxVJ?M#ygz^z0UAuJ9yWs|oOkjg52al!1aEHVLnmZnH>0q^u!A8!v`EweL-iN(UA-Wt zaQ5+rfDcm(=N`Em{Nd}mxn~=6rx*M_x8$yBMBG`N*l|Nh`DFL;eVCyW>=YRU=<|oS1NX5|u)2q=tXX&N z8b>58{Pxq`BdcJ2V9B*>^ibn$>j(}=m4L4wq$t~AmcNUWJZpHlyAT9M*>`TPOcaK_ zx7s(WW<`J7@Yjb$ufCmT!Kc$+jXQjA&9FDd`J?X@eo*<0xPC7*L3879nfrgGTAv^P zIbJnF{|W^6x$N?g`9Iz}I%3V31i$+o!&g?`dLqghQUtVM?NzBSAltY=1o{VA>IZa_+$Up&xg>T1*o0GY1@( zJZc;fzH{O7vkz8>=Y}jdHLl4#*u4DagUrnBJ}Gw|Yz{xPFs0*xLuu}R(R0LOG6^6I z58i!Sk4qSXBg-FGJK8pqf|+Dn z2zyW{wwLnCXpfKk$1Gh*(nwP4yF9G;Xndu5^YB9WpX*cp_u%rGq7e0`hivAl^=kg3 z>hM#Qq~yO5UQ!t-d)T#-n>PNq<{bL!APv^55>7$ zW7Q@khF>-OE{iLx`;Uw@pGAfVb8ZV*XLDc)^4u9X1L|l*P&)rKf{=ea0|sP|MIn%1 zcLU;PyxV#Q;qn>dJ;6qvI_|+E4#Ne9Hj9`UBA5M$cFm$}4jI5<2PlA&qUrMzH!6&`8rL4^H?=RkhOkN(8m=S{n^Z+}6p%_-?(AVLi>4)lR7 z;bBY@7XZ02m;QzL+d24PB0H{P}9XxIyGE3aMd9r4o5o!SIj*aePIO8AT)pT z8ZNq!>}58#Q`iU4cl!;IbB;oA#5M&H3q+0}iC7LfULFdmz3$)4;Sd6uUd7Da#Ob28 zv;O*4=ln5v5aZZMi!sG+v_q?mfd)dXOlFXBb_Q5ku!5j@5&IJl)W{>zQJK01B$zf% zm<$719uQ3phjsXON|aE-3IT$~ubvbLz@n?~`YFcuc|3^yHF#A3Xs{!bMH5UOSyR^1 zH3!Gqgz=DYue~to$hG3LBNZUw*|DRfftRUKFxEyHuQhz!U*{-5o)PvT2YY~q1wVb0 z-E@3a5R?8xN&xGCxg($u_T`Tr@_2mMgz?G)^!;kF#ic?XrKV$AJ zs*Eg+T+V>Kw|YiU(w%LVa0Z!AOliImVYl5uNWaOfSP$xE0b8jNgw=fx7g-%GE4Knk zwiw9`7-68JhS;(07SZ0HUoJ`c`Dhnf%;aVX8;Cw+6}#2}%{?f#tUhj+in%r_YBCS@ z7{L{CR=)}3#$I0x^h82sTCk@vlZI6MUDxtRq-B~Mi4wm*GeXZ5psY_|V?M-6ek|Ej|h>57CkP-LY5Gu6Uqwy5(!`% z65v=wTgxKjP$NW>O-s&ACSwkYaq0WjZj?TTWFdb_bBTMMG|ysr3f*v6jeTu% zSg68nyI>2Lueq41qjc(TVvAiivXW2WZlPE^aD0fggZ39HSMnjA zB?`!fC*^iwSi*rIws|R?(VCS)0kR#KmN_N#@OW@#z!G0^XUC>lx5zPH>C#t8M6b2j zY1lz_h#KT#I;_tO2z;AfI|0mRRU7w2d8MB)fkcfFjLw{|=0h5_9vMTdr=Tp@KHjUp~`zd&PK9Gmp7N zF@4O*#fS@gY(!EF*jewHM7uFR#BsZ*5$sr2*iBPJUPUs0({Vp3IW)4ziGf%%oLD=H zYLr;!TId+8-aIVJj1a$32%8YuI54p#^UdMH4`4yd_3H% zc52_e_7C5DzxH*RCx6d>)7U=YNagV6hCSiy$E^6;uBrF-!P1cP^ff`n@^Wk=09p5mRYpkM7NiZ`Xe|0 zW&8Kx=HBI>+P955*=xGfxZ}L}P=S9(edfucf{2c*Yh4aSzi$j%MIsjSaOCNunnisd zxV-r5^&*!OzY_BD?*+4f2~Y~wQAgL3&aG!Yegg(cT+f7!3r&=8b? z3N{|r6!BcM zW@*d*h?lR{jE?zZHN&j^7LG-<7p^USS`^V4^8KBbGZC)~i4eOg!WOd5UcPVruT9IKE z??=~Z;Opbp&2(k&JKD3f#{1RZqg~J~@G{z2={>MSfh==2F+NH@{0NMLRTTU9Ff&R{ z#rk-{Xd}M=WOWAUoy4#uHEITL+p8H7OXXcs7zpB5n|{4jhSj@B5FdK=cSO$c*{-8E zaabf^?Bn1d1TqdAKtK)25+3>nXdc7eVsEv6V23OC-ACeo537p)VVc_-XJ6>1rQm8@ zwg^7Gm*T)X|4t~^&qj(TbG!dEl-_YI#WQYg-S}ilZm$>OThB!F?)vfB zv$B^@XlsK5(1zS2($4ODChLc5?<4I}_-h4UB16n!+n_g+dF^O^NRI@C;SFksC?g7J z-L`34W#Dr3;PV$pA_-VGWug{bCrQq2HMfidKFH0brABIIU9y= zq!pj9gmB`Ye>?KE59i>63m>?aeH)*Lmh!EgyX=$C&8rd_pQnyo5Pht8wPbwc3{>~L zbo_SfzO${*lacu6Au#qzQp>N?;@>$aL-YQ}A9`qUE@69eMoO)DE@1fVYISO=o0b(H zz0Uy!FdPGw@uG^MFmRA>rE1px!!H2;wtxQwn9TY{6A|hhS51|jZNPWsTJ5TtEj!8p z4u17IINrrL;gfxDSbEXH|MAc5StZ%-}`Y ztJeSc60SWOer0@sjl5Tn|*8Zlu;Z5 z&7f)FLjbZUk5NC?gArxGpoLE2z8U0LBBzpW)F8{eMYL)dtvG)9{!rh;Nr4AG(&d*o z6in+x-xnsC-+$u%k2a?qAPVfhN}ig&I)?^_9u&o_7?~bTFJz+?>+iu5aJD#Qjoi%k zQxX~BH%ysDU_}Fu1{&;)Xgd?6r#k6lILvBS4Zo1^A?PC6b~L6ebSm~{xmolM7^dXy zr7y7k8NM9dg{E)p6FcUy4rZb`*}#VCMe+0>M6l+hq^Cvs;TPQ`1?j8U1q5*sO37h! z8;2@*R@hTR%efO_BuoCWTKBV#3ezh1!a5j{fx5{AzP{-JkJxjsi0j}9E3xpzU}gI1 zyC#wc3YI!fr_ZxK3ZVrs9&J%YLLIYlB+)$2VfxvqiW~nC292a3eoTa(Xbbz}v2voW zJk|i;^tbT`+wa z=OBHFIhp4WPyWuyXdgx^A^i{D78s5_`r2=SiOj$WA`4ZBXSE1g>16D{pglw@?aWdM zRYx!W(*rw{ss=O83dbfi3_BYK21Ah{R8CuH3JqhBL!UK7?eWzD_^mF8#pk-4Lg5AF>$0PkesqGGClEFT!sh>FA+8Z z-)0v~RWcsZ%w!rdV_Du__!qm_DB({pfMXFzU=9Q*9IVtnl0A7`oXld<9(pg;z(%r7 zVjY40vMtn1SM<4oM;q(`)iQnXs$KL02s9&1M?nbOl~J*b zTuy_r0rvyWI%*%Td&+5|BZ+vN_zJ!Uu3Quki$NmhC7`nJd~L!`s+sw1wbN0`pOJ%u zE7?vXZ1zpCSHZPV`E(}ZZlGe}SNP)~O)`E=z*M7$jh1kY^ckol*|gmHaOKI1v<(K6 z#CHNC#COvp!3Ovl{t+Y=e<|O-x zVUPgBSr7PlixW$~gTvVE&Iluibu^QhI|=QF0PvE!8bmCg19Di42V$AjJV7Yt2|)|W zt;?Cda%U+))Jy4lw99h|c9#0UqbK|>>L;YZ91tpKXhCq*i+XxNl zJcyW3Y$qnoRHeIyp`|bbJ4)>_@vk)!YeX&Cqocr4pCCqwL}q>qQo&J4+%0k*v4kQa z$y<7=?ZozEg;G<|7#w(G07=WgNugrtHk6YS#)y@}-%$y487{2S`($Mk7);#8JP6GV!VwG7P497 z!yn^m>>w+psIw5!?Kb2>Dz8OPMP@on@H>49PQhHR2iV)_Zdys7K}R8)A!oPZw31jKe zlm!Q=0D^1DMFIFmD`KNsXpBbEt`r%cKDaDs1_-{P=2YtdTz!3{9 zR2JPypGTsf!GE#HlIi7|`Vvh6+%ju!TXfVuX zgMdFXWxTN?!?)3`=p*_Ocxf;OC_#=m4M&Q>!ZC0dh(oS$^(GfPSjaQE5+U<^oCt2LqtvdAC|~cvSN=HG zh2>lA6(ENF@aXR;tRusf^2;~}Q5*UbJF=^{2VHVabG!k@`0rs3W%)} zRm`qfJE;i6Y}yx&{gMFvjdpU8g6@XRXfvTB$SEo1DtSGmJw+K28*!{Y#K%D;P|?H= zC}FoAamDZxRoDCziD+DQ+Ym1)Kkwi^ih;$v)!@TO7;YBd8(k7@#%rN37U><0bij<+ z-@Nm7!(K0m!COJ*FAH7Ai6pe!8HENa3#m8hL4LC<+uk6`Gv`4YxmxZ=)D^MrOCtgyC^{=Hu0jU#` zP#j)MrqfqJIwt}mP9^Y!kxJ`kzJchxd(lKZ|8^f(YIIccjMQ!P4x+FfD=?rG;yE#+ zH;{;ZnLlQ8B-}2;4zS>f`w8bYmn-4-(C>zS#zSGa(fR)+#(MNHoFPnVkX2v+eQ`Bd z`fb5#mVz!NN%(Te6R!j@v(5U~W#V43Qa1P>I59{nl7IUTY2E1!kFX2l0(`Q}_;pB( zrs3)AFsqA_@HoL#DG_1M#3gSW&8UnxL6@LB_#WI@`^66Vi0JxJGf7{iR1j^rxqHL}do#zh6{Yey+7=(GeJgS>uTB+<1rK_0V#;+wi zIP15OcpxLdA|)57@zCP64rB~4w3w%-2E#(k$5N?-k~8&VB}b+QKBG0A3Vb9qo)YoNh-Vze`hekQsON)K!(r_ z{=z*!iKQM&z@)caqq7b#0(Z>OcPBt3S_bC`?H9q=S%nJTL9&`p{XL8kVK>ZE@Uy5k z@@fJEu_E(M3vDJ5_;*ObZc;y^$VLYdQ1m^PvNe?Ss6!S%j2@4Mf*T%##Wu%obt3U$ zKVTX5SiLUM^QGImu^78cU2u5m{WKJgCPF`EsMtxti{-Y$ z3G^=xVgyE#LuXC6NbmP^f%v95j`?&0aU3mC1} zgSVD-DUql9&3As4{Y%V(KS$g;lrk$UfORe0@q$CBGuqx0@0>kfv^^aR+OiNt@6m^5|8@lsF5$7*k$s`~5NaZZd6d_EWk&#nACr`f1I zcpx5yLHWyN6v=Oe`Gc!q80~5#KzM4p>#bv=cU%7!xH7-hO#gZRCaQYH5Kyx&$_0P^ zcI{o|y=8VBNMe4so4`s=K`ctuJ}l9Jvl8@i{!}Ld-1dVrWD};D} z!`K^#CsB~UkK&{*5dN^Axk2fNyO8b5Nfn;PAeP47MwlnR;jTYO0qkM>kSF8BpurG4 zd=h&*$RvfvdJlN9A*bJOF>{_suu~hys6UFX;*KqYSs#)!@Uoza*45LnWqX70@?nAYTo$A-FS^t#X^*QMvtsX; zQs~AL=by=;fI#tyWL0)UMW6m8+pU-r%!7u0-*4wZn3YlhsguLkqVpwjj{COE!GeUN z4?w%@KYVQS#XzZ?mv9AjyJvo>+_G@np2cS$zkjn>G9<@owA0e;JvTlsb{(22nUeEw z$qt{?!XQh^1j18ZS`k1pnRnXSk8`d!3+@`!K5)bnNd@NQ4&qDco?~|9VI?KaaA%bMi-Jt}jS)C4cxe{$2k;|q*KAD&n>829zJ#nt2&`k#6r`Jh7B+n=YrT9!Nq z_M&=NfX6%2MhQTQFpf?P_mr{BXT66AIc|1FsJ2ZJ|)G6n? zT{-I}aY$n8$J!bD&e|?m{uY1B^k*rfJUyJHzaYmm!`YzZaW0&!)K01g5x?nyeQz7e zid{y`_nNS)ankH(r)NFN(;N+d@#)O2mYVOHPwbgBkbKaX_u<}g^K)1=npU!xYB-Sog`aH1+-=fCIAJ?#|tS) z^eoQ#TB-Fv;oKCNwl{LFS4i&TNjXca@wXH6-;}4O(>WzZ=F_tm`Kv!=o4E+_86Bxu?mft`ke>$F38)m&0NjH*`$3SA} z3jbq6pLVASBQm|`?CN{<*wQPr+9j(pMlJI^o;!E)G5-T6@yBHu#n;G4hT>KJyY}46 zPw%{U+WS+^yGibBpw$~hhH>h90K2h}4VU^UPtcG;9}|`1acq#(L2mz+6dy|T1TSaT z9TgfgwnY9S`8(HRa`m&CS#P^Djz-S)Ihkv?di6-_(6^CG9Y)T56e##F#_i$QlaJgL z)ncKm!;Vp(m$^qH>d1`5YN7j$U2cevi;Vm z9p8l=vX6EC`PXRKpi8%Ib5@4YjF00lmu7RI^VXLX4jwySsyUVtJK^Y{+maQzVX^xI zc1>-VQ+*Vlr`mMC>=EgO|9S-jO)5xPQW|g4nq| z{5-e6IZ{u+^Y;`sPM-i3ZacZ@6VLZw>&(-C+v?ip=9OXK-fvnotLWFmUcv6}PCH$3 zb^oYcC-Z%?f?wPT*tvrG=g;q)O9bI`zQ%p@&chRhOv>Ajljeto#DQYx;H`I;sNSB= zCRtsryT=6o$bC(kSxhSm`uF!PATBH|GsNhkuis<=cmc=8YT0OPyCrOUwGgF{Sy%|s z*aHr*JQiF*fk!d+cyA!5EOc4lXXq3*&#RCNrEw)_?~piHHBrLwmA-QMGgkv8bmig? zUK>QtHZGv<5%)5>fux2YAt9*v7WAUhJzdbWDM6|Xkf)Qv^N(GerQa*}Oo9~oKUuyx z0bqAzxE&}KM-`6r9khGT`-sj*^+n73rX47A z`*+fg@uMGjUA>XQPcM1$`@J*zX`}ZZ_-97y$I|Pks+)R{ZlW`DBP9ICm3PjKd1%gz zjtKX#6mE~mke&BwW;3Uq?P!C(+ zHPee<)@;>gm7iPC{OWb!?4vd4HQv3soPA_1v}I<|H$qy3Yj&2`K58v|m$~M8g{CFG z|Iec>2ijhx|9Wm(C4zPOj*|L?ogri3{0}p-UpH`%jz;X8knZqxvZ}(@0=O1&-^W#& zd0b{}p7OYHFhJAqujBrAul##X&+E;rtuUH-8%pUbO6Xe8-&QX?$7MeST#enc;M8_< zi2MseX6lxyt+WEN#%)F~@WV?&_RoOB59qpnLrFV^B_OogEBSJ|XW+xtZ${69B}T>G zkjoq+?1g^ie#|*XzGd{g$Cb~0c|!@XAhu?osqv@`vE?ETzN@qwwE5-c;R@EOhQ3j= zyd#xAEU$ZO{d`0L%TBFG{F1X}@|NM3{;?s-6QjZpdWlrWtCv2#_~ua7+Q>n^Za1AG4qSe^;%&vA zZISyHN_IO>uK59Co=RbP#ndJavum=W@>$x`maMdjkx4#pa(})0=-G$202?b9-;i9x z@v;f6zx%tbVap~R+Vp(SOQ$T~DenM|9A9>Dz;4~~NnV3e-LqFj}1H9Prpc7 zdGcIQq8Iby+ynmCp1iP6dvta7(QkLp(bLf3_)-tamCq8>LpkPyb2_fkf3Dns|7{va z;>-Oz^|$U+5BU+<5>HQzI$N01{Q(a7XF>l>{a8o#PzVx}>zeXn~+nuMW}-QIX2Q@?Qb8V+9833n22^TGUNC29Ul({GoaWMPW73 zBb}f7xR;U?nf(iA3WFK5i^HE%MY)%f3m<_{Deig%=&)K@2}pKp(*&-csn-o z1HQ~V=x_q9!%h%xow54p&vz1_va{t*&&lT_dTSF?+ zBvN@rg9mWSs7CrVkQOvgMk!@3c99i&!Y%HAJ|u8@D0p(n$(;m8U@Yrob(4M`hniM3 zqAw(;ABOivx=trxWf3?+^>#mN9|J*)k5ZWs8r8iuf_1|M3`dDhkgzit`YMG6UKuBu z05~zgV*<(AO4{yq0%Z_Vaw-gxZoY39gz{+7_kQG;2N^j^ZY(d7o)7=_o6LB!4p#d} zZZ=&9;rO?la3yV_x{)_M6}Wgb+jxyK@XSPud%`~t2ea_n!72c$_z2AwsheZWjs#&OG{rBp4!MdR=cLTmSB zx#l1v5~1Co!*bFfN0>z=6PVPDL+&0g;9BX(yBMZUN)DLGij*RT7X*#uZ~wp%AjS4d zTEdf%?*2ZIjLRoF%Xf9q(;)`=;hCV^K}$uoK#(2 z6Du*)v*bTkGC@`^xswD+T{FOdqhKWKCnx=BrQg0Fs>#tzG-u-SmnS)~#!LdU*s~Fg zw|It{ca$KbOJMtKd!<;>Gr}kjMD?gknUIWMKXz8I&&} z1l-JIj=JdX^={zH;&vCaqlFHjFA<7g$~a58HblJKC=7yObP}cPBc`oK^9kG>gLML5 z)>9$u=2W0+HQvO%K2=E0F*q3po1a--SvHklq-WHl&K>FDeye<*q zMcxJ{D_=|n!w=xVjQUY%nCj2j0`r&cz~AA~(zjR`bbK5o<}LtF))%|Tg;{(H)jK*F z6LQJwW3UradE`Ef;(vTuS0hi%&w?=UB%eE!Luy^#|0nL!$Jn>}#ykZ0h} z*AanBNWH*v$~JbQ&v=jvx!Aui6W&m#1p&axBo{jep6j+@aK|tq%+3VFzfz?6p$nXOG>w|cIo&2kx(#tB! z3dd$Sf0agtV`moAUVqwG6tid$WsLz4cCIM4}W&7O)39OzI8<_z$DQ;q@6M!DG3s zT{d?wohowxB_p@eL4s~VH0hB)(0CBzWCa6f`mN51!~Tk8#t;OV785M52@YU?*4s+1 z&XsVwNl>)|hQuo*7j+YtzAgqyoFu*7QpnOwrtMo6rM;D(#j zPSRg8$X1uanCd~SCzI~lJd{dIzvM@FJ!?M(+4u<$y3i8Ti!<>Msi&CGI*I5M8dl=Z z1~Ppxm$2m2Q36UCrzGC-!Q>7JZHSRd)p0K)&+=oGY&9A0)p4SL5FaS0$?k51_2dAbA$07X92@!fkVF_r;ckpQaX!8N?Hy5 zk$%88>=4FYE;Nu9t(k<=bOJ)v>Ir~eLG2)M=R2lroTEk9#w~zwh{Mwu2Ru#5&m&?< z0jbNA7Akh=ns#81zX80sCQpQa_ zT|sb!STtq41P?->CqGo9gJ??KD(J6twvzNi@8m_kqCW%R!3MtLq^S0z`}Uz=&-js! zkpn2Sjhu8!=!bc5C67~$mKm;N7tB|7b~$E`v7$!8@-1NcDf?g!=1wPAP%nTx=PoaGw=H>_kBP26Rx2{C_oCJ zh^hLP8Q9C{ z6?la~FScIe)3I5EteCIo{yn1tL$)rB!YAb;#z1?45ez|)cZ>%m@R!3e9_Gl0G9naa zoE|V8vZXq>X^~ch#vqKN{@4`E5})`8-M_0FlNqFV#1j0#_5*F)1cPBQ z5ZQt3d%g{KWMj!gktY)j}vL@|O4ksLnL6wEMPI|Rnq!86-H(AJC3&fcZQkV8Ng$iz5R zQ&1xXF$R9fc%%+KtrKQm1f?wb5InjKquD=>X`p5!g2Fm>GT5G)c3PWFjv!hRQd|?T z?YIZsJRKHH;{>YiIZq2LXBCAWmor-rM5g>#3MG$*L*j5Qg-V@do>HQ7U1wyI_egJ#2`x6U2K(K z;%EIpNW7Y^{SDGjx?ee)x$Vl-q0Fm(rFrSAm+iVWw&IuL#S8BKZns106RobqZrJH? zZ9%o!A+V?3{8r6y+qlEjbX%|#w!_B27IZY~0w5>s1E*o~diuy1z}mU>`tDV?(!(;T zYz>-bHF1n!js&lsx$A7nYJaC|7fvldbNlt`ZT+tdgUp>~TykHb9hbfO?6s7J${nQi zS#jqBQzPpyen~ZA`4jqF6pDP`TePLshPZX$K~nDwSOe$505zFy^qdSx9bLHC(%|px(tWvk#kbpat9Lp*FM!bah~Km zZH&zB?^9NHyo?n`zNy}xXHaMMX8+lxH{aaJSS%`Ro4vZ=nEQiDk{l8nvG)5M@@F2DLA;W}8i{6`ysWnFZ!)j+O#l4o?`0A=p_Yfw z!DgFn-M5N;f(Y9~+WF)+6YClHOv&EIO=~{?owQDDv6;EZBIe52^X(31V4K(TYn(S5I^<|JDi;y{2E^veS)pJ?xplORP#dm1|(k?d=q6Q4zQkft-EnSn>7Sx=RV~ zeEyx-t>>@Sb-eY=Y5V@znvB*x?sG)hK}}Pgeq4Aqm-Q?}wL0+Q3fW}mpnH4fFX;}g zODb_VJFvHxKwx8Ko8zN>J~f0A)!%*rUxGJ!H}jOkoo$P1dOe|bkc69QE?h=LNwtJ3 zgaEt)^>L4Jtr$`|xNx@Jdl^i8J=P;Ct?ofOqtE6#ZXZ~AV>lWurPcE z+mKGBLexAH>B9WLLOxZ|=uK#hYX(Qbo{cti5}*cB6vTvijbJ9~!w!HdMp)(0k;+ry zmg0Adhf;B`Dov_*Ld3>_twL#))upR^h*yJ%lHPjrWBh{D|@WvtGt0t$wu51?I z;`1>h_$-F!j+lg5MLq2RSYGIwzTJ8+y&sdf5F9&%^ zFkU?sRwK6T=iiY&0%Mt0Y8|!=qoHyGQWA94s{+tR9e1Sj<`Ty>_=GCm?Z6AuW9urY zjGRVJ17d<50#1BWHZ?@U1B{sE!g9)mZlTcVBhUz)r+;ARY5?FAI2$_pUCOx!Lh<6M zP^C&I=@5!wzaI-ygW%8|Mv)V1z$Hw^)KjGqA7*W4acGut6TAgC}G9 z7=r4JBlfW6nT@&O-nzk;nqrVH#2@wxi%~lW9sm?JarZ$S=84T^_bk?_w$mYOM1-&! zH9@WTx{VqkP@Lw>48$z>Bstj&LNy8KgN7h*GmNH&tFqIVS^!tz3WKT^eR~kJ8`YX- zf(4*t%sfy#pWG1Hi1dQpU1OrfdP9w!A5gMt0y%_sw}ct;7OP?5z*g1*%UH2|$jKUBQ66ScDsL-v}pkifv&4C^k<*Yqbt7vlrggic9asrJ;w2A>#**h0;U4ZrZe#sB>t z1TIJsglODwZT{b9BoaXZ)=h~7+H_M~Lk#t1aS$|~4I39Y2Re>K68FIyX?J<`>*7n@t+vL5-LqG*?jysA8wfO zp6m$kNe#wBr?7z>dWCEZ3bwrh_E#@t8^p}X0Rixhm1C>W8NfP*7($7k+q_o{TRfjp zbA>KjBXGxpoLf-1=*72|YXVXMfHs*R1T{pV1`bC&h<_0rzSv0^BG={LpGmaWJp=aZ zdQzcgjZM%wnF-E->jv)FBsmpjhwthECRivopRUW+3!$)y1aK5~d^#urh3%4>umgeL zJ(_Bu$=CIx`2O$qV-(Cr@gZ5Ono>>t;}EW-6Mw@8vQ^#-PLY7*Ip zPzbyspfyvW&nMwTxE=4*s*uIF4c{_Gi;dU=7I=rjL3KJ*zbeRM$P?hYNRO7GUZbT+ zg{sXb$Q_8AJ^2sfGF}u9!YRbW&L(m$W)y?uD?GlJAblVpl>&}LXt3eiQo^o$J!%Fq zIeot!Yk@sj3=@zSAmJL0lyDe+=3u*)5HbB2Jx3^q6(h+oj#iAB(+{md6$lAw1GBK7 z$nOnWjT!(Rhd&rxLdl=RCYQi55cjDe*kR0Bf$(A4BN1AW(;-vQxqKrv5l-SDRZdee zKhzoMK$KXcgt!l)@l#PZIusBVLBsS$c%G+W4hm~}{*Ay@7Qa_O5C>g=n#2Bx3>|q8 zI*7y<@GS$W5gI-az50tSLG9>7HpLWDGism*JaGoykRcD*dLmYD(p1SxSIr3 zG!$PD0H3$xRBHj04`vbKfeZK!4#2CS!^kZoQ(+!lgUv-vFkjP(mbd2Z6XIeNam$!m|j7LHtQ~oQfNvYRuk6 zC5d5%J%yQ|ju8ET2T4pVe_-_fFqi{i62M8VpdLWEBRK1LIZQ8*WJ!#LSBHh!-G{2) ze2p<;{OQRs@;k9jz{zST(=CBLtUKz8O=jq;NxsA|#10F>l7*8{y`)N4!aU%FZNp~J ziF`7Z7(+M=PQo>m_!5}CF;YD!a$f>=0Yk-PI#r?3NH~VHW1hGLFr-m|#&5(NSp#^O z7nl^N>qml|Crk$Rs4?Gwp~oiK@A`;*!?a`zFmt(1b?^|;0rAEds553$M3s|hCRdRy zm=8J!LQd7M%KRu`3}qwegt0FE2EwMu;Sj7EaSxb}?ZM};O=951XhcQ= z2f%!sN;d|GA1pEIkxZ~;5*)EpXtZivAVe^sH$$}@Y80rUfUiyqiNjpc>9{dp&#M3> z27o=7HU6tpPeBnwD0>Gi0^{&YD~SpcPN*O}!4R+}C>8;d?#^U)?v zA-?X;h^M{I4lPuVf8rYKadvE$t%xI8%P$0j7D_Dz8MJE;M6%iU>UU&dDW0Qc9 zT1QT(fJO2A_dl)(AD;a9XnNTJTg~L$YO4+UQDgZPp^n$Bt&;D*uDQzdzv;JR|NPZ} zomTuh<>pYvt)!;6^RK@%yc_0!-d1gJ+mRRSWN0%QQMK%H*oeU$F>j-h+~```oL7Bc zSQ)>(R*yODsQ28}`1;1p?->&j{-X=rC$Hc2`SsnKKhOQnBIi3hkI2$OmjHC#@B=Z0 zI$euYmArk)d;0I04@*%Bs4O~A7gwvjajyqn8IlnZqaTh`{{JAMM zjZMY19f8M`M`xQ~Id&D+7@;RmKtbg(@cgDrmvOQ7avRcrPfWg?1+drPJ$m8?vTmjm z#?Q`xb0kOh>djrb0u<~TNy*^!0!VyzTJlw1ph$8@l$lRj)czP2gF z(oEM#0V6PtZVIdc;K54v!^v1o2i0Xj3lCSTO=Yu#3JPT&#mV*EUo&Ha%4P-$T+dv% z-BNV+QlaUxRORgHSdM|quJ?b^?pqG0%xgRHA~WhrkQR*;{8NprKN*5g!43Hge=^OS zd-fyt!T>5|&@etZlE_0=0ADAPf+Sx*@iqCts=V;Fg6NPr#pNGv4_=LZR+iaT8@>Ht z;+?R_LbCvg_P(W8*N2KeCWW6JsIiDbT7U^k0yUS!>2Ns9!8)%jT580$P{09=jo^-L z6hKi66fW0_hq}^ZxBu0@Rc`y?|FyAnFz&#)@>iQ47RH!JCU$uYB*fWK&w0+kax&6p zHCtW06!$srA{LF!LUrj86~$3rTY=;bhPeY!M8Sw%Netvxx@E5!ot&`g|3 zBkNvqJ7*7HiVv#Twz}4tgjnGSj99=iGx_LIi{J7k>{)wK@@o3X4~l&Nl}^}CZ**#C zW$aWVb~uz%DhPcIfyM*d_mnjlnd4g=kL2m`VYv4ue=xhtUXbmLKlz*7cU-}-Ovb8DY0IJ@p?`PY+!JqI^cy0iy#&YD!M7+CY|W5Ui#Vf#k6 z!h@ft4-9=PPT*8N*&M=oa9KPt@ZlSUd#3XFW;W;1x#~A-{ZKiD|;K@{zg1$}Ij(S=4D5WqD}p zDa6syv(^I?+%~})hF*~nKn!VXKEIxP>sVkEnO}um)arBq)OIhYDMXWW&8#a7-~$$5 zG`!XxPUCDK4iXL{j%B`}!)3`%{URgw8zXnRCa^6f;a!v@D1y zIfQhj1U~&5{lep}_Oyqg0JbgL3@G?HCBSv~M4in9!j@U<(FHief)tYXjtCGnW&&no z=dWs+4u9m{uAJD637Y4$x2U!&?<6)ovGxFN#0UDaEiT-SSJJEf3$^ zy$PO{7Cb)~g=s9Y12prQ;NfI4etQ>lo zP_S&>ProaX4#L&e%lokDq2xxwsjIV)Me7&iT7l3oAONP!m00g8fArf~8l7N-gg6Fc zw%G4{_*2E7OQihmB*Y1yq=2({MV5-1GK5!R2~3c6#(7K)$0H)@NB5WLMpkImjL}P_ zN|(xRlYQ$$J2zf(Jsw>Ac3y(I_}kfvl+8QbUR>5?f8YM6_{e%ZMNfXxC2Qz@#pMWa zvgz-ug+~b}F&~%`4QCmyel-~O(d1p$%u_Vrhgl;G6tQ!+GtR2T5yx4&M{82H-+99< zz-#C2w7*blCJWeks+UPjkHmI7KjW+Iwk=aSf7W+-TZnyYs{c>K{!h=t#p!G6Kh?gH=-H-i@oRm& zuRFnogJ)*-n%VA1Ft)#UeN!EsvOnvf8AT8#pHIv^Qzy5Wiq)x_F1J|x+BCsB_NMZ( z;(%N0!IqY$8RKE(=zE?uo4%%^HP39Q5U+{9uyZcGdxM^inh^1J?^x=+qYeN#qF0&` zdjF=nfCQ$0#C^VwzM_8Hrr@AQ7q+EG?!N3^{_D0*(BH9YX1M>puUGbYtV1F+@|{-g zA87d4YN5E+eDUnvW+!IcSi|bB1;Y=f8jEwav6I!(9ZiWlK)s_Y%n&xkCt>*o*B_9?}$$g9Xf(pqt@H=NJ+lsBnMrsd# zC;o)>)k1!iHgJ?9K)BpBbuKpNebXr4?!oH5F~b)%+HD&y`iK9sBK;0VV5e#O%m$b! z4C3qnq$!g@1gedRi{K5*aY4a7;5P%Hnre6{#Do%9k4>^H#$dgVX;cuKf$y;_=c|L7 zcXeoYhd}MLu^P4Y@M*h(qs{9GP_f`k*zb_cLP=yt^0#^!)Abw2HcrlKV~y8^%>%5PWRTvrBBbiV!tc?u}M_ zNSvaLfW_TAU73mvd_zY<*DlQG)AJ*p*lWfr9Sqs1ole%o_AH_mB{W<#r9_CeF!%NG zOhvZllYGr_*E9jKN8mE_(_)h1;6A8XDrT)f z=$g2O{p_`O`X77v{~G+}0NCS>pXK3SOUIu*n^R{5Fx^=^t0xzNXJIX@9j7**U{+Zc zM4L8DG?$QQ^5Mw~76bIj6`>XSB2P2@0~_Rkjq^`@@`iq&0N3UJbp%;(bUGG~#ikQ= z#L)Mx8957*b|2XXV%F>Ok;H|d{qsOhiAN&s)$QCr0dvz91*Kc{WrUj~`!;3Ru8F(j zcYBw!;f`JpvUm}5Pu!gHoNF${yT3kuykzYOZrX|fcT-b? z=^4-4%`@#D#?@69T=UqsXWhB6<|%D`cbff*+pdjR96F%AtTXUUMzr^S`+2La?k$O0 z_QXyVcPglIlj#SJ$m>sezn$*EKh-Z=_M-c0#1?)FlscK2<+c5bGxsM;MsuQ-OOtN~ zCENEm*zTIwR(XT9;-Ka7hHK142VR$zPt>qz+jbqZd`TSNiA*p820$C%Aw292#K_0kIQ_>bh>C?b7}G(6T_)!V7LGxcD&PBf_9ocFUIY|u z-@7K~Z~YLjNtufvWH1%zpl}Tu3a`7XRzV&SJJ}r7B7CQ+CtbX91S6$FCL9VFQ~+dS zGq0`B?3`fG6uO_4I{#t6`a@T{t|u~(g8GdyX9?QZ{gLA)+KLr%>c7CohxpYw^~5r( zt^DLS^!)e2A7MgMP|L|5lAF&SXHmXb9;y<5?K)6wQk1f%YSV~s^0DQ|H=BJpfA`#q zNl7EM=exbe^0r0Kf0MfZd*Ii;{2&AGue{aboo`=slSv8bWfjv0P+%Ba>ICEU|{ zy%VQTMxFQ-ND?9E5XFDjbrRnOmF~~81`Obd5y7RCWZ=7>736i{<0N>Aourc279jG z?KW%YrD`O$Cl5LPS(Fo>nr?t3Q394w7}1ND!WCUGhyLCal}dR1ZV&0i zdsDzXsnKo_wX&a5efO^u@nZGdb0@vBfLhB-Gw4iX!r7YH>*vLvxqHn!UwFLZ*#&>` zm!BuBQ?%n@^tMKRvU6JQ)>G)YlgQP?)qn&(-{tv(BJCuS3t`M~0$G8ZC`fDsO-MPp z71015__1UgKq*?>n)EIluhGUf6HL(ppSA7N*FdBwjbRU=LrwJEQ7C*mg|VxHPiSM> zYGoV9U%Z*H62E#GwkGLNs7WK1V4=VZg_>+JT;dpi@nVUvh(<5pxpv6|hg;9NJH1TI zFX9n8D8*qT$2V>=h)3=DrzyU6hQYAKb1bt%pFTFhU3D{YBL3J1`-6|(G*IjDrBUBI z^>EA=t?#!e(#cm|c~f;i(p}T)*c=U@fj)3wJMcXIv+us0;-T^d4``3g7iw5_erq}{ zPM&x)>TAec@p4&^(cb!!?K@{yA^EnUFCY4u4mZRut$qCX>fgcWj0SN^c50SM|LkuD z*{vrs7KdH7$S^hAWxqLl^U#HtoFIostz&yMrdqe`wR@b9@ZNd&<#_w4seiMh&yerN zdLPVdb5+K9Sxwr>eEag;`{!1lb@$zO_`A${#NqBa?_>5|N_x|w^OHiAeJ^$2c<=Qc z`R19CQ#o{o!%6H+=~_Ax+neEHbk=_7-Q><@EC1qE73If`CX@+x8O!}2-8Ky>aOyF# zn7rUsgeUn#85YdTnKk*i{ao_B&NX`8`B_&0m^f{R$P zE9LXUvnK%=i+iN$c2e~GtjYVjo>#u*TIgh!`}*bYpZ`gkdH#18ZTH}X6IzVF0a_^o z&&k_7nk~$YkoCCTQ;!C<;@2ntvN?+C0P!!l zPLysQh%~udptTWJC|N<=NL+yUU>;Y@&oP&3VpV?@tp>S|NoaoezQK#!;N7VQNsa(c zD5aBW2++^(b_KV-)Xy|g#a686-aSf;cy_AN8zbRIyXKv;dYiiQH8e1Iv=AI@U3H;i zB=tSAix3EG=3j16nD6J6-LZ6=&5pZy8`x!3O5++_=eHp_ZR_j}n>@W1g^IWDuT z4rGWXpU04q{o#hFy_jU5{^J?uZx5h79!{kJBSQ}eqpbo4@C6WPlLLqwpsew^K?pLF zafMDEBP<4FFuPh>73M_p8~Si!518^_iL-Xo=D96Fs4szcmSRA_|0p{ho2*QHjXm0V(hM%U!cU9s^*Oic{re z`t-TaABEkGf!qe2+DGE|#UKg@4Y^|Xv}bw;G7(^X12GE?lgmp7ad)ImfEt ztYWFl5@Y*4Kln(*hi8VibKM5NZ?}J)FfD@jxoOd!ET2g0J2&2(S`t^XbryCgb$$T3 zQ8(yo!V6FDJF4q@-+YIkIk?srIkt2I?#8xZkn)9&DLiBxBjN>Ga8;gI^J=tc@8RMB&2)ly1829JI^RhjeouvNgP14SFKLWBTbJiy+VBm67VPd_W1LKxrP>uD<8 zmbKN8mPK9t2}26WzL-Cvuh@X zX6KyEA?v@Gkmc!<5&7v1V4x=+y>38D-?)@m6l4l!c1?FPMQLEpdmZoWM>4X#@0j1jRzghx-{tkck$uo_9lj0L+w4s z3e^2}cf@+(R_--yh1vBR4rg|v&_ir=BJ?;^WcNooNUKM)QZ3~hwgDV*0ApJN08vqM zmZH{(xjq!0y|uE)_GjXEGuQKXbR#M}H(Ls(tPH(VvV2m*+bV9JJ3!M9R%cTjM-Dq= zR5+DQ<(&WIWx~#UvkK%@1h?PwdtvhSty59X-a|9N=FJR2mI)EH9No?CtH6M_O6Eek)w^Bi+o8E+tUcR8hb<57TXKh<&>d7sFax&^u2=Mt0h-`V zI=?yZ^_|PV_t{kIhbPRb)FV)j-Zjy2`C3X0SyqD&cGzGG&)Lutit7zPFrovFT+ODL z2f9tyV1s-l7PACd$HZ!a_{xX3AHjzFXrPH_oPdk3X`lw!W8#fO49>2E>?o}119}Zq zJox3^u=qUEtn4k7xjVTWOYj89dvS>^#I}CY-Z zGL~o^TZ}3P3zyBjbpru(q-Zu3YcodDW46M7^hMEt2R5?aUU#kOB`YX;7U`Md+e~Q? z87D==rS2bKrss7vn&>8P=3mSmco#z?V8OS>3f|Ma?_Sqr~WhZ&JT-&>c z@Bir-OfM)bF1uuU@f7fUl#Z$*%}#m${peGd+qc%^=lZVkx$@=QYtLj0`WwPxqTbx0 zHhPL+)B3DeynpRcW$Vfn{&wI}Jqa_zgEpjuYGnEUc)zy()X`=5nhk~p$%V^1>Z0q( zJL`@z5|#x+fsVK|BX8@8N$SvS z(~X3fJ*L1{9x1gc3h7$$`sPIaVl3iu7d~Bje!=|xT8Ha*?7ZQzs(C1d>g6xGJ-3dt z>rP3~hJ4DB^Zr4%f65YeQ8Bur_4|fx%Lmr%-zmxHK82ctqPV5%=BOKWBibm4jte;W z^S1tfwXrL=m9g<1Oz)^Ee9%RxiVf*sHRk;5u(7rEd{v&!9`>$=$05JUmtOK*aqG6O z-R^$JsjJNw=w80G;{9C<%>%ny%{MnYKg{h}Df&o*)EpVbHW)JaJ;b6!k9ytpzZf^s zMOGT@Kq8^BUQ)_X+0#vNzuSSK@A-kIm`5OG6>Pr$e98-nKNyRON;zw$%=*Ae5`FU3DvfBy10I1X;^o@tfa zJO$mhSQDM|8%T8*g8W~4vqxslWV#>6u6&h@w!|wNk%SMAzn%g`^VUcUqStyq z$o=qYMqicfXUTt5ux1h={euajr=QnMr`50rbx0J1|1~4#dNcD{!47J~gCO`J?OOIP zqk;QzI;juLK6HOQiA&5kFa?F{S{|rA6wcUnVE?TR%!gHLIq{w!TE9YboU%1TfNl4he{(#V&y@^(>HKTw?$Z6_jP35zh1|ga^9_SLJnZ0`U zAegDC2w6$;`6%3d924wV{Re)?g@k~QhRB6)%kkg~7y0WoNRA6hNcL=K(-S}oaXmfS zY!|M}E0rfiFiTuFSUgPo=r@p8TA#2>S`xj%`(f_Kz=8bIhJ@YB(!vd)4+S4X1`0|) zChU=xDmQQ+KK;lZC@O7Ch-3;~L$e>&eT*0=DQ!-Ok_w|k%O7@pj2RG@wkAX~MTHP@ zR(*^gs3>hu;7CQv(20ltK4JrSsUjhUDR$jxQKi9aAO?MsMdmbq@qE?oI3f1siCYr+9(S@fpz z!Y!YQ1|T<-5XUSp+|*LY`6M1_EmbBQl$I+uO%xvagbyf6)d}&;3fIjRg0xT716`#f z35TQ=(VM*mxu4_%eWhaw3CzmE&7lIpr^bQ7((egeX{B;ASMc z(g$fmD)$8Qx$D;KqLqz~gGNFv?n&wM=&j{NTN)XIra~R=Ddvm9tt~~IMz29jp&s|N z^o4TkMA4B(bdWBjag&%YUBfIMr8W8u+6xW2XQVHq!@M8mHU(bGouAVX-%O<`8KZp(gD*BCMAAvEWnlU7ACYh1Ty7q4u}9}E^cb1zD3 zqPLe9Z)qwT3=z6;FEQU1Zf_~(G>Hc{3SGIErEitnCyI|W;e%`;gPX;yb=_g{IIXFA zFkI-)y&|oR-r@Z?w@E%2A@ty0Wl9ToggzEDH4a7!J-OLZsd5MR@zW;7V2sdk4rrb5cqC~%$I&?y~n0rGikB;yzv1z6aB?*1GH<|AWBSK5unoWmNgwX6t`c4_a zEm_!1A4(Vcar2n661avw-PD0g#9pEk3Hii9ED0_I28J=vvo%@IQ-LU^yGAEWn_mv%JA42gyC zx-mZ$?rAAiHOCKC2;nV|ep2q4DE-%r4dFs~IGK&EkrqPzmZYJVLU?ARjnR?bLYtQK zp=u%gDw$1%k)cAjmaL&#A$-HqCS@d7xUhvkBp1R5XEwV=WeZofwVEP~i!&9jF&1L| zR;rRDI>vn_RYb>li)~tIN~-7t_c`-(VN9slt<_YiBRa)>A^og`A9Z0XT}cxqabGe! zU7=^p%2r3Ektmt_O4=E{w_LoXm7z2hrEsg5UkdlOh&ioZN=s2H_qFtka_@xrNGqzO zi_*E(%r4h`7Lv49Kc&4Wllw;66}`_}lG_@nbQE3S)-byZ_k~IXtszPm(IxI%X}1!- zlc%k0B}0_Ot!4JO?$4IgwMHmCL|3^|X;1Y2a!E&PjM7V#!<8|63-`B3RITw!AJKJg zowQfEe?s!F6;q-jK3C4{bB(nq({D>s`igFH-%0zTW4+64+R~MNqC9Rrv%fGlw9Kt7 zOBo=#!+kI9SHhRSu#K+_6yw7pRtm?%5ahAY{kB5osd&^6AYJgu!-87?a3Hc1Dg97(Wr-kiwRl2B}+r=DlJ(OLsvfWX2 zK~%%-mX1UpDzDhm&QN8EYPmhk(ZWM56`Xc2RgOr;?Ujxy4^31YX-8Fjk(}Gd9CJ;u zs7!13Q{{>3x&6|yXgKSW+a9RO7d3FdGQSljgjNdLLsSK#kK6(2Hzho`Putn5B2goE zkonz}n_XGg9-%4`HFJlg-=n$Zl^yLdDzT`Qt7QHtgygrXJziBIYUiq?Ka|{w%75*c z3KuE3YUa2r&*F)GN0RELsFOP^9gpUDKe6dZS5=F;xFgJ;g}l%wZXH>wT2T*oRQgj1 zFUZ0UzDh3YrE`XHFC*wmjiF?;n-cNHok!1wV(Q+mQnqTpx?&QW-&Eya2~4H;2&bOJx3K-F|HjYnmX+>Tj1OH=r%?Zt*XO&N)E z%==lcB2eupHsWcq$bw^`&jgAPwTsx8r!6C^U~GA+V5=EoQ=Sfs;&wdyS)C$6?IAYj z>B=aaCg$ucd@$@1r0J{PGbEzmbTzz%X7|Wv3jG}m1iQ;R-K%9e&jQ* zW{Vj-QR9nSo|R0GbGrOR$7i)VUhKoOX6Xw~x4ck&9#`|k z3wSm%ebwoS7ymxPp;j@?lE2lJd+lLg74uLPYT!v*5Cyy>#ZDj5HtcCv?y#34Kv*8hXx!zJPkycsfM&e`%; z9i1`5V(~_vE6YT1w&j(oGk&;2yqV`FGf|zLc=fLn8^*I< z%1k*a-c>eV(ub?X;XHSinII*!%I!6DRQI%d9zR<*z%wsE5bJJl+D9jUcV%wd%|G@Ne;9-a?s; zDsAHRzc0`_Tmq*9Sai2^i)#HY>Ig}4jJHTe=cIdA+jP-JsFD-B#jGiU^w4UzF4GYm z$tm7{vMDNnWtZcKktCV7L}ts$D6ihq#TYS_Ko>@qogky7 zn$zVqVkt@GEtA=)GA62zbfF`3NjlGuW$%`0@g}XyZ^T}b$y+Y7=VW@n$?Xapagu&#iJBwb_y}84#0z1$ zxLvY%o7P=D5-us`t(UoQE_uJr?Us*3NJ@AcSTh8dLf;Cy8%H7~LSCqBh6+|4PrDT( zF%qc%WVyOs&VF0h-8T{|DdTODxpFR-zwPK&kHkwVc$-;ng3B#$Ro&wwJjoN@7MYvs z^2FPJ-Ecfug7erchFg|Jt$q)6^n~O&Z>x;K$?~qX>7k7#NnY~8SThA#p|x&3rlTp6 zD&98POcg9|7WU9b(Fmf%WD zEvLt8G)E%i?Uc<@U74so(u0ojCD5;y<>7YKLYmg&H<~A@=k1btaIShwb9(|u^CbXB5CGD$vipP<$ctln3m_QH=@pN*N|d~VGH=zj3E7ced{iM(^Ws@PZr3g9 z(t4{$yCfsLLoy%Eb?>^|UioOBWQ>=S|{jj937N==W%88Rj@LA+N&55zy5|6PK3HYIMw?5M`oia+|aoHjj zEI}9c(Z^_I)Wj34#cnsULt&b8eK&xAZZ_Ov`iN zuQJQTRMs-Vt(JGHzW6bpGV8=N*)r9wiFg0{uraiZo|w+^bIY@+*Y8gn^DVPY%#itU z^1SP9`qRh!%Ip&}S<3}^q4jS4Sz`fZ4vFVw%T=(bUf9nc3oLU?yugB!{n_;^`}4uF7mbCKxg=go1|zV(ngE2uO(%VGE1x3_o0*uW6T)F zHfF}$byC`iL=-KSRNppf(LzNEMH@wAskHp=@1L1FXU=)gnfcsv&ig+1ywBq$J=zoz zTU^)N`T5&$Vy%z#Sj47^;`Zi&&p(EfYu8ARH*Fdy9&i5l8BfBm^^=~6*z9;_Zp*Y@ zqmlGlf9c7l&9P^^Tjuwgj%3$vke-T&tT?l?#j)3NL|q#wEoh1yz{7;Ky*49YZLqX3 zg6LS1-?FK9=?GdIDm~pqj4i2aq4%yD$*bKcEs7vjl(e_R_IivQsf~~pH<1QP##>T) z{YFmIZkC>jAUmF&`&`=_JW^Ool$JD+W6yd&Ki<1}davBj}8|M}xy!N|qh9ny16TVhM=o_F@{8L6&~l9oqottf4O zKG2&ua4Yx_=&JgF5(FGlQeJeU7sQ{S19mRgbYQqzvu zb9FE1edkA7Yh$FBBX(AtYkv{jS3UB&cDM9O)6Ri&<1bSBZj5x*?vYkU;D=`CzSQ>J z8|kTylh!mv#g==&Jl^+YA0xqI~DeioVv7FSYT~x+dxX9${VY>l*o1n<%{+ zL36CgfBCrY)5vgblC-{w7F$vGva|2o$dB4&>9q)YMMe9|fxaIjziVaE>rM25it(5K z`ta1II=S>l1jF(C+*Vwxc+{XSP5NIGBlf&^>-;aKqegY<(wh;?it{^L9luzPPOi(8 z-fChF;Gx{wFE*p5b=lI})+Ph6wDBf~?F9Az`4WD2u?k0gdN~P|A9qh7Y<;n0962qU ztrz9Ie)g%DsVA1&8LzrORWH{mxGj`HTx@ysF*(`SP%GgS_fX4zL2z zJ-;8kHjKkJX9j#H|#w%?9nUH*3`?$hq;d~ z^D-(cwzn=n;HFb)9@h(d3>p?xJv-!YdZ5UQeYB>D!S6_G+g|NA^~mC` z30+P5`7tz~Rab$;yRF^&q^w+iW7YfZHm&r`RoOVgl`MYY{H4vPoPO8$mSyteoBZyo z;5|QndOuPXRX5`Rajiflxoc&iVWx-YAFtAbdWPG~Ed-)FGp{iBHo&JE(icpBG~Bv* zqp!dDj95-o&Z&UaquG&#z9REj?XK5aR&b;`$4=LM|LLddTMgcGtjB)*Agb+6p8c+V z6qLVUcy;koX^;J^xO3X?+HJ+>_6zDg4jh=1o4O*J?{W}o$ZenNy(AkU$!7<8lkcUJhkT10a_e|X!934UAl zU5!5T=NUTIIDW?p#{%%v<{bqGv>fA`lN#CJwm!?{FP!u>mud%M!YhkxwvD@(t&Be8 z>M)%@<$8nUUwu{M*_ONdwFB(%+F3ZfuFM*}R_*$A4!%Y#{!#DM*Rg1T8~8=i?>BBu zts773JQscC(wD=XSFX(ZLGcYsD;@YaHaut7ulOf|F#q+vUIXlg1#^!@4)@c$0ie|& zX3{gg_EZh|3IiGRXtjw6uQ%R#@7c{vX1-~6=iY(3gz!E6R{C05Lv>KcYV}cu=&0mt z!)S^{<tR>|? z>VI%S6n&}w6>C@3<>aFiXhzy>>svE$C}#c-yQ}5y##-_1))k??w+{uwl0{;HSLL$9 zISWYfX5Hqimw1|uh3MMqv+0mW-L{3d&Y@9ucMliASBkvf6;QR+#y{<*n$57wy1mN% z(9RV#v&CWY`6h&}qA2g^g^sgRK8D@RpY<-S@tfPS3(qd*l`YC`KWB$D(pkL9ygcua z#qp;OE3JwJtlMu6TiUdF3ukPNxYD?nb^pzg>V0QxB*Ah0_ZkbDU(G$9xPNTPmZKAL zRIv?L6qP4`+~`YITx]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 E0U7J?b^rhX literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v8.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v8.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..d983516e34e12d8759d98b0fc8d3ad797ddddcc4 GIT binary patch literal 94625 zcmWh!d3;RQ+dt>rb@rQmmzxNQBw|7kL~@282*#EMDHlPcp@Se)+cQZJ`&e30%C!e6 z6HPT$^}8X6t(~Hpw&=B|D1#tH^}X-E`Ak0N-1D60`7Y0MBENJ2qz}(>%k^cvUwmGp zd;7_yLfb)GvTAmmS`pl(@LFTd&NFMozRSZ09^Q3!ecZ_Xd1nvrKEKgA`P`O)U+=lN zId#s1YiGaS`_ndDrjHm@TlMqKto8BlpR3(>d9Quvpf3k~v;UU^xnCDvKljanUk^zq zmq!dfQvKW41()}~fBwieeTP_-yXdFeaZ6&*Ux`@=+AA&NfBi9FsuOHC%ED1 zw>7uVxY`chn*H73yXPyrd~oB!cVFNCN$$I%&5)zDe_gH`d0_m-qu)II)jj$A)*;^? z`TLK$IS+4K{Qlb~e{OEutg9XnM#G4gb<*cfc&zC7)D4i-^YL-F?7x-G?ek@Pd-I*& zDs7ALzMfEs9AzQpSU{Gh4sE9m{i6F!Ha@+`@#&ja$VcrTJR>{Ej!;c(q`9N=^mJH} z@y>YcWkxCC#pSl8&e!b78c{I96WgOg z^FGnn8x~e34=A%7{<$gPYEy?XTgC(Lzh@niwcxojWM@x_%<@6CAeOYXF< zUR=$a|M!burKKHTHsx=e@$$EVyCL0sUuVAgyYBwMH;<3Kdi>^z!gYGFvGbI*WI|F&Ft@56szG)+77@5^iRpZxnuUE1kg>z$1szWb+n@1b|EAAS4e-5c+j zPXE1a`Srv9{%yT~=)ZSwUp@KnKVXyrm!+UkFX6Lg6x67&J-tq0rA)_W)$7N4OM@@S zZ1=``^FnW#Xxz>Z$U5Qsg||E|d%OO<#uI@@y^F0Yw;QKroecfmyCn6(cJutklWksm zmtx}%VQE%Fbm-HHtn3}W8yg$i_k6m{zH*2E-mFvcW1lY1y|5$j+s0E#3!ko-=x3g_ zvMos%)yG^Qkbv;y6@j@E`AF$x=ilXJ@t|)+msZ$4N#VwoO!i${xmXN!tte~dR$Bch zCoZ28ZuF<9$Y!?tB9V+MpA?G8nP88&II~#fAnBiY)mfh5ZR_*AvQNx|dQ;!%5lfcm z?*hcD>u@Y8sFPhut8?m8w@l(sWSvOAQ?n)^#u=W>pE03&lu>Zf^x6wfIaE1O0%r$*uwqQP6nwDyp5f4f@Oh(% z&xX2&z$5NuVFk9}IqrUtb*`R%tzNj_2rY#UW{$gWge$d=McKYsX}mpN9@1@DTe$4vCw$$Yq@ ztFC)O#YornFdOf~OB0_Qj>ojqGQRqs!R=bz^3k;k1 zV5F@7CVE-N{kA^N#fx^;XY>ljP~6V%Ly9HM!Nl$oRucOyn(#~F4%fh%KC7!YTbG2K z7O7kb`Ugq_(ntJkF;>a}+uSU*S|~N)sE9jqzo6OPvXqs?xa9h;*eK_&-!W=;c1hwi zgD>~R;a7(rw#y3XHhAAQ_C@rafEl)TZbFZ`Ibo@AGCbv``PWI?efW~oU8;SAq9Q5m zl$GtBrv7neZ9s(Ru=%x$q<;|%%Eu>l?;Om+yi(BE3VR@hH)l~14b3FA&n(!n{6I#) z)TlAvdeH!()chKk#TSZ}NIS({tfDgX!kXT0+0w1`ObV)BGCFN%fKpW+`)t!~|8>7u zVw%pRdAy6e=A9H6&|u<$G5D?G^J__&e~#+xEA^pfq|&}_LEkx#oPR$(YRnp~pxXPI zLmfbWLM+SABSEA20qD{8Rl(v(pLb%pUbGw9@wZ^89pvu|Dezy{)y!bjG4y9Yj2R?%RS>Valq-jw|&r*i9W?-?7i(<85{SR`m->i{j%`PP9qD^_@N^ zr5zhFy{nlC>*hoA;eGrZzvSdiI@zB;C2`d(eI6WYlBZ;h}9!IY0??*_VZh5NypF7ROIqlN5e4!c~EN zUT#Oe!IRp&saj&;4aazk3!)*SR?xR#CWF=lTujORuf~xYQgLp|XEeEY7 zY=<8mWxw>9Xw3QFQTFUnr(M_{Hr{)JZoIkt6Lq5SMk?)ELQF1dhK0OXnOTmeS^v9X?mqgelQ*iK{$bjUpcx zZG9dX^FjNWH!U9-0XMvINm6{2VS3{Z{{$_#)npm_=%nzI%b9RT)%(7sBJEiXPn^SS zhacSJJ|Z^0)ed=nqOi@=kBYwOoV;>U3IWvR#J2`)=tg)%t|dBC_)(f`juc;1%38(0B9Up90Q zb&Qp|O1LisRxdGm0@p-78ZH~}IhZweI>2ij?&gia7++Uv&dhlyfz@t)liT7IxC07w zS&emyzh)&HvMOYQ6}D`Udu^#b=o;%~l)XSTz;r*h*N!-Ie^a2EHtpD-UxxW|JTc*3?x z6Snp9QL84<_0XfjU)=z0*ZbJ@$KB@4(cq-a{w%OM65LDHtq?8SiLsq~#YcT}{!t)> zE$skb?xK0OzS(YUON>iJ{Q&`t6Abe)HPyimwxa)takksoQ-#+{tklor7~6<@zvO;n zU+s++7P(ea_1vS@^>8@nt+2wVH9^kx^u$q2GP_L%CS?u0$($pON<8Ymo8IJMA3H4Y zXMU`kTI*nQtjKp?_xu<1E|;OFXt`?D{h{a|;MuQb{Q;G0a-lTAvVzbLC2-!&WO#X< z+Z>?MN9#UkGIREe`tEL+>q3Ve`Wy^A68*CTLa=3umyMToONqYKL0y-PnI1zQH+RL6 zb?a`Wu4LKa78v0%_V(&^R(gXQRJtt*vF15;bKPAQO8U+!^+x5ldf`~bI7jBc%UX80 zhb@1!;V+3=W#?}Y^Ly@3TU;>TZtQQRMK^cSYMCmS%4P7k*Kmh0n-tE6tiCelOP|b~ zLck4lnF~bANe}InO?h_qxJMl4=A)MC+hI$oi|vig-2v<@P~GJPua<4IWac2d> zmMw#u_+SV7xtq!n7^ju_TGAcD)NTpg1kev`zR|cdY|!TX7$n*C?_IoRI_Om(A=RCcb+To!d1 z5*qJLjE490D|37_m7Kjvfa4}wV&px(HH4bt!pIZ&@B<8qFCrXx= z3YVx_J`*iPn0hXAnXc+{3p4URgF8eNB!Jm=-5C%4rhHvaB-VIg>rXMiNtLA)3*NIS%UFPJ3 zub=kKafl$mqhBSN?gH~GN&iUHw-SgY!V*P_x~zPSM##wz~=r5#1UuU+dwB7i>E4-NU{)s}V7%?%_PP-b z;0K~nbyFE`v<~S05xH^?HOyh!>|yF9Sm-u|$>96*-~ZJ&XRX~tSq=R~k6GQ`vcr(O;-w zxQpK6(Z6(CQbfZQ2Rq2i2P@QOhvA4-q4U!7KLd8jGKpB6qGh4g{5uBYtn4eqW6fUK{_!wF+G0@Z?dBbhkmFPO|_z)cHI>>r3Xx@z-$oU7?-IO8-~c# z1ceTCabraOihcdGNkV5~_5F5qoX40HFoBBtWW#7-nSH~cfx;5khDY@q0*9Y{nJS#M zQYWzCzs{(uV{ix_RpMc9E8s9NLmx|)hz|Y2MLjz$_04%G8XilG$pJ??=tDB|#AO%> zEVI43AHtFL(TycCmNh2L^FOj>R+;nzE?|T~=Khd;RV4e{6UpM^IW#sMXvRn5Cps6l&NYQ<(n2}0r z+<6Sq#d$j|{pN=6!^_zcIzf<8;qS`ev5YLhG?8#!1#m~=cZ+O>)jS#VB`TWjVn?~m z&m{eWztziqb5gwe392RC!4Cyouu}K6T~k?ni=A4l+W!@d{S_#=SgXp6CT8p^ZR~h^ z^ux>ZJm}_cx)8$s?qUnP`q#u@cTus5xzxdQa=PSBCT4AXT6j zxXg@k$+#}uc`XQBK4ccv;;6es4xv%MtXJEAOC%}Z_dwxdA)2n?FAd%9W%UU*~3(U z+ZzCUYBwZ#DMe=T>^dleDm#5!shpeSz4`ERoCEGx4WTmppJ0l%n-JzzyQRH{)|6$A z$Jkjg{7Hb#r7!d7?g>n}Yfjr?&zMJ-^X$WeBy>vPC%C95ifNc+xa)y=UY)^fSl}^c zc#O3kYC@KVdU`Km;F^|G>rZ$cmj4N0iVMDRQ2T+-p;85pIK^wIbn`t0?qd};IQVK6 z+C9b#_HhFay}a}FHG|41F6MIwSfH{qOW=ogbCi|)Mb)2iF#Too3708X)EyL1kYXHW zH%NM1{-Cd-_5xMx{er!dT6Jp+axoOM0AeOeX-$F&+CJh zwEW%1&mFq&tlTL=`&+5=9{o|T<&4#gAL#8?ez{_)CSa$P$t3U(K#g>mJ(2$&@0&9l zgD)j8_D9n~uPN1Qo-5M1WuXpJp)<6A2@!pG(#`(d*jHOzHT#!Z-P}vuu9dnWN0yfcX}eaeD~1HRpZ-%jhj3TJ z<61$C?2`q$NT%0{n9H1&{k+GfLzWA0=v-0RIpw( zxKaxd#7aso^9=}XArpYA} z3L zuYabdE6j0XXa@aO`!$xfRZRnTJhV?6kA1JewsxHd=y`60$Y#MTkG@Lt>3~HH$)*Ol znB_1|LlRkk1&y|@qiw@emRFZmTg%eDu#{x*%oy3c0gAGID9~^|Ry0^q2agVbG!b=B z1O1^%=FgEJUaKzwTl&>j^=v$sAhF>xolk;1y8gIRB^M)^?m*rF595qVcCZwD42^W@ zaurm97{#9leO*lM1f0L}QdzaTbSyCyfiTP!s)5B+AVIA*V;pQtd@HE}utK(l@@!8M z@)iz~I5P+$boZ$-C;Gp<*vYx{ zS8YKm`%h99$tI;fu8u~ejnS#W&0`$W3|ok>%Q?}?9|*SbV9(_1PFZD8l}gOeeKXL1}vxUIU?<*|ic~TlT(SQb?McTczkd z&L}s(&Q>o{=Rw~+=YF!~$RM&3be8>a*4O`?AV73e}TFaVe!`R_teF0K}K zX=XNHlnp-=bQ|s-eiWX+J0g|XWXo&Nn+Fe-a3e`~>2HA8O6EKknt-HgJ<~}fp0a`48^4ScFpuqnQJB8?8eT{_zHHi?AJ^d3FdNOlBl(! zk5pPH8t%ZDM&xsO>Ll~w!(3)PRR9lzh&!eEns~yN3htE}QCT+GV`wF@RrDO}+XUX- z(|v-?am)cJVakxNruS$Z)HZ8VU%5>j%$0RBL7D{fG36-xP+-qpHDoa--umzd&7 zWC=A@4aq7U*&*VeJ=?X;t5+u5L z7ANn5mIG7uKV7%wJi^f~v|IESOZ(ZGH)0AJ9*AS_o1^OEKxB>OOaF z7`MaGGT-&t0u}6WP94X*B!VN4sTh2>cMibKw&~C7ADOyzDrIlW#SQ1I3qVI_#h4w|_H52fc_$1QR&i2P0&t4i6 z+N*JS$5!}Sj=bi~u=0zXr>6@Jsg1*F^cV=xlqxNmE5OdS^d9JksaBcyE}uSV$OLXo z4U5D;w{ry6xv;+-wQ6?<&X<8vp_^bh7Al;vE_jT@sc?^^+frr(5ZF3rZGUma5hr$) z48b_1iAe<^JQ^ezjl>G*HK6TZWeWtljngLpzEDh#QoG&qIT>=YD&#Xq;W zxoF@QTxRl8ua%@q)`ESufFb*J4GNzNT2zf6eC#&OhPq&8GuV4?RJ|={A?#4XJOx3! zNFqU1(7ytFiCLk{E`la(3}!_&ly}ZlHDQ;E*?(1CRT*ukY9Hh<;rabI$@zgtKcc?7 zsu>heMKj&7$rcAtZGz+ieQ39CYqi;i*jQs{dtw=T)K@-wpu^c1L_a-<9xRj0QB zD;kEus`Y`j^^mZiV8sV&#ROhwd;9fcG z3K^jCd61LXXw@PTKet9Ol0BfQ4`nBbDk`xp=z3^D-{93K3z+QA?f{hx@(nMGvFe+Y z?pa_mM){=+y@s(nlU<*-RU*7psEaGFclLA7FRQ)+rn)S$tw$4eLiHui>4f>j77dtA zI3%Va%WllUh-VL|Y@(*sDMx)Q;3ldKJDQFr|65q!wvKM}Wgnp!w<+CbiQ^ti6px+1=27isums0QaI#j`on~TG>$|nS zzgvVxs)w8L;4~MlBbH|Lg>K-l)xBR#ZOitf>NRQv^Z= z3hHX_aTX+gZhP@&{cuU&m)E`JhAoQQ*}*o%O91iM-d4VbfnZwVR&<1ljp^eT`) z#6EA)bO(41J9}Y`|JBpK{{r)hY(6gLiNgDrwr~FM3nhZrB(Z-u5j7jx7F|c_B!6#N zJC}L9t&PI|DAo=7WBTTvje~kNgU(OFYD=Ruqq07{fNrnw$I5(N#{KndBONaWNK}lK zO~qm*yIu-XoHmKSlK8`nu$MpirV^`&W|Q_6>`zMgHRo&(g-0YS+&n2P7bJ-6L0g>6 zoF_;kvn6IWIX1%)6f`gUf6N%Yn?waO%#vVhX+MoZ*>sgmGVr~Fp0(01onjToDsAe( zTnDp*9Q8TaWB#PqDP3GJ(P{Fa=fs$YG-v-P?$O8=6Tfh(J7BLk6HBOUf^y3=1OKqI z8$d~z4wkFW&wq39&wsxs-M#u7^@B?chi?85r7-}1cITDd?1^nXkGZ-(8+7CB-~|bX z?*4GBvitMG@iiKcSE6&N86s0%Hr8&wXNzw}ixfV_Io|>D6%(ev!1Thh-i|A8ZPr%q zLz%G>jaW4GJ<0RWoas&6TYGZVONZb}XN;P#9QtG=)4{_eDz8ouK8tnAh2YkH)gX-%8*c5`_)T7{?Dekq*<)iE4;lu;QpB?he5ju|<4kyUL?y?X!cwh?&W^c=8 zJC!Y)f5gFVrW$j`4*4#F3&u8UfBZF5BWCQRIX1o{y}jFn&YzcV?&Z#}DS-8dTc82J;es+%BjM= z70$pP1EU56O)FC-yfqLXD}7oKgPD^OAZ1Rg?~)U_)3yb2JPfL$W~(|vN))b;Bv-AP zEz+$N^yoUn1Uqb%BC@GS7f1!YF>^$uM@`#f+|-F0GaPN6rLoR|PaZKoQccH!UN@gcXuj(xxbMHyB@u3^Mx`K{_hUX+;%5>&$|$?{e)^L zouZ(ZFhr%!sG75|;fLB)Xv{274*VOOiNFkCM}>CCzI18T9Co=4HL)Y*5O--eMR%jV zLnCt#GY*ZiQ7?<@X8utb~x8aD`}nj$&u;3VN^{R#gT?O2m=DsI3?{ip&*_M{J42UjJ3!acG|X ze}8{FOiUOfMqY4EmpNY$XXkD!!TCJA}nre3)Dq zaIN$?eK;CjAQ>X;1|lm!xYb|T>ck&z3peeyQh z^_dUQ->attda>l+Q0iX`V(O!tK)FV2QJTY0tR%KFLzTdMAWUVVaTGx<->+Hv>>HdD zS8u9-b_HAkJzTn5Ky#`5C8mL-TTiYg*2;|cNr1O(=~CWU-_FI|7SHORPuv>le>gmq zYp+BA(g&b!q^k$sI6BCN=F64`^$D%)dW9=Uw0P)Uu$vv;SD0(fPFL;RmZ6~o($8jW zYYR-^>TuV*0ZPc5=)acRJsXQ{%7E96@eq7UyXbX`k6yIVn zUf|Ew8%r2o9k>r!B*W|aP@eu-3H8*^wbF&Q^h&x|W(WvZEVVd3xEbACZ=nCZu->yp`T8>volW;LyFcwUg9~Vok!lO*m(!Eu?RAV?jXJVv#rORKMna)%mvOVj%k$sg9tbs zFxeFH!W>&DfZt10YUwOp;j2R#H-s?+NI z=D8Au;peJeLJ5+gjk8?^asa4Mu^!Zf1s7#$bK($v_!gU1AKnPY%FM2^u|)T~(;qVr z6!3`5QQGxZUcN*Jl)&oYg&`lH`GHRbB!U zRem9i!YEZW0xHSQ{1}$@g0)L#Pmc~6cmF_76PYp@Z2@fsGgd$qJ3-WHMkkK}kr)>< zNO7Gn3-NG8&YmjQ3$QLNPR2=#zRb|wJ0m0E`(#Wv+Dvxt2PM*j=3p?}<}08PQjiL#ISdQ2 z=;emVTU4U;$#)$4=zlNf)PFdrR0p_1XViLOevI=JgVkOWj50}nSdiUO@NM6B3j6J z0d86O)&E{aP5iC4cYj=cpq>t<^w>{&Q(xD#yB}|Q{W7M;gkj({mkW`VrjhProdFg5;k&p)%ZE5-7&sV>p zF>C3Y_j9H>eH1?3(_QF2s2vF_wF~-m#m|AX-psMGLO0EVvOy&8K`=w>WUc5MDtQ zTXnh4a2GvW(iN30baQDWu7p~KBSw|R0fXDdxnUnM!cjKH{qJ}G^%D~kKs=^sbd00` zxNFoZWqg3K9K;c$%=m*g#H3kT)HpynAWs=cs06(zm4tZy`{&aDIA$Wd0pwtd!Y9Hb zIL2)$p@M(`a8|fNNmbc2YZVS6=1h12gu0CatWm-}yXS&Pkx%t;1=Nr(SXYh;L9&;L zp)L}W$`peZ;P0hU;Mbsw*HR2G1HIJ{ht7-+mvvV%d*fJgg`sz?vQ67OFlFbGJ{&0N zT*=skb7{r9vq#^r97s=*`wb9kJ0HqU>~j7N`X(DY&fn?$eRikk=jkrp1zTXJ;pm%l z7Ws=+pbM}$E&1p-5UBzYe2k4MG{W~m2W2t<$8qi~-XF`F-(GT2WzmXdrin*vu-x(^xp_2r`JlN)9! zpbJqsAIUjHZw>aQA8KNf$FQY6-?H}LvHrL zId{Mr5bx5}eQ*W$aPTzx4g_MYlGTF@!O}?WBjaGfFAr8|(Pv9)l3Dehq7Hci==PK85(FV>vR ztxMV{hD5Xg#{v|G{swWbCmUcJ9IiYGr>+4`g;^hZwy(_n;hz+Za;tneHEi`CPGCp# z26fUVvEgyTE4+&eP)u%GLYr}t2UStIN*LDMwtz1O#kE_=92*+s%|3>b6>T~q7d=*d z1ha^ifo^t#h~kM(G0GGT+5m{DaFT>GJ_g^Aw|?z@T$TZ=SiK7s1Ct91RE-kpk3ruu_TIo&Ufma>VlN`qe&EEqF%SE5=3O4B4|?gY}G{ zaD^jU>FQ$FHNcKobg>!>AaT+N0Di|K*1h<7`TKB;50$A6lcfNz4&{Pg4s#|N2Vzed zR{}pAY1IXz4Wx}~aYIN_t!y0Z2s$}*mCy&TjB7V2Je2enb=pofubnBT@|1YloDDKS zPZw+i4?v_BNZMtHv}&L7fb?{kV_>$DsHkaEuk6Sn^}XQ&C5GtJKo2Fty(I?h1B?r* z)ELsus#j1CvVASxq{X%)G1pQ%F|yO67OtOky6MzEDI0)~#HOHu0pX%4m&zxchqr>r zNofvRq!NjsP?~*-6ENqXekN&lbPP3v4XFtaR$jVkE(TU=n-XC+)lnOjV7Ivi{G|9> z`C4iv4)z+fRZ4p}&NPCrNt(*kqRqhK4WGFxZ?bmT{i#Dr8;5qtBS?1-t!54+6Q+S? zI0Ixj%(!O+h*fohHmx9EMRgwp>;G)(Zf5fP2^f}x(;$JE3ZMh{rD~<|ecWAU1!N{b zf&Y(WJylBu6h?&uqX*3=?L>Xkiq6qrKV$7fv;W_lz5qsmC@+@<-jOiXZ~-MMT|KOe zI`XHM+}F?~9ETUjfz3*s(rZw~=o=kHiiTUSnYu-%>UCXauI>uQ+(Z~&BAj3>2A7n0O@o0QxVJVK2abR)0@n<-DbTCQ zl&-k*6t<4qOf;mt6Zyx^MRkYAP(ezpTU$08B#2+M!o+L62p>%4gWV0B03*r#Sm1)c z5??PohKk?gLL&AQ*8rnRJ3ut%?OcI2dlG0j@l-F+9>Z2N5pxA~TLffXQySlr+h=nA-I_>B^$)~CVQ zK$Hxl^4?4iI{W)SDZVG$y7Z2WX-a#Qk6HW)7BR1&>(?UP=||B~e1Eb5Q{S)mb(kK( zU+j^84d^yM-Q@28sZpIb6`_D8lT=(k zecg?i!S2Hm)CdxATbHKY!7X#RI0O}1;I>dM;)l^SxDIr2@@dp$(8XiSgFZjsUYxvS z!w@(I!b-FnN5~5V*nll|ZY3xt-9+{nRi^FP=mPa1Nvt-aLpV`}*Qh^$j|g|o6WiH0 z`MN$hggN5799_dkiBplZA&@A?o)j z)J@RE4VysiFP&AkC~_xBRoE?Hl4ciC*{GRBxb#L1RyW!_M?q+)y z%%F;KoYsOvQ*f$mPJvUD3_;hN5lM`8wi#Z|7QI?duf%DR_9p4~Nxda$@#m-RX5pM{ zcpJADP1*1hC05a}_&P|oQ(LGi(pAtqKp_qTyg#+>mlPRgQH1>Vo`yfG{}?uA{LvZd zt0>w0|C4u=i*KR!ZVMn<*YO7>6kCcwIHuh&QwvTPpmU?nxUDyK68v4;8Pl?UZPb`q zd?hs=cT@~l;6xlN=u)ZON*vaab)$(zG0@Z*Et%0M&{>HmAQ%o(%nIcNkzjd9(C^`X zifHE)E&tm{mL}~I0YdLWvj}h1(QuuXjV3D`ivgf7fEi?JnO2vMDoeA*x2Y7Je>Ug{ zT!T4jNhO%Buz)Lqf07t`^2E1STgPQw#g7=^#V8Mt7!*MskXE&9Mlkv&x=*6us&Q4uO=Pyq3P$}RG(2lSxDes2P zM7vqflFs^b>|!OP~sx61JQp*|aD-p~DQ;7qF3&rhWnYlJ6AWb!mh`hD;aqUOhd#8+IFe-5HG`{)uaznSw=m~5CQ?gDH@6X^!HNa&jak0{ zgUF?UH6%nvE#L(ic6R3BtshS783&rEP9Vu@s-^t21JU%u4G^sucY)s&HJYcX+ayWW zRSsFNcD8cONE=HN_yTlpuh8@+8P3sYD9da0)9liwRpt?++vtGhN@uT0hQHw?f?VL0 z;%B#1!^^k>Ve_a0C2%0A**0>=o9UJ!G!;{B)&&jN9~dP~QY5<#iQoy*xlLM|Wu&i5 zn}2!>G%gINlM3&qkHOvd9_Y%x*qDA%07f45QKDSB7WAu@!;}Ed0?uPJ!Uswxw=w0T zv7iS)SGrdLgEjvwl{A{tqjdrIwMwh)ED86*{9DQnv`P0x8+pLGL8Zp>5=1x(eWE~z zr9#Va&EdZQcMp!LDIU6gmprTs@1YnFENT&JRiZrF6S_RbEb>+89k?_RT!7aIqgAja zvPLURMsx~?kiqA+zl-cQN%IU|gGj3}7>x&7?P-SUwg?Zs0r`S0eHjVdCqW`t4f+Af zqsykYfUfRW1GjG|*!7bjzv@>adNwj6fm|f;kD2${l)G-ZVz2DJkRFOjM z$f4nj@qdh2l{7EiWE6p$x(CAD+#_@ll$|xCflrmed(FqFuO!O$OmdNMBC~iqNb}V#|L{XmypMXS(kuk62?5;8>R3!d%wk{w1sT|v64u&J5v{bvc_v6Sh6TwROqXtkK z^Z0^jes~LYkLW<*BxJyU()6&<{j=Q&ov*twtH*dh7<>7koKsZ}jeAmo-G6i{m`H3c!(G zR(&}NRQ!o4hU%__*?9%7Cvgr_Bj}}scq~R#6cT_bm3pY3F=+SDiu8*efq54U22;oA zMDVQ!HZ)Ith1<1b0qCl*ReCQq4TP((s8<&y&T8_a$h%(_?i;_qvT)D-eKYrODct*D z-zWR!!m9ZFtM~6J+*i1N>;9_3{rmSH++SUI;KBam``v}r@dtj~Ut9Q9;ei|b>k1F< zKk#_}vBLkO=-LBfO5gDNoin#;Ze4Y6D5OaZl|t&cw}e4fOEODrnrSYsA$;!HO|olk zYs36@E!L!_i-gK4p(Qm4A(?e;E14y6xbHv@>a^lT9sY<)=<-O|5BXJ5FylS<@JBs>E zpk|4nuz;hkNi+Kv2-LNw%pnCr^`#DTOo3Eg7gRj6z(svItvI>BU47+Lv9`cleYK-_ zbAe1j2Sp!(XWlEQ*u_4SUD>H>wjA*i&mAY6STt+cHmO5J#>w7Vc$ z-PBRqU%;p>L1p68lhilU%6w19sc)Ss3ppLHzTHt4b6Tlx4mvaQbb|U$+L`3jiR!zj z&S+03sqb~1*?d~1ZV4*SIh~@upH_b4bgKHnsq(_p8ui1D^6Jxib!*Vs#?!0SkJ8Sz zoz76VojTinI#d0)<81$FthNSKhzob9|46IwEzD9sIaLu-n5}-=Q4v#^t9}-AZf4;D zGLdjDxiC-t;?y~9VZQoh$GOdgMs<78`JBRI>Oa%YA1OSk?l^V6u&_Yg*>S$Q(5&tX zy3klyrhb)np{=k&-F@mpcVVUab;pJNLRM`HsuUO1ssBo=^ew7azd2PIQq-V++ff-) zWKs77Rn07FR=-QDN-ki$y~yNmkNpE@q~7l8)ktk}%aAT{f27H9~zA7U12 z=uS4qEY)!2H8agF8m_t~+3c?2nQF9VZw3zH+2ERpV*8 zQdq3fcy(T>F4k+jKn67F)XO_97PgdVdE^|+xV!Ej<^G=`Id2@4_ zEIm$sE2k_V{WJBgBV~c<(@eJt%YxIVciyTlQ>4esZ#R~Or_WH|ZYzsQpJ}??T^5}_ ztMhh$8I!J*H;d0qN}sK6_B|7qKF8D?awa}~ZfA4M8D)Bc{LaiX3F-6HcaqN}rhjg_ zqdk+9KELzM<}<4FMETvEGb!m`sP7&*lbXK3bhq$~CVgS&-Rd*?^d$Mc#xtwa7pd>H zoykZ~Hr?w!lbOD_^IrcMoUW3$h|71Rf2nTqEze3{VrmH~&rV<3*%DKpo1P-SKePNm z`ZD$XRh`ALNuDOJAXWaHRZXdYb7$VR=Eiy7NJGxj9`U zf7n=FmY%MD*j8SVt~EXEF0V}2bw2DbXVdlaR`J=obc4Fp_iTOoN>gjd*@pC0ovkrv zE$OS}k7k~2PG6&blzg@&eXZ${_H1kVy3R+N&sx(nc?$od($_Y9(SMZOW)G@xc@9@vD_-I;Apq1t-cik?KYD& zq(Z3O-f4}gkZO0x|Cm|fqTQ+fBe}v|yUX;4w!&MxyYr9D6*6s>{7FtlfOe1i$&rdc z?boI!g%!ctZ#th;S17dE@~4dz;o80Gr)?Ec+8oo(NT^rG;bM*CCei|TWFZNB_vzpgt34+FbLRO2+F#XwCZEsK9yk4|J)f^V z(fQ}*^G5ASc}LFqW7^-;9Y@Ze)SfbR6rL~8nmRkG&zrRc^3KNdW!lr~&bIRv+Co!j z_xVa~QDMnKKVk)J&I{9BSD_wM# z)qf>dy6di({?b-@>#lbGwYgHJtCzpYsSMElu6}c*GEjHT^ro;fSa-eiO?9P0*C2n} zSQ)Onp?=#|8KrA9z3r}y)-`p$?XP5X7I}}jYLf1zy2rOFPIt@H6H*ngyWQCnQ>D~3 z%iqncO3>X=ze}!4)ZI0`(^e(v?sdM~T&2>r$lvEwrReUf-yf+;)jcr1FRaq&9(KO3 zuF~sTsy_rdt&Mhsm|6t z?d*-I&ec7W|2?z%fbO~a@8s${-3!y-+Uk7W%g(>T0vDOa5R=My+5rTe$Dzxtw0*C+qfc(F(KQT?gyVy~{>^r`z|pYBuVr~ZqehhUJf z96i#2A1lyP1rW*#^#q@bWu=(!rSm?fj@1xUww>-k-13oFwLf~kFMfZk3+ zh?GFReF164gY^zw)J0aIC+%qy8?F~==*Mi7UR*%%&S<@)i~htidTB66QZq^KsNwk4 z#Oa+1IH5K1dgm@qY>iUy63m@dlc0Cia2MAk>fH*sx|$^YfG+Nq8kOEXn76McMem{E z9j!^#dlvADYBYMUF5bl&z1};R-&C_&@1x;AuF25*7Vux!Wa|C8_@8R9UKT8n)b7v^ z)Cl})v-E=s1fjLrdjBp#Y;CSSAlPnJ?E(E@josqfJpGUYJ6&zQerT87mRh4eFxY-y z?J@l@js4Nullq_n`=Z(cy}Zl*Vy#&p9PH3kTc#hbad=!?p${o=cwJkm5AAaJRLklW z!9vNUI{gTZ(C<>ceq@0#^iqR9tVm-_Uv zU6N0iz`z7cC3PIbc#YJrPGFc&APub(8YXs0W9y`bNx_b@>Rb$yHI9qx+znF-9CdZx zhN)eSTk2$nxL~J!bpeLYG)_nB0u9p&oQmp#4b!`vF4idw@xjhbb>W5?8t2D#QHGfX z&admD4YRtOKh-e?Ww49n@+8A-jf>yqIK!L*m(a`chPhoXv6q#GgkaZMmlF*0G_H#; zCmKF4aMfK-GR*IC-EvuFNDOw{cR9uIg~sjZMqZV zSIh=YuvgQSGDEt?>+zKegSNoy^_5D4uFLDw71p2+_Lf|&GZ-}9epl-aD+|0suQnJ~ zb$Q2LwHQ_h`^>u9Y*?f5S$ws{u(rTQceT~9uFGf3RjVN**mvL6XNL6}-=kOC4I2u4 zi>`JVHg@@5ylOLK2KzN#?J;c9_&vVbYuH@i_xfs|VM~|ar>n4%w3w25&dRMCnP0tN z<+cJ@XuWXd_AXg$y>#V{;DNL1T~_YY3|w6AzH(Q=KwZ7}%H3T9x75p4W(5!0S0Au) zk7m%(`oNW67Yr(@PaYmKW62=eE-LE^h(WOu%Lm2 zv7&7Ch{=hbSpPMJWM(=6EoWxdIJxs2wtCxS7P8|@6vOiz29MvkTbhk}$DdTpFmmRM z9B&NFLw9O>zIRI9ZeQcA{5u;h#_m9L1(HhxMme=Fx34*m2Uen$Y``2Z#qS6alsJXX z80m@vX=rtgmfD+tSD=X#hlKwZT422QHOvfT2(E9zuH%QT(rCUvo+Jfo20`7gSWF)V zE@2P{IGD2fhJy^2Fu+;-u4a==@{He?wL}S0`0_Go)fI5W-%ciz3T|(W37jVd4hY!H z(E=Cz_SXwaLY?$nc1RU)m`QVpJTG>4_XIGaFQGVp(_wVg!44=XWK7`br#lgl5GlE4 zJ8$+|W$3s20@<8g2aI0KCrm8^F5smi{MEYw93>@#?(vDpp>FXUijYVO(*7fc;!p|* zF>cvvw}c|ZDTB~f(BJYVt@}A4B&xEv{bCM`=Z9Se#W3mh6$cOK1ybOKg)qUpRYZiO zpg6QE6l(@wMBNkYu>2)m_vSYi+7FR)vq%aw6t>#sH%QqC=|}_kE>O;)8l3Vd%KTXt zaoZbb3v_`!z*U4g!+1Mw){{IH2L>~Qys0axziSUvF~wOf8V2PQ!gA^L$d>*3AqiRI z^2|~}0Ccd$xg?@-AledE3S96|?7V@1aXm=l+eqfDicYj^1_GONJ*;rBfs$uNg#tW-n$B*SVU0k&u zL)X}&O^-_diH`ZH>F!&a9lMd+PadQs;P(fs1lU1nEA<6Qk_f>G}VflO026$Odx zs@-H{m~j6VP?5DY0MI00SR?~)a0Qu}1BlG?DhRkCU^b6OM2Q0&qp*)!jK5@1X5`q? zVX{>+h+#%p?X%GvNy&sO3bdVdVZlac;R7<%T3;3xhKGKy{A$8;=Ls};Fv)WTx$E43 zwzo?_HS8efQdYb-OgObZ0QLeId2Ar0i?cFx2qY5pwM9d}#0YY_EKw_8c~fzRT=1uS z-)QtF;+{Bt0|~Js*+;+!9~CGe0z24v3=9L#jJDYzJUNIFlWj%#zf1M>M)0yp`d}*- zAN=BH^b;FvydV?&!1ze*a_J)crHn%cY$jI_fSrDaM_5MsLjrJQsDXM9PCzM1$>3-a za}Wn_=R;h>oNbW`vOB0S@^GTTon5yb1wsS3%|KQ(#{Ogghk*_h`$p0V2#*q=#KRX# zYRH5%5R8#Y{vH@?k7q0eG8S}r#={dfNT4_XJ|Nv2bF}I8+c7ty&)$9&_HSj(iKaK< z(c@;7-tJx%vxu}}J*#8)&U$?t&cuG4`S$jwGUoKShqvFC4Ku`i5GLR+%^Qb7M)(@( z_}8~)-a@%4gLtvrAS1ZgD;e@;8FHN=r`-eSL#&t)XRSK3ZO>msUmz0=mx*>zFaH<1 zH*hGu?4`3*MEuEstEbun2jMXvqn(@SHOwNVlrZtm?b5m9=E?8OUo+?QJav|sU{^1ijB0+8EV zN#GJS}t;EI%vs^f^ARQ{NeO9_a1kVQS z;R^Ob*EJbXAc%8yVWKhAef_L2?97OKv2F-rX0GGW?6VcMnD^A7?iRemXPu;}`4hW=5pGn*aJvW!Q>MW5b*EYr=hI zPqZY#WD%X%ESNauG)%hX^KPoooVT}RAd=eGQNQ~oZ4%pPU`IQ6cqvy!Z^XkFQE}IXVJ{LmX*U26b^%MkTl)%X7cQm=*b_N&lPD>+ z#lC#=qLhE{Olz zdQ1IVdiIxmk^^=fPExltL`>NPsm{2zyICZgNs(^?kB(hb@+-^ z_w&~tf3#xmgQMlY`lKy=U@Sk8p7z6oljSELjop6#?J9b9?Bk|}(*9r$2l~U{ux}Rv zK(95S?|a^S{{jZ&6?zPZ#M;*%r_ zr*wcU_Q%$`f>dRnilnTyVEK6}l8I6Z!|6U|sI@8;V%F>np0u47Vy{iNx?qUi`!%1L zZZCG+vYeAiG+%dK%Kd@p)Tj~L$>EV!N%MkJmSrEIz`|!&ot@}+BD!SSU(nmcVWVZt zRPY79g>naPmST8;P+bnj&`7#If{+PHXb3M6p}>cgSCI{(9txmr5n`$8QIw1?y(S<8 z7dh@G9w>ty_eQW|RgglPnJ61HyV)_OIHLME1ze++ful_2VgF0i1cp40=B6TM%rbC6 z0js#!L8?DnW)BbzK8Nln=_QS&tW+fwWb#S{Dt-avVtyW2A1r4SGVU{E94x{qe^M8g zMa$Os-;6BjOB%cMkraCk7suZYhb6#C0Q(cP-oFS&kMx&u1fXZ_NO=GxPp4>T%N zP=Ag43R0-IBM0e+O(b=fqe{{a9k@pLRETymfw{;?&%?4@s$CV#4$0-#(d`hRv_B>b z#dltX+aWIgGFK7+Q`l@GX1p(jSDK8s^-3&N>Q3bKq6{$_&plpERVql!w!cI@6M0Yi!64)RaXCTcLGbw*QaO#d--GR*apPyUM&{NaEy`UakWeqPy>&Wk2oeI$r?+#AO@E9{!7-4QYR&z_=*m@kX{NWBXKBd6}+ z?EWo%0#d)^M?Oz zat}wRI@AM~R1kET^_zFY$N4)bY{*^;Kv%wB^%dPqczgQv-s#QOxNm=)Vmm%`IRaA6 zM63_$>LTlQ@k*>1AtKm%f!S@E615q6-s1~@D5pe_x7I;9dPu8hh0M}_AS8y@JGsgppt*{E;2DXYG?Vp&CDyilbI~kCY;rfSAw7?CR+Y*n<_e z(s6%#oICKc{@WpTdVsA1zu&)GmSyQF`DZ(+S5%BccdQpoWJq|--sz1Al_*2rn1eaF ztx=c;)bm)%^2~cD!q9=o^%OCoVj}fRoUT7}MOO7wdm%K%3;KS!ww6&zGJ(U&+3W0` zPmGUo^$Q%IDSWnsa-#kiV20um2V8;pQwEV;~ z1vn|i&9s2w>!G>Dg~Uj16xuQ+%Iqhk&NHJJmtW~y%*PpmUiu!yD1YOU*Izkf!CZO* zQB0sd4`QMv<+P&(QU12X*OW2C6Gjey_!)#&@e)REW5$w{i*`Y@USzdPV6V-g`{)Mt z(As62B1U09nXr#+`-QYP8iq2FR#XR~^JA(+&+4V;Ll4s$m`%9r@e?UN>!geggP$i% zNsT9RqJ~2-t zk4%JxH&P1IPCPjF{&3-mmw#sdb9__U>pwS-Inw68?#_d^J&NTEVR`w=!^_vTkeMj! z@{P>{N3A)`AzHDack9T+SD)V?EEdd0C`@t0AN`7l5-Cs10agLRp4OQRS0xH?W8P;j zTDG7j&E6cKq|tMc)F4u1jNTk_)`L zdN*9mDR|u3H>S4DJhb!TKPA4)$4ZMv^(RGNe^B<`-Isa#;CwlA z@@><^KD_z9?Bnr;4_nqQs7_z^@bRdl!?oW%e6g0n1e)(Ezu?{)mvCg#C^hK5(FG#D|8xC68N2e`tIJJ*~0pEaO(wF!{sH!>dCdjmf($S|e#o zIBTCnaQ>vT_e5*AyjZ$!us`HIN{x&#u5|{@*@vQa-@(erN9pUHKH3oZc$2XI(bf;v z!^owrEbPhYjIg$x$Y(P`;@iIe@ci(4UEATvFqVhgoN@b%4bIo&SYHML+<0Nf*|3Fw z6ncB%Ml*xuq-(|h5Jx2Kfglj)qT_ho6<+RB8AupmFtp=7AJWH7 zhEoMrAbqNjjlX)=t=&cGRTC|AMnNFYN|DhuBVIZq9GuJv(N;1FSt!;V8j!)O-Z~!* zgWEpa_E`sK4DF#Z>7b0CX70aa{jh4yjO}k5*KQE^mxe)8lO$)8HVk$jeEUZ{g`NJ&c3J5dq*G1QLD!@WBYTiK7DqW zBPBuZeeVFg&;Jy#F>U)kJq6Z_$aS7wfbrVgE$FXzVNzWfVOWH+{SM$Vdi_9%dfLNG zsouY(YZN<{6aUL|>FUomPxphDjT>)F+uZEL>^;mqz#s9q&m+j9car^9_59gKc8~(8 zsPb*I#DjQLAM2o}tn^8C_K^b*|NM5yGxYt@mq(s1+k_IIGpf%U$s`kE=J$WU^oBp0i=WR;U3BQ^i~O(cWp)Ye z#iKb!I=n}U9dmzjh70GoAAc(HsQFtjp8vMtQ>q|0pN8w}SNTeVCBaViJU|wEJN!#98$ObId0?#87IDd&Gb+P^?>^Z%J{$7KU2YH z6J)gx=I@%uz5 zqsM>)BeJ27;&DEA>Sd`>Pxtv+lp<=y zNt}|)k};vAgU7KCMpASD#+fC0=*G0MZU!oZ5f&oh5~Vp?DNN1$$w6l4zN(M$VD0lr z3yiE(95P})max<}*w09G)XQK(H_>~2Hhv;!+uK5B&$mai0K z(KjG8S1dT?g~JuXF7(y?*?B@0Rl&I1IAx^I8DX}U4L^(rTMl}WRnNED8OdB0k`nyr z3kWA|#GXo0^6+}8Zy1r;K>?;RPzEwQ3!DLgO<%_s=$PjMLff9!)MVJfQl zB~srtl`6vnW%e366T8Tc+@`L+bkK`6R7z{0?M@c8^OLL1p^qL91I<(qiD!^23V_qh za7?$OB2cXPZVEL96AOT76vmFRSnb^H@Gyn_0eUKSP}paHALEBb3i?NIv#u&7C9}I# zs0Z)Q9Bg)sWeppmL=0L@7&#($9L|iB1$KfM2kF5`6#85lSvJ+oH~WS8M2G9~RFXoc zVQ&jpK}7D;86WI!k+`GP=m7eX?2Ca|tRzinDjkIW#lbj|@sNrG`8N6#>csx+?r9tu zClO`Q`DiI=fFi7XYn2KL;@w~iEMs_BqM~y7-o)1+4aQ=k@m2MyAexQ=1D*lLC_B9X z<^6R<4FR`Yj*(}f0qV#kPmGMOMD_gD;D#2E=OJbW82Rn|15_3Y0GhRDd{q1v zY6mrl>|ZStU>xMnQ<0T14IYwCd9aaE@R`E`q9P84F)T+WlraMd(0dTB;7Lpb2w9$# zOhxsf-B`w6tR_gjjYsX}G>&mIi00B%Hw795-+!pccxcCP5JPVWX`ApsidPO#pj1F_p$1 z7LJTkQTafT6Af1hm68mqm%2s<2wa&###`ayKst$*uBgXu*qxOq#qMOfBL=;~YF2>- zN{*7B00}6E?Cua_Y!;;?cq^da0zz2g*JR}AdEs;|494?d#y(E2F!9ZAs00zmLhR1C zsYs~=rzF?mh9t%EZGME@o@0xlWGVn;_<=yt~D1ofzibx+ONF`xVDp93&z(@#S zM;JwByEsZp-9o)M4K|t}B0NMNQDj^wh<*CSq-G+T&7|91h7A4VQ7z2)s zw~?opu$(AJf?p3!Wuy#8#!EcaPFbK2RG{Y?*Fyjx{9fksBrdv1`ssns6Vm(<= zJGptX_{SdwUncMmPvExmq9}J{#smeGiEWgUUJYev9d=|QNvBU1Qa)tPT8cL_uBtg_ zPzFy=r(|x#qgWY36!bFGPHo$H#RuVECrHRJGS?lZ0hu|#A>eKyf(;Id{+GcHq{h3? z9HNK<+8fSF2f`@XGYWFK`Rl8vR>C3&C&t-kZzc1bCTJ_ozS z_9`-mkj2TPwvZ>uV3Eo}DON!*2_vuZSD2(? zxxi;BmJG#KLzgSj_CM1$6Jjlpc7asv!i34}trSbS)Bgnh`t3wa07ovS7c9cVu*l+{K^qZo$R&u+3YK|EC8;#)ejJwINvxAhs(;857JCo@ zgF_fv<^P9+taJpK)!T>-4Dpq-AX0Nc7W9BKNxAOekjm?$J5W5hVTsJ$CTanejzh;F z1nhq%mQpAAJIJ=0kDYMWcy~-&`0fNn{fe`M31WQ}4lQJD%prLpmXWI{ri$g|lk~I= zLYs$x3;8Kd10v=Y$EIRWEVS~Cyb9-jR7(gO$NK-4H%AW#NLePq9@d?+1t+;I6p*X> zjETU6F;#M;R5V&9T*iih6WCkHGV4bZfXjrjyKf7KTO{=WUB?8RGkRJbGQLt!_1>jq zlp@qxHADo+1r35VVPt3+JaWY+-_JlUpeI}134C*jI6y(IM5F(=1^+ky#<7yZb{pCV zQZ`7%wQ}-CwvcDh4%69KmBefxNVY~j+6{^)rsG`JE-tkUjYQ56iOZ(glbFNLqifOc z_%k?u5|rFLP6D#PA(D>-#;f0n1yl<$4n2WqVTsiXJGk$SN8PXlRzoO@l;RBDGxEZ{ zu?$=oF!J@3fNq3z7{*4EZU<6BGRXb9k{mh$gbI#|qaoMyCxM!y84qxX;lm%}#`^y;#EN4$muOno{k z-!24JhmZC2ow4uA)K#R6g%#V%%3Ak)MoW)wC$!nO@B>5u!uB#w6jg?94Lb&h@6#lr z@!}6!rW)ZlY){_sf|sJW;NFJ-&%OsX@U$-;n(JhyYN0xOFzadM5u(fSCiE+B@5kE*b_$oj(w%BrUEhW#W#tCU|d z%SgRpLmK?+B=20x%5Nrh9e^4SmlZk(Yv60aG$evm5OB>&DRD1$rPIj$9=yLeg))K} z1%Q?8#9t@ti`hYr;lfYjbt1d%L7N- z`0bDf->%>~E%ny?MFBVe`1;UzvP0i9d-nnsM4kAR{B;!GfFp({C|G9(j~?^KwO-JnU!p`PpUX!=8RK;zsHc&4_F6_p+~@AGI`l|Bbli31Khl z%RP6V=hf!T;7VsNJ@+F_Go+64dy1^*+)}(px_LxE1s;vYZp}fK@MTQnR>WNV zi>oK)=Uq}?m4fJrot`foV-C#}Z6;~LiI9k#EYErR!B-Ofe>1e^r5%X4>)EvT$(5D< z=Zf#-X;UJvdFu8$kNxikjo&TZ0Vg4Iuh%HmQ)BUsyR-dAd3rfQ4n(oU{>Q9|FKs1x z@Htk`VK8zP*3%jEamaw^8ot(^5#>P&ut}&5?Ih|8-m;Szg9Z#n@^QXt*H3~@fcYwzgC%vH0-Dl0mDHHuePy3m<0v<8;&KAO> z%K}Ek((W7^P*kGxGzeCCGj>wKAXJkVn#ypA3PX@f3dricORnhsug!i`zh-shaqrJ^ z$X5uK-kbg0eQm(l%{~rmhhJ^`qO`DL2yKlx52-oZrf~6@ke7*?;E`!mFqDE1TT)E8 z@|NlGWDDGy0&rrAn@Y&=>!>%;fIUDaLL9AWWJt&iCAGgq|z z`1q&B^%f>|P`J|}JJHVL6aEd{WyDj?09sWHqdwhA^!m{BrLI2H+Q#BqGK6^6i-{DIZpPG4T^7d2`-CQ}y;H7USpI6+%XIqejjn6yfLAR%pZ@5scH`N>et)LFFE{$s zrKAqsaee>0hrSLFx%H=8jn>a`=7X)&v9+<4rw-SN)ay7WD|Y@-vDWKskx%`MXS|=n z&XF$;X&uXMCtpAP^$+E@FKxZ9*RrF|`m~DMhphHL@9`*CJ1z3~Pi-L`qt=+t@A3Gw zcH!AU$E+b;pI68)9Da05tH5Wx!1(I@+FyPh-~B?nCelavT>JX&x=XDd6i3&w>&Bx$ zPp&!}|8HwV_=I))BX1p+vTt^+zg=l)OSCtQ9lM}Y+cO0MtF}g_tSh@v@L006dc<_@USC*&q{*t21%2?kK#+NT1XK-4c=ndziX3~RZ?SF}^ ze8n4z+85oGFJ-01>`T=a6tsTEFTUPGbl>gXJF#OJb)M7=`uwPnDWB(TguFN5s|Ub5 z-{|f)cdwbQK6+|ZBecmow$YCddBZAE#(K`^ST;1YdQ^kD{tMuNWb~e-k*^Q(?Dbbh zzl~Zc#+#U;8$A797nJ?%)Ox^v^$|s2o|p9dPDs-P;2O!matQp1UT{_c{oUr zvU3kx=M-(I|LNZwj_~t_C~yWt&Z!Sj(cuUs8;USy<`;==4!s>W8?S6&e<<(#B_|F{jGp)Y;0h`B1OT+yhY@soVe9Hk@?FNlFpXXwWWNv~@ThGb8@* zKnTWdZFpjOKy@%_1@{ z%1Az!+DmJc(ct()7)x1stcc|W#%BWYgu;tbc)7fj>j+wpJ`tr*7&vE1vUn{7xqbps z;DUM5l-VQ{41ybY(KVj2WjD8i+e7secs3Oev)b#Sg_}f^&&FbV)}ORtl9N;`J!RuK zf)xZ~;w#fm#Dv`hI9z}Oz*SF*-f)79t;8$vf=U}()2ENByUNiICqSfNd+PkDVSqbj#wZ?74$#o zA&kS}M!u3`M13$Nc|d2kC)Wqz`d?w5sD0(EBNp&(a@rR1|ADNwuR1&+iHGUA??$E}B6 zSblIN>uvP{NgU^ZWg6_qAy|wrDVDe+3!Mv?^n+_Bi&R9EN+>(nM{ZE^A2a|2Nm7x1 zVLlT9jw*YW+Y3{G51!0mBcGv89?MNQ0Lx$o=F9B$;=tO^kUcsJzTjbXm630uHo!`l zHt5U6!!U;>L+p8U2(cgwVM0~A_{2SH2R#7|2M<4{3jzvI5wFGCQN7T{0T-hi}92N08NvNVGVa1d>`&o0qi-3-#Q3 zepyHyDa8k~G8i&Jl(i11GVsIS%ylwyEqvoQsZb8f@p#tN>TVRXC?B+2yI~&Y3qVFB zC}x72DcE2(2;1ih8#oo@B9G(s%vhDHnHjVAe7^-0&Whx7|KXSD79=qCZ0}QE zBCnVJ992LR>5iw)6A`a7l!NBtOk8x?&q#>Q42VaQfo2?JuGk|uoFyzk1%X*4%gAF@ zpm?ee?!iWuHgd?efgSX&E$sx{3uYy`11F%=M3w;i>C+;tPT0PkUQH*6FW@Ts80Ni_ zbo33Rxe(*T1CHP*bx;s2D43Y%1v6pT+qTb2w^B(kg1|e3P>_ZOQ=E|B&@wy|>|_pv zF(G3QEcz9%A{oh!5ekTzK_K$O{r8Dwh;8O6N)zz{dBZB)InYC8m&z}re9^f>9&=*B zL-21WSplhtzO)WT%LZ6z1*cx*1q(3`!dXWwkr9f-0vPNu4-Zg^$Su-Zg4v8?{IH|Z z-po@ztw5(DyqFlE!6BEQK{H^)-av>*saQ5^^1SoJHfK87WfCTD2^CMzMDNIN*ADVD z3#2(rs4voE3I@x38Dhy%KrsZt7zj=(58$!fI0#2S;~5NMTooVXT=)JyQ~*m@i52CJ z-$V7n0^ouZmV!4pSWqsaPwLWrxMU0_!8u-TkfO= zZakG6c?O1KSJm8h;s&Uv6VaBR|2`(hE>=31=Wh2Lo?$KH4{n64=NPs2=)pl?gseyp ztT~0!qa{wQMPX@%TUd!pDYk zsbhqy@Pf(AIL6m%UCoap`*$fsFjJlP?g1GmfNDpLcno7_^frpJye|trgGqQggu*U2 z2h4Y;1@I$ius~H-Be9L#>`(=-&WAC;cq#c&G!Y}B-(fZ*XB;eijG9SF_Tc+3Cdp(3 z&XV$WAWy>@xN+3Y*!hy!C?uhz(4~-$rAB*Zo^e3;h=^Gm@G54MYVYR`#Fdx!CE$D; zZ?JLTGGPU`o#2Q`_!t#!g>S3x)4kuzP^Vx8J3=);?+|B*CgT-Wya>1}T+K+qi$-l| zBrL{uEK%j(Bu#c9q6j4>wj)tt--z;DqEeG~{V;Ge}a@LM_CzKQ8gr6BC#yRJUe7Y+>!JNak>o-+-b) z<-dTv8ShEx6$Y=FjH^s+L%n>4 zK#mMVlWk|mv|Sa0@Fg*}iX z3(#e9ir z1Q*?bUD$AjsDJY))jBN-BD(=(o-$57fja*o(QGgY_I#V5p4&$!!7Z?7B4kL$V_x(S zEH@cXA{Qx8@D+rZ%OYW7JnN>CT0|DKgHUhT`0ixH@G(D%(?B_)GyfB_{;W6f0(oQ& zkOx1R?7-=x#VUR(Od&Nx3=V1+=xHTl>0NL*io*lIKBVi?CmG}j|G5g^a94icM{)R zeiUCwZlM+qI};Nbm3lPaLN}s`gXZG^tDWAif{G>?#}U@UFeAkfdwNXgc%Q;L_WQx! zda@Ywl;@`VIGH^$)tj9*mZKnwi6MBpavV#sgaqNBF+nlY%a7CKBKZo+o%9{&@i36c zT%|O5rS#V@8V9q^D#GxSU8YP%HXOlFR`NYK0Z-=r6VdB_!Eur~t5O<>v*7=k`u2FH z{y+ZrHn+;P52A?`N-iT3p{znK8!F`*E0^RlQn5>y(@l~)iCkKeMSF{n51%WB>t1{Qyg4>Ug#%;2c&_krT>)r9gy)1F+ zkZ!!sOl4gH||2-ak0m zGwtW`fm_CT|@B_tCFQ)1oT2@fh9(! zn#n}L=QB`iv4wv`^H4GfA}Sfcu}Vl9w@pzFgD^o&!NqCYp&cS+@a2M(4lEeu!ZVNx zBu7-Jg^TZeuEMkv&Wx^{HmN2FH{XHpwtBzwXcEzU6;$80uMiO@$I}oY=OjH4 zs))7t`iNE2e#$nz;NCl(dC1nYQz#U+NTRg`P zfr-I(AWHe|fC)UBEbSdP_3RF^8OTAAPzEz29aW34K{)`fCII}yQoK#>(%&V|Z9IwJ z4d8qn4(Y{pR4JopIX>0xiE*Od!~2BnxS###=&l#LjyrEmVu}!mJO97{aa9&bx}%Ci+*_O= zGk8RhpOc;gJ5t?`cWGyScec_i$WV1IFMibO`Sd}b`-skgtbI#|Q=d8-&5P}&J)`;% zbjSC_w;av{=5ku+;Koc0Dm&Ti&UPG{DB&(AW5bXc^DuyY1s$?LqyXTzHU}XI<6mPS z03rAc2d8b%UiLV=U}U-18w6*4b-w=Wbq{fO(O&nh)wi;~whp8;JREX+l`b8<`@`!$ zYX2q&9WT&^6RL``CZmSvHfwBFAkPT1I)~T_?2tX67#_I_>FD3^Y#oZS13fah-48sR zMhv!PGh8k{;~kIN&G2v^!3IBUc3FNVZ5?<%Rn~hea9`+0Uj>5Wd6RUdSv8}`^c~<2 zLIr{iWyIl}n-HQHnT?=8yr-}sGtD6gwS+K%Z@oxxC}AsaQz#OKG{?9-6;B&E{u_-| zvL{@Qmi+3;*xlY2RAzc0w;u0X@;|Gq=ZS=|xeDzk{pcG2(W^B%$|U}dikPuS{yZ|? z()84f=ci6?I_8KdLuix`Kp{_p9-=4}YRgApPUyU7{T}RWOvpV&@GkM}eehx+E3E#W zPHqUHt|YN%?^8a9(~Q%5@NC*WxQw+qxLo!GFhIZNw_n-m42~U zYglymlU!td{g?vOy0zDoT07=~BVc6xTk;6qc=F*qKjb)IbJgEgoO3`r<{0tUjQ8sQ zPH2*am!`c}o+FxssHw$*V!GYEtN-R41C|IK_8EZS1vwb@Di`w|fRPy-$rT09V2KD( zdqVIZkf+{>Ki6zVD}M~HMYU70*1i~-anSB|7hGa3)@H+b=MIk5HWy686 zNgDeSIG20u55x61d7@NkzF^aibD3-t9)cH> zZQhap;EXFMV0Y!tC0&XQl#$5q955+oTfh&m%h}_tm1hVIC8thkEXbKhI2%qsdF}G1 z#N-5~O!4I15o>hbS;?Q26Z_S0C&l`^x+k}+ZXC^$ezo@*JmwvJKJ{$-kJYTmIwvVV zanlrVZ`+Q*Qq^B2YmUnrZ&6&E%l-7f80}YY{WhRVDLF3lZSbQYxvoW{IOFIkS;eAb z`WL9V?b={5^2Bg2>g4~Bt`}d__4|d3&1b`poE!sb)bjRCkFYo(D!YAh^K5%C3QYN3 zJF|a_Z1=*U+2V^zV8L%ABUY*+YqQDr*B3YDoefsHT{$RS8Zo-G}SFc zr+3Q(UK634ciq^k}WX;&k2e zIdu-dcx0Ye@}Sl3yfgQ1{qf*JBcszPuWlWm`XE;J4nN}YY2;LDL(QqFs%4e^tW5iT zyUwSJTYZbGB7>jbzchS7NKH3wxPUe}u6B=Y;2>VQ87dU06q+6%mwJEEVe4{Hx|8)y zw0VXKF}caX|1&4uv!UX2N<{cw{l$?Bqc)^TN9Hzpp2oeDDP*a3SL~AG?9_<7=8KDy zb^ngerC)5Q-*#|w)ZnG{pUca?)2}sD_~KZL`=r+SXwLQPK0t3w)*;00Z0kGiZ2G-9 z11TiBAnL7nQoM-0fr_Vaez^YAj+AT(6HB;hYKM0C5lbkMSq*H!1x;RUz6vxQ{ zcrW?a-EA&tTmcFw%G_M_-%qp~gd@0IsOtd6r^V8WJ+N+^W?o; zes=+|U;4jKvOjbmp>kXXbgxEE+P(_vOEPYQKTgBd)kHZP>CxfcH=o0JU2o^*VpSVE zB`F1oT{pGgUXHLKKWsxnYp&Al-2AtfcT$2XYDT<6O`W7T7e7mW?mPbk>MvHJ#}5Mc zB;L-<5O$m1sIvINJ}zn^^7FwvuiB!f)EE*XdB=%kYVnz2wYxOsMWgBY_@h0a!VTPXQgb8piByVjUKT<5pXDe1y%>yV z+B!mG$}6kb{OlMYA{3wIx2j8JQJzSw@se5EgVJ<(+TbB}><`nFpzA!`-9T5`jR2Aw z*`tjWTj|AFZRV&Na8*e!*m!a?F{Qw+Q&0FuU_mgE`^Z-b{oxS$|h!eq+u zB96Wl3L!B|jEQyUr$T`YB!eTdf8lh|h}-%fqft=*sIk#8LHI?u(dTE@echH-HKngn5bN_o&; zH3em@SXD~I`isIP z4*B4zqOcBEVXQ~;@Eu`RnYlIK2~yNvu#brQJFmpHIbIQ(#*C}J|Mv3CNokUcb%MI* z$Qv_3vxUt-cg=u-5xg0*m2KWFdD40zud;O z>(e=vOS^pJoU%{3#OXTqZFA1JJX;^`w7J8-JjPM7Y?)LuLM^Wx(+Q8NJ6Tw~lKgUG z)}Kmw-8-ABk41Z5{xv(FX8>iAp-Jn>N;VCFj zxbYp{C-qOY{{xpEU6s%;{ToKMCQO%@lva&-+TMt7`>#xb@#c5H2i|#+L`9lYn~s%; z7nZARmbj`~VPdI1y21EevvpqeSeJ9=^R|#;Ma=s!&SW*!D=>5WDNW6L<`(KrM*!XH zO|<@iw*UQ;mcvcH@425tD`G7F4c~@sc@$jv=BwA$3dj;u&UcVD3DTWZ_fD_)E4CHyQt2xHZ)Isk@1qwQ*WDa0*0A3xi=bxzMS~r{_ zZ_jz;>K%8mgs1^56u>Beq98;m(ivfra*&5X07xMkHHDf0tB^I$kSIG?Hkp3!$JUsl zMkKCM0MbrrU{yEljj?REz#-*OM40(#LSjNsgR^J}qb-VrTRli*2W z;B7)$lCz-`&clxOYMA^{f?pRJ^CS*IzFRzM3JfjUvpNWFZO;}# zwa2?|Sq1{!E`P_hm`;@hmVRy*6+KbB19VGo$4chdOcr(PV2P%-$_dc_UfJ~9Zxdt7e4+LJ-?b∓6=9w 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

        1. aM0t86G^cFck)$AmOEe>HD1JHjp^Ga(x_V2#3cN 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/cleanup.ksh new file mode 100644 index 00000000000..ef9e02b83f3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/cleanup.ksh @@ -0,0 +1,55 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.4 07/07/31 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +function destroy_upgraded_pool { + for VERSION in $@ + do + POOL_FILES=$($ENV | $GREP "ZPOOL_VERSION_${VERSION}_FILES"\ + | $AWK -F= '{print $2}') + POOL_NAME=$($ENV | $GREP "ZPOOL_VERSION_${VERSION}_NAME"\ + | $AWK -F= '{print $2}') + poolexists $POOL_NAME + if [ $? == 0 ] + then + log_must $ZPOOL destroy -f $POOL_NAME + fi + + done +} + +for config in $CONFIGS +do + destroy_upgraded_pool $config +done diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/create_upgrade_pool_dat.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/create_upgrade_pool_dat.sh new file mode 100755 index 00000000000..ddb95a753cc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/create_upgrade_pool_dat.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +# $FreeBSD$ + +scriptpath=$(realpath $0) +parent=$(dirname $scriptpath) +blockfiles=${parent}/blockfiles + +version=$1 +if [ -z "$version" ]; then + echo "Must specify ZFS pool version" + exit 1 +fi + +# In case we need to test feature enabling? +#avail_features=$(zpool upgrade -v | awk '/^[a-z]/ && !/^see the/ { print $1 }') + +zpool_opts="" +# For v5000, the rest of the arguments are =. +if [ "$version" = "5000" ]; then + shift + for feature in $*; do + zpool_opts="$zpool_opts -o feature@${feature}" + done +else + zpool_opts="-o version=${version}" +fi + +dir=$(pwd) +datfile=zfs-pool-v${version}.dat +dat=${dir}/${datfile} +poolname=v${version}-pool + +rm -f ${dat} ${dat}.Z +set -e +set -x +dd if=/dev/zero of=${dat} bs=1M count=64 +zpool create ${zpool_opts} ${poolname} ${dat} +zpool export ${poolname} +compress ${dat} +cp ${dat}.Z ${blockfiles} +ls -l ${blockfiles}/${datfile}.Z diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/setup.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/setup.ksh new file mode 100644 index 00000000000..022542f2f5a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/setup.ksh @@ -0,0 +1,44 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.5 09/05/19 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +# This should have been set by the .cfg script - verify it's set to something +# (we check that something later on) +if [ -z "$ZPOOL_VERSION" ] +then + log_unresolved "Unable to determine ZFS Pool version of this machine" +else + log_note "This machine is running ZFS version $ZPOOL_VERSION" +fi diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade.cfg b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade.cfg new file mode 100644 index 00000000000..7fb54649217 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade.cfg @@ -0,0 +1,293 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade.cfg 1.7 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg +. $STF_SUITE/include/libtest.kshlib + +export STF_TIMEOUT=1800 + +# We need to determine which version of ZFS we're running on, so as to +# work out which types of pool we should be able to upgrade on this +# system. +export ZPOOL_VERSION=$(get_zpool_version) + + +# The following variable names describe files, stored as gzip compressed files +# in the test directory which can be used to construct a pool of a given +# version. The variable names are important, in that the construction +# ZPOOL_VERSION_$var_FILES describes the files the pool is made from, and +# ZPOOL_VERSION_$var_NAME describes the pool name. + +# Version 1 pools +export ZPOOL_VERSION_1_FILES="zfs-pool-v1.dat" +export ZPOOL_VERSION_1_NAME="v1-pool" +# v1 stripe +export ZPOOL_VERSION_1stripe_FILES="zfs-pool-v1stripe1.dat \ +zfs-pool-v1stripe2.dat zfs-pool-v1stripe3.dat" +export ZPOOL_VERSION_1stripe_NAME="pool-v1stripe" +# v1 raidz +export ZPOOL_VERSION_1raidz_FILES="zfs-pool-v1raidz1.dat zfs-pool-v1raidz2.dat \ +zfs-pool-v1raidz3.dat" +export ZPOOL_VERSION_1raidz_NAME="pool-v1raidz" +# v1 mirror +export ZPOOL_VERSION_1mirror_FILES="zfs-pool-v1mirror1.dat \ +zfs-pool-v1mirror2.dat zfs-pool-v1mirror3.dat" +export ZPOOL_VERSION_1mirror_NAME="pool-v1mirror" + + +# Version 2 pools +export ZPOOL_VERSION_2_FILES="zfs-pool-v2.dat" +export ZPOOL_VERSION_2_NAME="v2-pool" +# v2 stripe +export ZPOOL_VERSION_2stripe_FILES="zfs-pool-v2stripe1.dat \ +zfs-pool-v2stripe2.dat zfs-pool-v2stripe3.dat" +export ZPOOL_VERSION_2stripe_NAME="pool-v2stripe" +# v2 raidz +export ZPOOL_VERSION_2raidz_FILES="zfs-pool-v2raidz1.dat zfs-pool-v2raidz2.dat \ +zfs-pool-v2raidz3.dat" +export ZPOOL_VERSION_2raidz_NAME="pool-v2raidz" +# v2 mirror +export ZPOOL_VERSION_2mirror_FILES="zfs-pool-v2mirror1.dat \ +zfs-pool-v2mirror2.dat zfs-pool-v2mirror3.dat" +export ZPOOL_VERSION_2mirror_NAME="pool-v2mirror" + + +# This is a v3 pool +export ZPOOL_VERSION_3_FILES="zfs-pool-v3.dat" +export ZPOOL_VERSION_3_NAME="v3-pool" +# v3 stripe +export ZPOOL_VERSION_3stripe_FILES="zfs-pool-v3stripe1.dat \ +zfs-pool-v3stripe2.dat zfs-pool-v3stripe3.dat" +export ZPOOL_VERSION_3stripe_NAME="pool-v3stripe" +# v3 raidz +export ZPOOL_VERSION_3raidz_FILES="zfs-pool-v3raidz1.dat zfs-pool-v3raidz2.dat \ +zfs-pool-v3raidz3.dat" +export ZPOOL_VERSION_3raidz_NAME="pool-v3raidz" +# v3 mirror +export ZPOOL_VERSION_3mirror_FILES="zfs-pool-v3mirror1.dat \ +zfs-pool-v3mirror2.dat zfs-pool-v3mirror3.dat" +export ZPOOL_VERSION_3mirror_NAME="pool-v3mirror" +# v3 raidz2 +export ZPOOL_VERSION_3dblraidz_FILES="zfs-pool-v3raidz21.dat \ +zfs-pool-v3raidz22.dat zfs-pool-v3raidz23.dat" +export ZPOOL_VERSION_3dblraidz_NAME="pool-v3raidz2" +# v3 hotspares +export ZPOOL_VERSION_3hotspare_FILES="zfs-pool-v3hotspare1.dat \ +zfs-pool-v3hotspare2.dat zfs-pool-v3hotspare3.dat" +export ZPOOL_VERSION_3hotspare_NAME="pool-v3hotspare" + +# v4 pool +export ZPOOL_VERSION_4_FILES="zfs-pool-v4.dat" +export ZPOOL_VERSION_4_NAME="v4-pool" + +# v5 pool +export ZPOOL_VERSION_5_FILES="zfs-pool-v5.dat" +export ZPOOL_VERSION_5_NAME="v5-pool" + +# v6 pool +export ZPOOL_VERSION_6_FILES="zfs-pool-v6.dat" +export ZPOOL_VERSION_6_NAME="v6-pool" + +# v7 pool +export ZPOOL_VERSION_7_FILES="zfs-pool-v7.dat" +export ZPOOL_VERSION_7_NAME="v7-pool" + +# v8 pool +export ZPOOL_VERSION_8_FILES="zfs-pool-v8.dat" +export ZPOOL_VERSION_8_NAME="v8-pool" + +# v9 pool +export ZPOOL_VERSION_9_FILES="zfs-pool-v9.dat" +export ZPOOL_VERSION_9_NAME="v9-pool" + +# v10 pool +export ZPOOL_VERSION_10_FILES="zfs-pool-v10.dat" +export ZPOOL_VERSION_10_NAME="v10-pool" + +# v11 pool +export ZPOOL_VERSION_11_FILES="zfs-pool-v11.dat" +export ZPOOL_VERSION_11_NAME="v11-pool" + +# v12 pool +export ZPOOL_VERSION_12_FILES="zfs-pool-v12.dat" +export ZPOOL_VERSION_12_NAME="v12-pool" + +# v13 pool +export ZPOOL_VERSION_13_FILES="zfs-pool-v13.dat" +export ZPOOL_VERSION_13_NAME="v13-pool" + +# v14 pool +export ZPOOL_VERSION_14_FILES="zfs-pool-v14.dat" +export ZPOOL_VERSION_14_NAME="v14-pool" + +# v15 pool +export ZPOOL_VERSION_15_FILES="zfs-pool-v15.dat" +export ZPOOL_VERSION_15_NAME="v15-pool" + +# v28 pool +export ZPOOL_VERSION_28_FILES="zfs-pool-v28.dat" +export ZPOOL_VERSION_28_NAME="v28-pool" + +# v5000 pool +export ZPOOL_VERSION_5000_FILES="zfs-pool-v5000.dat" +export ZPOOL_VERSION_5000_NAME="v5000-pool" + +# This pool is a v2 pool, with device problems on one side of the mirror +# so that the pool appears as DEGRADED +export ZPOOL_VERSION_2brokenmirror_FILES="zfs-broken-mirror1.dat \ +zfs-broken-mirror2.dat" +export ZPOOL_VERSION_2brokenmirror_NAME="zfs-broken-mirror" + + +# This pool is a v999 pool (an unknown version) which can be used to check +# whether upgrade, import or other tests that should fail against unknown +# pool versions should fail. It should not be listed in the CONFIGS +# variable below, as these are pool versions that can be imported and upgraded +export ZPOOL_VERSION_9999_FILES="zfs-pool-v999.dat" +export ZPOOL_VERSION_9999_NAME="v999-pool" + + +# This statement builds up a list of configurations we should be able to +# upgrade, for each pool version. Once we've built this variable, we'll +# call the functions above for each value. +case $ZPOOL_VERSION in +1) + # we should be able to upgrade pools of version 1 + CONFIGS="1 1stripe 1raidz 1mirror" + ;; + +2) + # we should be able to upgrade pools of version 1 & 2 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror" + ;; +3) + # we should be able to upgrade pools of version 1, 2 & 3 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare" + ;; +4) + # we should be able to upgrade pools of version 1, 2, 3 & 4 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4" + ;; +5) + # we should be able to upgrade pools up to version 5 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5" + ;; +6) + # we should be able to upgrade pools up to version 6 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6" + ;; +7) + # we should be able to upgrade pools up to version 7 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7" + ;; +8) + # we should be able to upgrade pools up to version 8 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8" + ;; +9) + # we should be able to upgrade pools up to version 9 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9" + ;; +10) + # we should be able to upgrade pools up to version 10 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10" + ;; +11) + # we should be able to upgrade pools up to version 11 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11" + ;; +12) + # we should be able to upgrade pools up to version 12 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11 12" + ;; +13) + # we should be able to upgrade pools up to version 13 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11 12 13" + ;; +14) + # we should be able to upgrade pools up to version 14 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11 12 13 14" + ;; +15) + # we should be able to upgrade pools up to version 15 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11 12 13 14 15" + ;; +28) + # we should be able to upgrade pools up to version 15 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11 12 13 14 15 28" + ;; +5000) + # we should be able to upgrade pools up to version 15 + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11 12 13 14 15 28 5000" + ;; +*) + # we should be able to upgrade pools up to version 15 + # but we should also log a note about the unknown pool version + CONFIGS="1 1stripe 1raidz 1mirror \ + 2 2stripe 2raidz 2mirror 2brokenmirror \ + 3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11 12 13 14 15" + + log_note "Unknown ZFS version $ZPOOL_VERSION encountered:\ + Test suite may need updating." + ;; +esac +export CONFIGS diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib new file mode 100644 index 00000000000..832a3b57b36 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib @@ -0,0 +1,162 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade.kshlib 1.5 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# This part of the test suite relies on variables being setup in the +# zpool_upgrade.cfg script. Those variables give us details about which +# files make up the pool, and what the pool name is. + + +# A function to import a pool from files we have stored in the test suite +# We import the pool, and create some random data in the pool. +# $1 a version number we can use to get information about the pool +function create_old_pool +{ + VERSION=$1 + POOL_FILES=$($ENV | grep "ZPOOL_VERSION_${VERSION}_FILES"\ + | $AWK -F= '{print $2}') + POOL_NAME=$($ENV|grep "ZPOOL_VERSION_${VERSION}_NAME"\ + | $AWK -F= '{print $2}') + + log_note "Creating $POOL_NAME from $POOL_FILES" + for pool_file in $POOL_FILES; do + $CP -f $STF_SUITE/tests/cli_root/zpool_upgrade/blockfiles/$pool_file.Z \ + $TMPDIR + $UNCOMPRESS $TMPDIR/$pool_file.Z + done + log_must $ZPOOL import -d $TMPDIR $POOL_NAME + + # Now put some random contents into the pool. + COUNT=0 + while [ "$COUNT" -lt 1024 ]; do + $DD if=/dev/urandom of=/$POOL_NAME/random.$COUNT \ + count=1 bs=1024 > /dev/null 2>&1 + COUNT=$(( $COUNT + 1 )) + done +} + + +# A function to check the contents of a pool, upgrade it to the current version +# and then verify that the data is consistent after upgrading. Note that we're +# not using "zpool status -x" to see if the pool is healthy, as it's possible +# to also upgrade faulted, or degraded pools. +# $1 a version number we can use to get information about the pool +function check_upgrade { + VERSION=$1 + POOL_NAME=$($ENV| $GREP "ZPOOL_VERSION_${VERSION}_NAME"\ + | $AWK -F= '{print $2}') + POOL_FILES=$($ENV | $GREP "ZPOOL_VERSION_${VERSION}_FILES"\ + | $AWK -F= '{print $2}') + + log_note "Checking if we can upgrade from ZFS version ${VERSION}." + PRE_UPGRADE_CHECKSUM=$(check_pool $POOL_NAME pre ) + log_must $ZPOOL upgrade $POOL_NAME > /dev/null + POST_UPGRADE_CHECKSUM=$(check_pool $POOL_NAME post ) + + log_note "Checking that there are no differences between checksum output" + log_must $DIFF $PRE_UPGRADE_CHECKSUM $POST_UPGRADE_CHECKSUM + $RM $PRE_UPGRADE_CHECKSUM $POST_UPGRADE_CHECKSUM +} + +# A function to destroy an upgraded pool, plus the files it was based on. +# $1 a version number we can use to get information about the pool +function destroy_upgraded_pool { + VERSION=$1 + POOL_NAME=$($ENV|grep "ZPOOL_VERSION_${VERSION}_NAME"\ + | $AWK -F= '{print $2}') + POOL_FILES=$($ENV | grep "ZPOOL_VERSION_${VERSION}_FILES"\ + | $AWK -F= '{print $2}') + if poolexists "$POOL_NAME"; then + log_must $ZPOOL destroy $POOL_NAME + fi + for file in $POOL_FILES; do + if [ -e "$TMPDIR/$file" ]; then + $RM $TMPDIR/$file + fi + done +} + +# This function does a basic sanity check on the pool by computing the +# checksums of all files in the pool, printing the name of the file containing +# the checksum results. +# $1 the name of the pool +# $2 a flag we can use to determine when this check is being performed +# (ie. pre or post pool-upgrade) +function check_pool { # pool state + POOL=$1 + STATE=$2 + $FIND /$POOL -type f -exec $CKSUM {} + > \ + $TMPDIR/pool-checksums.$POOL.$STATE + print $TMPDIR/pool-checksums.$POOL.$STATE +} + +# This function simply checks that a pool has a particular version number +# as reported by zdb and zpool upgrade -v +# $1 the name of the pool +# $2 the version of the pool we expect to see +function check_poolversion { # pool version + + POOL=$1 + VERSION=$2 + + # check version using zdb + ACTUAL=$(get_config $POOL version) + [ "$ACTUAL" != "$VERSION" ] && log_fail \ + "ERROR: $POOL not upgraded: wanted '$VERSION', got '$ACTUAL'" + + # check version using zpool upgrade + ACTUAL=$($ZPOOL upgrade | $GREP $POOL$ | \ + $AWK '{print $1}' | $SED -e 's/ //g') + [ "$ACTUAL" != "$VERSION" ] && + log_fail "$POOL reported version '$ACTUAL', expected '$VERSION'" +} + +# A simple function to get a random number between two bounds +# probably not the most efficient for large ranges, but it's okay. +# Note since we're using $RANDOM, 32767 is the largest number we +# can accept as the upper bound. +# $1 lower bound +# $2 upper bound +function random { # min max + + typeset MIN=$1 + typeset MAX=$2 + typeset RAND=0 + + while [ "$RAND" -lt "$MIN" ] + do + RAND=$(( $RANDOM % $MAX + 1)) + done + + print $RAND +} + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_001_pos.ksh new file mode 100644 index 00000000000..8f4082d2803 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_001_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_001_pos.ksh 1.3 08/02/27 SMI" +# +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_001_pos +# +# DESCRIPTION: +# Executing 'zpool upgrade -v' command succeeds, and also prints a description +# of at least the current ZFS version. +# +# STRATEGY: +# 1. Execute the command +# 2. Verify a 0 exit status +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Executing 'zpool upgrade -v' command succeeds." + +log_must $ZPOOL upgrade -v + +# we also check that the usage message contains at least a description +# of the current ZFS version. + +$ZPOOL upgrade -v > $TMPDIR/zpool-versions.${TESTCASE_ID} +COUNT=$( $WC -l $TMPDIR/zpool-versions.${TESTCASE_ID} | $AWK '{print $1}' ) +COUNT=$(( $COUNT - 1 )) +$TAIL -${COUNT} $TMPDIR/zpool-versions.${TESTCASE_ID} > $TMPDIR/zpool-versions-desc.${TESTCASE_ID} + +# +# Current output for 'zpool upgrade -v' has different indent space +# for single and double digit version number. For example, +# 9 refquota and refreservation properties +# 10 Cache devices +# +log_note "Checking to see we have a description for the current ZFS version." +if (( ZPOOL_VERSION < 10 )); then + log_must $GREP "$ZPOOL_VERSION " $TMPDIR/zpool-versions-desc.${TESTCASE_ID} +elif (( ZPOOL_VERSION >= 5000 )); then + log_must $GREP "The following features are supported" \ + $TMPDIR/zpool-versions-desc.${TESTCASE_ID} +else + log_must $GREP "$ZPOOL_VERSION " $TMPDIR/zpool-versions-desc.${TESTCASE_ID} +fi +$RM $TMPDIR/zpool-versions.${TESTCASE_ID} +$RM $TMPDIR/zpool-versions-desc.${TESTCASE_ID} + +log_pass "Executing 'zpool upgrade -v' command succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_002_pos.ksh new file mode 100644 index 00000000000..4adae292f11 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_002_pos.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_002_pos.ksh 1.3 08/08/15 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_002_pos +# +# DESCRIPTION: +# import pools of all versions - zpool upgrade on each pools works +# +# STRATEGY: +# 1. Execute the command with several invalid options +# 2. Verify a 0 exit status for each +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool $config +} + +log_assert "Import pools of all versions - zpool upgrade on each pools works" +log_onexit cleanup + +# $CONFIGS gets set in the .cfg script +for config in $CONFIGS +do + create_old_pool $config + check_upgrade $config + destroy_upgraded_pool $config +done + +log_pass "Import pools of all versions - zpool upgrade on each pools works" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_003_pos.ksh new file mode 100644 index 00000000000..0d6bff1ae0e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_003_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_003_pos.ksh 1.3 08/08/15 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_003_pos +# +# DESCRIPTION: +# Upgrading a pool that has already been upgraded succeeds. +# +# STRATEGY: +# 1. Upgrade a pool, then try to upgrade it again +# 2. Verify a 0 exit status +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool 1 +} + +log_assert "Upgrading a pool that has already been upgraded succeeds." +log_onexit cleanup + +# we just create a version 1 pool here +create_old_pool 1 +check_upgrade 1 +check_upgrade 1 +destroy_upgraded_pool 1 + +log_pass "Upgrading a pool that has already been upgraded succeeds." diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_004_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_004_pos.ksh new file mode 100644 index 00000000000..c12a031d487 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_004_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_004_pos.ksh 1.6 09/06/22 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_004_pos +# +# DESCRIPTION: +# zpool upgrade -a works +# +# STRATEGY: +# 1. Create all upgradable pools for this system, then upgrade -a +# 2. Verify a 0 exit status +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + for config in $CONFIGS ; do + destroy_upgraded_pool $config + done +} + +log_assert "zpool upgrade -a works" + +log_onexit cleanup + +# Now build all of our pools +for config in $CONFIGS +do + POOL_NAME=$($ENV | $GREP "ZPOOL_VERSION_${config}_NAME"\ + | $AWK -F= '{print $2}') + + create_old_pool $config + # a side effect of the check_pool here, is that we get a checksum written + # called $TMPDIR/pool-checksums.$POOL.pre + check_pool $POOL_NAME pre > /dev/null +done + +# upgrade them all at once +log_must $ZPOOL upgrade -a > /dev/null + +# verify their contents then destroy them +for config in $CONFIGS +do + POOL_NAME=$($ENV | $GREP "ZPOOL_VERSION_${config}_NAME"\ + | $AWK -F= '{print $2}') + + check_pool $POOL_NAME post > /dev/null + + # a side effect of the check_pool here, is that we get a checksum written + # called $TMPDIR/pool-checksums.$POOL_NAME.post + log_must $DIFF $TMPDIR/pool-checksums.$POOL_NAME.pre \ + $TMPDIR/pool-checksums.$POOL_NAME.post + + $RM $TMPDIR/pool-checksums.$POOL_NAME.pre $TMPDIR/pool-checksums.$POOL_NAME.post + destroy_upgraded_pool $config +done + +log_pass "zpool upgrade -a works" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_005_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_005_neg.ksh new file mode 100644 index 00000000000..87d59262064 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_005_neg.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_005_neg.ksh 1.3 07/10/09 SMI" +# +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_005_neg +# +# DESCRIPTION: +# Variations of upgrade -v print usage message, return with non-zero status +# +# STRATEGY: +# 1. Execute the command with several invalid options +# 2. Verify a 0 exit status for each +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A args "/tmp" "-?" "-va" "-v fakepool" "-a fakepool" + +log_assert "Variations of upgrade -v print usage message, \ + return with non-zero status" + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL upgrade ${args[$i]} > /dev/null + + (( i = i + 1 )) +done + +log_pass "Variations of upgrade -v print usage message, \ + return with non-zero status" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_006_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_006_neg.ksh new file mode 100644 index 00000000000..997dec8b601 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_006_neg.ksh @@ -0,0 +1,73 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_006_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_006_neg +# +# DESCRIPTION: +# Attempting to upgrade a non-existent pool will return an error +# +# STRATEGY: +# 1. Verify a pool doesn't exist, then try to upgrade it +# 2. Verify a 0 exit status +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "Attempting to upgrade a non-existent pool will return an error" +NO_POOL=notapool +FOUND="" + +while [ -z "$FOUND" ] +do + $ZPOOL list $NO_POOL 2>&1 > /dev/null + if [ $? -ne 0 ] + then + FOUND="true" + log_mustnot $ZPOOL upgrade $NO_POOL + else + NO_POOL="${NO_POOL}x" + fi +done + +log_pass "Attempting to upgrade a non-existent pool will return an error" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh new file mode 100644 index 00000000000..e675249b8d7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_007_pos.ksh 1.3 08/08/15 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib +. $STF_SUITE/tests/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_007_pos +# +# DESCRIPTION: +# import pools of all versions - verify the following operation not break. +# * zfs create -o version= +# * zfs upgrade [-V vers] +# * zfs set version= +# +# STRATEGY: +# 1. Import pools of all versions +# 2. Setup a test enviorment over the old pools. +# 3. Verify the commands related to 'zfs upgrade' succeed as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-28) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +if ! fs_prop_exist "version" ; then + log_unsupported "version is not supported by this release." +fi + +function cleanup +{ + destroy_upgraded_pool $config +} + +log_assert "Import pools of all versions - 'zfs upgrade' on each pools works" +log_onexit cleanup + +# $CONFIGS gets set in the .cfg script +for config in $CONFIGS +do + create_old_pool $config + pool=$($ENV| $GREP "ZPOOL_VERSION_${config}_NAME" \ + | $AWK -F= '{print $2}') + + default_check_zfs_upgrade $pool + destroy_upgraded_pool $config +done + +log_pass "Import pools of all versions - 'zfs upgrade' on each pools works" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_008_pos.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_008_pos.ksh new file mode 100644 index 00000000000..4bf78752165 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_008_pos.ksh @@ -0,0 +1,99 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_008_pos.ksh 1.5 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_008_pos +# +# DESCRIPTION: +# +# Zpool upgrade should be able to upgrade pools to a given version using -V +# +# STRATEGY: +# 1. For all versions pools that can be upgraded on a given OS version +# (latest pool version - 1) +# 2. Pick a version that's a random number, greater than the version +# we're running. +# 3. Attempt to upgrade that pool to the given version +# 4. Check the pool was upgraded correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-09-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool $config +} + +log_assert \ + "Zpool upgrade should be able to upgrade pools to a given version using -V" + +$ZPOOL upgrade --help 2>&1 | $GREP "V version" > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "Zpool upgrade -V not supported on this release." +fi +log_onexit cleanup + +# We're just using the single disk version of the pool, which should be +# enough to determine if upgrade works correctly. Also set a MAX_VER +# variable, which specifies the highest version that we should expect +# a zpool upgrade operation to succeed from. (latest version - 1) +CONFIGS="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 28" +MAX_VER=28 + +for config in $CONFIGS +do + create_old_pool $config + pool=$($ENV| $GREP "ZPOOL_VERSION_${config}_NAME" \ + | $AWK -F= '{print $2}') + NEXT=$(random $config $MAX_VER) + log_must $ZPOOL upgrade -V $NEXT $pool + check_poolversion $pool $NEXT + destroy_upgraded_pool $config +done + +log_pass \ + "Zpool upgrade should be able to upgrade pools to a given version using -V" diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_009_neg.ksh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_009_neg.ksh new file mode 100644 index 00000000000..c2e04ed1bee --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_009_neg.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_009_neg.ksh 1.4 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_009_neg +# +# DESCRIPTION: +# +# Zpool upgrade -V shouldn't be able to upgrade a pool to an unknown version +# +# STRATEGY: +# 1. Take an existing pool +# 2. Attempt to upgrade it to an unknown version +# 3. Verify that the upgrade failed, and the pool version was still the original +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-09-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool $config +} + +log_assert \ +"Zpool upgrade -V shouldn't be able to upgrade a pool to an unknown version" + +$ZPOOL upgrade --help 2>&1 | $GREP "V version" > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "Zpool upgrade -V not supported on this release." +fi +log_onexit cleanup + +# Create a version 2 pool +typeset -i config=2 +create_old_pool $config +pool=$($ENV| $GREP "ZPOOL_VERSION_${config}_NAME" | $AWK -F= '{print $2}') + +# Attempt to upgrade it +log_mustnot $ZPOOL upgrade -V 999 $pool +log_mustnot $ZPOOL upgrade -V 999 + +# Verify we're still on the old version +check_poolversion $pool $config +destroy_upgraded_pool $config + +log_pass \ + "Zpool upgrade -V shouldn't be able to upgrade a pool to an unknown version" + diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_test.sh b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_test.sh new file mode 100755 index 00000000000..3eed23ffc99 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/zpool_upgrade_test.sh @@ -0,0 +1,290 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_upgrade_001_pos cleanup +zpool_upgrade_001_pos_head() +{ + atf_set "descr" "Executing 'zpool upgrade -v' command succeeds." + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +zpool_upgrade_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_002_pos cleanup +zpool_upgrade_002_pos_head() +{ + atf_set "descr" "Import pools of all versions - zpool upgrade on each pools works" + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +zpool_upgrade_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_003_pos cleanup +zpool_upgrade_003_pos_head() +{ + atf_set "descr" "Upgrading a pool that has already been upgraded succeeds." + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +zpool_upgrade_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_003_pos.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_004_pos cleanup +zpool_upgrade_004_pos_head() +{ + atf_set "descr" "zpool upgrade -a works" + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +zpool_upgrade_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_004_pos.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_005_neg cleanup +zpool_upgrade_005_neg_head() +{ + atf_set "descr" "Variations of upgrade -v print usage message,return with non-zero status" + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +zpool_upgrade_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_005_neg.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_006_neg cleanup +zpool_upgrade_006_neg_head() +{ + atf_set "descr" "Attempting to upgrade a non-existent pool will return an error" + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +zpool_upgrade_006_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_006_neg.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_007_pos cleanup +zpool_upgrade_007_pos_head() +{ + atf_set "descr" "Import pools of all versions - 'zfs upgrade' on each pools works" + atf_set "require.progs" zpool + # This test can take quite a while, especially on debug builds + atf_set "timeout" 7200 +} +zpool_upgrade_007_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + atf_skip "PR 225877 - panic: solaris assert: newds == os->os_dsl_dataset during" + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_007_pos.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_008_pos cleanup +zpool_upgrade_008_pos_head() +{ + atf_set "descr" "Zpool upgrade should be able to upgrade pools to a given version using -V" + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +zpool_upgrade_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_008_pos.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_009_neg cleanup +zpool_upgrade_009_neg_head() +{ + atf_set "descr" "Zpool upgrade -V shouldn't be able to upgrade a pool to an unknown version" + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +zpool_upgrade_009_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_009_neg.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_upgrade.kshlib + . $(atf_get_srcdir)/zpool_upgrade.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_upgrade_001_pos + atf_add_test_case zpool_upgrade_002_pos + atf_add_test_case zpool_upgrade_003_pos + atf_add_test_case zpool_upgrade_004_pos + atf_add_test_case zpool_upgrade_005_neg + atf_add_test_case zpool_upgrade_006_neg + atf_add_test_case zpool_upgrade_007_pos + atf_add_test_case zpool_upgrade_008_pos + atf_add_test_case zpool_upgrade_009_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_user/Makefile b/tests/sys/cddl/zfs/tests/cli_user/Makefile new file mode 100644 index 00000000000..e992479ff20 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_user +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= cli.cfg +${PACKAGE}FILES+= cli_user.kshlib + +TESTS_SUBDIRS+= zpool_iostat +TESTS_SUBDIRS+= zpool_list +TESTS_SUBDIRS+= zfs_list +TESTS_SUBDIRS+= misc + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_user/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_user/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_user/cli.cfg b/tests/sys/cddl/zfs/tests/cli_user/cli.cfg new file mode 100644 index 00000000000..f1767ce27e8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/cli.cfg @@ -0,0 +1,36 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cli.cfg 1.3 08/08/15 SMI" +# + +export TESTSNAP=testsnap${TESTCASE_ID} +export TESTCLCT=testclct${TESTCASE_ID} +export TESTFILE0=testfile0.${TESTCASE_ID} +export TESTFILE1=testfile1.${TESTCASE_ID} +export UNPRIVILEGED_USER=`atf_config_get unprivileged_user` diff --git a/tests/sys/cddl/zfs/tests/cli_user/cli_user.kshlib b/tests/sys/cddl/zfs/tests/cli_user/cli_user.kshlib new file mode 100644 index 00000000000..7d85db1e8db --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/cli_user.kshlib @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. + +. $STF_SUITE/include/libtest.kshlib + +# Executes $@ without root privileges +function run_unprivileged +{ + echo "$@" | su -m "$UNPRIVILEGED_USER" +} diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/Makefile b/tests/sys/cddl/zfs/tests/cli_user/misc/Makefile new file mode 100644 index 00000000000..afed3c66b6f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/Makefile @@ -0,0 +1,59 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_user/misc +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= misc_test +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_rename_001_neg.ksh +${PACKAGE}FILES+= zpool_remove_001_neg.ksh +${PACKAGE}FILES+= zfs_destroy_001_neg.ksh +${PACKAGE}FILES+= zpool_import_001_neg.ksh +${PACKAGE}FILES+= zfs_unshare_001_neg.ksh +${PACKAGE}FILES+= zpool_export_001_neg.ksh +${PACKAGE}FILES+= zfs_set_001_neg.ksh +${PACKAGE}FILES+= zpool_upgrade_001_neg.ksh +${PACKAGE}FILES+= zpool_replace_001_neg.ksh +${PACKAGE}FILES+= misc.cfg +${PACKAGE}FILES+= zfs_receive_001_neg.ksh +${PACKAGE}FILES+= zpool_online_001_neg.ksh +${PACKAGE}FILES+= zpool_history_001_neg.ksh +${PACKAGE}FILES+= zpool_create_001_neg.ksh +${PACKAGE}FILES+= zpool_create_002_pos.ksh +${PACKAGE}FILES+= zfs_promote_001_neg.ksh +${PACKAGE}FILES+= zfs_get_001_neg.ksh +${PACKAGE}FILES+= zfs_share_001_neg.ksh +${PACKAGE}FILES+= zfs_rollback_001_neg.ksh +${PACKAGE}FILES+= zfs_unallow_001_neg.ksh +${PACKAGE}FILES+= zfs_send_001_neg.ksh +${PACKAGE}FILES+= zpool_clear_001_neg.ksh +${PACKAGE}FILES+= zpool_add_001_neg.ksh +${PACKAGE}FILES+= zpool_add_002_pos.ksh +${PACKAGE}FILES+= zpool_import_002_neg.ksh +${PACKAGE}FILES+= zpool_set_001_neg.ksh +${PACKAGE}FILES+= zfs_inherit_001_neg.ksh +${PACKAGE}FILES+= zfs_unmount_001_neg.ksh +${PACKAGE}FILES+= zpool_destroy_001_neg.ksh +${PACKAGE}FILES+= zpool_detach_001_neg.ksh +${PACKAGE}FILES+= zfs_create_001_neg.ksh +${PACKAGE}FILES+= zpool_attach_001_neg.ksh +${PACKAGE}FILES+= zpool_001_neg.ksh +${PACKAGE}FILES+= zdb_001_neg.ksh +${PACKAGE}FILES+= zfs_001_neg.ksh +${PACKAGE}FILES+= zfs_upgrade_001_neg.ksh +${PACKAGE}FILES+= zpool_scrub_001_neg.ksh +${PACKAGE}FILES+= zfs_mount_001_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_get_001_neg.ksh +${PACKAGE}FILES+= zfs_allow_001_neg.ksh +${PACKAGE}FILES+= zpool_offline_001_neg.ksh +${PACKAGE}FILES+= zfs_clone_001_neg.ksh +${PACKAGE}FILES+= zpool_status_001_neg.ksh +${PACKAGE}FILES+= zfs_snapshot_001_neg.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/cleanup.ksh new file mode 100644 index 00000000000..99608537328 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/cleanup.ksh @@ -0,0 +1,42 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +destroy_pool $TESTPOOL.virt +destroy_pool v1-pool + +if [[ -f $TMPDIR/zfstest_datastream.dat ]] +then + log_must $RM -f $TMPDIR/zfstest_datastream.dat +fi + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/misc.cfg b/tests/sys/cddl/zfs/tests/cli_user/misc/misc.cfg new file mode 100644 index 00000000000..1abeceab490 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/misc.cfg @@ -0,0 +1,72 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)misc.cfg 1.1 07/10/09 SMI" +# + +. $STF_SUITE/tests/cli_user/cli.cfg + + +# these are the set of setable ZFS properties +PROP_NAMES="\ + aclinherit aclmode atime \ + checksum compression devices \ + exec mountpoint quota readonly \ + recordsize reservation setuid shareiscsi \ + sharenfs snapdir " + +# these are a set of values we apply, for use when testing the +# zfs get/set subcommands - ordered as per the list above so we +# can iterate over both sets in an array +PROP_VALS="\ + secure discard on \ + fletcher2 on on \ + on legacy none on \ + 128k none on on \ + on visible " + +# these are an alternate set of property values +PROP_ALTVALS="\ + noallow groupmask off \ + fletcher4 lzjb off \ + off $TMPDIR/zfstest 100m off \ + 512 10m off off \ + off hidden " + + + +# additional properties to worry about: canmount copies xattr zoned version + +POOL_PROPS="\ + bootfs autoreplace" + +POOL_VALS="\ + $TESTPOOL/$TESTFS on" + +POOL_ALTVALS="\ + $TESTPOOL/$TESTFS/$TESTFS2 off" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/misc_test.sh b/tests/sys/cddl/zfs/tests/cli_user/misc/misc_test.sh new file mode 100755 index 00000000000..5b65ea2cfa1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/misc_test.sh @@ -0,0 +1,1174 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zdb_001_neg cleanup +zdb_001_neg_head() +{ + atf_set "descr" "zdb can't run as a user on datasets, but can run without arguments" + atf_set "require.progs" zfs fgrep zpool zdb + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zdb_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zdb_001_neg.ksh || atf_fail "Testcase failed" +} +zdb_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_001_neg cleanup +zfs_001_neg_head() +{ + atf_set "descr" "zfs shows a usage message when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_001_neg cleanup +zfs_allow_001_neg_head() +{ + atf_set "descr" "zfs allow returns an error when run as a user" + atf_set "require.progs" zfs fgrep logname zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_allow_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_allow_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_clone_001_neg cleanup +zfs_clone_001_neg_head() +{ + atf_set "descr" "zfs clone returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_clone_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_clone_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_clone_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_create_001_neg cleanup +zfs_create_001_neg_head() +{ + atf_set "descr" "Verify zfs create without parameters fails." + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_create_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_create_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_create_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_destroy_001_neg cleanup +zfs_destroy_001_neg_head() +{ + atf_set "descr" "zfs destroy [-f|-r] [fs|snap]" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_destroy_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_destroy_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_destroy_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_get_001_neg cleanup +zfs_get_001_neg_head() +{ + atf_set "descr" "zfs get works when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_get_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_get_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_get_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_inherit_001_neg cleanup +zfs_inherit_001_neg_head() +{ + atf_set "descr" "zfs inherit returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_inherit_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_inherit_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_inherit_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_mount_001_neg cleanup +zfs_mount_001_neg_head() +{ + atf_set "descr" "zfs mount returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_mount_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_mount_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_mount_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_promote_001_neg cleanup +zfs_promote_001_neg_head() +{ + atf_set "descr" "zfs promote returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_promote_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_promote_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_promote_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_receive_001_neg cleanup +zfs_receive_001_neg_head() +{ + atf_set "descr" "zfs receive returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_receive_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_receive_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_receive_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rename_001_neg cleanup +zfs_rename_001_neg_head() +{ + atf_set "descr" "zfs rename returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_rename_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rename_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_rename_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_rollback_001_neg cleanup +zfs_rollback_001_neg_head() +{ + atf_set "descr" "zfs rollback returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_rollback_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_rollback_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_rollback_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_send_001_neg cleanup +zfs_send_001_neg_head() +{ + atf_set "descr" "zfs send returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_send_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_send_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_send_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_set_001_neg cleanup +zfs_set_001_neg_head() +{ + atf_set "descr" "zfs set returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_set_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_set_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_set_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_share_001_neg cleanup +zfs_share_001_neg_head() +{ + atf_set "descr" "zfs share returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_share_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_share_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_share_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_snapshot_001_neg cleanup +zfs_snapshot_001_neg_head() +{ + atf_set "descr" "zfs snapshot returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_snapshot_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_snapshot_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_snapshot_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unallow_001_neg cleanup +zfs_unallow_001_neg_head() +{ + atf_set "descr" "zfs unallow returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_unallow_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_unallow_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unmount_001_neg cleanup +zfs_unmount_001_neg_head() +{ + atf_set "descr" "zfs u[n]mount [-f] [mountpoint|fs|snap]" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_unmount_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unmount_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_unmount_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unshare_001_neg cleanup +zfs_unshare_001_neg_head() +{ + atf_set "descr" "zfs unshare returns an error when run as a user" + atf_set "require.progs" zfs fgrep share zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_unshare_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unshare_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_unshare_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_upgrade_001_neg cleanup +zfs_upgrade_001_neg_head() +{ + atf_set "descr" "zfs upgrade returns an error when run as a user" + atf_set "require.progs" zfs fgrep zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zfs_upgrade_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_upgrade_001_neg.ksh || atf_fail "Testcase failed" +} +zfs_upgrade_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_001_neg cleanup +zpool_001_neg_head() +{ + atf_set "descr" "zpool shows a usage message when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_001_neg cleanup +zpool_add_001_neg_head() +{ + atf_set "descr" "zpool add [-fn] pool_name vdev" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_add_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_add_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_add_002_pos cleanup +zpool_add_002_pos_head() +{ + atf_set "descr" "zpool add [-f] -n succeeds for unpriveleged users" + atf_set "require.progs" zfs zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_add_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_add_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_add_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_attach_001_neg cleanup +zpool_attach_001_neg_head() +{ + atf_set "descr" "zpool attach returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_attach_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_attach_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_attach_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_clear_001_neg cleanup +zpool_clear_001_neg_head() +{ + atf_set "descr" "zpool clear returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_clear_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_clear_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_clear_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_create_001_neg +zpool_create_001_neg_head() +{ + atf_set "descr" "zpool create [-f] fails for unpriveleged users" + atf_set "require.progs" zfs zpool + atf_set "require.user" unprivileged +} +zpool_create_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/zpool_create_001_neg.ksh || atf_fail "Testcase failed" +} + + +atf_test_case zpool_create_002_pos +zpool_create_002_pos_head() +{ + atf_set "descr" "zpool create [-f] -n succeeds for unpriveleged users" + atf_set "require.progs" zfs zpool + atf_set "require.user" unprivileged +} +zpool_create_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/zpool_create_002_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case zpool_destroy_001_neg cleanup +zpool_destroy_001_neg_head() +{ + atf_set "descr" "zpool destroy [-f] [pool_name ...]" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_destroy_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_destroy_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_destroy_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_detach_001_neg cleanup +zpool_detach_001_neg_head() +{ + atf_set "descr" "zpool detach returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_detach_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_detach_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_detach_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_export_001_neg cleanup +zpool_export_001_neg_head() +{ + atf_set "descr" "zpool export returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_export_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_export_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_export_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_get_001_neg cleanup +zpool_get_001_neg_head() +{ + atf_set "descr" "zpool get works when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_get_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_get_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_get_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_history_001_neg cleanup +zpool_history_001_neg_head() +{ + atf_set "descr" "zpool history returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_history_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_history_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_history_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_001_neg cleanup +zpool_import_001_neg_head() +{ + atf_set "descr" "zpool import returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_import_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_import_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_import_002_neg cleanup +zpool_import_002_neg_head() +{ + atf_set "descr" "Executing 'zpool import' by regular user fails" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_import_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_import_002_neg.ksh || atf_fail "Testcase failed" +} +zpool_import_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_offline_001_neg cleanup +zpool_offline_001_neg_head() +{ + atf_set "descr" "zpool offline returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_offline_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_offline_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_offline_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_online_001_neg cleanup +zpool_online_001_neg_head() +{ + atf_set "descr" "zpool online returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_online_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_online_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_online_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_remove_001_neg cleanup +zpool_remove_001_neg_head() +{ + atf_set "descr" "zpool remove returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_remove_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_remove_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_remove_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_replace_001_neg cleanup +zpool_replace_001_neg_head() +{ + atf_set "descr" "zpool replace returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_replace_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_replace_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_replace_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_scrub_001_neg cleanup +zpool_scrub_001_neg_head() +{ + atf_set "descr" "zpool scrub returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_scrub_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_scrub_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_scrub_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_set_001_neg cleanup +zpool_set_001_neg_head() +{ + atf_set "descr" "zpool set returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_set_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_set_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_set_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_status_001_neg cleanup +zpool_status_001_neg_head() +{ + atf_set "descr" "zpool status works when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_status_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_status_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_status_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_upgrade_001_neg cleanup +zpool_upgrade_001_neg_head() +{ + atf_set "descr" "zpool upgrade returns an error when run as a user" + atf_set "require.progs" zfs zpool fgrep + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_upgrade_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_upgrade_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_upgrade_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zdb_001_neg + atf_add_test_case zfs_001_neg + atf_add_test_case zfs_allow_001_neg + atf_add_test_case zfs_clone_001_neg + atf_add_test_case zfs_create_001_neg + atf_add_test_case zfs_destroy_001_neg + atf_add_test_case zfs_get_001_neg + atf_add_test_case zfs_inherit_001_neg + atf_add_test_case zfs_mount_001_neg + atf_add_test_case zfs_promote_001_neg + atf_add_test_case zfs_receive_001_neg + atf_add_test_case zfs_rename_001_neg + atf_add_test_case zfs_rollback_001_neg + atf_add_test_case zfs_send_001_neg + atf_add_test_case zfs_set_001_neg + atf_add_test_case zfs_share_001_neg + atf_add_test_case zfs_snapshot_001_neg + atf_add_test_case zfs_unallow_001_neg + atf_add_test_case zfs_unmount_001_neg + atf_add_test_case zfs_unshare_001_neg + atf_add_test_case zfs_upgrade_001_neg + atf_add_test_case zpool_001_neg + atf_add_test_case zpool_add_001_neg + atf_add_test_case zpool_add_002_pos + atf_add_test_case zpool_attach_001_neg + atf_add_test_case zpool_clear_001_neg + atf_add_test_case zpool_create_001_neg + atf_add_test_case zpool_create_002_pos + atf_add_test_case zpool_destroy_001_neg + atf_add_test_case zpool_detach_001_neg + atf_add_test_case zpool_export_001_neg + atf_add_test_case zpool_get_001_neg + atf_add_test_case zpool_history_001_neg + atf_add_test_case zpool_import_001_neg + atf_add_test_case zpool_import_002_neg + atf_add_test_case zpool_offline_001_neg + atf_add_test_case zpool_online_001_neg + atf_add_test_case zpool_remove_001_neg + atf_add_test_case zpool_replace_001_neg + atf_add_test_case zpool_scrub_001_neg + atf_add_test_case zpool_set_001_neg + atf_add_test_case zpool_status_001_neg + atf_add_test_case zpool_upgrade_001_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/setup.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/setup.ksh new file mode 100644 index 00000000000..a9c02febadd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/setup.ksh @@ -0,0 +1,173 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# This setup script is moderately complex, as it creates scenarios for all +# of the tests included in this directory. Usually we'd want each test case +# to setup/teardown it's own configuration, but this would be time consuming +# given the nature of these tests. However, as a side-effect, one test +# leaving the system in an unknown state could impact other test cases. + + +DISK=${DISKS%% *} +VOLSIZE=150m +TESTVOL=testvol + +# Create a default setup that includes a volume +default_setup_noexit "$DISK" "" "volume" + +# +# The rest of this setup script creates a ZFS filesystem configuration +# that is used to test the rest of the zfs subcommands in this directory. +# + +# create a snapshot and a clone to test clone promote +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap +log_must $ZFS clone $TESTPOOL/$TESTFS@snap $TESTPOOL/$TESTFS/clone +# create a file in the filesystem that isn't in the above snapshot +$TOUCH /$TESTDIR/file.txt + + +# create a non-default property and a child we can use to test inherit +log_must $ZFS create $TESTPOOL/$TESTFS/$TESTFS2 +log_must $ZFS set snapdir=hidden $TESTPOOL/$TESTFS + + +# create an unmounted filesystem to test unmount +log_must $ZFS create $TESTPOOL/$TESTFS/$TESTFS2.unmounted +log_must $ZFS unmount $TESTPOOL/$TESTFS/$TESTFS2.unmounted + + +# send our snapshot to a known file in $TMPDIR +$ZFS send $TESTPOOL/$TESTFS@snap > $TMPDIR/zfstest_datastream.dat +if [ ! -s $TMPDIR/zfstest_datastream.dat ] +then + log_fail "Zfs send datafile was not created!" +fi +log_must $CHMOD 644 $TMPDIR/zfstest_datastream.dat + + +# create a filesystem that has particular properties to test set/get +log_must $ZFS create -o version=1 $TESTPOOL/$TESTFS/prop +set -A props $PROP_NAMES +set -A prop_vals $PROP_VALS +typeset -i i=0 + +while [[ $i -lt ${#props[*]} ]] +do + prop_name=${props[$i]} + prop_val=${prop_vals[$i]} + log_must $ZFS set $prop_name=$prop_val $TESTPOOL/$TESTFS/prop + i=$(( $i + 1 )) +done + + +# create a filesystem we don't mind renaming +log_must $ZFS create $TESTPOOL/$TESTFS/renameme + + +if is_global_zone +then + # create a filesystem we can share + log_must $ZFS create $TESTPOOL/$TESTFS/unshared + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS/unshared + + # create a filesystem that we can unshare + log_must $ZFS create $TESTPOOL/$TESTFS/shared + log_must $ZFS set sharenfs=on $TESTPOOL/$TESTFS/shared +fi + + +# check for upgrade support +$ZFS upgrade > /dev/null 2>&1 +HAS_UPGRADE=$? + +if [ $HAS_UPGRADE -eq 0 ] +then + log_must $ZFS create -o version=1 $TESTPOOL/$TESTFS/version1 +fi + +$ZFS 2>&1 | $GREP "allow" > /dev/null +if (( $? == 0 )); then + log_must $ZFS create -o version=1 $TESTPOOL/$TESTFS/allowed + log_must $ZFS allow everyone create $TESTPOOL/$TESTFS/allowed +fi + +if is_global_zone; then + # Now create several virtual disks to test zpool with + log_must create_vdevs \ + /$TESTDIR/disk1.dat \ + /$TESTDIR/disk2.dat \ + /$TESTDIR/disk3.dat \ + /$TESTDIR/disk-additional.dat \ + /$TESTDIR/disk-export.dat \ + /$TESTDIR/disk-offline.dat \ + /$TESTDIR/disk-spare1.dat \ + /$TESTDIR/disk-spare2.dat + + # and create a pool we can perform attach remove replace, + # etc. operations with + log_must $ZPOOL create $TESTPOOL.virt mirror /$TESTDIR/disk1.dat \ + /$TESTDIR/disk2.dat /$TESTDIR/disk3.dat /$TESTDIR/disk-offline.dat \ + spare /$TESTDIR/disk-spare1.dat + + # Offline one of the disks to test online + log_must $ZPOOL offline $TESTPOOL.virt /$TESTDIR/disk-offline.dat + + # create an exported pool to test import + log_must $ZPOOL create $TESTPOOL.exported /$TESTDIR/disk-export.dat + log_must $ZPOOL export $TESTPOOL.exported + + # Now setup pool properties if they're supported + GET=$($ZPOOL 2>&1 | $FGREP "get $TMPDIR/zdb.${TESTCASE_ID} + $GREP "Dataset mos" $TMPDIR/zdb.${TESTCASE_ID} + if [ $? -eq 0 ] + then + log_fail "$@ exited 0 when run as a non root user!" + fi + $RM $TMPDIR/zdb.${TESTCASE_ID} +} + + +function cleanup +{ + if [ -e $TMPDIR/zdb_001_neg.${TESTCASE_ID}.txt ] + then + $RM $TMPDIR/zdb_001_neg.${TESTCASE_ID}.txt + fi + +} + +verify_runnable "global" + +log_assert "zdb can't run as a user on datasets, but can run without arguments" +log_onexit cleanup + +run_unprivileged $ZDB > $TMPDIR/zdb_001_neg.${TESTCASE_ID}.txt || log_fail "$ZDB failed" +# verify the output looks okay +log_must $GREP pool_guid $TMPDIR/zdb_001_neg.${TESTCASE_ID}.txt + +# we shouldn't able to run it on any dataset +check_zdb $ZDB $TESTPOOL +check_zdb $ZDB $TESTPOOL/$TESTFS +check_zdb $ZDB $TESTPOOL/$TESTFS@snap +check_zdb $ZDB $TESTPOOL/$TESTFS.clone + +log_pass "zdb can't run as a user on datasets, but can run without arguments" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_001_neg.ksh new file mode 100644 index 00000000000..17d01651dad --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_001_neg.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_001_neg +# +# DESCRIPTION: +# +# zfs shows a usage message when run as a user +# +# STRATEGY: +# 1. Run zfs as a user +# 2. Verify it produces a usage message +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + if [ -e $TMPDIR/zfs_001_neg.${TESTCASE_ID}.txt ] + then + $RM $TMPDIR/zfs_001_neg.${TESTCASE_ID}.txt + fi +} + +log_onexit cleanup +log_assert "zfs shows a usage message when run as a user" + +run_unprivileged "$ZFS" > $TMPDIR/zfs_001_neg.${TESTCASE_ID}.txt 2>&1 +log_must $GREP "usage: zfs command args" $TMPDIR/zfs_001_neg.${TESTCASE_ID}.txt + +log_pass "zfs shows a usage message when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_allow_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_allow_001_neg.ksh new file mode 100644 index 00000000000..e45e48b385c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_allow_001_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_001_neg.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_allow_001_neg +# +# DESCRIPTION: +# +# zfs allow returns an error when run as a user +# +# STRATEGY: +# +# 1. Verify that trying to show allows works as a user +# 2. Verify that trying to set allows fails as a user +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +# check to see if we have zfs allow +$ZFS 2>&1 | $GREP "allow" > /dev/null +if (($? != 0)) then + log_unsupported "ZFS allow not supported on this machine." +fi + +log_assert "zfs allow returns an error when run as a user" + +log_must run_unprivileged "$ZFS allow $TESTPOOL/$TESTFS" +log_mustnot run_unprivileged "$ZFS allow `$LOGNAME` create $TESTPOOL/$TESTFS" + +# now verify that the above command actually did nothing by +# checking for any allow output. ( if no allows are granted, +# nothing should be output ) +OUTPUT=$(run_unprivileged "$ZFS allow $TESTPOOL/$TESTFS" | $GREP "Local+Descendent" ) +if [ -n "$OUTPUT" ] +then + log_fail "zfs allow permissions were granted on $TESTPOOL/$TESTFS" +fi + +log_pass "zfs allow returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_clone_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_clone_001_neg.ksh new file mode 100644 index 00000000000..eb643dc0bc7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_clone_001_neg.ksh @@ -0,0 +1,69 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_clone_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_clone_001_neg +# +# DESCRIPTION: +# +# zfs clone returns an error when run as a user +# +# STRATEGY: +# +# 1. Verify that we're unable to clone snapshots as a user +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs clone returns an error when run as a user" +log_mustnot run_unprivileged "$ZFS clone $TESTPOOL/$TESTFS@snap $TESTPOOL/$TESTFS.myclone" + +# check to see that the above command really did nothing +if datasetexists $TESTPOOL/$TESTFS.myclone +then + log_fail "Dataset $TESTPOOL/$TESTFS.myclone should not exist!" +fi +log_pass "zfs clone returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_create_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_create_001_neg.ksh new file mode 100644 index 00000000000..7e2065a0fe5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_create_001_neg.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_create_001_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_create_001_neg +# +# DESCRIPTION: +# Executing various badly formed 'zfs create' should fail. +# +# STRATEGY: +# 1. Create an array of badly formed sub-commands. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A args "" "create $TESTPOOL/$TESTFS" \ + "create $TESTPOOL/$TESTFS@$TESTSNAP" \ + "create $TESTPOOL/$TESTCLCT/$TESTFS" \ + "create $TESTFS/$TESTPOOL/$TESTCLCT" + +log_assert "Verify zfs create without parameters fails." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot run_unprivileged "$ZFS ${args[i]}" + ((i = i + 1)) +done + +log_pass "The sub-command 'create' fails as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_destroy_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_destroy_001_neg.ksh new file mode 100644 index 00000000000..b635042eeeb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_destroy_001_neg.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_destroy_001_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_cli_006_neg +# +# DESCRIPTION: +# Verify that 'zfs destroy' fails as non-root. +# +# STRATEGY: +# 1. Create an array of options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + + +set -A args "destroy" "destroy $TESTPOOL/$TESTFS" \ + "destroy -f" "destroy -f $TESTPOOL/$TESTFS" \ + "destroy -r" "destroy -r $TESTPOOL/$TESTFS" \ + "destroy -rf $TESTPOOL/$TESTFS" \ + "destroy -fr $TESTPOOL/$TESTFS" \ + "destroy $TESTPOOL/$TESTFS@$TESTSNAP" \ + "destroy -f $TESTPOOL/$TESTFS@$TESTSNAP" \ + "destroy -r $TESTPOOL/$TESTFS@$TESTSNAP" \ + "destroy -rf $TESTPOOL/$TESTFS@$TESTSNAP" \ + "destroy -fr $TESTPOOL/$TESTFS@$TESTSNAP" + +log_assert "zfs destroy [-f|-r] [fs|snap]" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot run_unprivileged "$ZFS ${args[i]}" + ((i = i + 1)) +done + +log_pass "The sub-command 'destroy' fails as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_get_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_get_001_neg.ksh new file mode 100644 index 00000000000..495e353a55c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_get_001_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_get_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_get_001_neg +# +# DESCRIPTION: +# +# zfs get works when run as a user +# +# STRATEGY: +# 1. Run zfs get with an array of different arguments +# 2. Verify for each property, we get the value that's expected +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs get works when run as a user" + +typeset -i i=0 + +set -A props $PROP_NAMES +set -A prop_vals $PROP_VALS + +while [[ $i -lt ${#args[*]} ]] +do + PROP=${props[$i]} + EXPECTED=${prop_vals[$i]} + ACTUAL=$( run_unprivileged "$ZFS get $PROP -o value -H snapdir $TESTPOOl/$TESTFS/prop" ) + if [ "$ACTUAL" != "$EXPECTED" ] + then + log_fail "Property $PROP value was $ACTUAL, expected $EXPECTED" + fi + i=$(( $i + 1 )) +done + +log_pass "zfs get works when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_inherit_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_inherit_001_neg.ksh new file mode 100644 index 00000000000..426a2a597ff --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_inherit_001_neg.ksh @@ -0,0 +1,71 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_inherit_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_inherit_001_neg +# +# DESCRIPTION: +# +# zfs inherit returns an error when run as a user +# +# STRATEGY: +# +# 1. Verify that we can't inherit a property when running as a user +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs inherit returns an error when run as a user" +log_mustnot run_unprivileged "$ZFS inherit snapdir $TESTPOOL/$TESTFS/$TESTFS2" + +# check to see that the above command really did nothing +PROP=$($ZFS get snapdir $TESTPOOL/$TESTFS) +if [ "$PROP" = "visible" ] +then + log_fail "snapdir property inherited from the $TESTPOOL/$TESTFS!" +fi + +log_pass "zfs inherit returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_mount_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_mount_001_neg.ksh new file mode 100644 index 00000000000..06263056e82 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_mount_001_neg.ksh @@ -0,0 +1,71 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_mount_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_mount_001_neg +# +# DESCRIPTION: +# +# zfs mount returns an error when run as a user +# +# STRATEGY: +# +# 1. Verify that we can't mount the unmounted filesystem created in setup +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs mount returns an error when run as a user" + +log_mustnot run_unprivileged "$ZFS mount $TESTPOOL/$TESTFS/$TESTFS2.unmounted" + +# now verify that the above command didn't do anything +MOUNTED=$($MOUNT | $GREP $TESTPOOL/$TESTFS/$TESTFS2.unmounted) +if [ -n "$MOUNTED" ] +then + log_fail "Filesystem $TESTPOOL/$TESTFS/$TESTFS2.unmounted was mounted!" +fi + +log_pass "zfs mount returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_promote_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_promote_001_neg.ksh new file mode 100644 index 00000000000..55f8a9f00f3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_promote_001_neg.ksh @@ -0,0 +1,71 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_promote_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_promote_001_neg +# +# DESCRIPTION: +# +# zfs promote returns an error when run as a user +# +# STRATEGY: +# +# 1. Verify we don't have permissions to promote a clone +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs promote returns an error when run as a user" + +log_mustnot run_unprivileged "$ZFS promote $TESTPOOL/$TESTFS/clone" + +# Now verify that the above command didn't do anything +if datasetexists $TESTPOOL/$TESTFS/clone@snap +then + log_fail "Clone $TESTPOOl/$TESTFS/clone was actually promoted!" +fi + +log_pass "zfs promote returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_receive_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_receive_001_neg.ksh new file mode 100644 index 00000000000..a9aba765a8d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_receive_001_neg.ksh @@ -0,0 +1,73 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_receive_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_receive_001_neg +# +# DESCRIPTION: +# +# zfs receive returns an error when run as a user +# +# STRATEGY: +# +# 1. Attempt to receive a datastream as a user +# 2. Verify that the dataset wasn't created +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs receive returns an error when run as a user" + +log_mustnot run_unprivileged "$ZFS receive -d $TESTPOOL/$TESTFS/$TESTFS2" \ + < $TMPDIR/zfstest_datastream.dat + +# verify that command actually did nothing + +if datasetexists $TESTPOOL/$TESTFS/$TESTFS2/$TESTFS +then + log_fail "$TESTPOOL/$TESTFS/$TESTFS2/$TESTFS was received!" +fi + +log_pass "zfs receive returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_rename_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_rename_001_neg.ksh new file mode 100644 index 00000000000..eb67f99c262 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_rename_001_neg.ksh @@ -0,0 +1,71 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rename_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rename_001_neg +# +# DESCRIPTION: +# +# zfs rename returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to rename a dataset +# 2. Verify that the renamed dataset does not exist. +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs rename returns an error when run as a user" + +log_mustnot run_unprivileged "$ZFS rename $TESTPOOL/$TESTFS/renameme $TESTPOOL/$TESTFS/renameme1" + +# now verify the above command didn't actually do anything +if datasetexists $TESTPOOL/$TESTFS/renameme1 +then + log_fail "The dataset $TESTPOOL/$TESTFS/renameme was renamed!" +fi + +log_pass "zfs rename returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_rollback_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_rollback_001_neg.ksh new file mode 100644 index 00000000000..fe181082404 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_rollback_001_neg.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_rollback_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_rollback_001_neg +# +# DESCRIPTION: +# +# zfs rollback returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to rollback a snapshot +# 2. Verify that a file which doesn't exist in the snapshot still exists +# (showing the snapshot rollback failed) +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs rollback returns an error when run as a user" + +log_mustnot run_unprivileged "$ZFS rollback $TESTPOOL/$TESTFS@snap" + +# now verify the above command didn't actually do anything + +# in the above filesystem there's a file that should not exist once +# the snapshot is rolled back - we check for it +if [ ! -e /$TESTDIR/file.txt ] +then + log_fail "Rollback of snapshot $TESTPOOL/$TESTFS@snap succeeded!" +fi + +log_pass "zfs rollback returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_send_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_send_001_neg.ksh new file mode 100644 index 00000000000..397ad25f421 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_send_001_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_send_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_send_001_neg +# +# DESCRIPTION: +# +# zfs send returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to send a dataset to a file +# 2. Verify the file created has zero-size +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + if [ -e $TMPDIR/zfstest_datastream.${TESTCASE_ID} ] + then + log_must $RM $TMPDIR/zfstest_datastream.${TESTCASE_ID} + fi +} + +log_assert "zfs send returns an error when run as a user" +log_onexit cleanup + +run_unprivileged "$ZFS send $TESTPOOL/$TESTFS@snap" > $TMPDIR/zfstest_datastream.${TESTCASE_ID} && log_fail "zfs send unexpectedly succeeded!" + +# Now check that the above command actually did nothing + +# We should have a non-zero-length file in $TMPDIR +if [ -s $TMPDIR/zfstest_datastream.${TESTCASE_ID} ] +then + log_fail "A zfs send file was created in $TMPDIR/zfstest_datastream.${TESTCASE_ID} !" +fi + +log_pass "zfs send returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_set_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_set_001_neg.ksh new file mode 100644 index 00000000000..bb9edddffdc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_set_001_neg.ksh @@ -0,0 +1,84 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_set_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_set_001_neg +# +# DESCRIPTION: +# +# zfs set returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to set an array of properties on a dataset +# 2. Verify that those properties were not set and retain their original values. +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs set returns an error when run as a user" + +typeset -i i=0 + +set -A props $PROP_NAMES +set -A prop_vals $PROP_VALS +set -A prop_new $PROP_ALTVALS + +while [[ $i -lt ${#args[*]} ]] +do + PROP=${props[$i]} + EXPECTED=${prop_vals[$i]} + NEW=${prop_new[$i]} + log_mustnot run_unprivileged "$ZFS set $PROP=$NEW $TESTPOOL/$TESTFS/prop" + + # Now verify that the above command did nothing + ACTUAL=$($ZFS get $PROP -o value -H snapdir $TESTPOOl/$TESTFS/prop ) + if [ "$ACTUAL" != "$EXPECTED" ] + then + log_fail "Property $PROP was set to $ACTUAL, expected $EXPECTED" + fi + i=$(( $i + 1 )) +done + +log_pass "zfs set returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_share_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_share_001_neg.ksh new file mode 100644 index 00000000000..f28ef6f1418 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_share_001_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_share_001_neg.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_share_001_neg +# +# DESCRIPTION: +# +# zfs share returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to share a dataset +# 2. Verify the dataset was not shared. +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zfs share returns an error when run as a user" + +if is_shared $TESTDIR/unshared +then + log_fail "$TESTPOOL/$TESTFS/unshared was incorrectly shared initially!" +fi + +log_mustnot run_unprivileged "$ZFS share $TESTPOOL/$TESTFS/unshared" + +# Now verify that the above command didn't actually do anything +if is_shared $TESTDIR/unshared +then + log_fail "$TESTPOOL/$TESTFS/unshared was actually shared!" +fi + +log_pass "zfs share returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_snapshot_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_snapshot_001_neg.ksh new file mode 100644 index 00000000000..98f0440a22b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_snapshot_001_neg.ksh @@ -0,0 +1,70 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_snapshot_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_snapshot_001_neg +# +# DESCRIPTION: +# +# zfs snapshot returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to snapshot a dataset +# 2. Verify the snapshot wasn't taken +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "zfs snapshot returns an error when run as a user" + +log_mustnot run_unprivileged "$ZFS snapshot $TESTPOOL/$TESTFS@usersnap1" + +# Now verify that the above command didn't actually do anything +if datasetexists $TESTPOOL/$TESTFS@usersnap1 +then + log_fail "Snapshot $TESTPOOL/$TESTFS@usersnap1 was taken !" +fi + +log_pass "zfs snapshot returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unallow_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unallow_001_neg.ksh new file mode 100644 index 00000000000..54849a5aa10 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unallow_001_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_001_neg.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_unallow_001_neg +# +# DESCRIPTION: +# +# zfs unallow returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to unallow a set of permissions +# 2. Verify the unallow wasn't performed +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +# check to see if we have zfs unallow +$ZFS 2>&1 | $GREP "unallow" > /dev/null +if (($? != 0)) then + log_unsupported "ZFS unallow not supported on this machine." +fi + +log_assert "zfs unallow returns an error when run as a user" + +log_mustnot run_unprivileged "$ZFS unallow everyone $TESTPOOL/$TESTFS/allowed" + +# now check with zfs allow to see if the permissions are still there +OUTPUT=$($ZFS allow $TESTPOOL/$TESTFS/allowed | $GREP "Local+Descendent" ) +if [ -z "$OUTPUT" ] +then + log_fail "Error - create permissions were unallowed on \ + $TESTPOOL/$TESTFS/allowed" +fi + +log_pass "zfs unallow returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unmount_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unmount_001_neg.ksh new file mode 100644 index 00000000000..0c2711153a9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unmount_001_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unmount_001_neg.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_unmount_001_neg +# +# DESCRIPTION: +# Verify that 'zfs umount' and its variants fail as non-root. +# +# STRATEGY: +# 1. Create an array of options. +# 2. Execute each element of the array. +# 3. Verify that the commands fail with an error code. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A args "umount" "umount -f" "unmount" "unmount -f" \ + "umount $TESTPOOL/$TESTFS" "umount -f $TESTPOOL/$TESTFS" \ + "unmount $TESTPOOL/$TESTFS" "unmount -f $TESTPOOL/$TESTFS" \ + "umount $TESTPOOL/$TESTFS@$TESTSNAP" \ + "umount -f $TESTPOOL/$TESTFS@$TESTSNAP" \ + "unmount $TESTPOOL/$TESTFS@$TESTSNAP" \ + "unmount -f $TESTPOOL/$TESTFS@$TESTSNAP" \ + "umount $TESTDIR" "umount -f $TESTDIR" \ + "unmount $TESTDIR" "unmount -f $TESTDIR" + +log_assert "zfs u[n]mount [-f] [mountpoint|fs|snap]" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot run_unprivileged "$ZFS ${args[i]}" + ((i = i + 1)) +done + +log_pass "The sub-command 'u[n]mount' fails as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unshare_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unshare_001_neg.ksh new file mode 100644 index 00000000000..168b0cc6b95 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_unshare_001_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unshare_001_neg.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_unshare_001_neg +# +# DESCRIPTION: +# +# zfs unshare returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to unshare a shared dataset +# 2. Verify the dataset is still shared +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zfs unshare returns an error when run as a user" + +# verify that the filesystem was shared initially +if not_shared $TESTDIR/shared +then + log_fail "$TESTPOOL/$TESTFS/shared was not shared initially at all!" +fi + +log_mustnot run_unprivileged "$ZFS unshare $TESTPOOL/$TESTFS/shared" + +# now verify that the above command didn't do anything +if not_shared $TESTDIR/shared +then + log_fail "$TESTPOOL/$TESTFS/shared was actually unshared!" +fi + +log_pass "zfs unshare returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_upgrade_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_upgrade_001_neg.ksh new file mode 100644 index 00000000000..392891e7305 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zfs_upgrade_001_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_upgrade_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_upgrade_001_neg +# +# DESCRIPTION: +# +# zfs upgrade returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to upgrade a version1 dataset +# 2. Verify the dataset wasn't upgraded +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +# check to see if we have upgrade capability +$ZFS upgrade > /dev/null 2>&1 +HAS_UPGRADE=$? +if [ $HAS_UPGRADE -ne 0 ] +then + log_unsupported "Zfs upgrade not supported" +fi + +log_assert "zfs upgrade returns an error when run as a user" + + +log_mustnot run_unprivileged "$ZFS upgrade $TESTPOOL/$TESTFS/version1" + +# now check to see the above command didn't do anything +VERSION=$($ZFS upgrade $TESTPOOL/$TESTFS/version1 2>&1 \ + | $GREP "already at this version") +if [ -n "$VERSION" ] +then + log_fail "A filesystem was upgraded!" +fi + +log_pass "zfs upgrade returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_001_neg.ksh new file mode 100644 index 00000000000..a4f636f5c4d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_001_neg.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_001_neg +# +# DESCRIPTION: +# +# zpool shows a usage message when run as a user +# +# STRATEGY: +# 1. Run the zpool command +# 2. Verify that a usage message is produced +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + if [ -e $TMPDIR/zpool_001_neg.${TESTCASE_ID}.txt ] + then + $RM $TMPDIR/zpool_001_neg.${TESTCASE_ID}.txt + fi +} + +log_onexit cleanup +log_assert "zpool shows a usage message when run as a user" + +run_unprivileged "$ZPOOL" > $TMPDIR/zpool_001_neg.${TESTCASE_ID}.txt 2>&1 +log_must $GREP "usage: zpool command args" $TMPDIR/zpool_001_neg.${TESTCASE_ID}.txt + +log_pass "zpool shows a usage message when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_add_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_add_001_neg.ksh new file mode 100644 index 00000000000..36b149799db --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_add_001_neg.ksh @@ -0,0 +1,72 @@ +#!/usr/local/bin/ksh93 -p + +# $FreeBSD$ + +# 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 http://www.opensolaris.org/os/licensing. +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_add_001_neg.ksh 1.4 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_add_001_neg +# +# DESCRIPTION: +# Verify that 'zpool add' fails as non-root. +# +# STRATEGY: +# 1. Create an array of options. +# 2. Execute each element of the array. +# 3. Verify that an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set_disks + +set -A args "add $TESTPOOL $DISK1" "add -f $TESTPOOL $DISK1" + +log_assert "zpool add [-fn] pool_name vdev" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot run_unprivileged "$ZPOOL ${args[i]}" + ((i = i + 1)) +done + +log_pass "The sub-command 'add' and its options fail as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_add_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_add_002_pos.ksh new file mode 100644 index 00000000000..a3d4bab2c08 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_add_002_pos.ksh @@ -0,0 +1,45 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2014 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + + +set_disks + +set -A args "add -n $TESTPOOL $DISK1" "add -fn $TESTPOOL $DISK1" + +log_assert "zpool add [-f] -n succeeds for unpriveleged users" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_must run_unprivileged "$ZPOOL ${args[i]}" + ((i = i + 1)) +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_attach_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_attach_001_neg.ksh new file mode 100644 index 00000000000..72dcbf4dcbb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_attach_001_neg.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_attach_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_attach_001_neg +# +# DESCRIPTION: +# +# zpool attach returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to attach a disk to a pool +# 2.Verify that the attach failed +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function check_for_attach +{ + RESULT=$($ZPOOL status -v $TESTPOOL.virt | $GREP disk-additional.dat) + if [ -n "$RESULT" ] + then + log_fail "A disk was attached to the pool!" + fi +} + +verify_runnable "global" + +log_assert "zpool attach returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL attach $TESTPOOL.virt /$TESTDIR/disk1.dat /$TESTDIR/disk-additional.dat" +check_for_attach + +log_mustnot run_unprivileged "$ZPOOL attach -f $TESTPOOL.virt /$TESTDIR/disk1.dat /$TESTDIR/disk-additional.dat" +check_for_attach + +log_pass "zpool attach returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_clear_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_clear_001_neg.ksh new file mode 100644 index 00000000000..4f3b575794f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_clear_001_neg.ksh @@ -0,0 +1,66 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_clear_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_clear_001_neg +# +# DESCRIPTION: +# +# zpool clear returns an error when run as a user +# +# STRATEGY: +# +# 1. Attempt to clear errors on a zpool +# 2. Verify that the command fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool clear returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL clear $TESTPOOL" + +log_pass "zpool clear returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_create_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_create_001_neg.ksh new file mode 100644 index 00000000000..7b65141af13 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_create_001_neg.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_create_001_neg.ksh 1.4 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_create_001_neg +# +# DESCRIPTION: +# Verify that 'zpool create' fails as a non-root user. +# +# STRATEGY: +# 1. Create an array of options. +# 2. Execute each element of the array. +# 3. Verify that an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +ADD_DISK="${DISKS%% }" +ADD_DISK="${ADD_DISK##* }" + +[[ -z $ADD_DISK ]] && \ + log_fail "No spare disks available." + +set -A args "create $TESTPOOL $ADD_DISK" "create -f $TESTPOOL $ADD_DISK" + +log_assert "zpool create [-fn] pool_name vdev" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL ${args[i]} + ((i = i + 1)) +done + +log_pass "The sub-command 'create' and its options fail as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_create_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_create_002_pos.ksh new file mode 100644 index 00000000000..9cdb6844540 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_create_002_pos.ksh @@ -0,0 +1,44 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2014 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% } +DISK=${DISKS##* } + +set -A args "create -n $TESTPOOL $DISK" "create -fn $TESTPOOL $DISK" + +log_assert "zpool create [-f] -n as an unpriveleged user succeeds" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_must $ZPOOL ${args[i]} + ((i = i + 1)) +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_destroy_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_destroy_001_neg.ksh new file mode 100644 index 00000000000..cbcc7ba33b9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_destroy_001_neg.ksh @@ -0,0 +1,72 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_destroy_001_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_destroy_001_neg +# +# DESCRIPTION: +# Verify that 'zpool destroy' fails as non-root. +# +# STRATEGY: +# 1. Create an array of options. +# 2. Execute each element of the array. +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A args "destroy" "destroy -f" \ + "destroy $TESTPOOL" "destroy -f $TESTPOOL" \ + "destroy $TESTPOOL $TESTPOOL" + +log_assert "zpool destroy [-f] [pool_name ...]" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot run_unprivileged "$ZPOOL ${args[i]}" + ((i = i + 1)) +done + +log_pass "The sub-command 'destroy' and its options fail as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_detach_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_detach_001_neg.ksh new file mode 100644 index 00000000000..140e1c17380 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_detach_001_neg.ksh @@ -0,0 +1,72 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_detach_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_detach_001_neg +# +# DESCRIPTION: +# +# zpool detach returns an error when run as a user +# +# STRATEGY: +# +# 1. Attempt to detach a device from a pool +# 2. Verify the command fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool detach returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL detach $TESTPOOL.virt /$TESTDIR/disk1.dat" + +RESULT=$($ZPOOL status -v $TESTPOOL.virt | $GREP disk1.dat) +if [ -z "$RESULT" ] +then + log_fail "A disk was detached from the pool!" +fi + +log_pass "zpool detach returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_export_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_export_001_neg.ksh new file mode 100644 index 00000000000..8e6ee218d15 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_export_001_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_export_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_export_001_neg +# +# DESCRIPTION: +# +# zpool export returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to export a pool +# 2. Verify the command fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function check_for_export +{ + RESULT=$($ZPOOL list | $GREP $TESTPOOL.virt ) + if [ -z "$RESULT" ] + then + log_fail "A pool was exported!" + fi + +} + +verify_runnable "global" + +log_assert "zpool export returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL export $TESTPOOL.virt" +check_for_export + +log_mustnot run_unprivileged "$ZPOOL export -f $TESTPOOL.virt" +check_for_export + +log_pass "zpool export returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_get_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_get_001_neg.ksh new file mode 100644 index 00000000000..2f0c865a1e1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_get_001_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_get_001_neg.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_get_001_neg +# +# DESCRIPTION: +# +# zpool get works when run as a user +# +# STRATEGY: +# +# 1. For each property, get that property +# 2. Verify the property was the same as that set in setup +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool get works when run as a user" + +set -A props $POOL_PROPS +set -A prop_vals $POOL_VALS + +while [[ $i -lt ${#args[*]} ]] +do + PROP=${props[$i]} + EXPECTED=${prop_vals[$i]} + ACTUAL=$( $ZPOOL get $PROP $TESTPOOL | $GREP $PROP | $AWK '{print $1}' ) + if [ "$ACTUAL" != "$EXPECTED" ] + then + log_fail "Property $PROP value was $ACTUAL, expected $EXPECTED" + fi + i=$(( $i + 1 )) +done + +log_must run_unprivileged "$ZPOOL get all $TESTPOOL" + +log_pass "zpool get works when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_history_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_history_001_neg.ksh new file mode 100644 index 00000000000..996001644ab --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_history_001_neg.ksh @@ -0,0 +1,68 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_history_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_history_001_neg +# +# DESCRIPTION: +# +# zpool history works when run as a user +# +# STRATEGY: +# 1. Attempt to get history on a test pool +# 2. Verify the command fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool history returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL history" +log_mustnot run_unprivileged "$ZPOOL history $TESTPOOL" +log_mustnot run_unprivileged "$ZPOOL history -i $TESTPOOL" +log_mustnot run_unprivileged "$ZPOOL history -l $TESTPOOL" +log_mustnot run_unprivileged "$ZPOOL history -il $TESTPOOL" +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_import_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_import_001_neg.ksh new file mode 100644 index 00000000000..ca1b972b0de --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_import_001_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_001_neg +# +# DESCRIPTION: +# +# zpool import returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to import an exported pool +# 2. Verify the command fails +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function check_for_import +{ + RESULT=$($ZPOOL list -H -o name | $GREP $TESTPOOL.exported) + if [ -n "$RESULT" ] + then + log_fail "Pool $TESTPOOL.export was successfully imported!" + fi +} + +verify_runnable "global" + +log_assert "zpool import returns an error when run as a user" +log_mustnot run_unprivileged "$ZPOOL import" + +log_mustnot run_unprivileged "$ZPOOL import -a" +check_for_import + +log_mustnot run_unprivileged "$ZPOOL import -d /$TESTDIR $TESTPOOL.exported" +check_for_import + +log_pass "zpool import returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_import_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_import_002_neg.ksh new file mode 100644 index 00000000000..b18e5d3f8ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_import_002_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_import_002_neg.ksh 1.1 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_import_002_neg +# +# DESCRIPTION: +# Executing 'zpool import' as regular user should denied. +# +# STRATEGY: +# 1. Create an array of options try to detect exported/destroyed pools. +# 2. Execute 'zpool import' with each element of the array by regular user. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +typeset testpool +if is_global_zone ; then + testpool=$TESTPOOL.exported +else + testpool=${TESTPOOL%%/*} +fi + +set -A args "" "-D" "-Df" "-f" "-f $TESTPOOL" "-Df $TESTPOOL" "-a" + +log_assert "Executing 'zpool import' by regular user fails" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot run_unprivileged "$ZPOOL import ${args[i]}" + ((i = i + 1)) +done + +log_pass "Executing 'zpool import' by regular user fails as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_offline_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_offline_001_neg.ksh new file mode 100644 index 00000000000..69892338702 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_offline_001_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_offline_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_offline_001_neg +# +# DESCRIPTION: +# +# zpool offline returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to offline a device in a pool +# 2. Verify that the command fails +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function check_for_offline +{ + RESULT=$($ZPOOL status -v $TESTPOOL.virt | $GREP disk-1.dat \ + | $GREP OFFLINE ) + if [ -n "$RESULT" ] + then + log_fail "A disk was taken offline!" + fi +} + +verify_runnable "global" + +log_assert "zpool offline returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL offline $TESTPOOL.virt /$TESTDIR/disk-1.dat" +check_for_offline + +log_mustnot run_unprivileged "$ZPOOL offline -t $TESTPOOL.virt /$TESTDIR/disk-1.dat" +check_for_offline + +log_pass "zpool offline returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_online_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_online_001_neg.ksh new file mode 100644 index 00000000000..58742687bde --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_online_001_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_online_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_online_001_neg +# +# DESCRIPTION: +# +# zpool online returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to online a device in a pool +# 2. Verify the command fails +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function check_for_online +{ + RESULT=$($ZPOOL status -v $TESTPOOL.virt | $GREP disk-offline.dat \ + | $GREP ONLINE ) + if [ -n "$RESULT" ] + then + log_fail "A disk was brough online!" + fi +} + +verify_runnable "global" + +log_assert "zpool online returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL online $TESTPOOL.virt /$TESTDIR/disk-offline.dat" +check_for_online + +log_mustnot run_unprivileged "$ZPOOL online -t $TESTPOOL.virt /$TESTDIR/disk-offline.dat" +check_for_online + +log_pass "zpool online returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_remove_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_remove_001_neg.ksh new file mode 100644 index 00000000000..5caf8108a44 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_remove_001_neg.ksh @@ -0,0 +1,73 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_remove_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_remove_001_neg +# +# DESCRIPTION: +# +# zpool remove returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to remove a device from a pool +# 2. Verify the command fails +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool remove returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL remove $TESTPOOL.virt /$TESTDIR/disk-spare1.dat" + +RESULT=$($ZPOOL status -v $TESTPOOL.virt | $GREP disk-spare1.dat) +if [ -z "$RESULT" ] +then + log_fail "A disk was removed from the pool!" +fi + + +log_pass "zpool remove returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_replace_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_replace_001_neg.ksh new file mode 100644 index 00000000000..58e9581f8bb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_replace_001_neg.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_replace_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_replace_001_neg +# +# DESCRIPTION: +# +# zpool replace returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to replace a device in a pool +# 2. Verify the command fails +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +function check_for_replace +{ + $SLEEP 10 + RESULT=$($ZPOOL status -v $TESTPOOL.virt | $GREP disk-additional.dat) + if [ -n "$RESULT" ] + then + log_fail "A disk was replaced in the pool!" + fi +} + +verify_runnable "global" + +log_assert "zpool replace returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL replace $TESTPOOL.virt /$TESTDIR/disk-1.dat /$TESTDIR/disk-additional.dat" +check_for_replace + +log_mustnot run_unprivileged "$ZPOOL replace -f $TESTPOOL.virt /$TESTDIR/disk-1.dat /$TESTDIR/disk-additional.dat" +check_for_replace + +log_pass "zpool replace returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_scrub_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_scrub_001_neg.ksh new file mode 100644 index 00000000000..2ad46b524d9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_scrub_001_neg.ksh @@ -0,0 +1,67 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_scrub_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_scrub_001_neg +# +# DESCRIPTION: +# +# zpool scrub returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to start a scrub on a pool +# 2. Verify the command fails +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool scrub returns an error when run as a user" + +log_mustnot run_unprivileged "$ZPOOL scrub $TESTPOOL" +log_mustnot run_unprivileged "$ZPOOL scrub -s $TESTPOOL" + +log_pass "zpool scrub returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_set_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_set_001_neg.ksh new file mode 100644 index 00000000000..5714b771602 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_set_001_neg.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_set_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_set_001_neg +# +# DESCRIPTION: +# +# zpool set returns an error when run as a user +# +# STRATEGY: +# 1. Attempt to set some properties on a pool +# 2. Verify the command fails +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool set returns an error when run as a user" + +set -A props $POOL_NAMES +set -A prop_vals $POOL_VALS +set -A prop_new $POOL_ALTVALS + +while [[ $i -lt ${#args[*]} ]] +do + PROP=${props[$i]} + EXPECTED=${prop_vals[$i]} + NEW=${prop_new[$i]} + log_mustnot run_unprivileged "$ZPOOL set $PROP=$NEW $TESTPOOL" + + # Now verify that the above command did nothing + ACTUAL=$( $ZPOOL get $PROP $TESTPOOL | $GREP $PROP | $AWK '{print $1}' ) + if [ "$ACTUAL" != "$EXPECTED" ] + then + log_fail "Property $PROP was set to $ACTUAL, expected $EXPECTED" + fi + i=$(( $i + 1 )) +done + + +log_pass "zpool set returns an error when run as a user" diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_status_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_status_001_neg.ksh new file mode 100644 index 00000000000..7601ed179a4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_status_001_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_status_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_status_001_neg +# +# DESCRIPTION: +# +# zpool status works when run as a user +# +# STRATEGY: +# +# 1. Run zpool status as a user +# 2. Verify we get output +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool status works when run as a user" + +log_must run_unprivileged "$ZPOOL status" | $GREP -q "pool:" || \ + log_fail "No Pool: string found in zpool status output" +log_must run_unprivileged "$ZPOOL status -v" | $GREP -q "pool:" || \ + log_fail "No Pool: string found in zpool status output" +log_must run_unprivileged "$ZPOOL status $TESTPOOL" | $GREP -q "pool:" || \ + log_fail "No Pool: string found in zpool status output" +log_must run_unprivileged "$ZPOOL status -v $TESTPOOL" | $GREP -q "pool:" || \ + log_fail "No Pool: string found in zpool status output" + +# $TESTPOOL.virt has an offline device, so -x will show it +log_must run_unprivileged "$ZPOOL status -x $TESTPOOL.virt" | \ + $GREP -q "pool:" || \ + log_fail "No Pool: string found in zpool status output" + +log_pass "zpool status works when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_upgrade_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_upgrade_001_neg.ksh new file mode 100644 index 00000000000..a53f194ebe8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/misc/zpool_upgrade_001_neg.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_upgrade_001_neg.ksh 1.1 07/10/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_upgrade_001_neg +# +# DESCRIPTION: +# +# zpool upgrade returns an error when run as a user +# +# STRATEGY: +# +# 1. Attempt to upgrade a pool +# 2. Verify the command fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool upgrade returns an error when run as a user" + +log_onexit cleanup +# zpool upgrade returns 0 when it can't do anything +log_must run_unprivileged "$ZPOOL upgrade $TESTPOOL.virt" + +# Now try to upgrade our version 1 pool +log_mustnot run_unprivileged "$ZPOOL upgrade v1-pool" + +# if the pool has been upgraded, then v1-pool won't be listed in the output +# of zpool upgrade anymore +RESULT=$($ZPOOL upgrade | $GREP v1-pool) +if [ -z "$RESULT" ] +then + log_fail "A pool was upgraded successfully!" +fi + +log_pass "zpool upgrade returns an error when run as a user" + diff --git a/tests/sys/cddl/zfs/tests/cli_user/setup.ksh b/tests/sys/cddl/zfs/tests/cli_user/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/Makefile b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/Makefile new file mode 100644 index 00000000000..6c046f21d9a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/Makefile @@ -0,0 +1,26 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_user/zfs_list +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_list_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zfs_list_006_pos.ksh +${PACKAGE}FILES+= zfs_list_002_pos.ksh +${PACKAGE}FILES+= zfs_list_007_pos.ksh +${PACKAGE}FILES+= zfs_list_003_pos.ksh +${PACKAGE}FILES+= zfs_list.cfg +${PACKAGE}FILES+= zfs_list_005_pos.ksh +${PACKAGE}FILES+= zfs_list_001_pos.ksh +${PACKAGE}FILES+= zfs_list.kshlib +${PACKAGE}FILES+= zfs_list_008_neg.ksh +${PACKAGE}FILES+= zfs_list_004_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/cleanup.ksh new file mode 100644 index 00000000000..6a5500c9ab0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/cleanup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.6 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/setup.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/setup.ksh new file mode 100644 index 00000000000..6cb25b2f820 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/setup.ksh @@ -0,0 +1,76 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.6 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib + +DISK=${DISKS%% *} + +default_setup_noexit $DISK + +# create datasets and set checksum options +set -A cksumarray $CKSUMOPTS +typeset -i index=0 +for dataset in $DATASETS +do + log_must $ZFS create $TESTPOOL/$TESTFS/$dataset + enc=$(get_prop encryption $TESTPOOL/$TESTFS/$dataset) + if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + log_unsupported "checksum property can't be changed \ +when encryption is set to on." + fi + $SLEEP 1 + log_must $ZFS snapshot $TESTPOOL/$TESTFS/${dataset}@snap + + $SLEEP 1 + if is_global_zone ; then + log_must $ZFS create -V 64M $TESTPOOL/$TESTFS/${dataset}-vol + $SLEEP 1 + log_must $ZFS snapshot $TESTPOOL/$TESTFS/${dataset}-vol@snap + fi + + # sleep to ensure that the datasets have different creation dates + $SLEEP 1 + log_must $ZFS set checksum=${cksumarray[$index]} \ + $TESTPOOL/$TESTFS/$dataset + if datasetexists $TESTPOOL/$TESTFS/${dataset}-vol; then + log_must $ZFS set checksum=${cksumarray[$index]} \ + $TESTPOOL/$TESTFS/${dataset}-vol + fi + + index=$((index + 1)) +done + +if zfs_get_list_d_supported ; then + depth_fs_setup +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list.cfg b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list.cfg new file mode 100644 index 00000000000..e8c07f27086 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list.cfg @@ -0,0 +1,40 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list.cfg 1.3 07/06/05 SMI" +# + +. $STF_SUITE/tests/cli_user/cli.cfg + +# Datasets (in order of creation date) and which checksum options +# we want to set for each dataset. +# These are used by various zfs list tests +export DATASETS="Apple Banana Carrot Orange apple banana carrot" +export CKSUMOPTS="on sha256 sha256 sha256 fletcher4 off fletcher2" + + diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list.kshlib b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list.kshlib new file mode 100644 index 00000000000..6e779a3f76e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list.kshlib @@ -0,0 +1,119 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list.kshlib 1.1 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# A function that verifies sort order. It takes as input +# a command, which gets executed. We then iterate over the results +# comparing that the sort order passed in via the list +# +function verify_sort { # command list name + + # now verify we've sorted by creation date: + typeset CMD=$1 + typeset list=$2 + typeset name=$3 + + typeset -i RET=0 + typeset -i index=1 + + # run the command to verify that it works + log_must eval "$CMD > /dev/null" + + # Now check the sort order + for dataset in $( $CMD ) + do + ACTUAL=$(basename $dataset) + if [ "$dataset" != "$TESTPOOL/$TESTFS" ] + then + EXPECTED=$($ECHO $list | $AWK "{print \$$index}") + if [ "$ACTUAL" != "$EXPECTED" ] + then + log_note "WARNING:" \ + "'$ACTUAL' does not equal '$EXPECTED'" + log_fail "ERROR: Sort by $name fails." + fi + + ((index = index + 1)) + fi + done + + # finally check to see if we have the expected number of elements + if [ $index -ne $($ECHO $list | $AWK '{print split($0,arr)+1}') ] + then + log_fail "Warning: " \ + "unexpected number of filesystems found in list output!" + fi +} + +# A function that verifies reverse sort order. It takes as input +# a command, which gets executed. We then iterate over the results +# comparing that the sort order passed in via the list +# +function verify_reverse_sort { # command list name + + typeset CMD=$1 + typeset list=$2 + typeset name=$3 + + # set our index to the be number of elements in the list + typeset -i index=$($ECHO $list | $AWK '{print split($0,arr)}') + + log_note "Checking reverse sort by '$name'," \ + "expecting the reverse of '$list'" + log_must eval "$CMD > /dev/null" + + for dataset in $( $CMD ) + do + ACTUAL=$(basename $dataset) + if [ "$dataset" != "$TESTPOOL/$TESTFS" ] + then + EXPECTED=$($ECHO $list | $AWK "{print \$$index}") + if [ "$ACTUAL" != "$EXPECTED" ] + then + log_note "Warning:" \ + "'$ACTUAL' does not equal to" \ + "the reverse of '$EXPECTED'" + log_fail "ERROR: Reverse sort by '$name' fails." + fi + + ((index = index - 1)) + fi + done + + # finally check to see if we have the expected number of elements + if [ $index -ne 0 ] + then + log_fail "Warning: " \ + "unexpected number of filesystems found in list output!" + fi +} diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_001_pos.ksh new file mode 100644 index 00000000000..46d43672f3a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_001_pos.ksh @@ -0,0 +1,134 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list_001_pos.ksh 1.5 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_list_001_pos +# +# DESCRIPTION: +# Executing well-formed 'zfs list' commands should return success. +# +# STRATEGY: +# 1. Create an array of valid options. +# 2. Execute each element in the array. +# 3. Verify success is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A args "list" "list -r" "list -H" \ + "list $TESTPOOL/$TESTFS" \ + "list -r $TESTPOOL/$TESTFS" "list -H $TESTPOOL/$TESTFS" \ + "list -rH $TESTPOOL/$TESTFS" "list -Hr $TESTPOOL/$TESTFS" \ + "list -o name $TESTPOOL/$TESTFS" "list -r -o name $TESTPOOL/$TESTFS" \ + "list -H -o name $TESTPOOL/$TESTFS" "list -rH -o name $TESTPOOL/$TESTFS" \ + "list -Hr -o name $TESTPOOL/$TESTFS" + +if zfs_get_list_d_supported ; then + set -A d_args " " "-r" "-H" \ + "$TESTPOOL/$TESTFS" \ + "-r $TESTPOOL/$TESTFS" "-H $TESTPOOL/$TESTFS" \ + "-rH $TESTPOOL/$TESTFS" "-Hr $TESTPOOL/$TESTFS" \ + "-o name $TESTPOOL/$TESTFS" "-r -o name $TESTPOOL/$TESTFS" \ + "-H -o name $TESTPOOL/$TESTFS" "-rH -o name $TESTPOOL/$TESTFS" \ + "-Hr -o name $TESTPOOL/$TESTFS" + + typeset -i m=${#args[*]} + typeset -i n=0 + typeset -i k=0 + while (( n<${#depth_options[*]} )); + do + (( k=0 )) + while (( k<${#d_args[*]} )); + do + args[$m]="list"" -${depth_options[$n]}"" ${d_args[$k]}" + (( k+=1 )) + (( m+=1 )) + done + (( n+=1 )) + done +fi + +set -A pathargs "list -r $TESTDIR" "list -H $TESTDIR" \ + "list -r ./../$TESTDIR" "list -H ./../$TESTDIR" + +if zfs_get_list_d_supported ; then +set -A d_pathargs " $TESTDIR" "-r $TESTDIR" "-H $TESTDIR" \ + "-r ./../$TESTDIR" "-H ./../$TESTDIR" + + (( m=${#pathargs[*]} )) + (( n=0 )) + (( k=0 )) + while (( n<${#depth_options[*]} )); + do + (( k=0 )) + while (( k<${#d_pathargs[*]} )); + do + pathargs[$m]="list"" -${depth_options[$n]}"" ${d_pathargs[$k]}" + (( k+=1 )) + (( m+=1 )) + done + (( n+=1 )) + done +fi + +log_assert "Verify 'zfs list [-rH] [-o property[,prop]*] [fs|clct|vol]'." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_must run_unprivileged "eval $ZFS ${args[i]} > /dev/null" + ((i = i + 1)) +done + +# Verify 'zfs list ' will succeed on absolute or relative path. + +cd /tmp +typeset -i i=0 +while [[ $i -lt ${#pathargs[*]} ]]; do + log_must run_unprivileged "eval $ZFS ${pathargs[i]} > /dev/null" + ((i = i + 1)) +done + +log_pass "The sub-command 'list' succeeds as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_002_pos.ksh new file mode 100644 index 00000000000..95d04e2194a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_002_pos.ksh @@ -0,0 +1,190 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list_002_pos.ksh 1.6 08/11/03 SMI" +# +. $STF_SUITE/tests/cli_user/zfs_list/zfs_list.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_list_002_pos +# +# DESCRIPTION: +# The sort functionality in 'zfs list' works as expected. +# +# STRATEGY: +# 1. Using several zfs datasets with names, creation dates, checksum options +# 2. Sort the datasets by name, checksum options, creation date. +# 3. Verify that the datasets are sorted correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-08) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# datasets ordered by name +fs_name="Apple Banana Carrot Orange apple banana carrot" +vol_name="Apple-vol Banana-vol Carrot-vol Orange-vol apple-vol" +vol_name="$vol_name banana-vol carrot-vol" +if is_global_zone ; then + snap_name="Apple-vol@snap Apple@snap Banana-vol@snap Banana@snap" + snap_name="$snap_name Carrot-vol@snap Carrot@snap Orange-vol@snap Orange@snap" + snap_name="$snap_name apple-vol@snap apple@snap banana-vol@snap banana@snap" + snap_name="$snap_name carrot-vol@snap carrot@snap" +else + snap_name="Apple@snap Banana@snap" + snap_name="$snap_name Carrot@snap Orange@snap" + snap_name="$snap_name apple@snap banana@snap" + snap_name="$snap_name carrot@snap" +fi + +fs_creation=$fs_name +vol_creation=$vol_name +if is_global_zone ; then + snap_creation="Apple@snap Apple-vol@snap Banana@snap Banana-vol@snap" + snap_creation="$snap_creation Carrot@snap Carrot-vol@snap Orange@snap Orange-vol@snap" + snap_creation="$snap_creation apple@snap apple-vol@snap banana@snap banana-vol@snap" + snap_creation="$snap_creation carrot@snap carrot-vol@snap" +else + snap_creation="Apple@snap Banana@snap" + snap_creation="$snap_creation Carrot@snap Orange@snap" + snap_creation="$snap_creation apple@snap banana@snap" + snap_creation="$snap_creation carrot@snap" +fi + +# +# datsets ordered by checksum options (note, Orange, Carrot & Banana have the +# same checksum options, so ZFS should revert to sorting them alphabetically by +# name) +# +fs_cksum="carrot apple banana Apple Banana Carrot Orange" +vol_cksum="carrot-vol apple-vol banana-vol Apple-vol Banana-vol" +vol_cksum="$vol_cksum Carrot-vol Orange-vol" +snap_cksum=$snap_creation + +fs_rev_cksum="carrot apple banana Apple Orange Carrot Banana" +vol_rev_cksum="carrot-vol apple-vol banana-vol Apple-vol Orange-vol" +vol_rev_cksum="$vol_rev_cksum Carrot-vol Banana-vol" + +log_assert "The sort functionality in 'zfs list' works as expected." + +# +# we must be in the C locale here, as running in other locales +# will make zfs use that locale's sort order. +# +LC_ALL=C; export LC_ALL + +# sort by creation +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s creation -t filesystem $TESTPOOL/$TESTFS" \ + "$fs_creation" "creation date" +if is_global_zone ; then + verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s creation -t volume $TESTPOOL/$TESTFS" \ + "$vol_creation" "creation date" +fi +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s creation -t snapshot $TESTPOOL/$TESTFS" \ + "$snap_creation" "creation date" + +# sort by checksum +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s checksum -t filesystem $TESTPOOL/$TESTFS" \ + "$fs_cksum" "checksum" +if is_global_zone ; then + verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s checksum -t volume $TESTPOOL/$TESTFS" \ + "$vol_cksum" "checksum" +fi +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s checksum -t snapshot $TESTPOOL/$TESTFS" \ + "$snap_cksum" "checksum" +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -S checksum -t snapshot $TESTPOOL/$TESTFS" \ + "$snap_cksum" "checksum" + +# sort by name +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s name -t filesystem $TESTPOOL/$TESTFS" \ + "$fs_name" "name" +if is_global_zone ; then + verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s name -t volume $TESTPOOL/$TESTFS" \ + "$vol_name" "name" +fi +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s name -t snapshot $TESTPOOL/$TESTFS" \ + "$snap_name" "name" + +# reverse sort by creation +verify_reverse_sort \ + "run_unprivileged $ZFS list -H -r -o name -S creation -t filesystem $TESTPOOL/$TESTFS" \ + "$fs_creation" "creation date" +if is_global_zone ; then + verify_reverse_sort \ + "run_unprivileged $ZFS list -H -r -o name -S creation -t volume $TESTPOOL/$TESTFS" \ + "$vol_creation" "creation date" +fi +verify_reverse_sort \ + "run_unprivileged $ZFS list -H -r -o name -S creation -t snapshot $TESTPOOL/$TESTFS" \ + "$snap_creation" "creation date" + +# reverse sort by checksum +verify_reverse_sort \ + "run_unprivileged $ZFS list -H -r -o name -S checksum -t filesystem $TESTPOOL/$TESTFS" \ + "$fs_rev_cksum" "checksum" +if is_global_zone ; then + verify_reverse_sort \ + "run_unprivileged $ZFS list -H -r -o name -S checksum -t volume $TESTPOOL/$TESTFS" \ + "$vol_rev_cksum" "checksum" +fi + +# reverse sort by name +verify_reverse_sort \ + "run_unprivileged $ZFS list -H -r -o name -S name -t filesystem $TESTPOOL/$TESTFS"\ + "$fs_name" "name" +if is_global_zone ; then + verify_reverse_sort \ + "run_unprivileged $ZFS list -H -r -o name -S name -t volume $TESTPOOL/$TESTFS"\ + "$vol_name" "name" +fi +verify_reverse_sort \ + "run_unprivileged $ZFS list -H -r -o name -S name -t snapshot $TESTPOOL/$TESTFS"\ + "$snap_name" "name" + +log_pass "The sort functionality in 'zfs list' works as expected." diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_003_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_003_pos.ksh new file mode 100644 index 00000000000..5ed72c388a0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_003_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list_003_pos.ksh 1.1 07/06/05 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_list_003_pos +# +# DESCRIPTION: +# Verify 'zfs list -r' could recursively display any children +# of the dataset. +# +# STRATEGY: +# 1. Prepare a set of datasets by hierarchy. +# 2. Execute 'zfs list -r' at the top of these datasets. +# 3. Verify all child datasets are all be shown. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-05-24) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup +{ + if [[ -f $tmpfile ]]; then + $RM -f $tmpfile + fi +} + +verify_runnable "both" +log_onexit cleanup + +log_assert "Verify 'zfs list -r' could display any children recursively." + +tmpfile=$TMPDIR/zfslist.out.${TESTCASE_ID} +children="$TESTPOOL/$TESTFS" + +for fs in $DATASETS ; do + children="$children $TESTPOOL/$TESTFS/$fs" +done + +cd /tmp + +for path in $TESTPOOL/$TESTFS $TESTDIR ./../$TESTDIR ; do + run_unprivileged $ZFS list -rH -o name $path > $tmpfile + for fs in $children ; do + $GREP -q "^${fs}$" $tmpfile + if (( $? != 0 )); then + cat $tmpfile + log_fail "$fs not shown in the output list." + fi + done +done + +log_pass "'zfs list -r' could display any children recursively." diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_004_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_004_neg.ksh new file mode 100644 index 00000000000..eb520b3dd48 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_004_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list_004_neg.ksh 1.1 07/06/05 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_list_004_neg +# +# DESCRIPTION: +# Verify 'zfs list [-r]' should fail while +# * the given dataset does not exist +# * the given path does not exist. +# * the given path does not belong to zfs. +# +# STRATEGY: +# 1. Create an array of invalid options. +# 2. Execute each element in the array. +# 3. Verify failure is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-05-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify 'zfs list [-r]' should fail while the given " \ + "dataset/path does not exist or not belong to zfs." + +paths="$TESTPOOL/NONEXISTFS $TESTPOOL/$TESTFS/NONEXISTFS \ + /$TESTDIR/NONEXISTFS /dev" + +cd /tmp + +for fs in $paths ; do + log_mustnot run_unprivileged $ZFS list $fs + log_mustnot run_unprivileged $ZFS list -r $fs +done + +log_pass "'zfs list [-r]' fails while the given dataset/path does not exist " \ + "or not belong to zfs." diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_005_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_005_pos.ksh new file mode 100644 index 00000000000..ee6fa5c3f49 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_005_pos.ksh @@ -0,0 +1,197 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list_005_pos.ksh 1.2 08/11/03 SMI" +# +. $STF_SUITE/tests/cli_user/zfs_list/zfs_list.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_list_005_pos +# +# DESCRIPTION: +# Verify 'zfs list' evaluate multiple '-s' options from left to right +# in decreasing order of importance. +# +# STRATEGY: +# 1. Setting user property f:color for filesystem and volume. +# 2. Setting user property f:amount for filesystem and volume. +# 3. Setting reservation for filesystem and volume +# 3. Verify 'zfs list' evaluated multiple -s options from left to right. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-07-23) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify 'zfs list' evaluate multiple '-s' options " \ + "from left to right in decreasing order of importance." + +COLOR="red yellow green blue red yellow white" +AMOUNT="0217 812 0217 0781 7 1364 687" +RESERVATION="2048K 1024 2048K 512K 16M 3072 128K" + +basefs=$TESTPOOL/$TESTFS +typeset -i n=0 +for ds in $DATASETS ; do + color=$($ECHO $COLOR | $AWK '{print $1}') + log_must $ZFS set f:color=$color $basefs/$ds + if is_global_zone ; then + log_must $ZFS set f:color=$color $basefs/${ds}-vol + fi + eval COLOR=\${COLOR#$color } + + amount=$($ECHO $AMOUNT | $AWK '{print $1}') + log_must $ZFS set f:amount=$amount $basefs/$ds + if is_global_zone ; then + log_must $ZFS set f:amount=$amount $basefs/${ds}-vol + fi + eval AMOUNT=\${AMOUNT#$amount } + + reserv=$($ECHO $RESERVATION | $AWK '{print $1}') + log_must $ZFS set reservation=$reserv $basefs/$ds + if is_global_zone ; then + log_must $ZFS set reservation=$reserv $basefs/${ds}-vol + fi + eval RESERVATION=\${RESERVATION#$reserv } +done + +# +# we must be in the C locale here, as running in other locales +# will make zfs use that locale's sort order. +# +LC_ALL=C; export LC_ALL + +fs_color_amount="Orange Carrot Apple apple carrot banana Banana" +fs_amount_color="Carrot Apple Orange banana carrot apple Banana" +fs_color_reserv="Orange Carrot Apple apple carrot Banana banana" +fs_reserv_color="Banana banana carrot Orange Carrot Apple apple" +fs_reserv_amount_color="Banana banana carrot Orange Carrot Apple apple" + +vol_color_amount="Orange-vol Carrot-vol Apple-vol apple-vol carrot-vol" +vol_color_amount="$vol_color_amount banana-vol Banana-vol" + +vol_amount_color="Carrot-vol Apple-vol Orange-vol banana-vol carrot-vol" +vol_amount_color="$vol_amount_color apple-vol Banana-vol" + +vol_color_reserv="Orange-vol Carrot-vol Apple-vol apple-vol carrot-vol" +vol_color_reserv="$vol_color_reserv Banana-vol banana-vol" + +vol_reserv_color="Banana-vol banana-vol carrot-vol Orange-vol Carrot-vol" +vol_reserv_color="$vol_reserv_color Apple-vol apple-vol" + +vol_reserv_amount_color="Banana-vol banana-vol carrot-vol Orange-vol Carrot-vol" +vol_reserv_amount_color="$vol_reserv_amount_color Apple-vol apple-vol" + +if is_global_zone ; then + snap_list="Apple@snap Apple-vol@snap Banana@snap Banana-vol@snap" + snap_list="$snap_list Carrot@snap Carrot-vol@snap Orange@snap Orange-vol@snap" + snap_list="$snap_list apple@snap apple-vol@snap banana@snap banana-vol@snap" + snap_list="$snap_list carrot@snap carrot-vol@snap" +else + snap_list="Apple@snap Banana@snap" + snap_list="$snap_list Carrot@snap Orange@snap" + snap_list="$snap_list apple@snap banana@snap" + snap_list="$snap_list carrot@snap" +fi +# Sort by color,amount +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:color -s f:amount -t filesystem $basefs" \ + "$fs_color_amount" "f:color,f:amount" +if is_global_zone ; then + verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:color -s f:amount -t volume $basefs" \ + "$vol_color_amount" "f:color,f:amount" +fi +# Sort by amount,color +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:amount -s f:color -t filesystem $basefs" \ + "$fs_amount_color" "f:amount,f:color" +if is_global_zone ; then + verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:amount -s f:color -t volume $basefs" \ + "$vol_amount_color" "f:amount,f:color" +fi + +# Sort by color reservation +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:color -s reserv -t filesystem $basefs" \ + "$fs_color_reserv" "f:color,reserv" +if is_global_zone ; then + verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:color -s reserv -t volume $basefs" \ + "$vol_color_reserv" "f:color,reserv" +fi +# Sort by reserv, color +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s reserv -s f:color -t filesystem $basefs" \ + "$fs_reserv_color" "reserv,f:color" +if is_global_zone ; then + verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s reserv -s f:color -t volume $basefs" \ + "$vol_reserv_color" "reserv,f:color" +fi + +# Sort by reservation, amount, color +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s reserv -s reserv -s f:amount -s f:color -t filesystem $basefs" \ + "$fs_reserv_amount_color" "reserv,:amount,f:color" +if is_global_zone ; then + verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s reserv -s f:amount -s f:color -t volume $basefs" \ + "$vol_reserv_amount_color" "reserv,:amount,f:color" +fi +# User property and reservation was not stored in snapshot +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:amount -s f:color -t snapshot $basefs" \ + "$snap_list" "f:amount,f:color" +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:color -s f:amount -t snapshot $basefs" \ + "$snap_list" "f:color,f:amount" +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s f:color -s reserv -t snapshot $basefs" \ + "$snap_list" "f:color,reservation" +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s reserv -s f:color -t snapshot $basefs" \ + "$snap_list" "reserv,f:color" +verify_sort \ + "run_unprivileged $ZFS list -H -r -o name -s reserv -s f:amount -s f:color -t snapshot $basefs" \ + "$snap_list" "reservation,f:color,f:amount" + +log_pass "Verify 'zfs list' evaluate multiple '-s' options " \ + "from left to right in decreasing order of importance." diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_006_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_006_pos.ksh new file mode 100644 index 00000000000..2588361fad1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_006_pos.ksh @@ -0,0 +1,126 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list_006_pos.ksh 1.1 09/05/19 SMI" +# +. $STF_SUITE/tests/cli_user/zfs_list/zfs_list.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_list_006_pos +# +# DESCRIPTION: +# Verify 'zfs list' exclude list of snapshot. +# +# STRATEGY: +# 1. Verify snapshot not shown in the list: +# zfs list [-r] +# 2. Verify snapshot will be shown by following case: +# zfs list [-r] -t snapshot +# zfs list [-r] -t all +# zfs list +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-24) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! pool_prop_exist "listsnapshots" ; then + log_unsupported "Pool property of 'listsnapshots' not supported." +fi + +log_assert "Verify 'zfs list' exclude list of snapshot." + +set -A hide_options "--" "-t filesystem" "-t volume" +set -A show_options "--" "-t snapshot" "-t all" + +typeset pool=${TESTPOOL%%/*} +typeset dataset=${DATASETS%% *} +typeset BASEFS=$TESTPOOL/$TESTFS + +for newvalue in "" "on" "off" ; do + + if [[ -n $newvalue ]] && ! is_global_zone ; then + break + fi + + if [[ -n $newvalue ]] ; then + log_must $ZPOOL set listsnapshots=$newvalue $pool + fi + + if [ -z "$newvalue" -o "off" = "$newvalue" ] ; then + run_unprivileged $ZFS list -r -H -o name $pool | $GREP -q '@' && \ + log_fail "zfs list included snapshots but shouldn't have" + else + run_unprivileged $ZFS list -r -H -o name $pool | $GREP -q '@' || \ + log_fail "zfs list failed to include snapshots" + fi + + + typeset -i i=0 + while (( i < ${#hide_options[*]} )) ; do + run_unprivileged $ZFS list -r -H -o name ${hide_options[i]} $pool | \ + $GREP -q '@' && \ + log_fail "zfs list included snapshots but shouldn't have" + + (( i = i + 1 )) + done + + (( i = 0 )) + + while (( i < ${#show_options[*]} )) ; do + run_unprivileged $ZFS list -r -H -o name ${show_options[i]} $pool | \ + $GREP -q '@' || \ + log_fail "zfs list failed to include snapshots" + (( i = i + 1 )) + done + + output=$(run_unprivileged $ZFS list -H -o name $BASEFS/${dataset}@snap) + if [[ $output != $BASEFS/${dataset}@snap ]] ; then + log_fail "zfs list not show $BASEFS/${dataset}@snap" + fi + + if is_global_zone ; then + output=$(run_unprivileged $ZFS list -H -o name $BASEFS/${dataset}-vol@snap) + if [[ $output != $BASEFS/${dataset}-vol@snap ]] ; then + log_fail "zfs list not show $BASEFS/${dataset}-vol@snap" + fi + fi +done + +log_pass "'zfs list' exclude list of snapshot." diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_007_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_007_pos.ksh new file mode 100644 index 00000000000..13fa593cd80 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_007_pos.ksh @@ -0,0 +1,111 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list_007_pos.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_list_007_pos +# +# DESCRIPTION: +# 'zfs list -d ' should get expected output. +# +# STRATEGY: +# 1. 'zfs list -d ' to get the output. +# 2. 'zfs list -r|egrep' to get the expected output. +# 3. Compare the two outputs, they shoud be same. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-05-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! zfs_get_list_d_supported ; then + log_unsupported "'zfs list -d' is not supported." +fi + +set -A fs_type "all" "filesystem" "snapshot" +if is_global_zone ; then + set -A fs_type ${fs_type[*]} "volume" +fi + +function cleanup +{ + log_must $RM -f $DEPTH_OUTPUT + log_must $RM -f $EXPECT_OUTPUT +} + +log_onexit cleanup +log_assert "'zfs list -d ' should get expected output." + +mntpnt=$TMPDIR +DEPTH_OUTPUT="$mntpnt/depth_output" +EXPECT_OUTPUT="$mntpnt/expect_output" +typeset -i old_val=0 +typeset -i j=0 +typeset -i fs=0 +typeset eg_opt="$DEPTH_FS"$ +for dp in ${depth_array[@]}; do + (( j=old_val+1 )) + while (( j<=dp && j<=MAX_DEPTH )); do + eg_opt="$eg_opt""|d""$j"$ + (( j+=1 )) + done + (( fs=0 )) + while (( fs<${#fs_type[*]} )); do + if [[ "$dp" == "0" ]] && \ + [[ "${fs_type[$fs]}" == "volume" || "${fs_type[$fs]}" == "snapshot" ]]; then + log_must eval "run_unprivileged $ZFS list -H -d $dp -o name -t ${fs_type[$fs]} $DEPTH_FS > $DEPTH_OUTPUT" + [[ -s "$DEPTH_OUTPUT" ]] && \ + log_fail "$DEPTH_OUTPUT should be null." + log_mustnot run_unprivileged $ZFS list -rH -o name -t ${fs_type[$fs]} $DEPTH_FS | $EGREP -e '$eg_opt' + else + log_must eval "run_unprivileged $ZFS list -H -d $dp -o name -t ${fs_type[$fs]} $DEPTH_FS > $DEPTH_OUTPUT" + log_must eval "run_unprivileged $ZFS list -rH -o name -t ${fs_type[$fs]} $DEPTH_FS | $EGREP -e '$eg_opt' > $EXPECT_OUTPUT" + log_must $DIFF $DEPTH_OUTPUT $EXPECT_OUTPUT + fi + (( fs+=1 )) + done + (( old_val=dp )) +done + +log_pass "'zfs list -d ' should get expected output." + diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_008_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_008_neg.ksh new file mode 100644 index 00000000000..34287ab2d36 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_008_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_list_008_neg.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/tests/cli_root/zfs_get/zfs_get_list_d.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zfs_list_008_neg +# +# DESCRIPTION: +# A negative depth or a non numeric depth should fail in 'zfs list -d ' +# +# STRATEGY: +# 1. Run zfs list -d with negative depth or non numeric depth +# 2. Verify that zfs list returns error +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-05-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! zfs_get_list_d_supported ; then + log_unsupported "'zfs list -d' is not supported." +fi + +log_assert "A negative depth or a non numeric depth should fail in 'zfs list -d '" + +set -A badargs "a" "AB" "aBc" "2A" "a2b" "aB2" "-1" "-32" "-999" + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + log_mustnot eval "run_unprivileged $ZFS list -d ${badargs[i]} $DEPTH_FS >/dev/null 2>&1" + (( i = i + 1 )) +done + +log_pass "A negative depth or a non numeric depth should fail in 'zfs list -d '" + + diff --git a/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_test.sh b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_test.sh new file mode 100755 index 00000000000..a69aaf64968 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zfs_list/zfs_list_test.sh @@ -0,0 +1,265 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_list_001_pos cleanup +zfs_list_001_pos_head() +{ + atf_set "descr" "Verify 'zfs list [-rH] [-o property[,prop]*] [fs|clct|vol]'." + atf_set "require.progs" zfs + atf_set "require.user" root + atf_set "require.config" "unprivileged_user" +} +zfs_list_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_list_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_list_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_list_002_pos cleanup +zfs_list_002_pos_head() +{ + atf_set "descr" "The sort functionality in 'zfs list' works as expected." + atf_set "require.progs" zfs + atf_set "require.user" root + atf_set "require.config" "unprivileged_user" +} +zfs_list_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_list_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_list_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_list_003_pos cleanup +zfs_list_003_pos_head() +{ + atf_set "descr" "Verify 'zfs list -r' could display any children recursively." + atf_set "require.progs" zfs + atf_set "require.user" root + atf_set "require.config" "unprivileged_user" +} +zfs_list_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_list_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_list_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_list_004_neg cleanup +zfs_list_004_neg_head() +{ + atf_set "descr" "Verify 'zfs list [-r]' should fail while the givendataset/path does not exist or not belong to zfs." + atf_set "require.progs" zfs + atf_set "require.user" root + atf_set "require.config" "unprivileged_user" +} +zfs_list_004_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_list_004_neg.ksh || atf_fail "Testcase failed" +} +zfs_list_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_list_005_pos cleanup +zfs_list_005_pos_head() +{ + atf_set "descr" "Verify 'zfs list' evaluate multiple '-s' optionsfrom left to right in decreasing order of importance." + atf_set "require.progs" zfs + atf_set "require.user" root + atf_set "require.config" "unprivileged_user" +} +zfs_list_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + verify_disk_count "$DISKS" 1 + atf_expect_fail "https://www.illumos.org/issues/8599 Snapshots don't preserve user properties" + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_list_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_list_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_list_006_pos cleanup +zfs_list_006_pos_head() +{ + atf_set "descr" "Verify 'zfs list' exclude list of snapshot." + atf_set "require.progs" zfs zpool + atf_set "require.user" root + atf_set "require.config" "unprivileged_user" +} +zfs_list_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_list_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_list_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_list_007_pos cleanup +zfs_list_007_pos_head() +{ + atf_set "descr" "'zfs list -d ' should get expected output." + atf_set "require.progs" zfs + atf_set "require.user" root + atf_set "require.config" "unprivileged_user" +} +zfs_list_007_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_list_007_pos.ksh || atf_fail "Testcase failed" +} +zfs_list_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_list_008_neg cleanup +zfs_list_008_neg_head() +{ + atf_set "descr" "A negative depth or a non numeric depth should fail in 'zfs list -d '" + atf_set "require.progs" zfs + atf_set "require.user" root + atf_set "require.config" "unprivileged_user" +} +zfs_list_008_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_list_008_neg.ksh || atf_fail "Testcase failed" +} +zfs_list_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zfs_list.kshlib + . $(atf_get_srcdir)/zfs_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_list_001_pos + atf_add_test_case zfs_list_002_pos + atf_add_test_case zfs_list_003_pos + atf_add_test_case zfs_list_004_neg + atf_add_test_case zfs_list_005_pos + atf_add_test_case zfs_list_006_pos + atf_add_test_case zfs_list_007_pos + atf_add_test_case zfs_list_008_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/Makefile b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/Makefile new file mode 100644 index 00000000000..90f80207ef6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_user/zpool_iostat +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_iostat_test +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_iostat.cfg +${PACKAGE}FILES+= zpool_iostat_003_neg.ksh +${PACKAGE}FILES+= zpool_iostat_002_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zpool_iostat_001_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/setup.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat.cfg b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat.cfg new file mode 100644 index 00000000000..169b368eb5a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_iostat.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_user/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh new file mode 100644 index 00000000000..cde88d89081 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_iostat_001_neg.ksh 1.3 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_iostat_001_neg +# +# DESCRIPTION: +# Verify that 'zpool iostat' can be executed as non-root. +# +# STRATEGY: +# 1. Create an array of options. +# 2. Execute each element of the array. +# 3. Verify that a success is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +typeset testpool +if is_global_zone ; then + testpool=$TESTPOOL +else + testpool=${TESTPOOL%%/*} +fi + +set -A args "iostat" "iostat $testpool" + +log_assert "zpool iostat [pool_name ...] [interval]" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_must run_unprivileged $ZPOOL ${args[i]} + ((i = i + 1)) +done + +log_pass "The sub-command 'iostat' succeeds as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh new file mode 100644 index 00000000000..1efbee8cf2c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh @@ -0,0 +1,84 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_iostat_002_pos.ksh 1.2 08/05/14 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_iostat_002_pos +# +# DESCRIPTION: +# Verify that 'zpool iostat [interval [count]' can be executed as non-root. +# +# STRATEGY: +# 1. set the interval=2 and count=3 +# 2. sleep 30 seconds +# 3. Verify that the output have 3 record. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +typeset tmpfile=$TMPDIR/zfsiostat.out.${TESTCASE_ID} +typeset -i stat_count=0 + +function cleanup +{ + if [[ -f $tmpfile ]]; then + $RM -f $tmpfile + fi +} + +log_onexit cleanup +log_assert "zpool iostat [pool_name ...] [interval] [count]" + +if ! is_global_zone ; then + TESTPOOL=${TESTPOOL%%/*} +fi + +run_unprivileged $ZPOOL iostat $TESTPOOL 2 3 > $tmpfile 2>&1 +stat_count=$($GREP $TESTPOOL $tmpfile | $WC -l) + +if [[ $stat_count -ne 3 ]]; then + log_fail "zpool iostat [pool_name] [interval] [count] failed" +fi + +log_pass "zpool iostat [pool_name ...] [interval] [count] passed" diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh new file mode 100644 index 00000000000..16679c47b96 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_iostat_003_neg.ksh 1.1 07/10/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_iostat_003_neg +# +# DESCRIPTION: +# Executing 'zpool iostat' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool iostat' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +typeset testpool +if is_global_zone ; then + testpool=$TESTPOOL +else + testpool=${TESTPOOL%%/*} +fi + +set -A args "" "-?" "-f" "nonexistpool" "$TESTPOOL/$TESTFS" \ + "$testpool 1.23" "$testpool 0" "$testpool -1" "$testpool 1 0" \ + "$testpool 0 0" + +log_assert "Executing 'zpool iostat' with bad options fails" + +typeset -i i=1 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL iostat ${args[i]} + ((i = i + 1)) +done + +log_pass "Executing 'zpool iostat' with bad options fails" diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_test.sh b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_test.sh new file mode 100755 index 00000000000..7cc83e9afb8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_iostat/zpool_iostat_test.sh @@ -0,0 +1,103 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_iostat_001_neg cleanup +zpool_iostat_001_neg_head() +{ + atf_set "descr" "zpool iostat [pool_name ...] [interval]" + atf_set "require.progs" zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_iostat_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_iostat.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_iostat_001_neg.ksh || atf_fail "Testcase failed" +} +zpool_iostat_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_iostat.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_iostat_002_pos cleanup +zpool_iostat_002_pos_head() +{ + atf_set "descr" "zpool iostat [pool_name ...] [interval] [count]" + atf_set "require.progs" zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_iostat_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_iostat.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_iostat_002_pos.ksh || atf_fail "Testcase failed" +} +zpool_iostat_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_iostat.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_iostat_003_neg +zpool_iostat_003_neg_head() +{ + atf_set "descr" "Executing 'zpool iostat' with bad options fails" + atf_set "require.progs" zpool + atf_set "require.user" unprivileged +} +zpool_iostat_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_iostat.cfg + + ksh93 $(atf_get_srcdir)/zpool_iostat_003_neg.ksh || atf_fail "Testcase failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zpool_iostat_001_neg + atf_add_test_case zpool_iostat_002_pos + atf_add_test_case zpool_iostat_003_neg +} diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_list/Makefile b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/Makefile new file mode 100644 index 00000000000..c43dc562d1e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/cli_user/zpool_list +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zpool_list_test +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zpool_list_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zpool_list.cfg +${PACKAGE}FILES+= zpool_list_002_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_list/cleanup.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_list/setup.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list.cfg b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list.cfg new file mode 100644 index 00000000000..9d84b2ebed9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_list.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/cli_user/cli.cfg diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_001_pos.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_001_pos.ksh new file mode 100644 index 00000000000..ef69c1eb917 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_001_pos.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_list_001_pos.ksh 1.5 08/05/14 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_user/cli_user.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_list_001_pos +# +# DESCRIPTION: +# Verify that 'zpool list' succeeds as non-root. +# +# STRATEGY: +# 1. Create an array of options. +# 2. Execute each element of the array. +# 3. Verify the command succeeds. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +if ! is_global_zone ; then + TESTPOOL=${TESTPOOL%%/*} +fi + +set -A args "list $TESTPOOL" "list -H $TESTPOOL" "list" "list -H" \ + "list -H -o name $TESTPOOL" "list -o name $TESTPOOL" \ + "list -o name,size,capacity,health,altroot $TESTPOOL" \ + "list -H -o name,size,capacity,health,altroot $TESTPOOL" + +log_assert "zpool list [-H] [-o filed[,filed]*] [ ...]" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_must run_unprivileged $ZPOOL ${args[i]} + + ((i = i + 1)) +done + +log_pass "The sub-command 'list' succeeds as non-root." diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_002_neg.ksh b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_002_neg.ksh new file mode 100644 index 00000000000..196cfd7d995 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_002_neg.ksh @@ -0,0 +1,70 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zpool_list_002_neg.ksh 1.2 08/05/14 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zpool_list_002_neg +# +# DESCRIPTION: +# Executing 'zpool list' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool list' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A args "" "-?" "-f" "-o" \ + "-o fakeproperty" "-o name,size,fakeproperty" + +log_assert "Executing 'zpool list' with bad options fails" + +typeset -i i=1 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL list ${args[i]} + ((i = i + 1)) +done + +log_pass "Executing 'zpool list' with bad options fails" diff --git a/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_test.sh b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_test.sh new file mode 100755 index 00000000000..a34e60d5d80 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/cli_user/zpool_list/zpool_list_test.sh @@ -0,0 +1,75 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zpool_list_001_pos cleanup +zpool_list_001_pos_head() +{ + atf_set "descr" "zpool list [-H] [-o filed[,filed]*] [ ...]" + atf_set "require.progs" zpool + atf_set "require.user" root + atf_set "require.config" unprivileged_user +} +zpool_list_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_list.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zpool_list_001_pos.ksh || atf_fail "Testcase failed" +} +zpool_list_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_list.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zpool_list_002_neg +zpool_list_002_neg_head() +{ + atf_set "descr" "Executing 'zpool list' with bad options fails" + atf_set "require.progs" zpool + atf_set "require.user" unprivileged +} +zpool_list_002_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zpool_list.cfg + + ksh93 $(atf_get_srcdir)/zpool_list_002_neg.ksh || atf_fail "Testcase failed" +} + +atf_init_test_cases() +{ + + atf_add_test_case zpool_list_001_pos + atf_add_test_case zpool_list_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/compression/Makefile b/tests/sys/cddl/zfs/tests/compression/Makefile new file mode 100644 index 00000000000..2dcca81826c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/compression/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/compression +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= compression_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= compress_004_pos.ksh +${PACKAGE}FILES+= compress_001_pos.ksh +${PACKAGE}FILES+= compress_003_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= compress.cfg +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/compression/cleanup.ksh b/tests/sys/cddl/zfs/tests/compression/cleanup.ksh new file mode 100644 index 00000000000..c514e32197c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/compression/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +default_container_cleanup diff --git a/tests/sys/cddl/zfs/tests/compression/compress.cfg b/tests/sys/cddl/zfs/tests/compression/compress.cfg new file mode 100644 index 00000000000..774c1d40fe3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/compression/compress.cfg @@ -0,0 +1,39 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)compress.cfg 1.4 08/08/15 SMI" +# + +export TESTFILE0=testfile0.${TESTCASE_ID} +export TESTFILE1=testfile1.${TESTCASE_ID} + +export BLOCKSZ=8192 +export NUM_WRITES=65536 +export DATA=13 +export STF_TIMEOUT=1200 + diff --git a/tests/sys/cddl/zfs/tests/compression/compress_001_pos.ksh b/tests/sys/cddl/zfs/tests/compression/compress_001_pos.ksh new file mode 100644 index 00000000000..d3d2eefb65c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/compression/compress_001_pos.ksh @@ -0,0 +1,86 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)compress_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: compress_001_pos +# +# DESCRIPTION: +# Create two files of exactly the same size. One with compression +# and one without. Ensure the compressed file is smaller. +# +# STRATEGY: +# Use "zfs set" to turn on compression and create files before +# and after the set call. The compressed file should be smaller. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +typeset OP=create + +log_assert "Ensure that compressed files are smaller." + +log_note "Ensure compression is off" +log_must $ZFS set compression=off $TESTPOOL/$TESTFS + +log_note "Writing file without compression..." +log_must $FILE_WRITE -o $OP -f $TESTDIR/$TESTFILE0 -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA + +log_note "Add compression property to the dataset and write another file" +log_must $ZFS set compression=on $TESTPOOL/$TESTFS + +log_must $FILE_WRITE -o $OP -f $TESTDIR/$TESTFILE1 -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA + +log_must $SYNC $TESTDIR + +FILE0_BLKS=`$DU -k $TESTDIR/$TESTFILE0 | $AWK '{ print $1}'` +FILE1_BLKS=`$DU -k $TESTDIR/$TESTFILE1 | $AWK '{ print $1}'` + +if [[ $FILE0_BLKS -le $FILE1_BLKS ]]; then + log_fail "$TESTFILE0 is smaller than $TESTFILE1" \ + "($FILE0_BLKS <= $FILE1_BLKS)" +fi + +log_pass "$TESTFILE0 is bigger than $TESTFILE1 ($FILE0_BLKS > $FILE1_BLKS)" diff --git a/tests/sys/cddl/zfs/tests/compression/compress_003_pos.ksh b/tests/sys/cddl/zfs/tests/compression/compress_003_pos.ksh new file mode 100644 index 00000000000..fee884a46a7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/compression/compress_003_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)compress_003_pos.ksh 1.3 07/06/06 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: compress_003_pos +# +# DESCRIPTION: +# With 'compression' or 'compress' set, changing filesystem blocksize cannot +# cause system panic +# +# STRATEGY: +# 1. Set 'compression' or "compress" to on +# 2. Set different blocksize with ZFS filesystem +# 3. Use 'mkfile' create single block and multi-block files +# 4. Verify the system continued work +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -f $TESTDIR/* +} + +log_assert "Changing blocksize doesn't casue system panic with compression settings" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +single_blk_file=$TESTDIR/singleblkfile.${TESTCASE_ID} +multi_blk_file=$TESTDIR/multiblkfile.${TESTCASE_ID} +typeset -i blksize=512 +typeset -i fsize=0 +typeset -i offset=0 + +for propname in "compression" "compress" +do + for value in $(get_compress_opts zfs_compress) + do + log_must $ZFS set $propname=$value $fs + if [[ $value == "gzip-6" ]]; then + value="gzip" + fi + real_val=$(get_prop $propname $fs) + [[ $real_val != $value ]] && \ + log_fail "Set property $propname=$value failed." + + (( blksize = 512 )) + while (( blksize <= 131072 )); do + log_must $ZFS set recordsize=$blksize $fs + (( offset = $RANDOM )) + if (( offset > blksize )); then + (( offset = offset % blksize )) + fi + if (( (offset % 2) == 0 )); then + #keep offset as non-power-of-2 + (( offset = offset + 1 )) + fi + (( fsize = offset )) + log_must $MKFILE $fsize $single_blk_file + (( fsize = blksize + offset )) + log_must $MKFILE $fsize $multi_blk_file + + (( blksize = blksize * 2 )) + done + done +done + +log_pass "The system works as expected while changing blocksize with compression settings" diff --git a/tests/sys/cddl/zfs/tests/compression/compress_004_pos.ksh b/tests/sys/cddl/zfs/tests/compression/compress_004_pos.ksh new file mode 100644 index 00000000000..a8f06d19c5d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/compression/compress_004_pos.ksh @@ -0,0 +1,146 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)compress_004_pos.ksh 1.3 07/06/06 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: compress_004_pos +# +# DESCRIPTION: +# With 'compression' set, a file with non-power-of-2 blocksize storage space +# can be freed as will normally. +# +# STRATEGY: +# 1. Set 'compression' or 'compress' to on or lzjb +# 2. Set different recordsize with ZFS filesystem +# 3. Repeatedly using 'randfree_file' to create a file and then free its +# storage space with different range, the system should work normally. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -f $TESTDIR/* +} + +function create_free_testing # +{ + typeset -i fsz=$1 + typeset file=$2 + typeset -i start=0 + typeset -i len=0 + typeset -i dist=0 + + for start in 0 `expr $RANDOM % $fsz` + do + (( dist = fsz - start )) + for len in `expr $RANDOM % $dist` $dist \ + `expr $start + $dist`; do + log_must $RANDFREE_FILE -l fsz -s $start \ + -n $len $file + [[ -e $file ]] && \ + log_must $RM -f $file + done + done +} + + +log_assert "Creating non-power-of-2 blocksize file and freeing the file \ + storage space at will should work normally with compression setting" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +single_blk_file=$TESTDIR/singleblkfile.${TESTCASE_ID} +multi_blk_file=$TESTDIR/multiblkfile.${TESTCASE_ID} +typeset -i blksize=512 +typeset -i fsize=0 +typeset -i avail=0 +typeset -i blknum=0 + +for propname in "compression" "compress" +do + for value in $(get_compress_opts zfs_compress) + do + log_must $ZFS set compression=$value $fs + real_val=$(get_prop $propname $fs) + if [[ $value == "gzip-6" ]]; then + value="gzip" + fi + [[ $real_val != $value ]] && \ + log_fail "Set property $propname=$value failed." + + (( blksize = 512 )) + while (( blksize <= 131072 )); do + log_must $ZFS set recordsize=$blksize $fs + + # doing single block testing + (( fsize = $RANDOM )) + if (( fsize > blksize )); then + (( fsize = fsize % blksize )) + fi + if (( (fsize % 2) == 0 )); then + #make sure fsize is non-power-of-2 + (( fsize = fsize + 1 )) + fi + create_free_testing $fsize $single_blk_file + + # doing multiple blocks testing + avail=$(get_prop available $fs) + (( blknum = avail / blksize )) + # we just test <10 multi-blocks to limit testing time + (( blknum = blknum % 9 )) + while (( blknum < 2 )); do + (( blknum = blknum + $RANDOM % 9 )) + done + if (( (blknum % 2) == 0 )); then + (( blknum = blknum + 1 )) # keep blknum as odd + fi + (( fsize = blknum * blksize )) + create_free_testing $fsize $multi_blk_file + + (( blksize = blksize * 2 )) + done + done +done + +log_pass "Creating and freeing non-power-of-2 blocksize file work as expected." diff --git a/tests/sys/cddl/zfs/tests/compression/compression_test.sh b/tests/sys/cddl/zfs/tests/compression/compression_test.sh new file mode 100755 index 00000000000..dfabcd6f408 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/compression/compression_test.sh @@ -0,0 +1,110 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case compress_001_pos cleanup +compress_001_pos_head() +{ + atf_set "descr" "Ensure that compressed files are smaller." + atf_set "require.progs" zfs +} +compress_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/compress.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/compress_001_pos.ksh || atf_fail "Testcase failed" +} +compress_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/compress.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case compress_003_pos cleanup +compress_003_pos_head() +{ + atf_set "descr" "Changing blocksize doesn't casue system panic with compression settings" + atf_set "require.progs" zfs +} +compress_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/compress.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/compress_003_pos.ksh || atf_fail "Testcase failed" +} +compress_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/compress.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case compress_004_pos cleanup +compress_004_pos_head() +{ + atf_set "descr" "Creating non-power-of-2 blocksize file and freeing the filestorage space at will should work normally with compression setting" + atf_set "require.progs" zfs +} +compress_004_pos_body() +{ + if [[ $(uname) = "FreeBSD" ]]; then + atf_skip "FreeBSD does not implement F_FREESP in fcntl()" + fi + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/compress.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/compress_004_pos.ksh || atf_fail "Testcase failed" +} +compress_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/compress.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case compress_001_pos + atf_add_test_case compress_003_pos + atf_add_test_case compress_004_pos +} diff --git a/tests/sys/cddl/zfs/tests/compression/setup.ksh b/tests/sys/cddl/zfs/tests/compression/setup.ksh new file mode 100644 index 00000000000..1c30df46ae8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/compression/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_container_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/ctime/Makefile b/tests/sys/cddl/zfs/tests/ctime/Makefile new file mode 100644 index 00000000000..ec0b356df32 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/ctime/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/ctime +FILESDIR=${TESTSDIR} +BINDIR=${TESTSDIR} + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= ctime.cfg + +PROG= ctime_001_pos +MAN= +ATF_TESTS_KSH93= ctime_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +.include diff --git a/tests/sys/cddl/zfs/tests/ctime/cleanup.ksh b/tests/sys/cddl/zfs/tests/ctime/cleanup.ksh new file mode 100644 index 00000000000..2ee7cfb6028 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/ctime/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/ctime/ctime.cfg b/tests/sys/cddl/zfs/tests/ctime/ctime.cfg new file mode 100644 index 00000000000..d601d5d88e3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/ctime/ctime.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)ctime.cfg 1.2 08/08/15 SMI" +# + +export TESTFILE=testfile${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/ctime/ctime_001_pos.c b/tests/sys/cddl/zfs/tests/ctime/ctime_001_pos.c new file mode 100644 index 00000000000..afccda1a884 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/ctime/ctime_001_pos.c @@ -0,0 +1,381 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)ctime_001_pos.c 1.1 07/05/25 SMI" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ST_ATIME 0 +#define ST_CTIME 1 +#define ST_MTIME 2 + +#define ALL_MODE (mode_t)(S_IRWXU|S_IRWXG|S_IRWXO) + +typedef struct timetest { + int type; + char *name; + int (*func)(const char *pfile); +} timetest_t; + +#ifdef __stc_assertion__ + +/* + * ID: ctime_001_pos + * + * DESCRIPTION: + * Verify time will be changed correctly according to relevant operating. + * + * STRATEGY: + * 1. Define time test array. + * 2. loop each item in this array. + * 3. Verify the time will be changed after relevant operating. + * + * TESTABILITY: explicit + * + * TEST_AUTOMATION_LEVEL: automated + * + * CODING_STATUS: COMPLETED (2007-01-30) + * + */ + +#endif /* __stc_assertion__ */ + +/* + * Get file specific time information. + */ +int get_file_time(char *pfile, int what, time_t *ptr); + +int do_read(const char *pfile); +int do_write(const char *pfile); +int do_link(const char *pfile); +int do_creat(const char *pfile); +int do_utime(const char *pfile); +int do_chmod(const char *pfile); +int do_chown(const char *pfile); + +static char tfile[BUFSIZ] = { 0 }; +static char msg[BUFSIZ] = { 0 }; + +static timetest_t timetest_table[] = { + { ST_ATIME, "st_atime", do_read }, + { ST_ATIME, "st_atime", do_utime }, + { ST_MTIME, "st_mtime", do_creat }, + { ST_MTIME, "st_mtime", do_write }, + { ST_MTIME, "st_mtime", do_utime }, + { ST_CTIME, "st_ctime", do_creat }, + { ST_CTIME, "st_ctime", do_write }, + { ST_CTIME, "st_ctime", do_chmod }, + { ST_CTIME, "st_ctime", do_chown }, + { ST_CTIME, "st_ctime", do_link }, + { ST_CTIME, "st_ctime", do_utime }, +}; + +#define NCOMMAND (sizeof (timetest_table) / sizeof (timetest_table[0])) + +int +main(int argc, char *argv[]) +{ + int i, ret, fd; + const char *env_names[2] = {"TESTDIR", "TESTFILE"}; + char *env_vals[2]; + + /* + * Get envirnment variable value + */ + for (i = 0; i < sizeof (env_names) / sizeof (char *); i++) { + if ((env_vals[i] = getenv(env_names[i])) == NULL) { + fprintf(stderr, "getenv(%s) returned NULL\n", + env_names[i]); + exit(1); + } + } + (void) snprintf(tfile, sizeof (tfile), "%s/%s", env_vals[0], + env_vals[1]); + + /* + * If the test file is existing, remove it firstly + */ + if (access(tfile, F_OK) == 0) { + unlink(tfile); + } + fd = open(tfile, O_WRONLY | O_CREAT | O_TRUNC, ALL_MODE); + if (fd < 0) { + perror("open"); + exit(1); + } + (void) close(fd); + + for (i = 0; i < NCOMMAND; i++) { + time_t t1, t2; + + /* + * Get original time before operating. + */ + ret = get_file_time(tfile, timetest_table[i].type, &t1); + if (ret != 0) { + fprintf(stderr, + "ERROR: get_file_time(%s, %d, &t1) returned %d\n", + tfile, timetest_table[i].type, ret); + exit(1); + } + + /* + * Sleep 2 seconds to be sure that the timeofday has changed, + * then invoke command on given file + */ + sleep(2); + timetest_table[i].func(tfile); + + /* + * Get time after operating. + */ + ret = get_file_time(tfile, timetest_table[i].type, &t2); + if (ret != 0) { + fprintf(stderr, "get_file_time(%s, %d, &t2)\n", + tfile, timetest_table[i].type); + exit(1); + } + + if (t1 == t2) { + fprintf(stderr, "%s: t1(%ld) == t2(%ld)\n", + timetest_table[i].name, (long)t1, (long)t2); + exit(1); + } + } + + (void) unlink(tfile); + + return (0); +} + +int +get_file_time(char *pfile, int what, time_t *ptr) +{ + struct stat stat_buf; + + if (pfile == NULL || ptr == NULL) { + return (-1); + } + + if (stat(pfile, &stat_buf) == -1) { + return (-1); + } + + switch (what) { + case ST_ATIME: + *ptr = stat_buf.st_atime; + return (0); + case ST_CTIME: + *ptr = stat_buf.st_ctime; + return (0); + case ST_MTIME: + *ptr = stat_buf.st_mtime; + return (0); + default: + return (-1); + } +} + +int +do_read(const char *pfile) +{ + int fd, ret = 0; + char buf[BUFSIZ] = { 0 }; + + if (pfile == NULL) { + return (-1); + } + + if ((fd = open(pfile, O_RDONLY, ALL_MODE)) == -1) { + return (-1); + } + if (read(fd, buf, sizeof (buf)) == -1) { + ret = errno; + } + (void) close(fd); + + if (ret != 0) { + fprintf(stderr, "read(%d, buf, %d)\n", fd, sizeof (buf)); + exit(1); + } + + return (ret); +} + +int +do_write(const char *pfile) +{ + int fd, ret = 0; + char buf[BUFSIZ] = "call function do_write()"; + + if (pfile == NULL) { + return (-1); + } + + if ((fd = open(pfile, O_WRONLY, ALL_MODE)) == -1) { + return (-1); + } + if (write(fd, buf, strlen(buf)) == -1) { + ret = errno; + } + (void) close(fd); + + if (ret != 0) { + fprintf(stderr, "write(%d, buf, %d)\n", fd, strlen(buf)); + exit(1); + } + + return (ret); +} + +int +do_link(const char *pfile) +{ + int ret = 0; + char link_file[BUFSIZ] = { 0 }; + char *ptr = link_file; + + if (pfile == NULL) { + return (-1); + } + + /* + * Figure out source file directory name, and create + * the link file in the same directory. + */ + snprintf(link_file, sizeof (link_file), "%s", pfile); + ptr = strrchr(link_file, '/'); + snprintf(ptr + 1, + sizeof (link_file) - (ptr + 1 - link_file), "link_file"); + + if (link(pfile, link_file) == -1) { + ret = errno; + } + if (ret != 0) { + fprintf(stderr, "link(%s, %s)\n", pfile, link_file); + exit(1); + } + + unlink(link_file); + return (ret); +} + +int +do_creat(const char *pfile) +{ + int fd, ret = 0; + + if (pfile == NULL) { + return (-1); + } + + if ((fd = creat(pfile, ALL_MODE)) == -1) { + ret = errno; + } + if (fd != -1) { + (void) close(fd); + } + + if (ret != 0) { + fprintf(stderr, "creat(%s, ALL_MODE)\n", pfile); + exit(1); + } + + return (ret); +} + +int +do_utime(const char *pfile) +{ + int ret = 0; + + if (pfile == NULL) { + return (-1); + } + + /* + * Times of the file are set to the current time + */ + if (utime(pfile, NULL) == -1) { + ret = errno; + } + if (ret != 0) { + fprintf(stderr, "utime(%s, NULL)\n", pfile); + exit(1); + } + + return (ret); +} + +int +do_chmod(const char *pfile) +{ + int ret = 0; + + if (pfile == NULL) { + return (-1); + } + + if (chmod(pfile, ALL_MODE) == -1) { + ret = errno; + } + if (ret != 0) { + fprintf(stderr, "chmod(%s, ALL_MODE)\n", pfile); + exit(1); + } + + return (ret); +} + +int +do_chown(const char *pfile) +{ + int ret = 0; + + if (pfile == NULL) { + return (-1); + } + + if (chown(pfile, getuid(), getgid()) == -1) { + ret = errno; + } + if (ret != 0) { + fprintf(stderr, "chown(%s, %d, %d)\n", pfile, (int)getuid(), + (int)getgid()); + exit(1); + } + + return (ret); +} diff --git a/tests/sys/cddl/zfs/tests/ctime/ctime_test.sh b/tests/sys/cddl/zfs/tests/ctime/ctime_test.sh new file mode 100755 index 00000000000..d4a1c52c776 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/ctime/ctime_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2014 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case ctime_001_pos cleanup +ctime_001_pos_head() +{ + atf_set "descr" "A file's ctime should change when the file is modified" + atf_set "require.progs" zfs +} +ctime_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/ctime.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + $(atf_get_srcdir)/ctime_001_pos || atf_fail "Testcase failed" +} +ctime_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/ctime.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case ctime_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/ctime/setup.ksh b/tests/sys/cddl/zfs/tests/ctime/setup.ksh new file mode 100644 index 00000000000..e3aad622ec2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/ctime/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/delegate/Makefile b/tests/sys/cddl/zfs/tests/delegate/Makefile new file mode 100644 index 00000000000..905d62621ee --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/Makefile @@ -0,0 +1,40 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/delegate +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfs_allow_test +ATF_TESTS_KSH93+= zfs_unallow_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= delegate.cfg +${PACKAGE}FILES+= delegate_common.kshlib +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs_allow_001_pos.ksh +${PACKAGE}FILES+= zfs_allow_002_pos.ksh +${PACKAGE}FILES+= zfs_allow_003_pos.ksh +${PACKAGE}FILES+= zfs_allow_004_pos.ksh +${PACKAGE}FILES+= zfs_allow_005_pos.ksh +${PACKAGE}FILES+= zfs_allow_006_pos.ksh +${PACKAGE}FILES+= zfs_allow_007_pos.ksh +${PACKAGE}FILES+= zfs_allow_008_pos.ksh +${PACKAGE}FILES+= zfs_allow_009_neg.ksh +${PACKAGE}FILES+= zfs_allow_010_pos.ksh +${PACKAGE}FILES+= zfs_allow_011_neg.ksh +${PACKAGE}FILES+= zfs_allow_012_neg.ksh +${PACKAGE}FILES+= zfs_unallow_001_pos.ksh +${PACKAGE}FILES+= zfs_unallow_002_pos.ksh +${PACKAGE}FILES+= zfs_unallow_003_pos.ksh +${PACKAGE}FILES+= zfs_unallow_004_pos.ksh +${PACKAGE}FILES+= zfs_unallow_005_pos.ksh +${PACKAGE}FILES+= zfs_unallow_006_pos.ksh +${PACKAGE}FILES+= zfs_unallow_007_neg.ksh +${PACKAGE}FILES+= zfs_unallow_008_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/delegate/cleanup.ksh b/tests/sys/cddl/zfs/tests/delegate/cleanup.ksh new file mode 100644 index 00000000000..58ee9b63f91 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +cleanup_user_group + +default_cleanup +log_pass diff --git a/tests/sys/cddl/zfs/tests/delegate/delegate.cfg b/tests/sys/cddl/zfs/tests/delegate/delegate.cfg new file mode 100644 index 00000000000..ce42196878d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/delegate.cfg @@ -0,0 +1,62 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)delegate.cfg 1.3 08/08/15 SMI" +# + +export STF_TIMEOUT=1800 + +export NISSTAFILE=$TMPDIR/nis_state + +export STAFF_GROUP=zfsgrp +export STAFF1=staff1 +export STAFF2=staff2 + +export OTHER_GROUP=othergrp +export OTHER1=other1 +export OTHER2=other2 + +export EVERYONE="$STAFF1 $STAFF2 $OTHER1 $OTHER2" + +export LOCAL_SET="snapshot" +export LOCAL_DESC_SET="readonly,checksum" +export DESC_SET="compression" + +export TESTVOL=testvol.${TESTCASE_ID} +export VOLSIZE=150m + +export ROOT_TESTVOL=$TESTPOOL/$TESTVOL +export ROOT_TESTFS=$TESTPOOL/$TESTFS +export SUBFS=$ROOT_TESTFS/SUBFS +export SUBFS2=$ROOT_TESTFS/SUBFS2 + +DATASETS="$ROOT_TESTFS" +if is_global_zone ; then + DATASETS="$DATASETS $ROOT_TESTVOL" +fi +export DATASETS diff --git a/tests/sys/cddl/zfs/tests/delegate/delegate_common.kshlib b/tests/sys/cddl/zfs/tests/delegate/delegate_common.kshlib new file mode 100644 index 00000000000..bbf5985aef4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/delegate_common.kshlib @@ -0,0 +1,1902 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)delegate_common.kshlib 1.6 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Cleanup exist user/group. +# +function cleanup_user_group +{ + typeset i + for i in $STAFF1 $STAFF2 $OTHER1 $OTHER2 ; do + del_user $i + done + for i in $STAFF_GROUP $OTHER_GROUP ; do + del_group $i + done + + return 0 +} + +# +# Restore test file system to the original status. +# +function restore_root_datasets +{ + if datasetexists $ROOT_TESTFS ; then + log_must $ZFS destroy -Rf $ROOT_TESTFS + fi + log_must $ZFS create $ROOT_TESTFS + + if is_global_zone ; then + if datasetexists $ROOT_TESTVOL ; then + log_must $ZFS destroy -Rf $ROOT_TESTVOL + fi + log_must $ZFS create -V $VOLSIZE $ROOT_TESTVOL + fi + + return 0 +} + +# +# Verify the specified user have permission on the dataset +# +# $1 dataset +# $2 permissions which are separated by comma(,) +# $3-n users +# +function verify_perm +{ + typeset dtst=$1 + typeset permissions=$2 + shift 2 + + if [[ -z $@ || -z $permissions || -z $dtst ]]; then + return 1 + fi + + typeset type=$(get_prop type $dtst) + permissions=$($ECHO $permissions | $TR -s "," " ") + + typeset user + for user in $@; do + typeset perm + for perm in $permissions; do + typeset -i ret=1 + if [[ $type == "filesystem" ]]; then + check_fs_perm $user $perm $dtst + ret=$? + elif [[ $type == "volume" ]]; then + check_vol_perm $user $perm $dtst + ret=$? + fi + + if ((ret != 0)) ; then + log_note "Fail: $user should have $perm " \ + "on $dtst" + return 1 + fi + done + done + + return 0 +} + +# +# Verify the specified user have no permission on the dataset +# +# $1 dataset +# $2 permissions which are separated by comma(,) +# $3-n users +# +function verify_noperm +{ + typeset dtst=$1 + typeset permissions=$2 + shift 2 + + if [[ -z $@ || -z $permissions || -z $dtst ]]; then + return 1 + fi + + typeset type=$(get_prop type $dtst) + permissions=$($ECHO $permissions | $TR -s "," " ") + + typeset user + for user in $@; do + typeset perm + for perm in $permissions; do + typeset -i ret=1 + if [[ $type == "filesystem" ]]; then + check_fs_perm $user $perm $dtst + ret=$? + elif [[ $type == "volume" ]]; then + check_vol_perm $user $perm $dtst + ret=$? + fi + + if ((ret == 0)) ; then + log_note "Fail: $user should not have $perm " \ + "on $dtst" + return 1 + fi + done + done + + return 0 +} + +function user_run +{ + typeset user=$1 + typeset group=$($GROUPS $user) + + shift + + eval \$RUNWATTR -u \$user -g \$group \"$@\" > /dev/null 2>&1 + return $? +} + +function common_perm +{ + typeset user=$1 + typeset perm=$2 + typeset dtst=$3 + + typeset -i ret=1 + case $perm in + send) + verify_send $user $perm $dtst + ret=$? + ;; + allow) + verify_allow $user $perm $dtst + ret=$? + ;; + userprop) + verify_userprop $user $perm $dtst + ret=$? + ;; + compression|checksum|readonly) + verify_ccr $user $perm $dtst + ret=$? + ;; + copies) + verify_copies $user $perm $dtst + ret=$? + ;; + reservation) + verify_reservation $user $perm $dtst + ret=$? + ;; + *) + ret=1 + ;; + esac + + return $ret +} + +function check_fs_perm +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset -i ret=1 + case $perm in + create) + verify_fs_create $user $perm $fs + ret=$? + ;; + destroy) + verify_fs_destroy $user $perm $fs + ret=$? + ;; + snapshot) + verify_fs_snapshot $user $perm $fs + ret=$? + ;; + rollback) + verify_fs_rollback $user $perm $fs + ret=$? + ;; + clone) + verify_fs_clone $user $perm $fs + ret=$? + ;; + rename) + verify_fs_rename $user $perm $fs + ret=$? + ;; + mount) + verify_fs_mount $user $perm $fs + ret=$? + ;; + share) + verify_fs_share $user $perm $fs + ret=$? + ;; + mountpoint) + verify_fs_mountpoint $user $perm $fs + ret=$? + ;; + promote) + verify_fs_promote $user $perm $fs + ret=$? + ;; + canmount) + verify_fs_canmount $user $perm $fs + ret=$? + ;; + recordsize) + verify_fs_recordsize $user $perm $fs + ret=$? + ;; + quota) + verify_fs_quota $user $perm $fs + ret=$? + ;; + aclmode) + verify_fs_aclmode $user $perm $fs + ret=$? + ;; + aclinherit) + verify_fs_aclinherit $user $perm $fs + ret=$? + ;; + snapdir) + verify_fs_snapdir $user $perm $fs + ret=$? + ;; + atime|exec|devices|setuid|xattr) + verify_fs_aedsx $user $perm $fs + ret=$? + ;; + zoned) + verify_fs_zoned $user $perm $fs + ret=$? + ;; + sharenfs) + verify_fs_sharenfs $user $perm $fs + ret=$? + ;; + shareiscsi) + verify_fs_shareiscsi $user $perm $fs + ret=$? + ;; + receive) + verify_fs_receive $user $perm $fs + ret=$? + ;; + *) + common_perm $user $perm $fs + ret=$? + ;; + esac + + return $ret +} + +function check_vol_perm +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + typeset -i ret=1 + case $perm in + destroy) + verify_vol_destroy $user $perm $vol + ret=$? + ;; + snapshot) + verify_vol_snapshot $user $perm $vol + ret=$? + ;; + rollback) + verify_vol_rollback $user $perm $vol + ret=$? + ;; + clone) + verify_vol_clone $user $perm $vol + ret=$? + ;; + rename) + verify_vol_rename $user $perm $vol + ret=$? + ;; + promote) + verify_vol_promote $user $perm $vol + ret=$? + ;; + volsize) + verify_vol_volsize $user $perm $vol + ret=$? + ;; + shareiscsi) + verify_vol_shareiscsi $user $perm $vol + ret=$? + ;; + *) + common_perm $user $perm $vol + ret=$? + ;; + esac + + return $ret +} + +function setup_unallow_testenv +{ + log_must restore_root_datasets + + log_must $ZFS create $SUBFS + + for dtst in $DATASETS ; do + log_must $ZFS allow -l $STAFF1 $LOCAL_SET $dtst + log_must $ZFS allow -d $STAFF2 $DESC_SET $dtst + log_must $ZFS allow $OTHER1 $LOCAL_DESC_SET $dtst + log_must $ZFS allow $OTHER2 $LOCAL_DESC_SET $dtst + + log_must verify_perm $dtst $LOCAL_SET $STAFF1 + log_must verify_perm $dtst $LOCAL_DESC_SET $OTHER1 + log_must verify_perm $dtst $LOCAL_DESC_SET $OTHER2 + if [[ $dtst == $ROOT_TESTFS ]]; then + log_must verify_perm $SUBFS $DESC_SET $STAFF2 + log_must verify_perm $SUBFS $LOCAL_DESC_SET $OTHER1 + log_must verify_perm $SUBFS $LOCAL_DESC_SET $OTHER2 + fi + done + + return 0 +} + +# +# Verify permission send for specified user on the dataset +# $1 user +# $2 permission +# $3 dataset +# +function verify_send +{ + typeset user=$1 + typeset perm=$2 + typeset dtst=$3 + + typeset oldval + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset snap=$dtst@snap.$stamp + + typeset -i ret=1 + + log_must $ZFS snapshot $snap + typeset bak_user=$TMPDIR/bak.$user.$stamp + typeset bak_root=$TMPDIR/bak.root.$stamp + + user_run $user eval "$ZFS send $snap > $bak_user" + log_must eval "$ZFS send $snap > $bak_root" + + if [[ $(checksum $bak_user) == $(checksum $bak_root) ]]; then + ret=0 + fi + + $RM -rf $bak_user > /dev/null + $RM -rf $bak_root > /dev/null + + return $ret +} + +function verify_fs_receive +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset newfs=$fs/newfs.$stamp + typeset newvol=$fs/newvol.$stamp + typeset bak_user=$TMPDIR/bak.$user.$stamp + typeset bak_root=$TMPDIR/bak.root.$stamp + + log_must $ZFS create $newfs + typeset datasets="$newfs" + if is_global_zone ; then + log_must $ZFS create -V $VOLSIZE $newvol + datasets="$newfs $newvol" + fi + + for dtst in $datasets ; do + + typeset dtstsnap=$dtst@snap.$stamp + log_must $ZFS snapshot $dtstsnap + + log_must eval "$ZFS send $dtstsnap > $bak_root" + log_must $ZFS destroy -rf $dtst + + user_run $user eval "$ZFS receive $dtst < $bak_root" + if datasetexists $dtstsnap ; then + return 1 + fi + + log_must $ZFS allow $user create $fs + user_run $user eval "$ZFS receive $dtst < $bak_root" + log_must $ZFS unallow $user create $fs + if datasetexists $dtstsnap ; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + user_run $user eval "$ZFS receive $dtst < $bak_root" + log_must $ZFS unallow $user mount $fs + if datasetexists $dtstsnap ; then + return 1 + fi + + log_must $ZFS allow $user mount,create $fs + user_run $user eval "$ZFS receive $dtst < $bak_root" + log_must $ZFS unallow $user mount,create $fs + if ! datasetexists $dtstsnap ; then + return 1 + fi + + # check the data integrity + log_must eval "$ZFS send $dtstsnap > $bak_user" + log_must $ZFS destroy -rf $dtst + log_must eval "$ZFS receive $dtst < $bak_root" + log_must eval "$ZFS send $dtstsnap > $bak_root" + log_must $ZFS destroy -rf $dtst + if [[ $(checksum $bak_user) != $(checksum $bak_root) ]]; then + return 1 + fi + + $RM -rf $bak_user > /dev/null + $RM -rf $bak_root > /dev/null + + done + + return 0 +} + +function verify_userprop +{ + typeset user=$1 + typeset perm=$2 + typeset dtst=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + + user_run $user $ZFS set "$user:ts=$stamp" $dtst + if [[ $stamp != $(get_prop "$user:ts" $dtst) ]]; then + return 1 + fi + + return 0 +} + +function verify_ccr +{ + typeset user=$1 + typeset perm=$2 + typeset dtst=$3 + + typeset oldval + + set -A modes "on" "off" + oldval=$(get_prop $perm $dtst) + if [[ $oldval == "on" ]]; then + n=1 + elif [[ $oldval == "off" ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $dtst" + user_run $user $ZFS set $perm=${modes[$n]} $dtst + if [[ ${modes[$n]} != $(get_prop $perm $dtst) ]]; then + return 1 + fi + + return 0 +} + +function verify_copies +{ + typeset user=$1 + typeset perm=$2 + typeset dtst=$3 + + typeset oldval + + set -A modes 1 2 3 + oldval=$(get_prop $perm $dtst) + if [[ $oldval -eq 1 ]]; then + n=1 + elif [[ $oldval -eq 2 ]]; then + n=2 + elif [[ $oldval -eq 3 ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $dtst" + user_run $user $ZFS set $perm=${modes[$n]} $dtst + if [[ ${modes[$n]} != $(get_prop $perm $dtst) ]]; then + return 1 + fi + + return 0 +} + +function verify_reservation +{ + typeset user=$1 + typeset perm=$2 + typeset dtst=$3 + + typeset value32m=$(( 1024 * 1024 * 32 )) + typeset oldval=$(get_prop reservation $dtst) + user_run $user $ZFS set reservation=$value32m $dtst + if [[ $value32m != $(get_prop reservation $dtst) ]]; then + log_must $ZFS set reservation=$oldval $dtst + return 1 + fi + + log_must $ZFS set reservation=$oldval $dtst + return 0 +} + +function verify_fs_create +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset newfs=$fs/nfs.$stamp + typeset newvol=$fs/nvol.$stamp + typeset check_refrev=false + + user_run $user $ZFS create $newfs + if datasetexists $newfs ; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + user_run $user $ZFS create $newfs + log_must $ZFS unallow $user mount $fs + if ! datasetexists $newfs ; then + return 1 + fi + if support_refrev $newfs; then + check_refrev=true + fi + log_must $ZFS destroy $newfs + + if is_global_zone ; then + # mount permission is required for sparse volume + user_run $user $ZFS create -V 150m -s $newvol + if datasetexists $newvol ; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + user_run $user $ZFS create -V 150m -s $newvol + log_must $ZFS unallow $user mount $fs + if ! datasetexists $newvol ; then + return 1 + fi + log_must $ZFS destroy $newvol + + # mount and reserveration permission are + # required for normal volume + user_run $user $ZFS create -V 150m $newvol + if datasetexists $newvol ; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + user_run $user $ZFS create -V 150m $newvol + log_must $ZFS unallow $user mount $fs + if datasetexists $newvol ; then + return 1 + fi + + log_must $ZFS allow $user reservation $fs + user_run $user $ZFS create -V 150m $newvol + log_must $ZFS unallow $user reservation $fs + if datasetexists $newvol ; then + return 1 + fi + + if [[ $check_refrev == true ]]; then + log_must $ZFS allow $user refreservation $fs + user_run $user $ZFS create -V 150m $newvol + log_must $ZFS unallow $user refreservation $fs + if datasetexists $newvol ; then + return 1 + fi + fi + + log_must $ZFS allow $user mount $fs + log_must $ZFS allow $user reservation $fs + if [[ $check_refrev == true ]]; then + log_must $ZFS allow $user refreservation $fs + fi + user_run $user $ZFS create -V 150m $newvol + log_must $ZFS unallow $user mount $fs + log_must $ZFS unallow $user reservation $fs + if [[ $check_refrev == true ]]; then + log_must $ZFS unallow $user refreservation $fs + fi + if ! datasetexists $newvol ; then + return 1 + fi + log_must $ZFS destroy $newvol + fi + + return 0 +} + +function verify_fs_destroy +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + if ! ismounted $fs ; then + user_run $user $ZFS destroy $fs + if datasetexists $fs ; then + return 1 + fi + fi + + if ismounted $fs ; then + user_run $user $ZFS destroy $fs + if ! datasetexists $fs ; then + return 1 + fi + + # mount permission is required + log_must $ZFS allow $user mount $fs + user_run $user $ZFS destroy $fs + if datasetexists $fs ; then + return 1 + fi + fi + + return 0 +} + +function verify_fs_snapshot +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset snap=$fs@snap.$stamp + typeset mntpt=$(get_prop mountpoint $fs) + + if [[ "yes" == $(get_prop mounted $fs) ]]; then + log_must $ZFS umount $fs + fi + user_run $user $ZFS snapshot $snap + if datasetexists $snap ; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + user_run $user $ZFS snapshot $snap + log_must $ZFS unallow $user mount $fs + if ! datasetexists $snap ; then + return 1 + fi + log_must $ZFS destroy $snap + + if [[ "no" == $(get_prop mounted $fs) ]]; then + log_must $ZFS mount $fs + fi + user_run $user $ZFS snapshot $snap + if datasetexists $snap ; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + user_run $user $ZFS snapshot $snap + log_must $ZFS unallow $user mount $fs + if ! datasetexists $snap ; then + return 1 + fi + log_must $ZFS destroy $snap + + typeset snapdir=${mntpt}/$(get_snapdir_name)/snap.$stamp + user_run $user $MKDIR $snapdir + if datasetexists $snap ; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + user_run $user $MKDIR $snapdir + log_must $ZFS unallow $user mount $fs + if ! datasetexists $snap ; then + return 1 + fi + log_must $ZFS destroy $snap + + return 0 +} + +function verify_fs_rollback +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset snap=$fs@snap.$stamp + typeset mntpt=$(get_prop mountpoint $fs) + + oldval=$(datasetcksum $fs) + log_must $ZFS snapshot $snap + + if ! ismounted $fs; then + log_must $ZFS mount $fs + fi + log_must $TOUCH $mntpt/testfile.$stamp + + user_run $user $ZFS rollback -R $snap + $SLEEP 10 + if is_global_zone ; then + if [[ $oldval == $(datasetcksum $fs) ]]; then + return 1 + fi + else + # datasetcksum can not be used in local zone + if [[ ! -e $mntpt/testfile.$stamp ]]; then + return 1 + fi + fi + + # rollback on mounted fs has to be with mount permission + log_must $ZFS allow $user mount $fs + user_run $user $ZFS rollback -R $snap + log_must $ZFS unallow $user mount $fs + $SLEEP 10 + if is_global_zone ; then + if [[ $oldval != $(datasetcksum $fs) ]]; then + return 1 + fi + else + # datasetcksum can not be used in local zone + if [[ -e $mntpt/testfile.$stamp ]]; then + return 1 + fi + fi + + return 0 +} + +function verify_fs_clone +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset basefs=${fs%/*} + typeset snap=$fs@snap.$stamp + typeset clone=$basefs/cfs.$stamp + + log_must $ZFS snapshot $snap + user_run $user $ZFS clone $snap $clone + if datasetexists $clone ; then + return 1 + fi + + log_must $ZFS allow $user create $basefs + user_run $user $ZFS clone $snap $clone + log_must $ZFS unallow $user create $basefs + if datasetexists $clone ; then + return 1 + fi + + log_must $ZFS allow $user mount $basefs + user_run $user $ZFS clone $snap $clone + log_must $ZFS unallow $user mount $basefs + if datasetexists $clone ; then + return 1 + fi + + log_must $ZFS allow $user mount $basefs + log_must $ZFS allow $user create $basefs + user_run $user $ZFS clone $snap $clone + log_must $ZFS unallow $user create $basefs + log_must $ZFS unallow $user mount $basefs + if ! datasetexists $clone ; then + return 1 + fi + + log_must $ZFS destroy -R $snap + + return 0 +} + +function verify_fs_rename +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset basefs=${fs%/*} + typeset snap=$fs@snap.$stamp + typeset renamefs=$basefs/nfs.$stamp + + if ! ismounted $fs; then + log_must $ZFS mount $fs + fi + + # case 1 + user_run $user $ZFS rename $fs $renamefs + if datasetexists $renamefs ; then + return 1 + fi + + # case 2 + log_must $ZFS allow $user create $basefs + user_run $user $ZFS rename $fs $renamefs + log_must $ZFS unallow $user create $basefs + if datasetexists $renamefs ; then + return 1 + fi + + # case 3 + log_must $ZFS allow $user mount $basefs + user_run $user $ZFS rename $fs $renamefs + log_must $ZFS unallow $user mount $basefs + if datasetexists $renamefs ; then + return 1 + fi + + # case 4 + log_must $ZFS allow $user mount $fs + user_run $user $ZFS rename $fs $renamefs + if datasetexists $renamefs ; then + log_must $ZFS unallow $user mount $renamefs + return 1 + fi + log_must $ZFS unallow $user mount $fs + + # case 5 + log_must $ZFS allow $user create $basefs + log_must $ZFS allow $user mount $fs + user_run $user $ZFS rename $fs $renamefs + log_must $ZFS unallow $user create $basefs + if datasetexists $renamefs ; then + log_must $ZFS unallow $user mount $renamefs + return 1 + fi + log_must $ZFS unallow $user mount $fs + + # case 6 + log_must $ZFS allow $user mount $basefs + log_must $ZFS allow $user mount $fs + user_run $user $ZFS rename $fs $renamefs + log_must $ZFS unallow $user mount $basefs + if datasetexists $renamefs ; then + log_must $ZFS unallow $user mount $renamefs + return 1 + fi + log_must $ZFS unallow $user mount $fs + + # case 7 + log_must $ZFS allow $user create $basefs + log_must $ZFS allow $user mount $basefs + user_run $user $ZFS rename $fs $renamefs + log_must $ZFS unallow $user mount $basefs + log_must $ZFS unallow $user create $basefs + if ! datasetexists $renamefs ; then + return 1 + fi + + log_must $ZFS rename $renamefs $fs + + return 0 +} + +function verify_fs_mount +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset mntpt=$(get_prop mountpoint $fs) + typeset newmntpt=$TMPDIR/mnt.$stamp + + if ismounted $fs ; then + user_run $user $ZFS unmount $fs + if ismounted $fs ; then + return 1 + fi + fi + + if ! ismounted $fs ; then + log_must $ZFS set mountpoint=$newmntpt $fs + log_must $RM -rf $newmntpt + log_must $MKDIR $newmntpt + + user_run $user $ZFS mount $fs + if ismounted $fs ; then + return 1 + fi + + # mountpoint's owner must be the user + log_must $CHOWN $user $newmntpt + user_run $user $ZFS mount $fs + if ! ismounted $fs ; then + return 1 + fi + log_must $ZFS umount $fs + log_must $RM -rf $newmntpt + log_must $ZFS set mountpoint=$mntpt $fs + fi + + return 0 +} + +function verify_fs_share +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset mntpt=$(get_prop mountpoint $fs) + + typeset stat=$($SVCS -H -o STA nfs/server:default) + if [[ $stat != "ON" ]]; then + log_note "Current nfs/server status: $stat" + # legacy share + user_run $user $SHARE $mntpt + if is_shared $fs; then + return 1 + fi + + # sharenfs=on + log_must $ZFS set sharenfs=on $fs + user_run $user $ZFS share $fs + if is_shared $fs; then + log_must $ZFS set sharenfs=off $fs + return 1 + fi + log_must $ZFS set sharenfs=off $fs + fi + + # turn on nfs/server service if it is not enabled + typeset tmpshare=$TMPDIR/a.${TESTCASE_ID} + $RM -rf $tmpshare + log_must $MKDIR -p $tmpshare + log_must $SHARE $tmpshare + + # legacy share + user_run $user $SHARE $mntpt + if ! is_shared $fs ; then + log_must $UNSHARE $tmpshare + log_must $RM -rf $tmpshare + return 1 + fi + + user_run $user $UNSHARE $mntpt + if is_shared $fs ; then + log_must $UNSHARE $tmpshare + log_must $RM -rf $tmpshare + return 1 + fi + + # sharenfs=on + log_must $ZFS set sharenfs=on $fs + user_run $user $ZFS share $fs + if ! is_shared $fs; then + log_must $ZFS set sharenfs=off $fs + return 1 + fi + + user_run $user $ZFS unshare $fs + if is_shared $fs; then + log_must $ZFS set sharenfs=off $fs + return 1 + fi + log_must $ZFS set sharenfs=off $fs + + log_must $UNSHARE $tmpshare + log_must $RM -rf $tmpshare + + return 0 +} + +function verify_fs_mountpoint +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset mntpt=$(get_prop mountpoint $fs) + typeset newmntpt=$TMPDIR/mnt.$stamp + + if ! ismounted $fs ; then + user_run $user $ZFS set mountpoint=$newmntpt $fs + if [[ $newmntpt != \ + $(get_prop mountpoint $fs) ]] ; then + return 1 + fi + log_must $ZFS set mountpoint=$mntpt $fs + fi + + if ismounted $fs ; then + user_run $user $ZFS set mountpoint=$newmntpt $fs + if [[ $mntpt != $(get_prop mountpoint $fs) ]] ; + then + return 1 + fi + + # require mount permission when fs is mounted + log_must $ZFS allow $user mount $fs + user_run $user $ZFS set mountpoint=$newmntpt $fs + log_must $ZFS unallow $user mount $fs + if [[ $newmntpt != \ + $(get_prop mountpoint $fs) ]] ; then + return 1 + fi + log_must $ZFS set mountpoint=$mntpt $fs + fi + + return 0 +} + +function verify_fs_promote +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset basefs=${fs%/*} + typeset snap=$fs@snap.$stamp + typeset clone=$basefs/cfs.$stamp + + log_must $ZFS snapshot $snap + log_must $ZFS clone $snap $clone + log_must $ZFS promote $clone + + typeset fs_orig=$(get_prop origin $fs) + typeset clone_orig=$(get_prop origin $clone) + + user_run $user $ZFS promote $fs + # promote should fail if original fs does not have + # promote permission + if [[ $fs_orig != $(get_prop origin $fs) || \ + $clone_orig != $(get_prop origin $clone) ]]; then + return 1 + fi + + log_must $ZFS allow $user promote $clone + user_run $user $ZFS promote $fs + log_must $ZFS unallow $user promote $clone + if [[ $fs_orig != $(get_prop origin $fs) || \ + $clone_orig != $(get_prop origin $clone) ]]; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + user_run $user $ZFS promote $fs + log_must $ZFS unallow $user mount $fs + if [[ $fs_orig != $(get_prop origin $fs) || \ + $clone_orig != $(get_prop origin $clone) ]]; then + return 1 + fi + + log_must $ZFS allow $user mount $fs + log_must $ZFS allow $user promote $clone + user_run $user $ZFS promote $fs + log_must $ZFS unallow $user promote $clone + log_must $ZFS unallow $user mount $fs + if [[ $snap != $(get_prop origin $clone) || \ + $clone_orig != $(get_prop origin $fs) ]]; then + return 1 + fi + + return 0 +} + +function verify_fs_canmount +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + + if ! ismounted $fs ; then + set -A modes "on" "off" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "on" ]]; then + n=1 + elif [[ $oldval == "off" ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $fs" + user_run $user $ZFS set $perm=${modes[$n]} $fs + if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; + then + return 1 + fi + fi + + + # fs is mounted + if ismounted $fs ; then + # property value does not change if + # no mount permission + set -A modes "on" "off" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "on" ]]; then + n=1 + elif [[ $oldval == "off" ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $fs" + log_must $ZFS allow $user mount $fs + user_run $user $ZFS set $perm=${modes[$n]} $fs + log_must $ZFS unallow $user mount $fs + if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; + then + return 1 + fi + fi + + return 0 +} + +function verify_fs_recordsize +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset value8k=$(( 1024 * 8 )) + user_run $user $ZFS set recordsize=$value8k $fs + if [[ $value8k != $(get_prop recordsize $fs) ]]; then + return 1 + fi + + return 0 +} + +function verify_fs_quota +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset value32m=$(( 1024 * 1024 * 32 )) + user_run $user $ZFS set quota=$value32m $fs + if [[ $value32m != $(get_prop quota $fs) ]]; then + return 1 + fi + + return 0 +} + +function verify_fs_aclmode +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + set -A modes "discard" "groupmask" "passthrough" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "discard" ]]; then + n=1 + elif [[ $oldval == "groupmask" ]]; then + n=2 + elif [[ $oldval == "passthrough" ]]; then + n=0 + fi + log_note "$user $ZFS set aclmode=${modes[$n]} $fs" + user_run $user $ZFS set aclmode=${modes[$n]} $fs + if [[ ${modes[$n]} != $(get_prop aclmode $fs) ]]; then + return 1 + fi + + return 0 +} + +function verify_fs_aclinherit +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + # + # PSARC/2008/231 change the default value of aclinherit to "restricted" + # but still keep the old interface of "secure" + # + + typeset oldval + set -A modes "discard" "noallow" "secure" "passthrough" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "discard" ]]; then + n=1 + elif [[ $oldval == "noallow" ]]; then + n=2 + elif [[ $oldval == "secure" || $oldval == "restricted" ]]; then + n=3 + elif [[ $oldval == "passthrough" ]]; then + n=0 + fi + log_note "$user $ZFS set aclinherit=${modes[$n]} $fs" + user_run $user $ZFS set aclinherit=${modes[$n]} $fs + + typeset newval=$(get_prop aclinherit $fs) + if [[ ${modes[$n]} == "secure" && $newval == "restricted" ]]; then + return 0 + elif [[ ${modes[$n]} != $(get_prop aclinherit $fs) ]]; then + return 1 + fi + + return 0 +} + +function verify_fs_snapdir +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + set -A modes "visible" "hidden" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "visible" ]]; then + n=1 + elif [[ $oldval == "hidden" ]]; then + n=0 + fi + log_note "$user $ZFS set snapdir=${modes[$n]} $fs" + user_run $user $ZFS set snapdir=${modes[$n]} $fs + if [[ ${modes[$n]} != $(get_prop snapdir $fs) ]]; then + return 1 + fi + + return 0 +} + +function verify_fs_aedsx +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + set -A modes "on" "off" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "on" ]]; then + n=1 + elif [[ $oldval == "off" ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $fs" + user_run $user $ZFS set $perm=${modes[$n]} $fs + if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then + return 1 + fi + + return 0 +} + +function verify_fs_zoned +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + set -A modes "on" "off" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "on" ]]; then + n=1 + elif [[ $oldval == "off" ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $fs" + if is_global_zone ; then + if ! ismounted $fs ; then + user_run $user $ZFS set \ + $perm=${modes[$n]} $fs + if [[ ${modes[$n]} != \ + $(get_prop $perm $fs) ]]; then + return 1 + fi + if [[ $n -eq 0 ]]; then + log_mustnot $ZFS mount $fs + else + log_must $ZFS mount $fs + fi + fi + + if ismounted $fs; then + # n always is 1 in this case + user_run $user $ZFS set \ + $perm=${modes[$n]} $fs + if [[ $oldval != \ + $(get_prop $perm $fs) ]]; then + return 1 + fi + + # mount permission is needed + # to make zoned=on + log_must $ZFS allow $user mount $fs + user_run $user $ZFS set \ + $perm=${modes[$n]} $fs + log_must $ZFS unallow $user mount $fs + if [[ ${modes[$n]} != \ + $(get_prop $perm $fs) ]]; then + return 1 + fi + fi + fi + + if ! is_global_zone; then + user_run $user $ZFS set $perm=${modes[$n]} $fs + if [[ $oldval != $(get_prop $perm $fs) ]]; then + return 1 + fi + fi + + return 0 +} + +function verify_fs_sharenfs +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + set -A modes "on" "off" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "on" ]]; then + n=1 + elif [[ $oldval == "off" ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $fs" + user_run $user $ZFS set $perm=${modes[$n]} $fs + if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then + return 1 + fi + log_must $ZFS set $perm=$oldval $fs + + # turn on nfs/server service if it is not enabled + typeset tmpshare=$TMPDIR/a.${TESTCASE_ID} + $RM -rf $tmpshare + log_must $MKDIR -p $tmpshare + log_must $SHARE $tmpshare + + log_note "$user $ZFS set $perm=${modes[$n]} $fs" + user_run $user $ZFS set $perm=${modes[$n]} $fs + if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then + return 1 + fi + + user_run $user $ZFS share $fs + if is_shared $fs; then + return 1 + fi + + # share permission is needed + log_must $ZFS allow $user share $fs + user_run $user $ZFS share $fs + log_must $ZFS unallow $user share $fs + + if [[ $n -eq 0 ]] && ! is_shared $fs ; then + log_must $UNSHARE $tmpshare + log_must $RM -rf $tmpshare + return 1 + fi + + if [[ $n -eq 1 ]] && is_shared $fs ; then + log_must $UNSHARE $tmpshare + log_must $RM -rf $tmpshare + return 1 + fi + + log_must $UNSHARE $tmpshare + log_must $RM -rf $tmpshare + + return 0 +} + +function verify_fs_shareiscsi +{ + typeset user=$1 + typeset perm=$2 + typeset fs=$3 + + typeset oldval + set -A modes "on" "off" + oldval=$(get_prop $perm $fs) + if [[ $oldval == "on" ]]; then + n=1 + elif [[ $oldval == "off" ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $fs" + user_run $user $ZFS set $perm=${modes[$n]} $fs + if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then + return 1 + fi + + return 0 +} + +function verify_vol_destroy +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + user_run $user $ZFS destroy $vol + if ! datasetexists $vol ; then + return 1 + fi + + # mount permission is required + log_must $ZFS allow $user mount $vol + user_run $user $ZFS destroy $vol + if datasetexists $vol ; then + return 1 + fi + + return 0 +} + +function verify_vol_snapshot +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset basevol=${vol%/*} + typeset snap=$vol@snap.$stamp + + user_run $user $ZFS snapshot $snap + if datasetexists $snap ; then + return 1 + fi + + log_must $ZFS allow $user mount $vol + user_run $user $ZFS snapshot $snap + log_must $ZFS unallow $user mount $vol + if ! datasetexists $snap ; then + return 1 + fi + + return 0 +} + +function verify_vol_rollback +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset basevol=${vol%/*} + typeset snap=$vol@snap.$stamp + + typeset oldval + log_must $ZFS snapshot $snap + oldval=$(datasetcksum $vol) + + log_must $DD if=/dev/random of=/dev/zvol/rdsk/$vol \ + bs=512 count=1 + + user_run $user $ZFS rollback -R $snap + $SLEEP 10 + if [[ $oldval == $(datasetcksum $vol) ]]; then + return 1 + fi + + # rollback on volume has to be with mount permission + log_must $ZFS allow $user mount $vol + user_run $user $ZFS rollback -R $snap + $SLEEP 10 + log_must $ZFS unallow $user mount $vol + if [[ $oldval != $(datasetcksum $vol) ]]; then + return 1 + fi + + return 0 +} + +function verify_vol_clone +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset basevol=${vol%/*} + typeset snap=$vol@snap.$stamp + typeset clone=$basevol/cvol.$stamp + + log_must $ZFS snapshot $snap + + user_run $user $ZFS clone $snap $clone + if datasetexists $clone ; then + return 1 + fi + + log_must $ZFS allow $user create $basevol + user_run $user $ZFS clone $snap $clone + log_must $ZFS unallow $user create $basevol + if datasetexists $clone ; then + return 1 + fi + + log_must $ZFS allow $user mount $basevol + user_run $user $ZFS clone $snap $clone + log_must $ZFS unallow $user mount $basevol + if datasetexists $clone ; then + return 1 + fi + + # require create permission on parent and + # mount permission on itself as well + log_must $ZFS allow $user mount $basevol + log_must $ZFS allow $user create $basevol + user_run $user $ZFS clone $snap $clone + log_must $ZFS unallow $user create $basevol + log_must $ZFS unallow $user mount $basevol + if ! datasetexists $clone ; then + return 1 + fi + + return 0 +} + +function verify_vol_rename +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset basevol=${vol%/*} + typeset snap=$vol@snap.$stamp + typeset clone=$basevol/cvol.$stamp + typeset renamevol=$basevol/nvol.$stamp + + user_run $user $ZFS rename $vol $renamevol + if datasetexists $renamevol ; then + return 1 + fi + + log_must $ZFS allow $user create $basevol + user_run $user $ZFS rename $vol $renamevol + log_must $ZFS unallow $user create $basevol + if datasetexists $renamevol ; then + return 1 + fi + + log_must $ZFS allow $user mount $basevol + user_run $user $ZFS rename $vol $renamevol + log_must $ZFS unallow $user mount $basevol + if datasetexists $renamevol ; then + return 1 + fi + + # require both create permission on parent and + # mount permission on parent as well + log_must $ZFS allow $user mount $basevol + log_must $ZFS allow $user create $basevol + user_run $user $ZFS rename $vol $renamevol + log_must $ZFS unallow $user mount $basevol + log_must $ZFS unallow $user create $basevol + if ! datasetexists $renamevol ; then + return 1 + fi + + log_must $ZFS rename $renamevol $vol + + return 0 +} + +function verify_vol_promote +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S') + typeset basevol=${vol%/*} + typeset snap=$vol@snap.$stamp + typeset clone=$basevol/cvol.$stamp + + log_must $ZFS snapshot $snap + log_must $ZFS clone $snap $clone + log_must $ZFS promote $clone + + typeset vol_orig=$(get_prop origin $vol) + typeset clone_orig=$(get_prop origin $clone) + + # promote should fail if $vol and $clone + # miss either mount or promote permission + # case 1 + user_run $user $ZFS promote $vol + if [[ $vol_orig != $(get_prop origin $vol) || \ + $clone_orig != $(get_prop origin $clone) ]]; + then + return 1 + fi + + # promote should fail if $vol and $clone + # miss either mount or promote permission + # case 2 + log_must $ZFS allow $user promote $clone + user_run $user $ZFS promote $vol + log_must $ZFS unallow $user promote $clone + if [[ $vol_orig != $(get_prop origin $vol) || \ + $clone_orig != $(get_prop origin $clone) ]]; + then + return 1 + fi + + # promote should fail if $vol and $clone + # miss either mount or promote permission + # case 3 + log_must $ZFS allow $user mount $vol + user_run $user $ZFS promote $vol + log_must $ZFS unallow $user mount $vol + if [[ $vol_orig != $(get_prop origin $vol) || \ + $clone_orig != $(get_prop origin $clone) ]]; + then + return 1 + fi + + # promote should fail if $vol and $clone + # miss either mount or promote permission + # case 4 + log_must $ZFS allow $user mount $clone + user_run $user $ZFS promote $vol + log_must $ZFS unallow $user mount $clone + if [[ $vol_orig != $(get_prop origin $vol) || \ + $clone_orig != $(get_prop origin $clone) ]]; + then + return 1 + fi + + # promote should fail if $vol and $clone + # miss either mount or promote permission + # case 5 + log_must $ZFS allow $user promote $clone + log_must $ZFS allow $user mount $vol + user_run $user $ZFS promote $vol + log_must $ZFS unallow $user promote $clone + log_must $ZFS unallow $user mount $vol + if [[ $vol_orig != $(get_prop origin $vol) || \ + $clone_orig != $(get_prop origin $clone) ]]; + then + return 1 + fi + + # promote should fail if $vol and $clone + # miss either mount or promote permission + # case 6 + log_must $ZFS allow $user promote $clone + log_must $ZFS allow $user mount $clone + user_run $user $ZFS promote $vol + log_must $ZFS unallow $user promote $clone + log_must $ZFS unallow $user mount $vol + if [[ $vol_orig != $(get_prop origin $vol) || \ + $clone_orig != $(get_prop origin $clone) ]]; + then + return 1 + fi + + # promote should fail if $vol and $clone + # miss either mount or promote permission + # case 7 + log_must $ZFS allow $user mount $vol + log_must $ZFS allow $user mount $clone + user_run $user $ZFS promote $vol + log_must $ZFS unallow $user mount $vol + log_must $ZFS unallow $user mount $clone + if [[ $vol_orig != $(get_prop origin $vol) || \ + $clone_orig != $(get_prop origin $clone) ]]; + then + return 1 + fi + + # promote only succeeds when $vol and $clone + # have both mount and promote permission + # case 8 + log_must $ZFS allow $user promote $clone + log_must $ZFS allow $user mount $vol + log_must $ZFS allow $user mount $clone + user_run $user $ZFS promote $vol + log_must $ZFS unallow $user promote $clone + log_must $ZFS unallow $user mount $vol + log_must $ZFS unallow $user mount $clone + if [[ $snap != $(get_prop origin $clone) || \ + $clone_orig != $(get_prop origin $vol) ]]; then + return 1 + fi + + return 0 +} + +function verify_vol_volsize +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + typeset oldval + oldval=$(get_prop volsize $vol) + (( newval = oldval * 2 )) + + typeset check_refrev=false + if support_refrev $vol; then + check_refrev=true + fi + typeset reserv_size + + if [[ $check_refrev == true ]]; then + reserv_size=$(get_prop refreservation $vol) + else + reserv_size=$(get_prop reservation $vol) + fi + + if [[ "0" == $reserv_size ]]; then + # sparse volume + user_run $user $ZFS set volsize=$newval $vol + if [[ $oldval == $(get_prop volsize $vol) ]]; + then + return 1 + fi + + else + # normal volume, reservation permission + # is required + user_run $user $ZFS set volsize=$newval $vol + if [[ $newval == $(get_prop volsize $vol) ]]; + then + return 1 + fi + + log_must $ZFS allow $user reservation $vol + if [[ $check_refrev == true ]]; then + log_must $ZFS allow $user refreservation $vol + fi + user_run $user $ZFS set volsize=$newval $vol + log_must $ZFS unallow $user reservation $vol + if [[ $check_refrev == true ]]; then + log_must $ZFS unallow $user refreservation $vol + fi + if [[ $oldval == $(get_prop volsize $vol) ]]; + then + return 1 + fi + fi + + return 0 +} + +function verify_vol_shareiscsi +{ + typeset user=$1 + typeset perm=$2 + typeset vol=$3 + + typeset oldval + set -A modes "on" "off" + oldval=$(get_prop $perm $vol) + if [[ $oldval == "on" ]]; then + n=1 + elif [[ $oldval == "off" ]]; then + n=0 + fi + log_note "$user $ZFS set $perm=${modes[$n]} $vol" + user_run $user $ZFS set $perm=${modes[$n]} $vol + if [[ ${modes[$n]} != $(get_prop $perm $vol) ]]; then + return 1 + fi + + iscsitgt_setup + + if [[ $n -eq 1 ]] && is_iscsi_target $vol ; then + iscsitgt_cleanup + return 1 + fi + + if [[ $n -eq 0 ]] && ! is_iscsi_target $vol ; then + iscsitgt_cleanup + return 1 + fi + + iscsitgt_cleanup + + return 0 +} + +function verify_allow +{ + typeset user=$1 + typeset perm=$2 + typeset dtst=$3 + + typeset -i ret + + user_run $user $ZFS allow $user allow $dtst + ret=$? + if [[ $ret -eq 0 ]]; then + return 1 + fi + + log_must $ZFS allow $user copies $dtst + user_run $user $ZFS allow $user copies $dtst + ret=$? + log_must $ZFS unallow $user copies $dtst + if [[ $ret -eq 1 ]]; then + return 1 + fi + + return 0 + +} + +function support_refrev +{ + typeset dataset=$1 + + $ZFS get refreservation $dataset > /dev/null 2>&1 + if (( $? != 0 )); then + return 1 + fi + + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/delegate/setup.ksh b/tests/sys/cddl/zfs/tests/delegate/setup.ksh new file mode 100644 index 00000000000..aeb9bcca5ac --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/setup.ksh @@ -0,0 +1,50 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +cleanup_user_group + +# Create staff group and add two user to it +log_must add_group $STAFF_GROUP +log_must add_user $STAFF_GROUP $STAFF1 +log_must add_user $STAFF_GROUP $STAFF2 + +# Create other group and add two user to it +log_must add_group $OTHER_GROUP +log_must add_user $OTHER_GROUP $OTHER1 +log_must add_user $OTHER_GROUP $OTHER2 + +DISK=${DISKS%% *} +default_volume_setup $DISK +log_must $CHMOD 777 $TESTDIR + +log_pass diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_001_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_001_pos.ksh new file mode 100644 index 00000000000..fdc9b7f0011 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_001_pos.ksh @@ -0,0 +1,119 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_001_pos.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_001_pos +# +# DESCRIPTION: +# "everyone" is interpreted as the keyword "everyone" whatever the same +# name user or group is existing. +# +# STRATEGY: +# 1. Create user 'everyone'. +# 2. Verify 'everyone' is interpreted as keywords. +# 3. Create group 'everyone'. +# 4. Verify 'everyone' is interpreted as keywords. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-14) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if [[ $user_added == "TRUE" ]] ; then + del_user everyone + fi + if [[ $group_added == "TRUE" ]] ; then + del_group everyone + fi + + restore_root_datasets +} + +log_assert "everyone' is interpreted as a keyword even if a user " \ + "or group named 'everyone' exists." +log_onexit cleanup + +eval set -A dataset $DATASETS +enc=$(get_prop encryption $dataset) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + typeset perms="snapshot,reservation,compression,send,allow,\ +userprop" +else + typeset perms="snapshot,reservation,compression,checksum,\ +send,allow,userprop" +fi + +log_note "Create a user called 'everyone'." +if ! $ID everyone > /dev/null 2>&1; then + user_added="TRUE" + log_must $USERADD everyone +fi +for dtst in $DATASETS ; do + log_must $ZFS allow everyone $perms $dtst + log_must verify_perm $dtst $perms $EVERYONE "everyone" +done +log_must restore_root_datasets +if [[ $user_added == "TRUE" ]]; then + log_must $USERDEL everyone +fi + +log_note "Created a group called 'everyone'." +if ! $CAT /etc/group | $AWK -F: '{print $1}' | \ + $GREP -w 'everyone' > /dev/null 2>&1 +then + group_added="TRUE" + log_must $GROUPADD everyone +fi + +for dtst in $DATASETS ; do + log_must $ZFS allow everyone $perms $dtst + log_must verify_perm $dtst $perms $EVERYONE +done +log_must restore_root_datasets +if [[ $group_added == "TRUE" ]]; then + log_must $GROUPDEL everyone +fi + +log_pass "everyone is always interpreted as keyword passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_002_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_002_pos.ksh new file mode 100644 index 00000000000..ed1648c447a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_002_pos.ksh @@ -0,0 +1,100 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_002_pos.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_002_pos +# +# DESCRIPTION: +# argument is interpreted as a user if possible, then as a group as +# possible. +# +# STRATEGY: +# 1. Create user $STAFF_GROUP +# 2. Delegate permissions to $STAFF_GROUP +# 3. Verify user $STAFF_GROUP has the permissions. +# 4. Delete user $STAFF_GROUP and allow the permission to $STAFF_GROUP +# 5. Verify $STAFF_GROUP is interpreted as group. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-14) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if $ID $STAFF_GROUP > /dev/null 2>&1; then + log_must del_user $STAFF_GROUP + fi + + restore_root_datasets +} + +log_assert " is interpreted as user if possible, then as group." +log_onexit cleanup + +eval set -A dataset $DATASETS +enc=$(get_prop encryption $dataset) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + typeset perms="snapshot,reservation,compression,send,allow,\ +userprop" +else + typeset perms="snapshot,reservation,compression,checksum,\ +send,allow,userprop" +fi + +log_must $USERADD $STAFF_GROUP +for dtst in $DATASETS ; do + log_must $ZFS allow $STAFF_GROUP $perms $dtst + log_must verify_perm $dtst $perms $STAFF_GROUP + log_must verify_noperm $dtst $perms $STAFF1 $STAFF2 +done + +log_must restore_root_datasets + +log_must del_user $STAFF_GROUP +for dtst in $datasets ; do + log_must $ZFS allow $STAFF_GROUP $perms $dtst + log_must verify_perm $dtst $perms $STAFF1 $STAFF2 +done + +log_pass " is interpreted as user if possible, then as group passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_003_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_003_pos.ksh new file mode 100644 index 00000000000..6bc558ae9d5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_003_pos.ksh @@ -0,0 +1,118 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_003_pos.ksh 1.4 09/08/06 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_003_pos +# +# DESCRIPTION: +# Verify option '-l' only allow permission to the dataset itself. +# +# STRATEGY: +# 1. Create descendent datasets of $ROOT_TESTFS +# 2. Select user, group and everyone and set local permission separately. +# 3. Set locally permissions to $ROOT_TESTFS or $ROOT_TESTVOL. +# 4. Verify the permissions are only allow on $ROOT_TESTFS or +# $ROOT_TESTVOL. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify option '-l' only allow permission to the dataset itself." +log_onexit restore_root_datasets + +childfs=$ROOT_TESTFS/childfs + +eval set -A dataset $DATASETS +enc=$(get_prop encryption $dataset) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + typeset perms="snapshot,reservation,compression,allow,\ +userprop" +else + typeset perms="snapshot,reservation,compression,checksum,\ +allow,userprop" +fi + +if check_version "5.10" ; then + perms="${perms},send" +fi + +log_must $ZFS create $childfs + +for dtst in $DATASETS ; do + log_must $ZFS allow -l $STAFF1 $perms $dtst + log_must verify_perm $dtst $perms $STAFF1 + if [[ $dtst == $ROOT_TESTFS ]] ; then + log_must verify_noperm $childfs $perms \ + $STAFF1 $STAFF2 $OTHER1 $OTHER2 + fi +done + +log_must restore_root_datasets + +log_must $ZFS create $childfs +for dtst in $DATASETS ; do + log_must $ZFS allow -l -g $STAFF_GROUP $perms $dtst + log_must verify_perm $dtst $perms $STAFF1 $STAFF2 + if [[ $dtst == $ROOT_TESTFS ]] ; then + log_must verify_noperm $childfs $perms \ + $STAFF1 $STAFF2 $OTHER1 $OTHER2 + fi +done + +log_must restore_root_datasets + +log_must $ZFS create $childfs +for dtst in $DATASETS ; do + log_must $ZFS allow -l -e $perms $dtst + log_must verify_perm $dtst $perms $STAFF1 $STAFF2 $OTHER1 $OTHER2 + if [[ $dtst == $ROOT_TESTFS ]] ; then + log_must verify_noperm $childfs $perms \ + $STAFF1 $STAFF2 $OTHER1 $OTHER2 + fi +done + +log_must restore_root_datasets + +log_pass "Verify option '-l' only allow permission to the dataset itself pass." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_004_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_004_pos.ksh new file mode 100644 index 00000000000..7f0b4ae3acd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_004_pos.ksh @@ -0,0 +1,121 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_004_pos.ksh 1.4 09/08/06 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_004_pos +# +# DESCRIPTION: +# Verify option '-d' allow permission to the descendent datasets, and not +# for this dataset itself. +# +# STRATEGY: +# 1. Create descendent datasets of $ROOT_TESTFS +# 2. Select user, group and everyone and set descendent permission +# separately. +# 3. Set descendent permissions to $ROOT_TESTFS or $ROOT_TESTVOL. +# 4. Verify those permissions are allowed to $ROOT_TESTFS's +# descendent dataset. +# 5. Verify the permissions are not allowed to $ROOT_TESTFS or +# $ROOT_TESTVOL. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify option '-d' allow permission to the descendent datasets." +log_onexit restore_root_datasets + +childfs=$ROOT_TESTFS/childfs + +eval set -A dataset $DATASETS +enc=$(get_prop encryption $dataset) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + typeset perms="snapshot,reservation,compression,allow,\ +userprop" +else + typeset perms="snapshot,reservation,compression,checksum,\ +allow,userprop" +fi + +if check_version "5.10" ; then + perms="${perms},send" +fi + +# Verify option '-d' only affect sub-datasets +log_must $ZFS create $childfs +for dtst in $DATASETS ; do + log_must $ZFS allow -d $STAFF1 $perms $dtst + log_must verify_noperm $dtst $perms $STAFF1 + if [[ $dtst == $ROOT_TESTFS ]]; then + log_must verify_perm $childfs $perms $STAFF1 + fi +done + +log_must restore_root_datasets + +# Verify option '-d + -g' affect group in sub-datasets. +log_must $ZFS create $childfs +for dtst in $DATASETS ; do + log_must $ZFS allow -d -g $STAFF_GROUP $perms $dtst + log_must verify_noperm $dtst $perms $STAFF2 + if [[ $dtst == $ROOT_TESTFS ]]; then + log_must verify_perm $childfs $perms $STAFF2 + fi +done + +log_must restore_root_datasets + +# Verify option '-d + -e' affect everyone in sub-datasets. +log_must $ZFS create $childfs +for dtst in $DATASETS ; do + log_must $ZFS allow -d -e $perms $dtst + log_must verify_noperm $dtst $perms $OTHER1 $OTHER2 + if [[ $dtst == $ROOT_TESTFS ]]; then + log_must verify_perm $childfs $perms $OTHER1 $OTHER2 + fi +done + +log_must restore_root_datasets + +log_pass "Verify option '-d' allow permission to the descendent datasets pass." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_005_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_005_pos.ksh new file mode 100644 index 00000000000..83aaa046749 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_005_pos.ksh @@ -0,0 +1,103 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_005_pos.ksh 1.4 09/08/06 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_005_pos +# +# DESCRIPTION: +# Verify option '-c' will be granted locally to the creator on any +# newly-created descendent file systems. +# +# STRATEGY: +# 1. Allow create permissions to everyone on $ROOT_TESTFS locally. +# 2. Allow '-c' create to $ROOT_TESTFS. +# 3. chmod 777 the mountpoint of $ROOT_TESTFS +# 4. Verify only creator can create descendent dataset on +# $ROOT_TESTFS/$user. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify option '-c' will be granted locally to the creator." +log_onexit restore_root_datasets + +eval set -A dataset $DATASETS +enc=$(get_prop encryption $dataset) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + typeset perms="snapshot,reservation,compression,allow,\ +userprop" +else + typeset perms="snapshot,reservation,compression,checksum,\ +allow,userprop" +fi + +if check_version "5.10" ; then + perms="${perms},send" +fi + +log_must $ZFS allow -l everyone create,mount $ROOT_TESTFS +log_must $ZFS allow -c $perms $ROOT_TESTFS + +mntpnt=$(get_prop mountpoint $ROOT_TESTFS) +log_must $CHMOD 777 $mntpnt + +for user in $EVERYONE; do + childfs=$ROOT_TESTFS/$user + + user_run $user $ZFS create $childfs + + for other in $EVERYONE; do + # + # Verify only the creator has the $perm time permissions. + # + if [[ $other == $user ]]; then + log_must verify_perm $childfs $perms $user + else + log_must verify_noperm $childfs $perms $other + fi + done +done + +log_pass "Verify option '-c' will be granted locally to the creator passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_006_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_006_pos.ksh new file mode 100644 index 00000000000..d726bb170c6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_006_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_006_pos.ksh 1.2 08/11/03 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_006_pos +# +# DESCRIPTION: +# Changing permissions in a set will change what is allowed wherever the +# set is used. +# +# STRATEGY: +# 1. Set create as set @basic. +# 2. Allow set @basic to $STAFF1 on $ROOT_TESTFS or $ROOT_TESTVOL +# 3. Verify $STAFF1 has create permissions. +# 4. Reset snapshot,allow to $basic +# 5. Verify now $STAFF1 have create,allow,destroy permissions. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Changing permissions in a set will change what is allowed " \ + "wherever the set is used." +log_onexit restore_root_datasets + +fs1=$ROOT_TESTFS/fs1; fs2=$ROOT_TESTFS/fs2 +log_must $ZFS create $fs1 +log_must $ZFS create $fs2 + +eval set -A dataset $DATASETS +enc=$(get_prop encryption $dataset) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + perms1="snapshot,checksum,reservation" +else + perms1="snapshot,reservation" +fi + +for dtst in $DATASETS $fs1 $fs2; do + log_must $ZFS allow -s @basic $perms1 $dtst + log_must $ZFS allow $STAFF1 @basic $dtst + log_must verify_perm $dtst $perms1 $STAFF1 +done + +perms2="allow,send,compression,userprop" +for dtst in $DATASETS $fs1 $fs2; do + log_must $ZFS allow -s @basic $perms2 $dtst + log_must verify_perm $dtst ${perms1},${perms2} $STAFF1 +done + +log_pass "Changing permissions in a set will change what is allowed passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_007_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_007_pos.ksh new file mode 100644 index 00000000000..00d6d8b0210 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_007_pos.ksh @@ -0,0 +1,122 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_007_pos.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_007_pos +# +# DESCRIPTION: +# Verify the permissions set will be masked on its descendent +# datasets by same name set. +# +# STRATEGY: +# 1. Create $ROOT_TESTFS/childfs +# 2. Set permission $perms1 to @set on $ROOT_TESTFS +# 3. Reset permission $perms2 to @set on $ROOT_TESTFS/childfs +# 4. Allow @set to $STAFF1 on $ROOT_TESTFS/childfs +# 5. Verify $perms2 is delegated on $ROOT_TESTFS/childfs and its +# descendent. +# 6. Allow @set to $STAFF1 on $ROOT_TESTFS +# 7. Verify $perms1 is not appended to $STAFF1 on $ROOT_TESTFS/childfs and +# its descendent since it is masked +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify permission set can be masked on descendent dataset." +log_onexit restore_root_datasets + +typeset perms1="snapshot,reservation,compression" +eval set -A dataset $DATASETS +enc=$(get_prop encryption $dataset) +if [[ $? -eq 0 ]] && [[ -n "$enc" ]] && [[ "$enc" != "off" ]]; then + typeset perms2="send,allow,userprop" +else + typeset perms2="checksum,send,allow,userprop" +fi + +# +# Define three level filesystems +# +childfs=$ROOT_TESTFS/childfs +grandchild=$childfs/grandchild +log_must $ZFS create $childfs +log_must $ZFS create $grandchild + +# +# Setting different permissions to the same set on two level. +# But only assign the user at one level. +# +log_must $ZFS allow -s @set $perms1 $ROOT_TESTFS +log_must $ZFS allow -s @set $perms2 $childfs +log_must $ZFS allow $STAFF1 @set $childfs + +# +# Verify only perms2 is valid to user on the level which he was assigned. +# +log_must verify_noperm $ROOT_TESTFS $perms1 $STAFF1 +for fs in $childfs $grandchild ; do + log_must verify_noperm $childfs $perms1 $STAFF1 + log_must verify_perm $childfs $perms2 $STAFF1 +done + +# +# Delegate @set to STAFF1 on ROOT_TESTFS, verify $perms1 will not be appended +# to its descendent datasets since it is masked +# +log_must $ZFS allow $STAFF1 @set $ROOT_TESTFS +log_must verify_perm $ROOT_TESTFS $perms1 $STAFF1 +for fs in $childfs $grandchild ; do + log_must verify_noperm $childfs $perms1 $STAFF1 + log_must verify_perm $childfs $perms2 $STAFF1 +done + +# Remove the mask, $perms1 will be allowed to its descendent datasets +log_must $ZFS unallow -s @set $childfs +for fs in $childfs $grandchild ; do + log_must verify_noperm $childfs $perms2 $STAFF1 + log_must verify_perm $childfs $perms1 $STAFF1 +done + +log_pass "Verify permission set can be masked on descendetn dataset pass." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_008_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_008_pos.ksh new file mode 100644 index 00000000000..75897ed9379 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_008_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_008_pos.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_008_pos +# +# DESCRIPTION: +# non-root user can allow any permissions which he is holding to +# other else user when it get 'allow' permission. +# +# STRATEGY: +# 1. Set two set permissions to two datasets locally. +# 2. Verify the non-root user can allow permission if he has allow +# permission. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify non-root user can allow permissions." +log_onexit restore_root_datasets + +perms1="snapshot,reservation" +perms2="send,compression,checksum,userprop" +childfs=$ROOT_TESTFS/childfs + +log_must $ZFS create $childfs + +for dtst in $DATASETS ; do + # Delegate local permission to $STAFF1 + log_must $ZFS allow -l $STAFF1 $perms1 $dtst + log_must $ZFS allow -l $STAFF1 allow $dtst + + if [[ $dtst == $ROOT_TESTFS ]]; then + log_must $ZFS allow -l $STAFF1 $perms2 $childfs + # $perms1 is local permission in $ROOT_TESTFS + log_mustnot user_run $STAFF1 $ZFS allow $OTHER1 $perms1 $childfs + log_must verify_noperm $childfs $perms1 $OTHER1 + fi + + # Verify 'allow' give non-privilege user delegated permission. + log_must user_run $STAFF1 $ZFS allow -l $OTHER1 $perms1 $dtst + log_must verify_perm $dtst $perms1 $OTHER1 + + # $perms2 was not allow to $STAFF1, so he have no permission to + # delegate permission to other else. + log_mustnot user_run $STAFF1 $ZFS allow $OTHER1 $perms2 $dtst + log_must verify_noperm $dtst $perms2 $OTHER1 +done + +log_pass "Verify non-root user can allow permissions passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_009_neg.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_009_neg.ksh new file mode 100644 index 00000000000..96ba0bfede5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_009_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_009_neg.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_009_neg +# +# DESCRIPTION: +# zfs allow can deal with invalid arguments.(Invalid options or combination) +# +# STRATEGY: +# 1. Verify invalid argumets will cause error. +# 2. Verify non-optional argument was missing will cause error. +# 3. Verify invalid options cause error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify invalid arguments are handled correctly." +log_onexit restore_root_datasets + +# Permission sets are limited to 64 characters in length. +longset="set123456789012345678901234567890123456789012345678901234567890123" +for dtst in $DATASETS ; do + log_mustnot eval "$ZFS allow -s @$longset $dtst" + # Create non-existent permission set + typeset timestamp=$($DATE +'%F-%R:%S') + log_mustnot $ZFS allow -s @non-existent $dtst + log_mustnot $ZFS allow $STAFF "atime,created,mounted" $dtst + log_mustnot $ZFS allow $dtst $TESTPOOL + log_mustnot $ZFS allow -c $dtst + log_mustnot $ZFS allow -u $STAFF1 $dtst + log_mustnot $ZFS allow -u $STAFF1 -g $STAFF_GROUP "create,destroy" $dtst + log_mustnot $ZFS allow -u $STAFF1 -e "mountpoint" $dtst +done + +log_pass "Invalid arguments are handled correctly." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_010_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_010_pos.ksh new file mode 100644 index 00000000000..f03e559bc6d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_010_pos.ksh @@ -0,0 +1,128 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_010_pos.ksh 1.3 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_010_pos +# +# DESCRIPTION: +# Scan the following permissions one by one to verify privileged user +# has correct permission delegation in datasets. +# +# STRATEGY: +# 1. Delegate all the permission one by one to user on dataset. +# 2. Verify privileged user has correct permission without any other +# permissions allowed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-11-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify privileged user has correct permissions once which was "\ + "delegated to him in datasets" +log_onexit restore_root_datasets + +# +# Results in Results in +# Permission Filesystem Volume +# +set -A perms create true false \ + snapshot true true \ + mount true false \ + send true true \ + allow true true \ + quota true false \ + reservation true true \ + recordsize true false \ + mountpoint true false \ + checksum true true \ + compression true true \ + canmount true false \ + atime true false \ + devices true false \ + exec true false \ + volsize false true \ + setuid true false \ + readonly true true \ + snapdir true false \ + userprop true true \ + aclmode true false \ + aclinherit true false \ + rollback true true \ + clone true true \ + rename true true \ + promote true true \ + zoned true false \ + shareiscsi true true \ + xattr true false \ + receive true false \ + destroy true true +if is_global_zone; then + typeset -i n=${#perms[@]} + perms[((n))]="sharenfs"; perms[((n+1))]="true"; perms[((n+2))]="false" + perms[((n+3))]="share"; perms[((n+4))]="true"; perms[((n+5))]="false" +fi + +for dtst in $DATASETS; do + typeset -i k=1 + typeset type=$(get_prop type $dtst) + [[ $type == "volume" ]] && k=2 + + typeset -i i=0 + while (( i < ${#perms[@]} )); do + log_must $ZFS allow $STAFF1 ${perms[$i]} $dtst + + if [[ ${perms[((i+k))]} == "true" ]]; then + log_must verify_perm $dtst ${perms[$i]} $STAFF1 + else + log_must verify_noperm $dtst ${perms[$i]} $STAFF1 + fi + + log_must restore_root_datasets + + ((i += 3)) + done +done + +log_pass "Verify privileged user has correct permissions " \ + "in datasets passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_011_neg.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_011_neg.ksh new file mode 100644 index 00000000000..d1d4539f152 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_011_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_011_neg.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_011_neg +# +# DESCRIPTION: +# Verify zpool subcmds and system readonly properties can't be delegated. +# +# STRATEGY: +# 1. Loop all the zpool subcmds and readonly properties, except permission +# 'create' & 'destroy'. +# 2. Verify those subcmd or properties can't be delegated. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify zpool subcmds and system readonly properties can't be " \ + "delegated." +log_onexit restore_root_datasets + +set -A invalid_perms \ + add remove list iostat \ + status offline online clear \ + attach detach replace scrub \ + export import upgrade \ + type creation used available \ + referenced compressratio mounted + +for dtst in $DATASETS ; do + typeset -i i=0 + + while ((i < ${#invalid_perms[@]})); do + log_mustnot $ZFS allow $STAFF1 ${invalid_perms[$i]} $dtst + + ((i += 1)) + done +done + +log_pass "Verify zpool subcmds and system readonly properties passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_012_neg.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_012_neg.ksh new file mode 100644 index 00000000000..6a25ab10529 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_012_neg.ksh @@ -0,0 +1,93 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_allow_012_neg.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_allow_012_neg +# +# DESCRIPTION: +# Scan all permissions one by one to verify privileged user +# can not use permissions properly when delegation property is set off +# +# STRATEGY: +# 1. Delegate all the permission one by one to user on dataset. +# 2. Verify privileged user can not use permissions properly when +# delegation property is off +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + log_must $ZPOOL set delegation=on $TESTPOOL + log_must restore_root_datasets +} + +log_assert "Verify privileged user can not use permissions properly when " \ + "delegation property is set off" +log_onexit cleanup + + +set -A perms create snapshot mount send allow quota reservation \ + recordsize mountpoint checksum compression canmount atime \ + devices exec volsize setuid readonly snapdir userprop \ + aclmode aclinherit rollback clone rename promote \ + zoned shareiscsi xattr receive destroy sharenfs share + +log_must $ZPOOL set delegation=off $TESTPOOL + +for dtst in $DATASETS; do + typeset -i i=0 + while (( i < ${#perms[@]} )); do + + log_must $ZFS allow $STAFF1 ${perms[$i]} $dtst + log_must verify_noperm $dtst ${perms[$i]} $STAFF1 + + log_must restore_root_datasets + ((i += 1)) + done +done + +log_pass "Verify privileged user can not use permissions properly when " \ + "delegation property is set off" diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_allow_test.sh b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_test.sh new file mode 100755 index 00000000000..d30eaa73ae3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_allow_test.sh @@ -0,0 +1,356 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_allow_001_pos cleanup +zfs_allow_001_pos_head() +{ + atf_set "descr" "everyone' is interpreted as a keyword even if a useror group named 'everyone' exists." + atf_set "require.progs" zfs svcs +} +zfs_allow_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_002_pos cleanup +zfs_allow_002_pos_head() +{ + atf_set "descr" " is interpreted as user if possible, then as group." + atf_set "require.progs" zfs svcs +} +zfs_allow_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_003_pos cleanup +zfs_allow_003_pos_head() +{ + atf_set "descr" "Verify option '-l' only allow permission to the dataset itself." + atf_set "require.progs" zfs svcs +} +zfs_allow_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_004_pos cleanup +zfs_allow_004_pos_head() +{ + atf_set "descr" "Verify option '-d' allow permission to the descendent datasets." + atf_set "require.progs" zfs svcs +} +zfs_allow_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_005_pos cleanup +zfs_allow_005_pos_head() +{ + atf_set "descr" "Verify option '-c' will be granted locally to the creator." + atf_set "require.progs" zfs svcs runwattr +} +zfs_allow_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_006_pos cleanup +zfs_allow_006_pos_head() +{ + atf_set "descr" "Changing permissions in a set will change what is allowedwherever the set is used." + atf_set "require.progs" zfs svcs +} +zfs_allow_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_007_pos cleanup +zfs_allow_007_pos_head() +{ + atf_set "descr" "Verify permission set can be masked on descendent dataset." + atf_set "require.progs" zfs svcs +} +zfs_allow_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_007_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_008_pos cleanup +zfs_allow_008_pos_head() +{ + atf_set "descr" "Verify non-root user can allow permissions." + atf_set "require.progs" zfs svcs runwattr +} +zfs_allow_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_008_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_009_neg cleanup +zfs_allow_009_neg_head() +{ + atf_set "descr" "Verify invalid arguments are handled correctly." + atf_set "require.progs" zfs svcs +} +zfs_allow_009_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_009_neg.ksh || atf_fail "Testcase failed" +} +zfs_allow_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_010_pos cleanup +zfs_allow_010_pos_head() +{ + atf_set "descr" "Verify privileged user has correct permissions once which wasdelegated to him in datasets" + atf_set "require.progs" zfs svcs +} +zfs_allow_010_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_010_pos.ksh || atf_fail "Testcase failed" +} +zfs_allow_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_011_neg cleanup +zfs_allow_011_neg_head() +{ + atf_set "descr" "Verify zpool subcmds and system readonly properties can't bedelegated." + atf_set "require.progs" zfs svcs +} +zfs_allow_011_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_011_neg.ksh || atf_fail "Testcase failed" +} +zfs_allow_011_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_allow_012_neg cleanup +zfs_allow_012_neg_head() +{ + atf_set "descr" "Verify privileged user can not use permissions properly whendelegation property is set off" + atf_set "require.progs" zfs zpool svcs +} +zfs_allow_012_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_allow_012_neg.ksh || atf_fail "Testcase failed" +} +zfs_allow_012_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_allow_001_pos + atf_add_test_case zfs_allow_002_pos + atf_add_test_case zfs_allow_003_pos + atf_add_test_case zfs_allow_004_pos + atf_add_test_case zfs_allow_005_pos + atf_add_test_case zfs_allow_006_pos + atf_add_test_case zfs_allow_007_pos + atf_add_test_case zfs_allow_008_pos + atf_add_test_case zfs_allow_009_neg + atf_add_test_case zfs_allow_010_pos + atf_add_test_case zfs_allow_011_neg + atf_add_test_case zfs_allow_012_neg +} diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_001_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_001_pos.ksh new file mode 100644 index 00000000000..5e68c7cfbea --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_001_pos.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_001_pos.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unallow_001_pos +# +# DESCRIPTION: +# Verify '-l' only removed the local permissions. +# +# STRATEGY: +# 1. Set up unallow test model. +# 2. Implement unallow -l to $ROOT_TESTFS or $TESTVOL +# 3. Verify '-l' only remove the local permissions. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify '-l' only removed the local permissions." +log_onexit restore_root_datasets + +log_must setup_unallow_testenv + +for dtst in $DATASETS ; do + log_must $ZFS unallow -l $STAFF1 $dtst + log_must verify_noperm $dtst $LOCAL_SET $STAFF1 + + log_must $ZFS unallow -l $OTHER1 $dtst + log_must verify_noperm $dtst $LOCAL_DESC_SET $OTHER1 + + log_must verify_perm $dtst $LOCAL_DESC_SET $OTHER2 + if [[ $dtst == $ROOT_TESTFS ]]; then + log_must verify_perm $SUBFS $LOCAL_DESC_SET $OTHER1 $OTHER2 + log_must verify_perm $SUBFS $DESC_SET $STAFF2 + fi +done + +log_pass "Verify '-l' only removed the local permissions passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_002_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_002_pos.ksh new file mode 100644 index 00000000000..4cd5c67273e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_002_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_002_pos.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unallow_002_pos +# +# DESCRIPTION: +# Verify '-d' only remove the permissions on descendent filesystem. + +# STRATEGY: +# 1. Set up unallow test model. +# 2. Implement unallow -d to $ROOT_TESTFS +# 3. Verify '-d' only remove the permissions on descendent filesystem. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify '-d' only removed the descendent permissions." +log_onexit restore_root_datasets + +log_must setup_unallow_testenv + +log_must $ZFS unallow -d $STAFF2 $ROOT_TESTFS +log_must verify_noperm $SUBFS $DESC_SET $STAFF2 + +log_must $ZFS unallow -d $OTHER1 $ROOT_TESTFS +log_must verify_noperm $SUBFS $LOCAL_DESC_SET $OTHER1 +log_must verify_perm $ROOT_TESTFS $LOCAL_DESC_SET $OTHER1 + +log_must verify_perm $ROOT_TESTFS $LOCAL_DESC_SET $OTHER2 +log_must verify_perm $SUBFS $LOCAL_DESC_SET $OTHER2 + +log_pass "Verify '-d' only removed the descendent permissions passed" diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_003_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_003_pos.ksh new file mode 100644 index 00000000000..6af70a2ccb1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_003_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_003_pos.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unallow_003_pos +# +# DESCRIPTION: +# Verify options '-r' or '-l' + '-d' will unallow permission to this +# dataset and the descendent datasets. +# +# STRATEGY: +# 1. Set up unallow test model. +# 2. Implement unallow -l -d to $ROOT_TESTFS or $ROOT_TESTVOL without +# options. +# 3. Verify '-l' + '-d' will unallow local + descendent permission. +# 4. Verify '-r' will unallow local + descendent permission. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify options '-r' and '-l'+'-d' will unallow permission to " \ + "this dataset and the descendent datasets." +log_onexit restore_root_datasets + +log_must setup_unallow_testenv + +for dtst in $DATASETS ; do + log_must $ZFS unallow $STAFF1 $dtst + log_must $ZFS unallow -l -d $STAFF2 $dtst + log_must verify_noperm $dtst $LOCAL_SET $STAFF1 + if [[ $dtst == $ROOT_TESTFS ]]; then + log_must verify_noperm $SUBFS $DESC_SET $STAFF2 + fi + + log_must $ZFS unallow -l -d $OTHER1 $dtst + log_must $ZFS unallow -r $OTHER2 $dtst + log_must verify_noperm $dtst $LOCAL_DESC_SET $OTHER1 $OTHER2 + if [[ $dtst == $ROOT_TESTFS ]]; then + log_must verify_noperm $SUBFS $LOCAL_DESC_SET $OTHER1 $OTHER2 + fi +done + +log_pass "Verify options '-r' and '-l'+'-d' function passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_004_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_004_pos.ksh new file mode 100644 index 00000000000..944cfc5c5d7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_004_pos.ksh @@ -0,0 +1,73 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_004_pos.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unallow_004_pos +# +# DESCRIPTION: +# Verify '-s' will remove permissions from the named set. +# +# STRATEGY: +# 1. Set @basic set to $ROOT_TESTFS or $ROOT_TESTVOL and allow @basic +# to $STAFF1 +# 2. Verify $STAFF1 have @basic permissions. +# 3. Verify '-s' will remove permission from the named set. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify '-s' will remove permissions from the named set." +log_onexit restore_root_datasets + +for dtst in $DATASETS ; do + log_must $ZFS allow -s @basic $LOCAL_DESC_SET $dtst + log_must $ZFS allow -u $STAFF1 @basic $dtst + + log_must verify_perm $dtst $LOCAL_DESC_SET $STAFF1 + log_must $ZFS unallow -s @basic $LOCAL_DESC_SET $dtst + log_must verify_noperm $dtst $LOCAL_DESC_SET $STAFF1 +done + +log_pass "Verify '-s' will remove permissions from the named set passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_005_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_005_pos.ksh new file mode 100644 index 00000000000..82dbe2553d3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_005_pos.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_005_pos.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unallow_005_pos +# +# DESCRIPTION: +# Verify option '-c' will remove the created permission set. +# +# STRATEGY: +# 1. Set created time set to $ROOT_TESTFS. +# 2. Allow permission create to $STAFF1 on $ROOT_TESTFS. +# 3. Create $SUBFS and verify $STAFF1 have created time permissions. +# 4. Verify $STAFF1 has created time permission. +# 5. Unallow created time permission with option '-c'. +# 6. Created $SUBFS and verify $STAFF1 have not created time permissions. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify option '-c' will remove the created permission set." +log_onexit restore_root_datasets + +log_must $ZFS allow -c $LOCAL_SET $ROOT_TESTFS +log_must $ZFS allow -l $STAFF1 create,mount $ROOT_TESTFS + +# Create $SUBFS and verify $SUBFS has created time permissions. +user_run $STAFF1 $ZFS create $SUBFS +if ! datasetexists $SUBFS ; then + log_fail "ERROR: ($STAFF1): $ZFS create $SUBFS" +fi +log_must verify_perm $SUBFS $LOCAL_SET $STAFF1 + +# +# After unallow -c, create $SUBFS2 and verify $SUBFS2 has not created time +# permissions any more. +# +log_must $ZFS unallow -c $LOCAL_SET $ROOT_TESTFS +user_run $STAFF1 $ZFS create $SUBFS2 +if ! datasetexists $SUBFS2 ; then + log_fail "ERROR: ($STAFF1): $ZFS create $SUBFS2" +fi +log_must verify_noperm $SUBFS2 $LOCAL_SET $STAFF1 + +log_pass "Verify option '-c' will remove the created permission set passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_006_pos.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_006_pos.ksh new file mode 100644 index 00000000000..ed83f31d5bb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_006_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_006_pos.ksh 1.2 07/07/31 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unallow_006_pos +# +# DESCRIPTION: +# Verify option '-u', '-g' and '-e' only removed the specified type +# permissions set. +# +# STRATEGY: +# 1. Allow '-u' '-g' & '-e' to $STAFF1 on ROOT_TESTFS or $ROOT_TESTVOL. +# 2. Unallow '-u' '-g' & '-e' on $ROOT_TESTFS or $ROOT_TESTVOL separately. +# 3. Verify permissions on $ROOT_TESTFS or $ROOT_TESTVOL separately. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify option '-u', '-g' and '-e' only removed the specified type "\ + "permissions set." +log_onexit restore_root_datasets + +for dtst in $DATASETS ; do + log_must $ZFS allow -u $STAFF1 $LOCAL_DESC_SET $dtst + log_must $ZFS allow -g $STAFF_GROUP $LOCAL_DESC_SET $dtst + log_must $ZFS allow -e $LOCAL_DESC_SET $dtst + + log_must verify_perm $dtst $LOCAL_DESC_SET \ + $STAFF1 $STAFF2 $OTHER1 $OTHER2 + + log_must $ZFS unallow -e $dtst + log_must verify_perm $dtst $LOCAL_DESC_SET $STAFF1 $STAFF2 + log_must verify_noperm $dtst $LOCAL_DESC_SET $OTHER1 $OTHER2 + + log_must $ZFS unallow -g $STAFF_GROUP $dtst + log_must verify_perm $dtst $LOCAL_DESC_SET $STAFF1 + log_must verify_noperm $dtst $LOCAL_DESC_SET $STAFF2 + + log_must $ZFS unallow -u $STAFF1 $dtst + log_must verify_noperm $dtst $LOCAL_DESC_SET $STAFF1 +done + +log_pass "Verify option '-u', '-g' and '-e' passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_007_neg.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_007_neg.ksh new file mode 100644 index 00000000000..cf5d132687c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_007_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_007_neg.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unallow_007_neg +# +# DESCRIPTION: +# zfs unallow will not remove those permissions which inherited from +# its parent filesystem. +# +# STRATEGY: +# 1. Assign perm1 to $ROOT_TESTFS +# 2. Create $SUBFS and assign perm2 to it. +# 3. Verify unallow can not affect perm1 on $SUBFS +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "zfs unallow won't remove those permissions which inherited from " \ + "its parent dataset." +log_onexit restore_root_datasets + +perm1="atime,devices"; perm2="compression,checksum" +log_must $ZFS create $SUBFS +log_must $ZFS allow $STAFF1 $perm1 $ROOT_TESTFS +log_must $ZFS allow $STAFF1 $perm2 $SUBFS + +log_must verify_perm $SUBFS ${perm1},${perm2} $STAFF1 +# +# Athrough unallow the permissions which don't exists on the specific dataset +# return 0, the inherited permissions can't be removed in fact. +# +log_must $ZFS unallow -u $STAFF1 $perm1 $SUBFS +log_must verify_perm $SUBFS ${perm1},${perm2} $STAFF1 + +log_pass "Verify zfs unallow won't remove inherited permissions passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_008_neg.ksh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_008_neg.ksh new file mode 100644 index 00000000000..f0d5030f125 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_008_neg.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfs_unallow_008_neg.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/tests/delegate/delegate_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zfs_unallow_008_neg +# +# DESCRIPTION: +# zfs unallow can handle invalid arguments. +# +# STRATEGY: +# 1. Set up basic test environment. +# 2. Verify zfs unallow handle invalid arguments correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "zfs unallow can handle invalid arguments." +log_onexit restore_root_datasets + +function neg_test +{ + log_mustnot eval "$@ > /dev/null 2>&1" +} + +set -A badopts "everyone -e" "everyone -u $STAFF1" "everyone everyone" \ + "-c -l" "-c -d" "-c -e" "-c -s" "-r" \ + "-u -e" "-s -e" "-s -l -d" "-s @non-exist-set -l" \ + "-s @non-existen-set -d" "-s @non-existen-set -e" \ + "-r -u $STAFF1 $STAFF1" "-u $STAFF1 -g $STAFF_GROUP" \ + "-u $STAFF1 -e" + +log_must setup_unallow_testenv + +for dtst in $DATASETS ; do + log_must $ZFS allow -c create $dtst + + typeset -i i=0 + while ((i < ${#badopts[@]})); do + neg_test $ZFS unallow ${badopts[$i]} $dtst + ((i += 1)) + done + + neg_test user_run $STAFF1 $ZFS unallow $dtst +done + +log_pass "zfs unallow can handle invalid arguments passed." diff --git a/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_test.sh b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_test.sh new file mode 100755 index 00000000000..5de6a9ad47a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/delegate/zfs_unallow_test.sh @@ -0,0 +1,248 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfs_unallow_001_pos cleanup +zfs_unallow_001_pos_head() +{ + atf_set "descr" "Verify '-l' only removed the local permissions." + atf_set "require.progs" zfs svcs +} +zfs_unallow_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_001_pos.ksh || atf_fail "Testcase failed" +} +zfs_unallow_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unallow_002_pos cleanup +zfs_unallow_002_pos_head() +{ + atf_set "descr" "Verify '-d' only removed the descendent permissions." + atf_set "require.progs" zfs svcs +} +zfs_unallow_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_002_pos.ksh || atf_fail "Testcase failed" +} +zfs_unallow_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unallow_003_pos cleanup +zfs_unallow_003_pos_head() +{ + atf_set "descr" "Verify options '-r' and '-l'+'-d' will unallow permission tothis dataset and the descendent datasets." + atf_set "require.progs" zfs svcs +} +zfs_unallow_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_003_pos.ksh || atf_fail "Testcase failed" +} +zfs_unallow_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unallow_004_pos cleanup +zfs_unallow_004_pos_head() +{ + atf_set "descr" "Verify '-s' will remove permissions from the named set." + atf_set "require.progs" zfs svcs +} +zfs_unallow_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_004_pos.ksh || atf_fail "Testcase failed" +} +zfs_unallow_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unallow_005_pos cleanup +zfs_unallow_005_pos_head() +{ + atf_set "descr" "Verify option '-c' will remove the created permission set." + atf_set "require.progs" zfs svcs runwattr +} +zfs_unallow_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_005_pos.ksh || atf_fail "Testcase failed" +} +zfs_unallow_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unallow_006_pos cleanup +zfs_unallow_006_pos_head() +{ + atf_set "descr" "Verify option '-u', '-g' and '-e' only removed the specified typepermissions set." + atf_set "require.progs" zfs svcs +} +zfs_unallow_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_006_pos.ksh || atf_fail "Testcase failed" +} +zfs_unallow_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unallow_007_neg cleanup +zfs_unallow_007_neg_head() +{ + atf_set "descr" "zfs unallow won't remove those permissions which inherited fromits parent dataset." + atf_set "require.progs" zfs svcs +} +zfs_unallow_007_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_007_neg.ksh || atf_fail "Testcase failed" +} +zfs_unallow_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfs_unallow_008_neg cleanup +zfs_unallow_008_neg_head() +{ + atf_set "descr" "zfs unallow can handle invalid arguments." + atf_set "require.progs" zfs svcs runwattr +} +zfs_unallow_008_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfs_unallow_008_neg.ksh || atf_fail "Testcase failed" +} +zfs_unallow_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/delegate_common.kshlib + . $(atf_get_srcdir)/delegate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zfs_unallow_001_pos + atf_add_test_case zfs_unallow_002_pos + atf_add_test_case zfs_unallow_003_pos + atf_add_test_case zfs_unallow_004_pos + atf_add_test_case zfs_unallow_005_pos + atf_add_test_case zfs_unallow_006_pos + atf_add_test_case zfs_unallow_007_neg + atf_add_test_case zfs_unallow_008_neg +} diff --git a/tests/sys/cddl/zfs/tests/devices/Makefile b/tests/sys/cddl/zfs/tests/devices/Makefile new file mode 100644 index 00000000000..da4f63bd119 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/devices +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= devices_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= devices_common.kshlib +${PACKAGE}FILES+= devices_002_neg.ksh +${PACKAGE}FILES+= devices_test.sh +${PACKAGE}FILES+= devices_003_pos.ksh +${PACKAGE}FILES+= devices.cfg +${PACKAGE}FILES+= devices_001_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/devices/cleanup.ksh b/tests/sys/cddl/zfs/tests/devices/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/devices/devices.cfg b/tests/sys/cddl/zfs/tests/devices/devices.cfg new file mode 100644 index 00000000000..66ca60eaaa8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/devices.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)devices.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE1=testfile1${TESTCASE_ID} +export TESTFILE2=testfile2${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/devices/devices_001_pos.ksh b/tests/sys/cddl/zfs/tests/devices/devices_001_pos.ksh new file mode 100644 index 00000000000..df4f0372bd9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/devices_001_pos.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)devices_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/devices/devices_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: devices_001_pos +# +# DESCRIPTION: +# When set property devices=on on file system, devices files can be used in +# this file system. +# +# STRATEGY: +# 1. Create pool and file system. +# 2. Set devices=on on this file system. +# 3. Separately create block device file and character file. +# 4. Separately read from those two device files. +# 5. Check the return value, and make sure it succeeds. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Setting devices=on on file system, the devices files in this file" \ + "system can be used." +log_onexit cleanup + +log_must $ZFS set devices=on $TESTPOOL/$TESTFS + +# +# Separately create block device file and character device file, then try to +# open them and make sure it succeed. +# +create_dev_file b $TESTDIR/$TESTFILE1 +log_must $DD if=$TESTDIR/$TESTFILE1 of=$TESTDIR/$TESTFILE1.out count=1 +create_dev_file c $TESTDIR/$TESTFILE2 +log_must $DD if=$TESTDIR/$TESTFILE2 of=$TESTDIR/$TESTFILE2.out count=1 + +log_pass "Setting devices=on on file system and testing it pass." diff --git a/tests/sys/cddl/zfs/tests/devices/devices_002_neg.ksh b/tests/sys/cddl/zfs/tests/devices/devices_002_neg.ksh new file mode 100644 index 00000000000..3f2c932dc81 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/devices_002_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)devices_002_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/devices/devices_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: devices_002_neg +# +# DESCRIPTION: +# When set property devices=off on file system, device files cannot be used +# in this file system. +# +# STRATEGY: +# 1. Create pool and file system. +# 2. Set devices=off on this file system. +# 3. Separately create block device file and character file. +# 4. Separately read from those two device files. +# 5. Check the return value, and make sure it failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Setting devices=off on file system, the devices files in this file"\ + "system can not be used." +log_onexit cleanup + +log_must $ZFS set devices=off $TESTPOOL/$TESTFS + +# +# Separately create block device file and character device file, then try to +# open them and make sure it failed. +# +create_dev_file b $TESTDIR/$TESTFILE1 +log_mustnot $DD if=$TESTDIR/$TESTFILE1 of=$TESTDIR/$TESTFILE1.out count=1 +create_dev_file c $TESTDIR/$TESTFILE2 +log_mustnot $DD if=$TESTDIR/$TESTFILE2 of=$TESTDIR/$TESTFILE2.out count=1 + +log_pass "Setting devices=off on file system and testing it pass." diff --git a/tests/sys/cddl/zfs/tests/devices/devices_003_pos.ksh b/tests/sys/cddl/zfs/tests/devices/devices_003_pos.ksh new file mode 100644 index 00000000000..8fe11406870 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/devices_003_pos.ksh @@ -0,0 +1,63 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)devices_003_pos.ksh 1.1 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: devices_003_pos +# +# DESCRIPTION: +# +# Writing random data into /dev/zfs should do no harm. +# +# STRATEGY: +# 1. Write some random data into /dev/zfs +# 2. Verify that this should fail. +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-04-24) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "Writing random data into /dev/zfs should do no harm." + +log_mustnot $DD if=/dev/urandom of=/dev/zfs count=1024 + +log_pass "Writing random data into /dev/zfs should do no harm." diff --git a/tests/sys/cddl/zfs/tests/devices/devices_common.kshlib b/tests/sys/cddl/zfs/tests/devices/devices_common.kshlib new file mode 100644 index 00000000000..b4ca65e03cf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/devices_common.kshlib @@ -0,0 +1,120 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)devices_common.kshlib 1.3 07/03/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Create block file or charactor file according to parameter. +# +# $1 device file type +# $2 file name +# +function create_dev_file +{ + typeset filetype=$1 + typeset filename=$2 + + case $filetype in + b) + devtype=$($DF -T / | $AWK '{print $2}') + case $devtype in + zfs) + rootpool=$($DF / | \ + $AWK '{print $2}') + rootpool=${rootpool#\(} + rootpool=${rootpool%%/*} + + devstr=$(get_disklist $rootpool) + devstr=$($ECHO "$devstr" | \ + $AWK '{print $1}') + [[ -z $devstr ]] && \ + log_fail "Can not get block device file." + devstr=/dev/dsk/${devstr} + ;; + ufs) + # + # Get the existing block device file in current system. + # And bring out the first one. + # + devstr=$($DF -lht ufs | \ + $GREP "^/dev/dsk" | \ + $AWK '{print $1}') + devstr=$($ECHO "$devstr" | \ + $AWK '{print $1}') + [[ -z $devstr ]] && \ + log_fail "Can not get block device file." + ;; + *) + log_unsupported "Unsupported fstype " \ + "for / ($devtype)," \ + "only ufs|zfs is supported." + ;; + esac + + # + # Get the device file information. i.e: + # /dev/dsk/c0t0d0s0: block special (28/768) + # + devstr=$($FILE $devstr) + + # + # Bring out major and minor number. + # + major=${devstr##*\(} + major=${major%%/*} + minor=${devstr##*/} + minor=${minor%\)} + + log_must $MKNOD $filename b $major $minor + ;; + c) + # + # Create device file '/dev/null' + # + log_must $MKNOD $filename c 13 2 + ;; + *) + log_fail "'$filetype' is wrong." + ;; + esac + + return 0 +} + +function cleanup +{ + log_must $ZFS set devices=on $TESTPOOL/$TESTFS + log_must $RM -f $TESTDIR/$TESTFILE1 + log_must $RM -f $TESTDIR/$TESTFILE2 + log_must $RM -f $TESTDIR/$TESTFILE1.out + log_must $RM -f $TESTDIR/$TESTFILE2.out +} + diff --git a/tests/sys/cddl/zfs/tests/devices/devices_test.sh b/tests/sys/cddl/zfs/tests/devices/devices_test.sh new file mode 100755 index 00000000000..2ceda509960 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/devices_test.sh @@ -0,0 +1,112 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case devices_001_pos cleanup +devices_001_pos_head() +{ + atf_set "descr" "Setting devices=on on file system, the devices files in this filesystem can be used." + atf_set "require.progs" zfs +} +devices_001_pos_body() +{ + atf_expect_fail "The devices property is not yet supported on FreeBSD" + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/devices_common.kshlib + . $(atf_get_srcdir)/devices.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/devices_001_pos.ksh || atf_fail "Testcase failed" +} +devices_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/devices_common.kshlib + . $(atf_get_srcdir)/devices.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case devices_002_neg cleanup +devices_002_neg_head() +{ + atf_set "descr" "Setting devices=off on file system, the devices files in this filesystem can not be used." + atf_set "require.progs" zfs +} +devices_002_neg_body() +{ + atf_expect_fail "The devices property is not yet supported on FreeBSD" + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/devices_common.kshlib + . $(atf_get_srcdir)/devices.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/devices_002_neg.ksh || atf_fail "Testcase failed" +} +devices_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/devices_common.kshlib + . $(atf_get_srcdir)/devices.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case devices_003_pos cleanup +devices_003_pos_head() +{ + atf_set "descr" "Writing random data into /dev/zfs should do no harm." +} +devices_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/devices_common.kshlib + . $(atf_get_srcdir)/devices.cfg + + ksh93 $(atf_get_srcdir)/devices_003_pos.ksh || atf_fail "Testcase failed" +} +devices_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/devices_common.kshlib + . $(atf_get_srcdir)/devices.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case devices_001_pos + atf_add_test_case devices_002_neg + atf_add_test_case devices_003_pos +} diff --git a/tests/sys/cddl/zfs/tests/devices/setup.ksh b/tests/sys/cddl/zfs/tests/devices/setup.ksh new file mode 100644 index 00000000000..5ed779163f4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/devices/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/exec/Makefile b/tests/sys/cddl/zfs/tests/exec/Makefile new file mode 100644 index 00000000000..2d0c2782a57 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/exec/Makefile @@ -0,0 +1,21 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/exec/ +FILESDIR=${TESTSDIR} +BINDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= exec_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= exec_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= exec_002_neg.ksh +PROG= mmap_exec +MAN= + +.include diff --git a/tests/sys/cddl/zfs/tests/exec/cleanup.ksh b/tests/sys/cddl/zfs/tests/exec/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/exec/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/exec/exec_001_pos.ksh b/tests/sys/cddl/zfs/tests/exec/exec_001_pos.ksh new file mode 100644 index 00000000000..2c2f9013af7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/exec/exec_001_pos.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)exec_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: exec_001_pos +# +# DESCRIPTION: +# When set property exec=on on a filesystem, processes can be executed from +# this filesystem. +# +# STRATEGY: +# 1. Create pool and file system. +# 2. Copy '/bin/ls' to the ZFS file system. +# 3. Setting exec=on on this file system. +# 4. Make sure '/bin/ls' can work in this ZFS file system. +# 5. Make sure mmap which is using the PROT_EXEC calls succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $RM $TESTDIR/myls +} + +log_assert "Setting exec=on on a filesystem, processes can be executed from " \ + "this file system." +log_onexit cleanup + +log_must $CP $LS $TESTDIR/myls +log_must $ZFS set exec=on $TESTPOOL/$TESTFS +log_must $TESTDIR/myls +log_must mmap_exec $TESTDIR/myls + +log_pass "Setting exec=on on filesystem testing passed." diff --git a/tests/sys/cddl/zfs/tests/exec/exec_002_neg.ksh b/tests/sys/cddl/zfs/tests/exec/exec_002_neg.ksh new file mode 100644 index 00000000000..16125a0d84f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/exec/exec_002_neg.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)exec_002_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: exec_002_neg +# +# DESCRIPTION: +# When set property exec=off on a filesystem, processes can not be executed from +# this filesystem. +# +# STRATEGY: +# 1. Create pool and file system. +# 2. Copy '/bin/ls' to the ZFS file system. +# 3. Setting exec=off on this file system. +# 4. Make sure '/bin/ls' can not work in this ZFS file system. +# 5. Make sure mmap which is using the PROT_EXEC calls failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $RM $TESTDIR/myls +} + +# +# Execute and check if the return value is equal to expected. +# +# $1 expected value +# $2..$n executed item +# +function exec_n_check +{ + typeset expect_value=$1 + + shift + $@ + ret=$? + if [[ $ret != $expect_value ]]; then + log_fail "Unexpected return code: '$ret'" + fi + + return 0 +} + +log_assert "Setting exec=off on a filesystem, processes can not be executed " \ + "from this file system." +log_onexit cleanup + +log_must $CP $LS $TESTDIR/myls +log_must $ZFS set exec=off $TESTPOOL/$TESTFS + +log_must exec_n_check 126 $TESTDIR/myls +log_must exec_n_check 13 mmap_exec $TESTDIR/myls + +log_pass "Setting exec=off on filesystem testing passed." diff --git a/tests/sys/cddl/zfs/tests/exec/exec_test.sh b/tests/sys/cddl/zfs/tests/exec/exec_test.sh new file mode 100755 index 00000000000..b71978e4518 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/exec/exec_test.sh @@ -0,0 +1,80 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case exec_001_pos cleanup +exec_001_pos_head() +{ + atf_set "descr" "Setting exec=on on a filesystem, processes can be executed fromthis file system." + atf_set "require.progs" zfs +} +exec_001_pos_body() +{ + export PATH=$(atf_get_srcdir):$PATH + . $(atf_get_srcdir)/../../include/default.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/exec_001_pos.ksh || atf_fail "Testcase failed" +} +exec_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case exec_002_neg cleanup +exec_002_neg_head() +{ + atf_set "descr" "Setting exec=off on a filesystem, processes can not be executedfrom this file system." + atf_set "require.progs" zfs +} +exec_002_neg_body() +{ + PATH=$(atf_get_srcdir):$PATH + . $(atf_get_srcdir)/../../include/default.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/exec_002_neg.ksh || atf_fail "Testcase failed" +} +exec_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case exec_001_pos + atf_add_test_case exec_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/exec/mmap_exec.c b/tests/sys/cddl/zfs/tests/exec/mmap_exec.c new file mode 100644 index 00000000000..409bf2ffca1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/exec/mmap_exec.c @@ -0,0 +1,70 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)mmap_exec.c 1.3 07/05/25 SMI" + +#include +#include +#include +#include +#include +#include + +extern int errno; + +int +main(int argc, char *argv[]) +{ + int fd; + struct stat statbuf; + + if (argc != 2) { + (void) printf("Error: missing binary name.\n"); + (void) printf("Usage:\n\t%s \n", + argv[0]); + return (1); + } + + errno = 0; + + if ((fd = open(argv[1], O_RDONLY)) < 0) { + perror("open"); + return (errno); + } + if (fstat(fd, &statbuf) < 0) { + perror("fstat"); + return (errno); + } + + if (mmap(0, statbuf.st_size, + PROT_EXEC, MAP_SHARED, fd, 0) == MAP_FAILED) { + perror("mmap"); + return (errno); + } + + return (0); +} diff --git a/tests/sys/cddl/zfs/tests/exec/setup.ksh b/tests/sys/cddl/zfs/tests/exec/setup.ksh new file mode 100644 index 00000000000..5ed779163f4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/exec/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/grow_pool/Makefile b/tests/sys/cddl/zfs/tests/grow_pool/Makefile new file mode 100644 index 00000000000..efbfcd06cd3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_pool/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/grow_pool +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= grow_pool_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= grow_pool_001_pos.ksh +${PACKAGE}FILES+= grow_pool.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/grow_pool/cleanup.ksh b/tests/sys/cddl/zfs/tests/grow_pool/cleanup.ksh new file mode 100644 index 00000000000..ba85502f7a0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_pool/cleanup.ksh @@ -0,0 +1,46 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +ismounted $TESTFS && \ + log_must $ZFS umount $TESTDIR +destroy_pool "$TESTPOOL" + +if [[ -z $DISK ]]; then + cleanup_devices "$DISK0 $DISK1" +else + cleanup_devices "$DISK" +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/grow_pool/grow_pool.cfg b/tests/sys/cddl/zfs/tests/grow_pool/grow_pool.cfg new file mode 100644 index 00000000000..ffb12ef1ea3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_pool/grow_pool.cfg @@ -0,0 +1,46 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)grow_pool.cfg 1.3 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +export DISK_ARRAY_LIMIT=2 +export BLOCK_SIZE=8192 +set_disks +# +# Do not make SIZE too large as the three slices may exceed +# the size of the disk, and also slow down the test +# which involves filling until ENOSPC +# +export SIZE="100mb" +export PARTITION=1 +export SMALL_WRITE_COUNT=100 +export TESTFILE1=file${TESTCASE_ID}.1 +export WRITE_COUNT=65536000 diff --git a/tests/sys/cddl/zfs/tests/grow_pool/grow_pool_001_pos.ksh b/tests/sys/cddl/zfs/tests/grow_pool/grow_pool_001_pos.ksh new file mode 100644 index 00000000000..c64cd2c61b1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_pool/grow_pool_001_pos.ksh @@ -0,0 +1,87 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)grow_pool_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: grow_pool_001_pos +# +# DESCRIPTION: +# A ZFS file system is limited by the amount of disk space +# available to the pool. Growing the pool by adding a disk +# increases the amount of space. +# +# STRATEGY: +# 1) Fill a ZFS filesystem until ENOSPC by creating a large file +# 2) Grow the pool by adding a disk +# 3) Verify that more data can now be written to the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "A zpool may be increased in capacity by adding a disk" + +log_must $ZFS set compression=off $TESTPOOL/$TESTFS +$FILE_WRITE -o create -f $TESTDIR/$TESTFILE1 \ + -b $BLOCK_SIZE -c $WRITE_COUNT -d 0 +typeset -i zret=$? +readonly ENOSPC=28 +if [[ $zret -ne $ENOSPC ]]; then + log_fail "file_write completed w/o ENOSPC, aborting!!!" +fi + +if [[ ! -s $TESTDIR/$TESTFILE1 ]]; then + log_fail "$TESTDIR/$TESTFILE1 was not created" +fi + +if [[ -n $DISK ]]; then + log_must $ZPOOL add $TESTPOOL ${DISK}p2 +else + log_must $ZPOOL add $TESTPOOL $DISK1 +fi + +log_must $FILE_WRITE -o append -f $TESTDIR/$TESTFILE1 \ + -b $BLOCK_SIZE -c $SMALL_WRITE_COUNT -d 0 + +log_must $ZFS inherit compression $TESTPOOL/$TESTFS +log_pass "TESTPOOL successfully grown" diff --git a/tests/sys/cddl/zfs/tests/grow_pool/grow_pool_test.sh b/tests/sys/cddl/zfs/tests/grow_pool/grow_pool_test.sh new file mode 100755 index 00000000000..93d223f90cf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_pool/grow_pool_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case grow_pool_001_pos cleanup +grow_pool_001_pos_head() +{ + atf_set "descr" "A zpool may be increased in capacity by adding a disk" + atf_set "require.progs" zfs zpool +} +grow_pool_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/grow_pool.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/grow_pool_001_pos.ksh || atf_fail "Testcase failed" +} +grow_pool_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/grow_pool.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case grow_pool_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/grow_pool/setup.ksh b/tests/sys/cddl/zfs/tests/grow_pool/setup.ksh new file mode 100644 index 00000000000..96f3502c74b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_pool/setup.ksh @@ -0,0 +1,47 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.4 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +if [[ -n $DISK ]]; then + log_note "No spare disks available. Using slices on $DISK" + log_must partition_disk $SIZE $DISK 2 + tmp=${DISK}p1 +else + wipe_partition_table $DISK0 $DISK1 + log_must set_partition $PARTITION "" $SIZE $DISK0 + log_must set_partition $PARTITION "" $SIZE $DISK1 + tmp=$DISK0"p"$PARTITION +fi + +default_setup $tmp diff --git a/tests/sys/cddl/zfs/tests/grow_replicas/Makefile b/tests/sys/cddl/zfs/tests/grow_replicas/Makefile new file mode 100644 index 00000000000..bd5c448129e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_replicas/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/grow_replicas +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= grow_replicas_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= grow_replicas.cfg +${PACKAGE}FILES+= grow_replicas_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/grow_replicas/cleanup.ksh b/tests/sys/cddl/zfs/tests/grow_replicas/cleanup.ksh new file mode 100644 index 00000000000..a60c3d9fc66 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_replicas/cleanup.ksh @@ -0,0 +1,42 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +ismounted $TESTFS && \ + log_must $ZFS umount $TESTDIR +destroy_pool "$TESTPOOL" + +cleanup_devices $DISKS + +log_pass diff --git a/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas.cfg b/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas.cfg new file mode 100644 index 00000000000..c76f97b6271 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas.cfg @@ -0,0 +1,74 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)grow_replicas.cfg 1.4 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +function set_disks +{ + set -A disk_array $(find_disks $DISKS) + typeset -i i=0 + typeset -i limit=4 + while (( i < limit )); do + if [[ -n ${disk_array[$i]} ]]; then + export DISK${i}="${disk_array[$i]}" + else + export DISK=${DISKS%% *} + return + fi + ((i = i + 1)) + done + export DISK="" +} + +typeset -i index=`expr $RANDOM % 2` +if (( $index == 0 )); then + POOLTYPE="mirror" +else + POOLTYPE="raidz" +fi +export POOLTYPE + +export BLOCK_SIZE=8192 +set_disks +# +# Do not make SIZE too large as the three slices may exceed +# the size of the disk, and also slow down the test +# which involves filling until ENOSPC +# +export SIZE="100mb" +if [[ $WRAPPER != *"smi"* ]]; then + export PARTITION=1 +else + export PARTITION=2 +fi +export SMALL_WRITE_COUNT=100 +export TESTFILE1=file${TESTCASE_ID}.1 +export WRITE_COUNT=65536000 diff --git a/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas_001_pos.ksh b/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas_001_pos.ksh new file mode 100644 index 00000000000..3727002b8ba --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas_001_pos.ksh @@ -0,0 +1,96 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)grow_replicas_001_pos.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: grow_replicas_001_pos +# +# DESCRIPTION: +# A ZFS file system is limited by the amount of disk space +# available to the pool. Growing the pool by adding a disk +# increases the amount of space. +# +# STRATEGY: +# 1) Fill a ZFS filesystem mirror/raidz until ENOSPC by creating lots +# of files +# 2) Grow the mirror/raidz by adding a disk +# 3) Verify that more data can now be written to the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "A zpool mirror/raidz may be increased in capacity by adding a disk." + +log_must $ZFS set compression=off $TESTPOOL/$TESTFS +$FILE_WRITE -o create -f $TESTDIR/$TESTFILE1 \ + -b $BLOCK_SIZE -c $WRITE_COUNT -d 0 + +typeset -i zret=$? +readonly ENOSPC=28 +if [[ $zret -ne $ENOSPC ]]; then + log_fail "file_write completed w/o ENOSPC, aborting!!!" +fi + +if [[ ! -s $TESTDIR/$TESTFILE1 ]]; then + log_fail "$TESTDIR/$TESTFILE1 was not created" +fi + +# +# $DISK will be set if we're using slices on one disk +# +if [[ -n $DISK ]]; then + log_must $ZPOOL add $TESTPOOL $POOLTYPE ${DISK}p3 \ + ${DISK}p4 +else + [[ -z $DISK2 || -z $DISK3 ]] && \ + log_unsupported "No spare disks available." + log_must $ZPOOL add -f $TESTPOOL $POOLTYPE ${DISK2}p${PARTITION} \ + ${DISK3}p${PARTITION} +fi + +log_must $FILE_WRITE -o append -f $TESTDIR/$TESTFILE1 \ + -b $BLOCK_SIZE -c $SMALL_WRITE_COUNT -d 0 + +log_must $ZFS inherit compression $TESTPOOL/$TESTFS +log_pass "TESTPOOL mirror/raidz successfully grown" diff --git a/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas_test.sh b/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas_test.sh new file mode 100755 index 00000000000..435446a9fff --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_replicas/grow_replicas_test.sh @@ -0,0 +1,58 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case grow_replicas_001_pos cleanup +grow_replicas_001_pos_head() +{ + atf_set "descr" "A zpool mirror/raidz may be increased in capacity by adding a disk." + atf_set "require.progs" zfs zpool +} +grow_replicas_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/grow_replicas.cfg + + + verify_disk_count "$DISKS" 4 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/grow_replicas_001_pos.ksh || atf_fail "Testcase failed" +} +grow_replicas_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/grow_replicas.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case grow_replicas_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/grow_replicas/setup.ksh b/tests/sys/cddl/zfs/tests/grow_replicas/setup.ksh new file mode 100644 index 00000000000..86ba5b2a64b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/grow_replicas/setup.ksh @@ -0,0 +1,59 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.5 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +log_note "Creating pool type: $POOLTYPE" + +if [[ -n $DISK ]]; then + log_note "No spare disks available. Using slices on $DISK" + partition_disk $SIZE $DISK 4 + create_pool $TESTPOOL $POOLTYPE ${DISK}p1 \ + ${DISK}p2 +else + wipe_partition_table $DISK0 $DISK1 $DISK2 $DISK3 + log_must set_partition $PARTITION "" $SIZE $DISK0 + log_must set_partition $PARTITION "" $SIZE $DISK1 + log_must set_partition $PARTITION "" $SIZE $DISK2 + log_must set_partition $PARTITION "" $SIZE $DISK3 + create_pool $TESTPOOL $POOLTYPE ${DISK0}p${PARTITION} \ + ${DISK1}p${PARTITION} +fi + +$RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR +$MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR + +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +log_pass diff --git a/tests/sys/cddl/zfs/tests/history/Makefile b/tests/sys/cddl/zfs/tests/history/Makefile new file mode 100644 index 00000000000..bd6fa3b1581 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/Makefile @@ -0,0 +1,33 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/history/ +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= history_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= history_005_neg.ksh +${PACKAGE}FILES+= history_004_pos.ksh +${PACKAGE}FILES+= history_008_pos.ksh +${PACKAGE}FILES+= i386.orig_history.txt +${PACKAGE}FILES+= sparc.orig_history.txt +${PACKAGE}FILES+= history_common.kshlib +${PACKAGE}FILES+= history.cfg +${PACKAGE}FILES+= sparc.migratedpool.DAT.Z +${PACKAGE}FILES+= history_010_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfs-pool-v4.dat.Z +${PACKAGE}FILES+= history_009_pos.ksh +${PACKAGE}FILES+= history_001_pos.ksh +${PACKAGE}FILES+= history_006_neg.ksh +${PACKAGE}FILES+= i386.migratedpool.DAT.Z +${PACKAGE}FILES+= history_003_pos.ksh +${PACKAGE}FILES+= history_007_pos.ksh +${PACKAGE}FILES+= history_002_pos.ksh +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/history/cleanup.ksh b/tests/sys/cddl/zfs/tests/history/cleanup.ksh new file mode 100644 index 00000000000..a29e4b0539c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +$ZPOOL history > /dev/null 2>&1 +(($? != 0)) && log_unsupported + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/history/history.cfg b/tests/sys/cddl/zfs/tests/history/history.cfg new file mode 100644 index 00000000000..8fcd1f8b9cb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history.cfg @@ -0,0 +1,48 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history.cfg 1.5 08/08/15 SMI" +# + +export ZFSROOT= + +export MPOOL=mpool.${TESTCASE_ID} + +export EXPECT_HISTORY=$TMPDIR/exp_history.${TESTCASE_ID} +export REAL_HISTORY=$TMPDIR/real_history.${TESTCASE_ID} +export ADD_HISTORY=$TMPDIR/add_history.${TESTCASE_ID} + +export MIGRATEDPOOLNAME=${MIGRATEDPOOLNAME:-history_pool} +export TIMEZONE=${TIMEZONE:-US/Mountain} + +export STF_TIMEOUT=1800 + +export HIST_USER="huser" +export HIST_GROUP="hgroup" + +export TESTVOL=testvol.${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/history/history_001_pos.ksh b/tests/sys/cddl/zfs/tests/history/history_001_pos.ksh new file mode 100644 index 00000000000..38a7a5d09f7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_001_pos.ksh @@ -0,0 +1,121 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_001_pos.ksh 1.3 07/05/25 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_001_pos +# +# DESCRIPTION: +# Create a scenario to verify the following zpool subcommands are logged. +# create, destroy, add, remove, offline, online, attach, detach, replace, +# scrub, export, import, clear, upgrade. +# +# STRATEGY: +# 1. Create three virtual disk files. +# 2. Create a three-way mirror. +# 3. Invoke every sub-commands to this mirror, except upgrade. +# 4. Compare 'zpool history' log with expected log. +# 5. Imported specified pool and upgrade it, verify 'upgrade' was logged. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + destroy_pool $MPOOL + destroy_pool $upgrade_pool + + [[ -d $import_dir ]] && $RM -rf $import_dir + for file in $REAL_HISTORY $EXPECT_HISTORY \ + $VDEV1 $VDEV2 $VDEV3 $VDEV4 + do + [[ -f $file ]] && $RM -f $file + done +} + +log_assert "Verify zpool sub-commands which modify state are logged." +log_onexit cleanup + +(( $? != 0)) && log_fail "get_prop($TESTPOOL mountpoint)" +VDEV1=$TMPDIR/vdev1; VDEV2=$TMPDIR/vdev2; +VDEV3=$TMPDIR/vdev3; VDEV4=$TMPDIR/vdev4; + +log_must create_vdevs $VDEV1 $VDEV2 $VDEV3 $VDEV4 +$CAT /dev/null > $EXPECT_HISTORY + +exec_record $ZPOOL create $MPOOL mirror $VDEV1 $VDEV2 +exec_record $ZPOOL add -f $MPOOL spare $VDEV3 +exec_record $ZPOOL remove $MPOOL $VDEV3 +exec_record $ZPOOL offline $MPOOL $VDEV1 +exec_record $ZPOOL online $MPOOL $VDEV1 +exec_record $ZPOOL attach $MPOOL $VDEV1 $VDEV4 +exec_record $ZPOOL detach $MPOOL $VDEV4 +exec_record $ZPOOL replace -f $MPOOL $VDEV1 $VDEV4 +exec_record $ZPOOL export $MPOOL +exec_record $ZPOOL import -d $TMPDIR $MPOOL +exec_record $ZPOOL destroy $MPOOL +exec_record $ZPOOL import -D -f -d $TMPDIR $MPOOL +exec_record $ZPOOL clear $MPOOL + +format_history $MPOOL $REAL_HISTORY +log_must $DIFF $REAL_HISTORY $EXPECT_HISTORY + +import_dir=$TMPDIR/import_dir.${TESTCASE_ID} +log_must $MKDIR $import_dir +log_must $CP $STF_SUITE/tests/history/zfs-pool-v4.dat.Z $import_dir +log_must $UNCOMPRESS $import_dir/zfs-pool-v4.dat.Z + +# Truncate $EXPECT_HISTORY file +log_must eval "$CAT /dev/null > $EXPECT_HISTORY" + +upgrade_pool=$($ZPOOL import -d $import_dir | $GREP "pool:" | $AWK '{print $2}') +exec_record $ZPOOL import -d $import_dir $upgrade_pool +# Get existing history +format_history $upgrade_pool $EXPECT_HISTORY +exec_record $ZPOOL upgrade $upgrade_pool + +format_history $upgrade_pool $REAL_HISTORY +log_must $DIFF $REAL_HISTORY $EXPECT_HISTORY + +log_pass "zpool sub-commands which modify state are logged passed. " diff --git a/tests/sys/cddl/zfs/tests/history/history_002_pos.ksh b/tests/sys/cddl/zfs/tests/history/history_002_pos.ksh new file mode 100644 index 00000000000..614c807cfba --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_002_pos.ksh @@ -0,0 +1,177 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_002_pos.ksh 1.5 09/01/12 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_002_pos +# +# DESCRIPTION: +# Create a scenario to verify the following zfs subcommands are logged. +# create, destroy, clone, rename, snapshot, rollback, +# set, inherit, receive, promote. +# +# STRATEGY: +# 1. Format zpool history to file $EXPECT_HISTORY. +# 2. Invoke every sub-commands to this mirror. +# 3. Compare 'zpool history' log with expected log. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + for FileToRm in $EXPECT_HISTORY $REAL_HISTORY $tmpfile $tmpfile2; do + [[ -f $FileToRm ]] && log_must $RM -f $FileToRm + done + for dataset in $fs $newfs $fsclone $vol $newvol $volclone; do + datasetexists $dataset && $ZFS destroy -Rf $dataset + done + log_must $RM -rf /history.${TESTCASE_ID} +} + +log_assert "Verify zfs sub-commands which modify state are logged." +log_onexit cleanup + +format_history $TESTPOOL $EXPECT_HISTORY + +fs=$TESTPOOL/$TESTFS1; newfs=$TESTPOOL/newfs; fsclone=$TESTPOOL/clone +vol=$TESTPOOL/$TESTVOL ; newvol=$TESTPOOL/newvol; volclone=$TESTPOOL/volclone +fssnap=$fs@fssnap; fssnap2=$fs@fssnap2 +volsnap=$vol@volsnap; volsnap2=$vol@volsnap2 + +# property value property value +# +set -A props \ + quota 64M recordsize 512 \ + reservation 32M reservation none \ + mountpoint /history.${TESTCASE_ID} mountpoint legacy \ + mountpoint none sharenfs on \ + sharenfs off \ + compression on compression off \ + compression lzjb aclmode discard \ + aclmode groupmask aclmode passthrough \ + atime on atime off \ + exec on exec off \ + setuid on setuid off \ + readonly on readonly off \ + snapdir hidden snapdir visible \ + aclinherit discard aclinherit noallow \ + aclinherit secure aclinherit passthrough \ + canmount off canmount on \ + compression gzip compression gzip-$((RANDOM%9 + 1)) \ + copies $((RANDOM%3 +1)) + +# Add a few extra properties not supported on FreeBSD, if applicable. The +# currently unsupported list is in the source in libzfs_dataset.c. +if [[ $os_name != "FreeBSD" ]]; then + set +A props \ + devices on devices off \ + zoned on zoned off \ + shareiscsi on shareiscsi off \ + xattr on xattr off +fi + +tmpfile=$TMPDIR/tmpfile.${TESTCASE_ID} ; tmpfile2=$TMPDIR/tmpfile2.${TESTCASE_ID} + +exec_record $ZFS create $fs + +typeset enc="" +enc=$(get_prop encryption $fs) +if [[ $? -ne 0 ]] || [[ -z "$enc" ]] || [[ "$enc" == "off" ]]; then + typeset -i n=${#props[@]} + + props[$n]=checksum ; props[((n+1))]="on" + props[((n+2))]=checksum ; props[((n+3))]="off" + props[((n+4))]=checksum ; props[((n+5))]="fletcher2" + props[((n+6))]=checksum ; props[((n+7))]="fletcher4" + props[((n+8))]=checksum ; props[((n+9))]="sha256" +fi + +# Set all the property for filesystem +typeset -i i=0 +while ((i < ${#props[@]})) ; do + exec_record $ZFS set ${props[$i]}=${props[((i+1))]} $fs + + # quota, reservation, canmount can not be inherited. + # + if [[ ${props[$i]} != "quota" && \ + ${props[$i]} != "reservation" && \ + ${props[$i]} != "canmount" ]]; + then + exec_record $ZFS inherit ${props[$i]} $fs + fi + + ((i += 2)) +done +exec_record $ZFS create -V 64M $vol +exec_record $ZFS set volsize=32M $vol +exec_record $ZFS snapshot $fssnap +exec_record $ZFS snapshot $volsnap +exec_record $ZFS snapshot $fssnap2 +exec_record $ZFS snapshot $volsnap2 +log_must eval "$ZFS send -i $fssnap $fssnap2 > $tmpfile" +log_must eval "$ZFS send -i $volsnap $volsnap2 > $tmpfile2" +exec_record $ZFS destroy $fssnap2 +exec_record $ZFS destroy $volsnap2 +exec_record eval "$ZFS receive $fs < $tmpfile" +exec_record eval "$ZFS receive $vol < $tmpfile2" +exec_record $ZFS rollback -r $fssnap +exec_record $ZFS rollback -r $volsnap +exec_record $ZFS clone $fssnap $fsclone +exec_record $ZFS clone $volsnap $volclone +exec_record $ZFS rename $fs $newfs +exec_record $ZFS rename $vol $newvol +exec_record $ZFS promote $fsclone +exec_record $ZFS promote $volclone +exec_record $ZFS destroy $newfs +exec_record $ZFS destroy $newvol +exec_record $ZFS destroy -rf $fsclone +exec_record $ZFS destroy -rf $volclone + +format_history $TESTPOOL $REAL_HISTORY + +log_must $DIFF $REAL_HISTORY $EXPECT_HISTORY + +log_pass "zfs sub-commands which modify state are logged passed." diff --git a/tests/sys/cddl/zfs/tests/history/history_003_pos.ksh b/tests/sys/cddl/zfs/tests/history/history_003_pos.ksh new file mode 100644 index 00000000000..1f4ea1990c3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_003_pos.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_003_pos +# +# DESCRIPTION: +# zpool history can record and output huge log. +# +# STRATEGY: +# 1. Create two 100M virtual disk files. +# 2. Create test pool using the two virtual files. +# 3. Loop N times to set compression to test pool. +# 4. Make sure 'zpool history' output correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "zpool history limitation test." + +typeset -i expect_count=300 +typeset -i orig_count=$($ZPOOL history $TESTPOOL | $WC -l | $AWK '{print $1}') + +typeset -i i=0 +typeset -i num_iters=0 +((num_iters = expect_count / 5)) +while ((i < num_iters)); do + $ZFS set compression=off $TESTPOOL/$TESTFS + $ZFS set compression=on $TESTPOOL/$TESTFS + $ZFS set compression=off $TESTPOOL/$TESTFS + $ZFS set compression=on $TESTPOOL/$TESTFS + $ZFS set compression=off $TESTPOOL/$TESTFS + + ((i += 1)) +done + +typeset -i entry_count=$($ZPOOL history $TESTPOOL | $WC -l | $AWK '{print $1}') + +typeset -i count_diff=0 +((count_diff = entry_count - orig_count)) +if ((count_diff != expect_count)); then + echo "Zpool history is as follows:" + log_must $ZPOOL history $TESTPOOL + log_fail "Expected $expect_count new entries, got $count_diff" +fi + +log_pass "zpool history limitation test passed." diff --git a/tests/sys/cddl/zfs/tests/history/history_004_pos.ksh b/tests/sys/cddl/zfs/tests/history/history_004_pos.ksh new file mode 100644 index 00000000000..759aa2190db --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_004_pos.ksh @@ -0,0 +1,114 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_004_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_004_pos +# +# DESCRIPTION: +# 'zpool history' can copes with many simultaneous command. +# +# STRATEGY: +# 1. Create test pool and test fs. +# 2. Loop 100 times, set properties to test fs simultaneously. +# 3. Wait for all the command execution complete. +# 4. Make sure all the commands was logged by 'zpool history'. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "'zpool history' can copes with many simultaneous command." + +typeset -i orig_count=$($ZPOOL history $TESTPOOL | $WC -l | $AWK '{print $1}') + +typeset -i i=0 +while ((i < 10)); do + $ZFS set compression=off $TESTPOOL/$TESTFS & + $ZFS set atime=off $TESTPOOL/$TESTFS & + $ZFS create $TESTPOOL/$TESTFS1 & + $ZFS create $TESTPOOL/$TESTFS2 & + $ZFS create $TESTPOOL/$TESTFS3 & + + wait + + $ZFS snapshot $TESTPOOL/$TESTFS1@snap & + $ZFS snapshot $TESTPOOL/$TESTFS2@snap & + $ZFS snapshot $TESTPOOL/$TESTFS3@snap & + + wait + + $ZFS clone $TESTPOOL/$TESTFS1@snap $TESTPOOL/clone1 & + $ZFS clone $TESTPOOL/$TESTFS2@snap $TESTPOOL/clone2 & + $ZFS clone $TESTPOOL/$TESTFS3@snap $TESTPOOL/clone3 & + + wait + + $ZFS promote $TESTPOOL/clone1 & + $ZFS promote $TESTPOOL/clone2 & + $ZFS promote $TESTPOOL/clone3 & + + wait + + $ZFS destroy $TESTPOOL/$TESTFS1 & + $ZFS destroy $TESTPOOL/$TESTFS2 & + $ZFS destroy $TESTPOOL/$TESTFS3 & + + wait + + $ZFS destroy -Rf $TESTPOOL/clone1 & + $ZFS destroy -Rf $TESTPOOL/clone2 & + $ZFS destroy -Rf $TESTPOOL/clone3 & + + wait + ((i += 1)) +done + +typeset -i count=$($ZPOOL history $TESTPOOL | $WC -l | $AWK '{print $1}') + +if ((count - orig_count != 200)); then + $ZPOOL history $spool + log_fail "Expected 200 more than $orig_count entries, but got $count" +fi + +log_pass "zpool history copes with simultaneous commands passed." diff --git a/tests/sys/cddl/zfs/tests/history/history_005_neg.ksh b/tests/sys/cddl/zfs/tests/history/history_005_neg.ksh new file mode 100644 index 00000000000..787ac6badda --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_005_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_005_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_005_neg +# +# DESCRIPTION: +# Verify the following zpool subcommands are not logged. +# zpool list +# zpool status +# zpool iostat +# +# STRATEGY: +# 1. Create a test pool. +# 2. Separately invoke zpool list|status|iostat +# 3. Verify they was not recored in pool history. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + [[ -f $EXPECT_HISTORY ]] && $RM -f $EXPECT_HISTORY + [[ -f $REAL_HISTORY ]] && $RM -f $REAL_HISTORY +} + +log_assert "Verify 'zpool list|status|iostat' will not be logged." +log_onexit cleanup + +# Save initial TESTPOOL history +log_must eval "$ZPOOL history $TESTPOOL > $EXPECT_HISTORY" + +log_must $ZPOOL list $TESTPOOL > /dev/null +log_must $ZPOOL status $TESTPOOL > /dev/null +log_must $ZPOOL iostat $TESTPOOL > /dev/null + +log_must eval "$ZPOOL history $TESTPOOL > $REAL_HISTORY" +log_must $DIFF $EXPECT_HISTORY $REAL_HISTORY + +log_pass "Verify 'zpool list|status|iostat' passed." diff --git a/tests/sys/cddl/zfs/tests/history/history_006_neg.ksh b/tests/sys/cddl/zfs/tests/history/history_006_neg.ksh new file mode 100644 index 00000000000..7acb93b7d8d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_006_neg.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_006_neg.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_006_neg +# +# DESCRIPTION: +# Verify the following zfs subcommands are not logged. +# list, get, mount, unmount, share, unshare, send +# +# STRATEGY: +# 1. Create a test pool. +# 2. Separately invoke zfs list|get|mount|unmount|share|unshare|send +# 3. Verify they was not recored in pool history. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + [[ -f $EXPECT_HISTORY ]] && $RM -f $EXPECT_HISTORY + [[ -f $REAL_HISTORY ]] && $RM -f $REAL_HISTORY + if datasetexists $fs ; then + log_must $ZFS destroy -rf $fs + fi + log_must $ZFS create $fs +} + +log_assert "Verify 'zfs list|get|mount|unmount|share|unshare|send' will not " \ + "be logged." +log_onexit cleanup + +# Create initial test environment +fs=$TESTPOOL/$TESTFS; snap1=$fs@snap1; snap2=$fs@snap2 +log_must $ZFS set sharenfs=on $fs +log_must $ZFS snapshot $snap1 +log_must $ZFS snapshot $snap2 + +# Save initial TESTPOOL history +log_must eval "$ZPOOL history $TESTPOOL > $EXPECT_HISTORY" + +log_must $ZFS list $fs > /dev/null +log_must $ZFS get mountpoint $fs > /dev/null +log_must $ZFS unmount $fs +log_must $ZFS mount $fs +log_must $ZFS share $fs +log_must $ZFS unshare $fs +log_must $ZFS send -i $snap1 $snap2 > /dev/null + +log_must eval "$ZPOOL history $TESTPOOL > $REAL_HISTORY" +log_must $DIFF $EXPECT_HISTORY $REAL_HISTORY + +log_pass "Verify 'zfs list|get|mount|unmount|share|unshare|send' passed." diff --git a/tests/sys/cddl/zfs/tests/history/history_007_pos.ksh b/tests/sys/cddl/zfs/tests/history/history_007_pos.ksh new file mode 100644 index 00000000000..316b92ec822 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_007_pos.ksh @@ -0,0 +1,129 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_007_pos.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_007_pos +# +# DESCRIPTION: +# Verify command history moves with pool while pool being migrated +# +# STRATEGY: +# 1. Import uniform platform and cross platform pools +# 2. Contract the command history of the imported pool +# 3. Compare imported history log with the previous log. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $migratedpoolname && \ + log_must $ZPOOL destroy -f $migratedpoolname + + [[ -d $import_dir ]] && $RM -rf $import_dir +} + +log_assert "Verify command history moves with pool while migrating." +log_onexit cleanup + +# The *.orig_history.txt files were made using the America/Denver timezone, +# and since "zpool history" outputs timestamps in localtime, the test must +# be run in that same timezone +export TZ="America/Denver" + +tst_dir=$STF_SUITE/tests/history +import_dir=$TESTDIR/importdir.${TESTCASE_ID} +migrated_cmds_f=$import_dir/migrated_history.${TESTCASE_ID} +migratedpoolname=$MIGRATEDPOOLNAME +typeset -i RET=1 +typeset -i linenum=0 + +[[ ! -d $import_dir ]] && log_must $MKDIR $import_dir + +# We test the migrations on both uniform platform and cross platform +for arch in "i386" "sparc"; do + log_must $CP $tst_dir/${arch}.orig_history.txt $import_dir + orig_cmds_f=$import_dir/${arch}.orig_history.txt + #remove blank line + orig_cmds_f1=$import_dir/${arch}.orig_history_1.txt + $CAT $orig_cmds_f | $GREP -v "^$" > $orig_cmds_f1 + + log_must $CP $tst_dir/${arch}.migratedpool.DAT.Z $import_dir + log_must $UNCOMPRESS $import_dir/${arch}.migratedpool.DAT.Z + + #destroy the pool with same name, so that import operation could succeed. + poolexists $migratedpoolname && \ + log_must $ZPOOL destroy -f $migratedpoolname + + log_must $ZPOOL import -d $import_dir $migratedpoolname + $ZPOOL history $migratedpoolname | $GREP -v "^$" >$migrated_cmds_f + RET=$? + (( $RET != 0 )) && log_fail "$ZPOOL histroy $migratedpoolname fails." + + # The migrated history file should differ with original history file on + # two commands -- 'export' and 'import', which are included in migrated + # history file but not in original history file. so, check the two commands + # firstly in migrated history file and then delete them, and then compare + # this filtered file with the original history file. They should be identical + # at this time. + for subcmd in "export" "import"; do + $GREP "$subcmd" $migrated_cmds_f >/dev/null 2>&1 + RET=$? + (( $RET != 0 )) && log_fail "zpool $subcmd is not logged for" \ + "the imported pool $migratedpoolname." + done + + tmpfile=$import_dir/cmds_tmp.${TESTCASE_ID} + linenum=`$CAT $migrated_cmds_f | $WC -l` + (( linenum = linenum - 2 )) + $HEAD -n $linenum $migrated_cmds_f > $tmpfile + log_must $DIFF $tmpfile $orig_cmds_f1 + + #cleanup for next loop testing + log_must $ZPOOL destroy -f $migratedpoolname + log_must $RM -f `$LS $import_dir` +done + +log_pass "Command history moves with pool as expected while pool being migrated. " diff --git a/tests/sys/cddl/zfs/tests/history/history_008_pos.ksh b/tests/sys/cddl/zfs/tests/history/history_008_pos.ksh new file mode 100644 index 00000000000..59fadcfd795 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_008_pos.ksh @@ -0,0 +1,147 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_008_pos.ksh 1.3 09/01/12 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_008_pos +# +# DESCRIPTION: +# Internal journal records all the recursively operations. +# +# STRATEGY: +# 1. Create a filesystem and several sub-filesystems in it. +# 2. Make recursively snapshot. +# 3. Verify internal journal records all the recursively operations. +# 4. Do the same verification to inherit, rollback and destroy. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-22) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +$ZFS 2>&1 | $GREP "allow" > /dev/null +(($? != 0)) && log_unsupported + +function cleanup +{ + [[ -f $REAL_HISTORY ]] && $RM -f $REAL_HISTORY + [[ -f $ADD_HISTORY ]] && $RM -f $ADD_HISTORY + if datasetexists $root_testfs; then + log_must $ZFS destroy -rf $root_testfs + fi + log_must $ZFS create $root_testfs +} + +log_assert "Internal journal records all the recursively operations." +log_onexit cleanup + +root_testfs=$TESTPOOL/$TESTFS +fs1=$root_testfs/fs1; fs2=$root_testfs/fs2; fs3=$root_testfs/fs3 +for fs in $fs1 $fs2 $fs3; do + log_must $ZFS create $fs +done + +# +# Verify 'zfs snapshot -r' +# +format_history $TESTPOOL $REAL_HISTORY -i +log_must $ZFS snapshot -r ${root_testfs}@snap +additional_history $TESTPOOL $ADD_HISTORY -i +for ds in $fs1 $fs2 $fs3 ; do + log_must verify_history $ADD_HISTORY "snapshot" ${ds}@snap +done + +log_must $ZFS snapshot ${root_testfs}@snap2 +log_must $ZFS snapshot ${root_testfs}@snap3 +typeset snap2_id=$(get_dataset_id ${root_testfs}@snap2) +typeset snap3_id=$(get_dataset_id ${root_testfs}@snap3) + +# +# Verify 'zfs rollback -r' +# +format_history $TESTPOOL $REAL_HISTORY -i +log_must $ZFS rollback -r ${root_testfs}@snap +additional_history $TESTPOOL $ADD_HISTORY -i + +cat $ADD_HISTORY +for ds_id in ${snap2_id} ${snap3_id}; do + log_must verify_destroyed $ADD_HISTORY $ds_id +done +log_must verify_direct_history $ADD_HISTORY "rollback -r" $root_testfs + +# +# Verify 'zfs inherit -r' +# +format_history $TESTPOOL $REAL_HISTORY -i +log_must $ZFS inherit -r mountpoint $root_testfs +additional_history $TESTPOOL $ADD_HISTORY -i +cat $ADD_HISTORY +for ds in $fs1 $fs2 $fs3 $root_testfs; do + log_must verify_history $ADD_HISTORY "inherit" $ds +done +log_must verify_direct_history $ADD_HISTORY "inherit -r mountpoint" $root_testfs + +# Initial original $REAL_HISTORY +format_history $TESTPOOL $REAL_HISTORY -i + +fs1_id=$(get_dataset_id $fs1) +fs2_id=$(get_dataset_id $fs2) +fs3_id=$(get_dataset_id $fs3) +root_id=$(get_dataset_id $root_testfs) +fs1_snap_id=$(get_dataset_id ${fs1}@snap) +fs2_snap_id=$(get_dataset_id ${fs2}@snap) +fs3_snap_id=$(get_dataset_id ${fs3}@snap) +root_snap_id=$(get_dataset_id ${root_testfs}@snap) + +# +# Verify 'zfs destroy -r' +# +log_must $ZFS destroy -r $root_testfs +additional_history $TESTPOOL $ADD_HISTORY -i +cat $ADD_HISTORY +for ds_id in ${fs1_id} ${fs2_id} ${fs3_id} ${root_id} ${fs1_snap_id} ${fs2_snap_id} ${fs3_snap_id} ${root_snap_id}; do + log_must verify_destroyed $ADD_HISTORY $ds_id +done +log_must verify_direct_history $ADD_HISTORY "destroy -r" $root_testfs + +log_pass "Internal journal records all the recursively operations passed." diff --git a/tests/sys/cddl/zfs/tests/history/history_009_pos.ksh b/tests/sys/cddl/zfs/tests/history/history_009_pos.ksh new file mode 100644 index 00000000000..e177b629393 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_009_pos.ksh @@ -0,0 +1,180 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_009_pos.ksh 1.4 09/01/12 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_009_pos +# +# DESCRIPTION: +# Verify the delegation internal history are correctly. +# +# ul$ identifies permssions granted locally for this userid. +# ud$ identifies permissions granted on descendent datasets for +# this userid. +# +# Ul$ identifies permission sets granted locally for this userid. +# Ud$ identifies permission sets granted on descendent datasets for +# this userid. +# +# gl$ identifies permissions granted locally for this groupid. +# gd$ identifies permissions granted on descendent datasets for +# this groupid. +# +# Gl$ identifies permission sets granted locally for this groupid. +# Gd$ identifies permission sets granted on descendent datasets for +# this groupid. +# +# el$ identifies permissions granted locally for everyone. +# ed$ identifies permissions granted on descendent datasets for +# everyone. +# +# El$ identifies permission sets granted locally for everyone. +# Ed$ identifies permission sets granted to descendent datasets +# for everyone. +# +# c-$ identifies permission to create at dataset creation time. +# C-$ identifies permission sets to grant locally at dataset +# creation time. +# +# s-$@ permissions defined in specified set @ +# S-$@ Sets defined in named set @ +# +# STRATEGY: +# 1. Create test group and user. +# 2. Define permission sets and verify the internal history correctly. +# 3. Separately verify the internal history above is correct. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +$ZFS 2>&1 | $GREP "allow" > /dev/null +(($? != 0)) && log_unsupported + +function cleanup +{ + if [[ -f $REAL_HISTORY ]]; then + log_must $RM -f $REAL_HISTORY + fi + if [[ -f $ADD_HISTORY ]]; then + log_must $RM -f $ADD_HISTORY + fi + del_user $HIST_USER + del_group $HIST_GROUP +} + +log_assert "Verify the delegation internal history are correctly." +log_onexit cleanup + +testfs=$TESTPOOL/$TESTFS +# Create history test group and user and get user id and group id +add_group $HIST_GROUP +add_user $HIST_GROUP $HIST_USER + +uid=$($ID $HIST_USER | $AWK -F= '{print $2}'| $AWK -F"(" '{print $1}' ) +gid=$($ID $HIST_USER | $AWK -F= '{print $3}'| $AWK -F"(" '{print $1}' ) + +# Initial original $REAL_HISTORY +format_history $TESTPOOL $REAL_HISTORY -i + +# +# Keyword subcmd operating allow_options +# +set -A array \ + "s-\$@basic" "allow" "-s @basic snapshot" \ + "S-\$@set" "allow" "-s @set @basic" \ + "c-\\$" "allow" "-c create" \ + "c-\\$" "unallow" "-c create" \ + "C-\\$ @set" "allow" "-c @set" \ + "C-\\$ @set" "unallow" "-c @set" \ + "ul\$$uid" "allow" "-l -u $HIST_USER snapshot" \ + "ul\$$uid" "allow" "-u $HIST_USER snapshot" \ + "ul\$$uid" "unallow" "-u $HIST_USER snapshot" \ + "Ul\$$uid" "allow" "-l -u $HIST_USER @set" \ + "Ul\$$uid" "allow" "-u $HIST_USER @set" \ + "Ul\$$uid" "unallow" "-u $HIST_USER @set" \ + "ud\$$uid" "allow" "-d -u $HIST_USER snapshot" \ + "ud\$$uid" "allow" "-u $HIST_USER snapshot" \ + "ud\$$uid" "unallow" "-u $HIST_USER snapshot" \ + "Ud\$$uid" "allow" "-d -u $HIST_USER @set" \ + "Ud\$$uid" "allow" "-u $HIST_USER @set" \ + "Ud\$$uid" "unallow" "-u $HIST_USER @set" \ + "gl\$$gid" "allow" "-l -g $HIST_GROUP snapshot" \ + "gl\$$gid" "allow" "-g $HIST_GROUP snapshot" \ + "gl\$$gid" "unallow" "-g $HIST_GROUP snapshot" \ + "Gl\$$gid" "allow" "-l -g $HIST_GROUP @set" \ + "Gl\$$gid" "allow" "-g $HIST_GROUP @set" \ + "Gl\$$gid" "unallow" "-g $HIST_GROUP @set" \ + "gd\$$gid" "allow" "-d -g $HIST_GROUP snapshot" \ + "gd\$$gid" "allow" "-g $HIST_GROUP snapshot" \ + "gd\$$gid" "unallow" "-g $HIST_GROUP snapshot" \ + "Gd\$$gid" "allow" "-d -g $HIST_GROUP @set" \ + "Gd\$$gid" "allow" "-g $HIST_GROUP @set" \ + "Gd\$$gid" "unallow" "-g $HIST_GROUP @set" \ + "el\\$" "allow" "-l -e snapshot" \ + "el\\$" "allow" "-e snapshot" \ + "el\\$" "unallow" "-e snapshot" \ + "El\\$" "allow" "-l -e @set" \ + "El\\$" "allow" "-e @set" \ + "El\\$" "unallow" "-e @set" \ + "ed\\$" "allow" "-d -e snapshot" \ + "ed\\$" "allow" "-e snapshot" \ + "ed\\$" "unallow" "-e snapshot" \ + "Ed\\$" "allow" "-d -e @set" \ + "Ed\\$" "allow" "-e @set" \ + "Ed\\$" "unallow" "-e @set" + +typeset -i i=0 +while ((i < ${#array[@]})); do + keyword=${array[$i]} + subcmd=${array[((i+1))]} + options=${array[((i+2))]} + + log_must $ZFS $subcmd $options $testfs + additional_history $TESTPOOL $ADD_HISTORY -i + log_must verify_history $ADD_HISTORY $subcmd $testfs $keyword + + ((i += 3)) +done + +log_pass "Verify the delegation internal history are correctly." diff --git a/tests/sys/cddl/zfs/tests/history/history_010_pos.ksh b/tests/sys/cddl/zfs/tests/history/history_010_pos.ksh new file mode 100644 index 00000000000..323ce1d45d9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_010_pos.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_010_pos.ksh 1.4 09/01/12 SMI" +# + +. $STF_SUITE/tests/history/history_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: history_010_pos +# +# DESCRIPTION: +# Verify internal long history information are correct. +# +# STRATEGY: +# 1. Create non-root test user and group. +# 2. Do some zfs operation test by root and non-root user. +# 3. Verify the long history information are correct. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +$ZFS 2>&1 | $GREP "allow" > /dev/null +(($? != 0)) && log_unsupported + +function cleanup +{ + [[ -f $REAL_HISTORY ]] && $RM -f $REAL_HISTORY + [[ -f $EXPECT_HISTORY ]] && $RM -f $EXPECT_HISTORY + + del_user $HIST_USER + del_group $HIST_GROUP + + datasetexists $root_testfs && log_must $ZFS destroy -rf $root_testfs +} + +log_assert "Verify internal long history information are correct." +log_onexit cleanup + +root_testfs=$TESTPOOL/$TESTFS1 + +# Create history test group and user and get user id and group id +add_group $HIST_GROUP +add_user $HIST_GROUP $HIST_USER +uid=$($ID $HIST_USER | $AWK -F= '{print $2}'| $AWK -F"(" '{print $1}' ) +gid=$($ID $HIST_USER | $AWK -F= '{print $3}'| $AWK -F"(" '{print $1}' ) + +# Get original long history +format_history $TESTPOOL $EXPECT_HISTORY "-l" + +exec_record -l $ZFS create $root_testfs +exec_record -l $ZFS allow $HIST_GROUP snapshot,mount $root_testfs +exec_record -l $ZFS allow $HIST_USER destroy,mount $root_testfs +exec_record -l $ZFS allow $HIST_USER reservation $root_testfs +exec_record -l $ZFS allow $HIST_USER allow $root_testfs + +exec_record -l -u $HIST_USER "$ZFS snapshot $root_testfs@snap" +exec_record -l -u $HIST_USER "$ZFS destroy $root_testfs@snap" +exec_record -l -u $HIST_USER "$ZFS reservation=64M $root_testfs" +exec_record -l -u $HIST_USER "$ZFS allow $HIST_USER reservation $root_testfs" +exec_record -l $ZFS unallow $HIST_USER create $root_testfs +exec_record -l $ZFS unallow $HIST_GROUP snapshot $root_testfs +exec_record -l $ZFS destroy -r $root_testfs + +format_history $TESTPOOL $REAL_HISTORY "-l" +log_must $DIFF $REAL_HISTORY $EXPECT_HISTORY + +del_user $HIST_USER +del_group $HIST_GROUP + +log_pass "Verify internal long history information pass." diff --git a/tests/sys/cddl/zfs/tests/history/history_common.kshlib b/tests/sys/cddl/zfs/tests/history/history_common.kshlib new file mode 100644 index 00000000000..897311afb02 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_common.kshlib @@ -0,0 +1,268 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)history_common.kshlib 1.3 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Execute arguments and record them to the log file. +# Notice: EXPECT_HISTORY need be defined. +# +# $1-n arguments for execution. +# +function exec_record +{ + [[ -z $EXPECT_HISTORY ]] && log_fail "EXPECT_HISTORY is undefined." + + typeset long_hist + typeset user='root' + typeset opt + while getopts ":lu:" opt; do + case $opt in + l) long_hist=1;; + u) user=$OPTARG ;; + esac + done + shift $(($OPTIND -1)) + + if [[ $user == 'root' ]]; then + log_must "$@" + else + log_must $SU $user -c "$@" + fi + user_id=$(id -u $user) + + typeset cmdline="$@" + # Remove "eval" ">*" & "<*" for 'zfs send' and 'zfs receive'. + cmdline=${cmdline#eval} + cmdline=${cmdline%%\>*} + cmdline=${cmdline%%\<*} + + # Remove additional blank + cmdline=${cmdline## } + cmdline=${cmdline%% } + + # Get the basename of command. i.e: /usr/sbin/zpool -> zpool + typeset cmd=$($ECHO $cmdline | $AWK '{print $1}') + eval cmdline=\${cmdline#$cmd} + cmd=${cmd##*/} + + # Write basic history to file + print -n $cmd $cmdline >> $EXPECT_HISTORY + if [[ -n $long_hist ]]; then + # Write long history to file + hn=$($HOSTNAME) + zn=$($ZONENAME) + [ "$zn" = "global" ] && zn="" + [ -n "$zn" ] && zn=":$zn" + print -n " [user $user_id ($user) on $hn$zn]" >> $EXPECT_HISTORY + fi + # Plus enter in the end of line + print >> $EXPECT_HISTORY +} + +# +# Format 'zpool history' output to specified file. +# +# $1 pool name +# $2 output file. +# $3 option +# +function format_history +{ + typeset pool=$1 + typeset outfile=$2 + typeset option=$3 + + [[ -z $pool || -z $outfile ]] && \ + log_fail "Usage: format_history [option]" + + typeset temp_history=$TMPDIR/temp_history.format_history.${TESTCASE_ID} + $ZPOOL history $option $pool > $temp_history + + # Truncate output file + $CAT /dev/null > $outfile + + typeset line + typeset -i n=0 + while read line; do + # Ignore the first line and empty line + if [[ $n -eq 0 || -z $line ]]; then + n=1; continue + fi + $ECHO ${line#* } >> $outfile + done < $temp_history + + $RM -f $temp_history +} + +# +# Get the additional pool history. +# +# $1 pool name +# $2 additional history file +# $3 option +# +function additional_history +{ + typeset pool=$1 + typeset add_his_file=$2 + typeset option=$3 + + if [[ -z $pool || -z $add_his_file ]]; then + log_fail "Usage: additional_history " \ + " [option]" + fi + + typeset temp_history=$TMPDIR/temp_history.additional_history.${TESTCASE_ID} + # Current current history + format_history $pool $temp_history $option + # Figure out new history + $DIFF $temp_history $REAL_HISTORY | $GREP "^<" | $SED 's/^<[ ]*//' > \ + $add_his_file + + $CP $temp_history $REAL_HISTORY + $RM -f $temp_history +} + +# +# Get given dataset id +# +# $1 dataset name +# +function get_dataset_id +{ + typeset ds=$1 + + # + # The zdb information looks like: + # + # Dataset pool/fs [ZPL], ID 21, cr_txg 6, 18.0K, 4 objects + # + typeset dst_id=$($ZDB $ds | $GREP "^Dataset $ds " | \ + $AWK -F\, '{print $2}' | $AWK '{print $2}') + + $ECHO $dst_id +} + +# +# Special case of verify_history, but only for destroyed datasets. This is +# needed because get_dataset_id depends on still having the original dataset +# in order to obtain its dataset id. +# +function verify_destroyed # +{ + typeset his_file=$1 + typeset ds_id=$2 + + $GREP -E "\[txg:[0-9]+\] destroy [^ ]+ \($ds_id\)" $his_file \ + > /dev/null 2>&1 + (($? == 0)) && return 0 + return 1 +} + +# +# Verify directly executed commands in a history file. This differs from +# verify_history in that it checks for explicit commands as opposed to +# internally generated commands. +# +function verify_direct_history # +{ + typeset his_file=$1 + typeset subcmd=$2 + typeset ds=$3 + + $GREP "zfs ${subcmd} ${ds}" ${his_file} > /dev/null 2>&1 + (($? == 0)) && return 0 + return 1 +} + +# This function mostly just helps to collapse the case statement +# in verify_history. It returns whether the line matches (1==true). +function verify_history_line +{ + typeset line=$1 + typeset subcmd=$2 + typeset ds=$3 + typeset keyword=$4 + + typeset dst_id=$(get_dataset_id $ds) + log_note "Line: '$line'" + log_note "Checking cmd($subcmd) for $ds, keyword='$keyword'" + $ECHO $line | $GREP -E "\[txg:[0-9]+\] $subcmd $ds \($dst_id\)" | \ + $GREP $keyword >/dev/null 2>&1 + [[ $? == 0 ]] && return 1 + return 0 +} + +# +# Scan history file and check if it include expected internal history +# information +# +# $1 history file +# $2 subcmd +# $3 dataset +# $4 keyword +# +function verify_history # [keyword] +{ + typeset his_file=$1 + typeset subcmd=$2 + typeset ds=$3 + typeset keyword=$4 + + typeset line found=0 + log_note "Test1" + while read line; do + case $subcmd in + snapshot|rollback|inherit) + # [txg:12] snapshot system/foo@0 (46) + keyword="$subcmd" + verify_history_line "$line" $subcmd $ds $keyword + [[ $? == 0 ]] && return 0 + ;; + allow) + # [txg:10] permission update testpool.1477/testfs.1477 (40) s-$@basic snapshot + _subcmd="permission update" + verify_history_line "$line" "$_subcmd" $ds "$keyword" + [[ $? == 0 ]] && return 0 + ;; + unallow) + # [txg:174] permission remove testpool.1477/testfs.1477 (40) El$ @set + _subcmd="permission remove" + verify_history_line "$line" "$_subcmd" $ds "$keyword" + [[ $? == 0 ]] && return 0 + ;; + *) + ;; + esac + done < $his_file + return 1 +} diff --git a/tests/sys/cddl/zfs/tests/history/history_test.sh b/tests/sys/cddl/zfs/tests/history/history_test.sh new file mode 100755 index 00000000000..51c3ce75ccd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/history_test.sh @@ -0,0 +1,301 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case history_001_pos +history_001_pos_head() +{ + atf_set "descr" "Verify zpool sub-commands which modify state are logged." + atf_set "require.progs" zpool nawk + atf_set "timeout" 1800 +} +history_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/history_001_pos.ksh || atf_fail "Testcase failed" +} + +atf_test_case history_002_pos cleanup +history_002_pos_head() +{ + atf_set "descr" "Verify zfs sub-commands which modify state are logged." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +history_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_002_pos.ksh || atf_fail "Testcase failed" +} +history_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case history_003_pos cleanup +history_003_pos_head() +{ + atf_set "descr" "zpool history limitation test." + atf_set "require.progs" zpool zfs + atf_set "timeout" 1800 +} +history_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_003_pos.ksh || atf_fail "Testcase failed" +} +history_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case history_004_pos cleanup +history_004_pos_head() +{ + atf_set "descr" "'zpool history' can copes with many simultaneous command." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +history_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_004_pos.ksh || atf_fail "Testcase failed" +} +history_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case history_005_neg cleanup +history_005_neg_head() +{ + atf_set "descr" "Verify 'zpool list|status|iostat' will not be logged." + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +history_005_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_005_neg.ksh || atf_fail "Testcase failed" +} +history_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case history_006_neg cleanup +history_006_neg_head() +{ + atf_set "descr" "Verify 'zfs list|get|mount|unmount|share|unshare|send' will notbe logged." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +history_006_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_006_neg.ksh || atf_fail "Testcase failed" +} +history_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case history_007_pos cleanup +history_007_pos_head() +{ + atf_set "descr" "Verify command history moves with pool while migrating." + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +history_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_007_pos.ksh || atf_fail "Testcase failed" +} +history_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case history_008_pos cleanup +history_008_pos_head() +{ + atf_set "descr" "Internal journal records all the recursively operations." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +history_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_008_pos.ksh || atf_fail "Testcase failed" +} +history_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case history_009_pos cleanup +history_009_pos_head() +{ + atf_set "descr" "Verify the delegation internal history are correctly." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +history_009_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_009_pos.ksh || atf_fail "Testcase failed" +} +history_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case history_010_pos cleanup +history_010_pos_head() +{ + atf_set "descr" "Verify internal long history information are correct." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +history_010_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/history_010_pos.ksh || atf_fail "Testcase failed" +} +history_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/history_common.kshlib + . $(atf_get_srcdir)/history.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case history_001_pos + atf_add_test_case history_002_pos + atf_add_test_case history_003_pos + atf_add_test_case history_004_pos + atf_add_test_case history_005_neg + atf_add_test_case history_006_neg + atf_add_test_case history_007_pos + atf_add_test_case history_008_pos + atf_add_test_case history_009_pos + atf_add_test_case history_010_pos +} diff --git a/tests/sys/cddl/zfs/tests/history/i386.migratedpool.DAT.Z b/tests/sys/cddl/zfs/tests/history/i386.migratedpool.DAT.Z new file mode 100644 index 0000000000000000000000000000000000000000..21cd7fcf583a10c2df6c18e95bb5fc33dd791412 GIT binary patch literal 173047 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 Qn`k^~zD!;DYP<{n4^Q??GXMYp literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/history/i386.orig_history.txt b/tests/sys/cddl/zfs/tests/history/i386.orig_history.txt new file mode 100644 index 00000000000..02e279eec52 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/i386.orig_history.txt @@ -0,0 +1,13 @@ +History for 'history_pool': +2006-10-20.13:18:37 zpool create history_pool /var/tmp/i386.migratedpool.DAT +2006-10-20.13:18:37 zfs create history_pool/fs +2006-10-20.13:18:37 zfs set compression=on history_pool/fs +2006-10-20.13:18:37 zfs set checksum=on history_pool +2006-10-20.13:18:37 zfs snapshot history_pool/fs@snap +2006-10-20.13:18:37 zfs clone history_pool/fs@snap history_pool/clone +2006-10-20.13:18:37 zfs promote history_pool/clone +2006-10-20.13:18:37 zfs promote history_pool/fs +2006-10-20.13:18:37 zfs destroy -r -R history_pool/fs +2006-10-20.13:18:37 zpool export history_pool +2007-04-05.00:05:38 zpool upgrade history_pool + diff --git a/tests/sys/cddl/zfs/tests/history/setup.ksh b/tests/sys/cddl/zfs/tests/history/setup.ksh new file mode 100644 index 00000000000..2d9ec813854 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +$ZPOOL history > /dev/null 2>&1 +(($? != 0)) && log_unsupported + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/history/sparc.migratedpool.DAT.Z b/tests/sys/cddl/zfs/tests/history/sparc.migratedpool.DAT.Z new file mode 100644 index 0000000000000000000000000000000000000000..47a61ffd51a6aab37421dac1f62b079bedb809f4 GIT binary patch literal 163879 zcmWh!d0Y?q|9`*d{M?`E{&bq|bbhD^VM}s)0&REAF zHupqJEcSzt^E=22;p1AlfAjmdN1tov{d%6SY4y7uU>d)4QK%_UxkV1I6D!UvWrBNc zNZ-HtujQuriFfPvZ#lPu?N;p9^T5{gt0M;P8h-x3w!hb!$6VOZ^WgSN>yu_YyLZ-hJy} z_O)Fj{yx0t&Y#vt7k=;k=iYnAa^F6?_xGRs{wHA1YC1B@Z8d;!G1b2QbN{1r_Tb(d zGmad1{C9c$r27|-9DMSR&~14@pQBYzuT>8GVV?Ok7@}`-7<>mQHkBlG9;SSq5?~g0999l>bJg3ggec&~|ekJ8iKBYO}CG^MK z&S#%K-_`r93Si7>+m^Cqs&NcREgz%NUosUerNS{O5D<;kTeyLP=Z^dJ$Cpb-aV1x> zY433juSx&uYXTo~Zq@0Ic_SD01pafSY2))htFwRb$+>%L2Zxp18eO4|@v)R!R_zpi z%bIw89G9#j3Xv5RQTg-oo%#Nw>Rx01lcm?EwKEDM&zWMYR-W~qj^O@4PJJ$%o*s~PQIyt`)U5%a!2bI9cP*R#g&d4FU0oEPtJ@=Ig> zYZ$wB@_)CockKD^cFvzK{<~v67xUrn%$t)x+{=Bk=fnNH4=+Ca57DtLa-r9hmIp=Q zds`lsw13(1$lfFNW8<13Q$9W}AHVnGzZ>Sf{P;vz8vChf>)I)wo>uPI`{~*4KVN=& zE}o11++1~Y%I6o=PxgL(dHlo6&#xpp?u)b5YwDNRb>aKIyt&x^)t9%99&uma)eo8a z^?k$meP92(JLlEc5AxEuZ!L{$r+)j`v}515PtAY6`u5p*F7Er6cQ>bg|Jw3o-}i4{ zKD_$=9q0r=r%RZR6R9!;%&ShKIy!Aki9m#>*Jy@0^Gz28s(oFJVV<*q)m5l^q@Q+O z=PZoKsL%|lJMDSYx!7D%p&Orm#^<(kNz%m%!<@P^0iT>pIo)PvX?mJNy)^0UG7#?Q zpASob*SYc^I{r7!z$AC`T-Jc;uhxM1;54>3od^&Em$>)=|BVexyHS=}RlxovUD9RW z2n#hg!$$aiGX|{HH$I+L0u4I3f;%Xr z#I)3)5iO&9t&Scp7XkRG85(~SNRVMKRHyUaf=s2%>~AV)T*VTOe79d+ih37TVBV&5 zmwZRbxHXlmzPgEHS6<0?KIy?a|G^Aa$BLh8yOJxnu6Y-TO-_Q{>yl8o{JIz=1sjgA z`MQ%38SbVsnU2$N7`S|NSv)qNyde3$O>Lfe#_vz*ujHKlw%ptb+M}qzaND8b8&Z7+ zgM9F?Lf;#VCh(Z-6hlWl7O|$nu(&d<^#xt2Ax$$|uL^NKyVBVvVZbz@XXgQ+pwbCB| zUMFqIDxhO)jGdcn{4&$KnN3iyp2@4->rU(5JyT{?>;$%UP`Gg_0pB*wyF^j+2@h=thUD}_F3lIySX(hdt( z8spwQ8i)s0PE(&A-1e99BQq9HnFWQjrsszoQ32_IbMAckuy=45pQ2oRGn&|#uk{b* z!jfHz(j^u6Vxa?K`>%);d$=2$aPPja2SlBDQ8|kzyuy&dBME^Yeo8Zky*8+FHv11v zr|@d7$ZX%DInR*l7%&xRiz+#c-d`;H4*Il24i>#D?noF4Z>pZZU# zFt|Cw%X49IL<#Tt-~x0l0c4bT&Sh}XSl_hg6aVyouiE8+NfQH0e#%QByENH+ds#{% zwhEeVSv{CoNxgs-m~!ddtUe4mf?NL&)nBUWr$g=|eYMw1i3|D@*pZ>r2j_Lx7v-`@1O_lFv=;~kHV@Ea;! zboso3vX1dv?E|slHN{q<))&~%w!&WTG*+khv~7Y!=9QU?KDS?{VQM@6YtcsQg0w5k ziT3r=mJe%yE>|t5+az0ba~o?^Q&_HTc1>~LDx1&$n!kV*6V=m&G4A8IeCi>m?^KxY z*1PFUYzxTu4Z;0di)X!u!J?eJ2QDMBvB1q>j;+og=!N-*$jMEu9t1sp^`z5$ED4$Yf1BXducjuwc^R;{;L z(+22k%-Ej}f)nTtc5Kfe>@cIgYSvQ%nCXE33RAF(@j-(bgRn5-=gBX^!S$;PS2+r9 zhmHBkIeo>iE?g4xaR+E8f|J5f{wnSS`W6QTQw+-){31skkV6*;M6IM-&C;$(woNyC zYn;SXIit4-jZU1gYv)>sIwv*SOwAFD6`VHRN>qw?J#U<2#)n$y&X$D{qZuPA2;EVT zVq!3m)kU?ev^skvSBU;}G4jmF>EMGnE&v6M;IxmdsxcH+e{zE7Zm09Q-+696O7 z_%TK8dTi6@it22J+GsYuMR>9U>uc7}0-&P^C|N%wf}9S>twYofPCFH7Pw_>-x{wiy z!u~9nU>UK>QJUvP{hGDN3&M4|v6BGy+(DORY3Er>f*59vjCFHTiH-mdCs~0s43Gae zc=_S1CFfQW4{_E zVve37fh0K>%x%|WmTr@kzKPVkIs6AZaneG1aK;@X{fMXgbB0638S`j#&0NI{-lI{*Bfb=?;QOv}PwhpJ?_TGaPLLDS8Ix1GGjFee0hxdZkG zV|~r^LWXQ()_w5$W$cX1CrDFmH?Fd4MoLt*L$k*Y_5f-$1K$AbmKob)g(qbgYr*d! z%_p^Rg9U4xC&kY?S4)Jr)k!Sw7*kx z69AKpmzy;>5B{v$IA%uXQ!Bo~jC(TFF^6Wd9R@kbHZ1<$VoY=xc#8p;RUbuN4>L8A zBUp}jY+e2hX+r}E&iH1WGnF5qgp-pBy#-iTAX!^6dP#Fy7G!-Iw zNYac)y8RA;7zIZR+kja#_v?1$%~6fr<+3WNT(yeGuo$sfr7wBCE2EQh^%4sPIrUNE z&^U`>ghQ3XY|r;mW<(upq4NM4=v135bSE>lS%&?Pe!K-*IbE1&IA>9boFN!d_kqD; zS6lgA_%yh4-W)s-Bt99x`=YanlWP@ed%_Qmrf@O}dV@^EwzYMm_YN&N;E?Mn zfS07tWAx`m?Gs`Dm3<6?tewc?#y}Ph z7quj#egi8RnpW0eDxS`)r|_2OC>C2)vVV2m=-%JcOmrA$-eh zV+Kzpa%$(26N%}JuXG|T6x?qt2;aT0hCAs2H?&UtDaK+*mQE5Pp_2*Rj=>7UR#w-O zp$2(kmu2ILVYItO8a^X)I7jrCR34K48wXZ9)iW8eUZf2o6(!RNoO+L>zhkGbNk&1S zyCGGSwHB`2cKb)hk2_5Uf`@YHjEi&5NT=Ov;F83j+6bE2U^T%L-8mx2ib0zpoTuJN z@U;m`avDQrvO*l0zM;0TmyY2zwUT-oP?rKK&rGG-_2&ipqgj6*kT0zIP>DL`go9YH z9;xU*HOan=KR8DOf`8@G6Bp;ylI8xdPsL>f`^v_B!T{W%pDn0%f?w)IDhz47B~t*a zJLc5fvQYOd=YK6pJF$j3A;C6IdVqkRu~JnGv6j;;FvBUxFwDBggCl#Gbs;?5C*j*= z;S@m<8Lf%g-FYJ=E=GG zXEQR-&epVNu*saJm#Cu6P|a%pL;4IS;qJsfBmFdn=xNs90lG4)&Wl$C(5J&XFo8nR z4;);B8b2DBSoXsQwZ+P&yG2jd;;)d$p#tl^8jLiiOfkl=n45`xIr zB4sd>-!(V;^r@7b3gfG3QU8I_zBQ}9$at)1bYnCf89YPMZV};HN!`F2e=}2e9O^X3 z*lObLs~MR~WDw#oT(%f4S=1ha@duI8@`eVEj5HfNa9FLN%5i9JBD`5tZI|#oJ098@ z`?d7ex)B=yTi*U~_TuXc?R?qki!Rx-ZmaD^i-@l#!>$j}-v(2FL!ZEHoh^{-2N9*5 zVe4U{adKjh#Z>kLeWE~mF~$fx6>T>_i>3_V;TF}ePUA6_UMAphFv*&Y#ZI-@@qXOp zEOlXp}gvij0MY(v(iggbuFvjsDIo);AWu) zd*{#%V~j3#>Kg)YoSHmDB-?dff^oT%kQ{rC%PN_N2{I9na6u&Dh$l~GWS(MZg4OP^ zs?Gt;H@l{{3~g5EXQvj}!9$U>v+xI?{$$ox%j5=Gd9876+0(}}GRIo*IcEA_yJntD zpRiKik}ea#9ajA$!I0rpKjc*nlB!Y!DGs8W2%npcH;M)jHcY)&-Tb#4JA8xPvij4y zWgaJ8;!~NWi@`!!-Gv>7Bh^lXO|lU1f%aFYx)8wcN1>mEIE28TVDoW9VvkTF!Kyv# zP?b831P^CB4Br@Kw83*p=V8U`MPjq0oh^eMBK(;%I62LA=L>37zV^`YdQWC;pO*z^ zU*)Z>dKbyql~cFZrDMs1D2ZAj{f=98Q4ZY97~x9YS&@1n=zpn$lSIwRS+L_NXU2@o z_l)YALpP4m9bjKZI1R@b-9d+T8;=_;aF-qQvm28n>YGLT02!=`f_imh*run2#p-J#Er)Xmq`14TT{iJzD0H;fSr2geMb{x>6Yp#$6P)ZMnK>m9}r zi_XnLuW|r)2F4=17o)DQs=f$%!a>#uaV?^{M1DhF!5+mv)GZ`qJ+I|`2m3MeH4k<}M%L3T` z>Z~om0!9ix^|n!pB;nf1pj!5;gX1NGnbVkIAlka1OGX2x_MlX`J7jGwn(owF5QX4V z&U>q^w*ZS#TodTZQzBg89K~^MSjqwLTr^9>=013z6d8qla&27%uorkGf$qFtJ?z2a zji9p`9s$0)(E=Gpfef@-D|Sw!l2O{VP!q$)$fMIejyM)^}Bn4RbP-@+%dmp0(-ty*^*QAvE^OhW#K zFe=&B*$xr~eKpJy@rhC^KsO0$7Rywi@^onQvTKhj&G|WI-6|;{i}qy=8KAqQ<~a8{ zxL&}L(Ilsim)awc&BEq_9x|R?jVM}hH-MN4- z`8pXt4%H@Na~UIp0Ss+V38}*v*+qsK^1~ZJKV}pc76Tde7LAhWxf|vuc@4*N9XeMo zmc@JVSX04pnRvcP(l^;cFG9`cfB_Ce z5%8$Pem>7s;*9d)Qb2C$m6db-JPcM!L~0BEf%iZNn!!;TsZKB)VHVgTxX#3)7@e5nZ>0}O zmzuGDfc|w||Klr@TsQbHO?Q%w$d$z@316S9WmZmqS$pxCwtis8O@{#bgqN{a9Fb~$(yQ_607M6Je6*HdQZv?clDE!uZAOfD55sjd0LojO5ca@QW`J#{F ztR=l4PRmr;T3H~&)9>&u7P9=FH&69K1{r}t+Fe|HE^!>F6Yy5&pirYO!rn{S3Qo0- zRsRxU0eb{@0W$z&I_TI$^=92eKnDxnT;f`UP2}++TMMfW0v$xavno3p2x5C~f0YzT zvVKK)hCoJwcDE>ltQ}r3!$Ke_E*CcO&;s3^8hee}L>=W6>)PIG%!gMF6#g)3gurP+zW#)IyGVFy|C7i(d*5eZ_M1xJs!=?Nr^Ygj8RTMR>=l=Lk`TL2UC{rS2LBUC2J%&U?LLLIuYnj_uTi}ABvBQrVu zIw`hE;VD=S6{J0BGdEFhP=HhrA(Bd@AAyaMwB~|=G8}6Q%f>|^tMp>itt9mz!U1DA z7YPhw4JPECO&sHA-Nsc`wI@t!BA@dfx@D0Pb-4xuxLxvS$xjiJp6+;&6dBGERrnN9 zwO49`h|a7b%hr#DCg`T37V-XO7>rD1DTz&BGHKGozEP5}oupvmPrC6TiVH7&TwuHBA|O{7A&vcu0OxlH51kauPOJjh8Z zg_y0_0p3#p;jEEJF_&X2|9}23hmaE`Isya&G6%B=SY(9PFaAA3aSI&Ik|$HV8-DM_ zg5fqViE2j4CY<2B%i(wjHo(@Uh~CUIBE%fV=_&C|Kfisu;zrq)12`tNHsOK1&TgA7 z!^^g06ZuAVcjmXT7#nRWfGhkh*m6bU0_TOOVx$ubCdfUyKYgAQS-^QUfrSX?I5q-n z57ZnAiJ*y;AP&0%d@E6RWV`@E%keY7yBZB;jV9YX&9<}dcGq3L7VTb}rxWJM{?S-l zC*=eEMIsGQEhy8W=W5heGD{#4`spJCHMoTyC%9K!o2ltkR@}u*|AV~JZTuVmEoL1)pLzW=QVbH0}Fshs(BL#$qWri@1T*x`HGpeHF%6 z)4#~NIxyJ`4N`anHb5{Sm?G=H)unq4R9#T2Ra0kE+37VLQv~&9 z1IEz|-IMjzp>BwXOd(WwPj<|M!A$RtWxZ%Cu?r}e_#;ELg-O*QL-I0#L{amuhAIa; zIFk;Av4+u-A&W=?o-N4BtlRi#Y3PA-Yb-99)~*>{V>ZzffQtnW!eB6-G)bFy7csT9Y#Gx@29f>f`Ej>TkNuT6A06CY_vbd*NogqbK(I#2Tp%fA9 zP3e@5-;`RFfNY7<*sgaxcxmt~KM%r8g+Ws~93%Tz*|J%(N%F4)FL=XUxRAk~A$>Mk zCirK=K|nW=3(ujqfEM$e++!WeirwuP54N(7JnQoVEZQX?DVyrb6Xtw>GntSQXr<~TeLb9quwNxp z3pm5W-H?z}n}I&!2e%LZjxO7B6`TdMK)sZJ#WKWBo<({U>@5=)ZT%6Js$>lKzp}1A ze>QJC%taMpKlAqwn?HY zv!+cQ<;T-W1@oE3EmQut$FEvTinav;{Sqpts{`j<3p?61A-0-ha6aq7!AvDxQ`82L zAQ^=G$)dUvnVrWs&6)1^%fG=`3-qWYCjwWUE!9C^kRr`+lSSvmQyh>}{q$IozXrcaBH!ZWNX3EDPo^QRs|3HT}8sUfxmbKLd76#XG{!P?w6p)3-IAa!} zq!w4lj4zwZwhYj0=OPf*f%W0@y%?Ogd0Ob(z&8obQ|efop94N-T`XWWB2*y83W_DN z8gye9lH#MJ$Qaf?4<9Ch1kjdMd^_bV@I=~j$xuXYWHkw>onWZuJhG@af<6HoY0>LI zXyu5ZH;Ha#TT*Gc#=jc>4Ka<_0@-M&@wbroS+^>i){2+d;u*TPMCaO~?1p3xW`RjN ze9Lcv-G$4eD{jLm)^|Am6RYyH#X7N4;5HUJ_oIF`>X1!-Wr^g1nn~nQ=-Ys65TjDc zQgtt@?_j?k<62pJ_&Zh73q7C)B8)Ha7Yt)ly0lEY)x*0spEWDM)hY|WE32B(5P4V5 z%iz7$g^}b%ndqvn|50WULKyE}w*4Ep3NntoRyR z@kR-sjmNQ`h&Y_$Ba<02U7z2BgBt+DV*5CKM!^iTAqz#MV@r|BYWvwqw7@ofPJ4Jy z^YiE{l7qPz6H&uK9WcmLA#|<75_wMo>uS~=2Oa8Y15lM??oKiYnu>^loPS~d+zqSA zrCz@imz2A0o6qWML3|PMqomtlOC6xi zio78a0-%*}AO)I;c$qZYOb+!Ipkb&dva8dU!a;M2+Cu*>xHq9Ft0q7SX`+YUiu+!= zfB^w-$0er>`u?6STZnVD+eqp$Q*Kw;Uk8 z)cBhg9};jU8YAoHaY+ohAlzp-u68IoKBSJ`#A(x%L>zMm$q1a~Vg`(TaJ*1G$h(d_ z$blpnYUzFf2HNTMGF6lxZ`V)ff{U;zoTn9=#OWo;WFZWaABX!1;h)>irTlt4)~~_Z zv1%WiuY_NhypN;w!9)m3tj0|8^j!s<6UZs%Sp2@^+Ys&v#+-d?o8s4Fo4lBtuWm$vN~Z|TJmo5b7BE22-v?$p^@7(BwybW(**1*r5!jseV_Euf>`jUpU?b#! zkbDmjI+33f%;4OBO{or>^lc)rzd6rptdj%>LvK!7~SID;Vu5YqGADeX?c^A1dLqp{tdifas+BWQ3hm z&;>KIL{h*{R;mfe*Fc&Okck$4)E}?uu=x7^PjPO$rV7SNL{)<|h+>dG2URvthFmGP z-+~O1>Sx7pV10o57ZB-y8srl}O%R52kFviejSa^u;dudjR}k!=9X2h(x*!Gt#hRwV zE|u`Kq>}Uf8DfA08RdP6v-#^f?R%P79F{p2&}qOM(Zx14f{c~?q6>OT#6+aXx>mBf z3HKMY8*1V?c%F4_Dmb!+8kVwiV!h{`N+xoGgf~l|g-l?vi>Nuo7+_1NB&PuH-FT3w zyIYea(4SfTOnit{-43>Gp*!$<|83rL>CmymH^1HHJLN2YvA@sZzYo)jstcU<;&|wO z)5XJg7T&RTn)3IHBYpmSe)!(WJGq~;bFY}4n%gz{++zzQKR*=Vz*&7l;t^{-KH#NDo9^GAB{^=n3zkA32aM|;@XHxM!|BxkVil^?G`h$I0Sm5!I zvwjm@e+%j(y?m+=5swy7h z5;cI_BYIS)4sjOW_!^bJ_>kp3tjSsf$5up_FFt6;9oX>tR%}|dISDvqzu`aT!6_@L z*GJjO zrGLCmynOafweO-w*5tCkUw7zx?s>KUsYkiVE1tjZeEHnx>Q>($p=7)EO-kQ7?UBH) zjYY{TquzACT<3cvcu}K0c~$Q>J^P-IIud%Su{?S8q&IyopYL=e{ClI2yk_~E{(Ud> zKGM4DquVL`|X6jm;N}Cc%8h#QXiy$*G+Q0vLQ2 zAa(3rgbd2z0Q5z=z-Saz7JY=AuClLQMs2^Tp%OBD%LFn7gPEkzWE=fxOf+I~_kbqs0)a><+l0M7DHgybPt7UUn9V|5sUpCtr7k1#Ea<$RL zbm;2sHl6=HNBkBzaBNw|s-bQB{Chs_x7Gv49hiIO7H77y>cUd!2J$ZfaIlLR zI{>01z*!cnw+(Y*6M=sg_6uMfFw-}bxZUVakaj{rUrT`9Ph+bg+Jyg89^&y|w@fDO@~VBE!owf$_FM3H`i2GF?HxQ9o@?;i5Z`)s-+w-K z_`){ne&0M}=BmqA+q@1MOf|qhGC9*`D#EK|uP;bhNV<>$W$ZX-vtiSRXrsf8&J`;Z zno0}LZc=wi$pYt2ekG9jQVxb!RyY@iUmZE6n9U99QW}xGH2ih+#=;KXwjahgBhuH#T*I#ly60P}W`4^#ZhiTAv5D?U(}TwB{L><2+_wRN?$ z?)oWfg_bC1gnUMTg&;N?cK{EzV1k1%*%a!lFnAB0v@`8g;pKU1;6}w zvyR=msbJIHeWlN%Kkevx`kz+YUb*C5f!G2)+$aZg1+(2{f?|EG-R?#=P#Q)DU z<|D?T@&n@}7hVYt{ZKor!2;?4KZ?l3MoEF50Ksd>=+yG?M5|FxzAj!!rUV6jYn@yC zli#%g9)YVQb;AiuQ0Dz^_GJwr&Xn-eFuUE?l@Y1MacE!J-C z<5nJx@`B(28qGpj(j}eQ7W_QD)0?tr@LC1TE9!$ksDOP%bMV)?t`EO2%PQj{ z5NrgGfiIv#U>!#zvI-6c(7N{?9>4(}cVb^qm_scqx7&-Mb-1hKYJV@bS$eQ!hIH!L@6Bo=v|G>q)7ONA_U<|G%^K^1o`n&tN&*K! zdl@!^VF-7qb6{uSX~(vL9SVP7MR+*Z1?j%P^{5@IkB)0bepZUeh_91q>~yCs>=wsb z_wcdyH6PZB3;k^c-A;IfE$vy+9z=(go*#pOw6N7Z$6;W2*l*{5e)y^Xj2?@Pq9z(X zKp0X1>;Tu=3N!FdTs*6Ohj-?}MUaixNUg1k1RMi8ORC+NhKrHaGUf<~X!)up+_#)2xB$J;Z?4Sg%YtDlBcv9EqrpWpe?m4#N|R^ z(Bq*Itpn58J6yOkW$BxW!ieBr%cgJM8WGiN`J2tP5%IlBF=Fy^*pmJZ*i`=_vzgmZ0koAw%@*H zvC;P1LuzyDiJJ8fw@a<3YknWSLvB4!v+3au5ZUp;G(fU2lM6zcY|s}#0l4FhsH++O zf_1tXWCwN_0AeLr1;5;CEoub3QtD_|JMmEcu6*xdJA<+XOu z5LvA$7XNq`d8(J#cDH*}D{23#-O*9|M-hTfh4+`VqHg!hGf3H#Q2Ya0dV@ZWci}oI zRvq6hnHfs(eaUT@L*(L#z}<4SF6vrf?^XLY*o>nK&+W@us;`+^ut=iu-Zl9_Y_vvu z=Ap<%yK4U$y`PVMF-iqyUB~94XrL>>{3T$4Y09!|B15j}-j8!dDhZGH|2nK1>&A6< zC?WDjlq6VY6||B+J~)_A)T!>4`;mxcmBN+Oz_!HDewv(wL0E~81!RJ5h_TRi%u}Kqgrra#!IDk5DA9mG@P*`JRuzI^?vo4U zvaIJiPO4^??dqjYXVPN_Y<&DCB$oJX`I_n@Gh;XPUdkS|$8Og?+k8}v-K%X5I_8Ld zF{-OjbqSj{$Q@9}LETwsrn6xqXOhU7_24}PJJb~!g;fJ zGuQ~Cd6j@qLC~tLhZc}%(fBF0D@ua(AYQSQYBP9-Fb94dOW=COpMF=&_14Uwo-KE| zuNfE}M*Opyvt~trHWzgYW15pP9B0n7m^mF_Yne7R$mLok9O#;NaHQ+@_Qo%6O#wR`}BHLDkhxX+j44Xm@F={aSNEXFYIUBNDrn zuI205#9n>oM;PsJATU|Uu}W;`#gNIk9-wkV+TwPczeLT1iKq<=qcK-0)Jzm%WvIPX zojZl|f12g(=h2e`g02LAg;;i;8XS~pMwNtXIVD}q1x27Et9Ib;fE%aX3NC`y0-1pQ z52@L%uy}PTXSr2^69376Bu{Hc)ND92r>NaSst14jZmEWwc<^>ryM29f+!!ZbRXVxg zPE)(%rBkm3{0t6qjG0b@j1XssU%(cL5mgO%)&rfm;CJPOxUxh8`0qxTpggk@jl#{} zO3JVhxkqINZ~#}cwgf(t6bpR3yVBcBzz?Rmd-4Pe-4JjRDo_GqM3n_A;{rvE8T-14 z&Q8XF%AnaP>wKQc8Wol~#}cr(Tl*=5SJ}JD2iBz3rOH!RJUP>Kegn$?ISoS~;rm zM|p$`K0-NZR0!CKC{Z&O-z$XxA^}fQ_>WG2@e=X`{T8rAEZpxab6)OVcksC|dd1-6Xc~3u& zR~#cNzx^xc3dnb`flHE!-$JqgftW`*3i zHU=-^L)bY9#-9heuWUDeg=h+mozuCWwuvD+Uwz~l_)buzuef^V9RPie^}+7}$Xsz9 zSM!};Jm?_O>Claf7Sv{Z02glox!A74Xs1eqZ#hO%Md0~T7pG2!Lr@1Na0j!v&UP(} zEgac%nR0dikP;P$$Nu8nF*~ZT7q>ESzH2tXc}xKg*y!H_%o@C zU9)>_bLdcOCJ)+yM6;$AUO*vc%~(w25=Ffd>PeJ{hky*!o*^wtc%Cf4I#3TnoWxAt zjjIBm0)K_Jj|Ve1ca7TGRP-`!#p%tT;|HDY+Ex$D-|M@6==bg5_jg^t_frCU4^9bU z>jR202qGD!EK86&Ai5cg2ktCvQ4q|>{Hz+@K>(0<@yA>wN4~@Nf-aoVfz?V+dJJe+ z9_U{&0C1QGQUogx2TEQJorv#79XO&1#&XJ^2+SL~+kq8aQc$=d0ZT<)kWz=vxww1+ zla>XR%gnjeovX;@TsRxqzvQy66nRNdKR{`;#;vU z+={Q3Mx7%40v+n%*dpI(S!;o>Ii2;#J-_ArJKUOC32>lw z5J^}#7tR?}FcA48MaWN4ei7b;8^59smy%lr7!OG!F>j0G{RL5pwjc!MlHB$weftCdu zCY?mVt2H4I+`t)iGhi)oNRterP>@xZiyZ~sXgm|TbJAMIuY1gRWr{CCALONc7i_iC z(ZF}0MXL0mWPGU<`~NFJM*wBlnXn&`5-Ior9(g!bbzl*Q@aEe6o?Fv@KbZk0EcG#K zML0LiLsHxEB_Li<3y?x>EkraJ!zpd$@z7zQvq;MDXUT}N1J_%ha6K!F@G#Iupt9gT z5X$R0>?4SfF$>-WcnUgz{U{|{*N?!*OC8vwd9bUx4Tt3{wvTVz>6sjLoU;r_+Xnwb zq@Z)h(#E#t$uuQQb?5PF`~+~5$pm~n*TEcf3Hu+|dB}QU;}A&wr5cNYbyE*&)0Cvz zn^PC^ySKNt0B6MC%R7o%E4D@Qwd>#E^;|1(NZjCfGFVRf1$)KCIStigcT3SMWEFIa zw8plB?!eXF|2?cjo}!KgH1}l{%nNb^e!jKvXR^m%@pfIZ!su~kdaUAz5_yA+xpH0X zIsi{_q^P-zz2^+bI2QU#%J#)O=mNBy>I+=fm?F)L6-I9@dan%W&j?D2!P+W?i?9?d zmRdQ~&G;B4dVbF1JFY5Zor5pnf*C^sHe<*j@4lynIW=o=BT&SHm!0+l10;R^{8Icr zXf2t4S1gTdFSQEKK$y7c1)eU22?mq5Cc=G~ho6TGNC7v4BOJ?VM69#qBPp6)X^b6I z3H}H27M1Z`3Rq5Ahng+*T??B*+gop+E=eV8Z*^s{9Ox(c0hJCPg9fzeP~qDbd5FM? zl>nB(BXBRNtyvMe-duzNY*_pHJ0FV)?UD^+NOYMNZ8k_{AQ=5eUB?UPZG_^`y&HWgxL>XTy1h$u^ zAI3|-7Y>SKbM)lwZqMBPJUqCG;ff5c2RdXqiw)%T$`fATH(+Lsg&+|HTSx(1k$hNM zgv~n0c?Ut=&ffFfc?*3l5-F3L;StE`aAh4o$dgf!`EPKP?D39!Dke-ozP+Bh-8Sd%F0A5mMpH^o1t|@{_gIhUT%#;Y6hDESf}FcUm!mYm|?19G=mcO2>B`m27V3-c8pzuuYBxw zp?ojdZ+r|-*g+Rbi5|?Isuhv1T$f@l$zrGmV^Av@M%X$@k?67g$32K*)ryUHI`PvQ z*T@Nq0yNZO?p&f3Fwn@U7*#eHCi&R4RbIQKNa4`~OpCNq7d?)o&IliiP23)}Ys1kE zg}q{&Y6iq`T4kvaYLqjG=eF+$24`z5iaFOwhU0j+gbQ>g7j70%+@Z+KeCO#J=m=|=?vN%ZL; z8FX-n6zs$a1qb5*NX9O4T8Xq^mz1k(XojaGUog8DbfUI0+zJPwC^U4}j;M)edR8_r zsgOvC9&5QMbrGmFy`7R9Yp4QxE`ZV3;iIHyfdDDM;%ipD!%pouzI|Q0orbWARks)5 z{*v-|S}h(b1uE{->;VX5(19?Zv)}^QEEyT99DjydA)^du1IU2JNKNE=&9c!s*AXje z?f6BMWG6F~BqQ0OP|yESbnS65tzG!td(W+!n(2aWn(3m#OidSbQ#(Z=H72Q;IfHQEDUW@9W^S*1nYpv&b*4jHz ze>PkTtkFp#Y9(h2W{De;kXbm1M=yeX@dr=J{4TmrJ++q12iAbXhewGG;Q{SKcst4! z8Ck%kI7Lr5UL*?e8(r`bd{!kz2Ql!efYOm(F-`M6$86dZ05C=ivKZtV!X!`!rt*5DTn5N|dKLT;2ke+YBo^dUpIdM#?$+X4pa`5@!9{5({26@7C&00A z)S;3hf^giIH^KvJQ4c1a1D>NmKveTW)ERRsEBo?3l9vX78Vuplx?wxq2cz`E&2#KP z^kFy!Cu;I4Y^|nfQE6lz|8IBge@ngtu+N_u`T;32`~b9zzBy{VRm_B zZ!iNVG^Z~RAqG`K-XIxx;Lre4fO}(4gD*vFesEvCFFF=;=NsrC4wxmNSAlovd+kOiMdee{NOum;_Dg)xd`;nsRmIQ;wRB&+g2%jX4WPz=Xl6XF19e54R{6fyWj zhQ!oSVn8Em#HW6Nml0SOWek|0`B%ucEG9rx{_QIdy|s8T{Yz-$qzQc38|lENq4Oe< zkEk_D#D^r*{%?vcD8(GvG#P{v7nyMxvIxJD#jI5yo&JYFybXNEy>KWKvIRjR10Uj} z?U)(Y5fW;`guOvFZY_c{;jL&$7KMhK2ey1e{&DXu!|zM?MZZF4>eV9n1@IR^dB}tY zFEvC%mY@vWWDpL)r7P)rn2C9*K^4@DHyo!j7g=2T=4ak?@*Qf55z+oKYL8RUxyNw> zt;taYB?=Ch17zsQqp%ZXjB-$eTI3)BuhCqKeq8!(ZEib(jX5)o^pV#v51dSc76B?j zfk5jqf1a@bnt>ariTdGhB1<^99GK!3xX~zBh&9QoH&+G{Nd^UjexXKykQ7bd5D4G| z#0?E%BHo2RE?5g75xfs~!v1!RrhtM!4SiC(rZbu`vuUxYT^>noco-1H&obBsSmz;m z$X;}Kr4a|pMmYjX>3+{6{(5>TvZffi&C`*dV2rQq{LI~yXH9>PrW$ZRhKY9lZRhgT9QBkTl+ zfN6OoK3t6lphht4V@R zZpt)#wPsTLko!z?S+XvV-5lI zPR%p0L_G0r^G!&_?+7a}h(Xx+4BW65u>-TTCZj;ODdIq-vD8P+lPnkq%g7CpE_?r#4(D!67oZ2+NTGX(9Iw^m{9 zs7W|z!zY4dKd1q-Tx=8oS>i6%M0+Ts%R$Zl^cR*G&g^hLx)w9QO-KZyWQ~!-ks{ol z2akcC9FB;Tg+OTKH~KQdWgw=J6SNWctVC3QpX7#%mgNzN;7q--5HUyn1Qb^=Uf_a5 zRYVLh;6Z7~zktaHY9eC^&{A;FN;oMg4XVZqj^F$CPs;RDYmHhUG2rNp^-v9Ve%+H6 z=m0uJV6qGx!#r_XHc|n61jGfez_>an9GXBBnp90uAXin>Xg2LKcEj{WClZIjL_v&L z0B+s_J#j$<;uJa@23R^82l@DZI*;a!oWji21j652jy0b)o7RF`WAHU#iCY1>1(EQu zF_M~yaS)CahNJ>3!UBmh$wXij19<>DZSNdtEwRR2InSU7dH#rn z(o{$zHl2-RAp)FTX*@=x2X;D23oHXv9nsL|8+&y6o3*6+sA+mI3avo{*!jD_Ts(kD z)FjUUAv0_NhrlEq$pT5isMwJ}_ym}&eyIZ!dh+}Sj+4T6&C(gspfn-@fg%70_4;hE z43=O%mGDslu|{;%P?&=GqI4g4e?Egv(IU}>wLhQcTt7DbRDn?*+yIRD6bnKc4)Ty% zup4#Y0hGw(C`?)?WQR@WGddtQ{6Rd3hyO#l>?5026mhR?A-<;ei9Ker4EoEGiXumm z2N**HyTX0gXG4Q3@CRnhH1UBS6SpwA7A!(t)l?0*o>#VIcptG`cQ(+6{Ea#=jWdy9 z;E@N?kU2P0P0fbHxQ*`E6EF*JIdAAqAl=55q$)TmOTAUUfbgnmOo|VZftjcc$DmJ` zJ)7E%NWp~!?t8cf4ahr~frJBUB>^@r#jFHKCnNx1VqbA>4d+xl%!$gvtt!(DKrFWD zABc?*DqHnX3p@|JJVcHr@=tFbDHKFuL<_nt)U)dGzAy0KnfLusItK2%<){tSYCkMU zWTGVyK?To13uU3}sz4|R#Ab_3*hI{s<iIn3x>MtM=i5lFHP05DeVs{D*`r*NR9{-J1?H>0q(XxJc9G#)3WqHp8lX=u8 zXz$9+G6JESg3$y-XdS^kQJ6<0>kKuS&{Ly^%d-k=F1YtCEDHeEn0RwNMqm>G2gqeD3kMqj{Td{Q1^rZUXAl3uB@ z0<)PgAG~v6jmN7Z893f&oe<5%ih33xLYNJr09l0>!QmEhU{VK{*!Y~7HC;(9oJ8F$;p(x<0H?|&sa3+NS17Lk!{_V58P|>nd_!@4jHPDy)qcoIZ0sR5Ife8mxV!o9IbfWa) zF^Qz69eC;xOJp+Y51vke?ua~uCM905Qs8GU`dz zisxxelk088VS}dW^=xrC$1JzrNjzU@R#NXOUZ63nsON|m4w}`~^TZJx^R{|#F@aq7 z*87MfHRdDr0ph4Z^YMCA%;#7z?uLpN3oTf8!^KN97VdW=#7hS)g6{Ig%QzFF?k*Gm zA)F9*H(I=0Ga>nIjCjT1g!H=taWrRQ?%jCtO5wzky9weyH4`iD3dO4iC)V8+iDNjE z+V0B4tA&$#@2bSHnn@#f)5LLulg962VgbjJ(U2)#BeY~SWQo^mEZrNj#p?zwgBtS0 z@f@qDhC=arp;cVNQSk3uKT9-7Gi8pJkD;hN7ErZr| z4V7Xc$EK~}nmAEt)7wxbPSV(nG}MZd2W`e1aIuJE%V?|@i-oqV#wM{uW9#17B9;!? z1~qEMGS1|v#tyMuI61DdQ>@TTPHyZLD+ed1H|oSHj$LkJzc@u`SJF5jPSw~|G!BZl z4%*c<>cwdsR$Jp2@irl=w{cXwUBen_922Jxvc?;M1mmz7O(e+c5CdDn`|X}2JO?E*pe)cLvE9kWUtVnq{&sXPvcP0 z#F6YDbf|0MNwPVPZB5>i1475%CLc+T#&M)6Kthn><4vd}kK@F+7b?jYIi2bdjiQ(j&tt4c*!xLbIH8~ z$#IQy#XX_q#GrHCJ&~k{Ak0t6l+{Y?xjge23^MQVG=dRm2p2)a!TmR zx}POEt#Ng~pDj5v=o)lCPg2U68g;)=a#lDs?*389InC7M`$dxTgHzM*t0iTeX}R}H zB^QL#O753QE^4M#+}B7h4Nj}OUnwED)wcWBB;~^Cz4xmmmo?Kz?$=5x2B(kT$0d~< z4x_nVaz)5tH8)AFYB=uAEt0fpo zsyJ@B&Ha*Up<7AwfaJQyt)h8QQZwjQ*Q}S+a@^aRzesKf-FuryB{wzhBh6!yx<_|wOB~+3O(XlETs(^kK`6xY2%dX}`fO7CktD_S_x=0VT87M`?)TU6nwradaS^}hP zgI?n;s8q}GW;_U$J`{Sh9)wHVHQw$IBBTT#7W9BG?cmIadaz9TSU4l@LA3OVW=8UZ z80pi&8R-uM(oW9I+z0W}F5%3Q2MN+=nwb?3gwp4OGwU9Rq}`lZZ4YG97s6S+4^+|~ z&8(3JY0}=oS>q2dsgC2rXw8(q6#B4Qv!s0*ANSU5>8nAXpw>KTKgTz!wNUz6=o{C1 zRQg8ao7`F?eLLuz-l~=kaQt#xOQr9GekHAC()Sv_idK#E!=PVXYo&CM z?`^G;4r}~JT5F{vgZ|^KxKz&xV6@dsKMDg_ZB5congI8<7U}1~fS@+5^b2QpR9lDi zt8jK)Tc`A!W_EI0xAgnq?DRIBbd(dA+tx4rAq*^O8<76g1Xi>SN`DOo*0t%SW1OJ2 zwlC8Egh9P+qtf4+ppmvQ>G)vKcpHIiaZ!erB!d!BmX;=i%TaeNU4{&yL0YDa#0`$p zTFA(W!Estk8KpcpS!*k!4h5%c*)ke;POjETW{^0iMC&RuET2=M<;aYN=G19VkD6qj zpps7D>L8HtPH9(BrQmM=OM5$f+!JQA10|J5V{F zyNvNTRK7TI8S8Pld`bB-_s0?Pr9;bt9`ohPxPL@FUMBw|@sGI2(emZxeJ9?e~z`#4^{GI4py;{^Gi<;yD`3+1bZme)NN$z!-H+8)c~s}ooBK32(N%U6s% zPLszCtr&ld$pzeK#*<9>n#5?l0VTJvl1h zP`)zxNs)Zx(8}~DYIy?p&)g@a@=b|Zqq3 za(UwFxTl?RMfvLFr`>Yp(CYN3I=PA)oBOn1o{|__@^nC+S{_^RbWpx^D7NmYUY^E{ zYkT@dzAZ7X_vxs7dwJZ*(=mDaP~7-aK$L?5Mkh(JBT>NWq$x7W1@4`6#m*r?P$yH7 z$z2oGX`$GaxF)XCQn9;yO>(ELV$aZ;^iH-Si@P?r(@C*6acxPbt72dI+KNt&V*k+E zx=x-Vo4c;9(_3*Mab0hxk0Pgh-AHGEB6n!rcqgjJ`~X?uOj1c*U{A4JBO(isR)Q zD!PP<6GI#7x=CP%cjHwpBI` ziPO8;$|kNPx7$g1FHus`?W(+AE~)6|D4T~Qb=^E=3s>6K?X7%}DDCa`QMQ&#N4f)) zZ9~%WZd9q|$`~&~l@AkTtQX)m$}ik)QN10? zuZi2@dOMZh%C{x=b}PRRZA^bRP0mT#}<9aR1r+FsYISB`Ph z+j_q!|4U5o?HyJAE>9on9aD}ErH}Ul6>!5CI+BW*P(;8iD)=(yuA{4vVJt|;RFT|v zMCmM4K`stIF_lMum=}G8)dP)A3Yv zx1DV|Z+z&NLQJFV9^O^1Q-E`O<51vYS3vZtf#W~cX&}z8i3-#0GW_iwjl5>3$`(dbQpEJ zuzClu+GPcdqfdun-&6)#a0esi74e}|5X7guX0bsK59pCOz#}Q!2>OnDw9;u11iVCu z9+`=I1kMKV!9@sBb|PbalvT_oXd*lrNHS>mZc`e~ytg5@EJZ9^L(ZHC!4lkH1AY~) zxkc*fwN<}eFm)}k#VMsp+#MgDvIA(Q8F>qBD&Z`M!UWlShjt)(yHV=LTWNe&H!@zy!i(w@Nu9T9Ag&@G=bI6GyeWI6nmJC(a07Mlffd5GVyD8PS0hHF0LAQA&rw zD1@L;xT}?KE;E7&kJvzhZYB_*^KuNC@R*IYdMW_x(eruv=CJSw2qT0V7Qk09trH@C zYa|4lygA6M=^cif(4%ZB2^_~sO8baXJfo8T6Eh&=|6;e-8?6CsEhoTe4SG!grRCFr zKL*gW$1uz!=?O5-_&Zl*;A(7u6Cb=~B7(W`ASc402)>F}UCU<;Kx8ySP3k8wcr#G% z3vQ2kL}rg8-%>m-m%M#D`eXZW$>+B}Qn1S<-`~Q1*zXe7!1t6L+tua+wCh9yJ$=9+ zb!U<~WB~EowLLp%!0b8`J2id4CUs}eDWd__&y1u~D+a87?g~5|HsF|=6?p2%fc4M4 zJ*WQ~aP`}N`LzFl+t2Kz({~11d_0mS@n4Z+5jJahCy$hy(|?M^MP1RHN6a~?uHmJx z;4Pi>9VP(&z2mes%mlm05If!ysXGD-4t_8vd_x3)a;D$j;?qwD;{9^$&NU8L{6yI5 ze@(8N1Tg`Bz#h2a*+zZBP-D!p6Un+|-*d#hj}O+pMsPqQc#`8GgykADfh}>CR4oud zbF9dDR3>OoWB{@Sk{=J)hE-55Zc@3?i6BVm0!oX^Og>zxY(=VZH;ha?fK&01H*ZB4 zlO0b2zp*O|{!W9)xHX_!Bwf7D1SA@y#idv1v;Z>d^xNYcVgf9fKm_IbxPY<{zyMSc z7z0#5#v$!nL);^Wcz}T+f@;&StY9;~Ds-tYfs_*18WUqMK{y1rIoTPsoP(n-NI(F{ z@;g3Fi>Fx#|o!@HF7Ml0eq~#VmEyjy^KriRhNl&V^olT9xbV zQUAOWM`R9)s6Q|PF&zanjCP}8K%b8GKXN0niT|*LuotN1wK1V;VR!;Au_OZ#Lc-Yp zUj`q2-$jW)40HD{F_!&-0x9fF2UbivI&$6K6$I(e{(39%Bk2GeZkRSN39-C{Vn?=< zfwJC*XfC7y5ik~jFa2}DG<5OUd&?B3?SMxd2c1obXMHIKpsdDqyA9#rmb-u8wt7k) zvJLp)#+D~gU0J#B%8vyU@L}|6rAqU@rpiZy0&JIuon_B)y$0(fQAJ){jz2 z0~=maI;Og2q+L$DWc z5;U<3JMhu?^R0+}>f_5LBXGTs2b*L8@Tf3zPzteu2Oy0>+fQY<-Sh%ljBQfmQbAlm zY>@T(83RJIbEP-^=scv1ut-AF;!6A=p`C9mRru^m&8!bpTwM)ZZ#JrEC|U49=C^6D zB_Te(o?Z#D2_BZr4@U`$cZ&Uf^~3o68oLS`um`UlE@O=xK=Wg{nQ`-Q8xbiRt~N|v zY?K9^0uw3^*%#_iPd!Nh9Yj4cppLgq#9eS@)t~^jBbsw84bV=qGjq6bRJi$S+iNov z0e|aY!?g_NorMqy4-!Dwr1ii?L@(sN1p1`}5k3lPJ?a^+=HL$_vzHDc;AE@$M8lCC zJX=yXgyJNE{QxA4B&u8S4)b#oky_4uXOnPNmt_*Z>D;xY(5X>ZLNozwCP<|-o^aD9 zI!a-~3A>gnZ`%_w&qqfEpb4MhfT%J&(Eyxk5qvf4;r8rx$ch>mC0Kob@FVA(r3-}4 zCLm(MKTH8l56p=WLR{McV5A3(4*xZkDj;Z_kEssHMIz$*GgX7Ez6t2AjXBW-C^|A> z?;RvW@5pADK;Li{e{?27K)x8c8^&=qGjH2`roT;8_Fn{Z0O!$&h>8+7_OfAsIe{{F z(Bj9`J_JF>7XhtN(TFQx2wdKOOsgfS&rSl|Hez^A-Vng9N8Wa%Og?ZRpFQUMlWN5y z%6uk1E-|2i+jz|qV+_1%gY+a@Xk?EHA_)7;TvOBpfL$A`0da5xga?pxhyzLhy``U$ zYMD48UvmJ{FhbSnv#N3T84EymTvJ$#F%KYjUkp0MKJ= z*|8C?ClJa2Bpw8>n#F`_rvuy!0}(gZ&W8C=KSDzx6tgC71_rZ90W49X6B;MjKo~Oy z6FV_~etA2M>pxjXs-2#-BS7$`5-G!(5)vR707pVT3Tg<-9BLvi(r#(?Qe+NB;+gH} zpYy0j1pvW9UET=_p?_xs^dEoV&b7dR6WHko>%g^dhWyY|uq$!{FWL#%6bH;akHK?= z&H_Q%0W==KZ|MTVb_Awvc-Yp1{!jN1iP1OCz3jOB{1cO;l#1>rkqY82` z=meRB5&aJ*04yN<;qr~|M!@1y9zfLhJwY~wjkDFaXqX|9sKB>dPGF5T&V`unJVU{2Jj=26ezx#{XQ`kd{BvHdJ!7*Ao)R7;o0n;HfP z|M4j0P=!i0x-#$({@ULmZu`-oH{U<5|8T72%?P!i9@f5b1j*Zrl8dxI=-5dH(ETVL zE$)3g{$t0@jPL=QpYy?K21)oc`{o(OyM;ds1H*4R34R{FVO-Ca{VdsD=H8Y2^W66A zidQ8+KX2cC`Tg6ssdtRR(Q6rNLu@)dK)>64^d_+Ar&i}yS9AN5(2&-Dg8R*W%vh2i z*Kg&!qcZ=*cRODQ6pXwAczEme8<4XvzzQz)v*1i!!PYU4lobr;j{aFGkv9*1?@u7} z-3rZL&r2a=h0|Y0q~rrqz-tIy7IrK9(^6}!J^b2L2u1HzAOeWOnK=6w9T!Py_?xyRRmi@sZikCzx;slLcNQD>OHPou|Qzo~+g zhfn+k;nn0>MN8i``2M54HT5kkhW5Q^p+UQ^{H9aP+pg;C+I;}L_@T5b&VBp(M@n(= zXVH)^&=)tp{p`EX{oIkCnxGp|?`wX44BQht()_!kt~T!1qu*ER_5}X=@cZAOk&<6K z2Wo=!y}yjc>w;=~e{LK|PF=BO5~(lh#&Ln$z`K1uj*-9{&K(urAB^i`V@rA{SKs{H zbKs%Rn;(|IF$m7?GX-ne0bTG<)I$x(q+?(jo2-C?0N_oF2E`a5wj$n~fEue2fSf}e zP?JXZ?_DqeLXmfCN?z%&-=hO+s7iATn}5p?TYij?!xV#ic3#oJ z7>!R7z!n7WHWz$dJONlAKJI7GG`WCCe>f4~tDXYzbnk~I`5Qmk3o?Fc))VQ|TOTl1!tB(OH*x@0@#yJYcvSw|4?BtH z2sT!RbWR<#R6GWIR{KS*eOuz+w|dZ1VN)|@M`My`(p8(TV6Z^p;t!+ulh!}Iy0z=> z;0DEv8Y%w3ZQ~xOv+FF9syGO%R|~f!?0MAOHf89rVv#?LKe{ZM^7rSSl|z+^Km9MC ze0upbZ}0Pars^ie2LEf5w+a&XKnc%p4EaIgn(EarhLhgXo1PC1{Zyp;e=gRU#ILCG z@18OoYm)8Xc=ETsWaHZ!z#o>-4^vxS%$Or>tp41+V>ndlwy*ugJ2&~i*SEaz1+mI2 zHC?NRh80I@KI;-;m69E(djX-Uuv)Jk`;kIri$B0Vo1{)+=Ji0JO!>tB73t^vtt%j1 z&xE8e%HA6Ni_yzz8|7&4g^^CBH~4Mv9?eDcP3t0~5#54A#48{i*mmlBQX(5NAzcAmP}gL@ zyI%w2$Y$sVSQh)x?L1Kiy(Y8;DOUneHb5t{0dUuSlBLuJ#M$xMY=I#L(tz1cw(tBH zG6u*d=o=_#t@Watb5}!nzY~)Q4D6PH-4J`9joRZjd0>4!lmmhQkU!hJt_2lmzqf}_iKHNP#*Gs_ zoAWIHrLh}^zNDq1vrqM~GOGkVUSSrXAhrAu0-P}F$Bw`J#%LWtiA{mxhA+-K(f&Rd zRHb&Y`j^aqqjXvB13FF3*~8|NP~Dkv>~*-0X>S zuT%od!C+vxbociDHWQ_HR zOoBD3mu?-;-kx;+{EHLcJc!oOBy19RW>V|YGaVUJO$%ti=%|y4k57wZ$7I4(44Fpg z8q@%%gYDUd!zvayR)2<3T}l>3gjytkkC-X`_j^l`p^j9F_<#(oi0yIN3?~wih(0@@ z!VF4?lmAM?^_xbmK}hBD%&p0`=wBb=IMzwVR02?ebl=+_+dyRq+mwnO>Y1%3i|G6= zGAJYiFpa_mH*~O$+yaPs<(L7^6x`}RC)GbhGC|r6Hc{W)KL6Ms=-&2htE_v)8jcbS z{BpE38>jDXsKZX()_!~YYN>XLNwMtm&8e#oMK%dYP3?*AV56KGQ?>2>I&6T5<%NIKI!q`Xf<{jG8mc&^Ju3-Z9x)|Ws0mag@6 zXO%OcN|Q25Xx~~>8u02BX9B_2cYWk>v)$ey$JX59C%USe-@O~qQ~X2b{?S%h$^3v= zAO8*;J@SQtsm}T%_15SAz;8Ai%-)+nax-j(Mf23PRjdic(#c&(bF)-cy;DJ7TD}h% zbn2VWTjqUQ4A5;POhrO~2|Jbvw1~wvHlP7lqHLw0ARL5lE4%sEsRz8oCch%9X#)l6 z3CJ6k{qT=HS^Ix~eK*F>^*?A+)QP7+`GB(v}(mnxa8a!uB~C=ei#xuRZkn^Phub7bT*M zOSak(G;gux&)FZdx38(b60@k4v*$2jb+0=mN!7DJOr%@b*M&&;>rWE5eHs>3&7mGO zZ!vvCmkNUJc6a6)>yJ)HLf^D*Kjh0g_{`nw-(w$IOhKUZRQ1D{7bD(Bjw7a;H-Abi zs&AISduC1=mFjeFWYXPrvB7;&K4Bbn`;F;2(%ib&wzTuURB&{RYcMU{s;HTzi1h#W z$A_^UZ?*pFpwG6cIV5%QnMsAeBhx=sZ-cf)p8WUcI-AqRtM_cV^JI;KX}*f*?R441 zYVV%13!L0e+PN`-y_Nwd0YzMV&%vp5MVw_G2x?`BD z%}eO4@VCB64Fn59&YgOsH~ao!D?{_+;%-Ci(n|(=OViSXPh#WGL|0MesZRYk0DO|` z&wB7|4%o4lox>*K1hlCGGYrDfs2o`B8A?JynOGeNZ~`@XU0C^<+ebWtRd=7dQ@aNm zFuq820lYg_aS!t5%^EYBa@9OcMnVlwK2#T$aXFmuH)#>+%r)2x=7Y>xrJtr4n}Vqq zI@b7KIXDnm`*6beC+X(vfAqdrXMRlbMP^u7!KAXCw=E+aaj&%og}mjdfwb(?A?(vM zmY%lEVg)>fUcZwur?hHu_Lm3?FPL>VsAz%sY||3qRE73WOyuXg8mKd7AsXoYI}x_c zZ?Zr=tbB`*%qY-gdERvxE6rJQp6vr~eoumn{Guk8T{iH!IQ{X-_emk<;3rqXiH84(F!;JqbFN(Hf;RsPS;mX%#KRDWVJSDVwHX9GbK-a4LPiQQ1f>6m!#AcH)?tok$t8@weHTiez*2cPD&wh*$J(dA*F%)GLZN3cY zA;~9gyn9mc&t;cU^HLRw?5|?gp4Kg9Y6>kvmvYD}R89Wp*~>(`SKK*c*r%7N%x-De z%&4re`p@VEjM=3$o{b7CyZclUj;C)SnJ&Boek?a z4Ie3DX{~5S9Fupn@ebqXN7~L*I*dDDjiZy|=~qoD2J>zJ523)FkU$#_5CZX%U6$2y2eG9dNqG=J#`0d9t$?z~wH6Bi1CwD3*OGLZ zdf6J-643`k7y~y~lRJra>{0Ltv+q>#gBn{;fZEU70SxTW*KR-u2?#WAH<&|l!XP!m zza@o4mndKpW(Xz&5^w)e@P7n~jZN8UOZK^{T}szOWIN_;$lhknX=)LV8T-XE6<`Nq z!x#W(fAKi*WdZT$!Po`KXT$6>-`)F?kUDcVdS*}Fd8z~bz46yC$h_I+_WMK^8h47` zUonlzTr%70CBQF!@3~}}^!0jb+>Oc}bxwWslY{H~Cp=DNf`5uvxzBff+U%kII+%L= zMr~}Nwu0IjV)&=Ql}rHYdk*W9+NXqq&~MIL=V13^bJk3l<=j0;27X&hZm1VI3$7h` zYd&E~-(VUO3&8%0jI_L<0};e`G6WX*wf!(k(|``72bu&9cNCy3wow*bi^QT3NXC5B z_jE?Q#emqH8^j4(=qNms=(}Hc#b9%=t!vI|kEki56af)P`fkj?8ZM{XJ6~+KpXVwr zAW?u3d+J;9=!#CrdV*mtLdX(<`sF@~%n$~DVtXcgq9$5u*2HjkC!$YCNwLRmad-gM zBZR7^dI9!0$t(=PDS9IVejC{MvH+*^dmQ1a?+J=gyKk{n4BQPHyDd3tV^;f27VN5V|cRH_!Y1Y=`JZdk@uT zIDGn8Fd7--Vr_9Uw>d0w?dOO210^<7rkO0*d%phqscBbA%4YT3IDoO;SjeqY(Zh!m ze7}LBnd}))fcjUmQ<+~kCqimfB440<={LTb| za03WE#h8#s%bKv-#0nh6wwx9LLq5owkYe}u%#tjC2de)zn|{AS2eZLHM~aHkk7}Q7 z5rJkFpQRt`>8smNMH$<*z6+R()2`36{mLNlVao|?$6diB-y65j6ErCp{hiWxJDrMI zfFEsR-+vY$;gE)?Ko?=Ao6UJ=As}-kft{EqW-72o8D)?R#-M$eIqHC#hQ=_#ZZ=s) zK}kBV;k412LOU%q&w-8=sGqk1p0k;s!$ePsy)O-7qjLbPMs$Scp8(vkwK~W1x|Nip z)|NyASgY+(9RzmTA{giaiP%iklKov@5e_O%pGi2_j2Znp#tPhyP0|~NFPvbzCYY&a;78V#(_fzk59fWhwU$f(P!-IC_>i1z ziT5yB{i@^z7Z_KRn_@$P`FbS{;w0;Wvv` zX@QEJ5`i`9gt-*vhme?*Q&2WA!kX7mQL2D6MzlVIcG+Zgsrq8;HlmR|ErFEvp-=*VQ#)YW;>2L4vFTZWj4huu z6OAAlmd#5&@r>|5E1U&v4&@olf7XBBnM2%Ijyfhv=>!7E5^^LC)CZ&Kvil#HLOK!y zPKvPumX)jX5aFa!g6LTaXo5AS1anoi7bg*8)bO1E(&qXD0Yb`80-k6nRFTKVnpQ)e zAQe;2{Xik{DLAr>7C;C_+Ya8zat|YRvLk>4yeST-J+KfFsY?f>0~-mR=`x7SgPZsk zuR2vW;RBAxTam6E@qvM?3%R-T8{*^JJ*>8kIc;a#9BgmA7r)`E=Y_PGh$YUm51yE> zEnRQs<$Js%;;^&t!6Wk@#cy14l6EX~QGxS{gM05iDNQh&dBHDj(K+YU2QS`x-Y;A- z>)!Fgh(71^gEjM?mx?@R`4*8Pzc~jTY`mw9mwfWJDsqbSb2)JE%KYAVshQu(6KRo= zE)@rxi5)|)`0PEI9qHh5^fN*b=Bq7!GZZ>rE5P0t}H2xdhfFS;MhHIcB^EzuevDer^~N{KjxEOZ@-HE zC@G9IbR9ZKUqGIMdCvKv4&X0$H7}fWpFAZ~60+%3DL>WKx6txFWBnep&cj0u};wP@_3uoQ`uYbbT;II&E>V^RU<~7$! zchW6Ni9`gyw@AScOGZ=sFH1)EFhO|ou zA8&#x_N_)&zgX@;S3R>r4nueLCE!;aY_yu_@<(lFC;Tl(e0|xIwI;L`ElBHx5Br9$ z*Yp`A$F8V&KHUudwQmnz*H`COY00$Y%!G~i8~NAwIf>TpSy$gVd*X~8teQTD^&S=p zE9*JO;aU4H;D6{g=5Kua*I)MzOuP$)`djvT3{PyjwvcG6Sh1gqU0A*49@9wxmm_F^uO&i{Bl2Nu}@Q;)8nNz9+^|YCm(+wH( zj;b@o&e3b)pRBfIsS+2gE!ur0nDNR? z{a|#14Afh_&6YR#uPYX}b#5Hy*QEjD^`wY1F|yP(}Sta6qJvTwR(Hik^8Kd{VVFB%BFU z$2I~UT*aONVrQRzsf>D_6-^X00TYQJ(HawwaVCsmi8T4nv>&;(y=8L_D9G^G59;IWxrwumc zH0RJ!h+$rtQ0Y5t`%57L#r3xMTbisR*lcn>xHt!(fdb$>#g(L*$pp3FY18AEWlD+& zc&|M@^(Q?Io2WKZ)AMG%|8jKBq1&~MOq@|Ul|C}Xs&Q+{Z4ABB|8v$M1WEwT;#NO$ z78U>ML&6urL0V`nFhgf$xR?SS@lKmhlLHLGu!FZKc?=xJiIEmJv2;LX8;O?J`UHa_ zvm`$!&}9Pi{@DVE^=*v<9;k&m5RgT|6yO7XFgR}@6uL?TC(h9&P;f3nKns)9cd{sz zGhtwZCE|$gtj^@$-yqXIs?FlT@t_1pS-hz{8gj&|n=RIR|r`WCD76O%H!Gv0N% zln!P)(*TK0<9}HLECGg%^squnOh(p(xfaLMzEr{$KlH95jzCU zy!Yptay7I$^~&i-)LDd)-i>+HKQ>vKN5Y(O$H-)t zy=Ur8Avejk;Mo*o3E&0P277+`6Z8lDbHGtxrh`>5nkJYx9rMEibcXzz@P@)~8bbUu z2eVXD1f(iL|7HPM`6r{h;WSqglQnaoY0oV1`6aAP(eLse*=v7h_xh$pM{5b|{O-NSZyCC0w^O4!QOEn>H>_4X2-U;kyc`|*oN)sF=n&f|&J2(ErZqs*JbW_w}N`6B1 zEy_jQ?8o;lx&#NYv?$yRbNRITO1EJv1m@+RZQ5iAfeBq_9myJpRrwW7(fu4xkB$55 z=e~DH$-mh&3GkLs+1c6k6C88%7c5%u z!^1IOv&k27;=`^xzRdp=o?7bl$?jNgci1<_@qFms4kv3hJ0&k7+|9|R;E_dEX=s6i zfpb-O1Mn;mVh7^GJ~ z{wb%$1)I(r_$)XK6%-_6XXBTCnrd~ZXu&@Qnt~06k^7b}x%BkV*a8!WyTnIb?bi)+ zjvXce&6MW_$@i+9^e=zU0A&k%rhG2gdhcd`oF~usCqMi9MbtPu_{#u<^>$XDNf33TOWdCz~U;Z2aqUK=n{s)I9&cPdMV|D7Ca-SM{Ok*-=VdA*+hX<4MR#m8+^GncG2(ls4{n)txW z6#T3=WN?9BX4|DF?>tu(+ehs`FOkUEpEJMOdrc20@Zp{m-~RjG_g8J~W>AkdasRt> zC~D#D&J@l^&pMcE4QS-FX_3$+Y}s7* z*AtnSj$Zl&OC~fI#?JL*M}MRrrFcgdOn8oMygTdlpJJ2Ft~%omnGk zt@wMUIYlF18yx7SWJ^(6X;p-A&vGkH$tJWduhQ+{vJn@Gd{Dr%%BuN#>6`KO{T}#P zM!VbeopSPM|6J|cmx!u$EhY?2)YM$jx$^{f@8AhO$tnzuG}mDK;7BN`LAia1G0aXE zQjp6)Q13>2mrst7eL?B-zRorFUi18MNs|q(eQ1J;EGf zxP|gg>oYI+-8J>C*H-e8wNB@IT}~WSmY(&bcXXrjPIvBcTpebWO{r(YseO0I(>9hW zzGEpj#2JQrMRhyfL;IoFUCZGpu8XT*WMlIz2f8VDDGHKJvYRY&Tggtw@*-hIe#1@t zDy-YZdD96M-URp!@|jh-X{z!<2A&(eXMJ07X-(yrC!@f_%;52r-SGn7J_cppnLG%T z+Lu{Yo$-`Kyq2$d1GmX2Zsf3q;>IA8@+dwy)A01SGkBaja&L=pcGl1!JBdk7)&D{K zvR1H&6s`{yz|G>V1kwa%_=IBLbmxxKj5m_a|5?@DosIZ0_Vq1li1M zpzC7P3~Gw)FVOh0mpL34?B`R%;smGK8&Ze?vlg)%Vrqc$k)za<2b&Waw~Hasfjf`U zjnCJq@zjQjZMQf^b8;k9bDxED?g)W>D)}=^KI1-3_V&!^^c7?jn$6myVSFIV68Lh1 zR&Z-v2st9u-NICWth5m60Tw`Z5~c>&I&UPB$>aiaAX!anaxFJ%7fJX|m7RuJ38%5E zS~R14GKu&$Ap#SHky+-LdKVNHXcxagkhXWNp1g(*zov483_^s;Ah~cFGS#2E%)kM5 z9}pwwnIL6zz)66*!5u~hN>v#nnMM_*3r69A)z$CZmtI)YSO|Ux7q!k4*sNzPS7pDo z2?jE3>+Bb!$um(vQU?VBK;GjYCw5PxiFD(L5 zK}FGNU^_N&*Y|PRXQBbyXoW+x+kJOU$4>*+n>>3q(W%<@kB>DTJvEpJve+x*6Vy>r zM{A3_vyj75Lf2SC*YUsxrZ-Avf)tT-s2esKEXwUZeWCcJlg*dj9_ z-DBSf=go@bkjZXL1NNV9WuSDJ!Ybc1L;gR{5EE|w*Q4hBkQ=CxzhG)(`i@zlE6@nF8>$1fBN6vfHkSGf zlvhWR=?Hrs$BKA~U6I4YfaPSYUgC$-nQ`2Cv41gs(w|Lm1uVUxA?%?k$tpY%XcGh~IPrh&Qec!id3rK&bMK~5$m%i}1H3DY*}&r0>(_0@`ytocCxb>To?WJ4?%Id!uTi=~86V$zuW6=y_B3 z$4yo*E)9p;Ny~&!e59fjGic)17w=JR{`$6%LEA*~KElw3{RF+F9VWg;Y6%W7RVNnSt#+UZlUasV zQ)9^ft5onFEq2YC5rvD7Gl~bq;9t=d=Cf_OV)3a)bLC$3`#g?0HgPDKw2ljAPrlu2 ztf1SIHNAc7Q9b#BcZF5{{XeR<@_LSGV;6|{E0)bB^ks4b()Z$9jdscx0$L;)_T=o) z@oCqzb}v!R|Cyr|y}>9mhwV4ryQE?9_desr8|S%}9=-1$cWqMcP-j|`Z}__XXm;ec zgkDzXCex1H551mTs-At}HrDP6<{Skz%vKtU{*HjrxbSAzs)8C}BNsJ*mFx~dIk8s3 zPcilh2Jnq_Wjt{hDpC~Q)g|R!D5PM+5?VYiim1veMM+qc5L1GwQrWM>d&-{7<2SqW z#HJ2xdp6MxaG%Z780Qu73f_O#z>h=ezezB#kQQXI@rlM%JHDg3mmZ-nzRDJ+U^4hH z!HS3Kru~4lKxhJT4WlTv1H<@vg8`Bn<+Zv9)u*FPJYa**2m(^15_$;Q^ zL*NN|O(GhBCr%7DdEL1K@21M6YS*VdCJ^7#_iYsXo`Nu z)BaActH{y}T{AtP6G+m-^OBJHAQQNr6-kQpRn@QIbshnwH^0W3&%usv}x(epe9=m4)MvN?m2(BU0yo?=MT zYfL-?xnF{cS2}&=RR#(WeU%B^F#w;00_i0~7T%I7IgAwg#3a+x&r04~T&ZAb#O@0H z*}8q21HEPudJ7`+j|7@0uPB$sSaQr6J{H^U~N$kI=|tf)|W(LlvxR0&09 zvBkz2N(G~|vn9{ei>5v$-0lWXU1cZeU@js8YO1?@bK;FyxQ^E>LS6JFvFqj>Cum_83dnwLhMhMD?$C&x@mz`8ntESKnGxMY6}~c~ zcl1?5Ndj8!`cceJ?wuJInbJpH1gYl8(hr3_iz&#JSjPw!fe#3WI7pw>-|K(`JOE~J zj4;Cd+C(xX%1EHc7AO-l9S8fk&f{O+-UL2H74J^+%5>%CSqDGqvI_O#Y6!C63qPLI zzIk8sf(NAg)`qBQE_VJmg$fNDoM6P;A)vkQOA5B(dKW?}2`}unAN_`g*kowFOab!M zu(Mfwt}zc7(;jmamv4m0KP>?TF{Plgc$22;QeEKZvtTnud5;WSy6Pkv19xZvGMfZ; z5f@JHk*XL8`Awj(c(2HMVGLY)ft7$^M%UTxg4sS_@lqygc*B~9^@uJCdEaGa*FqL2 zjmjTb(^Og*33|W7m$X|1##!tN&&7>~FPkCec$Ee^*G?$4WZGlk;>pZ-#$DqkyA!B_>3hP)XN+IDY<{}q zG7GU*+U~>i-RZ;1YbR5C9e(Mn+i{@kZ6_*?lrlXWGhFuUi=KB(XOewv+j$2MtBmF8 ztAO23rBC>a_Sfpwr7(Zh;q=C~F{x$5(Yw0cP6%~myS5z{o}cZU;S%P+R`qeZeIn|Y zIg87*481)YYI}OMGUa4j`)l7C`AAVn{{1aN5=Z+8vD)6jUWDtE9kahrxCq5fj5f%= zi{*pu)MYq#00B?c-gWpzw>h0eNPRI#H(627h}qW{ry63sV*9F+r9f!f4u?8HlKf0# zGGOZc2J7Hxi~2<~cR9zldBj_wApp}|B^CeiGMc%y(%zvFv1&`q?QVky;oYW}svGAW zzf~2*A4_X&c02jl)&*dws}^kkyX?);JMZ0(1y1KsMbp{BCDWs(mSGK=!uTq2sYcXnzqHzy%Iwha z!%m?Z1-SgnP7b6p7u5f7@Tk^!&*fi}`)=Ov4YtqmG)m9zgkhHLpsCN*+Dr!=>g;>@ zo@fqX%4Lq)1_xS{#rrYpteW>uzFpW+M|8D=9anE&?!41wxvMTtvDGdzQ8Uz_f%2G z8)pmq&5s0rX?DZ>SM6talkCVLSLR#bqwKs;Edbq;DGpyT4X$qGT=XsXFo9s@alSf1 z4uaDPC&R7h=N9p*E|l9cf`Z_3>|^zjB~CJ`&N`;$5L7`g!9_ABLCzDZqX`2RpkI_t zNS(lrN4ThUU{=$R!NE`S7sby;uD#g$PL0X*tICO!TfE;?tF}$~!Wt|KB>sR^r`Blcs#1kz!^J4KX;%cFzfGqTbLmNqd{T<<8{#XYpz#r(R94$Gn z1Oy?NqA*0yv?U!9b z=~qD2=Rpn(OiP+6De9~dv#;~7JHL|(h7hiE7W53ZEMS6B;}{cHSrj6b!5(Dmb)>vg zVOSs$2K@$ErdR?uIZ`K@+AXm5_DqR?FWZ4r)OweiYkp0)J#Kx4qkdjDs8bp}4BfTg zc_dCa6&5YlHX^KAD>YLu!$hQ|MF05Uf=&kpTJ(8TFjWwvB8@rv2Y7*N|Ex{qCZd>; z?}J3@tX_Wp#_@eV_DvV7+e~fJ%+mAU9EX}W&Rt-17c0xK|M_W^0}vTay5)J*Au71$ z`OoP!-iRlQeoz9~fajhO$mOSTHx7JU z!K`c2W`=wLQQ!fyCvg)Q716u@pEr%8&-U{yj@1z=4T}u4uX9$n3 zi?(gM3nGA7DwV7Tksaahp~hW)L!syV0VCN^k}-uw5n53_2NVg%wg=J)V!djfA8S2l z&s1^c{iVCT^a{!F-1nVLf3BP*K)FE$RiIjH-pr`){0wJw#-?-&gJu8$7MNFGX%~%6 zx(&=Brj8r^RiccFf>EeV9E@lum*LdY0^?7afu`q$y4+d!of=hcv-G0A2gKxh_4a0o z|4y_Wp#a54BUtA_xT`82MQ~N7Q3oeE*(GkTcDh0B z+1XtM;$*_8TR7i_(UBGg?gi`_ldyzlIFZe?T}W!Ia|}2~MR{u$453E2*25 zB|WzVWK1U{3OZpsK!Yfd`A=T2c#GAC%)PDBR#T15mwPksb)$h^X8${ zClMEzmXQ+&tLECxyj^L)pBf`&#Q5F-%MSJ+X3&U)mXXj7zO$V=ia+JH3jE_42Ox~U zRtMK0dT#F0l8YM7&3Kbk z%tDUlq5%db-%KGR*bnwcjv@2}Jxjz`Hv?vayx-P&c&T1+KTiRhiPwtiM>4s@O`Mna zJFmrBoQ1E@Ntr+vFg*&}fP&9eGUBo0=BZGp79RLj@x#>QsonP%so9|cod?LKHZ|OR z^nwk^w|AmHrQGDlka+6uIYa-)hdl;Og`NP(IA<9J{W?t9rT#|-c&uXNi{ZcD2`XxB z5^gk1B7;Ek?KCg|Gl)w^4`T?Z&F@)4D!?Q`_7Oy3EthZvc-mK4r$Fq=U2-cC5LKtr ztkRJEl0^RX2Ruj_ieEIh>FzD6NtXaD{AfWT)8}WyQ%7|!_>}iGSxyl6*xpM=P?Xbep>r=rUC%!S?-m(6kS;Y?$ua1)H>}3 zML^{sFd-y?1|UCvEK2QJ@9D>0nlQTsR2Q~riHNJPH(7y5PhldSr(EQzpLV)(wMoqb zSAB9?`iej^!@|w&-=sV5@)MVoE`un6Hg(fX57ri62b_~zSB)Kv^o#Lm(sJX^;nX}# z9^(Z94Vg|+wY?C45aiW}hey7m>P%2z94ta(usi`G3s7i>kWO4Hpn~nm=knh3R9>Go z_0MRgcfR%Ig_`HXrttP{v^dEC zZ3=r`UZvL#phiaWh`0V+U@Ai~-{9s)GGQ=^%tn51Z3ZJMDehj2Jv-tE!_=%*z7)A`i1*c2Cl%!8w(m= z1?=xQ5A?4N1pjRfU-a5Jk$>m&0LL12$ZCDGi&nsi{H%vVC)Y-TIoc9k48P*J?k)`F zt_g;Gs}EZ|QzOEa^?dlnT11FaTda#IV&U9-JtVLm6Qa>pv1s*GtVRC!u=o1Y5Tmx| zE+@ZUen)TC>K(rm@b=-wp%2wD)=>}Jg_he-Ww!*ItjpbQE*;98rc4D=6 zQ^%?=K4z1p-O34jAU1LL@-Pl^ekXTCjhwGE1&j@5tZSrOa%Em$U%wmT(PqA+79hrz z(=n8|tr?!%ZnyO0t8IQI-|#w;3U+OCTB-}Mi>&%RCHL7g{7t)?t95|WsXUo!+s_H% z!|j)rTE9A-s(d)SwA~#((H`mA7T^|H<3DqCJ2m`!dz@>ly!%1z^BIO6RK!C2m8Euh zkH|Wi*`?2#5eyxPu6^>Zr*ioC1SU8*rjj|{?SD+%qs+8TWHEl_joUw+wwP?QQm$8a zc-urNj#rQE*&veP=rZanqRl(|orrnKMK2!Dc z)r;?A{Ef-9wjOd=_+GK8Tm^UFlibR^s~I)Mj!e~5_B;y4@PL1?+z;O9JDnzOb8~Vn zkq=)}E!UiiZR=lHmAj@=p!MP6@`Hn~4`WUKe%fn(**4m>tQN|Zy|Cb06Ce5j*Ztzt z-N44SKTGG!j@8(sKZ+W)2VTftU1XB@Yu9&wtpCFU^`jQ4vB(-Q(=YWlBluk?OY6z= zexjL;@g1w_lx^@Iv}_VonsTb&Y|eYnF8pj~h8ufr*+IR`+?UUGFZ8wAW0yMis%IH@DYP^OkK&wkL8pAd#tRryq{@yQWC;dt z5Qd21MuG%cY*+CI%nSfaHYOSDnq>2ThIQZ*Fq?Fk&Po?rK3;eHJB{2F$GF$j^-?K^ z2qAcM1&?Tf3Gtw;7=U{)mhh*9!zAH|>JW9vQ9N=5=;FDEbQOj+mwtungVdsT@>~^Y zEHcIs74P0|E2dbN_H0=TI^2FA3xEgoiwz=DGbippt9$g8z$0FBmv@MEH}1z5QE*x@ zhU|7BSSEKG!f-}GYSgT-I&;VYUl($Kr^9{jie%JxLGS_*0rXh)4(8wjxC$v?5o%eQ56pJID5*V|Yx zMuQ9`EA)J>jdePOY@{bqyQic>_y=ukp&rBMubt8?gT=Y2028R^r=GI6Cl^3iS+QU( zL6prOq4#K1IOW-v#r-SRnnf|C9!GUK59cA#yym$MVJ6ZZGLrBSsq~VRK$p~G)0hL# z#Ss$>R2~jr?t6PMkkZ$I-Xq+PO1A#6B!&-`ro$*VQ}J{M_OueSl|EQElO4xUD>oM0 zbG-Qxi_Aff$+MKF2FT2pih7ZN%;~%lSLpico%-YB%^?}0E$BlEA$ywy#Zt! zM&_)9zMI{0Md0xuJHd6LYi3@Bk&Zp&;(ztGyK zW648E2uAn{S=3Qf$0(Rd&ppD;?H3K6X4a)t%Cw{e{v-8oO4k=s8GnVMvyZi)0mTis z&U6%-&dJlfUy+4JTX-fkt4AS znY6_kq(U429jy+yU@v}Qz<(K4cdGkmU;d{QN)K#6>Qj@9fVkYv11;aONiiRgjMbCth zWhhKP#LP94XrDmWVF-u;G#Sl}3fqqYgUqyKUj?RPOjO^n+4tMN?rNy09??|R48s7h ze=8n7i}kv67Eg~w@uPjAKa70@RT5$pZ(>ZKeVjfZk_9QH!suDWk9(qtXC|^!q&$%H z*0{^Ol~y9JR-XX?bj%_-vhO)265eavxk*Llu0vB$4!jW9X6iGP!W*yx7}F$QWxWEs z8DEz|d}qm15Tc0F!_oxVpWOBgfQB14lb5QCfnDF`rG{CQE$<`xuQ_=$=IseZblf-Z z!_F6G35EpIZJzQ+Hvt7F5-dm~gw`ba&!a6W7|~T> zgDqNfVjv(5MdkElJrspU>7e*m6J923&J_&`-8@6p3XOyP5M4NiEP4Lp5Xxu@l0e1Z zZIu$}&g9$0;W1S}nUfj#0R@-~W{BF$2z(4sz>A>QJJ_^O3)!G+ctluEEqPk%MFu~( z-mqZ-y^urrDV3%)D>5IZ0DbghvXtB>iGE3hu7O5-Mpe?c2SQDph?Gskjq;@rd=p1d z2At!NB=sILa|vvnDSq|l{z^u+s7UcryN)7R1~Q8L0*9(YrN3eZ|6is>S&%#Ac&UAJ zl6A;JK*U@&3iGq(xm?0ItSvX?3rF9Fate%w8MUP%u!>XJ>RRSoY>P^{J^)JJD3W#A(%EU zT)OJAXq=!A0%-`f4j5$Dj72O>-CMpVcmJg*O2CCD# z7q2t1Andb3X=>7GdgM-rC$Ldk9}jq_{KNBt_r=D|JcWNxOQfpY>vD2vi!Uq)Fp>D` zZn82EvNJdvcr*|&EAby2O=|GtTb`%uw-hb4<1VtJ0e?S<`e$)jfz_2s)o;1WaM`h)XV*tA^NsSV~}_~dzhi_H>Ryfc9ns!FtpKo{y}mGRrqh4TRYKMMp~6dprUC}aQ5-~hDez&^^BJp%{hrY=qf1V= zqZW=Z*@A_!hx7W^dobDR-h`@#?T22i$9HM}s?A?$6Trg(Gk-Di%g|xO#7Am!V?3uc z@&kTwoeFo7%CfNDiZycHV?h+Gb%(kCgO|9zJwHf1+P^Nx75~AK1q1K;A6{LmM`MEP zJNj#VGI8K215!n!67ISG+lUFqDAusU-7odk_54hIS zxQ%6R-RO@I?_dQZV}Cw#8Y1|wsh4NRL&@Lz|2`axW&2F^C`OV>%6ETVq2S+}!UWo= z$cj~iWuZVo;T8odKj_K1J-vk}bv!^*lGI@#GAj`Ps#(-x7z>7-MuSYEuJc0SF|y5~ z(B#&wi~-tbAL$P1$5B4c2@rqeKYi(vm|O|yPZSA@lDdgXpeLx1LytC{k#)Ot?N416 zK!C(X3TD7!AvcHzHi1(NsPF+tPJ&85D<8DGz>-bubbnyf-cJyN(qSb$yERb&vP{@( zeCpm(QkDV5wS-%e*=g?``C~$c8{Z*=c5gO%GX4wMEkS!%u$3wO%}yD80;)O5tdgTE zlxZ$?7JyI=Z9^)h&V)M^v0a-bsL556S+hxX%QKl7ItpZVj`fNV8xa%qt)4!j*RBxY zp+{R#_d>?bDJ+*tUl#PKv*uEtkshho(^S1YF~LKj4x%DFX9n@W1!f{};WH0eTJ!Ss zH32gkPoT-dDR#D^wm}PUG{m1QKO-eu=0^7yu`vv{qZCdo?u5|n-7bmxN3lTCwgpbq z1=RG`6m&5V1`;HiEH47RB$Ne}Afh4-oZyM1)i=>t2w4xhiM1BF0_t2?SG8Z=Yi*L5 z8{?rYt+GG36&&jf4wfU;6z5q3zOayt%ZEq2%kXt*Jnk>mrY0VogM+tUWY%uvkI-5Z zVqZn(+;v4E1}L2*-E*h_QAT-yqNO@vI_-TfS~KMRg=dQBw=@I}V+XfHsi=2wm7;UD z+?j%Ey+V(--8;0STvf>;|Gdx^_u#2Mzxm<8X*R z8ShaiGGb{MT(3o+w$9nB?u7-z`B^Qh{J=0tKWb={{joQ<3O(?p8NdD{vd9CFFC8A6 z@$UB*B@I3sx*$Z@w1_Krq6bmXr@U_Rj@zg@y#?O@!{;Og@Kh8_Fu2cCU`YV<$!WcV z9&U(Bputa#2kObS@y5K&r_m%FLEvd$w%$LEw2tG7`Ub5|N5I5(x35<+;m0l&hYmlp z1Jg~(#a?pq;qEnVw8aT|V@fhra5#L87*((L=fpn6dmGdDm;&z55Kj3&9e1DuoPA2# zH1#`&NiDc6<^_UeAJ+(#tz7lJ9o6u9`^{1kvt1v9BUdn;vT@0#-Kr6%=0OJnrb;I;#YealaeR`9ndJ<{9)XU+L}Xz6LB6L4^$k*G-ml z?k0f$kjyrz2Ay@@{8zD$Tt^OiF9eWmu1FYjeE4S5AL|JS&!aRCq?1?&Qor9$SqZ0< zwpz;Oz2-QRD$$?o>8|utot;^h5r~T4LO*CtrIBMfH*soF)&krrY%dYh-w3L|k51A_ zI8MkN(QsHH{;H;Bw;Ji%Y5<>f)By^9nZB>eSu4RZsQ0EQ9==b$COyC=QsCHsgtD(+ z3bJsKOj4Xol^AVVp;IY~vM==LW`9VpG5XMRweO^*S^iy}ne2jl4}_iB8%H6i&ePau zn-*D#`($)Fod;6%awE(a96{=z-h9k#d)fIp_a*B7rNy;I^ihzsb#Mm;b?{Yo}&6yBOJzig~}0dxM1uH8-0x>0ZaN=k~?MGiIl z+$dCItY6V!rK$aa7^=OPxX73daS)Z*xN@oQc_^U;UBA9U)E z+C1F+S9e7dm>hE*n~-F&?-bP}fi%RoEQR3LyOBFxgIc_h8iEExIdNk&+@x1YU^mZWv zI|?i+stNS8yXpr!Rn;|dqQT|VI>)QQ4XS6`zWkL^lloh1VH*5BCuC9Uu+xfHxBkho z##O)k5Z6(vy}ahw5B)x-bt|2%Zlh1Hp({Clc7>Wo`W3P6Nhv(Z|HMHxaKm(}oMgok zrRZ~ASek2~?(JedS@kxJ66fo)={&vctF&aV+45^j)E~XmPYuYq->DxxX!ON0^PDj^ z8_;pj3FfrhOmn)(^H|z_fM>Gc`)I3=i)AYhA3A*CqE_*D-FO}cn{Eh`al6IP%hel8 z@%>YtE2EGRosOUYf?I_yR|y3Ces!G%=dkMd;XOA?)wes$IR8xg%Ivc+h0XIkhFUO0H zxXaaj_`k`>k@P+CNM;s*s3A!4$lQv4xLRL2zZYtrjuUX+ZGIIznIeW|3OD!sgRaT^ z_EgbAf6?0FSj(yAKVFIL#@P=>PkIZ2+WS8Hh=RC59pjI|N2h$|IMYA!+{qpc?O9h^ zQ@tdW9xC`#Rwin~i?pr<$E0g?C3xQ9>jgvwuY*=DI^CqT+joQjj;Q+h=nzWZ2nA(# zW(K(^^t-$YK(uet53 z;z@+0n3H>g*8_ndne!IJOjm%BMQYbCximk>khnFlO80H|tiMFQo%g-BBscT_*R6e0{ei5|>NyFxFHq>dc zuZr41?BFs{3Jo~G$toE1`6HRLwNZ|7n&*yM&d zu8JKd9t*p$2KhgAr5dbS?)eT8EK8E_W}EfI6I7L@xl=}rYZluQa0O9a4vLIK&Q5Zb z2o35=5A&#GrB@)=m7X<`e+f5xdMTc}O6okF^vwv7s<0<*ja86wazK$GNp$sRO^?wT zFY^DJZIXox!YExN>(NJ+AVSQvSeh*KC+U1{E&>aMfrwG0+Ju&S23zeK{(Q4?V9FCy zu(}_$rH{XppuE=C6fm8fVmJUTtjNW2Ijk16(h=xB?V7k?OQN;*9i} z=x45|I%EW~3V=V4Y2&}GMg4$a@oV4uxfmHZ@R}aQL4ag8^U{QXgN}!#lHd@lC@B|< z2)fgWwU4YnR_>mT?yV616VELH1D(@&!aqL*J-7*_Bb0AeZn&02qmkf` zZ9%RMUAL^paNiPN#>#nKULJRPD&mLghzLM+f+Jj z7#Z#)ne~=`oT~E+-ZZ24We~aU-aB?-PVuUGvoGJi^tYtgUf+%nijH$t=KN}mBFS?j zZ$54)zH_M27VzP9POk6m8`)NgPpW?m?d~eoRI<lIPr~u%asv=!lmP`A?1}pNqj2x6;7R`6$xG82F;>z-cBk8tEKp zoX!CqgjkL88G8eAcs>}{iUueXhzw2>)DRz+VH`cH{Oa{;@Arm0b)$4`ff#N4n&78Mm%K|N-IE(wmrSnNGJh#LKG-6Sw-FHrHK zj~-`1#%PSEXyc=Tp3aMTMymIj`Y(I}a5cBRw)cSIL2C6VFOY3ac6`n6`Biz9W4v#w zn=RBhVARDYKAqn_@q8iLvs-@2?rHW)ybviWE2h&+l zr>I*U?}q2d>4?u5&R7=V0XuZ~R%GL@M0~rK#giH~uKU*gj@xu^6L>5ZpTsHNd?q&P zd719#V+Z>yPn+5QrA|+s_$1euGWVLkTumwMzU}B+U6sZ(o(oqer>qKmv9_E?BffHW6cs)BuzW(lDa=J%PVS&M?fY1tdRM6J zceA<30Ir*6H^Nt}hRf>%cCW}+ANc4_KRH_IYusRSiz(;7zAY8rn04uzAIZwS^0-R- zz>F!a_5#NqC5*_c#CYy!&Y8D*>%(;e1%Rv+aa4@f9jLlAqcS{uQ8w1cM*55000z$c zzQ}s8(|Rp#B%KAEcVGSqQZ064mw9B+*9TUpNJ_(DzKb-HyuD5ZZ_lo7G&(9Cr~i%R zy~keh*4m3$G_C%dzkNRcYz`E- zAN^cv{m%tA&bRtV?`7QTcwpSvzx0#U_H-mMQrc?G)@S>DoQ562pTIMoziQ_4NgdA| z|MhQ7ri>ehZ!u|;8||w3p3nhUCz(Do?e(-Iw$xt}xJP>QRD5$jm`;<}p72SagXA%8 zV8OGu(nS52x>a99KXg3aLfrRff#qBy{gMe!KIZf$p73iHD}Wvnlqli5d0XdO{leSq zja%oz>5}0=Yu~-#ITUV5ciAAas3eULL5>u62~jQ&QQDCCz=cirRyu8i zBtvI`Ch`^}2Vc*^WHpZ((ts(baMNv@yFkIbqe|%W30}adW2K7u#lCdL(&(|2(?o}y zLl}wx6w_*q&>&!8F4y%Bc`b4gRj+y~#1~pn}P~-%T3`kKnqAbWjt-F`*Zt z?UZ$m8jsWk(Vz`nQ+2;>T9KP+QWp4A7EXjMcRbRej!qYXJS!%A;H zhZ^O-Bx}vyTr`bS8@=f@d_XkX=7;mNHTP*0e4$t2XH>u`0;tQf`i9gtq5ojdsW?0{ zX}%N~nhy=?!&d+&g?rcX2(?>g`^@^ec?>Py-qwglCzcb!@FH!$0}1Q^eL|Q z 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

          an(T~J| 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 literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/history/sparc.orig_history.txt b/tests/sys/cddl/zfs/tests/history/sparc.orig_history.txt new file mode 100644 index 00000000000..6ae7168bbba --- /dev/null +++ b/tests/sys/cddl/zfs/tests/history/sparc.orig_history.txt @@ -0,0 +1,13 @@ +History for 'history_pool': +2006-10-27.03:13:47 zpool create history_pool /var/tmp/sparc.migratedpool.DAT +2006-10-27.03:13:48 zfs create history_pool/fs +2006-10-27.03:13:48 zfs set compression=on history_pool/fs +2006-10-27.03:13:48 zfs set checksum=on history_pool +2006-10-27.03:13:48 zfs snapshot history_pool/fs@snap +2006-10-27.03:13:48 zfs clone history_pool/fs@snap history_pool/clone +2006-10-27.03:13:49 zfs promote history_pool/clone +2006-10-27.03:13:49 zfs promote history_pool/fs +2006-10-27.03:13:49 zfs destroy -r -R history_pool/fs +2006-10-27.03:13:49 zpool export history_pool +2007-04-05.00:41:55 zpool upgrade history_pool + diff --git a/tests/sys/cddl/zfs/tests/history/zfs-pool-v4.dat.Z b/tests/sys/cddl/zfs/tests/history/zfs-pool-v4.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..bc32472f0084f4ca3e4da8019c7e9d78de85e09c GIT binary patch literal 73415 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 z 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 + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/hotplug +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= hotplug_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= hotplug.cfg +${PACKAGE}FILES+= hotplug.kshlib +${PACKAGE}FILES+= hotplug_001_pos.ksh +${PACKAGE}FILES+= hotplug_008_pos.ksh +${PACKAGE}FILES+= hotplug_011_pos.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/hotplug/cleanup.ksh b/tests/sys/cddl/zfs/tests/hotplug/cleanup.ksh new file mode 100644 index 00000000000..2639f0c471a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotplug/cleanup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/tests/hotplug/hotplug.kshlib + +cleanup_testenv $TESTPOOL +destroy_gnops $ALL_DISKS diff --git a/tests/sys/cddl/zfs/tests/hotplug/hotplug.cfg b/tests/sys/cddl/zfs/tests/hotplug/hotplug.cfg new file mode 100644 index 00000000000..84caf18271c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotplug/hotplug.cfg @@ -0,0 +1,36 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotplug.cfg 1.3 08/08/15 SMI" +# + +export DEV_DISKS="$DISK0 $DISK1 $DISK2" +export SPARE_DISKS="$DISK3" +export ALL_DISKS="$DEV_DISKS $SPARE_DISKS" + +set_disks diff --git a/tests/sys/cddl/zfs/tests/hotplug/hotplug.kshlib b/tests/sys/cddl/zfs/tests/hotplug/hotplug.kshlib new file mode 100644 index 00000000000..5cf8a67ea8d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotplug/hotplug.kshlib @@ -0,0 +1,463 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotplug.kshlib 1.4 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/include/libgnop.kshlib +. $STF_SUITE/tests/hotplug/hotplug.cfg + +# +# create lofi devices +# +# $1-n files +# +function create_lofi_device +{ + typeset lofi_files="$@" + + typeset file + for file in $lofi_files ; do + if ! $LOFIADM $file > /dev/null 2>&1 ; then + insert_device $file + if (($? != 0)); then + return 1 + fi + fi + + shift + done + + return 0 +} + +# +# Check and destroy lofi devices +# +# $1-n lofi files or deviece +# +function destroy_lofi_device +{ + typeset -i ret=0 + typeset dev_file="$@" + + typeset file + for file in $dev_file ; do + if $LOFIADM $file > /dev/null 2>&1; then + $LOFIADM -d $file -f + if (($? != 0)); then + ((ret += 1)) + fi + fi + done + + return $ret +} + +# +# Setup test environment using DISKS[1-4] +# +# $1 pool type +# +function setup_testenv +{ + typeset type=$1 + + if [[ -z $type ]]; then + log_fail "Usage: setup_testenv " + fi + + log_must $ZPOOL create -f \ + $TESTPOOL $type ${DISK0}.nop ${DISK1}.nop ${DISK2}.nop ${DISK3}.nop +} + +# +# Cleanup test envirnment according to pool name +# +# $1 pool +# +function cleanup_testenv +{ + destroy_pool $TESTPOOL +} + + +# +# Start a background process to write file on given pool. +# +# $1 pool +# +function start_bg_write +{ + typeset pool=$1 + + if datasetnonexists $pool; then + return 1 + fi + + typeset mntpnt=$(get_prop mountpoint $pool) + + while true; do + $DD if=/dev/random of=$mntpnt/foo count=10 + $SYNC + $SLEEP 1 + done & + BG_PID=$! + + return 0 +} + +# +# Kill the background write process. +# +function kill_bg_write +{ + typeset -i ret=0 + + if [[ -n $BG_PID ]]; then + kill -9 $BG_PID + ret=$? + + if ((ret == 0)); then + BG_PID='' + fi + fi + + $SLEEP 10 + return $ret +} + +# +# Insert a given file into a given device slot +# +# $1 file +# $2 device +# +function insert_device +{ + typeset file=$1 + typeset device=$2 + + if [[ -z $file ]]; then + return 1 + fi + + # + # Make sure insert device succeed within 60 seconds + # + typeset -i i=0 + while ((i < 6)); do + $SLEEP 10 + + $LOFIADM -a $file $device -f > /dev/null 2>&1 + if (($? == 0)); then + return 0 + fi + + ((i += 1)) + done + + return 1 +} + +# +# Remove the given lofi device +# +# $1 device or file +# +function remove_device +{ + typeset devfile=$1 + + if [[ -z $devfile ]]; then + return 1 + fi + + # + # Make sure remove device succeed within 60 seconds + # + typeset -i i=0 + while ((i < 6)); do + $SLEEP 10 + $LOFIADM -d $devfile -f + if (($? == 0)); then + return 0 + fi + + ((i += 1)) + done + + return 1 +} + +# +# Verify the given devices have expected status in pool +# +# $1 pool +# $2 device +# $3 expected status +# +function verify_device_status +{ + typeset pool=$1 + typeset device=$2 + typeset expect_stat=$3 + + if [[ -z $pool || -z $expect_stat || -z $device ]]; then + log_note "Usage: verify_device_status " + return 1 + fi + + # + # 1.5 minute disk status checking, make sure zpool sync disk status. + # + typeset -i i=0 + while ((i < 9)); do + $SLEEP 10 + + typeset str=$($ZPOOL status $pool | $GREP "lofi" | \ + $AWK '{print $1 " " $2}') + typeset real_stat=${str##*$device } + real_stat=$($ECHO $real_stat | $AWK '{print $1}') + + if [[ "$expect_stat" == "$real_stat" ]]; then + return 0 + fi + + ((i += 1)) + done + + log_note "Expected status($expect_stat), " \ + "see status($real_stat) for $device" + $ZPOOL status -v $pool + + return 1 +} + +# +# Output fma event id to given file, the default output file is $FILE_EVENT_ID +# +function getfmri +{ + eval typeset output_file=${1:-$FILE_EVENT_ID} +# +# fmadm faulty output include several sections below +# + +# --------------- ------------------------------------ -------------- --------- +# TIME EVENT-ID MSG-ID SEVERITY +# --------------- ------------------------------------ -------------- --------- +# Aug 31 22:34:19 ec648a9e-0c9f-c495-e176-e38ba212e278 ZFS-8000-D3 Major +# Aug 31 19:44:59 d69cdd12-b0cf-62ea-d0a3-8d2e9ebfeb50 ZFS-8000-D3 +# Aug 31 19:35:16 7213f0d5-00d4-ea32-ddfc-98cdd683c27e ZFS-8000-D3 +# Aug 31 19:29:11 33424bef-a973-4dae-94ef-cb97f2cb0759 ZFS-8000-D3 +# Aug 31 17:07:26 74219b66-ead4-6d2b-bbad-bc40547ca02e ZFS-8000-GH +# +# Fault class : fault.fs.zfs.device +# +# Description : A ZFS device failed. Refer to http://sun.com/msg/ZFS-8000-D3 for +# more information. +# +# Response : No automated response will occur. +# +# Impact : Fault tolerance of the pool may be compromised. +# +# Action : Run 'zpool status -x' and replace the bad device. +# + $FMADM faulty | $NAWK ' + BEGIN { + start = 0 + } + /^---/ && /---$/ { + if (start == 0) { + start = 1 + } + } + /^TIME/ && /SEVERITY$/ { + if (start == 1) { + start = 2 + } + } + /^---/ && /---$/ { + if (start == 2) { + start = 3 + continue + } + } + /^$/ { + start = 0 + } + (start == 3) {print $4}' > $output_file +} + +# +# Verify if ZFS FMA faulty error message are generated. +# +# $1 TRUE or FALSE +# +function fma_faulty +{ + # + # 1.5 minute for FMA faulty checking, make sure FMA sync with ZFS status + # + typeset expect=${1:-TRUE} + + typeset -i fsize + typeset -i i=0 + while ((i < 9)); do + $SLEEP 10 + + # + # try to get fma faulty + # + getfmri $FILE_EVENT_ID + fsize=$($LS -ld $FILE_EVENT_ID | $AWK '{print $5}') + + case $expect in + TRUE) + if (( fsize != 0 )); then + return 0 + fi + ;; + FALSE) + if (( fsize == 0 )); then + return 0 + fi + ;; + *) + return 1 + esac + + ((i += 1)) + done + + return 1 +} + +# +# Create fresh file +# +# $1 file size +# $2 file name +# +function create_file +{ + typeset size=$1 + typeset file=$2 + + if [[ -z $size || -z $file ]]; then + log_note "Usage: create_file " + return 1 + fi + if [[ -f $file ]]; then + $RM -f $file + fi + $MKFILE $size $file + return $? +} + +# +# Unmount all filesystem, and disable syseventd and fmd piror to +# unloading ZFS module +# +function unload_zfs +{ + # destroy /dev/zvol link + log_must $ZFS volfini + + log_must $ZFS unmount -f -a + log_must $SVCADM disable -t sysevent fmd + $SLEEP 10 + + # + # 1 minute for ZFS module unload checking + # + # For example: + # + # 192 fffffffff7c92000 99858 182 1 zfs (ZFS storage pool version 6) + # + typeset -i i=0 + while ((i < 10)); do + typeset id=$($MODINFO | $GREP "ZFS storage" | $AWK '{print $1}') + + if [[ -n $id ]]; then + $MODUNLOAD -i $id + if (($? == 0)) ; then + return 0 + fi + else + return 0 + fi + + $SLEEP 6 + ((i += 1)) + done + + return 1 +} + +# +# Load ZFS module and remount all filesystem +# +function load_zfs +{ + typeset -i ret=0 + $SVCADM enable sysevent fmd + ((ret |= $?)) + + $SLEEP 10 + + $ZFS mount -a + ((ret |= $?)) + + # create /dev/zvol link + $ZFS volinit + ((ret |= $?)) + + return $ret +} + +# +# Convert file name to device name or reverse. +# +# $1-n lofi files or devices +# +function convert_lofi +{ + typeset n list + + for n in "$@"; do + typeset item=$($LOFIADM $n) + list="$list $item" + + shift + done + + $ECHO $list +} diff --git a/tests/sys/cddl/zfs/tests/hotplug/hotplug_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotplug/hotplug_001_pos.ksh new file mode 100644 index 00000000000..4dd344ff759 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotplug/hotplug_001_pos.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotplug_001_pos.ksh 1.2 08/02/27 SMI" +# + +. $STF_SUITE/tests/hotplug/hotplug.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: hotplug_001_pos +# +# DESCRIPTION: +# When removing a device from a redundant pool, the device's state will +# be indicated as 'REMOVED'. +# +# STRATEGY: +# 1. Create mirror/raidz/raidz2 pool. +# 2. Synchronise with device in the background. +# 3. Remove one of device of pool. +# 4. Detect removed devices status is 'REMOVED'. +# 5. Detect no FMA faulty message. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-01) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "When removing a device from a redundant pool, the device's " \ + "state will be indicated as 'REMOVED'." + +for type in "mirror" "raidz" "raidz2"; do + log_note "Start $type testing ..." + setup_testenv $type + + log_must destroy_gnop $DISK0 + wait_for 15 1 check_state $TESTPOOL ${DISK0}.nop 'REMOVED' + log_must check_state $TESTPOOL ${DISK0}.nop 'REMOVED' + + log_must create_gnop $DISK0 + cleanup_testenv $TESTPOOL +done + +log_pass "When removing a device from a redundant pool, the device's " \ + "state will be indicated as 'REMOVED'." diff --git a/tests/sys/cddl/zfs/tests/hotplug/hotplug_008_pos.ksh b/tests/sys/cddl/zfs/tests/hotplug/hotplug_008_pos.ksh new file mode 100644 index 00000000000..426030c2450 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotplug/hotplug_008_pos.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotplug_008_pos.ksh 1.3 08/02/27 SMI" +# + +. $STF_SUITE/tests/hotplug/hotplug.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: hotplug_008_pos +# +# DESCRIPTION: +# After hot spare device is revoved, the devices state will be 'REMOVED'. +# No FMA faults was generated. +# +# STRATEGY: +# 1. Create mirror/raidz/raidz2 pool with hot spare device. +# 2. Synchronise with device in the background. +# 3. Remove the hotspare device. +# 4. Verify the device's status is 'REMOVED'. +# 5. Verify no FMA fault was generated. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-01) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "When removing hotspare device, verify device status is 'REMOVED'." + +for type in "mirror" "raidz" "raidz2"; do + log_must $ZPOOL create -f $TESTPOOL $type $DISK0.nop $DISK1.nop $DISK2.nop spare $DISK3.nop + + log_must destroy_gnop $DISK3 + wait_for 15 1 check_state $TESTPOOL $DISK3.nop 'REMOVED' + log_must check_state $TESTPOOL $DISK3.nop 'REMOVED' + + log_must create_gnop $DISK3 + cleanup_testenv $TESTPOOL +done + +log_pass "When removing hotspare device, verify device status is 'REMOVED'." diff --git a/tests/sys/cddl/zfs/tests/hotplug/hotplug_011_pos.ksh b/tests/sys/cddl/zfs/tests/hotplug/hotplug_011_pos.ksh new file mode 100644 index 00000000000..8dcc0344511 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotplug/hotplug_011_pos.ksh @@ -0,0 +1,84 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotplug_011_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/hotplug/hotplug.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: hotplug_011_pos +# +# DESCRIPTION: +# Removing device offlined, verify device status is UNAVAIL, when the +# system is onlined. +# +# STRATEGY: +# 1. Create mirror/raidz/raidz2 pool w/a hot spare device. +# 2. Synchronise with device in the background. +# 3. Set or unset autoreplace +# 4. Unmount all filesystems and disable syseventd and fmd. +# 5. Unload ZFS module and remove devices. +# 6. Load ZFS module and verify device the device's status is 'UNAVAIL'. +# 7. Verify no FMA fault was generated. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-01) +# +# __stc_assertion_end +# +################################################################################ + +log_assert "If a vdev is missing when a pool is imported, its status will be " \ + "UNAVAIL" + +for type in "mirror" "raidz" "raidz2"; do + setup_testenv $type + + log_must $ZPOOL export $TESTPOOL + + # Random remove one of devices + log_must destroy_gnop $DISK0 + + # reimport the pool + log_must $ZPOOL import $TESTPOOL + + log_must check_state $TESTPOOL $DISK0.nop 'UNAVAIL' + + log_must create_gnop $DISK0 + cleanup_testenv $TESTPOOL +done + +log_pass "If a vdev is missing when a pool is imported, its status will be " \ + "UNAVAIL" diff --git a/tests/sys/cddl/zfs/tests/hotplug/hotplug_test.sh b/tests/sys/cddl/zfs/tests/hotplug/hotplug_test.sh new file mode 100755 index 00000000000..6eb5f6875fa --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotplug/hotplug_test.sh @@ -0,0 +1,111 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case hotplug_001_pos cleanup +hotplug_001_pos_head() +{ + atf_set "descr" "When removing a device from a redundant pool, the device'sstate will be indicated as 'REMOVED'." + atf_set "require.progs" zpool gnop +} +hotplug_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotplug.kshlib + . $(atf_get_srcdir)/hotplug.cfg + + verify_disk_count "$DISKS" 4 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotplug_001_pos.ksh || atf_fail "Testcase failed" +} +hotplug_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotplug.kshlib + . $(atf_get_srcdir)/hotplug.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case hotplug_008_pos cleanup +hotplug_008_pos_head() +{ + atf_set "descr" "When removing hotspare device, verify device status is 'REMOVED'." + atf_set "require.progs" zpool gnop +} +hotplug_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotplug.kshlib + . $(atf_get_srcdir)/hotplug.cfg + + verify_disk_count "$DISKS" 4 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotplug_008_pos.ksh || atf_fail "Testcase failed" +} +hotplug_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotplug.kshlib + . $(atf_get_srcdir)/hotplug.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case hotplug_011_pos cleanup +hotplug_011_pos_head() +{ + atf_set "descr" "Removing device offlined, verify device status is UNAVAIL,when the system is onlined." + atf_set "require.progs" zpool gnop +} +hotplug_011_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotplug.kshlib + . $(atf_get_srcdir)/hotplug.cfg + + verify_disk_count "$DISKS" 4 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotplug_011_pos.ksh || atf_fail "Testcase failed" +} +hotplug_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotplug.kshlib + . $(atf_get_srcdir)/hotplug.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case hotplug_001_pos + atf_add_test_case hotplug_008_pos + atf_add_test_case hotplug_011_pos +} diff --git a/tests/sys/cddl/zfs/tests/hotplug/setup.ksh b/tests/sys/cddl/zfs/tests/hotplug/setup.ksh new file mode 100644 index 00000000000..798798875de --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotplug/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/tests/hotplug/hotplug.kshlib + +log_must create_gnops $ALL_DISKS +log_pass diff --git a/tests/sys/cddl/zfs/tests/hotspare/Makefile b/tests/sys/cddl/zfs/tests/hotspare/Makefile new file mode 100644 index 00000000000..a7d4b088d20 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/Makefile @@ -0,0 +1,45 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/hotspare +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= hotspare_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= hotspare_create_001_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= hotspare_add_004_neg.ksh +${PACKAGE}FILES+= hotspare_scrub_002_pos.ksh +${PACKAGE}FILES+= hotspare_detach_002_pos.ksh +${PACKAGE}FILES+= hotspare_remove_001_pos.ksh +${PACKAGE}FILES+= hotspare_add_001_pos.ksh +${PACKAGE}FILES+= hotspare_import_001_pos.ksh +${PACKAGE}FILES+= hotspare_replace_002_neg.ksh +${PACKAGE}FILES+= hotspare_clone_002_pos.ksh +${PACKAGE}FILES+= hotspare_export_001_neg.ksh +${PACKAGE}FILES+= hotspare_snapshot_001_pos.ksh +${PACKAGE}FILES+= hotspare_remove_004_pos.ksh +${PACKAGE}FILES+= hotspare_detach_003_pos.ksh +${PACKAGE}FILES+= hotspare_onoffline_004_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= hotspare_replace_001_neg.ksh +${PACKAGE}FILES+= hotspare_scrub_001_pos.ksh +${PACKAGE}FILES+= hotspare_detach_001_pos.ksh +${PACKAGE}FILES+= hotspare_add_003_neg.ksh +${PACKAGE}FILES+= hotspare_remove_003_neg.ksh +${PACKAGE}FILES+= hotspare_add_002_pos.ksh +${PACKAGE}FILES+= hotspare_detach_004_pos.ksh +${PACKAGE}FILES+= hotspare_snapshot_002_pos.ksh +${PACKAGE}FILES+= hotspare.kshlib +${PACKAGE}FILES+= hotspare_detach_005_neg.ksh +${PACKAGE}FILES+= hotspare_remove_002_neg.ksh +${PACKAGE}FILES+= hotspare_onoffline_003_neg.ksh +${PACKAGE}FILES+= hotspare_shared_001_pos.ksh +${PACKAGE}FILES+= hotspare.cfg +${PACKAGE}FILES+= hotspare_clone_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/hotspare/cleanup.ksh b/tests/sys/cddl/zfs/tests/hotspare/cleanup.ksh new file mode 100644 index 00000000000..1d3a7d47cd8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/cleanup.ksh @@ -0,0 +1,41 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +verify_runnable "global" + +log_must cleanup_devices_all + +restart_zfsd + +log_pass diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare.cfg b/tests/sys/cddl/zfs/tests/hotspare/hotspare.cfg new file mode 100644 index 00000000000..8d8035ed5fa --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare.cfg @@ -0,0 +1,60 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare.cfg 1.4 08/02/27 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg +. $STF_SUITE/include/libtest.kshlib + +export DISK_ARRAY_NUM=0 +export DISKSARRAY="" + +# +# Variables for hotspare_detach_001 +# +export STF_TIMEOUT=3600 + +set_disks + +export FILESIZE="100m" +export FILESIZE1="150m" +export SIZE="100m" +export SIZE1="80m" +export N_DEVARRAY_FILES=8 + +export HOLES_FILESIZE=${HOLES_FILESIZE-"67108864"} # 64 Mb +export HOLES_BLKSIZE=${HOLES_BLKSIZE-"512"} +export HOLES_SEED=${HOLES_SEED-""} +export HOLES_FILEOFFSET=${HOLES_FILEOFFSET-""} +export HOLES_COUNT=${HOLES_COUNT-"16384"} # FILESIZE/BLKSIZE/8 +export HOLES_VERBOSE=${HOLES_VERBOSE-""} + +export MYTESTFILE=$STF_SUITE/include/default.cfg +export TESTFILE=testfile.${TESTCASE_ID} +export HOTSPARE_TMPDIR="$TMPDIR/hotspare_tmpdir" diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare.kshlib b/tests/sys/cddl/zfs/tests/hotspare/hotspare.kshlib new file mode 100644 index 00000000000..897a7d5a535 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare.kshlib @@ -0,0 +1,126 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare.kshlib 1.6 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zpool_add/zpool_add.kshlib + + +function cleanup_devices_all +{ + $RM -f ${devarray[*]} + [ -d "$HOTSPARE_TMPDIR" ] && rmdir $HOTSPARE_TMPDIR + + return 0 +} + +typeset -a pooldevs +typeset -a sparedevs +typeset -a logdevs +typeset -a keywords=("" "mirror" "raidz" "raidz2") +typeset -a devarray + +function set_devs +{ + mkdir $HOTSPARE_TMPDIR + typeset -i i=0 + while (( i < $N_DEVARRAY_FILES )) ; do + eval devarray[$i]=$HOTSPARE_TMPDIR/file.$i + log_must create_vdevs ${devarray[$i]} + (( i = i + 1 )) + done + + sparedevs=("${devarray[0]}" "${devarray[1]}") + + pooldevs=("${devarray[3]}" "${devarray[4]}" "${devarray[5]}") + + logdevs="${devarray[7]}" + +} + +function partition_cleanup +{ + cleanup_devices_all + return 0 +} + +# +# $1: keyword, should be "" "mirror" "raidz" "raidz2" +# $2: hotspare list, default as $sparedevs +# +function setup_hotspares # keyword, spares +{ + typeset keyword=$1 + shift + typeset spares=${@:-${sparedevs[@]}} + + create_pool "$TESTPOOL" "$keyword" \ + ${pooldevs[@]} + log_must poolexists "$TESTPOOL" + log_must $ZPOOL set autoreplace=on "$TESTPOOL" + log_must $ZPOOL add -f "$TESTPOOL" spare $spares + log_must iscontained "$TESTPOOL" "$spares" + + if [[ -n ${logdevs[@]} ]] ; then + log_must $ZPOOL add -f "$TESTPOOL" log ${logdevs[@]} + log_must iscontained "$TESTPOOL" "${logdevs[@]}" + fi +} + +# +# $1: the function name that run for all hotspares +# $2: hotspare list, default as $sparedevs +# +function iterate_over_hotspares # function, spares +{ + typeset function=$1 + typeset spares=${2:-${sparedevs[@]}} + + for spare in $spares + do + $function $spare + done +} + +wait_until_resilvered() { +typeset -i i=0 +typeset -i timeout=60 +while [[ $i -lt $timeout ]]; do + if is_pool_resilvered $TESTPOOL; then + break + fi + (( i += 1 )) + if [[ $i == $timeout ]]; then + $ZPOOL status $TESTPOOL + log_fail "Pool didn't resilver in ${timeout} seconds" + fi + $SLEEP 1 +done +} diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_001_pos.ksh new file mode 100644 index 00000000000..caff15f54d5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_001_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_add_001_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_add_001_pos +# +# DESCRIPTION: +# 'zpool add spare ...' can successfully add the specified +# devices to the hot spares list of the given pool +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add hot spare devices to the pool +# 3. Verify the devices are added to the spare list +# of the given pool successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + + log_must check_hotspare_state "$TESTPOOL" "$dev" "AVAIL" +} + +log_assert "'zpool add spare ...' can add devices to the pool." + +log_onexit cleanup + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool add spare ...' executes successfully" diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_002_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_002_pos.ksh new file mode 100644 index 00000000000..522504cec9a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_002_pos.ksh @@ -0,0 +1,106 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_add_002_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_add_002_pos +# +# DESCRIPTION: +# 'zpool add spare ...' can successfully add the specified +# devices to the available list of the given pool while +# there has activated hotspare already. +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add hot spare devices to the pool +# 3. Activate some of the hot spares. +# 3. Verify the following devices could add to the spare list +# of the given pool successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + + log_must check_hotspare_state "$TESTPOOL" "$dev" "AVAIL" + log_must $ZPOOL replace $TESTPOOL ${pooldevs[0]} $dev + + cleanup_devices $ndev + + log_must $ZPOOL add "$TESTPOOL" spare $ndev + log_must $ZPOOL remove "$TESTPOOL" $ndev + + cleanup_devices $ndev + + log_must $ZPOOL add -f "$TESTPOOL" spare $ndev + log_must $ZPOOL remove "$TESTPOOL" $ndev + + log_must $ZPOOL detach $TESTPOOL $dev +} + +log_assert "'zpool add spare ...' can add devices to the pool while it has spare-in device." + +log_onexit cleanup + +set_devs +typeset ndev=${devarray[2]} + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool add spare ...' executes successfully while it has spare-in device" diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_003_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_003_neg.ksh new file mode 100644 index 00000000000..d6c26a9ae36 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_003_neg.ksh @@ -0,0 +1,144 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_add_003_neg.ksh 1.7 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_add_003_neg +# +# DESCRIPTION: +# 'zpool add' with hot spares will fail +# while the hot spares belong to the following cases: +# - nonexist device, +# - part of an active pool, +# - currently mounted, +# - devices in /etc/vfstab, +# - specified as the dedicated dump device, +# - identical with the basic or spares vdev within the pool, +# - belong to a exported or potentially active ZFS pool, +# - a volume device that belong to the given pool, +# +# STRATEGY: +# 1. Create case scenarios +# 2. For each scenario, try to add [-f] the device to the pool +# 3. Verify the add operation failes as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + poolexists "$TESTPOOL1" && \ + destroy_pool "$TESTPOOL1" + + if [[ -n $saved_dump_dev ]]; then + if [[ -n $DUMPADM ]]; then + log_must $DUMPADM -u -d $saved_dump_dev + fi + fi + + if [[ -n $DUMPADM ]]; then + cleanup_devices $dump_dev + fi + + partition_cleanup +} + +log_assert "'zpool add [-f]' with hot spares should fail with inapplicable scenarios." + +log_onexit cleanup + +set_devs + +mnttab_dev=$(find_mnttab_dev) +vfstab_dev=$(find_vfstab_dev) +saved_dump_dev=$(save_dump_dev) +dump_dev=${disk}s0 +nonexist_dev=${disk}sbad_slice_num + +create_pool "$TESTPOOL" "${pooldevs[0]}" +log_must poolexists "$TESTPOOL" + +create_pool "$TESTPOOL1" "${pooldevs[1]}" +log_must poolexists "$TESTPOOL1" + +[[ -n $mnttab_dev ]] || log_note "No mnttab devices found" +[[ -n $vfstab_dev ]] || log_note "No vfstab devices found" +# - nonexist device, +# - part of an active pool, +# - currently mounted, +# - devices in /etc/vfstab, +# - identical with the basic or spares vdev within the pool, + +set -A arg "$nonexist_dev" \ + "${pooldevs[0]}" \ + "${pooldevs[1]}" \ + "$mnttab_dev" \ + "$vfstab_dev" + +typeset -i i=0 +while (( i < ${#arg[*]} )); do + if [[ -n "${arg[i]}" ]]; then + log_mustnot $ZPOOL add $TESTPOOL spare ${arg[i]} + log_mustnot $ZPOOL add -f $TESTPOOL spare ${arg[i]} + fi + (( i = i + 1 )) +done + +# - specified as the dedicated dump device, +# This part of the test can only be run on platforms for which DUMPADM is +# defined; ie Solaris +if [[ -n $DUMPADM ]]; then + log_must $DUMPADM -u -d /dev/dsk/$dump_dev + log_mustnot $ZPOOL add "$TESTPOOL" spare $dump_dev + log_mustnot $ZPOOL add -f "$TESTPOOL" spare $dump_dev +fi + +# - belong to a exported or potentially active ZFS pool, + +log_must $ZPOOL export $TESTPOOL1 +log_mustnot $ZPOOL add "$TESTPOOL" spare ${pooldevs[1]} +log_must $ZPOOL import -d $HOTSPARE_TMPDIR $TESTPOOL1 + +log_pass "'zpool add [-f]' with hot spares should fail with inapplicable scenarios." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_004_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_004_neg.ksh new file mode 100644 index 00000000000..62f02cb8d7e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_add_004_neg.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_add_004_neg.ksh 1.7 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_add_004_neg +# +# DESCRIPTION: +# 'zpool add' will not allow a swap device to be used as a hotspare +# +# STRATEGY: +# 1. Create pools +# 2. Create a swap device +# 3. Try to add [-f] the swap device to the pool +# 4. Verify the add operation failes as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2013-02-15) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + + if $SWAPCTL -l | grep -q $SWAPDEV; then + log_must $SWAPOFF $SWAPDEV + fi + + partition_cleanup +} + +log_assert "'zpool add [-f]' will not allow a swap device to be used as a hotspare'" + +log_onexit cleanup + +set_devs + +SWAPDEV="$DISK1" + +if $SWAPON $SWAPDEV; then + true +else + log_unsupported "Cannot activate $SWAPDEV as a swap device" +fi + +create_pool "$TESTPOOL" "$DISK0" +log_must poolexists "$TESTPOOL" + +log_mustnot "$ZPOOL" add "$TESTPOOL" spare "$SWAPDEV" +log_mustnot "$ZPOOL" add -f "$TESTPOOL" spare "$SWAPDEV" + +log_pass "'zpool add [-f]' will not allow a swap device to be used as a hotspare'" diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_clone_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_clone_001_pos.ksh new file mode 100644 index 00000000000..88dc48e4539 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_clone_001_pos.ksh @@ -0,0 +1,128 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_clone_001_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_clone_001_pos +# +# DESCRIPTION: +# If a storage pool has activated hot spares, +# create clone and remove the hot spare, +# the data in clone should keep integrity. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Create some files, create a snapshot & clone upon filesystem +# 3. Activate a spare device to the pool +# 4. Create some files, create an new snapshot & clone upon filesystem +# 5. Do 'zpool detach' with the spare in device +# 6. Verify the 2 clones are all kept, and verify the data integrity within them. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE0 + log_must $ZFS snapshot $TESTPOOL@snap.0 + log_must $ZFS clone $TESTPOOL@snap.0 \ + $TESTPOOL/clone.0 + + log_must $ZPOOL replace $TESTPOOL $odev $dev + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE1 + log_must $ZFS snapshot $TESTPOOL@snap.1 + log_must $ZFS clone $TESTPOOL@snap.1 \ + $TESTPOOL/clone.1 + + log_must $SYNC + + log_must $ZPOOL detach $TESTPOOL $dev + + for file in "$mtpt/clone.0/$TESTFILE0" \ + "$mtpt/clone.1/$TESTFILE1" ; do + [[ ! -e $file ]] && \ + log_fail "$file missing after detach hotspare." + checksum2=$($SUM $file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2" + done + + log_must $RM -rf $mtpt/clone.0/* + log_must $RM -rf $mtpt/clone.1/* + log_must $ZFS destroy -Rf $TESTPOOL@snap.1 + log_must $ZFS destroy -Rf $TESTPOOL@snap.0 +} + +log_assert "'zpool detach ...' against hotspare should do no harm to clone." + +log_onexit cleanup + +typeset mtpt="" + +set_devs + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + mtpt=$(get_prop mountpoint $TESTPOOL) + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool detach ...' against hotspare should do no harm to clone." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_clone_002_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_clone_002_pos.ksh new file mode 100644 index 00000000000..6927394ec62 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_clone_002_pos.ksh @@ -0,0 +1,136 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_clone_002_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_clone_002_pos +# +# DESCRIPTION: +# If a storage pool has activated hot spares, +# create clone and then invoke "zpool detach" with the original device, +# the data in clone should keep integrity. +# +# STRATEGY: +# 1. Create a storage pool with hot spares activated. +# 2. Create some files, create a snapshot & clone upon filesystem +# 3. Activate a spare device to the pool +# 4. Create some files, create an new snapshot & clone upon filesystem +# 5. Do 'zpool detach' with the original device +# 6. Verify the 2 clones are all kept, and verify the data integrity within them. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE0 + log_must $ZFS snapshot $TESTPOOL@snap.0 + log_must $ZFS clone $TESTPOOL@snap.0 \ + $TESTPOOL/clone.0 + + log_must $ZPOOL replace $TESTPOOL $odev $dev + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE1 + log_must $ZFS snapshot $TESTPOOL@snap.1 + log_must $ZFS clone $TESTPOOL@snap.1 \ + $TESTPOOL/clone.1 + + log_must $SYNC + + log_must $ZPOOL detach $TESTPOOL $odev + + for file in "$mtpt/clone.0/$TESTFILE0" \ + "$mtpt/clone.1/$TESTFILE1" ; do + [[ ! -e $file ]] && \ + log_fail "$file missing after detach hotspare." + checksum2=$($SUM $file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + done + + log_must $RM -rf $mtpt/clone.0/* + log_must $RM -rf $mtpt/clone.1/* + log_must $ZFS destroy -Rf $TESTPOOL@snap.1 + log_must $ZFS destroy -Rf $TESTPOOL@snap.0 + + log_must $RM -f $mtpt/* + + log_must $ZPOOL add -f "$TESTPOOL" spare $odev + log_must $ZPOOL replace "$TESTPOOL" $dev $odev + log_must $SYNC + log_must $ZPOOL detach "$TESTPOOL" $dev + log_must $ZPOOL add -f "$TESTPOOL" spare $dev +} + +log_assert "'zpool detach ...' against basic vdev should do no harm to clone." + +log_onexit cleanup + +typeset mtpt="" + +set_devs + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + mtpt=$(get_prop mountpoint $TESTPOOL) + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool detach ...' against basic vdev should do no harm to clone." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_create_001_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_create_001_neg.ksh new file mode 100644 index 00000000000..6d2bca5d6f5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_create_001_neg.ksh @@ -0,0 +1,139 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_create_001_neg.ksh 1.5 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_create_001_neg +# +# DESCRIPTION: +# 'zpool create [-f]' with hot spares will fail +# while the hot spares belong to the following cases: +# - existing pool +# - nonexist device, +# - part of an active pool, +# - currently mounted, +# - devices in /etc/vfstab, +# - specified as the dedicated dump device, +# - identical with the basic vdev within the pool, +# +# STRATEGY: +# 1. Create case scenarios +# 2. For each scenario, try to create a new pool with hot spares +# of the virtual devices +# 3. Verify the creation is failed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + for pool in $TESTPOOL $TESTPOOL1 + do + destroy_pool $pool + done + + if [[ -n $saved_dump_dev ]]; then + if [[ -n $DUMPADM ]]; then + log_must $DUMPADM -u -d $saved_dump_dev + fi + fi + + partition_cleanup +} + +log_assert "'zpool create [-f]' with hot spares should be failed " \ + "with inapplicable scenarios." +log_onexit cleanup + +set_devs + +mnttab_dev=$(find_mnttab_dev) +vfstab_dev=$(find_vfstab_dev) +saved_dump_dev=$(save_dump_dev) +dump_dev=${disk}s0 +nonexist_dev=${disk}sbad_slice_num + +create_pool "$TESTPOOL" ${pooldevs[0]} + +# +# Set up the testing scenarios parameters +# - existing pool +# - nonexist device, +# - part of an active pool, +# - currently mounted, +# - devices in /etc/vfstab, +# - identical with the basic vdev within the pool, + +set -A arg "$TESTPOOL ${pooldevs[1]} spare ${pooldevs[2]}" \ + "$TESTPOOL1 ${pooldevs[1]} spare $nonexist_dev" \ + "$TESTPOOL1 ${pooldevs[1]} spare ${pooldevs[0]}" \ + "$TESTPOOL1 ${pooldevs[1]} spare $mnttab_dev" \ + "$TESTPOOL1 ${pooldevs[1]} spare $vfstab_dev" \ + "$TESTPOOL1 ${pooldevs[1]} spare ${pooldevs[1]}" + +typeset -i i=0 +while (( i < ${#arg[*]} )); do + log_mustnot $ZPOOL create ${arg[i]} + log_mustnot $ZPOOL create -f ${arg[i]} + (( i = i + 1 )) +done + +# now destroy the pool to be polite +log_must $ZPOOL destroy -f $TESTPOOL + +# +# - specified as the dedicated dump device, +# This part of the test can only be run on platforms for which DUMPADM is +# defined; ie Solaris +# +if [[ -n $DUMPADM ]]; then + # create/destroy a pool as a simple way to set the partitioning + # back to something normal so we can use this $disk as a dump device + cleanup_devices $dump_dev + + log_must $DUMPADM -u -d /dev/dsk/$dump_dev + log_mustnot $ZPOOL create $TESTPOOL1 ${pooldevs[1]} spare "$dump_dev" + log_mustnot $ZPOOL create -f $TESTPOOL1 ${pooldevs[1]} spare "$dump_dev" +fi + +log_pass "'zpool create [-f]' with hot spare is failed as expected with inapplicable scenarios." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_001_pos.ksh new file mode 100644 index 00000000000..082fed8763d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_001_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_detach_001_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_detach_001_pos +# +# DESCRIPTION: +# If a hot spare have been activated, +# and invoke "zpool detach" with this hot spare, +# it will be returned to the set of available spares, +# the original drive will remain in its current position. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Activate a spare device to the pool +# 3. Do 'zpool detach' with the spare in device +# 4. Verify the spare device returned to the set of available spares, +# and the original drive will remain in its current position. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $MKFILE 100m /$TESTPOOL/$TESTFILE1 + log_must $SYNC + log_must $ZPOOL replace $TESTPOOL $odev $dev + + log_must resilver_happened $TESTPOOL + log_must check_hotspare_state "$TESTPOOL" "$dev" "INUSE" + + log_must $ZPOOL detach $TESTPOOL $dev + log_must check_hotspare_state "$TESTPOOL" "$dev" "AVAIL" + log_must $RM -f /$TESTPOOL/$TESTFILE1 + log_must $SYNC +} + +log_assert "'zpool detach ...' should deactivate the spared-in hot spare device successfully." + +log_onexit cleanup + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool detach ...' deactivate the spared-in hot spare device successfully." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_002_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_002_pos.ksh new file mode 100644 index 00000000000..1ae6ad23189 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_002_pos.ksh @@ -0,0 +1,114 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_detach_002_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_detach_002_pos +# +# DESCRIPTION: +# If a hot spare have been activated, +# and invoke "zpool detach" with the original device, +# then the hot spare will become a functioning device, +# and automatically be removed from the list of available hot spares +# then the spare is automatically removed once the replace completes. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Activate a spare device to the pool +# 3. Do 'zpool detach' with the original device +# 4. Verify the spare device will become a functioning device, +# be removed from the list of available spares as well, +# and the original drive will removed once replace completes. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $ZPOOL replace $TESTPOOL $odev $dev + while check_state "$TESTPOOL" "replacing" \ + "online" || \ + ! is_pool_resilvered $TESTPOOL ; do + $SLEEP 2 + done + log_must check_hotspare_state "$TESTPOOL" "$dev" "INUSE" + + log_must $ZPOOL detach $TESTPOOL $odev + $SLEEP 5 + log_must $ZPOOL replace $TESTPOOL $dev $odev + + while check_state "$TESTPOOL" "replacing" \ + "online" ; do + $SLEEP 2 + done + + log_must $ZPOOL add -f $TESTPOOL spare $dev + log_must check_hotspare_state "$TESTPOOL" "$dev" "AVAIL" +} + +log_assert "'zpool detach ...' against a functioning device that have spared should take the hot spare permanently swapping in successfully." + +log_onexit cleanup + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool detach ...' against a functioning device that have spared take the hot spare permanently swapping in successfully." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_003_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_003_pos.ksh new file mode 100644 index 00000000000..68d7292b80b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_003_pos.ksh @@ -0,0 +1,107 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_detach_003_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_detach_003_pos +# +# DESCRIPTION: +# If a hot spare have been activated, +# and invoke "zpool replace" to replace the original device, +# then the spare is automatically removed once the replace completes +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Activate a spare device to the pool +# 3. Do 'zpool replace' with the original device +# 4. Verify the original device will replace by the new device, +# and the spare should return to available once replace completes. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $ZPOOL replace $TESTPOOL $odev $dev + log_must check_hotspare_state "$TESTPOOL" "$dev" "INUSE" + log_must $ZPOOL replace -f $TESTPOOL $odev $ndev + + while check_state $TESTPOOL "replacing" \ + "online"; do + $SLEEP 5 + done + + log_mustnot iscontained "$TESTPOOL" "$odev" + log_must iscontained "$TESTPOOL" "$ndev" + log_must check_hotspare_state "$TESTPOOL" "$dev" "AVAIL" + log_must $ZPOOL replace $TESTPOOL $ndev $odev + $SLEEP 5 +} + +log_assert "'zpool replace ' against a functioning device that have spared should complete and the hot spare should return to available." + +log_onexit cleanup + +set_devs +typeset ndev=${devarray[2]} + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool replace ' against a functioning device that have spared successful and the hot spare return to available." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_004_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_004_pos.ksh new file mode 100644 index 00000000000..a1eaaf0fd6d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_004_pos.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_detach_004_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_detach_004_pos +# +# DESCRIPTION: +# If a hot spare is activated, +# and invoke "zpool replace" with this hot spare to another hot spare, +# the operation should run successfully. +# +# STRATEGY: +# 1. Create a storage pool with multiple hot spares +# 2. Activate a hot spare by 'zpool replace' with the basic dev, +# make sure there still have enough hot spare in available list. +# 3. Do 'zpool replace' with the hot spare to another AVAIL hot spare. +# 4. Verify the operation runs successfully. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL; then + if [[ "$STF_EXITCODE" -eq "$STF_FAIL" ]]; then + $ECHO "Testcase failed; dumping pool status:" + $ZPOOL status $TESTPOOL + fi + destroy_pool $TESTPOOL + fi + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $ZPOOL replace $TESTPOOL $odev $dev + log_must check_hotspare_state "$TESTPOOL" "$dev" "INUSE" + wait_for_state_exit "$TESTPOOL" "$dev" "resilvering" + + log_must $ZPOOL replace $TESTPOOL $dev $ndev + wait_for_state_exit "$TESTPOOL" "$dev" "online" + + log_must check_hotspare_state "$TESTPOOL" "$dev" "AVAIL" + log_must check_hotspare_state "$TESTPOOL" "$ndev" "INUSE" + log_must $ZPOOL detach $TESTPOOL $ndev +} + +log_assert "'zpool replace ' against a hot spare device that have been activated should successful while the another dev is a available hot spare." + +log_onexit cleanup + +set_devs +typeset ndev=${devarray[2]} + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" "${sparedevs[@]} $ndev" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool replace ' against a hot spare device that have been activated should successful while the another dev is a available hot spare." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_005_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_005_neg.ksh new file mode 100644 index 00000000000..9afc09fa4cd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_detach_005_neg.ksh @@ -0,0 +1,93 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_detach_005_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_detach_005_neg +# +# DESCRIPTION: +# If a hot spare is only in the list of available hot spares +# but have NOT been activated, +# invoke "zpool detach" with this hot spare will fail with +# a return code of 255 and issue an error message. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Do 'zpool detach' with the hot spare device +# 4. Verify the operation fail with return code of 255 +# and issue an error message. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + + log_mustnot $ZPOOL detach "$TESTPOOL" $dev + log_must check_hotspare_state "$TESTPOOL" "$dev" "AVAIL" +} + +log_assert "'zpool detach ' against a hot spare device that NOT activated should fail and issue an error message." + +log_onexit cleanup + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool detach ' against a hot spare device that NOT activated fail as expected." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_export_001_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_export_001_neg.ksh new file mode 100644 index 00000000000..a718f7a0741 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_export_001_neg.ksh @@ -0,0 +1,127 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_export_001_neg.ksh 1.2 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_export_001_neg +# +# DESCRIPTION: +# If 2 storage pools have shared hotspares, if the shared hotspare was used by +# one of the pool, the export of the pool that use hotspare will fail. +# +# STRATEGY: +# 1. Create 2 storage pools with hot spares shared. +# 2. Fail one vdev in one pool to make the hotspare in use. +# 3. Export the pool that currently use the hotspare +# 4. Verify the export will failed with warning message. +# 5. Verify export -f will success. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2008-12-12) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + else + $ZPOOL import -d $HOTSPARE_TMPDIR -f | $GREP \ + "pool: $TESTPOOL">/dev/null 2>&1 + if (( $? == 0 )); then + log_must $ZPOOL import -d $HOTSPARE_TMPDIR -f $TESTPOOL + destroy_pool $TESTPOOL + fi + fi + + poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + + partition_cleanup + +} + + +log_onexit cleanup + +function verify_assertion # type, dev +{ + typeset pool_type=$1 + typeset hotspare=$2 + + typeset err_dev=${devarray[3]} + typeset pool_dev="${devarray[6]}" + typeset mntp=$(get_prop mountpoint $TESTPOOL) + + create_pool $TESTPOOL1 $pool_dev spare $hotspare + + zpool replace $TESTPOOL $err_dev $hotspare + log_must check_hotspare_state "$TESTPOOL" "$hotspare" "INUSE" + + log_must $ZPOOL status $TESTPOOL + log_must $ZPOOL status $TESTPOOL1 + + log_mustnot $ZPOOL export $TESTPOOL + log_must $ZPOOL export -f $TESTPOOL + + log_must $ZPOOL import -d $HOTSPARE_TMPDIR -f $TESTPOOL + destroy_pool $TESTPOOL + + destroy_pool $TESTPOOL1 +} + +log_onexit cleanup + +log_assert "export pool that using shared hotspares will fail" + +set_devs + +typeset share_spare="${devarray[0]}" +set -A my_keywords "mirror" "raidz1" "raidz2" + +for keyword in "${my_keywords[@]}" ; do + setup_hotspares $keyword $share_spare + verify_assertion $keyword $share_spare +done + +log_pass "export pool that using shared hotspares will fail" + diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_import_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_import_001_pos.ksh new file mode 100644 index 00000000000..fae2596abde --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_import_001_pos.ksh @@ -0,0 +1,167 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_import_001_pos.ksh 1.4 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_import_001_pos +# +# DESCRIPTION: +# If a storage pool has hot spare, +# regardless it has been activated or NOT, +# invoke "zpool export" then import with this storage pool +# should runs successfully, and the data should keep integrity +# after import. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Do 'zpool export' then 'zpool import' with following scernarios +# - the hotspare is only in available list +# - the hotspare is activated +# - the hotspare is activated but offline +# - the hotspare is activated but the basic vdev is offline +# 3. Verify the export/import runs successfully, +# and the data keep integrity after import +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-14) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_export_import #pool #file #chksum +{ + typeset pool=$1 + typeset file=$2 + typeset checksum1=$3 + typeset -i n=0 + + if ! $ZPOOL export $pool; then + # Rarely, this can fail with EBUSY if the pool's configuration + # has already changed within the same transaction group. In + # that case, it is appropriate to retry. + while ((n < 3)); do + $SYNC + log_note "$ZPOOL busy, retrying export (${n})..." + if ((n == 2)); then + log_must $ZPOOL export $pool + else + $ZPOOL export $pool && break + fi + $SLEEP 1 + n=$((n + 1)) + done + fi + log_must $ZPOOL import -d $HOTSPARE_TMPDIR $pool + + [[ ! -e $file ]] && \ + log_fail "$file missing after detach hotspare." + checksum2=$($SUM $file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + return 0 +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + # + # - the hotspare is activated + # + log_must $ZPOOL replace $TESTPOOL $odev $dev + while ! is_pool_resilvered $TESTPOOL ; do + $SLEEP 2 + done + + verify_export_import $TESTPOOL \ + $mtpt/$TESTFILE0 $checksum1 + + # + # - the hotspare is activated + # but the basic vdev is offline + # + log_must $ZPOOL offline $TESTPOOL $odev + verify_export_import $TESTPOOL \ + $mtpt/$TESTFILE0 $checksum1 + + log_must $ZPOOL online $TESTPOOL $odev + + log_must $ZPOOL detach $TESTPOOL $dev +} + +log_assert "'zpool export/import ' should runs successfully regardless the hotspare is only in list, activated, or offline." + +log_onexit cleanup + +typeset mtpt="" + +set_devs + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + mtpt=$(get_prop mountpoint $TESTPOOL) + log_must $CP $MYTESTFILE $mtpt/$TESTFILE0 + + # + # - the hotspare is only in available list + # + verify_export_import $TESTPOOL \ + $mtpt/$TESTFILE0 $checksum1 + + iterate_over_hotspares verify_assertion "${vdev%% *}" + + log_must $RM -f $mtpt/$TESTFILE0 + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool export/import ' should runs successfully regardless the hotspare is only in list, activated, or offline." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_onoffline_003_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_onoffline_003_neg.ksh new file mode 100644 index 00000000000..1face124391 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_onoffline_003_neg.ksh @@ -0,0 +1,99 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_onoffline_003_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_onoffline_003_neg +# +# DESCRIPTION: +# Regardless a hot spare is only in the available hot spare list, +# or have been activated, +# invoke "zpool offline" & "zpool online" with this hot spare +# will fail with a return code of 1 and issue an error message. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Try 'zpool offline' & 'zpool online' with each hot spare +# of following condition +# - only in the list of available hot spares (fail) +# - have been activated (fail) +# 3. Verify offline/online results as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_mustnot $ZPOOL offline $TESTPOOL $dev + log_must check_hotspare_state $TESTPOOL $dev "AVAIL" + + log_mustnot $ZPOOL online $TESTPOOL $dev + log_must check_hotspare_state $TESTPOOL $dev "AVAIL" +} + +log_assert "'zpool offline/online ' should fail on inactive spares" + +log_onexit cleanup + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool offline/online ' against a hot spare works as expected." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_onoffline_004_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_onoffline_004_neg.ksh new file mode 100644 index 00000000000..40aa69ce76f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_onoffline_004_neg.ksh @@ -0,0 +1,167 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_onoffline_004_neg.ksh 1.5 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_onoffline_004_neg +# +# DESCRIPTION: +# If a hot spare has been activated, +# turning that basic vdev offline and back online during I/O completes. +# Make sure the integrity of the file system and the resilvering. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Activate the hot spare +# 3. Start some random I/O +# 4. Try 'zpool offline' & 'zpool online' with the basic vdev +# 5. Verify the integrity of the file system and the resilvering. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + kill_all_wp + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + + partition_cleanup +} + +function kill_all_wp +{ + for wait_pid in $child_pids + do + $KILL $wait_pid + $WAIT $wait_pid + done +} + +function start_all_wp +{ + typeset -i i=0 + typeset -i iters=1 + + child_pids="" + while (( i < iters )); do + log_note "Invoking $FILE_TRUNC with: $options_display" + $FILE_TRUNC $options $TESTDIR/$TESTFILE.$i & + typeset pid=$! + + child_pids="$child_pids $pid" + ((i = i + 1)) + done +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset -i i=0 + typeset -i iters=1 + typeset odev=${pooldevs[0]} + + log_must $ZPOOL replace $TESTPOOL $odev $dev + + i=0 + while (( i < iters )); do + start_all_wp + while true; do + if is_pool_resilvered "$TESTPOOL"; then + [ -s "$TESTDIR/$TESTFILE.$i" ] && break + fi + $SLEEP 2 + done + + kill_all_wp + log_must test -s $TESTDIR/$TESTFILE.$i + + log_must $ZPOOL offline $TESTPOOL $odev + log_must check_state $TESTPOOL $odev "offline" + + log_must $ZPOOL online $TESTPOOL $odev + log_must check_state $TESTPOOL $odev "online" + (( i = i + 1 )) + done + + log_must $ZPOOL detach $TESTPOOL $dev +} + +log_assert "'zpool offline/online ' against a spared basic vdev during I/O completes." + +log_onexit cleanup + +set_devs + +options="" +options_display="default options" + +[[ -n "$HOLES_FILESIZE" ]] && options=" $options -f $HOLES_FILESIZE " + +[[ -n "$HOLES_BLKSIZE" ]] && options="$options -b $HOLES_BLKSIZE " + +[[ -n "$HOLES_COUNT" ]] && options="$options -c $HOLES_COUNT " + +[[ -n "$HOLES_SEED" ]] && options="$options -s $HOLES_SEED " + +[[ -n "$HOLES_FILEOFFSET" ]] && options="$options -o $HOLES_FILEOFFSET " + +options="$options -r" + +[[ -n "$options" ]] && options_display=$options + +typeset child_pid="" + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL + + iterate_over_hotspares verify_assertion + + verify_filesys "$TESTPOOL" "$TESTPOOL" "$HOTSPARE_TMPDIR" + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool offline/online ' against a spared basic vdev during I/O completes." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_001_pos.ksh new file mode 100644 index 00000000000..651bf8ae4b3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_001_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_remove_001_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_remove_001_pos +# +# DESCRIPTION: +# 'zpool remove ...' can successfully remove the specified +# devices from the hot spares list of the given pool +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add hot spare devices to the pool +# 3. Remove hot spares one by one +# 3. Verify the devices are removed fromo the spare list +# of the given pool successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + + log_must $ZPOOL remove $TESTPOOL $dev + log_mustnot iscontained "$TESTPOOL" $dev +} + +log_assert "'zpool remove ...' can remove spare device from the pool." + +log_onexit cleanup + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool remove ...' executes successfully" diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_002_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_002_neg.ksh new file mode 100644 index 00000000000..50364140bcf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_002_neg.ksh @@ -0,0 +1,116 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_remove_002_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_remove_002_neg +# +# DESCRIPTION: +# 'zpool remove ...' should return fail if +# - notexist device +# - not within the hot spares of this pool +# - hot spares that currently spared in +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add hot spare devices to the pool +# 3. For each scenario, try to remove the hot spares +# 4. Verify the the remove operation get failed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2005-09-27) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $ZPOOL replace $TESTPOOL $odev $dev + log_mustnot $ZPOOL remove $TESTPOOL $dev + log_must $ZPOOL detach $TESTPOOL $dev +} + +log_assert "'zpool remove ...' should fail with inapplicable scenarios." + +log_onexit cleanup + +typeset dev_nonexist dev_notinlist + +case $DISK_ARRAY_NUM in +0|1) + dev_nonexist=/dev/dsk/${disk}sbad_slice_num + dev_notinlist=${disk} + ;; +2|*) + dev_nonexist=/dev/dsk/${DISK0}sbad_slice_num + dev_notinlist="${DISK0} ${DISK1}" + ;; +esac + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + for dev in $dev_nonexist ; do + log_mustnot $ZPOOL remove $TESTPOOL $dev + done + + for dev in $dev_notinlist ; do + log_mustnot $ZPOOL remove $TESTPOOL $dev + done + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool remove ...' fail with inapplicable scenarios." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_003_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_003_neg.ksh new file mode 100644 index 00000000000..41d239f49c2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_003_neg.ksh @@ -0,0 +1,86 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_remove_003_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_remove_003_neg +# +# DESCRIPTION: +# Executing 'zpool remove' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool remove' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + + +set -A args "" "-?" "-t fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "$TESTPOOL" "fakepool ${devarray[0]}" "fakepool ${devarray[1]}" + +log_assert "Executing 'zpool remove' with bad options fails" +log_onexit cleanup + +set_devs +setup_hotspares + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL remove ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool remove' command with bad options failed as expected." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_004_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_004_pos.ksh new file mode 100644 index 00000000000..44be7f864cf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_remove_004_pos.ksh @@ -0,0 +1,99 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_remove_004_pos.ksh 1.2 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_remove_004_pos +# +# DESCRIPTION: +# 'zpool remove ...' can successfully remove the specified +# devices from the hot spares even it no longer exists. +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add hot spare devices to the pool +# 3. Export the pool +# 4. Remove the hotspare +# 5. Import the pool +# 6. Remove hot spares one by one +# 7. Verify the devices are removed from the spare list +# of the given pool successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2008-02-25) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + + log_must $ZPOOL export $TESTPOOL + log_must $MV $dev $dev.bak + log_must $ZPOOL import -d $HOTSPARE_TMPDIR $TESTPOOL + log_must $ZPOOL remove $TESTPOOL $dev + log_mustnot iscontained "$TESTPOOL" $dev + log_must $MV $dev.bak $dev +} + +log_assert "'zpool remove ...' can remove spare device from the pool." + +log_onexit cleanup + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool remove ...' executes successfully" diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_replace_001_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_replace_001_neg.ksh new file mode 100644 index 00000000000..78cf9a71478 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_replace_001_neg.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_001_neg.ksh 1.4 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_replace_001_neg +# +# DESCRIPTION: +# 'zpool replace ...' should return fail if +# - try to replace a basic vdev that already has an activated +# hot spare. +# - try to replace log device. +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add hot spare devices to the pool +# 3. For each scenario, try to replace the basic vdev with the given hot spares +# 4. Verify the the replace operation get failed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + + for odev in ${pooldevs[@]} ; do + log_must $ZPOOL replace $TESTPOOL $odev $dev + log_mustnot $ZPOOL replace $TESTPOOL $odev $availdev + log_must $ZPOOL detach $TESTPOOL $dev + done + + if [[ -n ${logdevs[@]} ]] ; then + for odev in ${logdevs[@]} ; do + log_mustnot $ZPOOL replace $TESTPOOL $odev $dev + done + fi +} + +log_assert "'zpool replace ' should fail with inapplicable scenarios." + +log_onexit cleanup + +set_devs + +typeset dev_nonexist +typeset availdev=${devarray[2]} +dev_nonexist=${disk}sbad_slice_num + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" "${sparedevs[@]} $availdev" + + for odev in ${pooldevs[@]} ; do + for ndev in $dev_nonexist ; do + log_mustnot $ZPOOL replace $TESTPOOL $odev $ndev + done + done + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool replace ' fail with inapplicable scenarios." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_replace_002_neg.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_replace_002_neg.ksh new file mode 100644 index 00000000000..0cdbe57cd0d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_replace_002_neg.ksh @@ -0,0 +1,97 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_002_neg.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_replace_002_neg +# +# DESCRIPTION: +# 'zpool replace ...' should return fail if +# the size of hot spares is smaller than the basic vdev. +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add hot spare devices to the pool +# 3. Try to replace the basic vdev with the smaller hot spares +# 4. Verify the the replace operation failes +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + + for odev in ${pooldevs[0]} ; do + log_mustnot $ZPOOL replace $TESTPOOL $odev $dev + done +} + +log_assert "'zpool replace ' should fail while the hot spares smaller than the basic vdev." + +log_onexit cleanup + +set_devs + +typeset smalldev="${devarray[6]}" +VDEV_SIZE=$SIZE1 +log_must create_vdevs $smalldev +unset VDEV_SIZE + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" "$smalldev" + + iterate_over_hotspares verify_assertion "$smalldev" + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool replace ' should fail while the hot spares smaller than the basic vdev." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_scrub_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_scrub_001_pos.ksh new file mode 100644 index 00000000000..f48291d9373 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_scrub_001_pos.ksh @@ -0,0 +1,120 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_scrub_001_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_scrub_001_pos +# +# DESCRIPTION: +# If a storage pool has hot spare, +# regardless it has been activated or NOT, +# invoke "zpool scrub" with this storage pool should successful. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Make the storage pool dirty. +# 3. Do 'zpool scrub' with following scernarios +# - the hotspare is only in available list +# - the hotspare is activated +# 4. Verify the scrub runs successfully. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + # Record status so we can see the current state on failure. + $ZPOOL status + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $MKFILE 100m $mtpt/$TESTFILE0 + log_must $ZPOOL scrub $TESTPOOL + while is_pool_scrubbing $TESTPOOL ; do + $SLEEP 2 + done + + log_must $MKFILE 100m $mtpt/$TESTFILE1 + log_must $ZPOOL replace $TESTPOOL $odev $dev + + while ! is_pool_resilvered $TESTPOOL ; do + $SLEEP 2 + done + + log_must $ZPOOL scrub $TESTPOOL + + while is_pool_scrubbing $TESTPOOL ; do + $SLEEP 2 + done + + log_must $ZPOOL detach $TESTPOOL $dev + log_must $RM -f $mtpt/$TESTFILE0 \ + $mtpt/$TESTFILE1 +} + +log_assert "'zpool scrub ' should runs successfully regardless " \ + "the hotspare is only in list or activated." + +log_onexit cleanup + +typeset mtpt="" + +set_devs + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + mtpt=$(get_prop mountpoint $TESTPOOL) + iterate_over_hotspares verify_assertion "${vdev%% *}" + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool scrub ' runs successfully regardless " \ + "the hotspare is only in list or activated." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_scrub_002_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_scrub_002_pos.ksh new file mode 100644 index 00000000000..c96bff98c67 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_scrub_002_pos.ksh @@ -0,0 +1,135 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_scrub_002_pos +# +# DESCRIPTION: +# 'zpool scrub will scan spares as well as original devices' +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add hot spare devices to the pool +# 4. Replace one of the original devices with a spare +# 5. Simulate errors on the spare +# 6. Scrub the pool +# 7. Verify that scrub detected the simulated errors +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2013-01-14) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && destroy_pool $TESTPOOL + partition_cleanup +} + +# Returns the number of checksums errors detected on the given vdev +function get_cksum #pool, vdev +{ + typeset pool=$1 + typeset vdev=$2 + $ZPOOL status $pool | awk -v vdev=$vdev '$1~vdev {print $5; exit}' +} + +function verify_assertion # odev +{ + typeset odev=$1 + + log_must $ZPOOL replace $TESTPOOL $odev $sdev + log_must check_state $TESTPOOL "$sdev" "INUSE" + + # corrupt out the $TESTPOOL to make sdev in use + # Skip the first input block so we don't overwrite the vdev label + log_must $DD if=/dev/zero bs=1024k count=63 oseek=1 conv=notrunc of=$sdev + + $SYNC + # The pool may already have started scrubbing, so don't assert this. + # Expected postconditions are checked below anyway. + $ZPOOL scrub $TESTPOOL + while is_pool_scrubbing $TESTPOOL ; do + $SLEEP 2 + done + + # Verify that scrub detected the errors + # Some vdevs (ie raidz1) will display the errors on the spare-0 line + # instead of on the basic vdev line + [[ $(get_cksum $TESTPOOL $sdev) > 0 ]] + sdev_errors=$? + [[ $(get_cksum $TESTPOOL "spare-0") > 0 ]] + spare0_errors=$? + log_must [ $sdev_errors -o $spare0_errors ] + + # Now clear the old errors, remove the original device and scrub again. + # No new errors should be found, because the scrub should've found and + # fixed all errors + log_must $ZPOOL clear $TESTPOOL + log_must $ZPOOL detach $TESTPOOL $odev + $ZPOOL scrub $TESTPOOL + while is_pool_scrubbing $TESTPOOL ; do + $SLEEP 2 + done + if [ $(get_cksum $TESTPOOL $sdev) -ne 0 ]; then + log_fail "ERROR: Scrub missed cksum errors on a spare vdev" + fi +} + +log_assert "'zpool scrub' scans spare vdevs" + +log_onexit cleanup + +set_devs +typeset odev="${devarray[3]}" +typeset sdev="${devarray[0]}" + +# Don't test striped pools because they can't have spares +set -A keywords "mirror" "raidz" "raidz2" +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + iterate_over_hotspares verify_assertion $odev + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool scrub scans spare vdevs'" diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_shared_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_shared_001_pos.ksh new file mode 100644 index 00000000000..e6ba1bb7ede --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_shared_001_pos.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_shared_001_pos.ksh 1.0 08/06/12 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_shared_001_pos +# +# DESCRIPTION: +# It is possible to add the same vdev to multiple pools as a shared spare +# even when that vdev is a disk instead of a file +# +# STRATEGY: +# 1. Create various combinations of two pools +# 2. 'zpool add' a hotspare disk to each of them +# 3. verify that the addition worked +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2012-08-06) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + + log_must $ZPOOL add $TESTPOOL1 spare $dev + + log_must check_hotspare_state "$TESTPOOL" "$dev" "AVAIL" + log_must check_hotspare_state "$TESTPOOL1" "$dev" "AVAIL" +} + + +log_assert "'zpool add spare ...' can add a disk as a shared spare to multiple pools." + +log_onexit cleanup + +set_devs +typeset sdev=$DISK0 +typeset pool1devs="$DISK1 $DISK2 $DISK3 $DISK4" + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" $sdev + log_must create_pool $TESTPOOL1 $keyword $pool1devs + iterate_over_hotspares verify_assertion $sdev + + destroy_pool "$TESTPOOL" + destroy_pool "$TESTPOOL1" +done diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_snapshot_001_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_snapshot_001_pos.ksh new file mode 100644 index 00000000000..9b1458d84c8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_snapshot_001_pos.ksh @@ -0,0 +1,126 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_snapshot_001_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_snapshot_001_pos +# +# DESCRIPTION: +# If a hot spare have been activated, create snapshot upon filesystem, +# then invoke "zpool detach" with this hot spare, +# the data in snapshot should untouched. +# +# STRATEGY: +# 1. Create a storage pool with hot spares +# 2. Create some files, create a snapshot upon filesystem +# 3. Activate a spare device to the pool +# 4. Create some files, create an new snapshot upon filesystem +# 5. Do 'zpool detach' with the spare in device +# 6. Verify the 2 snapshots are all kept, and verify the data integrity within them. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE0 + log_must $ZFS snapshot $TESTPOOL@snap.0 + + log_must $ZPOOL replace $TESTPOOL $odev $dev + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE1 + log_must $ZFS snapshot $TESTPOOL@snap.1 + + log_must $SYNC + + log_must $ZPOOL detach $TESTPOOL $dev + + for file in \ + "$snaproot/snap.0/$TESTFILE0" \ + "$snaproot/snap.1/$TESTFILE0" \ + "$snaproot/snap.1/$TESTFILE1" ; do + [[ ! -e $file ]] && \ + log_fail "$file missing after detach hotspare." + checksum2=$($SUM $file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + done + + log_must $RM -f $mtpt/* + log_must $ZFS destroy $TESTPOOL@snap.1 + log_must $ZFS destroy $TESTPOOL@snap.0 +} + +log_assert "'zpool detach ...' against hotspare should do no harm to snapshot." + +log_onexit cleanup + +typeset mtpt="" snaproot="" + +set_devs + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + mtpt=$(get_prop mountpoint $TESTPOOL) + snaproot="$mtpt/$(get_snapdir_name)" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool detach ...' against hotspare should do no harm to snapshot." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_snapshot_002_pos.ksh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_snapshot_002_pos.ksh new file mode 100644 index 00000000000..f2d979a7811 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_snapshot_002_pos.ksh @@ -0,0 +1,132 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_snapshot_002_pos.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: hotspare_snapshot_002_pos +# +# DESCRIPTION: +# If a storage pool has activated hot spares, +# create snapshot and detach the basic vdev, +# the hot spare should become the functional device, and +# the data in snapshot should keep integrity. +# +# STRATEGY: +# 1. Create a storage pool with hot spares activated. +# 2. Create some files, create a snapshot upon filesystem +# 3. Activate a spare device to the pool +# 4. Create some files, create an new snapshot upon filesystem +# 5. Do 'zpool detach' with the original device +# 6. Verify the 2 snapshots are all kept, and verify the data integrity within them. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2006-06-07) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # dev +{ + typeset dev=$1 + typeset odev=${pooldevs[0]} + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE0 + log_must $ZFS snapshot $TESTPOOL@snap.0 + + log_must $ZPOOL replace $TESTPOOL $odev $dev + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE1 + log_must $ZFS snapshot $TESTPOOL@snap.1 + + log_must $SYNC + + log_must $ZPOOL detach $TESTPOOL $odev + + for file in \ + "$snaproot/snap.0/$TESTFILE0" \ + "$snaproot/snap.1/$TESTFILE0" \ + "$snaproot/snap.1/$TESTFILE1" ; do + [[ ! -e $file ]] && \ + log_fail "$file missing after detach hotspare." + checksum2=$($SUM $file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + done + + log_must $ZFS destroy $TESTPOOL@snap.1 + log_must $ZFS destroy $TESTPOOL@snap.0 + + log_must $ZPOOL add -f "$TESTPOOL" spare $odev + log_must $ZPOOL replace "$TESTPOOL" $dev $odev + log_must $SYNC + log_must $ZPOOL detach "$TESTPOOL" $dev + log_must $ZPOOL add -f "$TESTPOOL" spare $dev +} + +log_assert "'zpool detach ...' against basic vdev do no harm to snapshot." + +log_onexit cleanup + +typeset mtpt="" snaproot="" + +set_devs + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +for keyword in "${keywords[@]}" ; do + setup_hotspares "$keyword" + + mtpt=$(get_prop mountpoint $TESTPOOL) + snaproot="$mtpt/$(get_snapdir_name)" + + iterate_over_hotspares verify_assertion + + destroy_pool "$TESTPOOL" +done + +log_pass "'zpool detach ...' against basic vdev should do no harm to snapshot." diff --git a/tests/sys/cddl/zfs/tests/hotspare/hotspare_test.sh b/tests/sys/cddl/zfs/tests/hotspare/hotspare_test.sh new file mode 100755 index 00000000000..f84c2d98652 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/hotspare_test.sh @@ -0,0 +1,760 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case hotspare_add_001_pos cleanup +hotspare_add_001_pos_head() +{ + atf_set "descr" "'zpool add spare ...' can add devices to the pool." + atf_set "timeout" 3600 +} +hotspare_add_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_add_001_pos.ksh || atf_fail "Testcase failed" +} +hotspare_add_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_add_002_pos cleanup +hotspare_add_002_pos_head() +{ + atf_set "descr" "'zpool add spare ...' can add devices to the pool while it has spare-in device." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_add_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_add_002_pos.ksh || atf_fail "Testcase failed" +} +hotspare_add_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_add_003_neg cleanup +hotspare_add_003_neg_head() +{ + atf_set "descr" "'zpool add [-f]' with hot spares should fail with inapplicable scenarios." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_add_003_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_add_003_neg.ksh || atf_fail "Testcase failed" +} +hotspare_add_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_add_004_neg cleanup +hotspare_add_004_neg_head() +{ + atf_set "descr" "'zpool add [-f]' will not allow a swap device to be used as a hotspare'" + atf_set "require.progs" zpool swapon swapoff swapctl +} +hotspare_add_004_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_add_004_neg.ksh || atf_fail "Testcase failed" +} +hotspare_add_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_clone_001_pos cleanup +hotspare_clone_001_pos_head() +{ + atf_set "descr" "'zpool detach ...' against hotspare should do no harm to clone." + atf_set "require.progs" zfs zpool sum + atf_set "timeout" 3600 +} +hotspare_clone_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_clone_001_pos.ksh || atf_fail "Testcase failed" +} +hotspare_clone_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_clone_002_pos cleanup +hotspare_clone_002_pos_head() +{ + atf_set "descr" "'zpool detach ...' against basic vdev should do no harm to clone." + atf_set "require.progs" zfs zpool sum + atf_set "timeout" 3600 +} +hotspare_clone_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_clone_002_pos.ksh || atf_fail "Testcase failed" +} +hotspare_clone_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_create_001_neg cleanup +hotspare_create_001_neg_head() +{ + atf_set "descr" "'zpool create [-f]' with hot spares should be failedwith inapplicable scenarios." + atf_set "require.progs" dumpadm zpool + atf_set "timeout" 3600 +} +hotspare_create_001_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_create_001_neg.ksh || atf_fail "Testcase failed" +} +hotspare_create_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_detach_001_pos cleanup +hotspare_detach_001_pos_head() +{ + atf_set "descr" "'zpool detach ...' should deactivate the spared-in hot spare device successfully." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_detach_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_detach_001_pos.ksh || atf_fail "Testcase failed" +} +hotspare_detach_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_detach_002_pos cleanup +hotspare_detach_002_pos_head() +{ + atf_set "descr" "'zpool detach ...' against a functioning device that have spared should take the hot spare permanently swapping in successfully." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_detach_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_detach_002_pos.ksh || atf_fail "Testcase failed" +} +hotspare_detach_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_detach_003_pos cleanup +hotspare_detach_003_pos_head() +{ + atf_set "descr" "'zpool replace ' against a functioning device that have spared should complete and the hot spare should return to available." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_detach_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_detach_003_pos.ksh || atf_fail "Testcase failed" +} +hotspare_detach_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_detach_004_pos cleanup +hotspare_detach_004_pos_head() +{ + atf_set "descr" "'zpool replace ' against a hot spare device that have been activated should successful while the another dev is a available hot spare." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_detach_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_detach_004_pos.ksh || atf_fail "Testcase failed" +} +hotspare_detach_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_detach_005_neg cleanup +hotspare_detach_005_neg_head() +{ + atf_set "descr" "'zpool detach ' against a hot spare device that NOT activated should fail and issue an error message." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_detach_005_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_detach_005_neg.ksh || atf_fail "Testcase failed" +} +hotspare_detach_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_export_001_neg cleanup +hotspare_export_001_neg_head() +{ + atf_set "descr" "export pool that using shared hotspares will fail" + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_export_001_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_export_001_neg.ksh || atf_fail "Testcase failed" +} +hotspare_export_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_import_001_pos cleanup +hotspare_import_001_pos_head() +{ + atf_set "descr" "'zpool export/import ' should runs successfully regardless the hotspare is only in list, activated, or offline." + atf_set "require.progs" zpool sum + atf_set "timeout" 3600 +} +hotspare_import_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_import_001_pos.ksh || atf_fail "Testcase failed" +} +hotspare_import_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_onoffline_003_neg cleanup +hotspare_onoffline_003_neg_head() +{ + atf_set "descr" "'zpool offline/online ' should fail on inactive spares" + atf_set "require.progs" zpool zdb + atf_set "timeout" 3600 +} +hotspare_onoffline_003_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_onoffline_003_neg.ksh || atf_fail "Testcase failed" +} +hotspare_onoffline_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_onoffline_004_neg cleanup +hotspare_onoffline_004_neg_head() +{ + atf_set "descr" "'zpool offline/online ' against a spared basic vdev during I/O completes." + atf_set "require.progs" zfs zpool zdb + atf_set "timeout" 3600 +} +hotspare_onoffline_004_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_onoffline_004_neg.ksh || atf_fail "Testcase failed" +} +hotspare_onoffline_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_remove_001_pos cleanup +hotspare_remove_001_pos_head() +{ + atf_set "descr" "'zpool remove ...' can remove spare device from the pool." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_remove_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_remove_001_pos.ksh || atf_fail "Testcase failed" +} +hotspare_remove_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_remove_002_neg cleanup +hotspare_remove_002_neg_head() +{ + atf_set "descr" "'zpool remove ...' should fail with inapplicable scenarios." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_remove_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_remove_002_neg.ksh || atf_fail "Testcase failed" +} +hotspare_remove_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_remove_003_neg cleanup +hotspare_remove_003_neg_head() +{ + atf_set "descr" "Executing 'zpool remove' with bad options fails" + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_remove_003_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_remove_003_neg.ksh || atf_fail "Testcase failed" +} +hotspare_remove_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_remove_004_pos cleanup +hotspare_remove_004_pos_head() +{ + atf_set "descr" "'zpool remove ...' can remove spare device from the pool." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_remove_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_remove_004_pos.ksh || atf_fail "Testcase failed" +} +hotspare_remove_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_replace_001_neg cleanup +hotspare_replace_001_neg_head() +{ + atf_set "descr" "'zpool replace ' should fail with inapplicable scenarios." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_replace_001_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_replace_001_neg.ksh || atf_fail "Testcase failed" +} +hotspare_replace_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_replace_002_neg cleanup +hotspare_replace_002_neg_head() +{ + atf_set "descr" "'zpool replace ' should fail while the hot spares smaller than the basic vdev." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_replace_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_replace_002_neg.ksh || atf_fail "Testcase failed" +} +hotspare_replace_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_scrub_001_pos cleanup +hotspare_scrub_001_pos_head() +{ + atf_set "descr" "'zpool scrub ' should runs successfully regardlessthe hotspare is only in list or activated." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_scrub_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_scrub_001_pos.ksh || atf_fail "Testcase failed" +} +hotspare_scrub_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_scrub_002_pos cleanup +hotspare_scrub_002_pos_head() +{ + atf_set "descr" "'zpool scrub' scans spare vdevs" + atf_set "require.progs" zpool +} +hotspare_scrub_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_scrub_002_pos.ksh || atf_fail "Testcase failed" +} +hotspare_scrub_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_shared_001_pos cleanup +hotspare_shared_001_pos_head() +{ + atf_set "descr" "'zpool add spare ...' can add a disk as a shared spare to multiple pools." + atf_set "require.progs" zpool + atf_set "timeout" 3600 +} +hotspare_shared_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_shared_001_pos.ksh || atf_fail "Testcase failed" +} +hotspare_shared_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_snapshot_001_pos cleanup +hotspare_snapshot_001_pos_head() +{ + atf_set "descr" "'zpool detach ...' against hotspare should do no harm to snapshot." + atf_set "require.progs" zfs zpool sum + atf_set "timeout" 3600 +} +hotspare_snapshot_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_snapshot_001_pos.ksh || atf_fail "Testcase failed" +} +hotspare_snapshot_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case hotspare_snapshot_002_pos cleanup +hotspare_snapshot_002_pos_head() +{ + atf_set "descr" "'zpool detach ...' against basic vdev do no harm to snapshot." + atf_set "require.progs" zfs zpool sum + atf_set "timeout" 3600 +} +hotspare_snapshot_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/hotspare_snapshot_002_pos.ksh || atf_fail "Testcase failed" +} +hotspare_snapshot_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/hotspare.kshlib + . $(atf_get_srcdir)/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case hotspare_add_001_pos + atf_add_test_case hotspare_add_002_pos + atf_add_test_case hotspare_add_003_neg + atf_add_test_case hotspare_add_004_neg + atf_add_test_case hotspare_clone_001_pos + atf_add_test_case hotspare_clone_002_pos + atf_add_test_case hotspare_create_001_neg + atf_add_test_case hotspare_detach_001_pos + atf_add_test_case hotspare_detach_002_pos + atf_add_test_case hotspare_detach_003_pos + atf_add_test_case hotspare_detach_004_pos + atf_add_test_case hotspare_detach_005_neg + atf_add_test_case hotspare_export_001_neg + atf_add_test_case hotspare_import_001_pos + atf_add_test_case hotspare_onoffline_003_neg + atf_add_test_case hotspare_onoffline_004_neg + atf_add_test_case hotspare_remove_001_pos + atf_add_test_case hotspare_remove_002_neg + atf_add_test_case hotspare_remove_003_neg + atf_add_test_case hotspare_remove_004_pos + atf_add_test_case hotspare_replace_001_neg + atf_add_test_case hotspare_replace_002_neg + atf_add_test_case hotspare_scrub_001_pos + atf_add_test_case hotspare_scrub_002_pos + atf_add_test_case hotspare_shared_001_pos + atf_add_test_case hotspare_snapshot_001_pos + atf_add_test_case hotspare_snapshot_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/hotspare/setup.ksh b/tests/sys/cddl/zfs/tests/hotspare/setup.ksh new file mode 100644 index 00000000000..f671c637edd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/hotspare/setup.ksh @@ -0,0 +1,43 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.4 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +verify_runnable "global" + +log_must cleanup_devices_all + +# Most of the tests in this directory manually activate spares, which is not +# possible while ZFSD is running. +stop_zfsd + +log_pass diff --git a/tests/sys/cddl/zfs/tests/inheritance/Makefile b/tests/sys/cddl/zfs/tests/inheritance/Makefile new file mode 100644 index 00000000000..2724915a08f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/Makefile @@ -0,0 +1,66 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/inheritance +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= inheritance_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= config015.cfg +${PACKAGE}FILES+= config012.cfg +${PACKAGE}FILES+= state007.cfg +${PACKAGE}FILES+= state009.cfg +${PACKAGE}FILES+= config020.cfg +${PACKAGE}FILES+= state024.cfg +${PACKAGE}FILES+= state023.cfg +${PACKAGE}FILES+= state018.cfg +${PACKAGE}FILES+= state016.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= config003.cfg +${PACKAGE}FILES+= state011.cfg +${PACKAGE}FILES+= config004.cfg +${PACKAGE}FILES+= config021.cfg +${PACKAGE}FILES+= state008.cfg +${PACKAGE}FILES+= config013.cfg +${PACKAGE}FILES+= state006.cfg +${PACKAGE}FILES+= config014.cfg +${PACKAGE}FILES+= state001.cfg +${PACKAGE}FILES+= state010.cfg +${PACKAGE}FILES+= config005.cfg +${PACKAGE}FILES+= state017.cfg +${PACKAGE}FILES+= config002.cfg +${PACKAGE}FILES+= state019.cfg +${PACKAGE}FILES+= state022.cfg +${PACKAGE}FILES+= state014.cfg +${PACKAGE}FILES+= config001.cfg +${PACKAGE}FILES+= state013.cfg +${PACKAGE}FILES+= config006.cfg +${PACKAGE}FILES+= config008.cfg +${PACKAGE}FILES+= inherit_001_pos.ksh +${PACKAGE}FILES+= state021.cfg +${PACKAGE}FILES+= config022.cfg +${PACKAGE}FILES+= config019.cfg +${PACKAGE}FILES+= config017.cfg +${PACKAGE}FILES+= state002.cfg +${PACKAGE}FILES+= config010.cfg +${PACKAGE}FILES+= state005.cfg +${PACKAGE}FILES+= state020.cfg +${PACKAGE}FILES+= inherit.kshlib +${PACKAGE}FILES+= config009.cfg +${PACKAGE}FILES+= state012.cfg +${PACKAGE}FILES+= config007.cfg +${PACKAGE}FILES+= state015.cfg +${PACKAGE}FILES+= config011.cfg +${PACKAGE}FILES+= inherit.cfg +${PACKAGE}FILES+= state004.cfg +${PACKAGE}FILES+= config016.cfg +${PACKAGE}FILES+= state003.cfg +${PACKAGE}FILES+= config018.cfg +${PACKAGE}FILES+= config023.cfg +${PACKAGE}FILES+= config024.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/inheritance/README.config b/tests/sys/cddl/zfs/tests/inheritance/README.config new file mode 100644 index 00000000000..221c28abe99 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/README.config @@ -0,0 +1,66 @@ +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)README.config 1.2 07/01/09 SMI" +# +# The configX.cfg files describe both the dataset hierarchy to +# be created but also the initial source values for the datasets +# properties, i.e. whether they should be left with their default values +# or set locally. +# +# Format for this file is as follows: +# +# +# - must be the full dataset name +# +# - recognised types are POOL, CTR and FS +# +# +# - can have one of the following +# values: +# +# default property values are left unchanged +# +# local property values are set locally +# +# - property values are left unchanged (has the +# same effect as 'default' but is used to indicate +# that the property 'source' field may be 'inherited +# from..' depending on the actions further up the +# dataset hierarchy. +# +# +# The configuration below creates a three tier dataset layout, consisting +# of a pool, container and filesystem. +# +# The top tier pool's properties being set locally, and the two +# lower tier properties each inheriting their values from the next tier +# up. +# +TESTPOOL POOL local +TESTPOOL/TESTCTR CTR - +TESTPOOL/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/README.state b/tests/sys/cddl/zfs/tests/inheritance/README.state new file mode 100644 index 00000000000..4773475ef98 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/README.state @@ -0,0 +1,108 @@ +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)README.state 1.2 07/01/09 SMI" +# +# +# For every configX.cfg file there must be a corresponding stateX.cfg +# file. The state file both drives the operations to be performed on the +# dataset hierarchy which has been specified by the corresponding +# configX.cfg file, and also specifies the expected state of the +# properties after the operation has been completed. +# +# The format of the file is: +# : +# +# +# .... .... +# .... .... +# +# - dataset upon which the is to be executed. Can +# be any of the datasets specified in the corresponding +# configX.cfg file. If no command is to be executed +# then must be set to '-' +# +# +# - command to be executed upon the specified dataset. +# Currently the only supported commands are 'inherit' +# or 'inherit -r'. If no command is to be executed, +# then must be set to '-'. +# +# +# - the 'source' (as reported in 'zfs get') for the +# the properties before is executed. This +# can be 'default', 'local' or the name of a dataset +# from which the property is inherited. (The code +# automatically adds in the 'inherited from..' part +# of the string when doing the check. +# +# This field is for informational purposes only, to +# aid the user in seeing how the changes trickle down +# the data hierarchy. +# +# +# - the expected value of the 'source' field after the +# has been executed on the . +# As above can be 'default', 'local', or the dataset +# from which the property is inherited. +# +# Two important things to note: +# 1) there must be a line corresponding to each dataset +# line specified in the configX.cfg file. +# +# +# 2) There can be as many / blocks as desired, but +# there must be at least one, and the effect of each block is cumulative +# (i.e. the properties are not reset back to their default values between +# each block. If that is desired then each block must be placed in its +# own state file with its own corresponding configX.cfg file). +# +# +# Below are two sample / blocks. +# +# The first simply verifies that the properties on the top level dataset +# were set locally, and that the middle and bottom datasets properties +# were inherited from the top level pool (called TESTPOOL). Note the '-:-' +# which means that no command is to be executed, but simply that the +# properties settings are to be verified. +# +-:- +# +local local +TESTPOOL TESTPOOL +TESTPOOL TESTPOOL +# +# +# The block below describes the expected state of the properties after +# an 'inherit -r' command has been run on the top level pool (called +# TESTPOOL). +# +TESTPOOL:inherit -r +# +local default +TESTPOOL default +TESTPOOL default diff --git a/tests/sys/cddl/zfs/tests/inheritance/cleanup.ksh b/tests/sys/cddl/zfs/tests/inheritance/cleanup.ksh new file mode 100644 index 00000000000..26ce7c30a0b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/inheritance/config001.cfg b/tests/sys/cddl/zfs/tests/inheritance/config001.cfg new file mode 100644 index 00000000000..fdb07fa9731 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config001.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config001.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR - +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config002.cfg b/tests/sys/cddl/zfs/tests/inheritance/config002.cfg new file mode 100644 index 00000000000..8bb083a5924 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config002.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config002.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config003.cfg b/tests/sys/cddl/zfs/tests/inheritance/config003.cfg new file mode 100644 index 00000000000..631ea9a5741 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config003.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config003.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR default +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config004.cfg b/tests/sys/cddl/zfs/tests/inheritance/config004.cfg new file mode 100644 index 00000000000..841fa70f256 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config004.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config004.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config005.cfg b/tests/sys/cddl/zfs/tests/inheritance/config005.cfg new file mode 100644 index 00000000000..b06debe943b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config005.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config005.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config006.cfg b/tests/sys/cddl/zfs/tests/inheritance/config006.cfg new file mode 100644 index 00000000000..dcd87f912ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config006.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config006.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR - +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config007.cfg b/tests/sys/cddl/zfs/tests/inheritance/config007.cfg new file mode 100644 index 00000000000..0ea0f849a4b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config007.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config007.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config008.cfg b/tests/sys/cddl/zfs/tests/inheritance/config008.cfg new file mode 100644 index 00000000000..6e9e866777e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config008.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config008.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR default +testpool.inherit/TESTCTR/TESTFS1 FS default diff --git a/tests/sys/cddl/zfs/tests/inheritance/config009.cfg b/tests/sys/cddl/zfs/tests/inheritance/config009.cfg new file mode 100644 index 00000000000..092f79b973e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config009.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config009.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR default +testpool.inherit/TESTCTR/TESTFS1 FS default diff --git a/tests/sys/cddl/zfs/tests/inheritance/config010.cfg b/tests/sys/cddl/zfs/tests/inheritance/config010.cfg new file mode 100644 index 00000000000..8090b6ba7f3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config010.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config010.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR default +testpool.inherit/TESTCTR/TESTFS1 FS default diff --git a/tests/sys/cddl/zfs/tests/inheritance/config011.cfg b/tests/sys/cddl/zfs/tests/inheritance/config011.cfg new file mode 100644 index 00000000000..09187d2614c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config011.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config011.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR default +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config012.cfg b/tests/sys/cddl/zfs/tests/inheritance/config012.cfg new file mode 100644 index 00000000000..8a35c96e125 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config012.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config012.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR default +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config013.cfg b/tests/sys/cddl/zfs/tests/inheritance/config013.cfg new file mode 100644 index 00000000000..41dc8b357b4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config013.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config013.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config014.cfg b/tests/sys/cddl/zfs/tests/inheritance/config014.cfg new file mode 100644 index 00000000000..b3f8739e670 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config014.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config014.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config015.cfg b/tests/sys/cddl/zfs/tests/inheritance/config015.cfg new file mode 100644 index 00000000000..51709ab3323 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config015.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config015.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config016.cfg b/tests/sys/cddl/zfs/tests/inheritance/config016.cfg new file mode 100644 index 00000000000..6b7106c58cc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config016.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config016.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL default +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config017.cfg b/tests/sys/cddl/zfs/tests/inheritance/config017.cfg new file mode 100644 index 00000000000..8623bddcbd4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config017.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config017.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config018.cfg b/tests/sys/cddl/zfs/tests/inheritance/config018.cfg new file mode 100644 index 00000000000..6d7aca4d67d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config018.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config018.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config019.cfg b/tests/sys/cddl/zfs/tests/inheritance/config019.cfg new file mode 100644 index 00000000000..f34d2935590 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config019.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config019.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR - +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config020.cfg b/tests/sys/cddl/zfs/tests/inheritance/config020.cfg new file mode 100644 index 00000000000..da4abdbceec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config020.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config020.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR - +testpool.inherit/TESTCTR/TESTFS1 FS - diff --git a/tests/sys/cddl/zfs/tests/inheritance/config021.cfg b/tests/sys/cddl/zfs/tests/inheritance/config021.cfg new file mode 100644 index 00000000000..dbaca99ee12 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config021.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config021.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR - +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config022.cfg b/tests/sys/cddl/zfs/tests/inheritance/config022.cfg new file mode 100644 index 00000000000..b4b71e2f656 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config022.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config022.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR - +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config023.cfg b/tests/sys/cddl/zfs/tests/inheritance/config023.cfg new file mode 100644 index 00000000000..de6a05a0311 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config023.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config023.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/config024.cfg b/tests/sys/cddl/zfs/tests/inheritance/config024.cfg new file mode 100644 index 00000000000..f1e0b0e846a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/config024.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)config024.cfg 1.2 07/01/09 SMI" +# +testpool.inherit POOL local +testpool.inherit/TESTCTR CTR local +testpool.inherit/TESTCTR/TESTFS1 FS local diff --git a/tests/sys/cddl/zfs/tests/inheritance/inherit.cfg b/tests/sys/cddl/zfs/tests/inheritance/inherit.cfg new file mode 100644 index 00000000000..a485e69fb82 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/inherit.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)inherit.cfg 1.3 08/08/15 SMI" +# + +export ZFSROOT= +export STF_TIMEOUT=2800 diff --git a/tests/sys/cddl/zfs/tests/inheritance/inherit.kshlib b/tests/sys/cddl/zfs/tests/inheritance/inherit.kshlib new file mode 100644 index 00000000000..5a3ce922739 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/inherit.kshlib @@ -0,0 +1,115 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)inherit.kshlib 1.3 09/05/19 SMI" +# + +# +# Simple function to get the source of the specified property. +# If unable to get the property then exits. +# +function get_prop_src # property dataset +{ + typeset prop_val + typeset prop=$1 + typeset dataset=$2 + + prop_val=`$ZFS get -H -o source $prop $dataset` + + if [[ $? -ne 0 ]]; then + log_fail "Unable to determine the source of $prop " \ + "property for dataset $dataset" + else + print $prop_val + fi +} + +# +# Function to check the 'source' of a property. The source can +# either be "default", "local", or "inherited from ". +# +# The 'expected src' argument must be either "default", "local", or +# a dataset name. +# +# Returns 0 on success, 1 on failure. +# +function verify_prop_src # child_dataset property expected_src +{ + typeset target=$1 + typeset prop=$2 + typeset expected=$3 + + prop_src=`get_prop_src $prop $target` + + # + # Rather than just checking if $prop_src == $expected + # we first determine what value $expected should have. + # This allows us to catch the case where a property + # has a source of "local" but we expected it to be + # "default" + # + if [[ $expected == "default" ]]; then + if [[ $prop_src != $expected ]]; then + log_note "Property $prop of $target has source"\ + " $prop_src rather than $expected" + return 1 + fi + elif [[ $expected == "local" ]]; then + if [[ $prop_src != $expected ]]; then + log_note "Property $prop of $target has source"\ + " $prop_src rather than $expected" + return 1 + fi + elif [[ $prop_src != "inherited from $expected" ]]; then + log_note "Property $prop of $expected has source $prop_src"\ + " rather than 'inherited from $expected'" + return 1 + fi + + return 0 +} + +# +# Simple function to set a property to a +# specified value and verify it has changed +# correctly. +# +function set_n_verify_prop #property value dataset +{ + typeset prop=$1 + typeset prop_val=$2 + typeset dataset=$3 + + $ZFS set $prop=$prop_val $dataset + check_val=`get_prop $prop $dataset` + + if [[ $check_val != $prop_val ]]; then + log_fail "Property $prop of $dataset has value $check_val"\ + " rather than $prop_val" + fi +} diff --git a/tests/sys/cddl/zfs/tests/inheritance/inherit_001_pos.ksh b/tests/sys/cddl/zfs/tests/inheritance/inherit_001_pos.ksh new file mode 100644 index 00000000000..8f965d40c49 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/inherit_001_pos.ksh @@ -0,0 +1,440 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)inherit_001_pos.ksh 1.5 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/inheritance/inherit.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: inherit_001_pos +# +# DESCRIPTION: +# Test that properties are correctly inherited using 'zfs set', +# 'zfs inherit' and 'zfs inherit -r'. +# +# STRATEGY: +# 1) Read a configX.cfg file and create the specified datasets +# 2) Read a stateX.cfg file and execute the commands within it +# and verify that the properties have the correct values +# 3) Repeat steps 1-2 for each configX and stateX files found. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Test properties are inherited correctly" + +# +# Simple function to create specified datasets. +# +function create_dataset #name type disks +{ + typeset dataset=$1 + typeset type=$2 + typeset disks=$3 + + if [[ $type == "POOL" ]]; then + create_pool "$dataset" "$disks" + elif [[ $type == "CTR" ]]; then + log_must $ZFS create $dataset + log_must $ZFS set canmount=off $dataset + elif [[ $type == "FS" ]]; then + log_must $ZFS create $dataset + else + log_fail "ERROR: Unrecognised type $type" + fi + + list="$list $dataset" +} + +# +# Function to walk through all the properties in a +# dataset, setting them to a 'local' value if required. +# +function init_props #dataset init_code +{ + typeset dataset=$1 + typeset init_code=$2 + typeset new_val + typeset -i i=0 + + # + # Though the effect of '-' and 'default' is the same we + # call them out via a log_note to aid in debugging the + # config files + # + if [[ $init_code == "-" ]]; then + log_note "Leaving properties for $dataset unchanged." + [[ $def_recordsize == 0 ]] && \ + update_recordsize $dataset $init_code + return; + elif [[ $init_code == "default" ]]; then + log_note "Leaving properties for $dataset at default values." + [[ $def_recordsize == 0 ]] && \ + update_recordsize $dataset $init_code + return; + elif [[ $init_code == "local" ]]; then + log_note "Setting properties for $dataset to local values." + for (( ; i < ${#props[*]}; i += 2 )); do + if [[ ${props[i]} == "recordsize" ]]; then + update_recordsize $dataset $init_code + else + set_n_verify_prop ${props[i]} \ + ${local_val[((i/2))]} $dataset + fi + done + else + log_fail "ERROR: Unrecognised init code $init_code" + fi +} + +# +# We enter this function either to update the recordsize value +# in the default array, or to update the local value array. +# +function update_recordsize { #dataset init_code + typeset dataset=$1 + typeset init_code=$2 + typeset idx=0 + typeset record_val + + # + # First need to find where the recordsize property is + # located in the arrays + # + for (( ; idx < ${#props[*]}; idx += 2 )); do + [[ ${props[idx]} == "recordsize" ]] && \ + break + done + + (( idx = idx / 2 )) + record_val=`get_prop recordsize $dataset` + if [[ $init_code == "-" || \ + $init_code == "default" ]]; then + + def_val[idx]=$record_val + def_recordsize=1 + + elif [[ $init_code == "local" ]]; then + + log_must $ZFS set recordsize=$record_val $dataset + + local_val[idx]=$record_val + fi +} + +# +# The mountpoint property is slightly different from other properties and +# so is handled here. For all other properties if they are set to a specific +# value at a higher level in the data hierarchy (i.e. checksum=on) then that +# value propogates down the hierarchy unchanged, with the source field being +# set to 'inherited from '. +# +# The mountpoint property is different in that while the value propogates +# down the hierarchy, the value at each level is determined by a combination +# of the top-level value and the current level in the hierarchy. +# +# For example consider the case where we have a pool (called pool1), containing +# a dataset (ctr) which in turn contains a filesystem (fs). If we set the +# mountpoint of the pool to '/mnt2' then the mountpoints for the dataset and +# filesystem are '/mnt2/ctr' and /mnt2/ctr/fs' respectively, with the 'source' +# field being set to 'inherited from pool1'. +# +# So at the filesystem level to calculate what our mountpoint property should +# be set to we walk back up the hierarchy sampling the mountpoint property at +# each level and forming up the expected mountpoint value piece by piece until +# we reach the level specified in the 'source' field, which in this example is +# the top-level pool. +# +function get_mntpt_val #dataset src index +{ + typeset dataset=$1 + typeset src=$2 + typeset idx=$3 + typeset new_path="" + typeset dset + typeset mntpt="" + + if [[ $src == "local" ]]; then + mntpt=${local_val[idx]} + elif [[ $src == "default" ]]; then + mntpt="$ZFSROOT/"$dataset + else + # Walk back up the hierarchy building up the + # expected mountpoint property value. + obj_name=${dataset##*/} + + while [[ $src != $dataset ]]; do + dset=${dataset%/*} + + mnt_val=`get_prop mountpoint $dset` + + mod_prop_val=${mnt_val##*/} + new_path="/"$mod_prop_val$new_path + dataset=$dset + done + + mntpt=$new_path"/"$obj_name + fi + print $mntpt +} + +# +# Simple function to verify that a property has the +# expected value. +# +function verify_prop_val #property dataset src index +{ + typeset dataset=$1 + typeset prop=$2 + typeset src=$3 + typeset idx=$4 + typeset new_path="" + typeset dset + typeset exp_val + typeset prop_val + + prop_val=`get_prop $prop $dataset` + + # mountpoint property is handled as a special case + if [[ $prop == "mountpoint" ]]; then + exp_val=`get_mntpt_val $dataset $src $idx` + else + if [[ $src == "local" ]]; then + exp_val=${local_val[idx]} + elif [[ $src == "default" ]]; then + exp_val=${def_val[idx]} + else + # + # We are inheriting the value from somewhere + # up the hierarchy. + # + exp_val=`get_prop $prop $src` + fi + fi + + [ "$prop_val" = "$exp_val" ] && return + + # After putback PSARC/2008/231 Apr,09,2008, the default value of + # aclinherit has changed to be 'restricted' instead of 'secure', + # but the old interface of 'secure' still exist + [ "$prop" = "aclinherit" ] && return + [ "$exp_val" = "secure" ] && return + [ "$prop_val" = "restricted" ] && return + + log_fail "ERROR: Property $prop (source $src index $idx) for $dataset" \ + "was [$prop_val]; expected [$exp_val]" +} + +# +# Function to read the configX.cfg files and create the specified +# dataset hierarchy +# +function scan_config #config-file +{ + typeset config_file=$1 + + DISK=${DISKS%% *} + + list="" + + grep "^[^#]" $config_file | { + while read name type init ; do + create_dataset $name $type $DISK + init_props $name $init + done + } +} + +function check_state +{ + typeset i=$1 + typeset j=$2 + typeset op=$3 + typeset target=$4 + + # + # The user can if they wish specify that no operation be performed + # (by specifying '-' rather than a command). This is not as + # useless as it sounds as it allows us to verify that the dataset + # hierarchy has been set up correctly as specified in the + # configX.cfg file (which includes 'set'ting properties at a higher + # level and checking that they propogate down to the lower levels. + # + # Note in a few places here, we use log_onfail, rather than + # log_must - this substantially reduces journal output. + # + if [[ $op != "-" ]]; then + # Unmount the test datasets if they are still mounted. + # Most often, they won't be, so discard the output + unmount_all_safe > /dev/null 2>&1 + + for p in ${props[i]} ${props[((i+1))]}; do + log_onfail $ZFS $op $p $target + done + fi + for check_obj in $list; do + read init_src final_src + + for p in ${props[i]} ${props[((i+1))]}; do + verify_args="$check_obj $p $final_src" + + log_onfail verify_prop_src $check_obj $p $final_src + log_onfail verify_prop_val $check_obj $p $final_src $j + done + done +} + +# +# Main function. Executes the commands specified in the stateX.cfg +# files and then verifies that all the properties have the correct +# values and 'source' fields. +# +function scan_state #state-file +{ + typeset state_file=$1 + typeset -i i=0 + typeset -i j=0 + + log_note "Reading state from $state_file" + for (( ; i < ${#props[*]}; i += 2, j += 1 )); do + grep "^[^#]" $state_file | { + while IFS=: read target op; do + check_state $i $j "$op" "$target" + done + } + done +} + + +set -A props "checksum" "" \ + "compression" "compress" \ + "atime" "" \ + "exec" "" \ + "setuid" "" \ + "sharenfs" "" \ + "recordsize" "recsize" \ + "mountpoint" "" \ + "snapdir" "" \ + "aclmode" "" \ + "aclinherit" "" \ + "readonly" "rdonly" + +# +# Note except for the mountpoint default value (which is handled in +# the routine itself), each property specified in the 'props' array +# above must have a corresponding entry in the two arrays below. +# +set -A def_val "on" \ + "off" \ + "on" \ + "on" \ + "on" \ + "off" \ + "" \ + "" \ + "hidden" \ + "discard" \ + "secure" \ + "off" + +set -A local_val "off" "on" "off" "off" \ + "off" "on" "" \ + "$TESTDIR" "visible" "groupmask" "discard" \ + "off" + +log_must $ZPOOL create $TESTPOOL ${DISKS%% *} + +# Append the "shareiscsi" property if it is supported +$ZFS get shareiscsi $TESTPOOL > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + typeset -i i=${#props[*]} + props[i]="shareiscsi" + props[((i+1))]="" + def_val[((i/2))]="off" + local_val[((i/2))]="on" +fi + +# Append the "devices" property if it is settable +$ZFS set devices=off $TESTPOOL +if [[ $? -eq 0 ]]; then + typeset -i i=${#props[*]} + props[i]="devices" + props[((i+1))]="" + def_val[((i/2))]="on" + local_val[((i/2))]="off" +else + log_note "Setting devices=off is not supported on this system" +fi + +log_must $ZPOOL destroy $TESTPOOL + +# +# Global flag indicating whether the default record size had been +# read. +# +typeset def_recordsize=0 + +TDIR=$STF_SUITE/tests/inheritance +set -A config_files $(ls $TDIR/config*[1-9]*.cfg) +set -A state_files $(ls $TDIR/state*.cfg) + +# +# Global list of datasets created. +# +list="" + +if [[ ${#config_files[*]} != ${#state_files[*]} ]]; then + log_fail "ERROR: Must have the same number of config files"\ + "(${#config_files[*]}) and state files ${#state_files[*]}" +fi + +typeset -i fnum=0 +for (( ; fnum < ${#config_files[*]}; fnum += 1 )); do + default_cleanup_noexit + def_recordsize=0 + + log_note "*** Testing configuration ${config_files[fnum]}" + scan_config ${config_files[fnum]} + scan_state ${state_files[fnum]} +done + +log_pass "Properties correctly inherited as expected" diff --git a/tests/sys/cddl/zfs/tests/inheritance/inheritance_test.sh b/tests/sys/cddl/zfs/tests/inheritance/inheritance_test.sh new file mode 100755 index 00000000000..6a0ccbc29df --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/inheritance_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case inherit_001_pos cleanup +inherit_001_pos_head() +{ + atf_set "descr" "Test properties are inherited correctly" + atf_set "timeout" 1800 + atf_set "require.progs" zfs +} +inherit_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/inherit.kshlib + . $(atf_get_srcdir)/inherit.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/inherit_001_pos.ksh || atf_fail "Testcase failed" +} +inherit_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case inherit_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/inheritance/state001.cfg b/tests/sys/cddl/zfs/tests/inheritance/state001.cfg new file mode 100644 index 00000000000..660090ea024 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state001.cfg @@ -0,0 +1,44 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state001.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# No command is actually run (hence '-:-') but rather this state file is +# used to verify that the property that was set on the top level pool +# via the 'local' keyword (in the config1.cfg file) has correctly +# propogated down the hierarchy. +# +# *** ASSERTION DESCRIPTION *** +# +-:- +# +local local +testpool.inherit testpool.inherit +testpool.inherit testpool.inherit diff --git a/tests/sys/cddl/zfs/tests/inheritance/state002.cfg b/tests/sys/cddl/zfs/tests/inheritance/state002.cfg new file mode 100644 index 00000000000..e634e6e99ce --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state002.cfg @@ -0,0 +1,45 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state002.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# No command is actually run (hence '-:-') but rather this state file is +# used to verify that the property that was set on the middle level +# dataset via the 'local' keyword (in the configX.cfg file) has +# correctly propogated down the hierarchy to the filesystem underneath, +# while leaving the top level pools properties unchanged. +# +# *** ASSERTION DESCRIPTION *** +# +-:- +# +default default +local local +testpool.inherit/TESTCTR testpool.inherit/TESTCTR diff --git a/tests/sys/cddl/zfs/tests/inheritance/state003.cfg b/tests/sys/cddl/zfs/tests/inheritance/state003.cfg new file mode 100644 index 00000000000..e29ccf9d3fd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state003.cfg @@ -0,0 +1,43 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state003.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# No command is actually run (hence '-:-') but rather this state file is +# used to verify that setting the filesystem's properties does not affect +# the properties of datasets above it in the hierarchy. +# +# *** ASSERTION DESCRIPTION *** +# +-:- +# +default default +default default +local local diff --git a/tests/sys/cddl/zfs/tests/inheritance/state004.cfg b/tests/sys/cddl/zfs/tests/inheritance/state004.cfg new file mode 100644 index 00000000000..0b41f76d165 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state004.cfg @@ -0,0 +1,44 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state004.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# No command is actually run (hence '-:-') but rather this state file is +# used to verify that setting a property on a middle level dataset does +# not prevent us from setting a property on the bottom level filesystem, +# and that neither affects the top level pools properties. +# +# *** ASSERTION DESCRIPTION *** +# +-:- +# +default default +local local +local local diff --git a/tests/sys/cddl/zfs/tests/inheritance/state005.cfg b/tests/sys/cddl/zfs/tests/inheritance/state005.cfg new file mode 100644 index 00000000000..162da273d40 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state005.cfg @@ -0,0 +1,45 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state005.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# No command is actually run (hence '-:-') but rather this state file is +# used to verify that when we set a property on a top level pool, followed +# by a middle level dataset, that the bottom level filesystem inherits +# the property from the middle level dataset, and not from the top level +# pool. +# +# *** ASSERTION DESCRIPTION *** +# +-:- +# +local local +local local +testpool.inherit/TESTCTR testpool.inherit/TESTCTR diff --git a/tests/sys/cddl/zfs/tests/inheritance/state006.cfg b/tests/sys/cddl/zfs/tests/inheritance/state006.cfg new file mode 100644 index 00000000000..21cb96a567b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state006.cfg @@ -0,0 +1,47 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state006.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# No command is actually run (hence '-:-') but rather this state file is +# used to verify that when we set a property on a top level pool, followed +# by a bottom level filesystem, that the middle level dataset inherits +# the property from the top level pool, and not from the bottom level +# filesystem. +# +# *** ASSERTION DESCRIPTION *** +# +-:- +# +# +# +local local +testpool.inherit testpool.inherit +local local diff --git a/tests/sys/cddl/zfs/tests/inheritance/state007.cfg b/tests/sys/cddl/zfs/tests/inheritance/state007.cfg new file mode 100644 index 00000000000..fb93d7c3d9d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state007.cfg @@ -0,0 +1,45 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state007.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# No command is actually run (hence '-:-') but rather this state file is +# used to verify that when we can set properties on each level of the +# hierarchy independently. +# +# *** ASSERTION DESCRIPTION *** +# +-:- +# +# +# +local local +local local +local local diff --git a/tests/sys/cddl/zfs/tests/inheritance/state008.cfg b/tests/sys/cddl/zfs/tests/inheritance/state008.cfg new file mode 100644 index 00000000000..c3ebd9b4afd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state008.cfg @@ -0,0 +1,44 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state008.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# No command is actually run (hence '-:-') but rather this state file is +# used to verify that when we create a dataset hierarchy that the +# properties of each dataset have their default values. +# +# *** ASSERTION DESCRIPTION *** +# +-:- +# +# +default default +default default +default default diff --git a/tests/sys/cddl/zfs/tests/inheritance/state009.cfg b/tests/sys/cddl/zfs/tests/inheritance/state009.cfg new file mode 100644 index 00000000000..6c4e323c2c1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state009.cfg @@ -0,0 +1,57 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state009.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit' at different levels of a +# data hierarchy where the properties of each dataset have their +# default values leaves the values unchanged. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit +# +default default +default default +default default +# +testpool.inherit/TESTCTR:inherit +# +default default +default default +default default +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state010.cfg b/tests/sys/cddl/zfs/tests/inheritance/state010.cfg new file mode 100644 index 00000000000..83f563cf184 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state010.cfg @@ -0,0 +1,56 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state010.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit -r' at different levels of a +# data hierarchy where the properties of each dataset have their +# default values leaves the values unchanged. +# +# *** ASSERTION DESCRIPTION *** +# +testpool.inherit:inherit -r +# +default default +default default +default default +# +testpool.inherit/TESTCTR:inherit -r +# +default default +default default +default default +# +testpool.inherit/TESTCTR/TESTFS1:inherit -r +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state011.cfg b/tests/sys/cddl/zfs/tests/inheritance/state011.cfg new file mode 100644 index 00000000000..b53a9ab7d33 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state011.cfg @@ -0,0 +1,58 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state011.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that running 'zfs inherit' at each level of the data hierarchy +# when the bottom filesystem level properties have been set locally has +# no effect except at the bottom level where the property values are +# inherited from the middle level dataset. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit +# +default default +default default +local local +# +testpool.inherit/TESTCTR:inherit +# +default default +default default +local local +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +local default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state012.cfg b/tests/sys/cddl/zfs/tests/inheritance/state012.cfg new file mode 100644 index 00000000000..1bbde3a5c5a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state012.cfg @@ -0,0 +1,62 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state012.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that running 'zfs inherit -r' at each level of the data hierarchy +# when the bottom filesystem level properties have been set locally results +# in the top level property values being propogated down the data +# hierarchy. +# +# Executing inherit -r at the middle level and bottom levels after +# running it at the top level is somewhat redundant as the top level value +# should propogate down the entire data hierarchy. Done for completeness +# sake. +# +# *** ASSERTION DESCRIPTION *** +# +testpool.inherit:inherit -r +# +default default +default default +local default +# +testpool.inherit/TESTCTR:inherit -r +# +default default +default default +default default +# +testpool.inherit/TESTCTR/TESTFS1:inherit -r +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state013.cfg b/tests/sys/cddl/zfs/tests/inheritance/state013.cfg new file mode 100644 index 00000000000..c0e6cc9185e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state013.cfg @@ -0,0 +1,56 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state013.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit' on each level when the middle +# and bottom levels properties are set locally results in the middle and +# bottom levels inheriting values from the next level up in the hierarchy. +# +# *** ASSERTION DESCRIPTION *** +# +testpool.inherit:inherit +# +default default +local local +local local +# +testpool.inherit/TESTCTR:inherit +# +default default +local default +local local +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +local default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state014.cfg b/tests/sys/cddl/zfs/tests/inheritance/state014.cfg new file mode 100644 index 00000000000..4569a560e7d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state014.cfg @@ -0,0 +1,62 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state014.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that running 'zfs inherit -r' at each level of the data hierarchy +# when the bottom and middle level properties have been set locally results +# in the top level property values being propogated down the data +# hierarchy. +# +# Note : executing inherit -r at the middle level and bottom levels after +# running it at the top level is somewhat redundant as the top level value +# should propogate down the entire data hierarchy. Done for completeness +# sake. +# +# *** ASSERTION DESCRIPTION *** +# +testpool.inherit:inherit -r +# +default default +local default +local default +# +testpool.inherit/TESTCTR:inherit -r +# +default default +default default +default default +# +testpool.inherit/TESTCTR/TESTFS1:inherit -r +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state015.cfg b/tests/sys/cddl/zfs/tests/inheritance/state015.cfg new file mode 100644 index 00000000000..d94aeb2a203 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state015.cfg @@ -0,0 +1,66 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state015.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit' at the top level in the hierarchy +# when the middle level properties are set locally, and the bottom +# level has inherited its value from the middle level, results in no change +# to the top level properties. +# +# Executing 'zfs inherit' at the middle level results in the middle level +# inheriting its value from the top level, and passing the values down to +# the bottom level. +# +# Executing 'zfs inherit' at the bottom level is somewhat redundant but +# is done for completness sake. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit +# +default default +local local +testpool.inherit/TESTCTR testpool.inherit/TESTCTR +# +# +testpool.inherit/TESTCTR:inherit +# +default default +local default +testpool.inherit/TESTCTR default +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +default default diff --git a/tests/sys/cddl/zfs/tests/inheritance/state016.cfg b/tests/sys/cddl/zfs/tests/inheritance/state016.cfg new file mode 100644 index 00000000000..8316c35f936 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state016.cfg @@ -0,0 +1,62 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state016.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit -r' at the top level in the hierarchy +# when the middle level properties are set locally, and the bottom +# level has inherited its value from the middle level, results in no change +# to the top level properties and the middle and bottom properties changing +# to the top level (default) values. +# +# Executing 'zfs inherit -r' at the bottom and middle levels after executing +# at the top level is somewhat redundant but ss done for completness sake. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit -r +# +default default +local default +testpool.inherit default +# +testpool.inherit/TESTCTR:inherit -r +# +default default +default default +default default +# +testpool.inherit/TESTCTR/TESTFS1:inherit -r +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state017.cfg b/tests/sys/cddl/zfs/tests/inheritance/state017.cfg new file mode 100644 index 00000000000..4ca6d89d6c0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state017.cfg @@ -0,0 +1,67 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state017.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit' at the top level in the hierarchy +# when the top level and middle level datasets properties are set locally, +# and the bottom level has inherited its properties from the middle +# level, results in the top level properties reverting back to their +# default values. +# +# Executing 'zfs inherit' at the middle level results in the middle level +# inheriting its value from the top level (which is now default), and passing +# the values down to the bottom level. +# +# Executing 'zfs inherit' at the bottom level is somewhat redundant but +# is done for completness sake. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit +# +local default +local local +testpool.inherit/TESTCTR testpool.inherit/TESTCTR +# +# +testpool.inherit/TESTCTR:inherit +# +default default +local default +testpool.inherit/TESTCTR default +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +default default diff --git a/tests/sys/cddl/zfs/tests/inheritance/state018.cfg b/tests/sys/cddl/zfs/tests/inheritance/state018.cfg new file mode 100644 index 00000000000..01692795179 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state018.cfg @@ -0,0 +1,64 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state018.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit -r' at the top level in the hierarchy +# when the top level and middle level datasets properties are set locally, +# and the bottom level has inherited its properties from the middle +# level, results in the top level properties reverting back to their +# default values and being propogated down to the other datasets in the +# hierarchy. +# +# Executing 'zfs inherit -r' at the middle and bottom levels after executing +# it at the top level is somewhat redundant but is done for completness sake. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit -r +# +local default +local default +testpool.inherit/TESTCTR default +# +# +testpool.inherit/TESTCTR:inherit -r +# +default default +default default +default default +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +default default diff --git a/tests/sys/cddl/zfs/tests/inheritance/state019.cfg b/tests/sys/cddl/zfs/tests/inheritance/state019.cfg new file mode 100644 index 00000000000..aa2f61acc4f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state019.cfg @@ -0,0 +1,63 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state019.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit' at the top level in the hierarchy +# when the top level properties are set locally and the middle and bottom +# datasets have inherited from the top level, results in the top level +# properties reverting back to their default values, the middle and bottom +# levels inheriting the changed values. +# +# Executing 'zfs inherit' at the middle and bottom levels is somewhat +# redundant but is done for completness sake. +# +# *** ASSERTION DESCRIPTION *** +# +testpool.inherit:inherit +# +local default +testpool.inherit default +testpool.inherit default +# +# +testpool.inherit/TESTCTR:inherit +# +default default +default default +default default +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state020.cfg b/tests/sys/cddl/zfs/tests/inheritance/state020.cfg new file mode 100644 index 00000000000..fc0111f12a8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state020.cfg @@ -0,0 +1,64 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state020.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit -r' at the top level in the hierarchy +# when the top level properties are set locally and the middle and bottom +# datasets have inherited from the top level, results in the top level +# properties reverting back to their default values, the middle and bottom +# levels inheriting the changed values. +# +# Executing 'zfs inherit -r' at the middle and bottom levels is somewhat +# redundant but is done for completness sake. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit -r +# +local default +testpool.inherit default +testpool.inherit default +# +# +testpool.inherit/TESTCTR:inherit -r +# +default default +default default +default default +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit -r +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state021.cfg b/tests/sys/cddl/zfs/tests/inheritance/state021.cfg new file mode 100644 index 00000000000..55561af544a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state021.cfg @@ -0,0 +1,64 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state021.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit' at the top level in the hierarchy +# when the top level and bottom level properties are set locally and the +# middle dataset has inherited from the top level, results in the top level +# properties reverting back to their default values, and the middle level +# inheriting the new top level value. +# +# Executing 'zfs inherit' at the bottom level results in it inheriting +# the middle level values. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit +# +local default +testpool.inherit default +local local +# +# +testpool.inherit/TESTCTR:inherit +# +default default +default default +local local +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +local default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state022.cfg b/tests/sys/cddl/zfs/tests/inheritance/state022.cfg new file mode 100644 index 00000000000..b16976ca3a8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state022.cfg @@ -0,0 +1,63 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state022.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit -r' at the top level in the hierarchy +# when the top level and bottom level properties are set locally and the +# middle dataset has inherited from the top level, results in the top level +# properties reverting back to their default values, the middle and bottom +# levels inheriting the changed values. +# +# Executing 'zfs inherit -r' at the middle and bottom levels is somewhat +# redundant but is done for completness sake. +# +# *** ASSERTION DESCRIPTION *** +# +testpool.inherit:inherit -r +# +local default +testpool.inherit default +local default +# +# +testpool.inherit/TESTCTR:inherit -r +# +default default +default default +default default +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit -r +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state023.cfg b/tests/sys/cddl/zfs/tests/inheritance/state023.cfg new file mode 100644 index 00000000000..85ac3f8a870 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state023.cfg @@ -0,0 +1,65 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state023.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit' at the top level in the hierarchy +# when each levels properties are set locally, results in the top level +# properties reverting back to their default values. +# +# Executing 'zfs inherit' at the middle level results in it inheriting +# the top levels (now default) values +# +# Executing 'zfs inherit' at the bottom level results in it inheriting +# the middle levels (now default) values +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit +# +local default +local local +local local +# +# +testpool.inherit/TESTCTR:inherit +# +default default +local default +local local +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +local default +# diff --git a/tests/sys/cddl/zfs/tests/inheritance/state024.cfg b/tests/sys/cddl/zfs/tests/inheritance/state024.cfg new file mode 100644 index 00000000000..ce46e1ec34f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inheritance/state024.cfg @@ -0,0 +1,63 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)state024.cfg 1.2 07/01/09 SMI" +# +# *** ASSERTION DESCRIPTION *** +# +# Verify that executing 'zfs inherit -r' at the top level in the hierarchy +# when each levels properties are set locally, results in the top level +# properties reverting back to their default values, and the changed +# values being propogated down the hierarchy. +# +# Executing 'zfs inherit -r' at the middle and bottom levels after doing so +# at the top level is somewhat redundant but is done for completeness. +# +# *** ASSERTION DESCRIPTION *** +# +# +testpool.inherit:inherit -r +# +local default +local default +local default +# +# +testpool.inherit/TESTCTR:inherit +# +default default +default default +default default +# +# +testpool.inherit/TESTCTR/TESTFS1:inherit +# +default default +default default +default default +# diff --git a/tests/sys/cddl/zfs/tests/interop/Makefile b/tests/sys/cddl/zfs/tests/interop/Makefile new file mode 100644 index 00000000000..40ca9683a83 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/interop/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/interop +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= interop_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= interop_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= interop.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/interop/cleanup.ksh b/tests/sys/cddl/zfs/tests/interop/cleanup.ksh new file mode 100644 index 00000000000..64337c28743 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/interop/cleanup.ksh @@ -0,0 +1,72 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +ismounted $TESTPOOL/$TESTFS +(( $? == 0 )) && log_must $ZFS umount -f $TESTDIR +destroy_pool $TESTPOOL + +$METASTAT $META_DEVICE_ID > /dev/null 2>&1 +if (( $? == 0 )); then + log_note "Clearing meta device ($META_DEVICE_ID)" + $METACLEAR -f $META_DEVICE_ID > /dev/null 2>&1 +fi + +typeset metadb="" +typeset i="" + +metadb=`$METADB | $CUT -f6 | $GREP dev | $UNIQ` +for i in $metadb; do + log_note "Clearing meta db ($i)" + $METADB -fd $i > /dev/null 2>&1 +done + +# recreate and destroy a zpool over the disks to restore the partitions to +# normal +case $DISK_COUNT in +0) + log_note "No disk devices to restore" + ;; +1) + log_must cleanup_devices $ZFS_DISK2 + ;; +2) + log_must cleanup_devices $META_DISK0 $ZFS_DISK2 + ;; +*) + log_must cleanup_devices $META_DISK0 $META_DISK1 $ZFS_DISK2 + ;; +esac + +log_pass "Cleanup has been successful" diff --git a/tests/sys/cddl/zfs/tests/interop/interop.cfg b/tests/sys/cddl/zfs/tests/interop/interop.cfg new file mode 100644 index 00000000000..4886c41de16 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/interop/interop.cfg @@ -0,0 +1,82 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)interop.cfg 1.3 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +set -A disk_array $(find_disks $DISKS) +case "${#disk_array[*]}" in +0) + DISK_COUNT=0 + ;; +1) + # We need to repartition the single disk to two slices + DISK_COUNT=1 + META_DISK0=${disk_array[0]} + SINGLE_DISK=$META_DISK0 + META_DISK1=$META_DISK0 + ZFS_DISK2=$META_DISK0 + META_SIDE0=${SINGLE_DISK}s0 + META_SIDE1=${SINGLE_DISK}s1 + ZFS_SIDE2=${SINGLE_DISK}s3 + ;; +2) + # We need to repartition the single disk to two slices and allocate + # the 2nd disk to ZFS + DISK_COUNT=2 + META_DISK0=${disk_array[0]} + SINGLE_DISK=$META_DISK0 + META_DISK1=$META_DISK0 + ZFS_DISK2=${disk_array[1]} + META_SIDE0=${SINGLE_DISK}s0 + META_SIDE1=${SINGLE_DISK}s1 + ZFS_SIDE2=${ZFS_DISK2}s0 + ;; +*) + # In this case there are at least enough disks to use. + DISK_COUNT=3 + META_DISK0=${disk_array[0]} + META_DISK1=${disk_array[1]} + ZFS_DISK2=${disk_array[2]} + META_SIDE0=${META_DISK0}s0 + META_SIDE1=${META_DISK1}s0 + ZFS_SIDE2=${ZFS_DISK2}s0 + ;; +esac + +export DISK_COUNT META_DISK0 META_DISK1 ZFS_DISK2 +export META_SIDE0 META_SIDE1 ZFS_SIDE2 SINGLE_DISK + +export TESTFILE=testfile +export FS_SIZE=500m +export META_DEVICE_ID=d99 +export META_DEVICE_PATH=/dev/md/dsk/$META_DEVICE_ID +export FILE_COUNT=20 +export FILE_SIZE=$(( 1024 * 1024 )) diff --git a/tests/sys/cddl/zfs/tests/interop/interop_001_pos.ksh b/tests/sys/cddl/zfs/tests/interop/interop_001_pos.ksh new file mode 100644 index 00000000000..be6527955ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/interop/interop_001_pos.ksh @@ -0,0 +1,101 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)interop_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: interop_001_pos +# +# DESCRIPTION: +# Create a SVM device and add this to an existing ZFS pool +# +# STRATEGY: +# 1. Create a SVM metadevice +# 2. Create a ZFS file system +# 3. Add SVM metadevice to the ZFS pool +# 4. Create files and fill the pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + + +function cleanup +{ + $RM -rf $TESTDIR/* +} + +log_assert "Create a SVM device and add this to an existing ZFS pool" + +log_onexit cleanup + +# the current size of the test pool +typeset -i oldsize=`$ZFS get -pH -o value available $TESTPOOL` + +log_must $ZPOOL add $TESTPOOL $META_DEVICE_PATH +log_must $ZPOOL iostat -v | $GREP $META_DEVICE_ID + +# the size of the test pool after adding the extra device +typeset -i newsize=`$ZFS get -pH -o value available $TESTPOOL` + +(( $oldsize >= $newsize )) && \ + log_fail "Pool space available ($oldsize) before adding a new device was "\ + "larger than the space available ($newsize) afterwards." + +log_note "Pool space available was ($oldsize), it's now ($newsize)" + +typeset -i odirnum=1 +typeset -i idirnum=0 +typeset -i filenum=0 +typeset -i retval=0 +typeset bg=$TESTDIR/bigdirectory + +fill_fs $bg 20 25 $FILE_SIZE $FILE_COUNT +retval=$? + +afterwritepoolavail=`$ZFS get -pH -o value available $TESTPOOL` +readonly ENOSPC=28 + +(( $retval == $ENOSPC && $afterwritepoolavail < $oldsize)) && \ + log_pass "Successfully used ($(( $newsize - $oldsize )) bytes) in "\ + "pool provided by SVM metadevice" + +log_fail "Failed to use space in pool ($(( $newsize - $oldsize ))bytes) "\ + "provided by SVM metadevice" diff --git a/tests/sys/cddl/zfs/tests/interop/interop_test.sh b/tests/sys/cddl/zfs/tests/interop/interop_test.sh new file mode 100755 index 00000000000..d853e6078e4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/interop/interop_test.sh @@ -0,0 +1,56 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case interop_001_pos cleanup +interop_001_pos_head() +{ + atf_set "descr" "Create a SVM device and add this to an existing ZFS pool" + atf_set "require.progs" metadb zfs metaclear metastat metainit zpool +} +interop_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/interop.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/interop_001_pos.ksh || atf_fail "Testcase failed" +} +interop_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/interop.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case interop_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/interop/setup.ksh b/tests/sys/cddl/zfs/tests/interop/setup.ksh new file mode 100644 index 00000000000..48b7054d50c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/interop/setup.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.5 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +case $DISK_COUNT in +0) + log_untested "Need at least 1 disk device for test" + ;; +1) + log_note "Partitioning a single disk ($SINGLE_DISK)" + ;; +2) + log_note "Partitioning a disks ($SINGLE_DISK) and ($ZFS_DISK2)" + ;; +3) + log_note "Partitioning disks ($META_DISK0 $META_DISK1 $ZFS_DISK2)" + ;; +esac + +wipe_partition_table $META_DISK0 +log_must set_partition ${META_SIDE0##*s} "" $FS_SIZE $META_DISK0 +if [[ $WRAPPER == *"smi"* && $META_DISK1 == $META_DISK0 ]]; then + typeset i=${META_SIDE0##*s} + typeset cyl=$(get_endslice $META_DISK0 $i) + log_must set_partition ${META_SIDE1##*s} "$cyl" $FS_SIZE $META_DISK1 +else + log_must set_partition ${META_SIDE1##*s} "" $FS_SIZE $META_DISK1 +fi +if [[ $WRAPPER == *"smi"* && $ZFS_DISK2 == $META_DISK1 ]]; then + typeset i=${META_SIDE1##*s} + typeset cyl=$(get_endslice $META_DISK1 $i) + log_must set_partition ${ZFS_SIDE2##*s} "$cyl" $FS_SIZE $ZFS_DISK2 +else + log_must set_partition ${ZFS_SIDE2##*s} "" $FS_SIZE $ZFS_DISK2 +fi + +create_pool $TESTPOOL $ZFS_SIDE2 + +$RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR +$MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR + +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +log_must $ZFS set compression=off $TESTPOOL/$TESTFS + +log_note "Configuring metadb with $META_SIDE1" +log_must $METADB -a -f -c 3 $META_SIDE1 + +log_note "Configure $META_DEVICE_ID with $META_SIDE0" +log_must $METAINIT $META_DEVICE_ID 1 1 $META_SIDE0 + +log_pass diff --git a/tests/sys/cddl/zfs/tests/inuse/Makefile b/tests/sys/cddl/zfs/tests/inuse/Makefile new file mode 100644 index 00000000000..f6ae6d27975 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inuse/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/inuse +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= inuse_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= inuse.cfg +${PACKAGE}FILES+= inuse_005_pos.ksh +${PACKAGE}FILES+= inuse_010_neg.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/inuse/inuse.cfg b/tests/sys/cddl/zfs/tests/inuse/inuse.cfg new file mode 100644 index 00000000000..96d54687ca1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inuse/inuse.cfg @@ -0,0 +1,126 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)inuse.cfg 1.7 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_disk_count "$DISKS" 2 +set -A disk_array $(find_disks $DISKS) +case "${#disk_array[@]}" in +2) + FS_DISK0=${disk_array[0]} + FS_DISK1=${disk_array[1]} + FS_DISK2=${disk_array[0]} + FS_DISK3=${disk_array[1]} + FS_SIDE0=${FS_DISK0}p1 + FS_SIDE1=${FS_DISK0}p2 + FS_SIDE2=${FS_DISK1}p1 + FS_SIDE3=${FS_DISK1}p2 + disk0="$FS_SIDE0" + disk1="$FS_SIDE1" + disk2="$FS_SIDE2" + disk3="$FS_SIDE3" + disktargets="$disk0 $disk2" + rawdisk0="$FS_SIDE0" + rawdisk1="$FS_SIDE1" + rawdisk2="$FS_SIDE2" + rawdisk3="$FS_SIDE3" + rawtargets="$rawdisk0 $rawdisk2" + vdisks="$FS_DISK0" + sdisks="$FS_DISK1" + vslices="$FS_SIDE0 $FS_SIDE1 $FS_SIDE2" + sslices="$FS_SIDE3" + ;; +3) + FS_DISK0=${disk_array[0]} + FS_DISK1=${disk_array[1]} + FS_DISK2=${disk_array[2]} + FS_DISK3=${disk_array[0]} + FS_SIDE0=${FS_DISK0}p1 + FS_SIDE1=${FS_DISK0}p2 + FS_SIDE2=${FS_DISK1}p1 + FS_SIDE3=${FS_DISK2}p1 + disk0="$FS_SIDE0" + disk1="$FS_SIDE1" + disk2="$FS_SIDE2" + disk3="$FS_SIDE3" + disktargets="$disk0 $disk2 $disk3" + rawdisk0="$FS_SIDE0" + rawdisk1="$FS_SIDE1" + rawdisk2="$FS_SIDE2" + rawdisk3="$FS_SIDE3" + rawtargets="$rawdisk0 $rawdisk2 $rawdisk3" + vdisks="$FS_DISK0 $FS_DISK1" + sdisks="$FS_DISK2" + vslices="$FS_SIDE0 $FS_SIDE2 $FS_SIDE3" + sslices="$FS_SIDE1" + ;; +*) + FS_DISK0=${disk_array[0]} + FS_DISK1=${disk_array[1]} + FS_DISK2=${disk_array[2]} + FS_DISK3=${disk_array[3]} + FS_SIDE0=${FS_DISK0}p1 + FS_SIDE1=${FS_DISK1}p1 + FS_SIDE2=${FS_DISK2}p1 + FS_SIDE3=${FS_DISK3}p1 + disk0="$FS_SIDE0" + disk1="$FS_SIDE1" + disk2="$FS_SIDE2" + disk3="$FS_SIDE3" + disktargets="$disk0 $disk1 $disk2 $disk3" + rawdisk0="$FS_SIDE0" + rawdisk1="$FS_SIDE1" + rawdisk2="$FS_SIDE2" + rawdisk3="$FS_SIDE3" + rawtargets="$rawdisk0 $rawdisk1 $rawdisk2 $rawdisk3" + vdisks="$FS_DISK0 $FS_DISK1 $FS_DISK2" + sdisks="$FS_DISK3" + vslices="$FS_SIDE0 $FS_SIDE1 $FS_SIDE2" + sslices="$FS_SIDE3" + ;; +esac + +export FS_DISK0 FS_DISK1 FS_DISK2 FS_DISK3 SINGLE_DISK +export FS_SIDE0 FS_SIDE1 FS_SIDE2 FS_SIDE3 +export disk0 disk1 disk2 disk3 disktargets +export rawdisk0 rawdisk1 rawdisk2 rawdisk3 rawtargets +export vdisks sdisks vslices sslices + +export UFSMP=$TESTDIR/testinuseufsdump +export FS_SIZE=1g +export PREVDUMPDEV="" +export PIDUFSDUMP="" +export PIDUFSRESTORE="" +# size of block to be written to test file - currently 1mb +export BLOCK_SIZE=$(( 1024 * 1024 )) +# number of blocks to write == size of file +export BLOCK_COUNT=100 +export STF_TIMEOUT=1200 # 20 minutes max. diff --git a/tests/sys/cddl/zfs/tests/inuse/inuse_005_pos.ksh b/tests/sys/cddl/zfs/tests/inuse/inuse_005_pos.ksh new file mode 100644 index 00000000000..89cbabc0ab4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inuse/inuse_005_pos.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)inuse_005_pos.ksh 1.4 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: inuse_005_pos +# +# DESCRIPTION: +# newfs will not interfere with devices and spare devices that are in use +# by active pool. +# +# STRATEGY: +# 1. Create a with the given disk +# 2. Try to newfs against the disk, verify it fails as expect. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-12-30) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" +set_disks + +function cleanup +{ + poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1 +} + +log_assert "Verify newfs over active pool fails." + +log_onexit cleanup + +create_pool $TESTPOOL1 $DISK0 +log_mustnot $NEWFS -s 1024 "$DISK0" +destroy_pool $TESTPOOL1 + +log_pass "Newfs over active pool fails." diff --git a/tests/sys/cddl/zfs/tests/inuse/inuse_010_neg.ksh b/tests/sys/cddl/zfs/tests/inuse/inuse_010_neg.ksh new file mode 100644 index 00000000000..cf85a013a3b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inuse/inuse_010_neg.ksh @@ -0,0 +1,52 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2017 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +set_disks + +FSSIZE=1024 #reduce filesystem size, just to speed up newfs +MOUNTPOINT=$TMPDIR/inuse_010_neg_mp + +function cleanup +{ + poolexists $TESTPOOL && destroy_pool $TESTPOOL + $UMOUNT $MOUNTPOINT + cleanup_devices $DISK0 + $RMDIR $MOUNTPOINT +} + +log_onexit cleanup + +log_assert "ZFS shouldn't be able to use a disk with a mounted filesystem" + +log_must $NEWFS -s $FSSIZE $DISK0 +log_must $MKDIR $MOUNTPOINT +log_must $MOUNT $DISK0 $MOUNTPOINT +log_mustnot $ZPOOL create $TESTPOOL $DISK0 + +log_pass "ZFS cannot use a disk with a mounted filesystem" diff --git a/tests/sys/cddl/zfs/tests/inuse/inuse_test.sh b/tests/sys/cddl/zfs/tests/inuse/inuse_test.sh new file mode 100755 index 00000000000..f26567dcc42 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inuse/inuse_test.sh @@ -0,0 +1,66 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case inuse_005_pos +inuse_005_pos_head() +{ + atf_set "descr" "Verify newfs over active pool fails." + atf_set "require.progs" newfs zpool + atf_set "require.user" root +} +inuse_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/inuse.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/inuse_005_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case inuse_010_neg +inuse_010_neg_head() +{ + atf_set "descr" "ZFS shouldn't be able to use a disk with a mounted filesystem" + atf_set "require.progs" newfs zpool + atf_set "require.user" root +} +inuse_010_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/inuse_010_neg.ksh || atf_fail "Testcase failed" +} + + +atf_init_test_cases() +{ + atf_add_test_case inuse_005_pos + atf_add_test_case inuse_010_neg +} diff --git a/tests/sys/cddl/zfs/tests/inuse/setup.ksh b/tests/sys/cddl/zfs/tests/inuse/setup.ksh new file mode 100644 index 00000000000..16fe84f6946 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/inuse/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +log_pass diff --git a/tests/sys/cddl/zfs/tests/iscsi/Makefile b/tests/sys/cddl/zfs/tests/iscsi/Makefile new file mode 100644 index 00000000000..e30fb661f6c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/Makefile @@ -0,0 +1,24 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/iscsi +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= iscsi_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= iscsi_004_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= iscsi_005_pos.ksh +${PACKAGE}FILES+= iscsi_001_pos.ksh +${PACKAGE}FILES+= iscsi_common.kshlib +${PACKAGE}FILES+= iscsi_002_neg.ksh +${PACKAGE}FILES+= iscsi_006_neg.ksh +${PACKAGE}FILES+= iscsi_003_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= iscsi.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/iscsi/cleanup.ksh b/tests/sys/cddl/zfs/tests/iscsi/cleanup.ksh new file mode 100644 index 00000000000..150ed644bde --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/cleanup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +iscsitgt_cleanup + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi.cfg b/tests/sys/cddl/zfs/tests/iscsi/iscsi.cfg new file mode 100644 index 00000000000..044abe74af1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi.cfg @@ -0,0 +1,34 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)iscsi.cfg 1.3 08/08/15 SMI" +# + +export TESTVOL=testvol${TESTCASE_ID} +export VOLSIZE=512m +export TESTVOL1=testvol1${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi_001_pos.ksh b/tests/sys/cddl/zfs/tests/iscsi/iscsi_001_pos.ksh new file mode 100644 index 00000000000..9152f7488c0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi_001_pos.ksh @@ -0,0 +1,99 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)iscsi_001_pos.ksh 1.2 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: iscsi_001_pos +# +# DESCRIPTION: +# Verify setting shareiscsi property on volume will make it an iSCSI +# target +# +# STRATEGY: +# 1) Create a volume, turn on shareiscsi directly on the volume +# 2) Check if the target is created or not +# 3) Destroy the volume, then turn on shareiscsi property on parent +# filesystem at first +# 4) Then create the volume, check if the target is created or not +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL && \ + log_must $ZFS destroy $TESTPOOL/$TESTVOL + datasetexists $TESTPOOL/$TESTVOL1 && \ + log_must $ZFS destroy $TESTPOOL/$TESTVOL1 + if [[ "off" != $(get_prop shareiscsi $TESTPOOL) ]]; then + log_must $ZFS set shareiscsi=off $TESTPOOL + fi +} + +log_onexit cleanup + +log_assert "Verify that setting shareiscsi property on volume will make it \ + an iSCSI target as expected." + + +# Check shareiscsi property directly on volume at first +log_must $ZFS set shareiscsi=off $TESTPOOL +log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL +log_must $ZFS set shareiscsi=on $TESTPOOL/$TESTVOL +if ! is_iscsi_target $TESTPOOL/$TESTVOL ; then + log_fail "iscsi target is not created via directly turning on \ + shareiscsi property on volume" +fi + +# Check setting shareiscsi property on parent filesystem also have +# effects on volume +log_must $ZFS set shareiscsi=on $TESTPOOL +log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL1 +if ! is_iscsi_target $TESTPOOL/$TESTVOL1 ; then + log_fail "iscsi target is not created via turning on \ + shareiscsi property on parent filesystem" +fi + +log_pass "Verify that setting shareiscsi property on volume will make it \ + an iSCSI target as expected." diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi_002_neg.ksh b/tests/sys/cddl/zfs/tests/iscsi/iscsi_002_neg.ksh new file mode 100644 index 00000000000..440ad74459d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi_002_neg.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)iscsi_002_neg.ksh 1.2 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# __stc_assertion_start +# +# ID: iscsi_002_neg +# +# DESCRIPTION: +# Verify file systems and snapshots can not be shared via iSCSI +# +# STRATEGY: +# 1) Turn on shareiscsi property directly on the filesystem +# 2) Check if the target is created or not +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if [[ "off" != $(get_prop shareiscsi $TESTPOOL/$TESTFS) ]]; then + log_must $ZFS set shareiscsi=off $TESTPOOL/$TESTFS + fi + datasetexists $TESTPOOL/$TESTFS@snap && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS@snap +} + +log_onexit cleanup + +log_assert "Verify file systems and snapshots can not be shared via iSCSI." + +if [[ "off" != $(get_prop shareiscsi $TESTPOOL/$TESTFS) ]]; then + log_fail "The default value of shareiscsi should be off." +fi + +# Check shareiscsi property directly on filesystem at first +log_must $ZFS set shareiscsi=on $TESTPOOL/$TESTFS +if is_iscsi_target $TESTPOOL/$TESTFS ; then + log_fail "shareiscsi property on filesystem makes an iSCSI target \ + unexpectedly." +fi + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap +if is_iscsi_target $TESTPOOL/$TESTFS@snap ; then + log_fail "shareiscsi property on snapshot makes an iSCSI target \ + unexpectedly." +fi + +log_pass "Verify file systems and snapshots can not be shared via iSCSI." diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi_003_neg.ksh b/tests/sys/cddl/zfs/tests/iscsi/iscsi_003_neg.ksh new file mode 100644 index 00000000000..5835d6766b9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi_003_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)iscsi_003_neg.ksh 1.2 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: iscsi_003_neg +# +# DESCRIPTION: +# Verify invalid value of shareiscsi can not be set +# +# STRATEGY: +# 1) verify a set of invalid value of shareiscsi can not be set +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if [[ "off" != $(get_prop shareiscsi $TESTPOOL/$TESTFS) ]]; then + $ZFS set shareiscsi=off $TESTPOOL/$TESTFS + fi +} + +log_onexit cleanup + +log_assert "Verify invalid value of shareiscsi can not be set" + +set -A inval_str "ON" "oN" "oFF" "Off" "0ff" "disK" "tape" "abc" "??" \ + "type=abc" "type=DISk" "type=type" "TYPE=disk" \ + "type=on" "type=off" "type=123" + +typeset str + +for str in ${inval_str[@]}; do + log_mustnot $ZFS set shareiscsi=$str $TESTPOOL/$TESTFS +done + +log_pass "Verify invalid value of shareiscsi can not be set" diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi_004_pos.ksh b/tests/sys/cddl/zfs/tests/iscsi/iscsi_004_pos.ksh new file mode 100644 index 00000000000..0e1ba82db5b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi_004_pos.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)iscsi_004_pos.ksh 1.2 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: iscsi_004_pos +# +# DESCRIPTION: +# Verify renaming a volume does not change target's iSCSI name +# +# STRATEGY: +# 1) Create a volume, turn on shareiscsi directly on the volume +# 2) Save the target's iSCSI name +# 3) Rename the volume, compare the target's iSCSI name with the original +# one +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL && \ + log_must $ZFS destroy $TESTPOOL/$TESTVOL + datasetexists $TESTPOOL/$TESTVOL1 && \ + log_must $ZFS destroy $TESTPOOL/$TESTVOL1 +} + +log_onexit cleanup + +log_assert "Verify renaming a volume does not change target's iSCSI name." + +log_must $ZFS create -V $VOLSIZE -o shareiscsi=on $TESTPOOL/$TESTVOL + +typeset iname +if ! is_iscsi_target $TESTPOOL/$TESTVOL ; then + log_fail "iscsi target is not created." +fi + +iname=$(iscsi_name $TESTPOOL/$TESTVOL) + +log_must $ZFS rename $TESTPOOL/$TESTVOL $TESTPOOL/$TESTVOL1 + +if [[ $iname != $(iscsi_name $TESTPOOL/$TESTVOL1) ]]; then + log_fail "The iSCSI name is changed after renaming the volume." +fi + +log_pass "Verify renaming a volume does not change target's iSCSI name." diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi_005_pos.ksh b/tests/sys/cddl/zfs/tests/iscsi/iscsi_005_pos.ksh new file mode 100644 index 00000000000..03091fdbd44 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi_005_pos.ksh @@ -0,0 +1,94 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)iscsi_005_pos.ksh 1.3 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: iscsi_005_pos +# +# DESCRIPTION: +# Verify export/import pool with iSCSI +# +# STRATEGY: +# 1) Create a volume, turn on shareiscsi directly on the volume +# 2) Export the pool, check the target is gone after the operation +# 3) Import the pool, check the target is back and its scsi name +# not changed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL && \ + log_must $ZFS destroy $TESTPOOL/$TESTVOL +} + +log_onexit cleanup + +log_assert "Verify export/import have right effects on iSCSI targets." + +log_must $ZFS create -V $VOLSIZE -o shareiscsi=on $TESTPOOL/$TESTVOL + +typeset iname +if ! is_iscsi_target $TESTPOOL/$TESTVOL ; then + log_fail "iscsi target is not created." +fi + +iname=$(iscsi_name $TESTPOOL/$TESTVOL) + +log_must $ZPOOL export $TESTPOOL +if is_iscsi_target $TESTPOOL/$TESTVOL ; then + log_fail "iscsi target is not removed after the pool is exported." +fi + +typeset dir=$(get_device_dir $DISKS) +log_must $ZPOOL import -d $dir -f $TESTPOOL +if ! is_iscsi_target $TESTPOOL/$TESTVOL ; then + log_fail "iscsi target is not restored after the pool is imported." +fi +if [[ $iname != $(iscsi_name $TESTPOOL/$TESTVOL) ]]; then + log_fail "The iSCSI name is changed after export/import." +fi + +log_pass "Verify export/import have right effects on iSCSI targets." diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi_006_neg.ksh b/tests/sys/cddl/zfs/tests/iscsi/iscsi_006_neg.ksh new file mode 100644 index 00000000000..ad05ff10620 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi_006_neg.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)iscsi_006_neg.ksh 1.3 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# __stc_assertion_start +# +# ID: iscsi_006_neg +# +# DESCRIPTION: +# Verify iscsioptions can not be changed by zfs command +# +# STRATEGY: +# 1) Save iscsioptions first, then change it on purpose +# 2) Check if the value is really changed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL +} + +log_onexit cleanup + +log_assert "Verify iscsioptions can not be changed by zfs command." + +log_must $ZFS create -V $VOLSIZE -o shareiscsi=on $TESTPOOL/$TESTVOL + +typeset ioptions +if ! is_iscsi_target $TESTPOOL/$TESTVOL ; then + log_fail "target is not created." +fi + +# Check iscsioptions can not be seen in the output of 'zfs get all' +$ZFS get all $TESTPOOL/$TESTVOL | $GREP iscsioptions +typeset -i ret=$? +[[ $ret -eq 0 ]] && log_fail "iscsioptions can be seen in ' zfs get all'. " + +ioptions=$(get_prop iscsioptions $TESTPOOL/$TESTVOL) + +$ZFS set iscsioptions="abc" $TESTPOOL/$TESTVOL + +if [[ $ioptions != $(get_prop iscsioptions $TESTPOOL/$TESTVOL) ]]; then + log_fail "iscsioptions property can be changed be $ZFS command." +fi + +log_pass "Verify iscsioptions can not be changed by zfs command." diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi_common.kshlib b/tests/sys/cddl/zfs/tests/iscsi/iscsi_common.kshlib new file mode 100644 index 00000000000..204d71566a6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi_common.kshlib @@ -0,0 +1,87 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)iscsi_common.kshlib 1.2 07/03/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Check if a volume is a valide iscsi target +# $1 volume name +# return 0 if suceeds, otherwise, return 1 +# +function is_iscsi_target +{ + typeset dataset=$1 + typeset target targets + + [[ -z $dataset ]] && return 1 + + targets=$($ISCSITADM list target | $GREP "Target:" | $AWK '{print $2}') + [[ -z $targets ]] && return 1 + + for target in $targets; do + [[ $dataset == $target ]] && return 0 + done + + return 1 +} + +# +# Get the iSCSI name of a target +# $1 target name +# +function iscsi_name +{ + typeset target=$1 + typeset name + + [[ -z $target ]] && log_fail "No parameter." + + if ! is_iscsi_target $target ; then + log_fail "Not a target." + fi + + name=$($ISCSITADM list target $target | $GREP "iSCSI Name:" \ + | $AWK '{print $2}') + + return $name +} + +# +# Check shareiscsi option is supported or not +# return 0 if it is supported, otherwise return 1 +# +function check_shareiscsi +{ + $ZFS set 2>&1 | $GREP shareiscsi + [[ $? -ne 0 ]] && return 1 + + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/iscsi/iscsi_test.sh b/tests/sys/cddl/zfs/tests/iscsi/iscsi_test.sh new file mode 100755 index 00000000000..cf68dd2b7c9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/iscsi_test.sh @@ -0,0 +1,188 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case iscsi_001_pos cleanup +iscsi_001_pos_head() +{ + atf_set "descr" "Verify that setting shareiscsi property on volume will make itan iSCSI target as expected." + atf_set "require.progs" zfs +} +iscsi_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/iscsi_001_pos.ksh || atf_fail "Testcase failed" +} +iscsi_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case iscsi_002_neg cleanup +iscsi_002_neg_head() +{ + atf_set "descr" "Verify file systems and snapshots can not be shared via iSCSI." + atf_set "require.progs" zfs +} +iscsi_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/iscsi_002_neg.ksh || atf_fail "Testcase failed" +} +iscsi_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case iscsi_003_neg cleanup +iscsi_003_neg_head() +{ + atf_set "descr" "Verify invalid value of shareiscsi can not be set" + atf_set "require.progs" zfs +} +iscsi_003_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/iscsi_003_neg.ksh || atf_fail "Testcase failed" +} +iscsi_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case iscsi_004_pos cleanup +iscsi_004_pos_head() +{ + atf_set "descr" "Verify renaming a volume does not change target's iSCSI name." + atf_set "require.progs" zfs +} +iscsi_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/iscsi_004_pos.ksh || atf_fail "Testcase failed" +} +iscsi_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case iscsi_005_pos cleanup +iscsi_005_pos_head() +{ + atf_set "descr" "Verify export/import have right effects on iSCSI targets." + atf_set "require.progs" zfs zpool +} +iscsi_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/iscsi_005_pos.ksh || atf_fail "Testcase failed" +} +iscsi_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case iscsi_006_neg cleanup +iscsi_006_neg_head() +{ + atf_set "descr" "Verify iscsioptions can not be changed by zfs command." + atf_set "require.progs" zfs +} +iscsi_006_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/iscsi_006_neg.ksh || atf_fail "Testcase failed" +} +iscsi_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/iscsi_common.kshlib + . $(atf_get_srcdir)/iscsi.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case iscsi_001_pos + atf_add_test_case iscsi_002_neg + atf_add_test_case iscsi_003_neg + atf_add_test_case iscsi_004_pos + atf_add_test_case iscsi_005_pos + atf_add_test_case iscsi_006_neg +} diff --git a/tests/sys/cddl/zfs/tests/iscsi/setup.ksh b/tests/sys/cddl/zfs/tests/iscsi/setup.ksh new file mode 100644 index 00000000000..cfd511fa91e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/iscsi/setup.ksh @@ -0,0 +1,40 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +iscsitgt_setup + +DISK=${DISKS%% *} + +default_setup "$DISK" diff --git a/tests/sys/cddl/zfs/tests/large_files/Makefile b/tests/sys/cddl/zfs/tests/large_files/Makefile new file mode 100644 index 00000000000..8dc338f9425 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/large_files/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/large_files +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= large_files_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= large_files_001_pos.ksh +${PACKAGE}FILES+= large_files.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/large_files/cleanup.ksh b/tests/sys/cddl/zfs/tests/large_files/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/large_files/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/large_files/large_files.cfg b/tests/sys/cddl/zfs/tests/large_files/large_files.cfg new file mode 100644 index 00000000000..66e70d977a8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/large_files/large_files.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)large_files.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE=testfile${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/large_files/large_files_001_pos.ksh b/tests/sys/cddl/zfs/tests/large_files/large_files_001_pos.ksh new file mode 100644 index 00000000000..338e7b87943 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/large_files/large_files_001_pos.ksh @@ -0,0 +1,67 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)large_files_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: large_files_001_pos +# +# DESCRIPTION: +# Write a file to the allowable ZFS fs size. +# +# STRATEGY: +# 1. largest_file will write to a file and increase its size +# to the maximum allowable. +# 2. The last byte of the file should be accessbile without error. +# 3. Writing beyond the maximum file size generates an 'errno' of +# EFBIG. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Write a file to the allowable ZFS fs size." + +log_note "Invoke 'largest_file' with $TESTDIR/$TESTFILE" +log_must $LARGEST_FILE $TESTDIR/$TESTFILE + +log_pass "Successfully created a file to the maximum allowable size." diff --git a/tests/sys/cddl/zfs/tests/large_files/large_files_test.sh b/tests/sys/cddl/zfs/tests/large_files/large_files_test.sh new file mode 100755 index 00000000000..edf59e97b53 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/large_files/large_files_test.sh @@ -0,0 +1,56 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case large_files_001_pos cleanup +large_files_001_pos_head() +{ + atf_set "descr" "Write a file to the allowable ZFS fs size." +} +large_files_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/large_files.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/large_files_001_pos.ksh || atf_fail "Testcase failed" +} +large_files_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/large_files.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case large_files_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/large_files/setup.ksh b/tests/sys/cddl/zfs/tests/large_files/setup.ksh new file mode 100644 index 00000000000..252b7fd0405 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/large_files/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +disk=${DISKS%% *} + +default_setup $disk diff --git a/tests/sys/cddl/zfs/tests/largest_pool/Makefile b/tests/sys/cddl/zfs/tests/largest_pool/Makefile new file mode 100644 index 00000000000..e5f9d7a64ee --- /dev/null +++ b/tests/sys/cddl/zfs/tests/largest_pool/Makefile @@ -0,0 +1,16 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/largest_pool +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= largest_pool_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= largest_pool.cfg +${PACKAGE}FILES+= largest_pool_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/largest_pool/largest_pool.cfg b/tests/sys/cddl/zfs/tests/largest_pool/largest_pool.cfg new file mode 100644 index 00000000000..efd13bfa2a9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/largest_pool/largest_pool.cfg @@ -0,0 +1,45 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)largest_pool.cfg 1.3 08/08/15 SMI" +# + +export TESTVOL=testvol${TESTCASE_ID} +export STF_TIMEOUT=1800 +export VOL_PATH=/dev/zvol/dsk/${TESTPOOL2}/$TESTVOL +export VOLSIZES=${VOLSIZES-"2pb 5pb 10pb 2eb 5eb 8eb 9eb"} + +# There're 3 different prompt messages while create +# a volume that great than 1TB on 32-bit +# - volume size exceeds limit for this system. (happy gate) +# - max volume size is 1TB on 32-bit systems (s10u2) +# - value is too large (old) + +export VOL_LIMIT_KEYWORD1="1TB on 32-bit" +export VOL_LIMIT_KEYWORD2="value is too large" +export VOL_LIMIT_KEYWORD3="volume size exceeds limit" diff --git a/tests/sys/cddl/zfs/tests/largest_pool/largest_pool_001_pos.ksh b/tests/sys/cddl/zfs/tests/largest_pool/largest_pool_001_pos.ksh new file mode 100644 index 00000000000..cc215aeff04 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/largest_pool/largest_pool_001_pos.ksh @@ -0,0 +1,168 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)largest_pool_001_pos.ksh 1.6 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +# ########################################################################## +# +# start __stf_assertion__ +# +# ASSERTION: largest_pool_001 +# +# DESCRIPTION: +# The largest pool can be created and a dataset in that +# pool can be created and mounted. +# +# STRATEGY: +# create a pool which will contain a volume device. +# create a volume device of desired sizes. +# create the largest pool allowed using the volume vdev. +# create and mount a dataset in the largest pool. +# create some files in the zfs file system. +# do some zpool list commands and parse the output. +# +# end __stf_assertion__ +# +# ########################################################################## + +verify_runnable "global" + +# +# Parse the results of zpool & zfs creation with specified size +# +# $1: volume size +# +# return value: +# 0 -> success +# 1 -> failure +# +function parse_expected_output +{ + UNITS=`$ECHO $1 | $SED -e 's/^\([0-9].*\)\([a-z].\)/\2/'` + case "$UNITS" in + 'mb') CHKUNIT="M" ;; + 'gb') CHKUNIT="G" ;; + 'tb') CHKUNIT="T" ;; + 'pb') CHKUNIT="P" ;; + 'eb') CHKUNIT="E" ;; + *) CHKUNIT="M" ;; + esac + + log_note "Detect zpool $TESTPOOL in this test machine." + log_must eval "$ZPOOL list $TESTPOOL > $TMPDIR/j.${TESTCASE_ID}" + log_must eval "$GREP $TESTPOOL $TMPDIR/j.${TESTCASE_ID} | \ + $AWK '{print $2}' | $GREP $CHKUNIT" + + log_note "Detect the file system in this test machine." + log_must eval "$DF -t zfs -h > $TMPDIR/j.${TESTCASE_ID}" + log_must eval "$GREP $TESTPOOL $TMPDIR/j.${TESTCASE_ID} | \ + $AWK '{print $2}' | $GREP $CHKUNIT" + + return 0 +} + +# +# Check and destroy zfs, volume & zpool remove the temporary files +# +function cleanup +{ + log_note "Start cleanup the zfs and pool" + + if datasetexists $TESTPOOL/$TESTFS ; then + if ismounted $TESTPOOL/$TESTFS ; then + log_must $ZFS unmount $TESTPOOL/$TESTFS + fi + log_must $ZFS destroy $TESTPOOL/$TESTFS + fi + + destroy_pool $TESTPOOL + + datasetexists $TESTPOOL2/$TESTVOL && \ + log_must $ZFS destroy $TESTPOOL2/$TESTVOL + + destroy_pool $TESTPOOL2 + + $RM -f $TMPDIR/j.* > /dev/null +} + +log_assert "The largest pool can be created and a dataset in that" \ + "pool can be created and mounted." + +# Set trigger. When the test case exit, cleanup is executed. +log_onexit cleanup + +# ----------------------------------------------------------------------- +# volume sizes with unit designations. +# +# Note: specifying the number '1' as size will not give the correct +# units for 'df'. It must be greater than one. +# ----------------------------------------------------------------------- +typeset str +typeset -i ret +for volsize in $VOLSIZES; do + log_note "Create a pool which will contain a volume device" + create_pool $TESTPOOL2 "$DISKS" + + log_note "Create a volume device of desired sizes: $volsize" + str=$($ZFS create -sV $volsize $TESTPOOL2/$TESTVOL 2>&1) + ret=$? + if (( ret != 0 )); then + if [[ $($ISAINFO -b) == 32 && \ + $str == *${VOL_LIMIT_KEYWORD1}* || \ + $str == *${VOL_LIMIT_KEYWORD2}* || \ + $str == *${VOL_LIMIT_KEYWORD3}* ]] + then + log_unsupported \ + "Max volume size is 1TB on 32-bit systems." + else + log_fail "$ZFS create -sV $volsize $TESTPOOL2/$TESTVOL" + fi + fi + + log_note "Create the largest pool allowed using the volume vdev" + create_pool $TESTPOOL "$VOL_PATH" + + log_note "Create a zfs file system in the largest pool" + log_must $ZFS create $TESTPOOL/$TESTFS + + log_note "Parse the execution result" + parse_expected_output $volsize + + log_note "unmount this zfs file system $TESTPOOL/$TESTFS" + log_must $ZFS unmount $TESTPOOL/$TESTFS + + log_note "Destroy zfs, volume & zpool" + log_must $ZFS destroy $TESTPOOL/$TESTFS + destroy_pool $TESTPOOL + log_must $ZFS destroy $TESTPOOL2/$TESTVOL + destroy_pool $TESTPOOL2 +done + +log_pass "Dateset can be created, mounted & destroy in largest pool succeeded." diff --git a/tests/sys/cddl/zfs/tests/largest_pool/largest_pool_test.sh b/tests/sys/cddl/zfs/tests/largest_pool/largest_pool_test.sh new file mode 100755 index 00000000000..da610430b94 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/largest_pool/largest_pool_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case largest_pool_001_pos cleanup +largest_pool_001_pos_head() +{ + atf_set "descr" "The largest pool can be created and a dataset in thatpool can be created and mounted." + atf_set "require.progs" zfs zpool isainfo + atf_set "timeout" 1800 +} +largest_pool_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/largest_pool.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/largest_pool_001_pos.ksh || atf_fail "Testcase failed" +} +largest_pool_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/largest_pool.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case largest_pool_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/link_count/Makefile b/tests/sys/cddl/zfs/tests/link_count/Makefile new file mode 100644 index 00000000000..1897deafb4f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/link_count/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/link_count/ +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= link_count_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= link_count_001.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= link_count.cfg +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/link_count/cleanup.ksh b/tests/sys/cddl/zfs/tests/link_count/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/link_count/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/link_count/link_count.cfg b/tests/sys/cddl/zfs/tests/link_count/link_count.cfg new file mode 100644 index 00000000000..30efae31f8d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/link_count/link_count.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)link_count.cfg 1.3 08/08/15 SMI" +# + +export ITERS=10 +export NUMFILES=10000 diff --git a/tests/sys/cddl/zfs/tests/link_count/link_count_001.ksh b/tests/sys/cddl/zfs/tests/link_count/link_count_001.ksh new file mode 100644 index 00000000000..9d8b43134de --- /dev/null +++ b/tests/sys/cddl/zfs/tests/link_count/link_count_001.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)link_count_001.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: link_count_001 +# +# DESCRIPTION: +# Verify file link count is zero on zfs +# +# STRATEGY: +# 1. Make sure this test executes on multi-processes system +# 2. Make zero size files and remove them in the background +# 3. Call the binary +# 4. Make sure the files can be removed successfully +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-07-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify file link count is zero on zfs" + +# Detect and make sure this test must be executed on a multi-process system +NCPUS=`sysctl -n kern.smp.cpus` +#NCPUS=`sysctl -a | awk -F '"' '/cpu count="[0-9+]"/ {print $2; exit}'` +if [[ $? -ne 0 || -z "$NCPUS" || "$NCPUS" -le 1 ]]; then + log_unsupported "This test must be executed on a multi-processor system." +fi + +log_must $MKDIR -p ${TESTDIR}/tmp + +typeset -i i=0 +while [ $i -lt $NUMFILES ]; do + (( i = i + 1 )) + $TOUCH ${TESTDIR}/tmp/x$i > /dev/null 2>&1 +done + +sleep 3 + +$RM -f ${TESTDIR}/tmp/x* >/dev/null 2>&1 + +$RM_LNKCNT_ZERO_FILE ${TESTDIR}/tmp/test${TESTCASE_ID} > /dev/null 2>&1 & +PID=$! +log_note "$RM_LNKCNT_ZERO_FILE ${TESTDIR}/tmp/test${TESTCASE_ID} pid: $PID" + +i=0 +while [ $i -lt $ITERS ]; do + if ! $PGREP $RM_LNKCNT_ZERO_FILE > /dev/null ; then + log_note "$RM_LNKCNT_ZERO_FILE completes" + break + fi + log_must $SLEEP 10 + (( i = i + 1 )) +done + +if $PGREP $RM_LNKCNT_ZERO_FILE > /dev/null; then + log_must $KILL -9 $PID + log_fail "file link count is zero" +fi + +log_must $RM -f ${TESTDIR}/tmp/test${TESTCASE_ID}* + +log_pass "Verify file link count is zero on zfs" diff --git a/tests/sys/cddl/zfs/tests/link_count/link_count_test.sh b/tests/sys/cddl/zfs/tests/link_count/link_count_test.sh new file mode 100755 index 00000000000..577c65d588e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/link_count/link_count_test.sh @@ -0,0 +1,55 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2014 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case link_count_001 cleanup +link_count_001_head() +{ + atf_set "descr" "Verify file link count is zero on zfs" + atf_set "require.progs" zfs +} +link_count_001_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/link_count.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/link_count_001.ksh || atf_fail "Testcase failed" +} +link_count_001_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/link_count.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_init_test_cases() +{ + + atf_add_test_case link_count_001 +} diff --git a/tests/sys/cddl/zfs/tests/link_count/setup.ksh b/tests/sys/cddl/zfs/tests/link_count/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/link_count/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/migration/Makefile b/tests/sys/cddl/zfs/tests/migration/Makefile new file mode 100644 index 00000000000..379c0c7c1cc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/Makefile @@ -0,0 +1,30 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/migration/ +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= migration_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= migration_011_pos.ksh +${PACKAGE}FILES+= migration_008_pos.ksh +${PACKAGE}FILES+= migration_004_pos.ksh +${PACKAGE}FILES+= migration.cfg +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= migration_005_pos.ksh +${PACKAGE}FILES+= migration_001_pos.ksh +${PACKAGE}FILES+= migration_009_pos.ksh +${PACKAGE}FILES+= migration_010_pos.ksh +${PACKAGE}FILES+= migration_007_pos.ksh +${PACKAGE}FILES+= migration_003_pos.ksh +${PACKAGE}FILES+= migration_012_pos.ksh +${PACKAGE}FILES+= migration.kshlib +${PACKAGE}FILES+= migration_006_pos.ksh +${PACKAGE}FILES+= migration_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/migration/cleanup.ksh b/tests/sys/cddl/zfs/tests/migration/cleanup.ksh new file mode 100644 index 00000000000..3ca167036f9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/cleanup.ksh @@ -0,0 +1,57 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +ismounted $NONZFS_TESTDIR ufs +(( $? == 0 )) && log_must $UMOUNT -f $NONZFS_TESTDIR + +ismounted $TESTPOOL/$TESTFS +[[ $? == 0 ]] && log_must $ZFS umount -f $TESTDIR +destroy_pool $TESTPOOL + +# recreate and destroy a zpool over the disks to restore the partitions to +# normal +case $DISK_COUNT in +0) + log_note "No disk devices to restore" + ;; +1) + log_must cleanup_devices $ZFS_DISK + ;; +*) + log_must cleanup_devices $ZFS_DISK $NONZFS_DISK + ;; +esac + +log_pass diff --git a/tests/sys/cddl/zfs/tests/migration/migration.cfg b/tests/sys/cddl/zfs/tests/migration/migration.cfg new file mode 100644 index 00000000000..8b65994865b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration.cfg @@ -0,0 +1,67 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration.cfg 1.3 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +set -A disk_array $(find_disks $DISKS) +case "${#disk_array[*]}" in +0) + DISK_COUNT=0 + ;; +1) + # We need to repartition the single disk to two partitions. + DISK_COUNT=1 + ZFS_DISK=${disk_array[0]} + SINGLE_DISK=$ZFS_DISK + NONZFS_DISK=$ZFS_DISK + ZFSSIDE_DISK=${SINGLE_DISK}p1 + NONZFSSIDE_DISK=${SINGLE_DISK}p2 + ;; +*) + # In this case there are at least enough disks to use. + DISK_COUNT=2 + ZFS_DISK=${disk_array[0]} + NONZFS_DISK=${disk_array[1]} + ZFSSIDE_DISK=${ZFS_DISK}p1 + NONZFSSIDE_DISK=${NONZFS_DISK}p1 + ;; +esac + +export DISK_COUNT ZFS_DISK NONZFS_DISK SINGLE_DISK ZFSSIDE_DISK NONZFSSIDE_DISK + +export TESTFILE=/etc/passwd +export NONZFS_TESTDIR=$TESTDIR/nonzfstestdir${TESTCASE_ID} +tmp=`$SUM $TESTFILE` +export SUMA=`$ECHO $tmp | $AWK '{print $1}'` +export SUMB=`$ECHO $tmp | $AWK '{print $2}'` +export FS_SIZE=1g +export BNAME=`$BASENAME $TESTFILE` +export DNAME=`$DIRNAME $TESTFILE` diff --git a/tests/sys/cddl/zfs/tests/migration/migration.kshlib b/tests/sys/cddl/zfs/tests/migration/migration.kshlib new file mode 100644 index 00000000000..542644e5316 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration.kshlib @@ -0,0 +1,152 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration.kshlib 1.2 07/01/09 SMI" +# + +# +# This function creates the test archive for migration. +# +# Usage: +# prepare srcdir cmd +# +# Return value: 0 on success +# 1 on failure +# +# Where: +# srcdir: is the directory where the testfile is +# cmd: is the command to be executed. +# E.g. +# $TAR cf $TESTDIR/tar${TESTCASE_ID}.tar +# +function prepare #srcdir cmd +{ + typeset srcdir=$1 + typeset cmd=$2 + typeset -i retval=0 + + cwd=$PWD + cd $srcdir + (( $? != 0 )) && return 1 + + $cmd + (( $? != 0 )) && return 1 + + cd $cwd + (( $? != 0 )) && return 1 + + return 0 +} + +# +# This function executes a passed in command and then determines the chksum +# of the resulting file. The chksum components are checked against the ones +# passed in to determine if they are equal. If they are equal, 0 is returned +# otherwise 1 is returned. +# +# Usage: +# migrate destdir oldsuma oldsumb command_to_execute +# +# Return value: 0 on success +# 1 on failure +# +# Where: +# destdir: is the directory where the command is to be executed on +# oldsuma: is the first part of the values returned by sum +# oldsumb: is the second part of the values returned by sum +# cmd: is the command to be executed; +# E.g. +# "$TAR xf $TESTDIR/tar${TESTCASE_ID}.tar" +# +function migrate #destdir oldsuma oldsumb cmd +{ + typeset destdir=$1 + typeset oldsuma=$2 + typeset oldsumb=$3 + typeset cmd=$4 + typeset -i retval=0 + + cwd=$PWD + cd $destdir + (( $? != 0 )) && return 1 + + $cmd + (( $? != 0 )) && return 1 + + sumy=`$SUM ./$BNAME` + suma=`$ECHO $sumy | $AWK '{print $1}'` + sumb=`$ECHO $sumy | $AWK '{print $2}'` + + if (( $oldsuma != $suma )); then + log_note "$SUM values are not the same" + retval=1 + fi + + if (( $oldsumb != $sumb )); then + log_note "$SUM values are not the same" + retval=1 + fi + + cd $cwd + (( $? != 0 )) && return 1 + return $retval +} + +function migrate_cpio +{ + typeset destdir=$1 + typeset archive=$2 + typeset oldsuma=$3 + typeset oldsumb=$4 + typeset -i retval=0 + + cwd=$PWD + cd $destdir + (( $? != 0 )) && return 1 + + $CPIO -iv < $archive + (( $? != 0 )) && return 1 + + sumy=`$SUM ./$BNAME` + suma=`$ECHO $sumy | $AWK '{print $1}'` + sumb=`$ECHO $sumy | $AWK '{print $2}'` + + if (( $oldsuma != $suma )); then + log_note "$SUM values are not the same" + retval=1 + fi + + if (( $oldsumb != $sumb )); then + log_note "$SUM values are not the same" + retval=1 + fi + + cd $cwd + (( $? != 0 )) && return 1 + return $retval +} diff --git a/tests/sys/cddl/zfs/tests/migration/migration_001_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_001_pos.ksh new file mode 100644 index 00000000000..5abf1cfb2be --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_001_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_001_pos +# +# DESCRIPTION: +# Migrating test file from ZFS fs to ZFS fs using tar. +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Tar up test file and place on a ZFS filesystem +# 3. Extract tar contents to a ZFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/tar${TESTCASE_ID}.tar + $RM -rf $TESTDIR/$BNAME +} + +log_assert "Migrating test file from ZFS fs to ZFS fs using tar" + +log_onexit cleanup + +prepare $DNAME "$TAR cf $TESTDIR/tar${TESTCASE_ID}.tar $BNAME" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $TESTDIR $SUMA $SUMB "$TAR xf $TESTDIR/tar${TESTCASE_ID}.tar" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to ZFS fs" + +log_pass "Successully migrated test file from ZFS fs to ZFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_002_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_002_pos.ksh new file mode 100644 index 00000000000..9ea020de38a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_002_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_002_pos +# +# DESCRIPTION: +# Migrating test file from ZFS fs to UFS fs using tar. +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Tar up test file and place on a ZFS filesystem +# 3. Extract tar contents to a UFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/tar${TESTCASE_ID}.tar + $RM -rf $NONZFS_TESTDIR/$BNAME +} + +log_assert "Migrating test file from ZFS fs to UFS fs using tar" + +log_onexit cleanup + +prepare $DNAME "$TAR cf $TESTDIR/tar${TESTCASE_ID}.tar $BNAME" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $NONZFS_TESTDIR $SUMA $SUMB "$TAR xf $TESTDIR/tar${TESTCASE_ID}.tar" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to UFS fs" + +log_pass "Successully migrated test file from ZFS fs to UFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_003_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_003_pos.ksh new file mode 100644 index 00000000000..68719d74ef6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_003_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_003_pos +# +# DESCRIPTION: +# Migrating test file from UFS fs to ZFS fs using tar. +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Tar up test file and place on a UFS filesystem +# 3. Extract tar contents to a ZFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $NONZFS_TESTDIR/tar${TESTCASE_ID}.tar + $RM -rf $TESTDIR/$BNAME +} + +log_assert "Migrating test file from UFS fs to ZFS fs using tar" + +log_onexit cleanup + +prepare $DNAME "$TAR cf $NONZFS_TESTDIR/tar${TESTCASE_ID}.tar $BNAME" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $TESTDIR $SUMA $SUMB "$TAR xvf $NONZFS_TESTDIR/tar${TESTCASE_ID}.tar" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "UFS fs to ZFS fs" + +log_pass "Successully migrated test file from UFS fs to ZFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_004_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_004_pos.ksh new file mode 100644 index 00000000000..0da907d3c29 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_004_pos.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_004_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_004_pos +# +# DESCRIPTION: +# Migrating test file from ZFS fs to ZFS fs using cpio +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Cpio up test file and place on a ZFS filesystem +# 3. Extract cpio contents to a ZFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/cpio${TESTCASE_ID}.cpio + $RM -rf $TESTDIR/$BNAME +} + +log_assert "Migrating test file from ZFS fs to ZFS fs using cpio" + +log_onexit cleanup + +cwd=$PWD +cd $DNAME +(( $? != 0 )) && log_untested "Could not change directory to $DNAME" + +$LS $BNAME | $CPIO -oc > $TESTDIR/cpio${TESTCASE_ID}.cpio +(( $? != 0 )) && log_failED "Unable to create cpio archive" + +cd $cwd +(( $? != 0 )) && log_untested "Could not change directory to $cwd" + +migrate_cpio $TESTDIR "$TESTDIR/cpio${TESTCASE_ID}.cpio" $SUMA $SUMB +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to ZFS fs" + +log_pass "Successully migrated test file from ZFS fs to ZFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_005_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_005_pos.ksh new file mode 100644 index 00000000000..13fb56892f3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_005_pos.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_005_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_005_pos +# +# DESCRIPTION: +# Migrating test file from ZFS fs to UFS fs using cpio +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Cpio up test file and place on a ZFS filesystem +# 3. Extract cpio contents to a UFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/cpio${TESTCASE_ID}.cpio + $RM -rf $NONZFS_TESTDIR/$BNAME +} + +log_assert "Migrating test file from ZFS fs to uFS fs using cpio" + +log_onexit cleanup + +cwd=$PWD +cd $DNAME +(( $? != 0 )) && log_untested "Could not change directory to $DNAME" + +$LS $BNAME | $CPIO -oc > $TESTDIR/cpio${TESTCASE_ID}.cpio +(( $? != 0 )) && log_failED "Unable to create cpio archive" + +cd $cwd +(( $? != 0 )) && log_untested "Could not change directory to $cwd" + +migrate_cpio $NONZFS_TESTDIR "$TESTDIR/cpio${TESTCASE_ID}.cpio" $SUMA $SUMB +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to UFS fs" + +log_pass "Successully migrated test file from ZFS fs to UFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_006_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_006_pos.ksh new file mode 100644 index 00000000000..c9231d5cba1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_006_pos.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_006_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_006_pos +# +# DESCRIPTION: +# Migrating test file from UFS fs to ZFS fs using cpio +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Cpio up test file and place on a UFS filesystem +# 3. Extract cpio contents to a ZFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $NONZFS_TESTDIR/cpio${TESTCASE_ID}.cpio + $RM -rf $TESTDIR/$BNAME +} + +log_assert "Migrating test file from UFS fs to ZFS fs using cpio" + +log_onexit cleanup + +cwd=$PWD +cd $DNAME +(( $? != 0 )) && log_untested "Could not change directory to $DNAME" + +$LS $BNAME | $CPIO -oc > $NONZFS_TESTDIR/cpio${TESTCASE_ID}.cpio +(( $? != 0 )) && log_failED "Unable to create cpio archive" + +cd $cwd +(( $? != 0 )) && log_untested "Could not change directory to $cwd" + +migrate_cpio $TESTDIR "$NONZFS_TESTDIR/cpio${TESTCASE_ID}.cpio" $SUMA $SUMB +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to ZFS fs" + +log_pass "Successully migrated test file from UFS fs to ZFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_007_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_007_pos.ksh new file mode 100644 index 00000000000..eab0b068d77 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_007_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_007_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_007_pos +# +# DESCRIPTION: +# Migrating test file from ZFS fs to ZFS fs using dd. +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Dd up test file and place on a ZFS filesystem +# 3. Extract dd contents to a ZFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/dd${TESTCASE_ID}.dd + $RM -rf $TESTDIR/$BNAME +} + +log_assert "Migrating test file from ZFS fs to ZFS fs using dd" + +log_onexit cleanup + +prepare $DNAME "$DD if=$BNAME obs=128k of=$TESTDIR/dd${TESTCASE_ID}.dd" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $TESTDIR $SUMA $SUMB "$DD if=$TESTDIR/dd${TESTCASE_ID}.dd obs=128k of=$BNAME" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to ZFS fs" + +log_pass "Successully migrated test file from ZFS fs to ZFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_008_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_008_pos.ksh new file mode 100644 index 00000000000..06d41bdb027 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_008_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_008_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_008_pos +# +# DESCRIPTION: +# Migrating test file from ZFS fs to UFS fs using dd. +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Dd up test file and place on a ZFS filesystem +# 3. Extract dd contents to a UFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/dd${TESTCASE_ID}.dd + $RM -rf $NONZFS_TESTDIR/$BNAME +} + +log_assert "Migrating test file from ZFS fs to UFS fs using dd" + +log_onexit cleanup + +prepare $DNAME "$DD if=$BNAME obs=128k of=$TESTDIR/dd${TESTCASE_ID}.dd" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $NONZFS_TESTDIR $SUMA $SUMB "$DD if=$TESTDIR/dd${TESTCASE_ID}.dd obs=128k of=$BNAME" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to ZFS fs" + +log_pass "Successully migrated test file from ZFS fs to UFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_009_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_009_pos.ksh new file mode 100644 index 00000000000..82382160957 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_009_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_009_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_009_pos +# +# DESCRIPTION: +# Migrating test file from UFS fs to ZFS fs using dd. +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. Dd up test file and place on a UFS filesystem +# 3. Extract dd contents to a ZFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/dd${TESTCASE_ID}.dd + $RM -rf $NONZFS_TESTDIR/$BNAME +} + +log_assert "Migrating test file from UFS fs to ZFS fs using dd" + +log_onexit cleanup + +prepare $DNAME "$DD if=$BNAME obs=128k of=$NONZFS_TESTDIR/dd${TESTCASE_ID}.dd" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $TESTDIR $SUMA $SUMB "$DD if=$NONZFS_TESTDIR/dd${TESTCASE_ID}.dd obs=128k of=$BNAME" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to ZFS fs" + +log_pass "Successully migrated test file from UFS fs to ZFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_010_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_010_pos.ksh new file mode 100644 index 00000000000..b04f38ce963 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_010_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_010_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_010_pos +# +# DESCRIPTION: +# Migrating test file from ZFS fs to ZFS fs using cp +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. CP up test file and place on a ZFS filesystem +# 3. Extract cp contents to a ZFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/cp${TESTCASE_ID}.cp + $RM -rf $TESTDIR/$BNAME +} + +log_assert "Migrating test file from ZFS fs to ZFS fs using cp" + +log_onexit cleanup + +prepare $DNAME "$CP $BNAME $TESTDIR/cp${TESTCASE_ID}.cp" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $TESTDIR $SUMA $SUMB "$CP $TESTDIR/cp${TESTCASE_ID}.cp $BNAME" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to ZFS fs" + +log_pass "Successully migrated test file from ZFS fs to ZFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_011_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_011_pos.ksh new file mode 100644 index 00000000000..17cba15dc68 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_011_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_011_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_011_pos +# +# DESCRIPTION: +# Migrating test file from ZFS fs to UFS fs using cp +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. CP up test file and place on a ZFS filesystem +# 3. Extract cp contents to a UFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $NONZFS_TESTDIR/cp${TESTCASE_ID}.cp + $RM -rf $TESTDIR/$BNAME +} + +log_assert "Migrating test file from ZFS fs to UFS fs using cp" + +log_onexit cleanup + +prepare $DNAME "$CP $BNAME $TESTDIR/cp${TESTCASE_ID}.cp" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $NONZFS_TESTDIR $SUMA $SUMB "$CP $TESTDIR/cp${TESTCASE_ID}.cp $BNAME" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "ZFS fs to UFS fs" + +log_pass "Successully migrated test file from ZFS fs to UFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_012_pos.ksh b/tests/sys/cddl/zfs/tests/migration/migration_012_pos.ksh new file mode 100644 index 00000000000..e6fa0acfd3e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_012_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)migration_012_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/migration/migration.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: migration_012_pos +# +# DESCRIPTION: +# Migrating test file from UFS fs to ZFS fs using cp +# +# STRATEGY: +# 1. Calculate chksum of testfile +# 2. CP up test file and place on a UFS filesystem +# 3. Extract cp contents to a ZFS file system +# 4. Calculate chksum of extracted file +# 5. Compare old and new chksums. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + $RM -rf $TESTDIR/cp${TESTCASE_ID}.cp + $RM -rf $NONZFS_TESTDIR/$BNAME +} + +log_assert "Migrating test file from UFS fs to ZFS fs using cp" + +log_onexit cleanup + +prepare $DNAME "$CP $BNAME $NONZFS_TESTDIR/cp${TESTCASE_ID}.cp" +(( $? != 0 )) && log_fail "Unable to create src archive" + +migrate $TESTDIR $SUMA $SUMB "$CP $NONZFS_TESTDIR/cp${TESTCASE_ID}.cp $BNAME" +(( $? != 0 )) && log_fail "Uable to successfully migrate test file from" \ + "UFS fs to ZFS fs" + +log_pass "Successully migrated test file from UFS fs to ZFS fs". diff --git a/tests/sys/cddl/zfs/tests/migration/migration_test.sh b/tests/sys/cddl/zfs/tests/migration/migration_test.sh new file mode 100755 index 00000000000..15513463b0d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/migration_test.sh @@ -0,0 +1,356 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case migration_001_pos cleanup +migration_001_pos_head() +{ + atf_set "descr" "Migrating test file from ZFS fs to ZFS fs using tar" + atf_set "require.progs" zfs +} +migration_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_001_pos.ksh || atf_fail "Testcase failed" +} +migration_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_002_pos cleanup +migration_002_pos_head() +{ + atf_set "descr" "Migrating test file from ZFS fs to UFS fs using tar" + atf_set "require.progs" zfs +} +migration_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_002_pos.ksh || atf_fail "Testcase failed" +} +migration_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_003_pos cleanup +migration_003_pos_head() +{ + atf_set "descr" "Migrating test file from UFS fs to ZFS fs using tar" + atf_set "require.progs" zfs +} +migration_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_003_pos.ksh || atf_fail "Testcase failed" +} +migration_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_004_pos cleanup +migration_004_pos_head() +{ + atf_set "descr" "Migrating test file from ZFS fs to ZFS fs using cpio" + atf_set "require.progs" zfs +} +migration_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_004_pos.ksh || atf_fail "Testcase failed" +} +migration_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_005_pos cleanup +migration_005_pos_head() +{ + atf_set "descr" "Migrating test file from ZFS fs to uFS fs using cpio" + atf_set "require.progs" zfs +} +migration_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_005_pos.ksh || atf_fail "Testcase failed" +} +migration_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_006_pos cleanup +migration_006_pos_head() +{ + atf_set "descr" "Migrating test file from UFS fs to ZFS fs using cpio" + atf_set "require.progs" zfs +} +migration_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_006_pos.ksh || atf_fail "Testcase failed" +} +migration_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_007_pos cleanup +migration_007_pos_head() +{ + atf_set "descr" "Migrating test file from ZFS fs to ZFS fs using dd" + atf_set "require.progs" zfs +} +migration_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_007_pos.ksh || atf_fail "Testcase failed" +} +migration_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_008_pos cleanup +migration_008_pos_head() +{ + atf_set "descr" "Migrating test file from ZFS fs to UFS fs using dd" + atf_set "require.progs" zfs +} +migration_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_008_pos.ksh || atf_fail "Testcase failed" +} +migration_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_009_pos cleanup +migration_009_pos_head() +{ + atf_set "descr" "Migrating test file from UFS fs to ZFS fs using dd" + atf_set "require.progs" zfs +} +migration_009_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_009_pos.ksh || atf_fail "Testcase failed" +} +migration_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_010_pos cleanup +migration_010_pos_head() +{ + atf_set "descr" "Migrating test file from ZFS fs to ZFS fs using cp" + atf_set "require.progs" zfs +} +migration_010_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_010_pos.ksh || atf_fail "Testcase failed" +} +migration_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_011_pos cleanup +migration_011_pos_head() +{ + atf_set "descr" "Migrating test file from ZFS fs to UFS fs using cp" + atf_set "require.progs" zfs +} +migration_011_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_011_pos.ksh || atf_fail "Testcase failed" +} +migration_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case migration_012_pos cleanup +migration_012_pos_head() +{ + atf_set "descr" "Migrating test file from UFS fs to ZFS fs using cp" + atf_set "require.progs" zfs +} +migration_012_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/migration_012_pos.ksh || atf_fail "Testcase failed" +} +migration_012_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/migration.kshlib + . $(atf_get_srcdir)/migration.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case migration_001_pos + atf_add_test_case migration_002_pos + atf_add_test_case migration_003_pos + atf_add_test_case migration_004_pos + atf_add_test_case migration_005_pos + atf_add_test_case migration_006_pos + atf_add_test_case migration_007_pos + atf_add_test_case migration_008_pos + atf_add_test_case migration_009_pos + atf_add_test_case migration_010_pos + atf_add_test_case migration_011_pos + atf_add_test_case migration_012_pos +} diff --git a/tests/sys/cddl/zfs/tests/migration/setup.ksh b/tests/sys/cddl/zfs/tests/migration/setup.ksh new file mode 100644 index 00000000000..9dd09020849 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/migration/setup.ksh @@ -0,0 +1,69 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.4 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +case $DISK_COUNT in +0) + log_untested "Need at least 1 disk device for test" + ;; +1) + log_note "Partitioning a single disk ($SINGLE_DISK)" + ;; +*) + log_note "Partitioning disks ($ZFS_DISK $NONZFS_DISK)" + ;; +esac + +wipe_partition_table $ZFS_DISK $NONZFS_DISK +set_partition ${ZFSSIDE_DISK##*p} "" $FS_SIZE $ZFS_DISK +set_partition ${NONZFSSIDE_DISK##*p} "" $FS_SIZE $NONZFS_DISK + +log_must create_pool $TESTPOOL "$ZFSSIDE_DISK" + +$RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR +$MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR + +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +$RM -rf $NONZFS_TESTDIR || log_unresolved Could not remove $NONZFS_TESTDIR +$MKDIR -p $NONZFS_TESTDIR || log_unresolved Could not create $NONZFS_TESTDIR + +$NEWFS $NONZFSSIDE_DISK +(( $? != 0 )) && + log_untested "Unable to setup a UFS file system" + +log_must $MOUNT $NONZFSSIDE_DISK $NONZFS_TESTDIR + +log_pass diff --git a/tests/sys/cddl/zfs/tests/mmap/Makefile b/tests/sys/cddl/zfs/tests/mmap/Makefile new file mode 100644 index 00000000000..cc1e4d6a031 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mmap/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/mmap +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= mmap_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= mmap.cfg +${PACKAGE}FILES+= mmap_read_001_pos.ksh +${PACKAGE}FILES+= mmap_write_001_pos.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/mmap/cleanup.ksh b/tests/sys/cddl/zfs/tests/mmap/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mmap/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/mmap/mmap.cfg b/tests/sys/cddl/zfs/tests/mmap/mmap.cfg new file mode 100644 index 00000000000..6a13c479b85 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mmap/mmap.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mmap_read.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE=testfile${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/mmap/mmap_read_001_pos.ksh b/tests/sys/cddl/zfs/tests/mmap/mmap_read_001_pos.ksh new file mode 100644 index 00000000000..a4aaa8c69f1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mmap/mmap_read_001_pos.ksh @@ -0,0 +1,69 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mmap_read_001_pos.ksh 1.3 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +########################################################################### +# +# __stc_assertion_start +# +# ID: read_mmap_001_pos +# +# DESCRIPTION: +# read()s from mmap()'ed file contain correct data. +# +# STRATEGY: +# 1. Create a pool & dataset +# 2. Call readmmap binary +# 3. unmount this file system +# 4. Verify the integrity of this pool & dateset +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "read()s from mmap()'ed file contain correct data." + +log_must $CHMOD 777 $TESTDIR +log_must $READMMAP $TESTDIR/$TESTFILE +log_must $ZFS unmount $TESTPOOL/$TESTFS + +typeset dir=$(get_device_dir $DISKS) +verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir" + +log_pass "read(2) calls from a mmap(2)'ed file succeeded." diff --git a/tests/sys/cddl/zfs/tests/mmap/mmap_test.sh b/tests/sys/cddl/zfs/tests/mmap/mmap_test.sh new file mode 100755 index 00000000000..5ded1b48283 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mmap/mmap_test.sh @@ -0,0 +1,80 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case mmap_read_001_pos cleanup +mmap_read_001_pos_head() +{ + atf_set "descr" "read()s from mmap()'ed file contain correct data." + atf_set "require.progs" zfs zdb +} +mmap_read_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/mmap.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mmap_read_001_pos.ksh || atf_fail "Testcase failed" +} +mmap_read_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/mmap.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case mmap_write_001_pos cleanup +mmap_write_001_pos_head() +{ + atf_set "descr" "write()s to a file and mmap() that file at the same time does notresult in a deadlock." +} +mmap_write_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/mmap.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mmap_write_001_pos.ksh || atf_fail "Testcase failed" +} +mmap_write_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/mmap.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case mmap_read_001_pos + atf_add_test_case mmap_write_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/mmap/mmap_write_001_pos.ksh b/tests/sys/cddl/zfs/tests/mmap/mmap_write_001_pos.ksh new file mode 100644 index 00000000000..cce4b8c7600 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mmap/mmap_write_001_pos.ksh @@ -0,0 +1,93 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mmap_write_001_pos.ksh 1.3 07/07/31 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +# ########################################################################## +# +# __stc_assertion_start +# +# ID: mmap_write_001_pos +# +# DESCRIPTION: +# Writing to a file and mmaping that file at the +# same time does not result in a deadlock. +# +# STRATEGY: +# 1. Make sure this test executes on multi-processes system. +# 2. Call mmapwrite binary. +# 3. wait 120s and make sure the test file existed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Default is 120 seconds or 2 minutes +WAITTIME=${WAITTIME-120} + +log_assert "write()s to a file and mmap() that file at the same time does not "\ + "result in a deadlock." + +# Detect and make sure this test must be executed on a multi-process system +NCPUS=`sysctl -a | awk -F '"' '/cpu count="[0-9+]"/ {print $2; exit}'` +if [[ $? -ne 0 || -z $NCPUS || $NCPUS -le 1 ]]; then + log_unsupported "This test must be executed on a multi-processor system." +fi + +log_must $CHMOD 777 $TESTDIR +$MMAPWRITE $TESTDIR/$TESTFILE & +PID_MMAPWRITE=$! +log_note "$MMAPWRITE $TESTDIR/$TESTFILE pid: $PID_MMAPWRITE" +log_must $SLEEP 10 + +typeset -i i=0 +while (( i < $WAITTIME )); do + if ! $PS -ef | $PGREP $MMAPWRITE > /dev/null ; then + log_must $WAIT $PID_MMAPWRITE + break + fi + $SLEEP 1 + (( i += 1 )) +done + +if $PS -ef | $PGREP $MMAPWRITE > /dev/null ; then + log_must $KILL -9 $PID_MMAPWRITE +fi +log_must $LS -l $TESTDIR/$TESTFILE + +log_pass "write(2) a mmap(2)'ing file succeeded." diff --git a/tests/sys/cddl/zfs/tests/mmap/setup.ksh b/tests/sys/cddl/zfs/tests/mmap/setup.ksh new file mode 100644 index 00000000000..65fbd87ff45 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mmap/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/mount/Makefile b/tests/sys/cddl/zfs/tests/mount/Makefile new file mode 100644 index 00000000000..1abb3ea93ea --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mount/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/mount/ +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= mount_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= vars.cfg +${PACKAGE}FILES+= mounttest.ksh +${PACKAGE}FILES+= mount_test.sh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/mount/cleanup.ksh b/tests/sys/cddl/zfs/tests/mount/cleanup.ksh new file mode 100644 index 00000000000..836fc7c9f6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mount/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/mount/mount_test.sh b/tests/sys/cddl/zfs/tests/mount/mount_test.sh new file mode 100755 index 00000000000..9fb539db7a5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mount/mount_test.sh @@ -0,0 +1,86 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2014 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case umount_001 cleanup +umount_001_head() +{ + atf_set "descr" "zfs umount should unmount a file system" + atf_set "require.progs" zfs +} +umount_001_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/vars.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mounttest.ksh -u umount || \ + atf_fail "Testcase failed" +} +umount_001_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/vars.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case umountall_001 cleanup +umountall_001_head() +{ + atf_set "descr" "zfs umount -a should unmount all ZFS file systems" + atf_set "require.progs" zfs +} +umountall_001_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/vars.cfg + + if other_pools_exist; then + atf_skip "Can't test unmount -a with existing pools" + fi + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mounttest.ksh -u 'umount -a' || \ + atf_fail "Testcase failed" +} +umountall_001_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/vars.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_init_test_cases() +{ + + atf_add_test_case umount_001 + atf_add_test_case umountall_001 +} diff --git a/tests/sys/cddl/zfs/tests/mount/mounttest.ksh b/tests/sys/cddl/zfs/tests/mount/mounttest.ksh new file mode 100644 index 00000000000..6e3856de218 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mount/mounttest.ksh @@ -0,0 +1,101 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# +# ident "@(#)mounttest.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: mounttest +# +# DESCRIPTION: +# zfs mount and unmount commands should mount and unmount existing +# file systems. +# +# STRATEGY: +# 1. Call zfs mount command +# 2. Make sure the file systems were mounted +# 3. Call zfs unmount command +# 4. Make sure the file systems were unmounted +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + + +unmountcmd="" +while getopts u: OPT ; do + case $OPT in + u) unmountcmd=$OPTARG + ;; + ?) log_fail Usage: $0 [-u unmountcmd] + ;; + esac +done + +log_note Mount file systems +typeset -i i=1 +for fs in $TESTFSS ; do + log_must $ZFS mount $fs + ((i = i + 1)) +done + +log_note Make sure the file systems were mounted +for fs in $TESTFSS ; do + mounted $fs || log_fail File system $fs not mounted +done + +log_note Unmount the file systems +if [[ $unmountcmd = *all ]] ; then + log_must $ZFS $unmountcmd -F zfs +else + if [[ $unmountcmd = *-a ]] ; then + log_must $ZFS $unmountcmd + else + for fs in $TESTFSS ; do + log_must $ZFS $unmountcmd $fs + done + fi +fi + +log_note Make sure the file systems were unmounted +for fs in $TESTFSS ; do + unmounted $fs || log_fail File system $fs not unmounted +done + +log_pass All file systems are unmounted diff --git a/tests/sys/cddl/zfs/tests/mount/setup.ksh b/tests/sys/cddl/zfs/tests/mount/setup.ksh new file mode 100644 index 00000000000..2eb9a483769 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mount/setup.ksh @@ -0,0 +1,69 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +create_pool $TESTPOOL "$DISK" + +log_note Create file systems with mountpoints, so they are mounted automatically +i=1 +TESTFSS="" +TESTDIRS="" +while [ $i -le $FS_CNT ] ; do + dir=$TESTDIR.$i + fs=$TESTPOOL/$TESTFS.$i + + log_pos $RM -rf $dir || log_unresolved Could not remove $dir + + log_pos $MKDIR -p $dir || log_unresolved Could not create $dir + + TESTDIRS="$TESTDIRS $dir" + + log_must $ZFS create $fs + log_must $ZFS set mountpoint=$dir $fs + + TESTFSS="$TESTFSS $fs" + + log_note Make sure file system $fs was mounted + mounted $fs || log_fail File system $fs is not mounted + + log_note Unmount the file system + log_must $ZFS unmount $fs + + log_note Make sure file system $fs is unmounted + unmounted $fs || log_fail File system $fs is not unmounted + + (( i = i + 1 )) +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/mount/vars.cfg b/tests/sys/cddl/zfs/tests/mount/vars.cfg new file mode 100644 index 00000000000..9f4ee7ae7df --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mount/vars.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)vars.cfg 1.4 08/08/15 SMI" +# + +export FS_CNT=3 + diff --git a/tests/sys/cddl/zfs/tests/mv_files/Makefile b/tests/sys/cddl/zfs/tests/mv_files/Makefile new file mode 100644 index 00000000000..6e74238727e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mv_files/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/mv_files +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= mv_files_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= mv_files_common.kshlib +${PACKAGE}FILES+= mv_files_002_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= mv_files_001_pos.ksh +${PACKAGE}FILES+= mv_files.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/mv_files/cleanup.ksh b/tests/sys/cddl/zfs/tests/mv_files/cleanup.ksh new file mode 100644 index 00000000000..9fd716e410f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mv_files/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +[[ -f $TMPDIR/exitsZero.ksh ]] && \ + log_must $RM -f $TMPDIR/exitsZero.ksh +[[ -f $TMPDIR/testbackgprocs.ksh ]] && \ + log_must $RM -f $TMPDIR/testbackgprocs.ksh + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/mv_files/mv_files.cfg b/tests/sys/cddl/zfs/tests/mv_files/mv_files.cfg new file mode 100644 index 00000000000..1dab961e612 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mv_files/mv_files.cfg @@ -0,0 +1,46 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mv_files.cfg 1.3 08/08/15 SMI" +# + +export DISK=${DISKS%% *} + +export TESTFILE=testfile${TESTCASE_ID} + +export TESTDIR_TGT=${TEST_BASE_DIR%%/}/testdir_tgt${TESTCASE_ID} +export TESTFS_TGT=testzfs_tgt${TESTCASE_ID} +export OLDDIR=$TESTDIR/olddir${TESTCASE_ID} +export NEWDIR_IN_FS=$TESTDIR/newdir${TESTCASE_ID} +export NEWDIR_ACROSS_FS=$TESTDIR_TGT/newdir${TESTCASE_ID} + +export MVNUMFILES=2000 # +export MVNUMINCR=1000 # +export GANGPIDS=50 # + +export STF_TIMEOUT=1200 diff --git a/tests/sys/cddl/zfs/tests/mv_files/mv_files_001_pos.ksh b/tests/sys/cddl/zfs/tests/mv_files/mv_files_001_pos.ksh new file mode 100644 index 00000000000..f0d0ff92475 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mv_files/mv_files_001_pos.ksh @@ -0,0 +1,84 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mv_files_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/mv_files/mv_files_common.kshlib + +############################################################################## +# +# __stc_assertion_start +# +# ID: mv_files_001_pos +# +# DESCRIPTION: +# Doing a 'mv' of a large amount of files between two directories +# within a zfs filesystem works without errors. +# +# STRATEGY: +# +# 1. create a pool and a zfs filesystem +# 2. create two directories within the filesystem +# 3. create a large number of files within a directory +# 4. Move files from one directory to another and back again +# 5. validate file number +# 6. increase the number of files to $MVNUMFILES + $MVNUMINCR +# 7. repeat steps 3,4,5,6 above +# 8. verify the data integrity +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + PIDS="" + $RM -f $OLDDIR/* >/dev/null 2>&1 + $RM -f $NEWDIR_IN_FS/* >/dev/null 2>&1 +} + +log_assert "Doing a 'mv' of a large amount of files within a zfs filesystem" \ + "works without errors." + +log_onexit cleanup + +mv_test $OLDDIR $NEWDIR_IN_FS +(($? != 0 )) && \ + log_fail "'mv' test failed to complete." + +log_pass diff --git a/tests/sys/cddl/zfs/tests/mv_files/mv_files_002_pos.ksh b/tests/sys/cddl/zfs/tests/mv_files/mv_files_002_pos.ksh new file mode 100644 index 00000000000..69d027a755a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mv_files/mv_files_002_pos.ksh @@ -0,0 +1,85 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mv_files_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/mv_files/mv_files_common.kshlib + +############################################################################## +# +# __stc_assertion_start +# +# ID: mv_files_002_pos +# +# DESCRIPTION: +# Doing a 'mv' of a large amount of files between two directories across +# two zfs filesystems works without errors. +# +# STRATEGY: +# +# 1. create a pool and two zfs filesystems +# 2. create a directory in each filesystem +# 3. create a large number of files in a directory of a filesystem +# 4. Move files from the directory to another directory in another +# filesystem and back again +# 5. validate file number +# 6. increase the number of files to $MVNUMFILES + $MVNUMINCR +# 7. repeat steps 3,4,5,6 above +# 8. verify the data integrity +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + PIDS="" + $RM -f $OLDDIR/* >/dev/null 2>&1 + $RM -f $NEWDIR_ACROSS_FS/* >/dev/null 2>&1 +} + +log_assert "Doing a 'mv' of a large amount of files across two zfs filesystems" \ + "works without errors." + +log_onexit cleanup + +mv_test $OLDDIR $NEWDIR_ACROSS_FS +(($? != 0 )) && \ + log_fail "'mv' test failed to complete." + +log_pass diff --git a/tests/sys/cddl/zfs/tests/mv_files/mv_files_common.kshlib b/tests/sys/cddl/zfs/tests/mv_files/mv_files_common.kshlib new file mode 100644 index 00000000000..e1d332798fc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mv_files/mv_files_common.kshlib @@ -0,0 +1,216 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)mv_files_common.kshlib 1.5 09/06/22 SMI" +# + +# +# Determine whether this version of the ksh being +# executed has a bug where the limit of background +# processes of 25. +# +function check_bg_procs_limit_num +{ +$ECHO "#!/usr/local/bin/ksh93" > $TMPDIR/exitsZero.ksh +$ECHO "exit 0" >> $TMPDIR/exitsZero.ksh +$CHMOD 777 $TMPDIR/exitsZero.ksh + +$CAT < $TMPDIR/testbackgprocs.ksh +#!/usr/local/bin/ksh93 +# +# exitsZero.ksh is a one line script +# that exit with status of "0" +# + +PIDS="" +typeset -i i=1 +while [ \$i -le 50 ] +do + $TMPDIR/exitsZero.ksh & + PIDS="\$PIDS \$!" + (( i = i + 1 )) +done + +\$SLEEP 1 + +for pid in \$PIDS +do + \$WAIT \$pid + (( \$? == 127 )) && exit 1 +done +exit 0 +EOF + +$KSH93 $TMPDIR/testbackgprocs.ksh +if [[ $? -eq 1 ]]; then +# +# Current ksh being executed has a limit +# of 25 background processes. +# + return 1 +else + return 0 +fi +} + +function init_setup +{ + + typeset disklist=$1 + + create_pool $TESTPOOL "$disklist" + + if ! is_global_zone ; then + reexport_pool + fi + + $RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR + $MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR + + $RM -rf $TESTDIR_TGT || log_unresolved Could not remove $TESTDIR_TGT + $MKDIR -p $TESTDIR_TGT || log_unresolved Could not create $TESTDIR_TGT + + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + log_must $ZFS create $TESTPOOL/$TESTFS_TGT + log_must $ZFS set mountpoint=$TESTDIR_TGT $TESTPOOL/$TESTFS_TGT + + $MKDIR -p $OLDDIR || log_unresolved Could not create $OLDDIR + $MKDIR -p $NEWDIR_IN_FS || log_unresolved Could not create $NEWDIR_IN_FS + $MKDIR -p $NEWDIR_ACROSS_FS || log_unresolved Could not create $NEWDIR_ACROSS_FS + +} + +function wait_pid +{ + for pid in $1 + do + $PS -e | $GREP $pid >/dev/null 2>&1 + (( $? == 0 )) && $WAIT $pid + done +} + + +# +# Generate given number files in a +# directory of zfs file system +# $1 - the directory holds the generated files +# $2 - number of to-be-generated files +# + +function generate_files +{ + typeset -i count + typeset -i proc_num=0 + + if (( $2 == $MVNUMFILES )); then + count=1 + else + count=$MVNUMFILES+1 + fi + + while (( count <= $2 )) + do + $CP /etc/passwd $1/file_$count \ + > /dev/null 2>&1 & + + PIDS="$PIDS $!" + + proc_num=`$ECHO $PIDS | $WC -w` + if (( proc_num >= GANGPIDS )); then + wait_pid "$PIDS" + proc_num=0 + PIDS="" + fi + + (( count = count + 1 )) + done + +} + +# +# Move given number files from one directory to +# another directory in parallel +# $1 - source directory +# $2 - target directory +# +function mv_files +{ + $FIND $1 -type f -print | xargs -J % \ + $MV % $2 > /dev/null 2>&1 +} + +# +# Count the files number after moving, and +# compare it with the original number +# $1 - directory that to be operated +# $2 - original files number +# +function count_files +{ + typeset -i file_num + file_num=`$FIND $1 -type f -print | \ + wc -l` + (( file_num != $2 )) && \ + log_fail "The file number of target directory"\ + "$2 is not equal to that of the source "\ + "directory $1" + +} + +# +# Running the 'mv' test +# $1 - old directory +# $2 - new directory +# +function mv_test +{ + typeset old=$1 + typeset new=$2 + + typeset -i inc_num=$(( MVNUMFILES + MVNUMINCR )) + typeset -i num=0 + + for num in $MVNUMFILES $inc_num + do + generate_files $old $num + + mv_files $old $new + count_files $new $num + + mv_files $new $old + count_files $old $num + done + + typeset dir=$(get_device_dir $DISKS) + verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir" + + return 0 +} + diff --git a/tests/sys/cddl/zfs/tests/mv_files/mv_files_test.sh b/tests/sys/cddl/zfs/tests/mv_files/mv_files_test.sh new file mode 100755 index 00000000000..943b447e107 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mv_files/mv_files_test.sh @@ -0,0 +1,88 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case mv_files_001_pos cleanup +mv_files_001_pos_head() +{ + atf_set "descr" "Doing a 'mv' of a large amount of files within a zfs filesystemworks without errors." + atf_set "require.progs" zfs zdb + atf_set "timeout" 1200 +} +mv_files_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/mv_files_common.kshlib + . $(atf_get_srcdir)/mv_files.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mv_files_001_pos.ksh || atf_fail "Testcase failed" +} +mv_files_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/mv_files_common.kshlib + . $(atf_get_srcdir)/mv_files.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case mv_files_002_pos cleanup +mv_files_002_pos_head() +{ + atf_set "descr" "Doing a 'mv' of a large amount of files across two zfs filesystemsworks without errors." + atf_set "require.progs" zfs zdb + atf_set "timeout" 1200 +} +mv_files_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/mv_files_common.kshlib + . $(atf_get_srcdir)/mv_files.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/mv_files_002_pos.ksh || atf_fail "Testcase failed" +} +mv_files_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/mv_files_common.kshlib + . $(atf_get_srcdir)/mv_files.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case mv_files_001_pos + atf_add_test_case mv_files_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/mv_files/setup.ksh b/tests/sys/cddl/zfs/tests/mv_files/setup.ksh new file mode 100644 index 00000000000..941e122de56 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/mv_files/setup.ksh @@ -0,0 +1,47 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/mv_files/mv_files_common.kshlib + +verify_runnable "global" + +check_bg_procs_limit_num +if [[ $? -ne 0 ]]; then + log_note "ksh background process limit number is 25" + export GANGPIDS=25 +fi + +export PIDS="" + +init_setup $DISK + +log_pass diff --git a/tests/sys/cddl/zfs/tests/nestedfs/Makefile b/tests/sys/cddl/zfs/tests/nestedfs/Makefile new file mode 100644 index 00000000000..071316e20f5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/nestedfs/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/nestedfs +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= nestedfs_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= nestedfs.cfg +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= nestedfs_001_pos.ksh +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/nestedfs/cleanup.ksh b/tests/sys/cddl/zfs/tests/nestedfs/cleanup.ksh new file mode 100644 index 00000000000..e2ccfb86862 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/nestedfs/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_container_cleanup diff --git a/tests/sys/cddl/zfs/tests/nestedfs/nestedfs.cfg b/tests/sys/cddl/zfs/tests/nestedfs/nestedfs.cfg new file mode 100644 index 00000000000..39a87297e27 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/nestedfs/nestedfs.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)nestedfs.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE0=testfile0.${TESTCASE_ID} +export TESTFILE1=testfile1.${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/nestedfs/nestedfs_001_pos.ksh b/tests/sys/cddl/zfs/tests/nestedfs/nestedfs_001_pos.ksh new file mode 100644 index 00000000000..51401027300 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/nestedfs/nestedfs_001_pos.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)nestedfs_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: nestedfs_001_pos +# +# DESCRIPTION: +# Given a pool create a nested file system and a ZFS file system +# in the nested file system. Populate the file system. +# +# As a sub-assertion, the test verifies that a nested file system with +# a mounted file system cannot be destroyed. +# +# STRATEGY: +# 1. Create a file in the new mountpoint +# 2. Unmount the new mountpoint +# 3. Show a nested file system with file systems cannot be destroyed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +typeset OP=create +typeset -i BLOCKSZ=8192 +typeset -i NUM_WRITES=600 +typeset -i DATA=0 + +log_assert "Verify a nested file system can be created/destroyed." + +log_must $FILE_WRITE -o $OP -f $TESTDIR1/$TESTFILE0 -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA + +log_must $ZFS unmount $TESTDIR1 + +log_note "Verify that a nested file system with a mounted file system "\ + "cannot be destroyed." +log_mustnot $ZFS destroy $TESTPOOL/$TESTCTR + +log_pass "A nested file system was successfully populated." diff --git a/tests/sys/cddl/zfs/tests/nestedfs/nestedfs_test.sh b/tests/sys/cddl/zfs/tests/nestedfs/nestedfs_test.sh new file mode 100755 index 00000000000..7643d99ef48 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/nestedfs/nestedfs_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case nestedfs_001_pos cleanup +nestedfs_001_pos_head() +{ + atf_set "descr" "Verify a nested file system can be created/destroyed." + atf_set "require.progs" zfs +} +nestedfs_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/nestedfs.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/nestedfs_001_pos.ksh || atf_fail "Testcase failed" +} +nestedfs_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/nestedfs.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case nestedfs_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/nestedfs/setup.ksh b/tests/sys/cddl/zfs/tests/nestedfs/setup.ksh new file mode 100644 index 00000000000..1c30df46ae8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/nestedfs/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_container_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/no_space/Makefile b/tests/sys/cddl/zfs/tests/no_space/Makefile new file mode 100644 index 00000000000..b0daef2c10d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/no_space/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/no_space +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= no_space_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= enospc.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= enospc_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/no_space/cleanup.ksh b/tests/sys/cddl/zfs/tests/no_space/cleanup.ksh new file mode 100644 index 00000000000..21fdcc3528b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/no_space/cleanup.ksh @@ -0,0 +1,47 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +ismounted "$TESTPOOL/$TESTFS" +(( $? == 0 )) && \ + log_must $ZFS umount $TESTDIR + +destroy_pool $TESTPOOL +# +# Remove 100mb partition. +# +cleanup_devices "$DISK" + +log_pass diff --git a/tests/sys/cddl/zfs/tests/no_space/enospc.cfg b/tests/sys/cddl/zfs/tests/no_space/enospc.cfg new file mode 100644 index 00000000000..0cec26f9e79 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/no_space/enospc.cfg @@ -0,0 +1,39 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)enospc.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE0=testfile0.${TESTCASE_ID} +export TESTFILE1=testfile1.${TESTCASE_ID} + +export SIZE=100mb +export ENOSPC=28 +export BLOCKSZ=8192 +export NUM_WRITES=65536 +export DATA=0 diff --git a/tests/sys/cddl/zfs/tests/no_space/enospc_001_pos.ksh b/tests/sys/cddl/zfs/tests/no_space/enospc_001_pos.ksh new file mode 100644 index 00000000000..807f901dce3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/no_space/enospc_001_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)enospc_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: enospc_001 +# +# DESCRIPTION: +# ENOSPC is returned on an attempt to write a second file +# to a file system after a first file was written that terminated +# with ENOSPC on a cleanly initialized file system. +# +# STRATEGY: +# 1. Write a file until the file system is full. +# 2. Ensure that ENOSPC is returned. +# 3. Write a second file while the file system remains full. +# 4. Verify the return code is ENOSPC. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "ENOSPC is returned when file system is full." +log_must $ZFS set compression=off $TESTPOOL/$TESTFS + +log_note "Writing file: $TESTFILE0 until ENOSPC." +$FILE_WRITE -o create -f $TESTDIR/$TESTFILE0 -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA +ret=$? + +(( $ret != $ENOSPC )) && \ + log_fail "$TESTFILE0 returned: $ret rather than ENOSPC." + +log_note "Write another file: $TESTFILE1 but expect ENOSPC." +$FILE_WRITE -o create -f $TESTDIR/$TESTFILE1 -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA +ret=$? + +(( $ret != $ENOSPC )) && \ + log_fail "$TESTFILE1 returned: $ret rather than ENOSPC." + +log_pass "ENOSPC returned as expected." diff --git a/tests/sys/cddl/zfs/tests/no_space/no_space_test.sh b/tests/sys/cddl/zfs/tests/no_space/no_space_test.sh new file mode 100755 index 00000000000..db86bcc15b0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/no_space/no_space_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case enospc_001_pos cleanup +enospc_001_pos_head() +{ + atf_set "descr" "ENOSPC is returned when file system is full." + atf_set "require.progs" zfs +} +enospc_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/enospc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/enospc_001_pos.ksh || atf_fail "Testcase failed" +} +enospc_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/enospc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case enospc_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/no_space/setup.ksh b/tests/sys/cddl/zfs/tests/no_space/setup.ksh new file mode 100644 index 00000000000..60cd910c96d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/no_space/setup.ksh @@ -0,0 +1,40 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.4 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +wipe_partition_table $DISK +log_must set_partition 1 "" $SIZE $DISK + +default_setup $DISK"p1" diff --git a/tests/sys/cddl/zfs/tests/online_offline/Makefile b/tests/sys/cddl/zfs/tests/online_offline/Makefile new file mode 100644 index 00000000000..ad5cb1a73b4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/online_offline/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/online_offline +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= online_offline_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= online_offline_001_pos.ksh +${PACKAGE}FILES+= online_offline.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= online_offline_002_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/online_offline/cleanup.ksh b/tests/sys/cddl/zfs/tests/online_offline/cleanup.ksh new file mode 100644 index 00000000000..8dcf65f6cda --- /dev/null +++ b/tests/sys/cddl/zfs/tests/online_offline/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +verify_runnable "global" + +reap_children +default_cleanup_noexit +cleanup_devices ${DISKS} +log_pass diff --git a/tests/sys/cddl/zfs/tests/online_offline/online_offline.cfg b/tests/sys/cddl/zfs/tests/online_offline/online_offline.cfg new file mode 100644 index 00000000000..5a59f01c843 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/online_offline/online_offline.cfg @@ -0,0 +1,31 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Copyright 2014 Spectra Logic Corporation +# Use is subject to license terms. +# + +export TESTFILE=testfile.${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/online_offline/online_offline_001_pos.ksh b/tests/sys/cddl/zfs/tests/online_offline/online_offline_001_pos.ksh new file mode 100644 index 00000000000..d98206275ff --- /dev/null +++ b/tests/sys/cddl/zfs/tests/online_offline/online_offline_001_pos.ksh @@ -0,0 +1,67 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Copyright 2014 Spectra Logic Corporation. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +function verify_assertion +{ + busy_path $TESTDIR + for disk in $DISKS; do + log_must $ZPOOL offline $TESTPOOL $disk + check_state $TESTPOOL $disk "offline" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL is not offline." + fi + + log_must $ZPOOL online $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi + done + reap_children + + typeset dir=$(get_device_dir $DISKS) + verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir" +} + +log_assert "Turning a disk offline and back online during I/O completes." +log_onexit cleanup + +for keyword in "mirror" "raidz"; do + typeset child_pid="" + default_setup_noexit "$keyword $DISKS" + verify_assertion + destroy_pool $TESTPOOL +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/online_offline/online_offline_002_neg.ksh b/tests/sys/cddl/zfs/tests/online_offline/online_offline_002_neg.ksh new file mode 100644 index 00000000000..f1608539454 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/online_offline/online_offline_002_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Copyright 2014 Spectra Logic Corporation. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +function verify_assertion +{ + keyword="$1" + typeset -i redundancy + set -A DISKLIST $DISKS + + case "$keyword" in + "") redundancy=0 ;; + "mirror") (( redundancy=${#DISKLIST[@]} - 1 )) ;; + "raidz") redundancy=1 ;; + "raidz2") redundancy=2 ;; + "raidz3") redundancy=3 ;; + *) log_fail "Unknown keyword" ;; + esac + + echo redundancy is $redundancy + + if [ ${#DISKLIST[@]} -le "$redundancy" ]; then + log_fail "Insufficiently many disks configured for this test" + fi + + busy_path $TESTDIR + # Offline the allowed number of disks + for ((i=0; i<$redundancy; i=$i+1 )); do + log_must $ZPOOL offline $TESTPOOL ${DISKLIST[$i]} + done + + #Verify that offlining any additional disks should fail + for ((i=$redundancy; i<${#DISKLIST[@]}; i=$i+1 )); do + log_mustnot $ZPOOL offline $TESTPOOL ${DISKLIST[$i]} + done + reap_children + + typeset dir=$(get_device_dir $DISKS) + verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir" +} + +log_assert "Turning both disks offline should fail." + +for keyword in "" "mirror" "raidz" "raidz2"; do + child_pids="" + default_setup_noexit "$keyword $DISKS" + verify_assertion "$keyword" + destroy_pool $TESTPOOL +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/online_offline/online_offline_test.sh b/tests/sys/cddl/zfs/tests/online_offline/online_offline_test.sh new file mode 100755 index 00000000000..927a1f2bae5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/online_offline/online_offline_test.sh @@ -0,0 +1,82 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case online_offline_001_pos cleanup +online_offline_001_pos_head() +{ + atf_set "descr" "Turning a disk offline and back online during I/O completes." + atf_set "require.progs" zpool zdb + atf_set "timeout" 3600 +} +online_offline_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/online_offline.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/online_offline_001_pos.ksh || atf_fail "Testcase failed" +} +online_offline_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/online_offline.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case online_offline_002_neg cleanup +online_offline_002_neg_head() +{ + atf_set "descr" "Offlining a disk should fail if the pool would go critical" + atf_set "require.progs" zpool zdb + atf_set "timeout" 3600 +} +online_offline_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/online_offline.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/online_offline_002_neg.ksh || atf_fail "Testcase failed" +} +online_offline_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/online_offline.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case online_offline_001_pos + atf_add_test_case online_offline_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/pool_names/Makefile b/tests/sys/cddl/zfs/tests/pool_names/Makefile new file mode 100644 index 00000000000..82969777d3d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/pool_names/Makefile @@ -0,0 +1,17 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/pool_names +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= pool_names_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= pool_names_002_neg.ksh +${PACKAGE}FILES+= pool_names.cfg +${PACKAGE}FILES+= pool_names_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/pool_names/pool_names.cfg b/tests/sys/cddl/zfs/tests/pool_names/pool_names.cfg new file mode 100644 index 00000000000..dd726c9f0fb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/pool_names/pool_names.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)pool_names.cfg 1.3 08/08/15 SMI" +# +export STF_TIMEOUT=1200 +export DISK=${DISKS%% *} diff --git a/tests/sys/cddl/zfs/tests/pool_names/pool_names_001_pos.ksh b/tests/sys/cddl/zfs/tests/pool_names/pool_names_001_pos.ksh new file mode 100644 index 00000000000..c8ca079e2f6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/pool_names/pool_names_001_pos.ksh @@ -0,0 +1,126 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)pool_names_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: pool_names_001_pos +# +# DESCRIPTION: +# +# Test that a set of valid names can be used to create pools. Further +# verify that the created pools can be destroyed. +# +# STRATEGY: +# 1) For each valid character in the character set, try to create +# and destroy the pool. +# 2) Given a list of valid pool names, try to create and destroy +# pools with the given names. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-11-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Ensure that pool names can use the ASCII subset of UTF-8" + +function cleanup +{ + [[ -n "$name" ]] && destroy_pool $name + + if [[ -d $TESTDIR ]]; then + log_must $RM -rf $TESTDIR + fi + +} + +log_onexit cleanup + +if [[ ! -e $TESTDIR ]]; then + log_must $MKDIR $TESTDIR +fi + +log_note "Ensure letters of the alphabet are allowable" + +typeset name="" + +for name in A B C D E F G H I J K L M \ + N O P Q R S T U V W X Y Z \ + a b c d e f g h i j k l m \ + n o p q r s t u v w x y z +do + log_must $ZPOOL create -m $TESTDIR $name $DISK + if ! poolexists $name; then + log_fail "Could not create a pool called '$name'" + fi + + log_must $ZPOOL destroy $name +done + +log_note "Ensure a variety of unusual names passes" + +name="" + +for name in "a.............................." "a_" "a-" "a:" \ + "a." "a123456" "bc0t0d0" "m1rr0r_p00l" "ra1dz_p00l" \ + "araidz2" "C0t2d0" "cc0t0" "raid2:-_." "mirr_:-." \ + "m1rr0r-p00l" "ra1dz-p00l" "spar3_p00l" \ + "spar3-p00l" "hiddenmirrorpool" "hiddenraidzpool" \ + "hiddensparepool" +do + log_must $ZPOOL create -m $TESTDIR $name $DISK + if ! poolexists $name; then + log_fail "Could not create a pool called '$name'" + fi + + # + # Since the naming convention applies to datasets too, + # create datasets with the same names as above. + # + log_must $ZFS create $name/$name + log_must $ZFS snapshot $name/$name@$name + log_must $ZFS clone $name/$name@$name $name/clone_$name + log_must $ZFS create -V 150m $name/$name/$name + + log_must $ZPOOL destroy $name +done + +log_pass "Valid pool names were accepted correctly." diff --git a/tests/sys/cddl/zfs/tests/pool_names/pool_names_002_neg.ksh b/tests/sys/cddl/zfs/tests/pool_names/pool_names_002_neg.ksh new file mode 100644 index 00000000000..963defc359b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/pool_names/pool_names_002_neg.ksh @@ -0,0 +1,147 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)pool_names_002_neg.ksh 1.4 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: pool_names_002_neg +# +# DESCRIPTION: +# +# Ensure that a set of invalid names cannot be used to create pools. +# +# STRATEGY: +# 1) For each invalid character in the character set, try to create +# and destroy the pool. Verify it fails. +# 2) Given a list of invalid pool names, ensure the pools are not +# created. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-11-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Ensure that a set of invalid names cannot be used to create pools." + +# Global variable use to cleanup failures. +POOLNAME="" + +function cleanup +{ + destroy_pool $POOLNAME + + if [[ -d $TESTDIR ]]; then + log_must $RM -rf $TESTDIR + fi +} + +log_onexit cleanup + +if [[ ! -e $TESTDIR ]]; then + log_must $MKDIR $TESTDIR +fi + +log_note "Ensure invalid characters fail" +for POOLNAME in "!" "\"" "#" "$" "%" "&" "'" "(" ")" \ + "\*" "+" "," "-" "\." "/" "\\" \ + ":" ";" "<" "=" ">" "\?" "@" \ + "[" "]" "^" "_" "\`" "{" "|" "}" "~" +do + log_mustnot $ZPOOL create -m $TESTDIR $POOLNAME $DISK + if poolexists $POOLNAME; then + log_fail "Unexpectedly created pool: '$POOLNAME'" + fi + + log_mustnot $ZPOOL destroy $POOLNAME +done + +# poolexists cannot be used to test pools with numeric names, because +# "zpool list" will interpret the name as a repeat interval and never return. +log_note "Ensure invalid characters fail" +for POOLNAME in 0 1 2 3 4 5 6 7 8 9 2222222222222222222 +do + log_mustnot $ZPOOL create -m $TESTDIR $POOLNAME $DISK + log_mustnot $ZPOOL destroy $POOLNAME +done + +log_note "Check that invalid octal values fail" +for oct in "\000" "\001" "\002" "\003" "\004" "\005" "\006" "\007" \ + "\010" "\011" "\012" "\013" "\014" "\015" "\017" \ + "\020" "\021" "\022" "\023" "\024" "\025" "\026" "\027" \ + "\030" "\031" "\032" "\033" "\034" "\035" "\036" "\037" \ + "\040" "\177" +do + # Be careful not to print the poolname, because it might be a terminal + # control character + POOLNAME=`eval "print x | tr 'x' '$oct'"` + $ZPOOL create -m $TESTDIR $POOLNAME $DISK > /dev/null 2>&1 + if [ $? = 0 ]; then + log_fail "Unexpectedly created pool: \"$oct\"" + elif poolexists $POOLNAME; then + log_fail "Unexpectedly created pool: \"$oct\"" + fi + + $ZPOOL destroy $POOLNAME > /dev/null 2>&1 + if [ $? = 0 ]; then + log_fail "Unexpectedly destroyed pool: \"$oct\"" + fi +done + +log_note "Verify invalid pool names fail" +set -A POOLNAME "c0t0d0s0" "c0t0d0" "c0t0d19" "c0t50000E0108D279d0" \ + "mirror" "raidz" ",," ",,,,,,,,,,,,,,,,,,,,,,,,," \ + "mirror_pool" "raidz_pool" \ + "mirror-pool" "raidz-pool" "spare" "spare_pool" \ + "spare-pool" "raidz1-" "raidz2:" ":aaa" "-bbb" "_ccc" ".ddd" +POOLNAME[${#POOLNAME[@]}]='log' +typeset -i i=0 +while ((i < ${#POOLNAME[@]})); do + log_mustnot $ZPOOL create -m $TESTDIR ${POOLNAME[$i]} $DISK + if poolexists ${POOLNAME[$i]}; then + log_fail "Unexpectedly created pool: '${POOLNAME[$i]}'" + fi + + log_mustnot $ZPOOL destroy ${POOLNAME[$i]} + + ((i += 1)) +done + +log_pass "Invalid names and characters were caught correctly" diff --git a/tests/sys/cddl/zfs/tests/pool_names/pool_names_test.sh b/tests/sys/cddl/zfs/tests/pool_names/pool_names_test.sh new file mode 100755 index 00000000000..fca517909a7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/pool_names/pool_names_test.sh @@ -0,0 +1,68 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case pool_names_001_pos +pool_names_001_pos_head() +{ + atf_set "descr" "Ensure that pool names can use the ASCII subset of UTF-8" + atf_set "require.progs" zfs zpool + atf_set "timeout" 1200 +} +pool_names_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/pool_names.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/pool_names_001_pos.ksh || atf_fail "Testcase failed" +} + + +atf_test_case pool_names_002_neg +pool_names_002_neg_head() +{ + atf_set "descr" "Ensure that a set of invalid names cannot be used to create pools." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +pool_names_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/pool_names.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/pool_names_002_neg.ksh || atf_fail "Testcase failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case pool_names_001_pos + atf_add_test_case pool_names_002_neg +} diff --git a/tests/sys/cddl/zfs/tests/poolversion/Makefile b/tests/sys/cddl/zfs/tests/poolversion/Makefile new file mode 100644 index 00000000000..06adc458cd3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/poolversion/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/poolversion +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= poolversion_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= poolversion_002_pos.ksh +${PACKAGE}FILES+= poolversion_001_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/poolversion/cleanup.ksh b/tests/sys/cddl/zfs/tests/poolversion/cleanup.ksh new file mode 100644 index 00000000000..56e053f41c0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/poolversion/cleanup.ksh @@ -0,0 +1,45 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 07/10/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +verify_runnable "global" + +$ZPOOL set 2>&1 | $GREP version > /dev/null +if [ $? -eq 1 ] +then + log_unsupported "zpool version property not supported on this system." +fi + +destroy_pool $TESTPOOL +destroy_pool $TESTPOOL2 + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/poolversion/poolversion_001_pos.ksh b/tests/sys/cddl/zfs/tests/poolversion/poolversion_001_pos.ksh new file mode 100644 index 00000000000..7d15cf61bdb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/poolversion/poolversion_001_pos.ksh @@ -0,0 +1,73 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)poolversion_001_pos.ksh 1.2 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: poolversion_001_pos +# +# DESCRIPTION: +# +# zpool set version can upgrade a pool +# +# STRATEGY: +# 1. Taking a version 1 pool +# 2. For all known versions, set the version of the pool using zpool set +# 3. Verify that pools version +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" +log_assert "zpool set version can upgrade a pool" +for version in 1 2 3 4 5 6 7 8 +do + log_must $ZPOOL set version=$version $TESTPOOL + ACTUAL=$($ZPOOL get version $TESTPOOL | $GREP version \ + | $AWK '{print $3}') + if [ "$ACTUAL" != "$version" ] + then + log_fail "v. $ACTUAL set for $TESTPOOL, expected v. $version!" + fi +done + +log_pass "zpool set version can upgrade a pool" + diff --git a/tests/sys/cddl/zfs/tests/poolversion/poolversion_002_pos.ksh b/tests/sys/cddl/zfs/tests/poolversion/poolversion_002_pos.ksh new file mode 100644 index 00000000000..f25aa7c2a60 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/poolversion/poolversion_002_pos.ksh @@ -0,0 +1,86 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)poolversion_002_pos.ksh 1.2 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: poolversion_002_pos +# +# DESCRIPTION: +# +# zpool set version can only increment pool version +# +# STRATEGY: +# 1. Set a version 1 pool to be a version 6 pool +# 2. Verify it's set to version 6 +# 3. Attempt to set prior versions +# 4. Verify it's still set to version 6 +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-07-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" +log_assert "zpool set version can only increment pool version" + +log_must $ZPOOL set version=6 $TESTPOOL2 +# verify it's actually that version - by checking the version property +# and also by trying to set bootfs (which should fail if it is not version 6) + +VERSION=$($ZPOOL get version $TESTPOOL2| $GREP version | $AWK '{print $3}') +if [ "$VERSION" != "6" ] +then + log_fail "Version $VERSION set for $TESTPOOL2 expected version 6!" +fi +log_must $ZPOOL set bootfs=$TESTPOOL2 $TESTPOOL2 + +# now verify we can't downgrade the version +log_mustnot $ZPOOL set version=5 $TESTPOOL2 +log_mustnot $ZPOOL set version=-1 $TESTPOOL2 + +# verify the version is still 6 +VERSION=$($ZPOOL get version $TESTPOOL2 | $GREP version | $AWK '{print $3}') +if [ "$VERSION" != "6" ] +then + log_fail "Version $VERSION set for $TESTPOOL2, expected version 6!" +fi + +log_pass "zpool set version can only increment pool version" + diff --git a/tests/sys/cddl/zfs/tests/poolversion/poolversion_test.sh b/tests/sys/cddl/zfs/tests/poolversion/poolversion_test.sh new file mode 100755 index 00000000000..46f71377f19 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/poolversion/poolversion_test.sh @@ -0,0 +1,78 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case poolversion_001_pos cleanup +poolversion_001_pos_head() +{ + atf_set "descr" "zpool set version can upgrade a pool" + atf_set "require.progs" zpool +} +poolversion_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/poolversion_001_pos.ksh || atf_fail "Testcase failed" +} +poolversion_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case poolversion_002_pos cleanup +poolversion_002_pos_head() +{ + atf_set "descr" "zpool set version can only increment pool version" + atf_set "require.progs" zpool +} +poolversion_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/poolversion_002_pos.ksh || atf_fail "Testcase failed" +} +poolversion_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case poolversion_001_pos + atf_add_test_case poolversion_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/poolversion/setup.ksh b/tests/sys/cddl/zfs/tests/poolversion/setup.ksh new file mode 100644 index 00000000000..5aec1d27023 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/poolversion/setup.ksh @@ -0,0 +1,50 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 07/10/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +verify_runnable "global" + +$ZPOOL set 2>&1 | $GREP version > /dev/null +if [ $? -eq 1 ] +then + log_unsupported "zpool version property not supported on this system." +fi + +DISKS_ARRAY=($DISKS) +# create a version 1 pool +log_must $ZPOOL create -f -o version=1 $TESTPOOL ${DISKS_ARRAY[0]} + + +# create another version 1 pool +log_must $ZPOOL create -f -o version=1 $TESTPOOL2 ${DISKS_ARRAY[1]} + +log_pass diff --git a/tests/sys/cddl/zfs/tests/quota/Makefile b/tests/sys/cddl/zfs/tests/quota/Makefile new file mode 100644 index 00000000000..e1895f92f6b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/Makefile @@ -0,0 +1,24 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/quota +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= quota_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= quota_003_pos.ksh +${PACKAGE}FILES+= quota_006_neg.ksh +${PACKAGE}FILES+= quota_002_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= quota.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= quota_004_pos.ksh +${PACKAGE}FILES+= quota_005_pos.ksh +${PACKAGE}FILES+= quota_001_pos.ksh +${PACKAGE}FILES+= quota.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/quota/cleanup.ksh b/tests/sys/cddl/zfs/tests/quota/cleanup.ksh new file mode 100644 index 00000000000..e2ccfb86862 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_container_cleanup diff --git a/tests/sys/cddl/zfs/tests/quota/quota.cfg b/tests/sys/cddl/zfs/tests/quota/quota.cfg new file mode 100644 index 00000000000..4728d085482 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota.cfg @@ -0,0 +1,36 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)quota.cfg 1.3 08/08/15 SMI" +# + +export BLOCK_SIZE=8192 +export QUOTA_VALUE=10000000 +export TESTFILE1=file1.${TESTCASE_ID} +export TESTFILE2=file2.${TESTCASE_ID} +export TOLERANCE=131071 diff --git a/tests/sys/cddl/zfs/tests/quota/quota.kshlib b/tests/sys/cddl/zfs/tests/quota/quota.kshlib new file mode 100644 index 00000000000..d54c7a43458 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota.kshlib @@ -0,0 +1,88 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)quota.kshlib 1.2 07/01/09 SMI" +# + +# BLOCK_SIZE, QUOTA_VALUE and TOLERANCE set in quota.cfg +readonly EDQUOT=69 + +# +# Function to fill the quota of a zfs filesystem +# +# $1 - The File system or container to fill. +# $2 - The mountpoint to use. +# +function fill_quota +{ + typeset FILESYSTEM="$1" + typeset MNTPT="$2" + + log_must $ZFS set quota=$QUOTA_VALUE $FILESYSTEM + + typeset -i write_size=0 + (( write_size = 2 * QUOTA_VALUE )) + + typeset -i zret=0 + $FILE_WRITE -o create -f $MNTPT/$TESTFILE1 -b $BLOCK_SIZE \ + -c $write_size -d 0 + zret=$? + [[ $zret -ne EDQUOT ]] && log_fail "Got error $zret; expected $EDQUOT" + + typeset -i file_size=`$LS -ls $MNTPT/$TESTFILE1 | $AWK '{ print $1 }'` + typeset -i limit=0 + (( file_size = file_size * 512 )) + (( limit = QUOTA_VALUE + TOLERANCE )) + (( file_size > limit )) && \ + log_fail "File was created larger than the quota value, aborting!!!" + return 0 +} + +# +# Function attempts to write another file in a ZFS filesystem +# that has already filled its quota +# +function exceed_quota +{ + typeset FILESYSTEM="$1" + typeset MNTPT="$2" + + log_must fill_quota $FILESYSTEM $MNTPT + typeset -i write_size=0 + (( write_size = 2 * QUOTA_VALUE )) + typeset -i zret=0 + # + # Writing a file without API to access return code + # + log_note "Creating a file in a FS that has already exceeded its quota" + $FILE_WRITE -o create -f $MNTPT/$TESTFILE2 \ + -b $BLOCK_SIZE -c $write_size -d 0 + zret=$? + [[ $zret -ne EDQUOT ]] && log_fail "Got error $zret; expected $EDQUOT" + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/quota/quota_001_pos.ksh b/tests/sys/cddl/zfs/tests/quota/quota_001_pos.ksh new file mode 100644 index 00000000000..47e3d05a031 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota_001_pos.ksh @@ -0,0 +1,91 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)quota_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/quota/quota.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: quota_001_pos +# +# DESCRIPTION: +# +# A ZFS file system quota limits the amount of pool space +# available to a file system. Apply a quota and verify +# that no more file creates are permitted. +# +# STRATEGY: +# 1) Apply quota to ZFS file system +# 2) Create a file which is larger than the set quota +# 3) Verify that the resulting file size is less than the quota limit +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify that file size is limited by the file system quota" + +# +# cleanup to be used internally as otherwise quota assertions cannot be +# run independently or out of order +# +function cleanup +{ + [[ -e $TESTDIR/$TESTFILE1 ]] && \ + log_must $RM $TESTDIR/$TESTFILE1 + # + # Need to allow time for space to be released back to + # pool, otherwise next test will fail trying to set a + # quota which is less than the space used. + # + sleep 5 + log_must $ZFS set quota=none $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +# +# Sets the quota value and attempts to fill it with a file +# twice the size of the quota +# +log_must fill_quota $TESTPOOL/$TESTFS $TESTDIR + +log_pass "File size limited by quota" diff --git a/tests/sys/cddl/zfs/tests/quota/quota_002_pos.ksh b/tests/sys/cddl/zfs/tests/quota/quota_002_pos.ksh new file mode 100644 index 00000000000..4b6fae50ce8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota_002_pos.ksh @@ -0,0 +1,88 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)quota_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/quota/quota.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: quota_002_pos +# +# DESCRIPTION: +# A zfs file system quota limits the amount of pool space +# available to a given ZFS file system. Once exceeded, it is impossible +# to write any more files to the file system. +# +# STRATEGY: +# 1) Apply quota to the ZFS file system +# 2) Exceed the quota +# 3) Attempt to write another file +# 4) Verify the attempt fails with error code 49 (EDQUOTA) +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify that a file write cannot exceed the file system quota" + +# +# cleanup to be used internally as otherwise quota assertions cannot be +# run independently or out of order +# +function cleanup +{ + [[ -e $TESTDIR/$TESTFILE1 ]] && \ + log_must $RM $TESTDIR/$TESTFILE1 + + [[ -e $TESTDIR/$TESTFILE2 ]] && \ + log_must $RM $TESTDIR/$TESTFILE2 + log_must $ZFS set quota=none $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +# +# Fills the quota & attempts to write another file +# +log_must exceed_quota $TESTPOOL/$TESTFS $TESTDIR + +log_pass "Could not write file. Quota limit enforced as expected" diff --git a/tests/sys/cddl/zfs/tests/quota/quota_003_pos.ksh b/tests/sys/cddl/zfs/tests/quota/quota_003_pos.ksh new file mode 100644 index 00000000000..5143eb29de1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota_003_pos.ksh @@ -0,0 +1,94 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)quota_003_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/quota/quota.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: quota_003_pos +# +# DESCRIPTION: +# A ZFS file system quota limits the amount of pool space +# available to a file system dataset. Apply a quota and verify +# that no more file creates are permitted. +# +# NOTE: THis test applies to a dataset rather than a file system. +# +# STRATEGY: +# 1) Apply quota to ZFS file system dataset +# 2) Create a file which is larger than the set quota +# 3) Verify that the resulting file size is less than the quota limit +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify that file size is limited by the file system quota" \ + "(dataset version)" + +# +# cleanup to be used internally as otherwise quota assertions cannot be +# run independently or out of order +# +function cleanup +{ + [[ -e $TESTDIR1/$TESTFILE1 ]] && \ + log_must $RM $TESTDIR1/$TESTFILE1 + + # + # Need to allow time for space to be released back to + # pool, otherwise next test will fail trying to set a + # quota which is less than the space used. + # + sleep 5 + log_must $ZFS set quota=none $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +# +# Sets the quota value and attempts to fill it with a file +# twice the size of the quota +# +log_must fill_quota $TESTPOOL/$TESTCTR/$TESTFS1 $TESTDIR1 + +log_pass "File size limited by quota" diff --git a/tests/sys/cddl/zfs/tests/quota/quota_004_pos.ksh b/tests/sys/cddl/zfs/tests/quota/quota_004_pos.ksh new file mode 100644 index 00000000000..f5fe5f4f220 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota_004_pos.ksh @@ -0,0 +1,89 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)quota_004_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/quota/quota.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: quota_004_pos +# +# DESCRIPTION: +# A zfs file system quota limits the amount of pool space +# available to a given ZFS file system dataset. Once exceeded, it +# is impossible to write any more files to the file system. +# +# STRATEGY: +# 1) Apply quota to the ZFS file system dataset +# 2) Exceed the quota +# 3) Attempt to write another file +# 4) Verify the attempt fails with error code 49 (EDQUOTA) +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify that a file write cannot exceed the file system quota" \ + "(dataset version)" + +# +# cleanup to be used internally as otherwise quota assertions cannot be +# run independently or out of order +# +function cleanup +{ + [[ -e $TESTDIR1/$TESTFILE1 ]] && \ + log_must $RM $TESTDIR1/$TESTFILE1 + + [[ -e $TESTDIR1/$TESTFILE2 ]] && \ + log_must $RM $TESTDIR1/$TESTFILE2 + log_must $ZFS set quota=none $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +# +# Fills the quota & attempts to write another file +# +log_must exceed_quota $TESTPOOL/$TESTCTR/$TESTFS1 $TESTDIR1 + +log_pass "Could not write file. Quota limit enforced as expected" diff --git a/tests/sys/cddl/zfs/tests/quota/quota_005_pos.ksh b/tests/sys/cddl/zfs/tests/quota/quota_005_pos.ksh new file mode 100644 index 00000000000..1cb2415de37 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota_005_pos.ksh @@ -0,0 +1,88 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)quota_005_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: quota_005_pos +# +# DESCRIPTION: +# +# Verify that quota doesn't inherit its value from parent. +# +# STRATEGY: +# 1) Set quota for parents +# 2) Create a filesystem tree +# 3) Verify that the 'quota' for descendent doesnot inherit the value. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-17) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +function cleanup +{ + datasetexists $fs_child && \ + log_must $ZFS destroy $fs_child + + log_must $ZFS set quota=none $fs +} + +log_onexit cleanup + +log_assert "Verify that quota does not inherit its value from parent." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +fs_child=$TESTPOOL/$TESTFS/$TESTFS + +typeset -l space_avail=$(get_prop available $fs) +typeset -l quotasize=$space_avail +((quotasize = quotasize * 2 )) +log_must $ZFS list +log_must $ZFS set quota=$quotasize $fs + +log_must $ZFS create $fs_child +typeset -l quota_space=$(get_prop quota $fs_child) +[[ $quota_space == $quotasize ]] && \ + log_fail "The quota of child dataset inherits its value from parent." + +log_pass "quota doesnot inherit its value from parent as expected." diff --git a/tests/sys/cddl/zfs/tests/quota/quota_006_neg.ksh b/tests/sys/cddl/zfs/tests/quota/quota_006_neg.ksh new file mode 100644 index 00000000000..f2531904efb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota_006_neg.ksh @@ -0,0 +1,84 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)quota_006_neg.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: quota_006_neg +# +# DESCRIPTION: +# +# Can't set a quota to less than currently being used by the dataset. +# +# STRATEGY: +# 1) Create a filesystem +# 2) Set a quota on the filesystem that is lower than the space +# currently in use. +# 3) Verify that the attempt fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-09-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify cannot set quota lower than the space currently in use" + +function cleanup +{ + log_must $ZFS set quota=none $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +typeset -l quota_integer_size=0 +typeset invalid_size="123! @456 7#89 0\$ abc123% 123%s 12%s3 %c123 123%d %x123 12%p3 \ + ^def456 789&ghi" +typeset -l space_used=`get_prop used $TESTPOOL/$TESTFS` +(( quota_integer_size = space_used - 1 )) +typeset -l quota_fp_size=${quota_integer_size}.123 + +for size in 0 -1 $quota_integer_size -$quota_integer_size $quota_fp_size -$quota_fp_size \ + $invalid_size ; do + log_mustnot $ZFS set quota=$size $TESTPOOL/$TESTFS +done +log_must $ZFS set quota=$space_used $TESTPOOL/$TESTFS + +log_pass "As expected cannot set quota lower than space currently in use" diff --git a/tests/sys/cddl/zfs/tests/quota/quota_test.sh b/tests/sys/cddl/zfs/tests/quota/quota_test.sh new file mode 100755 index 00000000000..43f8ce24cc2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/quota_test.sh @@ -0,0 +1,194 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case quota_001_pos cleanup +quota_001_pos_head() +{ + atf_set "descr" "Verify that file size is limited by the file system quota" + atf_set "require.progs" zfs +} +quota_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/quota_001_pos.ksh || atf_fail "Testcase failed" +} +quota_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case quota_002_pos cleanup +quota_002_pos_head() +{ + atf_set "descr" "Verify that a file write cannot exceed the file system quota" + atf_set "require.progs" zfs +} +quota_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/quota_002_pos.ksh || atf_fail "Testcase failed" +} +quota_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case quota_003_pos cleanup +quota_003_pos_head() +{ + atf_set "descr" "Verify that file size is limited by the file system quota(dataset version)" + atf_set "require.progs" zfs +} +quota_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/quota_003_pos.ksh || atf_fail "Testcase failed" +} +quota_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case quota_004_pos cleanup +quota_004_pos_head() +{ + atf_set "descr" "Verify that a file write cannot exceed the file system quota(dataset version)" + atf_set "require.progs" zfs +} +quota_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/quota_004_pos.ksh || atf_fail "Testcase failed" +} +quota_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case quota_005_pos cleanup +quota_005_pos_head() +{ + atf_set "descr" "Verify that quota does not inherit its value from parent." + atf_set "require.progs" zfs +} +quota_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/quota_005_pos.ksh || atf_fail "Testcase failed" +} +quota_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case quota_006_neg cleanup +quota_006_neg_head() +{ + atf_set "descr" "Verify cannot set quota lower than the space currently in use" + atf_set "require.progs" zfs +} +quota_006_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/quota_006_neg.ksh || atf_fail "Testcase failed" +} +quota_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/quota.kshlib + . $(atf_get_srcdir)/quota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case quota_001_pos + atf_add_test_case quota_002_pos + atf_add_test_case quota_003_pos + atf_add_test_case quota_004_pos + atf_add_test_case quota_005_pos + atf_add_test_case quota_006_neg +} diff --git a/tests/sys/cddl/zfs/tests/quota/setup.ksh b/tests/sys/cddl/zfs/tests/quota/setup.ksh new file mode 100644 index 00000000000..f60a4587cbb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/quota/setup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/quota/quota.kshlib + +DISK=${DISKS%% *} + +default_container_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/redundancy/Makefile b/tests/sys/cddl/zfs/tests/redundancy/Makefile new file mode 100644 index 00000000000..697120a56eb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/redundancy +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= redundancy_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= redundancy.cfg +${PACKAGE}FILES+= redundancy_003_pos.ksh +${PACKAGE}FILES+= redundancy_002_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= redundancy.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= redundancy_001_pos.ksh +${PACKAGE}FILES+= redundancy_004_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/redundancy/cleanup.ksh b/tests/sys/cddl/zfs/tests/redundancy/cleanup.ksh new file mode 100644 index 00000000000..ba37281ee17 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/cleanup.ksh @@ -0,0 +1,38 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 08/05/14 SMI" +# + +. $STF_SUITE/tests/redundancy/redundancy.kshlib + +verify_runnable "global" + +cleanup + +log_pass diff --git a/tests/sys/cddl/zfs/tests/redundancy/redundancy.cfg b/tests/sys/cddl/zfs/tests/redundancy/redundancy.cfg new file mode 100644 index 00000000000..e04b4cc209b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/redundancy.cfg @@ -0,0 +1,43 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)redundancy.cfg 1.4 08/08/15 SMI" +# + +export BASEDIR=$TMPDIR/basedir.${TESTCASE_ID} +export TESTFILE=testfile.${TESTCASE_ID} + +export PRE_RECORD_FILE=$BASEDIR/pre-record-file.${TESTCASE_ID} +export PST_RECORD_FILE=$BASEDIR/pst-record-file.${TESTCASE_ID} + +export DEV_SIZE=64M +export STF_TIMEOUT=1800 + +export BLOCKSZ=$(( 1024 * 1024 )) +export NUM_WRITES=40 + diff --git a/tests/sys/cddl/zfs/tests/redundancy/redundancy.kshlib b/tests/sys/cddl/zfs/tests/redundancy/redundancy.kshlib new file mode 100644 index 00000000000..4a1142d08d9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/redundancy.kshlib @@ -0,0 +1,304 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)redundancy.kshlib 1.8 09/01/12 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +function cleanup +{ + # Log the status of the pool to assist failures. + poolexists $TESTPOOL && $ZPOOL status -v $TESTPOOL + destroy_pool $TESTPOOL + typeset dir + for dir in $TESTDIR $BASEDIR; do + if [[ -d $dir ]]; then + log_must $RM -rf $dir + fi + done +} + +# +# Record the directories construction and checksum all the files which reside +# within the specified pool +# +# $1 The specified pool +# $2 The file which save the record. +# +function record_data +{ + typeset pool=$1 + typeset recordfile=$2 + + [[ -z $pool ]] && log_fail "No specified pool." + [[ -f $recordfile ]] && log_must $RM -f $recordfile + + typeset mntpnt + mntpnt=$(get_prop mountpoint $pool) + log_must eval "$DU -a $mntpnt > $recordfile 2>&1" + # + # When the data was damaged, checksum is failing and return 1 + # So, will not use log_must + # + $FIND $mntpnt -type f -exec $CKSUM {} + >> $recordfile 2>&1 +} + +# +# Create test pool and fill with files and directories. +# +# $1 pool name +# $2 pool type +# $3 virtual devices number +# +function setup_test_env +{ + typeset pool=$1 + typeset keyword=$2 + typeset -i vdev_cnt=$3 + typeset vdevs + + typeset -i i=0 + while (( i < vdev_cnt )); do + vdevs="$vdevs $BASEDIR/vdev$i" + ((i += 1)) + done + + log_must $MKDIR -p $BASEDIR + destroy_pool $pool + log_must create_vdevs $vdevs + + $ECHO $vdevs | tr ' ' '\n' > $BASEDIR/vdevs + log_must $ZPOOL create -m $TESTDIR $pool $keyword $vdevs + + typeset file=$TESTDIR/file + log_must $FILE_WRITE -o create -f $file -b $BLOCKSZ -c $NUM_WRITES + log_must force_sync_path $TESTDIR + record_data $TESTPOOL $PRE_RECORD_FILE +} + +# +# Check pool data is valid +# +# $1 pool +# +function is_data_valid +{ + typeset pool=$1 + + record_data $pool $PST_RECORD_FILE + if ! $DIFF $PRE_RECORD_FILE $PST_RECORD_FILE > /dev/null 2>&1; then + return 1 + fi + + return 0 +} + +# +# Get the specified count devices name +# +# $1 pool name +# $2 devices count +# +function get_vdevs #pool cnt +{ + typeset pool=$1 + typeset -i cnt=$2 + + head -$cnt $BASEDIR/vdevs | tr '\n' ' ' +} + +# +# Synchronize all the data in pool +# +# $1 pool name +# +function sync_pool #pool +{ + typeset pool=$1 + + log_must force_sync_path $pool + + # If the OS has detected corruption on the pool, it will have + # automatically initiated a scrub. In that case, our "zpool scrub" + # command will fail. So we ignore its exit status and just check that + # the pool is scrubbing or has been scrubbed. + $ZPOOL scrub $pool >/dev/null 2>&1 + is_pool_scrubbing $pool || is_pool_scrubbed $pool || \ + log_fail "$ZPOOL scrub $pool failed." + log_note "$pool: $ZPOOL scrub issued." +} + +# +# Create and replace the same name virtual device files +# +# $1 pool name +# $2-n virtual device files +# +function replace_missing_devs +{ + typeset pool=$1 + shift + + typeset vdev + for vdev in $@; do + [ ! -f $vdev ] && log_must create_vdevs $vdev + log_must $ZPOOL replace -f $pool $vdev $vdev + wait_for 20 1 is_pool_resilvered $pool + done +} + +# +# Damage the labels of the specified devices. Returns 0 if all such devices +# are UNAVAIL, 1 otherwise. +# +function damage_dev_labels # pool [vdev ...] +{ + typeset pool=$1 + typeset -i ret=0 + shift + + for vdev in $*; do + check_state $pool $vdev UNAVAIL && continue + log_must create_vdevs $vdev + ret=1 + done + [ $ret -eq 0 ] && return $ret + sync_pool $pool + return $ret +} + +# +# Damage the pool's virtual device files. +# +# $1 pool name +# $2 Failing devices count +# $3 damage vdevs method, if not null, we keep the label for the vdevs +# +function damage_devs +{ + typeset pool=$1 + typeset -i cnt=$2 + typeset label="$3" + typeset vdevs + typeset -i bs_count + + vdevs=$(get_vdevs $pool $cnt) + log_note "Damaging pool $pool devices: $vdevs" + if [[ -n $label ]]; then + typeset -i i=0 + log_mustnot pool_has_errors $pool + while [ $i -lt $cnt ]; do + corrupt_file $TESTPOOL $TESTDIR/file $i + (( i += 1 )) + done + sync_pool $pool + wait_for 20 1 is_pool_scrubbed $pool + + log_must pool_has_errors $pool + else + # The pool can be syncing, thus fixing its labels. So we + # have to keep trying until all the devices go offline. + wait_for 20 1 damage_dev_labels $pool $vdevs + fi + + log_note "Pool $pool vdevs $vdevs damage completed." +} + +# +# Clear errors in the pool caused by data corruptions +# +# $1 pool name +# +function clear_errors +{ + typeset pool=$1 + + log_must $ZPOOL clear $pool + # The pool may need to resilver (issued async by 'zpool clear'), + # give it a chance to do so. + wait_for 30 1 is_pool_healthy $pool + + if ! is_data_valid $pool ; then + $ZPOOL status -x $pool + log_note "Data should be valid in $pool." + return 1 + fi + + return 0 +} + +# +# Remove the specified pool's virtual device files +# +# $1 Pool name +# $2 Missing devices count +# +function remove_devs +{ + typeset pool=$1 + typeset -i cnt=$2 + typeset vdevs + + vdevs=$(get_vdevs $pool $cnt) + log_note "Removing pool $pool vdevs: $vdevs" + log_must $RM -f $vdevs + + sync_pool $pool + for vdev in $vdevs; do + wait_for 20 1 check_state $pool $vdev UNAVAIL + done +} + +# +# Recover the bad or missing device files in the pool +# +# $1 Pool name +# $2 Missing devices count +# +function recover_bad_missing_devs +{ + typeset pool=$1 + typeset -i cnt=$2 + typeset vdevs + + vdevs=$(get_vdevs $pool $cnt) + log_note "Replacing missing pool $pool vdevs: $vdevs" + replace_missing_devs $pool $vdevs + + if ! is_pool_healthy $pool ; then + log_note "$pool should be healthy." + return 1 + fi + if ! is_data_valid $pool ; then + log_note "Data should be valid in $pool." + return 1 + fi + + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/redundancy/redundancy_001_pos.ksh b/tests/sys/cddl/zfs/tests/redundancy/redundancy_001_pos.ksh new file mode 100644 index 00000000000..2e7e8b11f55 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/redundancy_001_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)redundancy_001_pos.ksh 1.3 07/05/25 SMI" +# + +. $STF_SUITE/tests/redundancy/redundancy.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: redundancy_001_pos +# +# DESCRIPTION: +# A raidz pool can withstand at most 1 device failing or missing. +# +# STRATEGY: +# 1. Create N(>2,<5) virtual disk files. +# 2. Create raidz pool based on the virtual disk files. +# 3. Fill the filesystem with directories and files. +# 4. Record all the files and directories checksum information. +# 5. Damaged one of the virtual disk file. +# 6. Verify the data is correct to prove raidz can withstand 1 devicd is +# failing. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify raidz pool can withstand one device is failing." +log_onexit cleanup + +for cnt in 3 2; do + setup_test_env $TESTPOOL raidz $cnt + + # + # Inject data corruption error for raidz pool + # + damage_devs $TESTPOOL 1 "label" + log_must is_data_valid $TESTPOOL + log_must clear_errors $TESTPOOL + + # + # Inject bad device error for raidz pool + # + damage_devs $TESTPOOL 1 + log_must is_data_valid $TESTPOOL + log_must recover_bad_missing_devs $TESTPOOL 1 + + # + # Inject missing device error for raidz pool + # + remove_devs $TESTPOOL 1 + log_must is_data_valid $TESTPOOL +done + +log_pass "Raidz pool can withstand one devices is failing passed." diff --git a/tests/sys/cddl/zfs/tests/redundancy/redundancy_002_pos.ksh b/tests/sys/cddl/zfs/tests/redundancy/redundancy_002_pos.ksh new file mode 100644 index 00000000000..448c41e9793 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/redundancy_002_pos.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)redundancy_002_pos.ksh 1.3 07/05/25 SMI" +# + +. $STF_SUITE/tests/redundancy/redundancy.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: redundancy_002_pos +# +# DESCRIPTION: +# A raidz2 pool can withstand 2 devices are failing or missing. +# +# STRATEGY: +# 1. Create N(>3,<5) virtual disk files. +# 2. Create raidz2 pool based on the virtual disk files. +# 3. Fill the filesystem with directories and files. +# 4. Record all the files and directories checksum information. +# 5. Damaged at most two of the virtual disk files. +# 6. Verify the data is correct to prove raidz2 can withstand 2 devices +# are failing. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify raidz2 pool can withstand two devices are failing." +log_onexit cleanup + +for cnt in 3 4; do + setup_test_env $TESTPOOL raidz2 $cnt + + # + # Inject data corruption errors for raidz2 pool + # + for i in 1 2; do + damage_devs $TESTPOOL $i "label" + log_must is_data_valid $TESTPOOL + log_must clear_errors $TESTPOOL + done + + # + # Inject bad devices errors for raidz2 pool + # + for i in 1 2; do + damage_devs $TESTPOOL $i + log_must is_data_valid $TESTPOOL + log_must recover_bad_missing_devs $TESTPOOL $i + done + + # + # Inject missing device errors for raidz2 pool + # + for i in 1 2; do + remove_devs $TESTPOOL $i + log_must is_data_valid $TESTPOOL + log_must recover_bad_missing_devs $TESTPOOL $i + done +done + +log_pass "Raidz2 pool can withstand two devices are failing passed." diff --git a/tests/sys/cddl/zfs/tests/redundancy/redundancy_003_pos.ksh b/tests/sys/cddl/zfs/tests/redundancy/redundancy_003_pos.ksh new file mode 100644 index 00000000000..5971fcefd8a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/redundancy_003_pos.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)redundancy_003_pos.ksh 1.4 07/06/05 SMI" +# + +. $STF_SUITE/tests/redundancy/redundancy.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: redundancy_003_pos +# +# DESCRIPTION: +# A mirrored pool can withstand N-1 device are failing or missing. +# +# STRATEGY: +# 1. Create N(>2,<5) virtual disk files. +# 2. Create mirror pool based on the virtual disk files. +# 3. Fill the filesystem with directories and files. +# 4. Record all the files and directories checksum information. +# 5. Damaged at most N-1 of the virtual disk files. +# 6. Verify the data are correct to prove mirror can withstand N-1 devices +# are failing. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify mirrored pool can withstand N-1 devices are failing or missing." +log_onexit cleanup + +for cnt in 3 2; do + typeset -i i=1 + + setup_test_env $TESTPOOL mirror $cnt + + # + # Inject data corruption errors for mirrored pool + # + while (( i < cnt )); do + damage_devs $TESTPOOL $i "label" + log_must is_data_valid $TESTPOOL + log_must clear_errors $TESTPOOL + + (( i +=1 )) + done + + # + # Inject bad devices errors for mirrored pool + # + i=1 + while (( i < cnt )); do + damage_devs $TESTPOOL $i + log_must is_data_valid $TESTPOOL + log_must recover_bad_missing_devs $TESTPOOL $i + + (( i +=1 )) + done + + # + # Inject missing device errors for mirrored pool + # + i=1 + while (( i < cnt )); do + remove_devs $TESTPOOL $i + log_must is_data_valid $TESTPOOL + log_must recover_bad_missing_devs $TESTPOOL $i + + (( i +=1 )) + done +done + +log_pass "Mirrored pool can withstand N-1 devices failing as expected." diff --git a/tests/sys/cddl/zfs/tests/redundancy/redundancy_004_neg.ksh b/tests/sys/cddl/zfs/tests/redundancy/redundancy_004_neg.ksh new file mode 100644 index 00000000000..1eaf09c523c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/redundancy_004_neg.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)redundancy_004_neg.ksh 1.4 07/05/25 SMI" +# + +. $STF_SUITE/tests/redundancy/redundancy.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: redundancy_004_neg +# +# DESCRIPTION: +# Striped pool have no data redundancy. Any device errors will +# cause data corruption. +# +# STRATEGY: +# 1. Create N virtual disk file. +# 2. Create stripe pool based on the virtual disk files. +# 3. Fill the filesystem with directories and files. +# 4. Record all the files and directories checksum information. +# 5. Damage one of the virtual disk file. +# 6. Verify the data is error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify striped pool have no data redundancy." +log_onexit cleanup + +for cnt in 2 3; do + setup_test_env $TESTPOOL "" $cnt + damage_devs $TESTPOOL 1 "keep_label" + log_must $ZPOOL clear $TESTPOOL + log_mustnot is_pool_healthy $TESTPOOL +done + +log_pass "Striped pool has no data redundancy as expected." diff --git a/tests/sys/cddl/zfs/tests/redundancy/redundancy_test.sh b/tests/sys/cddl/zfs/tests/redundancy/redundancy_test.sh new file mode 100755 index 00000000000..73ea0317151 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/redundancy_test.sh @@ -0,0 +1,137 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case redundancy_001_pos cleanup +redundancy_001_pos_head() +{ + atf_set "descr" "Verify raidz pool can withstand one device is failing." + atf_set "timeout" 1800 +} +redundancy_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/redundancy.kshlib + . $(atf_get_srcdir)/redundancy.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/redundancy_001_pos.ksh || atf_fail "Testcase failed" +} +redundancy_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/redundancy.kshlib + . $(atf_get_srcdir)/redundancy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case redundancy_002_pos cleanup +redundancy_002_pos_head() +{ + atf_set "descr" "Verify raidz2 pool can withstand two devices are failing." + atf_set "timeout" 1800 +} +redundancy_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/redundancy.kshlib + . $(atf_get_srcdir)/redundancy.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/redundancy_002_pos.ksh || atf_fail "Testcase failed" +} +redundancy_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/redundancy.kshlib + . $(atf_get_srcdir)/redundancy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case redundancy_003_pos cleanup +redundancy_003_pos_head() +{ + atf_set "descr" "Verify mirrored pool can withstand N-1 devices are failing or missing." + atf_set "timeout" 1800 +} +redundancy_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/redundancy.kshlib + . $(atf_get_srcdir)/redundancy.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/redundancy_003_pos.ksh || atf_fail "Testcase failed" +} +redundancy_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/redundancy.kshlib + . $(atf_get_srcdir)/redundancy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case redundancy_004_neg cleanup +redundancy_004_neg_head() +{ + atf_set "descr" "Verify striped pool have no data redundancy." + atf_set "require.progs" zpool + atf_set "timeout" 1800 +} +redundancy_004_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/redundancy.kshlib + . $(atf_get_srcdir)/redundancy.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/redundancy_004_neg.ksh || atf_fail "Testcase failed" +} +redundancy_004_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/redundancy.kshlib + . $(atf_get_srcdir)/redundancy.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case redundancy_001_pos + atf_add_test_case redundancy_002_pos + atf_add_test_case redundancy_003_pos + atf_add_test_case redundancy_004_neg +} diff --git a/tests/sys/cddl/zfs/tests/redundancy/setup.ksh b/tests/sys/cddl/zfs/tests/redundancy/setup.ksh new file mode 100644 index 00000000000..dfe4773865e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/redundancy/setup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 07/02/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +verify_runnable "global" + +log_pass diff --git a/tests/sys/cddl/zfs/tests/refquota/Makefile b/tests/sys/cddl/zfs/tests/refquota/Makefile new file mode 100644 index 00000000000..7af91081201 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/Makefile @@ -0,0 +1,23 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/refquota +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= refquota_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= refquota_001_pos.ksh +${PACKAGE}FILES+= refquota_005_pos.ksh +${PACKAGE}FILES+= refquota.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= refquota_004_pos.ksh +${PACKAGE}FILES+= refquota_002_pos.ksh +${PACKAGE}FILES+= refquota_003_pos.ksh +${PACKAGE}FILES+= refquota_006_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/refquota/cleanup.ksh b/tests/sys/cddl/zfs/tests/refquota/cleanup.ksh new file mode 100644 index 00000000000..3997674d22c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "both" +if ! fs_prop_exist "refquota" ; then + log_unsupported "refquota is not supported by this release." +fi + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/refquota/refquota.cfg b/tests/sys/cddl/zfs/tests/refquota/refquota.cfg new file mode 100644 index 00000000000..9bb06f7e381 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/refquota.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refquota.cfg 1.2 08/08/15 SMI" +# + +export TESTFILE=testfile${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/refquota/refquota_001_pos.ksh b/tests/sys/cddl/zfs/tests/refquota/refquota_001_pos.ksh new file mode 100644 index 00000000000..ad14597a383 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/refquota_001_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refquota_001_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refquota_001_pos +# +# DESCRIPTION: +# refquota limits the amount of space a dataset can consume, but does +# not include space used by descendents. +# +# STRATEGY: +# 1. Setting refquota in given filesystem +# 2. Create descendent filesystem +# 3. Verify refquota limits the amount of space a dataset can consume +# 4. Verify the limit does not impact descendents +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-12-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "refquota limits the amount of space a dataset can consume, " \ + "but does not include space used by descendents." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +sub=$fs/sub +log_must $ZFS create $sub + +log_must $ZFS set refquota=10M $fs +mntpnt=$(get_prop mountpoint $fs) + +log_mustnot $MKFILE 11M $mntpnt/file +log_must $MKFILE 9M $mntpnt/file +log_must $ZFS snapshot $fs@snap +log_mustnot $MKFILE 2M $mntpnt/file2 + +mntpnt=$(get_prop mountpoint $sub) +log_must $MKFILE 10M $mntpnt/file +log_must $ZFS snapshot $sub@snap +log_must $MKFILE 10 $mntpnt/file2 + +log_pass "refquota limits the amount of space a dataset can consume, " \ + "but does not include space used by descendents." diff --git a/tests/sys/cddl/zfs/tests/refquota/refquota_002_pos.ksh b/tests/sys/cddl/zfs/tests/refquota/refquota_002_pos.ksh new file mode 100644 index 00000000000..30e74eca670 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/refquota_002_pos.ksh @@ -0,0 +1,103 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refquota_002_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refquota_002_pos +# +# DESCRIPTION: +# Quotas are enforced using the minimum of the two properties: +# quota & refquota +# +# STRATEGY: +# 1. Set value for quota and refquota. Quota less than refquota. +# 2. Creating file which should be limited by quota. +# 3. Switch the value of quota and refquota. +# 4. Verify file should be limited by refquota. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "Quotas are enforced using the minimum of the two properties" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +log_must $ZFS set quota=15M $fs +log_must $ZFS set refquota=25M $fs + +mntpnt=$(get_prop mountpoint $fs) +log_mustnot $MKFILE 20M $mntpnt/$TESTFILE +typeset -i used quota +used=$(get_prop used $fs) +quota=$(get_prop quota $fs) +((used = used / (1024 * 1024))) +((quota = quota / (1024 * 1024))) +if [[ $used -ne $quota ]]; then + log_fail "ERROR: $used -ne $quota Quotas are not limited by quota" +fi + +# +# Switch the value of them and try again +# +[ -f $mntpnt/$TESTFILE ] && log_must $RM $mntpnt/$TESTFILE +log_must $ZFS set quota=25M $fs +log_must $ZFS set refquota=15M $fs + +log_mustnot $MKFILE 20M $mntpnt/$TESTFILE +used=$(get_prop used $fs) +refquota=$(get_prop refquota $fs) +((used = used / (1024 * 1024))) +((refquota = refquota / (1024 * 1024))) +if [[ $used -ne $refquota ]]; then + log_fail "ERROR: $used -ne $refquota Quotas are not limited by refquota" +fi + +log_pass "Quotas are enforced using the minimum of the two properties" diff --git a/tests/sys/cddl/zfs/tests/refquota/refquota_003_pos.ksh b/tests/sys/cddl/zfs/tests/refquota/refquota_003_pos.ksh new file mode 100644 index 00000000000..6f9c420eac4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/refquota_003_pos.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refquota_003_pos.ksh 1.1 08/02/29 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refquota_003_pos +# +# DESCRIPTION: +# Sub-filesystem quotas are not enforced by property 'refquota' +# +# STRATEGY: +# 1. Setting quota and refquota for parent. refquota < quota +# 2. Verify sub-filesystem will not be limited by refquota +# 3. Verify sub-filesystem will only be limited by quota +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "Sub-filesystem quotas are not enforced by property 'refquota'" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +log_must $ZFS set quota=25M $fs +log_must $ZFS set refquota=10M $fs +log_must $ZFS create $fs/subfs + +mntpnt=$(get_prop mountpoint $fs/subfs) +log_must $MKFILE 20M $mntpnt/$TESTFILE + +typeset -i used quota refquota +used=$(get_prop used $fs) +refquota=$(get_prop refquota $fs) +((used = used / (1024 * 1024))) +((refquota = refquota / (1024 * 1024))) +if [[ $used -lt $refquota ]]; then + log_fail "ERROR: $used < $refquota subfs quotas are limited by refquota" +fi + +log_mustnot $MKFILE 20M $mntpnt/$TESTFILE.2 +used=$(get_prop used $fs) +quota=$(get_prop quota $fs) +((used = used / (1024 * 1024))) +((quota = quota / (1024 * 1024))) +if [[ $used -gt $quota ]]; then + log_fail "ERROR: $used > $quota subfs quotas aren't limited by quota" +fi + +log_pass "Sub-filesystem quotas are not enforced by property 'refquota'" diff --git a/tests/sys/cddl/zfs/tests/refquota/refquota_004_pos.ksh b/tests/sys/cddl/zfs/tests/refquota/refquota_004_pos.ksh new file mode 100644 index 00000000000..8578f397d4f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/refquota_004_pos.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refquota_004_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refquota_004_pos +# +# DESCRIPTION: +# refquotas are not limited by snapshots. +# +# STRATEGY: +# 1. Setting refquota < quota +# 2. Create file in filesytem, take snapshot and remove the file +# 3. Verify snapshot will not consume refquota +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "refquotas are not limited by snapshots." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +log_must $ZFS set quota=25M $fs +log_must $ZFS set refquota=15M $fs + +mntpnt=$(get_prop mountpoint $fs) +typeset -i i=0 +while ((i < 3)); do + log_must $MKFILE 7M $mntpnt/$TESTFILE.$i + log_must $ZFS snapshot $fs@snap.$i + log_must $RM $mntpnt/$TESTFILE.$i + + ((i += 1)) +done + +# +# Verify out of the limitation of 'quota' +# +log_mustnot $MKFILE 7M $mntpnt/$TESTFILE + +log_pass "refquotas are not limited by snapshots." diff --git a/tests/sys/cddl/zfs/tests/refquota/refquota_005_pos.ksh b/tests/sys/cddl/zfs/tests/refquota/refquota_005_pos.ksh new file mode 100644 index 00000000000..1c15b8c9fb0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/refquota_005_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refquota_005_pos.ksh 1.1 08/02/29 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refquota_005_pos +# +# DESCRIPTION: +# refquotas are not limited by sub-filesystem snapshots. +# +# STRATEGY: +# 1. Setting refquota < quota for parent +# 2. Create file in sub-filesytem, take snapshot and remove the file +# 3. Verify sub-filesystem snapshot will not consume refquota +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "refquotas are not limited by sub-filesystem snapshots." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +log_must $ZFS set quota=25M $fs +log_must $ZFS set refquota=15M $fs +log_must $ZFS create $fs/subfs + +mntpnt=$(get_prop mountpoint $fs/subfs) +typeset -i i=0 +while ((i < 3)); do + log_must $MKFILE 7M $mntpnt/$TESTFILE.$i + log_must $ZFS snapshot $fs/subfs@snap.$i + log_must $RM $mntpnt/$TESTFILE.$i + + ((i += 1)) +done + +# +# Verify out of the limitation of 'quota' +# +log_mustnot $MKFILE 7M $mntpnt/$TESTFILE + +log_pass "refquotas are not limited by sub-filesystem snapshots" diff --git a/tests/sys/cddl/zfs/tests/refquota/refquota_006_neg.ksh b/tests/sys/cddl/zfs/tests/refquota/refquota_006_neg.ksh new file mode 100644 index 00000000000..0e2b0f9cb67 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/refquota_006_neg.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refquota_006_neg.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refquota_006_neg +# +# DESCRIPTION: +# 'zfs set refquota/refreserv' can handle incorrect arguments correctly. +# +# STRATEGY: +# 1. Setup incorrect arguments arrays. +# 2. Set the bad argument to refquota. +# 3. Verify zfs can handle it correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-09) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS set refquota=none $TESTPOOL/$TESTFS + log_must $ZFS set refreserv=none $TESTPOOL/$TESTFS +} + +log_assert "'zfs set refquota' can handle incorrect arguments correctly." +log_onexit cleanup + +set -A badopt \ + "None" "-1" "1TT" "%5" \ + "123!" "@456" "7#89" "0\$" \ + "abc123%" "123%s" "12%s3" "%c123" \ + "123%d" "%x123" "12%p3" "^def456" \ + "x0" + +typeset -i i=0 +while ((i < ${#badopt[@]})); do + log_mustnot $ZFS set refquota=${badopt[$i]} $TESTPOOL/$TESTFS + log_mustnot $ZFS set refreserv=${badopt[$i]} $TESTPOOL/$TESTFS + + ((i += 1)) +done + +# Try using a null as the opt value. We can't use log_mustnot, because +# that echoes the character, which screws up ATF by creating a non-well formed +# XML file +$ZFS set refquota="\0" $TESTPOOL/$TESTFS > /dev/null 2>&1 +[[ $? != 0 ]] || log_fail "FAILURE: zfs set refquota=\\\\0 passed" +$ZFS set refreserv="\0" $TESTPOOL/$TESTFS > /dev/null 2>&1 +[[ $? != 0 ]] || log_fail "FAILURE: zfs set refreserv=\\\\0 passed" + +log_pass "'zfs set refquota' can handle incorrect arguments correctly." diff --git a/tests/sys/cddl/zfs/tests/refquota/refquota_test.sh b/tests/sys/cddl/zfs/tests/refquota/refquota_test.sh new file mode 100755 index 00000000000..28b71359841 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/refquota_test.sh @@ -0,0 +1,182 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case refquota_001_pos cleanup +refquota_001_pos_head() +{ + atf_set "descr" "refquota limits the amount of space a dataset can consume,but does not include space used by descendents." + atf_set "require.progs" zfs +} +refquota_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refquota_001_pos.ksh || atf_fail "Testcase failed" +} +refquota_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refquota_002_pos cleanup +refquota_002_pos_head() +{ + atf_set "descr" "Quotas are enforced using the minimum of the two properties" + atf_set "require.progs" zfs +} +refquota_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refquota_002_pos.ksh || atf_fail "Testcase failed" +} +refquota_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refquota_003_pos cleanup +refquota_003_pos_head() +{ + atf_set "descr" "Sub-filesystem quotas are not enforced by property 'refquota'" + atf_set "require.progs" zfs +} +refquota_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refquota_003_pos.ksh || atf_fail "Testcase failed" +} +refquota_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refquota_004_pos cleanup +refquota_004_pos_head() +{ + atf_set "descr" "refquotas are not limited by snapshots." + atf_set "require.progs" zfs +} +refquota_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refquota_004_pos.ksh || atf_fail "Testcase failed" +} +refquota_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refquota_005_pos cleanup +refquota_005_pos_head() +{ + atf_set "descr" "refquotas are not limited by sub-filesystem snapshots." + atf_set "require.progs" zfs +} +refquota_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refquota_005_pos.ksh || atf_fail "Testcase failed" +} +refquota_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refquota_006_neg cleanup +refquota_006_neg_head() +{ + atf_set "descr" "'zfs set refquota' can handle incorrect arguments correctly." + atf_set "require.progs" zfs +} +refquota_006_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refquota_006_neg.ksh || atf_fail "Testcase failed" +} +refquota_006_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case refquota_001_pos + atf_add_test_case refquota_002_pos + atf_add_test_case refquota_003_pos + atf_add_test_case refquota_004_pos + atf_add_test_case refquota_005_pos + atf_add_test_case refquota_006_neg +} diff --git a/tests/sys/cddl/zfs/tests/refquota/setup.ksh b/tests/sys/cddl/zfs/tests/refquota/setup.ksh new file mode 100644 index 00000000000..fa42935d095 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refquota/setup.ksh @@ -0,0 +1,40 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 08/02/29 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "both" +if ! fs_prop_exist "refquota" ; then + log_unsupported "refquota is not supported by this release." +fi + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/refreserv/Makefile b/tests/sys/cddl/zfs/tests/refreserv/Makefile new file mode 100644 index 00000000000..1ac7a8aa9d8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/refreserv +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= refreserv_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= refreserv_004_pos.ksh +${PACKAGE}FILES+= refreserv_005_pos.ksh +${PACKAGE}FILES+= refreserv_001_pos.ksh +${PACKAGE}FILES+= refreserv_003_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= refreserv.cfg +${PACKAGE}FILES+= refreserv_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/refreserv/cleanup.ksh b/tests/sys/cddl/zfs/tests/refreserv/cleanup.ksh new file mode 100644 index 00000000000..3de896d1401 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "both" +if ! fs_prop_exist "refreservation" ; then + log_unsupported "refreservation is not supported in this system." +fi + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/refreserv/refreserv.cfg b/tests/sys/cddl/zfs/tests/refreserv/refreserv.cfg new file mode 100644 index 00000000000..6df3c120a37 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/refreserv.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refreserv.cfg 1.2 08/08/15 SMI" +# + +export TESTFILE=testfile${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/refreserv/refreserv_001_pos.ksh b/tests/sys/cddl/zfs/tests/refreserv/refreserv_001_pos.ksh new file mode 100644 index 00000000000..d4fa0707dd3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/refreserv_001_pos.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refreserv_001_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refreserv_001_pos +# +# DESCRIPTION: +# Reservations are enforced using the maximum of 'reserv' and 'refreserv' +# +# STRATEGY: +# 1. Setting quota for parent filesystem. +# 2. Setting reservation and refreservation for sub-filesystem. +# 3. Verify the sub-fs reservation are enforced by the maximum of 'reserv' +# and 'refreserv'. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "Reservations are enforced using the maximum of " \ + "'reserv' and 'refreserv'" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS ; subfs=$fs/subfs +log_must $ZFS create $subfs +log_must $ZFS set quota=25M $fs + +log_must $ZFS set reserv=10M $subfs +log_must $ZFS set refreserv=20M $subfs +mntpnt=$(get_prop mountpoint $fs) +log_mustnot $MKFILE 15M $mntpnt/$TESTFILE + +log_must $RM -f $mntpnt/$TESTFILE + +log_must $ZFS set reserv=20M $subfs +log_must $ZFS set refreserv=10M $subfs +log_mustnot $MKFILE 15M $mntpnt/$TESTFILE + +log_pass "Reservations are enforced using the maximum of " \ + "'reserv' and 'refreserv'" diff --git a/tests/sys/cddl/zfs/tests/refreserv/refreserv_002_pos.ksh b/tests/sys/cddl/zfs/tests/refreserv/refreserv_002_pos.ksh new file mode 100644 index 00000000000..d2f32b18ddf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/refreserv_002_pos.ksh @@ -0,0 +1,127 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refreserv_002_pos.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refreserv_002_pos +# +# DESCRIPTION: +# Setting full size as refreservation, verify no snapshot can be created. +# +# STRATEGY: +# 1. Setting full size as refreservation on pool +# 2. Verify no snapshot can be created on this pool +# 3. Setting full size as refreservation on filesystem +# 4. Verify no snapshot can be created on it and its subfs +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if is_global_zone ; then + log_must $ZFS set refreservation=none $TESTPOOL + + if datasetexists $TESTPOOL@snap ; then + log_must $ZFS destroy -f $TESTPOOL@snap + fi + fi + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +# This function iteratively increases refreserv to its highest possible +# value. Simply setting refreserv == quota can allow enough writes to +# complete that the test fails. +function max_refreserv +{ + typeset ds=$1 + typeset -i incsize=131072 + typeset -i rr=$(get_prop available $ds) + + log_must $ZFS set refreserv=$rr $ds + while :; do + $ZFS set refreserv=$((rr + incsize)) $ds >/dev/null 2>&1 + if [[ $? == 0 ]]; then + ((rr += incsize)) + continue + else + ((incsize /= 2)) + ((incsize == 0)) && break + fi + done +} + + +log_assert "Setting full size as refreservation, verify no snapshot " \ + "can be created." +log_onexit cleanup + +log_must $ZFS create $TESTPOOL/$TESTFS/subfs + +typeset datasets +if is_global_zone; then + datasets="$TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS/subfs" +else + datasets="$TESTPOOL/$TESTFS $TESTPOOL/$TESTFS/subfs" +fi + +for ds in $datasets; do + # + # Verify refreservation on dataset + # + log_must $ZFS set quota=25M $ds + max_refreserv $ds + log_mustnot $ZFS snapshot $ds@snap + if datasetexists $ds@snap ; then + log_fail "ERROR: $ds@snap should not exists." + fi + + log_must $ZFS set quota=none $ds + log_must $ZFS set refreservation=none $ds +done + +log_pass "Setting full size as refreservation, verify no snapshot " \ + "can be created." diff --git a/tests/sys/cddl/zfs/tests/refreserv/refreserv_003_pos.ksh b/tests/sys/cddl/zfs/tests/refreserv/refreserv_003_pos.ksh new file mode 100644 index 00000000000..0168b0ac8dd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/refreserv_003_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refreserv_003_pos.ksh 1.1 08/02/29 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refreserv_003_pos +# +# DESCRIPTION: +# Verify a snapshot will only be allowed if there is enough free pool +# space outside of this refreservation. +# +# STRATEGY: +# 1. Setting quota and refservation +# 2. Verify snapshot can be created, when used =< quota - refreserv +# 3. Verify failed to create snapshot, when used > quota - refreserv +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "Verify a snapshot will only be allowed if there is enough " \ + "free space outside of this refreservation." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +log_must $ZFS set quota=25M $fs +log_must $ZFS set refreservation=10M $fs + +mntpnt=$(get_prop mountpoint $fs) +log_must $MKFILE 7M $mntpnt/$TESTFILE +log_must $ZFS snapshot $fs@snap + +log_must $MKFILE 7M $mntpnt/$TESTFILE.2 +log_must $ZFS snapshot $fs@snap2 + +log_must $MKFILE 7M $mntpnt/$TESTFILE.3 +log_mustnot $ZFS snapshot $fs@snap3 +if datasetexists $fs@snap3 ; then + log_fail "ERROR: $fs@snap3 should not exists." +fi + +log_pass "Verify a snapshot will only be allowed if there is enough " \ + "free space outside of this refreservation." diff --git a/tests/sys/cddl/zfs/tests/refreserv/refreserv_004_pos.ksh b/tests/sys/cddl/zfs/tests/refreserv/refreserv_004_pos.ksh new file mode 100644 index 00000000000..4b8e2b3d629 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/refreserv_004_pos.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refreserv_004_pos.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refreserv_004_pos +# +# DESCRIPTION: +# Verify refreservation is limited by available space. +# +# STRATEGY: +# 1. Setting quota and refreservation on parent filesystem. +# 2. Get available space on sub-filesystem. +# 3. Verify refreservation is limited by available on it. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if is_global_zone ; then + log_must $ZFS set refreservation=none $TESTPOOL + fi + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "Verify refreservation is limited by available space." +log_onexit cleanup + +pool=$TESTPOOL ; fs=$pool/$TESTFS ; subfs=$fs/subfs +log_must $ZFS create $subfs + +typeset datasets +if is_global_zone; then + datasets="$pool $fs" +else + datasets="$fs" +fi + +for ds in $datasets; do + log_must $ZFS set quota=25M $ds + log_must $ZFS set refreservation=15M $ds + + typeset avail + avail=5M + log_must $ZFS set refreservation=$avail $subfs + typeset mntpnt + mntpnt=$(get_prop mountpoint $subfs) + log_must $MKFILE $avail $mntpnt/$TESTFILE + + typeset exceed + exceed=15M + log_mustnot $ZFS set refreservation=$exceed $subfs + log_mustnot $MKFILE $exceed $mntpnt/$TESTFILE + + log_must $ZFS set quota=none $ds +done + +log_pass "Verify refreservation is limited by available space." diff --git a/tests/sys/cddl/zfs/tests/refreserv/refreserv_005_pos.ksh b/tests/sys/cddl/zfs/tests/refreserv/refreserv_005_pos.ksh new file mode 100644 index 00000000000..29cd01f0485 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/refreserv_005_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)refreserv_005_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: refreserv_005_pos +# +# DESCRIPTION: +# Volume refreservation is limited by volsize +# +# STRATEGY: +# 1. Create volume on filesystem +# 2. Setting quota for parenet filesytem +# 3. Verify volume refreservation is only limited by volsize +# 4. Verify volume refreservation can be changed when volsize changed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-11-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "Volume refreservation is limited by volsize" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS; vol=$fs/vol +log_must $ZFS create -V 10M $vol + +# Verify the parent filesystem does not affect volume +log_must $ZFS set quota=25M $fs +log_must $ZFS set refreservation=10M $vol +avail=$(get_prop mountpoint $vol) +log_mustnot $ZFS set refreservation=$avail $vol + +# Verify it is affected by volsize +log_must $ZFS set volsize=15M $vol +log_must $ZFS set refreservation=15M $vol +log_mustnot $ZFS set refreservation=16M $vol + +log_pass "Volume refreservation is limited by volsize" diff --git a/tests/sys/cddl/zfs/tests/refreserv/refreserv_test.sh b/tests/sys/cddl/zfs/tests/refreserv/refreserv_test.sh new file mode 100755 index 00000000000..cef9353dd4c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/refreserv_test.sh @@ -0,0 +1,157 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case refreserv_001_pos cleanup +refreserv_001_pos_head() +{ + atf_set "descr" "Reservations are enforced using the maximum of'reserv' and 'refreserv'" + atf_set "require.progs" zfs +} +refreserv_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refreserv_001_pos.ksh || atf_fail "Testcase failed" +} +refreserv_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refreserv_002_pos cleanup +refreserv_002_pos_head() +{ + atf_set "descr" "Setting full size as refreservation, verify no snapshotcan be created." + atf_set "require.progs" zfs +} +refreserv_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refreserv_002_pos.ksh || atf_fail "Testcase failed" +} +refreserv_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refreserv_003_pos cleanup +refreserv_003_pos_head() +{ + atf_set "descr" "Verify a snapshot will only be allowed if there is enoughfree space outside of this refreservation." + atf_set "require.progs" zfs +} +refreserv_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refreserv_003_pos.ksh || atf_fail "Testcase failed" +} +refreserv_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refreserv_004_pos cleanup +refreserv_004_pos_head() +{ + atf_set "descr" "Verify refreservation is limited by available space." + atf_set "require.progs" zfs +} +refreserv_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refreserv_004_pos.ksh || atf_fail "Testcase failed" +} +refreserv_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case refreserv_005_pos cleanup +refreserv_005_pos_head() +{ + atf_set "descr" "Volume refreservation is limited by volsize" + atf_set "require.progs" zfs +} +refreserv_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/refreserv_005_pos.ksh || atf_fail "Testcase failed" +} +refreserv_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/refreserv.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case refreserv_001_pos + atf_add_test_case refreserv_002_pos + atf_add_test_case refreserv_003_pos + atf_add_test_case refreserv_004_pos + atf_add_test_case refreserv_005_pos +} diff --git a/tests/sys/cddl/zfs/tests/refreserv/setup.ksh b/tests/sys/cddl/zfs/tests/refreserv/setup.ksh new file mode 100644 index 00000000000..95f1ac7b74a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/refreserv/setup.ksh @@ -0,0 +1,40 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 08/02/29 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "both" +if ! fs_prop_exist "refreservation" ; then + log_unsupported "refreservation is not supported in this system." +fi + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/rename_dirs/Makefile b/tests/sys/cddl/zfs/tests/rename_dirs/Makefile new file mode 100644 index 00000000000..582931c0fb0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rename_dirs/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/rename_dirs +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= rename_dirs_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= rename_dirs_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= rename_dirs.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/rename_dirs/cleanup.ksh b/tests/sys/cddl/zfs/tests/rename_dirs/cleanup.ksh new file mode 100644 index 00000000000..2ee7cfb6028 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rename_dirs/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs.cfg b/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs.cfg new file mode 100644 index 00000000000..c64983c4bb5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rename_dirs.cfg 1.2 08/08/15 SMI" +# + +export WAITTIME=600 +export STF_TIMEOUT=1200 diff --git a/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs_001_pos.ksh b/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs_001_pos.ksh new file mode 100644 index 00000000000..e8f680a5c9e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs_001_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rename_dirs_001_pos.ksh 1.1 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +########################################################################### +# +# __stc_assertion_start +# +# ID: rename_dirs_001_pos +# +# DESCRIPTION: +# Create two directory trees in ZFS filesystem, and concurently rename +# directory across the two trees. ZFS should be able to handle the race +# situation. +# +# STRATEGY: +# 1. Create a ZFS filesystem +# 2. Make two directory tree in the zfs file system +# 3. Continually rename directory from one tree to another tree in two process +# 4. After the specified time duration, the system should not be panic. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-02-05) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + log_must $RM -rf $TESTDIR/* +} + +log_assert "ZFS can handle race directory rename operation." + +log_onexit cleanup + +$CD $TESTDIR +$MKDIR -p 1/2/3/4/5 a/b/c/d/e + +$RENAME_DIR & + +$SLEEP $WAITTIME +typeset -i retval=1 +$PGREP $RENAME_DIR >/dev/null 2>&1 +retval=$? +if (( $retval == 0 )); then + $PKILL -9 $RENAME_DIR >/dev/null 2>&1 +fi + +log_pass "ZFS handle race directory rename operation as expected." diff --git a/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs_test.sh b/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs_test.sh new file mode 100755 index 00000000000..84fb11b542d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rename_dirs/rename_dirs_test.sh @@ -0,0 +1,56 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case rename_dirs_001_pos cleanup +rename_dirs_001_pos_head() +{ + atf_set "descr" "ZFS can handle race directory rename operation." + atf_set "timeout" 1200 +} +rename_dirs_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rename_dirs.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rename_dirs_001_pos.ksh || atf_fail "Testcase failed" +} +rename_dirs_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rename_dirs.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case rename_dirs_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/rename_dirs/setup.ksh b/tests/sys/cddl/zfs/tests/rename_dirs/setup.ksh new file mode 100644 index 00000000000..e3aad622ec2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rename_dirs/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/replacement/Makefile b/tests/sys/cddl/zfs/tests/replacement/Makefile new file mode 100644 index 00000000000..85ffd323573 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/replacement/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/replacement +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= replacement_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= replacement_002_pos.ksh +${PACKAGE}FILES+= replacement_003_pos.ksh +${PACKAGE}FILES+= replacement_001_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= replacement.kshlib + +.include diff --git a/tests/sys/cddl/zfs/tests/replacement/cleanup.ksh b/tests/sys/cddl/zfs/tests/replacement/cleanup.ksh new file mode 100644 index 00000000000..fa10285bd98 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/replacement/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +verify_runnable "global" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/replacement/replacement.kshlib b/tests/sys/cddl/zfs/tests/replacement/replacement.kshlib new file mode 100644 index 00000000000..d3f370de924 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/replacement/replacement.kshlib @@ -0,0 +1,51 @@ +# vim: filetype=sh +# Common routines for replacement tests. + +# $FreeBSD$ + +function check_vdev_action # [disk2] +{ + typeset action=$1 + typeset expect=$2 + typeset opt=$3 + typeset disk1="$4" + typeset disk2="$5" + + busy_path $TESTDIR + $expect $ZPOOL $action $opt $TESTPOOL $disk1 $disk2 + reap_children + log_must $ZPOOL export $TESTPOOL + log_must $ZPOOL import $TESTPOOL + log_must $ZFS umount $TESTPOOL/$TESTFS + log_must $ZDB -cdui $TESTPOOL/$TESTFS + log_must $ZFS mount $TESTPOOL/$TESTFS +} + +function pool_action # +{ + typeset tvd_type=$1 + typeset action=$2 + typeset actionexpect=$3 + typeset existexpect=$4 + + typeset disk=${disk_array[3]} + typeset short=${disk##/dev/} + + for opt in "" "-f"; do + [ "$action" = "detach" -a "$opt" = "-f" ] && continue + create_pool $TESTPOOL $tvd_type ${disk_array[@]:0:3} + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + check_vdev_action $action $actionexpect "$opt" \ + ${disk_array[0]} $disk + + $existexpect eval "$ZPOOL iostat -v $TESTPOOL | $GREP -q $short" + destroy_pool $TESTPOOL + done +} + +function replacement_cleanup +{ + poolexists $TESTPOOL && log_must $ZPOOL status $TESTPOOL + reap_children +} diff --git a/tests/sys/cddl/zfs/tests/replacement/replacement_001_pos.ksh b/tests/sys/cddl/zfs/tests/replacement/replacement_001_pos.ksh new file mode 100644 index 00000000000..3a41f3aa269 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/replacement/replacement_001_pos.ksh @@ -0,0 +1,44 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Copyright 2014 Spectra Logic Corporation. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/replacement/replacement.kshlib + +verify_runnable "global" + +child_pids="" +log_onexit replacement_cleanup +set_disks + +log_assert "Replacing a disk during I/O completes." +for pooltype in "" "raidz" "raidz1" "mirror"; do + pool_action "$pooltype" replace log_must log_must +done +log_pass diff --git a/tests/sys/cddl/zfs/tests/replacement/replacement_002_pos.ksh b/tests/sys/cddl/zfs/tests/replacement/replacement_002_pos.ksh new file mode 100644 index 00000000000..3f2dfaecc26 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/replacement/replacement_002_pos.ksh @@ -0,0 +1,50 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Copyright 2014 Spectra Logic Corporation. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/replacement/replacement.kshlib + +verify_runnable "global" + +child_pids="" +log_onexit replacement_cleanup +set_disks + +log_assert "Attaching a disk during I/O completes for mirrors and stripes." +for pooltype in "" "mirror"; do + pool_action "$pooltype" attach log_must log_must +done + +log_note "Verify 'zpool attach' fails for RAIDZ." +for pooltype in "raidz1" "raidz2"; do + pool_action "$pooltype" attach log_mustnot log_mustnot +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/replacement/replacement_003_pos.ksh b/tests/sys/cddl/zfs/tests/replacement/replacement_003_pos.ksh new file mode 100644 index 00000000000..6b46380b7a2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/replacement/replacement_003_pos.ksh @@ -0,0 +1,48 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Copyright 2014 Spectra Logic Corporation. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/replacement/replacement.kshlib + +verify_runnable "global" + +child_pids="" +log_onexit replacement_cleanup +set_disks + +log_assert "Detaching a disk during I/O completes for mirrors." +pool_action mirror detach log_must log_mustnot + +log_note "Verify 'zpool detach' fails with non-mirrors." +for pooltype in "" "raidz" "raidz1" ; do + pool_action "$pooltype" detach log_mustnot log_mustnot +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/replacement/replacement_test.sh b/tests/sys/cddl/zfs/tests/replacement/replacement_test.sh new file mode 100755 index 00000000000..6aa8c0087df --- /dev/null +++ b/tests/sys/cddl/zfs/tests/replacement/replacement_test.sh @@ -0,0 +1,100 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case replacement_001_pos cleanup +replacement_001_pos_head() +{ + atf_set "descr" "Replacing a disk during I/O completes." + atf_set "require.progs" zfs zpool zdb + atf_set "timeout" 3600 +} +replacement_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + verify_disk_count "$DISKS" 3 + ksh93 $(atf_get_srcdir)/replacement_001_pos.ksh || atf_fail "Testcase failed" +} +replacement_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case replacement_002_pos cleanup +replacement_002_pos_head() +{ + atf_set "descr" "Replacing a disk during I/O completes." + atf_set "require.progs" zfs zpool zdb + atf_set "timeout" 3600 +} +replacement_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + verify_disk_count "$DISKS" 3 + ksh93 $(atf_get_srcdir)/replacement_002_pos.ksh || atf_fail "Testcase failed" +} +replacement_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case replacement_003_pos cleanup +replacement_003_pos_head() +{ + atf_set "descr" "Replacing a disk during I/O completes." + atf_set "require.progs" zfs zpool zdb + atf_set "timeout" 3600 +} +replacement_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/replacement_003_pos.ksh || atf_fail "Testcase failed" +} +replacement_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + atf_add_test_case replacement_001_pos + atf_add_test_case replacement_002_pos + atf_add_test_case replacement_003_pos +} diff --git a/tests/sys/cddl/zfs/tests/reservation/Makefile b/tests/sys/cddl/zfs/tests/reservation/Makefile new file mode 100644 index 00000000000..596c35c4f98 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/Makefile @@ -0,0 +1,36 @@ +# $FreeBSD$ + +.include + +PACKAGE= tests +TESTSDIR= ${TESTSBASE}/sys/cddl/zfs/tests/reservation +FILESDIR= ${TESTSDIR} + +ATF_TESTS_KSH93+= reservation_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= reservation.cfg +${PACKAGE}FILES+= reservation_007_pos.ksh +${PACKAGE}FILES+= reservation_003_pos.ksh +${PACKAGE}FILES+= reservation_012_pos.ksh +${PACKAGE}FILES+= reservation_016_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= reservation_013_pos.ksh +${PACKAGE}FILES+= reservation_017_pos.ksh +${PACKAGE}FILES+= reservation_006_pos.ksh +${PACKAGE}FILES+= reservation_002_pos.ksh +${PACKAGE}FILES+= reservation_011_pos.ksh +${PACKAGE}FILES+= reservation_015_pos.ksh +${PACKAGE}FILES+= reservation_004_pos.ksh +${PACKAGE}FILES+= reservation_008_pos.ksh +${PACKAGE}FILES+= reservation_009_pos.ksh +${PACKAGE}FILES+= reservation_005_pos.ksh +${PACKAGE}FILES+= reservation_001_pos.ksh +${PACKAGE}FILES+= reservation.kshlib +${PACKAGE}FILES+= reservation_010_pos.ksh +${PACKAGE}FILES+= reservation_014_pos.ksh +${PACKAGE}FILES+= reservation_018_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/reservation/cleanup.ksh b/tests/sys/cddl/zfs/tests/reservation/cleanup.ksh new file mode 100644 index 00000000000..26ce7c30a0b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation.cfg b/tests/sys/cddl/zfs/tests/reservation/reservation.cfg new file mode 100644 index 00000000000..b47a75cfa37 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation.cfg @@ -0,0 +1,47 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation.cfg 1.3 08/08/15 SMI" +# + +export RESV_DELTA=5242880 +export RESV_TOLERANCE=5242880 # Acceptable limit (5MB) for diff in space stats +export RESV_SIZE=52428800 # Default reservation size (50MB) +export RESV_FREE_SPACE=52428800 # Amount of space (50MB) to leave free in a pool +export RESV_NUM_FS=10 # Number of filesystems to create +export RESV_ITER=10 # Number of iterations + +export VOLSIZE=64M +export BLOCK_SIZE=8192 +export ENOSPC=28 + +export ZFSROOT= +export TESTVOL=testvol${TESTCASE_ID} +export TESTVOL2=testvol2-${TESTCASE_ID} +export TESTFILE1=file1.${TESTCASE_ID} +export TESTFILE2=file2.${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation.kshlib b/tests/sys/cddl/zfs/tests/reservation/reservation.kshlib new file mode 100644 index 00000000000..e73528b77be --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation.kshlib @@ -0,0 +1,180 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation.kshlib 1.3 09/01/12 SMI" +# + +# +# Function to set the reservation property of a dataset to +# 'none' and verify that it is correctly set using both the +# "normal" 'zfs get reservation' and the '-p' option which +# gives a numerical value. +# +function zero_reservation +{ + typeset resv_val + dataset=$1 + + log_must $ZFS set reservation=none $dataset + log_must $ZFS set refreservation=none $dataset + + resv_val=`$ZFS get -H refreservation $dataset | awk '{print $3}'` + if [[ $? -ne 0 ]]; then + log_fail "Unable to get reservation prop on $dataset" + elif [[ $resv_val != "none" ]]; then + log_fail "Reservation not 'none' ($resv_val) as expected" + fi + + + resv_val=`$ZFS get -pH refreservation $dataset | awk '{print $3}'` + if [[ $? -ne 0 ]]; then + log_fail "Unable to get reservation prop on $dataset" + elif [[ $resv_val -ne 0 ]]; then + log_fail "Reservation not 0 ($resv_val) as expected" + fi + + return 0 +} + +# +# Utility function to see if two values are within a certain specified +# limit of each other. Used primarily to check that a dataset's parent +# is correctly accounting for space used/available. Need this function as +# currently there is some slop in the way space is accounted (i.e. can't +# do a direct comparison). +# +function within_limits +{ + typeset -l valA=$1 + typeset -l valB=$2 + typeset -l delta=$3 + + if (( valA <= valB )); then + if (( (valB - valA) <= delta )); then + return 0 + fi + elif (( valB <= valA )); then + if (( (valA - valB) <= delta )); then + return 0 + fi + fi + + return 1 +} + +# +# Function to create and mount multiple filesystems. The filesystem +# will be named according to the name specified with a suffix value +# taken from the loop counter. +# +function create_multiple_fs # num_fs base_fs_name base_mnt_name +{ + typeset -i iter=0 + typeset -i count=$1 + typeset FS_NAME=$2 + typeset MNT_NAME=$3 + + while (( $iter < $count )); do + log_must $ZFS create ${FS_NAME}$iter + log_must $ZFS set mountpoint=${MNT_NAME}$iter ${FS_NAME}$iter + (( iter = iter + 1 )) + done +} + +# +# This function compute the largest volume size which is multiple of volume +# block size (default 8K) and not greater than the largest expected volsize. +# +# $1 The largest expected volume size. +# $2 The volume block size +# +function floor_volsize # [volblksize] +{ + typeset -l largest_volsize=$1 + typeset -l volblksize=${2:-8192} + + if (( largest_volsize < volblksize )); then + log_fail "The largest_volsize must be greater than volblksize." + fi + typeset -l real_volsize + typeset -l n + + (( n = largest_volsize / volblksize )) + (( largest_volsize = volblksize * n )) + + print $largest_volsize +} + +# +# Simple function to get the expected reservation for a ZVOL given the +# volume size, block size, and number of copies. +# +# NB: This routine must be kept in sync with the ZFS library function +# libzfs_dataset.c:zvol_volsize_to_reservation(). Refer to that function +# for the logic behind the calculations. +# +function zvol_volsize_to_reservation +{ + typeset resv_val + typeset nblocks + typeset numdb + typeset volsize=$1 + typeset volblocksize=$2 + typeset ncopies=$3 + typeset ncopies_bp + typeset DN_MAX_INDBLKSHIFT=17 + typeset SPA_BLKPTRSHIFT=7 + typeset SPA_DVAS_PER_BP=3 + typeset DVAS_PER_BP + typeset DNODES_PER_LEVEL_SHIFT + typeset DNODES_PER_LEVEL + typeset DN_MAX_INDBLKS + + (( DNODES_PER_LEVEL_SHIFT = DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT )) + (( DNODES_PER_LEVEL = 1 << DNODES_PER_LEVEL_SHIFT )) + (( DN_MAX_INDBLKS = 1 << DN_MAX_INDBLKSHIFT )) + + resv_val=$volsize + (( nblocks = volsize / volblocksize )) + numdb=7 + while (( nblocks > 1 )); do + (( nblocks = nblocks + DNODES_PER_LEVEL - 1 )) + (( nblocks = nblocks / DNODES_PER_LEVEL )) + (( numdb = numdb + nblocks )) + done + (( ncopies_bp = ncopies + 1 )) + DVAS_PER_BP=$(min $SPA_DVAS_PER_BP $ncopies_bp) + (( numdb = numdb * DVAS_PER_BP )) + (( resv_val = volsize * ncopies )) + (( numdb = numdb * DN_MAX_INDBLKS )) + (( resv_val = resv_val + numdb )) + + $ECHO $resv_val + return 0 +} + diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_001_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_001_pos.ksh new file mode 100644 index 00000000000..dbcb8ec7236 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_001_pos.ksh @@ -0,0 +1,132 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_001_pos.ksh 1.3 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_001_pos +# +# DESCRIPTION: +# +# ZFS allows reservations to be set on filesystems and volumes, provided +# the reservation is less than the space available in the pool. +# +# STRATEGY: +# 1) Create a regular and sparse volume +# (filesystem already created by default_setup) +# 2) Get the space available in the pool +# 3) Set a reservation on the filesystem less than the space available. +# 4) Verify that the 'reservation' property for the filesystem has +# the correct value. +# 5) Reset the reservation to 'none' +# 6) Repeat steps 2-5 for both volume types +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-19) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +log_assert "Verify that to set a reservation on a filesystem" \ + " or volume must use value smaller than space" \ + " available property of pool" + +space_avail=`get_prop available $TESTPOOL` + +if ! is_global_zone ; then + OBJ_LIST="" +else + OBJ_LIST="$TESTPOOL/$TESTVOL $TESTPOOL/$TESTVOL2" + + (( vol_set_size = space_avail / 4 )) + vol_set_size=$(floor_volsize $vol_set_size) + (( sparse_vol_set_size = space_avail * 4 )) + sparse_vol_set_size=$(floor_volsize $sparse_vol_set_size) + + # + # Note that when creating a regular volume we are implicitly + # setting a reservation upon it (i.e. the size of the volume) + # which we reset back to zero initially. + # + log_must $ZFS create -V $vol_set_size $TESTPOOL/$TESTVOL + log_must $ZFS set reservation=none $TESTPOOL/$TESTVOL + if fs_prop_exist refreserv; then + log_must $ZFS set refreservation=none $TESTPOOL/$TESTVOL + fi + log_must $ZFS create -s -V $sparse_vol_set_size $TESTPOOL/$TESTVOL2 +fi + + +for obj in $TESTPOOL/$TESTFS $OBJ_LIST; do + + space_avail=`get_prop available $TESTPOOL` + resv_size_set=`expr $space_avail - $RESV_DELTA` + + # + # For a regular (non-sparse) volume the upper limit + # for reservations is not determined by the space + # available in the pool but rather by the size of + # the volume itself. + # + [[ $obj == $TESTPOOL/$TESTVOL ]] && \ + (( resv_size_set = vol_set_size - RESV_DELTA )) + + log_must $ZFS set reservation=$resv_size_set $obj + + resv_size_get=`get_prop reservation $obj` + if [[ $resv_size_set != $resv_size_get ]]; then + log_fail "Reservation not the expected value "\ + "($resv_size_set != $resv_size_get)" + fi + + log_must zero_reservation $obj + + new_space_avail=`get_prop available $obj` + + # + # Due to the way space is consumed and released by metadata we + # can't do an exact check here, but we do do a basic sanity + # check. + # + log_must within_limits $space_avail $new_space_avail $RESV_TOLERANCE +done + +log_pass "Successfully set reservation on filesystem and volume" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_002_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_002_pos.ksh new file mode 100644 index 00000000000..84884aa2391 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_002_pos.ksh @@ -0,0 +1,111 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_002_pos +# +# DESCRIPTION: +# +# Reservation values cannot exceed the amount of space available +# in the pool. Verify that attempting to set a reservation greater +# than this value fails. +# +# STRATEGY: +# 1) Create a filesystem, regular and sparse volume +# 2) Get the space available in the pool +# 3) Attempt to set a reservation greater than the available space +# on the filesystem and verify it fails. +# 4) Verify that the reservation is still set to 'none' (or 0) on +# the filesystem. +# 5) Repeat 3-4 for regular and sparse volume +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Reservation values cannot exceed the amount of space" \ + " available in the pool" + +space_avail=`get_prop available $TESTPOOL` + +if ! is_global_zone ; then + OBJ_LIST="" +else + OBJ_LIST="$TESTPOOL/$TESTVOL $TESTPOOL/$TESTVOL2" + + (( vol_set_size = space_avail / 4 )) + vol_set_size=$(floor_volsize $vol_set_size) + (( sparse_vol_set_size = space_avail * 4 )) + sparse_vol_set_size=$(floor_volsize $sparse_vol_set_size) + + log_must $ZFS create -V $vol_set_size $TESTPOOL/$TESTVOL + log_must $ZFS set reservation=none $TESTPOOL/$TESTVOL + log_must $ZFS create -s -V $sparse_vol_set_size $TESTPOOL/$TESTVOL2 +fi + +for obj in $TESTPOOL/$TESTFS $OBJ_LIST ; do + + space_avail=`get_prop available $TESTPOOL` + resv_size_set=`expr $space_avail + $RESV_DELTA` + + # + # For regular (non-sparse) volumes the upper limit is determined + # not by the space available in the pool but rather by the size + # of the volume itself. + # + [[ $obj == $TESTPOOL/$TESTVOL ]] && \ + (( resv_size_set = vol_set_size + RESV_DELTA )) + + log_must zero_reservation $obj + log_mustnot $ZFS set reservation=$resv_size_set $obj + + resv_size_get=`get_prop reservation $obj` + + if (( $resv_size_get != 0 )); then + log_fail "Reservation value non-zero ($resv_size_get)" + fi +done + +log_pass "Attempting to set too large reservation failed as expected" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_003_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_003_pos.ksh new file mode 100644 index 00000000000..b87630323a7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_003_pos.ksh @@ -0,0 +1,137 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_003_pos.ksh 1.3 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_003_pos +# +# DESCRIPTION: +# +# Verify that it's possible to set a reservation on a filesystem, +# or volume multiple times, without resetting the reservation +# to none. +# +# STRATEGY: +# 1) Create a regular volume and a sparse volume +# 2) Get the space available in the pool +# 3) Set a reservation on the filesystem less than the space available. +# 4) Verify that the 'reservation' property for the filesystem has +# the correct value. +# 5) Repeat 2-4 for different reservation values +# 6) Repeat 3-5 for regular and sparse volume +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify it is possible to set reservations multiple times " \ + "on a filesystem regular and sparse volume" + + +# +# Set a reservation $RESV_ITER times on a dataset and verify that +# the reservation is correctly set each time. +# +function multiple_resv { #dataset + typeset -i i=0 + + dataset=$1 + + log_must zero_reservation $dataset + space_avail=`get_prop available $TESTPOOL` + + (( resv_size = ( space_avail - RESV_DELTA ) / RESV_ITER )) + + # + # For regular (non-sparse) volumes the upper limit is determined + # not by the space available in the pool but rather by the size + # of the volume itself. + # + [[ $obj == $TESTPOOL/$TESTVOL ]] && \ + (( resv_size = ( vol_set_size - RESV_DELTA ) / RESV_ITER )) + + resv_size_set=$resv_size + + while (( $i < $RESV_ITER )); do + + (( i = i + 1 )) + + (( resv_size_set = resv_size * i )) + + log_must $ZFS set reservation=$resv_size_set $dataset + + resv_size_get=`get_prop reservation $dataset` + if [[ $resv_size_set != $resv_size_get ]]; then + log_fail "Reservation not the expected value " \ + "($resv_size_set != $resv_size_get)" + fi + done + + log_must zero_reservation $dataset +} + +space_avail=`get_prop available $TESTPOOL` + +if ! is_global_zone ; then + OBJ_LIST="" +else + OBJ_LIST="$TESTPOOL/$TESTVOL $TESTPOOL/$TESTVOL2" + + (( vol_set_size = space_avail / 4 )) + vol_set_size=$(floor_volsize $vol_set_size) + (( sparse_vol_set_size = space_avail * 4 )) + sparse_vol_set_size=$(floor_volsize $sparse_vol_set_size) + + + log_must $ZFS create -V $vol_set_size $TESTPOOL/$TESTVOL + log_must $ZFS set reservation=none $TESTPOOL/$TESTVOL + log_must $ZFS create -s -V $sparse_vol_set_size $TESTPOOL/$TESTVOL2 +fi + +for obj in $TESTPOOL/$TESTFS $OBJ_LIST ; do + multiple_resv $obj +done + +log_pass "Multiple reservations successfully set on filesystem" \ + " and both volume types" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_004_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_004_pos.ksh new file mode 100644 index 00000000000..95aa97ea6c8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_004_pos.ksh @@ -0,0 +1,131 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_004_pos.ksh 1.3 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_004_pos +# +# DESCRIPTION: +# +# When a dataset which has a reservation set on it is destroyed, +# the space consumed or reserved by that dataset should be released +# back into the pool. +# +# STRATEGY: +# 1) Create a filesystem, regular and sparse volume +# 2) Get the space used and available in the pool +# 3) Set a reservation on the filesystem less than the space available. +# 4) Verify that the 'reservation' property for the filesystem has +# the correct value. +# 5) Destroy the filesystem without resetting the reservation value. +# 6) Verify that the space used and available totals for the pool have +# changed by the expected amounts (within tolerances). +# 7) Repeat steps 3-6 for a regular volume and sparse volume +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify space released when a dataset with reservation is destroyed" + +log_must $ZFS create $TESTPOOL/$TESTFS2 + +space_avail=`get_prop available $TESTPOOL` + +if ! is_global_zone ; then + OBJ_LIST="$TESTPOOL/$TESTFS2" +else + OBJ_LIST="$TESTPOOL/$TESTFS2 \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTVOL2" + + (( vol_set_size = space_avail / 4 )) + vol_set_size=$(floor_volsize $vol_set_size) + (( sparse_vol_set_size = space_avail * 4 )) + sparse_vol_set_size=$(floor_volsize $sparse_vol_set_size) + + log_must $ZFS create -V $vol_set_size $TESTPOOL/$TESTVOL + if fs_prop_exist refreserv; then + log_must $ZFS set refreservation=none $TESTPOOL/$TESTVOL + fi + log_must $ZFS set reservation=none $TESTPOOL/$TESTVOL + log_must $ZFS create -s -V $sparse_vol_set_size $TESTPOOL/$TESTVOL2 +fi + +# re-calculate space available. +space_avail=`get_prop available $TESTPOOL` + +# Calculate a large but valid reservation value. +resv_size_set=`expr $space_avail - $RESV_DELTA` + +for obj in $OBJ_LIST ; do + + space_avail=`get_prop available $TESTPOOL` + space_used=`get_prop used $TESTPOOL` + + # + # For regular (non-sparse) volumes the upper limit is determined + # not by the space available in the pool but rather by the size + # of the volume itself. + # + [[ $obj == $TESTPOOL/$TESTVOL ]] && \ + (( resv_size_set = vol_set_size - RESV_DELTA )) + + log_must $ZFS set reservation=$resv_size_set $obj + + resv_size_get=`get_prop reservation $obj` + if [[ $resv_size_set != $resv_size_get ]]; then + log_fail "Reservation not the expected value " \ + "($resv_size_set != $resv_size_get)" + fi + + log_must $ZFS destroy -f $obj + + new_space_avail=`get_prop available $TESTPOOL` + new_space_used=`get_prop used $TESTPOOL` + + log_must within_limits $space_used $new_space_used $RESV_TOLERANCE + log_must within_limits $space_avail $new_space_avail $RESV_TOLERANCE +done + +log_pass "Space correctly released when dataset is destroyed" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_005_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_005_pos.ksh new file mode 100644 index 00000000000..2a8999e4bf8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_005_pos.ksh @@ -0,0 +1,123 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_005_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_005_pos +# +# DESCRIPTION: +# +# When a reservation property of a filesystem, regular volume +# or sparse volume is set to 'none' the space previously consumed by the +# reservation should be released back to the pool +# +# STRATEGY: +# 1) Create a filesystem, regular volume and sparse volume +# 2) Get the space used and available in the pool +# 3) Set a reservation on the filesystem less than the space available. +# 4) Verify that the 'reservation' property for the filesystem has +# the correct value. +# 5) Reset the reservation value back to zero (or 'none') +# 6) Verify that the space used and available totals for the pool have +# changed by the expected amounts (within tolerances). +# 7) Repeat steps 3-6 for a regular volume, sparse volume +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify space released when reservation on a dataset is set "\ + "to 'none'" + +space_avail=`get_prop available $TESTPOOL` + +if ! is_global_zone ; then + OBJ_LIST="" +else + OBJ_LIST="$TESTPOOL/$TESTVOL $TESTPOOL/$TESTVOL2" + (( vol_set_size = space_avail / 4 )) + vol_set_size=$(floor_volsize $vol_set_size) + (( sparse_vol_set_size = space_avail * 4 )) + sparse_vol_set_size=$(floor_volsize $sparse_vol_set_size) + + + log_must $ZFS create -V $vol_set_size $TESTPOOL/$TESTVOL + log_must $ZFS set reservation=none $TESTPOOL/$TESTVOL + log_must $ZFS create -s -V $sparse_vol_set_size $TESTPOOL/$TESTVOL2 +fi + +space_avail=`get_prop available $TESTPOOL` +space_used=`get_prop used $TESTPOOL` + +# Calculate a large but valid reservation value. +resv_size_set=`expr $space_avail - $RESV_DELTA` + +for obj in $TESTPOOL/$TESTFS $OBJ_LIST ; do + + # + # For regular (non-sparse) volumes the upper limit is determined + # not by the space available in the pool but rather by the size + # of the volume itself. + # + [[ $obj == $TESTPOOL/$TESTVOL ]] && \ + (( resv_size_set = vol_set_size - RESV_DELTA )) + + log_must $ZFS set reservation=$resv_size_set $obj + + resv_size_get=`get_prop reservation $obj` + if [[ $resv_size_set != $resv_size_get ]]; then + log_fail "Reservation not the expected value "\ + "($resv_size_set != $resv_size_get)" + fi + + log_must $ZFS set reservation=none $obj + + new_space_avail=`get_prop available $TESTPOOL` + new_space_used=`get_prop used $TESTPOOL` + + log_must within_limits $space_used $new_space_used $RESV_TOLERANCE + log_must within_limits $space_avail $new_space_avail $RESV_TOLERANCE +done + +log_pass "Space correctly released when dataset reservation set to 'none'" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_006_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_006_pos.ksh new file mode 100644 index 00000000000..40dc6ad4e0f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_006_pos.ksh @@ -0,0 +1,87 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_006_pos.ksh 1.3 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_006_pos +# +# DESCRIPTION: +# +# Reservations (if successfully set) guarantee a minimum amount of space +# for a dataset. Unlike quotas however there should be no restrictions +# on accessing space outside of the limits of the reservation (if the +# space is available in the pool). Verify that in a filesystem with a +# reservation set that its possible to create files both within the +# reserved space and also outside. +# +# STRATEGY: +# 1) Create a filesystem +# 2) Get the space used and available in the pool +# 3) Set a reservation on the filesystem +# 4) Verify can write a file that is bigger than the reserved space +# +# i.e. we start writing within the reserved region and then continue +# for 20MB outside it. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify can create files both inside and outside reserved areas" + +space_used=`get_prop used $TESTPOOL` + +log_must $ZFS set reservation=$RESV_SIZE $TESTPOOL/$TESTFS + +# +# Calculate how many writes of BLOCK_SIZE it would take to fill +# up RESV_SIZE + 20971520 (20 MB). +# +fill_size=`expr $RESV_SIZE + 20971520` +write_count=`expr $fill_size / $BLOCK_SIZE` + +log_must $FILE_WRITE -o create -f $TESTDIR/$TESTFILE1 -b $BLOCK_SIZE \ + -c $write_count -d 0 + +log_pass "Able to create files inside and outside reserved area" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_007_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_007_pos.ksh new file mode 100644 index 00000000000..88147247164 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_007_pos.ksh @@ -0,0 +1,131 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_007_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_007_pos +# +# DESCRIPTION: +# +# Setting a reservation on dataset should have no effect on any other +# dataset at the same level in the hierarchy beyond using up available +# space in the pool. +# +# STRATEGY: +# 1) Create a filesystem +# 2) Set a reservation on the filesystem +# 3) Create another filesystem at the same level +# 4) Set a reservation on the second filesystem +# 5) Destroy both the filesystems +# 6) Verify space accounted for correctly +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify reservations on data sets doesn't affect other data sets at" \ + " same level except for consuming space from common pool" + +space_avail=`get_prop available $TESTPOOL` +space_used=`get_prop used $TESTPOOL` + +resv_size_set=`expr $space_avail / 3` + +# +# Function which creates two datasets, sets reservations on them, +# then destroys them and ensures that space is correctly accounted +# for. +# +# Any special arguments for create are passed in via the args +# parameter. +# +function create_resv_destroy { # args1 dataset1 args2 dataset2 + + args1=$1 + dataset1=$2 + args2=$3 + dataset2=$4 + + log_must $ZFS create $args1 $dataset1 + + log_must $ZFS set reservation=$RESV_SIZE $dataset1 + + avail_aft_dset1=`get_prop available $TESTPOOL` + used_aft_dset1=`get_prop used $TESTPOOL` + + log_must $ZFS create $args2 $dataset2 + + log_must $ZFS set reservation=$RESV_SIZE $dataset2 + + + # After destroying the second dataset the space used and + # available totals should revert back to the values they + # had after creating the first dataset. + # + log_must $ZFS destroy -f $dataset2 + + avail_dest_dset2=`get_prop available $TESTPOOL` + used_dest_dset2=`get_prop used $TESTPOOL` + + log_must within_limits $avail_aft_dset1 $avail_dest_dset2 $RESV_TOLERANCE + log_must within_limits $used_aft_dset1 $used_dest_dset2 $RESV_TOLERANCE + + + # After destroying the first dataset the space used and + # space available totals should revert back to the values + # they had when the pool was first created. + log_must $ZFS destroy -f $dataset1 + + avail_dest_dset1=`get_prop available $TESTPOOL` + used_dest_dset1=`get_prop used $TESTPOOL` + + log_must within_limits $avail_dest_dset1 $space_avail $RESV_TOLERANCE + log_must within_limits $used_dest_dset1 $space_used $RESV_TOLERANCE +} + +create_resv_destroy "" $TESTPOOL/$TESTFS1 "" $TESTPOOL/$TESTFS2 +create_resv_destroy "" $TESTPOOL/$TESTFS2 "" $TESTPOOL/$TESTFS1 + +log_pass "Verify reservations on data sets doesn't affect other data sets at" \ + " same level except for consuming space from common pool" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_008_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_008_pos.ksh new file mode 100644 index 00000000000..55a386f50c4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_008_pos.ksh @@ -0,0 +1,123 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_008_pos.ksh 1.3 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_008_pos +# +# DESCRIPTION: +# +# Setting a reservation reserves a defined minimum amount of space for +# a dataset, and prevents other datasets using that space. Verify that +# reducing the reservation on a filesystem allows other datasets in +# the pool to use that space. +# +# STRATEGY: +# 1) Create multiple filesystems +# 2) Set reservations on all bar one of the filesystems +# 3) Fill up the one non-reserved filesystem +# 4) Reduce one of the reservations and verify can write more +# data into the non-reserved filesystem +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify reducing reservation allows other datasets to use space" + +log_must create_multiple_fs $RESV_NUM_FS $TESTPOOL/$TESTFS $TESTDIR + +space_avail=`get_prop available $TESTPOOL` +space_used=`get_prop used $TESTPOOL` + +# +# To make sure this test doesn't take too long to execute on +# large pools, we calculate a reservation setting which when +# applied to all bar one of the filesystems (RESV_NUM_FS-1) will +# ensure we have RESV_FREE_SPACE left free in the pool, which we will +# be able to quickly fill. +# +resv_space_avail=`expr $space_avail - $RESV_FREE_SPACE` +num_resv_fs=`expr $RESV_NUM_FS - 1` # Number of FS to which resv will be applied +resv_size_set=`expr $resv_space_avail / $num_resv_fs` + +# +# We set the reservations now, rather than when we created the filesystems +# to allow us to take into account space used by the filsystem metadata +# +# Note we don't set a reservation on the first filesystem we created, +# hence num=1 rather than zero below. +# +typeset -i num=1 +while (( $num < $RESV_NUM_FS )); do + log_must $ZFS set reservation=$resv_size_set $TESTPOOL/$TESTFS$num + (( num = num + 1 )) +done + +space_avail_still=`get_prop available $TESTPOOL` + +fill_size=`expr $space_avail_still + $RESV_TOLERANCE` +write_count=`expr $fill_size / $BLOCK_SIZE` + +# Now fill up the first filesystem (which doesn't have a reservation set +# and thus will use up whatever free space is left in the pool). +num=0 +log_note "Writing to $TESTDIR$num/$TESTFILE1" + +$FILE_WRITE -o create -f $TESTDIR$num/$TESTFILE1 -b $BLOCK_SIZE \ + -c $write_count -d 0 +ret=$? +if (( $ret != $ENOSPC )); then + log_fail "Did not get ENOSPC as expected (got $ret)." +fi + +# Remove the reservation on one of the other filesystems and verify +# can write more data to the original non-reservation filesystem. +num=1 +log_must $ZFS set reservation=none $TESTPOOL/${TESTFS}$num +num=0 +log_must $FILE_WRITE -o create -f ${TESTDIR}$num/$TESTFILE2 -b $BLOCK_SIZE \ + -c 1000 -d 0 + +log_pass "reducing reservation allows other datasets to use space" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_009_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_009_pos.ksh new file mode 100644 index 00000000000..3ee8ad83923 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_009_pos.ksh @@ -0,0 +1,105 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_009_pos.ksh 1.3 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_009_pos +# +# DESCRIPTION: +# +# In pool with a full filesystem and another filesystem with a reservation +# setting the reservation on the second filesystem to 'none' should allow more +# data to be written to the first filesystem. +# +# +# STRATEGY: +# 1) Create a filesystem as a dataset +# 2) Create a filesystem at the same level +# 3) Set a reservation on the dataset filesystem +# 4) Fill up the filesystem +# 5) Set the reservation on the dataset filesystem to 'none' +# 6) Verify we can write more data to the first filesystem +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Setting top level dataset reservation to 'none' allows more data to" \ + " be written to top level filesystem" + +log_must $ZFS create $TESTPOOL/$TESTFS1 + +space_avail=`get_prop available $TESTPOOL` + +# +# To make sure this test doesn't take too long to execute on +# large pools, we calculate a reservation setting which when +# applied to the dataset will ensure we have RESV_FREE_SPACE +# left free in the pool which we can quickly fill. +# +(( resv_size_set = space_avail - RESV_FREE_SPACE )) + +log_must $ZFS set reservation=$resv_size_set $TESTPOOL/$TESTFS1 + +space_avail_still=`get_prop available $TESTPOOL` + +fill_size=`expr $space_avail_still + $RESV_TOLERANCE` +write_count=`expr $fill_size / $BLOCK_SIZE` + +# Now fill up the filesystem (which doesn't have a reservation set +# and thus will use up whatever free space is left in the pool). +$FILE_WRITE -o create -f $TESTDIR/$TESTFILE1 -b $BLOCK_SIZE \ + -c $write_count -d 0 +ret=$? +if (( $ret != $ENOSPC )); then + log_fail "Did not get ENOSPC as expected (got $ret)." +fi + +log_must $ZFS set reservation=none $TESTPOOL/$TESTFS1 + +log_must $FILE_WRITE -o create -f $TESTDIR/$TESTFILE2 -b $BLOCK_SIZE \ + -c 1000 -d 0 + +log_pass "Setting top level dataset reservation to 'none' allows more " \ + "data to be written to the top level filesystem" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_010_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_010_pos.ksh new file mode 100644 index 00000000000..d799c196250 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_010_pos.ksh @@ -0,0 +1,105 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_010_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_010_pos +# +# DESCRIPTION: +# +# In pool with a full filesystem and a filesystem with a reservation +# destroying another filesystem should allow more data to be written to +# the full filesystem +# +# +# STRATEGY: +# 1) Create a filesystem as dataset +# 2) Create a filesystem at the same level +# 3) Set a reservation on the dataset filesystem +# 4) Fill up the second filesystem +# 5) Destroy the dataset filesystem +# 6) Verify can write more data to the full filesystem +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Destroying top level filesystem with reservation allows more data to" \ + " be written to another top level filesystem" + +log_must $ZFS create $TESTPOOL/$TESTFS1 + +space_avail=`get_prop available $TESTPOOL` + +# +# To make sure this test doesn't take too long to execute on +# large pools, we calculate a reservation setting which when +# applied to the dataset filesystem will ensure we have +# RESV_FREE_SPACE left free in the pool. +# +(( resv_size_set = space_avail - RESV_FREE_SPACE )) + +log_must $ZFS set reservation=$resv_size_set $TESTPOOL/$TESTFS1 + +space_avail_still=`get_prop available $TESTPOOL` + +fill_size=`expr $space_avail_still + $RESV_TOLERANCE` +write_count=`expr $fill_size / $BLOCK_SIZE` + +# Now fill up the filesystem (which doesn't have a reservation set +# and thus will use up whatever free space is left in the pool). +$FILE_WRITE -o create -f $TESTDIR/$TESTFILE1 -b $BLOCK_SIZE \ + -c $write_count -d 0 +ret=$? +if (( $ret != $ENOSPC )); then + log_fail "Did not get ENOSPC as expected (got $ret)." +fi + +log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + +log_must $FILE_WRITE -o create -f $TESTDIR/$TESTFILE2 -b $BLOCK_SIZE \ + -c 1000 -d 0 + +log_pass "Destroying top level filesystem with reservation allows more data to" \ + " be written to another top level filesystem" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_011_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_011_pos.ksh new file mode 100644 index 00000000000..9a99b780d3d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_011_pos.ksh @@ -0,0 +1,81 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_011_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_011_pos +# +# DESCRIPTION: +# +# ZFS has two mechanisms dealing with space for datasets, namely +# reservations and quotas. Setting one should not affect the other, +# provided the values are legal (i.e. enough space in pool etc). +# +# STRATEGY: +# 1) Create one filesystem +# 2) Get the current quota setting +# 3) Set a reservation +# 4) Verify that the quota value remains unchanged +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify reservation settings do not affect quota settings" + +space_avail=`get_prop available $TESTPOOL` + +(( resv_size_set = (space_avail - RESV_DELTA) / 2 )) + +fs_quota=`$ZFS get quota $TESTPOOL/$TESTFS` + +log_must $ZFS set reservation=$resv_size_set $TESTPOOL/$TESTFS + +new_fs_quota=`$ZFS get quota $TESTPOOL/$TESTFS` + +if [[ $fs_quota != $new_fs_quota ]]; then + log_fail "Quota value on $TESTFS has changed ($fs_quota != $new_fs_quota)" +fi + +log_pass "Quota settings unaffected by reservation settings" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_012_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_012_pos.ksh new file mode 100644 index 00000000000..659f3d4cf9a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_012_pos.ksh @@ -0,0 +1,98 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_012_pos.ksh 1.3 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_012_pos +# +# DESCRIPTION: +# +# A reservation guarantees a certain amount of space for a dataset. +# Nothing else which happens in the same pool should affect that +# space, i.e. even if the rest of the pool fills up the reserved +# space should still be accessible. +# +# STRATEGY: +# 1) Create 2 filesystems +# 2) Set a reservation on one filesystem +# 3) Fill up the other filesystem (which does not have a reservation +# set) until all space is consumed +# 4) Verify can still write to the filesystem which has a reservation +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify reservations protect space" + +function cleanup +{ + $ZFS destroy -f $TESTPOOL/$TESTFS2 + [[ -d $TESTDIR2 ]] && \ + log_must $RM -rf $TESTDIR2 +} + +log_onexit cleanup + +log_must $ZFS create $TESTPOOL/$TESTFS2 +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$TESTFS2 + +space_avail=`get_prop available $TESTPOOL` + +(( resv_size_set = space_avail - RESV_FREE_SPACE )) + +log_must $ZFS set reservation=$resv_size_set $TESTPOOL/$TESTFS + +(( write_count = ( RESV_FREE_SPACE + RESV_TOLERANCE ) / BLOCK_SIZE )) + +$FILE_WRITE -o create -f $TESTDIR2/$TESTFILE1 -b $BLOCK_SIZE -c $write_count -d 0 +ret=$? +if [[ $ret != $ENOSPC ]]; then + log_fail "Did not get ENOSPC (got $ret) for non-reserved filesystem" +fi + +(( write_count = ( RESV_FREE_SPACE - RESV_TOLERANCE ) / BLOCK_SIZE )) +log_must $FILE_WRITE -o create -f $TESTDIR/$TESTFILE2 -b $BLOCK_SIZE -c $write_count -d 0 + +log_pass "Reserved space preserved correctly" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_013_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_013_pos.ksh new file mode 100644 index 00000000000..774d1540d4d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_013_pos.ksh @@ -0,0 +1,121 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_013_pos.ksh 1.4 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_013_pos +# +# DESCRIPTION: +# +# Reservation properties on data objects should be preserved when the +# pool within which they are contained is exported and then re-imported. +# +# +# STRATEGY: +# 1) Create a filesystem as dataset +# 2) Create another filesystem at the same level +# 3) Create a regular volume at the same level +# 4) Create a sparse volume at the same level +# 5) Create a filesystem within the dataset filesystem +# 6) Set reservations on all filesystems +# 7) Export the pool +# 8) Re-import the pool +# 9) Verify that the reservation settings are correct +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Reservation properties preserved across exports and imports" + +OBJ_LIST="$TESTPOOL/$TESTFS1/$TESTFS2 $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTVOL2" + +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS create $TESTPOOL/$TESTFS1/$TESTFS2 + +space_avail=`get_prop available $TESTPOOL` +[[ $? -ne 0 ]] && \ + log_fail "Unable to get space available property for $TESTPOOL" + +(( resv_set = space_avail / 8 )) +resv_set=$(floor_volsize $resv_set) +(( sparse_vol_set_size = space_avail * 8 )) +sparse_vol_set_size=$(floor_volsize $sparse_vol_set_size) +reg_vol_blksz=8192 + +# When initially created, a regular volume's refreservation property is set +# equal to its size (unlike a sparse volume), so we don't need to set it +# explicitly later on. However, since the zfs command modifies the +# reservation based on the volume size, it is necessary to test it separately. +log_must $ZFS create -b $reg_vol_blksz -V $resv_set $TESTPOOL/$TESTVOL +log_must $ZFS create -s -V $sparse_vol_set_size $TESTPOOL/$TESTVOL2 + +log_must $ZFS set refreservation=$resv_set $TESTPOOL/$TESTFS +log_must $ZFS set refreservation=$resv_set $TESTPOOL/$TESTFS1 +log_must $ZFS set refreservation=$resv_set $TESTPOOL/$TESTFS1/$TESTFS2 +log_must $ZFS set refreservation=$resv_set $TESTPOOL/$TESTVOL2 + +log_must $ZPOOL export $TESTPOOL + +typeset dir=$(get_device_dir $DISKS) +log_must $ZPOOL import -d $dir $TESTPOOL + +alloc_vol_size=$(zvol_volsize_to_reservation $resv_set $reg_vol_blksz 1) +resv_get=$(get_prop refreservation $TESTPOOL/$TESTVOL) +[[ $resv_get != $alloc_vol_size ]] && \ + log_fail "Reservation property for $TESTPOOL/$TESTVOL incorrect;" \ + " expected $alloc_vol_size but got $resv_get" + +for obj in $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTVOL2 $TESTPOOL/$TESTFS1/$TESTFS2 +do + resv_get=`get_prop refreservation $obj` + + [[ $resv_get != $resv_set ]] && \ + log_fail "Reservation property for $obj incorrect " \ + " expected $resv_set but got $resv_get" +done + +log_pass "Reservation properties preserved across exports and imports" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_014_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_014_pos.ksh new file mode 100644 index 00000000000..e5c23c211ce --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_014_pos.ksh @@ -0,0 +1,126 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_014_pos.ksh 1.3 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_014_pos +# +# DESCRIPTION: +# +# A reservation cannot exceed the quota on a dataset +# +# STRATEGY: +# 1) Create a filesystem and volume +# 2) Set a quota on the filesystem +# 3) Attempt to set a reservation larger than the quota. Verify +# that the attempt fails. +# 4) Repeat 2-3 for volume +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify cannot set reservation larger than quota" + +space_avail=`get_prop available $TESTPOOL` + +if ! is_global_zone ; then + OBJ_LIST="" +else + OBJ_LIST="$TESTPOOL/$TESTVOL $TESTPOOL/$TESTVOL2" + + (( vol_set_size = space_avail / 4 )) + vol_set_size=$(floor_volsize $vol_set_size) + (( sparse_vol_set_size = space_avail * 4 )) + sparse_vol_set_size=$(floor_volsize $sparse_vol_set_size) + + + log_must $ZFS create -V $vol_set_size $TESTPOOL/$TESTVOL + log_must $ZFS create -s -V $sparse_vol_set_size $TESTPOOL/$TESTVOL2 +fi + +for obj in $TESTPOOL/$TESTFS $OBJ_LIST ; do + + space_avail=`get_prop available $TESTPOOL` + (( quota_set_size = space_avail / 3 )) + + # + # A regular (non-sparse) volume's size is effectively + # its quota so only need to explicitly set quotas for + # filesystems and datasets. + # + # A volumes size is effectively its quota. The maximum + # reservation value that can be set on a volume is + # determined by the size of the volume or the amount of + # space in the pool, whichever is smaller. + # + if [[ $obj == $TESTPOOL/$TESTFS ]]; then + log_must $ZFS set quota=$quota_set_size $obj + (( resv_set_size = quota_set_size + RESV_SIZE )) + + elif [[ $obj == $TESTPOOL/$TESTVOL2 ]] ; then + + (( resv_set_size = sparse_vol_set_size + RESV_SIZE )) + + elif [[ $obj == $TESTPOOL/$TESTVOL ]] ; then + + (( resv_set_size = vol_set_size + RESV_SIZE )) + fi + + orig_quota=`get_prop quota $obj` + + log_mustnot $ZFS set reservation=$resv_set_size $obj + new_quota=`get_prop quota $obj` + + if [[ $orig_quota != $new_quota ]]; then + log_fail "Quota value changed from $orig_quota " \ + "to $new_quota" + fi + + if [[ $obj == $TESTPOOL/$TESTFS ]]; then + log_must $ZFS set quota=none $obj + fi +done + +log_pass "As expected cannot set reservation larger than quota" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_015_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_015_pos.ksh new file mode 100644 index 00000000000..d0fb00e77ae --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_015_pos.ksh @@ -0,0 +1,114 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_015_pos.ksh 1.4 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_015_pos +# +# DESCRIPTION: +# +# In pool with a full filesystem and a regular volume with an implicit +# reservation, setting the reservation on the volume to 'none' should allow +# more data to be written to the filesystem. +# +# +# STRATEGY: +# 1) Create a regular non-sparse volume (which implicitly sets the reservation +# property to a value equal to the volume size) +# 2) Create a filesystem at the same level +# 3) Fill up the filesystem +# 4) Set the reservation on the volume to 'none' +# 5) Verify can write more data to the filesystem +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Setting volume reservation to 'none' allows more data to" \ + " be written to top level filesystem" + +space_avail=`get_prop available $TESTPOOL` + +# +# To make sure this test doesn't take too long to execute on +# large pools, we calculate a volume size which when applied +# to the volume will ensure we have RESV_FREE_SPACE +# left free in the pool which we can quickly fill. +# +# For the volume itself, set a reservation to 95% of available +# space to allow space for metadata. +# +(( resv_size_set = space_avail * 95 / 100 )) +resv_size_set=$(floor_volsize $resv_size_set $BLOCK_SIZE) + +log_must $ZFS create -b $BLOCK_SIZE -V $resv_size_set $TESTPOOL/$TESTVOL + +# Create a secondary filesystem to soak up what's left to get +# to RESV_FREE_SPACE for the pool. +space_avail_still=`get_prop available $TESTPOOL` +(( zfs_res = space_avail_still - RESV_FREE_SPACE )) +log_must $ZFS create -o refreservation=$zfs_res $TESTPOOL/$TESTFS2 + +space_avail_still=`get_prop available $TESTPOOL` + +fill_size=`expr $space_avail_still + $RESV_TOLERANCE` +write_count=`expr $fill_size / $BLOCK_SIZE` + +# Now fill up the filesystem (which doesn't have a reservation set +# and thus will use up whatever free space is left in the pool). +$FILE_WRITE -o create -f $TESTDIR/$TESTFILE1 -b $BLOCK_SIZE \ + -c $write_count -d 0 +ret=$? + +if (( $ret != $ENOSPC )); then + log_fail "Did not get ENOSPC as expected (got $ret)." +fi + +log_must $ZFS set refreservation=none $TESTPOOL/$TESTVOL + +log_must $FILE_WRITE -o create -f $TESTDIR/$TESTFILE2 -b $BLOCK_SIZE \ + -c 1000 -d 0 + +log_pass "Setting top level volume reservation to 'none' allows more " \ + "data to be written to the top level filesystem" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_016_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_016_pos.ksh new file mode 100644 index 00000000000..b6825fe6ab7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_016_pos.ksh @@ -0,0 +1,112 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_016_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_016_pos +# +# DESCRIPTION: +# +# In pool with a full filesystem and a regular volume (with implicit +# reservation) destroying the volume should allow more data to be written +# to the filesystem +# +# +# STRATEGY: +# 1) Create a regular (non-sparse) volume +# 2) Create a filesystem at the same level +# 3) Fill up the filesystem +# 4) Destroy the volume +# 5) Verify can write more data to the filesystem +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-19) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Destroying a regular volume with reservation allows more data to" \ + " be written to top level filesystem" + +space_avail=`get_prop available $TESTPOOL` + +# +# To make sure this test doesn't take too long to execute on +# large pools, we calculate a volume size which will ensure we +# have RESV_FREE_SPACE left free in the pool. +# +(( vol_set_size = space_avail * 95 / 100 )) +vol_set_size=$(floor_volsize $vol_set_size $BLOCK_SIZE) + +# Creating a regular volume implicitly sets its reservation +# property to the same value. +log_must $ZFS create -b $BLOCK_SIZE -V $vol_set_size $TESTPOOL/$TESTVOL + +space_avail_still=`get_prop available $TESTPOOL` + +# Create a secondary filesystem to soak up what's left to get +# to RESV_FREE_SPACE for the pool. +space_avail_still=`get_prop available $TESTPOOL` +(( zfs_res = space_avail_still - RESV_FREE_SPACE )) +log_must $ZFS create -o refreservation=$zfs_res $TESTPOOL/$TESTFS2 + +space_avail_still=`get_prop available $TESTPOOL` + +fill_size=`expr $space_avail_still + $RESV_TOLERANCE` +write_count=`expr $fill_size / $BLOCK_SIZE` + +# Now fill up the filesystem (which doesn't have a reservation set +# and thus will use up whatever free space is left in the pool). +$FILE_WRITE -o create -f $TESTDIR/$TESTFILE1 -b $BLOCK_SIZE \ + -c $write_count -d 0 +ret=$? +if (( $ret != $ENOSPC )); then + log_fail "Did not get ENOSPC as expected (got $ret)." +fi + +log_must $ZFS destroy -f $TESTPOOL/$TESTVOL + +log_must $FILE_WRITE -o create -f $TESTDIR/$TESTFILE2 -b $BLOCK_SIZE \ + -c 1000 -d 0 + +log_pass "Destroying volume with reservation allows more data to" \ + " be written to top level filesystem" diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_017_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_017_pos.ksh new file mode 100644 index 00000000000..da5978a52d1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_017_pos.ksh @@ -0,0 +1,105 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_017_pos.ksh 1.5 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_017_pos +# +# DESCRIPTION: +# +# For a sparse volume changes to the volsize are not reflected in the reservation +# +# STRATEGY: +# 1) Create a regular and sparse volume +# 2) Get the space available in the pool +# 3) Set reservation with various size on the regular and sparse volume +# 4) Verify that the 'reservation' property for the regular volume has +# the correct value. +# 5) Verify that the 'reservation' property for the sparse volume is set to 'none' +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-17) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +log_assert "Verify that the volsize changes of sparse volume are not reflected" \ + "in the reservation" + +#Create a regular and sparse volume for testing. +regvol=$TESTPOOL/$TESTVOL +sparsevol=$TESTPOOL/$TESTVOL2 +log_must $ZFS create -V $VOLSIZE -o volblocksize=16k $regvol +log_must $ZFS create -s -V $VOLSIZE -o volblocksize=16k $sparsevol + +typeset -l vsize=$(get_prop available $TESTPOOL) +typeset -i iterate=10 +typeset -l regreserv +typeset -l sparsereserv +typeset -l vblksize1=$(get_prop volblocksize $regvol) +typeset -l vblksize2=$(get_prop volblocksize $sparsevol) +typeset -l blknum=0 +if [ "$vblksize1" != "$vblksize2" ]; then + log_must $ZFS set volblocksize=$vblksize1 $sparsevol +fi +(( blknum = vsize / vblksize1 )) + +typeset -i randomblknum +while (( iterate > 1 )); do + (( randomblknum = 1 + $RANDOM % $blknum )) + #Make sure volsize is a multiple of volume block size + (( vsize = $randomblknum * $vblksize1 )) + log_must $ZFS set volsize=$vsize $regvol + log_must $ZFS set volsize=$vsize $sparsevol + regreserv=$(get_prop refreservation $regvol) + sparsereserv=$(get_prop refreservation $sparsevol) + reg_shouldreserv=$(zvol_volsize_to_reservation $vsize $vblksize1 1) + + (( $sparsereserv == $vsize )) && \ + log_fail "volsize changes of sparse volume is reflected in reservation." + (( $regreserv != $reg_shouldreserv )) && \ + log_fail "volsize changes of regular volume isnot reflected in reservation." + + (( iterate = iterate - 1 )) +done + +log_pass "The volsize change of sparse volume is not reflected in reservation as expected." diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_018_pos.ksh b/tests/sys/cddl/zfs/tests/reservation/reservation_018_pos.ksh new file mode 100644 index 00000000000..dd93beeb946 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_018_pos.ksh @@ -0,0 +1,78 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)reservation_018_pos.ksh 1.4 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/reservation/reservation.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: reservation_018_pos +# +# DESCRIPTION: +# +# Verify that reservation doesn't inherit its value from parent. +# +# STRATEGY: +# 1) Create a filesystem tree +# 2) Set reservation for parents +# 3) Verify that the 'reservation' for descendent doesnot inherit the value. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-08-17) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +log_assert "Verify that reservation doesnot inherit its value from parent." + +fs=$TESTPOOL/$TESTFS +fs_child=$TESTPOOL/$TESTFS/$TESTFS + +space_avail=$(get_prop available $fs) +reserv_val=$(get_prop reservation $fs) +typeset -l reservsize=$space_avail +((reservsize = reservsize / 2 )) +log_must $ZFS set reservation=$reservsize $fs + +log_must $ZFS create $fs_child +rsv_space=$(get_prop reservation $fs_child) +[[ $rsv_space == $reservsize ]] && \ + log_fail "The reservation of child dataset inherits its value from parent." + +log_pass "reservation doesnot inherit its value from parent as expected." diff --git a/tests/sys/cddl/zfs/tests/reservation/reservation_test.sh b/tests/sys/cddl/zfs/tests/reservation/reservation_test.sh new file mode 100755 index 00000000000..1928dd0908c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/reservation_test.sh @@ -0,0 +1,524 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case reservation_001_pos cleanup +reservation_001_pos_head() +{ + atf_set "descr" "Verify that to set a reservation on a filesystem or volume must use value smaller than space \ available property of pool" + atf_set "require.progs" zfs +} +reservation_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_001_pos.ksh || atf_fail "Testcase failed" +} +reservation_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_002_pos cleanup +reservation_002_pos_head() +{ + atf_set "descr" "Reservation values cannot exceed the amount of space available in the pool" + atf_set "require.progs" zfs +} +reservation_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_002_pos.ksh || atf_fail "Testcase failed" +} +reservation_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_003_pos cleanup +reservation_003_pos_head() +{ + atf_set "descr" "Verify it is possible to set reservations multiple times on a filesystem regular and sparse volume" + atf_set "require.progs" zfs +} +reservation_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_003_pos.ksh || atf_fail "Testcase failed" +} +reservation_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_004_pos cleanup +reservation_004_pos_head() +{ + atf_set "descr" "Verify space released when a dataset with reservation is destroyed" + atf_set "require.progs" zfs +} +reservation_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_004_pos.ksh || atf_fail "Testcase failed" +} +reservation_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_005_pos cleanup +reservation_005_pos_head() +{ + atf_set "descr" "Verify space released when reservation on a dataset is setto 'none'" + atf_set "require.progs" zfs +} +reservation_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_005_pos.ksh || atf_fail "Testcase failed" +} +reservation_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_006_pos cleanup +reservation_006_pos_head() +{ + atf_set "descr" "Verify can create files both inside and outside reserved areas" + atf_set "require.progs" zfs +} +reservation_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_006_pos.ksh || atf_fail "Testcase failed" +} +reservation_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_007_pos cleanup +reservation_007_pos_head() +{ + atf_set "descr" "Verify reservations on data sets doesn't affect other data sets at same level except for consuming space from common pool" + atf_set "require.progs" zfs +} +reservation_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_007_pos.ksh || atf_fail "Testcase failed" +} +reservation_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_008_pos cleanup +reservation_008_pos_head() +{ + atf_set "descr" "Verify reducing reservation allows other datasets to use space" + atf_set "require.progs" zfs + atf_set "timeout" 600 +} +reservation_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_008_pos.ksh || atf_fail "Testcase failed" +} +reservation_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_009_pos cleanup +reservation_009_pos_head() +{ + atf_set "descr" "Setting top level dataset reservation to 'none' allows more data to be written to top level filesystem" + atf_set "require.progs" zfs + atf_set "timeout" 600 +} +reservation_009_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_009_pos.ksh || atf_fail "Testcase failed" +} +reservation_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_010_pos cleanup +reservation_010_pos_head() +{ + atf_set "descr" "Destroying top level filesystem with reservation allows more data to be written to another top level filesystem" + atf_set "require.progs" zfs + atf_set "timeout" 600 +} +reservation_010_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_010_pos.ksh || atf_fail "Testcase failed" +} +reservation_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_011_pos cleanup +reservation_011_pos_head() +{ + atf_set "descr" "Verify reservation settings do not affect quota settings" + atf_set "require.progs" zfs +} +reservation_011_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_011_pos.ksh || atf_fail "Testcase failed" +} +reservation_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_012_pos cleanup +reservation_012_pos_head() +{ + atf_set "descr" "Verify reservations protect space" + atf_set "require.progs" zfs + atf_set "timeout" 600 +} +reservation_012_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_012_pos.ksh || atf_fail "Testcase failed" +} +reservation_012_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_013_pos cleanup +reservation_013_pos_head() +{ + atf_set "descr" "Reservation properties preserved across exports and imports" + atf_set "require.progs" zfs zpool +} +reservation_013_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_013_pos.ksh || atf_fail "Testcase failed" +} +reservation_013_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_014_pos cleanup +reservation_014_pos_head() +{ + atf_set "descr" "Verify cannot set reservation larger than quota" + atf_set "require.progs" zfs +} +reservation_014_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_014_pos.ksh || atf_fail "Testcase failed" +} +reservation_014_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_015_pos cleanup +reservation_015_pos_head() +{ + atf_set "descr" "Setting volume reservation to 'none' allows more data to be written to top level filesystem" + atf_set "require.progs" zfs + atf_set "timeout" 600 +} +reservation_015_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_015_pos.ksh || atf_fail "Testcase failed" +} +reservation_015_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_016_pos cleanup +reservation_016_pos_head() +{ + atf_set "descr" "Destroying a regular volume with reservation allows more data to be written to top level filesystem" + atf_set "require.progs" zfs + atf_set "timeout" 600 +} +reservation_016_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_016_pos.ksh || atf_fail "Testcase failed" +} +reservation_016_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_017_pos cleanup +reservation_017_pos_head() +{ + atf_set "descr" "Verify that the volsize changes of sparse volume are not reflectedin the reservation" + atf_set "require.progs" zfs +} +reservation_017_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_017_pos.ksh || atf_fail "Testcase failed" +} +reservation_017_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case reservation_018_pos cleanup +reservation_018_pos_head() +{ + atf_set "descr" "Verify that reservation doesnot inherit its value from parent." + atf_set "require.progs" zfs +} +reservation_018_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/reservation_018_pos.ksh || atf_fail "Testcase failed" +} +reservation_018_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/reservation.kshlib + . $(atf_get_srcdir)/reservation.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case reservation_001_pos + atf_add_test_case reservation_002_pos + atf_add_test_case reservation_003_pos + atf_add_test_case reservation_004_pos + atf_add_test_case reservation_005_pos + atf_add_test_case reservation_006_pos + atf_add_test_case reservation_007_pos + atf_add_test_case reservation_008_pos + atf_add_test_case reservation_009_pos + atf_add_test_case reservation_010_pos + atf_add_test_case reservation_011_pos + atf_add_test_case reservation_012_pos + atf_add_test_case reservation_013_pos + atf_add_test_case reservation_014_pos + atf_add_test_case reservation_015_pos + atf_add_test_case reservation_016_pos + atf_add_test_case reservation_017_pos + atf_add_test_case reservation_018_pos +} diff --git a/tests/sys/cddl/zfs/tests/reservation/setup.ksh b/tests/sys/cddl/zfs/tests/reservation/setup.ksh new file mode 100644 index 00000000000..6fd6a597a9d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/reservation/setup.ksh @@ -0,0 +1,43 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup_noexit $DISK +# +# Set compression=off to make sure the data is not compressed for +# reservation testing. +# +log_must $ZFS set compression=off $TESTPOOL + +log_pass diff --git a/tests/sys/cddl/zfs/tests/rootpool/Makefile b/tests/sys/cddl/zfs/tests/rootpool/Makefile new file mode 100644 index 00000000000..352866fc416 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rootpool/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE= tests +TESTSDIR= ${TESTSBASE}/sys/cddl/zfs/tests/rootpool +FILESDIR= ${TESTSDIR} + +ATF_TESTS_KSH93+= rootpool_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= rootpool_007_neg.ksh +${PACKAGE}FILES+= rootpool_002_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= rootpool_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/rootpool/cleanup.ksh b/tests/sys/cddl/zfs/tests/rootpool/cleanup.ksh new file mode 100644 index 00000000000..473c351808c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rootpool/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 08/05/14 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/rootpool/rootpool_001_pos.ksh b/tests/sys/cddl/zfs/tests/rootpool/rootpool_001_pos.ksh new file mode 100644 index 00000000000..ac2ba378235 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rootpool/rootpool_001_pos.ksh @@ -0,0 +1,72 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rootpool_001_pos.ksh 1.1 08/05/14 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: rootpool_001_pos +# +# DESCRIPTION: +# +# rootpool's bootfs property must be equal to +# +# STRATEGY: +# 1) check if the system is zfsroot or not. +# 2) get the rootpool and rootfs if it's zfs root +# 3) check the rootpool's bootfs value +# 4) chek if the boofs equal to rootfs +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-01-21) +# +# __stc_assertion_end +# +################################################################################ +verify_runnable "global" +log_assert "rootpool's bootfs property must be equal to " + +typeset rootfs=$(get_rootfs) +typeset rootpool=$(get_rootpool) +typeset bootfs=$(get_pool_prop bootfs $rootpool) + +if [[ $bootfs != $rootfs ]]; then + log_fail "rootfs is not same as bootfs." +fi + +log_pass "rootpool's bootfs property equal to rootfs." + diff --git a/tests/sys/cddl/zfs/tests/rootpool/rootpool_002_neg.ksh b/tests/sys/cddl/zfs/tests/rootpool/rootpool_002_neg.ksh new file mode 100644 index 00000000000..c61a56714fa --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rootpool/rootpool_002_neg.ksh @@ -0,0 +1,72 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rootpool_002_neg.ksh 1.2 09/05/19 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: rootpool_002_neg +# +# DESCRIPTION: +# +# the zfs rootpool can not be destroyed +# +# STRATEGY: +# 1) check if the current system is installed as zfs root +# 2) get the rootpool +# 3) try to destroy the rootpool, which should fail. +# 4) try to destroy the rootpool filesystem, which should fail. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-01-21) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" +log_assert "zpool/zfs destory should return error" + + +typeset rootpool=$(get_rootpool) + +log_mustnot $ZPOOL destroy $rootpool + +log_mustnot $ZFS destroy $rootpool + +log_pass "rootpool can not be destroyed" + diff --git a/tests/sys/cddl/zfs/tests/rootpool/rootpool_007_neg.ksh b/tests/sys/cddl/zfs/tests/rootpool/rootpool_007_neg.ksh new file mode 100644 index 00000000000..95e83b37652 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rootpool/rootpool_007_neg.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +#ident "@(#)rootpool_007_neg.ksh 1.1 08/08/15 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: rootpool_007_neg +# +# DESCRIPTION: +# +# the zfs rootfilesystem's compression property can not set to gzip[1-9] +# +# STRATEGY: +# 1) check if the current system is installed as zfs root +# 2) get the rootfs +# 3) set the rootfs's compression to gzip 1-9 which should fail. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-07-08) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup { + log_must $ZFS set compression=$orig_compress $rootfs +} + +log_onexit cleanup +log_assert $assert_msg + +typeset rootpool=$(get_rootpool) +typeset rootfs=$(get_pool_prop bootfs $rootpool) +typeset orig_compress=$(get_prop compression $rootfs) + +typeset assert_msg="the zfs rootfs's compression property can not set to \ + gzip and gzip[1-9]" + +set -A gtype "gzip" "gzip-1" "gzip-2" "gzip-3" "gzip-4" "gzip-5" \ + "gzip-6" "gzip-7" "gzip-8" "gzip-9" + +typeset -i i=0 +while (( i < ${#gtype[@]} )); do + log_mustnot $ZFS set compression=${gtype[i]} $rootfs + (( i += 1 )) +done + +log_pass $assert_msg diff --git a/tests/sys/cddl/zfs/tests/rootpool/rootpool_test.sh b/tests/sys/cddl/zfs/tests/rootpool/rootpool_test.sh new file mode 100755 index 00000000000..9d992bfb8d2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rootpool/rootpool_test.sh @@ -0,0 +1,107 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case rootpool_001_pos cleanup +rootpool_001_pos_head() +{ + atf_set "descr" "rootpool's bootfs property must be equal to " +} +rootpool_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + if ! is_zfsroot ; then + atf_skip "This test requires a ZFS root filesystem." + fi + + ksh93 $(atf_get_srcdir)/setup.ksh + ksh93 $(atf_get_srcdir)/rootpool_001_pos.ksh || atf_fail "Testcase failed" +} +rootpool_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rootpool_002_neg cleanup +rootpool_002_neg_head() +{ + atf_set "descr" "zpool/zfs destory should return error" + atf_set "require.progs" zfs zpool +} +rootpool_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + if ! is_zfsroot ; then + atf_skip "This test requires a ZFS root filesystem." + fi + + ksh93 $(atf_get_srcdir)/rootpool_002_neg.ksh || atf_fail "Testcase failed" +} +rootpool_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rootpool_007_neg cleanup +rootpool_007_neg_head() +{ + atf_set "descr" "the zfs rootfs's compression property can not set to gzip and gzip[1-9]" + atf_set "require.progs" zfs +} +rootpool_007_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + if ! is_zfsroot ; then + atf_skip "This test requires a ZFS root filesystem." + fi + + ksh93 $(atf_get_srcdir)/rootpool_007_neg.ksh || atf_fail "Testcase failed" +} +rootpool_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case rootpool_001_pos + atf_add_test_case rootpool_002_neg + atf_add_test_case rootpool_007_neg +} diff --git a/tests/sys/cddl/zfs/tests/rootpool/setup.ksh b/tests/sys/cddl/zfs/tests/rootpool/setup.ksh new file mode 100644 index 00000000000..a9823674a75 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rootpool/setup.ksh @@ -0,0 +1,40 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 08/05/14 SMI" +# +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +if ! is_zfsroot ; then + log_unsupported "current system is not installed as zfs root fs" +fi + diff --git a/tests/sys/cddl/zfs/tests/rsend/Makefile b/tests/sys/cddl/zfs/tests/rsend/Makefile new file mode 100644 index 00000000000..67425df4738 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/Makefile @@ -0,0 +1,31 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/rsend +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= rsend_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= rsend_003_pos.ksh +${PACKAGE}FILES+= rsend_007_pos.ksh +${PACKAGE}FILES+= rsend_012_pos.ksh +${PACKAGE}FILES+= rsend_013_pos.ksh +${PACKAGE}FILES+= rsend_002_pos.ksh +${PACKAGE}FILES+= rsend_006_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= rsend_011_pos.ksh +${PACKAGE}FILES+= rsend.kshlib +${PACKAGE}FILES+= rsend_008_pos.ksh +${PACKAGE}FILES+= rsend_004_pos.ksh +${PACKAGE}FILES+= rsend_001_pos.ksh +${PACKAGE}FILES+= rsend_005_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= rsend_009_pos.ksh +${PACKAGE}FILES+= rsend.cfg +${PACKAGE}FILES+= rsend_010_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/rsend/cleanup.ksh b/tests/sys/cddl/zfs/tests/rsend/cleanup.ksh new file mode 100644 index 00000000000..dee363f19a4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/cleanup.ksh @@ -0,0 +1,53 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.3 09/06/22 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +verify_runnable "both" + +# +# Check if the system support 'send -R' +# +$ZFS send 2>&1 | grep -w "[-R]" > /dev/null 2>&1 +if (($? != 0)); then + log_unsupported +fi + +if is_global_zone ; then + destroy_pool $POOL + destroy_pool $POOL2 +else + cleanup_pool $POOL + cleanup_pool $POOL2 +fi +log_must $RM -rf $BACKDIR $TESTDIR + +log_pass diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend.cfg b/tests/sys/cddl/zfs/tests/rsend/rsend.cfg new file mode 100644 index 00000000000..ce70b66cd7c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend.cfg @@ -0,0 +1,43 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend.cfg 1.2 08/08/15 SMI" +# + +export BACKDIR=${TEST_BASE_DIR%%/}/backdir${TESTCASE_ID} + +export DISK1=$($ECHO $DISKS | $AWK '{print $1}') +export DISK2=$($ECHO $DISKS | $AWK '{print $2}') + +export POOL=$TESTPOOL +export POOL2=$TESTPOOL1 +export FS=$TESTFS +export CLONE=testclone.${TESTCASE_ID} +export VOL=testvol.${TESTCASE_ID} + +export STF_TIMEOUT=2700 diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend.kshlib b/tests/sys/cddl/zfs/tests/rsend/rsend.kshlib new file mode 100644 index 00000000000..b20cd203543 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend.kshlib @@ -0,0 +1,373 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend.kshlib 1.3 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Set up test model which includes various datasets +# +# @final +# @snapB +# @init +# | +# ______ pclone +# | / +# |@psnap +# || @final +# ||@final @final @snapC +# ||@snapC @snapC @snapB +# ||@snapA @snapB @snapA +# ||@init @init @init +# ||| | | +# $pool -------- $FS ------- fs1 ------- fs2 +# \ \\_____ \ | +# vol vol \____ \ @fsnap +# | | \ \ \ +# @init @vsnap | ------------ fclone +# @snapA @init \ | | +# @final @snapB \ | @init +# @snapC vclone @snapA +# @final | @final +# @init +# @snapC +# @final +# +# $1 pool name +# +function setup_test_model +{ + typeset pool=$1 + + log_must $ZFS create -p $pool/$FS/fs1/fs2 + + log_must $ZFS snapshot $pool@psnap + log_must $ZFS clone $pool@psnap $pool/pclone + + if is_global_zone ; then + log_must $ZFS create -V 16M $pool/vol + log_must $ZFS create -V 16M $pool/$FS/vol + + log_must $ZFS snapshot $pool/$FS/vol@vsnap + log_must $ZFS clone $pool/$FS/vol@vsnap $pool/$FS/vclone + fi + + log_must snapshot_tree $pool/$FS/fs1/fs2@fsnap + log_must $ZFS clone $pool/$FS/fs1/fs2@fsnap $pool/$FS/fs1/fclone + log_must $ZFS snapshot -r $pool@init + + log_must snapshot_tree $pool@snapA + log_must snapshot_tree $pool@snapC + log_must snapshot_tree $pool/pclone@snapB + log_must snapshot_tree $pool/$FS@snapB + log_must snapshot_tree $pool/$FS@snapC + log_must snapshot_tree $pool/$FS/fs1@snapA + log_must snapshot_tree $pool/$FS/fs1@snapB + log_must snapshot_tree $pool/$FS/fs1@snapC + log_must snapshot_tree $pool/$FS/fs1/fclone@snapA + + if is_global_zone ; then + log_must $ZFS snapshot $pool/vol@snapA + log_must $ZFS snapshot $pool/$FS/vol@snapB + log_must $ZFS snapshot $pool/$FS/vol@snapC + log_must $ZFS snapshot $pool/$FS/vclone@snapC + fi + + log_must $ZFS snapshot -r $pool@final + + return 0 +} + +# +# Cleanup the BACKDIR and given pool content and all the sub datasets +# +# $1 pool name +# +function cleanup_pool +{ + typeset pool=$1 + log_must $RM -rf $BACKDIR/* + + if is_global_zone ; then + log_must $ZFS destroy -Rf $pool + else + typeset list=$($ZFS list -H -r -t filesystem,snapshot,volume -o name $pool) + for ds in $list ; do + if [[ $ds != $pool ]] ; then + if datasetexists $ds ; then + log_must $ZFS destroy -Rf $ds + fi + fi + done + fi + + typeset mntpnt=$(get_prop mountpoint $pool) + if ! ismounted $pool ; then + # Make sure mountpoint directory is empty + if [[ -d $mntpnt ]]; then + log_must $RM -rf $mntpnt/* + fi + + log_must $ZFS mount $pool + fi + if [[ -d $mntpnt ]]; then + log_must $RM -rf $mntpnt/* + fi + + return 0 +} + +# +# Detect if the given two filesystems have same sub-datasets +# +# $1 source filesystem +# $2 destination filesystem +# +function cmp_ds_subs +{ + typeset src_fs=$1 + typeset dst_fs=$2 + + $ZFS list -r -H -t filesystem,snapshot,volume -o name $src_fs > $BACKDIR/src1 + $ZFS list -r -H -t filesystem,snapshot,volume -o name $dst_fs > $BACKDIR/dst1 + + eval $SED -e 's:^$src_fs:PREFIX:g' < $BACKDIR/src1 > $BACKDIR/src + eval $SED -e 's:^$dst_fs:PREFIX:g' < $BACKDIR/dst1 > $BACKDIR/dst + + $DIFF $BACKDIR/src $BACKDIR/dst + typeset -i ret=$? + + $RM -f $BACKDIR/src $BACKDIR/dst $BACKDIR/src1 $BACKDIR/dst1 + + return $ret +} + +# +# Compare all the directores and files in two filesystems +# +# $1 source filesystem +# $2 destination filesystem +# +function cmp_ds_cont +{ + typeset src_fs=$1 + typeset dst_fs=$2 + + typeset srcdir dstdir + srcdir=$(get_prop mountpoint $src_fs) + dstdir=$(get_prop mountpoint $dst_fs) + + $DIFF -r $srcdir $dstdir > /dev/null 2>&1 + print $? +} + +# +# Compare the given two dataset properties +# +# $1 dataset 1 +# $2 dataset 2 +# +function cmp_ds_prop +{ + typeset dtst1=$1 + typeset dtst2=$2 + + for item in "type" "origin" "volblocksize" "aclinherit" "aclmode" \ + "atime" "canmount" "checksum" "compression" "copies" "devices" \ + "exec" "quota" "readonly" "recordsize" "reservation" "setuid" \ + "shareiscsi" "sharenfs" "snapdir" "version" "volsize" "xattr" \ + "zoned" "mountpoint"; + do + $ZFS get -H -o property,value,source $item $dtst1 >> \ + $BACKDIR/dtst1 + $ZFS get -H -o property,value,source $item $dtst2 >> \ + $BACKDIR/dtst2 + done + + eval $SED -e 's:$dtst1:PREFIX:g' < $BACKDIR/dtst1 > $BACKDIR/dtst1 + eval $SED -e 's:$dtst2:PREFIX:g' < $BACKDIR/dtst2 > $BACKDIR/dtst2 + + $DIFF $BACKDIR/dtst1 $BACKDIR/dtst2 + typeset -i ret=$? + + $RM -f $BACKDIR/dtst1 $BACKDIR/dtst2 + + return $ret + +} + +# +# Random create directories and files +# +# $1 directory +# +function random_tree +{ + typeset dir=$1 + + if [[ -d $dir ]]; then + $RM -rf $dir + fi + $MKDIR -p $dir + typeset -i ret=$? + + typeset -i nl nd nf + ((nl = RANDOM % 6 + 1)) + ((nd = RANDOM % 3 )) + ((nf = RANDOM % 5 )) + $MKTREE -b $dir -l $nl -d $nd -f $nf + ((ret |= $?)) + + return $ret +} + +# +# Put data in filesystem and take snapshot +# +# $1 snapshot name +# +function snapshot_tree +{ + typeset snap=$1 + typeset ds=${snap%%@*} + typeset type=$(get_prop "type" $ds) + + typeset -i ret=0 + if [[ $type == "filesystem" ]]; then + typeset mntpnt=$(get_prop mountpoint $ds) + ((ret |= $?)) + + if ((ret == 0)) ; then + eval random_tree $mntpnt/${snap##$ds} + ((ret |= $?)) + fi + fi + + if ((ret == 0)) ; then + $ZFS snapshot $snap + ((ret |= $?)) + fi + + return $ret +} + +# +# Destroy the given snapshot and stuff +# +# $1 snapshot +# +function destroy_tree +{ + typeset -i ret=0 + typeset snap + for snap in "$@" ; do + $ZFS destroy $snap + ret=$? + + typeset ds=${snap%%@*} + typeset type=$(get_prop "type" $ds) + if [[ $type == "filesystem" ]]; then + typeset mntpnt=$(get_prop mountpoint $ds) + ((ret |= $?)) + + if ((ret != 0)); then + $RM -r $mntpnt/$snap + ((ret |= $?)) + fi + fi + + if ((ret != 0)); then + return $ret + fi + done + + return 0 +} + +# +# Get all the sub-datasets of give dataset with specific suffix +# +# $1 Given dataset +# $2 Suffix +# +function getds_with_suffix +{ + typeset ds=$1 + typeset suffix=$2 + + typeset list=$($ZFS list -r -H -t filesystem,snapshot,volume -o name $ds \ + | $GREP "$suffix$") + + $ECHO $list +} + +# +# Output inherited properties whitch is edited for file system +# +function fs_inherit_prop +{ + typeset fs_prop + if is_global_zone ; then + fs_prop=$($ZFS inherit 2>&1 | \ + $AWK '$2=="YES" && $3=="YES" {print $1}') + else + fs_prop=$($ZFS inherit 2>&1 | \ + $AWK '$2=="YES" && $3=="YES" {print $1}'| + $EGREP -v "devices|sharenfs|sharesmb|zoned") + fi + + $ECHO $fs_prop +} + +# +# Output inherited properties for volume +# +function vol_inherit_prop +{ + $ECHO "checksum readonly shareiscsi" +} + +# +# Get the destination dataset to compare +# +function get_dst_ds +{ + typeset srcfs=$1 + typeset dstfs=$2 + + # + # If the srcfs is not pool + # + if ! $ZPOOL list $srcfs > /dev/null 2>&1 ; then + eval dstfs="$dstfs/${srcfs#*/}" + fi + + $ECHO $dstfs +} diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_001_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_001_pos.ksh new file mode 100644 index 00000000000..699cc51216a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_001_pos.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_001_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_001_pos +# +# DESCRIPTION: +# zfs send -R send replication stream up to the named snap. +# +# STRATEGY: +# 1. Back up all the data from POOL/FS +# 2. Verify all the datasets and data can be recovered in POOL2 +# 3. Back up all the data from root filesystem POOL2 +# 4. Verify all the data can be recovered, too +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "zfs send -R send replication stream up to the named snap." +log_onexit cleanup_pool $POOL2 + +# +# Verify the entire pool and sub-ds can be backup and restored. +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-final-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-final-R" + +dstds=$(get_dst_ds $POOL $POOL2) +log_must cmp_ds_subs $POOL $dstds +log_must cmp_ds_cont $POOL $dstds + +# Cleanup POOL2 +log_must cleanup_pool $POOL2 + +# +# Verify all the filesystem and sub-fs can be backup and restored. +# +log_must eval "$ZFS send -R $POOL/$FS@final > $BACKDIR/fs-final-R" +log_must eval "$ZFS receive -d $POOL2 < $BACKDIR/fs-final-R" + +dstds=$(get_dst_ds $POOL/$FS $POOL2) +log_must cmp_ds_subs $POOL/$FS $dstds +log_must cmp_ds_cont $POOL/$FS $dstds + +log_pass "zfs send -R send replication stream up to the named snap." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_002_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_002_pos.ksh new file mode 100644 index 00000000000..7bbf0be23a4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_002_pos.ksh @@ -0,0 +1,107 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_002_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_002_pos +# +# DESCRIPTION: +# zfs send -I sends all incrementals from fs@init to fs@final. +# +# STRATEGY: +# 1. Create several snapshots in pool2 +# 2. Send -I @snapA @final +# 3. Destroy all the snapshot except @snapA +# 4. Make sure all the snapshots and content are recovered +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "zfs send -I sends all incrementals from fs@init to fs@final." +log_onexit cleanup_pool $POOL2 + +# +# Duplicate POOL2 +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-R" + +if is_global_zone ; then + # + # Verify send -I will backup all the incrementals in pool + # + log_must eval "$ZFS send -I $POOL2@init $POOL2@final > " \ + "$BACKDIR/pool-init-final-I" + log_must destroy_tree $POOL2@final $POOL2@snapC $POOL2@snapA + log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-init-final-I" + log_must cmp_ds_subs $POOL $POOL2 + log_must cmp_ds_cont $POOL $POOL2 +fi + +dstds=$(get_dst_ds $POOL $POOL2) + +# +# Verify send -I will backup all the incrementals in filesystem +# +log_must eval "$ZFS send -I @init $dstds/$FS@final > $BACKDIR/fs-init-final-I" +log_must destroy_tree $dstds/$FS@final $dstds/$FS@snapC $dstds/$FS@snapB +log_must eval "$ZFS receive -d -F $dstds < $BACKDIR/fs-init-final-I" +log_must cmp_ds_subs $POOL $dstds +log_must cmp_ds_cont $POOL $dstds + +if is_global_zone ; then + # + # Verify send -I will backup all the incrementals in volume + # + dataset=$POOL2/$FS/vol + log_must eval "$ZFS send -I @vsnap $dataset@final > " \ + "$BACKDIR/vol-vsnap-final-I" + log_must destroy_tree $dataset@final $dataset@snapC \ + $dataset@snapB $dataset@init + log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/vol-vsnap-final-I" + log_must cmp_ds_subs $POOL $POOL2 + log_must cmp_ds_cont $POOL $POOL2 +fi + +log_pass "zfs send -I sends all incrementals from fs@init to fs@final." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_003_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_003_pos.ksh new file mode 100644 index 00000000000..60a11ddcd80 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_003_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_003_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_003_pos +# +# DESCRIPTION: +# zfs send -I dataset@init to clone@snap can create a clone +# +# STRATEGY: +# 1. Setup test model +# 2. send -I pool@init to clone@snap +# 3. Verify the clone and snapshot can be recovered via receive +# 4. Verify the similar operating in filesystem and volume +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "zfs send -I send all incrementals from dataset@init to clone@snap" +log_onexit cleanup_pool $POOL2 + +# +# Duplicate POOL2 +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-R" + +if is_global_zone ; then + # + # Verify send -I backup all incrementals from pool + # + log_must eval "$ZFS send -I $POOL2@psnap $POOL2/pclone@final > " \ + "$BACKDIR/pool-clone-I" + log_must $ZFS destroy -rf $POOL2/pclone + log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-clone-I" + log_must cmp_ds_subs $POOL $POOL2 + log_must cmp_ds_cont $POOL $POOL2 +fi + +dstds=$(get_dst_ds $POOL $POOL2) + +# +# Verify send -I backup all incrementals from filesystem +# +ds=$dstds/$FS/fs1 +log_must eval "$ZFS send -I $ds/fs2@fsnap $ds/fclone@final > " \ + "$BACKDIR/fs-clone-I" +log_must $ZFS destroy -rf $ds/fclone +log_must eval "$ZFS receive -F $ds/fclone < $BACKDIR/fs-clone-I" + +log_must cmp_ds_subs $POOL $dstds +log_must cmp_ds_cont $POOL $dstds + +if is_global_zone ; then + # + # Verify send -I backup all incrementals from volume + # + ds=$POOL2/$FS + log_must eval "$ZFS send -I $ds/vol@vsnap $ds/vclone@final > " \ + "$BACKDIR/vol-clone-I" + log_must $ZFS destroy -rf $ds/vclone + log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/vol-clone-I" + log_must cmp_ds_subs $POOL $POOL2 + log_must cmp_ds_cont $POOL $POOL2 +fi + +log_pass "zfs send -I send all incrementals from dataset@init to clone@snap" diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_004_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_004_pos.ksh new file mode 100644 index 00000000000..0a9aaa2f5fe --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_004_pos.ksh @@ -0,0 +1,134 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_004_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_004_pos +# +# DESCRIPTION: +# zfs send -R -i send incremental from fs@init to fs@final. +# +# STRATEGY: +# 1. Create a set of snapshots and fill with data. +# 2. Create sub filesystems. +# 3. Create final snapshot +# 4. Verify zfs send -R -i will backup all the datasets which has +# snapshot suffix @final +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "zfs send -R -i send incremental from fs@init to fs@final." +log_onexit cleanup_pool $POOL2 + +# +# Duplicate POOL2 for testing +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-final-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-final-R" + +if is_global_zone ; then + # + # Testing send -R -i backup from pool + # + srclist=$(getds_with_suffix $POOL2 @final) + interlist="$srclist $(getds_with_suffix $POOL2 @snapC)" + interlist="$interlist $(getds_with_suffix $POOL2 @snapB)" + interlist="$interlist $(getds_with_suffix $POOL2 @snapA)" + + log_must eval "$ZFS send -R -i @init $POOL2@final > " \ + "$BACKDIR/pool-init-final-iR" + log_must destroy_tree $interlist + log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-init-final-iR" + + # Get current datasets with suffix @final + dstlist=$(getds_with_suffix $POOL2 @final) + if [[ $srclist != $dstlist ]]; then + log_fail "Unexpected: srclist($srclist) != dstlist($dstlist)" + fi + log_must cmp_ds_cont $POOL $POOL2 +fi + +dstds=$(get_dst_ds $POOL $POOL2) +# +# Testing send -R -i backup from filesystem +# +log_must eval "$ZFS send -R -i @init $dstds/$FS@final > " \ + "$BACKDIR/fs-init-final-iR" + +srclist=$(getds_with_suffix $dstds/$FS @final) +interlist="$srclist $(getds_with_suffix $dstds/$FS @snapC)" +interlist="$interlist $(getds_with_suffix $dstds/$FS @snapB)" +interlist="$interlist $(getds_with_suffix $dstds/$FS @snapA)" +log_must destroy_tree $interlist +if is_global_zone ; then + log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/fs-init-final-iR" +else + $ZFS receive -F -d $dstds/$FS < $BACKDIR/fs-init-final-iR +fi + +dstlist=$(getds_with_suffix $dstds/$FS @final) +if [[ $srclist != $dstlist ]]; then + log_fail "Unexpected: srclist($srclist) != dstlist($dstlist)" +fi +log_must cmp_ds_cont $POOL $POOL2 + +if is_global_zone ; then + # + # Testing send -R -i backup from volume + # + srclist=$(getds_with_suffix $POOL2/$FS/vol @final) + log_must eval "$ZFS send -R -i @init $POOL2/$FS/vol@final > " \ + "$BACKDIR/vol-init-final-iR" + log_must destroy_tree $srclist + log_must eval "$ZFS receive -d $POOL2 < $BACKDIR/vol-init-final-iR" + + dstlist=$(getds_with_suffix $POOL2/$FS/vol @final) + if [[ $srclist != $dstlist ]]; then + log_fail "Unexpected: srclist($srclist) != dstlist($dstlist)" + fi + log_must cmp_ds_cont $POOL $POOL2 +fi + +log_pass "zfs send -R -i send incremental from fs@init to fs@final." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_005_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_005_pos.ksh new file mode 100644 index 00000000000..439c857e3c2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_005_pos.ksh @@ -0,0 +1,118 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_005_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_005_pos +# +# DESCRIPTION: +# zfs send -R -I send all the incremental between fs@init with fs@final +# +# STRATEGY: +# 1. Setup test model +# 2. Send -R -I @init @final on pool +# 3. Destroy all the snapshots which is later than @init +# 4. Verify receive can restore all the snapshots and data +# 5. Do the same test on filesystem and volume +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "zfs send -R -I send all the incremental between @init with @final" +log_onexit cleanup_pool $POOL2 + +# +# Duplicate POOL2 for testing +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-final-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-final-R" + +if is_global_zone ; then + # + # Testing send -R -I from pool + # + log_must eval "$ZFS send -R -I @init $POOL2@final > " \ + "$BACKDIR/pool-init-final-IR" + list=$(getds_with_suffix $POOL2 @snapA) + list="$list $(getds_with_suffix $POOL2 @snapB)" + list="$list $(getds_with_suffix $POOL2 @snapC)" + list="$list $(getds_with_suffix $POOL2 @final)" + log_must destroy_tree $list + log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-init-final-IR" + log_must cmp_ds_cont $POOL $POOL2 +fi + +dstds=$(get_dst_ds $POOL $POOL2) +# +# Testing send -R -I from filesystem +# +log_must eval "$ZFS send -R -I @init $dstds/$FS@final > " \ + "$BACKDIR/fs-init-final-IR" +list=$(getds_with_suffix $dstds/$FS @snapA) +list="$list $(getds_with_suffix $dstds/$FS @snapB)" +list="$list $(getds_with_suffix $dstds/$FS @snapC)" +list="$list $(getds_with_suffix $dstds/$FS @final)" +log_must destroy_tree $list +if is_global_zone ; then + log_must eval "$ZFS receive -d -F $dstds < $BACKDIR/fs-init-final-IR" +else + $ZFS receive -d -F $dstds < $BACKDIR/fs-init-final-IR +fi +log_must cmp_ds_subs $POOL $dstds +log_must cmp_ds_cont $POOL $dstds + +if is_global_zone ; then + # + # Testing send -I -R for volume + # + vol=$POOL2/$FS/vol + log_must eval "$ZFS send -R -I @init $vol@final > " \ + "$BACKDIR/vol-init-final-IR" + log_must destroy_tree $vol@snapB $vol@snapC $vol@final + log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/vol-init-final-IR" + log_must cmp_ds_subs $POOL $POOL2 + log_must cmp_ds_cont $POOL $POOL2 +fi + +log_pass "zfs send -R -I send all the incremental between @init with @final" diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_006_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_006_pos.ksh new file mode 100644 index 00000000000..22445101b59 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_006_pos.ksh @@ -0,0 +1,96 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_006_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_006_pos +# +# DESCRIPTION: +# Rename snapshot name will not change the dependent order. +# +# STRATEGY: +# 1. Set up a set of datasets. +# 2. Rename part of snapshots. +# 3. Send -R all the POOL +# 4. Verify snapshot name will not change the dependent order. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Source Target +# +set -A snaps "$POOL@init" "$POOL@snap0" \ + "$POOL@snapA" "$POOL@snap1" \ + "$POOL@snapC" "$POOL@snap2" \ + "$POOL@final" "$POOL@init" + +function cleanup +{ + log_must cleanup_pool $POOL + log_must cleanup_pool $POOL2 + + log_must setup_test_model $POOL +} + +log_assert "Rename snapshot name will not change the dependent order." +log_onexit cleanup + +typeset -i i=0 +while ((i < ${#snaps[@]})); do + log_must $ZFS rename -r ${snaps[$i]} ${snaps[((i+1))]} + + ((i += 2)) +done + +# +# Duplicate POOL2 for testing +# +log_must eval "$ZFS send -R $POOL@init > $BACKDIR/pool-final-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-final-R" + +dstds=$(get_dst_ds $POOL $POOL2) +log_must cmp_ds_subs $POOL $dstds +log_must cmp_ds_cont $POOL $dstds + +log_pass "Rename snapshot name will not change the dependent order." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_007_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_007_pos.ksh new file mode 100644 index 00000000000..219366253b3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_007_pos.ksh @@ -0,0 +1,113 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_007_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_007_pos +# +# DESCRIPTION: +# Rename parent filesystem name will not change the dependent order. +# +# STRATEGY: +# 1. Separately rename pool clone, filesystem and volume name. +# 2. Send -R all the POOL +# 3. Verify renamed dataset will not change the snapshot dependent order. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +set -A dtst \ + "$POOL/pclone" "$POOL/$FS/pclone" \ + "$POOL/$FS/fs1/fs2" "$POOL/fs2" +if is_global_zone ; then + typeset -i n=${#dtst[@]} + dtst[((n))]="$POOL/vol"; dtst[((n+1))]="$POOL/$FS/fs1/vol" +fi + +function cleanup +{ + log_must cleanup_pool $POOL + log_must cleanup_pool $POOL2 + + log_must setup_test_model $POOL +} + +log_assert "Rename parent filesystem name will not change the dependent order." +log_onexit cleanup + +typeset -i i=0 +while ((i < ${#dtst[@]})); do + log_must $ZFS rename ${dtst[$i]} ${dtst[((i+1))]} + + ((i += 2)) +done + +# +# Verify zfs send -R should succeed +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-final-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-final-R" +dstds=$(get_dst_ds $POOL $POOL2) +log_must cmp_ds_subs $POOL $dstds +log_must cmp_ds_cont $POOL $dstds + +# +# Verify zfs send -R -I should succeed +# +log_must eval "$ZFS send -R -I @init $dstds@final > " \ + "$BACKDIR/pool-init-final-IR" +list=$(getds_with_suffix $dstds @snapA) +list="$list $(getds_with_suffix $dstds @snapB)" +list="$list $(getds_with_suffix $dstds @snapC)" +list="$list $(getds_with_suffix $dstds @final)" +log_must destroy_tree $list +if is_global_zone ; then + log_must eval "$ZFS receive -d -F $dstds < $BACKDIR/pool-init-final-IR" +else + $ZFS receive -d -F $dstds < $BACKDIR/pool-init-final-IR +fi +log_must cmp_ds_subs $POOL $dstds +log_must cmp_ds_cont $POOL $dstds + +log_pass "Rename parent filesystem name will not change the dependent order." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_008_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_008_pos.ksh new file mode 100644 index 00000000000..380fb31955e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_008_pos.ksh @@ -0,0 +1,142 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_008_pos.ksh 1.2 09/01/12 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_008_pos +# +# DESCRIPTION: +# Changes made by 'zfs promote' can be properly received. +# +# STRATEGY: +# 1. Separately promote pool clone, filesystem clone and volume clone. +# 2. Recursively backup all the POOL and restore in POOL2 +# 3. Verify all the datesets and property be properly received. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Origin Clone +# +set -A dtst "$POOL" "$POOL/pclone" \ + "$POOL/$FS/fs1/fs2" "$POOL/$FS/fs1/fclone" +if is_global_zone ; then + typeset -i n=${#dtst[@]} + dtst[((n))]="$POOL/$FS/vol"; dtst[((n+1))]="$POOL/$FS/vclone" +fi + +function cleanup +{ + typeset origin + typeset -i i=0 + while ((i < ${#dtst[@]})); do + origin=$(get_prop origin ${dtst[$i]}) + + if [[ $origin != "-" ]]; then + log_must $ZFS promote ${dtst[$i]} + fi + + ((i += 2)) + done + + origin=$(get_prop origin $POOL2) + if [[ $origin != "-" ]]; then + log_must $ZFS promote $POOL2 + fi + log_must cleanup_pool $POOL2 +} + +log_assert "Changes made by 'zfs promote' can be properly received." +log_onexit cleanup + +typeset -i i=0 +while ((i < ${#dtst[@]})); do + log_must $ZFS promote ${dtst[((i+1))]} + + ((i += 2)) +done + +# +# Verify zfs send -R should succeed +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-final-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-final-R" + +dstds=$(get_dst_ds $POOL $POOL2) +# +# Define all the POOL/POOL2 datasets pair +# +set -A pair "$POOL" "$dstds" \ + "$POOL/$FS" "$dstds/$FS" \ + "$POOL/$FS/fs1" "$dstds/$FS/fs1" \ + "$POOL/$FS/fs1/fs2" "$dstds/$FS/fs1/fs2" \ + "$POOL/pclone" "$dstds/pclone" \ + "$POOL/$FS/fs1/fclone" "$dstds/$FS/fs1/fclone" + +if is_global_zone ; then + typeset -i n=${#pair[@]} + pair[((n))]="$POOL/vol"; pair[((n+1))]="$dstds/vol" + pair[((n+2))]="$POOL/$FS/vol" pair[((n+3))]="$dstds/$FS/vol" +fi + +# +# Verify all the sub-datasets can be properly received. +# +log_must cmp_ds_subs $POOL $dstds +typeset -i i=0 +while ((i < ${#pair[@]})); do + log_must cmp_ds_cont ${pair[$i]} ${pair[((i+1))]} + log_must cmp_ds_prop ${pair[$i]} ${pair[((i+1))]} + + ((i += 2)) +done + +# Verify the original filesystem can be promoted +log_must $ZFS promote $dstds +if is_global_zone ; then + log_must $ZFS promote $dstds/$FS/vol +fi +log_must $ZFS promote $dstds/$FS/fs1/fs2 + +log_pass "Changes made by 'zfs promote' can be properly received." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_009_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_009_pos.ksh new file mode 100644 index 00000000000..aeac359455f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_009_pos.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_009_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_009_pos +# +# DESCRIPTION: +# zfs receive can handle out of space correctly. +# +# STRATEGY: +# 1. Create two pools, one is big and another is small. +# 2. Fill the big pool with data. +# 3. Take snapshot and backup the whole pool. +# 4. Receive this stream in small pool. +# 5. Verify zfs receive can handle the out of space error correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-10-10) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if datasetexists bpool ; then + log_must $ZPOOL destroy -f bpool + fi + if datasetexists spool ; then + log_must $ZPOOL destroy -f spool + fi +} + +log_assert "Verify zfs receive can handle out of space correctly." +log_onexit cleanup + +log_must $TRUNCATE -s 100M $TESTDIR/bfile +log_must $TRUNCATE -s 64M $TESTDIR/sfile +log_must $ZPOOL create bpool $TESTDIR/bfile +log_must $ZPOOL create spool $TESTDIR/sfile + +# +# Test out of space on sub-filesystem +# +log_must $ZFS create bpool/fs +mntpnt=$(get_prop mountpoint bpool/fs) +log_must $TRUNCATE -s 30M $mntpnt/file + +log_must $ZFS snapshot bpool/fs@snap +log_must eval "$ZFS send -R bpool/fs@snap > $BACKDIR/fs-R" +log_mustnot eval "$ZFS receive -d -F spool < $BACKDIR/fs-R" + +log_must datasetnonexists spool/fs +log_must ismounted spool + +# +# Test out of space on top filesystem +# +mntpnt2=$(get_prop mountpoint bpool) +log_must $MV $mntpnt/file $mntpnt2 +log_must $ZFS destroy -rf bpool/fs + +log_must $ZFS snapshot bpool@snap +log_must eval "$ZFS send -R bpool@snap > $BACKDIR/bpool-R" +log_mustnot eval "$ZFS receive -d -F spool < $BACKDIR/bpool-R" + +log_must datasetnonexists spool/fs +log_must ismounted spool + +log_pass "zfs receive can handle out of space correctly." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_010_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_010_pos.ksh new file mode 100644 index 00000000000..6a67b6c27a3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_010_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_010_pos.ksh 1.1 08/02/27 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_010_pos +# +# DESCRIPTION: +# ZFS can handle stream with multiple identical (same GUID) snapshots +# +# STRATEGY: +# 1. Recursively backup snapshot +# 2. Restore it to the given filesystem +# 3. Resend the snapshot again +# 4. Verify this stream can be restore to this filesystem again +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-10-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "ZFS can handle stream with multiple identical (same GUID) snapshots" +log_onexit cleanup_pool $POOL2 + +log_must $ZFS create $POOL2/$FS +log_must $ZFS snapshot $POOL2/$FS@snap + +# +# First round restore the stream +# +log_must eval "$ZFS send -R $POOL2/$FS@snap > $BACKDIR/fs-R" +log_must eval "$ZFS receive -d -F $POOL2/$FS < $BACKDIR/fs-R" + +# +# In order to avoid 'zfs send -R' failed, create snapshot for +# all the sub-systems +# +list=$($ZFS list -r -H -o name -t filesystem $POOL2/$FS) +for item in $list ; do + if datasetnonexists $item@snap ; then + log_must $ZFS snapshot $item@snap + fi +done + +# +# Second round restore the stream +# +log_must eval "$ZFS send -R $POOL2/$FS@snap > $BACKDIR/fs-R" +dstds=$(get_dst_ds $POOL2/$FS $POOL2/$FS) +log_must eval "$ZFS receive -d -F $dstds < $BACKDIR/fs-R" + +log_pass "ZFS can handle stream with multiple identical (same GUID) snapshots" diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_011_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_011_pos.ksh new file mode 100644 index 00000000000..0c07f069c96 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_011_pos.ksh @@ -0,0 +1,137 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_011_pos.ksh 1.2 09/08/06 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_011_pos +# +# DESCRIPTION: +# Changes made by 'zfs inherit' can be properly received. +# +# STRATEGY: +# 1. Inherit property for filesystem and volume +# 2. Send and restore them in the target pool +# 3. Verify all the datasets can be properly backup and receive +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-10-10) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + unmount_all_safe > /dev/null 2>&1 + log_must cleanup_pool $POOL + log_must cleanup_pool $POOL2 + + log_must setup_test_model $POOL +} + +log_assert "Verify changes made by 'zfs inherit' can be properly received." +log_onexit cleanup + +# +# Setting all the $FS properties as local value, +# +for prop in $(fs_inherit_prop); do + value=$(get_prop $prop $POOL/$FS) + log_must $ZFS set $prop=$value $POOL/$FS +done + +# +# Inherit propertes in sub-datasets +# +for ds in "$POOL/$FS/fs1" "$POOL/$FS/fs1/fs2" "$POOL/$FS/fs1/fclone" ; do + for prop in $(fs_inherit_prop) ; do + $ZFS inherit $prop $ds + if (($? !=0 )); then + log_fail "$ZFS inherit $prop $ds" + fi + done +done +if is_global_zone ; then + for prop in $(vol_inherit_prop) ; do + $ZFS inherit $prop $POOL/$FS/vol + if (($? !=0 )); then + log_fail "$ZFS inherit $prop $POOL/$FS/vol" + fi + done +fi + +# +# Verify datasets can be backup and restore correctly +# Unmount $POOL/$FS to avoid two fs mount in the same mountpoint +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-R" +log_must $ZFS unmount -f $POOL/$FS +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-R" + +dstds=$(get_dst_ds $POOL $POOL2) +# +# Define all the POOL/POOL2 datasets pair +# +set -A pair "$POOL" "$dstds" \ + "$POOL/$FS" "$dstds/$FS" \ + "$POOL/$FS/fs1" "$dstds/$FS/fs1" \ + "$POOL/$FS/fs1/fs2" "$dstds/$FS/fs1/fs2" \ + "$POOL/pclone" "$dstds/pclone" \ + "$POOL/$FS/fs1/fclone" "$dstds/$FS/fs1/fclone" + +if is_global_zone ; then + typeset -i n=${#pair[@]} + pair[((n))]="$POOL/vol"; pair[((n+1))]="$dstds/vol" + pair[((n+2))]="$POOL/$FS/vol" pair[((n+3))]="$dstds/$FS/vol" +fi + +# +# Verify all the sub-datasets can be properly received. +# +log_must cmp_ds_subs $POOL $dstds +typeset -i i=0 +while ((i < ${#pair[@]})); do + log_must cmp_ds_cont ${pair[$i]} ${pair[((i+1))]} + log_must cmp_ds_prop ${pair[$i]} ${pair[((i+1))]} + + ((i += 2)) +done + +log_pass "Changes made by 'zfs inherit' can be properly received." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_012_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_012_pos.ksh new file mode 100644 index 00000000000..295ebe63bdf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_012_pos.ksh @@ -0,0 +1,211 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_012_pos.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_012_pos +# +# DESCRIPTION: +# zfs send -R will backup all the filesystem properties correctly. +# +# STRATEGY: +# 1. Setting properties for all the filesystem and volumes randomly +# 2. Backup all the data from POOL by send -R +# 3. Restore all the data in POOL2 +# 4. Verify all the perperties in two pools are same +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-08-27) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function rand_set_prop +{ + typeset dtst=$1 + typeset prop=$2 + shift 2 + typeset value=$(random_get $@) + + log_must eval "$ZFS set $prop='$value' $dtst" +} + +function edited_prop +{ + typeset behaviour=$1 + typeset ds=$2 + typeset backfile=$TESTDIR/edited_prop_$ds + + case $behaviour in + "get") + typeset props=$($ZFS inherit 2>&1 | \ + $AWK '$2=="YES" {print $1}' | \ + $EGREP -v "^vol|\.\.\.$") + for item in $props ; do + $ZFS get -H -o property,value $item $ds >> \ + $backfile + if (($? != 0)); then + log_fail "zfs get -H -o property,value"\ + "$item $ds > $backfile" + fi + done + ;; + "set") + if [[ ! -f $backfile ]] ; then + log_fail "$ds need backup properties firstly." + fi + + typeset prop value + while read prop value ; do + eval $ZFS set $prop='$value' $ds + if (($? != 0)); then + log_fail "$ZFS set $prop=$value $ds" + fi + done < $backfile + ;; + *) + log_fail "Unrecognized behaviour: $behaviour" + esac +} + +function cleanup +{ + log_must cleanup_pool $POOL + log_must cleanup_pool $POOL2 + + log_must edited_prop "set" $POOL + log_must edited_prop "set" $POOL2 + + typeset prop + for prop in $(fs_inherit_prop) ; do + log_must $ZFS inherit $prop $POOL + log_must $ZFS inherit $prop $POOL2 + done + + #if is_shared $POOL; then + # log_must $ZFS set sharenfs=off $POOL + #fi + log_must setup_test_model $POOL + + if [[ -d $TESTDIR ]]; then + log_must $RM -rf $TESTDIR/* + fi +} + +log_assert "Verify zfs send -R will backup all the filesystem properties " \ + "correctly." +log_onexit cleanup + +log_must edited_prop "get" $POOL +log_must edited_prop "get" $POOL2 + +for fs in "$POOL" "$POOL/pclone" "$POOL/$FS" "$POOL/$FS/fs1" \ + "$POOL/$FS/fs1/fs2" "$POOL/$FS/fs1/fclone" ; do + rand_set_prop $fs aclinherit "discard" "noallow" "secure" "passthrough" + rand_set_prop $fs checksum "on" "off" "fletcher2" "fletcher4" "sha256" + rand_set_prop $fs aclmode "discard" "groupmask" "passthrough" + rand_set_prop $fs atime "on" "off" + rand_set_prop $fs checksum "on" "off" "fletcher2" "fletcher4" "sha256" + rand_set_prop $fs compression "on" "off" "lzjb" "gzip" \ + "gzip-1" "gzip-2" "gzip-3" "gzip-4" "gzip-5" "gzip-6" \ + "gzip-7" "gzip-8" "gzip-9" + rand_set_prop $fs copies "1" "2" "3" + rand_set_prop $fs devices "on" "off" + rand_set_prop $fs exec "on" "off" + rand_set_prop $fs quota "512M" "1024M" + rand_set_prop $fs recordsize "512" "2K" "8K" "32K" "128K" + rand_set_prop $fs setuid "on" "off" + rand_set_prop $fs snapdir "hidden" "visible" + rand_set_prop $fs xattr "on" "off" + rand_set_prop $fs user:prop "aaa" "bbb" "23421" "()-+?" +done + +for vol in "$POOL/vol" "$POOL/$FS/vol" ; do + rand_set_prop $vol checksum "on" "off" "fletcher2" "fletcher4" "sha256" + rand_set_prop $vol compression "on" "off" "lzjb" "gzip" \ + "gzip-1" "gzip-2" "gzip-3" "gzip-4" "gzip-5" "gzip-6" \ + "gzip-7" "gzip-8" "gzip-9" + rand_set_prop $vol readonly "on" "off" + rand_set_prop $vol copies "1" "2" "3" + rand_set_prop $vol user:prop "aaa" "bbb" "23421" "()-+?" +done + + +# Verify inherited property can be received +rand_set_prop $POOL sharenfs "on" "off" "rw" + +# +# Duplicate POOL2 for testing +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-final-R" +log_must eval "$ZFS receive -d -F $POOL2 < $BACKDIR/pool-final-R" + +# +# Define all the POOL/POOL2 datasets pair +# +set -A pair "$POOL" "$POOL2" \ + "$POOL/$FS" "$POOL2/$FS" \ + "$POOL/$FS/fs1" "$POOL2/$FS/fs1" \ + "$POOL/$FS/fs1/fs2" "$POOL2/$FS/fs1/fs2" \ + "$POOL/pclone" "$POOL2/pclone" \ + "$POOL/$FS/fs1/fclone" "$POOL2/$FS/fs1/fclone" \ + "$POOL/vol" "$POOL2/vol" \ + "$POOL/$FS/vol" "$POOL2/$FS/vol" + +typeset -i i=0 +while ((i < ${#pair[@]})); do + log_must cmp_ds_prop ${pair[$i]} ${pair[((i+1))]} + + ((i += 2)) +done + + +$ZPOOL upgrade -v | $GREP "Snapshot properties" > /dev/null 2>&1 +if (( $? == 0 )) ; then + i=0 + while ((i < ${#pair[@]})); do + log_must cmp_ds_prop ${pair[$i]}@final ${pair[((i+1))]}@final + ((i += 2)) + done +fi + +log_pass "Verify zfs send -R will backup all the filesystem properties " \ + "correctly." diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_013_pos.ksh b/tests/sys/cddl/zfs/tests/rsend/rsend_013_pos.ksh new file mode 100644 index 00000000000..8bd1b91acd1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_013_pos.ksh @@ -0,0 +1,100 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rsend_013_pos.ksh 1.1 09/01/12 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: rsend_013_pos +# +# DESCRIPTION: +# zfs receive -dF with incremental stream will destroy all the +# dataset that not exist on the sender side. +# +# STRATEGY: +# 1. Setup test model +# 2. Send -R @final on pool +# 3. Destroy some dataset within the @final, and create @destroy +# 4. Send -R -I @final @destroy on pool +# 5. Verify receive -dF will destroy all the dataset that not exist +# on the sender side. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-15) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + cleanup_pool $POOL2 + cleanup_pool $POOL + log_must setup_test_model $POOL +} + +log_assert "zfs receive -dF will destroy all the dataset that not exist" \ + "on the sender side" +log_onexit cleanup + +cleanup + +# +# Duplicate POOL2 for testing +# +log_must eval "$ZFS send -R $POOL@final > $BACKDIR/pool-final-R" +log_must eval "$ZFS receive -dF $POOL2 < $BACKDIR/pool-final-R" + +log_must $ZFS destroy -Rf $POOL/$FS +log_must $ZFS destroy -Rf $POOL/pclone + +if is_global_zone ; then + log_must $ZFS destroy -Rf $POOL/vol +fi +log_must $ZFS snapshot -r $POOL@destroy + +log_must eval "$ZFS send -R -I @final $POOL@destroy > " \ + "$BACKDIR/pool-final-destroy-IR" +log_must eval "$ZFS receive -dF $POOL2 < $BACKDIR/pool-final-destroy-IR" + +dstds=$(get_dst_ds $POOL $POOL2) +log_must cmp_ds_subs $POOL $dstds +log_must cmp_ds_cont $POOL $dstds + +log_pass "zfs receive -dF will destroy all the dataset that not exist" \ + "on the sender side" diff --git a/tests/sys/cddl/zfs/tests/rsend/rsend_test.sh b/tests/sys/cddl/zfs/tests/rsend/rsend_test.sh new file mode 100755 index 00000000000..8ab38b48bd5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/rsend_test.sh @@ -0,0 +1,396 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case rsend_001_pos cleanup +rsend_001_pos_head() +{ + atf_set "descr" "zfs send -R send replication stream up to the named snap." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_001_pos.ksh || atf_fail "Testcase failed" +} +rsend_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_002_pos cleanup +rsend_002_pos_head() +{ + atf_set "descr" "zfs send -I sends all incrementals from fs@init to fs@final." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_002_pos.ksh || atf_fail "Testcase failed" +} +rsend_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_003_pos cleanup +rsend_003_pos_head() +{ + atf_set "descr" "zfs send -I send all incrementals from dataset@init to clone@snap" + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_003_pos.ksh || atf_fail "Testcase failed" +} +rsend_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_004_pos cleanup +rsend_004_pos_head() +{ + atf_set "descr" "zfs send -R -i send incremental from fs@init to fs@final." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_004_pos.ksh || atf_fail "Testcase failed" +} +rsend_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_005_pos cleanup +rsend_005_pos_head() +{ + atf_set "descr" "zfs send -R -I send all the incremental between @init with @final" + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_005_pos.ksh || atf_fail "Testcase failed" +} +rsend_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_006_pos cleanup +rsend_006_pos_head() +{ + atf_set "descr" "Rename snapshot name will not change the dependent order." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_006_pos.ksh || atf_fail "Testcase failed" +} +rsend_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_007_pos cleanup +rsend_007_pos_head() +{ + atf_set "descr" "Rename parent filesystem name will not change the dependent order." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_007_pos.ksh || atf_fail "Testcase failed" +} +rsend_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_008_pos cleanup +rsend_008_pos_head() +{ + atf_set "descr" "Changes made by 'zfs promote' can be properly received." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_008_pos.ksh || atf_fail "Testcase failed" +} +rsend_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_009_pos cleanup +rsend_009_pos_head() +{ + atf_set "descr" "Verify zfs receive can handle out of space correctly." + atf_set "require.progs" zpool zfs + atf_set "timeout" 2700 +} +rsend_009_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_009_pos.ksh || atf_fail "Testcase failed" +} +rsend_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_010_pos cleanup +rsend_010_pos_head() +{ + atf_set "descr" "ZFS can handle stream with multiple identical (same GUID) snapshots" + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_010_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_010_pos.ksh || atf_fail "Testcase failed" +} +rsend_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_011_pos cleanup +rsend_011_pos_head() +{ + atf_set "descr" "Verify changes made by 'zfs inherit' can be properly received." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_011_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_011_pos.ksh || atf_fail "Testcase failed" +} +rsend_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_012_pos cleanup +rsend_012_pos_head() +{ + atf_set "descr" "Verify zfs send -R will backup all the filesystem propertiescorrectly." + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_012_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_012_pos.ksh || atf_fail "Testcase failed" +} +rsend_012_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rsend_013_pos cleanup +rsend_013_pos_head() +{ + atf_set "descr" "zfs receive -dF will destroy all the dataset that not existon the sender side" + atf_set "require.progs" zfs zpool + atf_set "timeout" 2700 +} +rsend_013_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rsend_013_pos.ksh || atf_fail "Testcase failed" +} +rsend_013_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/rsend.kshlib + . $(atf_get_srcdir)/rsend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case rsend_001_pos + atf_add_test_case rsend_002_pos + atf_add_test_case rsend_003_pos + atf_add_test_case rsend_004_pos + atf_add_test_case rsend_005_pos + atf_add_test_case rsend_006_pos + atf_add_test_case rsend_007_pos + atf_add_test_case rsend_008_pos + atf_add_test_case rsend_009_pos + atf_add_test_case rsend_010_pos + atf_add_test_case rsend_011_pos + atf_add_test_case rsend_012_pos + atf_add_test_case rsend_013_pos +} diff --git a/tests/sys/cddl/zfs/tests/rsend/setup.ksh b/tests/sys/cddl/zfs/tests/rsend/setup.ksh new file mode 100644 index 00000000000..3b901cd3586 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/rsend/setup.ksh @@ -0,0 +1,52 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/rsend/rsend.kshlib + +verify_runnable "both" + +# +# Check if the system support 'send -R' +# +$ZFS send 2>&1 | grep -w "[-R]" > /dev/null 2>&1 +if (($? != 0)); then + log_unsupported +fi + +if is_global_zone ; then + log_must $ZPOOL create $POOL $DISK1 + log_must $ZPOOL create $POOL2 $DISK2 +fi +log_must $MKDIR $BACKDIR $TESTDIR + +log_must setup_test_model $POOL + +log_pass diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/Makefile b/tests/sys/cddl/zfs/tests/scrub_mirror/Makefile new file mode 100644 index 00000000000..874e97949ce --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/scrub_mirror +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= scrub_mirror_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= scrub_mirror_004_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= scrub_mirror_001_pos.ksh +${PACKAGE}FILES+= scrub_mirror_003_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= default.cfg +${PACKAGE}FILES+= scrub_mirror_002_pos.ksh +${PACKAGE}FILES+= scrub_mirror_common.kshlib + +.include diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/cleanup.ksh b/tests/sys/cddl/zfs/tests/scrub_mirror/cleanup.ksh new file mode 100644 index 00000000000..d48ac23d041 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/cleanup.ksh @@ -0,0 +1,48 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)cleanup.ksh 1.3 07/02/06 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +$DF -t zfs -h | $GREP "$TESTFS " >/dev/null +[[ $? == 0 ]] && log_must $ZFS umount -f $TESTDIR +destroy_pool $TESTPOOL + +# recreate and destroy a zpool over the disks to restore the partitions to +# normal +if [[ -n $SINGLE_DISK ]]; then + log_must cleanup_devices $MIRROR_PRIMARY +else + log_must cleanup_devices $MIRROR_PRIMARY $MIRROR_SECONDARY +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/default.cfg b/tests/sys/cddl/zfs/tests/scrub_mirror/default.cfg new file mode 100644 index 00000000000..1664bb71f33 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/default.cfg @@ -0,0 +1,57 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)default.cfg 1.3 08/08/15 SMI" +# + +typeset -i NUMBER_OF_DISKS=0 +for i in $DISKS; do + [[ -n $MIRROR_PRIMARY ]] && MIRROR_SECONDARY=$i + [[ -z $MIRROR_PRIMARY ]] && MIRROR_PRIMARY=$i +done + +if [[ -z $MIRROR_SECONDARY ]]; then + # We need to repartition the single disk to two partitions + SINGLE_DISK=$MIRROR_PRIMARY + MIRROR_SECONDARY=$MIRROR_PRIMARY + SIDE_PRIMARY=${SINGLE_DISK}p1 + SIDE_SECONDARY=${SINGLE_DISK}p2 +else + SIDE_PRIMARY=${MIRROR_PRIMARY}p1 + SIDE_SECONDARY=${MIRROR_SECONDARY}p1 +fi + +export MIRROR_PRIMARY MIRROR_SECONDARY SINGLE_DISK SIDE_PRIMARY SIDE_SECONDARY + +export FILE_COUNT=30 +export FILE_SIZE=$(( 1024 * 1024 )) +export MIRROR_MEGS=70 +export MIRROR_SIZE=${MIRROR_MEGS}m # default mirror size +export BLOCKSZ=$(( 64 * 1024 )) +export WRITE_COUNT=$(( MIRROR_MEGS * 1024 * 1024 / BLOCKSZ )) +export TESTFILE=testfile${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_001_pos.ksh b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_001_pos.ksh new file mode 100644 index 00000000000..cb5345853cb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_001_pos.ksh @@ -0,0 +1,67 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)scrub_mirror_001_pos.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/scrub_mirror/scrub_mirror_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: scrub_mirror_001_pos +# +# DESCRIPTION: +# The primary side of a zpool mirror can be zeroed without causing damage +# to the data in the pool +# +# STRATEGY: +# 1) Write several files to the ZFS filesystem mirror +# 2) dd from /dev/zero over the primary side of the mirror +# 3) verify that all the file contents are unchanged on the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "The primary side of a zpool mirror may be completely wiped" \ + "without affecting the content of the pool" + +overwrite_verify_mirror $TESTPOOL $SIDE_PRIMARY /dev/zero + +log_pass "The overwrite had no effect on the data" diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_002_pos.ksh b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_002_pos.ksh new file mode 100644 index 00000000000..c0cfebf1293 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_002_pos.ksh @@ -0,0 +1,67 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)scrub_mirror_002_pos.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/scrub_mirror/scrub_mirror_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: scrub_mirror_002_pos +# +# DESCRIPTION: +# The secondary side of a zpool mirror can be zeroed without causing damage +# to the data in the pool +# +# STRATEGY: +# 1) Write several files to the ZFS filesystem in the mirrored pool +# 2) dd from /dev/zero over the secondary side of the mirror +# 3) verify that all the file contents are unchanged on the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "The primary side of a zpool mirror may be completely wiped" \ + "without affecting the content of the pool" + +overwrite_verify_mirror $TESTPOOL $SIDE_SECONDARY /dev/zero + +log_pass "The overwrite had no effect on the data" diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_003_pos.ksh b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_003_pos.ksh new file mode 100644 index 00000000000..4a3fa933701 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_003_pos.ksh @@ -0,0 +1,67 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)scrub_mirror_003_pos.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/scrub_mirror/scrub_mirror_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: scrub_mirror_003_pos +# +# DESCRIPTION: +# The primary side of a zpool mirror can be mangled causing without damage +# to the data in the pool +# +# STRATEGY: +# 1) Write several files to the ZFS filesystem mirror +# 2) dd from /dev/urandom over the primary side of the mirror +# 3) verify that all the file contents are unchanged on the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "The primary side of a zpool mirror may be completely mangled" \ + "without affecting the content of the pool" + +overwrite_verify_mirror $TESTPOOL $SIDE_PRIMARY /dev/urandom + +log_pass "The overwrite did not have any effect on the data" diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_004_pos.ksh b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_004_pos.ksh new file mode 100644 index 00000000000..18f2ee234a3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_004_pos.ksh @@ -0,0 +1,67 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)scrub_mirror_004_pos.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/scrub_mirror/scrub_mirror_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: scrub_mirror_004_pos +# +# DESCRIPTION: +# The secondary side of a zpool mirror can be mangled causing without damage +# to the data in the pool +# +# STRATEGY: +# 1) Write several files to the ZFS filesystem in the mirrored pool +# 2) dd from /dev/urandom over the secondary side of the mirror +# 3) verify that all the file contents are unchanged on the file system +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "The primary side of a zpool mirror may be completely mangled" \ + "without affecting the content of the pool" + +overwrite_verify_mirror $TESTPOOL $SIDE_SECONDARY /dev/urandom + +log_pass "The overwrite had no effect on the data" diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_common.kshlib b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_common.kshlib new file mode 100644 index 00000000000..2e774bfb808 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_common.kshlib @@ -0,0 +1,83 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)scrub_mirror_common.kshlib 1.5 07/10/09 SMI" +# + +function overwrite_verify_mirror +{ + typeset POOL=$1 + typeset AFFECTED_DEVICE=$2 + typeset OVERWRITING_DEVICE=$3 + + typeset atfile=0 + set -A files + set -A cksums + set -A newcksums + + fill_fs $TESTDIR -1 $FILE_COUNT $BLOCKSZ $WRITE_COUNT + while [ "$atfile" -lt "$FILE_COUNT" ]; do + if [ -f ${TESTDIR}/0/${TESTFILE}.${atfile} ]; then + cksums[$atfile]=$($CKSUM ${TESTDIR}/0/${TESTFILE}.${atfile}) + fi + (( atfile = $atfile + 1 )) + done + + # unmount and export before dd + log_must $ZPOOL export $POOL + + # dd the affected side of the mirror + log_must $DD if=$OVERWRITING_DEVICE of=$(bsddevmap $AFFECTED_DEVICE) \ + seek=8 bs=$BLOCKSZ count=$(( WRITE_COUNT - 8 )) conv=notrunc + + # now remount and scrub + log_must $ZPOOL import $POOL + log_must $ZPOOL scrub $POOL + wait_for 60 1 is_pool_scrubbed $POOL + + atfile=0 + typeset -i failedcount=0 + while [ "$atfile" -lt "$FILE_COUNT" ]; do + if [ -f ${TESTDIR}/0/${TESTFILE}.${atfile} ]; then + newcksum=$($CKSUM $TESTDIR/0/${TESTFILE}.${atfile}) + if [[ $newcksum != ${cksums[$atfile]} ]]; then + (( failedcount = $failedcount + 1 )) + else + log_note "${TESTFILE}.${atfile} checksums match:"\ + "old ${cksums[$atfile]} new $newcksum" + fi + $RM -f ${files[$atfile]} + fi + (( atfile = $atfile + 1 )) + done + + if [ "$failedcount" -gt 0 ]; then + log_fail "of the $FILE_COUNT files $failedcount did not " \ + "have the same checksum before and after." + fi +} diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_test.sh b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_test.sh new file mode 100755 index 00000000000..eb523c2777d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/scrub_mirror_test.sh @@ -0,0 +1,140 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case scrub_mirror_001_pos cleanup +scrub_mirror_001_pos_head() +{ + atf_set "descr" "The primary side of a zpool mirror may be completely wipedwithout affecting the content of the pool" + atf_set "require.progs" zfs +} +scrub_mirror_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/scrub_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/scrub_mirror_001_pos.ksh || atf_fail "Testcase failed" +} +scrub_mirror_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/scrub_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case scrub_mirror_002_pos cleanup +scrub_mirror_002_pos_head() +{ + atf_set "descr" "The primary side of a zpool mirror may be completely wipedwithout affecting the content of the pool" + atf_set "require.progs" zfs +} +scrub_mirror_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/scrub_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/scrub_mirror_002_pos.ksh || atf_fail "Testcase failed" +} +scrub_mirror_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/scrub_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case scrub_mirror_003_pos cleanup +scrub_mirror_003_pos_head() +{ + atf_set "descr" "The primary side of a zpool mirror may be completely mangledwithout affecting the content of the pool" + atf_set "require.progs" zfs +} +scrub_mirror_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/scrub_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/scrub_mirror_003_pos.ksh || atf_fail "Testcase failed" +} +scrub_mirror_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/scrub_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case scrub_mirror_004_pos cleanup +scrub_mirror_004_pos_head() +{ + atf_set "descr" "The primary side of a zpool mirror may be completely mangledwithout affecting the content of the pool" + atf_set "require.progs" zfs +} +scrub_mirror_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/scrub_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/scrub_mirror_004_pos.ksh || atf_fail "Testcase failed" +} +scrub_mirror_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/scrub_mirror_common.kshlib + . $(atf_get_srcdir)/default.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case scrub_mirror_001_pos + atf_add_test_case scrub_mirror_002_pos + atf_add_test_case scrub_mirror_003_pos + atf_add_test_case scrub_mirror_004_pos +} diff --git a/tests/sys/cddl/zfs/tests/scrub_mirror/setup.ksh b/tests/sys/cddl/zfs/tests/scrub_mirror/setup.ksh new file mode 100644 index 00000000000..cbe061c24be --- /dev/null +++ b/tests/sys/cddl/zfs/tests/scrub_mirror/setup.ksh @@ -0,0 +1,47 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)setup.ksh 1.5 09/01/12 SMI" +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +if [[ -n $SINGLE_DISK ]]; then + log_note "Partitioning a single disk ($SINGLE_DISK)" +else + log_note "Partitioning disks ($MIRROR_PRIMARY $MIRROR_SECONDARY)" +fi +wipe_partition_table $SINGLE_DISK $MIRROR_PRIMARY $MIRROR_SECONDARY +log_must set_partition ${SIDE_PRIMARY##*p} "" $MIRROR_SIZE $MIRROR_PRIMARY +log_must set_partition ${SIDE_SECONDARY##*p} "" $MIRROR_SIZE $MIRROR_SECONDARY + +default_mirror_setup $SIDE_PRIMARY $SIDE_SECONDARY + +log_pass diff --git a/tests/sys/cddl/zfs/tests/slog/Makefile b/tests/sys/cddl/zfs/tests/slog/Makefile new file mode 100644 index 00000000000..4fb7f00b84c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/Makefile @@ -0,0 +1,32 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/slog +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= slog_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= slog_012_neg.ksh +${PACKAGE}FILES+= slog_013_pos.ksh +${PACKAGE}FILES+= slog_002_pos.ksh +${PACKAGE}FILES+= slog_006_pos.ksh +${PACKAGE}FILES+= slog.kshlib +${PACKAGE}FILES+= slog_003_pos.ksh +${PACKAGE}FILES+= slog_007_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= slog.cfg +${PACKAGE}FILES+= slog_001_pos.ksh +${PACKAGE}FILES+= slog_005_pos.ksh +${PACKAGE}FILES+= slog_008_neg.ksh +${PACKAGE}FILES+= slog_011_neg.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= slog_014_pos.ksh +${PACKAGE}FILES+= slog_010_neg.ksh +${PACKAGE}FILES+= slog_004_pos.ksh +${PACKAGE}FILES+= slog_009_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/slog/cleanup.ksh b/tests/sys/cddl/zfs/tests/slog/cleanup.ksh new file mode 100644 index 00000000000..6840d4828a2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/cleanup.ksh @@ -0,0 +1,49 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +if datasetexists $TESTPOOL ; then + log_must $ZPOOL destroy -f $TESTPOOL +fi +if datasetexists $TESTPOOL2 ; then + log_must $ZPOOL destroy -f $TESTPOOL2 +fi +if [[ -d $VDIR ]]; then + log_must $RM -rf $VDIR +fi +if [[ -d $VDIR2 ]]; then + log_must $RM -rf $VDIR2 +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/slog/setup.ksh b/tests/sys/cddl/zfs/tests/slog/setup.ksh new file mode 100644 index 00000000000..06011c117ae --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/setup.ksh @@ -0,0 +1,45 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +if [[ -d $VDEV ]]; then + log_must $RM -rf $VDIR +fi +if [[ -d $VDEV2 ]]; then + log_must $RM -rf $VDIR2 +fi +log_must $MKDIR -p $VDIR $VDIR2 +log_must create_vdevs $VDEV $SDEV $LDEV $VDEV2 $SDEV2 $LDEV2 + +log_pass diff --git a/tests/sys/cddl/zfs/tests/slog/slog.cfg b/tests/sys/cddl/zfs/tests/slog/slog.cfg new file mode 100644 index 00000000000..53c99d2dc47 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog.cfg @@ -0,0 +1,44 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog.cfg 1.1 07/07/31 SMI" +# + +export SIZE=64M + +export VDIR=$TMPDIR/disk.${TESTCASE_ID} +export VDIR2=$TMPDIR/disk2.${TESTCASE_ID} + +export VDEV="$VDIR/a $VDIR/b $VDIR/c" +export SDEV="$VDIR/d" +export LDEV="$VDIR/e $VDIR/f" +export VDEV2="$VDIR2/a $VDIR2/b $VDIR2/c" +export SDEV2="$VDIR2/d" +export LDEV2="$VDIR2/e $VDIR2/f" + +export STF_TIMEOUT=1200 diff --git a/tests/sys/cddl/zfs/tests/slog/slog.kshlib b/tests/sys/cddl/zfs/tests/slog/slog.kshlib new file mode 100644 index 00000000000..64fee40ccfb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog.kshlib @@ -0,0 +1,181 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog.kshlib 1.2 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +function cleanup +{ + poolexists $TESTPOOL && log_must $ZPOOL status $TESTPOOL + poolexists $TESTPOOL && log_must $ZPOOL status $TESTPOOL2 + destroy_pool $TESTPOOL + destroy_pool $TESTPOOL2 +} + +# +# Try zpool status/iostat for given pool +# +# $1 pool +# +function display_status +{ + typeset pool=$1 + + typeset -i ret=0 + $ZPOOL status -xv $pool > /dev/null 2>&1 + ret=$? + + $ZPOOL iostat > /dev/null 2>&1 + ((ret |= $?)) + + typeset mntpnt=$(get_prop mountpoint $pool) + $DD if=/dev/random of=$mntpnt/testfile.${TESTCASE_ID} & + typeset pid=$! + + $ZPOOL iostat -v 1 3 > /dev/null + ((ret |= $?)) + + kill -9 $pid + + return $ret +} + +function slog_devstat_table +{ + typeset pool=$1 + + $ZPOOL status -v $pool | $NAWK ' + BEGIN { start = 0; } + /\tlogs/ { start = 1; } + (start == 0) { next; } + /\t (\/|[a-zA-Z])/ { print "stripe:" $1 " " $2; } + /\t (\/|[a-zA-Z])/ { print "mirror:" $1 " " $2; } + /\t (\/|[0-9])/ {print "stripe:" $NF " " $2} + /\t (\/|[0-9])/ {print "mirror:" $NF " " $2} + # When a hotspare is replacing + /\t (\/|[a-zA-Z])/ {print "mirror:" $1 " " $2} + ' +} + +# +# Verify the given slog device have correct type and status +# +# $1 pool name +# $2 device name +# $3 device status +# $4 device type +# +function verify_slog_device +{ + typeset pool=$1 + typeset device=$2 + typeset status=$3 + typeset type=$4 + + if [[ -z $pool || -z $device || -z $status ]]; then + log_fail "Usage: verify_slog_device " \ + " [type]" + fi + + if [[ $WRAPPER == *"smi"* ]]; then + $ECHO $device | $EGREP "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1 + if (( $? == 0 )); then + device=${device}s2 + fi + fi + + # + # Get all the slog devices and status table like below + # + # mirror:/disks/d ONLINE mirror:/disks/e ONLINE stripe:/disks/f ONLINE + # + set -A dev_stat_tab $(slog_devstat_table $pool) + + typeset find=0 + for (( i = 0; i < ${#dev_stat_tab[@]}; i += 2 )); do + typeset dev=${dev_stat_tab[$i]} + typeset stat=${dev_stat_tab[((i+1))]} + + typeset statmsg="$dev: Status($stat) != Expected stat($status)" + case $dev in + stripe:$device) + if [[ "$type" == 'mirror' ]]; then + log_note "Unexpected type: mirror" + return 1 + fi + if [[ $stat != $status ]]; then + log_note statmsg + return 1 + fi + return 0 + ;; + mirror:$device) + if [[ -z "$type" || $type == 'stripe' ]]; then + log_note "Unexpected type: stripe" + return 1 + fi + if [[ $stat != $status ]]; then + log_note statmsg + return 1 + fi + return 0 + ;; + esac + done + return 1 +} + +# Calls [args...] . +function slog_foreach_nologtype # +{ + typeset callback="$1" + + for pooltype in "" "mirror" "raidz" "raidz2"; do + for sparetype in "" "spare"; do + $callback "$pooltype" "$sparetype" + done + done +} + +# Calls [args...] . +# Unfortunately, this has to be duplicated because some arguments are empty, +# so if they aren't explicitly forwarded they aren't arguments to $callback. +function slog_foreach_all # +{ + typeset callback="$1" + + for pooltype in "" "mirror" "raidz" "raidz2"; do + for sparetype in "" "spare"; do + for logtype in "" "mirror"; do + $callback "$pooltype" "$sparetype" "$logtype" + done + done + done +} diff --git a/tests/sys/cddl/zfs/tests/slog/slog_001_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_001_pos.ksh new file mode 100644 index 00000000000..daa6079a465 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_001_pos.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_001_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_001_pos +# +# DESCRIPTION: +# Creating a pool with a log device succeeds. +# +# STRATEGY: +# 1. Create pool with separated log devices. +# 2. Display pool status +# 3. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Creating a pool with a log device succeeds." +log_onexit cleanup + +function test_creating_with_slog # +{ + typeset pooltype=$1 + typeset sparetype=$2 + typeset logtype=$3 + + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV log $logtype $LDEV + log_must display_status $TESTPOOL + ldev=$(random_get $LDEV) + log_must verify_slog_device $TESTPOOL $ldev ONLINE $logtype + destroy_pool $TESTPOOL +} + +slog_foreach_all test_creating_with_slog + +log_pass "Creating a pool with a log device succeeds." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_002_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_002_pos.ksh new file mode 100644 index 00000000000..89169606590 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_002_pos.ksh @@ -0,0 +1,76 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_002_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_002_pos +# +# DESCRIPTION: +# Adding a log device to normal pool works. +# +# STRATEGY: +# 1. Create pool +# 2. Add log devices with different configuration +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Adding a log device to normal pool works." +log_onexit cleanup + +function test_adding_slog # +{ + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV + log_must $ZPOOL add $TESTPOOL log $logtype $LDEV + log_must display_status $TESTPOOL + typeset ldev=$(random_get $LDEV) + log_must verify_slog_device $TESTPOOL $ldev ONLINE $logtype + destroy_pool $TESTPOOL +} + +slog_foreach_all test_adding_slog + +log_pass "Adding a log device to normal pool works." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_003_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_003_pos.ksh new file mode 100644 index 00000000000..3fd37bc593e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_003_pos.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_003_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_003_pos +# +# DESCRIPTION: +# Adding an extra log device works +# +# STRATEGY: +# 1. Create pool with separated log devices. +# 2. Add an extra log devices +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Adding an extra log device works." +log_onexit cleanup + +function test_adding_extra_slog # +{ + typeset pooltype=$1 + typeset sparetype=$2 + typeset logtype=$3 + + for newtype in "" "mirror"; do + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV \ + log $logtype $LDEV + log_must $ZPOOL add $TESTPOOL log $newtype $LDEV2 + log_must display_status $TESTPOOL + ldev=$(random_get $LDEV2) + log_must verify_slog_device $TESTPOOL $ldev ONLINE $newtype + destroy_pool $TESTPOOL + done +} + +slog_foreach_all test_adding_extra_slog + +log_pass "Adding an extra log device works." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_004_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_004_pos.ksh new file mode 100644 index 00000000000..1c82f2ff1f4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_004_pos.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_004_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_004_pos +# +# DESCRIPTION: +# Attaching a log device passes. +# +# STRATEGY: +# 1. Create pool with separated log devices. +# 2. Attaching a log device for existing log device +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Attaching a log device passes." +log_onexit cleanup + +function test_attaching_slog # +{ + typeset pooltype=$1 + typeset sparetype=$2 + typeset logtype=$3 + + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV \ + log $logtype $LDEV + typeset ldev=$(random_get $LDEV) + typeset ldev2=$(random_get $LDEV2) + log_must $ZPOOL attach $TESTPOOL $ldev $ldev2 + log_must display_status $TESTPOOL + log_must verify_slog_device $TESTPOOL $ldev ONLINE mirror + log_must verify_slog_device $TESTPOOL $ldev2 ONLINE mirror + destroy_pool $TESTPOOL +} +slog_foreach_all test_attaching_slog + +log_pass "Attaching a log device passes." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_005_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_005_pos.ksh new file mode 100644 index 00000000000..651be1aa36a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_005_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_005_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_005_pos +# +# DESCRIPTION: +# Detaching a log device passes. +# +# STRATEGY: +# 1. Create pool with mirror log devices. +# 2. Detaching a log device +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Detaching a log device passes." +log_onexit cleanup + +function test_detaching_slog # +{ + typeset pooltype="$1" + typeset sparetype="$2" + + log_note "test_detaching_slog args: $* -EOA-" + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV \ + log mirror $LDEV mirror $LDEV2 + ldev=$(random_get $LDEV $LDEV2) + log_must $ZPOOL detach $TESTPOOL $ldev + log_must display_status $TESTPOOL + log_mustnot verify_slog_device $TESTPOOL $ldev ONLINE mirror + destroy_pool $TESTPOOL +} +slog_foreach_nologtype test_detaching_slog + +log_pass "Detaching a log device passes." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_006_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_006_pos.ksh new file mode 100644 index 00000000000..ba9d505cd07 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_006_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_006_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_006_pos +# +# DESCRIPTION: +# Replacing a log device passes. +# +# STRATEGY: +# 1. Create pool with log devices. +# 2. Replacing one log device +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Replacing a log device passes." +log_onexit cleanup + +function test_slog_replacing # +{ + typeset pooltype=$1 + typeset sparetype=$2 + typeset logtype=$3 + + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV log $logtype $LDEV + sdev=$(random_get $LDEV) + tdev=$(random_get $LDEV2) + log_must $ZPOOL replace $TESTPOOL $sdev $tdev + log_must display_status $TESTPOOL + wait_for 15 1 verify_slog_device $TESTPOOL $tdev ONLINE $logtype + destroy_pool $TESTPOOL +} +slog_foreach_all test_slog_replacing + +log_pass "Replacing a log device passes." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_007_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_007_pos.ksh new file mode 100644 index 00000000000..4bd2cae8c6b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_007_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_007_pos.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_007_pos +# +# DESCRIPTION: +# Exporting and importing pool with log devices passes. +# +# STRATEGY: +# 1. Create pool with log devices. +# 2. Export and import the pool +# 3. Display pool status +# 4. Destroy and import the pool again +# 5. Display pool status +# 6. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Exporting and importing pool with log devices passes." +log_onexit cleanup + +function test_slog_exporting_importing # +{ + typeset pooltype=$1 + typeset sparetype=$2 + typeset logtype=$3 + + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV \ + log $logtype $LDEV $LDEV2 + ldev=$(random_get $LDEV $LDEV2) + log_must verify_slog_device $TESTPOOL $ldev ONLINE $logtype + log_must $ZPOOL export $TESTPOOL + log_must $ZPOOL import -d $VDIR -d $VDIR2 $TESTPOOL + log_must display_status $TESTPOOL + ldev=$(random_get $LDEV $LDEV2) + log_must verify_slog_device $TESTPOOL $ldev ONLINE $logtype + + destroy_pool $TESTPOOL + log_must $ZPOOL import -Df -d $VDIR -d $VDIR2 $TESTPOOL + log_must display_status $TESTPOOL + ldev=$(random_get $LDEV $LDEV2) + log_must verify_slog_device $TESTPOOL $ldev ONLINE $logtype + destroy_pool $TESTPOOL +} +slog_foreach_all test_slog_exporting_importing + +log_pass "Exporting and importing pool with log devices passes." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_008_neg.ksh b/tests/sys/cddl/zfs/tests/slog/slog_008_neg.ksh new file mode 100644 index 00000000000..a3aad90e1e8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_008_neg.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_008_neg.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_008_neg +# +# DESCRIPTION: +# A raidz/raidz2 log is not supported. +# +# STRATEGY: +# 1. Try to create pool with unsupported type +# 2. Verify failed to create pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "A raidz/raidz2 log is not supported." +log_onexit cleanup + +function test_no_raidz_slog # +{ + typeset pooltype=$1 + typeset sparetype=$2 + + for logtype in "raidz" "raidz1" "raidz2"; do + log_mustnot $ZPOOL create $TESTPOOL $type $VDEV \ + $spare $SDEV log $logtype $LDEV $LDEV2 + ldev=$(random_get $LDEV $LDEV2) + log_mustnot verify_slog_device $TESTPOOL $ldev ONLINE $logtype + log_must datasetnonexists $TESTPOOL + done +} +slog_foreach_nologtype test_no_raidz_slog + +log_pass "A raidz/raidz2 log is not supported." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_009_neg.ksh b/tests/sys/cddl/zfs/tests/slog/slog_009_neg.ksh new file mode 100644 index 00000000000..c4310ac065d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_009_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_009_neg.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_009_neg +# +# DESCRIPTION: +# A raidz/raidz2 log can not be added to existed pool. +# +# STRATEGY: +# 1. Create pool with or without log. +# 2. Add a raidz/raidz2 log to this pool. +# 3. Verify failed to add. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "A raidz/raidz2 log can not be added to existed pool." +log_onexit cleanup + +function test_no_raidz_slog_add # +{ + typeset pooltype=$1 + typeset sparetype=$2 + typeset logtype=$3 + + log=$(random_get_with_non "log") + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV $logtype $LDEV + + log_mustnot $ZPOOL add $TESTPOOL log $logtype $LDEV2 + ldev=$(random_get $LDEV2) + log_mustnot verify_slog_device $TESTPOOL $ldev 'ONLINE' $logtype + destroy_pool $TESTPOOL +} + +log_pass "A raidz/raidz2 log can not be added to existed pool." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_010_neg.ksh b/tests/sys/cddl/zfs/tests/slog/slog_010_neg.ksh new file mode 100644 index 00000000000..1a52d46f2c3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_010_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_010_neg.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_010_neg +# +# DESCRIPTION: +# Slog device can not be replaced with spare device +# +# STRATEGY: +# 1. Create a pool with hotspare and log devices. +# 2. Verify slog device can not be replaced with hotspare device. +# 3. Create pool2 with hotspare +# 4. Verify slog device can not be replaced with hotspare device in pool2. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Slog device can not be replaced with spare device." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL $VDEV spare $SDEV log $LDEV +sdev=$(random_get $SDEV) +ldev=$(random_get $LDEV) +log_mustnot $ZPOOL replace $TESTPOOL $ldev $sdev +log_mustnot verify_slog_device $TESTPOOL $sdev 'ONLINE' +log_must verify_slog_device $TESTPOOL $ldev 'ONLINE' + +log_must $ZPOOL create $TESTPOOL2 $VDEV2 spare $SDEV2 +sdev2=$(random_get $SDEV2) +log_mustnot $ZPOOL replace $TESTPOOL $ldev $sdev2 +log_mustnot $ZPOOL replace -f $TESTPOOL $ldev $sdev2 +log_mustnot verify_slog_device $TESTPOOL $sdev2 'ONLINE' +log_must verify_slog_device $TESTPOOL $ldev 'ONLINE' + +log_pass "Slog device can not be replaced with spare device." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_011_neg.ksh b/tests/sys/cddl/zfs/tests/slog/slog_011_neg.ksh new file mode 100644 index 00000000000..ce43d30c938 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_011_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_011_neg.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_011_neg +# +# DESCRIPTION: +# Offline and online a log device passes. +# +# STRATEGY: +# 1. Create pool with mirror log devices. +# 2. Offine and online a log device +# 3. Display pool status +# 4. Destroy and loop to create pool with different configuration. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Offline and online a log device passes." +log_onexit cleanup + +function test_slog_online_offline # +{ + create_pool $TESTPOOL $type $VDEV $spare $SDEV \ + log mirror $LDEV mirror $LDEV2 + + ldev=$(random_get $LDEV $LDEV2) + log_must $ZPOOL offline $TESTPOOL $ldev + log_must display_status $TESTPOOL + log_must verify_slog_device $TESTPOOL $ldev OFFLINE mirror + + log_must $ZPOOL online $TESTPOOL $ldev + log_must display_status $TESTPOOL + log_must verify_slog_device $TESTPOOL $ldev ONLINE mirror + + destroy_pool $TESTPOOL +} +slog_foreach_nologtype test_slog_online_offline + +log_pass "Offline and online a log device passes." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_012_neg.ksh b/tests/sys/cddl/zfs/tests/slog/slog_012_neg.ksh new file mode 100644 index 00000000000..0535c4ee4a1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_012_neg.ksh @@ -0,0 +1,87 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_012_neg.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_012_neg +# +# DESCRIPTION: +# Pool can survive when one of mirror log device get corrupted +# +# STRATEGY: +# 1. Create pool with mirror slog devices +# 2. Make corrupted on one disk +# 3. Verify the pool is fine +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Pool can survive when one of mirror log device get corrupted." +log_onexit cleanup + +function test_slog_mirror_corruption # +{ + typeset pooltype=$1 + typeset sparetype=$2 + + create_pool $TESTPOOL $type $VDEV $spare $SDEV log mirror $LDEV + + mntpnt=$(get_prop mountpoint $TESTPOOL) + # + # Create file in pool to trigger writing in slog devices + # + log_must $DD if=/dev/urandom of=$mntpnt/testfile.${TESTCASE_ID} count=100 + + ldev=$(random_get $LDEV) + log_must create_vdevs $ldev + log_must $ZPOOL scrub $TESTPOOL + + log_must display_status $TESTPOOL + log_must verify_slog_device $TESTPOOL $ldev UNAVAIL mirror + + destroy_pool $TESTPOOL +} +slog_foreach_nologtype test_slog_mirror_corruption + +log_pass "Pool can survive when one of mirror log device get corrupted." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_013_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_013_pos.ksh new file mode 100644 index 00000000000..3aea01cab31 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_013_pos.ksh @@ -0,0 +1,107 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_013_pos.ksh 1.2 09/05/19 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_013_pos +# +# DESCRIPTION: +# Verify slog device can be disk, file, lofi device or any device that +# presents a block interface. +# +# STRATEGY: +# 1. Create a pool +# 2. Loop to add different object as slog +# 3. Verify it passes +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup_testenv +{ + cleanup + if datasetexists $TESTPOOL2 ; then + log_must $ZPOOL destroy -f $TESTPOOL2 + fi + if [[ -n $lofidev ]]; then + $LOFIADM -d $lofidev + fi +} + +log_assert "Verify slog device can be disk, file, lofi device or any device " \ + "that presents a block interface." +log_onexit cleanup_testenv + +dsk1=${DISKS%% *} +log_must $ZPOOL create $TESTPOOL ${DISKS#$dsk1} + +# Add nomal disk +log_must $ZPOOL add $TESTPOOL log $dsk1 +log_must verify_slog_device $TESTPOOL $dsk1 'ONLINE' +# Add nomal file +log_must $ZPOOL add $TESTPOOL log $LDEV +ldev=$(random_get $LDEV) +log_must verify_slog_device $TESTPOOL $ldev 'ONLINE' + +# Add lofi device +lofidev=${LDEV2%% *} +log_must $LOFIADM -a $lofidev +lofidev=$($LOFIADM $lofidev) +log_must $ZPOOL add $TESTPOOL log $lofidev +log_must verify_slog_device $TESTPOOL $lofidev 'ONLINE' + +log_pass "Verify slog device can be disk, file, lofi device or any device " \ + "that presents a block interface." + +# Temp disable fore bug 6569095 +# Add file which reside in the itself +mntpnt=$(get_prop mountpoint $TESTPOOL) +log_must create_vdevs $mntpnt/vdev +log_must $ZPOOL add $TESTPOOL $mntpnt/vdev + +# Temp disable fore bug 6569072 +# Add ZFS volume +vol=$TESTPOOL/vol +log_must $ZPOOL create -V 64M $vol +log_must $ZPOOL add $TESTPOOL /dev/zvol/dsk/$vol diff --git a/tests/sys/cddl/zfs/tests/slog/slog_014_pos.ksh b/tests/sys/cddl/zfs/tests/slog/slog_014_pos.ksh new file mode 100644 index 00000000000..c9ea000e6c4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_014_pos.ksh @@ -0,0 +1,93 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)slog_014_pos.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/tests/slog/slog.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: slog_014_pos +# +# DESCRIPTION: +# log device can survive when one of pool device get corrupted +# +# STRATEGY: +# 1. Create pool with slog devices +# 2. remove one disk +# 3. Verify the log is fine +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-05-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "log device can survive when one of the pool device get corrupted." +log_onexit cleanup + +function test_slog_survives_pool_corruption # +{ + typeset pooltype=$1 + typeset sparetype=$2 + + # This only works for pools that have redundancy + [ -z "$pooltype" ] && return + + create_pool $TESTPOOL $pooltype $VDEV $sparetype $SDEV log $LDEV + + # Remove one of the pool device, then scrub to make the pool DEGRADED + log_must $RM -f $VDIR/a + log_must $ZPOOL scrub $TESTPOOL + + # Check and verify pool status + log_must display_status $TESTPOOL + log_must $ZPOOL status $TESTPOOL 2>&1 >/dev/null + + # Check that there is some status: field informing us of a + # problem. The exact error string is unspecified. + log_must $ZPOOL status -v $TESTPOOL | $GREP "status:" + for l in $LDEV; do + log_must check_state $TESTPOOL $l ONLINE + done + + destroy_pool $TESTPOOL + create_vdevs $VDIR/a +} +slog_foreach_nologtype test_slog_survives_pool_corruption + +log_pass "log device can survive when one of the pool device get corrupted." diff --git a/tests/sys/cddl/zfs/tests/slog/slog_test.sh b/tests/sys/cddl/zfs/tests/slog/slog_test.sh new file mode 100755 index 00000000000..1071146d024 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/slog/slog_test.sh @@ -0,0 +1,411 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case slog_001_pos cleanup +slog_001_pos_head() +{ + atf_set "descr" "Creating a pool with a log device succeeds." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_001_pos.ksh || atf_fail "Testcase failed" +} +slog_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_002_pos cleanup +slog_002_pos_head() +{ + atf_set "descr" "Adding a log device to normal pool works." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_002_pos.ksh || atf_fail "Testcase failed" +} +slog_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_003_pos cleanup +slog_003_pos_head() +{ + atf_set "descr" "Adding an extra log device works." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_003_pos.ksh || atf_fail "Testcase failed" +} +slog_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_004_pos cleanup +slog_004_pos_head() +{ + atf_set "descr" "Attaching a log device passes." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_004_pos.ksh || atf_fail "Testcase failed" +} +slog_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_005_pos cleanup +slog_005_pos_head() +{ + atf_set "descr" "Detaching a log device passes." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_005_pos.ksh || atf_fail "Testcase failed" +} +slog_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_006_pos cleanup +slog_006_pos_head() +{ + atf_set "descr" "Replacing a log device passes." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_006_pos.ksh || atf_fail "Testcase failed" +} +slog_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_007_pos cleanup +slog_007_pos_head() +{ + atf_set "descr" "Exporting and importing pool with log devices passes." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_007_pos.ksh || atf_fail "Testcase failed" +} +slog_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_008_neg cleanup +slog_008_neg_head() +{ + atf_set "descr" "A raidz/raidz2 log is not supported." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_008_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_008_neg.ksh || atf_fail "Testcase failed" +} +slog_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_009_neg cleanup +slog_009_neg_head() +{ + atf_set "descr" "A raidz/raidz2 log can not be added to existed pool." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_009_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_009_neg.ksh || atf_fail "Testcase failed" +} +slog_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_010_neg cleanup +slog_010_neg_head() +{ + atf_set "descr" "Slog device can not be replaced with spare device." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_010_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_010_neg.ksh || atf_fail "Testcase failed" +} +slog_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_011_neg cleanup +slog_011_neg_head() +{ + atf_set "descr" "Offline and online a log device passes." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_011_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_011_neg.ksh || atf_fail "Testcase failed" +} +slog_011_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_012_neg cleanup +slog_012_neg_head() +{ + atf_set "descr" "Pool can survive when one of mirror log device get corrupted." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_012_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_012_neg.ksh || atf_fail "Testcase failed" +} +slog_012_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_013_pos cleanup +slog_013_pos_head() +{ + atf_set "descr" "Verify slog device can be disk, file, lofi device or any devicethat presents a block interface." + atf_set "require.progs" zpool lofiadm + atf_set "timeout" 1200 +} +slog_013_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_013_pos.ksh || atf_fail "Testcase failed" +} +slog_013_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case slog_014_pos cleanup +slog_014_pos_head() +{ + atf_set "descr" "log device can survive when one of the pool device get corrupted." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +slog_014_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/slog_014_pos.ksh || atf_fail "Testcase failed" +} +slog_014_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/slog.kshlib + . $(atf_get_srcdir)/slog.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case slog_001_pos + atf_add_test_case slog_002_pos + atf_add_test_case slog_003_pos + atf_add_test_case slog_004_pos + atf_add_test_case slog_005_pos + atf_add_test_case slog_006_pos + atf_add_test_case slog_007_pos + atf_add_test_case slog_008_neg + atf_add_test_case slog_009_neg + atf_add_test_case slog_010_neg + atf_add_test_case slog_011_neg + atf_add_test_case slog_012_neg + atf_add_test_case slog_013_pos + atf_add_test_case slog_014_pos +} diff --git a/tests/sys/cddl/zfs/tests/snapshot/Makefile b/tests/sys/cddl/zfs/tests/snapshot/Makefile new file mode 100644 index 00000000000..321568c7f56 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/Makefile @@ -0,0 +1,42 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/snapshot +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= snapshot_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= rollback_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= snapshot_017_pos.ksh +${PACKAGE}FILES+= snapshot_013_pos.ksh +${PACKAGE}FILES+= ctldir_acl.txt +${PACKAGE}FILES+= snapshot_002_pos.ksh +${PACKAGE}FILES+= snapshot_006_pos.ksh +${PACKAGE}FILES+= clone_001_pos.ksh +${PACKAGE}FILES+= snapshot_003_pos.ksh +${PACKAGE}FILES+= snapshot_007_pos.ksh +${PACKAGE}FILES+= snapshot_016_pos.ksh +${PACKAGE}FILES+= snapshot_012_pos.ksh +${PACKAGE}FILES+= snapshot_009_pos.ksh +${PACKAGE}FILES+= snapshot_001_pos.ksh +${PACKAGE}FILES+= snapshot_005_pos.ksh +${PACKAGE}FILES+= snapshot.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= rollback_002_pos.ksh +${PACKAGE}FILES+= snapshot_014_pos.ksh +${PACKAGE}FILES+= snapshot_010_pos.ksh +${PACKAGE}FILES+= snapshot_018_pos.ksh +${PACKAGE}FILES+= rollback_003_pos.ksh +${PACKAGE}FILES+= snapshot_019_pos.ksh +${PACKAGE}FILES+= snapshot_015_pos.ksh +${PACKAGE}FILES+= snapshot_011_pos.ksh +${PACKAGE}FILES+= snapshot_004_pos.ksh +${PACKAGE}FILES+= snapshot_008_pos.ksh +${PACKAGE}FILES+= snapshot_020_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/snapshot/cleanup.ksh b/tests/sys/cddl/zfs/tests/snapshot/cleanup.ksh new file mode 100644 index 00000000000..e2ccfb86862 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_container_cleanup diff --git a/tests/sys/cddl/zfs/tests/snapshot/clone_001_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/clone_001_pos.ksh new file mode 100644 index 00000000000..d025d9fa5b1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/clone_001_pos.ksh @@ -0,0 +1,143 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)clone_001_pos.ksh 1.6 09/06/22 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: clone_001_pos +# +# DESCRIPTION: +# Create a snapshot from regular filesystem, volume, +# or filesystem upon volume, Build a clone file system +# from the snapshot and verify new files can be written. +# +# STRATEGY: +# 1. Create snapshot use 3 combination: +# - Regular filesystem +# - Regular volume +# - Filesystem upon volume +# 2. Clone a new file system from the snapshot +# 3. Verify the cloned file system is writable +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-08-25) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +# Setup array, 4 elements as a group, refer to: +# i+0: name of a snapshot +# i+1: mountpoint of the snapshot +# i+2: clone created from the snapshot +# i+3: mountpoint of the clone + +set -A args "$SNAPFS" "$SNAPDIR" "$TESTPOOL/$TESTCLONE" "$TESTDIR.0" \ + "$SNAPFS1" "$SNAPDIR3" "$TESTPOOL/$TESTCLONE1" "" \ + "$SNAPFS2" "$SNAPDIR2" "$TESTPOOL1/$TESTCLONE2" "$TESTDIR.2" + +function setup_all +{ + create_pool $TESTPOOL1 /dev/zvol/$TESTPOOL/$TESTVOL + log_must $ZFS create $TESTPOOL1/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL1/$TESTFS + + return 0 +} + +function cleanup_all +{ + destroy_pool $TESTPOOL1 + + [[ -d $TESTDIR2 ]] && \ + log_must $RM -rf $TESTDIR2 + + return 0 +} + +log_assert "Verify a cloned file system is writable." + +log_onexit cleanup_all + +setup_all + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +typeset -i COUNT=10 + +for mtpt in $TESTDIR $TESTDIR2 ; do + log_note "Populate the $mtpt directory (prior to snapshot)" + populate_dir $mtpt/before_file $COUNT $NUM_WRITES $BLOCKSZ ITER +done + +typeset -i i=0 +while (( i < ${#args[*]} )); do + # + # Take a snapshot of the test file system. + # + log_must $ZFS snapshot ${args[i]} + + # + # Clone a new file system from the snapshot + # + log_must $ZFS clone ${args[i]} ${args[i+2]} + if [[ -n ${args[i+3]} ]] ; then + log_must $ZFS set mountpoint=${args[i+3]} ${args[i+2]} + + FILE_COUNT=`$LS -Al ${args[i+3]} | $GREP -v "total" | wc -l` + if [[ $FILE_COUNT -ne $COUNT ]]; then + $LS -Al ${args[i+3]} + log_fail "AFTER: ${args[i+3]} contains $FILE_COUNT files(s)." + fi + + log_note "Verify the ${args[i+3]} directory is writable" + populate_dir ${args[i+3]}/after_file $COUNT $NUM_WRITES \ + $BLOCKSZ ITER + + FILE_COUNT=`$LS -Al ${args[i+3]}/after* | $GREP -v "total" | wc -l` + if [[ $FILE_COUNT -ne $COUNT ]]; then + $LS -Al ${args[i+3]} + log_fail "${args[i+3]} contains $FILE_COUNT after* files(s)." + fi + fi + + (( i = i + 4 )) +done + +log_pass "The clone file system is writable." diff --git a/tests/sys/cddl/zfs/tests/snapshot/ctldir_acl.txt b/tests/sys/cddl/zfs/tests/snapshot/ctldir_acl.txt new file mode 100644 index 00000000000..d0afd0a2e5a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/ctldir_acl.txt @@ -0,0 +1,3 @@ + owner@:r-x---a---c--s:-------:allow + group@:r-x---a---c--s:-------:allow + everyone@:r-x---a---c--s:-------:allow diff --git a/tests/sys/cddl/zfs/tests/snapshot/rollback_001_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/rollback_001_pos.ksh new file mode 100644 index 00000000000..baa058c1e2b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/rollback_001_pos.ksh @@ -0,0 +1,114 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rollback_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: rollback_001_pos +# +# DESCRIPTION: +# Populate a file system and take a snapshot. Add some more files to the +# file system and rollback to the last snapshot. Verify no post snapshot +# file exist. +# +# STRATEGY: +# 1. Empty a file system +# 2. Populate the file system +# 3. Take a snapshot of the file system +# 4. Add new files to the file system +# 5. Perform a rollback +# 6. Verify the snapshot and file system agree +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + snapexists $SNAPFS + [[ $? -eq 0 ]] && \ + log_must $ZFS destroy $SNAPFS + + [[ -e $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 +} + +log_assert "Verify that a rollback to a previous snapshot succeeds." + +log_onexit cleanup + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +typeset -i COUNT=10 + +log_note "Populate the $TESTDIR directory (prior to snapshot)" +populate_dir $TESTDIR/before_file $COUNT $NUM_WRITES $BLOCKSZ ITER +log_must $ZFS snapshot $SNAPFS + +FILE_COUNT=`$LS -Al $SNAPDIR | $GREP -v "total" | wc -l` +if [[ $FILE_COUNT -ne $COUNT ]]; then + $LS -Al $SNAPDIR + log_fail "AFTER: $SNAPFS contains $FILE_COUNT files(s)." +fi + +log_note "Populate the $TESTDIR directory (post snapshot)" +populate_dir $TESTDIR/after_file $COUNT $NUM_WRITES $BLOCKSZ ITER + +# +# Now rollback to latest snapshot +# +log_must $ZFS rollback $SNAPFS + +FILE_COUNT=`$LS -Al $TESTDIR/after* 2> /dev/null | $GREP -v "total" | wc -l` +if [[ $FILE_COUNT -ne 0 ]]; then + $LS -Al $TESTDIR + log_fail "$TESTDIR contains $FILE_COUNT after* files(s)." +fi + +FILE_COUNT=`$LS -Al $TESTDIR/before* 2> /dev/null \ + | $GREP -v "total" | wc -l` +if [[ $FILE_COUNT -ne $COUNT ]]; then + $LS -Al $TESTDIR + log_fail "$TESTDIR contains $FILE_COUNT before* files(s)." +fi + +log_pass "The rollback operation succeeded." diff --git a/tests/sys/cddl/zfs/tests/snapshot/rollback_002_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/rollback_002_pos.ksh new file mode 100644 index 00000000000..42d7604f84d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/rollback_002_pos.ksh @@ -0,0 +1,126 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rollback_002_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: rollback_002_pos +# +# DESCRIPTION: +# Verify that rollbacks are with respect to the latest snapshot. +# +# STRATEGY: +# 1. Empty a file system +# 2. Populate the file system +# 3. Take a snapshot of the file system +# 4. Add new files to the file system +# 5. Take a snapshot +# 6. Remove the original files +# 7. Perform a rollback +# 8. Verify the latest snapshot and file system agree +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + snapexists $SNAPFS.1 + [[ $? -eq 0 ]] && \ + log_must $ZFS destroy $SNAPFS.1 + + snapexists $SNAPFS + [[ $? -eq 0 ]] && \ + log_must $ZFS destroy $SNAPFS + + [[ -e $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 +} + +log_assert "Verify rollback is with respect to latest snapshot." + +log_onexit cleanup + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +typeset -i COUNT=10 + +log_note "Populate the $TESTDIR directory (prior to first snapshot)" +populate_dir $TESTDIR/original_file $COUNT $NUM_WRITES $BLOCKSZ ITER + +log_must $ZFS snapshot $SNAPFS + +FILE_COUNT=`$LS -Al $SNAPDIR | $GREP -v "total" | wc -l` +if [[ $FILE_COUNT -ne $COUNT ]]; then + $LS -Al $SNAPDIR + log_fail "AFTER: $SNAPFS contains $FILE_COUNT files(s)." +fi + +log_note "Populate the $TESTDIR directory (prior to second snapshot)" +populate_dir $TESTDIR/afterfirst_file $COUNT $NUM_WRITES $BLOCKSZ ITER +log_must $ZFS snapshot $SNAPFS.1 + +log_note "Populate the $TESTDIR directory (Post second snapshot)" +populate_dir $TESTDIR/aftersecond_file $COUNT $NUM_WRITES $BLOCKSZ ITER + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/original_file* > /dev/null 2>&1 + +# +# Now rollback to latest snapshot +# +log_must $ZFS rollback $SNAPFS.1 + +FILE_COUNT=`$LS -Al $TESTDIR/aftersecond* 2> /dev/null \ + | $GREP -v "total" | wc -l` +if [[ $FILE_COUNT -ne 0 ]]; then + $LS -Al $TESTDIR + log_fail "$TESTDIR contains $FILE_COUNT aftersecond* files(s)." +fi + +FILE_COUNT=`$LS -Al $TESTDIR/original* $TESTDIR/afterfirst*| $GREP -v "total" | wc -l` +if [[ $FILE_COUNT -ne 20 ]]; then + $LS -Al $TESTDIR + log_fail "$TESTDIR contains $FILE_COUNT original* files(s)." +fi + +log_pass "The rollback to the latest snapshot succeeded." diff --git a/tests/sys/cddl/zfs/tests/snapshot/rollback_003_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/rollback_003_pos.ksh new file mode 100644 index 00000000000..f1d3128f41f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/rollback_003_pos.ksh @@ -0,0 +1,114 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)rollback_003_pos.ksh 1.6 09/08/06 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + + +################################################################################ +# +# __stc_assertion_start +# +# ID: rollback_003_pos +# +# DESCRIPTION: +# Verify that rollbacks succeed when there are nested file systems. +# +# STRATEGY: +# 1) Snapshot an empty file system and rollback +# 2) Create a file in the file system +# 3) Rollback the file system to empty +# 4) Create a nested file system with the same name as the file created in (2) +# 5) Verify a rollback succeeds +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-01-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset snap="" + typeset fs="" + + log_must $ZFS mount -a + + for snap in "$SNAPPOOL.1" "$SNAPPOOL" + do + snapexists $snap + [[ $? -eq 0 ]] && \ + log_must $ZFS destroy $snap + done + + for fs in "$TESTPOOL/$TESTFILE/$TESTFILE.1" "$TESTPOOL/$TESTFILE" + do + datasetexists $fs + [[ $? -eq 0 ]] && \ + log_must $ZFS destroy -r $fs + done + + [[ -e /$TESTPOOL ]] && \ + log_must $RM -rf $TESTPOOL/* +} + +log_assert "Verify rollback succeeds when there are nested file systems." + +log_onexit cleanup + +log_must $ZFS snapshot $SNAPPOOL +log_must $ZFS rollback $SNAPPOOL +log_mustnot $ZFS snapshot $SNAPPOOL + +log_must $TOUCH /$TESTPOOL/$TESTFILE + +log_must $ZFS rollback $SNAPPOOL +log_must $ZFS create $TESTPOOL/$TESTFILE + +log_must $ZFS rollback $SNAPPOOL + +log_note "Verify rollback of multiple nested file systems succeeds." +log_must $ZFS snapshot $TESTPOOL/$TESTFILE@$TESTSNAP +log_must $ZFS snapshot $SNAPPOOL.1 + +unmount_all_safe > /dev/null 2>&1 +log_must $ZFS mount -a + +log_must $TOUCH /$TESTPOOL/$TESTFILE/$TESTFILE.1 + +log_must $ZFS rollback $SNAPPOOL.1 + +log_pass "Rollbacks succeed when nested file systems are present." diff --git a/tests/sys/cddl/zfs/tests/snapshot/setup.ksh b/tests/sys/cddl/zfs/tests/snapshot/setup.ksh new file mode 100644 index 00000000000..eb1c316dfae --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_container_volume_setup ${DISK} diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot.cfg b/tests/sys/cddl/zfs/tests/snapshot/snapshot.cfg new file mode 100644 index 00000000000..492c28ee3ed --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot.cfg @@ -0,0 +1,62 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot.cfg 1.4 08/08/15 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +export ZFSROOT= +export TESTVOL=testvol${TESTCASE_ID} +export TESTVOL1=testvol1.${TESTCASE_ID} +export TESTSNAP=testsnap${TESTCASE_ID} +export TESTSNAP1=testsnap1.${TESTCASE_ID} +export TESTCLONE=testclone${TESTCASE_ID} +export TESTCLONE1=testclone1${TESTCASE_ID} +export TESTCLONE2=testclone2${TESTCASE_ID} +export TESTFILE=testfile${TESTCASE_ID} +export TESTFILE1=testfile1${TESTCASE_ID} +export SNAPROOT="$(get_snapdir_name)" + +export SNAPPOOL="$TESTPOOL@$TESTSNAP" +export SNAPFS="$TESTPOOL/$TESTFS@$TESTSNAP" +export SNAPFS1="$TESTPOOL/$TESTVOL@$TESTSNAP" +export SNAPFS2="$TESTPOOL1/$TESTFS@$TESTSNAP" +export SNAPCTR="$TESTPOOL/$TESTCTR/$TESTFS1@$TESTSNAP" +export SNAPDIR="$TESTDIR/$SNAPROOT/$TESTSNAP" +export SNAPDIR1="$TESTDIR1/$SNAPROOT/$TESTSNAP" +export SNAPDIR2="$TESTDIR2/$SNAPROOT/$TESTSNAP" +export SNAPDIR3="$ZFSROOT/$SNAPFS1" + +export VOLSIZE=1gb +export BLOCKSZ=8192 +export NUM_WRITES=20 +export DATA=0 +export LIMIT=524288 # tolerance measured in bytes, 512K +export FSQUOTA=500m +export FILESIZE=400m +export FILESIZE1=200m diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_001_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_001_pos.ksh new file mode 100644 index 00000000000..73499c4b508 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_001_pos.ksh @@ -0,0 +1,103 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_001_pos +# +# DESCRIPTION: +# A zfs file system snapshot is identical to +# the originally snapshot'd file system, after the file +# system has been changed. Uses 'sum -r'. +# +# STRATEGY: +# 1. Create a file in the zfs file system +# 2. Checksum the file for later comparison +# 3. Create a snapshot of the dataset +# 4. Append to the original file +# 5. Verify the snapshot and file agree +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +function cleanup +{ + snapexists $SNAPFS + if [[ $? -eq 0 ]]; then + log_must $ZFS destroy $SNAPFS + fi + + if [[ -e $SNAPDIR ]]; then + log_must $RM -rf $SNAPDIR > /dev/null 2>&1 + fi + + if [[ -e $TESTDIR ]]; then + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + fi +} + +log_assert "Verify a file system snapshot is identical to original." + +log_onexit cleanup + +log_note "Create a file in the zfs filesystem..." +log_must $FILE_WRITE -o create -f $TESTDIR/$TESTFILE -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA + +log_note "Sum the file, save for later comparison..." +FILE_SUM=`$SUM -r $TESTDIR/$TESTFILE | $AWK '{ print $1 }'` +log_note "FILE_SUM = $FILE_SUM" + +log_note "Create a snapshot and mount it..." +log_must $ZFS snapshot $SNAPFS + +log_note "Append to the original file..." +log_must $FILE_WRITE -o append -f $TESTDIR/$TESTFILE -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA + +SNAP_FILE_SUM=`$SUM -r $SNAPDIR/$TESTFILE | $AWK '{ print $1 }'` +if [[ $SNAP_FILE_SUM -ne $FILE_SUM ]]; then + log_fail "Sums do not match, aborting!! ($SNAP_FILE_SUM != $FILE_SUM)" +fi + +log_pass "Both Sums match. ($SNAP_FILE_SUM == $FILE_SUM)" diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_002_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_002_pos.ksh new file mode 100644 index 00000000000..d3c6476facb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_002_pos.ksh @@ -0,0 +1,139 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_002_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_002_pos +# +# DESCRIPTION: +# An archive of a zfs file system and an archive of its snapshot +# is identical even though the original file system has +# changed sinced the snapshot was taken. +# +# STRATEGY: +# 1) Create files in all of the zfs file systems +# 2) Create a tarball of the file system +# 3) Create a snapshot of the dataset +# 4) Remove all the files in the original file system +# 5) Create a tarball of the snapshot +# 6) Extract each tarball and compare directory structures +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if [[ -d $CWD ]]; then + cd $CWD || log_fail "Could not cd $CWD" + fi + + snapexists $SNAPFS + if [[ $? -eq 0 ]]; then + log_must $ZFS destroy $SNAPFS + fi + + if [[ -e $SNAPDIR ]]; then + log_must $RM -rf $SNAPDIR > /dev/null 2>&1 + fi + + if [[ -e $TESTDIR ]]; then + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + fi + + if [[ -e $TMPDIR/zfs_snapshot2.${TESTCASE_ID} ]]; then + log_must $RM -rf $TMPDIR/zfs_snapshot2.${TESTCASE_ID} > /dev/null 2>&1 + fi + +} + +log_assert "Verify an archive of a file system is identical to " \ + "an archive of its snapshot." + +log_onexit cleanup + +typeset -i COUNT=21 +typeset OP=create + +[[ -n $TESTDIR ]] && \ + $RM -rf $TESTDIR/* > /dev/null 2>&1 + +log_note "Create files in the zfs filesystem..." +populate_dir $TESTDIR/file $COUNT $NUM_WRITES $BLOCKSZ $DATA + +log_note "Create a tarball from $TESTDIR contents..." +CWD=$PWD +cd $TESTDIR || log_fail "Could not cd $TESTDIR" +log_must $TAR cf $TESTDIR/tarball.original.tar file* +cd $CWD || log_fail "Could not cd $CWD" + +log_note "Create a snapshot and mount it..." +log_must $ZFS snapshot $SNAPFS + +log_note "Remove all of the original files..." +log_must $RM -f $TESTDIR/file* > /dev/null 2>&1 + +log_note "Create tarball of snapshot..." +CWD=$PWD +cd $SNAPDIR || log_fail "Could not cd $SNAPDIR" +log_must $TAR cf $TESTDIR/tarball.snapshot.tar file* +cd $CWD || log_fail "Could not cd $CWD" + +log_must $MKDIR $TESTDIR/original +log_must $MKDIR $TESTDIR/snapshot + +CWD=$PWD +cd $TESTDIR/original || log_fail "Could not cd $TESTDIR/original" +log_must $TAR xf $TESTDIR/tarball.original.tar + +cd $TESTDIR/snapshot || log_fail "Could not cd $TESTDIR/snapshot" +log_must $TAR xf $TESTDIR/tarball.snapshot.tar + +cd $CWD || log_fail "Could not cd $CWD" + +$DIRCMP $TESTDIR/original $TESTDIR/snapshot > $TMPDIR/zfs_snapshot2.${TESTCASE_ID} +$GREP different $TMPDIR/zfs_snapshot2.${TESTCASE_ID} >/dev/null 2>&1 +if [[ $? -ne 1 ]]; then + log_fail "Directory structures differ." +fi + +log_pass "Directory structures match." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_003_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_003_pos.ksh new file mode 100644 index 00000000000..7121ede50cc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_003_pos.ksh @@ -0,0 +1,108 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_003_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_003_pos +# +# DESCRIPTION: +# Verify that many snapshots can be made on a zfs file system. +# +# STRATEGY: +# 1) Create a files in the zfs file system +# 2) Create a snapshot of the dataset +# 3) Remove all the files from the original file system +# 4) Verify consistency of each snapshot directory +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset -i i=1 + while [ $i -lt $COUNT ]; do + snapexists $SNAPFS.$i + if [[ $? -eq 0 ]]; then + log_must $ZFS destroy $SNAPFS.$i + fi + + if [[ -e $SNAPDIR.$i ]]; then + log_must $RM -rf $SNAPDIR.$i > /dev/null 2>&1 + fi + + (( i = i + 1 )) + done + + if [[ -e $TESTDIR ]]; then + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + fi +} + +log_assert "Verify many snapshots of a file system can be taken." + +log_onexit cleanup + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +typeset -i COUNT=10 + +log_note "Create some files in the $TESTDIR directory..." +populate_dir $TESTDIR/file $COUNT $NUM_WRITES $BLOCKSZ ITER $SNAPFS + +log_note "Remove all of the original files" +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/file* > /dev/null 2>&1 + +i=1 +while [[ $i -lt $COUNT ]]; do + FILECOUNT=`$LS $SNAPDIR.$i/file* | wc -l` + typeset j=1 + while [ $j -lt $FILECOUNT ]; do + log_must $FILE_CHECK $SNAPDIR.$i/file.$j $j + (( j = j + 1 )) + done + (( i = i + 1 )) +done + +log_pass "All files are consistent" diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_004_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_004_pos.ksh new file mode 100644 index 00000000000..020fcdd70cb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_004_pos.ksh @@ -0,0 +1,96 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_004_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_004_pos +# +# DESCRIPTION: +# Create a null snapshot i.e. a snapshot created before file system +# activity is empty. +# +# STRATEGY: +# 1. Empty a file system +# 2. Take a snapshot of the empty file system. +# 3. Populate the file system +# 4. Verify the snapshot is still empty +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + snapexists $SNAPFS + [[ $? -eq 0 ]] && \ + log_must $ZFS destroy $SNAPFS + + [[ -e $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 +} + +log_assert "Verify that a snapshot of an empty file system remains empty." + +log_onexit cleanup + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +log_must $ZFS snapshot $SNAPFS +FILE_COUNT=`$LS -Al $SNAPDIR | $GREP -v "total 0" | wc -l` +if [[ $FILE_COUNT -ne 0 ]]; then + $LS $SNAPDIR + log_fail "BEFORE: $SNAPDIR contains $FILE_COUNT files(s)." +fi + +typeset -i COUNT=10 + +log_note "Populate the $TESTDIR directory" +populate_dir $TESTDIR/file $COUNT $NUM_WRITES $BLOCKSZ ITER + +FILE_COUNT=`$LS -Al $SNAPDIR | $GREP -v "total 0" | wc -l` +if [[ $FILE_COUNT -ne 0 ]]; then + $LS $SNAPDIR + log_fail "AFTER: $SNAPDIR contains $FILE_COUNT files(s)." +fi + +log_pass "The NULL snapshot remains empty." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_005_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_005_pos.ksh new file mode 100644 index 00000000000..bdfbac815d4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_005_pos.ksh @@ -0,0 +1,102 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_005_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_005_pos +# +# DESCRIPTION: +# to the originally snapshot'd file system, after the file +# system has been changed. Uses 'sum -r'. +# +# STRATEGY: +# 1) Create a file in the zfs dataset +# 2) Sum the file for later comparison +# 3) Create a snapshot of the dataset +# 4) Append to the original file +# 5) Verify both checksums match +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +function cleanup +{ + snapexists $SNAPCTR + if [[ $? -eq 0 ]]; then + log_must $ZFS destroy $SNAPCTR + fi + + if [[ -e $SNAPDIR1 ]]; then + log_must $RM -rf $SNAPDIR1 > /dev/null 2>&1 + fi + + if [[ -e $TESTDIR ]]; then + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + fi +} + +log_assert "Verify that a snapshot of a dataset is identical to " \ + "the original dataset." +log_onexit cleanup + +log_note "Create a file in the zfs filesystem..." +log_must $FILE_WRITE -o create -f $TESTDIR1/$TESTFILE -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA + +log_note "Sum the file, save for later comparison..." +FILE_SUM=`$SUM -r $TESTDIR1/$TESTFILE | $AWK '{ print $1 }'` +log_note "FILE_SUM = $FILE_SUM" + +log_note "Create a snapshot and mount it..." +log_must $ZFS snapshot $SNAPCTR + +log_note "Append to the original file..." +log_must $FILE_WRITE -o append -f $TESTDIR1/$TESTFILE -b $BLOCKSZ \ + -c $NUM_WRITES -d $DATA + +SNAP_FILE_SUM=`$SUM -r $SNAPDIR1/$TESTFILE | $AWK '{ print $1 }'` +if [[ $SNAP_FILE_SUM -ne $FILE_SUM ]]; then + log_fail "Sums do not match, aborting!! ($SNAP_FILE_SUM != $FILE_SUM)" +fi + +log_pass "Both Sums match. ($SNAP_FILE_SUM == $FILE_SUM)" diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_006_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_006_pos.ksh new file mode 100644 index 00000000000..ed5d265cbf3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_006_pos.ksh @@ -0,0 +1,137 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_006_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_006_pos +# +# DESCRIPTION: +# An archive of a zfs dataset and an archive of its snapshot +# changed sinced the snapshot was taken. +# +# STRATEGY: +# 1) Create some files in a ZFS dataset +# 2) Create a tarball of the dataset +# 3) Create a snapshot of the dataset +# 4) Remove all the files in the original dataset +# 5) Create a tarball of the snapshot +# 6) Extract each tarball and compare directory structures +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if [[ -d $CWD ]]; then + cd $CWD || log_fail "Could not cd $CWD" + fi + + snapexists $SNAPCTR + if [[ $? -eq 0 ]]; then + log_must $ZFS destroy $SNAPCTR + fi + + if [[ -e $SNAPDIR1 ]]; then + log_must $RM -rf $SNAPDIR1 > /dev/null 2>&1 + fi + + if [[ -e $TESTDIR1 ]]; then + log_must $RM -rf $TESTDIR1/* > /dev/null 2>&1 + fi + + if [[ -e $TMPDIR/zfs_snapshot2.${TESTCASE_ID} ]]; then + log_must $RM -rf $TMPDIR/zfs_snapshot2.${TESTCASE_ID} > /dev/null 2>&1 + fi + +} + +log_assert "Verify that an archive of a dataset is identical to " \ + "an archive of the dataset's snapshot." + +log_onexit cleanup + +typeset -i COUNT=21 +typeset OP=create + +[[ -n $TESTDIR1 ]] && $RM -rf $TESTDIR1/* > /dev/null 2>&1 + +log_note "Create files in the zfs dataset ..." +populate_dir $TESTDIR1/file $COUNT $NUM_WRITES $BLOCKSZ $DATA + +log_note "Create a tarball from $TESTDIR1 contents..." +CWD=$PWD +cd $TESTDIR1 || log_fail "Could not cd $TESTDIR1" +log_must $TAR cf $TESTDIR1/tarball.original.tar file* +cd $CWD || log_fail "Could not cd $CWD" + +log_note "Create a snapshot and mount it..." +log_must $ZFS snapshot $SNAPCTR + +log_note "Remove all of the original files..." +log_must $RM -f $TESTDIR1/file* > /dev/null 2>&1 + +log_note "Create tarball of snapshot..." +CWD=$PWD +cd $SNAPDIR1 || log_fail "Could not cd $SNAPDIR1" +log_must $TAR cf $TESTDIR1/tarball.snapshot.tar file* +cd $CWD || log_fail "Could not cd $CWD" + +log_must $MKDIR $TESTDIR1/original +log_must $MKDIR $TESTDIR1/snapshot + +CWD=$PWD +cd $TESTDIR1/original || log_fail "Could not cd $TESTDIR1/original" +log_must $TAR xf $TESTDIR1/tarball.original.tar + +cd $TESTDIR1/snapshot || log_fail "Could not cd $TESTDIR1/snapshot" +log_must $TAR xf $TESTDIR1/tarball.snapshot.tar + +cd $CWD || log_fail "Could not cd $CWD" + +$DIRCMP $TESTDIR1/original $TESTDIR1/snapshot > $TMPDIR/zfs_snapshot2.${TESTCASE_ID} +$GREP different $TMPDIR/zfs_snapshot2.${TESTCASE_ID} >/dev/null 2>&1 +if [[ $? -ne 1 ]]; then + log_fail "Directory structures differ." +fi + +log_pass "Directory structures match." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_007_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_007_pos.ksh new file mode 100644 index 00000000000..27756fad365 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_007_pos.ksh @@ -0,0 +1,112 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_007_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_007_pos +# +# DESCRIPTION: +# Verify that many snapshots can be made on a zfs dataset. +# +# STRATEGY: +# 1) Create a file in the zfs dataset +# 2) Create a snapshot of the dataset +# 3) Remove all the files from the original dataset +# 4) For each snapshot directory verify consistency +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset -i i=1 + while [ $i -lt $COUNT ]; do + snapexists $SNAPCTR.$i + if [[ $? -eq 0 ]]; then + log_must $ZFS destroy $SNAPCTR.$i + fi + + if [[ -e $SNAPDIR.$i ]]; then + log_must $RM -rf $SNAPDIR1.$i > /dev/null 2>&1 + fi + + (( i = i + 1 )) + done + + if [[ -e $SNAPDIR1 ]]; then + log_must $RM -rf $SNAPDIR1 > /dev/null 2>&1 + fi + + if [[ -e $TESTDIR ]]; then + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + fi +} + +log_assert "Verify that many snapshots can be made on a zfs dataset." + +log_onexit cleanup + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +typeset -i COUNT=10 + +log_note "Create some files in the $TESTDIR directory..." +populate_dir $TESTDIR1/file $COUNT $NUM_WRITES $BLOCKSZ ITER $SNAPCTR + +log_note "Remove all of the original files" +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR1/file* > /dev/null 2>&1 + +i=1 +while [[ $i -lt $COUNT ]]; do + FILECOUNT=`$LS $SNAPDIR1.$i/file* | wc -l` + typeset j=1 + while [ $j -lt $FILECOUNT ]; do + log_must $FILE_CHECK $SNAPDIR1.$i/file.$j $j + (( j = j + 1 )) + done + (( i = i + 1 )) +done + +log_pass "All files are consistent" diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_008_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_008_pos.ksh new file mode 100644 index 00000000000..d8610fabba4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_008_pos.ksh @@ -0,0 +1,105 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_008_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_008_pos +# +# DESCRIPTION: +# Verify that destroying snapshots returns space to the pool. +# +# STRATEGY: +# 1. Create a file system and populate it while snapshotting. +# 2. Destroy the snapshots and remove the files. +# 3. Verify the space returns to the pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-09-29) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset -i i=1 + while [[ $i -lt $COUNT ]]; do + snapexists $SNAPFS.$i + [[ $? -eq 0 ]] && \ + log_must $ZFS destroy $SNAPFS.$i + + (( i = i + 1 )) + done + + [[ -e $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 +} + +log_assert "Verify that destroying snapshots returns space to the pool." + +log_onexit cleanup + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +typeset -i COUNT=10 + +orig_size=`get_prop available $TESTPOOL` + +log_note "Populate the $TESTDIR directory" +populate_dir $TESTDIR/file $COUNT $NUM_WRITES $BLOCKSZ ITER $SNAPFS + +typeset -i i=1 +while [[ $i -lt $COUNT ]]; do + log_must rm -f $TESTDIR/file.$i > /dev/null 2>&1 + log_must $ZFS destroy $SNAPFS.$i + + (( i = i + 1 )) +done + +new_size=`get_prop available $TESTPOOL` + +typeset -i tolerance=0 + +(( tolerance = new_size - orig_size)) +if (( tolerance > LIMIT )); then + log_fail "Space not freed. ($orig_size != $new_size)" +fi + +log_pass "After destroying snapshots, the space is returned to the pool." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_009_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_009_pos.ksh new file mode 100644 index 00000000000..976a3e7f93b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_009_pos.ksh @@ -0,0 +1,131 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_009_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_009_pos +# +# DESCRIPTION: +# Verify 'snapshot -r' and 'destroy -r' can correctly create and destroy +# snapshot tree respectively. +# +# STRATEGY: +# 1. Use the snapshot -r to create snapshot for top level pool +# 2. Verify the children snapshots are created correctly. +# 3. Use destroy -r to destroy the top level snapshot +# 4. Verify that all children snapshots are destroyed too. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset ds + typeset snap + + for ds in $ctr/$TESTVOL1 $ctr/$TESTCLONE; do + datasetexists $ds && \ + log_must $ZFS destroy -f $ds + done + + for snap in $ctr/$TESTFS1@$TESTSNAP1 \ + $snappool $snapvol $snapctr $snapctrvol \ + $snapctrclone $snapctrfs + do + snapexists $snap && \ + log_must $ZFS destroy -rf $snap + done + +} + +log_assert "Verify snapshot -r can correctly create a snapshot tree." +log_onexit cleanup + +ctr=$TESTPOOL/$TESTCTR +ctrfs=$ctr/$TESTFS1 +ctrclone=$ctr/$TESTCLONE +ctrvol=$ctr/$TESTVOL1 +snappool=$SNAPPOOL +snapfs=$SNAPFS +snapctr=$ctr@$TESTSNAP +snapvol=$SNAPFS1 +snapctrvol=$ctrvol@$TESTSNAP +snapctrclone=$ctrclone@$TESTSNAP +snapctrfs=$SNAPCTR + +#preparation for testing +log_must $ZFS snapshot $ctrfs@$TESTSNAP1 +log_must $ZFS clone $ctrfs@$TESTSNAP1 $ctrclone +if is_global_zone; then + log_must $ZFS create -V $VOLSIZE $ctrvol +else + log_must $ZFS create $ctrvol +fi + +log_must $ZFS snapshot -r $snappool + +#verify the snapshot -r results +for snap in $snappool $snapfs $snapvol $snapctr $snapctrvol \ + $snapctrclone $snapctrfs +do + ! snapexists $snap && \ + log_fail "The snapshot $snap is not created via -r option." +done + +log_note "Verify that destroy -r can destroy the snapshot tree." + +log_must $ZFS destroy -r $snappool +for snap in $snappool $snapfs $snapvol $snapctr $snapctrvol \ + $snapctrclone $snapctrfs +do + snapexists $snap && \ + log_fail "The snapshot $snap is not destroyed correctly." +done + +log_note "Verify that the snapshot with different name should \ + be not destroyed." +! snapexists $ctrfs@$TESTSNAP1 && \ + log_fail "destroy -r incorrectly destroys the snapshot \ + $ctrfs@$TESTSNAP1." + +log_pass "snapshot|destroy -r with snapshot tree works as expected." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_010_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_010_pos.ksh new file mode 100644 index 00000000000..84a3552586d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_010_pos.ksh @@ -0,0 +1,113 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_010_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_010_pos +# +# DESCRIPTION: +# Verify 'destroy -r' can correctly destroy a snapshot tree at any point. +# +# STRATEGY: +# 1. Use the snapshot -r to create snapshot for top level pool +# 2. Select a middle point of the snapshot tree, use destroy -r to destroy all +# snapshots beneath the point. +# 3. Verify the destroy results. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset snap + + datasetexists $ctrvol && \ + log_must $ZFS destroy -f $ctrvol + + for snap in $ctrfs@$TESTSNAP1 \ + $snappool $snapvol $snapctr $snapctrvol \ + $snapctrclone $snapctrfs + do + snapexists $snap && \ + log_must $ZFS destroy -rf $snap + done + +} + +log_assert "Verify 'destroy -r' can correctly destroy a snapshot subtree at any point." +log_onexit cleanup + +ctr=$TESTPOOL/$TESTCTR +ctrfs=$ctr/$TESTFS1 +ctrvol=$ctr/$TESTVOL1 +snappool=$SNAPPOOL +snapfs=$SNAPFS +snapctr=$ctr@$TESTSNAP +snapvol=$SNAPFS1 +snapctrvol=$ctr/$TESTVOL1@$TESTSNAP +snapctrclone=$ctr/$TESTCLONE@$TESTSNAP +snapctrfs=$SNAPCTR + +#preparation for testing +log_must $ZFS snapshot $ctrfs@$TESTSNAP1 +if is_global_zone; then + log_must $ZFS create -V $VOLSIZE $ctrvol +else + log_must $ZFS create $ctrvol +fi + +log_must $ZFS snapshot -r $snappool + +#select the $TESTCTR as destroy point, $TESTCTR is a child of $TESTPOOL +log_must $ZFS destroy -r $snapctr +for snap in $snapctr $snapctrvol $snapctrclone $snapctrfs; do + snapexists $snap && \ + log_fail "The snapshot $snap is not destroyed correctly." +done + +for snap in $snappool $snapfs $snapvol $ctrfs@$TESTSNAP1;do + ! snapexists $snap && \ + log_fail "The snapshot $snap should be not destroyed." +done + +log_pass "'destroy -r' destroys snapshot subtree as expected." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_011_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_011_pos.ksh new file mode 100644 index 00000000000..f79c7110a00 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_011_pos.ksh @@ -0,0 +1,114 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_011_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_011_pos +# +# DESCRIPTION: +# use 'snapshot -r' to create a snapshot tree, add some files to one child +# filesystem, rollback the child filesystem snapshot, verify that the child +# filesystem gets back to the status while taking the snapshot. +# +# STRATEGY: +# 1. Add some files to a target child filesystem +# 2. snapshot -r the parent filesystem +# 3. Add some other files to the target child filesystem +# 4. rollback the child filesystem snapshot +# 5. verify that the child filesystem get back to the status while being +# snapshot'd +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + snapexists $SNAPPOOL && \ + log_must $ZFS destroy -r $SNAPPOOL + + [[ -e $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 +} + +log_assert "Verify that rollback to a snapshot created by snapshot -r succeeds." +log_onexit cleanup + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +typeset -i COUNT=10 + +log_note "Populate the $TESTDIR directory (prior to snapshot)" +populate_dir $TESTDIR/before_file $COUNT $NUM_WRITES $BLOCKSZ ITER + +log_must $ZFS snapshot -r $SNAPPOOL + +FILE_COUNT=`$LS -Al $SNAPDIR | $GREP -v "total" | wc -l` +if (( FILE_COUNT != COUNT )); then + $LS -Al $SNAPDIR + log_fail "AFTER: $SNAPFS contains $FILE_COUNT files(s)." +fi + +log_note "Populate the $TESTDIR directory (post snapshot)" +typeset -i i=0 +populate_dir $TESTDIR/after_file $COUNT $NUM_WRITES $BLOCKSZ ITER + +# +# Now rollback to latest snapshot +# +log_must $ZFS rollback $SNAPFS + +FILE_COUNT=`$LS -Al $TESTDIR/after* 2> /dev/null | $GREP -v "total" | wc -l` +if (( FILE_COUNT != 0 )); then + $LS -Al $TESTDIR + log_fail "$TESTDIR contains $FILE_COUNT after* files(s)." +fi + +FILE_COUNT=`$LS -Al $TESTDIR/before* 2> /dev/null \ + | $GREP -v "total" | wc -l` +if (( FILE_COUNT != $COUNT )); then + $LS -Al $TESTDIR + log_fail "$TESTDIR contains $FILE_COUNT before* files(s)." +fi + +log_pass "Rollback with child snapshot works as expected." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_012_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_012_pos.ksh new file mode 100644 index 00000000000..3d7f12cb051 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_012_pos.ksh @@ -0,0 +1,116 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_012_pos.ksh 1.3 08/05/14 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_012_pos +# +# DESCRIPTION: +# Verify 'snapshot -r' can create snapshot for promoted clone, and vice +# versa, a clone filesystem from the snapshot created by 'snapshot -r' +# can be correctly promoted. +# +# STRATEGY: +# 1. Create a dataset tree +# 2. snapshot a filesystem and clone the snapshot +# 3. promote the clone +# 4. snapshot -r the dataset tree +# 5. verify that the snapshot of cloned filesystem is created correctly +# 6. clone a snapshot from the snapshot tree +# 7. promote the clone +# 8. verify that the clone is promoted correctly. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + if datasetexists $clone1; then + log_must $ZFS promote $ctrfs + log_must $ZFS destroy $clone1 + fi + + snapexists $snapctr && \ + log_must $ZFS destroy -r $snapctr + + if snapexists $clone@$TESTSNAP1; then + log_must $ZFS promote $ctrfs + log_must $ZFS destroy -rR $ctrfs@$TESTSNAP1 + fi +} + +log_assert "Verify that 'snapshot -r' can work with 'zfs promote'." +log_onexit cleanup + +ctr=$TESTPOOL/$TESTCTR +ctrfs=$ctr/$TESTFS1 +clone=$ctr/$TESTCLONE +clone1=$ctr/$TESTCLONE1 +snappool=$SNAPPOOL +snapfs=$SNAPFS +snapctr=$ctr@$TESTSNAP +snapctrclone=$clone@$TESTSNAP +snapctrclone1=$clone1@$TESTSNAP +snapctrfs=$SNAPCTR + +#preparation for testing +log_must $ZFS snapshot $ctrfs@$TESTSNAP1 +log_must $ZFS clone $ctrfs@$TESTSNAP1 $clone +log_must $ZFS promote $clone + +log_must $ZFS snapshot -r $snapctr + +! snapexists $snapctrclone && \ + log_fail "'snapshot -r' fails to create $snapctrclone for $ctr/$TESTCLONE." + +log_must $ZFS clone $snapctrfs $clone1 +log_must $ZFS promote $clone1 + +#verify the origin value is correct. +orig_value=$(get_prop origin $ctrfs) +if ! snapexists $snapctrclone1 || [[ "$orig_value" != "$snapctrclone1" ]]; then + log_fail "'zfs promote' fails to promote $clone which is cloned from \ + $snapctrfs." +fi + +log_pass "'snapshot -r' can work with 'zfs promote' as expected." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_013_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_013_pos.ksh new file mode 100644 index 00000000000..e6165c4da89 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_013_pos.ksh @@ -0,0 +1,106 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_013_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_013_pos +# +# DESCRIPTION: +# verify that the snapshots created by 'snapshot -r' can be used for +# zfs send/recv +# +# STRATEGY: +# 1. create a dataset tree and populate a filesystem +# 2. snapshot -r the dataset tree +# 3. select one snapshot used for zfs send/recv +# 4. verify the data integrity after zfs send/recv +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-06-20) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + datasetexists $ctrfs && \ + $ZFS destroy -r $ctrfs + + snapexists $snappool && \ + log_must $ZFS destroy -r $snappool + + [[ -e $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 +} + +log_assert "Verify snapshots from 'snapshot -r' can be used for zfs send/recv" +log_onexit cleanup + +ctr=$TESTPOOL/$TESTCTR +ctrfs=$ctr/$TESTFS +snappool=$SNAPPOOL +snapfs=$SNAPFS +snapctr=$ctr@$TESTSNAP +snapctrfs=$ctrfs@$TESTSNAP +fsdir=/$ctrfs +snapdir=$fsdir/$(get_snapdir_name)/$TESTSNAP + +[[ -n $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR/* > /dev/null 2>&1 + +typeset -i COUNT=10 + +log_note "Populate the $TESTDIR directory (prior to snapshot)" +populate_dir $TESTDIR/file $COUNT $NUM_WRITES $BLOCKSZ ITER + +log_must $ZFS snapshot -r $snappool + +$ZFS send $snapfs | $ZFS receive $ctrfs >/dev/null 2>&1 +if ! datasetexists $ctrfs || ! snapexists $snapctrfs; then + log_fail "zfs send/receive fails with snapshot $snapfs." +fi + +for dir in $fsdir $snapdir; do + FILE_COUNT=`$LS -Al $dir | $GREP -v "total" | wc -l` + (( FILE_COUNT != COUNT )) && \ + log_fail "The data gets changed after zfs send/recv." +done + +log_pass "'zfs send/receive' works as expected with snapshots from 'snapshot -r'" diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_014_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_014_pos.ksh new file mode 100644 index 00000000000..5dd0f2f4145 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_014_pos.ksh @@ -0,0 +1,90 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_014_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_014_pos +# +# DESCRIPTION: +# verify that creating/destroying snapshots do things clean +# +# STRATEGY: +# 1. create a dataset and set a quota with 500m +# 2. create file of size 400m on the dataset +# 3. take a snapshot and destroy it +# 4. then create file to use all spaces in the dataset +# 5. verify removing the first file should succeed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + [[ -e $TESTDIR1 ]] && \ + log_must $RM -rf $TESTDIR1/* > /dev/null 2>&1 + + snapexists $SNAPCTR && \ + log_must $ZFS destroy $SNAPCTR + + datasetexists $TESTPOOL/$TESTCTR/$TESTFS1 && \ + log_must $ZFS set quota=none $TESTPOOL/$TESTCTR/$TESTFS1 + +} + +log_assert "Verify creating/destroying snapshots do things clean" +log_onexit cleanup + +log_must $ZFS set quota=$FSQUOTA $TESTPOOL/$TESTCTR/$TESTFS1 +log_must $MKFILE $FILESIZE $TESTDIR1/$TESTFILE + +log_must $ZFS snapshot $SNAPCTR +log_must $ZFS destroy $SNAPCTR + +log_note "Make the quota of filesystem is reached" +log_mustnot $MKFILE $FILESIZE1 $TESTDIR1/$TESTFILE1 + +log_note "Verify removing the first file should succeed after the snapshot is \ + removed" +log_must $RM $TESTDIR1/$TESTFILE + +log_pass "Verify creating/destroying snapshots do things clean" diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_015_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_015_pos.ksh new file mode 100644 index 00000000000..23a763beb8c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_015_pos.ksh @@ -0,0 +1,136 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_015_pos.ksh 1.5 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: snapshot_015_pos +# +# DESCRIPTION: +# Verify snapshot can be created or destroy via mkdir or rm +# in $(get_snapdir_name). +# +# STRATEGY: +# 1. Verify make directories only successfully in $(get_snapdir_name). +# 2. Verify snapshot can be created and destroy via mkdir and remove +# directories in $(get_snapdir_name). +# 3. Verify rollback to previous snapshot can succeed. +# 4. Verify remove directory in snapdir can destroy snapshot. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-17) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + typeset -i i=0 + while ((i < snap_cnt)); do + typeset snap=$fs@snap.$i + datasetexists $snap && log_must $ZFS destroy -f $snap + + ((i += 1)) + done +} + +$ZFS 2>&1 | $GREP "allow" > /dev/null +(($? != 0)) && log_unsupported + +log_assert "Verify snapshot can be created via mkdir in $(get_snapdir_name)." +log_onexit cleanup + +[[ $os_name == "FreeBSD" ]] && \ + log_uninitiated "Directory operations on the $(get_snapdir_name) directory are not yet supported in FreeBSD" + +fs=$TESTPOOL/$TESTFS +# Verify all the other directories are readonly. +mntpnt=$(get_prop mountpoint $fs) +snapdir=$mntpnt/.zfs +set -A ro_dirs "$snapdir" "$snapdir/snap" "$snapdir/snapshot" +for dir in ${ro_dirs[@]}; do + if [[ -d $dir ]]; then + log_mustnot $RM -rf $dir + log_mustnot $TOUCH $dir/testfile + else + log_mustnot $MKDIR $dir + fi +done + +# Verify snapshot can be created via mkdir in $(get_snapdir_name) +typeset -i snap_cnt=5 +typeset -i cnt=0 +while ((cnt < snap_cnt)); do + testfile=$mntpnt/testfile.$cnt + log_must $MKFILE 1M $testfile + log_must $MKDIR $mntpnt/$(get_snapdir_name)/snap.$cnt + if ! datasetexists $fs@snap.$cnt ; then + log_fail "ERROR: $fs@snap.$cnt should exists." + fi + + ((cnt += 1)) +done + +# Verify rollback to previous snapshot succeed. +((cnt = RANDOM % snap_cnt)) +log_must $ZFS rollback -r $fs@snap.$cnt + +typeset -i i=0 +while ((i < snap_cnt)); do + testfile=$mntpnt/testfile.$i + if ((i <= cnt)); then + if [[ ! -f $testfile ]]; then + log_fail "ERROR: $testfile should exists." + fi + else + if [[ -f $testfile ]]; then + log_fail "ERROR: $testfile should not exists." + fi + fi + + ((i += 1)) +done + +# Verify remove directory in snapdir can destroy snapshot. +log_must $RMDIR $mntpnt/$(get_snapdir_name)/snap.$cnt +log_mustnot datasetexists $fs@snap.$cnt + +log_pass "Verify snapshot can be created via mkdir in $(get_snapdir_name) passed." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_016_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_016_pos.ksh new file mode 100644 index 00000000000..96d97521592 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_016_pos.ksh @@ -0,0 +1,116 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_016_pos.ksh 1.2 08/11/03 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: snapshot_016_pos +# +# DESCRIPTION: +# Verify renamed snapshots via mv can be destroyed +# +# STRATEGY: +# 1. Create snapshot +# 2. Rename the snapshot via mv command +# 2. Verify destroying the renamed snapshot via 'zfs destroy' succeeds +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-01-26) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + datasetexists $SNAPFS && \ + log_must $ZFS destroy -Rf $SNAPFS + datasetexists $TESTPOOL/$TESTFS@snap_a && \ + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS@snap_a + datasetexists $TESTPOOL/$TESTCLONE@snap_a && \ + log_must $ZFS destroy -Rf $TESTPOOL/$TESTCLONE@snap_a + + datasetexists $TESTPOOL/$TESTCLONE && \ + log_must $ZFS destroy $TESTPOOL/$TESTCLONE + datasetexists $TESTPOOL/$TESTFS && \ + log_must $ZFS destroy $TESTPOOL/$TESTFS + + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "Verify renamed snapshots via mv can be destroyed." +log_onexit cleanup + +[[ $os_name == "FreeBSD" ]] && \ + log_uninitiated "Directory operations on the $(get_snapdir_name) directory are not yet supported in FreeBSD" + +# scenario 1 + +log_must $ZFS snapshot $SNAPFS +log_must $MV $TESTDIR/$SNAPROOT/$TESTSNAP $TESTDIR/$SNAPROOT/snap_a + +datasetexists $TESTPOOL/$TESTFS@snap_a || \ + log_fail "rename snapshot via mv in $(get_snapdir_name) fails." +log_must $ZFS destroy $TESTPOOL/$TESTFS@snap_a + +# scenario 2 + +log_must $ZFS snapshot $SNAPFS +log_must $ZFS clone $SNAPFS $TESTPOOL/$TESTCLONE +log_must $MV $TESTDIR/$SNAPROOT/$TESTSNAP $TESTDIR/$SNAPROOT/snap_a + +datasetexists $TESTPOOL/$TESTFS@snap_a || \ + log_fail "rename snapshot via mv in $(get_snapdir_name) fails." +log_must $ZFS promote $TESTPOOL/$TESTCLONE +# promote back to $TESTPOOL/$TESTFS for scenario 3 +log_must $ZFS promote $TESTPOOL/$TESTFS +log_must $ZFS destroy $TESTPOOL/$TESTCLONE +log_must $ZFS destroy $TESTPOOL/$TESTFS@snap_a + +# scenario 3 + +log_must $ZFS snapshot $SNAPFS +log_must $ZFS clone $SNAPFS $TESTPOOL/$TESTCLONE +log_must $ZFS rename $SNAPFS $TESTPOOL/$TESTFS@snap_a +log_must $ZFS promote $TESTPOOL/$TESTCLONE +log_must $ZFS destroy $TESTPOOL/$TESTFS +log_must $ZFS destroy $TESTPOOL/$TESTCLONE@snap_a + +log_pass "Verify renamed snapshots via mv can be destroyed." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_017_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_017_pos.ksh new file mode 100644 index 00000000000..9178ea071bc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_017_pos.ksh @@ -0,0 +1,213 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapshot_017_pos.ksh 1.1 08/08/15 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_017_pos +# +# DESCRIPTION: +# +# Directory structure of snapshots reflects filesystem structure. +# +# STRATEGY: +# +# This test makes sure that the directory structure of snapshots is +# a proper reflection of the filesystem the snapshot was taken of. +# +# 1. Create a simple directory structure of files and directories +# 2. Take a snapshot of the filesystem +# 3. Modify original filesystem +# 4. Walk down the snapshot directory structure verifying it +# checking with both absolute and relative paths +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-05-31) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + cd $SAVED_DIR + + if datasetexists $TESTPOOL/$TESTFS ; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + fi + + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +function verify_structure { + + # check absolute paths + DIR=$PWD + verify_file $DIR/file1 + verify_file $DIR/file2 + verify_file $DIR/dir1/file3 + verify_file $DIR/dir1/file4 + verify_file $DIR/dir1/dir2/file5 + verify_file $DIR/dir1/dir2/file6 + + verify_no_file $DIR/file99 + + # check relative paths + verify_file ./file1 + verify_file ./file2 + verify_file ./dir1/file3 + verify_file ./dir1/file4 + verify_file ./dir1/dir2/file5 + verify_file ./dir1/dir2/file6 + + cd dir1 + verify_file ../file1 + verify_file ../file2 + verify_file ./file3 + verify_file ./file4 + + verify_no_file ../file99 + + cd dir2 + verify_file ./file5 + verify_file ./file6 + verify_file ../file3 + verify_file ../file4 + verify_no_file ../file99 + + verify_file ../../file1 + verify_file ../../file2 + verify_no_file ../../file99 +} + +function verify_file { + if [ ! -e $1 ] + then + log_note "Working dir is $PWD" + log_fail "File $1 does not exist!" + fi +} + +function verify_no_file { + if [ -e $1 ] + then + log_note "Working dir is $PWD" + log_fail "File $1 exists when it should not!" + fi +} + +function verify_dir { + if [ ! -d $1 ] + then + log_note "Working dir is $PWD" + log_fail "Directory $1 does not exist!" + fi +} + +log_assert "Directory structure of snapshots reflects filesystem structure." +log_onexit cleanup + +SAVED_DIR=$PWD + +# +# Create a directory structure with the following files +# +# ./file1 +# ./file2 +# ./dir1/file3 +# ./dir1/file4 +# ./dir1/dir2/file5 +# ./dir1/dir2/file6 + +cd $TESTDIR +$TOUCH file1 +$TOUCH file2 +$MKDIR dir1 +cd dir1 +$TOUCH file3 +$TOUCH file4 +$MKDIR dir2 +cd dir2 +$TOUCH file5 +$TOUCH file6 + +# Now walk the directory structure verifying it +cd $TESTDIR +verify_structure + +# Take snapshots +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap_a +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap_b + +# Change the filesystem structure by renaming files in the original structure +# The snapshot file structure should not change +cd $TESTDIR +log_must $MV file2 file99 +cd dir1 +log_must $MV file4 file99 +cd dir2 +log_must $MV file6 file99 + +# verify the top level snapshot directories +verify_dir $TESTDIR/$(get_snapdir_name) +verify_dir $TESTDIR/$(get_snapdir_name) +verify_dir $TESTDIR/$(get_snapdir_name)/snap_a +verify_dir $TESTDIR/$(get_snapdir_name)/snap_b + +cd $TESTDIR/$(get_snapdir_name)/snap_a +verify_structure + +cd $TESTDIR/$(get_snapdir_name)/snap_b +verify_structure + +verify_dir $TESTDIR/$(get_snapdir_name) +cd $TESTDIR/$(get_snapdir_name) +verify_dir snap_a +verify_dir snap_b + +cd snap_a +verify_dir ../snap_a +verify_dir ../snap_b + +cd .. +verify_dir snap_a +verify_dir snap_b + +log_pass "Directory structure of snapshots reflects filesystem structure." diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_018_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_018_pos.ksh new file mode 100644 index 00000000000..f313d0c5c66 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_018_pos.ksh @@ -0,0 +1,95 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_018_pos +# +# DESCRIPTION: +# Snapshot directory supports ACL operations +# +# STRATEGY: +# 1. Create a dataset +# 2. Set the snapdir property to visible +# 3. Use getconf to verify that acls are supported +# 4. Use getfacl to verify that the acl can be read +# 5. Verify that the acl is correct +# 6. Verify that ls doesn't print any errors because acl_get_link fails +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2013-01-03) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +log_assert "Verify that the snapshot directory supports ACL operations" + +log_must dataset_setprop $TESTPOOL/$TESTFS "snapdir" "visible" + +function verify_dir # directory +{ + typeset DIR=$1 + # 3. Verify that ACLs are supported by the ctldir + log_must $GETCONF TRUSTEDBSD_ACL_EXTENDED $DIR + # 4. Verify that we can read ACLs + log_must $GETFACL $DIR + # 5. Verify that the ACLs are correct + typeset PROG_DIR=$STF_SUITE/tests/snapshot + typeset SUM=$($SHA1 -q $PROG_DIR/ctldir_acl.txt) + if [[ $( $GETFACL -q $DIR | $SHA1 -q ) != $SUM ]]; then + log_fail "ACL is incorrect" + fi + +} + +typeset -a dirlist +dirlist=( "$TESTDIR/.zfs" "$TESTDIR/.zfs/snapshot" ) +ctldir=".zfs" +for d in ${dirlist[@]}; do + verify_dir $d +done + +# 6. Check for errors with ls +LS_STDERR=$( $LS -la $TESTDIR/$ctldir 2>&1 > /dev/null) +LS_R_STDERR=$( $LS -lar $TESTDIR/$ctldir 2>&1 > /dev/null) +if [[ -n $LS_STDERR || -n $LS_R_STDERR ]]; then + log_fail "ls encountered errors" +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_019_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_019_pos.ksh new file mode 100644 index 00000000000..39eb0724141 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_019_pos.ksh @@ -0,0 +1,119 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: snapshot_019_pos +# +# DESCRIPTION: +# Accessing snapshots and unmounting them in parallel does not panic. +# FreeBSD PR kern/184677 +# +# STRATEGY: +# 1. Create a dataset +# 2. Set the snapdir property to visible +# 3. Do the following in parallel +# a. Repeatedly access the snapshot +# b. Repeatedly unmount the snapshot +# 4. Verify that the system does not panic +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2013-12-23) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +KILL_SWITCH=${PWD}/kill_switch + +function stat_snapshot +{ + while [ ! -f ${KILL_SWITCH} ]; do + cd $SNAPDIR # Exercise forced unmount + stat "$SNAPDIR" > /dev/null 2>&1 + done +} + +function ls_snapshot +{ + # Pre-generate the argument list. + ls_args="" + for ((num=0; $num<100; num=$num+1)); do + ls_args="$ls_args $SNAPDIR/.." + done + + while [ ! -f ${KILL_SWITCH} ]; do + ls $ls_args >/dev/null 2>&1 + done +} + +log_assert "Accessing snapshots and unmounting them in parallel does not panic" + +log_must dataset_setprop $TESTPOOL "snapdir" "visible" + +# Take snapshots +log_must $ZFS snapshot "$TESTPOOL/$TESTFS@$TESTSNAP" + +# Repeatedly access the snapshot directory +stat_snapshot & +stat_pid="$!" +ls_snapshot & +ls_pid="$!" + +# Repeatedly unmount the snapshot directory +for ((i=0; $i<100; i=$i+1)); do + umount "$SNAPDIR" >/dev/null 2>&1 + log_note "$i non-forced done" + # Sleep just long enough for the other "threads" to remount. + sleep 0.1 + umount -f "$SNAPDIR" >/dev/null 2>&1 + log_note "$i forced done" + sleep 0.1 +done + +# Kill the other "threads" and wait for them to die. +touch $KILL_SWITCH +log_note "Waiting for all child processes to die..." +wait + +# Test that no reference leaks occurred and we can cleanup without forcing. +log_must $ZFS unmount $TESTPOOL/$TESTFS +log_must $ZFS destroy -r $TESTPOOL/$TESTFS + +# If we get here, we managed to not panic, deadlock, or leak references. +log_pass diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_020_pos.ksh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_020_pos.ksh new file mode 100644 index 00000000000..bee30b1a13d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_020_pos.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2014 Spectra Logic Corporation +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: snapshot_020_pos +# +# DESCRIPTION: +# Verify that snapshots can be mounted in the ctldir, then renamed, then +# destroyed. The original bug that this regresses was that the rename +# command failed to unmount the snapshot from its old location, leaving +# the user unable to either mount it or destroy it. +# +# STRATEGY: +# 1. Create snapshot +# 2. Access the snapshot through the ctldir to automount it +# 3. Rename the snapshot +# 4. Destroy the snapshot +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2014-06-02) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + datasetexists $SNAPFS && \ + log_must $ZFS destroy -Rf $SNAPFS + datasetexists $TESTPOOL/$TESTFS@snap_a && \ + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS@snap_a + datasetexists $TESTPOOL/$TESTCLONE@snap_a && \ + log_must $ZFS destroy -Rf $TESTPOOL/$TESTCLONE@snap_a + + datasetexists $TESTPOOL/$TESTCLONE && \ + log_must $ZFS destroy $TESTPOOL/$TESTCLONE + datasetexists $TESTPOOL/$TESTFS && \ + log_must $ZFS destroy $TESTPOOL/$TESTFS + + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +log_assert "Verify that mounted snapshots can be renamed and destroyed" +log_onexit cleanup + +log_must $ZFS set snapdir=visible $TESTPOOL/$TESTFS +log_must $ZFS snapshot $SNAPFS +log_must stat $TESTDIR/$SNAPROOT/$TESTSNAP +log_must $ZFS rename $SNAPFS $TESTPOOL/$TESTFS@$TESTSNAP1 +log_must stat $TESTDIR/$SNAPROOT/$TESTSNAP1 +log_must $ZFS destroy $TESTPOOL/$TESTFS@$TESTSNAP1 + +log_pass diff --git a/tests/sys/cddl/zfs/tests/snapshot/snapshot_test.sh b/tests/sys/cddl/zfs/tests/snapshot/snapshot_test.sh new file mode 100755 index 00000000000..2f37a61a2bc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapshot/snapshot_test.sh @@ -0,0 +1,634 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case clone_001_pos cleanup +clone_001_pos_head() +{ + atf_set "descr" "Verify a cloned file system is writable." + atf_set "require.progs" zfs +} +clone_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + verify_zvol_recursive + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/clone_001_pos.ksh || atf_fail "Testcase failed" +} +clone_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rollback_001_pos cleanup +rollback_001_pos_head() +{ + atf_set "descr" "Verify that a rollback to a previous snapshot succeeds." + atf_set "require.progs" zfs +} +rollback_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rollback_001_pos.ksh || atf_fail "Testcase failed" +} +rollback_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rollback_002_pos cleanup +rollback_002_pos_head() +{ + atf_set "descr" "Verify rollback is with respect to latest snapshot." + atf_set "require.progs" zfs +} +rollback_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rollback_002_pos.ksh || atf_fail "Testcase failed" +} +rollback_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case rollback_003_pos cleanup +rollback_003_pos_head() +{ + atf_set "descr" "Verify rollback succeeds when there are nested file systems." + atf_set "require.progs" zfs +} +rollback_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/rollback_003_pos.ksh || atf_fail "Testcase failed" +} +rollback_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_001_pos cleanup +snapshot_001_pos_head() +{ + atf_set "descr" "Verify a file system snapshot is identical to original." + atf_set "require.progs" zfs sum +} +snapshot_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_001_pos.ksh || atf_fail "Testcase failed" +} +snapshot_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_002_pos cleanup +snapshot_002_pos_head() +{ + atf_set "descr" "Verify an archive of a file system is identical toan archive of its snapshot." + atf_set "require.progs" zfs +} +snapshot_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_002_pos.ksh || atf_fail "Testcase failed" +} +snapshot_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_003_pos cleanup +snapshot_003_pos_head() +{ + atf_set "descr" "Verify many snapshots of a file system can be taken." + atf_set "require.progs" zfs +} +snapshot_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_003_pos.ksh || atf_fail "Testcase failed" +} +snapshot_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_004_pos cleanup +snapshot_004_pos_head() +{ + atf_set "descr" "Verify that a snapshot of an empty file system remains empty." + atf_set "require.progs" zfs +} +snapshot_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_004_pos.ksh || atf_fail "Testcase failed" +} +snapshot_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_005_pos cleanup +snapshot_005_pos_head() +{ + atf_set "descr" "Verify that a snapshot of a dataset is identical tothe original dataset." + atf_set "require.progs" zfs sum +} +snapshot_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_005_pos.ksh || atf_fail "Testcase failed" +} +snapshot_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_006_pos cleanup +snapshot_006_pos_head() +{ + atf_set "descr" "Verify that an archive of a dataset is identical toan archive of the dataset's snapshot." + atf_set "require.progs" zfs +} +snapshot_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_006_pos.ksh || atf_fail "Testcase failed" +} +snapshot_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_007_pos cleanup +snapshot_007_pos_head() +{ + atf_set "descr" "Verify that many snapshots can be made on a zfs dataset." + atf_set "require.progs" zfs +} +snapshot_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_007_pos.ksh || atf_fail "Testcase failed" +} +snapshot_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_008_pos cleanup +snapshot_008_pos_head() +{ + atf_set "descr" "Verify that destroying snapshots returns space to the pool." + atf_set "require.progs" zfs +} +snapshot_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_008_pos.ksh || atf_fail "Testcase failed" +} +snapshot_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_009_pos cleanup +snapshot_009_pos_head() +{ + atf_set "descr" "Verify snapshot -r can correctly create a snapshot tree." + atf_set "require.progs" zfs +} +snapshot_009_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_009_pos.ksh || atf_fail "Testcase failed" +} +snapshot_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_010_pos cleanup +snapshot_010_pos_head() +{ + atf_set "descr" "Verify 'destroy -r' can correctly destroy a snapshot subtree at any point." + atf_set "require.progs" zfs +} +snapshot_010_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_010_pos.ksh || atf_fail "Testcase failed" +} +snapshot_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_011_pos cleanup +snapshot_011_pos_head() +{ + atf_set "descr" "Verify that rollback to a snapshot created by snapshot -r succeeds." + atf_set "require.progs" zfs +} +snapshot_011_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_011_pos.ksh || atf_fail "Testcase failed" +} +snapshot_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_012_pos cleanup +snapshot_012_pos_head() +{ + atf_set "descr" "Verify that 'snapshot -r' can work with 'zfs promote'." + atf_set "require.progs" zfs +} +snapshot_012_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_012_pos.ksh || atf_fail "Testcase failed" +} +snapshot_012_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_013_pos cleanup +snapshot_013_pos_head() +{ + atf_set "descr" "Verify snapshots from 'snapshot -r' can be used for zfs send/recv" + atf_set "require.progs" zfs +} +snapshot_013_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_013_pos.ksh || atf_fail "Testcase failed" +} +snapshot_013_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_014_pos cleanup +snapshot_014_pos_head() +{ + atf_set "descr" "Verify creating/destroying snapshots do things clean" + atf_set "require.progs" zfs +} +snapshot_014_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_014_pos.ksh || atf_fail "Testcase failed" +} +snapshot_014_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_015_pos cleanup +snapshot_015_pos_head() +{ + atf_set "descr" "Verify snapshot can be created via mkdir in .zfs/snapshot." + atf_set "require.progs" zfs +} +snapshot_015_pos_body() +{ + atf_expect_fail "Not all directory operations on the .zfs/snapshot directory are yet supported by FreeBSD" + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_015_pos.ksh || atf_fail "Testcase failed" +} +snapshot_015_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_016_pos cleanup +snapshot_016_pos_head() +{ + atf_set "descr" "Verify renamed snapshots via mv can be destroyed." + atf_set "require.progs" zfs +} +snapshot_016_pos_body() +{ + atf_expect_fail "Not all directory operations on the .zfs/snapshot directory are yet supported by FreeBSD" + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_016_pos.ksh || atf_fail "Testcase failed" +} +snapshot_016_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_017_pos cleanup +snapshot_017_pos_head() +{ + atf_set "descr" "Directory structure of snapshots reflects filesystem structure." + atf_set "require.progs" zfs +} +snapshot_017_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_017_pos.ksh || atf_fail "Testcase failed" +} +snapshot_017_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_018_pos cleanup +snapshot_018_pos_head() +{ + atf_set "descr" "Snapshot directory supports ACL operations" + atf_set "require.progs" zfs getfacl getconf sha1 +} +snapshot_018_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_018_pos.ksh || atf_fail "Testcase failed" +} +snapshot_018_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapshot_019_pos cleanup +snapshot_019_pos_head() +{ + atf_set "descr" "Accessing snapshots and unmounting them in parallel does not panic" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +snapshot_019_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_019_pos.ksh || atf_fail "Testcase failed" +} +snapshot_019_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case snapshot_020_pos cleanup +snapshot_020_pos_head() +{ + atf_set "descr" "Verify mounted snapshots can be renamed and destroyed" + atf_set "require.progs" zfs +} +snapshot_020_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapshot_020_pos.ksh || atf_fail "Testcase failed" +} +snapshot_020_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapshot.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + atf_add_test_case clone_001_pos + atf_add_test_case rollback_001_pos + atf_add_test_case rollback_002_pos + atf_add_test_case rollback_003_pos + atf_add_test_case snapshot_001_pos + atf_add_test_case snapshot_002_pos + atf_add_test_case snapshot_003_pos + atf_add_test_case snapshot_004_pos + atf_add_test_case snapshot_005_pos + atf_add_test_case snapshot_006_pos + atf_add_test_case snapshot_007_pos + atf_add_test_case snapshot_008_pos + atf_add_test_case snapshot_009_pos + atf_add_test_case snapshot_010_pos + atf_add_test_case snapshot_011_pos + atf_add_test_case snapshot_012_pos + atf_add_test_case snapshot_013_pos + atf_add_test_case snapshot_014_pos + atf_add_test_case snapshot_015_pos + atf_add_test_case snapshot_016_pos + atf_add_test_case snapshot_017_pos + atf_add_test_case snapshot_018_pos + atf_add_test_case snapshot_019_pos + atf_add_test_case snapshot_020_pos +} diff --git a/tests/sys/cddl/zfs/tests/snapused/Makefile b/tests/sys/cddl/zfs/tests/snapused/Makefile new file mode 100644 index 00000000000..c9a29d5e01e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/Makefile @@ -0,0 +1,23 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/snapused +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= snapused_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= snapused_005_pos.ksh +${PACKAGE}FILES+= snapused_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= snapused_004_pos.ksh +${PACKAGE}FILES+= snapused.kshlib +${PACKAGE}FILES+= snapused.cfg +${PACKAGE}FILES+= snapused_002_pos.ksh +${PACKAGE}FILES+= snapused_003_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/snapused/cleanup.ksh b/tests/sys/cddl/zfs/tests/snapused/cleanup.ksh new file mode 100644 index 00000000000..63175838afc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/snapused/setup.ksh b/tests/sys/cddl/zfs/tests/snapused/setup.ksh new file mode 100644 index 00000000000..dca69cd4700 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/snapused/snapused.cfg b/tests/sys/cddl/zfs/tests/snapused/snapused.cfg new file mode 100644 index 00000000000..78f3b97beac --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/snapused.cfg @@ -0,0 +1,34 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapused.cfg 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +export USEDTEST=$TESTPOOL/$TESTFS/usedtest${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/snapused/snapused.kshlib b/tests/sys/cddl/zfs/tests/snapused/snapused.kshlib new file mode 100644 index 00000000000..303d22d4ee8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/snapused.kshlib @@ -0,0 +1,191 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapused.kshlib 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +function usedby_supported +{ + fs_prop_exist "usedbysnapshots" + return $? +} + +function _check_used # dataset +{ + typeset dataset=$1 + + if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then + return + fi + + used=$(get_prop used $dataset) + usedbychildren=$(get_prop usedbychildren $dataset) + usedbydataset=$(get_prop usedbydataset $dataset) + usedbyrefreservation=$(get_prop usedbyrefreservation $dataset) + usedbysnapshots=$(get_prop usedbysnapshots $dataset) + (( used_sum = usedbychildren + usedbydataset + \ + usedbyrefreservation + usedbysnapshots )) + if (( used != used_sum )); then + log_fail "$dataset: used($used) is not the sum($used_sum) of usedby*" + fi +} + +function check_used # dataset +{ + typeset dataset=$1 + for child in $($ZFS list -rH -t filesystem,volume -o name $dataset) + do + _check_used $child + done +} + +function check_usedbychildren # dataset +{ + typeset dataset=$1 + typeset -i usedbychildren_sum=0 + typeset -i parent_usedbychildren=0 + for child in $($ZFS list -rH -t filesystem,volume -o name $dataset) + do + if [[ "$(get_prop type $child)" == "snapshot" ]]; then + continue + fi + + # parent + if [[ "$child" == "$dataset" ]]; then + parent_usedbychildren=$(get_prop usedbychildren $child) + else #child + reservation=$(get_prop reservation $child) + used=$(get_prop used $child) + if (( reservation > used )); then + (( usedbychildren_sum += reservation )) + else + (( usedbychildren_sum += used )) + fi + fi + done + + if (( parent_usedbychildren != usedbychildren_sum )); then + log_fail "$dataset: usedbychildren($parent_usedbychildren) is not the sum($usedbychildren_sum) of used by children" + fi +} + +function _check_usedbydataset # dataset +{ + typeset dataset=$1 + if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then + return + fi + + usedbydataset=$(get_prop usedbydataset $dataset) + referenced=$(get_prop referenced $dataset) + + is_cloned=$(get_prop is:cloned $dataset) + + if [[ "$is_cloned" == "yes" ]]; then + if (( usedbydataset > referenced )); then + log_fail "$dataset(cloned): usedbydataset($usedbydataset) is more than referenced($referenced)" + fi + else + # + # if non-clones, should usedbydataset == referenced + # + if (( usedbydataset != referenced )); then + log_fail "$dataset: usedbydataset($usedbydataset) is not equal to referenced($referenced)" + fi + fi +} + +function check_usedbydataset # dataset +{ + typeset dataset=$1 + for child in $($ZFS list -rH -t filesystem,volume -o name $dataset) + do + _check_usedbydataset $child + done +} + +function _check_usedbyrefreservation # dataset +{ + typeset dataset=$1 + if [[ "$(get_prop type $dataset)" == "snapshot" ]]; then + return + fi + + usedbyrefreservation=$(get_prop usedbyrefreservation $dataset) + referenced=$(get_prop referenced $dataset) + refreservation=$(get_prop refreservation $dataset) + (( diff_ref = refreservation - referenced )) + if (( usedbyrefreservation > refreservation || \ + usedbyrefreservation < diff_ref )); then + log_fail "$dataset: usedbyrefreservation($usedbyrefreservation) checking is not ok" + fi +} + +function check_usedbyrefreservation # dataset +{ + typeset dataset=$1 + for child in $($ZFS list -rH -t filesystem,volume -o name $dataset) + do + _check_usedbyrefreservation $child + done +} + +function check_usedbysnapshots # dataset +{ + typeset dataset=$1 + typeset -i usedbysnapshots_sum=0 + typeset -i parent_usedbysnapshots=0 + for child in $($ZFS list -rH -t filesystem,volume,snapshot -o name $dataset) + do + # parent + if [[ "$child" == "$dataset" ]]; then + parent_usedbysnapshots=$(get_prop usedbysnapshots $child) + continue + fi + + if [[ "$(get_prop type $child)" != "snapshot" ]]; then + continue + fi + + if [[ "$child" != "$dataset@"* ]]; then + continue + fi + + # snapshot + used=$(get_prop used $child) + (( usedbysnapshots_sum += used )) + done + + if (( parent_usedbysnapshots < usedbysnapshots_sum )); then + log_fail "$dataset: usedbysnapshots($parent_usedbysnapshots) is not more than or equal to" \ + "the sum($usedbysnapshots_sum) of used of snapshots" + fi +} + diff --git a/tests/sys/cddl/zfs/tests/snapused/snapused_001_pos.ksh b/tests/sys/cddl/zfs/tests/snapused/snapused_001_pos.ksh new file mode 100644 index 00000000000..07272013aa8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/snapused_001_pos.ksh @@ -0,0 +1,110 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapused_001_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/snapused/snapused.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: snapused_001_pos +# +# DESCRIPTION: +# Verify used is correct. +# +# STRATEGY: +# 1. Create a filesystem. +# 2. Set refreservation of the filesystem. +# 3. Make file in the filesystem. +# 4. Create sub filesystem and make file in it. +# 5. Create volume under it. +# 6. Snapshot it. +# 7. Check used=usedbychildren+usedbydataset+ +# usedbyrefreservation+usedbysnapshots. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-28) +# +# __stc_assertion_end +# +################################################################################ + +if ! usedby_supported ; then + log_unsupported "snapused property is not supported." +fi + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rR $USEDTEST +} + +log_assert "Verify used is correct." +log_onexit cleanup + +log_must $ZFS create $USEDTEST +check_used $USEDTEST + +typeset -i i=0 +typeset -i r_size=0 +mntpnt=$(get_prop mountpoint $USEDTEST) +while (( i < 5 )); do + ((r_size=(i+1)*16)) + + #usedbyrefreservation + log_must $ZFS set refreservation="$r_size"M $USEDTEST + + #usedbydataset + log_must $MKFILE 16M $mntpnt/file$i + + #usedbychildren + log_must $ZFS create $USEDTEST/fs$i + log_must $MKFILE 16M $mntpnt/fs$i/file$i + + if is_global_zone; then + log_must $ZFS create -V 16M $USEDTEST/vol$i + fi + + #usedbysnapshots + log_must $ZFS snapshot -r $USEDTEST@snap$i + + check_used $USEDTEST + + ((i = i + 1)) +done + +log_pass "Verify used is correct." + diff --git a/tests/sys/cddl/zfs/tests/snapused/snapused_002_pos.ksh b/tests/sys/cddl/zfs/tests/snapused/snapused_002_pos.ksh new file mode 100644 index 00000000000..508fa963f7e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/snapused_002_pos.ksh @@ -0,0 +1,101 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapused_002_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/snapused/snapused.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: snapused_002_pos +# +# DESCRIPTION: +# Verify usedbychildren is correct. +# +# STRATEGY: +# 1. Create a filesystem. +# 2. Create sub filesystem and make file in it. +# 3. Set reservation of the sub filesystem. +# 4. Create volume under it. +# 5. Snapshot it. +# 6. Check usedbychildren is correct. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-28) +# +# __stc_assertion_end +# +################################################################################ + +if ! usedby_supported ; then + log_unsupported "snapused property is not supported." +fi + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rR $USEDTEST +} + +log_assert "Verify usedbychildren is correct." +log_onexit cleanup + +log_must $ZFS create $USEDTEST +check_usedbychildren $USEDTEST + +typeset -i i=0 +typeset -i r_size=0 +mntpnt=$(get_prop mountpoint $USEDTEST) +while (( i < 5 )); do + ((r_size=(i+1)*16)) + + log_must $ZFS create $USEDTEST/fs$i + log_must $ZFS set reservation="$r_size"M $USEDTEST/fs$i + log_must $MKFILE 48M $mntpnt/fs$i/file$i + + if is_global_zone; then + log_must $ZFS create -V 32M $USEDTEST/vol$i + fi + + log_must $ZFS snapshot -r $USEDTEST@snap$i + + check_usedbychildren $USEDTEST + + ((i = i + 1)) +done + +log_pass "Verify usedbychildren is correct." + diff --git a/tests/sys/cddl/zfs/tests/snapused/snapused_003_pos.ksh b/tests/sys/cddl/zfs/tests/snapused/snapused_003_pos.ksh new file mode 100644 index 00000000000..2873151eb46 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/snapused_003_pos.ksh @@ -0,0 +1,101 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapused_003_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/snapused/snapused.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: snapused_003_pos +# +# DESCRIPTION: +# Verify usedbydataset is correct. +# +# STRATEGY: +# 1. Create a filesystem. +# 2. Make file in the filesystem. +# 3. Snapshot it. +# 4. Clone it and make file in the cloned filesystem. +# 5. Check usedbydataset is correct. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-28) +# +# __stc_assertion_end +# +################################################################################ + +if ! usedby_supported ; then + log_unsupported "snapused property is not supported." +fi + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rR $USEDTEST +} + +log_assert "Verify usedbydataset is correct." +log_onexit cleanup + +log_must $ZFS create $USEDTEST +check_usedbydataset $USEDTEST + +typeset -i i=0 +typeset -i r_size=0 +mntpnt=$(get_prop mountpoint $USEDTEST) +while (( i < 5 )); do + ((r_size=(i+1)*16)) + + log_must $MKFILE 16M $mntpnt/file$i + log_must $MKFILE "$r_size"M $mntpnt/file_var$i + log_must $ZFS snapshot -r $USEDTEST@snap$i + + log_must $ZFS clone $USEDTEST@snap$i $USEDTEST/cln$i + log_must $ZFS set is:cloned=yes $USEDTEST/cln$i + + mntpnt_cln=$(get_prop mountpoint $USEDTEST/cln$i) + log_must $MKFILE 16M $mntpnt_cln/file_cln$i + log_must $MKFILE "$r_size"M $mntpnt_cln/file_cln_var$i + + check_usedbydataset $USEDTEST + + ((i = i + 1)) +done + +log_pass "Verify usedbydataset is correct." + diff --git a/tests/sys/cddl/zfs/tests/snapused/snapused_004_pos.ksh b/tests/sys/cddl/zfs/tests/snapused/snapused_004_pos.ksh new file mode 100644 index 00000000000..7a6cbe38f8a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/snapused_004_pos.ksh @@ -0,0 +1,114 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapused_004_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/snapused/snapused.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: snapused_004_pos +# +# DESCRIPTION: +# Verify usedbyrefreservation is correct. +# +# STRATEGY: +# 1. Create a filesystem. +# 2. Set refreservation of the filesystem. +# 3. Make file in the filesystem. +# 4. Create sub filesystem and make file in it. +# 5. Set refreservation of the sub filesystem. +# 6. Create volume under it. +# 7. Snapshot it. +# 8. Clone it and set refreservation of the cloned filesystem. +# 9. Makefile the cloned filesystem. +# 10. Check usedbyrefreservation is correct. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-28) +# +# __stc_assertion_end +# +################################################################################ + +if ! usedby_supported ; then + log_unsupported "snapused property is not supported." +fi + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rR $USEDTEST +} + +log_assert "Verify usedbyrefreservation is correct." +log_onexit cleanup + +log_must $ZFS create $USEDTEST +check_usedbyrefreservation $USEDTEST + +typeset -i i=0 +typeset -i r_size=0 +mntpnt=$(get_prop mountpoint $USEDTEST) +while (( i < 5 )); do + ((r_size=(i+1)*16)) + log_must $ZFS set refreservation="$r_size"M $USEDTEST + + log_must $MKFILE 16M $mntpnt/file$i + + log_must $ZFS create $USEDTEST/fs$i + log_must $ZFS set refreservation="$r_size"M $USEDTEST/fs$i + log_must $MKFILE 16M $mntpnt/fs$i/file$i + + if is_global_zone; then + log_must $ZFS create -V 16M $USEDTEST/vol$i + fi + + log_must $ZFS snapshot -r $USEDTEST@snap$i + + log_must $ZFS clone $USEDTEST@snap$i $USEDTEST/cln$i + + mntpnt_cln=$(get_prop mountpoint $USEDTEST/cln$i) + log_must $ZFS set refreservation="$r_size"M $USEDTEST/cln$i + log_must $MKFILE 16M $mntpnt_cln/file_cln$i + + check_usedbyrefreservation $USEDTEST + + ((i = i + 1)) +done + +log_pass "Verify usedbyrefreservation is correct." + diff --git a/tests/sys/cddl/zfs/tests/snapused/snapused_005_pos.ksh b/tests/sys/cddl/zfs/tests/snapused/snapused_005_pos.ksh new file mode 100644 index 00000000000..0a767b43d23 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/snapused_005_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)snapused_005_pos.ksh 1.1 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/snapused/snapused.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: snapused_005_pos +# +# DESCRIPTION: +# Verify usedbysnapshots is correct. +# +# STRATEGY: +# 1. Create a filesystem. +# 2. Make file in the filesystem. +# 3. Snapshot it. +# 4. Check check_usedbysnapshots is correct. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2009-04-28) +# +# __stc_assertion_end +# +################################################################################ + +if ! usedby_supported ; then + log_unsupported "snapused property is not supported." +fi + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS destroy -rR $USEDTEST +} + +log_assert "Verify usedbysnapshots is correct." +log_onexit cleanup + +log_must $ZFS create $USEDTEST +check_usedbysnapshots $USEDTEST + +typeset -i i=0 +typeset -i r_size=0 +mntpnt=$(get_prop mountpoint $USEDTEST) +while (( i < 5 )); do + ((r_size=(i+1)*16)) + + log_must $MKFILE "$r_size"M $mntpnt/file$i + + log_must $ZFS snapshot $USEDTEST@snap$i + check_usedbysnapshots $USEDTEST + + ((i = i + 1)) +done + +log_pass "Verify usedbysnapshots is correct." + diff --git a/tests/sys/cddl/zfs/tests/snapused/snapused_test.sh b/tests/sys/cddl/zfs/tests/snapused/snapused_test.sh new file mode 100755 index 00000000000..c13c11110e0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/snapused/snapused_test.sh @@ -0,0 +1,167 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case snapused_001_pos cleanup +snapused_001_pos_head() +{ + atf_set "descr" "Verify used is correct." + atf_set "require.progs" zfs +} +snapused_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapused_001_pos.ksh || atf_fail "Testcase failed" +} +snapused_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapused_002_pos cleanup +snapused_002_pos_head() +{ + atf_set "descr" "Verify usedbychildren is correct." + atf_set "require.progs" zfs +} +snapused_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapused_002_pos.ksh || atf_fail "Testcase failed" +} +snapused_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapused_003_pos cleanup +snapused_003_pos_head() +{ + atf_set "descr" "Verify usedbydataset is correct." + atf_set "require.progs" zfs +} +snapused_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapused_003_pos.ksh || atf_fail "Testcase failed" +} +snapused_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapused_004_pos cleanup +snapused_004_pos_head() +{ + atf_set "descr" "Verify usedbyrefreservation is correct." + atf_set "require.progs" zfs +} +snapused_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapused_004_pos.ksh || atf_fail "Testcase failed" +} +snapused_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case snapused_005_pos cleanup +snapused_005_pos_head() +{ + atf_set "descr" "Verify usedbysnapshots is correct." + atf_set "require.progs" zfs +} +snapused_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/snapused_005_pos.ksh || atf_fail "Testcase failed" +} +snapused_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/snapused.kshlib + . $(atf_get_srcdir)/snapused.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case snapused_001_pos + atf_add_test_case snapused_002_pos + atf_add_test_case snapused_003_pos + atf_add_test_case snapused_004_pos + atf_add_test_case snapused_005_pos +} diff --git a/tests/sys/cddl/zfs/tests/sparse/Makefile b/tests/sys/cddl/zfs/tests/sparse/Makefile new file mode 100644 index 00000000000..73647f2c95a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/sparse/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/sparse +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= sparse_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= sparse_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= sparse.cfg +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/sparse/cleanup.ksh b/tests/sys/cddl/zfs/tests/sparse/cleanup.ksh new file mode 100644 index 00000000000..26ce7c30a0b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/sparse/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/sparse/setup.ksh b/tests/sys/cddl/zfs/tests/sparse/setup.ksh new file mode 100644 index 00000000000..00289583e38 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/sparse/setup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + + +disk=${DISKS%% *} + +default_setup $disk diff --git a/tests/sys/cddl/zfs/tests/sparse/sparse.cfg b/tests/sys/cddl/zfs/tests/sparse/sparse.cfg new file mode 100644 index 00000000000..d44d0e6130b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/sparse/sparse.cfg @@ -0,0 +1,38 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)sparse.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE=testfile.${TESTCASE_ID} +export HOLES_FILESIZE=${HOLES_FILESIZE-"67108864"} # 64 Mb +export HOLES_BLKSIZE=${HOLES_BLKSIZE-"512"} +export HOLES_SEED=${HOLES_SEED-""} +export HOLES_FILEOFFSET=${HOLES_FILEOFFSET-""} +export HOLES_COUNT=${HOLES_COUNT-"16384"} # FILESIZE/BLKSIZE/8 +export STF_TIMEOUT=3600 diff --git a/tests/sys/cddl/zfs/tests/sparse/sparse_001_pos.ksh b/tests/sys/cddl/zfs/tests/sparse/sparse_001_pos.ksh new file mode 100644 index 00000000000..756570ea5c8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/sparse/sparse_001_pos.ksh @@ -0,0 +1,93 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)sparse_001_pos.ksh 1.3 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: sparse_001_pos +# +# DESCRIPTION: +# Holes in ZFS files work correctly. +# +# STRATEGY: +# 1. Open file +# 2. Write random blocks in random places +# 3. Read each block back to check for correctness. +# 4. Repeat steps 2 and 3 lots of times +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Ensure random blocks are read back correctly" + +options="" +options_display="default options" + +log_onexit cleanup + +[[ -n "$HOLES_FILESIZE" ]] && options=" $options -f $HOLES_FILESIZE " + +[[ -n "$HOLES_BLKSIZE" ]] && options="$options -b $HOLES_BLKSIZE " + +[[ -n "$HOLES_COUNT" ]] && options="$options -c $HOLES_COUNT " + +[[ -n "$HOLES_SEED" ]] && options="$options -s $HOLES_SEED " + +[[ -n "$HOLES_FILEOFFSET" ]] && options="$options -o $HOLES_FILEOFFSET " + +options="$options -r " + +[[ -n "$options" ]] && options_display=$options + +log_note "Invoking $FILE_TRUNC with: $options_display" +log_must $FILE_TRUNC $options $TESTDIR/$TESTFILE + +typeset dir=$(get_device_dir $DISKS) +verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir" + +log_pass "Random blocks have been read back correctly." diff --git a/tests/sys/cddl/zfs/tests/sparse/sparse_test.sh b/tests/sys/cddl/zfs/tests/sparse/sparse_test.sh new file mode 100755 index 00000000000..3470d1988a4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/sparse/sparse_test.sh @@ -0,0 +1,58 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case sparse_001_pos cleanup +sparse_001_pos_head() +{ + atf_set "descr" "Ensure random blocks are read back correctly" + atf_set "require.progs" zdb + atf_set "timeout" 3600 +} +sparse_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/sparse.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/sparse_001_pos.ksh || atf_fail "Testcase failed" +} +sparse_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/sparse.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case sparse_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/threadsappend/Makefile b/tests/sys/cddl/zfs/tests/threadsappend/Makefile new file mode 100644 index 00000000000..b09941dca50 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/threadsappend/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/threadsappend +FILESDIR=${TESTSDIR} +BINDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= threadsappend_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= threadsappend_001_pos.ksh +${PACKAGE}FILES+= threadsappend.cfg +${PACKAGE}FILES+= setup.ksh +PROG+= threadsappend +LIBADD+= pthread +MAN= + +.include diff --git a/tests/sys/cddl/zfs/tests/threadsappend/cleanup.ksh b/tests/sys/cddl/zfs/tests/threadsappend/cleanup.ksh new file mode 100644 index 00000000000..26ce7c30a0b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/threadsappend/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/threadsappend/setup.ksh b/tests/sys/cddl/zfs/tests/threadsappend/setup.ksh new file mode 100644 index 00000000000..805b20ce374 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/threadsappend/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup ${DISK} diff --git a/tests/sys/cddl/zfs/tests/threadsappend/threadsappend.c b/tests/sys/cddl/zfs/tests/threadsappend/threadsappend.c new file mode 100644 index 00000000000..bd264cd66c5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/threadsappend/threadsappend.c @@ -0,0 +1,135 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#pragma ident "@(#)threadsappend.c 1.3 07/05/25 SMI" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * The size of the output file, "go.out", should be 80*8192*2 = 1310720 + * + * $ cd /tmp; go; ls -l go.out + * done. + * -rwxr-xr-x 1 jdm staff 1310720 Apr 13 19:45 go.out + * $ cd /zfs; go; ls -l go.out + * done. + * -rwxr-xr-x 1 jdm staff 663552 Apr 13 19:45 go.out + * + * The file on zfs is short as it does not appear that zfs is making the + * implicit seek to EOF and the actual write atomic. From the SUSv3 + * interface spec, behavior is undefined if concurrent writes are performed + * from multi-processes to a single file. So I don't know if this is a + * standards violation, but I cannot find any such disclaimers in our + * man pages. This issue came up at a customer site in another context, and + * the suggestion was to open the file with O_APPEND, but that wouldn't + * help with zfs(see 4977529). Also see bug# 5031301. + */ + +static int outfd = 0; + +static void * +go(void *data) +{ + int i = 0, n = *(int *)data; + ssize_t ret = 0; + char buf[8192] = {0}; + (void) memset(buf, n, sizeof (buf)); + + for (i = 0; i < 80; i++) { + ret = write(outfd, buf, sizeof (buf)); + } + return (NULL); +} + +static void +usage() +{ + (void) fprintf(stderr, + "usage: zfs_threadsappend \n"); + exit(1); +} + +int +main(int argc, char **argv) +{ + pthread_t threads[2]; + int ret = 0; + long ncpus = 0; + int i; + + if (argc != 2) { + usage(); + } + + ncpus = sysconf(_SC_NPROCESSORS_ONLN); + if (ncpus < 0) { + (void) fprintf(stderr, + "Invalid return from sysconf(_SC_NPROCESSORS_ONLN)" + " : errno (decimal)=%d\n", errno); + exit(1); + } + if (ncpus < 2) { + (void) fprintf(stderr, + "Must execute this binary on a multi-processor system\n"); + exit(1); + } + + outfd = open(argv[optind++], O_RDWR|O_CREAT|O_APPEND|O_TRUNC, 0777); + if (outfd == -1) { + (void) fprintf(stderr, + "zfs_threadsappend: " + "open(%s, O_RDWR|O_CREAT|O_APPEND|O_TRUNC, 0777)" + " failed\n", argv[optind]); + perror("open"); + exit(1); + } + + for (i = 0; i < 2; i++) { + ret = pthread_create(&threads[i], NULL, go, (void *)&i); + if (ret != 0) { + (void) fprintf(stderr, + "zfs_threadsappend: thr_create(#%d) " + "failed error=%d\n", i+1, ret); + exit(1); + } + } + + for (i = 0; i < 2; i++) { + if (pthread_join(threads[i], NULL) != 0) + break; + } + + return (0); +} diff --git a/tests/sys/cddl/zfs/tests/threadsappend/threadsappend.cfg b/tests/sys/cddl/zfs/tests/threadsappend/threadsappend.cfg new file mode 100644 index 00000000000..f679406f033 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/threadsappend/threadsappend.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)threadsappend.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE=testfile${TESTCASE_ID} diff --git a/tests/sys/cddl/zfs/tests/threadsappend/threadsappend_001_pos.ksh b/tests/sys/cddl/zfs/tests/threadsappend/threadsappend_001_pos.ksh new file mode 100644 index 00000000000..16fd8191981 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/threadsappend/threadsappend_001_pos.ksh @@ -0,0 +1,95 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)threadsappend_001_pos.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: threadsappend_001_pos +# +# DESCRIPTION: +# +# Ensure multiple threads performing write appends to the same ZFS +# file succeed. +# +# STRATEGY: +# 1) Verify this is a multi-processor system +# 2) Create multiple threads with each appending to a file +# 3) Verify that the resulting file is the expected size +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +log_assert "Ensure multiple threads performing write appends to the same" \ + "ZFS file succeed" + +# +# $FILE_SIZE is hardcoded into threadsappend.c and is the expected +# size of the file after all the threads have appended to it +# +typeset -i FILE_SIZE=1310720 + +# +# This test should be run on a multi-processor system because otherwise the FS +# will not be concurrently used by the threads +# +NCPUS=`sysctl -a | awk -F '"' '/cpu count="[0-9+]"/ {print $2; exit}'` +if [[ $? -ne 0 || -z $NCPUS || $NCPUS -le 1 ]]; then + log_unsupported \ + "This test should be executed on a multi-processor system." +fi + +# +# zfs_threadsappend tries to append to $TESTFILE using threads +# so that the resulting file is $FILE_SIZE bytes in size +# +log_must threadsappend ${TESTDIR}/${TESTFILE} + +# +# Check the size of the resulting file +# +SIZE=`$LS -l ${TESTDIR}/${TESTFILE} | $AWK '{print $5}'` +if [[ $SIZE -ne $FILE_SIZE ]]; then + log_fail "'The length of ${TESTDIR}/${TESTFILE}' doesnt equal 1310720." +fi + +log_pass "Multiple thread appends succeeded. File size as expected" diff --git a/tests/sys/cddl/zfs/tests/threadsappend/threadsappend_test.sh b/tests/sys/cddl/zfs/tests/threadsappend/threadsappend_test.sh new file mode 100755 index 00000000000..e8a02094101 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/threadsappend/threadsappend_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case threadsappend_001_pos cleanup +threadsappend_001_pos_head() +{ + atf_set "descr" "Ensure multiple threads performing write appends to the sameZFS file succeed" +} +threadsappend_001_pos_body() +{ + export PATH=$(atf_get_srcdir):$PATH + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/threadsappend.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/threadsappend_001_pos.ksh || atf_fail "Testcase failed" +} +threadsappend_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/threadsappend.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case threadsappend_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/truncate/Makefile b/tests/sys/cddl/zfs/tests/truncate/Makefile new file mode 100644 index 00000000000..110abddbbbc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/truncate/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/truncate +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= truncate_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= truncate_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= truncate_002_pos.ksh +${PACKAGE}FILES+= truncate.cfg + +.include diff --git a/tests/sys/cddl/zfs/tests/truncate/cleanup.ksh b/tests/sys/cddl/zfs/tests/truncate/cleanup.ksh new file mode 100644 index 00000000000..26ce7c30a0b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/truncate/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/truncate/setup.ksh b/tests/sys/cddl/zfs/tests/truncate/setup.ksh new file mode 100644 index 00000000000..0108551c107 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/truncate/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +disk=${DISKS%% *} + +default_setup $disk diff --git a/tests/sys/cddl/zfs/tests/truncate/truncate.cfg b/tests/sys/cddl/zfs/tests/truncate/truncate.cfg new file mode 100644 index 00000000000..ed1c6ffa89c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/truncate/truncate.cfg @@ -0,0 +1,38 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)truncate.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE=testfile.${TESTCASE_ID} +export TRUNC_FILESIZE=${TRUNC_FILESIZE-"67108864"} # 64 Mb +export TRUNC_BLKSIZE=${TRUNC_BLKSIZE-"512"} +export TRUNC_SEED=${TRUNC_SEED-""} +export TRUNC_FILEOFFSET=${TRUNC_FILEOFFSET-""} +export TRUNC_COUNT=${TRUNC_COUNT-"16384"} # FILESIZE/BLKSIZE/8 +export STF_TIMEOUT=3600 diff --git a/tests/sys/cddl/zfs/tests/truncate/truncate_001_pos.ksh b/tests/sys/cddl/zfs/tests/truncate/truncate_001_pos.ksh new file mode 100644 index 00000000000..453c622bc1a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/truncate/truncate_001_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)truncate_001_pos.ksh 1.3 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: truncate_001_pos +# +# DESCRIPTION: +# Tests file truncation within ZFS. +# +# STRATEGY: +# 1. Open file +# 2. Write random blocks in random places +# 3. Truncate the file +# 4. Repeat steps 2 and 3 lots of times +# 5. Close the file. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Ensure file with random blocks is truncated properly" + +options="" +options_display="default options" + +log_onexit cleanup + +[[ -n "$TRUNC_FILESIZE" ]] && options=" $options -f $TRUNC_FILESIZE " + +[[ -n "$TRUNC_BLKSIZE" ]] && options="$options -b $TRUNC_BLKSIZE " + +[[ -n "$TRUNC_COUNT" ]] && options="$options -c $TRUNC_COUNT " + +[[ -n "$TRUNC_SEED" ]] && options="$options -s $TRUNC_SEED " + +[[ -n "$TRUNC_FILEOFFSET" ]] && options="$options -o $TRUNC_FILEOFFSET " + +[[ -n "$options" ]] && options_display=$options + +log_note "Invoking $FILE_TRUNC with: $options_display" +log_must $FILE_TRUNC $options $TESTDIR/$TESTFILE + +typeset dir=$(get_device_dir $DISKS) +verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir" + +log_pass "Random blocks have been truncated properly." diff --git a/tests/sys/cddl/zfs/tests/truncate/truncate_002_pos.ksh b/tests/sys/cddl/zfs/tests/truncate/truncate_002_pos.ksh new file mode 100644 index 00000000000..9b96941200b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/truncate/truncate_002_pos.ksh @@ -0,0 +1,80 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)truncate_002_pos.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: truncate_002_pos +# +# DESCRIPTION: +# Tests file truncation within ZFS while a sync operation is in progress. +# +# STRATEGY: +# 1. Copy a file to ZFS filesystem +# 2. Copy /dev/null to same file on ZFS filesystem +# 3. Execute a sync command +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + [[ -e $TESTDIR ]] && log_must $RM -rf ${TESTDIR}/* +} + +log_assert "Ensure zeroed file gets written correctly during a sync operation" + +srcfilename="$STF_SUITE/include/libtest.kshlib" + +log_onexit cleanup + +log_note "Copying $srcfilename to $TESTFILE" +log_must $CP $srcfilename ${TESTDIR}/${TESTFILE} + +log_note "Copying /dev/null to $TESTFILE" +log_must $CP /dev/null ${TESTDIR}/${TESTFILE} + +log_note "Now 'sync' the filesystem" +(cd $TESTDIR; log_must $SYNC) + +log_pass "Successful truncation within ZFS while a sync operation is in progress." diff --git a/tests/sys/cddl/zfs/tests/truncate/truncate_test.sh b/tests/sys/cddl/zfs/tests/truncate/truncate_test.sh new file mode 100755 index 00000000000..3c50b0cdd6e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/truncate/truncate_test.sh @@ -0,0 +1,83 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case truncate_001_pos cleanup +truncate_001_pos_head() +{ + atf_set "descr" "Ensure file with random blocks is truncated properly" + atf_set "require.progs" zdb + atf_set "timeout" 3600 +} +truncate_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/truncate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/truncate_001_pos.ksh || atf_fail "Testcase failed" +} +truncate_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/truncate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case truncate_002_pos cleanup +truncate_002_pos_head() +{ + atf_set "descr" "Ensure zeroed file gets written correctly during a sync operation" + atf_set "timeout" 3600 +} +truncate_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/truncate.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/truncate_002_pos.ksh || atf_fail "Testcase failed" +} +truncate_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/truncate.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case truncate_001_pos + atf_add_test_case truncate_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/Makefile b/tests/sys/cddl/zfs/tests/txg_integrity/Makefile new file mode 100644 index 00000000000..a992db93b25 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/Makefile @@ -0,0 +1,26 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/txg_integrity +FILESDIR=${TESTSDIR} +BINDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= txg_integrity_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= txg_integrity_001_pos.ksh +${PACKAGE}FILES+= fsync_integrity_001_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= txg_integrity.cfg +PROGS+= txg_integrity +PROGS+= fsync_integrity +LIBADD+= pthread + +SRCS.fsync_integrity= fsync_integrity.c +SRCS.txg_integrity= txg_integrity.c + +.include diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/cleanup.ksh b/tests/sys/cddl/zfs/tests/txg_integrity/cleanup.ksh new file mode 100644 index 00000000000..5f0282b2035 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2011 Spectra logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.0 10/20/11 SL" +# + +. ${STF_SUITE}/include/libtest.kshlib + +destroy_pool $TESTPOOL +$RM -rf $TESTDIR +$MDCONFIG -d -u $TESTCASE_ID diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/fsync_integrity.c b/tests/sys/cddl/zfs/tests/txg_integrity/fsync_integrity.c new file mode 100644 index 00000000000..0daba26579d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/fsync_integrity.c @@ -0,0 +1,517 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2013 Spectra Logic. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Verify the integrity of non-aligned writes to the same blocks within the same + * transaction group, where an fsync is issued by a non-final writer. + * + * This test verifies that the unoverride in the following sequence of events is + * handled correctly: + * + * 1) A new transaction group opens + * 2) A write is issued to a certain block + * 3) The writer fsyncs() that file + * 4) TBD module immediately writes that block, then places an override in the + * syncer's TBD data structure, indicating that it doesn't need to write that + * block when syncing. + * 5) Another write is issued to the same block, with different data. + * 6) TBD module unoverrides that block in the syncer's TBD data structure + * 7) The syncer writes that block + * + * Outline: + * Create a big zero-filled file. + * Create a bunch of different IO patterns. Each IO pattern consists of: + * * A partition of the file range into 64 different non-overlapping chunks. + * * A permutation of those chunks + * For each repetition: + * For each IO pattern: + * Create one binary semaphore per chunk, per (n-1) threads + * Create n threads. + * The first thread will write each chunk in order. It will post a + * semaphore after each write to indicate that it has completed + * writing that chunk. + * The second thread will pend on those semaphores in order. Each time it + * receives a semaphore, it will write a different pattern to that + * chunk. Then it will post a different semaphore to signal the next + * thread. + * The final thread will not post any semaphores + * Every even-numbered thread, starting with the first (0th), will fsync() + * the file after its write. The final thread, being odd-numbered, + * won't. + * Join all threads + * Read the entire file and verify that + * 1) Every write went to the correct location + * 2) The final thread's write is left in the file + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NUM_REPETITIONS 16 +#define CLUSTERSIZE (1 << 17) +#define NUM_CHUNKS 64 +#define FSIZE (64 * (CLUSTERSIZE)) //FSIZE may range from NUM_CHUNKS clusters to 8GB +#define USE_THREADS 1 +#define NUM_THREADS 8 + +typedef struct { + //partitions describes the boundaries between chunks. Each element is a + //fraction of the filesize in 1.31 fixed point format. So the boundary + //between chunk n and chunk n-1 is (FSIZE * partitions[n-1] / (1<<31) . + //partitions[-1] is understood to be 0 and partitions[NUM_CHUNKS] must be 1.0 + //partitions is sorted, of course. + //Partition boundaries must be dword aligned. Thus, in order to work with + //multiple values of FSIZE, partitions values must be aligned to multiples of + //8 / (NUM_CHUNKS * CLUSTERSIZE) = 1 / 524288 = 0x0.00002 + uint32_t partitions[NUM_CHUNKS]; + int permutation[NUM_CHUNKS]; //the order in which to write the chunks +} pattern_t; + +typedef struct { + int thread_num; + pattern_t* pat; +} thread_data_t; + + +/* Returns (via begin and end) the range of a chunk. Begin is inclusive, + * end is exclusive */ +void get_chunk_range(const pattern_t* pat, int chunk, uint32_t* begin, uint32_t* end){ + if (chunk == 0){ + *begin = 0; + } + else{ + *begin = (uint32_t)((uint64_t)FSIZE * (uint64_t)pat->partitions[chunk - 1] >> 31); + } + *end = (uint32_t)((uint64_t)FSIZE * (uint64_t)pat->partitions[chunk] >> 31); +} + + +/* The most basic, trivial IO pattern. Fully sequential, and the follower + * writes every other block */ +const pattern_t trivial_pattern = { + {0x2000000, 0x4000000, 0x6000000, 0x8000000, 0xa000000, 0xc000000, 0xe000000, 0x10000000, + 0x12000000, 0x14000000, 0x16000000, 0x18000000, 0x1a000000, 0x1c000000, 0x1e000000, 0x20000000, + 0x22000000, 0x24000000, 0x26000000, 0x28000000, 0x2a000000, 0x2c000000, 0x2e000000, 0x30000000, + 0x32000000, 0x34000000, 0x36000000, 0x38000000, 0x3a000000, 0x3c000000, 0x3e000000, 0x40000000, + 0x42000000, 0x44000000, 0x46000000, 0x48000000, 0x4a000000, 0x4c000000, 0x4e000000, 0x50000000, + 0x52000000, 0x54000000, 0x56000000, 0x58000000, 0x5a000000, 0x5c000000, 0x5e000000, 0x60000000, + 0x62000000, 0x64000000, 0x66000000, 0x68000000, 0x6a000000, 0x6c000000, 0x6e000000, 0x70000000, + 0x72000000, 0x74000000, 0x76000000, 0x78000000, 0x7a000000, 0x7c000000, 0x7e000000, 0x80000000}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}, +}; + +//The below patterns were randomly generated +const pattern_t pat0 = { + { 0x1eac000, 0x88a4000, 0xaffe000, 0xcdb7000, 0xd2d5000, 0xe16f000, 0xe499000, 0x11f71000, 0x1242d000, 0x12c07000, 0x143bc000, 0x1460a000, 0x15dd7000, 0x1700e000, 0x1be7e000, 0x1e14d000, 0x1e6ac000, 0x21097000, 0x24b74000, 0x27166000, 0x27669000, 0x30539000, 0x3218b000, 0x37591000, 0x37b60000, 0x39818000, 0x39d08000, 0x3c90e000, 0x3e54f000, 0x3fb99000, 0x42c8e000, 0x43a62000, 0x43f50000, 0x4c0c9000, 0x4c422000, 0x4c737000, 0x4d41e000, 0x4d738000, 0x4da71000, 0x4f4e8000, 0x508e3000, 0x51396000, 0x51ab5000, 0x52a02000, 0x54238000, 0x54d6a000, 0x55029000, 0x5584b000, 0x5c42c000, 0x5c4a7000, 0x5dac5000, 0x5fe4d000, 0x63f86000, 0x66ad0000, 0x67b3d000, 0x69ce5000, 0x6c179000, 0x6e79e000, 0x6f83f000, 0x71165000, 0x72bd9000, 0x7ac79000, 0x7dc94000, 0x80000000, }, + { 57, 16, 28, 25, 10, 59, 52, 46, 30, 6, 40, 36, 39, 9, 21, 51, 33, 45, 44, 19, 2, 50, 55, 5, 58, 13, 23, 0, 12, 53, 42, 32, 31, 48, 35, 61, 49, 54, 18, 24, 8, 41, 62, 4, 47, 17, 1, 3, 34, 14, 63, 22, 15, 26, 38, 56, 27, 60, 29, 11, 7, 43, 20, 37, }, +}; +const pattern_t pat1 = { + { 0x2b5000, 0x16db000, 0x5eb5000, 0x93a0000, 0xa7cb000, 0xa9e9000, 0xd144000, 0xe7c2000, 0xeb7d000, 0x10919000, 0x10cbd000, 0x11f85000, 0x17360000, 0x1760a000, 0x18eab000, 0x1ae6b000, 0x1c5f6000, 0x1df38000, 0x21bec000, 0x239d1000, 0x26b81000, 0x2747b000, 0x27a03000, 0x2b3cc000, 0x2cbf9000, 0x2ec0f000, 0x30a68000, 0x30bea000, 0x30c64000, 0x311af000, 0x35823000, 0x35d23000, 0x3b20e000, 0x405d8000, 0x414c8000, 0x43a91000, 0x44049000, 0x4ab4e000, 0x4ae21000, 0x4d293000, 0x511e5000, 0x516fc000, 0x52d77000, 0x57229000, 0x5da57000, 0x5dbe6000, 0x6070e000, 0x60fc0000, 0x64b24000, 0x67636000, 0x67658000, 0x6b040000, 0x6b28f000, 0x6e551000, 0x707c0000, 0x71b5c000, 0x72062000, 0x762a1000, 0x788a0000, 0x7a1e1000, 0x7b06a000, 0x7e04c000, 0x7f4cf000, 0x80000000, }, + { 45, 8, 55, 9, 21, 54, 41, 7, 6, 22, 31, 47, 23, 11, 48, 53, 0, 61, 63, 50, 17, 27, 12, 19, 10, 40, 14, 51, 39, 59, 2, 43, 18, 42, 52, 28, 16, 44, 3, 5, 15, 35, 58, 33, 57, 49, 34, 30, 46, 4, 37, 60, 32, 36, 25, 56, 24, 13, 20, 38, 29, 26, 62, 1, }, +}; +const pattern_t pat2 = { + { 0x912d000, 0xe610000, 0xf755000, 0x116df000, 0x128e5000, 0x1bd51000, 0x24e9a000, 0x27643000, 0x28cf4000, 0x292c9000, 0x2c907000, 0x2d389000, 0x2d941000, 0x2eb3f000, 0x30e94000, 0x31738000, 0x3343b000, 0x342ce000, 0x34d12000, 0x3536d000, 0x35e1a000, 0x35e4d000, 0x35fd5000, 0x3642b000, 0x3924d000, 0x392a5000, 0x3e531000, 0x3f0ee000, 0x3fdf8000, 0x41593000, 0x41c80000, 0x43959000, 0x43bc0000, 0x461c8000, 0x48922000, 0x49519000, 0x4f6fa000, 0x50274000, 0x508ae000, 0x536ed000, 0x54154000, 0x59894000, 0x5a666000, 0x5b0a6000, 0x5b9ff000, 0x5c109000, 0x5d8d0000, 0x5ddc5000, 0x5fcc5000, 0x63366000, 0x63adc000, 0x645b6000, 0x670eb000, 0x6b1b1000, 0x6c996000, 0x6ed2a000, 0x6ee4f000, 0x71fcd000, 0x734a3000, 0x76bdf000, 0x77b3f000, 0x7c65a000, 0x7d200000, 0x80000000, }, + { 31, 35, 36, 52, 27, 56, 40, 13, 51, 49, 43, 37, 62, 42, 24, 29, 48, 25, 7, 61, 22, 57, 11, 32, 2, 54, 41, 6, 55, 15, 20, 26, 63, 44, 12, 4, 19, 58, 60, 59, 47, 23, 30, 50, 53, 34, 9, 38, 45, 8, 28, 3, 16, 33, 5, 21, 1, 10, 46, 18, 0, 14, 39, 17, }, +}; +const pattern_t pat3 = { + { 0x553000, 0x19de000, 0x6a20000, 0x8a53000, 0x8ef9000, 0xc325000, 0x1132e000, 0x139fa000, 0x1426b000, 0x150ff000, 0x1bbc1000, 0x1e84c000, 0x1f43e000, 0x1f731000, 0x21ec8000, 0x231f4000, 0x23440000, 0x23466000, 0x260b6000, 0x286a7000, 0x29518000, 0x29e35000, 0x2fdb7000, 0x3089d000, 0x362e0000, 0x3c1f9000, 0x3df2d000, 0x3fce6000, 0x402f3000, 0x4117f000, 0x41e06000, 0x4374f000, 0x451e5000, 0x45a59000, 0x4956b000, 0x4960f000, 0x4a934000, 0x4bc6f000, 0x4d462000, 0x4eef8000, 0x4f609000, 0x50dc1000, 0x51022000, 0x54396000, 0x5641b000, 0x578f1000, 0x589cf000, 0x59093000, 0x5da6b000, 0x5fbf0000, 0x605a2000, 0x65428000, 0x65530000, 0x6705a000, 0x6db65000, 0x71cef000, 0x725a2000, 0x73bf5000, 0x75acb000, 0x76065000, 0x7614c000, 0x77aab000, 0x78f70000, 0x80000000, }, + { 15, 30, 31, 16, 49, 13, 55, 59, 4, 24, 26, 44, 17, 0, 18, 54, 10, 3, 46, 34, 29, 22, 45, 5, 38, 32, 39, 50, 48, 53, 12, 25, 35, 56, 51, 52, 1, 33, 43, 63, 47, 37, 23, 20, 60, 14, 11, 21, 8, 57, 27, 41, 6, 58, 62, 2, 19, 61, 28, 36, 40, 7, 9, 42, }, +}; +const pattern_t pat4 = { + { 0x425000, 0x8e8000, 0x4b90000, 0x883c000, 0x968e000, 0xbacc000, 0x10e59000, 0x125a1000, 0x12f00000, 0x14e7c000, 0x156de000, 0x192a1000, 0x1a2b9000, 0x1b4a0000, 0x1be9c000, 0x1d3bd000, 0x24242000, 0x2516b000, 0x2b88d000, 0x2b96a000, 0x2bcd3000, 0x2c5a9000, 0x2da74000, 0x2dba1000, 0x3097f000, 0x332ef000, 0x34525000, 0x36193000, 0x3725c000, 0x37e66000, 0x3d315000, 0x3e813000, 0x404ae000, 0x40c68000, 0x42f93000, 0x44b14000, 0x44b15000, 0x473b2000, 0x49048000, 0x4c794000, 0x50b60000, 0x52b3d000, 0x58c61000, 0x5b7d4000, 0x5ce71000, 0x5d21d000, 0x5d63e000, 0x5e00f000, 0x60e8b000, 0x66381000, 0x66c70000, 0x68430000, 0x707c2000, 0x71979000, 0x72681000, 0x74017000, 0x7721d000, 0x7a1be000, 0x7a2cd000, 0x7b225000, 0x7c311000, 0x7e03a000, 0x7e402000, 0x80000000, }, + { 52, 62, 28, 47, 51, 37, 31, 36, 4, 58, 26, 29, 16, 59, 57, 33, 22, 27, 49, 44, 19, 56, 34, 23, 5, 14, 45, 48, 21, 25, 18, 12, 43, 53, 60, 17, 46, 15, 63, 30, 42, 38, 41, 8, 39, 20, 1, 10, 54, 40, 32, 24, 9, 2, 35, 3, 7, 0, 61, 11, 13, 55, 6, 50, }, +}; +const pattern_t pat5 = { + { 0xae7000, 0x436e000, 0x81e1000, 0xb276000, 0xf8bf000, 0xfb26000, 0xfe7e000, 0x137ad000, 0x14b8e000, 0x157aa000, 0x1981a000, 0x1a32f000, 0x1bc9e000, 0x1def5000, 0x1e8ef000, 0x2068f000, 0x22692000, 0x22a6c000, 0x255bf000, 0x26977000, 0x27619000, 0x2977c000, 0x2ce0c000, 0x2e1ec000, 0x2e26c000, 0x31ce8000, 0x34e6c000, 0x365cd000, 0x37e87000, 0x385e3000, 0x3a7e2000, 0x3a9c7000, 0x41597000, 0x42e8a000, 0x453cc000, 0x454bf000, 0x4b24c000, 0x4ba54000, 0x4e307000, 0x4f059000, 0x55d5a000, 0x56277000, 0x56b90000, 0x5882d000, 0x5a2c5000, 0x5b369000, 0x5d442000, 0x5d671000, 0x5fdd0000, 0x60ce0000, 0x63713000, 0x64130000, 0x65973000, 0x67ad9000, 0x68764000, 0x68bb2000, 0x690d1000, 0x6a2c8000, 0x73e9f000, 0x74e75000, 0x77861000, 0x77ee5000, 0x7cddb000, 0x80000000, }, + { 42, 25, 15, 58, 32, 61, 30, 56, 48, 62, 38, 50, 7, 45, 16, 29, 12, 4, 41, 3, 27, 18, 57, 10, 51, 17, 21, 14, 35, 19, 44, 47, 49, 26, 59, 63, 28, 55, 20, 13, 5, 6, 37, 54, 40, 22, 23, 46, 11, 36, 34, 31, 2, 60, 9, 52, 24, 1, 53, 0, 39, 43, 8, 33, }, +}; +const pattern_t pat6 = { + { 0xad2000, 0x222f000, 0x64b4000, 0x6c66000, 0x6f35000, 0x9e50000, 0xe744000, 0xf129000, 0x101bb000, 0x11bf8000, 0x14b89000, 0x1691c000, 0x17a0d000, 0x1817a000, 0x1997a000, 0x1d736000, 0x1db33000, 0x1fdd8000, 0x21e56000, 0x2266c000, 0x22875000, 0x22b84000, 0x230ed000, 0x239c5000, 0x24e1a000, 0x275f5000, 0x29036000, 0x29f69000, 0x2e538000, 0x2efca000, 0x2f0bc000, 0x2f1bf000, 0x305cb000, 0x31ce7000, 0x345c4000, 0x35d4f000, 0x36e56000, 0x3ae9e000, 0x3cc27000, 0x40117000, 0x4299f000, 0x434c3000, 0x443d4000, 0x4552d000, 0x4a8a8000, 0x4cdea000, 0x51bd5000, 0x580c4000, 0x58381000, 0x59dc0000, 0x5ba7f000, 0x5d88b000, 0x5e0c4000, 0x5ee57000, 0x61f3f000, 0x63a4a000, 0x68a8a000, 0x68ec5000, 0x6937b000, 0x720be000, 0x72cf5000, 0x74fc8000, 0x76464000, 0x80000000, }, + { 31, 46, 36, 22, 63, 12, 51, 60, 13, 44, 41, 6, 11, 17, 42, 24, 16, 61, 20, 26, 35, 21, 29, 55, 50, 45, 62, 19, 54, 9, 30, 34, 53, 52, 10, 39, 0, 49, 48, 38, 40, 28, 23, 56, 2, 5, 4, 59, 14, 57, 3, 25, 43, 32, 27, 47, 8, 7, 37, 33, 1, 18, 58, 15, }, +}; +const pattern_t pat7 = { + { 0xd83000, 0x1597000, 0x245b000, 0x6a75000, 0x8fda000, 0x960e000, 0xd310000, 0xe6cd000, 0x1409a000, 0x15221000, 0x16059000, 0x1b3a4000, 0x1ceea000, 0x1ed1a000, 0x1ef0f000, 0x21723000, 0x21efc000, 0x24594000, 0x26d7f000, 0x28c4f000, 0x2fa89000, 0x304f0000, 0x30dbb000, 0x30de3000, 0x3365d000, 0x36dbc000, 0x3acb2000, 0x3e291000, 0x3f7da000, 0x41352000, 0x41a0f000, 0x435c8000, 0x4475a000, 0x47536000, 0x47726000, 0x4a81f000, 0x4be4e000, 0x4bf05000, 0x4c15b000, 0x515b4000, 0x52ef5000, 0x548cc000, 0x5692a000, 0x59ef2000, 0x5b97c000, 0x5c4f0000, 0x5d1b9000, 0x618ed000, 0x61bcc000, 0x61e07000, 0x639a3000, 0x65302000, 0x68041000, 0x6be56000, 0x721a3000, 0x72c99000, 0x740b9000, 0x7586d000, 0x75eca000, 0x76406000, 0x7b68a000, 0x7dd26000, 0x7ed55000, 0x80000000, }, + { 44, 57, 22, 35, 63, 11, 15, 49, 61, 40, 29, 20, 19, 42, 32, 12, 41, 6, 46, 60, 52, 5, 36, 10, 2, 8, 3, 33, 54, 39, 58, 48, 62, 7, 51, 34, 0, 1, 18, 9, 55, 31, 23, 38, 25, 21, 17, 24, 13, 50, 16, 14, 43, 53, 45, 28, 59, 37, 26, 30, 47, 27, 56, 4, }, +}; +const pattern_t pat8 = { + { 0x1b8000, 0x27eb000, 0x5a4d000, 0x6ecc000, 0xb52e000, 0xb70e000, 0xc6db000, 0xd83d000, 0xed51000, 0x13c59000, 0x13fef000, 0x142e1000, 0x192d0000, 0x1aa63000, 0x1e230000, 0x1f464000, 0x20de4000, 0x2234b000, 0x25459000, 0x27018000, 0x28263000, 0x29cc7000, 0x32227000, 0x32c63000, 0x34af0000, 0x37e27000, 0x3afc9000, 0x3c166000, 0x3df20000, 0x405bd000, 0x41273000, 0x45c39000, 0x471be000, 0x4758e000, 0x4b3fc000, 0x4c6b2000, 0x4c80f000, 0x4ccd6000, 0x4d9e0000, 0x4e07f000, 0x4eeda000, 0x541ae000, 0x58aa7000, 0x5a2c6000, 0x5a628000, 0x5ab94000, 0x5bddc000, 0x5d1d4000, 0x5e643000, 0x5f72f000, 0x64771000, 0x67bd4000, 0x6a28c000, 0x6c977000, 0x6cc4e000, 0x710c4000, 0x74b86000, 0x75cf7000, 0x77d4b000, 0x7870e000, 0x7c47c000, 0x7eb52000, 0x7fbea000, 0x80000000, }, + { 7, 29, 62, 8, 54, 38, 35, 45, 60, 55, 1, 40, 4, 19, 50, 63, 48, 51, 13, 27, 33, 39, 52, 46, 10, 9, 56, 2, 42, 43, 47, 44, 17, 5, 25, 6, 57, 23, 15, 58, 59, 22, 14, 26, 32, 61, 30, 0, 11, 12, 36, 24, 53, 49, 3, 20, 31, 28, 34, 18, 41, 21, 16, 37, }, +}; +const pattern_t pat9 = { + { 0x5b59000, 0xa6d7000, 0xbad3000, 0xdf91000, 0x115ad000, 0x13fde000, 0x17618000, 0x1b8e9000, 0x1e1b7000, 0x1e97d000, 0x21737000, 0x21a5e000, 0x24140000, 0x2558f000, 0x2647a000, 0x28257000, 0x285f6000, 0x2cb7a000, 0x2ebb1000, 0x30ae8000, 0x31543000, 0x315cb000, 0x31616000, 0x335ba000, 0x33ed6000, 0x35cf3000, 0x4162b000, 0x4409b000, 0x4629a000, 0x4b745000, 0x4c0ba000, 0x4cbc5000, 0x4dd97000, 0x4f34b000, 0x4f637000, 0x539d6000, 0x53f3d000, 0x56383000, 0x5642b000, 0x5a71f000, 0x5affa000, 0x5b486000, 0x5b8ef000, 0x60d88000, 0x61629000, 0x625cd000, 0x63326000, 0x6735e000, 0x67379000, 0x6a26a000, 0x6a281000, 0x6b997000, 0x6c50d000, 0x6cc6c000, 0x6f496000, 0x717ad000, 0x732ec000, 0x744dc000, 0x771e8000, 0x77cf0000, 0x79cad000, 0x7bb21000, 0x7e7b4000, 0x80000000, }, + { 35, 9, 46, 6, 29, 2, 3, 54, 55, 57, 41, 16, 44, 5, 0, 59, 10, 61, 22, 42, 47, 12, 14, 50, 39, 34, 21, 32, 25, 15, 26, 8, 38, 60, 28, 53, 62, 49, 58, 43, 36, 37, 52, 7, 19, 63, 17, 11, 45, 33, 23, 27, 24, 18, 48, 56, 31, 13, 51, 30, 4, 20, 40, 1, }, +}; +const pattern_t pat10 = { + { 0xa72000, 0x180a000, 0x6406000, 0x66df000, 0x83bb000, 0xa96f000, 0xd193000, 0x13b9b000, 0x13dae000, 0x16109000, 0x1853d000, 0x18887000, 0x19f0a000, 0x22151000, 0x229ba000, 0x26b58000, 0x2aaf4000, 0x2bf50000, 0x31a2e000, 0x31d4e000, 0x32196000, 0x3513a000, 0x36a2d000, 0x3746b000, 0x389ad000, 0x39d27000, 0x3dad3000, 0x3de55000, 0x3ea9b000, 0x3ec06000, 0x3f921000, 0x432d3000, 0x43bec000, 0x43dda000, 0x47b2b000, 0x4886e000, 0x4928e000, 0x49ad2000, 0x4d0df000, 0x4f40d000, 0x50959000, 0x54fa4000, 0x56091000, 0x5688d000, 0x5b7d8000, 0x5f6fd000, 0x601e4000, 0x64eaa000, 0x6752e000, 0x67fff000, 0x6a184000, 0x6ad7a000, 0x6adbc000, 0x6c434000, 0x6f451000, 0x6ffb4000, 0x707ee000, 0x71161000, 0x7146b000, 0x75dbf000, 0x77259000, 0x7acd4000, 0x7af71000, 0x80000000, }, + { 61, 38, 5, 23, 62, 11, 53, 9, 17, 45, 30, 29, 41, 60, 39, 21, 40, 19, 44, 33, 42, 50, 56, 28, 32, 46, 43, 20, 16, 3, 54, 8, 4, 26, 15, 34, 47, 12, 6, 27, 48, 0, 1, 2, 57, 59, 7, 58, 49, 35, 24, 37, 52, 63, 10, 55, 36, 13, 14, 25, 18, 22, 31, 51, }, +}; +const pattern_t pat11 = { + { 0x996000, 0xaff000, 0x199a000, 0x46f3000, 0x74c0000, 0x758d000, 0xcd09000, 0xe48c000, 0xe8de000, 0xf111000, 0xf87b000, 0x10b1c000, 0x15d63000, 0x17b21000, 0x182d3000, 0x19167000, 0x198ce000, 0x1bd47000, 0x1dff1000, 0x1edc0000, 0x1f890000, 0x20860000, 0x23207000, 0x29bd5000, 0x2ac0f000, 0x2e395000, 0x2e707000, 0x329de000, 0x3497f000, 0x3807f000, 0x38a94000, 0x40a19000, 0x4168e000, 0x42ca0000, 0x42de9000, 0x45194000, 0x464f2000, 0x4700f000, 0x47dbb000, 0x4dae7000, 0x50660000, 0x535a8000, 0x5546b000, 0x57b55000, 0x5860a000, 0x5a9ee000, 0x5b8d9000, 0x5c49f000, 0x5cb4d000, 0x5d28c000, 0x60dcd000, 0x62557000, 0x64b0c000, 0x654cb000, 0x65746000, 0x65e29000, 0x6648f000, 0x66c56000, 0x6999e000, 0x6a11c000, 0x6ca04000, 0x79e60000, 0x7edce000, 0x80000000, }, + { 16, 28, 2, 38, 10, 57, 21, 26, 61, 43, 46, 31, 56, 7, 47, 48, 58, 25, 63, 4, 59, 15, 32, 50, 1, 40, 53, 18, 17, 24, 29, 30, 55, 36, 49, 42, 41, 37, 23, 39, 6, 51, 33, 9, 45, 5, 35, 19, 44, 11, 34, 0, 27, 12, 60, 62, 20, 13, 22, 8, 14, 54, 3, 52, }, +}; +const pattern_t pat12 = { + { 0x513000, 0x1b72000, 0x1e27000, 0x3a63000, 0x1115c000, 0x158b4000, 0x1664f000, 0x1b667000, 0x1f838000, 0x21410000, 0x260c7000, 0x2cd8f000, 0x2ce37000, 0x2df16000, 0x2e59e000, 0x2e8eb000, 0x2ebd2000, 0x2f1d2000, 0x2fc42000, 0x30d00000, 0x31ef1000, 0x3301a000, 0x38097000, 0x38a1e000, 0x3d818000, 0x3e898000, 0x3f90f000, 0x47710000, 0x478bb000, 0x485ab000, 0x48e54000, 0x4cfe1000, 0x53a89000, 0x53d10000, 0x56308000, 0x56f3b000, 0x577f6000, 0x58734000, 0x5889b000, 0x58ad7000, 0x5923a000, 0x59aef000, 0x5dad3000, 0x5e32f000, 0x63b3a000, 0x665c9000, 0x68cde000, 0x69252000, 0x6a777000, 0x6a79a000, 0x6c1f0000, 0x6cb9a000, 0x6d319000, 0x6dc82000, 0x6dd4d000, 0x6e188000, 0x7184d000, 0x7206e000, 0x73980000, 0x740ad000, 0x75473000, 0x7614d000, 0x79b17000, 0x80000000, }, + { 4, 60, 10, 35, 6, 31, 5, 18, 53, 17, 20, 8, 56, 29, 7, 48, 40, 0, 12, 39, 2, 43, 15, 61, 42, 30, 50, 14, 49, 38, 34, 58, 24, 55, 33, 63, 28, 51, 59, 46, 11, 22, 45, 41, 13, 44, 23, 47, 3, 32, 16, 54, 26, 19, 25, 52, 27, 57, 36, 9, 37, 21, 62, 1, }, +}; +const pattern_t pat13 = { + { 0x351e000, 0x5917000, 0xa992000, 0xc471000, 0xc69c000, 0xc6ed000, 0xc919000, 0xd713000, 0xec14000, 0xfa31000, 0x17567000, 0x1d81a000, 0x1f3c8000, 0x215b5000, 0x26e41000, 0x2a2d4000, 0x2b750000, 0x2bea0000, 0x2c5ae000, 0x2ca2c000, 0x30a94000, 0x31074000, 0x314d3000, 0x31b1e000, 0x31de2000, 0x32062000, 0x33da5000, 0x37838000, 0x385ec000, 0x38740000, 0x387f9000, 0x38be6000, 0x3d2f7000, 0x3eaf5000, 0x40266000, 0x402f3000, 0x40fda000, 0x4a4bd000, 0x4b831000, 0x4bfc9000, 0x4ccaa000, 0x4ea43000, 0x50190000, 0x547c8000, 0x58cc6000, 0x58ea5000, 0x59de1000, 0x5c7f1000, 0x5f713000, 0x63f9a000, 0x6686d000, 0x675c1000, 0x6cccc000, 0x6e409000, 0x6fb6d000, 0x71a70000, 0x72f60000, 0x77bd9000, 0x79013000, 0x7a8d3000, 0x7b341000, 0x7d8f7000, 0x7fe43000, 0x80000000, }, + { 10, 52, 48, 8, 34, 4, 35, 19, 3, 17, 54, 45, 31, 38, 24, 44, 21, 36, 22, 11, 43, 40, 39, 26, 5, 30, 2, 7, 57, 12, 20, 32, 62, 15, 55, 14, 25, 58, 6, 33, 49, 9, 59, 27, 13, 63, 42, 61, 1, 51, 0, 50, 37, 47, 16, 18, 41, 56, 60, 46, 23, 28, 53, 29, }, +}; +const pattern_t pat14 = { + { 0xf8e000, 0x169a000, 0x3816000, 0x67a9000, 0x89f3000, 0xac97000, 0xc8da000, 0xf077000, 0x119f1000, 0x13902000, 0x19785000, 0x1ca7f000, 0x1f958000, 0x2027d000, 0x2251f000, 0x24661000, 0x25604000, 0x2b924000, 0x2be5f000, 0x2ec27000, 0x330a5000, 0x3349e000, 0x33a84000, 0x344fa000, 0x34514000, 0x37966000, 0x37f0b000, 0x37fcd000, 0x386d0000, 0x39600000, 0x39de4000, 0x3e601000, 0x3e7f1000, 0x42c61000, 0x48806000, 0x4d3d0000, 0x4f5ff000, 0x512c1000, 0x53fd4000, 0x59440000, 0x5b386000, 0x5e8a0000, 0x5fca3000, 0x6016c000, 0x61ca8000, 0x64915000, 0x66b99000, 0x67226000, 0x69b2f000, 0x6a473000, 0x6a590000, 0x6c844000, 0x6cb8c000, 0x713b5000, 0x7558a000, 0x75eab000, 0x76d15000, 0x77efe000, 0x78762000, 0x7bddc000, 0x7ce92000, 0x7dc44000, 0x7f54b000, 0x80000000, }, + { 54, 31, 48, 10, 51, 49, 55, 19, 38, 18, 44, 5, 17, 20, 16, 11, 9, 3, 42, 59, 63, 45, 25, 60, 57, 21, 40, 29, 0, 39, 26, 7, 53, 12, 13, 2, 58, 41, 22, 8, 14, 28, 46, 24, 27, 6, 52, 32, 56, 4, 30, 36, 15, 47, 23, 37, 43, 35, 50, 33, 61, 34, 1, 62, }, +}; +const pattern_t pat15 = { + { 0xe16000, 0xec6000, 0xf6b000, 0x634b000, 0x6896000, 0x91db000, 0xc2c8000, 0xe083000, 0xfd7f000, 0x10479000, 0x17740000, 0x18292000, 0x1aaca000, 0x1cb55000, 0x1d2be000, 0x222af000, 0x2cb03000, 0x2fabc000, 0x32034000, 0x35c0f000, 0x3c5ec000, 0x40908000, 0x4128e000, 0x44411000, 0x44bcd000, 0x4f0ac000, 0x5167b000, 0x5541c000, 0x581bc000, 0x584e5000, 0x588fb000, 0x593d3000, 0x5b25d000, 0x5dc99000, 0x60b35000, 0x60ffc000, 0x638e8000, 0x63cf8000, 0x64ee1000, 0x6523c000, 0x654a1000, 0x687bf000, 0x68bef000, 0x69826000, 0x69d90000, 0x6a622000, 0x6d1b9000, 0x6d1e1000, 0x6d886000, 0x6fe4a000, 0x6feac000, 0x720b2000, 0x734dc000, 0x73530000, 0x73f1e000, 0x7479c000, 0x76e33000, 0x786dc000, 0x79b40000, 0x79e49000, 0x7b66c000, 0x7b904000, 0x7c906000, 0x80000000, }, + { 6, 17, 62, 20, 61, 32, 22, 14, 28, 18, 3, 42, 63, 43, 46, 34, 29, 30, 35, 1, 37, 40, 10, 26, 5, 31, 15, 54, 8, 33, 9, 4, 39, 53, 23, 25, 41, 59, 12, 13, 60, 2, 7, 56, 58, 27, 11, 38, 36, 45, 47, 0, 57, 50, 48, 16, 51, 49, 55, 52, 44, 24, 19, 21, }, +}; +const pattern_t pat16 = { + { 0x596a000, 0x8644000, 0xa943000, 0xd59e000, 0x1062f000, 0x1082a000, 0x10c1b000, 0x10f9e000, 0x11e64000, 0x12e73000, 0x15ce7000, 0x16037000, 0x16d2e000, 0x17035000, 0x185ad000, 0x18d9b000, 0x19ac7000, 0x1b2fa000, 0x1cd6c000, 0x1d5f0000, 0x1f72c000, 0x20891000, 0x24bfa000, 0x25c1d000, 0x28e24000, 0x2a5f8000, 0x2e0ae000, 0x2fddf000, 0x3119d000, 0x332ee000, 0x3480a000, 0x34ea5000, 0x3534e000, 0x3538b000, 0x362e2000, 0x38f58000, 0x39ab0000, 0x3a519000, 0x3a62b000, 0x3b006000, 0x3d523000, 0x3e0f7000, 0x42366000, 0x42feb000, 0x44013000, 0x46b98000, 0x49794000, 0x4dce7000, 0x4f1f3000, 0x57ecd000, 0x5aaa2000, 0x5f419000, 0x61517000, 0x6797d000, 0x69a20000, 0x6a070000, 0x70575000, 0x75322000, 0x75a9e000, 0x79043000, 0x79875000, 0x7addc000, 0x7de88000, 0x80000000, }, + { 26, 25, 6, 50, 32, 53, 34, 27, 3, 16, 49, 28, 46, 38, 56, 4, 18, 24, 51, 36, 63, 5, 48, 13, 43, 55, 0, 62, 35, 7, 41, 21, 44, 60, 31, 39, 14, 8, 61, 58, 52, 23, 59, 33, 10, 37, 20, 30, 40, 22, 11, 54, 57, 1, 29, 47, 2, 17, 19, 45, 15, 9, 12, 42, }, +}; +const pattern_t pat17 = { + { 0x28ab000, 0x3ac8000, 0x3fe1000, 0x63a7000, 0x90fc000, 0xb3f2000, 0xd2f2000, 0xe032000, 0x12d4c000, 0x13135000, 0x14652000, 0x15331000, 0x1570c000, 0x1688e000, 0x16bc3000, 0x1cbe3000, 0x1fe0f000, 0x2517f000, 0x26c6b000, 0x2a284000, 0x2a4e2000, 0x2add5000, 0x2bd06000, 0x2ca3a000, 0x2eb11000, 0x324d1000, 0x35662000, 0x38695000, 0x38ce7000, 0x391ac000, 0x398f9000, 0x39949000, 0x401f3000, 0x457f0000, 0x45c6d000, 0x4b561000, 0x522fc000, 0x54ef0000, 0x559f8000, 0x562a7000, 0x56a04000, 0x57b68000, 0x59702000, 0x5ffc9000, 0x63a76000, 0x63c37000, 0x65d3e000, 0x67130000, 0x6a03a000, 0x6bcd6000, 0x6be96000, 0x6bf52000, 0x6fcd9000, 0x7038c000, 0x70a47000, 0x72881000, 0x72ed0000, 0x75035000, 0x75c11000, 0x77fa5000, 0x797c9000, 0x79813000, 0x7bbbb000, 0x80000000, }, + { 18, 15, 56, 5, 25, 47, 39, 55, 12, 14, 51, 33, 0, 7, 9, 44, 50, 31, 62, 59, 3, 35, 23, 17, 30, 60, 11, 24, 40, 20, 52, 2, 22, 8, 57, 42, 32, 54, 36, 48, 49, 13, 58, 10, 28, 63, 16, 41, 27, 21, 37, 4, 1, 29, 19, 6, 53, 45, 46, 38, 34, 43, 61, 26, }, +}; +const pattern_t pat18 = { + { 0x38d6000, 0x5379000, 0x5cae000, 0x5d20000, 0xa248000, 0xb4d0000, 0xd7c0000, 0xf731000, 0x116ae000, 0x151d2000, 0x1747d000, 0x1bfb6000, 0x1d758000, 0x2053d000, 0x24dda000, 0x25274000, 0x269c0000, 0x273e8000, 0x2a5d0000, 0x2ad34000, 0x3016b000, 0x30d1a000, 0x32960000, 0x34b3b000, 0x36e4f000, 0x37934000, 0x38c42000, 0x3c2d2000, 0x3d23d000, 0x3d89a000, 0x3dc85000, 0x3e9a7000, 0x3f25b000, 0x45bd1000, 0x48d94000, 0x4b126000, 0x4e17c000, 0x4f377000, 0x50908000, 0x51957000, 0x53410000, 0x5412c000, 0x55256000, 0x56b17000, 0x5707b000, 0x5bbe5000, 0x5d067000, 0x5e1c1000, 0x6380b000, 0x66009000, 0x68240000, 0x69fc4000, 0x6c327000, 0x6c5d2000, 0x6f69d000, 0x739c7000, 0x744bc000, 0x74cd8000, 0x787b8000, 0x78c61000, 0x7969d000, 0x79aae000, 0x7b032000, 0x80000000, }, + { 16, 48, 50, 60, 13, 39, 20, 4, 63, 18, 14, 30, 55, 8, 62, 37, 43, 41, 11, 0, 36, 33, 34, 49, 17, 58, 38, 22, 19, 5, 21, 12, 47, 25, 57, 61, 7, 3, 10, 23, 52, 24, 6, 53, 2, 26, 1, 31, 28, 46, 42, 9, 45, 29, 27, 54, 32, 56, 51, 44, 35, 59, 40, 15, }, +}; +const pattern_t pat19 = { + { 0x297d000, 0x34e0000, 0x7801000, 0x9664000, 0x96fa000, 0xbb9f000, 0xc192000, 0xc4a5000, 0xca74000, 0xcce8000, 0x173d8000, 0x1a8d8000, 0x1b299000, 0x1b52d000, 0x1e813000, 0x2185e000, 0x21abe000, 0x2b9a4000, 0x2c4b6000, 0x2fa27000, 0x343ba000, 0x356fd000, 0x37c6e000, 0x38365000, 0x3a9e4000, 0x3b599000, 0x4296b000, 0x43196000, 0x4381e000, 0x44783000, 0x47a75000, 0x4bd78000, 0x4d05d000, 0x4edb2000, 0x4eefd000, 0x4fecc000, 0x51f68000, 0x5252b000, 0x5439e000, 0x55fb3000, 0x5814f000, 0x5939d000, 0x60a78000, 0x62a86000, 0x633b0000, 0x64a68000, 0x64b62000, 0x66207000, 0x66540000, 0x67f90000, 0x68bf3000, 0x6a069000, 0x6d2ac000, 0x70c9f000, 0x71bab000, 0x724bc000, 0x783d8000, 0x7900e000, 0x79399000, 0x79763000, 0x7c8a8000, 0x7e680000, 0x7f6de000, 0x80000000, }, + { 14, 59, 60, 24, 18, 22, 62, 12, 45, 2, 32, 11, 25, 37, 13, 7, 50, 39, 56, 17, 47, 40, 29, 43, 15, 34, 4, 57, 31, 38, 21, 28, 36, 27, 42, 1, 23, 33, 5, 61, 44, 55, 8, 30, 10, 41, 19, 48, 16, 52, 49, 46, 54, 58, 6, 0, 51, 3, 26, 20, 53, 9, 35, 63, }, +}; +const pattern_t pat20 = { + { 0x8f7000, 0xa01000, 0x38e3000, 0x5299000, 0x6875000, 0x7f3e000, 0x827f000, 0x9413000, 0xca71000, 0xfb11000, 0x10beb000, 0x176be000, 0x1924f000, 0x1cfd6000, 0x1d20d000, 0x1ebb7000, 0x22c93000, 0x23601000, 0x2cf7a000, 0x2d3af000, 0x2e391000, 0x2f294000, 0x318ad000, 0x34ddd000, 0x365e4000, 0x3b8d2000, 0x3c0f8000, 0x3d2fd000, 0x3e431000, 0x3f0fe000, 0x4074e000, 0x40d1c000, 0x41936000, 0x4347b000, 0x452d7000, 0x486d3000, 0x4b47e000, 0x4b709000, 0x4c349000, 0x4ff13000, 0x50faa000, 0x51a07000, 0x52f30000, 0x55f29000, 0x57ad4000, 0x5909f000, 0x5a0f6000, 0x5de57000, 0x60d2f000, 0x625ff000, 0x6288e000, 0x65077000, 0x6a707000, 0x6a73f000, 0x6d720000, 0x6e390000, 0x6edc9000, 0x6ee78000, 0x77ac2000, 0x77ad3000, 0x7868f000, 0x79a1b000, 0x7aec6000, 0x80000000, }, + { 21, 56, 38, 11, 62, 9, 30, 47, 34, 23, 37, 16, 5, 49, 10, 43, 4, 45, 36, 7, 42, 1, 53, 57, 20, 59, 55, 50, 46, 39, 60, 27, 12, 31, 48, 25, 15, 22, 44, 52, 14, 33, 0, 29, 17, 18, 2, 32, 24, 19, 6, 41, 54, 8, 35, 26, 61, 3, 51, 13, 63, 28, 40, 58, }, +}; +const pattern_t pat21 = { + { 0x2a8e000, 0xa4bd000, 0xa935000, 0xcc05000, 0xdfe4000, 0xe014000, 0xff46000, 0x18c8c000, 0x199ec000, 0x19ce0000, 0x1f684000, 0x1ff5c000, 0x22d58000, 0x27651000, 0x280e5000, 0x2e2a4000, 0x2e432000, 0x2f96e000, 0x2f9c3000, 0x3343d000, 0x338bb000, 0x34032000, 0x34101000, 0x368c2000, 0x37b95000, 0x39492000, 0x39932000, 0x3b611000, 0x3c89e000, 0x40aa9000, 0x42358000, 0x4890e000, 0x495c9000, 0x4a79d000, 0x4c58e000, 0x4df9a000, 0x4f304000, 0x4fa4c000, 0x54d1d000, 0x58461000, 0x58f43000, 0x5a3d1000, 0x5a765000, 0x5c5c0000, 0x60488000, 0x60fad000, 0x613e5000, 0x61d61000, 0x62d17000, 0x641ff000, 0x67f8b000, 0x69c5d000, 0x6b931000, 0x6efd4000, 0x70333000, 0x70857000, 0x721f6000, 0x72f53000, 0x74450000, 0x746f7000, 0x76067000, 0x7774a000, 0x77ea6000, 0x80000000, }, + { 28, 51, 33, 2, 30, 55, 29, 17, 40, 48, 32, 9, 39, 1, 49, 50, 37, 43, 62, 11, 10, 26, 22, 6, 8, 7, 45, 47, 46, 42, 60, 5, 12, 56, 4, 23, 35, 25, 13, 16, 61, 54, 31, 63, 34, 19, 41, 59, 38, 24, 0, 58, 53, 44, 3, 18, 52, 20, 36, 27, 14, 21, 57, 15, }, +}; +const pattern_t pat22 = { + { 0x314d000, 0x4452000, 0x6673000, 0xab09000, 0xc80d000, 0x10eda000, 0x129c2000, 0x12f1f000, 0x13e9b000, 0x1450c000, 0x15aeb000, 0x1667c000, 0x190b2000, 0x19ac5000, 0x1c0ac000, 0x1c229000, 0x1ece8000, 0x1fc48000, 0x22abd000, 0x24268000, 0x2adce000, 0x2b809000, 0x30a11000, 0x31d08000, 0x36700000, 0x39e6a000, 0x3b84b000, 0x41e84000, 0x46301000, 0x4a326000, 0x50fda000, 0x5299a000, 0x56acf000, 0x57f66000, 0x586ab000, 0x58df5000, 0x591cc000, 0x59b91000, 0x59cbd000, 0x5b4d0000, 0x5cca7000, 0x5cfce000, 0x5d120000, 0x5d51a000, 0x5eaa0000, 0x5ebac000, 0x5f0e1000, 0x5f285000, 0x5f4d3000, 0x5ff61000, 0x60b51000, 0x61435000, 0x651fd000, 0x6b954000, 0x705aa000, 0x71a41000, 0x73ec7000, 0x75f92000, 0x76854000, 0x77cb9000, 0x782ca000, 0x7a2af000, 0x7eaa6000, 0x80000000, }, + { 16, 8, 5, 59, 4, 18, 26, 43, 33, 57, 6, 47, 56, 46, 10, 54, 52, 0, 50, 30, 39, 24, 38, 63, 28, 25, 49, 31, 55, 62, 3, 17, 23, 13, 37, 53, 34, 14, 44, 12, 19, 36, 27, 61, 51, 42, 41, 60, 45, 1, 7, 35, 21, 58, 20, 15, 2, 9, 22, 29, 48, 32, 40, 11, }, +}; +const pattern_t pat23 = { + { 0x47000, 0x680000, 0x176a000, 0x1db8000, 0x600e000, 0x808c000, 0x9e58000, 0xa82f000, 0xaebb000, 0xc938000, 0xd0eb000, 0xdc5e000, 0xe503000, 0x11e56000, 0x12dbd000, 0x14681000, 0x15200000, 0x18256000, 0x1be75000, 0x1d2a0000, 0x1ed67000, 0x27e8a000, 0x2bc39000, 0x2bf4b000, 0x2c94f000, 0x2d575000, 0x2d82e000, 0x2e440000, 0x2ecda000, 0x2fbc2000, 0x33ab0000, 0x360b8000, 0x39630000, 0x3a654000, 0x3d2b6000, 0x3eeff000, 0x41590000, 0x417ea000, 0x42ff9000, 0x4bca4000, 0x503b0000, 0x508e4000, 0x52a2e000, 0x535b6000, 0x54335000, 0x57412000, 0x57dc6000, 0x590d9000, 0x5fc0a000, 0x60552000, 0x60665000, 0x6168d000, 0x65b16000, 0x67328000, 0x6742d000, 0x68c88000, 0x6b802000, 0x6f6d2000, 0x7040e000, 0x77e31000, 0x79c71000, 0x7da4a000, 0x7e26b000, 0x80000000, }, + { 63, 50, 51, 33, 28, 35, 24, 14, 4, 23, 47, 11, 37, 41, 12, 55, 62, 32, 34, 30, 25, 43, 16, 0, 3, 49, 61, 15, 57, 46, 59, 44, 31, 27, 21, 53, 5, 2, 8, 56, 52, 22, 60, 40, 20, 1, 48, 18, 17, 19, 54, 29, 9, 38, 42, 6, 39, 45, 13, 10, 26, 58, 36, 7, }, +}; +const pattern_t pat24 = { + { 0x3890000, 0x3fd9000, 0x62d6000, 0x7df0000, 0x895c000, 0xab61000, 0xc23b000, 0x10ab3000, 0x1247c000, 0x13f00000, 0x16604000, 0x1a444000, 0x1c2c8000, 0x1c467000, 0x1d396000, 0x1e683000, 0x21080000, 0x2442a000, 0x27fea000, 0x282eb000, 0x28e2c000, 0x2a625000, 0x2b3b2000, 0x2bbd5000, 0x2c886000, 0x2cbe8000, 0x31518000, 0x35425000, 0x355f4000, 0x35d7a000, 0x3851d000, 0x396a6000, 0x3d10f000, 0x3d890000, 0x49238000, 0x4ab7e000, 0x4fadf000, 0x50603000, 0x5233a000, 0x53279000, 0x5586c000, 0x56968000, 0x58101000, 0x588b6000, 0x5bc19000, 0x5cc10000, 0x623f6000, 0x629f4000, 0x63176000, 0x63dcc000, 0x681d0000, 0x69c0e000, 0x6a9fa000, 0x6ae5e000, 0x6d2ba000, 0x6e422000, 0x73f94000, 0x77932000, 0x78b24000, 0x794c1000, 0x795d2000, 0x7ae08000, 0x7b3ce000, 0x80000000, }, + { 56, 47, 54, 62, 29, 43, 25, 59, 41, 7, 52, 63, 15, 21, 16, 14, 39, 17, 45, 11, 27, 24, 55, 31, 53, 4, 6, 2, 20, 23, 5, 37, 32, 58, 13, 51, 1, 8, 3, 57, 46, 30, 35, 49, 18, 40, 9, 22, 42, 38, 34, 0, 19, 33, 26, 60, 10, 48, 36, 61, 44, 12, 50, 28, }, +}; +const pattern_t pat25 = { + { 0xcb000, 0x22bf000, 0x2461000, 0x246b000, 0x5c6f000, 0x5fb4000, 0x69a9000, 0x718c000, 0x92e6000, 0xbb2e000, 0xd916000, 0xf3dc000, 0xf568000, 0x10246000, 0x12d53000, 0x14dfd000, 0x1598a000, 0x1956a000, 0x1b01b000, 0x1b3b8000, 0x1ce06000, 0x20bc5000, 0x21351000, 0x233b0000, 0x23f2b000, 0x24e41000, 0x29cca000, 0x2b5bd000, 0x2ba68000, 0x2bf7f000, 0x31a58000, 0x34570000, 0x39941000, 0x3b765000, 0x3cd13000, 0x3d251000, 0x3fa05000, 0x40745000, 0x45c68000, 0x4a282000, 0x4ad19000, 0x4b4aa000, 0x4ca18000, 0x4e0b8000, 0x4eb97000, 0x4f68b000, 0x4fca2000, 0x52466000, 0x52edf000, 0x5602a000, 0x57f60000, 0x5cc18000, 0x5cee3000, 0x5da37000, 0x5dba4000, 0x64b77000, 0x66e9f000, 0x68b9d000, 0x6aac9000, 0x6d873000, 0x6f7e6000, 0x71036000, 0x75a54000, 0x80000000, }, + { 1, 58, 13, 5, 62, 10, 49, 48, 19, 24, 54, 57, 20, 39, 35, 41, 28, 42, 6, 44, 34, 45, 55, 3, 2, 60, 38, 36, 30, 25, 7, 23, 53, 50, 61, 29, 40, 47, 22, 12, 27, 0, 52, 31, 8, 15, 37, 11, 46, 32, 4, 56, 17, 33, 26, 43, 51, 16, 9, 59, 63, 21, 14, 18, }, +}; +const pattern_t pat26 = { + { 0x1f4e000, 0x46f7000, 0x90a7000, 0xafe3000, 0xb2a8000, 0xb8b0000, 0xc480000, 0xc4e1000, 0xf03c000, 0xf075000, 0x14dbd000, 0x17728000, 0x1a146000, 0x1ab02000, 0x1af49000, 0x1be7a000, 0x1dc7a000, 0x1de5e000, 0x1f4f9000, 0x2092b000, 0x20a63000, 0x22937000, 0x22fe3000, 0x23e1c000, 0x28c46000, 0x294d6000, 0x2ad19000, 0x2b18b000, 0x2b233000, 0x2b685000, 0x2c792000, 0x2e6c2000, 0x2fa86000, 0x3320f000, 0x36f17000, 0x38406000, 0x38b1b000, 0x3a132000, 0x3b269000, 0x3cc43000, 0x3e2a2000, 0x3e3bb000, 0x3e83b000, 0x3ea14000, 0x4035d000, 0x4137f000, 0x4615b000, 0x50531000, 0x517c8000, 0x519e6000, 0x55ebc000, 0x594f8000, 0x5a732000, 0x5d2cb000, 0x5e409000, 0x5f394000, 0x5f3a8000, 0x60dc6000, 0x61373000, 0x6ebd6000, 0x6fd61000, 0x77161000, 0x7ce81000, 0x80000000, }, + { 61, 48, 12, 55, 3, 58, 51, 56, 15, 29, 54, 11, 31, 49, 40, 37, 7, 4, 23, 35, 25, 18, 27, 43, 6, 41, 17, 45, 52, 53, 47, 16, 42, 0, 30, 13, 38, 62, 1, 8, 21, 28, 57, 9, 60, 19, 44, 50, 14, 36, 22, 2, 32, 59, 34, 10, 63, 39, 5, 24, 33, 20, 46, 26, }, +}; +const pattern_t pat27 = { + { 0xa6a000, 0x4c7a000, 0x5183000, 0x8dda000, 0x9cbd000, 0xb860000, 0x10c24000, 0x12dda000, 0x147ab000, 0x14aa4000, 0x16c8f000, 0x17d5b000, 0x18b5c000, 0x1a163000, 0x1b0a1000, 0x24221000, 0x25ef8000, 0x267f1000, 0x268b7000, 0x26b07000, 0x273ad000, 0x27bc2000, 0x2856c000, 0x29896000, 0x2efeb000, 0x331a7000, 0x348e8000, 0x3707f000, 0x3f444000, 0x3fe2a000, 0x433b3000, 0x435d3000, 0x46d82000, 0x4a9d3000, 0x4c6cf000, 0x4ca36000, 0x4ec42000, 0x4f79c000, 0x53cd3000, 0x58c78000, 0x5d910000, 0x616cc000, 0x62800000, 0x65ded000, 0x68831000, 0x6b321000, 0x6cd46000, 0x6d0fa000, 0x6d2f9000, 0x6e353000, 0x6fd5e000, 0x706c5000, 0x7249f000, 0x75d6c000, 0x77528000, 0x783ad000, 0x79738000, 0x79bfe000, 0x79ee9000, 0x7b74a000, 0x7bb41000, 0x7bbeb000, 0x7bbfb000, 0x80000000, }, + { 61, 53, 12, 15, 26, 30, 32, 2, 16, 5, 39, 43, 20, 21, 49, 37, 11, 51, 18, 44, 31, 19, 24, 40, 1, 35, 50, 6, 57, 14, 46, 17, 22, 48, 29, 7, 34, 45, 10, 63, 23, 41, 54, 38, 4, 25, 42, 13, 56, 62, 36, 28, 33, 59, 55, 3, 9, 0, 58, 60, 47, 8, 52, 27, }, +}; +const pattern_t pat28 = { + { 0x439a000, 0x6860000, 0xd252000, 0x1105c000, 0x113c8000, 0x1429a000, 0x14922000, 0x15f32000, 0x1992f000, 0x1a1db000, 0x1a87c000, 0x1b260000, 0x1b292000, 0x1c253000, 0x1ea33000, 0x20bbc000, 0x215ae000, 0x25249000, 0x27c89000, 0x27e36000, 0x28bf2000, 0x29c27000, 0x2a575000, 0x2c6fa000, 0x31639000, 0x3184a000, 0x319c3000, 0x348a7000, 0x38aa8000, 0x39dd5000, 0x3a067000, 0x3c0dd000, 0x3cfd4000, 0x3ebb6000, 0x43259000, 0x46494000, 0x46fcb000, 0x4a050000, 0x4b5c4000, 0x4cff3000, 0x4edaa000, 0x4f025000, 0x542e1000, 0x55364000, 0x56338000, 0x56ef8000, 0x5711b000, 0x573d1000, 0x5943b000, 0x5b912000, 0x61ce2000, 0x65211000, 0x65dca000, 0x6dee2000, 0x6df30000, 0x7334d000, 0x73e76000, 0x7473a000, 0x75846000, 0x75fd0000, 0x77174000, 0x773e9000, 0x7a8db000, 0x80000000, }, + { 43, 11, 8, 56, 5, 22, 42, 55, 14, 32, 2, 47, 24, 51, 35, 25, 15, 58, 41, 27, 33, 37, 4, 36, 7, 53, 26, 48, 38, 19, 29, 28, 40, 10, 1, 46, 59, 63, 61, 62, 60, 30, 21, 39, 44, 57, 20, 18, 17, 54, 49, 52, 3, 12, 45, 13, 50, 9, 16, 23, 0, 6, 31, 34, }, +}; +const pattern_t pat29 = { + { 0x363000, 0x9bc000, 0x1907000, 0x41d5000, 0x5a6e000, 0x9f36000, 0xa3ee000, 0x14b98000, 0x1845c000, 0x188ea000, 0x1b297000, 0x1c024000, 0x1e1eb000, 0x1f3a4000, 0x2047f000, 0x2420a000, 0x28871000, 0x296dd000, 0x2c92c000, 0x2dd42000, 0x3444f000, 0x35b90000, 0x3683c000, 0x3d8ea000, 0x3fe6b000, 0x4200e000, 0x421cf000, 0x42a46000, 0x44463000, 0x44e61000, 0x45c82000, 0x485f8000, 0x48fe8000, 0x4a532000, 0x4a6fd000, 0x4c8f9000, 0x4dbd7000, 0x5052a000, 0x512bb000, 0x5281d000, 0x5315d000, 0x5a202000, 0x5a9fc000, 0x5c11a000, 0x6010b000, 0x62aa3000, 0x63d05000, 0x6774c000, 0x6776d000, 0x68105000, 0x699d5000, 0x69bc2000, 0x6b1b9000, 0x704d5000, 0x73d5c000, 0x73d94000, 0x78483000, 0x78c8c000, 0x78cc5000, 0x7ac8d000, 0x7ae00000, 0x7b597000, 0x7e6ab000, 0x80000000, }, + { 52, 40, 59, 29, 42, 34, 63, 44, 33, 37, 51, 23, 5, 36, 38, 43, 9, 4, 28, 55, 1, 6, 21, 26, 13, 24, 30, 15, 35, 17, 46, 20, 16, 10, 49, 48, 39, 62, 19, 14, 61, 27, 53, 2, 57, 58, 45, 7, 56, 50, 54, 25, 31, 11, 22, 47, 3, 0, 32, 12, 8, 41, 60, 18, }, +}; +const pattern_t pat30 = { + { 0x45c5000, 0x6bf3000, 0xc293000, 0xe470000, 0xe5b7000, 0x1256c000, 0x1444d000, 0x15699000, 0x16e86000, 0x1a4d5000, 0x1b803000, 0x1dcf9000, 0x1dd6f000, 0x1f57f000, 0x22879000, 0x263e9000, 0x29423000, 0x2a1a9000, 0x2a699000, 0x2c8fb000, 0x2d2e0000, 0x2ec5e000, 0x317a4000, 0x35a64000, 0x36967000, 0x37299000, 0x37c07000, 0x3b9bb000, 0x3c054000, 0x3ccbc000, 0x3d94a000, 0x3e2e9000, 0x3e7a4000, 0x40b98000, 0x44658000, 0x44738000, 0x44fe3000, 0x451d9000, 0x4536c000, 0x46df2000, 0x48855000, 0x503ce000, 0x53104000, 0x531fc000, 0x54c1b000, 0x56086000, 0x5642b000, 0x573a4000, 0x5887f000, 0x5a871000, 0x5c970000, 0x5e566000, 0x62b8f000, 0x642ce000, 0x65ee5000, 0x66db3000, 0x6727c000, 0x6a9a2000, 0x74a8f000, 0x7c29a000, 0x7cc57000, 0x7f221000, 0x7f28f000, 0x80000000, }, + { 29, 35, 8, 49, 30, 55, 27, 38, 58, 61, 0, 28, 15, 39, 5, 37, 32, 42, 46, 54, 12, 14, 1, 31, 59, 11, 47, 9, 13, 50, 2, 62, 60, 18, 20, 51, 23, 24, 53, 6, 25, 48, 41, 3, 33, 57, 44, 19, 22, 52, 4, 45, 10, 21, 56, 36, 17, 43, 7, 63, 16, 34, 26, 40, }, +}; +const pattern_t pat31 = { + { 0x143f000, 0x2068000, 0x328c000, 0x70a6000, 0x92a7000, 0x93dd000, 0xa3a8000, 0xbe51000, 0xbfc8000, 0xe353000, 0x1272f000, 0x143a4000, 0x16825000, 0x20bf8000, 0x20d9f000, 0x21e32000, 0x22426000, 0x2246b000, 0x22cea000, 0x25dc2000, 0x29324000, 0x29cd1000, 0x2aa44000, 0x2cd84000, 0x2dafb000, 0x2e74b000, 0x2f5b1000, 0x3a7a9000, 0x3bb38000, 0x3c11a000, 0x3c30a000, 0x3e2f1000, 0x4187b000, 0x42190000, 0x44e34000, 0x4d850000, 0x53ceb000, 0x540db000, 0x54937000, 0x5530a000, 0x5a111000, 0x5c280000, 0x5ef17000, 0x5fccf000, 0x64434000, 0x6498e000, 0x662c4000, 0x6a7e2000, 0x6b5a1000, 0x6c11f000, 0x6dd97000, 0x6ef1b000, 0x6f44e000, 0x7084f000, 0x73b53000, 0x7872c000, 0x78ed7000, 0x7935b000, 0x79bf9000, 0x7a6af000, 0x7b6fd000, 0x7bd42000, 0x7f233000, 0x80000000, }, + { 6, 25, 28, 44, 27, 43, 58, 33, 23, 21, 16, 48, 30, 26, 5, 20, 49, 38, 2, 45, 11, 61, 17, 0, 53, 13, 7, 52, 40, 31, 36, 4, 10, 8, 24, 22, 42, 63, 35, 60, 47, 29, 46, 19, 1, 3, 34, 55, 59, 14, 39, 12, 32, 50, 62, 54, 56, 51, 57, 15, 41, 18, 37, 9, }, +}; +const pattern_t* patterns[] = {&trivial_pattern, + &pat0, &pat1, &pat2, &pat3, &pat4, &pat5, &pat6, &pat7, + &pat8, &pat9, &pat10, &pat11, &pat12, &pat13, &pat14, &pat15, + &pat16, &pat17, &pat18, &pat19, &pat20, &pat21, &pat22, &pat23, + &pat24, &pat25, &pat26, &pat27, &pat28, &pat29, &pat30, &pat31}; + +//static variables used by the worker threads +static int outfd = 0; +static sem_t chunk_sems[NUM_THREADS - 1][NUM_CHUNKS]; + +static void +usage() +{ + (void) fprintf(stderr, "usage: fsync_integrity \n"); + exit(2); +} + + +/* Fills a buffer with a special marker. The marker contains information about + * the file offset where this buffer is supposed to go, and whether it will + * be written by a leader or a follower */ +static void +marker_fill(uint64_t* buf, int file_ofs, size_t len, int thread_num){ + int ofs; + uint32_t thread_mark = thread_num; + uint32_t final_mark = 0xe005b0ca; //"CABOOSE" in little endian + for (ofs = file_ofs; ofs < file_ofs + len; ofs += sizeof(uint64_t)){ + uint64_t mark = ((thread_num == (NUM_THREADS - 1) ? + (uint64_t)final_mark : (uint64_t)thread_mark) << (uint64_t)32) | + htonl(ofs & 0xFFFFFFFF); + int buf_idx = (ofs - file_ofs) / sizeof(uint64_t); + buf[buf_idx] = mark; + } +} + +static int +verify_file(int fd, const pattern_t* p_pat){ + int chunk_idx; + int good_data = 1; + int err = 0; + + for(chunk_idx=0; chunk_idx < NUM_CHUNKS; chunk_idx++){ + int i; + uint32_t chunk_start, chunk_end; + get_chunk_range(p_pat, chunk_idx, &chunk_start, &chunk_end); + size_t size = chunk_end - chunk_start; + uint64_t* desired_buf = malloc(size); + uint64_t* actual_buf = malloc(size); + marker_fill(desired_buf, chunk_start, size, NUM_THREADS - 1); + + //read the actual data from the file + if( read(fd, actual_buf, size) <= 0 ){ + perror("read"); + exit(1); + } + + //verify the data + for(i=0; i < size / sizeof(uint64_t); i++){ + int chunk_offset = sizeof(uint64_t) * i; + int file_offset = chunk_start + chunk_offset; + if (good_data && (actual_buf[i] != desired_buf[i])){ + fprintf(stderr, "fsync_integrity: miscompare at " + "chunk %i, chunk offset %lx, file offset %lx\n", + chunk_idx, chunk_offset, file_offset); + fprintf(stderr, "Expected %016lx, got %016lx\n", + desired_buf[i], actual_buf[i]); + err = 1; + good_data = 0; + } + else if (!good_data && (actual_buf[i] == desired_buf[i])) { + fprintf(stderr, "fsync_integrity: miscompare ends at " + "chunk %i, chunk offset %lx, file offset %lx\n", + chunk_idx, chunk_offset, file_offset); + good_data = 1; + } + } + free(desired_buf); + free(actual_buf); + } + + return (err); +} + +/* Writes a special marker to every byte within the chunk */ +static void +write_chunk(pattern_t* p_pat, int chunk_idx, int thread_num) +{ + uint32_t chunk_start, chunk_end; + get_chunk_range(p_pat, chunk_idx, &chunk_start, &chunk_end); + size_t size = chunk_end - chunk_start; + uint64_t* buf = malloc(size); + marker_fill(buf, chunk_start, size, thread_num); + pwrite(outfd, (void*)buf, size, chunk_start); + free(buf); +} + +static void +my_sync(int fd){ + if (fsync(fd)){ + perror("fsync"); + exit(1); + } +} + + +static void* +worker(void* args) +{ + int perm_idx, thread_num; + thread_data_t* data; + + data = (thread_data_t*)args; + thread_num = data->thread_num; + + for(perm_idx = 0; perm_idx < NUM_CHUNKS; perm_idx++) + { + int chunk_idx = data->pat->permutation[perm_idx]; + /* Acquire the semaphore, if necessary */ + if (thread_num > 0) { + if (-1 == sem_wait(&chunk_sems[thread_num - 1][chunk_idx])){ + perror("sem_wait"); + exit(1); + } + } + /* Write the data */ + write_chunk(data->pat, chunk_idx, thread_num); + /* Sync, if we are an even thread */ + if ((thread_num % 2) == 0) + my_sync(outfd); + /* Post the final semaphore, if necessary */ + if (thread_num < NUM_THREADS - 1) { + if (sem_post(&chunk_sems[thread_num][chunk_idx]) == -1){ + perror("sem_post"); + exit(1); + } + } + } + return 0; +} + + +int +main(int argc, char** argv) +{ + int rep; + int pat; + pthread_t threads[NUM_THREADS]; + thread_data_t thread_data[NUM_THREADS]; + + if (argc != 2){ + usage(); + } + + for(rep=0; rep < NUM_REPETITIONS; rep++){ + printf("Starting repetition %d\n", rep); + for(pat=0; pat < sizeof(patterns) / sizeof(patterns[0]); pat++){ + int i; + const pattern_t *pat_p = patterns[pat]; +/* pattern_t *pat_p = (void *)(uintptr_t)(const void *)patterns[pat];*/ + int sem_idx; + int ofs=0; + +/* printf("Starting on patterns[%d]\n" , pat);*/ + outfd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0644); + if (outfd == -1){ + perror("open"); + exit(1); + } + + //set the file size + if ( ftruncate(outfd, FSIZE)){ + perror("ftruncate"); + exit(1); + } + + //Zero-fill the file to avoid fragmentation, as recommended by mmap(2). + for(ofs=0; ofs < FSIZE; ofs+=CLUSTERSIZE){ + char buffer[CLUSTERSIZE]; + bzero(buffer, CLUSTERSIZE); + if ( -1 == write(outfd, buffer, CLUSTERSIZE)){ + perror("write"); + exit(1); + } + } + //Return the file pointer to the beginning prior to mmap + if (-1 == lseek(outfd, 0, SEEK_SET)){ + perror("lseek"); + } + + //Create the semaphores + for(i=0; i < NUM_THREADS - 1; i++) { + for(sem_idx=0; sem_idx < NUM_CHUNKS; sem_idx++){ + if (sem_init(&chunk_sems[i][sem_idx], 0, 0)){ + perror("sem_init"); + exit(1); + } + } + } + + //Create the worker threads + for(i=0; i < NUM_THREADS; i++) { + thread_data[i].pat = pat_p; + thread_data[i].thread_num = i; + if (pthread_create(&threads[i], NULL, worker, (void*)&thread_data[i])){ + perror("pthread_create"); + exit(1); + } + } + + //Join the threads + for(i=0; i < NUM_THREADS; i++) { + if (pthread_join(threads[i], NULL)){ + perror("pthread_join"); + exit(1); + } + } + + //destroy the semaphores + for(i=0; i < NUM_THREADS - 1; i++) { + for(sem_idx=0; sem_idx < NUM_CHUNKS; sem_idx++){ + if (sem_destroy(&chunk_sems[i][sem_idx])){ + perror("sem_destory"); + exit(1); + } + } + } + //printf("destroyed semaphores\n"); + + + //Verify the contents of the file. + if (verify_file(outfd, patterns[pat])) { + exit(1); + } + //printf("finished verify_file\n"); + + //close the file: + if (close(outfd)){ + perror("close"); + exit(1); + } + } + } + + return 0; +} diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/fsync_integrity_001_pos.ksh b/tests/sys/cddl/zfs/tests/txg_integrity/fsync_integrity_001_pos.ksh new file mode 100644 index 00000000000..d3324f9eb4a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/fsync_integrity_001_pos.ksh @@ -0,0 +1,83 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + +. ${STF_SUITE}/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: fsync_integrity_001_pos +# +# DESCRIPTION: +# +# Verify the integrity of non-aligned writes to the same blocks within the same +# transaction group, where an fsync is issued by a non-final writer. +# +# STRATEGY: + +# This test verifies that the unoverride in the following sequence of events is +# handled correctly: +# +# 1) A new transaction group opens +# 2) A write is issued to a certain block +# 3) The writer fsyncs() that file +# 4) TBD module immediately writes that block, then places an override in the +# syncer's TBD data structure, indicating that it doesn't need to write that +# block when syncing. +# 5) Another write is issued to the same block, with different data. +# 6) TBD module unoverrides that block in the syncer's TBD data structure +# 7) The syncer writes that block +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: BEGIN (2013-1-21) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +log_assert "Verify the integrity of non-aligned writes to the same blocks within the same transaction group, where an fsync is issued by a non-final writer." + +# Run the test program +fsync_integrity ${TESTDIR}/${TESTFILE} + +# Success is indicated by the return status +if [[ $? -ne 0 ]]; then + log_fail "Test failed to execute or file became corrupted" +else + log_pass +fi + + diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/make_patterns.py b/tests/sys/cddl/zfs/tests/txg_integrity/make_patterns.py new file mode 100644 index 00000000000..546eda1d346 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/make_patterns.py @@ -0,0 +1,59 @@ +#! /usr/bin/env python + +# $FreeBSD$ + +# Generate random IO patterns for the txg_integrity test +# We do this statically and embed the results into the code so that the +# Testing will be more repeatable compared to generating the tables at runtime + +import random + +CLUSTERSIZE = (1 << 16) +NUM_CHUNKS = 64 + + +def rand_partition(): + partitions = [] + while len(partitions) != NUM_CHUNKS: + # We don't want any duplicates, so we make a set and then check that + # its length is correct + partitions = sorted( + list( + set( + [random.randrange(0, + 2**31, + (2**31) * 8 / (NUM_CHUNKS * CLUSTERSIZE)) + for i in range(NUM_CHUNKS - 1)] + [2**31]))) + return partitions + + +def rand_permutation(): + perm = range(NUM_CHUNKS) + random.shuffle(perm) + return perm + + +def rand_follower_bitmap(): + bmp = 0 + chunks = random.sample(range(NUM_CHUNKS), NUM_CHUNKS / 2) + for chunk in chunks: + bmp |= (1 << chunk) + return bmp + + +def print_pattern(n): + print "const pattern_t pat%d = {" % n + print " {", + for p in rand_partition(): + print "%#x, " % p, + print " }," + print " {", + for p in rand_permutation(): + print "%d, " % p, + print " }," + print " %#x" % rand_follower_bitmap() + print "};" + + +for n in range(32): + print_pattern(n) diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/setup.ksh b/tests/sys/cddl/zfs/tests/txg_integrity/setup.ksh new file mode 100644 index 00000000000..36ca36cbfbc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/setup.ksh @@ -0,0 +1,49 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2011 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.0 10/20/11 SL" +# + +. ${STF_SUITE}/include/libtest.kshlib + +# For this test, we create an MD instead of using the defined DISKS. +# Data corrupts much more quickly on an MD. +# Make it small enough that we can tar up the entire pool for post-mortem +# analysis +log_must $MDCONFIG -a -t swap -s 1g -u $TESTCASE_ID + +log_must create_pool $TESTPOOL $TESTDEV +$RM -rf $TESTDIR +$MKDIR -p $TESTDIR + +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +log_pass + + diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.c b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.c new file mode 100644 index 00000000000..3200fca3bc9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.c @@ -0,0 +1,609 @@ +/* + * 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 http://www.opensolaris.org/os/licensing. + * 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 + * $FreeBSD$ + */ + +/* + * Copyright 2011-2012 Spectra Logic. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Verify the integrity of non-aligned writes to the same blocks that cross + * transaction groups. + * + * This test verifies that non-aligned writes are correctly committed to the + * file system, even adjacent transaction groups include writes to the same + * blocks. The test runs through multiple repetitions in an attempt to trigger + * race conditions. + * + * Outline: + * Create a 32MB file. + * Create a bunch of different IO patterns. Each IO pattern consists of: + * * A partition of the 32MB range into 64 different non-overlapping chunks. + * * A permutation of those chunks + * * A selection of 32 chunks that will be written by the follower. + * For each repetitions: + * For each IO pattern: + * For each phase (leader syncs and follower syncs): + * Create one binary semaphore per chunk. + * Create two threads, a leader and a follower thread. + * The leader thread will write each chunk in order. It will post a + * semaphore after each write to indicate that it has completed + * writing that chunk. If this is the "leader syncs" phase, it will + * call fsync() halfway through to force the closure of a transaction + * group. + * The follower will pend on those semaphores in order. Each time it + * receives a semaphore, it will write a different pattern to that + * chunk. If this is the "follower syncs" phase, it will call fsync() + * halfway through to force the closure of a transaction group. + * Join both threads + * Read the entire file and verify that + * 1) Every write went to the correct location + * 2) Each of the follower's writes overwrote the leader's. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NUM_REPETITIONS 15 +#define CLUSTERSIZE (1 << 16) +#define NUM_CHUNKS 64 +#define FSIZE (512 * (CLUSTERSIZE)) //FSIZE may range from NUM_CHUNKS clusters to 8GB +#define USE_THREADS 1 +#define USE_MMAP 0 + +typedef struct { + //partitions describes the boundaries between chunks. Each element is a + //fraction of the filesize in 1.31 fixed point format. So the boundary + //between chunk n and chunk n-1 is (FSIZE * partitions[n-1] / (1<<31) . + //partitions[-1] is understood to be 0 and partitions[NUM_CHUNKS] must be 1.0 + //partitions is sorted, of course. + //Partition boundaries must be dword aligned. Thus, in order to work with + //multiple values of FSIZE, partitions values must be aligned to multiples of + //8 / (NUM_CHUNKS * CLUSTERSIZE) = 1 / 524288 = 0x0.00002 + uint32_t partitions[NUM_CHUNKS]; + int permutation[NUM_CHUNKS]; //the order in which to write the chunks + //a bitmap of the chunks that should be written by the follower + //chunk 0 corresponds to bit 1, chunk 1 to bit 2, etc + uint64_t follower_chunks; +} pattern_t; + + +/* Returns (via begin and end) the range of a chunk. Begin is inclusive, + * end is exclusive */ +void get_chunk_range(const pattern_t* pat, int chunk, uint32_t* begin, uint32_t* end){ + if (chunk == 0){ + *begin = 0; + } + else{ + *begin = (uint32_t)((uint64_t)FSIZE * (uint64_t)pat->partitions[chunk - 1] >> 31); + } + *end = (uint32_t)((uint64_t)FSIZE * (uint64_t)pat->partitions[chunk] >> 31); +} + + +typedef enum{ + leader_syncs = 0, + follower_syncs, + NUM_PHASES +} phase_t; + +/* The most basic, trivial IO pattern. Fully sequential, and the follower + * writes every other block */ +const pattern_t trivial_pattern = { + {0x2000000, 0x4000000, 0x6000000, 0x8000000, 0xa000000, 0xc000000, 0xe000000, 0x10000000, + 0x12000000, 0x14000000, 0x16000000, 0x18000000, 0x1a000000, 0x1c000000, 0x1e000000, 0x20000000, + 0x22000000, 0x24000000, 0x26000000, 0x28000000, 0x2a000000, 0x2c000000, 0x2e000000, 0x30000000, + 0x32000000, 0x34000000, 0x36000000, 0x38000000, 0x3a000000, 0x3c000000, 0x3e000000, 0x40000000, + 0x42000000, 0x44000000, 0x46000000, 0x48000000, 0x4a000000, 0x4c000000, 0x4e000000, 0x50000000, + 0x52000000, 0x54000000, 0x56000000, 0x58000000, 0x5a000000, 0x5c000000, 0x5e000000, 0x60000000, + 0x62000000, 0x64000000, 0x66000000, 0x68000000, 0x6a000000, 0x6c000000, 0x6e000000, 0x70000000, + 0x72000000, 0x74000000, 0x76000000, 0x78000000, 0x7a000000, 0x7c000000, 0x7e000000, 0x80000000}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}, + 0x5555555555555555 +}; + +//The below patterns were randomly generated +const pattern_t pat0 = { + { 0x1eac000, 0x88a4000, 0xaffe000, 0xcdb7000, 0xd2d5000, 0xe16f000, 0xe499000, 0x11f71000, 0x1242d000, 0x12c07000, 0x143bc000, 0x1460a000, 0x15dd7000, 0x1700e000, 0x1be7e000, 0x1e14d000, 0x1e6ac000, 0x21097000, 0x24b74000, 0x27166000, 0x27669000, 0x30539000, 0x3218b000, 0x37591000, 0x37b60000, 0x39818000, 0x39d08000, 0x3c90e000, 0x3e54f000, 0x3fb99000, 0x42c8e000, 0x43a62000, 0x43f50000, 0x4c0c9000, 0x4c422000, 0x4c737000, 0x4d41e000, 0x4d738000, 0x4da71000, 0x4f4e8000, 0x508e3000, 0x51396000, 0x51ab5000, 0x52a02000, 0x54238000, 0x54d6a000, 0x55029000, 0x5584b000, 0x5c42c000, 0x5c4a7000, 0x5dac5000, 0x5fe4d000, 0x63f86000, 0x66ad0000, 0x67b3d000, 0x69ce5000, 0x6c179000, 0x6e79e000, 0x6f83f000, 0x71165000, 0x72bd9000, 0x7ac79000, 0x7dc94000, 0x80000000, }, + { 57, 16, 28, 25, 10, 59, 52, 46, 30, 6, 40, 36, 39, 9, 21, 51, 33, 45, 44, 19, 2, 50, 55, 5, 58, 13, 23, 0, 12, 53, 42, 32, 31, 48, 35, 61, 49, 54, 18, 24, 8, 41, 62, 4, 47, 17, 1, 3, 34, 14, 63, 22, 15, 26, 38, 56, 27, 60, 29, 11, 7, 43, 20, 37, }, + 0xa2f002a1a7795bbb +}; +const pattern_t pat1 = { + { 0x2b5000, 0x16db000, 0x5eb5000, 0x93a0000, 0xa7cb000, 0xa9e9000, 0xd144000, 0xe7c2000, 0xeb7d000, 0x10919000, 0x10cbd000, 0x11f85000, 0x17360000, 0x1760a000, 0x18eab000, 0x1ae6b000, 0x1c5f6000, 0x1df38000, 0x21bec000, 0x239d1000, 0x26b81000, 0x2747b000, 0x27a03000, 0x2b3cc000, 0x2cbf9000, 0x2ec0f000, 0x30a68000, 0x30bea000, 0x30c64000, 0x311af000, 0x35823000, 0x35d23000, 0x3b20e000, 0x405d8000, 0x414c8000, 0x43a91000, 0x44049000, 0x4ab4e000, 0x4ae21000, 0x4d293000, 0x511e5000, 0x516fc000, 0x52d77000, 0x57229000, 0x5da57000, 0x5dbe6000, 0x6070e000, 0x60fc0000, 0x64b24000, 0x67636000, 0x67658000, 0x6b040000, 0x6b28f000, 0x6e551000, 0x707c0000, 0x71b5c000, 0x72062000, 0x762a1000, 0x788a0000, 0x7a1e1000, 0x7b06a000, 0x7e04c000, 0x7f4cf000, 0x80000000, }, + { 45, 8, 55, 9, 21, 54, 41, 7, 6, 22, 31, 47, 23, 11, 48, 53, 0, 61, 63, 50, 17, 27, 12, 19, 10, 40, 14, 51, 39, 59, 2, 43, 18, 42, 52, 28, 16, 44, 3, 5, 15, 35, 58, 33, 57, 49, 34, 30, 46, 4, 37, 60, 32, 36, 25, 56, 24, 13, 20, 38, 29, 26, 62, 1, }, + 0xc88ca673fa160cbe +}; +const pattern_t pat2 = { + { 0x912d000, 0xe610000, 0xf755000, 0x116df000, 0x128e5000, 0x1bd51000, 0x24e9a000, 0x27643000, 0x28cf4000, 0x292c9000, 0x2c907000, 0x2d389000, 0x2d941000, 0x2eb3f000, 0x30e94000, 0x31738000, 0x3343b000, 0x342ce000, 0x34d12000, 0x3536d000, 0x35e1a000, 0x35e4d000, 0x35fd5000, 0x3642b000, 0x3924d000, 0x392a5000, 0x3e531000, 0x3f0ee000, 0x3fdf8000, 0x41593000, 0x41c80000, 0x43959000, 0x43bc0000, 0x461c8000, 0x48922000, 0x49519000, 0x4f6fa000, 0x50274000, 0x508ae000, 0x536ed000, 0x54154000, 0x59894000, 0x5a666000, 0x5b0a6000, 0x5b9ff000, 0x5c109000, 0x5d8d0000, 0x5ddc5000, 0x5fcc5000, 0x63366000, 0x63adc000, 0x645b6000, 0x670eb000, 0x6b1b1000, 0x6c996000, 0x6ed2a000, 0x6ee4f000, 0x71fcd000, 0x734a3000, 0x76bdf000, 0x77b3f000, 0x7c65a000, 0x7d200000, 0x80000000, }, + { 31, 35, 36, 52, 27, 56, 40, 13, 51, 49, 43, 37, 62, 42, 24, 29, 48, 25, 7, 61, 22, 57, 11, 32, 2, 54, 41, 6, 55, 15, 20, 26, 63, 44, 12, 4, 19, 58, 60, 59, 47, 23, 30, 50, 53, 34, 9, 38, 45, 8, 28, 3, 16, 33, 5, 21, 1, 10, 46, 18, 0, 14, 39, 17, }, + 0x51ac7692bd1a78d2 +}; +const pattern_t pat3 = { + { 0x553000, 0x19de000, 0x6a20000, 0x8a53000, 0x8ef9000, 0xc325000, 0x1132e000, 0x139fa000, 0x1426b000, 0x150ff000, 0x1bbc1000, 0x1e84c000, 0x1f43e000, 0x1f731000, 0x21ec8000, 0x231f4000, 0x23440000, 0x23466000, 0x260b6000, 0x286a7000, 0x29518000, 0x29e35000, 0x2fdb7000, 0x3089d000, 0x362e0000, 0x3c1f9000, 0x3df2d000, 0x3fce6000, 0x402f3000, 0x4117f000, 0x41e06000, 0x4374f000, 0x451e5000, 0x45a59000, 0x4956b000, 0x4960f000, 0x4a934000, 0x4bc6f000, 0x4d462000, 0x4eef8000, 0x4f609000, 0x50dc1000, 0x51022000, 0x54396000, 0x5641b000, 0x578f1000, 0x589cf000, 0x59093000, 0x5da6b000, 0x5fbf0000, 0x605a2000, 0x65428000, 0x65530000, 0x6705a000, 0x6db65000, 0x71cef000, 0x725a2000, 0x73bf5000, 0x75acb000, 0x76065000, 0x7614c000, 0x77aab000, 0x78f70000, 0x80000000, }, + { 15, 30, 31, 16, 49, 13, 55, 59, 4, 24, 26, 44, 17, 0, 18, 54, 10, 3, 46, 34, 29, 22, 45, 5, 38, 32, 39, 50, 48, 53, 12, 25, 35, 56, 51, 52, 1, 33, 43, 63, 47, 37, 23, 20, 60, 14, 11, 21, 8, 57, 27, 41, 6, 58, 62, 2, 19, 61, 28, 36, 40, 7, 9, 42, }, + 0x7d291499a7ecc986 +}; +const pattern_t pat4 = { + { 0x425000, 0x8e8000, 0x4b90000, 0x883c000, 0x968e000, 0xbacc000, 0x10e59000, 0x125a1000, 0x12f00000, 0x14e7c000, 0x156de000, 0x192a1000, 0x1a2b9000, 0x1b4a0000, 0x1be9c000, 0x1d3bd000, 0x24242000, 0x2516b000, 0x2b88d000, 0x2b96a000, 0x2bcd3000, 0x2c5a9000, 0x2da74000, 0x2dba1000, 0x3097f000, 0x332ef000, 0x34525000, 0x36193000, 0x3725c000, 0x37e66000, 0x3d315000, 0x3e813000, 0x404ae000, 0x40c68000, 0x42f93000, 0x44b14000, 0x44b15000, 0x473b2000, 0x49048000, 0x4c794000, 0x50b60000, 0x52b3d000, 0x58c61000, 0x5b7d4000, 0x5ce71000, 0x5d21d000, 0x5d63e000, 0x5e00f000, 0x60e8b000, 0x66381000, 0x66c70000, 0x68430000, 0x707c2000, 0x71979000, 0x72681000, 0x74017000, 0x7721d000, 0x7a1be000, 0x7a2cd000, 0x7b225000, 0x7c311000, 0x7e03a000, 0x7e402000, 0x80000000, }, + { 52, 62, 28, 47, 51, 37, 31, 36, 4, 58, 26, 29, 16, 59, 57, 33, 22, 27, 49, 44, 19, 56, 34, 23, 5, 14, 45, 48, 21, 25, 18, 12, 43, 53, 60, 17, 46, 15, 63, 30, 42, 38, 41, 8, 39, 20, 1, 10, 54, 40, 32, 24, 9, 2, 35, 3, 7, 0, 61, 11, 13, 55, 6, 50, }, + 0xd0e57ce640cdc726 +}; +const pattern_t pat5 = { + { 0xae7000, 0x436e000, 0x81e1000, 0xb276000, 0xf8bf000, 0xfb26000, 0xfe7e000, 0x137ad000, 0x14b8e000, 0x157aa000, 0x1981a000, 0x1a32f000, 0x1bc9e000, 0x1def5000, 0x1e8ef000, 0x2068f000, 0x22692000, 0x22a6c000, 0x255bf000, 0x26977000, 0x27619000, 0x2977c000, 0x2ce0c000, 0x2e1ec000, 0x2e26c000, 0x31ce8000, 0x34e6c000, 0x365cd000, 0x37e87000, 0x385e3000, 0x3a7e2000, 0x3a9c7000, 0x41597000, 0x42e8a000, 0x453cc000, 0x454bf000, 0x4b24c000, 0x4ba54000, 0x4e307000, 0x4f059000, 0x55d5a000, 0x56277000, 0x56b90000, 0x5882d000, 0x5a2c5000, 0x5b369000, 0x5d442000, 0x5d671000, 0x5fdd0000, 0x60ce0000, 0x63713000, 0x64130000, 0x65973000, 0x67ad9000, 0x68764000, 0x68bb2000, 0x690d1000, 0x6a2c8000, 0x73e9f000, 0x74e75000, 0x77861000, 0x77ee5000, 0x7cddb000, 0x80000000, }, + { 42, 25, 15, 58, 32, 61, 30, 56, 48, 62, 38, 50, 7, 45, 16, 29, 12, 4, 41, 3, 27, 18, 57, 10, 51, 17, 21, 14, 35, 19, 44, 47, 49, 26, 59, 63, 28, 55, 20, 13, 5, 6, 37, 54, 40, 22, 23, 46, 11, 36, 34, 31, 2, 60, 9, 52, 24, 1, 53, 0, 39, 43, 8, 33, }, + 0xc8b474decf8e9c40 +}; +const pattern_t pat6 = { + { 0xad2000, 0x222f000, 0x64b4000, 0x6c66000, 0x6f35000, 0x9e50000, 0xe744000, 0xf129000, 0x101bb000, 0x11bf8000, 0x14b89000, 0x1691c000, 0x17a0d000, 0x1817a000, 0x1997a000, 0x1d736000, 0x1db33000, 0x1fdd8000, 0x21e56000, 0x2266c000, 0x22875000, 0x22b84000, 0x230ed000, 0x239c5000, 0x24e1a000, 0x275f5000, 0x29036000, 0x29f69000, 0x2e538000, 0x2efca000, 0x2f0bc000, 0x2f1bf000, 0x305cb000, 0x31ce7000, 0x345c4000, 0x35d4f000, 0x36e56000, 0x3ae9e000, 0x3cc27000, 0x40117000, 0x4299f000, 0x434c3000, 0x443d4000, 0x4552d000, 0x4a8a8000, 0x4cdea000, 0x51bd5000, 0x580c4000, 0x58381000, 0x59dc0000, 0x5ba7f000, 0x5d88b000, 0x5e0c4000, 0x5ee57000, 0x61f3f000, 0x63a4a000, 0x68a8a000, 0x68ec5000, 0x6937b000, 0x720be000, 0x72cf5000, 0x74fc8000, 0x76464000, 0x80000000, }, + { 31, 46, 36, 22, 63, 12, 51, 60, 13, 44, 41, 6, 11, 17, 42, 24, 16, 61, 20, 26, 35, 21, 29, 55, 50, 45, 62, 19, 54, 9, 30, 34, 53, 52, 10, 39, 0, 49, 48, 38, 40, 28, 23, 56, 2, 5, 4, 59, 14, 57, 3, 25, 43, 32, 27, 47, 8, 7, 37, 33, 1, 18, 58, 15, }, + 0xe5172947f6d4e10a +}; +const pattern_t pat7 = { + { 0xd83000, 0x1597000, 0x245b000, 0x6a75000, 0x8fda000, 0x960e000, 0xd310000, 0xe6cd000, 0x1409a000, 0x15221000, 0x16059000, 0x1b3a4000, 0x1ceea000, 0x1ed1a000, 0x1ef0f000, 0x21723000, 0x21efc000, 0x24594000, 0x26d7f000, 0x28c4f000, 0x2fa89000, 0x304f0000, 0x30dbb000, 0x30de3000, 0x3365d000, 0x36dbc000, 0x3acb2000, 0x3e291000, 0x3f7da000, 0x41352000, 0x41a0f000, 0x435c8000, 0x4475a000, 0x47536000, 0x47726000, 0x4a81f000, 0x4be4e000, 0x4bf05000, 0x4c15b000, 0x515b4000, 0x52ef5000, 0x548cc000, 0x5692a000, 0x59ef2000, 0x5b97c000, 0x5c4f0000, 0x5d1b9000, 0x618ed000, 0x61bcc000, 0x61e07000, 0x639a3000, 0x65302000, 0x68041000, 0x6be56000, 0x721a3000, 0x72c99000, 0x740b9000, 0x7586d000, 0x75eca000, 0x76406000, 0x7b68a000, 0x7dd26000, 0x7ed55000, 0x80000000, }, + { 44, 57, 22, 35, 63, 11, 15, 49, 61, 40, 29, 20, 19, 42, 32, 12, 41, 6, 46, 60, 52, 5, 36, 10, 2, 8, 3, 33, 54, 39, 58, 48, 62, 7, 51, 34, 0, 1, 18, 9, 55, 31, 23, 38, 25, 21, 17, 24, 13, 50, 16, 14, 43, 53, 45, 28, 59, 37, 26, 30, 47, 27, 56, 4, }, + 0xc509d471a7ae3363 +}; +const pattern_t pat8 = { + { 0x1b8000, 0x27eb000, 0x5a4d000, 0x6ecc000, 0xb52e000, 0xb70e000, 0xc6db000, 0xd83d000, 0xed51000, 0x13c59000, 0x13fef000, 0x142e1000, 0x192d0000, 0x1aa63000, 0x1e230000, 0x1f464000, 0x20de4000, 0x2234b000, 0x25459000, 0x27018000, 0x28263000, 0x29cc7000, 0x32227000, 0x32c63000, 0x34af0000, 0x37e27000, 0x3afc9000, 0x3c166000, 0x3df20000, 0x405bd000, 0x41273000, 0x45c39000, 0x471be000, 0x4758e000, 0x4b3fc000, 0x4c6b2000, 0x4c80f000, 0x4ccd6000, 0x4d9e0000, 0x4e07f000, 0x4eeda000, 0x541ae000, 0x58aa7000, 0x5a2c6000, 0x5a628000, 0x5ab94000, 0x5bddc000, 0x5d1d4000, 0x5e643000, 0x5f72f000, 0x64771000, 0x67bd4000, 0x6a28c000, 0x6c977000, 0x6cc4e000, 0x710c4000, 0x74b86000, 0x75cf7000, 0x77d4b000, 0x7870e000, 0x7c47c000, 0x7eb52000, 0x7fbea000, 0x80000000, }, + { 7, 29, 62, 8, 54, 38, 35, 45, 60, 55, 1, 40, 4, 19, 50, 63, 48, 51, 13, 27, 33, 39, 52, 46, 10, 9, 56, 2, 42, 43, 47, 44, 17, 5, 25, 6, 57, 23, 15, 58, 59, 22, 14, 26, 32, 61, 30, 0, 11, 12, 36, 24, 53, 49, 3, 20, 31, 28, 34, 18, 41, 21, 16, 37, }, + 0x8b938ea7b599224d +}; +const pattern_t pat9 = { + { 0x5b59000, 0xa6d7000, 0xbad3000, 0xdf91000, 0x115ad000, 0x13fde000, 0x17618000, 0x1b8e9000, 0x1e1b7000, 0x1e97d000, 0x21737000, 0x21a5e000, 0x24140000, 0x2558f000, 0x2647a000, 0x28257000, 0x285f6000, 0x2cb7a000, 0x2ebb1000, 0x30ae8000, 0x31543000, 0x315cb000, 0x31616000, 0x335ba000, 0x33ed6000, 0x35cf3000, 0x4162b000, 0x4409b000, 0x4629a000, 0x4b745000, 0x4c0ba000, 0x4cbc5000, 0x4dd97000, 0x4f34b000, 0x4f637000, 0x539d6000, 0x53f3d000, 0x56383000, 0x5642b000, 0x5a71f000, 0x5affa000, 0x5b486000, 0x5b8ef000, 0x60d88000, 0x61629000, 0x625cd000, 0x63326000, 0x6735e000, 0x67379000, 0x6a26a000, 0x6a281000, 0x6b997000, 0x6c50d000, 0x6cc6c000, 0x6f496000, 0x717ad000, 0x732ec000, 0x744dc000, 0x771e8000, 0x77cf0000, 0x79cad000, 0x7bb21000, 0x7e7b4000, 0x80000000, }, + { 35, 9, 46, 6, 29, 2, 3, 54, 55, 57, 41, 16, 44, 5, 0, 59, 10, 61, 22, 42, 47, 12, 14, 50, 39, 34, 21, 32, 25, 15, 26, 8, 38, 60, 28, 53, 62, 49, 58, 43, 36, 37, 52, 7, 19, 63, 17, 11, 45, 33, 23, 27, 24, 18, 48, 56, 31, 13, 51, 30, 4, 20, 40, 1, }, + 0xfc4c41bb3d34a11d +}; +const pattern_t pat10 = { + { 0xa72000, 0x180a000, 0x6406000, 0x66df000, 0x83bb000, 0xa96f000, 0xd193000, 0x13b9b000, 0x13dae000, 0x16109000, 0x1853d000, 0x18887000, 0x19f0a000, 0x22151000, 0x229ba000, 0x26b58000, 0x2aaf4000, 0x2bf50000, 0x31a2e000, 0x31d4e000, 0x32196000, 0x3513a000, 0x36a2d000, 0x3746b000, 0x389ad000, 0x39d27000, 0x3dad3000, 0x3de55000, 0x3ea9b000, 0x3ec06000, 0x3f921000, 0x432d3000, 0x43bec000, 0x43dda000, 0x47b2b000, 0x4886e000, 0x4928e000, 0x49ad2000, 0x4d0df000, 0x4f40d000, 0x50959000, 0x54fa4000, 0x56091000, 0x5688d000, 0x5b7d8000, 0x5f6fd000, 0x601e4000, 0x64eaa000, 0x6752e000, 0x67fff000, 0x6a184000, 0x6ad7a000, 0x6adbc000, 0x6c434000, 0x6f451000, 0x6ffb4000, 0x707ee000, 0x71161000, 0x7146b000, 0x75dbf000, 0x77259000, 0x7acd4000, 0x7af71000, 0x80000000, }, + { 61, 38, 5, 23, 62, 11, 53, 9, 17, 45, 30, 29, 41, 60, 39, 21, 40, 19, 44, 33, 42, 50, 56, 28, 32, 46, 43, 20, 16, 3, 54, 8, 4, 26, 15, 34, 47, 12, 6, 27, 48, 0, 1, 2, 57, 59, 7, 58, 49, 35, 24, 37, 52, 63, 10, 55, 36, 13, 14, 25, 18, 22, 31, 51, }, + 0xbaba0d4f32308c7d +}; +const pattern_t pat11 = { + { 0x996000, 0xaff000, 0x199a000, 0x46f3000, 0x74c0000, 0x758d000, 0xcd09000, 0xe48c000, 0xe8de000, 0xf111000, 0xf87b000, 0x10b1c000, 0x15d63000, 0x17b21000, 0x182d3000, 0x19167000, 0x198ce000, 0x1bd47000, 0x1dff1000, 0x1edc0000, 0x1f890000, 0x20860000, 0x23207000, 0x29bd5000, 0x2ac0f000, 0x2e395000, 0x2e707000, 0x329de000, 0x3497f000, 0x3807f000, 0x38a94000, 0x40a19000, 0x4168e000, 0x42ca0000, 0x42de9000, 0x45194000, 0x464f2000, 0x4700f000, 0x47dbb000, 0x4dae7000, 0x50660000, 0x535a8000, 0x5546b000, 0x57b55000, 0x5860a000, 0x5a9ee000, 0x5b8d9000, 0x5c49f000, 0x5cb4d000, 0x5d28c000, 0x60dcd000, 0x62557000, 0x64b0c000, 0x654cb000, 0x65746000, 0x65e29000, 0x6648f000, 0x66c56000, 0x6999e000, 0x6a11c000, 0x6ca04000, 0x79e60000, 0x7edce000, 0x80000000, }, + { 16, 28, 2, 38, 10, 57, 21, 26, 61, 43, 46, 31, 56, 7, 47, 48, 58, 25, 63, 4, 59, 15, 32, 50, 1, 40, 53, 18, 17, 24, 29, 30, 55, 36, 49, 42, 41, 37, 23, 39, 6, 51, 33, 9, 45, 5, 35, 19, 44, 11, 34, 0, 27, 12, 60, 62, 20, 13, 22, 8, 14, 54, 3, 52, }, + 0x6458c1af941ce1f7 +}; +const pattern_t pat12 = { + { 0x513000, 0x1b72000, 0x1e27000, 0x3a63000, 0x1115c000, 0x158b4000, 0x1664f000, 0x1b667000, 0x1f838000, 0x21410000, 0x260c7000, 0x2cd8f000, 0x2ce37000, 0x2df16000, 0x2e59e000, 0x2e8eb000, 0x2ebd2000, 0x2f1d2000, 0x2fc42000, 0x30d00000, 0x31ef1000, 0x3301a000, 0x38097000, 0x38a1e000, 0x3d818000, 0x3e898000, 0x3f90f000, 0x47710000, 0x478bb000, 0x485ab000, 0x48e54000, 0x4cfe1000, 0x53a89000, 0x53d10000, 0x56308000, 0x56f3b000, 0x577f6000, 0x58734000, 0x5889b000, 0x58ad7000, 0x5923a000, 0x59aef000, 0x5dad3000, 0x5e32f000, 0x63b3a000, 0x665c9000, 0x68cde000, 0x69252000, 0x6a777000, 0x6a79a000, 0x6c1f0000, 0x6cb9a000, 0x6d319000, 0x6dc82000, 0x6dd4d000, 0x6e188000, 0x7184d000, 0x7206e000, 0x73980000, 0x740ad000, 0x75473000, 0x7614d000, 0x79b17000, 0x80000000, }, + { 4, 60, 10, 35, 6, 31, 5, 18, 53, 17, 20, 8, 56, 29, 7, 48, 40, 0, 12, 39, 2, 43, 15, 61, 42, 30, 50, 14, 49, 38, 34, 58, 24, 55, 33, 63, 28, 51, 59, 46, 11, 22, 45, 41, 13, 44, 23, 47, 3, 32, 16, 54, 26, 19, 25, 52, 27, 57, 36, 9, 37, 21, 62, 1, }, + 0x1a7a56b619472b96 +}; +const pattern_t pat13 = { + { 0x351e000, 0x5917000, 0xa992000, 0xc471000, 0xc69c000, 0xc6ed000, 0xc919000, 0xd713000, 0xec14000, 0xfa31000, 0x17567000, 0x1d81a000, 0x1f3c8000, 0x215b5000, 0x26e41000, 0x2a2d4000, 0x2b750000, 0x2bea0000, 0x2c5ae000, 0x2ca2c000, 0x30a94000, 0x31074000, 0x314d3000, 0x31b1e000, 0x31de2000, 0x32062000, 0x33da5000, 0x37838000, 0x385ec000, 0x38740000, 0x387f9000, 0x38be6000, 0x3d2f7000, 0x3eaf5000, 0x40266000, 0x402f3000, 0x40fda000, 0x4a4bd000, 0x4b831000, 0x4bfc9000, 0x4ccaa000, 0x4ea43000, 0x50190000, 0x547c8000, 0x58cc6000, 0x58ea5000, 0x59de1000, 0x5c7f1000, 0x5f713000, 0x63f9a000, 0x6686d000, 0x675c1000, 0x6cccc000, 0x6e409000, 0x6fb6d000, 0x71a70000, 0x72f60000, 0x77bd9000, 0x79013000, 0x7a8d3000, 0x7b341000, 0x7d8f7000, 0x7fe43000, 0x80000000, }, + { 10, 52, 48, 8, 34, 4, 35, 19, 3, 17, 54, 45, 31, 38, 24, 44, 21, 36, 22, 11, 43, 40, 39, 26, 5, 30, 2, 7, 57, 12, 20, 32, 62, 15, 55, 14, 25, 58, 6, 33, 49, 9, 59, 27, 13, 63, 42, 61, 1, 51, 0, 50, 37, 47, 16, 18, 41, 56, 60, 46, 23, 28, 53, 29, }, + 0x8eb1b741cb9906f4 +}; +const pattern_t pat14 = { + { 0xf8e000, 0x169a000, 0x3816000, 0x67a9000, 0x89f3000, 0xac97000, 0xc8da000, 0xf077000, 0x119f1000, 0x13902000, 0x19785000, 0x1ca7f000, 0x1f958000, 0x2027d000, 0x2251f000, 0x24661000, 0x25604000, 0x2b924000, 0x2be5f000, 0x2ec27000, 0x330a5000, 0x3349e000, 0x33a84000, 0x344fa000, 0x34514000, 0x37966000, 0x37f0b000, 0x37fcd000, 0x386d0000, 0x39600000, 0x39de4000, 0x3e601000, 0x3e7f1000, 0x42c61000, 0x48806000, 0x4d3d0000, 0x4f5ff000, 0x512c1000, 0x53fd4000, 0x59440000, 0x5b386000, 0x5e8a0000, 0x5fca3000, 0x6016c000, 0x61ca8000, 0x64915000, 0x66b99000, 0x67226000, 0x69b2f000, 0x6a473000, 0x6a590000, 0x6c844000, 0x6cb8c000, 0x713b5000, 0x7558a000, 0x75eab000, 0x76d15000, 0x77efe000, 0x78762000, 0x7bddc000, 0x7ce92000, 0x7dc44000, 0x7f54b000, 0x80000000, }, + { 54, 31, 48, 10, 51, 49, 55, 19, 38, 18, 44, 5, 17, 20, 16, 11, 9, 3, 42, 59, 63, 45, 25, 60, 57, 21, 40, 29, 0, 39, 26, 7, 53, 12, 13, 2, 58, 41, 22, 8, 14, 28, 46, 24, 27, 6, 52, 32, 56, 4, 30, 36, 15, 47, 23, 37, 43, 35, 50, 33, 61, 34, 1, 62, }, + 0xa13fa3d92bcc578 +}; +const pattern_t pat15 = { + { 0xe16000, 0xec6000, 0xf6b000, 0x634b000, 0x6896000, 0x91db000, 0xc2c8000, 0xe083000, 0xfd7f000, 0x10479000, 0x17740000, 0x18292000, 0x1aaca000, 0x1cb55000, 0x1d2be000, 0x222af000, 0x2cb03000, 0x2fabc000, 0x32034000, 0x35c0f000, 0x3c5ec000, 0x40908000, 0x4128e000, 0x44411000, 0x44bcd000, 0x4f0ac000, 0x5167b000, 0x5541c000, 0x581bc000, 0x584e5000, 0x588fb000, 0x593d3000, 0x5b25d000, 0x5dc99000, 0x60b35000, 0x60ffc000, 0x638e8000, 0x63cf8000, 0x64ee1000, 0x6523c000, 0x654a1000, 0x687bf000, 0x68bef000, 0x69826000, 0x69d90000, 0x6a622000, 0x6d1b9000, 0x6d1e1000, 0x6d886000, 0x6fe4a000, 0x6feac000, 0x720b2000, 0x734dc000, 0x73530000, 0x73f1e000, 0x7479c000, 0x76e33000, 0x786dc000, 0x79b40000, 0x79e49000, 0x7b66c000, 0x7b904000, 0x7c906000, 0x80000000, }, + { 6, 17, 62, 20, 61, 32, 22, 14, 28, 18, 3, 42, 63, 43, 46, 34, 29, 30, 35, 1, 37, 40, 10, 26, 5, 31, 15, 54, 8, 33, 9, 4, 39, 53, 23, 25, 41, 59, 12, 13, 60, 2, 7, 56, 58, 27, 11, 38, 36, 45, 47, 0, 57, 50, 48, 16, 51, 49, 55, 52, 44, 24, 19, 21, }, + 0xef2ebd111c482f52 +}; +const pattern_t pat16 = { + { 0x596a000, 0x8644000, 0xa943000, 0xd59e000, 0x1062f000, 0x1082a000, 0x10c1b000, 0x10f9e000, 0x11e64000, 0x12e73000, 0x15ce7000, 0x16037000, 0x16d2e000, 0x17035000, 0x185ad000, 0x18d9b000, 0x19ac7000, 0x1b2fa000, 0x1cd6c000, 0x1d5f0000, 0x1f72c000, 0x20891000, 0x24bfa000, 0x25c1d000, 0x28e24000, 0x2a5f8000, 0x2e0ae000, 0x2fddf000, 0x3119d000, 0x332ee000, 0x3480a000, 0x34ea5000, 0x3534e000, 0x3538b000, 0x362e2000, 0x38f58000, 0x39ab0000, 0x3a519000, 0x3a62b000, 0x3b006000, 0x3d523000, 0x3e0f7000, 0x42366000, 0x42feb000, 0x44013000, 0x46b98000, 0x49794000, 0x4dce7000, 0x4f1f3000, 0x57ecd000, 0x5aaa2000, 0x5f419000, 0x61517000, 0x6797d000, 0x69a20000, 0x6a070000, 0x70575000, 0x75322000, 0x75a9e000, 0x79043000, 0x79875000, 0x7addc000, 0x7de88000, 0x80000000, }, + { 26, 25, 6, 50, 32, 53, 34, 27, 3, 16, 49, 28, 46, 38, 56, 4, 18, 24, 51, 36, 63, 5, 48, 13, 43, 55, 0, 62, 35, 7, 41, 21, 44, 60, 31, 39, 14, 8, 61, 58, 52, 23, 59, 33, 10, 37, 20, 30, 40, 22, 11, 54, 57, 1, 29, 47, 2, 17, 19, 45, 15, 9, 12, 42, }, + 0xb19913245ddeb436 +}; +const pattern_t pat17 = { + { 0x28ab000, 0x3ac8000, 0x3fe1000, 0x63a7000, 0x90fc000, 0xb3f2000, 0xd2f2000, 0xe032000, 0x12d4c000, 0x13135000, 0x14652000, 0x15331000, 0x1570c000, 0x1688e000, 0x16bc3000, 0x1cbe3000, 0x1fe0f000, 0x2517f000, 0x26c6b000, 0x2a284000, 0x2a4e2000, 0x2add5000, 0x2bd06000, 0x2ca3a000, 0x2eb11000, 0x324d1000, 0x35662000, 0x38695000, 0x38ce7000, 0x391ac000, 0x398f9000, 0x39949000, 0x401f3000, 0x457f0000, 0x45c6d000, 0x4b561000, 0x522fc000, 0x54ef0000, 0x559f8000, 0x562a7000, 0x56a04000, 0x57b68000, 0x59702000, 0x5ffc9000, 0x63a76000, 0x63c37000, 0x65d3e000, 0x67130000, 0x6a03a000, 0x6bcd6000, 0x6be96000, 0x6bf52000, 0x6fcd9000, 0x7038c000, 0x70a47000, 0x72881000, 0x72ed0000, 0x75035000, 0x75c11000, 0x77fa5000, 0x797c9000, 0x79813000, 0x7bbbb000, 0x80000000, }, + { 18, 15, 56, 5, 25, 47, 39, 55, 12, 14, 51, 33, 0, 7, 9, 44, 50, 31, 62, 59, 3, 35, 23, 17, 30, 60, 11, 24, 40, 20, 52, 2, 22, 8, 57, 42, 32, 54, 36, 48, 49, 13, 58, 10, 28, 63, 16, 41, 27, 21, 37, 4, 1, 29, 19, 6, 53, 45, 46, 38, 34, 43, 61, 26, }, + 0x710633dc35c17b71 +}; +const pattern_t pat18 = { + { 0x38d6000, 0x5379000, 0x5cae000, 0x5d20000, 0xa248000, 0xb4d0000, 0xd7c0000, 0xf731000, 0x116ae000, 0x151d2000, 0x1747d000, 0x1bfb6000, 0x1d758000, 0x2053d000, 0x24dda000, 0x25274000, 0x269c0000, 0x273e8000, 0x2a5d0000, 0x2ad34000, 0x3016b000, 0x30d1a000, 0x32960000, 0x34b3b000, 0x36e4f000, 0x37934000, 0x38c42000, 0x3c2d2000, 0x3d23d000, 0x3d89a000, 0x3dc85000, 0x3e9a7000, 0x3f25b000, 0x45bd1000, 0x48d94000, 0x4b126000, 0x4e17c000, 0x4f377000, 0x50908000, 0x51957000, 0x53410000, 0x5412c000, 0x55256000, 0x56b17000, 0x5707b000, 0x5bbe5000, 0x5d067000, 0x5e1c1000, 0x6380b000, 0x66009000, 0x68240000, 0x69fc4000, 0x6c327000, 0x6c5d2000, 0x6f69d000, 0x739c7000, 0x744bc000, 0x74cd8000, 0x787b8000, 0x78c61000, 0x7969d000, 0x79aae000, 0x7b032000, 0x80000000, }, + { 16, 48, 50, 60, 13, 39, 20, 4, 63, 18, 14, 30, 55, 8, 62, 37, 43, 41, 11, 0, 36, 33, 34, 49, 17, 58, 38, 22, 19, 5, 21, 12, 47, 25, 57, 61, 7, 3, 10, 23, 52, 24, 6, 53, 2, 26, 1, 31, 28, 46, 42, 9, 45, 29, 27, 54, 32, 56, 51, 44, 35, 59, 40, 15, }, + 0xb53f1e4266db260c +}; +const pattern_t pat19 = { + { 0x297d000, 0x34e0000, 0x7801000, 0x9664000, 0x96fa000, 0xbb9f000, 0xc192000, 0xc4a5000, 0xca74000, 0xcce8000, 0x173d8000, 0x1a8d8000, 0x1b299000, 0x1b52d000, 0x1e813000, 0x2185e000, 0x21abe000, 0x2b9a4000, 0x2c4b6000, 0x2fa27000, 0x343ba000, 0x356fd000, 0x37c6e000, 0x38365000, 0x3a9e4000, 0x3b599000, 0x4296b000, 0x43196000, 0x4381e000, 0x44783000, 0x47a75000, 0x4bd78000, 0x4d05d000, 0x4edb2000, 0x4eefd000, 0x4fecc000, 0x51f68000, 0x5252b000, 0x5439e000, 0x55fb3000, 0x5814f000, 0x5939d000, 0x60a78000, 0x62a86000, 0x633b0000, 0x64a68000, 0x64b62000, 0x66207000, 0x66540000, 0x67f90000, 0x68bf3000, 0x6a069000, 0x6d2ac000, 0x70c9f000, 0x71bab000, 0x724bc000, 0x783d8000, 0x7900e000, 0x79399000, 0x79763000, 0x7c8a8000, 0x7e680000, 0x7f6de000, 0x80000000, }, + { 14, 59, 60, 24, 18, 22, 62, 12, 45, 2, 32, 11, 25, 37, 13, 7, 50, 39, 56, 17, 47, 40, 29, 43, 15, 34, 4, 57, 31, 38, 21, 28, 36, 27, 42, 1, 23, 33, 5, 61, 44, 55, 8, 30, 10, 41, 19, 48, 16, 52, 49, 46, 54, 58, 6, 0, 51, 3, 26, 20, 53, 9, 35, 63, }, + 0x64f54c0a0deae9ab +}; +const pattern_t pat20 = { + { 0x8f7000, 0xa01000, 0x38e3000, 0x5299000, 0x6875000, 0x7f3e000, 0x827f000, 0x9413000, 0xca71000, 0xfb11000, 0x10beb000, 0x176be000, 0x1924f000, 0x1cfd6000, 0x1d20d000, 0x1ebb7000, 0x22c93000, 0x23601000, 0x2cf7a000, 0x2d3af000, 0x2e391000, 0x2f294000, 0x318ad000, 0x34ddd000, 0x365e4000, 0x3b8d2000, 0x3c0f8000, 0x3d2fd000, 0x3e431000, 0x3f0fe000, 0x4074e000, 0x40d1c000, 0x41936000, 0x4347b000, 0x452d7000, 0x486d3000, 0x4b47e000, 0x4b709000, 0x4c349000, 0x4ff13000, 0x50faa000, 0x51a07000, 0x52f30000, 0x55f29000, 0x57ad4000, 0x5909f000, 0x5a0f6000, 0x5de57000, 0x60d2f000, 0x625ff000, 0x6288e000, 0x65077000, 0x6a707000, 0x6a73f000, 0x6d720000, 0x6e390000, 0x6edc9000, 0x6ee78000, 0x77ac2000, 0x77ad3000, 0x7868f000, 0x79a1b000, 0x7aec6000, 0x80000000, }, + { 21, 56, 38, 11, 62, 9, 30, 47, 34, 23, 37, 16, 5, 49, 10, 43, 4, 45, 36, 7, 42, 1, 53, 57, 20, 59, 55, 50, 46, 39, 60, 27, 12, 31, 48, 25, 15, 22, 44, 52, 14, 33, 0, 29, 17, 18, 2, 32, 24, 19, 6, 41, 54, 8, 35, 26, 61, 3, 51, 13, 63, 28, 40, 58, }, + 0x786427ef60db40f4 +}; +const pattern_t pat21 = { + { 0x2a8e000, 0xa4bd000, 0xa935000, 0xcc05000, 0xdfe4000, 0xe014000, 0xff46000, 0x18c8c000, 0x199ec000, 0x19ce0000, 0x1f684000, 0x1ff5c000, 0x22d58000, 0x27651000, 0x280e5000, 0x2e2a4000, 0x2e432000, 0x2f96e000, 0x2f9c3000, 0x3343d000, 0x338bb000, 0x34032000, 0x34101000, 0x368c2000, 0x37b95000, 0x39492000, 0x39932000, 0x3b611000, 0x3c89e000, 0x40aa9000, 0x42358000, 0x4890e000, 0x495c9000, 0x4a79d000, 0x4c58e000, 0x4df9a000, 0x4f304000, 0x4fa4c000, 0x54d1d000, 0x58461000, 0x58f43000, 0x5a3d1000, 0x5a765000, 0x5c5c0000, 0x60488000, 0x60fad000, 0x613e5000, 0x61d61000, 0x62d17000, 0x641ff000, 0x67f8b000, 0x69c5d000, 0x6b931000, 0x6efd4000, 0x70333000, 0x70857000, 0x721f6000, 0x72f53000, 0x74450000, 0x746f7000, 0x76067000, 0x7774a000, 0x77ea6000, 0x80000000, }, + { 28, 51, 33, 2, 30, 55, 29, 17, 40, 48, 32, 9, 39, 1, 49, 50, 37, 43, 62, 11, 10, 26, 22, 6, 8, 7, 45, 47, 46, 42, 60, 5, 12, 56, 4, 23, 35, 25, 13, 16, 61, 54, 31, 63, 34, 19, 41, 59, 38, 24, 0, 58, 53, 44, 3, 18, 52, 20, 36, 27, 14, 21, 57, 15, }, + 0x615a5f41d4c3d653 +}; +const pattern_t pat22 = { + { 0x314d000, 0x4452000, 0x6673000, 0xab09000, 0xc80d000, 0x10eda000, 0x129c2000, 0x12f1f000, 0x13e9b000, 0x1450c000, 0x15aeb000, 0x1667c000, 0x190b2000, 0x19ac5000, 0x1c0ac000, 0x1c229000, 0x1ece8000, 0x1fc48000, 0x22abd000, 0x24268000, 0x2adce000, 0x2b809000, 0x30a11000, 0x31d08000, 0x36700000, 0x39e6a000, 0x3b84b000, 0x41e84000, 0x46301000, 0x4a326000, 0x50fda000, 0x5299a000, 0x56acf000, 0x57f66000, 0x586ab000, 0x58df5000, 0x591cc000, 0x59b91000, 0x59cbd000, 0x5b4d0000, 0x5cca7000, 0x5cfce000, 0x5d120000, 0x5d51a000, 0x5eaa0000, 0x5ebac000, 0x5f0e1000, 0x5f285000, 0x5f4d3000, 0x5ff61000, 0x60b51000, 0x61435000, 0x651fd000, 0x6b954000, 0x705aa000, 0x71a41000, 0x73ec7000, 0x75f92000, 0x76854000, 0x77cb9000, 0x782ca000, 0x7a2af000, 0x7eaa6000, 0x80000000, }, + { 16, 8, 5, 59, 4, 18, 26, 43, 33, 57, 6, 47, 56, 46, 10, 54, 52, 0, 50, 30, 39, 24, 38, 63, 28, 25, 49, 31, 55, 62, 3, 17, 23, 13, 37, 53, 34, 14, 44, 12, 19, 36, 27, 61, 51, 42, 41, 60, 45, 1, 7, 35, 21, 58, 20, 15, 2, 9, 22, 29, 48, 32, 40, 11, }, + 0x828366dbf1f83654 +}; +const pattern_t pat23 = { + { 0x47000, 0x680000, 0x176a000, 0x1db8000, 0x600e000, 0x808c000, 0x9e58000, 0xa82f000, 0xaebb000, 0xc938000, 0xd0eb000, 0xdc5e000, 0xe503000, 0x11e56000, 0x12dbd000, 0x14681000, 0x15200000, 0x18256000, 0x1be75000, 0x1d2a0000, 0x1ed67000, 0x27e8a000, 0x2bc39000, 0x2bf4b000, 0x2c94f000, 0x2d575000, 0x2d82e000, 0x2e440000, 0x2ecda000, 0x2fbc2000, 0x33ab0000, 0x360b8000, 0x39630000, 0x3a654000, 0x3d2b6000, 0x3eeff000, 0x41590000, 0x417ea000, 0x42ff9000, 0x4bca4000, 0x503b0000, 0x508e4000, 0x52a2e000, 0x535b6000, 0x54335000, 0x57412000, 0x57dc6000, 0x590d9000, 0x5fc0a000, 0x60552000, 0x60665000, 0x6168d000, 0x65b16000, 0x67328000, 0x6742d000, 0x68c88000, 0x6b802000, 0x6f6d2000, 0x7040e000, 0x77e31000, 0x79c71000, 0x7da4a000, 0x7e26b000, 0x80000000, }, + { 63, 50, 51, 33, 28, 35, 24, 14, 4, 23, 47, 11, 37, 41, 12, 55, 62, 32, 34, 30, 25, 43, 16, 0, 3, 49, 61, 15, 57, 46, 59, 44, 31, 27, 21, 53, 5, 2, 8, 56, 52, 22, 60, 40, 20, 1, 48, 18, 17, 19, 54, 29, 9, 38, 42, 6, 39, 45, 13, 10, 26, 58, 36, 7, }, + 0xd8456d32bb91872e +}; +const pattern_t pat24 = { + { 0x3890000, 0x3fd9000, 0x62d6000, 0x7df0000, 0x895c000, 0xab61000, 0xc23b000, 0x10ab3000, 0x1247c000, 0x13f00000, 0x16604000, 0x1a444000, 0x1c2c8000, 0x1c467000, 0x1d396000, 0x1e683000, 0x21080000, 0x2442a000, 0x27fea000, 0x282eb000, 0x28e2c000, 0x2a625000, 0x2b3b2000, 0x2bbd5000, 0x2c886000, 0x2cbe8000, 0x31518000, 0x35425000, 0x355f4000, 0x35d7a000, 0x3851d000, 0x396a6000, 0x3d10f000, 0x3d890000, 0x49238000, 0x4ab7e000, 0x4fadf000, 0x50603000, 0x5233a000, 0x53279000, 0x5586c000, 0x56968000, 0x58101000, 0x588b6000, 0x5bc19000, 0x5cc10000, 0x623f6000, 0x629f4000, 0x63176000, 0x63dcc000, 0x681d0000, 0x69c0e000, 0x6a9fa000, 0x6ae5e000, 0x6d2ba000, 0x6e422000, 0x73f94000, 0x77932000, 0x78b24000, 0x794c1000, 0x795d2000, 0x7ae08000, 0x7b3ce000, 0x80000000, }, + { 56, 47, 54, 62, 29, 43, 25, 59, 41, 7, 52, 63, 15, 21, 16, 14, 39, 17, 45, 11, 27, 24, 55, 31, 53, 4, 6, 2, 20, 23, 5, 37, 32, 58, 13, 51, 1, 8, 3, 57, 46, 30, 35, 49, 18, 40, 9, 22, 42, 38, 34, 0, 19, 33, 26, 60, 10, 48, 36, 61, 44, 12, 50, 28, }, + 0x3e9c5e14d18c9e65 +}; +const pattern_t pat25 = { + { 0xcb000, 0x22bf000, 0x2461000, 0x246b000, 0x5c6f000, 0x5fb4000, 0x69a9000, 0x718c000, 0x92e6000, 0xbb2e000, 0xd916000, 0xf3dc000, 0xf568000, 0x10246000, 0x12d53000, 0x14dfd000, 0x1598a000, 0x1956a000, 0x1b01b000, 0x1b3b8000, 0x1ce06000, 0x20bc5000, 0x21351000, 0x233b0000, 0x23f2b000, 0x24e41000, 0x29cca000, 0x2b5bd000, 0x2ba68000, 0x2bf7f000, 0x31a58000, 0x34570000, 0x39941000, 0x3b765000, 0x3cd13000, 0x3d251000, 0x3fa05000, 0x40745000, 0x45c68000, 0x4a282000, 0x4ad19000, 0x4b4aa000, 0x4ca18000, 0x4e0b8000, 0x4eb97000, 0x4f68b000, 0x4fca2000, 0x52466000, 0x52edf000, 0x5602a000, 0x57f60000, 0x5cc18000, 0x5cee3000, 0x5da37000, 0x5dba4000, 0x64b77000, 0x66e9f000, 0x68b9d000, 0x6aac9000, 0x6d873000, 0x6f7e6000, 0x71036000, 0x75a54000, 0x80000000, }, + { 1, 58, 13, 5, 62, 10, 49, 48, 19, 24, 54, 57, 20, 39, 35, 41, 28, 42, 6, 44, 34, 45, 55, 3, 2, 60, 38, 36, 30, 25, 7, 23, 53, 50, 61, 29, 40, 47, 22, 12, 27, 0, 52, 31, 8, 15, 37, 11, 46, 32, 4, 56, 17, 33, 26, 43, 51, 16, 9, 59, 63, 21, 14, 18, }, + 0x7bae8ea344ec83e +}; +const pattern_t pat26 = { + { 0x1f4e000, 0x46f7000, 0x90a7000, 0xafe3000, 0xb2a8000, 0xb8b0000, 0xc480000, 0xc4e1000, 0xf03c000, 0xf075000, 0x14dbd000, 0x17728000, 0x1a146000, 0x1ab02000, 0x1af49000, 0x1be7a000, 0x1dc7a000, 0x1de5e000, 0x1f4f9000, 0x2092b000, 0x20a63000, 0x22937000, 0x22fe3000, 0x23e1c000, 0x28c46000, 0x294d6000, 0x2ad19000, 0x2b18b000, 0x2b233000, 0x2b685000, 0x2c792000, 0x2e6c2000, 0x2fa86000, 0x3320f000, 0x36f17000, 0x38406000, 0x38b1b000, 0x3a132000, 0x3b269000, 0x3cc43000, 0x3e2a2000, 0x3e3bb000, 0x3e83b000, 0x3ea14000, 0x4035d000, 0x4137f000, 0x4615b000, 0x50531000, 0x517c8000, 0x519e6000, 0x55ebc000, 0x594f8000, 0x5a732000, 0x5d2cb000, 0x5e409000, 0x5f394000, 0x5f3a8000, 0x60dc6000, 0x61373000, 0x6ebd6000, 0x6fd61000, 0x77161000, 0x7ce81000, 0x80000000, }, + { 61, 48, 12, 55, 3, 58, 51, 56, 15, 29, 54, 11, 31, 49, 40, 37, 7, 4, 23, 35, 25, 18, 27, 43, 6, 41, 17, 45, 52, 53, 47, 16, 42, 0, 30, 13, 38, 62, 1, 8, 21, 28, 57, 9, 60, 19, 44, 50, 14, 36, 22, 2, 32, 59, 34, 10, 63, 39, 5, 24, 33, 20, 46, 26, }, + 0x465275bfa2868e8b +}; +const pattern_t pat27 = { + { 0xa6a000, 0x4c7a000, 0x5183000, 0x8dda000, 0x9cbd000, 0xb860000, 0x10c24000, 0x12dda000, 0x147ab000, 0x14aa4000, 0x16c8f000, 0x17d5b000, 0x18b5c000, 0x1a163000, 0x1b0a1000, 0x24221000, 0x25ef8000, 0x267f1000, 0x268b7000, 0x26b07000, 0x273ad000, 0x27bc2000, 0x2856c000, 0x29896000, 0x2efeb000, 0x331a7000, 0x348e8000, 0x3707f000, 0x3f444000, 0x3fe2a000, 0x433b3000, 0x435d3000, 0x46d82000, 0x4a9d3000, 0x4c6cf000, 0x4ca36000, 0x4ec42000, 0x4f79c000, 0x53cd3000, 0x58c78000, 0x5d910000, 0x616cc000, 0x62800000, 0x65ded000, 0x68831000, 0x6b321000, 0x6cd46000, 0x6d0fa000, 0x6d2f9000, 0x6e353000, 0x6fd5e000, 0x706c5000, 0x7249f000, 0x75d6c000, 0x77528000, 0x783ad000, 0x79738000, 0x79bfe000, 0x79ee9000, 0x7b74a000, 0x7bb41000, 0x7bbeb000, 0x7bbfb000, 0x80000000, }, + { 61, 53, 12, 15, 26, 30, 32, 2, 16, 5, 39, 43, 20, 21, 49, 37, 11, 51, 18, 44, 31, 19, 24, 40, 1, 35, 50, 6, 57, 14, 46, 17, 22, 48, 29, 7, 34, 45, 10, 63, 23, 41, 54, 38, 4, 25, 42, 13, 56, 62, 36, 28, 33, 59, 55, 3, 9, 0, 58, 60, 47, 8, 52, 27, }, + 0x5ba5aa760ec14c3e +}; +const pattern_t pat28 = { + { 0x439a000, 0x6860000, 0xd252000, 0x1105c000, 0x113c8000, 0x1429a000, 0x14922000, 0x15f32000, 0x1992f000, 0x1a1db000, 0x1a87c000, 0x1b260000, 0x1b292000, 0x1c253000, 0x1ea33000, 0x20bbc000, 0x215ae000, 0x25249000, 0x27c89000, 0x27e36000, 0x28bf2000, 0x29c27000, 0x2a575000, 0x2c6fa000, 0x31639000, 0x3184a000, 0x319c3000, 0x348a7000, 0x38aa8000, 0x39dd5000, 0x3a067000, 0x3c0dd000, 0x3cfd4000, 0x3ebb6000, 0x43259000, 0x46494000, 0x46fcb000, 0x4a050000, 0x4b5c4000, 0x4cff3000, 0x4edaa000, 0x4f025000, 0x542e1000, 0x55364000, 0x56338000, 0x56ef8000, 0x5711b000, 0x573d1000, 0x5943b000, 0x5b912000, 0x61ce2000, 0x65211000, 0x65dca000, 0x6dee2000, 0x6df30000, 0x7334d000, 0x73e76000, 0x7473a000, 0x75846000, 0x75fd0000, 0x77174000, 0x773e9000, 0x7a8db000, 0x80000000, }, + { 43, 11, 8, 56, 5, 22, 42, 55, 14, 32, 2, 47, 24, 51, 35, 25, 15, 58, 41, 27, 33, 37, 4, 36, 7, 53, 26, 48, 38, 19, 29, 28, 40, 10, 1, 46, 59, 63, 61, 62, 60, 30, 21, 39, 44, 57, 20, 18, 17, 54, 49, 52, 3, 12, 45, 13, 50, 9, 16, 23, 0, 6, 31, 34, }, + 0x6236b5e97869acb +}; +const pattern_t pat29 = { + { 0x363000, 0x9bc000, 0x1907000, 0x41d5000, 0x5a6e000, 0x9f36000, 0xa3ee000, 0x14b98000, 0x1845c000, 0x188ea000, 0x1b297000, 0x1c024000, 0x1e1eb000, 0x1f3a4000, 0x2047f000, 0x2420a000, 0x28871000, 0x296dd000, 0x2c92c000, 0x2dd42000, 0x3444f000, 0x35b90000, 0x3683c000, 0x3d8ea000, 0x3fe6b000, 0x4200e000, 0x421cf000, 0x42a46000, 0x44463000, 0x44e61000, 0x45c82000, 0x485f8000, 0x48fe8000, 0x4a532000, 0x4a6fd000, 0x4c8f9000, 0x4dbd7000, 0x5052a000, 0x512bb000, 0x5281d000, 0x5315d000, 0x5a202000, 0x5a9fc000, 0x5c11a000, 0x6010b000, 0x62aa3000, 0x63d05000, 0x6774c000, 0x6776d000, 0x68105000, 0x699d5000, 0x69bc2000, 0x6b1b9000, 0x704d5000, 0x73d5c000, 0x73d94000, 0x78483000, 0x78c8c000, 0x78cc5000, 0x7ac8d000, 0x7ae00000, 0x7b597000, 0x7e6ab000, 0x80000000, }, + { 52, 40, 59, 29, 42, 34, 63, 44, 33, 37, 51, 23, 5, 36, 38, 43, 9, 4, 28, 55, 1, 6, 21, 26, 13, 24, 30, 15, 35, 17, 46, 20, 16, 10, 49, 48, 39, 62, 19, 14, 61, 27, 53, 2, 57, 58, 45, 7, 56, 50, 54, 25, 31, 11, 22, 47, 3, 0, 32, 12, 8, 41, 60, 18, }, + 0xa3cfc2e527b1c191 +}; +const pattern_t pat30 = { + { 0x45c5000, 0x6bf3000, 0xc293000, 0xe470000, 0xe5b7000, 0x1256c000, 0x1444d000, 0x15699000, 0x16e86000, 0x1a4d5000, 0x1b803000, 0x1dcf9000, 0x1dd6f000, 0x1f57f000, 0x22879000, 0x263e9000, 0x29423000, 0x2a1a9000, 0x2a699000, 0x2c8fb000, 0x2d2e0000, 0x2ec5e000, 0x317a4000, 0x35a64000, 0x36967000, 0x37299000, 0x37c07000, 0x3b9bb000, 0x3c054000, 0x3ccbc000, 0x3d94a000, 0x3e2e9000, 0x3e7a4000, 0x40b98000, 0x44658000, 0x44738000, 0x44fe3000, 0x451d9000, 0x4536c000, 0x46df2000, 0x48855000, 0x503ce000, 0x53104000, 0x531fc000, 0x54c1b000, 0x56086000, 0x5642b000, 0x573a4000, 0x5887f000, 0x5a871000, 0x5c970000, 0x5e566000, 0x62b8f000, 0x642ce000, 0x65ee5000, 0x66db3000, 0x6727c000, 0x6a9a2000, 0x74a8f000, 0x7c29a000, 0x7cc57000, 0x7f221000, 0x7f28f000, 0x80000000, }, + { 29, 35, 8, 49, 30, 55, 27, 38, 58, 61, 0, 28, 15, 39, 5, 37, 32, 42, 46, 54, 12, 14, 1, 31, 59, 11, 47, 9, 13, 50, 2, 62, 60, 18, 20, 51, 23, 24, 53, 6, 25, 48, 41, 3, 33, 57, 44, 19, 22, 52, 4, 45, 10, 21, 56, 36, 17, 43, 7, 63, 16, 34, 26, 40, }, + 0xf2ae48cdd4d05e58 +}; +const pattern_t pat31 = { + { 0x143f000, 0x2068000, 0x328c000, 0x70a6000, 0x92a7000, 0x93dd000, 0xa3a8000, 0xbe51000, 0xbfc8000, 0xe353000, 0x1272f000, 0x143a4000, 0x16825000, 0x20bf8000, 0x20d9f000, 0x21e32000, 0x22426000, 0x2246b000, 0x22cea000, 0x25dc2000, 0x29324000, 0x29cd1000, 0x2aa44000, 0x2cd84000, 0x2dafb000, 0x2e74b000, 0x2f5b1000, 0x3a7a9000, 0x3bb38000, 0x3c11a000, 0x3c30a000, 0x3e2f1000, 0x4187b000, 0x42190000, 0x44e34000, 0x4d850000, 0x53ceb000, 0x540db000, 0x54937000, 0x5530a000, 0x5a111000, 0x5c280000, 0x5ef17000, 0x5fccf000, 0x64434000, 0x6498e000, 0x662c4000, 0x6a7e2000, 0x6b5a1000, 0x6c11f000, 0x6dd97000, 0x6ef1b000, 0x6f44e000, 0x7084f000, 0x73b53000, 0x7872c000, 0x78ed7000, 0x7935b000, 0x79bf9000, 0x7a6af000, 0x7b6fd000, 0x7bd42000, 0x7f233000, 0x80000000, }, + { 6, 25, 28, 44, 27, 43, 58, 33, 23, 21, 16, 48, 30, 26, 5, 20, 49, 38, 2, 45, 11, 61, 17, 0, 53, 13, 7, 52, 40, 31, 36, 4, 10, 8, 24, 22, 42, 63, 35, 60, 47, 29, 46, 19, 1, 3, 34, 55, 59, 14, 39, 12, 32, 50, 62, 54, 56, 51, 57, 15, 41, 18, 37, 9, }, + 0xc8cbea4e3899aca5 +}; +const pattern_t* patterns[] = {&trivial_pattern, + &pat0, &pat1, &pat2, &pat3, &pat4, &pat5, &pat6, &pat7, + &pat8, &pat9, &pat10, &pat11, &pat12, &pat13, &pat14, &pat15, + &pat16, &pat17, &pat18, &pat19, &pat20, &pat21, &pat22, &pat23, + &pat24, &pat25, &pat26, &pat27, &pat28, &pat29, &pat30, &pat31}; + +//static variables used by the worker threads +static int outfd = 0; +static sem_t chunk_sems[NUM_CHUNKS]; +static phase_t phase; +#if USE_MMAP +static void* p_file; +#endif + +static void +usage() +{ + (void) fprintf(stderr, "usage: txg_integrity \n"); + exit(2); +} + + +/* Fills a buffer with a special marker. The marker contains information about + * the file offset where this buffer is supposed to go, and whether it will + * be written by a leader or a follower */ +static void +marker_fill(uint64_t* buf, int file_ofs, size_t len, int is_follower){ + int ofs; + uint32_t lead_mark = 0x4441454c; //"LEAD" in little endian + uint32_t follow_mark = 0x4c4c4f46; //"FOLL" in little endian + for (ofs = file_ofs; ofs < file_ofs + len; ofs += sizeof(uint64_t)){ + uint64_t mark = ((is_follower ? + (uint64_t)follow_mark : (uint64_t)lead_mark) << (uint64_t)32) | + htonl((ofs & 0xFFFFFFFF)); + int buf_idx = (ofs - file_ofs) / sizeof(uint64_t); + buf[buf_idx] = mark; + } +} + +static int +verify_file(int fd, const pattern_t* p_pat){ + int chunk_idx; + int good_data = 1; + int err = 0; + + for(chunk_idx=0; chunk_idx < NUM_CHUNKS; chunk_idx++){ + int i; + uint32_t chunk_start, chunk_end; + get_chunk_range(p_pat, chunk_idx, &chunk_start, &chunk_end); + size_t size = chunk_end - chunk_start; + uint64_t* desired_buf = malloc(size); + uint64_t* actual_buf = malloc(size); + if ((1 << chunk_idx) & p_pat->follower_chunks){ + marker_fill(desired_buf, chunk_start, size, 1); + } + else{ + marker_fill(desired_buf, chunk_start, size, 0); + } + + //read the actual data from the file + if( read(fd, actual_buf, size) <= 0 ){ + perror("read"); + exit(1); + } + + //verify the data + for(i=0; i < size / sizeof(uint64_t); i++){ + int chunk_offset = sizeof(uint64_t) * i; + int file_offset = chunk_start + chunk_offset; + if (good_data && (actual_buf[i] != desired_buf[i])){ + fprintf(stderr, "txg_integrity: miscompare at " + "chunk %i, chunk offset %lx, file offset %lx\n", + chunk_idx, chunk_offset, file_offset); + fprintf(stderr, "Expected %16lx, got %16lx\n", + desired_buf[i], actual_buf[i]); + err = 1; + good_data = 0; + } + else if (!good_data && (actual_buf[i] == desired_buf[i])) { + fprintf(stderr, "txg_integrity: miscompare ends at " + "chunk %i, chunk offset %lx, file offset %lx\n", + chunk_idx, chunk_offset, file_offset); + good_data = 1; + } + } + free(desired_buf); + free(actual_buf); + } + + return (err); +} + +/* Writes a special marker to every byte within the chunk */ +static void +write_chunk(pattern_t* p_pat, int chunk_idx, int is_follower) +{ + uint32_t chunk_start, chunk_end; + get_chunk_range(p_pat, chunk_idx, &chunk_start, &chunk_end); + size_t size = chunk_end - chunk_start; + uint64_t* buf = malloc(size); + marker_fill(buf, chunk_start, size, is_follower); +#if USE_MMAP + memcpy((void*)( (char*)p_file + chunk_start ), (void*)buf, size); +#else + pwrite(outfd, (void*)buf, size, chunk_start); +#endif + free(buf); +} + +static void +my_sync(int fd){ + //FreeBSD's msync(2) recommends that msync is obsolete and fsync should + //be used instead, even for memory-mapped files + if (fsync(fd)){ + perror("fsync"); + exit(1); + } +} + +static void* +follower(void* data) +{ + int perm_idx; + pattern_t* p_pat = (pattern_t*)data; +/* printf("Follower started\n");*/ + for(perm_idx = 0; perm_idx < NUM_CHUNKS; perm_idx++) + { + int chunk_idx = p_pat->permutation[perm_idx]; + if (perm_idx == NUM_CHUNKS / 2 && phase == follower_syncs){ +/* printf("about to sync in follower\n");*/ + my_sync(outfd); + } + + if ( (1 << chunk_idx) & p_pat->follower_chunks){ +/* printf("about to pend on semaphore\n");*/ +#if USE_THREADS + if (-1 == sem_wait(&chunk_sems[chunk_idx])){ + perror("sem_wait"); + exit(1); + } +#endif +/* printf("about to write chunk in follower\n");*/ + write_chunk(p_pat, chunk_idx, 1); + } + } + return 0; +} + +static void* +leader(void* data) +{ + int perm_idx; + pattern_t* p_pat = (pattern_t*)data; +/* printf("Leader started\n");*/ + for(perm_idx = 0; perm_idx < NUM_CHUNKS; perm_idx++) + { + int chunk_idx = p_pat->permutation[perm_idx]; + if (perm_idx == NUM_CHUNKS / 2 && phase == leader_syncs){ + //printf("about to sync in leader\n"); + my_sync(outfd); + } + //printf("about to write chunk in leader\n"); + write_chunk(p_pat, chunk_idx, 0); + //printf("about to post semaphore\n"); +#if USE_THREADS + if (sem_post(&chunk_sems[chunk_idx]) == -1){ + perror("sem_post"); + exit(1); + } +#endif + } + return 0; +} + +int +main(int argc, char** argv) +{ + int rep; + int pat; +#if USE_THREADS + pthread_t leader_th, follower_th; +#endif + + if (argc != 2){ + usage(); + } + + //follower_chunks bitmap must have enough space to represent every chunk + assert(NUM_CHUNKS <= 8 * sizeof(((pattern_t*) 0)->follower_chunks)); + + for(rep=0; rep < NUM_REPETITIONS; rep++){ + printf("Starting repetition %d\n", rep); + for(pat=0; pat < sizeof(patterns) / sizeof(patterns[0]); pat++){ + void *pat_p = (void *)(uintptr_t)(const void *)patterns[pat]; + for(phase=leader_syncs; phase < NUM_PHASES; phase++){ + int sem_idx; + int ofs=0; + +/* printf("Starting on patterns[%d]\n" , pat);*/ + outfd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0644); + if (outfd == -1){ + perror("open"); + exit(1); + } + + //set the file size + if ( ftruncate(outfd, FSIZE)){ + perror("ftruncate"); + exit(1); + } + + //Zero-fill the file to avoid fragmentation, as recommended by mmap(2). + for(ofs=0; ofs < FSIZE; ofs+=CLUSTERSIZE){ + char buffer[CLUSTERSIZE]; + bzero(buffer, CLUSTERSIZE); + if ( -1 == write(outfd, buffer, CLUSTERSIZE)){ + perror("write"); + exit(1); + } + } + //Return the file pointer to the beginning prior to mmap + if (-1 == lseek(outfd, 0, SEEK_SET)){ + perror("lseek"); + } + +#if USE_MMAP + //mmap the file + p_file = mmap(0, FSIZE, PROT_READ | PROT_WRITE, MAP_SHARED, outfd, 0); + if (p_file == MAP_FAILED){ + perror("mmap"); + exit(1); + } +#endif +#if USE_THREADS + //Create the semaphores + for(sem_idx=0; sem_idx < NUM_CHUNKS; sem_idx++){ + if (sem_init(&chunk_sems[sem_idx], 0, 0)){ + perror("sem_init"); + exit(1); + } + } + + //Create the worker threads + if (pthread_create(&follower_th, NULL, follower, pat_p)){ + perror("pthread_create follower"); + exit(1); + } + if (pthread_create(&leader_th, NULL, leader, pat_p)){ + perror("pthread_create leader"); + exit(1); + } + + //Join the threads + if (pthread_join(leader_th, NULL)){ + perror("pthread_join leader"); + exit(1); + } +/* printf("Joined leader\n");*/ + if (pthread_join(follower_th, NULL)){ + perror("pthread_join follower"); + exit(1); + } +/* printf("Joined follower\n");*/ + + //destroy the semaphores + for(sem_idx=0; sem_idx < NUM_CHUNKS; sem_idx++){ + if (sem_destroy(&chunk_sems[sem_idx])){ + perror("sem_destory"); + exit(1); + } + } + //printf("destroyed semaphores\n"); +#else + leader(pat_p); follower(pat_p); +#endif + +#if USE_MMAP + //unmap the file prior to verifying it + if (msync(p_file, 0, 0)){ + perror("msync"); + exit(1); + } + //printf("finished msync\n"); + + if (munmap(p_file, FSIZE)){ + perror("munmap"); + exit(1); + } + //printf("finished munmap\n"); +#endif + + //Verify the contents of the file. + if (verify_file(outfd, patterns[pat])) { + exit(1); + } + //printf("finished verify_file\n"); + + //close the file: + if (close(outfd)){ + perror("close"); + exit(1); + } + } + } + } + + return 0; +} diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.cfg b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.cfg new file mode 100644 index 00000000000..0ceef29a323 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.cfg @@ -0,0 +1,34 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2011 Spectra logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)transaction_group_integrity.cfg 1.0 10/20/11 SL" +# + +export TESTFILE=testfile${TESTCASE_ID} +export DISK="/dev/md${TESTCASE_ID}" +export TESTDEV=${DISK} diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.d b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.d new file mode 100644 index 00000000000..5436f15dd0e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity.d @@ -0,0 +1,117 @@ +#!/usr/sbin/dtrace -s + +/* This D script attempts to verify whether a single dbuf is being held by + * multiple transaction groups at the time it is fixed up. The purpose is + * to verify whether the txg_integrity test exercises the kernel code paths + * that we want it to. + * XXX this is a work in progress. It is not yet usable + * + * $FreeBSD$ + */ + +/* zfs:kernel:dbuf_fix_old_data:entry +{ + printf("entry"); +}*/ + +dtrace:::BEGIN +{ + dmu_write_uio_dnode_size = 0; + dmu_write_uio_dnode_loffset = 0; + dmu_write_uio_dnode_numbufs = 0; + dbuf_dirty_size = 0; + dbuf_dirty_offset = 0; + uio_stats2_refcount = 0, + uio_stats2_dirtycnt = 0, + dbuf_dirty_entry_refcount = 0; + dbuf_dirty_entry_dirtycnt = 0; + dbuf_dirty_refcount = 0; + dbuf_dirty_dirtycnt = 0; + ge2TrackerName[0] = ""; + ge2TrackerCount[0] = 0; +} + +zfs:kernel:dbuf_fix_old_data:db_get_spa +{ + /*printf("db_get_spa");*/ + /* stack(); */ + printf("uio_stats: size=%d\tloffset=%x\tnumbufs=%d\n\trefcount(holds)=%d\tdirtycnt=%d\n", + dmu_write_uio_dnode_size , + dmu_write_uio_dnode_loffset, + dmu_write_uio_dnode_numbufs , + uio_stats2_refcount, + uio_stats2_dirtycnt); + printf("dbuf_dirty stats: size=%d\toffset=%x\n\tentry: refcount(holds)=%d\tdirtycnt=%d\n\texit: refcount(holds)=%d\tdirtycnt=%d\n", + dbuf_dirty_size, + dbuf_dirty_offset, + dbuf_dirty_entry_refcount, + dbuf_dirty_entry_dirtycnt, + dbuf_dirty_refcount, + dbuf_dirty_dirtycnt); + printf("DR_TXG=%d\tDB address = %x\n", args[0], (long long)args[1]); + printf("ge2Tracker entry: name=%s\tcount=%d", ge2TrackerName[(long long)args[1]], ge2TrackerCount[(long long)args[1]]); + exit(0); +} + +zfs:kernel:dbuf_dirty:entry +{ + dbuf_dirty_size = args[0]; + dbuf_dirty_offset = args[1]; + dbuf_dirty_entry_refcount = args[2]; + dbuf_dirty_entry_dirtycnt = args[3]; +} + + +zfs2:kernel:dmu_write_uio_dnode:uio_stats +{ + dmu_write_uio_dnode_size = args[0]; + dmu_write_uio_dnode_loffset = args[1]; + dmu_write_uio_dnode_numbufs = args[2]; + printf("uio_stats: size=%d\tloffset=%x\tnumbufs=%d", args[0], args[1], args[2]); +} + +zfs2:kernel:dmu_write_uio_dnode:uio_stats_two +{ + uio_stats2_refcount = args[0]; + uio_stats2_dirtycnt = args[1]; + printf("uio_stats2: refcount=%d\tdirtycnt=%d\tdb=%x", args[0], args[1], (long long)args[2]); +} + +zfs2:kernel:dmu_write_uio_dnode:uio_stats_three +{ + printf("uio_stats3: io_txg=%d", args[0]); +} + +zfs:kernel:dbuf_dirty:no_db_nofill +{ + dbuf_dirty_refcount = args[0]; + dbuf_dirty_dirtycnt = args[1]; +} + +/* refcount:kernel::ge2 +{ + stack(); +} */ + +zfs:kernel:dbuf_hold_impl:ge2 +{ + ge2TrackerName[(long long)args[0]] = "dbuf_hold_impl"; + ge2TrackerCount[(long long)args[0]] = args[1]; + printf(">= 2: db=%x\trc=%d", (long long)args[0], args[1]); + /* stack(); */ + /* ustack(10); */ +} + +/* zfs:kernel:dbuf_add_ref:ge2 +{ + ge2TrackerName[(long long)args[0]] = "dbuf_add_ref"; + ge2TrackerCount[(long long)args[0]] = args[1]; +} */ + +/* zfs2:kernel:dmu_bonus_hold:ge2 +{ + ge2TrackerName[(long long)args[0]] = "dmu_bonus_hold"; + ge2TrackerCount[(long long)args[0]] = args[1]; +}*/ + + diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity_001_pos.ksh b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity_001_pos.ksh new file mode 100644 index 00000000000..3f2ae69f91f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity_001_pos.ksh @@ -0,0 +1,74 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2011 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + +. ${STF_SUITE}/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: transaction_group_integrity_001_pos +# +# DESCRIPTION: +# +# Verify the integrity of non-aligned writes to the same blocks that cross +# transaction groups. +# +# STRATEGY: +# This test verifies that non-aligned writes are correctly committed to the +# file system, even adjacent transaction groups include writes to the same +# blocks. The test runs through multiple repetitions in an attempt to trigger +# race conditions. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: BEGIN (2011-10-20) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +log_assert "Ensure that non-aligned writes to the same blocks that cross" \ + "transaction groups do not corrupt the file." + +# Run the test program +txg_integrity ${TESTDIR}/${TESTFILE} + +# Success is indicated by the return status +if [[ $? -ne 0 ]]; then + log_fail "Test failed to execute or file became corrupted" +else + log_pass "Multiple unaligned writes from multiple transactions groups succeeded" +fi + + diff --git a/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity_test.sh b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity_test.sh new file mode 100755 index 00000000000..375fb41312c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/txg_integrity/txg_integrity_test.sh @@ -0,0 +1,113 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case txg_integrity_001_pos cleanup +txg_integrity_001_pos_head() +{ + atf_set "descr" "Ensure that non-aligned writes to the same blocks that cross transaction groups do not corrupt the file." + atf_set "timeout" 1800 +} +txg_integrity_001_pos_body() +{ + export PATH=$(atf_get_srcdir):$PATH + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/txg_integrity.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/txg_integrity_001_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +txg_integrity_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/txg_integrity.cfg + + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case fsync_integrity_001_pos cleanup +fsync_integrity_001_pos_head() +{ + atf_set "descr" "Verify the integrity of non-aligned writes to the same blocks within the same transaction group, where an fsync is issued by a non-final writer." + atf_set "timeout" 1800 +} +fsync_integrity_001_pos_body() +{ + export PATH=$(atf_get_srcdir):$PATH + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/txg_integrity.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/fsync_integrity_001_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +fsync_integrity_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/txg_integrity.cfg + export DISK="/dev/md${TESTCASE_ID}" + export TESTDEV=${DISK}p1 + + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case txg_integrity_001_pos + atf_add_test_case fsync_integrity_001_pos +} + + +save_artifacts() +{ + # If ARTIFACTS_DIR is defined, save test artifacts for + # post-mortem analysis + if [[ -n $ARTIFACTS_DIR ]]; then + TC_ARTIFACTS_DIR=${ARTIFACTS_DIR}/sys/cddl/zfs/tests/txg_integrity/$(atf_get ident) + mkdir -p $TC_ARTIFACTS_DIR + cp -a $TESTDIR/$TESTFILE $TC_ARTIFACTS_DIR + bzip2 $TC_ARTIFACTS_DIR/$TESTFILE + # Now export the pool and tar up the entire thing + zpool export $TESTPOOL + dd if=$TESTDEV bs=131072 of=$TC_ARTIFACTS_DIR/pool + bzip2 $TC_ARTIFACTS_DIR/pool + # Reimport it so that the cleanup script will work + zpool import $TESTPOOL + fi +} diff --git a/tests/sys/cddl/zfs/tests/userquota/Makefile b/tests/sys/cddl/zfs/tests/userquota/Makefile new file mode 100644 index 00000000000..e7042269959 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/Makefile @@ -0,0 +1,34 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/userquota +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= userquota_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= groupspace_001_pos.ksh +${PACKAGE}FILES+= userquota_common.kshlib +${PACKAGE}FILES+= userquota_010_pos.ksh +${PACKAGE}FILES+= userquota_001_pos.ksh +${PACKAGE}FILES+= userquota_009_pos.ksh +${PACKAGE}FILES+= userquota_008_pos.ksh +${PACKAGE}FILES+= userquota_004_pos.ksh +${PACKAGE}FILES+= userquota_005_neg.ksh +${PACKAGE}FILES+= userspace_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= userquota_011_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= userquota_002_pos.ksh +${PACKAGE}FILES+= userquota_006_pos.ksh +${PACKAGE}FILES+= userquota_012_neg.ksh +${PACKAGE}FILES+= groupspace_002_pos.ksh +${PACKAGE}FILES+= userquota_003_pos.ksh +${PACKAGE}FILES+= userquota_007_pos.ksh +${PACKAGE}FILES+= userquota.cfg +${PACKAGE}FILES+= userspace_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/userquota/cleanup.ksh b/tests/sys/cddl/zfs/tests/userquota/cleanup.ksh new file mode 100644 index 00000000000..fd13711b399 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/cleanup.ksh @@ -0,0 +1,41 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 09/08/06 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +if ! is_userquota_supported; then + log_unsupported "userquota is not supported in this system." +fi + +log_must clean_user_group + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/userquota/groupspace_001_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/groupspace_001_pos.ksh new file mode 100644 index 00000000000..6ac57c5aab9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/groupspace_001_pos.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)groupspace_001_pos.ksh 1.2 09/08/06 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: groupspace_001_pos +# +# DESCRIPTION: +# Check the zfs groupspace with all parameters +# +# +# STRATEGY: +# 1. set zfs groupquota to a fs +# 2. write some data to the fs with specified user and group +# 3. use zfs groupspace with all possible parameters to check the result +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + if datasetexists $snap_fs; then + log_must $ZFS destroy $snap_fs + fi + + log_must cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the zfs groupspace with all possible parameters" + +set -A params -- "-h" "--help" "-n" "-H" "-p" "-o type,name,used,quota" \ + "-o name,used,quota" "-o used,quota" "-o used" "-o quota" \ + "-s type" "-s name" "-s used" "-s quota" \ + "-S type" "-S name" "-S used" "-S quota" \ + "-t posixuser" "-t posixgroup" "-t all" + +if check_version "5.11" ; then + set -A params -- "${params[@]}" "-i" "-t smbuser" "-t smbgroup" +fi + +typeset snap_fs=$QFS@snap + +log_must $ZFS set groupquota@$QGROUP=500m $QFS +mkmount_writable $QFS +log_must user_run $QUSER1 $MKFILE 50m $QFILE + +$SYNC + +log_must $ZFS snapshot $snap_fs + +for param in "${params[@]}"; do + log_must eval "$ZFS groupspace $param $QFS >/dev/null 2>&1" + log_must eval "$ZFS groupspace $param $snap_fs >/dev/null 2>&1" +done + +log_pass "Check the zfs groupspace with all possible parameters" diff --git a/tests/sys/cddl/zfs/tests/userquota/groupspace_002_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/groupspace_002_pos.ksh new file mode 100644 index 00000000000..31548f964e4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/groupspace_002_pos.ksh @@ -0,0 +1,93 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)groupspace_002_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: groupspace_002_pos +# +# DESCRIPTION: +# Check the user used and groupspace size in zfs groupspace +# +# +# STRATEGY: +# 1. set zfs groupquota to a fs +# 2. write some data to the fs with specified user and size +# 3. use zfs groupspace to check the used size and quota size +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + if datasetexists $snapfs; then + log_must $ZFS destroy $snapfs + fi + log_must cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the zfs groupspace used and quota" + +log_must $ZFS set groupquota@$QGROUP=500m $QFS +mkmount_writable $QFS +log_must user_run $QUSER1 $TRUNCATE -s 100m $QFILE + +$SYNC + +typeset snapfs=$QFS@snap + +log_must $ZFS snapshot $snapfs + +log_must eval "$ZFS groupspace $QFS >/dev/null 2>&1" +log_must eval "$ZFS groupspace $snapfs >/dev/null 2>&1" + +for fs in "$QFS" "$snapfs"; do + log_note "check the quota size in zfs groupspace $fs" + log_must eval "$ZFS groupspace $fs | $GREP $QGROUP | $GREP 500M" + + log_note "check the user used size in zfs groupspace $fs" + log_must eval "$ZFS groupspace $fs | $GREP $QGROUP | $GREP 100M" +done + +log_pass "Check the zfs groupspace used and quota pass as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/setup.ksh b/tests/sys/cddl/zfs/tests/userquota/setup.ksh new file mode 100644 index 00000000000..f96519dc2d3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/setup.ksh @@ -0,0 +1,48 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +verify_runnable "both" + +if ! is_userquota_supported; then + log_unsupported "userquota is not supported in this system." +fi + +log_must clean_user_group + +log_must add_group $QGROUP +log_must add_user $QGROUP $QUSER1 +log_must add_user $QGROUP $QUSER2 + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota.cfg b/tests/sys/cddl/zfs/tests/userquota/userquota.cfg new file mode 100644 index 00000000000..c73bfea2ebf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota.cfg @@ -0,0 +1,48 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota.cfg 1.1 09/06/22 SMI" +# + +export QUSER1=quser1 +export QUSER2=quser2 + +export QGROUP=qgroup +export QGROUP1=qgroup1 +export QGROUP1=qgroup2 + +export UQUOTA_SIZE=1000000 +export GQUOTA_SIZE=4000000 + +export QFS=$TESTPOOL/$TESTFS +export QFILE=$TESTDIR/qf.${TESTCASE_ID} +export OFILE=$TESTDIR/of.${TESTCASE_ID} + +export SNAP_QUOTA=100m +export TEST_QUOTA=88888 + diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_001_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_001_pos.ksh new file mode 100644 index 00000000000..c8fdc316c78 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_001_pos.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_001_pos.ksh 1.1 09/06/22 SMI" +# +################################################################################ +# +# +# __stc_assertion_start +# +# ID: userquota_001_pos +# +# DESCRIPTION: +# Check the basic function of the userquota and groupquota +# +# +# STRATEGY: +# 1. Set userquota and overwrite the quota size +# 2. The write operation should fail with Disc quota exceeded +# 3. Set groupquota and overwrite the quota size +# 4. The write operation should fail with Disc quota exceeded +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + cleanup_quota +} + +log_onexit cleanup + +log_assert "If write operation overwrite {user|group}quota size, it will fail" + +mkmount_writable $QFS +log_note "Check the userquota@$QUSER1" +log_must $ZFS set userquota@$QUSER1=$UQUOTA_SIZE $QFS +log_must user_run $QUSER1 $TRUNCATE -s UQUOTA_SIZE $QFILE +$SYNC +log_mustnot user_run $QUSER1 $TRUNCATE -s 1 $OFILE +cleanup_quota + +log_note "Check the groupquota@$QGROUP" +log_must $ZFS set groupquota@$QGROUP=$GQUOTA_SIZE $QFS +mkmount_writable $QFS +log_must user_run $QUSER1 $TRUNCATE -s $GQUOTA_SIZE $QFILE +$SYNC +log_mustnot user_run $TRUNCATE -s 1 $OFILE + +cleanup_quota + +log_pass "Write operation overwrite {user|group}quota size, it as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_002_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_002_pos.ksh new file mode 100644 index 00000000000..401584a00b9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_002_pos.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_002_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_002_pos +# +# DESCRIPTION: +# the userquota and groupquota can be set during zpool or zfs creation" +# +# +# STRATEGY: +# 1. Set userquota and groupquota via "zpool -O or zfs create -o" +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + if [[ -f $pool_vdev ]]; then + $RM -f $pool_vdev + fi +} + +log_onexit cleanup + +log_assert \ + "the userquota and groupquota can be set during zpool,zfs creation" + +typeset pool_vdev=$TMPDIR/pool_dev.${TESTCASE_ID} + +log_must create_vdevs $pool_vdev +destroy_pool $TESTPOOL1 + +log_must $ZPOOL create -O userquota@$QUSER1=$UQUOTA_SIZE \ + -O groupquota@$QGROUP=$GQUOTA_SIZE $TESTPOOL1 $pool_vdev + +log_must eval "$ZFS list -r -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL1 > /dev/null 2>&1" + +log_must check_quota "userquota@$QUSER1" $TESTPOOL1 "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $TESTPOOL1 "$GQUOTA_SIZE" + +log_must $ZFS create -o userquota@$QUSER1=$UQUOTA_SIZE \ + -o groupquota@$QGROUP=$GQUOTA_SIZE $TESTPOOL1/fs + +log_must eval "$ZFS list -r -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL1 > /dev/null 2>&1" + +log_must check_quota "userquota@$QUSER1" $TESTPOOL1/fs "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $TESTPOOL1/fs "$GQUOTA_SIZE" + +log_pass \ + "the userquota and groupquota can be set during zpool,zfs creation" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_003_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_003_pos.ksh new file mode 100644 index 00000000000..c007ed960c9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_003_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_003_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_003_pos +# +# DESCRIPTION: +# Check the basic function of set/get userquota and groupquota on fs +# +# +# STRATEGY: +# 1. Set userquota on fs and check the zfs get +# 2. Set groupquota on fs and check the zfs get +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the basic function of set/get userquota and groupquota on fs" + +log_note "Check the set|get userquota@$QUSER1 and groupquota@QGROUP" +log_must $ZFS set userquota@$QUSER1=$UQUOTA_SIZE $QFS +log_must check_quota "userquota@$QUSER1" $QFS "$UQUOTA_SIZE" + +log_must $ZFS set groupquota@$QGROUP=$GQUOTA_SIZE $QFS +log_must check_quota "groupquota@$QGROUP" $QFS "$GQUOTA_SIZE" + +log_pass "Check the basic function of set/get userquota on fs passed as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_004_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_004_pos.ksh new file mode 100644 index 00000000000..431c5c343df --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_004_pos.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_004_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_004_pos +# +# DESCRIPTION: +# Check the basic function user|group used +# +# +# STRATEGY: +# 1. Write some data to fs by normal user and check the user|group used +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the basic function of {user|group} used" + +typeset user_used=$(get_value "userused@$QUSER1" $QFS) +typeset group_used=$(get_value "groupused@$QGROUP" $QFS) + +if [[ $user_used != 0 ]]; then + log_fail "FAIL: userused should be 0" +fi +if [[ $group_used != 0 ]]; then + log_fail "FAIL: groupused should be 0" +fi + +mkmount_writable $QFS +log_must user_run $QUSER1 $TRUNCATE -s 100m $QFILE +$SYNC + +user_used=$(get_value "userused@$QUSER1" $QFS) +group_used=$(get_value "groupused@$QGROUP" $QFS) + +if [[ $user_used != "100M" ]]; then + log_note "user $QUSER1 used is $user_used" + log_fail "userused for user $QUSER1 expected to be 50.0M, not $user_used" +fi + +if [[ $user_used != $group_used ]]; then + log_note "user $QUSER1 used is $user_used" + log_note "group $QGROUP used is $group_used" + log_fail "FAIL: userused should equal to groupused" +fi + +log_pass "Check the basic function of {user|group}used pass as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_005_neg.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_005_neg.ksh new file mode 100644 index 00000000000..f6a7a4d3aff --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_005_neg.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_005_neg.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_005_neg +# +# DESCRIPTION: +# Check the invalid parameter of zfs set user|group quota +# +# +# STRATEGY: +# 1. check the invalid zfs set user|group quota to fs +# 1. check the valid zfs set user|group quota to snapshots +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + if datasetexists $snap_fs; then + log_must $ZFS destroy $snap_fs + fi + + log_must cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the invalid parameter of zfs set user|group quota" +typeset snap_fs=$QFS@snap + +log_must $ZFS snapshot $snap_fs + +set -A no_users "mms1234" "ss@#" "root-122" +for user in "${no_users[@]}"; do + log_mustnot $ID $user + log_mustnot $ZFS set userquota@$user=100m $QFS +done + +log_note "can set all numberic id even that id is not existed" +log_must $ZFS set userquota@12345678=100m $QFS +log_mustnot $ZFS set userquota@12345678=100m $snap_fs + +set -A sizes "100mfsd" "m0.12m" "GGM" "-1234-m" "123m-m" + +for size in "${sizes[@]}"; do + log_note "can not set user quota with invalid size parameter" + log_mustnot $ZFS set userquota@root=$size $QFS +done + +log_note "can not set user quota to snapshot $snap_fs" +log_mustnot $ZFS set userquota@root=100m $snap_fs + + +set -A no_groups "aidsf@dfsd@" "123223-dsfds#sdfsd" "mss_#ss" "@@@@" +for group in "${no_groups[@]}"; do + log_mustnot eval "$GREP $group /etc/group" + log_mustnot $ZFS set groupquota@$group=100m $QFS +done + +log_note "can not set group quota with invalid size parameter" +log_mustnot $ZFS set groupquota@root=100msfsd $QFS + +log_note "can not set group quota to snapshot $snap_fs" +log_mustnot $ZFS set groupquota@root=100m $snap_fs + +log_pass "Check the invalid parameter of zfs set user|group quota pas as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_006_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_006_pos.ksh new file mode 100644 index 00000000000..b4cca662ecd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_006_pos.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_006_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_006_pos +# +# DESCRIPTION: +# Check the invalid parameter of zfs get user|group quota +# +# +# STRATEGY: +# 1. check the invalid zfs get user|group quota to fs +# 2. check the valid zfs get user|group quota to snapshots +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + if datasetexists $snap_fs; then + log_must $ZFS destroy $snap_fs + fi + + log_must cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the invalid parameter of zfs get user|group quota" +typeset snap_fs=$QFS@snap + +log_must $ZFS snapshot $snap_fs + +set -A no_users "mms1234" "ss@#" "root-122" "1234" +for user in "${no_users[@]}"; do + log_mustnot eval "$ID $user >/dev/null 2>&1" + log_must eval "$ZFS get userquota@$user $QFS >/dev/null 2>&1" + log_must eval "$ZFS get userquota@$user $snap_fs >/dev/null 2>&1" +done + +set -A no_groups "aidsf@dfsd@" "123223-dsfds#sdfsd" "mss_#ss" "1234" +for group in "${no_groups[@]}"; do + log_mustnot eval "$GROUPDEL $group > /dev/null 2>&1" + log_must eval "$ZFS get groupquota@$group $QFS >/dev/null 2>&1" + log_must eval "$ZFS get groupquota@$group $snap_fs >/dev/null 2>&1" +done + +log_pass "Check the invalid parameter of zfs get user|group quota pass as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_007_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_007_pos.ksh new file mode 100644 index 00000000000..aa585fa4000 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_007_pos.ksh @@ -0,0 +1,89 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_007_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_007_pos +# +# DESCRIPTION: +# +# userquota/groupquota can be set beyond the fs quota +# userquota/groupquota can be set at a smaller size than its current usage. +# +# STRATEGY: +# 1. set quota to a fs and set a larger size of userquota and groupquota +# 2. write some data to the fs and set a smaller userquota and groupquota +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + log_must cleanup_quota + log_must $ZFS set quota=none $QFS +} + +log_onexit cleanup + +log_assert "Check set user|group quota to larger than the quota size of a fs" + +log_must $ZFS set quota=200m $QFS +log_must $ZFS set userquota@$QUSER1=500m $QFS +log_must $ZFS set groupquota@$QGROUP=600m $QFS + +log_must $ZFS get userquota@$QUSER1 $QFS +log_must $ZFS get groupquota@$QGROUP $QFS + +log_note "write some data to the $QFS" +mkmount_writable $QFS +log_must user_run $QUSER1 $MKFILE 100m $QFILE +$SYNC + +log_note "set user|group quota at a smaller size than it current usage" +log_must $ZFS set userquota@$QUSER1=90m $QFS +log_must $ZFS set groupquota@$QGROUP=90m $QFS + +log_must $ZFS get userquota@$QUSER1 $QFS +log_must $ZFS get groupquota@$QGROUP $QFS + +log_pass "set user|group quota to larger than quota size of a fs pass as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_008_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_008_pos.ksh new file mode 100644 index 00000000000..2c20ce3e671 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_008_pos.ksh @@ -0,0 +1,74 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_008_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_008_pos +# +# DESCRIPTION: +# +# zfs get all does not print out userquota/groupquota +# +# STRATEGY: +# 1. set userquota and groupquota to a fs +# 2. check zfs get all fs +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + log_must cleanup_quota +} + +log_onexit cleanup + +log_assert "Check zfs get all will not print out user|group quota" + +log_must $ZFS set userquota@$QUSER1=50m $QFS +log_must $ZFS set groupquota@$QGROUP=100m $QFS + +log_mustnot $ZFS get all $QFS | $GREP userquota +log_mustnot $ZFS get all $QFS | $GREP groupquota + +log_pass "zfs get all will not print out user|group quota" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_009_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_009_pos.ksh new file mode 100644 index 00000000000..bdc262fdcc9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_009_pos.ksh @@ -0,0 +1,106 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_009_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_009_pos +# +# DESCRIPTION: +# Check user|group quota to snapshot that: +# 1) can not set user|group quota to snapshot directly +# 2) snapshot can inherit the parent fs's user|groupquota +# 3) the user|group quota will not change even the parent fs's quota changed. +# +# +# STRATEGY: +# 1. create a snapshot of a fs +# 2. set the user|group quota to snapshot and expect fail +# 3. set user|group quota to fs and check the snapshot +# 4. re-set user|group quota to fs and check the snapshot's value +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + if datasetexists $snap_fs; then + log_must $ZFS destroy $snap_fs + fi + + log_must cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the snapshot's user|group quota" +typeset snap_fs=$QFS@snap + + +log_must $ZFS set userquota@$QUSER1=$UQUOTA_SIZE $QFS +log_must check_quota "userquota@$QUSER1" $QFS "$UQUOTA_SIZE" + +log_must $ZFS set groupquota@$QGROUP=$GQUOTA_SIZE $QFS +log_must check_quota "groupquota@$QGROUP" $QFS "$GQUOTA_SIZE" + +log_must $ZFS snapshot $snap_fs + +log_note "check the snapshot $snap_fs user|group quota" +log_must check_quota "userquota@$QUSER1" $snap_fs "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $snap_fs "$GQUOTA_SIZE" + +log_note "set userquota and groupquota to $snap_fs which will fail" +log_mustnot $ZFS set userquota@$QUSER1=$SNAP_QUOTA $snap_fs +log_mustnot $ZFS set groupquota@$QGROUP=$SNAP_QUOTA $snap_fs + +log_note "change the parent's userquota and groupquota" +log_must $ZFS set userquota@$QUSER1=$TEST_QUOTA $QFS +log_must $ZFS set groupquota@$QGROUP=$TEST_QUOTA $QFS + +log_must check_quota "userquota@$QUSER1" $QFS $TEST_QUOTA +log_must check_quota "groupquota@$QGROUP" $QFS $TEST_QUOTA + +log_note "check the snapshot $snap_fs userquota and groupquota" +log_must check_quota "userquota@$QUSER1" $snap_fs "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $snap_fs "$GQUOTA_SIZE" + +log_pass "Check the snapshot's user|group quota pass as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_010_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_010_pos.ksh new file mode 100644 index 00000000000..10a72244e60 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_010_pos.ksh @@ -0,0 +1,88 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_010_pos.ksh 1.1 09/06/22 SMI" +# +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_010_pos +# +# DESCRIPTION: +# Check userquota and groupquota be overwrited at same time +# +# +# STRATEGY: +# 1. Set userquota and groupquota to a fs +# 2. write to exceed the userquota size to check the result +# 3. write to exceed the groupquota size to check the result +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + cleanup_quota +} + +log_onexit cleanup + +log_assert "overwrite any of the {user|group}quota size, it will fail" + +log_note "overwrite to $QFS to make it exceed userquota" +log_must $ZFS set userquota@$QUSER1=$UQUOTA_SIZE $QFS +log_must $ZFS set groupquota@$QGROUP=$GQUOTA_SIZE $QFS + +mkmount_writable $QFS +log_must user_run $QUSER1 $MKFILE $UQUOTA_SIZE $QFILE +$SYNC + +log_must eval "$ZFS get -p userused@$QUSER1 $QFS >/dev/null 2>&1" +log_must eval "$ZFS get -p groupused@$GROUPUSED $QFS >/dev/null 2>&1" + +log_mustnot user_run $QUSER1 $MKFILE 1 $OFILE + +log_must $RM -f $QFILE + +log_note "overwrite to $QFS to make it exceed userquota" +log_mustnot user_run $QUSER1 $MKFILE $GQUOTA_SIZE $QFILE + +log_must eval "$ZFS get -p userused@$QUSER1 $QFS >/dev/null 2>&1" +log_must eval "$ZFS get -p groupused@$GROUPUSED $QFS >/dev/null 2>&1" + +log_pass "overwrite any of the {user|group}quota size, it fail as expect" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_011_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_011_pos.ksh new file mode 100644 index 00000000000..73754f85d12 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_011_pos.ksh @@ -0,0 +1,141 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_011_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_011_pos +# +# DESCRIPTION: +# the userquota and groupquota will not change during zfs actions, such as +# snapshot,clone,rename,upgrade,send,receive. +# +# +# STRATEGY: +# 1. Create a pool, and create fs with preset user,group quota +# 2. Check set user|group quota via zfs snapshot|clone|list -o +# 3. Check the user|group quota can not change during zfs rename|upgrade|promote +# 4. Check the user|group quota can not change during zfs clone +# 5. Check the user|group quota can not change during zfs send/receive +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + for ds in $TESTPOOL/fs $TESTPOOL/fs-rename $TESTPOOL/fs-clone; do + if datasetexists $ds; then + log_must $ZFS destroy -rRf $ds + fi + done +} + +log_onexit cleanup + +log_assert \ + "the userquota and groupquota can't change during zfs actions" + +cleanup + +log_must $ZFS create -o userquota@$QUSER1=$UQUOTA_SIZE \ + -o groupquota@$QGROUP=$GQUOTA_SIZE $TESTPOOL/fs + +log_must $ZFS snapshot $TESTPOOL/fs@snap +log_must eval "$ZFS list -r -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL >/dev/null 2>&1" + +log_must check_quota "userquota@$QUSER1" $TESTPOOL/fs@snap "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $TESTPOOL/fs@snap "$GQUOTA_SIZE" + + +log_note "clone fs gets its parent's userquota/groupquota initially" +log_must $ZFS clone -o userquota@$QUSER1=$UQUOTA_SIZE \ + -o groupquota@$QGROUP=$GQUOTA_SIZE \ + $TESTPOOL/fs@snap $TESTPOOL/fs-clone + +log_must eval "$ZFS list -r -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL >/dev/null 2>&1" + +log_must check_quota "userquota@$QUSER1" $TESTPOOL/fs-clone "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $TESTPOOL/fs-clone "$GQUOTA_SIZE" + +log_must eval "$ZFS list -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL/fs-clone >/dev/null 2>&1" + +log_note "zfs promote can not change the previously set user|group quota" +log_must $ZFS promote $TESTPOOL/fs-clone + +log_must eval "$ZFS list -r -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL >/dev/null 2>&1" + +log_must check_quota "userquota@$QUSER1" $TESTPOOL/fs-clone "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $TESTPOOL/fs-clone "$GQUOTA_SIZE" + +log_note "zfs send receive can not change the previously set user|group quota" +log_must $ZFS send $TESTPOOL/fs-clone@snap | $ZFS receive $TESTPOOL/fs-rev + +log_must eval "$ZFS list -r -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL >/dev/null 2>&1" + +log_must check_quota "userquota@$QUSER1" $TESTPOOL/fs-rev "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $TESTPOOL/fs-rev "$GQUOTA_SIZE" + +log_note "zfs rename can not change the previously set user|group quota" +log_must $ZFS rename $TESTPOOL/fs-rev $TESTPOOL/fs-rename + +log_must eval "$ZFS list -r -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL >/dev/null 2>&1" + +log_must check_quota "userquota@$QUSER1" $TESTPOOL/fs-rename "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $TESTPOOL/fs-rename "$GQUOTA_SIZE" + +log_note "zfs upgrade can not change the previously set user|group quota" +log_must $ZFS upgrade $TESTPOOL/fs-rename + +log_must eval "$ZFS list -r -o userquota@$QUSER1,groupquota@$QGROUP \ + $TESTPOOL >/dev/null 2>&1" + +log_must check_quota "userquota@$QUSER1" $TESTPOOL/fs-rename "$UQUOTA_SIZE" +log_must check_quota "groupquota@$QGROUP" $TESTPOOL/fs-rename "$GQUOTA_SIZE" + +log_pass \ + "the userquota and groupquota can't change during zfs actions" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_012_neg.ksh b/tests/sys/cddl/zfs/tests/userquota/userquota_012_neg.ksh new file mode 100644 index 00000000000..0f093933cde --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_012_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_012_neg.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userquota_012_neg +# +# DESCRIPTION: +# userquota and groupquota can not be set against snapshot +# +# +# STRATEGY: +# 1. Set userquota on snap and check the zfs get +# 2. Set groupquota on snap and check the zfs get +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + cleanup_quota + + if datasetexists $snap_fs; then + log_must $ZFS destroy $snap_fs + fi +} + +log_onexit cleanup + +typeset snap_fs=$QFS@snap +log_assert "Check set userquota and groupquota on snapshot" + +log_note "Check can not set user|group quuota on snapshot" +log_must $ZFS snapshot $snap_fs + +log_mustnot $ZFS set userquota@$QUSER1=$UQUOTA_SIZE $snap_fs + +log_mustnot $ZFS set groupquota@$QGROUP=$GQUOTA_SIZE $snap_fs + +log_pass "Check set userquota and groupquota on snapshot" +t" diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_common.kshlib b/tests/sys/cddl/zfs/tests/userquota/userquota_common.kshlib new file mode 100644 index 00000000000..ff85e46c953 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_common.kshlib @@ -0,0 +1,147 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userquota_common.kshlib 1.1 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota.cfg + + +# +# Check if the test box support userquota or not. +# +function is_userquota_supported +{ + if ! fs_prop_exist "userquota@..."; then + return 1 + fi + + return 0 +} + +# +# reset the userquota and groupquota and delete temporary files +# +function cleanup_quota +{ + if datasetexists $QFS; then + log_must $ZFS set userquota@$QUSER1=none $QFS + log_must $ZFS set userquota@$QUSER2=none $QFS + log_must $ZFS set groupquota@$QGROUP=none $QFS + recovery_writable $QFS + fi + + [[ -f $QFILE ]] && log_must $RM -f $QFILE + [[ -f $OFILE ]] && log_must $RM -f $OFILE + + return 0 +} + +# +# delete user and group that created during the test +# +function clean_user_group +{ + for usr in $QUSER1 $QUSER2; do + log_must del_user $usr + done + + log_must del_group $QGROUP + + return 0 +} + +# +# make the $QFS's mountpoint writable for all users +# +function mkmount_writable +{ + typeset fs=$1 + typeset mntp=$(get_prop mountpoint $fs) + log_must $CHMOD 0777 $mntp +} + +# +# recovery the directory permission for $QFS +# +function recovery_writable +{ + typeset fs=$1 + typeset mntp=$(get_prop mountpoint $fs) + log_must $CHMOD 0755 $mntp +} + +# +# run command as specific user +# +function user_run +{ + typeset user=$1 + typeset group=$($GROUPS $user) + + shift + + eval \$RUNWATTR -u \$user -g \$group \"$@\" > /dev/null 2>&1 + return $? +} + +# +# check the quota value of a specific FS +# +function check_quota +{ + typeset fs=$2 + typeset prop=$1 + typeset expected=$3 + typeset value=$(get_prop $prop $fs) + + if (( $value != $expected )); then + return 1 + fi +} + +# +# zfs get prop, which return raw value not -p value. +# +function get_value # property dataset +{ + typeset prop_val + typeset prop=$1 + typeset dataset=$2 + + prop_val=$($ZFS get -H -o value $prop $dataset 2>/dev/null) + if [[ $? -ne 0 ]]; then + log_note "Unable to get $prop property for dataset " \ + "$dataset" + return 1 + fi + + $ECHO $prop_val + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/userquota/userquota_test.sh b/tests/sys/cddl/zfs/tests/userquota/userquota_test.sh new file mode 100755 index 00000000000..918d41c8a61 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userquota_test.sh @@ -0,0 +1,464 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case groupspace_001_pos cleanup +groupspace_001_pos_head() +{ + atf_set "descr" "Check the zfs groupspace with all possible parameters" + atf_set "require.progs" zfs runwattr +} +groupspace_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/groupspace_001_pos.ksh || atf_fail "Testcase failed" +} +groupspace_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case groupspace_002_pos cleanup +groupspace_002_pos_head() +{ + atf_set "descr" "Check the zfs groupspace used and quota" + atf_set "require.progs" zfs runwattr +} +groupspace_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/groupspace_002_pos.ksh || atf_fail "Testcase failed" +} +groupspace_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_001_pos cleanup +userquota_001_pos_head() +{ + atf_set "descr" "If write operation overwrite {user|group}quota size, it will fail" + atf_set "require.progs" zfs runwattr +} +userquota_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_001_pos.ksh || atf_fail "Testcase failed" +} +userquota_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_002_pos cleanup +userquota_002_pos_head() +{ + atf_set "descr" "the userquota and groupquota can be set during zpool,zfs creation" + atf_set "require.progs" zpool zfs +} +userquota_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_002_pos.ksh || atf_fail "Testcase failed" +} +userquota_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_003_pos cleanup +userquota_003_pos_head() +{ + atf_set "descr" "Check the basic function of set/get userquota and groupquota on fs" + atf_set "require.progs" zfs +} +userquota_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_003_pos.ksh || atf_fail "Testcase failed" +} +userquota_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_004_pos cleanup +userquota_004_pos_head() +{ + atf_set "descr" "Check the basic function of {user|group} used" + atf_set "require.progs" runwattr +} +userquota_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_004_pos.ksh || atf_fail "Testcase failed" +} +userquota_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_005_neg cleanup +userquota_005_neg_head() +{ + atf_set "descr" "Check the invalid parameter of zfs set user|group quota" + atf_set "require.progs" zfs +} +userquota_005_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_005_neg.ksh || atf_fail "Testcase failed" +} +userquota_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_006_pos cleanup +userquota_006_pos_head() +{ + atf_set "descr" "Check the invalid parameter of zfs get user|group quota" + atf_set "require.progs" zfs +} +userquota_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_006_pos.ksh || atf_fail "Testcase failed" +} +userquota_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_007_pos cleanup +userquota_007_pos_head() +{ + atf_set "descr" "Check set user|group quota to larger than the quota size of a fs" + atf_set "require.progs" zfs runwattr +} +userquota_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_007_pos.ksh || atf_fail "Testcase failed" +} +userquota_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_008_pos cleanup +userquota_008_pos_head() +{ + atf_set "descr" "Check zfs get all will not print out user|group quota" + atf_set "require.progs" zfs +} +userquota_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_008_pos.ksh || atf_fail "Testcase failed" +} +userquota_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_009_pos cleanup +userquota_009_pos_head() +{ + atf_set "descr" "Check the snapshot's user|group quota" + atf_set "require.progs" zfs +} +userquota_009_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_009_pos.ksh || atf_fail "Testcase failed" +} +userquota_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_010_pos cleanup +userquota_010_pos_head() +{ + atf_set "descr" "overwrite any of the {user|group}quota size, it will fail" + atf_set "require.progs" zfs runwattr +} +userquota_010_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_010_pos.ksh || atf_fail "Testcase failed" +} +userquota_010_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_011_pos cleanup +userquota_011_pos_head() +{ + atf_set "descr" "the userquota and groupquota can't change during zfs actions" + atf_set "require.progs" zfs +} +userquota_011_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_011_pos.ksh || atf_fail "Testcase failed" +} +userquota_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userquota_012_neg cleanup +userquota_012_neg_head() +{ + atf_set "descr" "Check set userquota and groupquota on snapshot" + atf_set "require.progs" zfs +} +userquota_012_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userquota_012_neg.ksh || atf_fail "Testcase failed" +} +userquota_012_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userspace_001_pos cleanup +userspace_001_pos_head() +{ + atf_set "descr" "Check the zfs userspace with all possible parameters" + atf_set "require.progs" zfs runwattr +} +userspace_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userspace_001_pos.ksh || atf_fail "Testcase failed" +} +userspace_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case userspace_002_pos cleanup +userspace_002_pos_head() +{ + atf_set "descr" "Check the zfs userspace used and quota" + atf_set "require.progs" zfs runwattr +} +userspace_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/userspace_002_pos.ksh || atf_fail "Testcase failed" +} +userspace_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/userquota_common.kshlib + . $(atf_get_srcdir)/userquota.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case groupspace_001_pos + atf_add_test_case groupspace_002_pos + atf_add_test_case userquota_001_pos + atf_add_test_case userquota_002_pos + atf_add_test_case userquota_003_pos + atf_add_test_case userquota_004_pos + atf_add_test_case userquota_005_neg + atf_add_test_case userquota_006_pos + atf_add_test_case userquota_007_pos + atf_add_test_case userquota_008_pos + atf_add_test_case userquota_009_pos + atf_add_test_case userquota_010_pos + atf_add_test_case userquota_011_pos + atf_add_test_case userquota_012_neg + atf_add_test_case userspace_001_pos + atf_add_test_case userspace_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/userquota/userspace_001_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userspace_001_pos.ksh new file mode 100644 index 00000000000..0a7cebfeb9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userspace_001_pos.ksh @@ -0,0 +1,98 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userspace_001_pos.ksh 1.2 09/08/06 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userspace_001_pos +# +# DESCRIPTION: +# Check the zfs userspace with all parameters +# +# +# STRATEGY: +# 1. set zfs userspace to a fs +# 2. write some data to the fs with specified user +# 3. use zfs userspace with all possible parameters to check the result +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + if datasetexists $snap_fs; then + log_must $ZFS destroy $snap_fs + fi + + log_must cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the zfs userspace with all possible parameters" + +set -A params -- "-h" "--help" "-n" "-H" "-p" "-o type,name,used,quota" \ + "-o name,used,quota" "-o used,quota" "-o used" "-o quota" \ + "-s type" "-s name" "-s used" "-s quota" \ + "-S type" "-S name" "-S used" "-S quota" \ + "-t posixuser" "-t posixgroup" "-t all" + +if check_version "5.11" ; then + set -A params -- "${params[@]}" "-i" "-t smbuser" "-t smbgroup" +fi + +typeset snap_fs=$QFS@snap + +log_must $ZFS set userquota@$QUSER1=100m $QFS +mkmount_writable $QFS +log_must user_run $QUSER1 $MKFILE 50m $QFILE +$SYNC + +log_must $ZFS snapshot $snap_fs + +for param in "${params[@]}"; do + log_must eval "$ZFS userspace $param $QFS >/dev/null 2>&1" + log_must eval "$ZFS userspace $param $snap_fs >/dev/null 2>&1" +done + +log_pass "zfs userspace with all possible parameters pass as expect" + diff --git a/tests/sys/cddl/zfs/tests/userquota/userspace_002_pos.ksh b/tests/sys/cddl/zfs/tests/userquota/userspace_002_pos.ksh new file mode 100644 index 00000000000..2e5fed2e9e4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/userquota/userspace_002_pos.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)userspace_002_pos.ksh 1.1 09/06/22 SMI" +# + +################################################################################ +# +# __stc_assertion_start +# +# ID: userspace_002_pos +# +# DESCRIPTION: +# Check the user used size and quota in zfs userspace +# +# +# STRATEGY: +# 1. set zfs userquota to a fs +# 2. write some data to the fs with specified user and size +# 3. use zfs userspace to check the used size and quota size +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2009-04-16) +# +# __stc_assertion_end +# +############################################################################### + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/userquota/userquota_common.kshlib + +function cleanup +{ + if datasetexists $snapfs; then + log_must $ZFS destroy $snapfs + fi + + log_must cleanup_quota +} + +log_onexit cleanup + +log_assert "Check the zfs userspace used and quota" + +log_must $ZFS set userquota@$QUSER1=100m $QFS + +mkmount_writable $QFS + +log_must user_run $QUSER1 $MKFILE 50m $QFILE +$SYNC + +typeset snapfs=$QFS@snap + +log_must $ZFS snapshot $snapfs + +log_must eval "$ZFS userspace $QFS >/dev/null 2>&1" +log_must eval "$ZFS userspace $snapfs >/dev/null 2>&1" + +for fs in "$QFS" "$snapfs"; do + log_note "check the quota size in zfs userspace $fs" + log_must eval "$ZFS userspace $fs | $GREP $QUSER1 | $GREP 100M" + + log_note "check the user used size in zfs userspace $fs" + log_must eval "$ZFS userspace $fs | $GREP $QUSER1 | $GREP 50.0M" +done + +log_pass "Check the zfs userspace used and quota" diff --git a/tests/sys/cddl/zfs/tests/utils_test/Makefile b/tests/sys/cddl/zfs/tests/utils_test/Makefile new file mode 100644 index 00000000000..bbb4b7abe2a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/Makefile @@ -0,0 +1,27 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/utils_test +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= utils_test_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= utils_test_007_pos.ksh +${PACKAGE}FILES+= utils_test_003_pos.ksh +${PACKAGE}FILES+= utils_test_006_pos.ksh +${PACKAGE}FILES+= utils_test_002_pos.ksh +${PACKAGE}FILES+= utils_test.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= utils_test_004_pos.ksh +${PACKAGE}FILES+= utils_test_008_pos.ksh +${PACKAGE}FILES+= utils_test.cfg +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= utils_test_009_pos.ksh +${PACKAGE}FILES+= utils_test_005_pos.ksh +${PACKAGE}FILES+= utils_test_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/utils_test/cleanup.ksh b/tests/sys/cddl/zfs/tests/utils_test/cleanup.ksh new file mode 100644 index 00000000000..606fc7ac601 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/cleanup.ksh @@ -0,0 +1,33 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/utils_test/setup.ksh b/tests/sys/cddl/zfs/tests/utils_test/setup.ksh new file mode 100644 index 00000000000..7c575654194 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/setup.ksh @@ -0,0 +1,33 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib + +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test.cfg b/tests/sys/cddl/zfs/tests/utils_test/utils_test.cfg new file mode 100644 index 00000000000..2a354115130 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test.cfg @@ -0,0 +1,41 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test.cfg 1.3 08/08/15 SMI" +# + +export TESTSNAP=testsnap${TESTCASE_ID} +export TESTCLCT=testclct${TESTCASE_ID} +export TESTFILE=testfile${TESTCASE_ID} + +export WRITE_COUNT=20 +export BLOCKSZ=8192 +export DATA=0 +export NUM_FILES=10 + +export DISK=${DISKS%% *} diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test.kshlib b/tests/sys/cddl/zfs/tests/utils_test/utils_test.kshlib new file mode 100644 index 00000000000..f6df7a0678c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test.kshlib @@ -0,0 +1,30 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test.kshlib 1.2 07/01/09 SMI" +# diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_001_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_001_pos.ksh new file mode 100644 index 00000000000..2758378052c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_001_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_001_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_001_pos +# +# DESCRIPTION: +# Ensure that the clri(1M) utility fails on a ZFS file system. +# +# STRATEGY: +# 1. Populate a ZFS directory with a number of files. +# 2. Run clri against the raw device. +# 3. Ensure it fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Ensure that the clri(1M) utility fails on a ZFS file system." + +populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA + +inode=`$LS -i $TESTDIR/$TESTFILE.0 | $AWK '{print $1}'` +log_mustnot $CLRI /dev/rdsk/$DISK $inode +log_mustnot $CLRI -F zfs /dev/rdsk/$DISK $inode + +log_pass "clri(1M) returned an error as expected." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_002_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_002_pos.ksh new file mode 100644 index 00000000000..734b619c6f8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_002_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_002_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_002_pos +# +# DESCRIPTION: +# Ensure that the labelit(1M) utility fails on a ZFS file system. +# +# STRATEGY: +# 1. Populate a ZFS file system with some files. +# 2. Run labelit(1M) against the device. +# 3. Ensure it fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + ismounted $TESTPOOL/$TESTFS + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS + + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Ensure that the labelit(1M) utility fails on a ZFS file system." + +test_requires LABELIT + +populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA + +log_must $ZFS unmount $TESTDIR + +log_mustnot $LABELIT /dev/rdsk/${DISK}s0 mfiles ${DISK}s0 + +log_pass "labelit(1M) returned an error as expected." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_003_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_003_pos.ksh new file mode 100644 index 00000000000..169e8d59f60 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_003_pos.ksh @@ -0,0 +1,76 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_003_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_003_pos +# +# DESCRIPTION: +# Ensure that the fsdb(1M) utility fails on a ZFS file system. +# +# STRATEGY: +# 1. Populate a ZFS directory with a number of files. +# 2. Run fsdb against the raw device. +# 3. Ensure it fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Ensure that the fsdb(1M) utility fails on a ZFS file system." + +populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA +inode_num=`$LS -li $TESTDIR/$TESTFILE.0 | $AWK '{print $1}'` +[[ -z $inode_num ]] && \ + log_fail "Failed to determine inode of file: $TESTDIR/$TESTFILE.0" + +log_mustnot $ECHO ":inode $inode_num" | $FSDB ${DISK}a + +log_pass "fsdb(1M) returned an error as expected." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_004_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_004_pos.ksh new file mode 100644 index 00000000000..960134c30cc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_004_pos.ksh @@ -0,0 +1,73 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_004_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_004_pos +# +# DESCRIPTION: +# Ensure that the quotaon(1M) utility fails on a ZFS file system. +# +# STRATEGY: +# 1. Enable a quota on a ZFS file system. +# 2. Run quotaon against the device. +# 3. Ensure it fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Ensure that the quotaon(1M) utility fails on a ZFS file system." + +log_must $ZFS set quota=1099511627776 $TESTPOOL/$TESTFS +log_must $TOUCH $TESTDIR/quotas +log_mustnot $QUOTAON ${DISK}a + +log_pass "quotaon(1M) returned an error as expected." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_005_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_005_pos.ksh new file mode 100644 index 00000000000..5501b5bceba --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_005_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_005_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_005_pos +# +# DESCRIPTION: +# Ensure that the ff(1M) utility fails on a ZFS file system. +# +# STRATEGY: +# 1. Populate a ZFS file system with some files. +# 2. Run ff(1M) against the device. +# 3. Ensure it fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +test_requires FF + +log_assert "Ensure that the ff(1M) utility fails on a ZFS file system." + +populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA + +log_mustnot $FF -F zfs /dev/rdsk/${DISK}s0 + +log_pass "ff(1M) returned an error as expected." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_006_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_006_pos.ksh new file mode 100644 index 00000000000..c78fe5abb18 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_006_pos.ksh @@ -0,0 +1,79 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_006_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_006_pos +# +# DESCRIPTION: +# Ensure that the fsirand(1M) utility fails on a ZFS file system. +# +# STRATEGY: +# 1. Populate a ZFS file system with some files. +# 2. Run fsirand(1M) against the device. +# 3. Ensure it fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + ismounted $TESTPOOL/$TESTFS + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS + + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Ensure that the fsirand(1M) utility fails on a ZFS file system." + +populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA + +log_must $ZFS unmount $TESTDIR + +log_mustnot $FSIRAND /dev/rdsk/${DISK}s0 + +log_pass "fsirand(1M) returned an error as expected." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_007_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_007_pos.ksh new file mode 100644 index 00000000000..34b8fa29b3d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_007_pos.ksh @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_007_pos.ksh 1.4 09/01/12 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_007_pos +# +# DESCRIPTION: +# Ensure that the fstyp(8) utility succeeds on a ZFS file system. +# +# STRATEGY: +# 1. Populate a ZFS file system with some files. +# 2. Run fstyp(8) against the device. +# 3. Ensure it passes +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + ismounted $TESTPOOL/$TESTFS + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS + + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Ensure that the fstyp(8) utility succeeds on a ZFS file system." + +test_requires FSTYP + +populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA + +log_must $ZFS unmount $TESTDIR + +log_must $FSTYP -u $DISK +detected_filesystem=$( $FSTYP -u $DISK ) +if [ "$detected_filesystem" != "zfs" ]; then + log_fail "fstyp(8) detected $detected_filesystem instead of zfs" +fi + +log_pass "fstyp(8) returned successfully." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_008_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_008_pos.ksh new file mode 100644 index 00000000000..37d25725bba --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_008_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_008_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_008_pos +# +# DESCRIPTION: +# Ensure that the ncheck(1M) utility fails on a ZFS file system. +# +# STRATEGY: +# 1. Populate a ZFS file system with some files. +# 2. Run ncheck(1M) against the device. +# 3. Ensure it fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + ismounted $TESTPOOL/$TESTFS + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS + + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +test_requires NCHECK + +log_assert "Ensure that the ncheck(1M) utility fails on a ZFS file system." + +populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA + +log_must $ZFS unmount $TESTDIR + +log_mustnot $NCHECK /dev/rdsk/${DISK}s0 + +log_pass "ncheck(1M) returned an error as expected." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_009_pos.ksh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_009_pos.ksh new file mode 100644 index 00000000000..5ac8601ef65 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_009_pos.ksh @@ -0,0 +1,73 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)utils_test_009_pos.ksh 1.2 07/01/09 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/utils_test/utils_test.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: utils_test_009_pos +# +# DESCRIPTION: +# Ensure that the tunefs(1M) utility fails on a ZFS file system. +# +# STRATEGY: +# 1. Populate a ZFS file system with some files. +# 2. Run tunefs(1M) against the device. +# 3. Ensure it fails. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Ensure that the tunefs(1M) utility fails on a ZFS file system." + +populate_dir $TESTDIR/$TESTFILE $NUM_FILES $WRITE_COUNT $BLOCKSZ $DATA + +log_mustnot $TUNEFS -m 80 /dev/dsk/${DISK}s0 + +log_pass "tunefs(1M) returned an error as expected." diff --git a/tests/sys/cddl/zfs/tests/utils_test/utils_test_test.sh b/tests/sys/cddl/zfs/tests/utils_test/utils_test_test.sh new file mode 100755 index 00000000000..82fe2bbbd03 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/utils_test/utils_test_test.sh @@ -0,0 +1,276 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case utils_test_001_pos cleanup +utils_test_001_pos_head() +{ + atf_set "descr" "Ensure that the clri(1M) utility fails on a ZFS file system." + atf_set "require.progs" clri +} +utils_test_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_001_pos.ksh || atf_fail "Testcase failed" +} +utils_test_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case utils_test_002_pos cleanup +utils_test_002_pos_head() +{ + atf_set "descr" "Ensure that the labelit(1M) utility fails on a ZFS file system." + atf_set "require.progs" zfs labelit +} +utils_test_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_002_pos.ksh || atf_fail "Testcase failed" +} +utils_test_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case utils_test_003_pos cleanup +utils_test_003_pos_head() +{ + atf_set "descr" "Ensure that the fsdb(1M) utility fails on a ZFS file system." + atf_set "require.progs" fsdb +} +utils_test_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_003_pos.ksh || atf_fail "Testcase failed" +} +utils_test_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case utils_test_004_pos cleanup +utils_test_004_pos_head() +{ + atf_set "descr" "Ensure that the quotaon(1M) utility fails on a ZFS file system." + atf_set "require.progs" zfs quotaon +} +utils_test_004_pos_body() +{ + atf_expect_fail "FreeBSD's quotaon utility exits 0 even when you supply a nonexistent filesystem" + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_004_pos.ksh || atf_fail "Testcase failed" +} +utils_test_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case utils_test_005_pos cleanup +utils_test_005_pos_head() +{ + atf_set "descr" "Ensure that the ff(1M) utility fails on a ZFS file system." + atf_set "require.progs" ff +} +utils_test_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_005_pos.ksh || atf_fail "Testcase failed" +} +utils_test_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case utils_test_006_pos cleanup +utils_test_006_pos_head() +{ + atf_set "descr" "Ensure that the fsirand(1M) utility fails on a ZFS file system." + atf_set "require.progs" zfs fsirand +} +utils_test_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_006_pos.ksh || atf_fail "Testcase failed" +} +utils_test_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case utils_test_007_pos cleanup +utils_test_007_pos_head() +{ + atf_set "descr" "Ensure that the fstyp(1M) utility succeeds on a ZFS file system." + atf_set "require.progs" zfs fstyp +} +utils_test_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_007_pos.ksh || atf_fail "Testcase failed" +} +utils_test_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case utils_test_008_pos cleanup +utils_test_008_pos_head() +{ + atf_set "descr" "Ensure that the ncheck(1M) utility fails on a ZFS file system." + atf_set "require.progs" zfs ncheck +} +utils_test_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_008_pos.ksh || atf_fail "Testcase failed" +} +utils_test_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case utils_test_009_pos cleanup +utils_test_009_pos_head() +{ + atf_set "descr" "Ensure that the tunefs(1M) utility fails on a ZFS file system." + atf_set "require.progs" tunefs +} +utils_test_009_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/utils_test_009_pos.ksh || atf_fail "Testcase failed" +} +utils_test_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/utils_test.kshlib + . $(atf_get_srcdir)/utils_test.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case utils_test_001_pos + atf_add_test_case utils_test_002_pos + atf_add_test_case utils_test_003_pos + atf_add_test_case utils_test_004_pos + atf_add_test_case utils_test_005_pos + atf_add_test_case utils_test_006_pos + atf_add_test_case utils_test_007_pos + atf_add_test_case utils_test_008_pos + atf_add_test_case utils_test_009_pos +} diff --git a/tests/sys/cddl/zfs/tests/write_dirs/Makefile b/tests/sys/cddl/zfs/tests/write_dirs/Makefile new file mode 100644 index 00000000000..d38228b7ce2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/write_dirs/Makefile @@ -0,0 +1,19 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/write_dirs +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= write_dirs_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= write_dirs.cfg +${PACKAGE}FILES+= write_dirs_002_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= write_dirs_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/write_dirs/cleanup.ksh b/tests/sys/cddl/zfs/tests/write_dirs/cleanup.ksh new file mode 100644 index 00000000000..239cc31ba33 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/write_dirs/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +destroy_pool $TESTPOOL +log_must wipe_partition_table $DISKS +log_must $RM -rf $TESTDIR +log_pass diff --git a/tests/sys/cddl/zfs/tests/write_dirs/setup.ksh b/tests/sys/cddl/zfs/tests/write_dirs/setup.ksh new file mode 100644 index 00000000000..fcaed25610a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/write_dirs/setup.ksh @@ -0,0 +1,41 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.4 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +wipe_partition_table $DISK +log_must set_partition $PARTITION "" $SIZE $DISK + +default_setup "$DISK"p"$PARTITION" diff --git a/tests/sys/cddl/zfs/tests/write_dirs/write_dirs.cfg b/tests/sys/cddl/zfs/tests/write_dirs/write_dirs.cfg new file mode 100644 index 00000000000..fddca0dfb65 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/write_dirs/write_dirs.cfg @@ -0,0 +1,36 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)write_dirs.cfg 1.3 08/08/15 SMI" +# + +export TESTFILE=testfile${TESTCASE_ID} +export STF_TIMEOUT=1200 + +export SIZE="1gb" +export PARTITION=1 diff --git a/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_001_pos.ksh b/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_001_pos.ksh new file mode 100644 index 00000000000..0dde726922a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_001_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)write_dirs_001_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +########################################################################### +# +# __stc_assertion_start +# +# ID: write_dirs_001_pos +# +# DESCRIPTION: +# Create as many directories with 50 big files each until the file system +# is full. The zfs file system should be stable and works well. +# +# STRATEGY: +# 1. Create a pool & dateset +# 2. Make directories in the zfs file system +# 3. Create 50 big files in each directories +# 4. Test case exit when the disk is full. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for file in `$FIND $TESTDIR -type f`; do + $CAT /dev/null > $file + done + log_must $SYNC + log_must $RM -rf $TESTDIR/* +} + +typeset -i retval=0 +log_assert "Creating directories with 50 big files in each, until file system "\ + "is full." + +log_onexit cleanup + +typeset -i bytes=8192 +typeset -i num_writes=300000 +typeset -i dirnum=50 +typeset -i filenum=50 + +fill_fs "" $dirnum $filenum $bytes $num_writes +retval=$? +if (( retval == 28 )); then + log_note "No space left on device." +elif (( retval != 0 )); then + log_fail "Unexpected exit: $retval" +fi + +log_pass "Write big files in a directory succeeded." diff --git a/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_002_pos.ksh b/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_002_pos.ksh new file mode 100644 index 00000000000..7dccbda6773 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_002_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)write_dirs_002_pos.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +########################################################################### +# +# __stc_assertion_start +# +# ID: write_dirs_002_pos +# +# DESCRIPTION: +# Create as many directories with 5000 files each until the file system +# is full. The zfs file system should be work well and stable. +# +# STRATEGY: +# 1. Create a pool & dateset +# 2. Make directories in the zfs file system +# 3. Create 5000 files in each directories +# 4. Test case exit when the disk is full +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "both" + +function cleanup +{ + for file in `$FIND $TESTDIR -type f`; do + $CAT /dev/null > $file + done + log_must $SYNC + log_must $RM -rf $TESTDIR/* +} + +typeset -i retval=0 + +log_assert "Creating directories with 5000 files in each, until file system " \ + "is full." + +log_onexit cleanup + +typeset -i bytes=8192 +typeset -i num_writes=20 +typeset -i dirnum=50 +typeset -i filenum=5000 + +fill_fs "" $dirnum $filenum $bytes $num_writes +retval=$? +if (( retval == 28 )); then + log_note "No space left on device." +elif (( retval != 0 )); then + log_fail "Unexpected exit: $retval" +fi + +log_pass "Create many files in a directory succeeded." diff --git a/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_test.sh b/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_test.sh new file mode 100755 index 00000000000..1028070f699 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/write_dirs/write_dirs_test.sh @@ -0,0 +1,84 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case write_dirs_001_pos cleanup +write_dirs_001_pos_head() +{ + atf_set "descr" "Creating directories with 50 big files in each, until file systemis full." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +write_dirs_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/write_dirs.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/write_dirs_001_pos.ksh || atf_fail "Testcase failed" +} +write_dirs_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/write_dirs.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case write_dirs_002_pos cleanup +write_dirs_002_pos_head() +{ + atf_set "descr" "Creating directories with 5000 files in each, until file systemis full." + atf_set "require.progs" zpool + atf_set "timeout" 1200 +} +write_dirs_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/write_dirs.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/write_dirs_002_pos.ksh || atf_fail "Testcase failed" +} +write_dirs_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/write_dirs.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case write_dirs_001_pos + atf_add_test_case write_dirs_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/xattr/Makefile b/tests/sys/cddl/zfs/tests/xattr/Makefile new file mode 100644 index 00000000000..4bff449c591 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/Makefile @@ -0,0 +1,31 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/xattr +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= xattr_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= xattr_002_neg.ksh +${PACKAGE}FILES+= xattr_012_pos.ksh +${PACKAGE}FILES+= xattr_013_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= xattr_003_neg.ksh +${PACKAGE}FILES+= xattr_007_neg.ksh +${PACKAGE}FILES+= xattr_common.kshlib +${PACKAGE}FILES+= xattr.cfg +${PACKAGE}FILES+= xattr_006_pos.ksh +${PACKAGE}FILES+= xattr_011_pos.ksh +${PACKAGE}FILES+= xattr_010_neg.ksh +${PACKAGE}FILES+= xattr_009_neg.ksh +${PACKAGE}FILES+= xattr_008_pos.ksh +${PACKAGE}FILES+= xattr_004_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= xattr_005_pos.ksh +${PACKAGE}FILES+= xattr_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/xattr/cleanup.ksh b/tests/sys/cddl/zfs/tests/xattr/cleanup.ksh new file mode 100644 index 00000000000..7f0267376e5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/cleanup.ksh @@ -0,0 +1,43 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/05/29 SMI" +# + +# $FreeBSD$ + +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/tests/xattr/xattr.cfg + +del_user $ZFS_USER + +if [ "${USES_NIS}" == "true" ] +then + $SVCADM enable svc:/network/nis/client:default +fi + +$RM $TMPDIR/zfs-xattr-test-user.txt +$RM $TMPDIR/zfs-xattr-test-nis.txt + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/xattr/setup.ksh b/tests/sys/cddl/zfs/tests/xattr/setup.ksh new file mode 100644 index 00000000000..0e2b96d5b18 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/setup.ksh @@ -0,0 +1,62 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.2 07/05/29 SMI" +# + +# $FreeBSD$ + +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/tests/xattr/xattr.cfg + +# if we're running NIS, turn it off until we clean up +# (it can cause useradd to take a long time, hitting our TIMEOUT) +$SVCS svc:/network/nis/client:default | $GREP online > /dev/null +if [ $? -eq 0 ] +then + $SVCADM disable -t svc:/network/nis/client:default + USES_NIS=true +fi + +# Make sure we use a brand new user for this +while [ -z "${FOUND}" ] +do + COUNT=0 + USER_EXISTS=$( $GREP $ZFS_USER /etc/passwd ) + if [ ! -z "${USER_EXISTS}" ] + then + ZFS_USER="${ZFS_USER}${COUNT}" + COUNT=$(( $COUNT + 1 )) + else + FOUND="true" + fi +done + +log_must add_user $ZFS_GROUP $ZFS_USER + +$ECHO $ZFS_USER > $TMPDIR/zfs-xattr-test-user.txt +$ECHO $USES_NIS > $TMPDIR/zfs-xattr-test-nis.txt + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr.cfg b/tests/sys/cddl/zfs/tests/xattr/xattr.cfg new file mode 100644 index 00000000000..b2404d91ff4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr.cfg @@ -0,0 +1,54 @@ +#!/bin/ksh -p +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr.cfg 1.3 08/08/15 SMI" +# + +# $FreeBSD$ + +# a variable we set during setup to indicate whether we need to +# re-enable the nis/client during cleanup. +USES_NIS=false + +# A username we can create for the course of the zfs xattr +# testing (modified by setup if it already exists) +ZFS_USER=zxtr +ZFS_GROUP=staff + +# These variables may also have been tweaked by the setup script +# Let's import them if necessary. +if [ -f $TMPDIR/zfs-xattr-test-nis.txt ] +then + USES_NIS=$($CAT $TMPDIR/zfs-xattr-test-nis.txt) +fi + +if [ -f $TMPDIR/zfs-xattr-test-user.txt ] +then + ZFS_USER=$($CAT $TMPDIR/zfs-xattr-test-user.txt) +fi + +export ZFS_USER +export ZFS_GROUP +export USES_NIS diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_001_pos.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_001_pos.ksh new file mode 100644 index 00000000000..f955b15bf1b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_001_pos.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_001_pos.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_001_pos +# +# DESCRIPTION: +# +# Creating, reading and writing xattrs on ZFS filesystems works as expected +# +# STRATEGY: +# 1. Create an xattr on a ZFS-based file using runat +# 2. Read an empty xattr directory +# 3. Write the xattr using runat and cat +# 3. Read the xattr using runat +# 4. Delete the xattr +# 5. List the xattr namespace successfully, checking for deletion +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-05) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + if [ -f $TESTDIR/myfile.${TESTCASE_ID} ] + then + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} + fi +} + +log_assert "Create/read/write/append of xattrs works" +log_onexit cleanup + +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd +verify_write_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd +delete_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd + +log_pass "Create/read/write of xattrs works" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_002_neg.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_002_neg.ksh new file mode 100644 index 00000000000..371234109ad --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_002_neg.ksh @@ -0,0 +1,70 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_002_neg.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_002_neg +# +# DESCRIPTION: +# +# Trying to read a non-existent xattr should fail. +# +# STRATEGY: +# 1. Create a file +# 2. Try to read a non-existent xattr, check that an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-12-05) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} + +} + +log_assert "A read of a non-existent xattr fails" +log_onexit cleanup + +# create a file +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +log_mustnot eval "$CAT $TESTDIR/myfile.${TESTCASE_ID} not-here.txt > /dev/null 2>&1" + +log_pass "A read of a non-existent xattr fails" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_003_neg.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_003_neg.ksh new file mode 100644 index 00000000000..7023c86888d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_003_neg.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_003_neg.ksh 1.2 07/05/29 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_003_neg +# +# DESCRIPTION: +# +# Attempting to read an xattr on a file for which we have no permissions +# should fail. +# +# STRATEGY: +# 1. Create a file, and set an with an xattr +# 2. Set the octal file permissions to 000 on the file. +# 3. Check that we're unable to read the xattr as a non-root user +# 4. Check that we're unable to write an xattr as a non-root user +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-05) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} + +} + +log_assert "read/write xattr on a file with no permissions fails" +log_onexit cleanup + +test_requires RUNAT + +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +log_must $CHMOD 000 $TESTDIR/myfile.${TESTCASE_ID} +log_mustnot $RUNWATTR -u $ZFS_USER -g $ZFS_GROUP \ + "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $CAT passwd" + +log_mustnot $RUNWATTR -u $ZFS_USER -g $ZFS_GROUP \ + "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $CP /etc/passwd ." + +log_pass "read/write xattr on a file with no permissions fails" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_004_pos.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_004_pos.ksh new file mode 100644 index 00000000000..de8ead8e850 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_004_pos.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_004_pos.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_004_pos +# +# DESCRIPTION: +# +# Creating files on ufs and tmpfs, and copying those files to ZFS with +# appropriate cp flags, the xattrs will still be readable. +# +# STRATEGY: +# 1. Create files in ufs and tmpfs with xattrs +# 2. Copy those files to zfs +# 3. Ensure the xattrs can be read and written +# 4. Do the same in reverse. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-05) +# +# __stc_assertion_end +# +################################################################################ + +# we need to be able to create zvols to hold our test +# ufs filesystem. +verify_runnable "global" + +# Make sure we clean up properly +function cleanup { + + if [ $( ismounted $TMPDIR/ufs.${TESTCASE_ID} ufs ) ] + then + log_must $UMOUNT $TMPDIR/ufs.${TESTCASE_ID} + log_must $RM -rf $TMPDIR/ufs.${TESTCASE_ID} + fi +} + +log_assert "Files from ufs,tmpfs with xattrs copied to zfs retain xattr info." +log_onexit cleanup + +test_requires RUNAT + +# Create a UFS file system that we can work in +log_must $ZFS create -V128m $TESTPOOL/$TESTFS/zvol +log_must eval "$ECHO y | $NEWFS /dev/zvol/dsk/$TESTPOOL/$TESTFS/zvol > /dev/null 2>&1" + +log_must $MKDIR $TMPDIR/ufs.${TESTCASE_ID} +log_must $MOUNT /dev/zvol/dsk/$TESTPOOL/$TESTFS/zvol $TMPDIR/ufs.${TESTCASE_ID} + +# Create files in ufs and tmpfs, and set some xattrs on them. +log_must $TOUCH $TMPDIR/ufs.${TESTCASE_ID}/ufs-file.${TESTCASE_ID} +log_must $TOUCH $TMPDIR/tmpfs-file.${TESTCASE_ID} + +log_must $RUNAT $TMPDIR/ufs.${TESTCASE_ID}/ufs-file.${TESTCASE_ID} $CP /etc/passwd . +log_must $RUNAT $TMPDIR/tmpfs-file.${TESTCASE_ID} $CP /etc/group . + +# copy those files to ZFS +log_must $CP -@ $TMPDIR/ufs.${TESTCASE_ID}/ufs-file.${TESTCASE_ID} $TESTDIR +log_must $CP -@ $TMPDIR/tmpfs-file.${TESTCASE_ID} $TESTDIR + +# ensure the xattr information has been copied correctly +log_must $RUNAT $TESTDIR/ufs-file.${TESTCASE_ID} $DIFF passwd /etc/passwd +log_must $RUNAT $TESTDIR/tmpfs-file.${TESTCASE_ID} $DIFF group /etc/group + +log_must $UMOUNT $TMPDIR/ufs.${TESTCASE_ID} +log_pass "Files from ufs,tmpfs with xattrs copied to zfs retain xattr info." diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_005_pos.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_005_pos.ksh new file mode 100644 index 00000000000..d9886278bd0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_005_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_005_pos.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_005_pos +# +# DESCRIPTION: +# read/write/create/delete xattr on a clone filesystem +# +# +# STRATEGY: +# 1. Create an xattr on a filesystem +# 2. Snapshot the filesystem and clone it +# 3. Verify the xattr can still be read, written, deleted +# 4. Verify we can create new xattrs on new files created on the clone +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-13) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $ZFS destroy $TESTPOOL/$TESTFS/clone + log_must $ZFS destroy $TESTPOOL/$TESTFS@snapshot1 + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} +} + +log_assert "read/write/create/delete xattr on a clone filesystem" +log_onexit cleanup + +# create a file, and an xattr on it +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +# snapshot & clone the filesystem +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot1 +log_must $ZFS clone $TESTPOOL/$TESTFS@snapshot1 $TESTPOOL/$TESTFS/clone +log_must $ZFS set mountpoint=$TESTDIR/clone $TESTPOOL/$TESTFS/clone + +# check for the xattrs on the clone +verify_xattr $TESTDIR/clone/myfile.${TESTCASE_ID} passwd /etc/passwd + +# check we can create xattrs on the clone +create_xattr $TESTDIR/clone/myfile.${TESTCASE_ID} foo /etc/passwd +delete_xattr $TESTDIR/clone/myfile.${TESTCASE_ID} foo + +# delete the original dataset xattr +delete_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd + +# verify it's still there on the clone +verify_xattr $TESTDIR/clone/myfile.${TESTCASE_ID} passwd /etc/passwd +delete_xattr $TESTDIR/clone/myfile.${TESTCASE_ID} passwd + +log_pass "read/write/create/delete xattr on a clone filesystem" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_006_pos.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_006_pos.ksh new file mode 100644 index 00000000000..4a1422fc873 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_006_pos.ksh @@ -0,0 +1,77 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_006_pos.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_006_pos +# +# DESCRIPTION: +# Xattrs present on a file in a snapshot should be visible. +# +# STRATEGY: +# 1. Create a file and give it an xattr +# 2. Take a snapshot of the filesystem +# 3. Verify that we can take a snapshot of it. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-05) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $ZFS destroy $TESTPOOL/$TESTFS@snap + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} + +} + +log_assert "read xattr on a snapshot" +log_onexit cleanup + +# create a file, and an xattr on it +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +# snapshot the filesystem +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap + +# check for the xattr on the snapshot +verify_xattr $TESTDIR/$(get_snapdir_name)/snap/myfile.${TESTCASE_ID} passwd /etc/passwd + +log_pass "read xattr on a snapshot" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_007_neg.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_007_neg.ksh new file mode 100644 index 00000000000..991e692db35 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_007_neg.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_007_neg.ksh 1.2 08/02/27 SMI" +# +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +# $FreeBSD$ + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_007_neg +# +# DESCRIPTION: +# Creating and writing xattrs on files in snapshot directories fails. Also, +# we shouldn't be able to list the xattrs of files in snapshots who didn't have +# xattrs when the snapshot was created (the xattr namespace wouldn't have been +# created yet, and snapshots are read-only) See fsattr(5) for more details. +# +# STRATEGY: +# 1. Create a file and add an xattr to it. +# 2. Create another file, but don't add an xattr to it. +# 3. Snapshot the filesystem +# 4. Verify we're unable to alter the xattr on the first file +# 5. Verify we're unable to list the xattrs on the second file +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-13) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + log_must $ZFS destroy $TESTPOOL/$TESTFS@snap + log_must $RM $TESTDIR/myfile2.${TESTCASE_ID} + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} + log_must $RM $TMPDIR/output.${TESTCASE_ID} + [[ -e $TMPDIR/expected_output.${TESTCASE_ID} ]] && log_must $RM \ + $TMPDIR/expected_output.${TESTCASE_ID} + +} + +log_assert "create/write xattr on a snapshot fails" +log_onexit cleanup + +# create a file, and an xattr on it +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +# create another file that doesn't have an xattr +log_must $TOUCH $TESTDIR/myfile2.${TESTCASE_ID} + +# snapshot the filesystem +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap + +# we shouldn't be able to alter the first file's xattr +log_mustnot eval " $RUNAT $TESTDIR/$(get_snapdir_name)/snap/myfile.${TESTCASE_ID} \ + $CP /etc/passwd . >$TMPDIR/output.${TESTCASE_ID} 2>&1" +log_must $GREP -i Read-only $TMPDIR/output.${TESTCASE_ID} + +if check_version "5.10" +then + # we shouldn't be able to list xattrs at all on the second file + log_mustnot eval " $RUNAT $TESTDIR/$(get_snapdir_name)/snap/myfile2.${TESTCASE_ID} \ + $LS >$TMPDIR/output.${TESTCASE_ID} 2>&1" + log_must $GREP -i Read-only $TMPDIR/output.${TESTCASE_ID} +else + log_must eval "$RUNAT $TESTDIR/$(get_snapdir_name)/snap/myfile2.${TESTCASE_ID} \ + $LS >$TMPDIR/output.${TESTCASE_ID} 2>&1" + create_expected_output $TMPDIR/expected_output.${TESTCASE_ID} SUNWattr_ro \ + SUNWattr_rw + log_must $DIFF $TMPDIR/output.${TESTCASE_ID} $TMPDIR/expected_output.${TESTCASE_ID} +fi +log_pass "create/write xattr on a snapshot fails" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_008_pos.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_008_pos.ksh new file mode 100644 index 00000000000..ea590c84e9a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_008_pos.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_008_pos.ksh 1.2 08/02/27 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_008_pos +# +# DESCRIPTION: +# We verify that the special . and .. dirs work as expected for xattrs. +# +# STRATEGY: +# 1. Create a file and an xattr on that file +# 2. List the . directory, verifying the output +# 3. Verify we're unable to list the ../ directory +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-05) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + typeset file + + for file in $TMPDIR/output.${TESTCASE_ID} $TMPDIR/expected-output.${TESTCASE_ID} \ + $TESTDIR/myfile.${TESTCASE_ID} ; do + log_must $RM -f $file + done +} + +log_assert "special . and .. dirs work as expected for xattrs" +log_onexit cleanup + +test_requires RUNAT + +# create a file, and an xattr on it +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +if check_version "5.10" +then + # listing the directory . should show one file + OUTPUT=$($RUNAT $TESTDIR/myfile.${TESTCASE_ID} $LS .) + if [ "$OUTPUT" != "passwd" ] + then + log_fail "Listing the . directory doesn't show \"passwd\" as expected." + fi + # list the directory . long form + log_must eval "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $LS -a . > $TMPDIR/output.${TESTCASE_ID}" + # create a file that should be the same as the command above + create_expected_output $TMPDIR/expected-output.${TESTCASE_ID} . .. passwd + # compare them + log_must $DIFF $TMPDIR/output.${TESTCASE_ID} $TMPDIR/expected-output.${TESTCASE_ID} +else + # listing the directory . + log_must eval "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $LS . > $TMPDIR/output.${TESTCASE_ID}" + create_expected_output $TMPDIR/expected-output.${TESTCASE_ID} \ + SUNWattr_ro SUNWattr_rw passwd + log_must $DIFF $TMPDIR/output.${TESTCASE_ID} $TMPDIR/expected-output.${TESTCASE_ID} + # list the directory . long form + log_must eval "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $LS -a . > $TMPDIR/output.${TESTCASE_ID}" + create_expected_output $TMPDIR/expected-output.${TESTCASE_ID} . .. \ + SUNWattr_ro SUNWattr_rw passwd + log_must $DIFF $TMPDIR/output.${TESTCASE_ID} $TMPDIR/expected-output.${TESTCASE_ID} +fi + +# list the directory .. expecting one file +OUTPUT=$($RUNAT $TESTDIR/myfile.${TESTCASE_ID} $LS ..) +if [ "$OUTPUT" != ".." ] +then + log_fail "Listing the .. directory doesn't show \"..\" as expected." +fi + +# verify we can't list ../ +log_mustnot eval "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $LS ../ > /dev/null 2>&1" + +log_pass "special . and .. dirs work as expected for xattrs" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_009_neg.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_009_neg.ksh new file mode 100644 index 00000000000..96f9ba1fd40 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_009_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_009_neg.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_009_neg +# +# DESCRIPTION: +# links between xattr and normal file namespace fail +# +# STRATEGY: +# 1. Create a file and add an xattr to it (to ensure the namespace exists) +# 2. Verify we're unable to create a symbolic link +# 3. Verify we're unable to create a hard link +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-13) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} + +} + +log_assert "links between xattr and normal file namespace fail" +log_onexit cleanup + +test_requires RUNAT + +# create a file, and an xattr on it +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +# Try to create a soft link from the xattr namespace to the default namespace +log_mustnot $RUNAT $TESTDIR/myfile.${TESTCASE_ID} $LN -s /etc/passwd foo + +# Try to create a hard link from the xattr namespace to the default namespace +log_mustnot $RUNAT $TESTDIR/myfile.${TESTCASE_ID} $LN /etc/passwd foo + +log_pass "links between xattr and normal file namespace fail" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_010_neg.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_010_neg.ksh new file mode 100644 index 00000000000..0b11ccdd357 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_010_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_010_neg.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_010_neg +# +# DESCRIPTION: +# Verify that mkdir and various mknods fail inside the xattr namespace +# +# STRATEGY: +# 1. Create a file and add an xattr to it (to ensure the namespace exists) +# 2. Verify that mkdir fails inside the xattr namespace +# 3. Verify that various mknods fails inside the xattr namespace +# +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-13) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} +} + +log_assert "mkdir, mknod fail" +log_onexit cleanup + +test_requires RUNAT + +# create a file, and an xattr on it +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +# Try to create directory in the xattr namespace +log_mustnot $RUNAT $TESTDIR/myfile.${TESTCASE_ID} $MKDIR foo + +# Try to create a range of different filetypes in the xattr namespace +log_mustnot $RUNAT $TESTDIR/myfile.${TESTCASE_ID} $MKNOD block b 888 888 + +log_mustnot $RUNAT $TESTDIR/myfile.${TESTCASE_ID} $MKNOD char c + +log_mustnot $RUNAT $TESTDIR/myfile.${TESTCASE_ID} $MKNOD fifo p + +log_pass "mkdir, mknod fail" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_011_pos.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_011_pos.ksh new file mode 100644 index 00000000000..1ea0826a665 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_011_pos.ksh @@ -0,0 +1,203 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_011_pos.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_011_pos +# +# DESCRIPTION: +# +# Basic applications work with xattrs: cpio cp find mv pax tar +# +# STRATEGY: +# 1. For each application +# 2. Create an xattr and archive/move/copy/find files with xattr support +# 3. Also check that when appropriate flag is not used, the xattr +# doesn't get copied +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-15) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} +} + +log_assert "Basic applications work with xattrs: cpio cp find mv pax tar" +log_onexit cleanup + +test_requires RUNAT + +# Create a file, and set an xattr on it. This file is used in several of the +# test scenarios below. +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + + +# For the archive applications below (tar, cpio, pax) +# we create two archives, one with xattrs, one without +# and try various cpio options extracting the archives +# with and without xattr support, checking for correct behaviour + + +log_note "Checking cpio" +log_must $TOUCH $TESTDIR/cpio.${TESTCASE_ID} +create_xattr $TESTDIR/cpio.${TESTCASE_ID} passwd /etc/passwd +$ECHO $TESTDIR/cpio.${TESTCASE_ID} | $CPIO -o@ > $TMPDIR/xattr.${TESTCASE_ID}.cpio +$ECHO $TESTDIR/cpio.${TESTCASE_ID} | $CPIO -o > $TMPDIR/noxattr.${TESTCASE_ID}.cpio + +# we should have no xattr here +log_must $CPIO -iu < $TMPDIR/xattr.${TESTCASE_ID}.cpio +log_mustnot eval "$RUNAT $TESTDIR/cpio.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" + +# we should have an xattr here +log_must $CPIO -iu@ < $TMPDIR/xattr.${TESTCASE_ID}.cpio +log_must eval "$RUNAT $TESTDIR/cpio.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" + +# we should have no xattr here +log_must $CPIO -iu < $TMPDIR/noxattr.${TESTCASE_ID}.cpio +log_mustnot eval "$RUNAT $TESTDIR/cpio.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" + +# we should have no xattr here +log_must $CPIO -iu@ < $TMPDIR/noxattr.${TESTCASE_ID}.cpio +log_mustnot eval "$RUNAT $TESTDIR/cpio.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +log_must $RM $TESTDIR/cpio.${TESTCASE_ID} $TMPDIR/xattr.${TESTCASE_ID}.cpio $TMPDIR/noxattr.${TESTCASE_ID}.cpio + + + +log_note "Checking cp" +# check that with the right flag, the xattr is preserved +log_must $CP -@ $TESTDIR/myfile.${TESTCASE_ID} $TESTDIR/myfile2.${TESTCASE_ID} +compare_xattrs $TESTDIR/myfile.${TESTCASE_ID} $TESTDIR/myfile2.${TESTCASE_ID} passwd +log_must $RM $TESTDIR/myfile2.${TESTCASE_ID} + +# without the right flag, there should be no xattr +log_must $CP $TESTDIR/myfile.${TESTCASE_ID} $TESTDIR/myfile2.${TESTCASE_ID} +log_mustnot eval "$RUNAT $TESTDIR/myfile2.${TESTCASE_ID} $LS passwd > /dev/null 2>&1" +log_must $RM $TESTDIR/myfile2.${TESTCASE_ID} + + + +log_note "Checking find" +# create a file without xattrs, and check that find -xattr only finds +# our test file that has an xattr. +log_must $MKDIR $TESTDIR/noxattrs +log_must $TOUCH $TESTDIR/noxattrs/no-xattr + +$FIND $TESTDIR -xattr | $GREP myfile.${TESTCASE_ID} +if [ $? -ne 0 ] +then + log_fail "find -xattr didn't find our file that had an xattr." +fi +$FIND $TESTDIR -xattr | $GREP no-xattr +if [ $? -eq 0 ] +then + log_fail "find -xattr found a file that didn't have an xattr." +fi +log_must $RM -rf $TESTDIR/noxattrs + + + +log_note "Checking mv" +# mv doesn't have any flags to preserve/ommit xattrs - they're +# always moved. +log_must $TOUCH $TESTDIR/mvfile.${TESTCASE_ID} +create_xattr $TESTDIR/mvfile.${TESTCASE_ID} passwd /etc/passwd +log_must $MV $TESTDIR/mvfile.${TESTCASE_ID} $TESTDIR/mvfile2.${TESTCASE_ID} +verify_xattr $TESTDIR/mvfile2.${TESTCASE_ID} passwd /etc/passwd +log_must $RM $TESTDIR/mvfile2.${TESTCASE_ID} + + +log_note "Checking pax" +log_must $TOUCH $TESTDIR/pax.${TESTCASE_ID} +create_xattr $TESTDIR/pax.${TESTCASE_ID} passwd /etc/passwd +log_must $PAX -w -f $TESTDIR/noxattr.pax $TESTDIR/pax.${TESTCASE_ID} +log_must $PAX -w@ -f $TESTDIR/xattr.pax $TESTDIR/pax.${TESTCASE_ID} +log_must $RM $TESTDIR/pax.${TESTCASE_ID} + +# we should have no xattr here +log_must $PAX -r -f $TESTDIR/noxattr.pax +log_mustnot eval "$RUNAT $TESTDIR/pax.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +log_must $RM $TESTDIR/pax.${TESTCASE_ID} + +# we should have no xattr here +log_must $PAX -r@ -f $TESTDIR/noxattr.pax +log_mustnot eval "$RUNAT $TESTDIR/pax.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +log_must $RM $TESTDIR/pax.${TESTCASE_ID} + + +# we should have an xattr here +log_must $PAX -r@ -f $TESTDIR/xattr.pax +verify_xattr $TESTDIR/pax.${TESTCASE_ID} passwd /etc/passwd +log_must $RM $TESTDIR/pax.${TESTCASE_ID} + +# we should have no xattr here +log_must $PAX -r -f $TESTDIR/xattr.pax +log_mustnot eval "$RUNAT $TESTDIR/pax.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +log_must $RM $TESTDIR/pax.${TESTCASE_ID} $TESTDIR/noxattr.pax $TESTDIR/xattr.pax + + +log_note "Checking tar" +log_must $TOUCH $TESTDIR/tar.${TESTCASE_ID} +create_xattr $TESTDIR/tar.${TESTCASE_ID} passwd /etc/passwd +log_must $TAR cf $TESTDIR/noxattr.tar $TESTDIR/tar.${TESTCASE_ID} +log_must $TAR c@f $TESTDIR/xattr.tar $TESTDIR/tar.${TESTCASE_ID} +log_must $RM $TESTDIR/tar.${TESTCASE_ID} + +# we should have no xattr here +log_must $TAR xf $TESTDIR/xattr.tar +log_mustnot eval "$RUNAT $TESTDIR/tar.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +log_must $RM $TESTDIR/tar.${TESTCASE_ID} + +# we should have an xattr here +log_must $TAR x@f $TESTDIR/xattr.tar +verify_xattr $TESTDIR/tar.${TESTCASE_ID} passwd /etc/passwd +log_must $RM $TESTDIR/tar.${TESTCASE_ID} + +# we should have no xattr here +log_must $TAR xf $TESTDIR/noxattr.tar +log_mustnot eval "$RUNAT $TESTDIR/tar.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +log_must $RM $TESTDIR/tar.${TESTCASE_ID} + +# we should have no xattr here +log_must $TAR x@f $TESTDIR/noxattr.tar +log_mustnot eval "$RUNAT $TESTDIR/tar.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +log_must $RM $TESTDIR/tar.${TESTCASE_ID} $TESTDIR/noxattr.tar $TESTDIR/xattr.tar diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_012_pos.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_012_pos.ksh new file mode 100644 index 00000000000..c355d386207 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_012_pos.ksh @@ -0,0 +1,119 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_012_pos.ksh 1.2 08/02/27 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_012_pos +# +# DESCRIPTION: +# xattr file sizes count towards normal disk usage +# +# STRATEGY: +# 1. Create a file, and check pool and filesystem usage +# 2. Create a 200mb xattr in that file +# 3. Check pool and filesystem usage, to ensure it reflects the size +# of the xattr +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-15) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} +} + +function get_pool_size { + poolname=$1 + psize=$( $ZPOOL list -H -o used $poolname ) + if [[ $psize == *[mM] ]] + then + returnvalue=$($ECHO $psize | $SED -e 's/m//g' -e 's/M//g') + returnvalue=$(( returnvalue * 1024 )) + else + returnvalue=$($ECHO $psize | $SED -e 's/k//g' -e 's/K//g') + fi + print $returnvalue +} + +log_assert "xattr file sizes count towards normal disk usage" +log_onexit cleanup + +test_requires RUNAT + +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} + +POOL_SIZE=0 +NEW_POOL_SIZE=0 + +if is_global_zone +then + # get pool and filesystem sizes. Since we're starting with an empty + # pool, the usage should be small - a few k. + POOL_SIZE=$(get_pool_size $TESTPOOL) +fi + +FS_SIZE=$( $ZFS get -p -H -o value used $TESTPOOL/$TESTFS ) + +log_must $RUNAT $TESTDIR/myfile.${TESTCASE_ID} $MKFILE 200m xattr + +#Make sure the newly created file is counted into zpool usage +log_must $SYNC + +# now check to see if our pool disk usage has increased +if is_global_zone +then + NEW_POOL_SIZE=$(get_pool_size $TESTPOOL) + if (( $NEW_POOL_SIZE <= $POOL_SIZE )) + then + log_fail "The new pool size $NEW_POOL_SIZE was less \ + than or equal to the old pool size $POOL_SIZE." + fi + +fi + +# also make sure our filesystem usage has increased +NEW_FS_SIZE=$( $ZFS get -p -H -o value used $TESTPOOL/$TESTFS ) +if (( $NEW_FS_SIZE <= $FS_SIZE )) +then + log_fail "The new filesystem size $NEW_FS_SIZE was less \ + than or equal to the old filesystem size $FS_SIZE." +fi + +log_pass "xattr file sizes count towards normal disk usage" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_013_pos.ksh b/tests/sys/cddl/zfs/tests/xattr/xattr_013_pos.ksh new file mode 100644 index 00000000000..468705a6499 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_013_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_013_pos.ksh 1.1 07/02/06 SMI" +# + +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/xattr/xattr_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: xattr_013_pos +# +# DESCRIPTION: +# The noxattr mount option functions as expected +# +# STRATEGY: +# 1. Create a file on a filesystem and add an xattr to it +# 2. Unmount the filesystem, and mount it -o noxattr +# 3. Verify that the xattr cannot be read and new files +# cannot have xattrs set on them. +# 4. Unmount and mount the filesystem normally +# 5. Verify that xattrs can be set and accessed again +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-15) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $RM $TESTDIR/myfile.${TESTCASE_ID} +} + + +log_assert "The noxattr mount option functions as expected" +log_onexit cleanup + +test_requires RUNAT + +$ZFS set 2>&1 | $GREP xattr > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "noxattr mount option not supported on this release." +fi + +log_must $TOUCH $TESTDIR/myfile.${TESTCASE_ID} +create_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +log_must $UMOUNT $TESTDIR +log_must $ZFS mount -o noxattr $TESTPOOL/$TESTFS + +# check that we can't perform xattr operations +log_mustnot eval "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +log_mustnot eval "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $RM passwd > /dev/null 2>&1" +log_mustnot eval "$RUNAT $TESTDIR/myfile.${TESTCASE_ID} $CP /etc/passwd . > /dev/null 2>&1" + +log_must $TOUCH $TESTDIR/new.${TESTCASE_ID} +log_mustnot eval "$RUNAT $TESTDIR/new.${TESTCASE_ID} $CP /etc/passwd . > /dev/null 2>&1" +log_mustnot eval "$RUNAT $TESTDIR/new.${TESTCASE_ID} $RM passwd > /dev/null 2>&1" + +# now mount the filesystem again as normal +log_must $UMOUNT $TESTDIR +log_must $ZFS mount $TESTPOOL/$TESTFS + +# we should still have an xattr on the first file +verify_xattr $TESTDIR/myfile.${TESTCASE_ID} passwd /etc/passwd + +# there should be no xattr on the file we created while the fs was mounted +# -o noxattr +log_mustnot eval "$RUNAT $TESTDIR/new.${TESTCASE_ID} $CAT passwd > /dev/null 2>&1" +create_xattr $TESTDIR/new.${TESTCASE_ID} passwd /etc/passwd + +log_pass "The noxattr mount option functions as expected" diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_common.kshlib b/tests/sys/cddl/zfs/tests/xattr/xattr_common.kshlib new file mode 100644 index 00000000000..f9feedba219 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_common.kshlib @@ -0,0 +1,108 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)xattr_common.kshlib 1.3 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# a function that takes a file, then creates and verifies +# an xattr on that file. The xattr_contents is the file +# that should appear in the xattr namespace. +function create_xattr { # filename xattr_name xattr_contents + typeset FILE=$1 + typeset XATTR_NAME=$2 + typeset XATTR_CONTENTS=$3 + + # read any empty xattr on that file + log_must $RUNAT $FILE $LS + # create the xattr + log_must $RUNAT $FILE $CP $XATTR_CONTENTS $XATTR_NAME + + verify_xattr $FILE $XATTR_NAME $XATTR_CONTENTS +} + +# a function that compares the a single xattr between two files +# and checks to see if their contents are identical +function compare_xattrs { # filename1 filename2 xattr_name + typeset FILE1=$1 + typeset FILE2=$2 + typeset XATTR_NAME=$3 + + $RUNAT $FILE1 $CAT $XATTR_NAME > $TMPDIR/file1.${TESTCASE_ID} + $RUNAT $FILE2 $CAT $XATTR_NAME > $TMPDIR/file2.${TESTCASE_ID} + + log_must $DIFF $TMPDIR/file1.${TESTCASE_ID} $TMPDIR/file2.${TESTCASE_ID} + log_must $RM $TMPDIR/file1.${TESTCASE_ID} $TMPDIR/file2.${TESTCASE_ID} +} + +function verify_xattr { # filename xattr_name xattr_contents + typeset FILE=$1 + typeset XATTR_NAME=$2 + typeset XATTR_CONTENTS=$3 + + # read the xattr, writing it to a temp file + log_must eval "$RUNAT $FILE $CAT $XATTR_NAME > $TMPDIR/$XATTR_NAME.${TESTCASE_ID} 2>&1" + log_must $DIFF $XATTR_CONTENTS $TMPDIR/$XATTR_NAME.${TESTCASE_ID} + $RM $TMPDIR/$XATTR_NAME.${TESTCASE_ID} +} + +function delete_xattr { # filename xattr_name + typeset FILE=$1 + typeset XATTR_NAME=$2 + + # delete the xattr + log_must $RUNAT $FILE $RM $XATTR_NAME + log_mustnot eval "$RUNAT $FILE $LS $XATTR_NAME > /dev/null 2>&1" +} + +# not sure about this : really this should be testing write/append +function verify_write_xattr { # filename xattr_name + typeset FILE=$1 + typeset XATTR_NAME=$2 + + log_must eval "$RUNAT $FILE $DD if=/etc/passwd of=$XATTR_NAME" + log_must eval "$RUNAT $FILE $CAT $XATTR_NAME > $TMPDIR/$XATTR_NAME.${TESTCASE_ID} 2>&1" + log_must $DD if=/etc/passwd of=$TMPDIR/passwd_dd.${TESTCASE_ID} + log_must $DIFF $TMPDIR/passwd_dd.${TESTCASE_ID} $TMPDIR/$XATTR_NAME.${TESTCASE_ID} + log_must $RM $TMPDIR/passwd_dd.${TESTCASE_ID} $TMPDIR/$XATTR_NAME.${TESTCASE_ID} +} + +# this function is to create the expected output +function create_expected_output { # expected_output_file contents_of_the_output + typeset FILE=$1 + shift + if [[ -f $FILE ]]; then + log_must $RM $FILE + fi + + for line in $@ + do + log_must eval "$ECHO $line >> $FILE" + done + } diff --git a/tests/sys/cddl/zfs/tests/xattr/xattr_test.sh b/tests/sys/cddl/zfs/tests/xattr/xattr_test.sh new file mode 100755 index 00000000000..7f7106a3468 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/xattr/xattr_test.sh @@ -0,0 +1,370 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case xattr_001_pos cleanup +xattr_001_pos_head() +{ + atf_set "descr" "Create/read/write/append of xattrs works" + atf_set "require.progs" svcadm svcs +} +xattr_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_001_pos.ksh || atf_fail "Testcase failed" +} +xattr_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_002_neg cleanup +xattr_002_neg_head() +{ + atf_set "descr" "A read of a non-existent xattr fails" + atf_set "require.progs" svcadm svcs +} +xattr_002_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_002_neg.ksh || atf_fail "Testcase failed" +} +xattr_002_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_003_neg cleanup +xattr_003_neg_head() +{ + atf_set "descr" "read/write xattr on a file with no permissions fails" + atf_set "require.progs" svcs svcadm runat runwattr +} +xattr_003_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_003_neg.ksh || atf_fail "Testcase failed" +} +xattr_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_004_pos cleanup +xattr_004_pos_head() +{ + atf_set "descr" "Files from ufs,tmpfs with xattrs copied to zfs retain xattr info." + atf_set "require.progs" zfs svcadm runat svcs +} +xattr_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_004_pos.ksh || atf_fail "Testcase failed" +} +xattr_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_005_pos cleanup +xattr_005_pos_head() +{ + atf_set "descr" "read/write/create/delete xattr on a clone filesystem" + atf_set "require.progs" zfs svcadm svcs +} +xattr_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_005_pos.ksh || atf_fail "Testcase failed" +} +xattr_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_006_pos cleanup +xattr_006_pos_head() +{ + atf_set "descr" "read xattr on a snapshot" + atf_set "require.progs" zfs svcadm svcs +} +xattr_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_006_pos.ksh || atf_fail "Testcase failed" +} +xattr_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_007_neg cleanup +xattr_007_neg_head() +{ + atf_set "descr" "create/write xattr on a snapshot fails" + atf_set "require.progs" zfs svcadm runat svcs +} +xattr_007_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_007_neg.ksh || atf_fail "Testcase failed" +} +xattr_007_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_008_pos cleanup +xattr_008_pos_head() +{ + atf_set "descr" "special . and .. dirs work as expected for xattrs" + atf_set "require.progs" svcadm runat svcs +} +xattr_008_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_008_pos.ksh || atf_fail "Testcase failed" +} +xattr_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_009_neg cleanup +xattr_009_neg_head() +{ + atf_set "descr" "links between xattr and normal file namespace fail" + atf_set "require.progs" svcadm runat svcs +} +xattr_009_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_009_neg.ksh || atf_fail "Testcase failed" +} +xattr_009_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_010_neg cleanup +xattr_010_neg_head() +{ + atf_set "descr" "mkdir, mknod fail" + atf_set "require.progs" svcadm runat svcs +} +xattr_010_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_010_neg.ksh || atf_fail "Testcase failed" +} +xattr_010_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_011_pos cleanup +xattr_011_pos_head() +{ + atf_set "descr" "Basic applications work with xattrs: cpio cp find mv pax tar" + atf_set "require.progs" pax svcadm runat svcs +} +xattr_011_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_011_pos.ksh || atf_fail "Testcase failed" +} +xattr_011_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_012_pos cleanup +xattr_012_pos_head() +{ + atf_set "descr" "xattr file sizes count towards normal disk usage" + atf_set "require.progs" svcadm zfs runat zpool svcs +} +xattr_012_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_012_pos.ksh || atf_fail "Testcase failed" +} +xattr_012_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case xattr_013_pos cleanup +xattr_013_pos_head() +{ + atf_set "descr" "The noxattr mount option functions as expected" + atf_set "require.progs" zfs svcadm runat svcs +} +xattr_013_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/xattr_013_pos.ksh || atf_fail "Testcase failed" +} +xattr_013_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/xattr_common.kshlib + . $(atf_get_srcdir)/xattr.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case xattr_001_pos + atf_add_test_case xattr_002_neg + atf_add_test_case xattr_003_neg + atf_add_test_case xattr_004_pos + atf_add_test_case xattr_005_pos + atf_add_test_case xattr_006_pos + atf_add_test_case xattr_007_neg + atf_add_test_case xattr_008_pos + atf_add_test_case xattr_009_neg + atf_add_test_case xattr_010_neg + atf_add_test_case xattr_011_pos + atf_add_test_case xattr_012_pos + atf_add_test_case xattr_013_pos +} diff --git a/tests/sys/cddl/zfs/tests/zfsd/Makefile b/tests/sys/cddl/zfs/tests/zfsd/Makefile new file mode 100644 index 00000000000..6bdbae7886a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/Makefile @@ -0,0 +1,38 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zfsd +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zfsd_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= hotspare_cleanup.ksh +${PACKAGE}FILES+= hotspare_setup.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zfsd.cfg +${PACKAGE}FILES+= zfsd.kshlib +${PACKAGE}FILES+= zfsd_autoreplace_001_neg.ksh +${PACKAGE}FILES+= zfsd_autoreplace_002_pos.ksh +${PACKAGE}FILES+= zfsd_autoreplace_003_pos.ksh +${PACKAGE}FILES+= zfsd_degrade_001_pos.ksh +${PACKAGE}FILES+= zfsd_degrade_002_pos.ksh +${PACKAGE}FILES+= zfsd_fault_001_pos.ksh +${PACKAGE}FILES+= zfsd_hotspare_001_pos.ksh +${PACKAGE}FILES+= zfsd_hotspare_002_pos.ksh +${PACKAGE}FILES+= zfsd_hotspare_003_pos.ksh +${PACKAGE}FILES+= zfsd_hotspare_004_pos.ksh +${PACKAGE}FILES+= zfsd_hotspare_005_pos.ksh +${PACKAGE}FILES+= zfsd_hotspare_006_pos.ksh +${PACKAGE}FILES+= zfsd_hotspare_007_pos.ksh +${PACKAGE}FILES+= zfsd_hotspare_008_neg.ksh +${PACKAGE}FILES+= zfsd_import_001_pos.ksh +${PACKAGE}FILES+= zfsd_replace_001_pos.ksh +${PACKAGE}FILES+= zfsd_replace_002_pos.ksh +${PACKAGE}FILES+= zfsd_replace_003_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/zfsd/cleanup.ksh b/tests/sys/cddl/zfs/tests/zfsd/cleanup.ksh new file mode 100644 index 00000000000..3d1869c9e93 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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) 2012,2013 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# $FreeBSD$ + +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/include/libgnop.kshlib + +# Rotate logs now, because this test can generate a great volume of log entries +newsyslog + +default_cleanup_noexit +destroy_gnops ${DISKS} +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/hotspare_cleanup.ksh b/tests/sys/cddl/zfs/tests/zfsd/hotspare_cleanup.ksh new file mode 100644 index 00000000000..cd6c35800f6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/hotspare_cleanup.ksh @@ -0,0 +1,47 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright 2013 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +# + +# This is the cleanup script for ZFSD tests that are based on the hotspare +# framework. It is almost identical to tests/hotspare/cleanup.ksh, +# but does not restart ZFSD. + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +verify_runnable "global" + +log_must cleanup_devices_all + +log_pass + + diff --git a/tests/sys/cddl/zfs/tests/zfsd/hotspare_setup.ksh b/tests/sys/cddl/zfs/tests/zfsd/hotspare_setup.ksh new file mode 100644 index 00000000000..341e541badf --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/hotspare_setup.ksh @@ -0,0 +1,45 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright 2013 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +# + +# This is the setup script for ZFSD tests that are based on the hotspare +# framework. It is almost identical to tests/hotspare/setup.ksh, +# but does not stop ZFSD. + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +verify_runnable "global" + +log_must cleanup_devices_all + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/setup.ksh b/tests/sys/cddl/zfs/tests/zfsd/setup.ksh new file mode 100644 index 00000000000..78792c6c886 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/setup.ksh @@ -0,0 +1,34 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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) 2012,2013 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# $FreeBSD$ + +. ${STF_SUITE}/include/libtest.kshlib + +# Rotate logs now, because this test can generate a great volume of log entries +newsyslog + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd.cfg b/tests/sys/cddl/zfs/tests/zfsd/zfsd.cfg new file mode 100644 index 00000000000..d515d44c404 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd.cfg @@ -0,0 +1,32 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright (c) 2012,2013 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# + +export TESTFILE=testfile.${TESTCASE_ID} +export STF_TIMEOUT=300 diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd.kshlib b/tests/sys/cddl/zfs/tests/zfsd/zfsd.kshlib new file mode 100644 index 00000000000..4a7f9b09e18 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd.kshlib @@ -0,0 +1,85 @@ +#!/usr/local/bin/ksh93 -p +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + +# Common routines used by multiple zfsd tests + +function wait_for_pool_dev_state_change +{ + typeset -i timeout=$1 + typeset disk=$2 + typeset state=$3 + + log_note "Waiting up to $timeout seconds for $disk to become $state ..." + for ((; $timeout > 0; timeout=$timeout-1)); do + check_state $TESTPOOL "$disk" "$state" + [ $? -eq 0 ] && return + $SLEEP 1 + done + log_must $ZPOOL status $TESTPOOL + log_fail "ERROR: Disk $disk not marked as $state in $TESTPOOL" +} + +function wait_for_pool_removal +{ + typeset -i timeout=$1 + wait_for_pool_dev_state_change $timeout $REMOVAL_DISK "REMOVED|UNAVAIL" +} + +function wait_until_scrubbed +{ + typeset pool=$1 + + while is_pool_scrubbing $pool; do + log_note "$pool still scrubbing..." + $SLEEP 1 + done +} + +function corrupt_pool_vdev +{ + typeset pool=$1 + typeset vdev=$2 + typeset file=$3 + + # do some IO on the pool + log_must $DD if=/dev/zero of=$file bs=1024k count=64 + $FSYNC $file + + # scribble on the underlying file to corrupt the vdev + log_must $DD if=/dev/urandom of=$vdev bs=1024k count=64 conv=notrunc + + # Scrub the pool to detect the corruption + log_must $ZPOOL scrub $pool + wait_until_scrubbed $pool + + # ZFSD can take up to 60 seconds to degrade an array in response to + # errors (though it's usually faster). + wait_for_pool_dev_state_change 60 $vdev DEGRADED +} diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_001_neg.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_001_neg.ksh new file mode 100644 index 00000000000..9e811d06f94 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_001_neg.ksh @@ -0,0 +1,95 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_007_pos.ksh 1.0 12/08/10 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib +. $STF_SUITE/include/libgnop.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_autoreplace_001_neg +# +# DESCRIPTION: +# In a pool without the autoreplace property unset, a vdev will not be +# replaced by physical path +# +# STRATEGY: +# 1. Create 1 storage pool without hot spares +# 2. Remove a vdev +# 4. Create a new vdev with the same physical path as the first one +# 9. Verify that it does not get added to the pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2013-02-4) +# +# __stc_assertion_end +# +############################################################################### + +log_assert "A pool without the autoreplace property set will not replace disks by physical path" + +function verify_assertion +{ + # 9. Verify that it does not get added to the pool + for ((timeout=0; timeout<4; timeout=$timeout+1)); do + log_mustnot check_state $TESTPOOL $REMOVAL_DISK "ONLINE" + $SLEEP 5 + done +} + +typeset PHYSPATH="some_physical_path" +typeset REMOVAL_DISK=$DISK0 +typeset REMOVAL_NOP=${DISK0}.nop +typeset NEW_DISK=$DISK4 +typeset NEW_NOP=${DISK4}.nop +typeset OTHER_DISKS="${DISK1} ${DISK2} ${DISK3}" +typeset ALLDISKS="${DISK0} ${DISK1} ${DISK2} ${DISK3}" +typeset ALLNOPS=${ALLDISKS//~(E)([[:space:]]+|$)/.nop\1} +set -A MY_KEYWORDS "mirror" "raidz1" "raidz2" +ensure_zfsd_running +log_must create_gnops $OTHER_DISKS +for keyword in "${MY_KEYWORDS[@]}" ; do + log_must create_gnop $REMOVAL_DISK $PHYSPATH + log_must create_pool $TESTPOOL $keyword $ALLNOPS + log_must $ZPOOL set autoreplace=on $TESTPOOL + + log_must destroy_gnop $REMOVAL_DISK + log_must create_gnop $NEW_DISK $PHYSPATH + verify_assertion + destroy_pool "$TESTPOOL" + log_must destroy_gnop $NEW_DISK +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_002_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_002_pos.ksh new file mode 100644 index 00000000000..64be3c05503 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_002_pos.ksh @@ -0,0 +1,92 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_007_pos.ksh 1.0 12/08/10 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib +. $STF_SUITE/include/libgnop.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_autoreplace_002_pos +# +# DESCRIPTION: +# In a pool with the autoreplace property set, a vdev will be +# replaced by physical path +# +# STRATEGY: +# 1. Create 1 storage pool without hot spares +# 2. Remove a vdev +# 4. Create a new vdev with the same physical path as the first one +# 9. Verify that it does get added to the pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2013-02-4) +# +# __stc_assertion_end +# +############################################################################### + +log_assert "A pool with the autoreplace property will replace disks by physical path" + +function verify_assertion +{ + wait_for_pool_dev_state_change 20 $NEW_DISK ONLINE +} + + +typeset PHYSPATH="some_physical_path" +typeset REMOVAL_DISK=$DISK0 +typeset REMOVAL_NOP=${DISK0}.nop +typeset NEW_DISK=$DISK4 +typeset NEW_NOP=${DISK4}.nop +typeset OTHER_DISKS="${DISK1} ${DISK2} ${DISK3}" +typeset ALLDISKS="${DISK0} ${DISK1} ${DISK2} ${DISK3}" +typeset ALLNOPS=${ALLDISKS//~(E)([[:space:]]+|$)/.nop\1} +set -A MY_KEYWORDS "mirror" "raidz1" "raidz2" +ensure_zfsd_running +log_must create_gnops $OTHER_DISKS +for keyword in "${MY_KEYWORDS[@]}" ; do + log_must create_gnop $REMOVAL_DISK $PHYSPATH + log_must create_pool $TESTPOOL $keyword $ALLNOPS + log_must $ZPOOL set autoreplace=on $TESTPOOL + + log_must destroy_gnop $REMOVAL_DISK + log_must create_gnop $NEW_DISK $PHYSPATH + verify_assertion + destroy_pool "$TESTPOOL" + log_must destroy_gnop $NEW_DISK +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_003_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_003_pos.ksh new file mode 100644 index 00000000000..beb2a100c35 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_autoreplace_003_pos.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2014 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib +. $STF_SUITE/include/libgnop.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_autoreplace_003_pos +# +# DESCRIPTION: +# In a pool with the autoreplace property set, a vdev will be +# replaced by physical path even if a spare is already active for that +# vdev +# +# STRATEGY: +# 1. Create 1 storage pool with a hot spare +# 2. Remove a vdev +# 3. Wait for the hotspare to fully resilver +# 4. Create a new vdev with the same physical path as the first one +# 10. Verify that it does get added to the pool. +# 11. Verify that the hotspare gets removed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2013-05-13) +# +# __stc_assertion_end +# +############################################################################### + +log_assert "A pool with the autoreplace property will replace disks by physical path, even if a spare is active" + +function verify_assertion +{ + # Verify that the replacement disk gets added to the pool + wait_for_pool_dev_state_change 20 $NEW_DISK ONLINE + + # Wait for resilvering to complete + wait_until_resilvered + + # Check that the spare is deactivated + wait_for_pool_dev_state_change 20 "$SPARE_DISK" "AVAIL" +} + + +typeset PHYSPATH="some_physical_path" +typeset REMOVAL_DISK=$DISK0 +typeset REMOVAL_NOP=${DISK0}.nop +typeset NEW_DISK=$DISK4 +typeset NEW_NOP=${DISK4}.nop +typeset SPARE_DISK=${DISK5} +typeset SPARE_NOP=${DISK5}.nop +typeset OTHER_DISKS="${DISK1} ${DISK2} ${DISK3}" +typeset OTHER_NOPS=${OTHER_DISKS//~(E)([[:space:]]+|$)/.nop\1} +set -A MY_KEYWORDS "mirror" "raidz1" "raidz2" +ensure_zfsd_running +log_must create_gnops $OTHER_DISKS $SPARE_DISK +for keyword in "${MY_KEYWORDS[@]}" ; do + log_must create_gnop $REMOVAL_DISK $PHYSPATH + log_must create_pool $TESTPOOL $keyword $REMOVAL_NOP $OTHER_NOPS spare $SPARE_NOP + log_must $ZPOOL set autoreplace=on $TESTPOOL + + log_must destroy_gnop $REMOVAL_DISK + log_must create_gnop $NEW_DISK $PHYSPATH + verify_assertion + destroy_pool "$TESTPOOL" + log_must destroy_gnop $NEW_DISK +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_degrade_001_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_degrade_001_pos.ksh new file mode 100644 index 00000000000..246d012465e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_degrade_001_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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) 2012,2013 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_degrade_001_pos +# +# DESCRIPTION: +# If a vdev experiences checksum errors, it will become degraded. +# +# +# STRATEGY: +# 1. Create a storage pool. Only use the file vdevs because it is easy to +# generate checksum errors on them. +# 2. Mostly fill the pool with data. +# 3. Corrupt it by DDing to the underlying vdev +# 4. Verify that the vdev becomes DEGRADED. +# 5. ONLINE it and verify that it resilvers and joins the pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2012-08-09) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +VDEV0=${TMPDIR}/file0.${TESTCASE_ID} +VDEV1=${TMPDIR}/file1.${TESTCASE_ID} +VDEVS="${VDEV0} ${VDEV1}" +TESTFILE=/$TESTPOOL/testfile +VDEV_SIZE=192m + + +function cleanup +{ + destroy_pool $TESTPOOL + $RM -f $VDEVS +} + +log_assert "ZFS will degrade a vdev that produces checksum errors" + +log_onexit cleanup + +log_must create_vdevs $VDEV0 $VDEV1 +ensure_zfsd_running +for type in "raidz" "mirror"; do + log_note "Testing raid type $type" + + create_pool $TESTPOOL $type ${VDEVS} + corrupt_pool_vdev $TESTPOOL $VDEV1 $TESTFILE + destroy_pool $TESTPOOL +done + +cleanup +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_degrade_002_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_degrade_002_pos.ksh new file mode 100644 index 00000000000..962bbaf2f53 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_degrade_002_pos.ksh @@ -0,0 +1,102 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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) 2012-2014 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_degrade_002_pos +# +# DESCRIPTION: +# If an active hotspare experiences checksum errors, it will become degraded. +# +# +# STRATEGY: +# 1. Create a storage pool with a hotspare. Only use the file vdevs because +# it is easy to generate checksum errors on them. +# 2. fault a vdev to active the hotspare +# 3. Mostly fill the pool with data. +# 4. Corrupt it by DDing to the hotspare's underlying file. +# 5. Verify that the hotspare becomes DEGRADED. +# 6. ONLINE it and verify that it resilvers and joins the pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2014-05-13) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +VDEV0=${TMPDIR}/file0.${TESTCASE_ID} +VDEV1=${TMPDIR}/file1.${TESTCASE_ID} +SPARE_VDEV=${TMPDIR}/file2.${TESTCASE_ID} +BASIC_VDEVS="${VDEV0} ${VDEV1}" +VDEVS="${BASIC_VDEVS} ${SPARE_VDEV}" +TESTFILE=/$TESTPOOL/testfile +VDEV_SIZE=192m + + +function cleanup +{ + destroy_pool $TESTPOOL + $RM -f $VDEVS +} + +log_assert "ZFS will degrade a spare vdev that produces checksum errors" + +log_onexit cleanup + +ensure_zfsd_running +log_must create_vdevs $VDEV0 $VDEV1 $SPARE_VDEV + +for type in "mirror" "raidz"; do + log_note "Testing raid type $type" + + create_pool $TESTPOOL $type ${BASIC_VDEVS} spare ${SPARE_VDEV} + + # Activate the hotspare + $ZINJECT -d ${VDEV0} -A fault $TESTPOOL + + # ZFSD can take up to 60 seconds to replace a failed device + # (though it's usually faster). + wait_for_pool_dev_state_change 60 $SPARE_VDEV INUSE + + corrupt_pool_vdev $TESTPOOL $SPARE_VDEV $TESTFILE + destroy_pool $TESTPOOL +done + +cleanup +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_fault_001_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_fault_001_pos.ksh new file mode 100644 index 00000000000..5dfc8e9a9d1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_fault_001_pos.ksh @@ -0,0 +1,163 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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) 2012,2013 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_fault_001_pos +# +# DESCRIPTION: +# If a vdev experiences IO errors, it will become faulted. +# +# +# STRATEGY: +# 1. Create a storage pool. Only use the da driver (FreeBSD's SCSI disk +# driver) because it has a special interface for simulating IO errors. +# 2. Inject IO errors while doing IO to the pool. +# 3. Verify that the vdev becomes FAULTED. +# 4. ONLINE it and verify that it resilvers and joins the pool. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2012-08-09) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + # Disable error injection, if still active + sysctl kern.cam.da.$TMPDISKNUM.error_inject=0 > /dev/null + + if poolexists $TESTPOOL; then + # We should not get here if the test passed. Print the output + # of zpool status to assist in debugging. + $ZPOOL status + # Clear out artificially generated errors and destroy the pool + $ZPOOL clear $TESTPOOL + destroy_pool $TESTPOOL + fi +} + +log_assert "ZFS will fault a vdev that produces IO errors" + +log_onexit cleanup +ensure_zfsd_running + +# Make sure that at least one of the disks is using the da driver, and use +# that disk for inject errors +typeset TMPDISK="" +for d in $DISKS +do + b=`basename $d` + if test ${b%%[0-9]*} == da + then + TMPDISK=$b + TMPDISKNUM=${b##da} + break + fi +done +if test -z $TMPDISK +then + log_unsupported "This test requires at least one disk to use the da driver" +fi + + +for type in "raidz" "mirror"; do + log_note "Testing raid type $type" + + # Create a pool on the supplied disks + create_pool $TESTPOOL $type $DISKS + log_must $ZFS create $TESTPOOL/$TESTFS + + # Cause some IO errors writing to the pool + while true; do + # Running zpool status after every dd operation is too slow. + # So we will run several dd's in a row before checking zpool + # status. sync between dd operations to ensure that the disk + # gets IO + for ((i=0; $i<64; i=$i+1)); do + sysctl kern.cam.da.$TMPDISKNUM.error_inject=1 > \ + /dev/null + $DD if=/dev/zero bs=128k count=1 >> \ + /$TESTPOOL/$TESTFS/$TESTFILE 2> /dev/null + $FSYNC /$TESTPOOL/$TESTFS/$TESTFILE + done + # Check to see if the pool is faulted yet + $ZPOOL status $TESTPOOL | grep -q 'state: DEGRADED' + if [ $? == 0 ] + then + log_note "$TESTPOOL got degraded" + break + fi + done + + log_must check_state $TESTPOOL $TMPDISK "FAULTED" + + #find the failed disk guid + typeset FAILED_VDEV=`$ZPOOL status $TESTPOOL | + awk "/^[[:space:]]*$TMPDISK[[:space:]]*FAULTED/ {print \\$1}"` + + # Reattach the failed disk + $ZPOOL online $TESTPOOL $FAILED_VDEV > /dev/null + if [ $? != 0 ]; then + log_fail "Could not reattach $FAILED_VDEV" + fi + + # Verify that the pool resilvers and goes to the ONLINE state + for (( retries=60; $retries>0; retries=$retries+1 )) + do + $ZPOOL status $TESTPOOL | egrep -q "scan:.*resilvered" + RESILVERED=$? + $ZPOOL status $TESTPOOL | egrep -q "state:.*ONLINE" + ONLINE=$? + if test $RESILVERED -a $ONLINE + then + break + fi + $SLEEP 2 + done + + if [ $retries == 0 ] + then + log_fail "$TESTPOOL never resilvered in the allowed time" + fi + + destroy_pool $TESTPOOL + log_must $RM -rf /$TESTPOOL +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_001_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_001_pos.ksh new file mode 100644 index 00000000000..dba9cb51235 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_001_pos.ksh @@ -0,0 +1,151 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Copyright 2014 Spectra Logic Corp. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_hotspare_001_pos +# +# DESCRIPTION: +# If an active spare fails, it will be replaced by an available spare. +# +# STRATEGY: +# 1. Create a storage pool with two hot spares +# 2. Fail one vdev +# 3. Verify that a spare gets activated +# 4. Fail the spare +# 5. Verify the failed spare was replaced by the other spare. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2014-05-13) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + + partition_cleanup +} + + +log_onexit cleanup + +function verify_assertion # type +{ + typeset pool_type=$1 + + typeset err_dev=${devarray[3]} + typeset raidz2_dev="${devarray[4]}" + typeset mntp=$(get_prop mountpoint $TESTPOOL) + + # fail a basic vdev + $ZINJECT -d $err_dev -A fault $TESTPOOL + + # ZFSD can take up to 60 seconds to replace a failed device + # (though it's usually faster). + for ((timeout=0; $timeout<10; timeout=$timeout+1)); do + check_state $TESTPOOL "$fail_spare" "INUSE" + spare_inuse=$? + if [[ $spare_inuse == 0 ]]; then + break + fi + $SLEEP 6 + done + log_must $ZPOOL status $TESTPOOL + log_must check_state $TESTPOOL "$fail_spare" "INUSE" + + # The zpool history should log when a spare device becomes active + log_must $ZPOOL history -i $TESTPOOL | $GREP "internal vdev attach" | \ + $GREP "spare in vdev=$fail_spare for vdev=$err_dev" > /dev/null + + ###################################################################### + # Now fail the active hotspare, and check that the second comes online + ###################################################################### + + # fail the spare vdev + $ZINJECT -d $fail_spare -A fault $TESTPOOL + + # ZFSD can take up to 60 seconds to replace a failed device + # (though it's usually faster). + for ((timeout=0; $timeout<10; timeout=$timeout+1)); do + check_state $TESTPOOL "$standby_spare" "INUSE" + spare_inuse=$? + if [[ $spare_inuse == 0 ]]; then + break + fi + $SLEEP 6 + done + log_must $ZPOOL status $TESTPOOL + + # The standby spare should be in use, while the original spare should + # be faulted. + log_must check_state $TESTPOOL $standby_spare "online" + log_must check_state $TESTPOOL $standby_spare "INUSE" + log_mustnot check_state $TESTPOOL $fail_spare "online" + + # The zpool history should log when a spare device becomes active + log_must $ZPOOL history -i $TESTPOOL | $GREP "internal vdev attach" | \ + $GREP "spare in vdev=$standby_spare for vdev=$fail_spare" > /dev/null + + # do cleanup + destroy_pool $TESTPOOL +} + +log_onexit cleanup + +log_assert "An active damaged spare will be replaced by an available spare" + +ensure_zfsd_running +set_devs + +typeset fail_spare="${devarray[0]}" +typeset standby_spare="${devarray[1]}" +typeset spares="$fail_spare $standby_spare" + +set -A my_keywords "mirror" "raidz1" "raidz2" + +for keyword in "${my_keywords[@]}"; do + setup_hotspares "$keyword" + verify_assertion "$keyword" +done + +log_pass "If one of the spare fail, the other available spare will be in use" diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_002_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_002_pos.ksh new file mode 100644 index 00000000000..ddeadbfb392 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_002_pos.ksh @@ -0,0 +1,114 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_004_pos.ksh 1.0 12/08/09 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_hotspare_002_pos +# +# DESCRIPTION: +# If a vdev becomes degraded in a pool with a spare, the spare will be +# activated. +# +# +# STRATEGY: +# 1. Create 1 storage pools with hot spares. +# 2. Artificially degrade one vdev in the pool +# 3. Verify that the spare is in use. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2012-08-06) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + + partition_cleanup +} + + +log_onexit cleanup + +function verify_assertion # type +{ + typeset sdev=$1 + typeset err_dev=${devarray[3]} + typeset mntp=$(get_prop mountpoint $TESTPOOL) + + # Artificially degrade the vdev + log_must $ZINJECT -d $err_dev -A degrade $TESTPOOL + log_must check_state $TESTPOOL $err_dev "DEGRADED" + + # ZFSD can take up to 60 seconds to degrade an array in response to + # errors (though it's usually faster). + for ((timeout=0; $timeout<10; timeout=$timeout+1)); do + check_state $TESTPOOL "$sdev" "INUSE" + spare_inuse=$? + if [[ $spare_inuse == 0 ]]; then + break + fi + $SLEEP 6 + done + log_must $ZPOOL status $TESTPOOL + log_must check_state $TESTPOOL "$sdev" "INUSE" + + # do cleanup + destroy_pool $TESTPOOL +} + +log_onexit cleanup + +log_assert "If a vdev becomes degraded, the spare will be activated." + +ensure_zfsd_running +set_devs + +typeset sdev="${devarray[0]}" + +set -A my_keywords "mirror" "raidz1" "raidz2" + +for keyword in "${my_keywords[@]}"; do + setup_hotspares "$keyword" + verify_assertion $sdev +done diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_003_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_003_pos.ksh new file mode 100644 index 00000000000..10892edc25a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_003_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_005_pos.ksh 1.0 12/08/09 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_hotspare_003_pos +# +# DESCRIPTION: +# If a vdev becomes faulted in a pool with a spare, the spare will be +# activated. +# +# +# STRATEGY: +# 1. Create 1 storage pools with hot spares. +# 2. Artificially fault one vdev in the pool to make 1 hotspare in use. +# 3. Verify that the spare is in use. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2012-08-06) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +function verify_assertion # spare_dev +{ + typeset err_dev=${devarray[3]} + typeset sdev=$1 + + log_must $ZINJECT -d $err_dev -A degrade $TESTPOOL + log_must check_state $TESTPOOL $err_dev "DEGRADED" + + # ZFSD can take up to 60 seconds to degrade an array in response to + # errors (though it's usually faster). + for ((timeout=0; $timeout<10; timeout=$timeout+1)); do + check_state $TESTPOOL "$sdev" "INUSE" + spare_inuse=$? + if [[ $spare_inuse == 0 ]]; then + break + fi + $SLEEP 6 + done + log_must $ZPOOL status $TESTPOOL + log_must check_state $TESTPOOL "$sdev" "INUSE" + + # do cleanup + destroy_pool $TESTPOOL +} + + +log_assert "A faulted vdev will be replaced by an available spare" + +log_onexit cleanup + +ensure_zfsd_running +set_devs +typeset sdev="${devarray[0]}" + +set -A my_keywords "mirror" "raidz1" "raidz2" +for keyword in "${my_keywords[@]}" ; do + setup_hotspares "$keyword" + verify_assertion $sdev +done + +log_pass "A faulted vdev will be replaced by an available spare" diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_004_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_004_pos.ksh new file mode 100644 index 00000000000..aba7f495e82 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_004_pos.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_006_pos.ksh 1.0 12/08/10 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib +. $STF_SUITE/include/libgnop.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_hotspare_004_pos +# +# DESCRIPTION: +# If a vdev gets removed from a pool with a spare, the spare will be +# activated. +# +# +# STRATEGY: +# 1. Create 1 storage pools with hot spares. +# 2. Remove one vdev +# 3. Verify that the spare is in use. +# 4. Recreate the vdev +# 5. Verify that the vdev gets resilvered and the spare gets removed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2012-08-10) +# +# __stc_assertion_end +# +############################################################################### + +log_assert "Removing a disk from a pool results in the spare activating" + +function verify_assertion # spare_dev +{ + typeset spare_dev=$1 + log_must destroy_gnop $REMOVAL_DISK + + # Check to make sure ZFS sees the disk as removed + wait_for_pool_removal 20 + + # Check that the spare was activated + wait_for_pool_dev_state_change 20 $spare_dev INUSE + log_must $ZPOOL status $TESTPOOL + + # Re-enable the missing disk + log_must create_gnop $REMOVAL_DISK $PHYSPATH + + # Check that the disk has rejoined the pool & resilvered + wait_for_pool_dev_state_change 20 $REMOVAL_NOP ONLINE + wait_until_resilvered + + # Finally, check that the spare deactivated + wait_for_pool_dev_state_change 20 $spare_dev AVAIL +} + + +typeset PHYSPATH="some_physical_path" +typeset REMOVAL_DISK=$DISK0 +typeset REMOVAL_NOP=${DISK0}.nop +typeset SPARE_DISK=$DISK4 +typeset SPARE_NOP=${DISK4}.nop +typeset OTHER_DISKS="${DISK1} ${DISK2} ${DISK3}" +typeset OTHER_NOPS=${OTHER_DISKS//~(E)([[:space:]]+|$)/.nop\1} +set -A MY_KEYWORDS "mirror" "raidz1" "raidz2" +ensure_zfsd_running +log_must create_gnops $OTHER_DISKS $SPARE_DISK +log_must create_gnop $REMOVAL_DISK $PHYSPATH +for keyword in "${MY_KEYWORDS[@]}" ; do + log_must create_pool $TESTPOOL $keyword $REMOVAL_NOP $OTHER_NOPS spare $SPARE_NOP + log_must $ZPOOL set autoreplace=on $TESTPOOL + iterate_over_hotspares verify_assertion $SPARE_NOP + + destroy_pool "$TESTPOOL" +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_005_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_005_pos.ksh new file mode 100644 index 00000000000..baf681f7931 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_005_pos.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_007_pos.ksh 1.0 12/08/10 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_hotspare_005_pos +# +# DESCRIPTION: +# If a spare gets added to an already damaged pool, the spare will be +# activated +# +# STRATEGY: +# 1. Create 1 storage pool without hot spares +# 2. Fail one vdev by using zinject to degrade or fault it +# 3. Verify that it gets degraded or faulted, respectively +# 4. Add a hotspare +# 5. Verify that the spare is in use. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2012-08-10) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + + partition_cleanup +} + +function verify_assertion # damage_type +{ + typeset damage=$1 + typeset err_dev=${devarray[3]} + typeset mntp=$(get_prop mountpoint $TESTPOOL) + + log_must $ZINJECT -d $err_dev -A $damage $TESTPOOL + log_must check_state $TESTPOOL $err_dev ${damage_status[$damage]} + + # Add the spare, and check that it is in use + log_must $ZPOOL add $TESTPOOL spare $sdev + for ((timeout=0; $timeout<10; timeout=$timeout+1)); do + if check_state $TESTPOOL "$sdev" "INUSE"; then + break + fi + $SLEEP 6 + done + log_must $ZPOOL status $TESTPOOL + log_must check_state $TESTPOOL "$sdev" "INUSE" +} + +log_onexit cleanup + +log_assert "A spare that is added to a degraded pool will be activated" + +ensure_zfsd_running +set_devs + +typeset sdev="${sparedevs[0]}" +typeset -A damage_status +damage_status["degrade"]="DEGRADED" +damage_status["fault"]="FAULTED" + +set -A my_keywords "mirror" "raidz1" "raidz2" + +for keyword in "${my_keywords[@]}"; do + for damage in "degrade" "fault"; do + log_must create_pool $TESTPOOL $keyword ${pooldevs[@]} + verify_assertion $damage + destroy_pool $TESTPOOL + done +done diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_006_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_006_pos.ksh new file mode 100644 index 00000000000..b5957ea7294 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_006_pos.ksh @@ -0,0 +1,144 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2014 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_hotspare_004_pos +# +# DESCRIPTION: +# If two vdevs get removed from a pool with two spares at the same time, +# both spares will be activated. +# +# +# STRATEGY: +# 1. Create 1 storage pool with two hot spares. +# 2. Stop the zfsd process. +# 3. Fault two vdevs +# 4. Resume the zfsd process +# 5. Verify that the spares are in use. +# 6. Pause zfsd +# 7. Clear the errors on the faulted vdevs +# 8. Resume zfsd +# 9. Verify that the vdevs ges resilvered and the spares get removed +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2014-05-13) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup + $KILL -s SIGCONT `$PGREP zfsd` +} + +function verify_assertion # spare_dev +{ + typeset err_dev1=${devarray[3]} + typeset err_dev2=${devarray[4]} + typeset sdev=$1 + + $KILL -s SIGSTOP `$PGREP zfsd` + + log_must $ZINJECT -d $err_dev1 -A fault $TESTPOOL + log_must $ZINJECT -d $err_dev2 -A fault $TESTPOOL + log_must check_state $TESTPOOL $err_dev1 "FAULTED" + log_must check_state $TESTPOOL $err_dev2 "FAULTED" + + $KILL -s SIGCONT `$PGREP zfsd` + + # ZFSD can take up to 60 seconds to degrade an array in response to + # errors (though it's usually faster). + for ((timeout=0; $timeout<10; timeout=$timeout+1)); do + check_state $TESTPOOL "$sdev0" "INUSE" + cond1=$? + check_state $TESTPOOL "$sdev1" "INUSE" + cond2=$? + if [[ $cond1 -eq 0 && $cond2 -eq 0 ]]; then + break + fi + $SLEEP 6 + done + log_must $ZPOOL status $TESTPOOL + log_must check_state $TESTPOOL "$sdev1" "INUSE" + log_must check_state $TESTPOOL "$sdev2" "INUSE" + + $KILL -s SIGSTOP `$PGREP zfsd` + $ZPOOL clear $TESTPOOL + $KILL -s SIGCONT `$PGREP zfsd` + + for ((timeout=0; $timeout<10; timeout=$timeout+1)); do + check_state $TESTPOOL "$sdev0" "AVAIL" + cond1=$? + check_state $TESTPOOL "$sdev1" "AVAIL" + cond2=$? + if [[ $cond1 -eq 0 && $cond2 -eq 0 ]]; then + break + fi + $SLEEP 6 + done + log_must $ZPOOL status $TESTPOOL + log_must check_state $TESTPOOL "$sdev1" "AVAIL" + log_must check_state $TESTPOOL "$sdev2" "AVAIL" + + # do cleanup + destroy_pool $TESTPOOL +} + + +log_assert "Two simultaneously faulted vdevs will be replaced by available spares" + +log_onexit cleanup + +ensure_zfsd_running +set_devs +typeset sdev0="${devarray[0]}" +typeset sdev1="${devarray[1]}" + +set -A my_keywords "mirror" "raidz2" +for keyword in "${my_keywords[@]}" ; do + setup_hotspares "$keyword" + verify_assertion $sdev +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_007_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_007_pos.ksh new file mode 100644 index 00000000000..8dd67e19aec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_007_pos.ksh @@ -0,0 +1,106 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)hotspare_replace_006_pos.ksh 1.0 12/08/10 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib +. $STF_SUITE/include/libgnop.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfs_hotspare_007_pos +# +# DESCRIPTION: +# If a vdev gets removed from a pool with a spare while zfsd is shut +# down, then the spare will be activated when zfsd restarts +# +# +# STRATEGY: +# 1. Create 1 storage pools with hot spares. +# 2. Turn off zfsd +# 3. Remove one vdev +# 4. Restart zfsd +# 5. Verify that the spare is in use. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2014-09-17) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +log_assert "zfsd will spare missing drives on startup" + + +function verify_assertion # spare_dev +{ + typeset spare_dev=$1 + stop_zfsd + + log_must destroy_gnop $REMOVAL_DISK + + # Check to make sure ZFS sees the disk as removed + wait_for_pool_removal 20 + + restart_zfsd + + # Check that the spare was activated + wait_for_pool_dev_state_change 20 $spare_dev INUSE + + # Re-enable the missing disk + log_must create_gnop $REMOVAL_DISK $PHYSPATH +} + +typeset PHYSPATH="some_physical_path" +typeset REMOVAL_DISK=$DISK0 +typeset REMOVAL_NOP=${DISK0}.nop +typeset SPARE_DISK=$DISK4 +typeset SPARE_NOP=${DISK4}.nop +typeset OTHER_DISKS="${DISK1} ${DISK2} ${DISK3}" +typeset OTHER_NOPS=${OTHER_DISKS//~(E)([[:space:]]+|$)/.nop\1} +set -A MY_KEYWORDS "mirror" "raidz1" "raidz2" +ensure_zfsd_running +log_must create_gnops $OTHER_DISKS $SPARE_DISK +log_must create_gnop $REMOVAL_DISK $PHYSPATH +for keyword in "${MY_KEYWORDS[@]}" ; do + log_must create_pool $TESTPOOL $keyword $REMOVAL_NOP $OTHER_NOPS spare $SPARE_NOP + log_must $ZPOOL set autoreplace=on $TESTPOOL + iterate_over_hotspares verify_assertion $SPARE_NOP + + destroy_pool "$TESTPOOL" +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_008_neg.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_008_neg.ksh new file mode 100644 index 00000000000..cbf90b7c38e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_hotspare_008_neg.ksh @@ -0,0 +1,83 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2017 Spectra Logic. All rights reserved. +# Use is subject to license terms. + +. $STF_SUITE/tests/hotspare/hotspare.kshlib + +verify_runnable "global" + +function cleanup +{ + $ZPOOL status $TESTPOOL + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + + partition_cleanup +} + +function verify_assertion # damage_type +{ + typeset mntp=$(get_prop mountpoint $TESTPOOL) + + # Write some data to the pool so the replacing vdev doesn't complete + # immediately. + $TIMEOUT 60s $DD if=/dev/zero of=$mntp/zerofile bs=131072 + + log_must $ZINJECT -d $FAULT_DISK -A fault $TESTPOOL + log_must check_state $TESTPOOL $FAULT_DISK FAULTED + + # Replace the failed device. Realistically, the new device would have + # the same physical path as the failed one, but it doesn't matter for + # our purposes. + log_must $ZPOOL replace $TESTPOOL $FAULT_DISK $REPLACEMENT_DISK + + # Add the spare, and check that it does not activate + log_must $ZPOOL add $TESTPOOL spare $SDEV + + # Wait a few seconds before verifying the state + $SLEEP 10 + log_must check_state $TESTPOOL "$SDEV" "AVAIL" +} + +log_onexit cleanup + +log_assert "zfsd will not use newly added spares on replacing vdevs" + +ensure_zfsd_running + +typeset FAULT_DISK=$DISK0 +typeset REPLACEMENT_DISK=$DISK2 +typeset SDEV=$DISK3 +typeset POOLDEVS="$DISK0 $DISK1" +set -A MY_KEYWORDS "mirror" +for keyword in "${MY_KEYWORDS[@]}" ; do + log_must create_pool $TESTPOOL $keyword $POOLDEVS + verify_assertion + + destroy_pool "$TESTPOOL" +done diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_import_001_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_import_001_pos.ksh new file mode 100644 index 00000000000..cd489d8d643 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_import_001_pos.ksh @@ -0,0 +1,152 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zfsd_zfsd_002_pos.ksh 1.0 12/08/10 SL" +# +. $STF_SUITE/tests/hotspare/hotspare.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib +. $STF_SUITE/include/libgnop.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zfsd_import_001_pos +# +# DESCRIPTION: +# If a removed drive gets reinserted while the pool is exported, it will +# replace its spare when reimported. +# +# This also applies to drives that get reinserted while the machine is +# powered off. +# +# +# STRATEGY: +# 1. Create 1 storage pools with hot spares. +# 2. Remove one disk +# 3. Verify that the spare is in use. +# 4. Export the pool +# 5. Recreate the vdev +# 6. Import the pool +# 7. Verify that the vdev gets resilvered and the spare gets removed +# 8. Use additional zpool history data to verify that the pool +# finished resilvering _before_ zfsd detached the spare. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING STATUS: COMPLETED (2012-08-10) +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "global" + +function verify_assertion # spare_dev +{ + typeset spare_dev=$1 + log_must destroy_gnop $REMOVAL_DISK + + # Check to make sure ZFS sees the disk as removed + wait_for_pool_removal 20 + + # Wait for zfsd to activate the spare + wait_for_pool_dev_state_change 20 $spare_dev INUSE + log_must $ZPOOL status $TESTPOOL + + # Export the pool + log_must $ZPOOL export $TESTPOOL + + # Re-enable the missing disk + log_must create_gnop $REMOVAL_DISK + + # Import the pool + log_must $ZPOOL import $TESTPOOL + + # Check that the disk has rejoined the pool + wait_for_pool_dev_state_change 20 $REMOVAL_DISK ONLINE + + # Check that the pool resilvered + while ! is_pool_resilvered $TESTPOOL; do + $SLEEP 2 + done + log_must $ZPOOL status $TESTPOOL + + #Finally, check that the spare deactivated + wait_for_pool_dev_state_change 20 $spare_dev AVAIL + + # Verify that the spare was detached after the scrub was complete + # Note that resilvers and scrubs are recorded identically in zpool + # history + $ZPOOL history -i $TESTPOOL | awk ' + BEGIN { + scrub_txg=0; + detach_txg=0 + } + /scrub done/ { + split($6, s, "[:\\]]"); + t=s[2]; + scrub_txg = scrub_txg > t ? scrub_txg : t + } + /vdev detach/ { + split($6, s, "[:\\]]"); + t=s[2]; + done_txg = done_txg > t ? done_txg : t + } + END { + print("Scrub completed at txg", scrub_txg); + print("Spare detached at txg", detach_txg); + exit(detach_txg > scrub_txg) + }' + [ $? -ne 0 ] && log_fail "The spare detached before the resilver completed" +} + + +log_assert "If a removed drive gets reinserted while the pool is exported, \ + it will replace its spare when reinserted." + +ensure_zfsd_running + +typeset REMOVAL_DISK=$DISK0 +typeset REMOVAL_NOP=${DISK0}.nop +typeset SPARE_DISK=$DISK4 +typeset SPARE_NOP=${DISK4}.nop +typeset OTHER_DISKS="${DISK1} ${DISK2} ${DISK3}" +typeset OTHER_NOPS=${OTHER_DISKS//~(E)([[:space:]]+|$)/.nop\1} +set -A MY_KEYWORDS "mirror" "raidz1" "raidz2" +ensure_zfsd_running +log_must create_gnops $REMOVAL_DISK $OTHER_DISKS $SPARE_DISK +for keyword in "${MY_KEYWORDS[@]}" ; do + log_must create_pool $TESTPOOL $keyword $REMOVAL_NOP $OTHER_NOPS spare $SPARE_NOP + verify_assertion + destroy_pool "$TESTPOOL" +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_001_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_001_pos.ksh new file mode 100644 index 00000000000..21850af96f9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_001_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright 2012,2013 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# Portions taken from: +# ident "@(#)replacement_001_pos.ksh 1.4 08/02/27 SMI" +# +# $FreeBSD$ + +. $STF_SUITE/tests/hotspare/hotspare.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/include/libgnop.kshlib + +log_assert "ZFSD will automatically replace a SAS disk that disappears and reappears in the same location, with the same devname" + +ensure_zfsd_running + +set_disks + +typeset REMOVAL_DISK=$DISK0 +typeset REMOVAL_NOP=${DISK0}.nop +typeset OTHER_DISKS="${DISK1} ${DISK2}" +typeset ALLDISKS="${DISK0} ${DISK1} ${DISK2}" +typeset ALLNOPS=${ALLDISKS//~(E)([[:space:]]+|$)/.nop\1} + +log_must create_gnops $ALLDISKS +for type in "raidz" "mirror"; do + # Create a pool on the supplied disks + create_pool $TESTPOOL $type $ALLNOPS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + # Disable the first disk. + log_must destroy_gnop $REMOVAL_DISK + + # Write out data to make sure we can do I/O after the disk failure + log_must $DD if=/dev/zero of=$TESTDIR/$TESTFILE bs=1m count=1 + log_must $FSYNC $TESTDIR/$TESTFILE + + # Check to make sure ZFS sees the disk as removed + wait_for_pool_dev_state_change 20 $REMOVAL_NOP REMOVED + + # Re-enable the disk + log_must create_gnop $REMOVAL_DISK + + # Disk should auto-join the zpool & be resilvered. + wait_for_pool_dev_state_change 20 $REMOVAL_NOP ONLINE + wait_until_resilvered + + $ZPOOL status $TESTPOOL + destroy_pool $TESTPOOL + log_must $RM -rf /$TESTPOOL +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_002_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_002_pos.ksh new file mode 100644 index 00000000000..1cc86e80164 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_002_pos.ksh @@ -0,0 +1,76 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright 2012-2018 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# Portions taken from: +# ident "@(#)replacement_001_pos.ksh 1.4 08/02/27 SMI" +# +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/include/libgnop.kshlib + +function is_pool_unavail # pool +{ + is_pool_state "$1" "UNAVAIL" +} + +log_assert "zfsd will reactivate a pool after all disks are failed and reappeared" + +log_unsupported "This feature has not yet been implemented in zfsd" + +ensure_zfsd_running +set_disks +typeset ALLDISKS="${DISK0} ${DISK1} ${DISK2}" +typeset ALLNOPS=${ALLDISKS//~(E)([[:space:]]+|$)/.nop\1} + +log_must create_gnops $ALLDISKS +for type in "raidz" "mirror"; do + # Create a pool on the supplied disks + create_pool $TESTPOOL $type $ALLNOPS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + # Disable all vdevs. The pool should become UNAVAIL + log_must destroy_gnop $DISK0 + log_must destroy_gnop $DISK1 + log_must destroy_gnop $DISK2 + wait_for 5 1 is_pool_unavail $TESTPOOL + + # Renable all vdevs. The pool should become healthy again + log_must create_gnop $DISK0 + log_must create_gnop $DISK1 + log_must create_gnop $DISK2 + + wait_for 5 1 is_pool_healthy $TESTPOOL + + destroy_pool $TESTPOOL + log_must $RM -rf /$TESTPOOL +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_003_pos.ksh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_003_pos.ksh new file mode 100644 index 00000000000..328c08e53c1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_replace_003_pos.ksh @@ -0,0 +1,125 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright 2012,2013 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# +# Portions taken from: +# ident "@(#)replacement_001_pos.ksh 1.4 08/02/27 SMI" +# +# $FreeBSD$ + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/include/libgnop.kshlib +. $STF_SUITE/tests/hotspare/hotspare.kshlib +. $STF_SUITE/tests/zfsd/zfsd.kshlib + +function cleanup +{ + destroy_pool $TESTPOOL + [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + for md in $MD0 $MD1 $MD2 $MD3; do + gnop destroy -f $md + for ((i=0; i<5; i=i+1)); do + $MDCONFIG -d -u $md && break + $SLEEP 1 + done + done +} + +log_assert "ZFSD will correctly replace disks that disappear and reappear \ + with different devnames" + +# Outline +# Use gnop on top of file-backed md devices +# * file-backed md devices so we can destroy them and recreate them with +# different devnames +# * gnop so we can destroy them while still in use +# Create a double-parity pool +# Remove two vdevs +# Destroy the md devices and recreate in the opposite order +# Check that the md's devnames have swapped +# Verify that the pool regains its health + +log_onexit cleanup +ensure_zfsd_running + + +N_DEVARRAY_FILES=4 +set_devs +typeset FILE0="${devarray[0]}" +typeset FILE1="${devarray[1]}" +typeset FILE2="${devarray[2]}" +typeset FILE3="${devarray[3]}" +typeset MD0=`$MDCONFIG -a -t vnode -f ${FILE0}` +[ $? -eq 0 ] || atf_fail "Failed to create md device" +typeset MD1=`$MDCONFIG -a -t vnode -f ${FILE1}` +[ $? -eq 0 ] || atf_fail "Failed to create md device" +typeset MD2=`$MDCONFIG -a -t vnode -f ${FILE2}` +[ $? -eq 0 ] || atf_fail "Failed to create md device" +typeset MD3=`$MDCONFIG -a -t vnode -f ${FILE3}` +[ $? -eq 0 ] || atf_fail "Failed to create md device" +log_must create_gnops $MD0 $MD1 $MD2 $MD3 + +for type in "raidz2" "mirror"; do + # Create a pool on the supplied disks + create_pool $TESTPOOL $type ${MD0}.nop ${MD1}.nop ${MD2}.nop ${MD3}.nop + + log_must destroy_gnop $MD0 + for ((i=0; i<5; i=i+1)); do + $MDCONFIG -d -u $MD0 && break + $SLEEP 1 + done + [ -c /dev/$MD0.nop ] && atf_fail "failed to destroy $MD0" + log_must destroy_gnop $MD1 + for ((i=0; i<5; i=i+1)); do + $MDCONFIG -d -u $MD1 && break + $SLEEP 1 + done + [ -c /dev/$MD1.nop ] && atf_fail "failed to destroy $MD0" + + # Make sure that the pool is degraded + $ZPOOL status $TESTPOOL |grep "state:" |grep DEGRADED > /dev/null + if [ $? != 0 ]; then + log_fail "Pool $TESTPOOL not listed as DEGRADED" + fi + + # Do some I/O to ensure that the old vdevs will be out of date + log_must $DD if=/dev/random of=/$TESTPOOL/randfile bs=1m count=1 + log_must $SYNC + + # Recreate the vdevs in the opposite order + typeset MD0=`$MDCONFIG -a -t vnode -f ${FILE1}` + [ $? -eq 0 ] || atf_fail "Failed to create md device" + typeset MD1=`$MDCONFIG -a -t vnode -f ${FILE0}` + [ $? -eq 0 ] || atf_fail "Failed to create md device" + log_must create_gnops $MD0 $MD1 + + wait_until_resilvered + destroy_pool $TESTPOOL +done + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zfsd/zfsd_test.sh b/tests/sys/cddl/zfs/tests/zfsd/zfsd_test.sh new file mode 100755 index 00000000000..ebbc84a382c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zfsd/zfsd_test.sh @@ -0,0 +1,591 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012,2013 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zfsd_fault_001_pos cleanup +zfsd_fault_001_pos_head() +{ + atf_set "descr" "ZFS will fault a vdev that produces IO errors" + atf_set "require.progs" zfs zpool zfsd + atf_set "timeout" 300 +} +zfsd_fault_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_fault_001_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_fault_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfsd_degrade_001_pos cleanup +zfsd_degrade_001_pos_head() +{ + atf_set "descr" "ZFS will degrade a vdev that produces checksum errors" + atf_set "require.progs" zpool zfsd + atf_set "timeout" 600 +} +zfsd_degrade_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + verify_disk_count "$DISKS" 2 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_degrade_001_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_degrade_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_degrade_002_pos cleanup +zfsd_degrade_002_pos_head() +{ + atf_set "descr" "ZFS will degrade a spare that produces checksum errors" + atf_set "require.progs" zpool zfsd + atf_set "timeout" 600 +} +zfsd_degrade_002_pos_body() +{ + atf_expect_fail "https://www.illumos.org/issues/8614 Checksum errors on a mirrored child of a raidz are incorrectly accounted" + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_degrade_002_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_degrade_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfsd_hotspare_001_pos cleanup +zfsd_hotspare_001_pos_head() +{ + atf_set "descr" "An active, damaged spare will be replaced by an available spare" + atf_set "require.progs" zpool zfsd + atf_set "timeout" 3600 +} +zfsd_hotspare_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_hotspare_001_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_hotspare_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_hotspare_002_pos cleanup +zfsd_hotspare_002_pos_head() +{ + atf_set "descr" "If a vdev becomes degraded, the spare will be activated." + atf_set "require.progs" zpool zfsd zinject + atf_set "timeout" 3600 +} +zfsd_hotspare_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_hotspare_002_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_hotspare_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfsd_hotspare_003_pos cleanup +zfsd_hotspare_003_pos_head() +{ + atf_set "descr" "A faulted vdev will be replaced by an available spare" + atf_set "require.progs" zpool zfsd zinject + atf_set "timeout" 3600 +} +zfsd_hotspare_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_hotspare_003_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_hotspare_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_hotspare_004_pos cleanup +zfsd_hotspare_004_pos_head() +{ + atf_set "descr" "Removing a disk from a pool results in the spare activating" + atf_set "require.progs" gnop zpool camcontrol zfsd + atf_set "timeout" 3600 +} +zfsd_hotspare_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_hotspare_004_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_hotspare_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_hotspare_005_pos cleanup +zfsd_hotspare_005_pos_head() +{ + atf_set "descr" "A spare that is added to a degraded pool will be activated" + atf_set "require.progs" zpool zfsd zinject + atf_set "timeout" 3600 +} +zfsd_hotspare_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_hotspare_005_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_hotspare_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_hotspare_006_pos cleanup +zfsd_hotspare_006_pos_head() +{ + atf_set "descr" "zfsd will replace two vdevs that fail simultaneously" + atf_set "require.progs" zpool zfsd zinject + atf_set "timeout" 3600 +} +zfsd_hotspare_006_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_hotspare_006_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_hotspare_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_hotspare_007_pos cleanup +zfsd_hotspare_007_pos_head() +{ + atf_set "descr" "zfsd will swap failed drives at startup" + atf_set "require.progs" gnop zpool camcontrol zfsd + atf_set "timeout" 3600 +} +zfsd_hotspare_007_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_hotspare_007_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_hotspare_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_hotspare_008_neg cleanup +zfsd_hotspare_008_neg_head() +{ + atf_set "descr" "zfsd will not use newly added spares on replacing vdevs" + atf_set "require.progs" zpool zfsd + atf_set "timeout" 3600 +} +zfsd_hotspare_008_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + verify_disk_count "$DISKS" 4 + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_hotspare_008_neg.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_hotspare_008_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/hotspare_cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_autoreplace_001_neg cleanup +zfsd_autoreplace_001_neg_head() +{ + atf_set "descr" "A pool without autoreplace set will not replace by physical path" + atf_set "require.progs" zpool camcontrol zfsd gnop + atf_set "timeout" 3600 +} +zfsd_autoreplace_001_neg_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_autoreplace_001_neg.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_autoreplace_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_autoreplace_002_pos cleanup +zfsd_autoreplace_002_pos_head() +{ + atf_set "descr" "A pool with autoreplace set will replace by physical path" + atf_set "require.progs" gnop zpool zfsd + atf_set "timeout" 3600 +} +zfsd_autoreplace_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_autoreplace_002_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_autoreplace_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_autoreplace_003_pos cleanup +zfsd_autoreplace_003_pos_head() +{ + atf_set "descr" "A pool with autoreplace set will replace by physical path even if a spare is active" + atf_set "require.progs" zpool camcontrol zfsd gnop + atf_set "timeout" 3600 +} +zfsd_autoreplace_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/hotspare_setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_autoreplace_003_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_autoreplace_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_replace_001_pos cleanup +zfsd_replace_001_pos_head() +{ + atf_set "descr" "ZFSD will automatically replace a SAS disk that disappears and reappears in the same location, with the same devname" + atf_set "require.progs" zpool camcontrol zfsd zfs gnop +} +zfsd_replace_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + verify_disk_count "$DISKS" 3 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_replace_001_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_replace_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zfsd_replace_002_pos cleanup +zfsd_replace_002_pos_head() +{ + atf_set "descr" "zfsd will reactivate a pool after all disks are failed and reappeared" + atf_set "require.progs" zpool camcontrol zfsd zfs +} +zfsd_replace_002_pos_body() +{ + atf_expect_fail "Not yet implemented in zfsd" + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + verify_disk_count "$DISKS" 3 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_replace_002_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_replace_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_replace_003_pos cleanup +zfsd_replace_003_pos_head() +{ + atf_set "descr" "ZFSD will correctly replace disks that dissapear and reappear with different devnames" + atf_set "require.progs" zpool camcontrol zfsd zfs gnop +} +zfsd_replace_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_replace_003_pos.ksh + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_replace_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zfsd.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + +atf_test_case zfsd_import_001_pos cleanup +zfsd_import_001_pos_head() +{ + atf_set "descr" "If a removed drive gets reinserted while the pool is exported, it will detach its spare when imported." + atf_set "require.progs" gnop zfsd zpool + atf_set "timeout" 3600 +} +zfsd_import_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + verify_disk_count "$DISKS" 5 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zfsd_import_001_pos.ksh || atf_fail "Testcase failed" + if [[ $? != 0 ]]; then + save_artifacts + atf_fail "Testcase failed" + fi +} +zfsd_import_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/../hotspare/hotspare.kshlib + . $(atf_get_srcdir)/../hotspare/hotspare.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + + + +atf_init_test_cases() +{ + atf_add_test_case zfsd_fault_001_pos + atf_add_test_case zfsd_degrade_001_pos + atf_add_test_case zfsd_degrade_002_pos + atf_add_test_case zfsd_hotspare_001_pos + atf_add_test_case zfsd_hotspare_002_pos + atf_add_test_case zfsd_hotspare_003_pos + atf_add_test_case zfsd_hotspare_004_pos + atf_add_test_case zfsd_hotspare_005_pos + atf_add_test_case zfsd_hotspare_006_pos + atf_add_test_case zfsd_hotspare_007_pos + atf_add_test_case zfsd_hotspare_008_neg + atf_add_test_case zfsd_autoreplace_001_neg + atf_add_test_case zfsd_autoreplace_002_pos + atf_add_test_case zfsd_autoreplace_003_pos + atf_add_test_case zfsd_replace_001_pos + atf_add_test_case zfsd_replace_002_pos + atf_add_test_case zfsd_replace_003_pos + atf_add_test_case zfsd_import_001_pos +} + +save_artifacts() +{ + # If ARTIFACTS_DIR is defined, save test artifacts for + # post-mortem analysis + if [[ -n $ARTIFACTS_DIR ]]; then + TC_ARTIFACTS_DIR=${ARTIFACTS_DIR}/sys/cddl/zfs/tests/zfsd/$(atf_get ident) + mkdir -p $TC_ARTIFACTS_DIR + cp -a /var/log/zfsd.log* $TC_ARTIFACTS_DIR + bzip2 $TC_ARTIFACTS_DIR/zfsd.log + fi +} diff --git a/tests/sys/cddl/zfs/tests/zil/Makefile b/tests/sys/cddl/zfs/tests/zil/Makefile new file mode 100644 index 00000000000..e687082a998 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zil/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zil +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zil_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zil_002_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zil.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zil_001_pos.ksh +${PACKAGE}FILES+= zil.kshlib + +.include diff --git a/tests/sys/cddl/zfs/tests/zil/cleanup.ksh b/tests/sys/cddl/zfs/tests/zil/cleanup.ksh new file mode 100644 index 00000000000..b654547db7e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zil/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +# The tests may leave the drive in an exported state, so we must explicitly +# clear its label with labelclear instead of relying on zpool destroy +DISK=${DISKS%% *} +$ZPOOL destroy -f $TESTPOOL +[ -n "$DISK" ] && $ZPOOL labelclear -f $DISK +log_pass diff --git a/tests/sys/cddl/zfs/tests/zil/setup.ksh b/tests/sys/cddl/zfs/tests/zil/setup.ksh new file mode 100644 index 00000000000..02542a3de5f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zil/setup.ksh @@ -0,0 +1,37 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# + +. ${STF_SUITE}/include/libtest.kshlib + +DISK=${DISKS%% *} + +default_setup_noexit $DISK +log_must $ZFS set compression=on $TESTPOOL + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zil/zil.cfg b/tests/sys/cddl/zfs/tests/zil/zil.cfg new file mode 100644 index 00000000000..54a712bd1bd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zil/zil.cfg @@ -0,0 +1,31 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# + +export POOLSIZE=1073741824 # 100MiB +export BLOCK_SIZE=4096 diff --git a/tests/sys/cddl/zfs/tests/zil/zil.kshlib b/tests/sys/cddl/zfs/tests/zil/zil.kshlib new file mode 100644 index 00000000000..fab39a695d6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zil/zil.kshlib @@ -0,0 +1,55 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# + +# Every test must restart the frozen pool state. +function zil_setup +{ + log_must $ZPOOL list $TESTPOOL + + # In order for a frozen zpool to have a ZIL, it is necessary to + # sync it first. If a sync is not done first, no ZIL will exist, + # and consequently no post-freeze log records will be created. + log_must $TOUCH $TESTDIR/initial_data + log_must $FSYNC $TESTDIR/initial_data + log_must $ZPOOL freeze $TESTPOOL + log_must filesys_has_zil $TESTPOOL + return 0 +} + +function zil_reimport_pool +{ + typeset pool="$1" + log_must filesys_has_zil $pool + log_must pool_maps_intact $pool + log_must $ZPOOL export $pool + log_must $ZPOOL import $pool + log_must pool_maps_intact $pool + log_mustnot filesys_has_zil $pool + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/zil/zil_001_pos.ksh b/tests/sys/cddl/zfs/tests/zil/zil_001_pos.ksh new file mode 100644 index 00000000000..a6d27746287 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zil/zil_001_pos.ksh @@ -0,0 +1,84 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zil/zil.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zil_001_pos +# +# DESCRIPTION: +# +# XXX XXX XXX +# +# STRATEGY: +# 1) XXX +# 2) XXX +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (YYYY-MM-DD) XXX +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +function cleanup +{ + log_must $LS -lr $TESTDIR + log_must $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Verify that basic files and directory operations work" + +zil_setup +log_must $TOUCH $TESTDIR/0 +log_must $MV $TESTDIR/0 $TESTDIR/1 +log_must ln -s $TESTDIR/1 $TESTDIR/2 +log_must ln $TESTDIR/1 $TESTDIR/3 +log_must $MKDIR $TESTDIR/4 +log_must $RMDIR $TESTDIR/4 + +zil_reimport_pool $TESTPOOL +log_mustnot test -f $TESTDIR/0 +log_must test -f $TESTDIR/1 +log_must test -L $TESTDIR/2 +log_must test -e $TESTDIR/3 +log_mustnot test -d $TESTDIR/4 + +log_pass "Success running basic files and directory operations" diff --git a/tests/sys/cddl/zfs/tests/zil/zil_002_pos.ksh b/tests/sys/cddl/zfs/tests/zil/zil_002_pos.ksh new file mode 100644 index 00000000000..3d757c7ef1f --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zil/zil_002_pos.ksh @@ -0,0 +1,106 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic Corporation. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zil/zil.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zil_002_pos +# +# DESCRIPTION: +# +# XXX XXX XXX +# +# STRATEGY: +# 1) XXX +# 2) XXX +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (YYYY-MM-DD) XXX +# +# __stc_assertion_end +# +############################################################################### + +verify_runnable "both" + +td5=$TESTDIR/5 +tf1=$td5/1 +tf2=$td5/2 +tf3=$td5/3 +file_size=`expr $POOLSIZE / 4` +write_count=`expr $file_size / $BLOCK_SIZE` + +function check_file +{ + typeset fname="$1" + typeset -i expected_size="$2" + + log_must test -f $fname + log_must test $expected_size == $(size_of_file $fname) +} + +function cleanup +{ + ls -lr $TESTDIR + log_must $RM -rf $TESTDIR/* +} + +log_onexit cleanup + +log_assert "Verify that creating and deleting content works" + +# Run the pre-export tests. +zil_setup +log_must $MKDIR $td5 +log_must $FILE_WRITE -o create -f $tf1 -b $BLOCK_SIZE -c $write_count -d 0 +check_file $tf1 $file_size +log_must $CP $tf1 $tf2 +log_must $CP $tf2 $tf3 +check_file $tf2 $file_size +log_must $CMP $tf1 $tf2 +log_must $RM -f $tf3 + +# Now run the post-export tests. +zil_reimport_pool $TESTPOOL +check_file $tf1 $file_size +check_file $tf2 $file_size +log_must $CMP $tf1 $tf2 +log_mustnot test -f $tf3 +log_must test -f $tf1 +cur_file_size=$(size_of_file $tf1) +log_must test $file_size -eq $cur_file_size + +log_pass "Success creating and deleting content" diff --git a/tests/sys/cddl/zfs/tests/zil/zil_test.sh b/tests/sys/cddl/zfs/tests/zil/zil_test.sh new file mode 100755 index 00000000000..05b5fddf936 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zil/zil_test.sh @@ -0,0 +1,86 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zil_001_pos cleanup +zil_001_pos_head() +{ + atf_set "descr" "Verify that basic files and directory operations work" + atf_set "require.progs" zfs zpool zdb +} +zil_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zil.kshlib + . $(atf_get_srcdir)/zil.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zil_001_pos.ksh || atf_fail "Testcase failed" +} +zil_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zil.kshlib + . $(atf_get_srcdir)/zil.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zil_002_pos cleanup +zil_002_pos_head() +{ + atf_set "descr" "Verify that creating and deleting content works" + atf_set "require.progs" zfs zpool zdb +} +zil_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zil.kshlib + . $(atf_get_srcdir)/zil.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zil_002_pos.ksh || atf_fail "Testcase failed" +} +zil_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zil.kshlib + . $(atf_get_srcdir)/zil.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zil_001_pos + atf_add_test_case zil_002_pos +} diff --git a/tests/sys/cddl/zfs/tests/zinject/Makefile b/tests/sys/cddl/zfs/tests/zinject/Makefile new file mode 100644 index 00000000000..b8959760b17 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zinject +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zinject_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zinject.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zinject_004_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zinject_001_pos.ksh +${PACKAGE}FILES+= zinject.kshlib +${PACKAGE}FILES+= zinject_003_pos.ksh +${PACKAGE}FILES+= zinject_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/zinject/cleanup.ksh b/tests/sys/cddl/zfs/tests/zinject/cleanup.ksh new file mode 100644 index 00000000000..6112671338e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/cleanup.ksh @@ -0,0 +1,40 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.1 07/07/31 SMI" +# + +. $STF_SUITE/tests/zinject/zinject.kshlib + +verify_runnable "global" + +cleanup_env + +cleanup_devices $DISKS + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zinject/setup.ksh b/tests/sys/cddl/zfs/tests/zinject/setup.ksh new file mode 100644 index 00000000000..30038ac6a6a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/setup.ksh @@ -0,0 +1,52 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +verify_runnable "global" + +if [[ -n $DISK ]]; then + # + # Use 'zpool create' to clean up the infomation in + # in the given disk to avoid slice overlapping. + # + cleanup_devices $DISK + + partition_disk $SIZE $DISK 7 +else + for disk in `$ECHO $DISKSARRAY`; do + cleanup_devices $disk + + partition_disk $SIZE $disk 7 + done +fi + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zinject/zinject.cfg b/tests/sys/cddl/zfs/tests/zinject/zinject.cfg new file mode 100644 index 00000000000..d81f4d5b408 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/zinject.cfg @@ -0,0 +1,63 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zinject.cfg 1.3 09/05/19 SMI" +# + +. $STF_SUITE/tests/cli_root/cli.cfg +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cache/cache.kshlib + +if [[ -e /usr/sbin/zinject ]] ; then + export ZINJECT="/usr/sbin/zinject" +else + log_untested "zinject is not integrated." +fi + +export STF_TIMEOUT=1800 +export DISK_ARRAY_LIMIT=4 +export DISKSARRAY="" + +set_disks + +export SIZE="200m" + +export VDEV0=${DISK0}p1 +export VDEV1=${DISK0}p2 +export VDEV2=${DISK0}p3 +export VDEV3=${DISK0}p4 +export VDEV4=${DISK0}p5 +export VDEV5=${DISK0}p6 +export VDEV6=${DISK0}p7 + +export pooldevs="$VDEV0 $VDEV1 $VDEV2" +export sparedevs="$VDEV3" + +export logdevs="$VDEV4" + +export alldevs="$pooldevs $sparedevs $logdevs $cachedevs" diff --git a/tests/sys/cddl/zfs/tests/zinject/zinject.kshlib b/tests/sys/cddl/zfs/tests/zinject/zinject.kshlib new file mode 100644 index 00000000000..02520c3ed80 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/zinject.kshlib @@ -0,0 +1,227 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zinject.kshlib 1.6 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/cli_root/zfs_set/zfs_set_common.kshlib +. $STF_SUITE/tests/cache/cache.kshlib + +function cleanup_env +{ + inject_clear + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + [[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR +} + +# +# Inject an error into object +# $1: data,dnode,mos,mosdir,config,bplist,spacemap,metaslab,errlog +# $2: if $1 is data or dnode, $2 should be a file or dir. +# otherwise, $2 should be poolname +# $3: "io" or "checksum" +# $4: expect return value of zinject, default is 0 +# +function inject_fault #type, object, error, expect +{ + typeset type=$1 + typeset object=$2 + typeset error=${3:-io} + typeset -i expect=${4:-0} + + if (( expect == 0 )); then + log_must eval '$ZINJECT -t $type -e $error \ + -m -a -q $object > /dev/null 2>&1' + else + log_mustnot eval '$ZINJECT -t $type -e $error \ + -m -a -q $object > /dev/null 2>&1' + fi + $SLEEP 1 + return 0 +} + +# +# Clear all registrated handler and do scrub to keep integrity +# +function inject_clear +{ + log_must eval '$ZINJECT -c all > /dev/null 2>&1' + $SLEEP 1 + if poolexists $TESTPOOL ; then + while ! check_pool_status $TESTPOOL "state" "ONLINE" ; do + log_must $ZPOOL clear $TESTPOOL + $SLEEP 2 + done + log_must $ZPOOL scrub $TESTPOOL + while ! is_pool_scrubbed $TESTPOOL && ! is_pool_resilvered $TESTPOOL ; do + $SLEEP 2 + done + fi + return 0 +} + +# +# Inject a fault into a particular device +# $1: device name +# $2: pool name +# $3: errno, can either be 'nxio' (the default) or 'io'. +# +function inject_device #device, pool, errno +{ + typeset device=$1 + typeset pool=$2 + typeset errno=$3 + + log_must eval '$ZINJECT -d $device -e $errno -q $pool > /dev/null 2>&1' + $SLEEP 1 + return 0 +} + +# +# Check if the ereport is occurred after the given timestamp +# +function check_ereport #timestamp, etype +{ + typeset etime=$1 + typeset ereport + typeset -i i=0 + typeset -i maxtimes=20 + + shift + + for type in $@ ; do + i=0 + while (( i < maxtimes )); do + (( i = i + 1 )) + ereport=$($FMDUMP -t "$etime" -e -v -c $type | \ + $NAWK '(NR != 1) {print $0}') + if [[ -n $ereport ]]; then + break + elif (( i == maxtimes )) ; then + $FMDUMP -t "$etime" -e -v + log_fail "$type not found" + fi + $SLEEP 3 + done + done + return 0 +} + +# +# Check if the fault is occurred after the given timestamp +# +function check_fault #timestamp, fault_class +{ + typeset after_time=$1 + typeset ereport + typeset -i i=0 + typeset -i maxtimes=20 + + shift + + for fault in $@ ; do + i=0 + while (( i < maxtimes )); do + (( i = i + 1 )) + ereport=$($FMDUMP -av -t "$after_time" | $GREP $fault) + if [[ -n $ereport ]]; then + break + elif (( i == maxtimes )) ; then + $FMDUMP -av -t "$after_time" + log_fail "$fault not found" + fi + $SLEEP 3 + done + done + return 0 +} + +# +# Check if 'zpool status -v' contain the permanent error as expected +# +function check_status #poolname, errors +{ + typeset poolname=$1 + typeset errors=$2 + + for err in $errors ; do + ereport=$($ZPOOL status -v $poolname | $GREP "$err") + if [[ -z $ereport ]]; then + $ZPOOL status -v $poolname + log_fail "$err not found" + fi + done + return 0 +} + +# +# Invoke the trigger function according to the fault type corresponded +# +function trigger_inject #etype, object, objtype +{ + typeset etype=$1 + typeset object=$2 + typeset objtype=$3 + + if [[ $etype == "bplist" ]] ; then + $ECHO "ZFS Fault Harness" > $object + fi + + case $objtype in + dir) + $LS -l $object > /dev/null 2>&1 + ;; + file) + $CAT $object > /dev/null 2>&1 + ;; + esac +} + +function populate_test_env #basedir #count +{ + typeset basedir=$1 + typeset -i count=$2 + typeset -i i=1 + + if [[ -d $basedir ]]; then + log_must $RM -rf $basedir/* + else + log_must $MKDIR -p $basedir + fi + + while (( i <= count )); do + $ECHO "ZFS Fault Harness" > $basedir/testfile.$i + $MKDIR -p $basedir/testdir.$i + (( i = i + 1 )) + done + + return 0 +} diff --git a/tests/sys/cddl/zfs/tests/zinject/zinject_001_pos.ksh b/tests/sys/cddl/zfs/tests/zinject/zinject_001_pos.ksh new file mode 100644 index 00000000000..c602fea1c6a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/zinject_001_pos.ksh @@ -0,0 +1,147 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zinject_001_pos.ksh 1.3 09/06/22 SMI" +# + +############################################################################### +# +# __stc_assertion_start +# +# ID: zinject_001_pos +# +# DESCRIPTION: +# +# Inject an error into the plain file contents of a file. +# Verify fmdump will get the expect ereport +# +# STRATEGY: +# 1) Populate ZFS file system +# 2) Inject an error into the plain file contents of a file. +# 3) Verify fmdump get the ereport as expect. +# +# io ereport.fs.zfs.io +# ereport.fs.zfs.data +# checksum ereport.fs.zfs.checksum Non-stripe pool +# ereport.fs.zfs.data +# checksum ereport.fs.zfs.data Stripe pool only +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-02-01) +# +# __stc_assertion_end +# +################################################################################ + +. $STF_SUITE/tests/zinject/zinject.kshlib + +verify_runnable "global" + +log_assert "Verify fault inject handle content error successfully." +log_onexit cleanup_env + +set -A types "" "mirror" "raidz" "raidz2" + +typeset -i maxnumber=300 + +function test_zinject_unit +{ + typeset etype=$1 + typeset object=$2 + typeset errno=$3 + typeset ereport=$4 + typeset now + + typeset otype="file" + [[ -d $object ]] && otype="dir" + + now=`date '+%m/%d/%y %H:%M:%S'` + inject_fault $etype $object $errno + + trigger_inject $etype $object $otype + + log_must check_ereport "$now" $ereport + + log_must check_status $TESTPOOL $object + + inject_clear +} + +function test_zinject +{ + typeset basedir=$1 + typeset pooltype=$2 + typeset -i i=0 + typeset etype="data" + + set -A errset "io" "ereport.fs.zfs.io ereport.fs.zfs.data" + + ((i=${#errset[*]})) + if [[ -n $pooltype ]] ; then + errset[i]="checksum" + errset[((i+1))]="ereport.fs.zfs.checksum ereport.fs.zfs.data" + else + errset[i]="checksum" + errset[((i+1))]="ereport.fs.zfs.data" + fi + + i=0 + while ((i < ${#errset[*]} )); do + + for object in $basedir/testfile.$maxnumber \ + $basedir/testdir.$maxnumber ; do + + test_zinject_unit $etype $object \ + ${errset[i]} "${errset[((i+1))]}" + done + + (( i = i + 2 )) + done +} + +inject_clear +for type in "${types[@]}"; do + create_pool $TESTPOOL $type $pooldevs spare $sparedevs + + log_must $ZPOOL add -f $TESTPOOL log $logdevs + log_must $ZPOOL add -f $TESTPOOL cache $cachedevs + + log_must $ZPOOL replace $TESTPOOL $VDEV0 $sparedevs + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + populate_test_env $TESTDIR $maxnumber + test_zinject $TESTDIR $type + + cleanup_env +done + +log_pass "Fault inject handle content error successfully." diff --git a/tests/sys/cddl/zfs/tests/zinject/zinject_002_pos.ksh b/tests/sys/cddl/zfs/tests/zinject/zinject_002_pos.ksh new file mode 100644 index 00000000000..650b17c59bd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/zinject_002_pos.ksh @@ -0,0 +1,148 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zinject_002_pos.ksh 1.3 09/06/22 SMI" +# + +############################################################################### +# +# __stc_assertion_start +# +# ID: zinject_002_pos +# +# DESCRIPTION: +# +# Inject an error into the metadnode in the block +# corresponding to the dnode for a file or directory +# Verify fmdump will get the expect ereport +# +# STRATEGY: +# 1) Populate ZFS file system +# 2) Inject an error into the metadnode in the block. +# 3) Verify fmdump get the ereport as expect. +# +# io ereport.fs.zfs.io +# ereport.fs.zfs.data +# checksum ereport.fs.zfs.checksum Non-stripe pool +# ereport.fs.zfs.data +# checksum ereport.fs.zfs.data Stripe pool only +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-02-01) +# +# __stc_assertion_end +# +################################################################################ + +. $STF_SUITE/tests/zinject/zinject.kshlib + +verify_runnable "global" + +log_assert "Verify fault inject handle metadnode error successfully." +log_onexit cleanup_env + +set -A types "" "mirror" "raidz" "raidz2" + +typeset -i maxnumber=1 + +function test_zinject_unit +{ + typeset etype=$1 + typeset object=$2 + typeset errno=$3 + typeset ereport=$4 + typeset now + + typeset otype="file" + [[ -d $object ]] && otype="dir" + + now=`date '+%m/%d/%y %H:%M:%S'` + inject_fault $etype $object $errno + + trigger_inject $etype $object $otype + + log_must check_ereport "$now" $ereport + + log_must check_status $TESTPOOL "$TESTPOOL/$TESTFS:<0x0>" + + inject_clear +} + +function test_zinject +{ + typeset basedir=$1 + typeset pooltype=$2 + typeset -i i=0 + typeset etype="dnode" + + set -A errset "io" "ereport.fs.zfs.io ereport.fs.zfs.data" + + ((i=${#errset[*]})) + if [[ -n $pooltype ]] ; then + errset[i]="checksum" + errset[((i+1))]="ereport.fs.zfs.checksum ereport.fs.zfs.data" + else + errset[i]="checksum" + errset[((i+1))]="ereport.fs.zfs.data" + fi + + i=0 + while ((i < ${#errset[*]} )); do + for object in $basedir/testfile.$maxnumber \ + $basedir/testdir.$maxnumber ; do + test_zinject_unit $etype $object \ + ${errset[i]} "${errset[((i+1))]}" + done + + (( i = i + 2 )) + done +} + +inject_clear +for type in "${types[@]}"; do + create_pool $TESTPOOL $type $pooldevs spare $sparedevs + + log_must $ZPOOL add -f $TESTPOOL log $logdevs + log_must $ZPOOL add -f $TESTPOOL cache $cachedevs + + log_must $ZPOOL replace $TESTPOOL $VDEV0 $sparedevs + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + populate_test_env $TESTDIR/safe_dir 64 + populate_test_env $TESTDIR/bad_dir $maxnumber + + test_zinject $TESTDIR/bad_dir $type + + cleanup_env +done + +log_pass "Fault inject handle metadnode error successfully." diff --git a/tests/sys/cddl/zfs/tests/zinject/zinject_003_pos.ksh b/tests/sys/cddl/zfs/tests/zinject/zinject_003_pos.ksh new file mode 100644 index 00000000000..7ffe4cd960b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/zinject_003_pos.ksh @@ -0,0 +1,144 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zinject_003_pos.ksh 1.3 09/06/22 SMI" +# + +############################################################################### +# +# __stc_assertion_start +# +# ID: zinject_003_pos +# +# DESCRIPTION: +# +# Inject an error into the first metadnode in the block +# Verify the filesystem unmountable since dnode be injected. +# +# STRATEGY: +# 1) Populate ZFS file system +# 2) Inject an error into the first metadnode in the block. +# 3) Verify the filesystem unmountable, +# and 'zpool status -v' will display the error as expect. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-02-01) +# +# __stc_assertion_end +# +################################################################################ + +. $STF_SUITE/tests/zinject/zinject.kshlib + +verify_runnable "global" + +log_assert "Verify fault inject handle into first metadnode " \ + "cause filesystem unmountable." +log_onexit cleanup_env + +set -A types "" "mirror" "raidz" "raidz2" + +typeset -i maxnumber=1 + +function test_zinject_unit +{ + typeset etype=$1 + typeset object=$2 + typeset errno=$3 + typeset ereport=$4 + typeset now + + typeset otype="file" + [[ -d $object ]] && otype="dir" + + now=`date '+%m/%d/%y %H:%M:%S'` + inject_fault $etype $object $errno 1 + + unmounted $TESTPOOL/$TESTFS || \ + log_fail "$TESTPOOL/$TESTFS mount unexpected." + + log_must check_status $TESTPOOL "$TESTPOOL/$TESTFS:<0x0>" + + inject_clear + + log_must $ZFS mount -a +} + +function test_zinject +{ + typeset basedir=$1 + typeset pooltype=$2 + typeset -i i=0 + typeset etype="dnode" + + set -A errset "io" "ereport.fs.zfs.io ereport.fs.zfs.data" + + ((i=${#errset[*]})) + if [[ -n $pooltype ]] ; then + errset[i]="checksum" + errset[((i+1))]="ereport.fs.zfs.checksum ereport.fs.zfs.data" + else + errset[i]="checksum" + errset[((i+1))]="ereport.fs.zfs.data" + fi + + i=0 + while ((i < ${#errset[*]} )); do + for object in $basedir/testfile.$maxnumber \ + $basedir/testdir.$maxnumber ; do + test_zinject_unit $etype $object \ + ${errset[i]} "${errset[((i+1))]}" + done + + (( i = i + 2 )) + done +} + +inject_clear +for type in "${types[@]}"; do + create_pool $TESTPOOL $type $pooldevs spare $sparedevs + + log_must $ZPOOL add -f $TESTPOOL log $logdevs + log_must $ZPOOL add -f $TESTPOOL cache $cachedevs + + log_must $ZPOOL replace $TESTPOOL $VDEV0 $sparedevs + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + populate_test_env $TESTDIR/bad_dir $maxnumber + + test_zinject $TESTDIR/bad_dir $type + + cleanup_env +done + +log_pass "Fault inject handle into first metadnode " \ + "cause filesystem unmountable." diff --git a/tests/sys/cddl/zfs/tests/zinject/zinject_004_pos.ksh b/tests/sys/cddl/zfs/tests/zinject/zinject_004_pos.ksh new file mode 100644 index 00000000000..c149466466d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/zinject_004_pos.ksh @@ -0,0 +1,130 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zinject_004_pos.ksh 1.6 09/06/22 SMI" +# + +############################################################################### +# +# __stc_assertion_start +# +# ID: zinject_004_pos +# +# DESCRIPTION: +# +# Inject an error into the device of a pool. +# Verify fmdump will get the expect ereport, +# and the fault class of "fault.fs.zfs.vdev.io" be generated. +# +# STRATEGY: +# 1) Populate ZFS file system +# 2) Inject an error into the device of the pool. +# 3) Verify fmdump get the ereport as expected. +# +# nxio ereport.fs.zfs.probe_failure +# io ereport.fs.zfs.probe_failure +# 4) Verify the fault class of "fault.fs.zfs.vdev.io" be generated. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-05-31) +# +# __stc_assertion_end +# +################################################################################ + +. $STF_SUITE/tests/zinject/zinject.kshlib + +verify_runnable "global" + +log_assert "Verify fault inject handle device error successfully." +log_onexit cleanup_env + +set -A types "mirror" "raidz" "raidz2" + +typeset -i maxnumber=1 + +function test_zinject +{ + typeset basedir=$1 + typeset -i i=0 + typeset etype="device" + typeset fclass="fault.fs.zfs.vdev.io" + + set -A errset \ + "nxio" "ereport.fs.zfs.probe_failure" \ + "io" "ereport.fs.zfs.probe_failure" + + set -A alldevarray $alldevs + + for device in $(random_string alldevarray 1); do + i=0 + while ((i < ${#errset[*]} )); do + now=`date '+%m/%d/%y %H:%M:%S'` + inject_device $device $TESTPOOL ${errset[i]} + + trigger_inject $etype $basedir/testfile.$maxnumber "file" + log_must check_ereport "$now" ${errset[((i+1))]} + log_must check_fault "$now" $fclass + + inject_clear + + now=`date '+%m/%d/%y %H:%M:%S'` + inject_device $device $TESTPOOL ${errset[i]} + + trigger_inject $etype $basedir/testdir.$maxnumber "dir" + log_must check_ereport "$now" ${errset[((i+1))]} + log_must check_fault "$now" $fclass + + inject_clear + + (( i = i + 2 )) + done + done +} + +inject_clear +for type in "${types[@]}"; do + create_pool $TESTPOOL $type $pooldevs spare $sparedevs + + log_must $ZPOOL add -f $TESTPOOL log $logdevs + log_must $ZPOOL add -f $TESTPOOL cache $cachedevs + + log_must $ZPOOL replace $TESTPOOL $VDEV0 $sparedevs + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + populate_test_env $TESTDIR $maxnumber + test_zinject $TESTDIR + + cleanup_env +done + +log_pass "Fault inject handle device error successfully." diff --git a/tests/sys/cddl/zfs/tests/zinject/zinject_test.sh b/tests/sys/cddl/zfs/tests/zinject/zinject_test.sh new file mode 100755 index 00000000000..30788deccc8 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zinject/zinject_test.sh @@ -0,0 +1,140 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zinject_001_pos cleanup +zinject_001_pos_head() +{ + atf_set "descr" "Verify fault inject handle content error successfully." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +zinject_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zinject.kshlib + . $(atf_get_srcdir)/zinject.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zinject_001_pos.ksh || atf_fail "Testcase failed" +} +zinject_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zinject.kshlib + . $(atf_get_srcdir)/zinject.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zinject_002_pos cleanup +zinject_002_pos_head() +{ + atf_set "descr" "Verify fault inject handle metadnode error successfully." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +zinject_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zinject.kshlib + . $(atf_get_srcdir)/zinject.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zinject_002_pos.ksh || atf_fail "Testcase failed" +} +zinject_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zinject.kshlib + . $(atf_get_srcdir)/zinject.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zinject_003_pos cleanup +zinject_003_pos_head() +{ + atf_set "descr" "Verify fault inject handle into first metadnodecause filesystem unmountable." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +zinject_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zinject.kshlib + . $(atf_get_srcdir)/zinject.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zinject_003_pos.ksh || atf_fail "Testcase failed" +} +zinject_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zinject.kshlib + . $(atf_get_srcdir)/zinject.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zinject_004_pos cleanup +zinject_004_pos_head() +{ + atf_set "descr" "Verify fault inject handle device error successfully." + atf_set "require.progs" zfs zpool + atf_set "timeout" 1800 +} +zinject_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zinject.kshlib + . $(atf_get_srcdir)/zinject.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zinject_004_pos.ksh || atf_fail "Testcase failed" +} +zinject_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zinject.kshlib + . $(atf_get_srcdir)/zinject.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zinject_001_pos + atf_add_test_case zinject_002_pos + atf_add_test_case zinject_003_pos + atf_add_test_case zinject_004_pos +} diff --git a/tests/sys/cddl/zfs/tests/zones/Makefile b/tests/sys/cddl/zfs/tests/zones/Makefile new file mode 100644 index 00000000000..7c44fc58abc --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/Makefile @@ -0,0 +1,23 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zones +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zones_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zones.cfg +${PACKAGE}FILES+= zones_005_pos.ksh +${PACKAGE}FILES+= zones_001_pos.ksh +${PACKAGE}FILES+= zones_004_pos.ksh +${PACKAGE}FILES+= zones_common.kshlib +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zones_002_pos.ksh +${PACKAGE}FILES+= zones_003_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/zones/cleanup.ksh b/tests/sys/cddl/zfs/tests/zones/cleanup.ksh new file mode 100644 index 00000000000..1543ad77380 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/cleanup.ksh @@ -0,0 +1,66 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.5 09/05/19 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib + +verify_runnable "both" + +if ! is_global_zone ; then + default_cleanup +fi + +# Zone installs that may have been interrupted can leave the system in +# an odd state, lots of processes hanging around that will block +# our attempts to delete the zone. Remove these first. +for program in zoneadm lucreatezone lupi_zones lupi_bebasic pkginstall +do + $PKILL -9 $program +done + +# Zone installs that may have been interrupted can leave the system +# with lofs mounts from our test pool. Unmount these. +FS=$($MOUNT | $GREP $TESTPOOL | $AWK '{print $1}') + +for fs in $FS +do + $UMOUNT -f $fs +done + +for zone in $ZONE $ZONE2 $ZONE3 $ZONE4 ; do + $ZONEADM -z $zone list > /dev/null 2>&1 + if (( $? == 0 )) ; then + $ZONEADM -z $zone halt > /dev/null 2>&1 + $ZONEADM -z $zone uninstall -F > /dev/null 2>&1 + $ZONECFG -z $zone delete -F > /dev/null 2>&1 + fi +done + +default_cleanup diff --git a/tests/sys/cddl/zfs/tests/zones/setup.ksh b/tests/sys/cddl/zfs/tests/zones/setup.ksh new file mode 100644 index 00000000000..0f8bf47ff9b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/setup.ksh @@ -0,0 +1,65 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/05/19 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/tests/zones/zones_common.kshlib + +verify_runnable "both" +check_version "5.11" +if [ $? -eq 1 ] +then + log_unsupported "ZFS zone clone tests unsupported on this release." +fi + +if ! is_global_zone ; then + log_pass +fi + +DISK=${DISKS%% *} +default_setup_noexit $DISK + +# create a zone on ZFS +create_zone $ZONE /$TESTPOOL +install_zone $ZONE + +log_must $MKDIR -p -m 0700 /$TESTPOOL/simple_dir + +# create a normal zone - again on ZFS, but with the zonepath +# being a simple directory, rather than a top-level filesystem. +# We also create this as a branded zone. +create_zone $ZONE2 /$TESTPOOL/simple_dir SUNWsn1 +install_zone $ZONE2 + +# Now make sure those zones are visible +log_must eval "$ZONEADM -z $ZONE list > /dev/null 2>&1" +log_must eval "$ZONEADM -z $ZONE2 list > /dev/null 2>&1" + +log_pass "Setup created zones $ZONE and $ZONE2" diff --git a/tests/sys/cddl/zfs/tests/zones/zones.cfg b/tests/sys/cddl/zfs/tests/zones/zones.cfg new file mode 100644 index 00000000000..e887b75dd24 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/zones.cfg @@ -0,0 +1,83 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zones.cfg 1.5 08/08/15 SMI" +# + +# Variables we'll use to name our zones +# The first two zones are created by setup, +# then destroyed in zones_004_pos - or cleanup. +ZONE="${ZONE:=zone}" +ZONE2="${ZONE2:=zonetwo}" + +# These zones are created and destroyed by zones_003_pos - or cleanup. +ZONE3="${ZONE3:=zonethree}" +ZONE4="${ZONE4:=zonefour}" + +# A function which runs through a loop, adding a different characters +# to the stem passed as $1, to make sure we have a unique name that +# doesn't clash with an existing zone name. Once we've found a unique +# name, we echo that to stdout. +# +function find_unique_zonename { # initial name of zone + + NAME=$1 + COUNT=0 + while [ -z "$FOUND" ] + do + NAME="${NAME}${COUNT}" + $ZONEADM -z $NAME list > /dev/null 2>&1 + if [ $? -eq 1 ] + then + FOUND=true + fi + COUNT=$(( $COUNT + 1 )) + done + echo $NAME +} + +# Need a longer timeout for zone installation +export STF_TIMEOUT=3600 + +# Make sure that multiple sourcing of this script doesn't change the zone name +if [ -z "${RUNCONFIG}" ] +then + ZONE=$(find_unique_zonename $ZONE) + ZONE2=$(find_unique_zonename $ZONE2) + ZONE3=$(find_unique_zonename $ZONE3) + ZONE4=$(find_unique_zonename $ZONE4) + + log_note "zones.cfg gave us new zone names $ZONE,$ZONE2,$ZONE3,$ZONE4" + + export ZONE + export ZONE2 + export ZONE3 + export ZONE4 + + export RUNCONFIG="true" +fi diff --git a/tests/sys/cddl/zfs/tests/zones/zones_001_pos.ksh b/tests/sys/cddl/zfs/tests/zones/zones_001_pos.ksh new file mode 100644 index 00000000000..bfa979e246e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/zones_001_pos.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zones_001_pos.ksh 1.3 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zones_001_pos +# +# DESCRIPTION: +# +# The zone created by the default zones setup should have ZFS zvols, +# datasets and filesystems present. +# +# STRATEGY: +# 1. For each ZFS object type +# 2. Perform a basic sanity check for that object in the local zone. +# 3. Check that the top level dataset is read only. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-10-18) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "local" + + +log_assert "Local zone contains ZFS datasets as expected." + + +# check to see if our zvol exists: +if [ ! -b /dev/zvol/dsk/zonepool/zone_zvol ] +then + log_fail "block device /dev/zvol/dsk/zonepool/zone_zvol not found!" +fi + +if [ ! -c /dev/zvol/rdsk/zonepool/zone_zvol ] +then + log_fail "char device /dev/zvol/rdsk/zonepool/zone_zvol not found!" +fi + +# check to see if the device appears sane - create a UFS filesystem on it. +$ECHO y | $NEWFS /dev/zvol/rdsk/zonepool/zone_zvol > /dev/null + +if [ $? -ne 0 ] +then + log_fail "Failed to create UFS filesystem on a zvol in the zone!" +fi + +$MKDIR /ufs.${TESTCASE_ID} +log_must $MOUNT /dev/zvol/dsk/zonepool/zone_zvol /ufs.${TESTCASE_ID} +log_must $UMOUNT /ufs.${TESTCASE_ID} +$RM -rf /ufs.${TESTCASE_ID} + + +# Next check to see if the datasets exist as expected. +for dataset in 0 1 2 3 4 +do + DATASET=zonepool/zonectr${dataset} + if [ ! -d /${DATASET} ] + then + log_note "Missing zone dataset ${DATASET}!" + fi + log_must $ZFS create ${DATASET}/fs + if [ ! -d /${DATASET}/fs ] + then + log_fail "ZFS create failed to create child dataset of ${DATASET}" + fi + log_must $ZFS destroy ${DATASET}/fs +done + +# Next check to see that the root dataset is readonly +log_mustnot $ZFS create zonepool/fs +log_mustnot $ZFS mount zonepool + +log_pass "Local zone contains ZFS datasets as expected." + diff --git a/tests/sys/cddl/zfs/tests/zones/zones_002_pos.ksh b/tests/sys/cddl/zfs/tests/zones/zones_002_pos.ksh new file mode 100644 index 00000000000..2fef9368016 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/zones_002_pos.ksh @@ -0,0 +1,81 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zones_002_pos.ksh 1.2 07/01/09 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/tests/zones/zones_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zones_002_pos +# +# DESCRIPTION: +# +# A zone created where the zonepath parent dir is the top level of a ZFS +# file system has a new ZFS filesystem created for it. +# +# STRATEGY: +# 1. The setup script should have created the zone. +# 2. Verify that a new ZFS filesystem has been created. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "A ZFS fs is created when the parent dir of zonepath is a ZFS fs." + +# check to see if our zone exists: +if [ ! -d /$TESTPOOL/$ZONE ] +then + log_fail "Zone dir in /$TESTPOOL/$ZONE not found!" +fi + +if [ ! -d /$TESTPOOL/simple_dir/$ZONE2 ] +then + log_fail "Zone dir /$TESTPOOL/simple_dir/$ZONE2 not found!" +fi + +# we should have a new ZFS fs for the zone +log_must eval "$ZFS list $TESTPOOL/$ZONE > /dev/null" + +# we should not have a new ZFS fs for the non-ZFS zone. +log_mustnot eval "$ZFS list $TESTPOOL/simple_dir/$ZONE2 > /dev/null" + +log_pass "A ZFS fs is created when the parent dir of zonepath is a ZFS fs." diff --git a/tests/sys/cddl/zfs/tests/zones/zones_003_pos.ksh b/tests/sys/cddl/zfs/tests/zones/zones_003_pos.ksh new file mode 100644 index 00000000000..cf81284f053 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/zones_003_pos.ksh @@ -0,0 +1,133 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zones_003_pos.ksh 1.3 08/11/03 SMI" +# + +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/tests/zones/zones_common.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zones_003_pos +# +# DESCRIPTION: +# +# Zone cloning via ZFS snapshots works as expected. +# We can clone zones where the zonepath is the top level of a ZFS filesystem +# using snapshots. Where the zone is not at the top level of a ZFS filesystem, +# cloning the zone uses the normal method of copying the files when +# performing the clone operation. +# +# STRATEGY: +# 1. The setup script should have created the zone. +# 2. Clone a zone-on-ZFS +# 3. Verify that ZFS snapshots were taken and used for the clone and that +# the new zone is indeed a clone (in the ZFS sense) +# 4. Clone a normal zone & verify that no snapshots were taken. +# 5. Clone a zone-on-ZFS, but specify the "copy" method & verify that no +# snapshots were taken. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-12) +# +# __stc_assertion_end +# +################################################################################ + +function cleanup { + + log_must $ZONEADM -z $ZONE3 uninstall -F + log_must $ZONECFG -z $ZONE3 delete -F + + log_must $ZONEADM -z $ZONE4 uninstall -F + log_must $ZONECFG -z $ZONE4 delete -F +} + + +verify_runnable "global" +log_onexit cleanup + +log_assert "Zone cloning via ZFS snapshots works as expected." + + +# Make sure our zones exist: +if [ ! -d /$TESTPOOL/$ZONE ] +then + log_fail "Zone dir in /$TESTPOOL/$ZONE not found!" +fi + +if [ ! -d /$TESTPOOL/simple_dir/$ZONE2 ] +then + log_fail "Zone dir /$TESTPOOL/simple_dir/$ZONE2 not found!" +fi + + +create_zone $ZONE3 /$TESTPOOL +create_zone $ZONE4 /$TESTPOOL/simple_dir + +# Create a new zone3 based on cloning our zone +log_note "Cloning ZFS rooted zone" +log_must $ZONEADM -z $ZONE3 clone $ZONE + +# Make sure our snapshot and the new filesystem is there +log_must snapexists $TESTPOOL/$ZONE@SUNWzone1 +log_must datasetexists $TESTPOOL/$ZONE3 + +# verify that it is in fact a clone: +ORIGIN=$($ZFS get -H -o value origin $TESTPOOL/$ZONE3) +if [ "$ORIGIN" != "$TESTPOOL/$ZONE@SUNWzone1" ] +then + log_fail "$ZONE3 does not appear to have been ZFS cloned from $ZONE" +fi + +# Now uninstall that zone & the snapshot it was cloned from +log_must $ZONEADM -z $ZONE3 uninstall -F +log_must $ZONECFG -z $ZONE3 delete -F + +# Again create a new zone3, but clone the non-ZFS-rooted zone2 +# A snapshot should not have been created this time, but a new filesys +# should still be created. +create_zone $ZONE3 /$TESTPOOL SUNWsn1 +log_note "Cloning non-ZFS rooted zone2" +log_must $ZONEADM -z $ZONE3 clone $ZONE2 +log_mustnot snapexists $TESTPOOL/$ZONE2@SUNWzone1 +log_must datasetexists $TESTPOOL/$ZONE3 + +# Finally, clone a zone using the old copy method, where +# a snapshot should not be taken. +log_note "Cloning ZFS rooted zone using copy method" +log_must $ZONEADM -z $ZONE4 clone -m copy $ZONE +log_mustnot snapexists $TESTPOOl/$ZONE@SUNWzone1 + +log_pass "Zone cloning via ZFS snapshots works as expected." diff --git a/tests/sys/cddl/zfs/tests/zones/zones_004_pos.ksh b/tests/sys/cddl/zfs/tests/zones/zones_004_pos.ksh new file mode 100644 index 00000000000..e9ebac3bf8c --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/zones_004_pos.ksh @@ -0,0 +1,91 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zones_004_pos.ksh 1.3 09/05/19 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zones_004_pos +# +# DESCRIPTION: +# +# Deleting a zone, where the zonepath parent dir is the top level of a ZFS +# file system, causes that underlying filesystem to be deleted. Deleting +# the non-ZFS zone does not delete any filesystems. +# +# STRATEGY: +# 1. The setup script should have created the zone. +# 2. Delete our ZFS rooted zone, verify the filesystem has been deleted. +# 3. Delete our non-ZFS rooted zone, the zonepath dir should still exist. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-11) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "A ZFS fs is destroyed when the zone it was created for is deleted." + +# Make sure our zones exist: +if [ ! -d /$TESTPOOL/$ZONE ] +then + log_fail "Zone dir in /$TESTPOOL/$ZONE not found!" +fi + +if [ ! -d /$TESTPOOL/simple_dir/$ZONE2 ] +then + log_fail "Zone dir /$TESTPOOL/simple_dir/$ZONE2 not found!" +fi + + +# delete our ZFS rooted zone +log_must $ZONEADM -z $ZONE uninstall -F +log_must $ZONECFG -z $ZONE delete -F +log_mustnot eval "$ZFS list $TESTPOOL/$ZONE > /dev/null 2>&1" + +# delete our non-ZFS rooted zone +log_must $ZONEADM -z $ZONE2 uninstall -F +log_must $ZONECFG -z $ZONE2 delete -F +if [ ! -d /$TESTPOOL/simple_dir ] +then + log_fail "On deleting $ZONE2, the dir above zonepath was destroyed!" +fi + + +log_pass "A ZFS fs is destroyed when the zone it was created for is deleted." diff --git a/tests/sys/cddl/zfs/tests/zones/zones_005_pos.ksh b/tests/sys/cddl/zfs/tests/zones/zones_005_pos.ksh new file mode 100644 index 00000000000..a60a104b742 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/zones_005_pos.ksh @@ -0,0 +1,72 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zones_005_pos.ksh 1.1 07/05/25 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################ +# +# __stc_assertion_start +# +# ID: zones_005_pos +# +# DESCRIPTION: +# +# Pool properties can be read but can't be set within a zone +# +# STRATEGY: +# 1. Verify we can read pool properties in a zone +# 2. Verify we can't set a pool property in a zone +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2007-04-03) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "local" + +log_assert "Pool properties can be read but can't be set within a zone" + +log_must $ZPOOL get all zonepool +log_must $ZPOOL get bootfs zonepool +log_mustnot $ZPOOL set boofs=zonepool zonepool + +# verify that the property hasn't been set. +log_must eval "$ZPOOL get bootfs zonepool > $TMPDIR/output.${TESTCASE_ID}" +log_must $GREP "zonepool bootfs -" $TMPDIR/output.${TESTCASE_ID} + +$RM $TMPDIR/output.${TESTCASE_ID} + +log_pass "Pool properties can be read but can't be set within a zone" diff --git a/tests/sys/cddl/zfs/tests/zones/zones_common.kshlib b/tests/sys/cddl/zfs/tests/zones/zones_common.kshlib new file mode 100644 index 00000000000..e9c478451ec --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/zones_common.kshlib @@ -0,0 +1,70 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zones_common.kshlib 1.3 07/03/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zones/zones.cfg + +# a simple zone creation function +function create_zone { # $ZONENAME $ZONEPATH $BRAND (optional) + ZNAME=$1 + ZPATH=$2 + BRAND=$3 + + if [ ! -z $BRAND ] + then + # The SUNWsn1 brand only works on debug kernels for sparc, so we + # check for a known symbol to see if that's there. + $ECHO "logmap_logscan_debug/p" | $MDB -k > /dev/null 2>&1 + if [ $? -eq 1 ] + then + BRAND="" + else + BRAND="-t $BRAND " + fi + fi + + # create a zone config file + $CAT > $TMPDIR/zone.${TESTCASE_ID}.cfg < /dev/null + $RM $TMPDIR/zone.${TESTCASE_ID}.cfg +} + +function install_zone { # $ZONENAME + ZNAME=$1 + log_note "Installing $ZNAME. This may take some time." + log_must $ZONEADM -z $ZNAME install > /dev/null +} diff --git a/tests/sys/cddl/zfs/tests/zones/zones_test.sh b/tests/sys/cddl/zfs/tests/zones/zones_test.sh new file mode 100755 index 00000000000..6bf9e290d64 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zones/zones_test.sh @@ -0,0 +1,167 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zones_001_pos cleanup +zones_001_pos_head() +{ + atf_set "descr" "Local zone contains ZFS datasets as expected." + atf_set "require.progs" zfs zoneadm zonecfg + atf_set "timeout" 3600 +} +zones_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zones_001_pos.ksh || atf_fail "Testcase failed" +} +zones_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zones_002_pos cleanup +zones_002_pos_head() +{ + atf_set "descr" "A ZFS fs is created when the parent dir of zonepath is a ZFS fs." + atf_set "require.progs" zfs zoneadm zonecfg + atf_set "timeout" 3600 +} +zones_002_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zones_002_pos.ksh || atf_fail "Testcase failed" +} +zones_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zones_003_pos cleanup +zones_003_pos_head() +{ + atf_set "descr" "Zone cloning via ZFS snapshots works as expected." + atf_set "require.progs" zfs zoneadm zonecfg + atf_set "timeout" 3600 +} +zones_003_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zones_003_pos.ksh || atf_fail "Testcase failed" +} +zones_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zones_004_pos cleanup +zones_004_pos_head() +{ + atf_set "descr" "A ZFS fs is destroyed when the zone it was created for is deleted." + atf_set "require.progs" zfs zoneadm zonecfg + atf_set "timeout" 3600 +} +zones_004_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zones_004_pos.ksh || atf_fail "Testcase failed" +} +zones_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zones_005_pos cleanup +zones_005_pos_head() +{ + atf_set "descr" "Pool properties can be read but can't be set within a zone" + atf_set "require.progs" zpool zonecfg zoneadm + atf_set "timeout" 3600 +} +zones_005_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zones_005_pos.ksh || atf_fail "Testcase failed" +} +zones_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zones_common.kshlib + . $(atf_get_srcdir)/zones.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zones_001_pos + atf_add_test_case zones_002_pos + atf_add_test_case zones_003_pos + atf_add_test_case zones_004_pos + atf_add_test_case zones_005_pos +} diff --git a/tests/sys/cddl/zfs/tests/zvol/Makefile b/tests/sys/cddl/zfs/tests/zvol/Makefile new file mode 100644 index 00000000000..ade9c7284bd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/Makefile @@ -0,0 +1,17 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zvol +FILESDIR=${TESTSDIR} + +${PACKAGE}FILES+= zvol.cfg +${PACKAGE}FILES+= zvol_common.kshlib + +TESTS_SUBDIRS+= zvol_ENOSPC +TESTS_SUBDIRS+= zvol_swap +TESTS_SUBDIRS+= zvol_misc +TESTS_SUBDIRS+= zvol_cli + +.include diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol.cfg b/tests/sys/cddl/zfs/tests/zvol/zvol.cfg new file mode 100644 index 00000000000..725ba6741d3 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol.cfg @@ -0,0 +1,39 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol.cfg 1.4 08/08/15 SMI" +# + +export DISK=${DISKS%% *} + +export TESTVOL=testvol${TESTCASE_ID} +export TESTFILE=testfile${TESTCASE_ID} +export TESTSNAP=testsnap${TESTCASE_ID} +export VOLSIZE=2g +export DATA=0 +export ENOSPC=28 diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/Makefile b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/Makefile new file mode 100644 index 00000000000..8cb5e128de1 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zvol/zvol_ENOSPC +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zvol_ENOSPC_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zvol_ENOSPC_001_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zvol_ENOSPC.cfg +${PACKAGE}FILES+= cleanup.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/cleanup.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/cleanup.ksh new file mode 100644 index 00000000000..5ab2b991459 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/cleanup.ksh @@ -0,0 +1,39 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)cleanup.ksh 1.3 08/11/03 SMI" +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +verify_runnable "global" + +default_zvol_cleanup + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/setup.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/setup.ksh new file mode 100644 index 00000000000..f097553e9a7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/setup.ksh @@ -0,0 +1,43 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +verify_runnable "global" + +default_zvol_setup $DISK $VOLSIZE + +log_must $NEWFS /dev/zvol/$TESTPOOL/$TESTVOL +log_must $MKDIR $TESTDIR +log_must $MOUNT /dev/zvol/$TESTPOOL/$TESTVOL $TESTDIR + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC.cfg b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC.cfg new file mode 100644 index 00000000000..76e127cc05a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_ENOSPC.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/zvol/zvol.cfg + +export BLOCKSZ=$(( 1024 * 1024 )) +export NUM_WRITES=40 diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh new file mode 100644 index 00000000000..e14925f177b --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh @@ -0,0 +1,82 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)zvol_ENOSPC_001_pos.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_ENOSPC_001_pos +# +# DESCRIPTION: +# A zvol volume will return ENOSPC when the underlying pool runs out of +# space. +# +# STRATEGY: +# 1. Create a pool +# 2. Create a zvol volume +# 3. Create a ufs file system ontop of the zvol +# 4. Mount the ufs file system +# 5. Fill volume until ENOSPC is returned +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + # unmounting the UFS filesystem can take more than 60s, and Kyua has a + # hardcoded 60s limit for the cleanup phase. So we must unmount the + # filesystem here rather than cleanup.ksh. + ismounted $TESTDIR ufs && log_must $UMOUNT -f $TESTDIR + $RMDIR $TESTDIR +} + +log_assert "A zvol volume will return ENOSPC when the underlying pool " \ + "runs out of space." + +log_onexit cleanup + +typeset -i fn=0 +typeset -i retval=0 + +log_mustbe ENOSPC fill_fs $TESTDIR -1 50 $BLOCKSZ $NUM_WRITES + +log_pass "ENOSPC was returned as expected" diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC_test.sh b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC_test.sh new file mode 100755 index 00000000000..49ee93d59d2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_ENOSPC/zvol_ENOSPC_test.sh @@ -0,0 +1,56 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zvol_ENOSPC_001_pos cleanup +zvol_ENOSPC_001_pos_head() +{ + atf_set "descr" "A zvol volume will return ENOSPC when the underlying poolruns out of space." +} +zvol_ENOSPC_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_ENOSPC.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_ENOSPC_001_pos.ksh || atf_fail "Testcase failed" +} +zvol_ENOSPC_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_ENOSPC.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zvol_ENOSPC_001_pos +} diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_cli/Makefile b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/Makefile new file mode 100644 index 00000000000..5ed650abc37 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zvol/zvol_cli +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zvol_cli_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zvol_cli_003_neg.ksh +${PACKAGE}FILES+= zvol_cli_002_pos.ksh +${PACKAGE}FILES+= zvol_cli.cfg +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zvol_cli_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_cli/cleanup.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/cleanup.ksh new file mode 100644 index 00000000000..5ace55491b7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/cleanup.ksh @@ -0,0 +1,39 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +verify_runnable "global" + +default_zvol_cleanup + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_cli/setup.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/setup.ksh new file mode 100644 index 00000000000..30af5161eae --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/setup.ksh @@ -0,0 +1,39 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +verify_runnable "global" + +default_zvol_setup $DISK $VOLSIZE + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli.cfg b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli.cfg new file mode 100644 index 00000000000..e93a348dbcb --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli.cfg @@ -0,0 +1,35 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_cli.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/zvol/zvol.cfg + +export LONGPNAME="poolname50charslong_012345678901234567890123456789" +export LONGVOLNAME="volumename50charslong_0123456789012345678901234567" diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_001_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_001_pos.ksh new file mode 100644 index 00000000000..babd0df0cf5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_001_pos.ksh @@ -0,0 +1,75 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)zvol_cli_001_pos.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_cli_001_pos +# +# DESCRIPTION: +# Executing well-formed 'zfs list' commands should return success +# +# STRATEGY: +# 1. Create an array of valid options. +# 2. Execute each element in the array. +# 3. Verify success is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A args "list" "list -r" \ + "list $TESTPOOL/$TESTVOL" "list -r $TESTPOOL/$TESTVOL" \ + "list -H $TESTPOOL/$TESTVOL" "list -Hr $TESTPOOL/$TESTVOL" \ + "list -rH $TESTPOOL/$TESTVOL" "list -o name $TESTPOOL/$TESTVOL" \ + "list -r -o name $TESTPOOL/$TESTVOL" "list -H -o name $TESTPOOL/$TESTVOL" \ + "list -rH -o name $TESTPOOL/$TESTVOL" + +log_assert "Executing well-formed 'zfs list' commands should return success" + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_must eval "$ZFS ${args[i]} > /dev/null" + ((i = i + 1)) +done + +log_pass "Executing zfs list on volume works as expected" diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_002_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_002_pos.ksh new file mode 100644 index 00000000000..f6f3f73b5d5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_002_pos.ksh @@ -0,0 +1,74 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)zvol_cli_002_pos.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_cli_002_pos +# +# DESCRIPTION: +# Creating a volume with a 50 letter name should work. +# +# STRATEGY: +# 1. Using a very long name, create a zvol +# 2. Verify volume exists +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$LONGVOLNAME && \ + $ZFS destroy $TESTPOOL/$LONGVOLNAME +} + +log_onexit cleanup + +log_assert "Creating a volume a 50 letter name should work." + +log_must $ZFS create -V $VOLSIZE $TESTPOOL/$LONGVOLNAME + +datasetexists $TESTPOOL/$LONGVOLNAME || \ + log_fail "Couldn't find long volume name" + +log_pass "Created a 50-letter zvol volume name" diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_003_neg.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_003_neg.ksh new file mode 100644 index 00000000000..8ad7d3aa0a7 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_003_neg.ksh @@ -0,0 +1,73 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)zvol_cli_003_neg.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_cli_003_neg +# +# DESCRIPTION: +# Try each ZFS volume sub-command without parameters to make sure +# it returns an error. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +set -A args "" "create -V" "create -V $TESTPOOL" \ + "create -V $TESTPOOL/$TESTVOL@" "create -V blah" "destroy" + +log_assert "Try each ZFS volume sub-command without parameters to make sure" \ + " it returns an error." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZFS ${args[i]} + (( i = i + 1 )) +done + +log_pass "Badly formed ZFS volume sub-commands fail as expected." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_test.sh b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_test.sh new file mode 100755 index 00000000000..75dd29376f9 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_cli/zvol_cli_test.sh @@ -0,0 +1,107 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zvol_cli_001_pos cleanup +zvol_cli_001_pos_head() +{ + atf_set "descr" "Executing well-formed 'zfs list' commands should return success" + atf_set "require.progs" zfs +} +zvol_cli_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_cli.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_cli_001_pos.ksh || atf_fail "Testcase failed" +} +zvol_cli_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_cli.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_cli_002_pos cleanup +zvol_cli_002_pos_head() +{ + atf_set "descr" "Creating a volume a 50 letter name should work." + atf_set "require.progs" zfs +} +zvol_cli_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_cli.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_cli_002_pos.ksh || atf_fail "Testcase failed" +} +zvol_cli_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_cli.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_cli_003_neg cleanup +zvol_cli_003_neg_head() +{ + atf_set "descr" "Try each ZFS volume sub-command without parameters to make sure it returns an error." + atf_set "require.progs" zfs +} +zvol_cli_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_cli.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_cli_003_neg.ksh || atf_fail "Testcase failed" +} +zvol_cli_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_cli.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zvol_cli_001_pos + atf_add_test_case zvol_cli_002_pos + atf_add_test_case zvol_cli_003_neg +} diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_common.kshlib b/tests/sys/cddl/zfs/tests/zvol/zvol_common.kshlib new file mode 100644 index 00000000000..b31916b8be2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_common.kshlib @@ -0,0 +1,165 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_common.kshlib 1.6 09/06/22 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +# +# Create a simple zvol volume +# +# Where disk_device: is the name of the disk to be used +# volume_size: is the size of the volume, e.g. 2G +# +function default_zvol_setup # disk_device volume_size +{ + typeset disk=$1 + typeset size=$2 + typeset savedumpdev + typeset -i output + + create_pool $TESTPOOL "$disk" + + log_must $ZFS create -V $size $TESTPOOL/$TESTVOL + + if [[ -n $DUMPADM ]]; then + if is_dumpswap_supported $TESTPOOL ; then + set_dumpsize $TESTPOOL/$TESTVOL + fi + fi +} + +# +# Destroy the default zvol which was setup using +# default_zvol_setup(). +# +function default_zvol_cleanup +{ + if datasetexists $TESTPOOL/$TESTVOL ; then + log_must $ZFS destroy $TESTPOOL/$TESTVOL + fi + + destroy_pool $TESTPOOL +} + +# +# Check if the given pool support "Swap and crash dumps" +# +function is_dumpswap_supported #pool +{ + typeset pool=$1 + + if [[ -z $pool ]] ; then + log_fail "No pool given." + fi + + typeset -i SPA_VER_DUMPSWAP=10 + typeset -i vp=$(get_pool_prop version $pool) + + if (( vp >= SPA_VER_DUMPSWAP )) ; then + return 0 + fi + + return 1 +} + +function get_dumpdevice +{ + typeset ret=$($DUMPADM | $GREP "Dump device:" | $AWK '{print $3}') + print $ret +} + +function set_dumpsize +{ + typeset volume=$1 + + if [[ -z $volume ]] ; then + log_note "No volume specified." + return 1 + fi + + log_must $ZFS set volsize=64m $volume + + output=$($DUMPADM -d /dev/zvol/dsk/$volume 2>&1 | \ + $TAIL -1 | $AWK '{print $3}') + + if [[ -n $output ]]; then + (( output = output / 1024 / 1024 )) + (( output = output + output / 5 )) + log_must $ZFS set volsize=${output}m $volume + fi + return 0 +} + +function safe_dumpadm +{ + typeset device=$1 + + if [[ -z $device || $device == "none" ]] ; then + log_note "No dump device volume specified." + return 1 + fi + if [[ $device == "/dev/zvol/dsk/"* ]] ; then + typeset volume=${device#/dev/zvol/dsk/} + set_dumpsize $volume + log_must $DUMPADM -d $device + else + log_must $SWAPADD + if ! is_swap_inuse $device ; then + log_must $SWAP -a $device + fi + log_must $DUMPADM -d swap + fi +} + +function is_zvol_dumpified +{ + typeset volume=$1 + + if [[ -z $volume ]] ; then + log_note "No volume specified." + return 1 + fi + + $ZDB -dddd $volume 2 | $GREP "dumpsize" > /dev/null 2>&1 + return $? +} + +function is_swap_inuse +{ + typeset device=$1 + + if [[ -z $device ]] ; then + log_note "No device specified." + return 1 + fi + + $SWAP -l | $GREP -w $device > /dev/null 2>&1 + return $? +} diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/Makefile b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/Makefile new file mode 100644 index 00000000000..43158e22d01 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/Makefile @@ -0,0 +1,26 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zvol/zvol_misc +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zvol_misc_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zvol_misc.cfg +${PACKAGE}FILES+= zvol_misc_006_pos.ksh +${PACKAGE}FILES+= zvol_misc_002_pos.ksh +${PACKAGE}FILES+= zvol_misc_003_neg.ksh +${PACKAGE}FILES+= zvol_misc_007_pos.ksh +${PACKAGE}FILES+= zvol_misc_009_pos.ksh +${PACKAGE}FILES+= zvol_misc_004_pos.ksh +${PACKAGE}FILES+= zvol_misc_008_pos.ksh +${PACKAGE}FILES+= zvol_misc_001_neg.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zvol_misc_005_neg.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/cleanup.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/cleanup.ksh new file mode 100644 index 00000000000..1ed5386ed70 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/cleanup.ksh @@ -0,0 +1,39 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +verify_runnable "global" + +default_zvol_cleanup + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/setup.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/setup.ksh new file mode 100644 index 00000000000..8212eb70d08 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/setup.ksh @@ -0,0 +1,39 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +verify_runnable "global" + +default_zvol_setup $DISK $VOLSIZE + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc.cfg b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc.cfg new file mode 100644 index 00000000000..ffa01d6760e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc.cfg @@ -0,0 +1,36 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc.cfg 1.3 08/05/14 SMI" +# + +. $STF_SUITE/tests/zvol/zvol.cfg + +export BLOCKSZ=$(( 1024 * 1024 )) +export NUM_WRITES=40 +export RESERVESNAP=%dumpdev diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_001_neg.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_001_neg.ksh new file mode 100644 index 00000000000..431f67c3271 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_001_neg.ksh @@ -0,0 +1,85 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_001_neg.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_001_neg +# +# DESCRIPTION: +# Verify that using ZFS volume as a dump device fails until +# dumpswap supported. +# +# STRATEGY: +# 1. Create a ZFS volume +# 2. Use dumpadm add the volume as dump device +# 3. Verify the return code as expected. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-03-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset dumpdev=$(get_dumpdevice) + + if [[ $dumpdev != $savedumpdev ]] ; then + safe_dumpadm $savedumpdev + fi +} + +log_assert "Verify that ZFS volume cannot act as dump device until dumpswap supported." +log_onexit cleanup + +test_requires DUMPADM + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +savedumpdev=$(get_dumpdevice) + +if ! is_dumpswap_supported $TESTPOOL ; then + log_mustnot $DUMPADM -d $voldev +else + safe_dumpadm $voldev +fi + +log_pass "ZFS volume cannot act as dump device until dumpswap supported as expected." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_002_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_002_pos.ksh new file mode 100644 index 00000000000..3ac28a79b73 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_002_pos.ksh @@ -0,0 +1,89 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_002_pos.ksh 1.4 08/02/27 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_002_pos +# +# DESCRIPTION: +# Verify that ZFS volume snapshot could be fscked +# +# STRATEGY: +# 1. Create a ZFS volume +# 2. Copy some files and create snapshot +# 3. Verify fsck on the snapshot is OK +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-10-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + snapexists $TESTPOOL/$TESTVOL@snap && \ + $ZFS destroy $TESTPOOL/$TESTVOL@snap + + ismounted $TESTDIR ufs && log_must $UMOUNT $TESTDIR + [[ -e $TESTDIR ]] && $RM -rf $TESTDIR +} + +log_assert "Verify that ZFS volume snapshot could be fscked" +log_onexit cleanup + +$NEWFS /dev/zvol/$TESTPOOL/$TESTVOL >/dev/null 2>&1 +(( $? != 0 )) && log_fail "Unable to newfs(1M) $TESTPOOL/$TESTVOL" + +log_must $MKDIR $TESTDIR +log_must $MOUNT /dev/zvol/$TESTPOOL/$TESTVOL $TESTDIR + +typeset -i fn=0 +typeset -i retval=0 + +# Write about 200MB of data. +populate_dir $TESTDIR/testfile 5 $NUM_WRITES $BLOCKSZ 0 + +log_must sync +log_must $MOUNT -o rw -u $TESTDIR +log_must $ZFS snapshot $TESTPOOL/$TESTVOL@snap +log_must $FSCK -t ufs -n /dev/zvol/$TESTPOOL/$TESTVOL@snap >/dev/null 2>&1 + +log_pass "Verify that ZFS volume snapshot could be fscked" diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_003_neg.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_003_neg.ksh new file mode 100644 index 00000000000..c02d786afc2 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_003_neg.ksh @@ -0,0 +1,93 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_003_neg.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_003_neg +# +# DESCRIPTION: +# Verify create storage pool or newfs over volume as dump device is denied. +# +# STRATEGY: +# 1. Create a ZFS volume +# 2. Use dumpadm set the volume as dump device +# 3. Verify create pool & newfs over the volume return an error. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-01-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset dumpdev=$(get_dumpdevice) + if [[ $dumpdev != $savedumpdev ]] ; then + safe_dumpadm $savedumpdev + fi + + if poolexists $TESTPOOL1 ; then + destroy_pool $TESTPOOL1 + fi +} + +log_assert "Verify create storage pool or newfs over dump volume is denied." +if ! is_dumpswap_supported $TESTPOOL ; then + log_unsupported "dumpswap not currently supported." +fi +log_onexit cleanup + +test_requires DUMPADM + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +savedumpdev=$(get_dumpdevice) + +safe_dumpadm $voldev + +$ECHO "y" | $NEWFS $voldev > /dev/null 2>&1 +if (( $? == 0 )) ; then + log_fail "newfs over dump volume succeed unexpected" +fi + +log_mustnot $ZPOOL create $TESTPOOL1 $voldev + +log_pass "Verify create storage pool or newfs over dump volume is denied." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_004_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_004_pos.ksh new file mode 100644 index 00000000000..181bace966e --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_004_pos.ksh @@ -0,0 +1,129 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_004_pos.ksh 1.1 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_004_pos +# +# DESCRIPTION: +# Verify permit to create snapshot over active dumpswap zvol. +# +# STRATEGY: +# 1. Create a ZFS volume +# 2. Set the volume as dump or swap +# 3. Verify create snapshot over the zvol succeed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-01-07) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset dumpdev=$(get_dumpdevice) + if [[ $dumpdev != $savedumpdev ]] ; then + safe_dumpadm $savedumpdev + fi + + $SWAP -l | $GREP -w $voldev > /dev/null 2>&1 + if (( $? == 0 )); then + log_must $SWAP -d $voldev + fi + + typeset snap + for snap in snap0 snap1 ; do + if datasetexists $TESTPOOL/$TESTVOL@$snap ; then + log_must $ZFS destroy $TESTPOOL/$TESTVOL@$snap + fi + done +} + +function verify_snapshot +{ + typeset volume=$1 + + log_must $ZFS snapshot $volume@snap0 + log_must $ZFS snapshot $volume@snap1 + log_must datasetexists $volume@snap0 $volume@snap1 + + log_must $ZFS destroy $volume@snap1 + log_must $ZFS snapshot $volume@snap1 + + log_mustnot $ZFS rollback -r $volume@snap0 + log_must datasetexists $volume@snap0 + log_must datasetexists $volume@snap1 + + log_must $ZFS destroy -r $volume@snap0 +} + +log_assert "Verify permit to create snapshot over dumpswap." +if ! is_dumpswap_supported $TESTPOOL ; then + log_unsupported "dumpswap not currently supported." +fi +log_onexit cleanup + +test_requires DUMPADM + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +savedumpdev=$(get_dumpdevice) + +# create snapshot over dump zvol +safe_dumpadm $voldev +log_must is_zvol_dumpified $TESTPOOL/$TESTVOL + +verify_snapshot $TESTPOOL/$TESTVOL + +safe_dumpadm $savedumpdev +log_mustnot is_zvol_dumpified $TESTPOOL/$TESTVOL + +# create snapshot over swap zvol + +log_must $SWAP -a $voldev +log_mustnot is_zvol_dumpified $TESTPOOL/$TESTVOL + +verify_snapshot $TESTPOOL/$TESTVOL + +log_must $SWAP -d $voldev +log_mustnot is_zvol_dumpified $TESTPOOL/$TESTVOL + +log_pass "Create snapshot over dumpswap zvol succeed." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_005_neg.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_005_neg.ksh new file mode 100644 index 00000000000..f1e794b603d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_005_neg.ksh @@ -0,0 +1,94 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_005_neg.ksh 1.1 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_005_neg +# +# DESCRIPTION: +# Verify a device cannot be dump and swap at the same time. +# +# STRATEGY: +# 1. Create a ZFS volume +# 2. Set it as swap device. +# 3. Verify dumpadm with this zvol will fail. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-03-10) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + $SWAP -l | $GREP $voldev > /dev/null 2>&1 + if (( $? == 0 )) ; then + log_must $SWAP -d $voldev + fi + + typeset dumpdev=$(get_dumpdevice) + if [[ $dumpdev != $savedumpdev ]] ; then + safe_dumpadm $savedumpdev + fi +} + +log_assert "Verify a device cannot be dump and swap at the same time." +if ! is_dumpswap_supported $TESTPOOL ; then + log_unsupported "dumpswap not currently supported." +fi +log_onexit cleanup + +test_requires DUMPADM + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +savedumpdev=$(get_dumpdevice) + +# If device in swap list, it cannot be dump device +log_must $SWAP -a $voldev +log_mustnot $DUMPADM -d $voldev +log_must $SWAP -d $voldev + +# If device has dedicated as dump device, it cannot add into swap list +safe_dumpadm $voldev +log_mustnot $SWAP -a $voldev + +log_pass "A device cannot be dump and swap at the same time." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_006_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_006_pos.ksh new file mode 100644 index 00000000000..4c4c13712dd --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_006_pos.ksh @@ -0,0 +1,92 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_006_pos.ksh 1.1 09/01/12 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_006_pos +# +# DESCRIPTION: +# ZFS volume as dump device, it should always have 128k volblocksize +# +# STRATEGY: +# 1. Create a ZFS volume +# 2. Use dumpadm set the volume as dump device +# 3. Verify the volume's volblocksize=128k +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-12-01) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset dumpdev=$(get_dumpdevice) + if [[ $dumpdev != $savedumpdev ]] ; then + safe_dumpadm $savedumpdev + fi +} + +log_assert "zfs volume as dumpdevice should have 128k volblocksize" + +if ! is_dumpswap_supported $TESTPOOL ; then + log_unsupported "dumpswap not currently supported." +fi +log_onexit cleanup + +test_requires DUMPADM + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +savedumpdev=$(get_dumpdevice) + +typeset oblksize=$($ZFS get -H -o value volblocksize $TESTPOOL/$TESTVOL) +log_note "original $TESTPOOL/$TESTVOL volblocksize=$oblksize" + +safe_dumpadm $voldev + +typeset blksize=$($ZFS get -H -o value volblocksize $TESTPOOL/$TESTVOL) + +if [[ $blksize != "128K" ]]; then + log_fail "ZFS volume $TESTPOOL/$TESTVOL volblocksize=$blksize" +fi + +log_pass "zfs volume as dumpdevice should have 128k volblocksize" diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_007_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_007_pos.ksh new file mode 100644 index 00000000000..c8bca20ea8a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_007_pos.ksh @@ -0,0 +1,133 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_007_pos.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_007_pos +# +# DESCRIPTION: +# Verify that device nodes are modified appropriately during zfs command +# operations on volumes. +# +# STRATEGY: +# For a certain number of iterations, with root setup for each test set: +# - Recursively snapshot the root. +# - Recursively rename the snapshot 3 times. +# - Destroy the root. +# +# - Recursively snapshot the root. +# - Clone the volume to another name in the root. +# - Rename the root. +# - Destroy the renamed root. +# +# - Recursively snapshot the root. +# - Send|Receive the root to another root. +# - Destroy the original and received roots. +# +# At each stage, the device nodes are checked to match the expectations. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-03-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify that ZFS volume device nodes are handled properly (part 1)." + +ROOTPREFIX=$TESTPOOL/007 +DIRS="dir0 dir1" +VOLS="vol0 dir0/dvol0 dir1/dvol1" + +typeset -i NUM_RENAMES=5 +typeset -i NUM_ITERATIONS=10 + +function onexit_callback +{ + log_must $ZFS list -t all + log_note "Char devices in /dev/zvol:" + find /dev/zvol -type c +} +log_onexit onexit_callback + +function root_setup +{ + rootds=$1 + + log_must $ZFS create $rootds + for dir in $DIRS; do + log_must $ZFS create $rootds/$dir + done + for vol in $VOLS; do + log_must $ZFS create -V 100M $rootds/$vol + log_must test -c /dev/zvol/$rootds/$vol + done +} + +typeset -i i=0 +root="" +while (( i != NUM_ITERATIONS )); do + root=${ROOTPREFIX}_iter${i} + # Test set 1: Recursive snapshot, recursive rename, and destroy + typeset -i cur=0 + log_mustnot test -e /dev/zvol/$root/vol0 + root_setup $root + log_must $ZFS snapshot -r $root@$cur + for vol in $VOLS; do + log_must test -c /dev/zvol/$root/$vol@$cur + done + while ((cur < $NUM_RENAMES)); do + ((next = cur + 1)) + log_must $ZFS rename -r $root@$cur $root@$next + for vol in $VOLS; do + v=$root/$vol + log_mustnot test -e /dev/zvol/$v@$cur + log_must test -c /dev/zvol/$v@$next + done + cur=$next + done + log_must $ZFS destroy -r $root + log_mustnot test -e /dev/zvol/$root/vol0 + + (( i += 1 )) +done + +log_pass "ZFS volume device nodes are handled properly." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_008_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_008_pos.ksh new file mode 100644 index 00000000000..f1bdfaf6392 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_008_pos.ksh @@ -0,0 +1,159 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_008_pos.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_008_pos +# +# DESCRIPTION: +# Verify that device nodes are modified appropriately during zfs command +# operations on volumes. +# +# STRATEGY: +# For a certain number of iterations, with root setup for each test set: +# - Recursively snapshot the root. +# - Clone the volume to another name in the root. +# - Promote the clone. +# - Demote the original clone. +# - Snapshot & clone the clone. +# - Rename the root. +# - Destroy the renamed root. +# +# At each stage, the device nodes are checked to match the expectations. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-03-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify that ZFS volume device nodes are handled properly (part 2)." + +ROOTPREFIX=$TESTPOOL/008 +DIRS="dir0 dir1" +VOLS="vol0 dir0/dvol0 dir1/dvol1" + +typeset -i NUM_ITERATIONS=10 + +function onexit_callback +{ + log_must $ZFS list -t all + log_note "Char devices in /dev/zvol:" + find /dev/zvol -type c +} +log_onexit onexit_callback + +function root_setup +{ + rootds=$1 + + log_must $ZFS create $rootds + for dir in $DIRS; do + log_must $ZFS create $rootds/$dir + done + for vol in $VOLS; do + log_must $ZFS create -V 100M $rootds/$vol + log_must test -c /dev/zvol/$rootds/$vol + done +} + +function test_exists +{ + for zvolds in $*; do + log_must test -c /dev/zvol/${zvolds} + done +} + +function test_notexists +{ + for zvolds in $*; do + log_mustnot test -e /dev/zvol/${zvolds} + done +} + +typeset -i i=0 +while (( i != NUM_ITERATIONS )); do + root=${ROOTPREFIX}_iter${i} + # Test set 2: Recursive snapshot, cloning/promoting, and root-rename + root_setup $root + log_must $ZFS snapshot -r $root@snap + log_must $ZFS clone $root/vol0@snap $root/vol1 + test_exists $root/vol1 + test_notexists $root/vol1@snap + + log_must $ZFS promote $root/vol1 + test_exists $root/vol0 $root/vol1 $root/vol1@snap + test_notexists $root/vol0@snap + + # Re-promote the original volume. + log_must $ZFS promote $root/vol0 + test_exists $root/vol0 $root/vol1 $root/vol0@snap + test_notexists $root/vol1@snap + + # Clone a clone's snapshot. + log_must $ZFS snapshot $root/vol1@newsnap + log_must $ZFS clone $root/vol1@newsnap $root/vol2 + test_exists $root/vol2 + test_notexists $root/vol2@snap + + # Now promote *that* clone. + log_must $ZFS promote $root/vol2 + test_exists $root/vol0 $root/vol0@snap \ + $root/vol1 $root/vol2 $root/vol2@newsnap + test_notexists $root/vol1@snap $root/vol1@newsnap + + renamed=${root}_renamed + log_must $ZFS rename $root $renamed + # Ensure that the root rename applies to clones and promoted clones. + test_exists $renamed/vol1 $renamed/vol2 $renamed/vol2@newsnap + test_notexists $root/vol1 $renamed/vol1@snap $renamed/vol1@newsnap + for vol in $VOLS; do + test_notexists $root/$vol $root/$vol@snap + test_exists $renamed/$vol $renamed/$vol@snap + done + + log_must $ZFS destroy -r $renamed + test_notexists $renamed/vol0 $renamed/vol1 $renamed/vol2 + + (( i += 1 )) +done +log_pass "ZFS volume device nodes are handled properly (part 2)." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_009_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_009_pos.ksh new file mode 100644 index 00000000000..cbc588cc207 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_009_pos.ksh @@ -0,0 +1,126 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_misc_009_pos.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_misc_009_pos +# +# DESCRIPTION: +# Verify that device nodes are modified appropriately during zfs command +# operations on volumes. +# +# STRATEGY: +# For a certain number of iterations, with root setup for each test set: +# - Recursively snapshot the root. +# - Send|Receive the root to another root. +# - Destroy the original and received roots. +# +# At each stage, the device nodes are checked to match the expectations. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2008-03-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "Verify that ZFS volume device nodes are handled properly (part 3)." + +ROOTPREFIX=$TESTPOOL/009 +DIRS="dir0 dir1" +VOLS="vol0 dir0/dvol0 dir1/dvol1" + +typeset -i NUM_ITERATIONS=5 + +function onexit_callback +{ + log_must $ZFS list -t all + log_note "Char devices in /dev/zvol:" + find /dev/zvol -type c +} +log_onexit onexit_callback + +function root_setup +{ + rootds=$1 + + log_must $ZFS create $rootds + for dir in $DIRS; do + log_must $ZFS create $rootds/$dir + done + for vol in $VOLS; do + log_must $ZFS create -V 100M $rootds/$vol + log_must test -c /dev/zvol/$rootds/$vol + done +} + +typeset -i i=0 +while (( i != NUM_ITERATIONS )); do + root=${ROOTPREFIX}_iter${i} + # Test set 3: send|receive & receive with forced rollback + root_setup $root + log_must $ZFS snapshot -r $root@snap + received=${root}_recv + log_must eval "$ZFS send -R $root@snap | $ZFS receive -F ${received}" + for vol in $VOLS; do + log_must test -c /dev/zvol/${received}/${vol} + log_must test -c /dev/zvol/${received}/${vol}@snap + done + # Re-send with -F, to ensure that actual receive rollback also works. + # For good measure, pre-destroy one of the volumes. Also, destroy + # the snapshot we received earlier for this to work. + log_must $ZFS destroy -r $received/vol0 + log_must $ZFS destroy -r $received@snap + log_must eval "$ZFS send -R $root@snap | $ZFS receive -F ${received}" + for vol in $VOLS; do + log_must test -c /dev/zvol/${received}/${vol} + log_must test -c /dev/zvol/${received}/${vol}@snap + done + log_must $ZFS destroy -r ${root} + log_mustnot test -e /dev/zvol/${root}/vol0 + log_mustnot test -e /dev/zvol/${root}/vol0@snap + log_must $ZFS destroy -r ${received} + log_mustnot test -e /dev/zvol/${received}/vol0 + log_mustnot test -e /dev/zvol/${received}/vol0@snap + + (( i += 1 )) +done +log_pass "ZFS volume device nodes are handled properly (part 3)." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_test.sh b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_test.sh new file mode 100755 index 00000000000..8c740f9fac0 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_misc/zvol_misc_test.sh @@ -0,0 +1,262 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zvol_misc_001_neg cleanup +zvol_misc_001_neg_head() +{ + atf_set "descr" "Verify that ZFS volume cannot act as dump device until dumpswap supported." + atf_set "require.progs" dumpadm +} +zvol_misc_001_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_001_neg.ksh || atf_fail "Testcase failed" +} +zvol_misc_001_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_misc_002_pos cleanup +zvol_misc_002_pos_head() +{ + atf_set "descr" "Verify that ZFS volume snapshot could be fscked" + atf_set "require.progs" zfs +} +zvol_misc_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_002_pos.ksh || atf_fail "Testcase failed" +} +zvol_misc_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_misc_003_neg cleanup +zvol_misc_003_neg_head() +{ + atf_set "descr" "Verify create storage pool or newfs over dump volume is denied." + atf_set "require.progs" dumpadm zpool +} +zvol_misc_003_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_003_neg.ksh || atf_fail "Testcase failed" +} +zvol_misc_003_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_misc_004_pos cleanup +zvol_misc_004_pos_head() +{ + atf_set "descr" "Verify permit to create snapshot over dumpswap." + atf_set "require.progs" zfs swap +} +zvol_misc_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_004_pos.ksh || atf_fail "Testcase failed" +} +zvol_misc_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_misc_005_neg cleanup +zvol_misc_005_neg_head() +{ + atf_set "descr" "Verify a device cannot be dump and swap at the same time." + atf_set "require.progs" dumpadm swap +} +zvol_misc_005_neg_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_005_neg.ksh || atf_fail "Testcase failed" +} +zvol_misc_005_neg_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_misc_006_pos cleanup +zvol_misc_006_pos_head() +{ + atf_set "descr" "zfs volume as dumpdevice should have 128k volblocksize" + atf_set "require.progs" dumpadm zfs +} +zvol_misc_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_006_pos.ksh || atf_fail "Testcase failed" +} +zvol_misc_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_misc_007_pos cleanup +zvol_misc_007_pos_head() +{ + atf_set "descr" "zfs volume device nodes are modified appropriately" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +zvol_misc_007_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + atf_expect_fail "PR 225223 zfs rename -r of a snapshot doesn't rename zvol snapshots' device nodes" + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_007_pos.ksh || atf_fail "Testcase failed" +} +zvol_misc_007_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_misc_008_pos cleanup +zvol_misc_008_pos_head() +{ + atf_set "descr" "zfs volume device nodes are modified appropriately" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +zvol_misc_008_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + atf_expect_fail "PR 225200 zfs promote of a zvol doesn't rename device nodes for snapshots" + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_008_pos.ksh || atf_fail "Testcase failed" +} +zvol_misc_008_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_misc_009_pos cleanup +zvol_misc_009_pos_head() +{ + atf_set "descr" "zfs volume device nodes are modified appropriately" + atf_set "require.progs" zfs + atf_set "timeout" 1200 +} +zvol_misc_009_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + verify_disk_count "$DISKS" 1 + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_misc_009_pos.ksh || atf_fail "Testcase failed" +} +zvol_misc_009_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_misc.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zvol_misc_001_neg + atf_add_test_case zvol_misc_002_pos + atf_add_test_case zvol_misc_003_neg + atf_add_test_case zvol_misc_004_pos + atf_add_test_case zvol_misc_005_neg + atf_add_test_case zvol_misc_006_pos + atf_add_test_case zvol_misc_007_pos + atf_add_test_case zvol_misc_008_pos + atf_add_test_case zvol_misc_009_pos +} diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/Makefile b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/Makefile new file mode 100644 index 00000000000..613c2091270 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/Makefile @@ -0,0 +1,23 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zvol/zvol_swap +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zvol_swap_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= zvol_swap_004_pos.ksh +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= zvol_swap_005_pos.ksh +${PACKAGE}FILES+= zvol_swap_001_pos.ksh +${PACKAGE}FILES+= zvol_swap.cfg +${PACKAGE}FILES+= zvol_swap_003_pos.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zvol_swap_006_pos.ksh +${PACKAGE}FILES+= zvol_swap_002_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/cleanup.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/cleanup.ksh new file mode 100644 index 00000000000..406915344f5 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/cleanup.ksh @@ -0,0 +1,52 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)cleanup.ksh 1.3 08/05/14 SMI" +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +verify_runnable "global" + +log_must $SWAPADD +for swapdev in $SAVESWAPDEVS +do + if ! is_swap_inuse $swapdev ; then + log_must $SWAP -a $swapdev >/dev/null 2>&1 + fi +done + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +if is_swap_inuse $voldev ; then + log_must $SWAP -d $voldev +fi + +default_zvol_cleanup + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/setup.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/setup.ksh new file mode 100644 index 00000000000..c4b2b294593 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/setup.ksh @@ -0,0 +1,43 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)setup.ksh 1.2 07/01/09 SMI" +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +verify_runnable "global" + +for i in $SAVESWAPDEVS ; do + log_must eval "$SWAP -d $i >/dev/null 2>&1" +done + +default_zvol_setup $DISK $VOLSIZE + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap.cfg b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap.cfg new file mode 100644 index 00000000000..64f654f8492 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap.cfg @@ -0,0 +1,41 @@ +# vim: filetype=sh +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_swap.cfg 1.2 07/01/09 SMI" +# + +. $STF_SUITE/tests/zvol/zvol.cfg + +# +# Remember swap devices +# +SAVESWAPDEVS=$($SWAP -l | $NAWK '(NR != 1) {print $1}') + +export BLOCKSZ=$(( 1024 * 1024 )) +export NUM_WRITES=40 +export SAVESWAPDEVS diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_001_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_001_pos.ksh new file mode 100644 index 00000000000..f80f405b31a --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_001_pos.ksh @@ -0,0 +1,93 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)zvol_swap_001_pos.ksh 1.3 08/05/14 SMI" +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_swap_001_pos +# +# DESCRIPTION: +# Verify that a zvol can be used as a swap device +# +# STRATEGY: +# 1. Create a pool +# 2. Create a zvol volume +# 3. Use zvol as swap space +# 4. Create a file under $TMPDIR +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + $RM -rf $TMPDIR/$TESTFILE + + if is_swap_inuse $voldev ; then + log_must $SWAP -d $voldev + fi +} + +log_assert "Verify that a zvol can be used as a swap device" + +log_onexit cleanup + +test_requires SWAP + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +log_note "Add zvol volume as swap space" +log_must $SWAP -a $voldev + +log_note "Create a file under $TMPDIR" +log_must $FILE_WRITE -o create -f $TMPDIR/$TESTFILE \ + -b $BLOCKSZ -c $NUM_WRITES -d $DATA + +[[ ! -f $TMPDIR/$TESTFILE ]] && + log_fail "Unable to create file under $TMPDIR" + +filesize=`$LS -l $TMPDIR/$TESTFILE | $AWK '{print $5}'` +tf_size=$(( BLOCKSZ * NUM_WRITES )) +(( $tf_size != $filesize )) && + log_fail "testfile is ($filesize bytes), expected ($tf_size bytes)" + +log_pass "Successfully added a zvol to swap area." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_002_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_002_pos.ksh new file mode 100644 index 00000000000..0d292bb6a90 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_002_pos.ksh @@ -0,0 +1,100 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# ident "@(#)zvol_swap_002_pos.ksh 1.4 09/05/19 SMI" +# +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +############################################################################### +# +# __stc_assertion_start +# +# ID: zvol_swap_002_pos +# +# DESCRIPTION: +# Using a zvol as swap space, fill with files until ENOSPC returned. +# +# STRATEGY: +# 1. Create a pool +# 2. Create a zvol volume +# 3. Add zvol to swap space +# 4. Fill swap space until ENOSPC is returned +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +log_unsupported "Fill swap will cause system hang, hide this case temporarily." + +verify_runnable "global" + +function cleanup +{ + $RM -rf $TMPDIR/$TESTDIR + + if is_swap_inuse $voldev ; then + log_must $SWAP -d $voldev + fi +} + +log_assert "Using a zvol as swap space, fill with files until ENOSPC returned." + +if ! is_dumpswap_supported $TESTPOOL ; then + log_unsupported "ZVOLs as swap devices are not currently supported." +fi + +log_onexit cleanup + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL + +$SWAP -l | $GREP zvol +if (( $? != 0 )) ; then + log_note "Add zvol volume as swap space" + log_must $SWAP -a $voldev +fi + +typeset -i filenum=0 +typeset -i retval=0 +typeset testdir=$TMPDIR/$TESTDIR + +log_note "Attempt to fill $TMPDIR until ENOSPC is hit" +fill_fs $testdir -1 100 $BLOCKSZ $NUM_WRITES +retval=$? + +(( $retval != $ENOSPC )) && \ + log_fail "ENOSPC was not returned, $retval was returned instead" + +log_pass "ENOSPC was returned as expected" diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_003_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_003_pos.ksh new file mode 100644 index 00000000000..54b1bd35bd4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_003_pos.ksh @@ -0,0 +1,163 @@ +#! /usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_swap_003_pos.ksh 1.3 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +################################################################## +# +# __stc_assertion_start +# +# ID: zvol_swap_003_pos +# +# DESCRIPTION: +# Verify that a zvol device can be used as a swap device +# through /etc/vfstab configuration. +# +# STRATEGY: +# 1. Create a pool +# 2. Create a zvol volume +# 3. Save current swaps info and delete current swaps +# 4. Modify /etc/vfstab to add entry for zvol as swap device +# 5. Use /sbin/swapadd to zvol as swap device throuth /etc/vfstab +# 6. Create a file under $TMPDIR +# 7. Verify the file +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2005-07-04) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + if [[ -f $TMPDIR/$TESTFILE ]]; then + log_must $RM -rf $TMPDIR/$TESTFILE + fi + + if [[ -f $TMP_VFSTAB_FILE ]]; then + log_must $RM -rf $TMP_VFSTAB_FILE + fi + + if [[ -f $NEW_VFSTAB_FILE ]]; then + log_must $RM -f $NEW_VFSTAB_FILE + fi + + if [[ -f $PREV_VFSTAB_FILE ]]; then + log_must $MV $PREV_VFSTAB_FILE $VFSTAB_FILE + fi + + log_must $SWAPADD $VFSTAB_FILE + + if is_swap_inuse $voldev ; then + log_must $SWAP -d $voldev + fi + +} + + +log_assert "Verify that a zvol device can be used as a swap device"\ + "through /etc/vfstab configuration." + +log_onexit cleanup + +test_requires SWAPADD + +voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL +VFSTAB_FILE=/etc/vfstab +NEW_VFSTAB_FILE=$TMPDIR/zvol_vfstab.${TESTCASE_ID} +PREV_VFSTAB_FILE=$TMPDIR/zvol_vfstab.PREV.${TESTCASE_ID} +TMP_VFSTAB_FILE=$TMPDIR/zvol_vfstab.tmp.${TESTCASE_ID} + +if [[ -f $NEW_VFSTAB_FILE ]]; then + $RM -f $NEW_VFSTAB_FILE +fi +$TOUCH $NEW_VFSTAB_FILE +$CHMOD 777 $NEW_VFSTAB_FILE + +# +# Go through each line of /etc/vfstab and +# exclude the comment line and formulate +# a new file with an entry of zvol device +# swap device. +# + +$GREP -v "^#" $VFSTAB_FILE > $TMP_VFSTAB_FILE + +typeset -i fndswapline=0 +while read -r i +do + line=`$ECHO "$i" | $AWK '{print $4}'` + if [[ $line == "swap" ]]; then + if [[ $fndswapline -eq 0 ]]; then + $ECHO "$voldev"\ + "\t-\t-\tswap\t-"\ + "\tno\t-" \ + >> $NEW_VFSTAB_FILE + fndswapline=1 + $ECHO "Add an entry of zvol device as"\ + "swap device in $VFSTAB_FILE." + fi + else + $ECHO "$i" >> $NEW_VFSTAB_FILE + fi + +done < $TMP_VFSTAB_FILE + +if [[ $fndswapline -eq 1 ]]; then + log_must $CP $VFSTAB_FILE $PREV_VFSTAB_FILE + log_must $CP $NEW_VFSTAB_FILE $VFSTAB_FILE +else + log_fail "The system has no swap device configuration in /etc/vfstab" +fi + +log_note "Add zvol volume as swap space" +log_must $SWAPADD $VFSTAB_FILE + +log_note "Create a file under $TMPDIR" +log_must $FILE_WRITE -o create -f $TMPDIR/$TESTFILE \ + -b $BLOCKSZ -c $NUM_WRITES -d $DATA + +[[ ! -f $TMPDIR/$TESTFILE ]] && + log_fail "Unable to create file under $TMPDIR" + +filesize=`$LS -l $TMPDIR/$TESTFILE | $AWK '{print $5}'` +tf_size=$(( BLOCKSZ * NUM_WRITES )) +(( $tf_size != $filesize )) && \ + log_fail "testfile is ($filesize bytes), expected ($tf_size bytes)" + +log_pass "Successfully added a zvol to swap area through /etc/vfstab." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_004_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_004_pos.ksh new file mode 100644 index 00000000000..2ef0533f3b6 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_004_pos.ksh @@ -0,0 +1,108 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_swap_004_pos.ksh 1.1 07/01/09 SMI" +# + +. $STF_SUITE/include/libtest.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zvol_swap_004_pos +# +# DESCRIPTION: +# The minimum volume size for swap should be a multiple of 2 pagesize +# bytes. +# +# STRATEGY: +# 1. Get test system page size. +# 2. Create different size volumes. +# 3. Verify 'swap -a' has correct behaviour. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset tmp + for tmp in $swaplist ; do + log_must $SWAP -d $tmp + done + for tmp in $vollist ; do + log_must $ZFS destroy $tmp + done +} + +log_assert "The minimum volume size should be a multiple of 2 pagesize bytes." +log_onexit cleanup + +test_requires SWAP + +typeset -i volblksize pagesize=$($PAGESIZE) +((volblksize = pagesize / 2)) +# +# volume size for swap Expected results +# +set -A array \ + $((volblksize)) "fail" \ + $((2 * volblksize)) "fail" \ + $((3 * volblksize)) "fail" \ + $((4 * volblksize)) "pass" \ + $((5 * volblksize)) "pass" \ + $((6 * volblksize)) "pass" + +typeset -i i=0 +while ((i < ${#array[@]})); do + vol="$TESTPOOL/vol_${array[$i]}" + vollist="$vollist $vol" + + log_must $ZFS create -b $volblksize -V ${array[$i]} $vol + + swapname="/dev/zvol/dsk/$vol" + if [[ ${array[((i+1))]} == "fail" ]]; then + log_mustnot $SWAP -a $swapname + else + log_must $SWAP -a $swapname + swaplist="$swaplist $swapname" + fi + + ((i += 2)) +done + +log_pass "Verify the minimum volume size pass." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_005_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_005_pos.ksh new file mode 100644 index 00000000000..03e7e07d066 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_005_pos.ksh @@ -0,0 +1,109 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_swap_005_pos.ksh 1.2 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zvol_swap_005_pos +# +# DESCRIPTION: +# swaplow + swaplen must be less than or equal to the volume size. +# +# STRATEGY: +# 1. Get test system page size and test volume size. +# 2. Random get swaplow and swaplen. +# 3. Verify swap -a should succeed when swaplow + swaplen <= volume size. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-12) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +log_assert "swaplow + swaplen must be less than or equal to the volume size." + +test_requires SWAP + +typeset vol=$TESTPOOL/$TESTVOL +typeset -i pageblocks volblocks +# +# Both swaplow and swaplen are the desired length of +# the swap area in 512-byte blocks. +# +((pageblocks = $($PAGESIZE) / 512)) +((volblocks = $(get_prop volsize $vol) / 512)) + +typeset -i i=0 +while ((i < 10)) ; do + while true; do + ((swaplow = RANDOM % volblocks)) + # Upwards increment + ((swaplow += pageblocks)) + ((swaplow -= (swaplow % pageblocks))) + + # At lease one page size was left for swap area + ((swaplow != volblocks)) && break + done + + while true; do + ((swaplen = RANDOM % (volblocks - swaplow))) + # Downward increment + ((swaplen -= (swaplen % pageblocks))) + + # At lease one page size was left for swap area + ((swaplen != 0)) && break + done + + # The minimum swap size should be 2 pagesize. + ((swaplow + swaplen < pageblocks * 2)) && continue + + swapname="/dev/zvol/dsk/$vol" + if is_swap_inuse $swapname ; then + log_must $SWAP -d $swapname + fi + + log_must $SWAP -a $swapname $swaplow $swaplen + log_must $SWAP -d $swapname $swaplow + + ((i += 1)) +done + +log_pass "Verify swaplow + swaplen must be less than or equal to volsize passed." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_006_pos.ksh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_006_pos.ksh new file mode 100644 index 00000000000..794a7174419 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_006_pos.ksh @@ -0,0 +1,120 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)zvol_swap_006_pos.ksh 1.4 08/05/14 SMI" +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/tests/zvol/zvol_common.kshlib + +################################################################################# +# +# __stc_assertion_start +# +# ID: zvol_swap_006_pos +# +# DESCRIPTION: +# A volume can be add as several segments, but overlapping are not +# allowed. +# +# STRATEGY: +# 1. Figure out three groups swaplow and swaplen. +# 2. Verify different volume segments can be added correctly. +# 3. Verify overlapping swap volume are not allowed. +# +# TESTABILITY: explicit +# +# TEST_AUTOMATION_LEVEL: automated +# +# CODING_STATUS: COMPLETED (2006-12-13) +# +# __stc_assertion_end +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + typeset -i i=0 + + while ((count > 0)); do + log_must $SWAP -d $swapname ${swap_opt[$i]} + + ((i += 2)) + ((count -= 1)) + done +} + +log_assert "Verify volume can be add as several segments, but overlapping " \ + "are not allowed." +log_onexit cleanup + +test_requires SWAP + +typeset vol=$TESTPOOL/$TESTVOL +typeset -i pageblocks volblocks +((pageblocks = $($PAGESIZE) / 512)) +((volblocks = $(get_prop volsize $vol) / 512)) + +log_note "Verify volume can be add as several segments." + +# +# swaplow swaplen +set -A swap_opt $((pageblocks)) \ + $((pageblocks * ((RANDOM % 50) + 1) + (RANDOM % pageblocks) )) \ + $((volblocks / 3)) \ + $((pageblocks * ((RANDOM % 50) + 1) + (RANDOM % pageblocks) )) \ + $((volblocks / 2)) \ + $((pageblocks * ((RANDOM % 50) + 1) + (RANDOM % pageblocks) )) \ + $(((volblocks*2) / 3)) \ + $((pageblocks * ((RANDOM % 50) + 1) + (RANDOM % pageblocks) )) + +swapname=/dev/zvol/dsk/$vol +typeset -i i=0 count=0 + +if is_swap_inuse $swapname ; then + log_must $SWAP -d $swapname +fi + +while ((i < ${#swap_opt[@]})); do + log_must $SWAP -a $swapname ${swap_opt[$i]} ${swap_opt[((i+1))]} + + ((i += 2)) + ((count += 1)) +done + +log_note "Verify overlapping swap volume are not allowed" +i=0 +while ((i < ${#swap_opt[@]})); do + log_mustnot $SWAP -a $swapname ${swap_opt[$i]} + + ((i += 2)) +done + +log_pass "Verify volume can be added as several segments passed." diff --git a/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_test.sh b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_test.sh new file mode 100755 index 00000000000..92b567e0dc4 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol/zvol_swap/zvol_swap_test.sh @@ -0,0 +1,176 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zvol_swap_001_pos cleanup +zvol_swap_001_pos_head() +{ + atf_set "descr" "Verify that a zvol can be used as a swap device" + atf_set "require.progs" swap swapadd +} +zvol_swap_001_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_swap_001_pos.ksh || atf_fail "Testcase failed" +} +zvol_swap_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_swap_002_pos cleanup +zvol_swap_002_pos_head() +{ + atf_set "descr" "Using a zvol as swap space, fill with files until ENOSPC returned." + atf_set "require.progs" swap swapadd +} +zvol_swap_002_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_swap_002_pos.ksh || atf_fail "Testcase failed" +} +zvol_swap_002_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_swap_003_pos cleanup +zvol_swap_003_pos_head() +{ + atf_set "descr" "Verify that a zvol device can be used as a swap devicethrough /etc/vfstab configuration." + atf_set "require.progs" swapadd swap +} +zvol_swap_003_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_swap_003_pos.ksh || atf_fail "Testcase failed" +} +zvol_swap_003_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_swap_004_pos cleanup +zvol_swap_004_pos_head() +{ + atf_set "descr" "The minimum volume size should be a multiple of 2 pagesize bytes." + atf_set "require.progs" zfs swap pagesize swapadd +} +zvol_swap_004_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_swap_004_pos.ksh || atf_fail "Testcase failed" +} +zvol_swap_004_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_swap_005_pos cleanup +zvol_swap_005_pos_head() +{ + atf_set "descr" "swaplow + swaplen must be less than or equal to the volume size." + atf_set "require.progs" swap pagesize swapadd +} +zvol_swap_005_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_swap_005_pos.ksh || atf_fail "Testcase failed" +} +zvol_swap_005_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_test_case zvol_swap_006_pos cleanup +zvol_swap_006_pos_head() +{ + atf_set "descr" "Verify volume can be add as several segments, but overlappingare not allowed." + atf_set "require.progs" swap pagesize swapadd +} +zvol_swap_006_pos_body() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_swap_006_pos.ksh || atf_fail "Testcase failed" +} +zvol_swap_006_pos_cleanup() +{ + . $(atf_get_srcdir)/../../../include/default.cfg + . $(atf_get_srcdir)/zvol_swap.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zvol_swap_001_pos + atf_add_test_case zvol_swap_002_pos + atf_add_test_case zvol_swap_003_pos + atf_add_test_case zvol_swap_004_pos + atf_add_test_case zvol_swap_005_pos + atf_add_test_case zvol_swap_006_pos +} diff --git a/tests/sys/cddl/zfs/tests/zvol_thrash/Makefile b/tests/sys/cddl/zfs/tests/zvol_thrash/Makefile new file mode 100644 index 00000000000..80a89e0868d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol_thrash/Makefile @@ -0,0 +1,18 @@ +# $FreeBSD$ + +.include + +PACKAGE=tests +TESTSDIR=${TESTSBASE}/sys/cddl/zfs/tests/zvol_thrash +FILESDIR=${TESTSDIR} + +ATF_TESTS_KSH93+= zvol_thrash_test +TEST_METADATA+= required_user="root" +TEST_METADATA+= is_exclusive=true + +${PACKAGE}FILES+= setup.ksh +${PACKAGE}FILES+= cleanup.ksh +${PACKAGE}FILES+= zvol_thrash.cfg +${PACKAGE}FILES+= zvol_thrash_001_pos.ksh + +.include diff --git a/tests/sys/cddl/zfs/tests/zvol_thrash/cleanup.ksh b/tests/sys/cddl/zfs/tests/zvol_thrash/cleanup.ksh new file mode 100644 index 00000000000..b60eb1ebf1d --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol_thrash/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)cleanup.ksh 1.2 07/01/09 SMI" +# +# $FreeBSD$ + +. ${STF_SUITE}/include/libtest.kshlib +. ${STF_SUITE}/include/libgnop.kshlib + +# Rotate logs now, because this test can generate a great volume of log entries +newsyslog + +default_cleanup_noexit +destroy_gnops ${DISKS} +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol_thrash/setup.ksh b/tests/sys/cddl/zfs/tests/zvol_thrash/setup.ksh new file mode 100644 index 00000000000..3eddbfb5516 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol_thrash/setup.ksh @@ -0,0 +1,39 @@ +#!/usr/local/bin/ksh93 -p +# +# 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 http://www.opensolaris.org/os/licensing. +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)setup.ksh 1.3 09/05/19 SMI" +# +# $FreeBSD$ + +. ${STF_SUITE}/include/libtest.kshlib +. $STF_SUITE/include/libgnop.kshlib + +log_must create_gnops ${DISKS} + +# Rotate logs now, because this test can generate a great volume of log entries +newsyslog + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash.cfg b/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash.cfg new file mode 100644 index 00000000000..df5370a0a20 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash.cfg @@ -0,0 +1,33 @@ +# vim: filetype=sh +# +# Copyright (c) 2010 Spectra Logic Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer, +# without modification. +# 2. Redistributions in binary form must reproduce at minimum a disclaimer +# substantially similar to the "NO WARRANTY" disclaimer below +# ("Disclaimer") and any redistribution must be conditioned upon +# including a substantially similar Disclaimer requirement for further +# binary redistribution. +# +# NO WARRANTY +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGES. +# +# $FreeBSD$ +# +export RUNTIME=180 diff --git a/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash_001_pos.ksh b/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash_001_pos.ksh new file mode 100644 index 00000000000..8aac16b5a97 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash_001_pos.ksh @@ -0,0 +1,112 @@ +#!/usr/local/bin/ksh93 +# +# Copyright (c) 2010 Spectra Logic Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer, +# without modification. +# 2. Redistributions in binary form must reproduce at minimum a disclaimer +# substantially similar to the "NO WARRANTY" disclaimer below +# ("Disclaimer") and any redistribution must be conditioned upon +# including a substantially similar Disclaimer requirement for further +# binary redistribution. +# +# NO WARRANTY +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGES. +# +# $FreeBSD$ +# + +. $STF_SUITE/include/libtest.kshlib +. $STF_SUITE/include/libgnop.kshlib + +# Cleanup function. Kill each of the children. +function docleanup +{ + for CPID in $CHILDREN + do + echo "Killing $CPID" + kill $CPID + done + for CPID in $CHILDREN + do + wait $CPID + done +} + +function childcleanup +{ + exit 0 +} + +# Wait for the timeout, and then kill the child processes. +function childrentimeout +{ + log_note "childrentimeout process waiting $1 seconds" + sleep $1 + docleanup +} + +function mk_vols +{ + ADISKS=($DISKS) #Create an array for convenience + N_DISKS=${#ADISKS[@]} + N_MIRRORS=$(($N_DISKS / 2 )) + # Use a special ksh93 expansion to generate the list of gnop devices + GNOPS=${DISKS//~(E)([[:space:]]+|$)/.nop\1} + setup_mirrors $N_MIRRORS $GNOPS + for pool in `all_pools`; do + # Create 4 ZVols per pool. Write a geom label to each, just so + # that we have another geom class between zvol and the vdev + # taster. That thwarts detection of zvols based on a geom + # producer's class name, as was attempted by Perforce change + # 538882 + for ((j=0; $j<4; j=$j+1)); do + $ZFS create -V 10G $pool/testvol.$j + glabel label testlabel$j /dev/zvol/$pool/testvol.$j + done + done +} + +export CHILDREN="" + +log_onexit docleanup + +log_assert "Cause frequent device removal and arrival in the prescence of zvols. ZFS should not crash or hang while tasting them for VDev GUIDs." +mk_vols +for p in `all_pools` +do + #Take the first gnop in the pool + typeset gnop + typeset disk + gnop=`get_disklist $p | cut -d " " -f 1` + disk=${gnop%.nop} + + log_note "thrashing $gnop" + trap childcleanup INT TERM && while `true`; do + log_must destroy_gnop $disk + $SLEEP 5 + log_must create_gnop $disk + $SLEEP 5 + done & + CHILDREN="$CHILDREN $!" +done + +log_note "Waiting $RUNTIME seconds for potential ZFS failure" +childrentimeout $RUNTIME + +log_pass diff --git a/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash_test.sh b/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash_test.sh new file mode 100755 index 00000000000..a56a55f2765 --- /dev/null +++ b/tests/sys/cddl/zfs/tests/zvol_thrash/zvol_thrash_test.sh @@ -0,0 +1,57 @@ +# 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 http://www.opensolaris.org/os/licensing. +# 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 +# + +# $FreeBSD$ + +# +# Copyright 2012 Spectra Logic. All rights reserved. +# Use is subject to license terms. +# + + +atf_test_case zvol_thrash_001_pos cleanup +zvol_thrash_001_pos_head() +{ + atf_set "descr" "Cause frequent device removal and arrival in the prescence of zvols. ZFS should not misbehave while tasting them for VDev GUIDs." + atf_set "require.progs" zfs zpool gnop + atf_set "timeout" 900 +} +zvol_thrash_001_pos_body() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zvol_thrash.cfg + + ksh93 $(atf_get_srcdir)/setup.ksh || atf_fail "Setup failed" + ksh93 $(atf_get_srcdir)/zvol_thrash_001_pos.ksh || atf_fail "Testcase failed" +} +zvol_thrash_001_pos_cleanup() +{ + . $(atf_get_srcdir)/../../include/default.cfg + . $(atf_get_srcdir)/zvol_thrash.cfg + + ksh93 $(atf_get_srcdir)/cleanup.ksh || atf_fail "Cleanup failed" +} + + +atf_init_test_cases() +{ + + atf_add_test_case zvol_thrash_001_pos +}

        2. <5UcALwH0~VH^$}EaZJzI!^vSStY1c>S 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 JJ!5<&{{yF)_cZ_j literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..8715d2cb53b92e945bd2d6b281de25114d9a5f93 GIT binary patch literal 115725 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®=}dMaJCj|=u4FgTh3roDAbXOoWG~Wn`SiyTdkA;*&A$noR^(wp=lCz8ITAL&m{A_K_D

      MLU$w$A7YMPs7x{u}+ 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

      %W! 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 z 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

  • x~1?Ormqp4CVbUE}>lG9a@4XY2lbr(qk_c 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 WONn|1v2>>Ao-R&hy^-jyUj82iE26Xj literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v13.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v13.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..3f99a092f4be4c9f497b30d0a907922d380e8e64 GIT binary patch literal 81519 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 Ee*n+UJOBUy literal 0 HcmV?d00001 diff --git a/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v14.dat.Z b/tests/sys/cddl/zfs/tests/cli_root/zpool_upgrade/blockfiles/zfs-pool-v14.dat.Z new file mode 100644 index 0000000000000000000000000000000000000000..964ebe70bd9e3704c287f17158561ec8441728cc GIT binary patch literal 81669 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%0DlBq{dGH-~>7S7IX=4r;}pZDJUXD+%KpMAE!Me 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≠4rHa&-)OY73}Xgzv9txp@!3+RRP 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