summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wren Kennedy <john.kennedy@delphix.com>2013-12-10 11:09:51 -0800
committerChristopher Siden <chris.siden@delphix.com>2013-12-10 11:10:03 -0800
commitf38cb554a534c6df738be3f4d23327e69888e634 (patch)
treeeed9392267d7039b371719cea7cff1722a55a7f9
parent43466aae47bfcd2ad9bf501faec8e75c08095e4f (diff)
downloadillumos-joyent-f38cb554a534c6df738be3f4d23327e69888e634.tar.gz
4206 history_003_pos relies on exact size of history log and entries
4207 history_008_pos depends on obsolete internal history log message 4208 Typo in zfs_main.c: "posxiuser" 4209 Populate zfstest with the remainder of the STF tests Reviewed by: Sonu Pillai <sonu.pillai@delphix.com> Reviewed by: Will Guyette <will.guyette@delphix.com> Reviewed by: Eric Diven <eric.diven@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Approved by: Richard Lowe <richlowe@richlowe.net>
-rw-r--r--exception_lists/copyright2
-rw-r--r--exception_lists/keywords2
-rw-r--r--usr/src/cmd/zfs/zfs_main.c4
-rw-r--r--usr/src/pkg/manifests/system-test-zfstest.mf757
-rw-r--r--usr/src/test/test-runner/cmd/run.py5
-rw-r--r--usr/src/test/zfs-tests/include/commands.cfg3
-rw-r--r--usr/src/test/zfs-tests/include/libtest.shlib18
-rw-r--r--usr/src/test/zfs-tests/runfiles/delphix.run306
-rw-r--r--usr/src/test/zfs-tests/runfiles/openindiana.run306
-rw-r--r--usr/src/test/zfs-tests/tests/functional/Makefile56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/Makefile54
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache.cfg70
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache.kshlib160
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_001_pos.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_002_pos.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_003_pos.ksh69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_004_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_005_neg.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_006_pos.ksh85
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_007_neg.ksh63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_008_neg.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_009_pos.ksh69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_010_neg.ksh84
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cache_011_pos.ksh68
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/cleanup.ksh46
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cache/setup.ksh45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cachefile/Makefile45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cachefile/cachefile.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cachefile/cachefile.kshlib47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_001_pos.ksh94
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_002_pos.ksh82
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_003_pos.ksh100
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh124
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/Makefile47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_001_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_002_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_003_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_004_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_common.kshlib78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/cleanup.ksh49
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/default.cfg55
-rw-r--r--usr/src/test/zfs-tests/tests/functional/clean_mirror/setup.ksh51
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh6
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/Makefile45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/Makefile83
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/cleanup.ksh50
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/misc.cfg71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/setup.ksh161
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zdb_001_neg.ksh82
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_001_neg.ksh59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_allow_001_neg.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_clone_001_neg.ksh54
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_create_001_neg.ksh61
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_destroy_001_neg.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_get_001_neg.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_inherit_001_neg.ksh56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_mount_001_neg.ksh57
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_promote_001_neg.ksh56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_receive_001_neg.ksh58
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_rename_001_neg.ksh56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_rollback_001_neg.ksh60
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_send_001_neg.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_set_001_neg.ksh70
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_share_001_neg.ksh63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_snapshot_001_neg.ksh56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unallow_001_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unmount_001_neg.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unshare_001_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_upgrade_001_neg.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_001_neg.ksh60
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_add_001_neg.ksh69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_attach_001_neg.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_clear_001_neg.ksh52
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_create_001_neg.ksh69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_destroy_001_neg.ksh59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_detach_001_neg.ksh58
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_export_001_neg.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_get_001_neg.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_history_001_neg.ksh55
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_import_001_neg.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_import_002_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_offline_001_neg.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_online_001_neg.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_remove_001_neg.ksh59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_replace_001_neg.ksh68
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_scrub_001_neg.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_set_001_neg.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_status_001_neg.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_upgrade_001_neg.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/Makefile49
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/cleanup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/setup.ksh70
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.cfg35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.kshlib118
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_001_pos.ksh116
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_002_pos.ksh176
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_003_pos.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_004_neg.ksh63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_007_pos.ksh91
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_008_neg.ksh56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/Makefile43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/Makefile42
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_001_pos.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_002_neg.ksh57
-rw-r--r--usr/src/test/zfs-tests/tests/functional/compression/Makefile46
-rw-r--r--usr/src/test/zfs-tests/tests/functional/compression/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/compression/compress.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/compression/compress_001_pos.ksh74
-rw-r--r--usr/src/test/zfs-tests/tests/functional/compression/compress_002_pos.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/compression/compress_003_pos.ksh96
-rw-r--r--usr/src/test/zfs-tests/tests/functional/compression/compress_004_pos.ksh133
-rw-r--r--usr/src/test/zfs-tests/tests/functional/compression/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/ctime/Makefile67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/ctime/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/ctime/ctime_001_pos.c349
-rw-r--r--usr/src/test/zfs-tests/tests/functional/ctime/setup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/Makefile63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/cleanup.ksh44
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/delegate.cfg59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/delegate_common.kshlib1742
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/setup.ksh59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_001_pos.ksh98
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_002_pos.ksh79
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_003_pos.ksh93
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_004_pos.ksh96
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_005_pos.ksh78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_006_pos.ksh72
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_007_pos.ksh103
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_008_pos.ksh78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_009_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_010_pos.ksh113
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_011_neg.ksh68
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_012_neg.ksh79
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_001_pos.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_002_pos.ksh61
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_003_pos.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_004_pos.ksh59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_005_pos.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_006_pos.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_007_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_008_neg.ksh75
-rw-r--r--usr/src/test/zfs-tests/tests/functional/devices/Makefile46
-rw-r--r--usr/src/test/zfs-tests/tests/functional/devices/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/devices/devices.cfg32
-rw-r--r--usr/src/test/zfs-tests/tests/functional/devices/devices_001_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/devices/devices_002_neg.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/devices/devices_003_pos.ksh49
-rw-r--r--usr/src/test/zfs-tests/tests/functional/devices/devices_common.kshlib119
-rw-r--r--usr/src/test/zfs-tests/tests/functional/devices/setup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/exec/Makefile69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/exec/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/exec/exec_001_pos.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/exec/exec_002_neg.ksh85
-rw-r--r--usr/src/test/zfs-tests/tests/functional/exec/mmap_exec.c71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/exec/setup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/features/Makefile27
-rw-r--r--usr/src/test/zfs-tests/tests/functional/features/async_destroy/Makefile38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/features/async_destroy/async_destroy_001_pos.ksh84
-rw-r--r--usr/src/test/zfs-tests/tests/functional/features/async_destroy/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/features/async_destroy/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_pool/Makefile43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_pool/cleanup.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_pool/grow_pool.cfg63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_pool/grow_pool_001_pos.ksh74
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_pool/setup.ksh54
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_replicas/Makefile43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_replicas/cleanup.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_replicas/grow_replicas.cfg78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_replicas/grow_replicas_001_pos.ksh83
-rw-r--r--usr/src/test/zfs-tests/tests/functional/grow_replicas/setup.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/Makefile64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/cleanup.ksh38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history.cfg45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_001_pos.ksh111
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_002_pos.ksh142
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_003_pos.ksh103
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_004_pos.ksh100
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_005_neg.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_006_neg.ksh84
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_007_pos.ksh112
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_008_pos.ksh74
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_009_pos.ksh114
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_010_pos.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/history_common.kshlib410
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/i386.migratedpool.DAT.Zbin0 -> 173047 bytes
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/i386.orig_history.txt12
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/setup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/sparc.migratedpool.DAT.Zbin0 -> 163879 bytes
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/sparc.orig_history.txt12
-rw-r--r--usr/src/test/zfs-tests/tests/functional/history/zfs-pool-v4.dat.Zbin0 -> 73415 bytes
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/Makefile90
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/README.config67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/README.state109
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/cleanup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config001.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config002.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config003.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config004.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config005.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config006.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config007.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config008.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config009.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config010.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config011.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config012.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config013.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config014.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config015.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config016.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config017.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config018.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config019.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config020.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config021.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config022.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config023.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/config024.cfg33
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/inherit.kshlib114
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/inherit_001_pos.ksh437
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state001.cfg44
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state002.cfg45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state003.cfg43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state004.cfg44
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state005.cfg45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state006.cfg47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state007.cfg45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state008.cfg44
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state009.cfg57
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state010.cfg56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state011.cfg58
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state012.cfg62
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state013.cfg56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state014.cfg62
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state015.cfg66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state016.cfg62
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state017.cfg67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state018.cfg64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state019.cfg63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state020.cfg64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state021.cfg64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state022.cfg63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state023.cfg65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inheritance/state024.cfg63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/interop/Makefile43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/interop/cleanup.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/interop/interop.cfg81
-rw-r--r--usr/src/test/zfs-tests/tests/functional/interop/interop_001_pos.ksh88
-rw-r--r--usr/src/test/zfs-tests/tests/functional/interop/setup.ksh83
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/Makefile51
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse.cfg125
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_001_pos.ksh90
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_002_pos.ksh111
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_003_pos.ksh185
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_004_pos.ksh94
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_005_pos.ksh122
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_006_pos.ksh125
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_007_pos.ksh134
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_008_pos.ksh111
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/inuse_009_pos.ksh122
-rw-r--r--usr/src/test/zfs-tests/tests/functional/inuse/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/large_files/Makefile41
-rw-r--r--usr/src/test/zfs-tests/tests/functional/large_files/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/large_files/large_files_001_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/large_files/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/largest_pool/Makefile41
-rw-r--r--usr/src/test/zfs-tests/tests/functional/largest_pool/largest_pool.cfg43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/largest_pool/largest_pool_001_pos.ksh160
-rw-r--r--usr/src/test/zfs-tests/tests/functional/link_count/Makefile41
-rw-r--r--usr/src/test/zfs-tests/tests/functional/link_count/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/link_count/link_count_001.ksh89
-rw-r--r--usr/src/test/zfs-tests/tests/functional/link_count/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mdb/Makefile42
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mdb/cleanup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mdb/mdb_001_pos.ksh105
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mdb/setup.ksh38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/Makefile55
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/cleanup.ksh58
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration.cfg66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration.kshlib153
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_001_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_002_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_003_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_004_pos.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_005_pos.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_006_pos.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_007_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_008_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_009_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_010_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_011_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/migration_012_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/migration/setup.ksh69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mmap/Makefile42
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mmap/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mmap/mmap_read_001_pos.ksh56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mmap/mmap_write_001_pos.ksh62
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mmap/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mount/Makefile42
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mount/cleanup.ksh38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mount/setup.ksh48
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mount/umount_001.ksh54
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mount/umountall_001.ksh59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mv_files/Makefile45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mv_files/cleanup.ksh48
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mv_files/mv_files.cfg43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_001_pos.ksh69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_002_pos.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_common.kshlib217
-rw-r--r--usr/src/test/zfs-tests/tests/functional/mv_files/setup.ksh47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/nestedfs/Makefile41
-rw-r--r--usr/src/test/zfs-tests/tests/functional/nestedfs/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/nestedfs/nestedfs_001_pos.ksh59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/nestedfs/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/no_space/Makefile43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/no_space/cleanup.ksh49
-rw-r--r--usr/src/test/zfs-tests/tests/functional/no_space/enospc.cfg38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/no_space/enospc_001_pos.ksh68
-rw-r--r--usr/src/test/zfs-tests/tests/functional/no_space/setup.ksh45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/online_offline/Makefile45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/online_offline/cleanup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/online_offline/online_offline.cfg38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_001_pos.ksh144
-rw-r--r--usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_002_neg.ksh141
-rw-r--r--usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_003_neg.ksh133
-rw-r--r--usr/src/test/zfs-tests/tests/functional/online_offline/setup.ksh47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/pool_names/Makefile40
-rw-r--r--usr/src/test/zfs-tests/tests/functional/pool_names/pool_names_001_pos.ksh115
-rw-r--r--usr/src/test/zfs-tests/tests/functional/pool_names/pool_names_002_neg.ksh131
-rw-r--r--usr/src/test/zfs-tests/tests/functional/poolversion/Makefile42
-rw-r--r--usr/src/test/zfs-tests/tests/functional/poolversion/cleanup.ksh42
-rw-r--r--usr/src/test/zfs-tests/tests/functional/poolversion/poolversion_001_pos.ksh58
-rw-r--r--usr/src/test/zfs-tests/tests/functional/poolversion/poolversion_002_pos.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/poolversion/setup.ksh45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/privilege/Makefile42
-rw-r--r--usr/src/test/zfs-tests/tests/functional/privilege/cleanup.ksh49
-rw-r--r--usr/src/test/zfs-tests/tests/functional/privilege/privilege_001_pos.ksh91
-rw-r--r--usr/src/test/zfs-tests/tests/functional/privilege/privilege_002_pos.ksh101
-rw-r--r--usr/src/test/zfs-tests/tests/functional/privilege/setup.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/Makefile49
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/quota.cfg35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/quota.kshlib91
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/quota_001_pos.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/quota_002_pos.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/quota_003_pos.ksh79
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/quota_004_pos.ksh74
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/quota_005_pos.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/quota_006_neg.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/quota/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/Makefile47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/cleanup.ksh38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.cfg40
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.kshlib365
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_001_pos.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_002_pos.ksh83
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_003_pos.ksh93
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_004_neg.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/redundancy/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/Makefile46
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/cleanup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/refquota_001_pos.ksh77
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/refquota_002_pos.ksh90
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/refquota_003_pos.ksh83
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/refquota_004_pos.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/refquota_005_pos.ksh77
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/refquota_006_neg.ksh70
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refquota/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/Makefile47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/cleanup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/refreserv.cfg31
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_001_pos.ksh75
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_002_pos.ksh114
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_003_pos.ksh77
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_004_pos.ksh90
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_005_pos.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/refreserv/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rename_dirs/Makefile41
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rename_dirs/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rename_dirs/rename_dirs_001_pos.ksh71
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rename_dirs/setup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/replacement/Makefile45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/replacement/cleanup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/replacement/replacement.cfg38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/replacement/replacement_001_pos.ksh160
-rw-r--r--usr/src/test/zfs-tests/tests/functional/replacement/replacement_002_pos.ksh177
-rw-r--r--usr/src/test/zfs-tests/tests/functional/replacement/replacement_003_pos.ksh164
-rw-r--r--usr/src/test/zfs-tests/tests/functional/replacement/setup.ksh47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/Makefile64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation.cfg44
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation.shlib201
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_001_pos.sh124
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_002_pos.sh108
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_003_pos.sh134
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_004_pos.sh124
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_005_pos.sh118
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_006_pos.sh81
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_007_pos.sh128
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_008_pos.sh124
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_009_pos.sh100
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_010_pos.sh101
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_011_pos.sh75
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_012_pos.sh88
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_013_pos.sh112
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_014_pos.sh123
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_015_pos.sh99
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_016_pos.sh98
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_017_pos.sh101
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/reservation_018_pos.sh72
-rw-r--r--usr/src/test/zfs-tests/tests/functional/reservation/setup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rootpool/Makefile43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rootpool/cleanup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_002_neg.ksh68
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_003_neg.ksh61
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_007_neg.ksh70
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rootpool/setup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/Makefile56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/cleanup.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend.cfg37
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend.kshlib376
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_001_pos.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_002_pos.ksh93
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_003_pos.ksh95
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_004_pos.ksh120
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_005_pos.ksh104
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_006_pos.ksh82
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_007_pos.ksh99
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_008_pos.ksh128
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_009_pos.ksh94
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_010_pos.ksh77
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_011_pos.ksh125
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_012_pos.ksh201
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/rsend_013_pos.ksh86
-rw-r--r--usr/src/test/zfs-tests/tests/functional/rsend/setup.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/Makefile47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/cleanup.ksh50
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/default.cfg55
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_001_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_002_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_003_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_004_pos.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_common.kshlib78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/scrub_mirror/setup.ksh51
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/Makefile57
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/cleanup.ksh54
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/setup.ksh50
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog.cfg41
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog.kshlib157
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_001_pos.ksh68
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_002_pos.ksh67
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_003_pos.ksh74
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_004_pos.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_005_pos.ksh65
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_006_pos.ksh72
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_007_pos.ksh93
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_008_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_009_neg.ksh69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_010_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_011_neg.ksh70
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_012_neg.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_013_pos.ksh94
-rw-r--r--usr/src/test/zfs-tests/tests/functional/slog/slog_014_pos.ksh80
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/Makefile63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/clone_001_pos.ksh161
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/rollback_001_pos.ksh115
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/rollback_002_pos.ksh133
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/rollback_003_pos.ksh106
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot.cfg53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_001_pos.ksh91
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_002_pos.ksh134
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_003_pos.ksh103
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_004_pos.ksh90
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_005_pos.ksh90
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_006_pos.ksh132
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_007_pos.ksh107
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_008_pos.ksh100
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_009_pos.ksh119
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_010_pos.ksh101
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_011_pos.ksh113
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_012_pos.ksh104
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_013_pos.ksh99
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_014_pos.ksh78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_015_pos.ksh121
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_016_pos.ksh101
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_017_pos.ksh202
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/Makefile47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/snapused.kshlib185
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/snapused_001_pos.ksh91
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/snapused_002_pos.ksh82
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/snapused_003_pos.ksh82
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/snapused_004_pos.ksh95
-rw-r--r--usr/src/test/zfs-tests/tests/functional/snapused/snapused_005_pos.ksh73
-rw-r--r--usr/src/test/zfs-tests/tests/functional/sparse/Makefile43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/sparse/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/sparse/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/sparse/sparse.cfg37
-rw-r--r--usr/src/test/zfs-tests/tests/functional/sparse/sparse_001_pos.ksh80
-rw-r--r--usr/src/test/zfs-tests/tests/functional/threadsappend/Makefile68
-rw-r--r--usr/src/test/zfs-tests/tests/functional/threadsappend/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/threadsappend/setup.ksh36
-rw-r--r--usr/src/test/zfs-tests/tests/functional/threadsappend/threadsappend.c132
-rw-r--r--usr/src/test/zfs-tests/tests/functional/threadsappend/threadsappend_001_pos.ksh82
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/Makefile59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/cleanup.ksh41
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/groupspace_001_pos.ksh79
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/groupspace_002_pos.ksh79
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/setup.ksh44
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota.cfg46
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_001_pos.ksh74
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_002_pos.ksh89
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_003_pos.ksh61
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_004_pos.ksh81
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_005_neg.ksh94
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_006_pos.ksh75
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_007_pos.ksh75
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_008_pos.ksh60
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_009_pos.ksh92
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_010_pos.ksh75
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_011_pos.ksh127
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_012_neg.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userquota_common.kshlib120
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userspace_001_pos.ksh78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/userquota/userspace_002_pos.ksh81
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/Makefile52
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/setup.ksh35
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test.cfg38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test.kshlib50
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_001_pos.ksh62
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_002_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_003_pos.ksh63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_004_pos.ksh60
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_005_pos.ksh60
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_006_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_007_pos.ksh72
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_008_pos.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_009_pos.ksh60
-rw-r--r--usr/src/test/zfs-tests/tests/functional/write_dirs/Makefile44
-rw-r--r--usr/src/test/zfs-tests/tests/functional/write_dirs/cleanup.ksh34
-rw-r--r--usr/src/test/zfs-tests/tests/functional/write_dirs/setup.ksh47
-rw-r--r--usr/src/test/zfs-tests/tests/functional/write_dirs/write_dirs_001_pos.ksh76
-rw-r--r--usr/src/test/zfs-tests/tests/functional/write_dirs/write_dirs_002_pos.ksh77
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/Makefile55
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/cleanup.ksh45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/setup.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_001_pos.ksh63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_002_neg.ksh56
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_003_neg.ksh62
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_004_pos.ksh86
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_005_pos.ksh78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_006_pos.ksh63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_007_neg.ksh81
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_008_pos.ksh80
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_009_neg.ksh62
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_010_neg.ksh66
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_011_pos.ksh193
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_012_pos.ksh103
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_013_pos.ksh88
-rw-r--r--usr/src/test/zfs-tests/tests/functional/xattr/xattr_common.kshlib107
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/Makefile46
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol.cfg38
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/Makefile41
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/cleanup.ksh44
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/setup.ksh45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh80
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/Makefile45
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/cleanup.ksh39
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/setup.ksh39
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_001_pos.ksh63
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_002_pos.ksh62
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_003_neg.ksh59
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_common.shlib140
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/Makefile46
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/cleanup.ksh39
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/setup.ksh43
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_001_neg.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_002_pos.ksh91
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_003_neg.ksh75
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_004_pos.ksh109
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_005_neg.ksh75
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_006_pos.ksh72
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/Makefile48
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/cleanup.ksh53
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/setup.ksh49
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap.cfg40
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_001_pos.ksh78
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_002_pos.ksh64
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_003_pos.ksh96
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_004_pos.ksh83
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_005_pos.ksh69
-rw-r--r--usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_006_pos.ksh108
603 files changed, 45296 insertions, 63 deletions
diff --git a/exception_lists/copyright b/exception_lists/copyright
index 0a41c52102..e3e9007259 100644
--- a/exception_lists/copyright
+++ b/exception_lists/copyright
@@ -334,6 +334,8 @@ usr/src/lib/krb5/ss/std_rqs.c
usr/src/lib/krb5/ss/utils.c
usr/src/lib/librstp/common/*.[ch]
usr/src/lib/librstp/common/[CRT]*
+usr/src/test/zfs-tests/tests/functional/history/*Z
+usr/src/test/zfs-tests/tests/functional/history/*txt
usr/src/uts/intel/nsmb/ioc_check.ref
usr/src/uts/intel/os/splashimage.xpm
usr/src/uts/common/gssapi/mechs/krb5/crypto/block_size.c
diff --git a/exception_lists/keywords b/exception_lists/keywords
index dc9f3618b2..2ac3a477c0 100644
--- a/exception_lists/keywords
+++ b/exception_lists/keywords
@@ -20,6 +20,7 @@
#
# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+# Copyright (c) 2013 by Delphix. All rights reserved.
#
syntax: glob
@@ -32,4 +33,5 @@ usr/src/cmd/terminfo/termcap.src
usr/src/cmd/terminfo/terminfo.src
usr/src/cmd/zonestat/zonestat/zonestat.c
usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.bz2
+usr/src/test/zfs-tests/tests/functional/delegate/delegate_common.kshlib
usr/src/test/test-runner/cmd/run.py
diff --git a/usr/src/cmd/zfs/zfs_main.c b/usr/src/cmd/zfs/zfs_main.c
index 14eb55ecb9..d9ba883d26 100644
--- a/usr/src/cmd/zfs/zfs_main.c
+++ b/usr/src/cmd/zfs/zfs_main.c
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright 2012 Milan Jurik. All rights reserved.
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
* Copyright (c) 2013 Steven Hartland. All rights reserved.
@@ -2137,7 +2137,7 @@ static int us_type_bits[] = {
USTYPE_SMB_USR,
USTYPE_ALL
};
-static char *us_type_names[] = { "posixgroup", "posxiuser", "smbgroup",
+static char *us_type_names[] = { "posixgroup", "posixuser", "smbgroup",
"smbuser", "all" };
typedef struct us_node {
diff --git a/usr/src/pkg/manifests/system-test-zfstest.mf b/usr/src/pkg/manifests/system-test-zfstest.mf
index 8af4c375f6..62d77d6e82 100644
--- a/usr/src/pkg/manifests/system-test-zfstest.mf
+++ b/usr/src/pkg/manifests/system-test-zfstest.mf
@@ -31,6 +31,9 @@ dir path=opt/zfs-tests/tests/functional/acl/nontrivial
dir path=opt/zfs-tests/tests/functional/acl/trivial
dir path=opt/zfs-tests/tests/functional/atime
dir path=opt/zfs-tests/tests/functional/bootfs
+dir path=opt/zfs-tests/tests/functional/cache
+dir path=opt/zfs-tests/tests/functional/cachefile
+dir path=opt/zfs-tests/tests/functional/clean_mirror
dir path=opt/zfs-tests/tests/functional/cli_root
dir path=opt/zfs-tests/tests/functional/cli_root/zdb
dir path=opt/zfs-tests/tests/functional/cli_root/zfs
@@ -76,8 +79,64 @@ dir path=opt/zfs-tests/tests/functional/cli_root/zpool_set
dir path=opt/zfs-tests/tests/functional/cli_root/zpool_status
dir path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade
dir path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles
+dir path=opt/zfs-tests/tests/functional/cli_user
+dir path=opt/zfs-tests/tests/functional/cli_user/misc
+dir path=opt/zfs-tests/tests/functional/cli_user/zfs_list
+dir path=opt/zfs-tests/tests/functional/cli_user/zpool_iostat
+dir path=opt/zfs-tests/tests/functional/cli_user/zpool_list
+dir path=opt/zfs-tests/tests/functional/compression
+dir path=opt/zfs-tests/tests/functional/ctime
+dir path=opt/zfs-tests/tests/functional/delegate
+dir path=opt/zfs-tests/tests/functional/devices
+dir path=opt/zfs-tests/tests/functional/exec
+dir path=opt/zfs-tests/tests/functional/features
+dir path=opt/zfs-tests/tests/functional/features/async_destroy
+dir path=opt/zfs-tests/tests/functional/grow_pool
+dir path=opt/zfs-tests/tests/functional/grow_replicas
+dir path=opt/zfs-tests/tests/functional/history
+dir path=opt/zfs-tests/tests/functional/inheritance
+dir path=opt/zfs-tests/tests/functional/interop
+dir path=opt/zfs-tests/tests/functional/inuse
+dir path=opt/zfs-tests/tests/functional/large_files
+dir path=opt/zfs-tests/tests/functional/largest_pool
+dir path=opt/zfs-tests/tests/functional/link_count
+dir path=opt/zfs-tests/tests/functional/mdb
+dir path=opt/zfs-tests/tests/functional/migration
+dir path=opt/zfs-tests/tests/functional/mmap
+dir path=opt/zfs-tests/tests/functional/mount
+dir path=opt/zfs-tests/tests/functional/mv_files
+dir path=opt/zfs-tests/tests/functional/nestedfs
+dir path=opt/zfs-tests/tests/functional/no_space
dir path=opt/zfs-tests/tests/functional/nopwrite
+dir path=opt/zfs-tests/tests/functional/online_offline
+dir path=opt/zfs-tests/tests/functional/pool_names
+dir path=opt/zfs-tests/tests/functional/poolversion
+dir path=opt/zfs-tests/tests/functional/privilege
+dir path=opt/zfs-tests/tests/functional/quota
+dir path=opt/zfs-tests/tests/functional/redundancy
+dir path=opt/zfs-tests/tests/functional/refquota
+dir path=opt/zfs-tests/tests/functional/refreserv
+dir path=opt/zfs-tests/tests/functional/rename_dirs
+dir path=opt/zfs-tests/tests/functional/replacement
+dir path=opt/zfs-tests/tests/functional/reservation
+dir path=opt/zfs-tests/tests/functional/rootpool
+dir path=opt/zfs-tests/tests/functional/rsend
+dir path=opt/zfs-tests/tests/functional/scrub_mirror
+dir path=opt/zfs-tests/tests/functional/slog
+dir path=opt/zfs-tests/tests/functional/snapshot
+dir path=opt/zfs-tests/tests/functional/snapused
+dir path=opt/zfs-tests/tests/functional/sparse
+dir path=opt/zfs-tests/tests/functional/threadsappend
dir path=opt/zfs-tests/tests/functional/truncate
+dir path=opt/zfs-tests/tests/functional/userquota
+dir path=opt/zfs-tests/tests/functional/utils_test
+dir path=opt/zfs-tests/tests/functional/write_dirs
+dir path=opt/zfs-tests/tests/functional/xattr
+dir path=opt/zfs-tests/tests/functional/zvol
+dir path=opt/zfs-tests/tests/functional/zvol/zvol_ENOSPC
+dir path=opt/zfs-tests/tests/functional/zvol/zvol_cli
+dir path=opt/zfs-tests/tests/functional/zvol/zvol_misc
+dir path=opt/zfs-tests/tests/functional/zvol/zvol_swap
file path=opt/zfs-tests/README mode=0444
file path=opt/zfs-tests/bin/chg_usr_exec mode=0555
file path=opt/zfs-tests/bin/devname2devid mode=0555
@@ -241,6 +300,41 @@ file path=opt/zfs-tests/tests/functional/bootfs/bootfs_005_neg mode=0555
file path=opt/zfs-tests/tests/functional/bootfs/bootfs_006_pos mode=0555
file path=opt/zfs-tests/tests/functional/bootfs/bootfs_007_neg mode=0555
file path=opt/zfs-tests/tests/functional/bootfs/bootfs_008_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_004_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_005_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_007_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_008_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_009_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_010_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cache_011_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cache/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/cache/setup mode=0555
+file path=opt/zfs-tests/tests/functional/cachefile/cachefile.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/cachefile/cachefile.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/cachefile/cachefile_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cachefile/cachefile_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cachefile/cachefile_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/cachefile/cachefile_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/clean_mirror/clean_mirror_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/clean_mirror/clean_mirror_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/clean_mirror/clean_mirror_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/clean_mirror/clean_mirror_004_pos \
+ mode=0555
+file \
+ path=opt/zfs-tests/tests/functional/clean_mirror/clean_mirror_common.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/clean_mirror/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/clean_mirror/default.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/clean_mirror/setup mode=0555
file path=opt/zfs-tests/tests/functional/cli_root/cli_common.kshlib mode=0555
file path=opt/zfs-tests/tests/functional/cli_root/zdb/zdb_001_neg mode=0555
file path=opt/zfs-tests/tests/functional/cli_root/zfs/cleanup mode=0555
@@ -1383,6 +1477,345 @@ file \
file \
path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_009_neg \
mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/misc.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/setup mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zdb_001_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_001_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_allow_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_clone_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_create_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_destroy_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_get_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_inherit_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_mount_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_promote_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_receive_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_rename_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_rollback_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_send_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_set_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_share_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_snapshot_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_unallow_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_unmount_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_unshare_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zfs_upgrade_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_001_neg mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_add_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_attach_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_clear_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_create_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_destroy_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_detach_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_export_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_get_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_history_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_import_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_import_002_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_offline_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_online_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_remove_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_replace_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_scrub_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_set_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_status_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/misc/zpool_upgrade_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/setup mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.cfg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_004_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_007_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_008_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zpool_iostat/cleanup \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zpool_iostat/setup mode=0555
+file \
+ path=opt/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_001_neg \
+ mode=0555
+file \
+ path=opt/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_002_pos \
+ mode=0555
+file \
+ path=opt/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_003_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zpool_list/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/cli_user/zpool_list/setup mode=0555
+file \
+ path=opt/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_001_pos \
+ mode=0555
+file \
+ path=opt/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_002_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/compression/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/compression/compress.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/compression/compress_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/compression/compress_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/compression/compress_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/compression/compress_004_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/compression/setup mode=0555
+file path=opt/zfs-tests/tests/functional/ctime/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/ctime/ctime_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/ctime/setup mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/delegate.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/delegate_common.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/setup mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_007_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_008_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_009_neg mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_010_pos mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_011_neg mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_allow_012_neg mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_unallow_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_unallow_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_unallow_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_unallow_004_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_unallow_005_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_unallow_006_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_unallow_007_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/delegate/zfs_unallow_008_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/devices/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/devices/devices.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/devices/devices_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/devices/devices_002_neg mode=0555
+file path=opt/zfs-tests/tests/functional/devices/devices_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/devices/devices_common.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/devices/setup mode=0555
+file path=opt/zfs-tests/tests/functional/exec/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/exec/exec_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/exec/exec_002_neg mode=0555
+file path=opt/zfs-tests/tests/functional/exec/mmap_exec mode=0555
+file path=opt/zfs-tests/tests/functional/exec/setup mode=0555
+file \
+ path=opt/zfs-tests/tests/functional/features/async_destroy/async_destroy_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/features/async_destroy/cleanup \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/features/async_destroy/setup \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/grow_pool/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/grow_pool/grow_pool.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/grow_pool/grow_pool_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/grow_pool/setup mode=0555
+file path=opt/zfs-tests/tests/functional/grow_replicas/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/grow_replicas/grow_replicas.cfg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/grow_replicas/grow_replicas_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/grow_replicas/setup mode=0555
+file path=opt/zfs-tests/tests/functional/history/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/history/history.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_005_neg mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_006_neg mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_007_pos mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_008_pos mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_009_pos mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_010_pos mode=0555
+file path=opt/zfs-tests/tests/functional/history/history_common.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/history/i386.migratedpool.DAT.Z \
+ mode=0444
+file path=opt/zfs-tests/tests/functional/history/i386.orig_history.txt \
+ mode=0444
+file path=opt/zfs-tests/tests/functional/history/setup mode=0555
+file path=opt/zfs-tests/tests/functional/history/sparc.migratedpool.DAT.Z \
+ mode=0444
+file path=opt/zfs-tests/tests/functional/history/sparc.orig_history.txt \
+ mode=0444
+file path=opt/zfs-tests/tests/functional/history/zfs-pool-v4.dat.Z mode=0444
+file path=opt/zfs-tests/tests/functional/inheritance/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config001.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config002.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config003.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config004.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config005.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config006.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config007.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config008.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config009.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config010.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config011.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config012.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config013.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config014.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config015.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config016.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config017.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config018.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config019.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config020.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config021.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config022.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config023.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/config024.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/inherit.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/inherit_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state001.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state002.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state003.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state004.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state005.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state006.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state007.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state008.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state009.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state010.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state011.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state012.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state013.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state014.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state015.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state016.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state017.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state018.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state019.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state020.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state021.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state022.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state023.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inheritance/state024.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/interop/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/interop/interop.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/interop/interop_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/interop/setup mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_007_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_008_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/inuse_009_pos mode=0555
+file path=opt/zfs-tests/tests/functional/inuse/setup mode=0555
+file path=opt/zfs-tests/tests/functional/large_files/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/large_files/large_files_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/large_files/setup mode=0555
+file path=opt/zfs-tests/tests/functional/largest_pool/largest_pool.cfg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/largest_pool/largest_pool_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/link_count/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/link_count/link_count_001 mode=0555
+file path=opt/zfs-tests/tests/functional/link_count/setup mode=0555
+file path=opt/zfs-tests/tests/functional/mdb/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/mdb/mdb_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/mdb/setup mode=0555
+file path=opt/zfs-tests/tests/functional/migration/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_007_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_008_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_009_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_010_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_011_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/migration_012_pos mode=0555
+file path=opt/zfs-tests/tests/functional/migration/setup mode=0555
+file path=opt/zfs-tests/tests/functional/mmap/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/mmap/mmap_read_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/mmap/mmap_write_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/mmap/setup mode=0555
+file path=opt/zfs-tests/tests/functional/mount/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/mount/setup mode=0555
+file path=opt/zfs-tests/tests/functional/mount/umount_001 mode=0555
+file path=opt/zfs-tests/tests/functional/mount/umountall_001 mode=0555
+file path=opt/zfs-tests/tests/functional/mv_files/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/mv_files/mv_files.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/mv_files/mv_files_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/mv_files/mv_files_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/mv_files/mv_files_common.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/mv_files/setup mode=0555
+file path=opt/zfs-tests/tests/functional/nestedfs/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/nestedfs/nestedfs_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/nestedfs/setup mode=0555
+file path=opt/zfs-tests/tests/functional/no_space/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/no_space/enospc.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/no_space/enospc_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/no_space/setup mode=0555
file path=opt/zfs-tests/tests/functional/nopwrite/cleanup mode=0555
file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite.shlib mode=0555
file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_copies mode=0555
@@ -1396,11 +1829,335 @@ file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_varying_compression \
mode=0555
file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_volume mode=0555
file path=opt/zfs-tests/tests/functional/nopwrite/setup mode=0555
+file path=opt/zfs-tests/tests/functional/online_offline/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/online_offline/online_offline.cfg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/online_offline/online_offline_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/online_offline/online_offline_002_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/online_offline/online_offline_003_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/online_offline/setup mode=0555
+file path=opt/zfs-tests/tests/functional/pool_names/pool_names_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/pool_names/pool_names_002_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/poolversion/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/poolversion/poolversion_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/poolversion/poolversion_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/poolversion/setup mode=0555
+file path=opt/zfs-tests/tests/functional/privilege/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/privilege/privilege_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/privilege/privilege_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/privilege/setup mode=0555
+file path=opt/zfs-tests/tests/functional/quota/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/quota/quota.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/quota/quota.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/quota/quota_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/quota/quota_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/quota/quota_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/quota/quota_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/quota/quota_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/quota/quota_006_neg mode=0555
+file path=opt/zfs-tests/tests/functional/quota/setup mode=0555
+file path=opt/zfs-tests/tests/functional/redundancy/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/redundancy/redundancy.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/redundancy/redundancy.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/redundancy/redundancy_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/redundancy/redundancy_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/redundancy/redundancy_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/redundancy/redundancy_004_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/redundancy/setup mode=0555
+file path=opt/zfs-tests/tests/functional/refquota/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/refquota/refquota_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refquota/refquota_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refquota/refquota_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refquota/refquota_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refquota/refquota_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refquota/refquota_006_neg mode=0555
+file path=opt/zfs-tests/tests/functional/refquota/setup mode=0555
+file path=opt/zfs-tests/tests/functional/refreserv/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/refreserv/refreserv.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/refreserv/refreserv_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refreserv/refreserv_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refreserv/refreserv_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refreserv/refreserv_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refreserv/refreserv_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/refreserv/setup mode=0555
+file path=opt/zfs-tests/tests/functional/rename_dirs/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/rename_dirs/rename_dirs_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/rename_dirs/setup mode=0555
+file path=opt/zfs-tests/tests/functional/replacement/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/replacement/replacement.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/replacement/replacement_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/replacement/replacement_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/replacement/replacement_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/replacement/setup mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation.shlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_004_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_005_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_006_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_007_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_008_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_009_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_010_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_011_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_012_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_013_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_014_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_015_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_016_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_017_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/reservation_018_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/reservation/setup mode=0555
+file path=opt/zfs-tests/tests/functional/rootpool/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/rootpool/rootpool_002_neg mode=0555
+file path=opt/zfs-tests/tests/functional/rootpool/rootpool_003_neg mode=0555
+file path=opt/zfs-tests/tests/functional/rootpool/rootpool_007_neg mode=0555
+file path=opt/zfs-tests/tests/functional/rootpool/setup mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_007_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_008_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_009_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_010_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_011_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_012_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/rsend_013_pos mode=0555
+file path=opt/zfs-tests/tests/functional/rsend/setup mode=0555
+file path=opt/zfs-tests/tests/functional/scrub_mirror/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/scrub_mirror/default.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_004_pos \
+ mode=0555
+file \
+ path=opt/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_common.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/scrub_mirror/setup mode=0555
+file path=opt/zfs-tests/tests/functional/slog/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/slog/setup mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_007_pos mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_008_neg mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_009_neg mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_010_neg mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_011_neg mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_012_neg mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_013_pos mode=0555
+file path=opt/zfs-tests/tests/functional/slog/slog_014_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/clone_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/rollback_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/rollback_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/rollback_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/setup mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_007_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_008_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_009_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_010_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_011_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_012_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_013_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_014_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_015_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_016_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapshot/snapshot_017_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapused/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/snapused/setup mode=0555
+file path=opt/zfs-tests/tests/functional/snapused/snapused.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/snapused/snapused_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapused/snapused_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapused/snapused_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapused/snapused_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/snapused/snapused_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/sparse/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/sparse/setup mode=0555
+file path=opt/zfs-tests/tests/functional/sparse/sparse.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/sparse/sparse_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/threadsappend/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/threadsappend/setup mode=0555
+file path=opt/zfs-tests/tests/functional/threadsappend/threadsappend mode=0555
+file path=opt/zfs-tests/tests/functional/threadsappend/threadsappend_001_pos \
+ mode=0555
file path=opt/zfs-tests/tests/functional/truncate/cleanup mode=0555
file path=opt/zfs-tests/tests/functional/truncate/setup mode=0555
file path=opt/zfs-tests/tests/functional/truncate/truncate.cfg mode=0555
file path=opt/zfs-tests/tests/functional/truncate/truncate_001_pos mode=0555
file path=opt/zfs-tests/tests/functional/truncate/truncate_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/groupspace_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/groupspace_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/setup mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_003_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_005_neg mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_007_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_008_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_009_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_010_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_011_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_012_neg mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userquota_common.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userspace_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/userquota/userspace_002_pos mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/setup mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test.kshlib \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_004_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_005_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_006_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_007_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_008_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/utils_test/utils_test_009_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/write_dirs/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/write_dirs/setup mode=0555
+file path=opt/zfs-tests/tests/functional/write_dirs/write_dirs_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/write_dirs/write_dirs_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/setup mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_001_pos mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_002_neg mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_003_neg mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_004_pos mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_005_pos mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_006_pos mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_007_neg mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_008_pos mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_009_neg mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_010_neg mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_011_pos mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_012_pos mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_013_pos mode=0555
+file path=opt/zfs-tests/tests/functional/xattr/xattr_common.kshlib mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol.cfg mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_ENOSPC/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_ENOSPC/setup mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_cli/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_cli/setup mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_003_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_common.shlib mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_misc/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_misc/setup mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_001_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_003_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_004_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_005_neg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_006_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/cleanup mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/setup mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap.cfg \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_001_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_002_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_003_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_004_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_005_pos \
+ mode=0555
+file path=opt/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_006_pos \
+ mode=0555
license cr_Sun license=cr_Sun
license lic_CDDL license=lic_CDDL
depend fmri=system/file-system/zfs/tests type=require
diff --git a/usr/src/test/test-runner/cmd/run.py b/usr/src/test/test-runner/cmd/run.py
index c725d20275..da0bca1d26 100644
--- a/usr/src/test/test-runner/cmd/run.py
+++ b/usr/src/test/test-runner/cmd/run.py
@@ -12,7 +12,7 @@
#
#
-# Copyright (c) 2012 by Delphix. All rights reserved.
+# Copyright (c) 2013 by Delphix. All rights reserved.
#
import ConfigParser
@@ -234,7 +234,8 @@ class Cmd(object):
if logger is None:
return
- user = ' (run as %s)' % self.user if len(self.user) else ''
+ logname = getpwuid(os.getuid()).pw_name
+ user = ' (run as %s)' % (self.user if len(self.user) else logname)
msga = 'Test: %s%s ' % (self.pathname, user)
msgb = '[%s] [%s]' % (self.result.runtime, self.result.result)
pad = ' ' * (80 - (len(msga) + len(msgb)))
diff --git a/usr/src/test/zfs-tests/include/commands.cfg b/usr/src/test/zfs-tests/include/commands.cfg
index cd8353d260..1d19d9d473 100644
--- a/usr/src/test/zfs-tests/include/commands.cfg
+++ b/usr/src/test/zfs-tests/include/commands.cfg
@@ -10,7 +10,7 @@
#
#
-# Copyright (c) 2012 by Delphix. All rights reserved.
+# Copyright (c) 2013 by Delphix. All rights reserved.
#
export ARP="/usr/sbin/arp"
@@ -141,6 +141,7 @@ export UFSDUMP="/usr/sbin/ufsdump"
export UFSRESTORE="/usr/sbin/ufsrestore"
export UMASK="/usr/bin/umask"
export UMOUNT="/usr/sbin/umount"
+export UMOUNTALL="/usr/sbin/umountall"
export UNAME="/usr/bin/uname"
export UNCOMPRESS="/usr/bin/uncompress"
export UNIQ="/usr/bin/uniq"
diff --git a/usr/src/test/zfs-tests/include/libtest.shlib b/usr/src/test/zfs-tests/include/libtest.shlib
index 3cd2927827..f077e8dc31 100644
--- a/usr/src/test/zfs-tests/include/libtest.shlib
+++ b/usr/src/test/zfs-tests/include/libtest.shlib
@@ -25,7 +25,7 @@
#
#
-# Copyright (c) 2012 by Delphix. All rights reserved.
+# Copyright (c) 2013 by Delphix. All rights reserved.
#
. ${STF_TOOLS}/contrib/include/logapi.shlib
@@ -2569,3 +2569,19 @@ function is_te_enabled
return 0
fi
}
+
+# Utility function to determine if a system has multiple cpus.
+function is_mp
+{
+ (($(psrinfo -p) > 1))
+}
+
+# Run the given command as the user provided.
+function user_run
+{
+ typeset user=$1
+ shift
+
+ eval \$SU \$user -c \"$@\" > /tmp/out 2>/tmp/err
+ return $?
+}
diff --git a/usr/src/test/zfs-tests/runfiles/delphix.run b/usr/src/test/zfs-tests/runfiles/delphix.run
index abab40b68c..b4e0f42bad 100644
--- a/usr/src/test/zfs-tests/runfiles/delphix.run
+++ b/usr/src/test/zfs-tests/runfiles/delphix.run
@@ -55,11 +55,27 @@ tests = ['zfs_acl_chmod_001_pos', 'zfs_acl_compress_001_pos',
tests = ['atime_001_pos', 'atime_002_neg']
[/opt/zfs-tests/tests/functional/bootfs]
-tests = ['bootfs_001_pos', 'bootfs_002_neg', 'bootfs_003_pos', 'bootfs_004_neg',
- 'bootfs_005_neg', 'bootfs_006_pos', 'bootfs_007_neg', 'bootfs_008_neg']
+tests = ['bootfs_001_pos', 'bootfs_002_neg', 'bootfs_003_pos',
+ 'bootfs_004_neg', 'bootfs_005_neg', 'bootfs_006_pos', 'bootfs_007_neg',
+ 'bootfs_008_neg']
pre =
post =
+[/opt/zfs-tests/tests/functional/cache]
+tests = ['cache_001_pos', 'cache_002_pos', 'cache_003_pos', 'cache_004_neg',
+ 'cache_005_neg', 'cache_006_pos', 'cache_007_neg', 'cache_008_neg',
+ 'cache_009_pos', 'cache_010_neg', 'cache_011_pos']
+
+[/opt/zfs-tests/tests/functional/cachefile]
+tests = ['cachefile_001_pos', 'cachefile_002_pos', 'cachefile_003_pos',
+ 'cachefile_004_pos']
+pre =
+post =
+
+[/opt/zfs-tests/tests/functional/clean_mirror]
+tests = [ 'clean_mirror_001_pos', 'clean_mirror_002_pos',
+ 'clean_mirror_003_pos', 'clean_mirror_004_pos']
+
[/opt/zfs-tests/tests/functional/cli_root/zdb]
tests = ['zdb_001_neg']
pre =
@@ -117,7 +133,7 @@ tests = ['zfs_written_property_001_pos']
[/opt/zfs-tests/tests/functional/cli_root/zfs_receive]
tests = ['zfs_receive_001_pos', 'zfs_receive_002_pos', 'zfs_receive_003_pos',
- 'zfs_receive_004_neg', 'zfs_receive_005_neg', 'zfs_receive_006_pos',
+ 'zfs_receive_005_neg', 'zfs_receive_006_pos',
'zfs_receive_007_neg', 'zfs_receive_008_pos', 'zfs_receive_009_neg']
[/opt/zfs-tests/tests/functional/cli_root/zfs_rename]
@@ -131,8 +147,8 @@ tests = ['zfs_rename_001_pos', 'zfs_rename_002_pos', 'zfs_rename_003_pos',
tests = ['zfs_reservation_001_pos', 'zfs_reservation_002_pos']
[/opt/zfs-tests/tests/functional/cli_root/zfs_rollback]
-tests = ['zfs_rollback_001_pos', 'zfs_rollback_002_pos', 'zfs_rollback_003_neg',
- 'zfs_rollback_004_neg']
+tests = ['zfs_rollback_001_pos', 'zfs_rollback_002_pos',
+ 'zfs_rollback_003_neg', 'zfs_rollback_004_neg']
[/opt/zfs-tests/tests/functional/cli_root/zfs_send]
tests = ['zfs_send_001_pos', 'zfs_send_002_pos', 'zfs_send_003_pos',
@@ -156,9 +172,10 @@ tests = ['zfs_share_001_pos', 'zfs_share_002_pos', 'zfs_share_003_pos',
'zfs_share_010_neg', 'zfs_share_011_pos']
[/opt/zfs-tests/tests/functional/cli_root/zfs_snapshot]
-tests = ['zfs_snapshot_001_neg', 'zfs_snapshot_002_neg', 'zfs_snapshot_003_neg',
- 'zfs_snapshot_004_neg', 'zfs_snapshot_005_neg', 'zfs_snapshot_006_pos',
- 'zfs_snapshot_007_neg', 'zfs_snapshot_008_neg', 'zfs_snapshot_009_pos']
+tests = ['zfs_snapshot_001_neg', 'zfs_snapshot_002_neg',
+ 'zfs_snapshot_003_neg', 'zfs_snapshot_004_neg', 'zfs_snapshot_005_neg',
+ 'zfs_snapshot_006_pos', 'zfs_snapshot_007_neg', 'zfs_snapshot_008_neg',
+ 'zfs_snapshot_009_pos']
[/opt/zfs-tests/tests/functional/cli_root/zfs_unmount]
tests = ['zfs_unmount_001_pos', 'zfs_unmount_002_pos', 'zfs_unmount_003_pos',
@@ -190,14 +207,14 @@ tests = ['zpool_attach_001_neg']
tests = ['zpool_clear_001_pos', 'zpool_clear_002_neg', 'zpool_clear_003_neg']
[/opt/zfs-tests/tests/functional/cli_root/zpool_create]
-tests = ['zpool_create_001_pos', 'zpool_create_002_pos', 'zpool_create_003_pos',
- 'zpool_create_004_pos', 'zpool_create_005_pos', 'zpool_create_006_pos',
- 'zpool_create_007_neg', 'zpool_create_008_pos', 'zpool_create_009_neg',
- 'zpool_create_010_neg', 'zpool_create_011_neg', 'zpool_create_012_neg',
- 'zpool_create_013_neg', 'zpool_create_014_neg', 'zpool_create_015_neg',
- 'zpool_create_016_pos', 'zpool_create_017_neg', 'zpool_create_018_pos',
- 'zpool_create_019_pos', 'zpool_create_020_pos', 'zpool_create_021_pos',
- 'zpool_create_022_pos', 'zpool_create_023_neg',
+tests = ['zpool_create_001_pos', 'zpool_create_002_pos',
+ 'zpool_create_003_pos', 'zpool_create_004_pos', 'zpool_create_005_pos',
+ 'zpool_create_006_pos', 'zpool_create_007_neg', 'zpool_create_008_pos',
+ 'zpool_create_009_neg', 'zpool_create_010_neg', 'zpool_create_011_neg',
+ 'zpool_create_012_neg', 'zpool_create_013_neg', 'zpool_create_014_neg',
+ 'zpool_create_015_neg', 'zpool_create_016_pos', 'zpool_create_017_neg',
+ 'zpool_create_018_pos', 'zpool_create_019_pos', 'zpool_create_020_pos',
+ 'zpool_create_021_pos', 'zpool_create_022_pos', 'zpool_create_023_neg',
'zpool_create_features_001_pos', 'zpool_create_features_002_pos',
'zpool_create_features_003_pos', 'zpool_create_features_004_neg']
@@ -211,11 +228,12 @@ post =
tests = ['zpool_detach_001_neg']
[/opt/zfs-tests/tests/functional/cli_root/zpool_expand]
-tests = ['zpool_expand_001_pos', 'zpool_expand_002_pos', 'zpool_expand_003_neg']
+tests = ['zpool_expand_001_pos', 'zpool_expand_002_pos',
+ 'zpool_expand_003_neg']
[/opt/zfs-tests/tests/functional/cli_root/zpool_export]
-tests = ['zpool_export_001_pos', 'zpool_export_002_pos', 'zpool_export_003_neg',
- 'zpool_export_004_pos']
+tests = ['zpool_export_001_pos', 'zpool_export_002_pos',
+ 'zpool_export_003_neg', 'zpool_export_004_pos']
[/opt/zfs-tests/tests/functional/cli_root/zpool_get]
tests = ['zpool_get_001_pos', 'zpool_get_002_pos', 'zpool_get_003_pos',
@@ -225,11 +243,11 @@ tests = ['zpool_get_001_pos', 'zpool_get_002_pos', 'zpool_get_003_pos',
tests = ['zpool_history_001_neg', 'zpool_history_002_pos']
[/opt/zfs-tests/tests/functional/cli_root/zpool_import]
-tests = ['zpool_import_001_pos', 'zpool_import_002_pos', 'zpool_import_003_pos',
- 'zpool_import_004_pos', 'zpool_import_005_pos', 'zpool_import_006_pos',
- 'zpool_import_007_pos', 'zpool_import_008_pos', 'zpool_import_009_neg',
- 'zpool_import_010_pos', 'zpool_import_011_neg', 'zpool_import_012_pos',
- 'zpool_import_013_neg', 'zpool_import_all_001_pos',
+tests = ['zpool_import_001_pos', 'zpool_import_002_pos',
+ 'zpool_import_003_pos', 'zpool_import_004_pos', 'zpool_import_005_pos',
+ 'zpool_import_006_pos', 'zpool_import_007_pos', 'zpool_import_008_pos',
+ 'zpool_import_009_neg', 'zpool_import_010_pos', 'zpool_import_011_neg',
+ 'zpool_import_012_pos', 'zpool_import_013_neg', 'zpool_import_all_001_pos',
'zpool_import_features_001_pos', 'zpool_import_features_002_neg',
'zpool_import_features_003_pos', 'zpool_import_missing_001_pos',
'zpool_import_missing_002_pos', 'zpool_import_missing_003_pos',
@@ -242,7 +260,8 @@ tests = ['zpool_offline_001_pos', 'zpool_offline_002_neg']
tests = ['zpool_online_001_pos', 'zpool_online_002_neg']
[/opt/zfs-tests/tests/functional/cli_root/zpool_remove]
-tests = ['zpool_remove_001_neg', 'zpool_remove_002_pos', 'zpool_remove_003_pos']
+tests = ['zpool_remove_001_neg', 'zpool_remove_002_pos',
+ 'zpool_remove_003_pos']
[/opt/zfs-tests/tests/functional/cli_root/zpool_replace]
tests = ['zpool_replace_001_neg']
@@ -265,10 +284,243 @@ tests = ['zpool_upgrade_001_pos', 'zpool_upgrade_002_pos',
'zpool_upgrade_006_neg', 'zpool_upgrade_007_pos', 'zpool_upgrade_008_pos',
'zpool_upgrade_009_neg']
-[/opt/zfs-tests/tests/functional/truncate]
-tests = ['truncate_001_pos', 'truncate_002_pos']
+[/opt/zfs-tests/tests/functional/cli_user/misc]
+tests = ['zdb_001_neg', 'zfs_001_neg', 'zfs_allow_001_neg',
+ 'zfs_clone_001_neg', 'zfs_create_001_neg', 'zfs_destroy_001_neg',
+ 'zfs_get_001_neg', 'zfs_inherit_001_neg', 'zfs_mount_001_neg',
+ 'zfs_promote_001_neg', 'zfs_receive_001_neg', 'zfs_rename_001_neg',
+ 'zfs_rollback_001_neg', 'zfs_send_001_neg', 'zfs_set_001_neg',
+ 'zfs_share_001_neg', 'zfs_snapshot_001_neg', 'zfs_unallow_001_neg',
+ 'zfs_unmount_001_neg', 'zfs_unshare_001_neg', 'zfs_upgrade_001_neg',
+ 'zpool_001_neg', 'zpool_add_001_neg', 'zpool_attach_001_neg',
+ 'zpool_clear_001_neg', 'zpool_create_001_neg', 'zpool_destroy_001_neg',
+ 'zpool_detach_001_neg', 'zpool_export_001_neg', 'zpool_get_001_neg',
+ 'zpool_history_001_neg', 'zpool_import_001_neg', 'zpool_import_002_neg',
+ 'zpool_offline_001_neg', 'zpool_online_001_neg', 'zpool_remove_001_neg',
+ 'zpool_replace_001_neg', 'zpool_scrub_001_neg', 'zpool_set_001_neg',
+ 'zpool_status_001_neg', 'zpool_upgrade_001_neg']
+user =
+
+[/opt/zfs-tests/tests/functional/cli_user/zfs_list]
+tests = ['zfs_list_001_pos', 'zfs_list_002_pos', 'zfs_list_003_pos',
+ 'zfs_list_004_neg', 'zfs_list_007_pos', 'zfs_list_008_neg']
+user =
+
+[/opt/zfs-tests/tests/functional/cli_user/zpool_iostat]
+tests = ['zpool_iostat_001_neg', 'zpool_iostat_002_pos',
+ 'zpool_iostat_003_neg']
+user =
+
+[/opt/zfs-tests/tests/functional/cli_user/zpool_list]
+tests = ['zpool_list_001_pos', 'zpool_list_002_neg']
+user =
+
+[/opt/zfs-tests/tests/functional/compression]
+tests = ['compress_001_pos', 'compress_002_pos', 'compress_003_pos',
+ 'compress_004_pos']
+
+[/opt/zfs-tests/tests/functional/ctime]
+tests = ['ctime_001_pos' ]
+
+[/opt/zfs-tests/tests/functional/delegate]
+tests = ['zfs_allow_001_pos', 'zfs_allow_002_pos',
+ 'zfs_allow_004_pos', 'zfs_allow_005_pos', 'zfs_allow_006_pos',
+ 'zfs_allow_007_pos', 'zfs_allow_008_pos', 'zfs_allow_009_neg',
+ 'zfs_allow_010_pos', 'zfs_allow_011_neg', 'zfs_allow_012_neg',
+ 'zfs_unallow_001_pos', 'zfs_unallow_002_pos', 'zfs_unallow_003_pos',
+ 'zfs_unallow_004_pos', 'zfs_unallow_005_pos', 'zfs_unallow_006_pos',
+ 'zfs_unallow_007_neg', 'zfs_unallow_008_neg']
+
+[/opt/zfs-tests/tests/functional/devices]
+tests = ['devices_001_pos', 'devices_002_neg', 'devices_003_pos']
+
+[/opt/zfs-tests/tests/functional/exec]
+tests = ['exec_001_pos', 'exec_002_neg']
+
+[/opt/zfs-tests/tests/functional/features/async_destroy]
+tests = ['async_destroy_001_pos']
+
+[/opt/zfs-tests/tests/functional/grow_pool]
+tests = ['grow_pool_001_pos']
+
+[/opt/zfs-tests/tests/functional/grow_replicas]
+tests = ['grow_replicas_001_pos']
+
+[/opt/zfs-tests/tests/functional/history]
+tests = ['history_001_pos', 'history_002_pos', 'history_003_pos',
+ 'history_004_pos', 'history_005_neg', 'history_006_neg', 'history_007_pos',
+ 'history_008_pos', 'history_009_pos', 'history_010_pos']
+
+[/opt/zfs-tests/tests/functional/inheritance]
+tests = ['inherit_001_pos']
+pre =
+
+[/opt/zfs-tests/tests/functional/interop]
+tests = ['interop_001_pos']
+
+[/opt/zfs-tests/tests/functional/inuse]
+tests = ['inuse_001_pos', 'inuse_002_pos', 'inuse_003_pos', 'inuse_004_pos',
+ 'inuse_005_pos', 'inuse_006_pos', 'inuse_007_pos', 'inuse_008_pos',
+ 'inuse_009_pos']
+post =
+
+[/opt/zfs-tests/tests/functional/large_files]
+tests = ['large_files_001_pos']
+
+[/opt/zfs-tests/tests/functional/largest_pool]
+tests = ['largest_pool_001_pos']
+pre =
+post =
+
+[/opt/zfs-tests/tests/functional/link_count]
+tests = ['link_count_001']
+
+[/opt/zfs-tests/tests/functional/mdb]
+tests = ['mdb_001_pos']
+
+[/opt/zfs-tests/tests/functional/migration]
+tests = ['migration_001_pos', 'migration_002_pos', 'migration_003_pos',
+ 'migration_004_pos', 'migration_005_pos', 'migration_006_pos',
+ 'migration_007_pos', 'migration_008_pos', 'migration_009_pos',
+ 'migration_010_pos', 'migration_011_pos', 'migration_012_pos']
+
+[/opt/zfs-tests/tests/functional/mmap]
+tests = ['mmap_read_001_pos', 'mmap_write_001_pos']
+
+[/opt/zfs-tests/tests/functional/mount]
+tests = ['umount_001', 'umountall_001']
+
+[/opt/zfs-tests/tests/functional/mv_files]
+tests = ['mv_files_001_pos', 'mv_files_002_pos']
+
+[/opt/zfs-tests/tests/functional/nestedfs]
+tests = ['nestedfs_001_pos']
+
+[/opt/zfs-tests/tests/functional/no_space]
+tests = ['enospc_001_pos']
[/opt/zfs-tests/tests/functional/nopwrite]
tests = ['nopwrite_copies', 'nopwrite_mtime', 'nopwrite_negative',
'nopwrite_promoted_clone', 'nopwrite_recsize', 'nopwrite_sync',
'nopwrite_varying_compression', 'nopwrite_volume']
+
+[/opt/zfs-tests/tests/functional/online_offline]
+tests = ['online_offline_001_pos', 'online_offline_002_neg',
+ 'online_offline_003_neg']
+
+[/opt/zfs-tests/tests/functional/pool_names]
+tests = ['pool_names_001_pos', 'pool_names_002_neg']
+pre =
+post =
+
+[/opt/zfs-tests/tests/functional/poolversion]
+tests = ['poolversion_001_pos', 'poolversion_002_pos']
+
+[/opt/zfs-tests/tests/functional/privilege]
+tests = ['privilege_001_pos', 'privilege_002_pos']
+
+[/opt/zfs-tests/tests/functional/quota]
+tests = ['quota_001_pos', 'quota_002_pos', 'quota_003_pos', 'quota_004_pos',
+ 'quota_005_pos', 'quota_006_neg']
+
+[/opt/zfs-tests/tests/functional/redundancy]
+tests = ['redundancy_001_pos', 'redundancy_002_pos', 'redundancy_003_pos']
+
+[/opt/zfs-tests/tests/functional/refquota]
+tests = ['refquota_001_pos', 'refquota_002_pos', 'refquota_003_pos',
+ 'refquota_004_pos', 'refquota_005_pos', 'refquota_006_neg']
+
+[/opt/zfs-tests/tests/functional/refreserv]
+tests = ['refreserv_001_pos', 'refreserv_002_pos', 'refreserv_003_pos',
+ 'refreserv_004_pos', 'refreserv_005_pos']
+
+[/opt/zfs-tests/tests/functional/rename_dirs]
+tests = ['rename_dirs_001_pos']
+
+[/opt/zfs-tests/tests/functional/replacement]
+tests = ['replacement_001_pos', 'replacement_002_pos']
+
+[/opt/zfs-tests/tests/functional/reservation]
+tests = ['reservation_001_pos', 'reservation_002_pos', 'reservation_003_pos',
+ 'reservation_004_pos', 'reservation_005_pos', 'reservation_006_pos',
+ 'reservation_007_pos', 'reservation_008_pos', 'reservation_009_pos',
+ 'reservation_010_pos', 'reservation_011_pos', 'reservation_012_pos',
+ 'reservation_013_pos', 'reservation_014_pos', 'reservation_015_pos',
+ 'reservation_016_pos', 'reservation_017_pos', 'reservation_018_pos']
+
+[/opt/zfs-tests/tests/functional/rootpool]
+tests = ['rootpool_002_neg', 'rootpool_003_neg', 'rootpool_007_neg']
+
+[/opt/zfs-tests/tests/functional/rsend]
+tests = ['rsend_001_pos', 'rsend_002_pos', 'rsend_003_pos', 'rsend_004_pos',
+ 'rsend_005_pos', 'rsend_006_pos', 'rsend_007_pos', 'rsend_008_pos',
+ 'rsend_009_pos', 'rsend_010_pos', 'rsend_011_pos', 'rsend_012_pos',
+ 'rsend_013_pos']
+
+[/opt/zfs-tests/tests/functional/scrub_mirror]
+tests = ['scrub_mirror_001_pos', 'scrub_mirror_002_pos',
+ 'scrub_mirror_003_pos', 'scrub_mirror_004_pos']
+
+[/opt/zfs-tests/tests/functional/slog]
+tests = ['slog_001_pos', 'slog_002_pos', 'slog_003_pos', 'slog_004_pos',
+ 'slog_005_pos', 'slog_006_pos', 'slog_007_pos', 'slog_008_neg',
+ 'slog_009_neg', 'slog_010_neg', 'slog_011_neg', 'slog_012_neg',
+ 'slog_013_pos', 'slog_014_pos']
+
+[/opt/zfs-tests/tests/functional/snapshot]
+tests = ['clone_001_pos', 'rollback_001_pos', 'rollback_002_pos',
+ 'rollback_003_pos', 'snapshot_001_pos', 'snapshot_002_pos',
+ 'snapshot_003_pos', 'snapshot_004_pos', 'snapshot_005_pos',
+ 'snapshot_006_pos', 'snapshot_007_pos', 'snapshot_008_pos',
+ 'snapshot_009_pos', 'snapshot_010_pos', 'snapshot_011_pos',
+ 'snapshot_012_pos', 'snapshot_013_pos', 'snapshot_014_pos',
+ 'snapshot_015_pos', 'snapshot_016_pos', 'snapshot_017_pos']
+
+[/opt/zfs-tests/tests/functional/snapused]
+tests = ['snapused_001_pos', 'snapused_002_pos', 'snapused_003_pos',
+ 'snapused_004_pos', 'snapused_005_pos']
+
+[/opt/zfs-tests/tests/functional/sparse]
+tests = ['sparse_001_pos']
+
+[/opt/zfs-tests/tests/functional/threadsappend]
+tests = ['threadsappend_001_pos']
+
+[/opt/zfs-tests/tests/functional/truncate]
+tests = ['truncate_001_pos', 'truncate_002_pos']
+
+[/opt/zfs-tests/tests/functional/userquota]
+tests = ['groupspace_001_pos', 'groupspace_002_pos', 'userquota_001_pos',
+ 'userquota_002_pos', 'userquota_003_pos', 'userquota_004_pos',
+ 'userquota_005_neg', 'userquota_006_pos', 'userquota_007_pos',
+ 'userquota_008_pos', 'userquota_009_pos', 'userquota_010_pos',
+ 'userquota_011_pos', 'userquota_012_neg', 'userspace_001_pos',
+ 'userspace_002_pos']
+
+[/opt/zfs-tests/tests/functional/utils_test]
+tests = ['utils_test_001_pos', 'utils_test_002_pos', 'utils_test_003_pos',
+ 'utils_test_004_pos', 'utils_test_005_pos', 'utils_test_006_pos',
+ 'utils_test_007_pos', 'utils_test_008_pos', 'utils_test_009_pos']
+
+[/opt/zfs-tests/tests/functional/write_dirs]
+tests = ['write_dirs_001_pos', 'write_dirs_002_pos']
+
+[/opt/zfs-tests/tests/functional/xattr]
+tests = ['xattr_001_pos', 'xattr_002_neg', 'xattr_003_neg', 'xattr_004_pos',
+ 'xattr_005_pos', 'xattr_006_pos', 'xattr_007_neg', 'xattr_008_pos',
+ 'xattr_009_neg', 'xattr_010_neg', 'xattr_011_pos', 'xattr_012_pos',
+ 'xattr_013_pos']
+
+[/opt/zfs-tests/tests/functional/zvol/zvol_ENOSPC]
+tests = ['zvol_ENOSPC_001_pos']
+
+[/opt/zfs-tests/tests/functional/zvol/zvol_cli]
+tests = ['zvol_cli_001_pos', 'zvol_cli_002_pos', 'zvol_cli_003_neg']
+
+[/opt/zfs-tests/tests/functional/zvol/zvol_misc]
+tests = ['zvol_misc_001_neg', 'zvol_misc_002_pos', 'zvol_misc_003_neg',
+ 'zvol_misc_004_pos', 'zvol_misc_005_neg', 'zvol_misc_006_pos']
+
+[/opt/zfs-tests/tests/functional/zvol/zvol_swap]
+tests = ['zvol_swap_001_pos', 'zvol_swap_002_pos', 'zvol_swap_003_pos',
+ 'zvol_swap_004_pos', 'zvol_swap_005_pos', 'zvol_swap_006_pos']
diff --git a/usr/src/test/zfs-tests/runfiles/openindiana.run b/usr/src/test/zfs-tests/runfiles/openindiana.run
index abab40b68c..b4e0f42bad 100644
--- a/usr/src/test/zfs-tests/runfiles/openindiana.run
+++ b/usr/src/test/zfs-tests/runfiles/openindiana.run
@@ -55,11 +55,27 @@ tests = ['zfs_acl_chmod_001_pos', 'zfs_acl_compress_001_pos',
tests = ['atime_001_pos', 'atime_002_neg']
[/opt/zfs-tests/tests/functional/bootfs]
-tests = ['bootfs_001_pos', 'bootfs_002_neg', 'bootfs_003_pos', 'bootfs_004_neg',
- 'bootfs_005_neg', 'bootfs_006_pos', 'bootfs_007_neg', 'bootfs_008_neg']
+tests = ['bootfs_001_pos', 'bootfs_002_neg', 'bootfs_003_pos',
+ 'bootfs_004_neg', 'bootfs_005_neg', 'bootfs_006_pos', 'bootfs_007_neg',
+ 'bootfs_008_neg']
pre =
post =
+[/opt/zfs-tests/tests/functional/cache]
+tests = ['cache_001_pos', 'cache_002_pos', 'cache_003_pos', 'cache_004_neg',
+ 'cache_005_neg', 'cache_006_pos', 'cache_007_neg', 'cache_008_neg',
+ 'cache_009_pos', 'cache_010_neg', 'cache_011_pos']
+
+[/opt/zfs-tests/tests/functional/cachefile]
+tests = ['cachefile_001_pos', 'cachefile_002_pos', 'cachefile_003_pos',
+ 'cachefile_004_pos']
+pre =
+post =
+
+[/opt/zfs-tests/tests/functional/clean_mirror]
+tests = [ 'clean_mirror_001_pos', 'clean_mirror_002_pos',
+ 'clean_mirror_003_pos', 'clean_mirror_004_pos']
+
[/opt/zfs-tests/tests/functional/cli_root/zdb]
tests = ['zdb_001_neg']
pre =
@@ -117,7 +133,7 @@ tests = ['zfs_written_property_001_pos']
[/opt/zfs-tests/tests/functional/cli_root/zfs_receive]
tests = ['zfs_receive_001_pos', 'zfs_receive_002_pos', 'zfs_receive_003_pos',
- 'zfs_receive_004_neg', 'zfs_receive_005_neg', 'zfs_receive_006_pos',
+ 'zfs_receive_005_neg', 'zfs_receive_006_pos',
'zfs_receive_007_neg', 'zfs_receive_008_pos', 'zfs_receive_009_neg']
[/opt/zfs-tests/tests/functional/cli_root/zfs_rename]
@@ -131,8 +147,8 @@ tests = ['zfs_rename_001_pos', 'zfs_rename_002_pos', 'zfs_rename_003_pos',
tests = ['zfs_reservation_001_pos', 'zfs_reservation_002_pos']
[/opt/zfs-tests/tests/functional/cli_root/zfs_rollback]
-tests = ['zfs_rollback_001_pos', 'zfs_rollback_002_pos', 'zfs_rollback_003_neg',
- 'zfs_rollback_004_neg']
+tests = ['zfs_rollback_001_pos', 'zfs_rollback_002_pos',
+ 'zfs_rollback_003_neg', 'zfs_rollback_004_neg']
[/opt/zfs-tests/tests/functional/cli_root/zfs_send]
tests = ['zfs_send_001_pos', 'zfs_send_002_pos', 'zfs_send_003_pos',
@@ -156,9 +172,10 @@ tests = ['zfs_share_001_pos', 'zfs_share_002_pos', 'zfs_share_003_pos',
'zfs_share_010_neg', 'zfs_share_011_pos']
[/opt/zfs-tests/tests/functional/cli_root/zfs_snapshot]
-tests = ['zfs_snapshot_001_neg', 'zfs_snapshot_002_neg', 'zfs_snapshot_003_neg',
- 'zfs_snapshot_004_neg', 'zfs_snapshot_005_neg', 'zfs_snapshot_006_pos',
- 'zfs_snapshot_007_neg', 'zfs_snapshot_008_neg', 'zfs_snapshot_009_pos']
+tests = ['zfs_snapshot_001_neg', 'zfs_snapshot_002_neg',
+ 'zfs_snapshot_003_neg', 'zfs_snapshot_004_neg', 'zfs_snapshot_005_neg',
+ 'zfs_snapshot_006_pos', 'zfs_snapshot_007_neg', 'zfs_snapshot_008_neg',
+ 'zfs_snapshot_009_pos']
[/opt/zfs-tests/tests/functional/cli_root/zfs_unmount]
tests = ['zfs_unmount_001_pos', 'zfs_unmount_002_pos', 'zfs_unmount_003_pos',
@@ -190,14 +207,14 @@ tests = ['zpool_attach_001_neg']
tests = ['zpool_clear_001_pos', 'zpool_clear_002_neg', 'zpool_clear_003_neg']
[/opt/zfs-tests/tests/functional/cli_root/zpool_create]
-tests = ['zpool_create_001_pos', 'zpool_create_002_pos', 'zpool_create_003_pos',
- 'zpool_create_004_pos', 'zpool_create_005_pos', 'zpool_create_006_pos',
- 'zpool_create_007_neg', 'zpool_create_008_pos', 'zpool_create_009_neg',
- 'zpool_create_010_neg', 'zpool_create_011_neg', 'zpool_create_012_neg',
- 'zpool_create_013_neg', 'zpool_create_014_neg', 'zpool_create_015_neg',
- 'zpool_create_016_pos', 'zpool_create_017_neg', 'zpool_create_018_pos',
- 'zpool_create_019_pos', 'zpool_create_020_pos', 'zpool_create_021_pos',
- 'zpool_create_022_pos', 'zpool_create_023_neg',
+tests = ['zpool_create_001_pos', 'zpool_create_002_pos',
+ 'zpool_create_003_pos', 'zpool_create_004_pos', 'zpool_create_005_pos',
+ 'zpool_create_006_pos', 'zpool_create_007_neg', 'zpool_create_008_pos',
+ 'zpool_create_009_neg', 'zpool_create_010_neg', 'zpool_create_011_neg',
+ 'zpool_create_012_neg', 'zpool_create_013_neg', 'zpool_create_014_neg',
+ 'zpool_create_015_neg', 'zpool_create_016_pos', 'zpool_create_017_neg',
+ 'zpool_create_018_pos', 'zpool_create_019_pos', 'zpool_create_020_pos',
+ 'zpool_create_021_pos', 'zpool_create_022_pos', 'zpool_create_023_neg',
'zpool_create_features_001_pos', 'zpool_create_features_002_pos',
'zpool_create_features_003_pos', 'zpool_create_features_004_neg']
@@ -211,11 +228,12 @@ post =
tests = ['zpool_detach_001_neg']
[/opt/zfs-tests/tests/functional/cli_root/zpool_expand]
-tests = ['zpool_expand_001_pos', 'zpool_expand_002_pos', 'zpool_expand_003_neg']
+tests = ['zpool_expand_001_pos', 'zpool_expand_002_pos',
+ 'zpool_expand_003_neg']
[/opt/zfs-tests/tests/functional/cli_root/zpool_export]
-tests = ['zpool_export_001_pos', 'zpool_export_002_pos', 'zpool_export_003_neg',
- 'zpool_export_004_pos']
+tests = ['zpool_export_001_pos', 'zpool_export_002_pos',
+ 'zpool_export_003_neg', 'zpool_export_004_pos']
[/opt/zfs-tests/tests/functional/cli_root/zpool_get]
tests = ['zpool_get_001_pos', 'zpool_get_002_pos', 'zpool_get_003_pos',
@@ -225,11 +243,11 @@ tests = ['zpool_get_001_pos', 'zpool_get_002_pos', 'zpool_get_003_pos',
tests = ['zpool_history_001_neg', 'zpool_history_002_pos']
[/opt/zfs-tests/tests/functional/cli_root/zpool_import]
-tests = ['zpool_import_001_pos', 'zpool_import_002_pos', 'zpool_import_003_pos',
- 'zpool_import_004_pos', 'zpool_import_005_pos', 'zpool_import_006_pos',
- 'zpool_import_007_pos', 'zpool_import_008_pos', 'zpool_import_009_neg',
- 'zpool_import_010_pos', 'zpool_import_011_neg', 'zpool_import_012_pos',
- 'zpool_import_013_neg', 'zpool_import_all_001_pos',
+tests = ['zpool_import_001_pos', 'zpool_import_002_pos',
+ 'zpool_import_003_pos', 'zpool_import_004_pos', 'zpool_import_005_pos',
+ 'zpool_import_006_pos', 'zpool_import_007_pos', 'zpool_import_008_pos',
+ 'zpool_import_009_neg', 'zpool_import_010_pos', 'zpool_import_011_neg',
+ 'zpool_import_012_pos', 'zpool_import_013_neg', 'zpool_import_all_001_pos',
'zpool_import_features_001_pos', 'zpool_import_features_002_neg',
'zpool_import_features_003_pos', 'zpool_import_missing_001_pos',
'zpool_import_missing_002_pos', 'zpool_import_missing_003_pos',
@@ -242,7 +260,8 @@ tests = ['zpool_offline_001_pos', 'zpool_offline_002_neg']
tests = ['zpool_online_001_pos', 'zpool_online_002_neg']
[/opt/zfs-tests/tests/functional/cli_root/zpool_remove]
-tests = ['zpool_remove_001_neg', 'zpool_remove_002_pos', 'zpool_remove_003_pos']
+tests = ['zpool_remove_001_neg', 'zpool_remove_002_pos',
+ 'zpool_remove_003_pos']
[/opt/zfs-tests/tests/functional/cli_root/zpool_replace]
tests = ['zpool_replace_001_neg']
@@ -265,10 +284,243 @@ tests = ['zpool_upgrade_001_pos', 'zpool_upgrade_002_pos',
'zpool_upgrade_006_neg', 'zpool_upgrade_007_pos', 'zpool_upgrade_008_pos',
'zpool_upgrade_009_neg']
-[/opt/zfs-tests/tests/functional/truncate]
-tests = ['truncate_001_pos', 'truncate_002_pos']
+[/opt/zfs-tests/tests/functional/cli_user/misc]
+tests = ['zdb_001_neg', 'zfs_001_neg', 'zfs_allow_001_neg',
+ 'zfs_clone_001_neg', 'zfs_create_001_neg', 'zfs_destroy_001_neg',
+ 'zfs_get_001_neg', 'zfs_inherit_001_neg', 'zfs_mount_001_neg',
+ 'zfs_promote_001_neg', 'zfs_receive_001_neg', 'zfs_rename_001_neg',
+ 'zfs_rollback_001_neg', 'zfs_send_001_neg', 'zfs_set_001_neg',
+ 'zfs_share_001_neg', 'zfs_snapshot_001_neg', 'zfs_unallow_001_neg',
+ 'zfs_unmount_001_neg', 'zfs_unshare_001_neg', 'zfs_upgrade_001_neg',
+ 'zpool_001_neg', 'zpool_add_001_neg', 'zpool_attach_001_neg',
+ 'zpool_clear_001_neg', 'zpool_create_001_neg', 'zpool_destroy_001_neg',
+ 'zpool_detach_001_neg', 'zpool_export_001_neg', 'zpool_get_001_neg',
+ 'zpool_history_001_neg', 'zpool_import_001_neg', 'zpool_import_002_neg',
+ 'zpool_offline_001_neg', 'zpool_online_001_neg', 'zpool_remove_001_neg',
+ 'zpool_replace_001_neg', 'zpool_scrub_001_neg', 'zpool_set_001_neg',
+ 'zpool_status_001_neg', 'zpool_upgrade_001_neg']
+user =
+
+[/opt/zfs-tests/tests/functional/cli_user/zfs_list]
+tests = ['zfs_list_001_pos', 'zfs_list_002_pos', 'zfs_list_003_pos',
+ 'zfs_list_004_neg', 'zfs_list_007_pos', 'zfs_list_008_neg']
+user =
+
+[/opt/zfs-tests/tests/functional/cli_user/zpool_iostat]
+tests = ['zpool_iostat_001_neg', 'zpool_iostat_002_pos',
+ 'zpool_iostat_003_neg']
+user =
+
+[/opt/zfs-tests/tests/functional/cli_user/zpool_list]
+tests = ['zpool_list_001_pos', 'zpool_list_002_neg']
+user =
+
+[/opt/zfs-tests/tests/functional/compression]
+tests = ['compress_001_pos', 'compress_002_pos', 'compress_003_pos',
+ 'compress_004_pos']
+
+[/opt/zfs-tests/tests/functional/ctime]
+tests = ['ctime_001_pos' ]
+
+[/opt/zfs-tests/tests/functional/delegate]
+tests = ['zfs_allow_001_pos', 'zfs_allow_002_pos',
+ 'zfs_allow_004_pos', 'zfs_allow_005_pos', 'zfs_allow_006_pos',
+ 'zfs_allow_007_pos', 'zfs_allow_008_pos', 'zfs_allow_009_neg',
+ 'zfs_allow_010_pos', 'zfs_allow_011_neg', 'zfs_allow_012_neg',
+ 'zfs_unallow_001_pos', 'zfs_unallow_002_pos', 'zfs_unallow_003_pos',
+ 'zfs_unallow_004_pos', 'zfs_unallow_005_pos', 'zfs_unallow_006_pos',
+ 'zfs_unallow_007_neg', 'zfs_unallow_008_neg']
+
+[/opt/zfs-tests/tests/functional/devices]
+tests = ['devices_001_pos', 'devices_002_neg', 'devices_003_pos']
+
+[/opt/zfs-tests/tests/functional/exec]
+tests = ['exec_001_pos', 'exec_002_neg']
+
+[/opt/zfs-tests/tests/functional/features/async_destroy]
+tests = ['async_destroy_001_pos']
+
+[/opt/zfs-tests/tests/functional/grow_pool]
+tests = ['grow_pool_001_pos']
+
+[/opt/zfs-tests/tests/functional/grow_replicas]
+tests = ['grow_replicas_001_pos']
+
+[/opt/zfs-tests/tests/functional/history]
+tests = ['history_001_pos', 'history_002_pos', 'history_003_pos',
+ 'history_004_pos', 'history_005_neg', 'history_006_neg', 'history_007_pos',
+ 'history_008_pos', 'history_009_pos', 'history_010_pos']
+
+[/opt/zfs-tests/tests/functional/inheritance]
+tests = ['inherit_001_pos']
+pre =
+
+[/opt/zfs-tests/tests/functional/interop]
+tests = ['interop_001_pos']
+
+[/opt/zfs-tests/tests/functional/inuse]
+tests = ['inuse_001_pos', 'inuse_002_pos', 'inuse_003_pos', 'inuse_004_pos',
+ 'inuse_005_pos', 'inuse_006_pos', 'inuse_007_pos', 'inuse_008_pos',
+ 'inuse_009_pos']
+post =
+
+[/opt/zfs-tests/tests/functional/large_files]
+tests = ['large_files_001_pos']
+
+[/opt/zfs-tests/tests/functional/largest_pool]
+tests = ['largest_pool_001_pos']
+pre =
+post =
+
+[/opt/zfs-tests/tests/functional/link_count]
+tests = ['link_count_001']
+
+[/opt/zfs-tests/tests/functional/mdb]
+tests = ['mdb_001_pos']
+
+[/opt/zfs-tests/tests/functional/migration]
+tests = ['migration_001_pos', 'migration_002_pos', 'migration_003_pos',
+ 'migration_004_pos', 'migration_005_pos', 'migration_006_pos',
+ 'migration_007_pos', 'migration_008_pos', 'migration_009_pos',
+ 'migration_010_pos', 'migration_011_pos', 'migration_012_pos']
+
+[/opt/zfs-tests/tests/functional/mmap]
+tests = ['mmap_read_001_pos', 'mmap_write_001_pos']
+
+[/opt/zfs-tests/tests/functional/mount]
+tests = ['umount_001', 'umountall_001']
+
+[/opt/zfs-tests/tests/functional/mv_files]
+tests = ['mv_files_001_pos', 'mv_files_002_pos']
+
+[/opt/zfs-tests/tests/functional/nestedfs]
+tests = ['nestedfs_001_pos']
+
+[/opt/zfs-tests/tests/functional/no_space]
+tests = ['enospc_001_pos']
[/opt/zfs-tests/tests/functional/nopwrite]
tests = ['nopwrite_copies', 'nopwrite_mtime', 'nopwrite_negative',
'nopwrite_promoted_clone', 'nopwrite_recsize', 'nopwrite_sync',
'nopwrite_varying_compression', 'nopwrite_volume']
+
+[/opt/zfs-tests/tests/functional/online_offline]
+tests = ['online_offline_001_pos', 'online_offline_002_neg',
+ 'online_offline_003_neg']
+
+[/opt/zfs-tests/tests/functional/pool_names]
+tests = ['pool_names_001_pos', 'pool_names_002_neg']
+pre =
+post =
+
+[/opt/zfs-tests/tests/functional/poolversion]
+tests = ['poolversion_001_pos', 'poolversion_002_pos']
+
+[/opt/zfs-tests/tests/functional/privilege]
+tests = ['privilege_001_pos', 'privilege_002_pos']
+
+[/opt/zfs-tests/tests/functional/quota]
+tests = ['quota_001_pos', 'quota_002_pos', 'quota_003_pos', 'quota_004_pos',
+ 'quota_005_pos', 'quota_006_neg']
+
+[/opt/zfs-tests/tests/functional/redundancy]
+tests = ['redundancy_001_pos', 'redundancy_002_pos', 'redundancy_003_pos']
+
+[/opt/zfs-tests/tests/functional/refquota]
+tests = ['refquota_001_pos', 'refquota_002_pos', 'refquota_003_pos',
+ 'refquota_004_pos', 'refquota_005_pos', 'refquota_006_neg']
+
+[/opt/zfs-tests/tests/functional/refreserv]
+tests = ['refreserv_001_pos', 'refreserv_002_pos', 'refreserv_003_pos',
+ 'refreserv_004_pos', 'refreserv_005_pos']
+
+[/opt/zfs-tests/tests/functional/rename_dirs]
+tests = ['rename_dirs_001_pos']
+
+[/opt/zfs-tests/tests/functional/replacement]
+tests = ['replacement_001_pos', 'replacement_002_pos']
+
+[/opt/zfs-tests/tests/functional/reservation]
+tests = ['reservation_001_pos', 'reservation_002_pos', 'reservation_003_pos',
+ 'reservation_004_pos', 'reservation_005_pos', 'reservation_006_pos',
+ 'reservation_007_pos', 'reservation_008_pos', 'reservation_009_pos',
+ 'reservation_010_pos', 'reservation_011_pos', 'reservation_012_pos',
+ 'reservation_013_pos', 'reservation_014_pos', 'reservation_015_pos',
+ 'reservation_016_pos', 'reservation_017_pos', 'reservation_018_pos']
+
+[/opt/zfs-tests/tests/functional/rootpool]
+tests = ['rootpool_002_neg', 'rootpool_003_neg', 'rootpool_007_neg']
+
+[/opt/zfs-tests/tests/functional/rsend]
+tests = ['rsend_001_pos', 'rsend_002_pos', 'rsend_003_pos', 'rsend_004_pos',
+ 'rsend_005_pos', 'rsend_006_pos', 'rsend_007_pos', 'rsend_008_pos',
+ 'rsend_009_pos', 'rsend_010_pos', 'rsend_011_pos', 'rsend_012_pos',
+ 'rsend_013_pos']
+
+[/opt/zfs-tests/tests/functional/scrub_mirror]
+tests = ['scrub_mirror_001_pos', 'scrub_mirror_002_pos',
+ 'scrub_mirror_003_pos', 'scrub_mirror_004_pos']
+
+[/opt/zfs-tests/tests/functional/slog]
+tests = ['slog_001_pos', 'slog_002_pos', 'slog_003_pos', 'slog_004_pos',
+ 'slog_005_pos', 'slog_006_pos', 'slog_007_pos', 'slog_008_neg',
+ 'slog_009_neg', 'slog_010_neg', 'slog_011_neg', 'slog_012_neg',
+ 'slog_013_pos', 'slog_014_pos']
+
+[/opt/zfs-tests/tests/functional/snapshot]
+tests = ['clone_001_pos', 'rollback_001_pos', 'rollback_002_pos',
+ 'rollback_003_pos', 'snapshot_001_pos', 'snapshot_002_pos',
+ 'snapshot_003_pos', 'snapshot_004_pos', 'snapshot_005_pos',
+ 'snapshot_006_pos', 'snapshot_007_pos', 'snapshot_008_pos',
+ 'snapshot_009_pos', 'snapshot_010_pos', 'snapshot_011_pos',
+ 'snapshot_012_pos', 'snapshot_013_pos', 'snapshot_014_pos',
+ 'snapshot_015_pos', 'snapshot_016_pos', 'snapshot_017_pos']
+
+[/opt/zfs-tests/tests/functional/snapused]
+tests = ['snapused_001_pos', 'snapused_002_pos', 'snapused_003_pos',
+ 'snapused_004_pos', 'snapused_005_pos']
+
+[/opt/zfs-tests/tests/functional/sparse]
+tests = ['sparse_001_pos']
+
+[/opt/zfs-tests/tests/functional/threadsappend]
+tests = ['threadsappend_001_pos']
+
+[/opt/zfs-tests/tests/functional/truncate]
+tests = ['truncate_001_pos', 'truncate_002_pos']
+
+[/opt/zfs-tests/tests/functional/userquota]
+tests = ['groupspace_001_pos', 'groupspace_002_pos', 'userquota_001_pos',
+ 'userquota_002_pos', 'userquota_003_pos', 'userquota_004_pos',
+ 'userquota_005_neg', 'userquota_006_pos', 'userquota_007_pos',
+ 'userquota_008_pos', 'userquota_009_pos', 'userquota_010_pos',
+ 'userquota_011_pos', 'userquota_012_neg', 'userspace_001_pos',
+ 'userspace_002_pos']
+
+[/opt/zfs-tests/tests/functional/utils_test]
+tests = ['utils_test_001_pos', 'utils_test_002_pos', 'utils_test_003_pos',
+ 'utils_test_004_pos', 'utils_test_005_pos', 'utils_test_006_pos',
+ 'utils_test_007_pos', 'utils_test_008_pos', 'utils_test_009_pos']
+
+[/opt/zfs-tests/tests/functional/write_dirs]
+tests = ['write_dirs_001_pos', 'write_dirs_002_pos']
+
+[/opt/zfs-tests/tests/functional/xattr]
+tests = ['xattr_001_pos', 'xattr_002_neg', 'xattr_003_neg', 'xattr_004_pos',
+ 'xattr_005_pos', 'xattr_006_pos', 'xattr_007_neg', 'xattr_008_pos',
+ 'xattr_009_neg', 'xattr_010_neg', 'xattr_011_pos', 'xattr_012_pos',
+ 'xattr_013_pos']
+
+[/opt/zfs-tests/tests/functional/zvol/zvol_ENOSPC]
+tests = ['zvol_ENOSPC_001_pos']
+
+[/opt/zfs-tests/tests/functional/zvol/zvol_cli]
+tests = ['zvol_cli_001_pos', 'zvol_cli_002_pos', 'zvol_cli_003_neg']
+
+[/opt/zfs-tests/tests/functional/zvol/zvol_misc]
+tests = ['zvol_misc_001_neg', 'zvol_misc_002_pos', 'zvol_misc_003_neg',
+ 'zvol_misc_004_pos', 'zvol_misc_005_neg', 'zvol_misc_006_pos']
+
+[/opt/zfs-tests/tests/functional/zvol/zvol_swap]
+tests = ['zvol_swap_001_pos', 'zvol_swap_002_pos', 'zvol_swap_003_pos',
+ 'zvol_swap_004_pos', 'zvol_swap_005_pos', 'zvol_swap_006_pos']
diff --git a/usr/src/test/zfs-tests/tests/functional/Makefile b/usr/src/test/zfs-tests/tests/functional/Makefile
index a222f54372..39df901840 100644
--- a/usr/src/test/zfs-tests/tests/functional/Makefile
+++ b/usr/src/test/zfs-tests/tests/functional/Makefile
@@ -1,4 +1,5 @@
#
+#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
@@ -10,7 +11,7 @@
#
#
-# Copyright (c) 2012 by Delphix. All rights reserved.
+# Copyright (c) 2013 by Delphix. All rights reserved.
#
.PARALLEL: $(SUBDIRS)
@@ -18,8 +19,59 @@
SUBDIRS = acl \
atime \
bootfs \
+ cache \
+ cachefile \
+ clean_mirror \
cli_root \
+ cli_user \
+ compression \
+ ctime \
+ delegate \
+ devices \
+ exec \
+ features \
+ grow_pool \
+ grow_replicas \
+ history \
+ inheritance \
+ interop \
+ inuse \
+ large_files \
+ largest_pool \
+ link_count \
+ mdb \
+ migration \
+ mmap \
+ mount \
+ mv_files \
+ nestedfs \
+ no_space \
nopwrite \
- truncate
+ online_offline \
+ pool_names \
+ poolversion \
+ privilege \
+ quota \
+ redundancy \
+ refquota \
+ refreserv \
+ rename_dirs \
+ replacement \
+ reservation \
+ rootpool \
+ rsend \
+ scrub_mirror \
+ slog \
+ snapshot \
+ snapused \
+ sparse \
+ threadsappend \
+ truncate \
+ userquota \
+ utils_test \
+ write_dirs \
+ xattr \
+ zvol
+
include $(SRC)/test/Makefile.com
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/Makefile b/usr/src/test/zfs-tests/tests/functional/cache/Makefile
new file mode 100644
index 0000000000..d687c6d946
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/Makefile
@@ -0,0 +1,54 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/cache
+
+PROGS = cleanup \
+ setup \
+ cache_001_pos \
+ cache_002_pos \
+ cache_003_pos \
+ cache_004_neg \
+ cache_005_neg \
+ cache_006_pos \
+ cache_007_neg \
+ cache_008_neg \
+ cache_009_pos \
+ cache_010_neg \
+ cache_011_pos
+
+FILES = cache.cfg \
+ cache.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/cache.cfg b/usr/src/test/zfs-tests/tests/functional/cache/cache.cfg
new file mode 100644
index 0000000000..34d58483de
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache.cfg
@@ -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
+#
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+function set_disks
+{
+ set -A disk_array $(find_disks $DISKS)
+
+ typeset -i DISK_ARRAY_NUM=0
+
+ if (( ${#disk_array[*]} <= 1 )); then
+ export DISK=${DISKS%% *}
+ else
+ export DISK=""
+ typeset -i i=0
+ while (( i < ${#disk_array[*]} )); do
+ export DISK${i}="${disk_array[$i]}"
+ DISKSARRAY="$DISKSARRAY ${disk_array[$i]}"
+ (( i = i + 1 ))
+ done
+ export DISK_ARRAY_NUM=$i
+ export DISKSARRAY
+ fi
+
+ if (( $DISK_ARRAY_NUM == 0 )); then
+ export disk=$DISK
+ else
+ export disk=$DISK0
+ fi
+}
+
+set_disks
+
+export SIZE=64M
+
+export VDIR=/disk.cache
+export VDIR2=/disk2.cache
+
+export VDEV="$VDIR/a $VDIR/b $VDIR/c"
+export LDEV="$DISK0"
+export VDEV2="$VDIR2/a $VDIR2/b $VDIR2/c"
+export LDEV2="$DISK1"
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/cache.kshlib b/usr/src/test/zfs-tests/tests/functional/cache/cache.kshlib
new file mode 100644
index 0000000000..6cdeef7d6d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache.kshlib
@@ -0,0 +1,160 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+function cleanup
+{
+ if datasetexists $TESTPOOL ; then
+ log_must $ZPOOL destroy -f $TESTPOOL
+ fi
+ if datasetexists $TESTPOOL2 ; then
+ log_must $ZPOOL destroy -f $TESTPOOL2
+ fi
+}
+
+#
+# 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.$$ &
+ typeset pid=$!
+
+ $ZPOOL iostat -v 1 3 > /dev/null
+ ((ret |= $?))
+
+ kill -9 $pid
+
+ return $ret
+}
+
+#
+# Verify the given 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 <pool> <device> " \
+ "<status> [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 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 'BEGIN {start=0} \
+ /\tcache/ {start=1}
+ /\tmirror/ || /\tspares/ || /^$/ {start=0}
+ (start==1) && /\t (\/|[a-zA-Z])/ \
+ {print "stripe:" $1 " " $2}
+ (start==1) && /\t (\/|[a-zA-Z])/ \
+ {print "mirror:" $1 " " $2}
+ # When hotspare is replacing
+ (start==1) && /\t (\/|[a-zA-Z])/ \
+ {print "mirror:" $1 " " $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
+}
+
+function verify_cache_support
+{
+ $ZPOOL upgrade -v | $GREP "Cache devices" > /dev/null 2>&1
+ return $?
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/cache_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_001_pos.ksh
new file mode 100644
index 0000000000..7b4f560c83
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_001_pos.ksh
@@ -0,0 +1,65 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/cache/cache_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_002_pos.ksh
new file mode 100644
index 0000000000..5c2c34e14b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_002_pos.ksh
@@ -0,0 +1,65 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/cache/cache_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_003_pos.ksh
new file mode 100644
index 0000000000..73b5d34d54
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_003_pos.ksh
@@ -0,0 +1,69 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+verify_disk_count "$LDEV2"
+
+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/usr/src/test/zfs-tests/tests/functional/cache/cache_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_004_neg.ksh
new file mode 100644
index 0000000000..e71d4d093a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_004_neg.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+verify_disk_count "$LDEV2"
+
+log_assert "Attaching a cache device fails for an existing cache device."
+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 for an existing cache device."
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/cache_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_005_neg.ksh
new file mode 100644
index 0000000000..6f61326fd9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_005_neg.ksh
@@ -0,0 +1,65 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+verify_disk_count "$LDEV2"
+
+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/usr/src/test/zfs-tests/tests/functional/cache/cache_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_006_pos.ksh
new file mode 100644
index 0000000000..1ced5abe01
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_006_pos.ksh
@@ -0,0 +1,85 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+verify_disk_count "$LDEV2"
+
+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/usr/src/test/zfs-tests/tests/functional/cache/cache_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_007_neg.ksh
new file mode 100644
index 0000000000..3f204ef4bd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_007_neg.ksh
@@ -0,0 +1,63 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# DESCRIPTION:
+# A mirror/raidz/raidz2 cache is not supported.
+#
+# STRATEGY:
+# 1. Try to create pool with unsupported type
+# 2. Verify failed to create pool.
+#
+
+verify_runnable "global"
+verify_disk_count "$LDEV2"
+
+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/usr/src/test/zfs-tests/tests/functional/cache/cache_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_008_neg.ksh
new file mode 100644
index 0000000000..c251c5afbb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_008_neg.ksh
@@ -0,0 +1,67 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+verify_disk_count "$LDEV2"
+
+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 $TESTPOOL
+ done
+done
+
+log_pass "A mirror/raidz/raidz2 cache can not be added to existed pool."
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/cache_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_009_pos.ksh
new file mode 100644
index 0000000000..f4c5f50d94
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_009_pos.ksh
@@ -0,0 +1,69 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+verify_disk_count "$LDEV2"
+
+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_must $ZPOOL online $TESTPOOL $ldev
+ log_must display_status $TESTPOOL
+ log_must verify_cache_device $TESTPOOL $ldev 'ONLINE' ''
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+done
+
+log_pass "Offline and online a cache device succeed."
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/cache_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_010_neg.ksh
new file mode 100644
index 0000000000..f17b286c3f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_010_neg.ksh
@@ -0,0 +1,84 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# DESCRIPTION:
+# Verify cache device must be a block device.
+#
+# STRATEGY:
+# 1. Create a pool
+# 2. Add different object as cache
+# 3. Verify character devices and files fail
+#
+
+verify_runnable "global"
+
+function cleanup_testenv
+{
+ cleanup
+ if [[ -n $lofidev ]]; then
+ log_must $LOFIADM -d $lofidev
+ fi
+}
+
+log_assert "Cache device can only be block devices."
+log_onexit cleanup_testenv
+
+TESTVOL=testvol1$$
+dsk1=${DISKS%% *}
+log_must $ZPOOL create $TESTPOOL ${DISKS#$dsk1}
+
+# Add nomal /dev/rdsk device
+log_mustnot $ZPOOL add $TESTPOOL cache /dev/rdsk/${dsk1}s0
+#log_must verify_cache_device $TESTPOOL $dsk1 'ONLINE'
+
+# Add nomal file
+log_mustnot $ZPOOL add $TESTPOOL cache $VDEV2
+
+# Add /dev/rlofi device
+lofidev=${VDEV2%% *}
+log_must $LOFIADM -a $lofidev
+lofidev=$($LOFIADM $lofidev)
+log_mustnot $ZPOOL add $TESTPOOL cache "/dev/rlofi/${lofidev#/dev/lofi/}"
+if [[ -n $lofidev ]]; then
+ log_must $LOFIADM -d $lofidev
+ lofidev=""
+fi
+
+# Add /dev/zvol/rdsk device
+log_must $ZPOOL create $TESTPOOL2 $VDEV2
+log_must $ZFS create -V $SIZE $TESTPOOL2/$TESTVOL
+log_mustnot $ZPOOL add $TESTPOOL cache /dev/zvol/rdsk/$TESTPOOL2/$TESTVOL
+
+log_pass "Cache device can only be block devices."
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/cache_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cache_011_pos.ksh
new file mode 100644
index 0000000000..5f9e6db278
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cache_011_pos.ksh
@@ -0,0 +1,68 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+verify_disk_count "$LDEV2"
+
+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/usr/src/test/zfs-tests/tests/functional/cache/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cache/cleanup.ksh
new file mode 100644
index 0000000000..020324f720
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/cleanup.ksh
@@ -0,0 +1,46 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.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
+
+log_must $RM -rf $VDIR $VDIR2
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/cache/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cache/setup.ksh
new file mode 100644
index 0000000000..10b617feab
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cache/setup.ksh
@@ -0,0 +1,45 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cache/cache.cfg
+. $STF_SUITE/tests/functional/cache/cache.kshlib
+
+verify_runnable "global"
+
+if ! $(is_physical_device $LDEV) ; then
+ log_unsupported "Only physical disk could be cache device"
+fi
+
+log_must $RM -rf $VDIR $VDIR2
+log_must $MKDIR -p $VDIR $VDIR2
+log_must $MKFILE $SIZE $VDEV $VDEV2
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/cachefile/Makefile b/usr/src/test/zfs-tests/tests/functional/cachefile/Makefile
new file mode 100644
index 0000000000..0b232e3e9b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cachefile/Makefile
@@ -0,0 +1,45 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/cachefile
+
+PROGS = cachefile_001_pos \
+ cachefile_002_pos \
+ cachefile_003_pos \
+ cachefile_004_pos
+
+FILES = cachefile.cfg \
+ cachefile.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile.cfg b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile.cfg
new file mode 100644
index 0000000000..33101de704
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export CPATH="/etc/zfs/zpool.cache"
+export CPATH1=/var/tmp/cachefile.$$
+export CPATH2=/cachefile.$$
diff --git a/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile.kshlib b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile.kshlib
new file mode 100644
index 0000000000..85fe65fedd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile.kshlib
@@ -0,0 +1,47 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+#
+# 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}
+
+ RESULT=$($STRINGS $cachefile | $GREP -w $1)
+ if [ -z "$RESULT" ]
+ then
+ return 1
+ fi
+ return 0
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_001_pos.ksh
new file mode 100644
index 0000000000..f6481be9d0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_001_pos.ksh
@@ -0,0 +1,94 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cachefile/cachefile.cfg
+. $STF_SUITE/tests/functional/cachefile/cachefile.kshlib
+
+#
+# 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
+#
+
+function cleanup
+{
+ typeset file
+
+ if poolexists $TESTPOOL ; then
+ destroy_pool $TESTPOOL
+ fi
+ 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
+
+set -A opts "none" "false" "none" \
+ "$CPATH" "true" "-" \
+ "$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/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_002_pos.ksh
new file mode 100644
index 0000000000..b8d5b0a110
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_002_pos.ksh
@@ -0,0 +1,82 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cachefile/cachefile.cfg
+. $STF_SUITE/tests/functional/cachefile/cachefile.kshlib
+
+#
+# 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=<cachefile>
+# 8. Verify the pool doesn't have an entry in zpool.cache
+#
+
+function cleanup
+{
+ if poolexists $TESTPOOL ; then
+ destroy_pool $TESTPOOL
+ fi
+}
+
+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_must $ZPOOL destroy $TESTPOOL
+
+log_pass "Importing a pool with \"cachefile\" set doesn't update zpool.cache"
diff --git a/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_003_pos.ksh
new file mode 100644
index 0000000000..c4eb0fba19
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_003_pos.ksh
@@ -0,0 +1,100 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cachefile/cachefile.cfg
+. $STF_SUITE/tests/functional/cachefile/cachefile.kshlib
+
+#
+# DESCRIPTION:
+#
+# Setting altroot=<path> and cachefile=$CPATH for zpool create is succeed
+#
+# STRATEGY:
+# 1. Attempt to create a pool with -o altroot=<path> -o cachefile=<value>
+# 2. Verify the command succeed
+#
+#
+
+TESTDIR=/altdir.$$
+
+function cleanup
+{
+ typeset file
+
+ if poolexists $TESTPOOL ; then
+ destroy_pool $TESTPOOL
+ fi
+
+ 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
+
+set -A opts "none" "none" \
+ "$CPATH" "-" \
+ "$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 $TESTPOOL
+ (( i = i + 2 ))
+done
+
+log_pass "Setting altroot=path and cachefile=$CPATH for zpool create succeed."
diff --git a/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh
new file mode 100644
index 0000000000..98adfd08db
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cachefile/cachefile_004_pos.ksh
@@ -0,0 +1,124 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cachefile/cachefile.cfg
+. $STF_SUITE/tests/functional/cachefile/cachefile.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+ poolexists $TESTPOOL2 && 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
+
+ if poolexists $TESTPOOL ; then
+ destroy_pool $TESTPOOL
+ fi
+
+ 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 $MKFILE 64M $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/usr/src/test/zfs-tests/tests/functional/clean_mirror/Makefile b/usr/src/test/zfs-tests/tests/functional/clean_mirror/Makefile
new file mode 100644
index 0000000000..93ef8bbe4f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/Makefile
@@ -0,0 +1,47 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/clean_mirror
+
+PROGS = clean_mirror_001_pos \
+ clean_mirror_002_pos \
+ clean_mirror_003_pos \
+ clean_mirror_004_pos \
+ cleanup \
+ setup
+
+FILES = clean_mirror_common.kshlib \
+ default.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_001_pos.ksh
new file mode 100644
index 0000000000..4286c61afe
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_001_pos.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/clean_mirror/clean_mirror_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_002_pos.ksh
new file mode 100644
index 0000000000..56faf12ad1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_002_pos.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/clean_mirror/clean_mirror_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_003_pos.ksh
new file mode 100644
index 0000000000..878d10a550
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_003_pos.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/clean_mirror/clean_mirror_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_004_pos.ksh
new file mode 100644
index 0000000000..d73c79edf6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_004_pos.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/clean_mirror/clean_mirror_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_common.kshlib b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_common.kshlib
new file mode 100644
index 0000000000..3fd6c02aa1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/clean_mirror_common.kshlib
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/clean_mirror/default.cfg
+
+# 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 files
+ set -A cksums
+ set -A newcksums
+
+ while (( atfile < FILE_COUNT )); do
+ files[$atfile]=$TESTDIR/file.$atfile
+ log_must $FILE_WRITE -o create -f $TESTDIR/file.$atfile \
+ -b $FILE_SIZE -c 1
+ cksums[$atfile]=$($CKSUM ${files[$atfile]})
+ (( atfile = atfile + 1 ))
+ done
+
+ # dd the primary side of the mirror
+ log_must $DD if=$OVERWRITING_DEVICE of=/dev/dsk/$AFFECTED_DEVICE \
+ seek=8 bs=$DD_BLOCK count=$(( DD_COUNT - 8 )) conv=notrunc
+
+ atfile=0
+
+ typeset -i failedcount=0
+ while (( atfile < FILE_COUNT )); do
+ files[$atfile]=$TESTDIR/file.$atfile
+ newcksum=$($CKSUM ${files[$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/usr/src/test/zfs-tests/tests/functional/clean_mirror/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/clean_mirror/cleanup.ksh
new file mode 100644
index 0000000000..6311004564
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/cleanup.ksh
@@ -0,0 +1,49 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/clean_mirror/default.cfg
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+$DF -F 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/usr/src/test/zfs-tests/tests/functional/clean_mirror/default.cfg b/usr/src/test/zfs-tests/tests/functional/clean_mirror/default.cfg
new file mode 100644
index 0000000000..37e1b248de
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/default.cfg
@@ -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
+#
+
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+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}s0
+ SIDE_SECONDARY=${SINGLE_DISK}s1
+else
+ SIDE_PRIMARY=${MIRROR_PRIMARY}s0
+ SIDE_SECONDARY=${MIRROR_SECONDARY}s0
+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 DD_BLOCK=$(( 64 * 1024 ))
+export DD_COUNT=$(( MIRROR_MEGS * 1024 * 1024 / DD_BLOCK ))
diff --git a/usr/src/test/zfs-tests/tests/functional/clean_mirror/setup.ksh b/usr/src/test/zfs-tests/tests/functional/clean_mirror/setup.ksh
new file mode 100644
index 0000000000..c800853695
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/clean_mirror/setup.ksh
@@ -0,0 +1,51 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/clean_mirror/default.cfg
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+if ! $(is_physical_device $DISKS) ; then
+ log_unsupported "This directory cannot be run on raw files."
+fi
+
+if [[ -n $SINGLE_DISK ]]; then
+ log_note "Partitioning a single disk ($SINGLE_DISK)"
+else
+ log_note "Partitioning disks ($MIRROR_PRIMARY $MIRROR_SECONDARY)"
+fi
+log_must set_partition ${SIDE_PRIMARY##*s} "" $MIRROR_SIZE $MIRROR_PRIMARY
+log_must set_partition ${SIDE_SECONDARY##*s} "" $MIRROR_SIZE $MIRROR_SECONDARY
+
+default_mirror_setup $SIDE_PRIMARY $SIDE_SECONDARY
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh
index 4c8d0393ca..c6d046cfd0 100644
--- a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh
+++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh
@@ -25,6 +25,10 @@
# Use is subject to license terms.
#
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/cli_root/zpool_get/zpool_get.cfg
@@ -81,7 +85,7 @@ i=$(( $i + 1 ))
COUNT=$($WC /tmp/values.$$ | $AWK '{print $1}')
if [ $i -ne $COUNT ]
then
- log_fail "Length of output $COUNT was not equal to number of props + 1."
+ log_fail "Found zpool features not in the zpool_get test config."
fi
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_user/Makefile
new file mode 100644
index 0000000000..b1d21436ac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/Makefile
@@ -0,0 +1,45 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+.PARALLEL: $(SUBDIRS)
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_user
+
+PROGS = cli_common.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+SUBDIRS = misc \
+ zfs_list \
+ zpool_iostat \
+ zpool_list
+
+include $(SRC)/test/Makefile.com
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/Makefile
new file mode 100644
index 0000000000..e2f5a44e91
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/Makefile
@@ -0,0 +1,83 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_user/misc
+
+PROGS = cleanup \
+ setup \
+ zdb_001_neg \
+ zfs_001_neg \
+ zfs_allow_001_neg \
+ zfs_clone_001_neg \
+ zfs_create_001_neg \
+ zfs_destroy_001_neg \
+ zfs_get_001_neg \
+ zfs_inherit_001_neg \
+ zfs_mount_001_neg \
+ zfs_promote_001_neg \
+ zfs_receive_001_neg \
+ zfs_rename_001_neg \
+ zfs_rollback_001_neg \
+ zfs_send_001_neg \
+ zfs_set_001_neg \
+ zfs_share_001_neg \
+ zfs_snapshot_001_neg \
+ zfs_unallow_001_neg \
+ zfs_unmount_001_neg \
+ zfs_unshare_001_neg \
+ zfs_upgrade_001_neg \
+ zpool_001_neg \
+ zpool_add_001_neg \
+ zpool_attach_001_neg \
+ zpool_clear_001_neg \
+ zpool_create_001_neg \
+ zpool_destroy_001_neg \
+ zpool_detach_001_neg \
+ zpool_export_001_neg \
+ zpool_get_001_neg \
+ zpool_history_001_neg \
+ zpool_import_001_neg \
+ zpool_import_002_neg \
+ zpool_offline_001_neg \
+ zpool_online_001_neg \
+ zpool_remove_001_neg \
+ zpool_replace_001_neg \
+ zpool_scrub_001_neg \
+ zpool_set_001_neg \
+ zpool_status_001_neg \
+ zpool_upgrade_001_neg
+
+FILES = misc.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/cleanup.ksh
new file mode 100644
index 0000000000..e34c19aba2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/cleanup.ksh
@@ -0,0 +1,50 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+if poolexists $TESTPOOL.virt
+then
+ log_must $ZPOOL destroy $TESTPOOL.virt
+fi
+
+if poolexists v1-pool
+then
+ log_must $ZPOOL destroy v1-pool
+fi
+
+if [[ -f /tmp/zfstest_datastream.dat ]]
+then
+ log_must $RM -f /tmp/zfstest_datastream.dat
+fi
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/misc.cfg b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/misc.cfg
new file mode 100644
index 0000000000..55d38e824f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/misc.cfg
@@ -0,0 +1,71 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# these are the set of setable ZFS properties
+PROP_NAMES="\
+ aclinherit aclmode atime \
+ checksum compression devices \
+ exec mountpoint quota readonly \
+ recordsize reservation setuid 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 \
+ visible"
+
+# these are an alternate set of property values
+PROP_ALTVALS="\
+ noallow groupmask off \
+ fletcher4 lzjb off \
+ off /tmp/zfstest 100m off \
+ 512 10m off off \
+ hidden"
+
+
+
+# additional properties to worry about: canmount copies xattr zoned version
+
+POOL_PROPS="\
+ failmode autoreplace"
+
+POOL_VALS="\
+ continue on"
+
+POOL_ALTVALS="\
+ panic off"
+
+export TESTSNAP=testsnap-misc
+export TESTCLCT=testclct-misc
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/setup.ksh
new file mode 100644
index 0000000000..c491a9381f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/setup.ksh
@@ -0,0 +1,161 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+# 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 /tmp
+$ZFS send $TESTPOOL/$TESTFS@snap > /tmp/zfstest_datastream.dat
+if [ ! -s /tmp/zfstest_datastream.dat ]
+then
+ log_fail "ZFS send datafile was not created!"
+fi
+log_must $CHMOD 644 /tmp/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
+
+
+log_must $ZFS create -o version=1 $TESTPOOL/$TESTFS/version1
+log_must $ZFS create -o version=1 $TESTPOOL/$TESTFS/allowed
+log_must $ZFS allow everyone create $TESTPOOL/$TESTFS/allowed
+
+if is_global_zone
+then
+
+ # Now create several virtual disks to test zpool with
+
+ $MKFILE 100m /$TESTDIR/disk1.dat
+ $MKFILE 100m /$TESTDIR/disk2.dat
+ $MKFILE 100m /$TESTDIR/disk3.dat
+ $MKFILE 100m /$TESTDIR/disk-additional.dat
+ $MKFILE 100m /$TESTDIR/disk-export.dat
+ $MKFILE 100m /$TESTDIR/disk-offline.dat
+ $MKFILE 100m /$TESTDIR/disk-spare1.dat
+ $MKFILE 100m /$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
+
+ set -A props $POOL_PROPS
+ set -A prop_vals $POOL_VALS
+ typeset -i i=0
+
+ while [[ $i -lt ${#props[*]} ]]
+ do
+ prop_name=${props[$i]}
+ prop_val=${prop_vals[$i]}
+ log_must $ZPOOL set $prop_name=$prop_val $TESTPOOL
+ i=$(( $i + 1 ))
+ done
+
+ # copy a v1 pool from cli_root
+ $CP $STF_SUITE/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.bz2 \
+ /$TESTDIR
+ log_must $BUNZIP2 /$TESTDIR/zfs-pool-v1.dat.bz2
+ log_must $ZPOOL import -d /$TESTDIR v1-pool
+fi
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zdb_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zdb_001_neg.ksh
new file mode 100644
index 0000000000..e99165cfe0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zdb_001_neg.ksh
@@ -0,0 +1,82 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# zdb can't run as a user on datasets, but can run without arguments
+#
+# STRATEGY:
+# 1. Run zdb as a user, it should print information
+# 2. Run zdb as a user on different datasets, it should fail
+#
+
+function check_zdb
+{
+ $@ > /tmp/zdb.$$
+ $GREP "Dataset mos" /tmp/zdb.$$
+ if [ $? -eq 0 ]
+ then
+ log_fail "$@ exited 0 when run as a non root user!"
+ fi
+ $RM /tmp/zdb.$$
+}
+
+
+function cleanup
+{
+ if [ -e /tmp/zdb_001_neg.$$.txt ]
+ then
+ $RM /tmp/zdb_001_neg.$$.txt
+ fi
+
+}
+
+verify_runnable "global"
+
+log_assert "zdb can't run as a user on datasets, but can run without arguments"
+log_onexit cleanup
+
+log_must eval "$ZDB > /tmp/zdb_001_neg.$$.txt"
+# verify the output looks okay
+log_must $GREP pool_guid /tmp/zdb_001_neg.$$.txt
+log_must $RM /tmp/zdb_001_neg.$$.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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_001_neg.ksh
new file mode 100644
index 0000000000..e5a0332815
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_001_neg.ksh
@@ -0,0 +1,59 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+function cleanup
+{
+ if [ -e /tmp/zfs_001_neg.$$.txt ]
+ then
+ $RM /tmp/zfs_001_neg.$$.txt
+ fi
+}
+
+log_onexit cleanup
+log_assert "zfs shows a usage message when run as a user"
+
+eval "$ZFS > /tmp/zfs_001_neg.$$.txt 2>&1"
+log_must $GREP "usage: zfs command args" /tmp/zfs_001_neg.$$.txt
+
+log_pass "zfs shows a usage message when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_allow_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_allow_001_neg.ksh
new file mode 100644
index 0000000000..5e760620bb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_allow_001_neg.ksh
@@ -0,0 +1,67 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+# 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 $ZFS allow $TESTPOOL/$TESTFS
+log_mustnot $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=$($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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_clone_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_clone_001_neg.ksh
new file mode 100644
index 0000000000..aaabcad9c2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_clone_001_neg.ksh
@@ -0,0 +1,54 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# zfs clone returns an error when run as a user
+#
+# STRATEGY:
+#
+# 1. Verify that we're unable to clone snapshots as a user
+#
+#
+
+log_assert "zfs clone returns an error when run as a user"
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_create_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_create_001_neg.ksh
new file mode 100644
index 0000000000..579771e840
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_create_001_neg.ksh
@@ -0,0 +1,61 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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 $ZFS ${args[i]}
+ ((i = i + 1))
+done
+
+log_pass "The sub-command 'create' fails as non-root."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_destroy_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_destroy_001_neg.ksh
new file mode 100644
index 0000000000..d7a23acedf
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_destroy_001_neg.ksh
@@ -0,0 +1,67 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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 $ZFS ${args[i]}
+ ((i = i + 1))
+done
+
+log_pass "The sub-command 'destroy' fails as non-root."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_get_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_get_001_neg.ksh
new file mode 100644
index 0000000000..680d2e5d15
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_get_001_neg.ksh
@@ -0,0 +1,65 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+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=$( $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_inherit_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_inherit_001_neg.ksh
new file mode 100644
index 0000000000..2f6c0c41eb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_inherit_001_neg.ksh
@@ -0,0 +1,56 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+log_assert "zfs inherit returns an error when run as a user"
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_mount_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_mount_001_neg.ksh
new file mode 100644
index 0000000000..9368dde9f7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_mount_001_neg.ksh
@@ -0,0 +1,57 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+log_assert "zfs mount returns an error when run as a user"
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_promote_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_promote_001_neg.ksh
new file mode 100644
index 0000000000..7c8562a918
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_promote_001_neg.ksh
@@ -0,0 +1,56 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# zfs promote returns an error when run as a user
+#
+# STRATEGY:
+#
+# 1. Verify we don't have permissions to promote a clone
+#
+#
+
+log_assert "zfs promote returns an error when run as a user"
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_receive_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_receive_001_neg.ksh
new file mode 100644
index 0000000000..ede741f53f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_receive_001_neg.ksh
@@ -0,0 +1,58 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+log_assert "zfs receive returns an error when run as a user"
+
+log_mustnot eval "$ZFS receive -d $TESTPOOL/$TESTFS/$TESTFS2 \
+ < /tmp/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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_rename_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_rename_001_neg.ksh
new file mode 100644
index 0000000000..e4eb6c9198
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_rename_001_neg.ksh
@@ -0,0 +1,56 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+#
+
+log_assert "zfs rename returns an error when run as a user"
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_rollback_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_rollback_001_neg.ksh
new file mode 100644
index 0000000000..03e03b709d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_rollback_001_neg.ksh
@@ -0,0 +1,60 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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)
+#
+#
+
+log_assert "zfs rollback returns an error when run as a user"
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_send_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_send_001_neg.ksh
new file mode 100644
index 0000000000..a6ab602fb9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_send_001_neg.ksh
@@ -0,0 +1,67 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+function cleanup
+{
+ if [ -e /tmp/zfstest_datastream.$$ ]
+ then
+ log_must $RM /tmp/zfstest_datastream.$$
+ fi
+}
+
+log_assert "zfs send returns an error when run as a user"
+log_onexit cleanup
+
+log_mustnot eval "$ZFS send $TESTPOOL/$TESTFS@snap > /tmp/zfstest_datastream.$$"
+
+# Now check that the above command actually did nothing
+
+# We should have a non-zero-length file in /tmp
+if [ -s /tmp/zfstest_datastream.$$ ]
+then
+ log_fail "A zfs send file was created in /tmp/zfstest_datastream.$$ !"
+fi
+
+log_pass "zfs send returns an error when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_set_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_set_001_neg.ksh
new file mode 100644
index 0000000000..67ba6791bf
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_set_001_neg.ksh
@@ -0,0 +1,70 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+#
+
+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 $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_share_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_share_001_neg.ksh
new file mode 100644
index 0000000000..575d532194
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_share_001_neg.ksh
@@ -0,0 +1,63 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+#
+
+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 $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_snapshot_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_snapshot_001_neg.ksh
new file mode 100644
index 0000000000..8d3951887f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_snapshot_001_neg.ksh
@@ -0,0 +1,56 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+log_assert "zfs snapshot returns an error when run as a user"
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unallow_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unallow_001_neg.ksh
new file mode 100644
index 0000000000..621782a019
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unallow_001_neg.ksh
@@ -0,0 +1,64 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+# 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 $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unmount_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unmount_001_neg.ksh
new file mode 100644
index 0000000000..22a3d75e07
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unmount_001_neg.ksh
@@ -0,0 +1,65 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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 $ZFS ${args[i]}
+ ((i = i + 1))
+done
+
+log_pass "The sub-command 'u[n]mount' fails as non-root."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unshare_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unshare_001_neg.ksh
new file mode 100644
index 0000000000..e710e55417
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_unshare_001_neg.ksh
@@ -0,0 +1,64 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+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 $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_upgrade_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_upgrade_001_neg.ksh
new file mode 100644
index 0000000000..5cf1bb858e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zfs_upgrade_001_neg.ksh
@@ -0,0 +1,67 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+# 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 $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_001_neg.ksh
new file mode 100644
index 0000000000..fb4871f981
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_001_neg.ksh
@@ -0,0 +1,60 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+function cleanup
+{
+ if [ -e /tmp/zpool_001_neg.$$.txt ]
+ then
+ $RM /tmp/zpool_001_neg.$$.txt
+ fi
+}
+
+log_onexit cleanup
+log_assert "zpool shows a usage message when run as a user"
+
+eval "$ZPOOL > /tmp/zpool_001_neg.$$.txt 2>&1"
+log_must $GREP "usage: zpool command args" /tmp/zpool_001_neg.$$.txt
+
+log_pass "zpool shows a usage message when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_add_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_add_001_neg.ksh
new file mode 100644
index 0000000000..d02dd0b9e3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_add_001_neg.ksh
@@ -0,0 +1,69 @@
+#!/bin/ksh -p
+
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+ADD_DISK="${DISKS%% }"
+ADD_DISK="${ADD_DISK##* }"
+
+[[ -z $ADD_DISK ]] && \
+ log_fail "No spare disks available."
+
+set -A args "add" "add -f" "add -n" \
+ "add $TESTPOOL" "add -f $TESTPOOL" "add -n $TESTPOOL" \
+ "add -fn $TESTPOOL" "add -nf $TESTPOOL" \
+ "add $TESTPOOL $ADD_DISK" "add -f $TESTPOOL $ADD_DISK" \
+ "add -n $TESTPOOL $ADD_DISK" \
+ "add -fn $TESTPOOL $ADD_DISK" \
+ "add -nf $TESTPOOL $ADD_DISK" \
+
+log_assert "zpool add [-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 'add' and its options fail as non-root."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_attach_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_attach_001_neg.ksh
new file mode 100644
index 0000000000..80aa4b9115
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_attach_001_neg.ksh
@@ -0,0 +1,67 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+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 $ZPOOL attach $TESTPOOL.virt /$TESTDIR/disk1.dat \
+ /$TESTDIR/disk-additional.dat
+check_for_attach
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_clear_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_clear_001_neg.ksh
new file mode 100644
index 0000000000..81951562a1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_clear_001_neg.ksh
@@ -0,0 +1,52 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+log_assert "zpool clear returns an error when run as a user"
+
+log_mustnot $ZPOOL clear $TESTPOOL
+
+log_pass "zpool clear returns an error when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_create_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_create_001_neg.ksh
new file mode 100644
index 0000000000..f77df30a09
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_create_001_neg.ksh
@@ -0,0 +1,69 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+ADD_DISK="${DISKS%% }"
+ADD_DISK="${ADD_DISK##* }"
+
+[[ -z $ADD_DISK ]] && \
+ log_fail "No spare disks available."
+
+set -A args "create" "create -f" "create -n" \
+ "create $TESTPOOL" "create -f $TESTPOOL" "create -n $TESTPOOL" \
+ "create -fn $TESTPOOL" "create -nf $TESTPOOL" \
+ "create $TESTPOOL $ADD_DISK" "create -f $TESTPOOL $ADD_DISK" \
+ "create -n $TESTPOOL $ADD_DISK" \
+ "create -fn $TESTPOOL $ADD_DISK" \
+ "create -nf $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_destroy_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_destroy_001_neg.ksh
new file mode 100644
index 0000000000..8d28f70935
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_destroy_001_neg.ksh
@@ -0,0 +1,59 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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 $ZPOOL ${args[i]}
+ ((i = i + 1))
+done
+
+log_pass "The sub-command 'destroy' and its options fail as non-root."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_detach_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_detach_001_neg.ksh
new file mode 100644
index 0000000000..02013cc5bb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_detach_001_neg.ksh
@@ -0,0 +1,58 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+log_assert "zpool detach returns an error when run as a user"
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_export_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_export_001_neg.ksh
new file mode 100644
index 0000000000..697f3d3cdc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_export_001_neg.ksh
@@ -0,0 +1,65 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# zpool export returns an error when run as a user
+#
+# STRATEGY:
+# 1. Attempt to export a pool
+# 2. Verify the command fails
+#
+
+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 $ZPOOL export $TESTPOOL.virt
+check_for_export
+
+log_mustnot $ZPOOL export -f $TESTPOOL.virt
+check_for_export
+
+log_pass "zpool export returns an error when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_get_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_get_001_neg.ksh
new file mode 100644
index 0000000000..8a691f4b37
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_get_001_neg.ksh
@@ -0,0 +1,67 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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 $ZPOOL get all $TESTPOOL
+
+log_pass "zpool get works when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_history_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_history_001_neg.ksh
new file mode 100644
index 0000000000..7791e8d719
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_history_001_neg.ksh
@@ -0,0 +1,55 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# zpool history works when run as a user
+#
+# STRATEGY:
+# 1. Attempt to get history on a test pool
+# 2. Verify the command fails
+#
+
+verify_runnable "global"
+
+log_assert "zpool history returns an error when run as a user"
+
+log_mustnot $ZPOOL history
+log_mustnot $ZPOOL history $TESTPOOL
+log_mustnot $ZPOOL history -i $TESTPOOL
+log_mustnot $ZPOOL history -l $TESTPOOL
+log_mustnot $ZPOOL history -il $TESTPOOL
+
+log_assert "zpool history returns an error when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_import_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_import_001_neg.ksh
new file mode 100644
index 0000000000..9f34118f6c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_import_001_neg.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# zpool import returns an error when run as a user
+#
+# STRATEGY:
+# 1. Attempt to import an exported pool
+# 2. Verify the command fails
+#
+#
+
+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 $ZPOOL import
+
+log_mustnot $ZPOOL import -a
+check_for_import
+
+log_mustnot $ZPOOL import -d /$TESTDIR $TESTPOOL.exported
+check_for_import
+
+log_pass "zpool import returns an error when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_import_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_import_002_neg.ksh
new file mode 100644
index 0000000000..011cd1c030
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_import_002_neg.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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 $ZPOOL import ${args[i]}
+ ((i = i + 1))
+done
+
+log_pass "Executing 'zpool import' by regular user fails as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_offline_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_offline_001_neg.ksh
new file mode 100644
index 0000000000..5a32e3fd3b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_offline_001_neg.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+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 $ZPOOL offline $TESTPOOL.virt /$TESTDIR/disk-1.dat
+check_for_offline
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_online_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_online_001_neg.ksh
new file mode 100644
index 0000000000..03cf9aaf77
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_online_001_neg.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+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 $ZPOOL online $TESTPOOL.virt /$TESTDIR/disk-offline.dat
+check_for_online
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_remove_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_remove_001_neg.ksh
new file mode 100644
index 0000000000..d5d3e5a8c2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_remove_001_neg.ksh
@@ -0,0 +1,59 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+verify_runnable "global"
+
+log_assert "zpool remove returns an error when run as a user"
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_replace_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_replace_001_neg.ksh
new file mode 100644
index 0000000000..e67cabd2a4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_replace_001_neg.ksh
@@ -0,0 +1,68 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+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 $ZPOOL replace $TESTPOOL.virt /$TESTDIR/disk-1.dat \
+ /$TESTDIR/disk-additional.dat
+check_for_replace
+
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_scrub_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_scrub_001_neg.ksh
new file mode 100644
index 0000000000..8f39e0455d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_scrub_001_neg.ksh
@@ -0,0 +1,53 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+verify_runnable "global"
+
+log_assert "zpool scrub returns an error when run as a user"
+
+log_mustnot $ZPOOL scrub $TESTPOOL
+log_mustnot $ZPOOL scrub -s $TESTPOOL
+
+log_pass "zpool scrub returns an error when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_set_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_set_001_neg.ksh
new file mode 100644
index 0000000000..b5cefb5483
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_set_001_neg.ksh
@@ -0,0 +1,71 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+#
+
+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 $POOL 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/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_status_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_status_001_neg.ksh
new file mode 100644
index 0000000000..dfe063e5cf
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_status_001_neg.ksh
@@ -0,0 +1,76 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# zpool status works when run as a user
+#
+# STRATEGY:
+#
+# 1. Run zpool status as a user
+# 2. Verify we get output
+#
+
+function check_pool_status
+{
+ RESULT=$($GREP "pool:" /tmp/pool-status.$$)
+ if [ -z "$RESULT" ]
+ then
+ log_fail "No pool: string found in zpool status output!"
+ fi
+ $RM /tmp/pool-status.$$
+}
+
+verify_runnable "global"
+
+log_assert "zpool status works when run as a user"
+
+log_must eval "$ZPOOL status > /tmp/pool-status.$$"
+check_pool_status
+
+log_must eval "$ZPOOL status -v > /tmp/pool-status.$$"
+check_pool_status
+
+log_must eval "$ZPOOL status $TESTPOOL> /tmp/pool-status.$$"
+check_pool_status
+
+log_must eval "$ZPOOL status -v $TESTPOOL > /tmp/pool-status.$$"
+check_pool_status
+
+# $TESTPOOL.virt has an offline device, so -x will show it
+log_must eval "$ZPOOL status -x $TESTPOOL.virt > /tmp/pool-status.$$"
+check_pool_status
+
+log_pass "zpool status works when run as a user"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_upgrade_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_upgrade_001_neg.ksh
new file mode 100644
index 0000000000..e4c6c02ff5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/misc/zpool_upgrade_001_neg.ksh
@@ -0,0 +1,65 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/misc/misc.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# zpool upgrade returns an error when run as a user
+#
+# STRATEGY:
+#
+# 1. Attempt to upgrade a pool
+# 2. Verify the command fails
+#
+
+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 $ZPOOL upgrade $TESTPOOL.virt
+
+# Now try to upgrade our version 1 pool
+log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/Makefile
new file mode 100644
index 0000000000..e73ffe0372
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/Makefile
@@ -0,0 +1,49 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_user/zfs_list
+
+PROGS = cleanup \
+ setup \
+ zfs_list_001_pos \
+ zfs_list_002_pos \
+ zfs_list_003_pos \
+ zfs_list_004_neg \
+ zfs_list_007_pos \
+ zfs_list_008_neg
+
+FILES = zfs_list.cfg \
+ zfs_list.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/cleanup.ksh
new file mode 100644
index 0000000000..9f5a043a1b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/cleanup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib
+
+depth_fs_cleanup
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/setup.ksh
new file mode 100644
index 0000000000..624c9e75b4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/setup.ksh
@@ -0,0 +1,70 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib
+. $STF_SUITE/tests/functional/cli_user/zfs_list/zfs_list.cfg
+
+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
+ $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
+
+depth_fs_setup
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.cfg b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.cfg
new file mode 100644
index 0000000000..59f367cfa5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.cfg
@@ -0,0 +1,35 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# 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/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.kshlib
new file mode 100644
index 0000000000..e64739dc31
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list.kshlib
@@ -0,0 +1,118 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_001_pos.ksh
new file mode 100644
index 0000000000..b0af4ebd92
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_001_pos.ksh
@@ -0,0 +1,116 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib
+
+#
+# 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.
+#
+
+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"
+
+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
+
+set -A pathargs "list -r $TESTDIR" "list -H $TESTDIR" \
+ "list -r ./../$TESTDIR" "list -H ./../$TESTDIR"
+
+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
+
+log_assert "Verify 'zfs list [-rH] [-o property[,prop]*] [fs|clct|vol]'."
+
+typeset -i i=0
+while [[ $i -lt ${#args[*]} ]]; do
+ log_must eval "$ZFS ${args[i]} > /dev/null"
+ ((i = i + 1))
+done
+
+# Verify 'zfs list <path>' will succeed on absolute or relative path.
+
+cd /tmp
+typeset -i i=0
+while [[ $i -lt ${#pathargs[*]} ]]; do
+ log_must eval "$ZFS ${pathargs[i]} > /dev/null"
+ ((i = i + 1))
+done
+
+log_pass "The sub-command 'list' succeeds as non-root."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_002_pos.ksh
new file mode 100644
index 0000000000..3d546ecca8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_002_pos.ksh
@@ -0,0 +1,176 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_user/zfs_list/zfs_list.kshlib
+
+#
+# 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.
+#
+
+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 \
+ "$ZFS list -H -r -o name -s creation -t filesystem $TESTPOOL/$TESTFS" \
+ "$fs_creation" "creation date"
+if is_global_zone ; then
+ verify_sort \
+ "$ZFS list -H -r -o name -s creation -t volume $TESTPOOL/$TESTFS" \
+ "$vol_creation" "creation date"
+fi
+verify_sort \
+ "$ZFS list -H -r -o name -s creation -t snapshot $TESTPOOL/$TESTFS" \
+ "$snap_creation" "creation date"
+
+# sort by checksum
+verify_sort \
+ "$ZFS list -H -r -o name -s checksum -t filesystem $TESTPOOL/$TESTFS" \
+ "$fs_cksum" "checksum"
+if is_global_zone ; then
+ verify_sort \
+ "$ZFS list -H -r -o name -s checksum -t volume $TESTPOOL/$TESTFS" \
+ "$vol_cksum" "checksum"
+fi
+verify_sort \
+ "$ZFS list -H -r -o name -s checksum -t snapshot $TESTPOOL/$TESTFS" \
+ "$snap_cksum" "checksum"
+verify_sort \
+ "$ZFS list -H -r -o name -S checksum -t snapshot $TESTPOOL/$TESTFS" \
+ "$snap_cksum" "checksum"
+
+# sort by name
+verify_sort \
+ "$ZFS list -H -r -o name -s name -t filesystem $TESTPOOL/$TESTFS" \
+ "$fs_name" "name"
+if is_global_zone ; then
+ verify_sort \
+ "$ZFS list -H -r -o name -s name -t volume $TESTPOOL/$TESTFS" \
+ "$vol_name" "name"
+fi
+verify_sort \
+ "$ZFS list -H -r -o name -s name -t snapshot $TESTPOOL/$TESTFS" \
+ "$snap_name" "name"
+
+# reverse sort by creation
+verify_reverse_sort \
+ "$ZFS list -H -r -o name -S creation -t filesystem $TESTPOOL/$TESTFS" \
+ "$fs_creation" "creation date"
+if is_global_zone ; then
+ verify_reverse_sort \
+ "$ZFS list -H -r -o name -S creation -t volume $TESTPOOL/$TESTFS" \
+ "$vol_creation" "creation date"
+fi
+verify_reverse_sort \
+ "$ZFS list -H -r -o name -S creation -t snapshot $TESTPOOL/$TESTFS" \
+ "$snap_creation" "creation date"
+
+# reverse sort by checksum
+verify_reverse_sort \
+ "$ZFS list -H -r -o name -S checksum -t filesystem $TESTPOOL/$TESTFS" \
+ "$fs_rev_cksum" "checksum"
+if is_global_zone ; then
+ verify_reverse_sort \
+ "$ZFS list -H -r -o name -S checksum -t volume $TESTPOOL/$TESTFS" \
+ "$vol_rev_cksum" "checksum"
+fi
+
+# reverse sort by name
+verify_reverse_sort \
+ "$ZFS list -H -r -o name -S name -t filesystem $TESTPOOL/$TESTFS"\
+ "$fs_name" "name"
+if is_global_zone ; then
+ verify_reverse_sort \
+ "$ZFS list -H -r -o name -S name -t volume $TESTPOOL/$TESTFS"\
+ "$vol_name" "name"
+fi
+verify_reverse_sort \
+ "$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/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_003_pos.ksh
new file mode 100644
index 0000000000..f685456d78
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_003_pos.ksh
@@ -0,0 +1,76 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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=/var/tmp/zfslist.out.$$
+children="$TESTPOOL/$TESTFS"
+
+for fs in $DATASETS ; do
+ children="$children $TESTPOOL/$TESTFS/$fs"
+done
+
+cd /tmp
+
+for path in $TESTPOOL/$TESTFS $TESTDIR ./../$TESTDIR ; do
+ $ZFS list -rH -o name $path > $tmpfile
+ for fs in $children ; do
+ $GREP "^${fs}$" $tmpfile > /dev/null 2>&1
+ if (( $? != 0 )); then
+ 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/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_004_neg.ksh
new file mode 100644
index 0000000000..13d6233d3c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_004_neg.ksh
@@ -0,0 +1,63 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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 /devices /tmp ./../devices ./../tmp"
+
+cd /tmp
+
+for fs in $paths ; do
+ log_mustnot $ZFS list $fs
+ log_mustnot $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/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_007_pos.ksh
new file mode 100644
index 0000000000..984bc77d3e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_007_pos.ksh
@@ -0,0 +1,91 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib
+
+#
+# DESCRIPTION:
+# 'zfs list -d <n>' should get expected output.
+#
+# STRATEGY:
+# 1. 'zfs list -d <n>' to get the output.
+# 2. 'zfs list -r|egrep' to get the expected output.
+# 3. Compare the two outputs, they shoud be same.
+#
+
+verify_runnable "both"
+
+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 <n>' should get expected output."
+
+mntpnt=/var/tmp
+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""|depth""$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 "$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 $ZFS list -rH -o name -t ${fs_type[$fs]} $DEPTH_FS | $EGREP -e '$eg_opt'
+ else
+ log_must eval "$ZFS list -H -d $dp -o name -t ${fs_type[$fs]} $DEPTH_FS > $DEPTH_OUTPUT"
+ log_must eval "$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 <n>' should get expected output."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_008_neg.ksh
new file mode 100644
index 0000000000..74c0b8b71b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zfs_list/zfs_list_008_neg.ksh
@@ -0,0 +1,56 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib
+
+#
+# DESCRIPTION:
+# A negative depth or a non numeric depth should fail in 'zfs list -d <n>'
+#
+# STRATEGY:
+# 1. Run zfs list -d with negative depth or non numeric depth
+# 2. Verify that zfs list returns error
+#
+
+verify_runnable "both"
+
+log_assert "A negative depth or a non numeric depth should fail in 'zfs list -d <n>'"
+
+set -A badargs "a" "AB" "aBc" "2A" "a2b" "aB2" "-1" "-32" "-999"
+
+typeset -i i=0
+while (( i < ${#badargs[*]} ))
+do
+ log_mustnot eval "$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 <n>'"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/Makefile
new file mode 100644
index 0000000000..4f4addd841
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/Makefile
@@ -0,0 +1,43 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_user/zpool_iostat
+
+PROGS = cleanup \
+ setup \
+ zpool_iostat_001_neg \
+ zpool_iostat_002_pos \
+ zpool_iostat_003_neg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/setup.ksh
new file mode 100644
index 0000000000..9c2fb74ed4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh
new file mode 100644
index 0000000000..a1fac987ec
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_001_neg.ksh
@@ -0,0 +1,63 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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 $ZPOOL ${args[i]}
+ ((i = i + 1))
+done
+
+log_pass "The sub-command 'iostat' succeeds as non-root."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh
new file mode 100644
index 0000000000..37062ca536
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_002_pos.ksh
@@ -0,0 +1,71 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# Verify that 'zpool iostat [interval [count]' can be executed as non-root.
+#
+# STRATEGY:
+# 1. Set the interval to 1 and count to 4.
+# 2. Sleep for 4 seconds.
+# 3. Verify that the output has 4 records.
+#
+
+verify_runnable "both"
+
+typeset tmpfile=/var/tmp/zfsiostat.out.$$
+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
+
+$ZPOOL iostat $TESTPOOL 1 4 > $tmpfile 2>&1 &
+sleep 4
+stat_count=$($GREP $TESTPOOL $tmpfile | $WC -l)
+
+if [[ $stat_count -ne 4 ]]; then
+ log_fail "zpool iostat [pool_name] [interval] [count] failed"
+fi
+
+log_pass "zpool iostat [pool_name ...] [interval] [count] passed"
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh
new file mode 100644
index 0000000000..d73f5d5c8e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_iostat/zpool_iostat_003_neg.ksh
@@ -0,0 +1,65 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/Makefile
new file mode 100644
index 0000000000..df88210852
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/Makefile
@@ -0,0 +1,42 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_user/zpool_list
+
+PROGS = cleanup \
+ setup \
+ zpool_list_001_pos \
+ zpool_list_002_neg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/setup.ksh
new file mode 100644
index 0000000000..9c2fb74ed4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_001_pos.ksh
new file mode 100644
index 0000000000..4de88675fc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_001_pos.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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]*] [<pool_name> ...]"
+
+typeset -i i=0
+while [[ $i -lt ${#args[*]} ]]; do
+ log_must $ZPOOL ${args[i]}
+
+ ((i = i + 1))
+done
+
+log_pass "The sub-command 'list' succeeds as non-root."
diff --git a/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_002_neg.ksh
new file mode 100644
index 0000000000..469437a384
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/cli_user/zpool_list/zpool_list_002_neg.ksh
@@ -0,0 +1,57 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/compression/Makefile b/usr/src/test/zfs-tests/tests/functional/compression/Makefile
new file mode 100644
index 0000000000..b04d4898f0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/compression/Makefile
@@ -0,0 +1,46 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/compression
+
+PROGS = cleanup \
+ setup \
+ compress_001_pos \
+ compress_002_pos \
+ compress_003_pos \
+ compress_004_pos
+
+FILES = compress.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/compression/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/compression/cleanup.ksh
new file mode 100644
index 0000000000..0cf4e25eeb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/compression/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. ${STF_SUITE}/include/libtest.shlib
+
+default_container_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/compression/compress.cfg b/usr/src/test/zfs-tests/tests/functional/compression/compress.cfg
new file mode 100644
index 0000000000..8b2302daa6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/compression/compress.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export BLOCKSZ=8192
+export NUM_WRITES=65536
+export DATA=13
diff --git a/usr/src/test/zfs-tests/tests/functional/compression/compress_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/compression/compress_001_pos.ksh
new file mode 100644
index 0000000000..ce2c26bd24
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/compression/compress_001_pos.ksh
@@ -0,0 +1,74 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/compression/compress.cfg
+
+#
+# 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.
+#
+
+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
+
+$SLEEP 60
+
+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/usr/src/test/zfs-tests/tests/functional/compression/compress_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/compression/compress_002_pos.ksh
new file mode 100644
index 0000000000..88e155611e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/compression/compress_002_pos.ksh
@@ -0,0 +1,76 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/compression/compress.cfg
+
+#
+# DESCRIPTION:
+# Create two files of exactly the same size. One with compression
+# and one without. Ensure the compressed file is smaller.
+#
+# NOTE: This test uses a dataset rather than a simple file system.
+#
+# STRATEGY:
+# Create a dataset, turn on compression and create files before
+# and after the property change. The compressed file should be smaller.
+#
+
+verify_runnable "both"
+
+typeset OP=create
+
+log_assert "Ensure that compressed files in a dataset are smaller."
+
+log_note "Ensure compression is off"
+log_must $ZFS set compression=off $TESTPOOL/$TESTCTR
+
+log_note "Writing file without compression..."
+log_must $FILE_WRITE -o $OP -f $TESTDIR1/$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/$TESTCTR
+
+log_must $FILE_WRITE -o $OP -f $TESTDIR1/$TESTFILE1 -b $BLOCKSZ \
+ -c $NUM_WRITES -d $DATA
+
+$SLEEP 60
+
+FILE0_BLKS=`$DU -k $TESTDIR1/$TESTFILE0 | $AWK '{ print $1}'`
+FILE1_BLKS=`$DU -k $TESTDIR1/$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/usr/src/test/zfs-tests/tests/functional/compression/compress_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/compression/compress_003_pos.ksh
new file mode 100644
index 0000000000..c995b53616
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/compression/compress_003_pos.ksh
@@ -0,0 +1,96 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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.$$
+multi_blk_file=$TESTDIR/multiblkfile.$$
+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/usr/src/test/zfs-tests/tests/functional/compression/compress_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/compression/compress_004_pos.ksh
new file mode 100644
index 0000000000..09015e72bd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/compression/compress_004_pos.ksh
@@ -0,0 +1,133 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -f $TESTDIR/*
+}
+
+function create_free_testing #<file size> <file>
+{
+ 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.$$
+multi_blk_file=$TESTDIR/multiblkfile.$$
+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/usr/src/test/zfs-tests/tests/functional/compression/setup.ksh b/usr/src/test/zfs-tests/tests/functional/compression/setup.ksh
new file mode 100644
index 0000000000..0ce60ed02a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/compression/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_container_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/ctime/Makefile b/usr/src/test/zfs-tests/tests/functional/ctime/Makefile
new file mode 100644
index 0000000000..7689cb0dac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/ctime/Makefile
@@ -0,0 +1,67 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/ctime
+
+PROG = ctime_001_pos
+
+SCRIPTS = cleanup \
+ setup
+
+include $(SRC)/cmd/Makefile.cmd
+include $(SRC)/test/Makefile.com
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+
+OBJS = $(PROG:%=%.o)
+SRCS = $(OBJS:%.o=%.c)
+
+CMDS = $(PROG:%=$(TESTDIR)/%) $(SCRIPTS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+CPPFLAGS += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
+
+all: $(PROG)
+
+$(PROG): $(OBJS)
+ $(LINK.c) $(OBJS) -o $@ $(LDLIBS)
+ $(POST_PROCESS)
+
+%.o: ../%.c
+ $(COMPILE.c) $<
+
+install: all $(CMDS)
+
+lint: lint_SRCS
+
+clobber: clean
+ -$(RM) $(PROG)
+
+clean:
+ -$(RM) $(OBJS)
+
+$(CMDS): $(TESTDIR) $(PROG)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/ctime/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/ctime/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/ctime/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/ctime/ctime_001_pos.c b/usr/src/test/zfs-tests/tests/functional/ctime/ctime_001_pos.c
new file mode 100644
index 0000000000..a6e02fbea3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/ctime/ctime_001_pos.c
@@ -0,0 +1,349 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this 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.
+ */
+
+/*
+ * Copyright (c) 2013 by Delphix. All rights reserved.
+ */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <utime.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <strings.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <libgen.h>
+
+#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;
+
+static char tfile[BUFSIZ] = { 0 };
+
+extern int errno;
+
+/*
+ * DESCRIPTION:
+ * Verify time will be changed correctly after each operation.
+ *
+ * STRATEGY:
+ * 1. Define time test array.
+ * 2. Loop through each item in this array.
+ * 3. Verify the time is changed after each operation.
+ *
+ */
+
+static int
+get_file_time(const 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);
+ }
+}
+
+static 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) {
+ (void) fprintf(stderr, "read(%d, buf, %d) failed with errno "
+ "%d\n", fd, sizeof (buf), errno);
+ return (1);
+ }
+ (void) close(fd);
+
+ return (ret);
+}
+
+static 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) {
+ (void) fprintf(stderr, "write(%d, buf, %d) failed with errno "
+ "%d\n", fd, strlen(buf), errno);
+ return (1);
+ }
+ (void) close(fd);
+
+ return (ret);
+}
+
+static int
+do_link(const char *pfile)
+{
+ int ret = 0;
+ char link_file[BUFSIZ] = { 0 };
+ char *dname;
+
+ if (pfile == NULL) {
+ return (-1);
+ }
+
+ /*
+ * Figure out source file directory name, and create
+ * the link file in the same directory.
+ */
+ dname = dirname(strdup(pfile));
+ (void) snprintf(link_file, BUFSIZ, "%s/%s", dname, "link_file");
+
+ if (link(pfile, link_file) == -1) {
+ (void) fprintf(stderr, "link(%s, %s) failed with errno %d\n",
+ pfile, link_file, errno);
+ free((void *)dirname);
+ return (1);
+ }
+
+ (void) unlink(link_file);
+ free((void *)dirname);
+ return (ret);
+}
+
+static int
+do_creat(const char *pfile)
+{
+ int fd, ret = 0;
+
+ if (pfile == NULL) {
+ return (-1);
+ }
+
+ if ((fd = creat(pfile, ALL_MODE)) == -1) {
+ (void) fprintf(stderr, "creat(%s, ALL_MODE) failed with errno "
+ "%d\n", pfile, errno);
+ return (1);
+ }
+ (void) close(fd);
+
+ return (ret);
+}
+
+static 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) {
+ (void) fprintf(stderr, "utime(%s, NULL) failed with errno "
+ "%d\n", pfile, errno);
+ return (1);
+ }
+
+ return (ret);
+}
+
+static int
+do_chmod(const char *pfile)
+{
+ int ret = 0;
+
+ if (pfile == NULL) {
+ return (-1);
+ }
+
+ if (chmod(pfile, ALL_MODE) == -1) {
+ (void) fprintf(stderr, "chmod(%s, ALL_MODE) failed with "
+ "errno %d\n", pfile, errno);
+ return (1);
+ }
+
+ return (ret);
+}
+
+static int
+do_chown(const char *pfile)
+{
+ int ret = 0;
+
+ if (pfile == NULL) {
+ return (-1);
+ }
+
+ if (chown(pfile, getuid(), getgid()) == -1) {
+ (void) fprintf(stderr, "chown(%s, %d, %d) failed with errno "
+ "%d\n", pfile, (int)getuid(), (int)getgid(), errno);
+ return (1);
+ }
+
+ return (ret);
+}
+
+static void
+cleanup(void)
+{
+ if ((strlen(tfile) != 0) && (access(tfile, F_OK) == 0)) {
+ (void) unlink(tfile);
+ }
+}
+
+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]))
+
+/* ARGSUSED */
+int
+main(int argc, char *argv[])
+{
+ int i, ret, fd;
+ char *penv[] = {"TESTDIR", "TESTFILE0"};
+
+ (void) fprintf(stdout, "Verify [acm]time is modified appropriately.\n");
+ (void) atexit(cleanup);
+
+ /*
+ * Get the environment variable values.
+ */
+ for (i = 0; i < sizeof (penv) / sizeof (char *); i++) {
+ if ((penv[i] = getenv(penv[i])) == NULL) {
+ (void) fprintf(stderr, "getenv(penv[%d])\n", i);
+ return (1);
+ }
+ }
+ (void) snprintf(tfile, sizeof (tfile), "%s/%s", penv[0], penv[1]);
+
+ /*
+ * If the test file is exists, remove it first.
+ */
+ if (access(tfile, F_OK) == 0) {
+ (void) unlink(tfile);
+ }
+ ret = 0;
+ if ((fd = open(tfile, O_WRONLY | O_CREAT | O_TRUNC, ALL_MODE)) == -1) {
+ (void) fprintf(stderr, "open(%s) failed: %d\n", tfile, errno);
+ return (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) {
+ (void) fprintf(stderr, "get_file_time(%s %d) = %d\n",
+ tfile, timetest_table[i].type, ret);
+ return (1);
+ }
+
+ /*
+ * Sleep 2 seconds, then invoke command on given file
+ */
+ (void) sleep(2);
+ timetest_table[i].func(tfile);
+
+ /*
+ * Get time after operating.
+ */
+ ret = get_file_time(tfile, timetest_table[i].type, &t2);
+ if (ret != 0) {
+ (void) fprintf(stderr, "get_file_time(%s %d) = %d\n",
+ tfile, timetest_table[i].type, ret);
+ return (1);
+ }
+
+ if (t1 == t2) {
+ (void) fprintf(stderr, "%s: t1(%ld) == t2(%ld)\n",
+ timetest_table[i].name, (long)t1, (long)t2);
+ return (1);
+ } else {
+ (void) fprintf(stderr, "%s: t1(%ld) != t2(%ld)\n",
+ timetest_table[i].name, (long)t1, (long)t2);
+ }
+ }
+
+ (void) fprintf(stdout, "PASS\n");
+ return (0);
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/ctime/setup.ksh b/usr/src/test/zfs-tests/tests/functional/ctime/setup.ksh
new file mode 100644
index 0000000000..e620c2ec30
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/ctime/setup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/delegate/Makefile b/usr/src/test/zfs-tests/tests/functional/delegate/Makefile
new file mode 100644
index 0000000000..f8eb5b42e6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/Makefile
@@ -0,0 +1,63 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/delegate
+
+PROGS = cleanup \
+ setup \
+ zfs_allow_001_pos \
+ zfs_allow_002_pos \
+ zfs_allow_003_pos \
+ zfs_allow_004_pos \
+ zfs_allow_005_pos \
+ zfs_allow_006_pos \
+ zfs_allow_007_pos \
+ zfs_allow_008_pos \
+ zfs_allow_009_neg \
+ zfs_allow_010_pos \
+ zfs_allow_011_neg \
+ zfs_allow_012_neg \
+ zfs_unallow_001_pos \
+ zfs_unallow_002_pos \
+ zfs_unallow_003_pos \
+ zfs_unallow_004_pos \
+ zfs_unallow_005_pos \
+ zfs_unallow_006_pos \
+ zfs_unallow_007_neg \
+ zfs_unallow_008_neg
+
+FILES = delegate.cfg \
+ delegate_common.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/delegate/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/cleanup.ksh
new file mode 100644
index 0000000000..c82ae371cc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/cleanup.ksh
@@ -0,0 +1,44 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_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
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/delegate/delegate.cfg b/usr/src/test/zfs-tests/tests/functional/delegate/delegate.cfg
new file mode 100644
index 0000000000..57ec0a582c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/delegate.cfg
@@ -0,0 +1,59 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export NISSTAFILE=/var/tmp/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.delegate
+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
+fi
+export DATASETS
diff --git a/usr/src/test/zfs-tests/tests/functional/delegate/delegate_common.kshlib b/usr/src/test/zfs-tests/tests/functional/delegate/delegate_common.kshlib
new file mode 100644
index 0000000000..e6c8cf9d67
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/delegate_common.kshlib
@@ -0,0 +1,1742 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/delegate/delegate.cfg
+
+#
+# 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 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=$?
+ ;;
+ 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=$?
+ ;;
+ *)
+ 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-%H%M%S')
+ typeset snap=$dtst@snap.$stamp
+
+ typeset -i ret=1
+
+ log_must $ZFS snapshot $snap
+ typeset bak_user=/tmp/bak.$user.$stamp
+ typeset bak_root=/tmp/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 dtst
+ typeset stamp=${perm}.${user}.$($DATE +'%F-%H%M%S')
+ typeset newfs=$fs/newfs.$stamp
+ typeset newvol=$fs/newvol.$stamp
+ typeset bak_user=/tmp/bak.$user.$stamp
+ typeset bak_root=/tmp/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-%H%M%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-%H%M%S')
+ typeset newfs=$fs/nfs.$stamp
+ typeset newvol=$fs/nvol.$stamp
+
+ 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
+
+ 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
+
+ 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
+
+ log_must $ZFS allow $user mount $fs
+ log_must $ZFS allow $user reservation $fs
+ log_must $ZFS allow $user refreservation $fs
+ user_run $user $ZFS create -V 150m $newvol
+ log_must $ZFS unallow $user mount $fs
+ log_must $ZFS unallow $user reservation $fs
+ log_must $ZFS unallow $user refreservation $fs
+ 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
+}
+
+# Verify that given the correct delegation, a regular user can:
+# Take a snapshot of an unmounted dataset
+# Take a snapshot of an mounted dataset
+# Create a snapshot by making a directory in the .zfs/snapshot directory
+function verify_fs_snapshot
+{
+ typeset user=$1
+ typeset perm=$2
+ typeset fs=$3
+
+ typeset stamp=${perm}.${user}.$($DATE +'%F-%H%M%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 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 destroy $snap
+
+ typeset snapdir=${mntpt}/.zfs/snapshot/snap.$stamp
+ user_run $user $MKDIR $snapdir
+ 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-%H%M%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
+ 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-%H%M%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-%H%M%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-%H%M%S')
+ typeset mntpt=$(get_prop mountpoint $fs)
+ typeset newmntpt=/tmp/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-%H%M%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=/var/tmp/a.$$
+ $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
+ log_must $UNSHARE $mntpt
+
+ # sharenfs=on
+ log_must $ZFS set sharenfs=on $fs
+ user_run $user $ZFS share $fs
+ if ! 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_mountpoint
+{
+ typeset user=$1
+ typeset perm=$2
+ typeset fs=$3
+
+ typeset stamp=${perm}.${user}.$($DATE +'%F-%H%M%S')
+ typeset mntpt=$(get_prop mountpoint $fs)
+ typeset newmntpt=/tmp/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-%H%M%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-%H%M%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=/var/tmp/a.$$
+ $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_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-%H%M%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-%H%M%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-%H%M%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-%H%M%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-%H%M%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 ))
+
+ reserv_size=$(get_prop refreservation $vol)
+
+ 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
+ log_must $ZFS allow $user refreservation $vol
+ user_run $user $ZFS set volsize=$newval $vol
+ log_must $ZFS unallow $user reservation $vol
+ log_must $ZFS unallow $user refreservation $vol
+ if [[ $oldval == $(get_prop volsize $vol) ]];
+ then
+ return 1
+ fi
+ fi
+
+ 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
+
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/delegate/setup.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/setup.ksh
new file mode 100644
index 0000000000..eed8faee26
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/setup.ksh
@@ -0,0 +1,59 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_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
+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
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_001_pos.ksh
new file mode 100644
index 0000000000..32b1a8841a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_001_pos.ksh
@@ -0,0 +1,98 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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
+typeset perms="snapshot,reservation,compression,checksum,send,userprop"
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_002_pos.ksh
new file mode 100644
index 0000000000..2da435eec3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_002_pos.ksh
@@ -0,0 +1,79 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# DESCRIPTION:
+# <user|group> 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.
+#
+
+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 "<user|group> is interpreted as user if possible, then as group."
+log_onexit cleanup
+
+eval set -A dataset $DATASETS
+typeset perms="snapshot,reservation,compression,checksum,send,userprop"
+
+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 "<user|group> is interpreted as user if possible, then as group passed."
diff --git a/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_003_pos.ksh
new file mode 100644
index 0000000000..21cf4a04ad
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_003_pos.ksh
@@ -0,0 +1,93 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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
+typeset perms="snapshot,reservation,compression,checksum,userprop"
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_004_pos.ksh
new file mode 100644
index 0000000000..c1cdb3c343
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_004_pos.ksh
@@ -0,0 +1,96 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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
+typeset perms="snapshot,reservation,compression,checksum,userprop"
+
+# 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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_005_pos.ksh
new file mode 100644
index 0000000000..93426430e6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_005_pos.ksh
@@ -0,0 +1,78 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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
+typeset perms="snapshot,reservation,compression,checksum,userprop"
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_006_pos.ksh
new file mode 100644
index 0000000000..e8cdf2586a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_006_pos.ksh
@@ -0,0 +1,72 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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
+perms1="snapshot,checksum,reservation"
+
+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="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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_007_pos.ksh
new file mode 100644
index 0000000000..5305deb532
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_007_pos.ksh
@@ -0,0 +1,103 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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
+#
+
+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
+typeset perms2="checksum,send,userprop"
+
+#
+# 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 $fs $perms1 $STAFF1
+ log_must verify_perm $fs $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 $fs $perms1 $STAFF1
+ log_must verify_perm $fs $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 $fs $perms2 $STAFF1
+ log_must verify_perm $fs $perms1 $STAFF1
+done
+
+log_pass "Verify permission set can be masked on descendent dataset pass."
diff --git a/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_008_pos.ksh
new file mode 100644
index 0000000000..fb02b9af33
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_008_pos.ksh
@@ -0,0 +1,78 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_009_neg.ksh
new file mode 100644
index 0000000000..4da16538cc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_009_neg.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_010_pos.ksh
new file mode 100644
index 0000000000..397b1a568f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_010_pos.ksh
@@ -0,0 +1,113 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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 \
+ 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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_011_neg.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_011_neg.ksh
new file mode 100644
index 0000000000..60031c92ca
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_011_neg.ksh
@@ -0,0 +1,68 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_012_neg.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_012_neg.ksh
new file mode 100644
index 0000000000..c33c29b99e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_allow_012_neg.ksh
@@ -0,0 +1,79 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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
+#
+
+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 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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_001_pos.ksh
new file mode 100644
index 0000000000..a2c34de7a2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_001_pos.ksh
@@ -0,0 +1,65 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_002_pos.ksh
new file mode 100644
index 0000000000..c48df76d8a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_002_pos.ksh
@@ -0,0 +1,61 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_003_pos.ksh
new file mode 100644
index 0000000000..57dff54620
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_003_pos.ksh
@@ -0,0 +1,71 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_004_pos.ksh
new file mode 100644
index 0000000000..0c55551ee5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_004_pos.ksh
@@ -0,0 +1,59 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_005_pos.ksh
new file mode 100644
index 0000000000..a723e8f961
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_005_pos.ksh
@@ -0,0 +1,73 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_006_pos.ksh
new file mode 100644
index 0000000000..af9ea49f01
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_006_pos.ksh
@@ -0,0 +1,71 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_007_neg.ksh
new file mode 100644
index 0000000000..e9bd3bfd0f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_007_neg.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_008_neg.ksh
new file mode 100644
index 0000000000..7cd824cdb4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/delegate/zfs_unallow_008_neg.ksh
@@ -0,0 +1,75 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/delegate/delegate_common.kshlib
+
+#
+# DESCRIPTION:
+# zfs unallow can handle invalid arguments.
+#
+# STRATEGY:
+# 1. Set up basic test environment.
+# 2. Verify zfs unallow handle invalid arguments correctly.
+#
+
+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"
+}
+
+# Options that cause this test to fail:
+# "-r"
+set -A badopts "everyone -e" "everyone -u $STAFF1" "everyone everyone" \
+ "-c -l" "-c -d" "-c -e" "-c -s" "-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
+
+ # Causes test failure: neg_test user_run $STAFF1 $ZFS unallow $dtst
+done
+
+log_pass "zfs unallow can handle invalid arguments passed."
diff --git a/usr/src/test/zfs-tests/tests/functional/devices/Makefile b/usr/src/test/zfs-tests/tests/functional/devices/Makefile
new file mode 100644
index 0000000000..a35c2389ce
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/devices/Makefile
@@ -0,0 +1,46 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/devices
+
+PROGS = cleanup \
+ devices_001_pos \
+ devices_002_neg \
+ devices_003_pos \
+ setup
+
+FILES = devices.cfg \
+ devices_common.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/devices/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/devices/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/devices/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/devices/devices.cfg b/usr/src/test/zfs-tests/tests/functional/devices/devices.cfg
new file mode 100644
index 0000000000..ba3c36ae8c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/devices/devices.cfg
@@ -0,0 +1,32 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export TESTFILE1=testfile1$$
+export TESTFILE2=testfile2$$
diff --git a/usr/src/test/zfs-tests/tests/functional/devices/devices_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/devices/devices_001_pos.ksh
new file mode 100644
index 0000000000..acea6e24d2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/devices/devices_001_pos.ksh
@@ -0,0 +1,66 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/devices/devices.cfg
+. $STF_SUITE/tests/functional/devices/devices_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/devices/devices_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/devices/devices_002_neg.ksh
new file mode 100644
index 0000000000..8a1f828775
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/devices/devices_002_neg.ksh
@@ -0,0 +1,66 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/devices/devices.cfg
+. $STF_SUITE/tests/functional/devices/devices_common.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/devices/devices_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/devices/devices_003_pos.ksh
new file mode 100644
index 0000000000..05463be809
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/devices/devices_003_pos.ksh
@@ -0,0 +1,49 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+#
+
+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/usr/src/test/zfs-tests/tests/functional/devices/devices_common.kshlib b/usr/src/test/zfs-tests/tests/functional/devices/devices_common.kshlib
new file mode 100644
index 0000000000..7399445052
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/devices/devices_common.kshlib
@@ -0,0 +1,119 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/devices/devices.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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 -n / | $AWK '{print $3}')
+ 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 -lhF 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 $($GETMAJOR mm) 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/usr/src/test/zfs-tests/tests/functional/devices/setup.ksh b/usr/src/test/zfs-tests/tests/functional/devices/setup.ksh
new file mode 100644
index 0000000000..e620c2ec30
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/devices/setup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/exec/Makefile b/usr/src/test/zfs-tests/tests/functional/exec/Makefile
new file mode 100644
index 0000000000..cf7c7468f9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/exec/Makefile
@@ -0,0 +1,69 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/exec
+
+PROG = mmap_exec
+
+SCRIPTS = cleanup \
+ exec_001_pos \
+ exec_002_neg \
+ setup
+
+include $(SRC)/cmd/Makefile.cmd
+include $(SRC)/test/Makefile.com
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+
+OBJS = $(PROG:%=%.o)
+SRCS = $(OBJS:%.o=%.c)
+
+CMDS = $(PROG:%=$(TESTDIR)/%) $(SCRIPTS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+CPPFLAGS += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
+
+all: $(PROG)
+
+$(PROG): $(OBJS)
+ $(LINK.c) $(OBJS) -o $@ $(LDLIBS)
+ $(POST_PROCESS)
+
+%.o: ../%.c
+ $(COMPILE.c) $<
+
+install: all $(CMDS)
+
+lint: lint_SRCS
+
+clobber: clean
+ -$(RM) $(PROG)
+
+clean:
+ -$(RM) $(OBJS)
+
+$(CMDS): $(TESTDIR) $(PROG)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/exec/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/exec/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/exec/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/exec/exec_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/exec/exec_001_pos.ksh
new file mode 100644
index 0000000000..ecffc9c1b4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/exec/exec_001_pos.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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 '/usr/bin/ls' to the ZFS file system.
+# 3. Setting exec=on on this file system.
+# 4. Make sure '/usr/bin/ls' can work in this ZFS file system.
+# 5. Make sure mmap which is using the PROT_EXEC calls succeed.
+#
+
+verify_runnable "both"
+MMAP_EXEC=$STF_SUITE/tests/functional/exec/mmap_exec
+
+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/usr/src/test/zfs-tests/tests/functional/exec/exec_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/exec/exec_002_neg.ksh
new file mode 100644
index 0000000000..3e087df264
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/exec/exec_002_neg.ksh
@@ -0,0 +1,85 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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 '/usr/bin/ls' to the ZFS file system.
+# 3. Setting exec=off on this file system.
+# 4. Make sure '/usr/bin/ls' can not work in this ZFS file system.
+# 5. Make sure mmap which is using the PROT_EXEC calls failed.
+#
+
+verify_runnable "both"
+MMAP_EXEC=$STF_SUITE/tests/functional/exec/mmap_exec
+
+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/usr/src/test/zfs-tests/tests/functional/exec/mmap_exec.c b/usr/src/test/zfs-tests/tests/functional/exec/mmap_exec.c
new file mode 100644
index 0000000000..ab639ab2d6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/exec/mmap_exec.c
@@ -0,0 +1,71 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this 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.
+ */
+
+/*
+ * Copyright (c) 2013 by Delphix. All rights reserved.
+ */
+
+#include <stdio.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+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 <binary name>\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/usr/src/test/zfs-tests/tests/functional/exec/setup.ksh b/usr/src/test/zfs-tests/tests/functional/exec/setup.ksh
new file mode 100644
index 0000000000..e620c2ec30
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/exec/setup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/features/Makefile b/usr/src/test/zfs-tests/tests/functional/features/Makefile
new file mode 100644
index 0000000000..38b6138bf7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/features/Makefile
@@ -0,0 +1,27 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+.PARALLEL: $(SUBDIRS)
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/features/async_destroy
+
+all install lint clean clobber:
+
+SUBDIRS = async_destroy
+
+include $(SRC)/test/Makefile.com
diff --git a/usr/src/test/zfs-tests/tests/functional/features/async_destroy/Makefile b/usr/src/test/zfs-tests/tests/functional/features/async_destroy/Makefile
new file mode 100644
index 0000000000..996d316676
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/features/async_destroy/Makefile
@@ -0,0 +1,38 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/features/async_destroy
+
+PROGS = async_destroy_001_pos \
+ cleanup \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/features/async_destroy/async_destroy_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/features/async_destroy/async_destroy_001_pos.ksh
new file mode 100644
index 0000000000..7bcc56e0b5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/features/async_destroy/async_destroy_001_pos.ksh
@@ -0,0 +1,84 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# Exercise the traversal suspend/resume code in async_destroy by
+# destroying a file system that has more blocks than we can free
+# in a single txg.
+#
+# STRATEGY:
+# 1. Create a file system
+# 2. Set recordsize to 512 to create the maximum number of blocks
+# 3. Set compression to off to force zero-ed blocks to be written
+# 4. dd a lot of data from /dev/zero to the file system
+# 5. Destroy the file system
+# 6. Wait for the freeing property to go to 0
+# 7. Use zdb to check for leaked blocks
+#
+
+TEST_FS=$TESTPOOL/async_destroy
+
+verify_runnable "both"
+
+function cleanup
+{
+ datasetexists $TEST_FS && log_must $ZFS destroy $TEST_FS
+}
+
+log_onexit cleanup
+log_assert "async_destroy can suspend and resume traversal"
+
+log_must $ZFS create -o recordsize=512 -o compression=off $TEST_FS
+
+#
+# Fill with 2G
+#
+log_must $DD bs=1024k count=2048 if=/dev/zero of=/$TEST_FS/file
+
+log_must $ZFS destroy $TEST_FS
+
+count=0
+while [[ "0" != "$($ZPOOL list -Ho freeing $TESTPOOL)" ]]; do
+ count=$((count + 1))
+ sleep 1
+done
+
+#
+# We assert that the data took a few seconds to free to make sure that
+# we actually exercised the suspend/resume code. The destroy should
+# actually take much longer than this, so false positives are not likely.
+#
+log_must test $count -gt 5
+
+#
+# Check for leaked blocks.
+#
+log_must $ZDB -b $TESTPOOL
+
+log_pass "async_destroy can suspend and resume traversal"
diff --git a/usr/src/test/zfs-tests/tests/functional/features/async_destroy/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/features/async_destroy/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/features/async_destroy/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/features/async_destroy/setup.ksh b/usr/src/test/zfs-tests/tests/functional/features/async_destroy/setup.ksh
new file mode 100644
index 0000000000..9c2fb74ed4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/features/async_destroy/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/grow_pool/Makefile b/usr/src/test/zfs-tests/tests/functional/grow_pool/Makefile
new file mode 100644
index 0000000000..b21c1eec0e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_pool/Makefile
@@ -0,0 +1,43 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/grow_pool
+
+PROGS = cleanup \
+ grow_pool_001_pos \
+ setup
+
+FILES = grow_pool.cfg \
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/grow_pool/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/grow_pool/cleanup.ksh
new file mode 100644
index 0000000000..d47a2a1219
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_pool/cleanup.ksh
@@ -0,0 +1,53 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/grow_pool/grow_pool.cfg
+
+verify_runnable "global"
+
+ismounted $TESTFS && \
+ log_must $ZFS umount $TESTDIR
+destroy_pool "$TESTPOOL"
+
+#
+# Here we create & destroy a zpool using the disks
+# because this resets the partitions to normal
+#
+if [[ -z $DISK ]]; then
+ create_pool ZZZ "$DISK0 $DISK1"
+ destroy_pool ZZZ
+else
+ create_pool ZZZ "$DISK"
+ destroy_pool ZZZ
+fi
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/grow_pool/grow_pool.cfg b/usr/src/test/zfs-tests/tests/functional/grow_pool/grow_pool.cfg
new file mode 100644
index 0000000000..07799c6178
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_pool/grow_pool.cfg
@@ -0,0 +1,63 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+function set_disks
+{
+ set -A disk_array $(find_disks $DISKS)
+ typeset -i i=0
+ typeset -i limit=2
+ 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=""
+}
+
+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 SLICE=0
+export SLICE0=0
+export SLICE1=1
+export SMALL_WRITE_COUNT=100
+export TESTFILE1=file$$.1
+export WRITE_COUNT=65536000
diff --git a/usr/src/test/zfs-tests/tests/functional/grow_pool/grow_pool_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/grow_pool/grow_pool_001_pos.ksh
new file mode 100644
index 0000000000..ac3e09b9d1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_pool/grow_pool_001_pos.ksh
@@ -0,0 +1,74 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/grow_pool/grow_pool.cfg
+
+#
+# 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
+#
+
+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"s"$SLICE1
+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/usr/src/test/zfs-tests/tests/functional/grow_pool/setup.ksh b/usr/src/test/zfs-tests/tests/functional/grow_pool/setup.ksh
new file mode 100644
index 0000000000..b18c92afa4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_pool/setup.ksh
@@ -0,0 +1,54 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/grow_pool/grow_pool.cfg
+
+verify_runnable "global"
+
+if ! $(is_physical_device $DISKS) ; then
+ log_unsupported "This directory cannot be run on raw files."
+fi
+
+if [[ -n $DISK ]]; then
+ log_note "No spare disks available. Using slices on $DISK"
+ for i in $SLICE0 $SLICE1 ; do
+ log_must set_partition $i "$cyl" $SIZE $DISK
+ cyl=$(get_endslice $DISK $i)
+ done
+ tmp=$DISK"s"$SLICE0
+else
+ log_must set_partition $SLICE "" $SIZE $DISK0
+ log_must set_partition $SLICE "" $SIZE $DISK1
+ tmp=$DISK0"s"$SLICE
+fi
+
+default_setup $tmp
diff --git a/usr/src/test/zfs-tests/tests/functional/grow_replicas/Makefile b/usr/src/test/zfs-tests/tests/functional/grow_replicas/Makefile
new file mode 100644
index 0000000000..be58b877d0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_replicas/Makefile
@@ -0,0 +1,43 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/grow_replicas
+
+PROGS = cleanup \
+ grow_replicas_001_pos \
+ setup
+
+FILES = grow_replicas.cfg \
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/grow_replicas/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/grow_replicas/cleanup.ksh
new file mode 100644
index 0000000000..40fad062c4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_replicas/cleanup.ksh
@@ -0,0 +1,53 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/grow_replicas/grow_replicas.cfg
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+ismounted $TESTFS && \
+ log_must $ZFS umount $TESTDIR
+destroy_pool "$TESTPOOL"
+
+#
+# Here we create & destroy a zpool using the disks
+# because this resets the partitions to normal
+#
+if [[ -z $DISK ]]; then
+ create_pool "ZZZ" "$DISK0 $DISK1"
+ destroy_pool "ZZZ"
+else
+ create_pool "ZZZ" "$DISK"
+ destroy_pool "ZZZ"
+fi
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/grow_replicas/grow_replicas.cfg b/usr/src/test/zfs-tests/tests/functional/grow_replicas/grow_replicas.cfg
new file mode 100644
index 0000000000..876bf14d7d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_replicas/grow_replicas.cfg
@@ -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
+#
+
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+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 SLICE=0
+else
+ export SLICE=2
+fi
+export SLICE0=0
+export SLICE1=1
+export SLICE2=2
+export SLICE3=3
+export SLICE4=4
+export SMALL_WRITE_COUNT=100
+export TESTFILE1=file$$.1
+export WRITE_COUNT=65536000
diff --git a/usr/src/test/zfs-tests/tests/functional/grow_replicas/grow_replicas_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/grow_replicas/grow_replicas_001_pos.ksh
new file mode 100644
index 0000000000..a928efc78c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_replicas/grow_replicas_001_pos.ksh
@@ -0,0 +1,83 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/grow_replicas/grow_replicas.cfg
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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"s"$SLICE3 \
+ $DISK"s"$SLICE4
+else
+ [[ -z $DISK2 || -z $DISK3 ]] && \
+ log_unsupported "No spare disks available."
+ log_must $ZPOOL add -f $TESTPOOL $POOLTYPE $DISK2"s"$SLICE \
+ $DISK3"s"$SLICE
+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/usr/src/test/zfs-tests/tests/functional/grow_replicas/setup.ksh b/usr/src/test/zfs-tests/tests/functional/grow_replicas/setup.ksh
new file mode 100644
index 0000000000..ea21724ce0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/grow_replicas/setup.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/grow_replicas/grow_replicas.cfg
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+if ! $(is_physical_device $DISKS) ; then
+ log_unsupported "This directory cannot be run on raw files."
+fi
+
+log_note "Creating pool type: $POOLTYPE"
+
+if [[ -n $DISK ]]; then
+ log_note "No spare disks available. Using slices on $DISK"
+ for i in $SLICE0 $SLICE1 $SLICE3 $SLICE4 ; do
+ log_must set_partition $i "$cyl" $SIZE $DISK
+ cyl=$(get_endslice $DISK $i)
+ done
+ create_pool $TESTPOOL $POOLTYPE ${DISK}s$SLICE0 \
+ ${DISK}s$SLICE1
+else
+ log_must set_partition $SLICE "" $SIZE $DISK0
+ log_must set_partition $SLICE "" $SIZE $DISK1
+ create_pool $TESTPOOL $POOLTYPE ${DISK0}s${SLICE} \
+ ${DISK1}s$SLICE
+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/usr/src/test/zfs-tests/tests/functional/history/Makefile b/usr/src/test/zfs-tests/tests/functional/history/Makefile
new file mode 100644
index 0000000000..92e8b4c4a7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/Makefile
@@ -0,0 +1,64 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/history
+
+PROGS = cleanup \
+ history_001_pos \
+ history_002_pos \
+ history_003_pos \
+ history_004_pos \
+ history_005_neg \
+ history_006_neg \
+ history_007_pos \
+ history_008_pos \
+ history_009_pos \
+ history_010_pos \
+ setup
+
+FILES = history.cfg \
+ history_common.kshlib
+
+DATAFILES = i386.migratedpool.DAT.Z \
+ i386.orig_history.txt \
+ sparc.migratedpool.DAT.Z \
+ sparc.orig_history.txt \
+ zfs-pool-v4.dat.Z
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+DATA = $(DATAFILES:%=$(TESTDIR)/%)
+$(DATA) := FILEMODE = 0444
+
+all lint clean clobber:
+
+install: $(CMDS) $(DATA)
+
+$(CMDS): $(TESTDIR)
+
+$(DATA): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/history/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/history/cleanup.ksh
new file mode 100644
index 0000000000..42c5390062
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/cleanup.ksh
@@ -0,0 +1,38 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+[[ -f $OLD_HISTORY ]] && $RM -f $OLD_HISTORY
+[[ -f $TMP_HISTORY ]] && $RM -f $TMP_HISTORY
+[[ -f $NEW_HISTORY ]] && $RM -f $NEW_HISTORY
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history.cfg b/usr/src/test/zfs-tests/tests/functional/history/history.cfg
new file mode 100644
index 0000000000..e1ed76e1a5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history.cfg
@@ -0,0 +1,45 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export ZFSROOT=
+
+export MPOOL=mpool.$$
+
+export OLD_HISTORY=/tmp/old_history.$$
+export TMP_HISTORY=/tmp/tmp_history.$$
+export NEW_HISTORY=/tmp/new_history.$$
+
+export MIGRATEDPOOLNAME=${MIGRATEDPOOLNAME:-history_pool}
+export TIMEZONE=${TIMEZONE:-US/Mountain}
+
+export HIST_USER="huser"
+export HIST_GROUP="hgroup"
+
+export TESTVOL=testvol.$$
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_001_pos.ksh
new file mode 100644
index 0000000000..e5a5c8327b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_001_pos.ksh
@@ -0,0 +1,111 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/history/history_common.kshlib
+
+#
+# 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 and create a mirror.
+# 2. Run and verify pool commands, with special casing for destroy/export.
+# 3. Import a pool and upgrade it, verifying 'upgrade' was logged.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ destroy_pool $MPOOL
+ destroy_pool $upgrade_pool
+
+ [[ -d $import_dir ]] && $RM -rf $import_dir
+ for file in $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
+
+mntpnt=$(get_prop mountpoint $TESTPOOL)
+(( $? != 0)) && log_fail "get_prop($TESTPOOL mountpoint)"
+VDEV1=$mntpnt/vdev1; VDEV2=$mntpnt/vdev2;
+VDEV3=$mntpnt/vdev3; VDEV4=$mntpnt/vdev4;
+
+log_must $MKFILE 64m $VDEV1 $VDEV2 $VDEV3
+log_must $MKFILE 100m $VDEV4
+
+run_and_verify -p "$MPOOL" "$ZPOOL create $MPOOL mirror $VDEV1 $VDEV2"
+run_and_verify -p "$MPOOL" "$ZPOOL add -f $MPOOL spare $VDEV3"
+run_and_verify -p "$MPOOL" "$ZPOOL remove $MPOOL $VDEV3"
+run_and_verify -p "$MPOOL" "$ZPOOL offline $MPOOL $VDEV1"
+run_and_verify -p "$MPOOL" "$ZPOOL online $MPOOL $VDEV1"
+run_and_verify -p "$MPOOL" "$ZPOOL attach $MPOOL $VDEV1 $VDEV4"
+run_and_verify -p "$MPOOL" "$ZPOOL detach $MPOOL $VDEV4"
+run_and_verify -p "$MPOOL" "$ZPOOL replace -f $MPOOL $VDEV1 $VDEV4"
+run_and_verify -p "$MPOOL" "$ZPOOL scrub $MPOOL"
+run_and_verify -p "$MPOOL" "$ZPOOL clear $MPOOL"
+
+# For export and destroy, mimic the behavior of run_and_verify using two
+# commands since the history will be unavailable until the pool is imported
+# again.
+commands=("$ZPOOL export $MPOOL" "$ZPOOL import -d $mntpnt $MPOOL"
+ "$ZPOOL destroy $MPOOL" "$ZPOOL import -D -f -d $mntpnt $MPOOL")
+for i in 0 2; do
+ cmd1="${commands[$i]}"
+ cmd2="${commands[(($i + 1 ))]}"
+
+ $ZPOOL history $MPOOL > $OLD_HISTORY 2>/dev/null
+ log_must $cmd1
+ log_must $cmd2
+ $ZPOOL history $MPOOL > $TMP_HISTORY 2>/dev/null
+ $DIFF $OLD_HISTORY $TMP_HISTORY | $GREP "^> " | $SED 's/^> //g' > \
+ $NEW_HISTORY
+ $GREP "$($ECHO "$cmd1" | $SED 's/\/usr\/sbin\///g')" $NEW_HISTORY \
+ >/dev/null 2>&1 || log_fail "Didn't find \"$cmd1\" in pool history"
+ $GREP "$($ECHO "$cmd2" | $SED 's/\/usr\/sbin\///g')" $NEW_HISTORY \
+ >/dev/null 2>&1 || log_fail "Didn't find \"$cmd2\" in pool history"
+done
+
+run_and_verify -p "$MPOOL" "$ZPOOL split $MPOOL ${MPOOL}_split"
+
+import_dir=/var/tmp/import_dir.$$
+log_must $MKDIR $import_dir
+log_must $CP $STF_SUITE/tests/functional/history/zfs-pool-v4.dat.Z $import_dir
+log_must $UNCOMPRESS $import_dir/zfs-pool-v4.dat.Z
+upgrade_pool=$($ZPOOL import -d $import_dir | $GREP "pool:" | $AWK '{print $2}')
+log_must $ZPOOL import -d $import_dir $upgrade_pool
+run_and_verify -p "$upgrade_pool" "$ZPOOL upgrade $upgrade_pool"
+
+log_pass "zpool sub-commands which modify state are logged passed. "
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_002_pos.ksh
new file mode 100644
index 0000000000..ab54e5a345
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_002_pos.ksh
@@ -0,0 +1,142 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/history/history_common.kshlib
+
+#
+# DESCRIPTION:
+# Create a scenario to verify the following zfs subcommands are logged.
+# create, destroy, clone, rename, snapshot, rollback, set, inherit,
+# receive, promote, hold and release.
+#
+# STRATEGY:
+# 1. Verify that all the zfs commands listed (barring send) produce an
+# entry in the pool history.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+
+ [[ -f $tmpfile ]] && $RM -f $tmpfile
+ [[ -f $tmpfile2 ]] && $RM -f $tmpfile2
+ for dataset in $fs $newfs $fsclone $vol $newvol $volclone; do
+ datasetexists $dataset && $ZFS destroy -Rf $dataset
+ done
+ $RM -rf /history.$$
+}
+
+log_assert "Verify zfs sub-commands which modify state are logged."
+log_onexit cleanup
+
+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
+tmpfile=/tmp/tmpfile.$$ ; tmpfile2=/tmp/tmpfile2.$$
+
+# property value property value
+#
+props=(
+ quota 64M recordsize 512
+ reservation 32M reservation none
+ mountpoint /history.$$ mountpoint legacy
+ mountpoint none sharenfs on
+ sharenfs off
+ compression on compression off
+ compression lzjb aclmode discard
+ aclmode groupmask aclmode passthrough
+ atime on atime off
+ devices on devices off
+ exec on exec off
+ setuid on setuid off
+ readonly on readonly off
+ zoned on zoned off
+ snapdir hidden snapdir visible
+ aclinherit discard aclinherit noallow
+ aclinherit secure aclinherit passthrough
+ canmount off canmount on
+ xattr on xattr off
+ compression gzip compression gzip-$((RANDOM%9 + 1))
+ copies $((RANDOM%3 + 1))
+)
+
+run_and_verify "$ZFS create $fs"
+# Set all the property for filesystem
+typeset -i i=0
+while ((i < ${#props[@]})) ; do
+ run_and_verify "$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
+ run_and_verify "$ZFS inherit ${props[$i]} $fs"
+ fi
+
+ ((i += 2))
+done
+
+run_and_verify "$ZFS create -V 64M $vol"
+run_and_verify "$ZFS set volsize=32M $vol"
+run_and_verify "$ZFS snapshot $fssnap"
+run_and_verify "$ZFS hold tag $fssnap"
+run_and_verify "$ZFS release tag $fssnap"
+run_and_verify "$ZFS snapshot $volsnap"
+run_and_verify "$ZFS snapshot $fssnap2"
+run_and_verify "$ZFS snapshot $volsnap2"
+
+# Send isn't logged...
+log_must $ZFS send -i $fssnap $fssnap2 > $tmpfile
+log_must $ZFS send -i $volsnap $volsnap2 > $tmpfile2
+# Verify that's true
+$ZPOOL history $TESTPOOL | $GREP 'zfs send' >/dev/null 2>&1 && \
+ log_fail "'zfs send' found in history of \"$TESTPOOL\""
+
+run_and_verify "$ZFS destroy $fssnap2"
+run_and_verify "$ZFS destroy $volsnap2"
+run_and_verify "$ZFS receive $fs < $tmpfile"
+run_and_verify "$ZFS receive $vol < $tmpfile2"
+run_and_verify "$ZFS rollback -r $fssnap"
+run_and_verify "$ZFS rollback -r $volsnap"
+run_and_verify "$ZFS clone $fssnap $fsclone"
+run_and_verify "$ZFS clone $volsnap $volclone"
+run_and_verify "$ZFS rename $fs $newfs"
+run_and_verify "$ZFS rename $vol $newvol"
+run_and_verify "$ZFS promote $fsclone"
+run_and_verify "$ZFS promote $volclone"
+run_and_verify "$ZFS destroy $newfs"
+run_and_verify "$ZFS destroy $newvol"
+run_and_verify "$ZFS destroy -rf $fsclone"
+run_and_verify "$ZFS destroy -rf $volclone"
+
+log_pass "zfs sub-commands which modify state are logged passed."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_003_pos.ksh
new file mode 100644
index 0000000000..224ee159e0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_003_pos.ksh
@@ -0,0 +1,103 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# zpool history will truncate on small pools, leaving pool creation intact
+#
+# STRATEGY:
+# 1. Create two 100M virtual disk files.
+# 2. Create test pool using the two virtual files.
+# 3. Loop 100 times to set and remove compression to test dataset.
+# 4. Make sure 'zpool history' output is truncated
+# 5. Verify that the initial pool creation is preserved.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ datasetexists $spool && log_must $ZPOOL destroy $spool
+ [[ -f $VDEV0 ]] && log_must $RM -f $VDEV0
+ [[ -f $VDEV1 ]] && log_must $RM -f $VDEV1
+ [[ -f $TMPFILE ]] && log_must $RM -f $TMPFILE
+}
+
+log_assert "zpool history limitation test."
+log_onexit cleanup
+
+mntpnt=$(get_prop mountpoint $TESTPOOL)
+(( $? != 0 )) && log_fail "get_prop mountpoint $TESTPOOL"
+
+VDEV0=$mntpnt/vdev0; VDEV1=$mntpnt/vdev1
+log_must $MKFILE 100m $VDEV0 $VDEV1
+
+spool=smallpool.$$; sfs=smallfs.$$
+log_must $ZPOOL create $spool $VDEV0 $VDEV1
+log_must $ZFS create $spool/$sfs
+
+typeset -i orig_count=$($ZPOOL history $spool | $WC -l)
+typeset orig_md5=$($ZPOOL history $spool | $HEAD -2 | $MD5SUM | \
+ $AWK '{print $1}')
+
+typeset -i i=0
+while ((i < 100)); do
+ $ZFS set compression=off $spool/$sfs
+ $ZFS set compression=on $spool/$sfs
+ $ZFS set compression=off $spool/$sfs
+ $ZFS set compression=on $spool/$sfs
+ $ZFS set compression=off $spool/$sfs
+
+ ((i += 1))
+done
+
+TMPFILE=/tmp/spool.$$
+$ZPOOL history $spool >$TMPFILE
+typeset -i entry_count=$($WC -l $TMPFILE | $AWK '{print $1}')
+typeset final_md5=$($HEAD -2 $TMPFILE | $MD5SUM | $AWK '{print $1}')
+
+$GREP 'zpool create' $TMPFILE >/dev/null 2>&1 ||
+ log_fail "'zpool create' was not found in pool history"
+
+$GREP 'zfs create' $TMPFILE >/dev/null 2>&1 &&
+ log_fail "'zfs create' was found in pool history"
+
+$GREP 'zfs set compress' $TMPFILE >/dev/null 2>&1 ||
+ log_fail "'zfs set compress' was found in pool history"
+
+# Verify that the creation of the pool was preserved in the history.
+if [[ $orig_md5 != $final_md5 ]]; then
+ log_fail "zpool creation history was not preserved."
+fi
+
+log_pass "zpool history limitation test passed."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_004_pos.ksh
new file mode 100644
index 0000000000..e29173f860
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_004_pos.ksh
@@ -0,0 +1,100 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# 'zpool history' can cope with simultaneous commands.
+#
+# 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'.
+#
+
+verify_runnable "global"
+
+log_assert "'zpool history' can cope with simultaneous commands."
+
+typeset -i orig_count=$($ZPOOL history $spool | $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 entry_count=$($ZPOOL history $spool | $WC -l | $AWK '{print $1}')
+
+if ((entry_count - orig_count != 200)); then
+ log_fail "The entries count error: entry_count=$entry_count " \
+ "orig_count = $orig_count"
+fi
+
+log_pass "'zpool history' can cope with simultaneous commands."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_005_neg.ksh
new file mode 100644
index 0000000000..7a3ac27c26
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_005_neg.ksh
@@ -0,0 +1,65 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/history/history_common.kshlib
+
+#
+# DESCRIPTION:
+# Verify the following zpool subcommands are not logged.
+# zpool get
+# zpool history
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Verify 'zpool get|history|list|status|iostat' will not be logged."
+
+# Save initial TESTPOOL history
+log_must eval "$ZPOOL history $TESTPOOL >$OLD_HISTORY"
+
+log_must $ZPOOL get all $TESTPOOL >/dev/null
+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 >$NEW_HISTORY"
+log_must $DIFF $OLD_HISTORY $NEW_HISTORY
+
+log_pass "Verify 'zpool get|history|list|status|iostat' will not be logged."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_006_neg.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_006_neg.ksh
new file mode 100644
index 0000000000..e93e4c1de8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_006_neg.ksh
@@ -0,0 +1,84 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/history/history_common.kshlib
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# Verify the following zfs subcommands are not logged.
+# list, get, holds, mount, unmount, share, unshare, send
+#
+# STRATEGY:
+# 1. Create a test pool.
+# 2. Separately invoke zfs list|get|holds|mount|unmount|share|unshare|send
+# 3. Verify they were not recored in pool history.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ if datasetexists $fs ; then
+ log_must $ZFS destroy -rf $fs
+ fi
+ log_must $ZFS create $fs
+}
+
+log_assert "Verify 'zfs list|get|holds|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 hold tag $snap1
+log_must $ZFS snapshot $snap2
+
+# Save initial TESTPOOL history
+log_must eval "$ZPOOL history $TESTPOOL > $OLD_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 $ZFS holds $snap1
+
+log_must eval "$ZPOOL history $TESTPOOL > $NEW_HISTORY"
+log_must $DIFF $OLD_HISTORY $NEW_HISTORY
+
+log_must $ZFS release tag $snap1
+
+log_pass "Verify 'zfs list|get|mount|unmount|share|unshare|send' passed."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_007_pos.ksh
new file mode 100644
index 0000000000..66d2191058
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_007_pos.ksh
@@ -0,0 +1,112 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/history/history_common.kshlib
+
+#
+# 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.
+#
+
+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 migrated pool."
+log_onexit cleanup
+
+tst_dir=$STF_SUITE/tests/functional/history
+import_dir=$TESTDIR/importdir.$$
+migrated_cmds_f=$import_dir/migrated_history.$$
+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 succeeds.
+ poolexists $migratedpoolname && \
+ log_must $ZPOOL destroy -f $migratedpoolname
+
+ log_must $ZPOOL import -d $import_dir $migratedpoolname
+ TZ=$TIMEZONE $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.$$
+ 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 "Verify command history moves with migrated pool."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_008_pos.ksh
new file mode 100644
index 0000000000..56df2939c2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_008_pos.ksh
@@ -0,0 +1,74 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/history/history_common.kshlib
+
+#
+# DESCRIPTION:
+# Pool history records all recursive operations.
+#
+# STRATEGY:
+# 1. Create a filesystem and several sub-filesystems in it.
+# 2. Make a recursive snapshot.
+# 3. Verify pool history records all the recursive operations.
+# 4. Do the same verification for hold, release, inherit, rollback and
+# destroy.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ if datasetexists $root_testfs; then
+ log_must $ZFS destroy -rf $root_testfs
+ fi
+ log_must $ZFS create $root_testfs
+}
+
+log_assert "Pool history records all recursive 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
+
+run_and_verify "$ZFS snapshot -r $root_testfs@snap" "-i"
+run_and_verify "$ZFS hold -r tag $root_testfs@snap" "-i"
+run_and_verify "$ZFS release -r tag $root_testfs@snap" "-i"
+log_must $ZFS snapshot $root_testfs@snap2
+log_must $ZFS snapshot $root_testfs@snap3
+run_and_verify "$ZFS rollback -r $root_testfs@snap" "-i"
+run_and_verify "$ZFS inherit -r mountpoint $root_testfs" "-i"
+run_and_verify "$ZFS destroy -r $root_testfs" "-i"
+
+log_pass "Pool history records all recursive operations."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_009_pos.ksh
new file mode 100644
index 0000000000..8a10d16f20
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_009_pos.ksh
@@ -0,0 +1,114 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/history/history_common.kshlib
+
+#
+# DESCRIPTION:
+# Verify the delegation internal history are correctly.
+#
+# 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.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ del_user $HIST_USER
+ del_group $HIST_GROUP
+}
+
+log_assert "Verify delegated commands are logged in the pool history."
+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
+
+# subcmd allow_options
+array=( "allow" "-s @basic snapshot"
+ "allow" "-s @set @basic"
+ "allow" "-c create"
+ "unallow" "-c create"
+ "allow" "-c @set"
+ "unallow" "-c @set"
+ "allow" "-l -u $HIST_USER snapshot"
+ "allow" "-u $HIST_USER snapshot"
+ "unallow" "-u $HIST_USER snapshot"
+ "allow" "-l -u $HIST_USER @set"
+ "allow" "-u $HIST_USER @set"
+ "unallow" "-u $HIST_USER @set"
+ "allow" "-d -u $HIST_USER snapshot"
+ "allow" "-u $HIST_USER snapshot"
+ "unallow" "-u $HIST_USER snapshot"
+ "allow" "-d -u $HIST_USER @set"
+ "allow" "-u $HIST_USER @set"
+ "unallow" "-u $HIST_USER @set"
+ "allow" "-l -g $HIST_GROUP snapshot"
+ "allow" "-g $HIST_GROUP snapshot"
+ "unallow" "-g $HIST_GROUP snapshot"
+ "allow" "-l -g $HIST_GROUP @set"
+ "allow" "-g $HIST_GROUP @set"
+ "unallow" "-g $HIST_GROUP @set"
+ "allow" "-d -g $HIST_GROUP snapshot"
+ "allow" "-g $HIST_GROUP snapshot"
+ "unallow" "-g $HIST_GROUP snapshot"
+ "allow" "-d -g $HIST_GROUP @set"
+ "allow" "-g $HIST_GROUP @set"
+ "unallow" "-g $HIST_GROUP @set"
+ "allow" "-l -e snapshot"
+ "allow" "-e snapshot"
+ "unallow" "-e snapshot"
+ "allow" "-l -e @set"
+ "allow" "-e @set"
+ "unallow" "-e @set"
+ "allow" "-d -e snapshot"
+ "allow" "-e snapshot"
+ "unallow" "-e snapshot"
+ "allow" "-d -e @set"
+ "allow" "-e @set"
+ "unallow" "-e @set"
+)
+
+typeset -i i=0
+while ((i < ${#array[@]})); do
+ subcmd=${array[$i]}
+ options=${array[((i + 1))]}
+
+ run_and_verify "$ZFS $subcmd $options $testfs" "-i"
+ ((i += 2))
+done
+
+log_pass "Verify delegated commands are logged in the pool history."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/history/history_010_pos.ksh
new file mode 100644
index 0000000000..4c146d8f31
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_010_pos.ksh
@@ -0,0 +1,76 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/history/history_common.kshlib
+
+#
+# DESCRIPTION:
+# Verify internal long history information are correct.
+#
+# STRATEGY:
+# 1. Create non-root test user and group.
+# 2. Do some zfs operations as a root and non-root user.
+# 3. Verify the long history information is correct.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ 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
+
+run_and_verify "$ZFS create $root_testfs" "-l"
+run_and_verify "$ZFS allow $HIST_GROUP snapshot,mount $root_testfs" "-l"
+run_and_verify "$ZFS allow $HIST_USER destroy,mount $root_testfs" "-l"
+run_and_verify "$ZFS allow $HIST_USER reservation $root_testfs" "-l"
+run_and_verify "$ZFS allow $HIST_USER allow $root_testfs" "-l"
+run_and_verify -u "$HIST_USER" "$ZFS snapshot $root_testfs@snap" "-l"
+run_and_verify -u "$HIST_USER" "$ZFS destroy $root_testfs@snap" "-l"
+run_and_verify -u "$HIST_USER" "$ZFS set reservation=64M $root_testfs" "-l"
+run_and_verify -u "$HIST_USER" \
+ "$ZFS allow $HIST_USER reservation $root_testfs" "-l"
+run_and_verify "$ZFS unallow $HIST_USER create $root_testfs" "-l"
+run_and_verify "$ZFS unallow $HIST_GROUP snapshot $root_testfs" "-l"
+run_and_verify "$ZFS destroy -r $root_testfs" "-l"
+
+log_pass "Verify internal long history information pass."
diff --git a/usr/src/test/zfs-tests/tests/functional/history/history_common.kshlib b/usr/src/test/zfs-tests/tests/functional/history/history_common.kshlib
new file mode 100644
index 0000000000..7950cb3a4e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/history_common.kshlib
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/history/history.cfg
+
+function run_and_verify
+{
+ typeset user pool
+ while getopts "p:u:" opt; do
+ case $opt in
+ p)
+ pool=$OPTARG
+ ;;
+ u)
+ user=$OPTARG
+ ;;
+ esac
+ done
+ shift $(($OPTIND - 1))
+
+ pool=${pool:-$TESTPOOL}
+ user=${user:-"root"}
+ fullcmd="$1"
+ flags="$2"
+
+ histcmd=$($ECHO $fullcmd | $SED 's/\/usr\/sbin\///g')
+ cmd=$($ECHO $histcmd | $AWK '{print $1}')
+ subcmd=$($ECHO $histcmd | $AWK '{print $2}')
+
+ # If we aren't running zpool or zfs, something is wrong
+ [[ $cmd == "zpool" || $cmd == "zfs" ]] || \
+ log_fail "run_and_verify called with \"$cmd ($fullcmd)\""
+
+ # If this is a 'zfs receive' truncate the stdin redirect
+ [[ $subcmd == "receive" || $subcmd == "recv" ]] && \
+ histcmd=${histcmd%% <*}
+
+ # Run the command as the specified user, and find the new history.
+ $ZPOOL history $flags $pool > $OLD_HISTORY 2>/dev/null
+ if [[ $user == "root" ]]; then
+ log_must eval "$fullcmd"
+ else
+ log_must $SU $user -c "eval $fullcmd"
+ fi
+ $ZPOOL history $flags $pool > $TMP_HISTORY 2>/dev/null
+ $DIFF $OLD_HISTORY $TMP_HISTORY | $GREP "^> " | $SED 's/^> //g' \
+ > $NEW_HISTORY
+
+ # Verify what's common to every case, regardless of zpool history flags.
+ $GREP "$histcmd" $NEW_HISTORY >/dev/null 2>&1 || \
+ log_fail "Didn't find \"$histcmd\" in pool history"
+
+ # If 'zpool history' was called without any flags, then we're done.
+ [[ -z $flags ]] && return
+
+ # Verify the new history in cases that are more interesting because
+ # additional information is logged with -i or -l.
+
+ [[ $flags =~ "i" ]] && log_must verify_$subcmd "$histcmd" "$subcmd" \
+ "$flags"
+ [[ $flags =~ "l" ]] && log_must verify_long "$histcmd" "$user" "$flags"
+}
+
+function verify_long
+{
+ typeset cmd=$1
+ typeset user=$2
+ typeset flags=$3
+
+ [[ $flags =~ "l" ]] || return 1
+
+ typeset uid=$($ID -u $user)
+ typeset hname=$($HOSTNAME)
+ if ! is_global_zone; then
+ hname=$hname:$($ZONENAME)
+ fi
+
+ $GREP "$cmd \[user $uid ($user) on $hname\]" $NEW_HISTORY >/dev/null \
+ 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Couldn't find long information for \"$cmd\""
+ return 1
+ fi
+
+ return 0
+}
+
+function verify_hold
+{
+ typeset cmd=$1
+ typeset subcmd=$2
+ typeset flags=$3
+
+ [[ $flags =~ "i" ]] || return 1
+
+ typeset tag=$($ECHO $cmd | $AWK '{print $4}')
+ typeset fullname=${cmd##* }
+ typeset dsname=${fullname%%@*}
+ typeset snapname=${fullname##*@}
+
+ # This works whether or not the hold was recursive
+ for ds in $($ZFS list -r -Ho name -t snapshot $dsname | \
+ $GREP "@$snapname"); do
+ $GREP "$subcmd $ds ([0-9]*) tag=$tag" $NEW_HISTORY \
+ >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Didn't find hold on $ds with $tag"
+ return 1
+ fi
+ done
+
+ return 0
+}
+
+function verify_release
+{
+ # hold and release formats only differ by the subcommand name, so
+ # simply reuse the hold function.
+ verify_hold "$1" "release" "$3"
+}
+
+function verify_rollback
+{
+ typeset cmd=$1
+ typeset flags=$3
+
+ [[ $flags =~ "i" ]] || return 1
+
+ typeset fullname=${cmd##* }
+ typeset dsname=${fullname%%@*}
+ typeset parent_fs=${dsname##*/}
+ typeset rb_fs=${dsname}/%rollback
+ typeset snapname=${fullname##*@}
+
+ $GREP "clone swap $rb_fs ([0-9]*) parent=$parent_fs" $NEW_HISTORY \
+ >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Didn't find rollback clone swap in pool history"
+ return 1
+ fi
+
+ $GREP "destroy $rb_fs" $NEW_HISTORY >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Didn't find rollback destroy in pool history"
+ return 1
+ fi
+
+ return 0
+}
+
+function verify_inherit
+{
+ typeset cmd=$1
+ typeset flags=$3
+
+ [[ $flags =~ "i" ]] || return 1
+
+ typeset dsname=${cmd##* }
+ typeset prop=${cmd% *}
+ prop=${prop##* }
+
+ # This works whether or not the inherit was recursive
+ for ds in $($ZFS list -r -Ho name -t filesystem $dsname); do
+ $GREP "$subcmd $ds ([0-9]*) ${prop}=" $NEW_HISTORY >/dev/null \
+ 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Didn't find inherit history for $ds"
+ return 1
+ fi
+ done
+
+ return 0
+}
+
+function verify_allow
+{
+ typeset cmd=$1
+ typeset subcmd=$2
+ typeset flags=$3
+
+ [[ $flags =~ "i" ]] || return 1
+ [[ $subcmd == "allow" ]] && subcmd="update"
+ [[ $subcmd == "unallow" ]] && subcmd="remove"
+ typeset is_set lflag dflag dsname gname gid uname uid opt str code tmp
+
+ #
+ # Here, we determine three things:
+ # - Whether we're operating on a set or an indivdual permission (which
+ # dictates the case of the first character in the code)
+ # - The name of the dataset we're operating on.
+ # - Whether the operation applies locally or to descendent datasets (or
+ # both)
+ #
+ $ECHO $cmd | $AWK '{i = NF - 1; print $i}' | $GREP '@' >/dev/null \
+ 2>&1 && is_set=1
+ dsname=${cmd##* }
+ [[ $cmd =~ "-l " ]] && lflag=1
+ [[ $cmd =~ "-d " ]] && dflag=1
+ if [[ -z $lflag && -z $dflag ]]; then
+ lflag=1
+ dflag=1
+ fi
+
+ #
+ # For each of the five cases below, the operation is essentially the
+ # same. First, use the command passed in to determine what the code at
+ # the end of the pool history will be. The specifics of the code are
+ # described in a block comment at the top of dsl_deleg.c. Once that's
+ # been assembled, check for its presence in the history, and return
+ # success or failure accordingly.
+ #
+ if [[ $cmd =~ "-s " ]]; then
+ str="s-\$@"
+ [[ -n $is_set ]] && str="S-\$@"
+ tmp=${cmd#*@}
+ code="$str${tmp% *}"
+ $GREP "permission $subcmd $dsname ([0-9]*) $code" \
+ $NEW_HISTORY >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Couldn't find $code in $NEW_HISTORY"
+ return 1
+ fi
+ elif [[ $cmd =~ "-c " ]]; then
+ str="c-\$"
+ [[ -n $is_set ]] && str="C-\$"
+ tmp=${cmd#*-c}
+ code="$str${tmp% *}"
+ $GREP "permission $subcmd $dsname ([0-9]*) $code" \
+ $NEW_HISTORY >/dev/null 2>&1
+ if [ $? != 0 ]]; then
+ log_note "Couldn't find $code in $NEW_HISTORY"
+ return 1
+ fi
+ elif [[ $cmd =~ "-u " ]]; then
+ str="u"
+ [[ -n $is_set ]] && str="U"
+ tmp=${cmd##*-u }
+ opt=$($ECHO $tmp | $AWK '{print $2}')
+ uid=$($ID -u ${tmp%% *})
+ if [[ -n $lflag ]]; then
+ code="${str}l\$$uid $opt"
+ $GREP "permission $subcmd $dsname ([0-9]*) $code" \
+ $NEW_HISTORY >/dev/null 2>&1
+ if [ $? != 0 ]]; then
+ log_note "Couldn't find $code in $NEW_HISTORY"
+ return 1
+ fi
+ fi
+ if [[ -n $dflag ]]; then
+ code="${str}d\$$uid $opt"
+ $GREP "permission $subcmd $dsname ([0-9]*) $code" \
+ $NEW_HISTORY >/dev/null 2>&1
+ if [ $? != 0 ]]; then
+ log_note "Couldn't find $code in $NEW_HISTORY"
+ return 1
+ fi
+ fi
+ elif [[ $cmd =~ "-g " ]]; then
+ str="g"
+ [[ -n $is_set ]] && str="G"
+ tmp=${cmd##*-g }
+ opt=$($ECHO $tmp | $AWK '{print $2}')
+ gid=$($AWK -F: "/^${tmp%% *}:/ {print \$3}" /etc/group)
+ if [[ -n $lflag ]]; then
+ code="${str}l\$$gid $opt"
+ $GREP "permission $subcmd $dsname ([0-9]*) $code" \
+ $NEW_HISTORY >/dev/null 2>&1
+ if [ $? != 0 ]]; then
+ log_note "Couldn't find $code in $NEW_HISTORY"
+ return 1
+ fi
+ fi
+ if [[ -n $dflag ]]; then
+ code="${str}d\$$gid $opt"
+ $GREP "permission $subcmd $dsname ([0-9]*) $code" \
+ $NEW_HISTORY >/dev/null 2>&1
+ if [ $? != 0 ]]; then
+ log_note "Couldn't find $code in $NEW_HISTORY"
+ return 1
+ fi
+ fi
+ elif [[ $cmd =~ "-e " ]]; then
+ str="e"
+ [[ -n $is_set ]] && str="E"
+ opt=${cmd##*-e }
+ opt=${opt%% *}
+ if [[ -n $lflag ]]; then
+ code="${str}l\$ $opt"
+ $GREP "permission $subcmd $dsname ([0-9]*) $code" \
+ $NEW_HISTORY >/dev/null 2>&1
+ if [ $? != 0 ]]; then
+ log_note "Couldn't find $code in $NEW_HISTORY"
+ return 1
+ fi
+ fi
+ if [[ -n $dflag ]]; then
+ code="${str}d\$ $opt"
+ $GREP "permission $subcmd $dsname ([0-9]*) $code" \
+ $NEW_HISTORY >/dev/null 2>&1
+ if [ $? != 0 ]]; then
+ log_note "Couldn't find $code in $NEW_HISTORY"
+ return 1
+ fi
+ fi
+ else
+ log_note "Can't parse command \"$cmd\""
+ return 1
+ fi
+
+ return 0
+}
+
+function verify_unallow
+{
+ #
+ # The unallow and allow history have the same format, except the former
+ # logs "permission removed" and the latter "permission updated" so
+ # simply reuse the allow function.
+ #
+ verify_allow "$1" "unallow" "$3"
+}
+
+function verify_destroy
+{
+ typeset cmd=$1
+ typeset flags=$3
+
+ # This function doesn't currently verifiy the zpool command.
+ [[ ${cmd%% *} == "zfs" ]] || return 1
+ [[ $flags =~ "i" ]] || return 1
+
+ typeset dsname=${cmd##* }
+ [[ $dsname =~ "@" ]] && typeset is_snap=1
+
+ if [[ -n $is_snap ]]; then
+ $GREP "ioctl destroy_snaps" $NEW_HISTORY >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Didn't find ioctl while destroying $dsname"
+ return 1
+ fi
+ fi
+
+ # This should be present for datasets and snapshots alike
+ $GREP "destroy $dsname" $NEW_HISTORY >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Didn't find \"destroy\" for $dsname"
+ return 1
+ fi
+
+ return 0
+}
+
+function verify_snapshot
+{
+ typeset cmd=$1
+ typeset flags=$3
+
+ [[ $flags =~ "i" ]] || return 1
+
+ typeset fullname=${cmd##* }
+ typeset dsname=${fullname%%@*}
+ typeset snapname=${fullname##*@}
+
+ $GREP "\[txg:[0-9]*\] $subcmd $fullname ([0-9]*)" $NEW_HISTORY \
+ >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Didn't find snapshot command for $fullname"
+ return 1
+ fi
+
+ # This works whether or not the snapshot was recursive
+ for ds in $($ZFS list -r -Ho name -t snapshot $dsname | \
+ $GREP "@$snapname"); do
+ $GREP "^[ ]* $ds$" $NEW_HISTORY >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_note "Didn't find \"ioctl snapshot\" for $ds"
+ return 1
+ fi
+ done
+
+ return 0
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/history/i386.migratedpool.DAT.Z b/usr/src/test/zfs-tests/tests/functional/history/i386.migratedpool.DAT.Z
new file mode 100644
index 0000000000..21cd7fcf58
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/i386.migratedpool.DAT.Z
Binary files differ
diff --git a/usr/src/test/zfs-tests/tests/functional/history/i386.orig_history.txt b/usr/src/test/zfs-tests/tests/functional/history/i386.orig_history.txt
new file mode 100644
index 0000000000..148b825c3f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/i386.orig_history.txt
@@ -0,0 +1,12 @@
+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/usr/src/test/zfs-tests/tests/functional/history/setup.ksh b/usr/src/test/zfs-tests/tests/functional/history/setup.ksh
new file mode 100644
index 0000000000..e620c2ec30
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/setup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/history/sparc.migratedpool.DAT.Z b/usr/src/test/zfs-tests/tests/functional/history/sparc.migratedpool.DAT.Z
new file mode 100644
index 0000000000..47a61ffd51
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/sparc.migratedpool.DAT.Z
Binary files differ
diff --git a/usr/src/test/zfs-tests/tests/functional/history/sparc.orig_history.txt b/usr/src/test/zfs-tests/tests/functional/history/sparc.orig_history.txt
new file mode 100644
index 0000000000..2d0e3427cd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/sparc.orig_history.txt
@@ -0,0 +1,12 @@
+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/usr/src/test/zfs-tests/tests/functional/history/zfs-pool-v4.dat.Z b/usr/src/test/zfs-tests/tests/functional/history/zfs-pool-v4.dat.Z
new file mode 100644
index 0000000000..bc32472f00
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/history/zfs-pool-v4.dat.Z
Binary files differ
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/Makefile b/usr/src/test/zfs-tests/tests/functional/inheritance/Makefile
new file mode 100644
index 0000000000..115c33b5ae
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/Makefile
@@ -0,0 +1,90 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/inheritance
+
+PROGS = cleanup \
+ inherit_001_pos
+
+FILES = config001.cfg \
+ config002.cfg \
+ config003.cfg \
+ config004.cfg \
+ config005.cfg \
+ config006.cfg \
+ config007.cfg \
+ config008.cfg \
+ config009.cfg \
+ config010.cfg \
+ config011.cfg \
+ config012.cfg \
+ config013.cfg \
+ config014.cfg \
+ config015.cfg \
+ config016.cfg \
+ config017.cfg \
+ config018.cfg \
+ config019.cfg \
+ config020.cfg \
+ config021.cfg \
+ config022.cfg \
+ config023.cfg \
+ config024.cfg \
+ inherit.kshlib \
+ state001.cfg \
+ state002.cfg \
+ state003.cfg \
+ state004.cfg \
+ state005.cfg \
+ state006.cfg \
+ state007.cfg \
+ state008.cfg \
+ state009.cfg \
+ state010.cfg \
+ state011.cfg \
+ state012.cfg \
+ state013.cfg \
+ state014.cfg \
+ state015.cfg \
+ state016.cfg \
+ state017.cfg \
+ state018.cfg \
+ state019.cfg \
+ state020.cfg \
+ state021.cfg \
+ state022.cfg \
+ state023.cfg \
+ state024.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/README.config b/usr/src/test/zfs-tests/tests/functional/inheritance/README.config
new file mode 100644
index 0000000000..6e04a3f967
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/README.config
@@ -0,0 +1,67 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+# 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:
+# <dataset name> <dataset type> <inital property setting>
+#
+# <dataset name> - must be the full dataset name
+#
+# <dataset type> - recognised types are POOL, CTR and FS
+#
+#
+# <initial property setting> - 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR -
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/README.state b/usr/src/test/zfs-tests/tests/functional/inheritance/README.state
new file mode 100644
index 0000000000..c1d3cc05d6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/README.state
@@ -0,0 +1,109 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+#
+# 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:
+# <target dataset>:<command>
+# <property source before command> <property src after command>
+# <property source before command> <property src after command>
+# .... ....
+# .... ....
+#
+# <target dataset> - dataset upon which the <command> 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> - 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 '-'.
+#
+# <property src before command>
+# - the 'source' (as reported in 'zfs get') for the
+# the properties before <command> 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.
+#
+# <property src after command>
+# - the expected value of the 'source' field after the
+# <command> has been executed on the <target dataset>.
+# 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 <property src..> line corresponding to each dataset
+# line specified in the configX.cfg file.
+#
+#
+# 2) There can be as many <command>/<property src> 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 <command>/<property src> 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+-:-
+#
+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/usr/src/test/zfs-tests/tests/functional/inheritance/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/inheritance/cleanup.ksh
new file mode 100644
index 0000000000..9ff335a333
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/cleanup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. ${STF_SUITE}/include/libtest.shlib
+
+$RM -rf $TESTDIR.*
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config001.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config001.cfg
new file mode 100644
index 0000000000..23616cbf3b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config001.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR -
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config002.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config002.cfg
new file mode 100644
index 0000000000..31294110f6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config002.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config003.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config003.cfg
new file mode 100644
index 0000000000..57a73b95d4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config003.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR default
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config004.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config004.cfg
new file mode 100644
index 0000000000..1052526379
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config004.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config005.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config005.cfg
new file mode 100644
index 0000000000..d15beb2c4c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config005.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config006.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config006.cfg
new file mode 100644
index 0000000000..a059d17978
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config006.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR -
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config007.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config007.cfg
new file mode 100644
index 0000000000..b416c9f17d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config007.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config008.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config008.cfg
new file mode 100644
index 0000000000..4f7e7b0ef7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config008.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR default
+TESTPOOL/TESTCTR/TESTFS1 FS default
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config009.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config009.cfg
new file mode 100644
index 0000000000..4f7e7b0ef7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config009.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR default
+TESTPOOL/TESTCTR/TESTFS1 FS default
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config010.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config010.cfg
new file mode 100644
index 0000000000..4f7e7b0ef7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config010.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR default
+TESTPOOL/TESTCTR/TESTFS1 FS default
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config011.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config011.cfg
new file mode 100644
index 0000000000..57a73b95d4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config011.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR default
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config012.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config012.cfg
new file mode 100644
index 0000000000..57a73b95d4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config012.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR default
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config013.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config013.cfg
new file mode 100644
index 0000000000..1052526379
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config013.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config014.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config014.cfg
new file mode 100644
index 0000000000..1052526379
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config014.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config015.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config015.cfg
new file mode 100644
index 0000000000..31294110f6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config015.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config016.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config016.cfg
new file mode 100644
index 0000000000..31294110f6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config016.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL default
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config017.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config017.cfg
new file mode 100644
index 0000000000..d15beb2c4c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config017.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config018.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config018.cfg
new file mode 100644
index 0000000000..d15beb2c4c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config018.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config019.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config019.cfg
new file mode 100644
index 0000000000..23616cbf3b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config019.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR -
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config020.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config020.cfg
new file mode 100644
index 0000000000..23616cbf3b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config020.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR -
+TESTPOOL/TESTCTR/TESTFS1 FS -
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config021.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config021.cfg
new file mode 100644
index 0000000000..a059d17978
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config021.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR -
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config022.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config022.cfg
new file mode 100644
index 0000000000..a059d17978
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config022.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR -
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config023.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config023.cfg
new file mode 100644
index 0000000000..b416c9f17d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config023.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/config024.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/config024.cfg
new file mode 100644
index 0000000000..b416c9f17d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/config024.cfg
@@ -0,0 +1,33 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+TESTPOOL POOL local
+TESTPOOL/TESTCTR CTR local
+TESTPOOL/TESTCTR/TESTFS1 FS local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/inherit.kshlib b/usr/src/test/zfs-tests/tests/functional/inheritance/inherit.kshlib
new file mode 100644
index 0000000000..cee0cfdf13
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/inherit.kshlib
@@ -0,0 +1,114 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+#
+# 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
+ echo $prop_val
+ fi
+}
+
+#
+# Function to check the 'source' of a property. The source can
+# either be "default", "local", or "inherited from <parent dataset>".
+#
+# 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/usr/src/test/zfs-tests/tests/functional/inheritance/inherit_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inheritance/inherit_001_pos.ksh
new file mode 100644
index 0000000000..1842d21589
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/inherit_001_pos.ksh
@@ -0,0 +1,437 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inheritance/inherit.kshlib
+
+#
+# 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.
+#
+
+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 "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 dir=$3
+
+ 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."
+ while (( i < ${#prop[*]} )); do
+ if [[ ${prop[i]} == "recordsize" ]]; then
+ update_recordsize $dataset $init_code
+ else
+ if [[ ${prop[i]} == "mountpoint" ]]; then
+ set_n_verify_prop ${prop[i]} \
+ ${local_val[((i/2))]}.$dir $dataset
+ else
+ set_n_verify_prop ${prop[i]} \
+ ${local_val[((i/2))]} $dataset
+ fi
+ fi
+
+ ((i = i + 2))
+ done
+ else
+ log_fail "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
+ #
+ while (( idx < ${#prop[*]} )); do
+ [[ ${prop[idx]} == "recordsize" ]] && break
+
+ ((idx = idx + 2))
+ 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 <higher dataset>'.
+#
+# 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
+ # Extract mount points specific to datasets
+ if [[ $dataset == "TESTPOOL" ]]; then
+ mntpt=${local_val[idx]}.1
+ elif [[ $dataset == "TESTPOOL/TESTCTR" ]]; then
+ mntpt=${local_val[idx]}.2
+ else
+ mntpt=${local_val[idx]}.3
+ fi
+ elif [[ $src == "default" ]]; then
+ mntpt="/$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
+ echo $mntpt
+}
+
+#
+# Simple function to verify that a property has the
+# expected value.
+#
+function verify_prop_val #property dataset src index
+{
+ typeset prop=$1
+ typeset dataset=$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
+
+ if [[ $prop_val != $exp_val ]]; then
+ # 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
+
+ if [[ $prop != "aclinherit" || \
+ $exp_val != "secure" || \
+ $prop_val != "restricted" ]]; then
+
+ log_fail "$prop of $dataset is [$prop_val] rather "\
+ "than [$exp_val]"
+ fi
+ fi
+}
+
+#
+# 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=""
+ typeset -i mount_dir=1
+
+ grep "^[^#]" $config_file | {
+ while read name type init ; do
+ create_dataset $name $type $DISK
+ init_props $name $init $mount_dir
+ ((mount_dir = mount_dir + 1))
+ done
+ }
+}
+
+#
+# Function to check an exit flag, calling log_fail if that exit flag
+# is non-zero. Can be used from code that runs in a tight loop, which
+# would otherwise result in a lot of journal output.
+#
+function check_failure { # int status, error message to use
+
+ typeset -i exit_flag=$1
+ error_message=$2
+
+ if [[ $exit_flag -ne 0 ]]; then
+ log_fail "$error_message"
+ fi
+}
+
+
+#
+# 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"
+
+ while ((i < ${#prop[*]})); do
+ grep "^[^#]" $state_file | {
+ while IFS=: read target op; do
+ #
+ # 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
+ # check_failure, rather than log_must - this
+ # substantially reduces journal output.
+ #
+ if [[ $op == "-" ]]; then
+ log_note "No operation specified"
+ else
+ export __ZFS_POOL_RESTRICT="$TESTPOOL"
+ log_must $ZFS unmount -a
+ unset __ZFS_POOL_RESTRICT
+
+ for p in ${prop[i]} ${prop[((i+1))]}; do
+ $ZFS $op $p $target
+ ret=$?
+ check_failure $ret "$ZFS $op $p \
+ $target"
+ done
+ fi
+ for check_obj in $list; do
+ read init_src final_src
+
+ for p in ${prop[i]} ${prop[((i+1))]}; do
+ # check_failure to keep journal small
+ verify_prop_src $check_obj $p \
+ $final_src
+ ret=$?
+ check_failure $ret "verify" \
+ "_prop_src $check_obj $p" \
+ "$final_src"
+
+ # Again, to keep journal size down.
+ verify_prop_val $p $check_obj \
+ $final_src $j
+ ret=$?
+ check_failure $ret "verify" \
+ "_prop_val $check_obj $p" \
+ "$final_src"
+ done
+ done
+ done
+ }
+ ((i = i + 2))
+ ((j = j + 1))
+ done
+}
+
+
+set -A prop "checksum" "" \
+ "compression" "compress" \
+ "atime" "" \
+ "devices" "" \
+ "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 'prop' array
+# above must have a corresponding entry in the two arrays below.
+#
+
+set -A def_val "on" "off" "on" "on" "on" \
+ "on" "off" "" \
+ "" "hidden" "discard" "secure" \
+ "off"
+
+set -A local_val "off" "on" "off" "off" "off" \
+ "off" "on" "" \
+ "$TESTDIR" "visible" "groupmask" "discard" \
+ "off"
+
+#
+# Global flag indicating whether the default record size had been
+# read.
+#
+typeset def_recordsize=0
+
+set -A config_files $(ls $STF_SUITE/tests/functional/inheritance/config*[1-9]*.cfg)
+set -A state_files $(ls $STF_SUITE/tests/functional/inheritance/state*.cfg)
+
+#
+# Global list of datasets created.
+#
+list=""
+
+typeset -i k=0
+
+if [[ ${#config_files[*]} != ${#state_files[*]} ]]; then
+ log_fail "Must have the same number of config files " \
+ " (${#config_files[*]}) and state files ${#state_files[*]}"
+fi
+
+while ((k < ${#config_files[*]})); do
+ default_cleanup_noexit
+ def_recordsize=0
+
+ log_note "Testing configuration ${config_files[k]}"
+
+ scan_config ${config_files[k]}
+ scan_state ${state_files[k]}
+
+ ((k = k + 1))
+done
+
+log_pass "Properties correctly inherited as expected"
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state001.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state001.cfg
new file mode 100644
index 0000000000..68e43792f1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state001.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 TESTPOOL
+TESTPOOL TESTPOOL
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state002.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state002.cfg
new file mode 100644
index 0000000000..c3b9b1553d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state002.cfg
@@ -0,0 +1,45 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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/TESTCTR TESTPOOL/TESTCTR
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state003.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state003.cfg
new file mode 100644
index 0000000000..5780065ace
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state003.cfg
@@ -0,0 +1,43 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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/usr/src/test/zfs-tests/tests/functional/inheritance/state004.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state004.cfg
new file mode 100644
index 0000000000..e62979a04b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state004.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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/usr/src/test/zfs-tests/tests/functional/inheritance/state005.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state005.cfg
new file mode 100644
index 0000000000..097459ffed
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state005.cfg
@@ -0,0 +1,45 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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/TESTCTR TESTPOOL/TESTCTR
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state006.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state006.cfg
new file mode 100644
index 0000000000..9863b298fe
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state006.cfg
@@ -0,0 +1,47 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 ***
+#
+-:-
+#
+# <prop src before cmd> <prop src after cmd>
+#
+local local
+TESTPOOL TESTPOOL
+local local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state007.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state007.cfg
new file mode 100644
index 0000000000..731ec95a25
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state007.cfg
@@ -0,0 +1,45 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 ***
+#
+-:-
+#
+# <prop src before cmd> <prop src after cmd>
+#
+local local
+local local
+local local
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state008.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state008.cfg
new file mode 100644
index 0000000000..7385c98c3c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state008.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 ***
+#
+-:-
+#
+# <prop src before cmd> <prop src after cmd>
+default default
+default default
+default default
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state009.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state009.cfg
new file mode 100644
index 0000000000..3fb2841a2c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state009.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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
+#
+default default
+default default
+default default
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+default default
+default default
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state010.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state010.cfg
new file mode 100644
index 0000000000..4c51e808b1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state010.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 -r
+#
+default default
+default default
+default default
+#
+TESTPOOL/TESTCTR:inherit -r
+#
+default default
+default default
+default default
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit -r
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state011.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state011.cfg
new file mode 100644
index 0000000000..f6e791ee73
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state011.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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
+#
+default default
+default default
+local local
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+default default
+local local
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+local default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state012.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state012.cfg
new file mode 100644
index 0000000000..6f3f389846
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state012.cfg
@@ -0,0 +1,62 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 -r
+#
+default default
+default default
+local default
+#
+TESTPOOL/TESTCTR:inherit -r
+#
+default default
+default default
+default default
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit -r
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state013.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state013.cfg
new file mode 100644
index 0000000000..ae59192926
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state013.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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
+#
+default default
+local local
+local local
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+local default
+local local
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+local default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state014.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state014.cfg
new file mode 100644
index 0000000000..3322123080
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state014.cfg
@@ -0,0 +1,62 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 -r
+#
+default default
+local default
+local default
+#
+TESTPOOL/TESTCTR:inherit -r
+#
+default default
+default default
+default default
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit -r
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state015.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state015.cfg
new file mode 100644
index 0000000000..bab7bc2864
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state015.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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
+#
+default default
+local local
+TESTPOOL/TESTCTR TESTPOOL/TESTCTR
+#
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+local default
+TESTPOOL/TESTCTR default
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+default default
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state016.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state016.cfg
new file mode 100644
index 0000000000..50601c60bd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state016.cfg
@@ -0,0 +1,62 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 -r
+#
+default default
+local default
+TESTPOOL default
+#
+TESTPOOL/TESTCTR:inherit -r
+#
+default default
+default default
+default default
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit -r
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state017.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state017.cfg
new file mode 100644
index 0000000000..a4a127dd4c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state017.cfg
@@ -0,0 +1,67 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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
+#
+local default
+local local
+TESTPOOL/TESTCTR TESTPOOL/TESTCTR
+#
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+local default
+TESTPOOL/TESTCTR default
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+default default
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state018.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state018.cfg
new file mode 100644
index 0000000000..b76bbac488
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state018.cfg
@@ -0,0 +1,64 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 -r
+#
+local default
+local default
+TESTPOOL/TESTCTR default
+#
+#
+TESTPOOL/TESTCTR:inherit -r
+#
+default default
+default default
+default default
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+default default
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state019.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state019.cfg
new file mode 100644
index 0000000000..652d3b17ed
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state019.cfg
@@ -0,0 +1,63 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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
+#
+local default
+TESTPOOL default
+TESTPOOL default
+#
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+default default
+default default
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state020.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state020.cfg
new file mode 100644
index 0000000000..fc869f8640
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state020.cfg
@@ -0,0 +1,64 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 -r
+#
+local default
+TESTPOOL default
+TESTPOOL default
+#
+#
+TESTPOOL/TESTCTR:inherit -r
+#
+default default
+default default
+default default
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit -r
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state021.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state021.cfg
new file mode 100644
index 0000000000..f61472eff1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state021.cfg
@@ -0,0 +1,64 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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
+#
+local default
+TESTPOOL default
+local local
+#
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+default default
+local local
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+local default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state022.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state022.cfg
new file mode 100644
index 0000000000..a00f3bb652
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state022.cfg
@@ -0,0 +1,63 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 -r
+#
+local default
+TESTPOOL default
+local default
+#
+#
+TESTPOOL/TESTCTR:inherit -r
+#
+default default
+default default
+default default
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit -r
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state023.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state023.cfg
new file mode 100644
index 0000000000..8219a2abf3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state023.cfg
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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
+#
+local default
+local local
+local local
+#
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+local default
+local local
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+local default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/inheritance/state024.cfg b/usr/src/test/zfs-tests/tests/functional/inheritance/state024.cfg
new file mode 100644
index 0000000000..22d605c0ac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inheritance/state024.cfg
@@ -0,0 +1,63 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+# *** 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 -r
+#
+local default
+local default
+local default
+#
+#
+TESTPOOL/TESTCTR:inherit
+#
+default default
+default default
+default default
+#
+#
+TESTPOOL/TESTCTR/TESTFS1:inherit
+#
+default default
+default default
+default default
+#
diff --git a/usr/src/test/zfs-tests/tests/functional/interop/Makefile b/usr/src/test/zfs-tests/tests/functional/interop/Makefile
new file mode 100644
index 0000000000..a2c7913ef2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/interop/Makefile
@@ -0,0 +1,43 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/interop
+
+PROGS = cleanup \
+ interop_001_pos \
+ setup
+
+FILES = interop.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/interop/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/interop/cleanup.ksh
new file mode 100644
index 0000000000..4a95fed8f0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/interop/cleanup.ksh
@@ -0,0 +1,73 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/interop/interop.cfg
+
+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/usr/src/test/zfs-tests/tests/functional/interop/interop.cfg b/usr/src/test/zfs-tests/tests/functional/interop/interop.cfg
new file mode 100644
index 0000000000..f561535d57
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/interop/interop.cfg
@@ -0,0 +1,81 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+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/usr/src/test/zfs-tests/tests/functional/interop/interop_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/interop/interop_001_pos.ksh
new file mode 100644
index 0000000000..a10f4af08b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/interop/interop_001_pos.ksh
@@ -0,0 +1,88 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/interop/interop.cfg
+
+#
+# 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.
+#
+
+
+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/usr/src/test/zfs-tests/tests/functional/interop/setup.ksh b/usr/src/test/zfs-tests/tests/functional/interop/setup.ksh
new file mode 100644
index 0000000000..a764216f1a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/interop/setup.ksh
@@ -0,0 +1,83 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/interop/interop.cfg
+
+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
+
+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/usr/src/test/zfs-tests/tests/functional/inuse/Makefile b/usr/src/test/zfs-tests/tests/functional/inuse/Makefile
new file mode 100644
index 0000000000..e3807308fd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/Makefile
@@ -0,0 +1,51 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/inuse
+
+PROGS = cleanup \
+ inuse_001_pos \
+ inuse_002_pos \
+ inuse_003_pos \
+ inuse_004_pos \
+ inuse_005_pos \
+ inuse_006_pos \
+ inuse_007_pos \
+ inuse_008_pos \
+ inuse_009_pos \
+ setup
+
+FILES = inuse.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse.cfg b/usr/src/test/zfs-tests/tests/functional/inuse/inuse.cfg
new file mode 100644
index 0000000000..fba8ba3879
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse.cfg
@@ -0,0 +1,125 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+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}s0
+ FS_SIDE1=${FS_DISK0}s1
+ FS_SIDE2=${FS_DISK1}s0
+ FS_SIDE3=${FS_DISK1}s1
+ disk0="/dev/dsk/$FS_SIDE0"
+ disk1="/dev/dsk/$FS_SIDE1"
+ disk2="/dev/dsk/$FS_SIDE2"
+ disk3="/dev/dsk/$FS_SIDE3"
+ disktargets="$disk0 $disk2"
+ rawdisk0="/dev/rdsk/$FS_SIDE0"
+ rawdisk1="/dev/rdsk/$FS_SIDE1"
+ rawdisk2="/dev/rdsk/$FS_SIDE2"
+ rawdisk3="/dev/rdsk/$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}s0
+ FS_SIDE1=${FS_DISK0}s1
+ FS_SIDE2=${FS_DISK1}s0
+ FS_SIDE3=${FS_DISK2}s0
+ disk0="/dev/dsk/$FS_SIDE0"
+ disk1="/dev/dsk/$FS_SIDE1"
+ disk2="/dev/dsk/$FS_SIDE2"
+ disk3="/dev/dsk/$FS_SIDE3"
+ disktargets="$disk0 $disk2 $disk3"
+ rawdisk0="/dev/rdsk/$FS_SIDE0"
+ rawdisk1="/dev/rdsk/$FS_SIDE1"
+ rawdisk2="/dev/rdsk/$FS_SIDE2"
+ rawdisk3="/dev/rdsk/$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}s0
+ FS_SIDE1=${FS_DISK1}s0
+ FS_SIDE2=${FS_DISK2}s0
+ FS_SIDE3=${FS_DISK3}s0
+ disk0="/dev/dsk/$FS_SIDE0"
+ disk1="/dev/dsk/$FS_SIDE1"
+ disk2="/dev/dsk/$FS_SIDE2"
+ disk3="/dev/dsk/$FS_SIDE3"
+ disktargets="$disk0 $disk1 $disk2 $disk3"
+ rawdisk0="/dev/rdsk/$FS_SIDE0"
+ rawdisk1="/dev/rdsk/$FS_SIDE1"
+ rawdisk2="/dev/rdsk/$FS_SIDE2"
+ rawdisk3="/dev/rdsk/$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/usr/src/test/zfs-tests/tests/functional/inuse/inuse_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_001_pos.ksh
new file mode 100644
index 0000000000..b42123b7fc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_001_pos.ksh
@@ -0,0 +1,90 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# ZFS will not interfere with devices that are in use by dumpadm.
+#
+# STRATEGY:
+# 1. Create crash dump device using 'dumpadm'
+# 2. Try to create a ZFS pool using the 'dumpadm' crash dump device.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ #
+ # Remove dump device.
+ #
+ if [[ -n $PREVDUMPDEV ]]; then
+ log_must $DUMPADM -u -d $PREVDUMPDEV > /dev/null
+ fi
+
+ destroy_pool $TESTPOOL
+}
+
+log_assert "Ensure ZFS cannot use a device designated as a dump device"
+
+log_onexit cleanup
+
+typeset dumpdev=""
+typeset diskslice=""
+
+PREVDUMPDEV=`$DUMPADM | $GREP "Dump device" | $AWK '{print $3}'`
+
+log_note "Zero $FS_DISK0 and place free space in to slice 0"
+log_must cleanup_devices $FS_DISK0
+
+if [[ $WRAPPER == *"smi"* ]]; then
+ diskslice="/dev/dsk/${FS_DISK0}s2"
+else
+ diskslice="/dev/dsk/${FS_DISK0}s0"
+fi
+
+log_note "Configuring $diskslice as dump device"
+log_must $DUMPADM -d $diskslice > /dev/null
+
+log_note "Confirm that dump device has been setup"
+dumpdev=`$DUMPADM | $GREP "Dump device" | $AWK '{print $3}'`
+[[ -z "$dumpdev" ]] && log_untested "No dump device has been configured"
+
+[[ "$dumpdev" != "$diskslice" ]] && \
+ log_untested "Dump device has not been been configured to $diskslice"
+
+log_note "Attempt to zpool the dump device"
+log_mustnot $ZPOOL create $TESTPOOL "$diskslice"
+log_mustnot poolexists $TESTPOOL
+
+log_pass "Unable to zpool a device in use by dumpadm"
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_002_pos.ksh
new file mode 100644
index 0000000000..586aab582c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_002_pos.ksh
@@ -0,0 +1,111 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# ZFS will not interfere with devices that are in use by SVM
+#
+# STRATEGY:
+# 1. Create SVM device d99 with a disk
+# 2. Try to create a ZFS pool with same disk
+# 3. Try a use the same disk as a spare device
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+
+ poolexists $TESTPOOL2 && destroy_pool $TESTPOOL2
+
+ $METASTAT d99 > /dev/null 2>&1
+ (( $? == 0 )) && $METACLEAR -f d99
+
+ typeset metadb=""
+ typeset i=""
+
+ metadb=`$METADB | $CUT -f6 | $GREP dev | $UNIQ`
+ for i in $metadb; do
+ $METADB -fd $i > /dev/null 2>&1
+ done
+
+ #
+ # Tidy up the disks we used.
+ #
+ cleanup_devices $vdisks $sdisks
+}
+
+log_assert "Ensure ZFS does not interfere with devices in use by SVM"
+
+log_onexit cleanup
+
+for num in 0 1 2; do
+ eval typeset slice=\${FS_SIDE$num}
+ disk=${slice%s*}
+ slice=${slice##*s}
+ if [[ $WRAPPER == *"smi"* && \
+ $disk == ${saved_disk} ]]; then
+ cyl=$(get_endslice $disk ${saved_slice})
+ log_must set_partition $slice "$cyl" $FS_SIZE $disk
+ else
+ log_must set_partition $slice "" $FS_SIZE $disk
+ fi
+ saved_disk=$disk
+ saved_slice=$slice
+done
+
+log_note "Configuring metadb with $FS_SIDE1"
+log_must $METADB -a -f -c 3 $FS_SIDE1
+
+log_note "Configure d99 with $FS_SIDE0"
+log_must $METAINIT d99 1 1 $FS_SIDE0
+
+log_note "Attempt to zpool the device in use by SVM"
+log_mustnot $ZPOOL create $TESTPOOL1 $FS_SIDE0
+log_mustnot poolexists $TESTPOOL1
+
+log_note "Attempt to take device in use by SVM as spare device"
+log_mustnot $ZPOOL create $TESTPOOL1 $FS_SIDE2 spare $FS_SIDE0
+log_mustnot poolexists $TESTPOOL1
+
+log_note "Attempt to zpool a metadb device in use by SVM"
+log_mustnot $ZPOOL create $TESTPOOL2 $FS_SIDE1
+log_mustnot poolexists $TESTPOOL2
+
+log_note "Attempt to take device in use by SVM as spare device"
+log_mustnot $ZPOOL create $TESTPOOL2 $FS_SIDE2 spare $FS_SIDE1
+log_mustnot poolexists $TESTPOOL2
+
+log_pass "Unable to zpool a device in use by SVM"
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_003_pos.ksh
new file mode 100644
index 0000000000..f04e01c949
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_003_pos.ksh
@@ -0,0 +1,185 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2012 by Delphix. All rights reserved.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# ZFS will not interfere with devices that are in use by ufsdump or
+# ufsrestore.
+#
+# STRATEGY:
+# 1. newfs a disk
+# 2. mount the disk
+# 3. create files and dirs on disk
+# 4. umount the disk
+# 5. ufsdump this disk to a backup disk
+# 6. Try to create a ZFS pool with same disk (also as a spare device)
+# 7. ufsrestore the disk from backup
+# 8. try to create a zpool during the ufsrestore
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+
+ poolexists $TESTPOOL2 && destroy_pool $TESTPOOL2
+
+ log_note "Kill off ufsdump process if still running"
+ $KILL -0 $PIDUFSDUMP > /dev/null 2>&1 && \
+ log_must $KILL -9 $PIDUFSDUMP > /dev/null 2>&1
+ #
+ # Note: It would appear that ufsdump spawns a number of processes
+ # which are not killed when the $PIDUFSDUMP is whacked. So best bet
+ # is to find the rest of the them and deal with them individually.
+ #
+ for all in `$PGREP ufsdump`
+ do
+ $KILL -9 $all > /dev/null 2>&1
+ done
+
+ log_note "Kill off ufsrestore process if still running"
+ $KILL -0 $PIDUFSRESTORE > /dev/null 2>&1 && \
+ log_must $KILL -9 $PIDUFSRESTORE > /dev/null 2>&1
+
+ ismounted $UFSMP ufs && log_must $UMOUNT $UFSMP
+
+ $RM -rf $UFSMP
+ $RM -rf $TESTDIR
+
+ #
+ # Tidy up the disks we used.
+ #
+ log_must cleanup_devices $vdisks $sdisks
+}
+
+log_assert "Ensure ZFS does not interfere with devices that are in use by " \
+ "ufsdump or ufsrestore"
+
+log_onexit cleanup
+
+typeset bigdir="${UFSMP}/bigdirectory"
+typeset restored_files="${UFSMP}/restored_files"
+typeset -i dirnum=0
+typeset -i filenum=0
+typeset cwd=""
+
+for num in 0 1 2; do
+ eval typeset slice=\${FS_SIDE$num}
+ disk=${slice%s*}
+ slice=${slice##*s}
+ if [[ $WRAPPER == *"smi"* && $disk == ${saved_disk} ]]; then
+ cyl=$(get_endslice $disk ${saved_slice})
+ log_must set_partition $slice "$cyl" $FS_SIZE $disk
+ else
+ log_must set_partition $slice "" $FS_SIZE $disk
+ fi
+ saved_disk=$disk
+ saved_slice=$slice
+done
+
+log_note "Make a ufs filesystem on source $rawdisk1"
+$ECHO "y" | $NEWFS -v $rawdisk1 > /dev/null 2>&1
+(($? != 0)) && log_untested "Unable to create ufs filesystem on $rawdisk1"
+
+log_must $MKDIR -p $UFSMP
+
+log_note "mount source $disk1 on $UFSMP"
+log_must $MOUNT $disk1 $UFSMP
+
+log_note "Now create some directories and files to be ufsdump'ed"
+while (($dirnum <= 2)); do
+ log_must $MKDIR $bigdir${dirnum}
+ while (( $filenum <= 2 )); do
+ $FILE_WRITE -o create -f $bigdir${dirnum}/file${filenum} \
+ -b $BLOCK_SIZE -c $BLOCK_COUNT
+ if [[ $? -ne 0 ]]; then
+ if [[ $dirnum -lt 3 ]]; then
+ log_fail "$FILE_WRITE only wrote" \
+ "<(( $dirnum * 3 + $filenum ))>" \
+ "files, this is not enough"
+ fi
+ fi
+ ((filenum = filenum + 1))
+ done
+ filenum=0
+ ((dirnum = dirnum + 1))
+done
+
+log_must $UMOUNT $UFSMP
+
+log_note "Start ufsdump in the background"
+log_note "$UFSDUMP 0bf 512 $rawdisk0 $disk1"
+$UFSDUMP 0bf 512 $rawdisk0 $disk1 &
+PIDUFSDUMP=$!
+
+log_note "Attempt to zpool the source device in use by ufsdump"
+log_mustnot $ZPOOL create $TESTPOOL1 "$disk1"
+log_mustnot poolexists $TESTPOOL1
+
+log_note "Attempt to take the source device in use by ufsdump as spare device"
+log_mustnot $ZPOOL create $TESTPOOL1 "$FS_SIDE2" spare "$disk1"
+log_mustnot poolexists $TESTPOOL1
+
+wait $PIDUFSDUMP
+typeset -i retval=$?
+(($retval != 0)) && log_fail "$UFSDUMP failed with error code $ret_val"
+
+log_must $MOUNT $disk1 $UFSMP
+
+log_must $RM -rf $UFSMP/*
+log_must $MKDIR $restored_files
+
+cwd=$PWD
+log_must cd $restored_files
+log_note "Start ufsrestore in the background from the target device"
+log_note "$UFSRESTORE rbf 512 $rawdisk0"
+$UFSRESTORE rbf 512 $rawdisk0 &
+PIDUFSRESTORE=$!
+log_must cd $cwd
+
+log_note "Attempt to zpool the restored device in use by ufsrestore"
+log_mustnot $ZPOOL create -f $TESTPOOL2 "$disk1"
+log_mustnot poolexists $TESTPOOL2
+
+log_note "Attempt to take the restored device in use by ufsrestore as spare" \
+ "device"
+log_mustnot $ZPOOL create -f $TESTPOOL2 "$FS_SIDE2" spare "$disk1"
+log_mustnot poolexists $TESTPOOL2
+
+log_pass "Unable to zpool over a device in use by ufsdump or ufsrestore"
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_004_pos.ksh
new file mode 100644
index 0000000000..9755c11be9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_004_pos.ksh
@@ -0,0 +1,94 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# format will disallow modification of a mounted zfs disk partition or a spare
+# device
+#
+# STRATEGY:
+# 1. Create a ZFS filesystem
+# 2. Add a spare device to the ZFS pool
+# 3. Attempt to format the disk and the spare device.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ #
+ # Essentailly this is the default_cleanup rountine but I cannot get it
+ # to work correctly. So its reproduced below. Still need to full
+ # understand why default_cleanup does not work correctly from here.
+ #
+ log_must $ZFS umount $TESTPOOL/$TESTFS
+
+ $RM -rf $TESTDIR || \
+ log_unresolved Could not remove $TESTDIR
+
+ log_must $ZFS destroy $TESTPOOL/$TESTFS
+ destroy_pool $TESTPOOL
+}
+#
+# Currently, if a ZFS disk gets formatted things go horribly wrong, hence the
+# mini_format function. If the modify option is reached, then we know format
+# would happily continue - best to not go further.
+#
+function mini_format
+{
+ typeset disk=$1
+
+ typeset format_file=/var/tmp/format_in.$$.1
+ $ECHO "partition" > $format_file
+ $ECHO "modify" >> $format_file
+
+ $FORMAT -e -s -d $disk -f $format_file
+ typeset -i retval=$?
+ $RM -rf $format_file
+ return $retval
+}
+
+log_assert "format will disallow modification of a mounted zfs disk partition"\
+ " or a spare device"
+
+log_onexit cleanup
+log_must default_setup_noexit $FS_DISK0
+log_must $ZPOOL add $TESTPOOL spare $FS_DISK1
+
+log_note "Attempt to format a ZFS disk"
+log_mustnot mini_format $FS_DISK0
+log_note "Attempt to format a ZFS spare device"
+log_mustnot mini_format $FS_DISK1
+
+log_pass "Unable to format a disk in use by ZFS"
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_005_pos.ksh
new file mode 100644
index 0000000000..8800b20564
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_005_pos.ksh
@@ -0,0 +1,122 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# newfs will not interfere with devices and spare devices that are in use
+# by active pool.
+#
+# STRATEGY:
+# 1. Create a regular|mirror|raidz|raidz2 pool with the given disk
+# 2. Try to newfs against the disk, verify it fails as expect.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+
+ #
+ # Tidy up the disks we used.
+ #
+ cleanup_devices $vdisks $sdisks
+}
+
+function verify_assertion #slices
+{
+ typeset targets=$1
+
+ for t in $targets; do
+ $ECHO "y" | $NEWFS -v $t > /dev/null 2>&1
+ (( $? !=0 )) || \
+ log_fail "newfs over active pool " \
+ "unexpected return code of 0"
+ done
+
+ return 0
+}
+
+log_assert "Verify newfs over active pool fails."
+
+log_onexit cleanup
+
+set -A vdevs "" "mirror" "raidz" "raidz1" "raidz2"
+
+typeset -i i=0
+
+while (( i < ${#vdevs[*]} )); do
+
+ for num in 0 1 2 3 ; do
+ eval typeset slice=\${FS_SIDE$num}
+ disk=${slice%s*}
+ slice=${slice##*s}
+ if [[ $WRAPPER == *"smi"* && \
+ $disk == ${saved_disk} ]]; then
+ cyl=$(get_endslice $disk ${saved_slice})
+ log_must set_partition $slice "$cyl" $FS_SIZE $disk
+ else
+ log_must set_partition $slice "" $FS_SIZE $disk
+ fi
+ saved_disk=$disk
+ saved_slice=$slice
+ done
+
+ if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vslices spare $sslices
+ verify_assertion "$rawtargets"
+ destroy_pool $TESTPOOL1
+
+ if [[ ( $FS_DISK0 == $FS_DISK2 ) && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ if [[ ( $FS_DISK0 == $FS_DISK3 ) && ( ${vdevs[i]} == "raidz2" ) ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vdisks spare $sdisks
+ verify_assertion "$rawtargets"
+ destroy_pool $TESTPOOL1
+
+ (( i = i + 1 ))
+done
+
+log_pass "Newfs over active pool fails."
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_006_pos.ksh
new file mode 100644
index 0000000000..7558ba8b94
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_006_pos.ksh
@@ -0,0 +1,125 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# dumpadm will not interfere with devices and spare devices that are in use
+# by active pool.
+#
+# STRATEGY:
+# 1. Create a regular|mirror|raidz|raidz2 pool with the given disk
+# 2. Try to dumpadm against the disk, verify it fails as expect.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ if [[ -n $PREVDUMPDEV ]]; then
+ log_must $DUMPADM -u -d $PREVDUMPDEV
+ fi
+
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+
+ #
+ # Tidy up the disks we used.
+ #
+ cleanup_devices $vdisks $sdisks
+}
+
+function verify_assertion #slices
+{
+ typeset targets=$1
+
+ for t in $targets; do
+ log_mustnot $DUMPADM -d $t
+ done
+
+ return 0
+}
+
+log_assert "Verify dumpadm over active pool fails."
+
+log_onexit cleanup
+
+set -A vdevs "" "mirror" "raidz" "raidz1" "raidz2"
+
+typeset -i i=0
+
+PREVDUMPDEV=`$DUMPADM | $GREP "Dump device" | $AWK '{print $3}'`
+
+while (( i < ${#vdevs[*]} )); do
+
+ for num in 0 1 2 3 ; do
+ eval typeset slice=\${FS_SIDE$num}
+ disk=${slice%s*}
+ slice=${slice##*s}
+ if [[ $WRAPPER == *"smi"* && \
+ $disk == ${saved_disk} ]]; then
+ cyl=$(get_endslice $disk ${saved_slice})
+ log_must set_partition $slice "$cyl" $FS_SIZE $disk
+ else
+ log_must set_partition $slice "" $FS_SIZE $disk
+ fi
+ saved_disk=$disk
+ saved_slice=$slice
+ done
+
+ if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vslices spare $sslices
+ verify_assertion "$disktargets"
+ destroy_pool $TESTPOOL1
+
+ if [[ ( $FS_DISK0 == $FS_DISK2 ) && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ if [[ ( $FS_DISK0 == $FS_DISK3 ) && ( ${vdevs[i]} == "raidz2" ) ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vdisks spare $sdisks
+ verify_assertion "$disktargets"
+ destroy_pool $TESTPOOL1
+
+ (( i = i + 1 ))
+done
+
+log_pass "Dumpadm over active pool fails."
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_007_pos.ksh
new file mode 100644
index 0000000000..811d993fa0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_007_pos.ksh
@@ -0,0 +1,134 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# dumpadm will interfere with devices and spare devices that are in use
+# by exported pool.
+#
+# STRATEGY:
+# 1. Create a regular|mirror|raidz|raidz2 pool with the given disk
+# 2. Export the pool
+# 3. Try to dumpadm against the disk, verify it succeeds as expect.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ if [[ -n $PREVDUMPDEV ]]; then
+ log_must $DUMPADM -u -d $PREVDUMPDEV
+ fi
+
+ poolexists $TESTPOOL1 || $ZPOOL import $TESTPOOL1 >/dev/null 2>&1
+
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+
+ #
+ # Tidy up the disks we used.
+ #
+ cleanup_devices $vdisks $sdisks
+}
+
+function verify_assertion #slices
+{
+ typeset targets=$1
+
+ for t in $targets; do
+ log_must $DUMPADM -u -d $t
+
+ log_must $DUMPADM -u -d $PREVDUMPDEV
+ done
+
+ return 0
+}
+
+log_assert "Verify dumpadm over exported pool succeed."
+
+log_onexit cleanup
+
+set -A vdevs "" "mirror" "raidz" "raidz1" "raidz2"
+
+typeset -i i=0
+
+PREVDUMPDEV=`$DUMPADM | $GREP "Dump device" | $AWK '{print $3}'`
+
+while (( i < ${#vdevs[*]} )); do
+
+ for num in 0 1 2 3 ; do
+ eval typeset slice=\${FS_SIDE$num}
+ disk=${slice%s*}
+ slice=${slice##*s}
+ if [[ $WRAPPER == *"smi"* && \
+ $disk == ${saved_disk} ]]; then
+ cyl=$(get_endslice $disk ${saved_slice})
+ log_must set_partition $slice "$cyl" $FS_SIZE $disk
+ else
+ log_must set_partition $slice "" $FS_SIZE $disk
+ fi
+ saved_disk=$disk
+ saved_slice=$slice
+ done
+
+ if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vslices spare $sslices
+ log_must $ZPOOL export $TESTPOOL1
+ verify_assertion "$disktargets"
+ log_must $ZPOOL import $TESTPOOL1
+ destroy_pool $TESTPOOL1
+
+ if [[ ( $FS_DISK0 == $FS_DISK2 ) && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ if [[ ( $FS_DISK0 == $FS_DISK3 ) && ( ${vdevs[i]} == "raidz2" ) ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vdisks spare $sdisks
+ log_must $ZPOOL export $TESTPOOL1
+ verify_assertion "$disktargets"
+ log_must $ZPOOL import $TESTPOOL1
+ destroy_pool $TESTPOOL1
+
+ (( i = i + 1 ))
+done
+
+log_pass "Dumpadm over exported pool succeed."
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_008_pos.ksh
new file mode 100644
index 0000000000..16b73968a3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_008_pos.ksh
@@ -0,0 +1,111 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# Newfs will interfere with devices and spare devices that are in use
+# by exported pool.
+#
+# STRATEGY:
+# 1. Create a regular|mirror|raidz|raidz2 pool with the given disk
+# 2. Export the pool
+# 3. Try to newfs against the disk, verify it succeeds as expect.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ poolexists $TESTPOOL1 || $ZPOOL import $TESTPOOL1 >/dev/null 2>&1
+
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+
+ #
+ # Tidy up the disks we used.
+ #
+ cleanup_devices $vdisks $sdisks
+}
+
+function verify_assertion #slices
+{
+ typeset targets=$1
+
+ for t in $targets; do
+ $ECHO "y" | $NEWFS -v $t > /dev/null 2>&1
+ (( $? !=0 )) && \
+ log_fail "newfs over exported pool " \
+ "failes unexpected."
+ done
+
+ return 0
+}
+
+log_assert "Verify newfs over exported pool succeed."
+
+log_onexit cleanup
+
+set -A vdevs "" "mirror" "raidz" "raidz1" "raidz2"
+
+typeset -i i=0
+
+for num in 0 1 2 3 ; do
+ eval typeset slice=\${FS_SIDE$num}
+ disk=${slice%s*}
+ slice=${slice##*s}
+ if [[ $WRAPPER == *"smi"* && \
+ $disk == ${saved_disk} ]]; then
+ cyl=$(get_endslice $disk ${saved_slice})
+ log_must set_partition $slice "$cyl" $FS_SIZE $disk
+ else
+ log_must set_partition $slice "" $FS_SIZE $disk
+ fi
+ saved_disk=$disk
+ saved_slice=$slice
+done
+
+while (( i < ${#vdevs[*]} )); do
+ if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vslices spare $sslices
+ log_must $ZPOOL export $TESTPOOL1
+ verify_assertion "$rawtargets"
+ cleanup_devices $vslices $sslices
+
+ (( i = i + 1 ))
+done
+
+log_pass "Newfs over exported pool succeed."
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/inuse_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_009_pos.ksh
new file mode 100644
index 0000000000..3391dcc579
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/inuse_009_pos.ksh
@@ -0,0 +1,122 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/inuse/inuse.cfg
+
+#
+# DESCRIPTION:
+# format command will interfere with devices and spare devices that are in use
+# by exported pool.
+#
+# STRATEGY:
+# 1. Create a regular|mirror|raidz|raidz2 pool with the given disk
+# 2. Export the pool
+# 3. Try to format against the disk, verify it succeeds as expect.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ poolexists $TESTPOOL1 || $ZPOOL import $TESTPOOL1 >/dev/null 2>&1
+
+ poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
+
+ #
+ # Tidy up the disks we used.
+ #
+ cleanup_devices $vdisks $sdisks
+}
+
+function verify_assertion #disks
+{
+ typeset targets=$1
+
+ for t in $targets; do
+ log_must set_partition 0 "" 0mb $t
+ done
+
+ return 0
+}
+
+log_assert "Verify format over exported pool succeed."
+
+log_onexit cleanup
+
+set -A vdevs "" "mirror" "raidz" "raidz1" "raidz2"
+
+typeset -i i=0
+
+while (( i < ${#vdevs[*]} )); do
+
+ for num in 0 1 2 3 ; do
+ eval typeset slice=\${FS_SIDE$num}
+ disk=${slice%s*}
+ slice=${slice##*s}
+ if [[ $WRAPPER == *"smi"* && \
+ $disk == ${saved_disk} ]]; then
+ cyl=$(get_endslice $disk ${saved_slice})
+ log_must set_partition $slice "$cyl" $FS_SIZE $disk
+ else
+ log_must set_partition $slice "" $FS_SIZE $disk
+ fi
+ saved_disk=$disk
+ saved_slice=$slice
+ done
+
+ if [[ -n $SINGLE_DISK && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vslices spare $sslices
+ log_must $ZPOOL export $TESTPOOL1
+ verify_assertion "$vdisks $sdisks"
+
+ if [[ ( $FS_DISK0 == $FS_DISK2 ) && -n ${vdevs[i]} ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ if [[ ( $FS_DISK0 == $FS_DISK3 ) && ( ${vdevs[i]} == "raidz2" ) ]]; then
+ (( i = i + 1 ))
+ continue
+ fi
+
+ create_pool $TESTPOOL1 ${vdevs[i]} $vdisks spare $sdisks
+ log_must $ZPOOL export $TESTPOOL1
+ verify_assertion "$vdisks $sdisks"
+
+ (( i = i + 1 ))
+done
+
+log_pass "Format over exported pool succeed."
diff --git a/usr/src/test/zfs-tests/tests/functional/inuse/setup.ksh b/usr/src/test/zfs-tests/tests/functional/inuse/setup.ksh
new file mode 100644
index 0000000000..a16ce0091e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/inuse/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/large_files/Makefile b/usr/src/test/zfs-tests/tests/functional/large_files/Makefile
new file mode 100644
index 0000000000..8ea1c29831
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/large_files/Makefile
@@ -0,0 +1,41 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/large_files
+
+PROGS = cleanup \
+ large_files_001_pos \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/large_files/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/large_files/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/large_files/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/large_files/large_files_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/large_files/large_files_001_pos.ksh
new file mode 100644
index 0000000000..4591735eb6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/large_files/large_files_001_pos.ksh
@@ -0,0 +1,53 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+log_assert "Write a file to the allowable ZFS fs size."
+
+log_note "Invoke 'largest_file' with $TESTDIR/bigfile"
+log_must $LARGEST_FILE $TESTDIR/bigfile
+
+log_pass "Successfully created a file to the maximum allowable size."
diff --git a/usr/src/test/zfs-tests/tests/functional/large_files/setup.ksh b/usr/src/test/zfs-tests/tests/functional/large_files/setup.ksh
new file mode 100644
index 0000000000..1c51a64aa6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/large_files/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+disk=${DISKS%% *}
+
+default_setup $disk
diff --git a/usr/src/test/zfs-tests/tests/functional/largest_pool/Makefile b/usr/src/test/zfs-tests/tests/functional/largest_pool/Makefile
new file mode 100644
index 0000000000..1ce503fc1f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/largest_pool/Makefile
@@ -0,0 +1,41 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/largest_pool
+
+PROGS = largest_pool_001_pos
+
+FILES = largest_pool.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/largest_pool/largest_pool.cfg b/usr/src/test/zfs-tests/tests/functional/largest_pool/largest_pool.cfg
new file mode 100644
index 0000000000..a6bb254038
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/largest_pool/largest_pool.cfg
@@ -0,0 +1,43 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export TESTVOL=testvol$$
+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/usr/src/test/zfs-tests/tests/functional/largest_pool/largest_pool_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/largest_pool/largest_pool_001_pos.ksh
new file mode 100644
index 0000000000..8ca4d9dd7b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/largest_pool/largest_pool_001_pos.ksh
@@ -0,0 +1,160 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/largest_pool/largest_pool.cfg
+
+# 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.
+
+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 > /tmp/j.$$"
+ log_must eval "$GREP $TESTPOOL /tmp/j.$$ | \
+ $AWK '{print $2}' | $GREP $CHKUNIT"
+
+ log_note "Detect the file system in this test machine."
+ log_must eval "$DF -F zfs -h > /tmp/j.$$"
+ log_must eval "$GREP $TESTPOOL /tmp/j.$$ | \
+ $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 /tmp/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/usr/src/test/zfs-tests/tests/functional/link_count/Makefile b/usr/src/test/zfs-tests/tests/functional/link_count/Makefile
new file mode 100644
index 0000000000..57d1b058f9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/link_count/Makefile
@@ -0,0 +1,41 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/link_count
+
+PROGS = cleanup \
+ link_count_001 \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/link_count/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/link_count/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/link_count/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/link_count/link_count_001.ksh b/usr/src/test/zfs-tests/tests/functional/link_count/link_count_001.ksh
new file mode 100644
index 0000000000..53e89ae3f0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/link_count/link_count_001.ksh
@@ -0,0 +1,89 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Verify file link count is zero on zfs"
+
+export ITERS=10
+export NUMFILES=10000
+
+# Detect and make sure this test must be executed on a multi-process system
+is_mp || log_fail "This test requires a multi-processor system."
+
+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$$ > /dev/null 2>&1 &
+PID=$!
+log_note "$RM_LNKCNT_ZERO_FILE ${TESTDIR}/tmp/test$$ 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 -TERM $PID
+ log_fail "file link count is zero"
+fi
+
+log_must $KILL -TERM $PID
+log_must $RM -f ${TESTDIR}/tmp/test$$*
+
+log_pass "Verify file link count is zero on zfs"
diff --git a/usr/src/test/zfs-tests/tests/functional/link_count/setup.ksh b/usr/src/test/zfs-tests/tests/functional/link_count/setup.ksh
new file mode 100644
index 0000000000..9c2fb74ed4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/link_count/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/mdb/Makefile b/usr/src/test/zfs-tests/tests/functional/mdb/Makefile
new file mode 100644
index 0000000000..21bd192153
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mdb/Makefile
@@ -0,0 +1,42 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/mdb
+
+PROGS = cleanup \
+ mdb_001_pos \
+ setup
+
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/mdb/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/mdb/cleanup.ksh
new file mode 100644
index 0000000000..8774eaef21
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mdb/cleanup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/mdb/mdb_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/mdb/mdb_001_pos.ksh
new file mode 100644
index 0000000000..03389c614d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mdb/mdb_001_pos.ksh
@@ -0,0 +1,105 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# Verify that the ZFS mdb dcmds and walkers are working as expected.
+#
+# STRATEGY:
+# 1) Given a list of dcmds and walkers
+# 2) Step through each element of the list
+# 3) Verify the output by checking for "mdb:" in the output string
+#
+
+function cleanup
+{
+ $RM -f $OUTFILE
+}
+
+verify_runnable "global"
+log_onexit cleanup
+
+OUTFILE='/var/tmp/mdb-outfile'
+set -A dcmds "::walk spa" \
+ "::walk spa | ::spa " \
+ "::walk spa | ::spa -c" \
+ "::walk spa | ::spa -v" \
+ "::walk spa | ::spa_config" \
+ "::walk spa | ::spa_space" \
+ "::walk spa | ::spa_space -b" \
+ "::walk spa | ::spa_vdevs" \
+ "::walk spa | ::walk metaslab" \
+ "::walk spa | ::print struct spa spa_root_vdev | ::vdev" \
+ "::walk spa | ::print struct spa spa_root_vdev | ::vdev -re" \
+ "::dbufs" \
+ "::dbufs -n mos -o mdn -l 0 -b 0" \
+ "::dbufs | ::dbuf" \
+ "::dbuf_stats" \
+ "::abuf_find 1 2" \
+ "::walk spa | ::print -a struct spa spa_uberblock.ub_rootbp | ::blkptr" \
+ "::walk spa | ::print -a struct spa spa_dsl_pool->dp_dirty_datasets | ::walk txg_list" \
+ "::walk spa | ::walk zms_freelist"
+#
+# The commands above were supplied by the ZFS development team. The idea is to
+# do as much checking as possible without the need to hardcode addresses.
+#
+
+log_assert "Verify that the ZFS mdb dcmds and walkers are working as expected."
+
+typeset -i RET=0
+
+i=0
+while (( $i < ${#dcmds[*]} )); do
+ log_note "Verifying: '${dcmds[i]}'"
+ $ECHO "${dcmds[i]}" | $MDB -k > $OUTFILE 2>&1
+ RET=$?
+ if (( $RET != 0 )); then
+ log_fail "mdb '${dcmds[i]}' returned error $RET"
+ fi
+
+ #
+ # mdb prefixes all errors with "mdb: " so we check the output.
+ #
+ $GREP "mdb:" $OUTFILE > /dev/null 2>&1
+ RET=$?
+ if (( $RET == 0 )); then
+ $ECHO "mdb '${dcmds[i]}' contained 'mdb:'"
+ # Using $TAIL limits the number of lines in the log
+ $TAIL -100 $OUTFILE
+ log_fail "mdb walker or dcmd failed"
+ fi
+
+ ((i = i + 1))
+done
+
+log_pass "The ZFS mdb dcmds and walkers are working as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/mdb/setup.ksh b/usr/src/test/zfs-tests/tests/functional/mdb/setup.ksh
new file mode 100644
index 0000000000..c105645af0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mdb/setup.ksh
@@ -0,0 +1,38 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+DISK=${DISKS%% *}
+
+default_setup "$DISK"
diff --git a/usr/src/test/zfs-tests/tests/functional/migration/Makefile b/usr/src/test/zfs-tests/tests/functional/migration/Makefile
new file mode 100644
index 0000000000..336db3d83e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/Makefile
@@ -0,0 +1,55 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/migration
+
+PROGS = cleanup \
+ migration_001_pos \
+ migration_002_pos \
+ migration_003_pos \
+ migration_004_pos \
+ migration_005_pos \
+ migration_006_pos \
+ migration_007_pos \
+ migration_008_pos \
+ migration_009_pos \
+ migration_010_pos \
+ migration_011_pos \
+ migration_012_pos \
+ setup
+
+FILES = migration.cfg \
+ migration.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/migration/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/migration/cleanup.ksh
new file mode 100644
index 0000000000..7cb7999c6b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/cleanup.ksh
@@ -0,0 +1,58 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.cfg
+
+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/usr/src/test/zfs-tests/tests/functional/migration/migration.cfg b/usr/src/test/zfs-tests/tests/functional/migration/migration.cfg
new file mode 100644
index 0000000000..c8df90edc6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration.cfg
@@ -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
+#
+
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+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
+ ZFS_DISK=${disk_array[0]}
+ SINGLE_DISK=$ZFS_DISK
+ NONZFS_DISK=$ZFS_DISK
+ ZFSSIDE_DISK=${SINGLE_DISK}s0
+ NONZFSSIDE_DISK=${SINGLE_DISK}s1
+ ;;
+*)
+ # 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}s0
+ NONZFSSIDE_DISK=${NONZFS_DISK}s0
+ ;;
+esac
+
+export DISK_COUNT ZFS_DISK NONZFS_DISK SINGLE_DISK ZFSSIDE_DISK NONZFSSIDE_DISK
+
+export TESTFILE=/etc/passwd
+export NONZFS_TESTDIR=$TESTDIR/nonzfstestdir
+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/usr/src/test/zfs-tests/tests/functional/migration/migration.kshlib b/usr/src/test/zfs-tests/tests/functional/migration/migration.kshlib
new file mode 100644
index 0000000000..e0799afd1b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration.kshlib
@@ -0,0 +1,153 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/migration/migration.cfg
+
+#
+# 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$$.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$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_001_pos.ksh
new file mode 100644
index 0000000000..f6d6119077
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_001_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/tar$$.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$$.tar $BNAME"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $TESTDIR $SUMA $SUMB "$TAR xf $TESTDIR/tar$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_002_pos.ksh
new file mode 100644
index 0000000000..3c48039eb8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_002_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/tar$$.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$$.tar $BNAME"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $NONZFS_TESTDIR $SUMA $SUMB "$TAR xf $TESTDIR/tar$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_003_pos.ksh
new file mode 100644
index 0000000000..8385a31cf4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_003_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $NONZFS_TESTDIR/tar$$.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$$.tar $BNAME"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $TESTDIR $SUMA $SUMB "$TAR xvf $NONZFS_TESTDIR/tar$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_004_pos.ksh
new file mode 100644
index 0000000000..3e74d6fc60
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_004_pos.ksh
@@ -0,0 +1,73 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/cpio$$.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$$.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$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_005_pos.ksh
new file mode 100644
index 0000000000..c2c8995241
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_005_pos.ksh
@@ -0,0 +1,73 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/cpio$$.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$$.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$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_006_pos.ksh
new file mode 100644
index 0000000000..99a6b979eb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_006_pos.ksh
@@ -0,0 +1,73 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $NONZFS_TESTDIR/cpio$$.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$$.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$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_007_pos.ksh
new file mode 100644
index 0000000000..71b556cbd0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_007_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/dd$$.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$$.dd"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $TESTDIR $SUMA $SUMB "$DD if=$TESTDIR/dd$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_008_pos.ksh
new file mode 100644
index 0000000000..2eeb882782
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_008_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/dd$$.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$$.dd"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $NONZFS_TESTDIR $SUMA $SUMB "$DD if=$TESTDIR/dd$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_009_pos.ksh
new file mode 100644
index 0000000000..84f2e6dbb9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_009_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/dd$$.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$$.dd"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $TESTDIR $SUMA $SUMB "$DD if=$NONZFS_TESTDIR/dd$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_010_pos.ksh
new file mode 100644
index 0000000000..bafa06600d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_010_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/cp$$.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$$.cp"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $TESTDIR $SUMA $SUMB "$CP $TESTDIR/cp$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_011_pos.ksh
new file mode 100644
index 0000000000..63c7461402
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_011_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $NONZFS_TESTDIR/cp$$.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$$.cp"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $NONZFS_TESTDIR $SUMA $SUMB "$CP $TESTDIR/cp$$.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/usr/src/test/zfs-tests/tests/functional/migration/migration_012_pos.ksh b/usr/src/test/zfs-tests/tests/functional/migration/migration_012_pos.ksh
new file mode 100644
index 0000000000..ca37d6c6d1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/migration_012_pos.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/cp$$.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$$.cp"
+(( $? != 0 )) && log_fail "Unable to create src archive"
+
+migrate $TESTDIR $SUMA $SUMB "$CP $NONZFS_TESTDIR/cp$$.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/usr/src/test/zfs-tests/tests/functional/migration/setup.ksh b/usr/src/test/zfs-tests/tests/functional/migration/setup.ksh
new file mode 100644
index 0000000000..86b9a371ce
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/migration/setup.ksh
@@ -0,0 +1,69 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/migration/migration.cfg
+
+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
+
+set_partition ${ZFSSIDE_DISK##*s} "" $FS_SIZE $ZFS_DISK
+set_partition ${NONZFSSIDE_DISK##*s} "" $FS_SIZE $NONZFS_DISK
+
+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
+
+$ECHO "y" | $NEWFS -v /dev/rdsk/$NONZFSSIDE_DISK
+(( $? != 0 )) &&
+ log_untested "Unable to setup a UFS file system"
+
+log_must $MOUNT /dev/dsk/$NONZFSSIDE_DISK $NONZFS_TESTDIR
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/mmap/Makefile b/usr/src/test/zfs-tests/tests/functional/mmap/Makefile
new file mode 100644
index 0000000000..56fb19ec82
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mmap/Makefile
@@ -0,0 +1,42 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/mmap
+
+PROGS = cleanup \
+ mmap_read_001_pos \
+ mmap_write_001_pos \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/mmap/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/mmap/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mmap/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/mmap/mmap_read_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/mmap/mmap_read_001_pos.ksh
new file mode 100644
index 0000000000..0b3ddb6626
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mmap/mmap_read_001_pos.ksh
@@ -0,0 +1,56 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+log_assert "read()s from mmap()'ed file contain correct data."
+
+log_must $CHMOD 777 $TESTDIR
+log_must $READMMAP $TESTDIR/test-read-file
+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/usr/src/test/zfs-tests/tests/functional/mmap/mmap_write_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/mmap/mmap_write_001_pos.ksh
new file mode 100644
index 0000000000..6bede53bf7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mmap/mmap_write_001_pos.ksh
@@ -0,0 +1,62 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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 30s and make sure the test file existed.
+#
+
+verify_runnable "both"
+
+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
+is_mp || log_fail "This test requires a multi-processor system."
+
+log_must $CHMOD 777 $TESTDIR
+$MMAPWRITE $TESTDIR/test-write-file &
+PID_MMAPWRITE=$!
+log_note "$MMAPWRITE $TESTDIR/test-write-file pid: $PID_MMAPWRITE"
+log_must $SLEEP 30
+
+log_must $KILL -9 $PID_MMAPWRITE
+log_must $LS -l $TESTDIR/test-write-file
+
+log_pass "write(2) a mmap(2)'ing file succeeded."
diff --git a/usr/src/test/zfs-tests/tests/functional/mmap/setup.ksh b/usr/src/test/zfs-tests/tests/functional/mmap/setup.ksh
new file mode 100644
index 0000000000..9c2fb74ed4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mmap/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/mount/Makefile b/usr/src/test/zfs-tests/tests/functional/mount/Makefile
new file mode 100644
index 0000000000..b86d1198dc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mount/Makefile
@@ -0,0 +1,42 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/mount
+
+PROGS = cleanup \
+ umount_001 \
+ umountall_001 \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/mount/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/mount/cleanup.ksh
new file mode 100644
index 0000000000..e02840ddcb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mount/cleanup.ksh
@@ -0,0 +1,38 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+log_must destroy_pool $TESTPOOL
+
+for dir in $TESTDIRS; do
+ $RM -rf $dir
+done
diff --git a/usr/src/test/zfs-tests/tests/functional/mount/setup.ksh b/usr/src/test/zfs-tests/tests/functional/mount/setup.ksh
new file mode 100644
index 0000000000..50b93fd35c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mount/setup.ksh
@@ -0,0 +1,48 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+create_pool $TESTPOOL "$DISK"
+
+for i in 1 2 3; do
+ dir=$TESTDIR.$i
+ fs=$TESTPOOL/$TESTFS.$i
+
+ log_must $ZFS create $fs
+ log_must $MKDIR -p $dir
+ log_must $ZFS set mountpoint=$dir $fs
+
+ log_must mounted $fs
+done
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/mount/umount_001.ksh b/usr/src/test/zfs-tests/tests/functional/mount/umount_001.ksh
new file mode 100644
index 0000000000..ad3c3346f8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mount/umount_001.ksh
@@ -0,0 +1,54 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+for fs in 1 2 3; do
+ log_must mounted $TESTDIR.$fs
+ log_must $ZFS umount $TESTPOOL/$TESTFS.$fs
+ log_must unmounted $TESTDIR.$fs
+ log_must $ZFS mount $TESTPOOL/$TESTFS.$fs
+ log_must mounted $TESTDIR.$fs
+done
+
+log_pass "All file systems are unmounted"
diff --git a/usr/src/test/zfs-tests/tests/functional/mount/umountall_001.ksh b/usr/src/test/zfs-tests/tests/functional/mount/umountall_001.ksh
new file mode 100644
index 0000000000..1495b5cece
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mount/umountall_001.ksh
@@ -0,0 +1,59 @@
+#!/usr/bin/ksh -p
+
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# There are myriad problems associated with trying to test umountall in a way
+# that works reliable across different systems. Some filesystems won't unmount
+# because they're busy. Some won't remount because they were legacy mounts in
+# the first place. etc...
+# Make a best approximation by calling umountall with the -n option, and verify
+# that the list of things it would try to unmout makes sense.
+#
+# STRATEGY:
+# 1. Make a list of file systems umountall is known to ignore.
+# 2. Append all ZFS file systems on this system.
+# 3. Run umountall -n and verify the file systems it reports are in the list.
+#
+
+log_must $ZFS mount -a
+for fs in 1 2 3 ; do
+ log_must mounted $TESTPOOL/$TESTFS.$fs
+done
+
+# This is the list we check the output of umountall -n against. We seed it
+# with these values because umountall will ignore them, and they're possible
+# (though most are improbable) ZFS filesystem mountpoints.
+zfs_list="/ /lib /sbin /tmp /usr /var /var/adm /var/run"
+
+# Append our ZFS filesystems to the list, not worrying about duplicates.
+for fs in $($MOUNT -p | $AWK '{if ($4 == "zfs") print $3}'); do
+ zfs_list="$zfs_list $fs"
+done
+
+fs=''
+for fs in $($UMOUNTALL -n -F zfs 2>&1 | $AWK '{print $2}'); do
+ for i in $zfs_list; do
+ [[ $fs = $i ]] && continue 2
+ done
+ log_fail "umountall -n -F zfs tried to unmount $fs"
+done
+[[ -n $fs ]] || log_fail "umountall -n -F zfs produced no output"
+
+log_pass "All ZFS file systems would have been unmounted"
diff --git a/usr/src/test/zfs-tests/tests/functional/mv_files/Makefile b/usr/src/test/zfs-tests/tests/functional/mv_files/Makefile
new file mode 100644
index 0000000000..70253f66ee
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mv_files/Makefile
@@ -0,0 +1,45 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/mv_files
+
+PROGS = cleanup \
+ mv_files_001_pos \
+ mv_files_002_pos \
+ setup
+
+FILES = mv_files.cfg \
+ mv_files_common.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/mv_files/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/mv_files/cleanup.ksh
new file mode 100644
index 0000000000..971cf8f08b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mv_files/cleanup.ksh
@@ -0,0 +1,48 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/mv_files/mv_files_common.kshlib
+
+verify_runnable "global"
+
+[[ -f /var/tmp/exitsZero.ksh ]] && \
+ log_must $RM -f /var/tmp/exitsZero.ksh
+[[ -f /var/tmp/testbackgprocs.ksh ]] && \
+ log_must $RM -f /var/tmp/testbackgprocs.ksh
+
+ismounted $TESTPOOL/$TESTFS_TGT
+(( $? == 0 )) && log_must $ZFS umount $TESTPOOL/$TESTFS_TGT
+log_must $ZFS destroy $TESTPOOL/$TESTFS_TGT
+
+[[ -d $TESTDIR_TGT ]] && log_must $RM -rf $TESTDIR_TGT
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files.cfg b/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files.cfg
new file mode 100644
index 0000000000..6c81862377
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files.cfg
@@ -0,0 +1,43 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export DISK=${DISKS%% *}
+
+export TESTFILE=testfile
+
+export TESTDIR_TGT=${TEST_BASE_DIR%%/}/testdir_tgt
+export TESTFS_TGT=testzfs_tgt
+export OLDDIR=$TESTDIR/olddir
+export NEWDIR_IN_FS=$TESTDIR/newdir
+export NEWDIR_ACROSS_FS=$TESTDIR_TGT/newdir
+
+export MVNUMFILES=2000 # <number of files to start>
+export MVNUMINCR=1000 # <number of files to be increased to>
+export GANGPIDS=50 # <number of limit for parallel background running process>
diff --git a/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_001_pos.ksh
new file mode 100644
index 0000000000..834ee3b6bb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_001_pos.ksh
@@ -0,0 +1,69 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/mv_files/mv_files_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_002_pos.ksh
new file mode 100644
index 0000000000..f80447f359
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_002_pos.ksh
@@ -0,0 +1,71 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/mv_files/mv_files_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_common.kshlib b/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_common.kshlib
new file mode 100644
index 0000000000..b3c7e28201
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mv_files/mv_files_common.kshlib
@@ -0,0 +1,217 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/mv_files/mv_files.cfg
+
+#
+# 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/bin/ksh" > /var/tmp/exitsZero.ksh
+$ECHO "exit 0" >> /var/tmp/exitsZero.ksh
+$CHMOD 777 /var/tmp/exitsZero.ksh
+
+$CAT <<EOF > /var/tmp/testbackgprocs.ksh
+#!/usr/bin/ksh
+#
+# exitsZero.ksh is a one line script
+# that exit with status of "0"
+#
+
+PIDS=""
+typeset -i i=1
+while [ \$i -le 50 ]
+do
+ /var/tmp/exitsZero.ksh &
+ PIDS="\$PIDS \$!"
+ (( i = i + 1 ))
+done
+
+\$SLEEP 1
+
+for pid in \$PIDS
+do
+ \$WAIT \$pid
+ (( \$? == 127 )) && exit 1
+done
+exit 0
+EOF
+
+$KSH /var/tmp/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 -i \
+ $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/usr/src/test/zfs-tests/tests/functional/mv_files/setup.ksh b/usr/src/test/zfs-tests/tests/functional/mv_files/setup.ksh
new file mode 100644
index 0000000000..fd9a4f259f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/mv_files/setup.ksh
@@ -0,0 +1,47 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/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/usr/src/test/zfs-tests/tests/functional/nestedfs/Makefile b/usr/src/test/zfs-tests/tests/functional/nestedfs/Makefile
new file mode 100644
index 0000000000..e308834ec6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/nestedfs/Makefile
@@ -0,0 +1,41 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/nestedfs
+
+PROGS = cleanup \
+ nestedfs_001_pos \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/nestedfs/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/nestedfs/cleanup.ksh
new file mode 100644
index 0000000000..93199bff66
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/nestedfs/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_container_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/nestedfs/nestedfs_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/nestedfs/nestedfs_001_pos.ksh
new file mode 100644
index 0000000000..b27dd6e148
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/nestedfs/nestedfs_001_pos.ksh
@@ -0,0 +1,59 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Verify a nested file system can be created/destroyed."
+
+log_must $FILE_WRITE -o create -f $TESTDIR1/file -b 8192 -c 600 -d 0
+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/usr/src/test/zfs-tests/tests/functional/nestedfs/setup.ksh b/usr/src/test/zfs-tests/tests/functional/nestedfs/setup.ksh
new file mode 100644
index 0000000000..0ce60ed02a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/nestedfs/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_container_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/no_space/Makefile b/usr/src/test/zfs-tests/tests/functional/no_space/Makefile
new file mode 100644
index 0000000000..4edd55ecea
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/no_space/Makefile
@@ -0,0 +1,43 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/no_space
+
+PROGS = cleanup \
+ enospc_001_pos \
+ setup
+
+FILES = enospc.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/no_space/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/no_space/cleanup.ksh
new file mode 100644
index 0000000000..35380c1419
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/no_space/cleanup.ksh
@@ -0,0 +1,49 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/no_space/enospc.cfg
+
+verify_runnable "global"
+
+DISK=${DISKS%% *}
+
+ismounted "$TESTPOOL/$TESTFS"
+(( $? == 0 )) && \
+ log_must $ZFS umount $TESTDIR
+
+destroy_pool $TESTPOOL
+#
+# Remove 100mb partition.
+#
+create_pool dummy$$ "$DISK"
+destroy_pool dummy$$
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/no_space/enospc.cfg b/usr/src/test/zfs-tests/tests/functional/no_space/enospc.cfg
new file mode 100644
index 0000000000..692482a82c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/no_space/enospc.cfg
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export TESTFILE0=testfile0.$$
+export TESTFILE1=testfile1.$$
+
+export SIZE=100mb
+export ENOSPC=28
+export BLOCKSZ=8192
+export NUM_WRITES=65536
+export DATA=0
diff --git a/usr/src/test/zfs-tests/tests/functional/no_space/enospc_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/no_space/enospc_001_pos.ksh
new file mode 100644
index 0000000000..482172c444
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/no_space/enospc_001_pos.ksh
@@ -0,0 +1,68 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/no_space/enospc.cfg
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/no_space/setup.ksh b/usr/src/test/zfs-tests/tests/functional/no_space/setup.ksh
new file mode 100644
index 0000000000..b06a1116e8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/no_space/setup.ksh
@@ -0,0 +1,45 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/no_space/enospc.cfg
+
+verify_runnable "global"
+
+if ! $(is_physical_device $DISKS) ; then
+ log_unsupported "This directory cannot be run on raw files."
+fi
+
+DISK=${DISKS%% *}
+
+log_must set_partition 0 "" $SIZE $DISK
+
+default_setup $DISK"s0"
diff --git a/usr/src/test/zfs-tests/tests/functional/online_offline/Makefile b/usr/src/test/zfs-tests/tests/functional/online_offline/Makefile
new file mode 100644
index 0000000000..53211b61a5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/online_offline/Makefile
@@ -0,0 +1,45 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/online_offline
+
+PROGS = cleanup \
+ online_offline_001_pos \
+ online_offline_002_neg \
+ online_offline_003_neg \
+ setup
+
+FILES = online_offline.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/online_offline/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/online_offline/cleanup.ksh
new file mode 100644
index 0000000000..ec9c77f639
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/online_offline/cleanup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline.cfg b/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline.cfg
new file mode 100644
index 0000000000..e68e8363f6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline.cfg
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export TESTFILE=testfile.$$
+export TESTFILE1=testfile1.$$
+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/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_001_pos.ksh
new file mode 100644
index 0000000000..7c45718a2b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_001_pos.ksh
@@ -0,0 +1,144 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/online_offline/online_offline.cfg
+
+#
+# DESCRIPTION:
+# Turning a disk offline and back online during I/O completes.
+#
+# STRATEGY:
+# 1. Create a mirror and start some random I/O
+# 2. For each disk in the mirror, set it offline and online
+# 3. Verify the integrity of the file system and the resilvering.
+#
+
+verify_runnable "global"
+
+DISKLIST=$(get_disklist $TESTPOOL)
+
+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
+
+ [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/*
+}
+
+log_assert "Turning a disk offline and back online during I/O completes."
+
+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
+
+typeset child_pid=""
+
+typeset -i iters=2
+typeset -i index=0
+
+i=0
+while [[ $i -lt $iters ]]; do
+ log_note "Invoking $FILE_TRUNC with: $options_display"
+ $FILE_TRUNC $options $TESTDIR/$TESTFILE.$i &
+ typeset pid=$!
+
+ $SLEEP 1
+ if ! $PS -p $pid > /dev/null 2>&1; then
+ log_fail "$FILE_TRUNC $options $TESTDIR/$TESTFILE.$i"
+ fi
+
+ child_pids="$child_pids $pid"
+ ((i = i + 1))
+done
+
+for disk in $DISKLIST; do
+ #
+ # Allow some common data to reach each side of the mirror.
+ #
+ $SLEEP 30
+
+ i=0
+ while [[ $i -lt $iters ]]; do
+ log_must $ZPOOL offline $TESTPOOL $disk
+ check_state $TESTPOOL $disk "offline"
+ if [[ $? != 0 ]]; then
+ log_fail "$disk of $TESTPOOL is not offline."
+ fi
+
+ (( i = i + 1 ))
+ done
+
+ #
+ # Sleep to allow the two sides to get out of sync
+ #
+ $SLEEP 60
+
+ 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
+
+for wait_pid in $child_pids
+do
+ $KILL $wait_pid
+done
+
+typeset dir=$(get_device_dir $DISKS)
+verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir"
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_002_neg.ksh
new file mode 100644
index 0000000000..23014011a3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_002_neg.ksh
@@ -0,0 +1,141 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/online_offline/online_offline.cfg
+
+#
+# DESCRIPTION:
+# Turning both disks offline should fail.
+#
+# STRATEGY:
+# 1. Create a mirror and start some random I/O
+# 2. For each disk in the mirror, set them offline sequentially.
+# 3. Only one disk can be offline at any one time.
+# 4. Verify the integrity of the file system and the resilvering.
+#
+
+verify_runnable "global"
+
+DISKLIST=$(get_disklist $TESTPOOL)
+
+function cleanup
+{
+ if [[ -n "$child_pids" ]]; then
+ for wait_pid in $child_pids
+ do
+ $KILL $wait_pid
+ done
+ fi
+
+ #
+ # 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
+
+ [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/*
+}
+
+log_assert "Turning both disks offline should fail."
+
+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
+
+child_pid=""
+
+typeset -i iters=2
+typeset -i index=0
+
+i=0
+while [[ $i -lt $iters ]]; do
+ log_note "Invoking $FILE_TRUNC with: $options_display"
+ $FILE_TRUNC $options $TESTDIR/$TESTFILE.$i &
+ typeset pid=$!
+
+ $SLEEP 1
+ if ! $PS -p $pid > /dev/null 2>&1; then
+ log_fail "$FILE_TRUNC $options $TESTDIR/$TESTFILE.$i"
+ fi
+
+ child_pids="$child_pids $pid"
+ ((i = i + 1))
+done
+
+set -A disk "" $DISKLIST
+
+log_must $ZPOOL offline $TESTPOOL ${disk[1]}
+
+$SLEEP 60
+
+for wait_pid in $child_pids
+do
+ $KILL $wait_pid
+done
+child_pids=""
+
+i=1
+while [[ $i != ${#disk[*]} ]]; do
+ log_must $ZPOOL online $TESTPOOL ${disk[$i]}
+ check_state $TESTPOOL ${disk[$i]} "online"
+ if [[ $? != 0 ]]; then
+ log_fail "${disk[$i]} of $TESTPOOL did not match online state"
+ fi
+
+ ((i = i + 1))
+done
+
+typeset dir=$(get_device_dir $DISKS)
+verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir"
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_003_neg.ksh
new file mode 100644
index 0000000000..ef789a8c0a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/online_offline/online_offline_003_neg.ksh
@@ -0,0 +1,133 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/online_offline/online_offline.cfg
+
+#
+# DESCRIPTION:
+# Turning both disks offline should fail.
+#
+# STRATEGY:
+# 1. Create a multidisk stripe and start some random I/O
+# 2. For two disks in the stripe, set them offline sequentially.
+# 3. Zpool offline should fail in both cases.
+# 4. Verify the integrity of the file system and the resilvering.
+#
+
+verify_runnable "global"
+
+DISKLIST=$(get_disklist $TESTPOOL)
+
+function cleanup
+{
+ if [[ -n "$child_pids" ]]; then
+ for wait_pid in $child_pids
+ do
+ $KILL $wait_pid
+ done
+ fi
+
+ if poolexists $TESTPOOL1; then
+ destroy_pool $TESTPOOL1
+ fi
+
+ [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/*
+}
+
+log_assert "Turning a disk offline and back online during I/O completes."
+
+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
+
+child_pid=""
+
+typeset -i iters=2
+typeset -i index=0
+
+specials_list=""
+i=0
+while [[ $i != 3 ]]; do
+ $MKFILE 100m $TESTDIR/$TESTFILE1.$i
+ specials_list="$specials_list $TESTDIR/$TESTFILE1.$i"
+
+ ((i = i + 1))
+done
+
+create_pool $TESTPOOL1 $specials_list
+log_must $ZFS create $TESTPOOL1/$TESTFS1
+log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL1/$TESTFS1
+
+i=0
+while [[ $i -lt $iters ]]; do
+ log_note "Invoking $FILE_TRUNC with: $options_display"
+ $FILE_TRUNC $options $TESTDIR/$TESTFILE.$i &
+ typeset pid=$!
+
+ $SLEEP 1
+ if ! $PS -p $pid > /dev/null 2>&1; then
+ log_fail "$FILE_TRUNC $options $TESTDIR/$TESTFILE.$i"
+ fi
+
+ child_pids="$child_pids $pid"
+ ((i = i + 1))
+done
+
+set -A disk "" $specials_list
+
+log_mustnot $ZPOOL offline $TESTPOOL1 ${disk[1]}
+log_mustnot $ZPOOL offline $TESTPOOL1 ${disk[2]}
+
+$SLEEP 60
+
+for wait_pid in $child_pids
+do
+ $KILL $wait_pid
+done
+child_pids=""
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/online_offline/setup.ksh b/usr/src/test/zfs-tests/tests/functional/online_offline/setup.ksh
new file mode 100644
index 0000000000..a7e73b4c59
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/online_offline/setup.ksh
@@ -0,0 +1,47 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+verify_disk_count "$DISKS" 2
+
+index=`expr $RANDOM % 2`
+case $index in
+0) log_note "Pool Type: Mirror"
+ default_mirror_setup $DISKS
+ ;;
+1) log_note "Pool Type: RAID-Z"
+ default_raidz_setup $DISKS
+ ;;
+esac
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/pool_names/Makefile b/usr/src/test/zfs-tests/tests/functional/pool_names/Makefile
new file mode 100644
index 0000000000..07c1192d49
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/pool_names/Makefile
@@ -0,0 +1,40 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/pool_names
+
+PROGS = pool_names_001_pos \
+ pool_names_002_neg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/pool_names/pool_names_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/pool_names/pool_names_001_pos.ksh
new file mode 100644
index 0000000000..ad10740f34
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/pool_names/pool_names_001_pos.ksh
@@ -0,0 +1,115 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Ensure that pool names can use the ASCII subset of UTF-8"
+
+function cleanup
+{
+ if [[ -n $name ]] && poolexists $name ; then
+ log_must $ZPOOL destroy $name
+ fi
+
+ if [[ -d $TESTDIR ]]; then
+ log_must $RM -rf $TESTDIR
+ fi
+
+}
+
+log_onexit cleanup
+
+DISK=${DISKS%% *}
+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/usr/src/test/zfs-tests/tests/functional/pool_names/pool_names_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/pool_names/pool_names_002_neg.ksh
new file mode 100644
index 0000000000..d54fddfe96
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/pool_names/pool_names_002_neg.ksh
@@ -0,0 +1,131 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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
+{
+ if poolexists $POOLNAME; then
+ log_must $ZPOOL destroy $POOLNAME
+ fi
+
+ if [[ -d $TESTDIR ]]; then
+ log_must $RM -rf $TESTDIR
+ fi
+}
+
+log_onexit cleanup
+
+typeset exclude=`eval $ECHO \"'(${KEEP})'\"`
+for pool in $($ZPOOL list -H -o name | \
+ $EGREP -v "$exclude" | \
+ $GREP -v "$TESTPOOL" | \
+ $EGREP -v "$NO_POOLS"); do
+ log_must $ZPOOL destroy $pool
+done
+
+DISK=${DISKS%% *}
+if [[ ! -e $TESTDIR ]]; then
+ log_must $MKDIR $TESTDIR
+fi
+
+log_note "Ensure invalid characters fail"
+for POOLNAME in "!" "\"" "#" "$" "%" "&" "'" "(" ")" \
+ "\*" "+" "," "-" "\." "/" "\\" \
+ 0 1 2 3 4 5 6 7 8 9 \
+ ":" ";" "<" "=" ">" "\?" "@" \
+ "[" "]" "^" "_" "\`" "{" "|" "}" "~"
+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
+
+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
+ POOLNAME=`eval "echo x | tr 'x' '$oct'"`
+ 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
+
+log_note "Verify invalid pool names fail"
+set -A POOLNAME "c0t0d0s0" "c0t0d0" "c0t0d19" "c0t50000E0108D279d0" \
+ "mirror" "raidz" ",," ",,,,,,,,,,,,,,,,,,,,,,,,," \
+ "2222222222222222222" "mirror_pool" "raidz_pool" \
+ "mirror-pool" "raidz-pool" "spare" "spare_pool" \
+ "spare-pool" "raidz1-" "raidz2:" ":aaa" "-bbb" "_ccc" ".ddd"
+if verify_slog_support ; then
+ POOLNAME[${#POOLNAME[@]}]='log'
+fi
+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/usr/src/test/zfs-tests/tests/functional/poolversion/Makefile b/usr/src/test/zfs-tests/tests/functional/poolversion/Makefile
new file mode 100644
index 0000000000..bae573a103
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/poolversion/Makefile
@@ -0,0 +1,42 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/poolversion
+
+PROGS = cleanup \
+ poolversion_001_pos \
+ poolversion_002_pos \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/poolversion/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/poolversion/cleanup.ksh
new file mode 100644
index 0000000000..047761b090
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/poolversion/cleanup.ksh
@@ -0,0 +1,42 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+log_must $ZPOOL destroy $TESTPOOL
+log_must $ZPOOL destroy $TESTPOOL2
+
+log_must $RM /tmp/zpool_version_1.dat
+log_must $RM /tmp/zpool2_version_1.dat
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/poolversion/poolversion_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/poolversion/poolversion_001_pos.ksh
new file mode 100644
index 0000000000..42989e0715
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/poolversion/poolversion_001_pos.ksh
@@ -0,0 +1,58 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/poolversion/poolversion_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/poolversion/poolversion_002_pos.ksh
new file mode 100644
index 0000000000..d5e063a784
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/poolversion/poolversion_002_pos.ksh
@@ -0,0 +1,71 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/poolversion/setup.ksh b/usr/src/test/zfs-tests/tests/functional/poolversion/setup.ksh
new file mode 100644
index 0000000000..ce4f45bb72
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/poolversion/setup.ksh
@@ -0,0 +1,45 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+# create a version 1 pool
+log_must $MKFILE 64m /tmp/zpool_version_1.dat
+log_must $ZPOOL create -o version=1 $TESTPOOL /tmp/zpool_version_1.dat
+
+
+# create another version 1 pool
+log_must $MKFILE 64m /tmp/zpool2_version_1.dat
+log_must $ZPOOL create -o version=1 $TESTPOOL2 /tmp/zpool2_version_1.dat
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/privilege/Makefile b/usr/src/test/zfs-tests/tests/functional/privilege/Makefile
new file mode 100644
index 0000000000..4d0230db61
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/privilege/Makefile
@@ -0,0 +1,42 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/privilege
+
+PROGS = cleanup \
+ privilege_001_pos \
+ privilege_002_pos \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/privilege/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/privilege/cleanup.ksh
new file mode 100644
index 0000000000..35370dd5c9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/privilege/cleanup.ksh
@@ -0,0 +1,49 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+ZFS_USER=$($CAT /tmp/zfs-privs-test-user.txt)
+USES_NIS=$($CAT /tmp/zfs-privs-test-nis.txt)
+
+if [ "${USES_NIS}" == "true" ]
+then
+ $SVCADM enable svc:/network/nis/client:default
+fi
+
+$USERDEL $ZFS_USER
+[[ -d /export/home/$ZFS_USER ]] && $RM -rf /export/home/$ZFS_USER
+$RM /tmp/zfs-privs-test-nis.txt
+$RM /tmp/zfs-privs-test-user.txt
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/privilege/privilege_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/privilege/privilege_001_pos.ksh
new file mode 100644
index 0000000000..3208b815d4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/privilege/privilege_001_pos.ksh
@@ -0,0 +1,91 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# The RBAC profile "ZFS Storage Management" works
+#
+# STRATEGY:
+# (create)
+# 1. As a normal user, try to create a pool - which should fail.
+# 2. Assign "ZFS Storage Management" profile, try to create pool again,
+# which should succeed.
+#
+# (works well with other ZFS profile tests)
+# 3. Attempt to create a ZFS filesystem, which should fail.
+# 4. Add the "ZFS File System Management" profile, attempt to create a FS
+# which should succeed.
+#
+# (destroy)
+# 5. Remove the FS profile, then attempt to destroy the pool, which
+# should succeed.
+# 6. Remove the Storage profile, then attempt to recreate the pool, which
+# should fail.
+#
+
+# We can only run this in the global zone
+verify_runnable "global"
+
+log_assert "The RBAC profile \"ZFS Storage Management\" works"
+
+ZFS_USER=$($CAT /tmp/zfs-privs-test-user.txt)
+
+# the user shouldn't be able to do anything initially
+log_mustnot $SU $ZFS_USER -c "$ZPOOL create $TESTPOOL $DISKS"
+log_mustnot $SU $ZFS_USER -c "$PFEXEC $ZPOOL create $TESTPOOL $DISKS"
+
+# the first time we assign the profile, we insist it should work
+log_must $USERMOD -P "ZFS Storage Management" $ZFS_USER
+log_must $SU $ZFS_USER -c "$PFEXEC $ZPOOL create -f $TESTPOOL $DISKS"
+
+# ensure the user can't create a filesystem with this profile
+log_mustnot $SU $ZFS_USER -c "$ZFS create $TESTPOOL/fs"
+
+# add ZFS File System Management profile, and try to create a fs
+log_must $USERMOD -P "ZFS File System Management" $ZFS_USER
+log_must $SU $ZFS_USER -c "$PFEXEC $ZFS create $TESTPOOL/fs"
+
+# revoke File System Management profile
+$USERMOD -P, $ZFS_USER
+$USERMOD -P "ZFS Storage Management" $ZFS_USER
+
+# ensure the user can destroy pools
+log_mustnot $SU $ZFS_USER -c "$ZPOOL destroy $TESTPOOL"
+log_must $SU $ZFS_USER -c "$PFEXEC $ZPOOL destroy $TESTPOOL"
+
+# revoke Storage Management profile
+$USERMOD -P, $ZFS_USER
+log_mustnot $SU $ZFS_USER -c "$PFEXEC $ZPOOL create -f $TESTPOOL $DISKS"
+
+log_pass "The RBAC profile \"ZFS Storage Management\" works"
diff --git a/usr/src/test/zfs-tests/tests/functional/privilege/privilege_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/privilege/privilege_002_pos.ksh
new file mode 100644
index 0000000000..22e8eee8c7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/privilege/privilege_002_pos.ksh
@@ -0,0 +1,101 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# The RBAC profile "ZFS File System Management" works
+#
+# STRATEGY:
+#
+# The following actions are taken, both using profile execution (pfexec)
+# and without profile execution - we make sure that the latter should
+# always fail.
+#
+# (create)
+# 1. As a normal user, try to create a filesystem - which should fail.
+# 2. Assign "ZFS File System Management" profile, try to create fs again,
+# which should succeed.
+#
+# (pools)
+# 3. Ensure a user with this profile can't perform pool administration
+# by attempting to destroy a pool.
+#
+# (destroy)
+# 5. Remove the FS profile, then attempt to destroy the fs, which
+# should fail.
+# 6. Assign the FS profile, then attempt to destroy the fs, which
+# should succeed.
+#
+
+verify_runnable "both"
+
+log_assert "The RBAC profile \"ZFS File System Management\" works"
+
+ZFS_USER=$($CAT /tmp/zfs-privs-test-user.txt)
+
+# Set a $DATASET where we can create child files systems
+if is_global_zone; then
+ log_must $ZPOOL create -f $TESTPOOL $DISKS
+ DATASET=$TESTPOOL
+else
+ DATASET=zonepool/zonectr0
+fi
+
+# A user shouldn't be able to create filesystems
+log_mustnot $SU $ZFS_USER -c "$ZFS create $DATASET/zfsprivfs"
+
+# Insist this invocation of usermod works
+log_must $USERMOD -P "ZFS File System Management" $ZFS_USER
+
+# Now try to create file systems as the user
+log_mustnot $SU $ZFS_USER -c "$ZFS create $DATASET/zfsprivfs"
+log_must $SU $ZFS_USER -c "$PFEXEC $ZFS create $DATASET/zfsprivfs"
+
+# Ensure the user can't do anything to pools in this state:
+log_mustnot $SU $ZFS_USER -c "$ZPOOL destroy $DATASET"
+log_mustnot $SU $ZFS_USER -c "$PFEXEC $ZPOOL destroy $DATASET"
+
+# revoke File System Management profile
+$USERMOD -P, $ZFS_USER
+
+# Ensure the user can't create more filesystems
+log_mustnot $SU $ZFS_USER -c "$ZFS create $DATASET/zfsprivfs2"
+log_mustnot $SU $ZFS_USER -c "$PFEXEC $ZFS create $DATASET/zfsprivfs2"
+
+# assign the profile again and destroy the fs.
+$USERMOD -P "ZFS File System Management" $ZFS_USER
+log_must $SU $ZFS_USER -c "$PFEXEC $ZFS destroy $DATASET/zfsprivfs"
+$USERMOD -P, $ZFS_USER
+
+log_pass "The RBAC profile \"ZFS File System Management\" works"
diff --git a/usr/src/test/zfs-tests/tests/functional/privilege/setup.ksh b/usr/src/test/zfs-tests/tests/functional/privilege/setup.ksh
new file mode 100644
index 0000000000..bfb858fb7b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/privilege/setup.ksh
@@ -0,0 +1,67 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+ZFS_USER=zfsrbac
+USES_NIS=false
+
+# 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 svc:/network/nis/client:default
+ USES_NIS=true
+fi
+
+
+# create a unique user that we can use to run the tests,
+# making sure not to clobber any existing users.
+FOUND=""
+while [ -z "${FOUND}" ]
+do
+ USER_EXISTS=$( grep $ZFS_USER /etc/passwd )
+ if [ ! -z "${USER_EXISTS}" ]
+ then
+ ZFS_USER="${ZFS_USER}x"
+ else
+ FOUND="true"
+ fi
+done
+
+log_must $MKDIR -p /export/home/$ZFS_USER
+log_must $USERADD -c "ZFS Privileges Test User" -d /export/home/$ZFS_USER $ZFS_USER
+
+echo $ZFS_USER > /tmp/zfs-privs-test-user.txt
+echo $USES_NIS > /tmp/zfs-privs-test-nis.txt
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/quota/Makefile b/usr/src/test/zfs-tests/tests/functional/quota/Makefile
new file mode 100644
index 0000000000..f1408a80bf
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/Makefile
@@ -0,0 +1,49 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/quota
+
+PROGS = cleanup \
+ quota_001_pos \
+ quota_002_pos \
+ quota_003_pos \
+ quota_004_pos \
+ quota_005_pos \
+ quota_006_neg \
+ setup
+
+FILES = quota.cfg \
+ quota.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/quota/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/quota/cleanup.ksh
new file mode 100644
index 0000000000..93199bff66
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_container_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/quota/quota.cfg b/usr/src/test/zfs-tests/tests/functional/quota/quota.cfg
new file mode 100644
index 0000000000..5b19f40163
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/quota.cfg
@@ -0,0 +1,35 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export BLOCK_SIZE=8192
+export QUOTA_VALUE=10000000
+export TESTFILE1=file1
+export TESTFILE2=file2
+export TOLERANCE=131071
diff --git a/usr/src/test/zfs-tests/tests/functional/quota/quota.kshlib b/usr/src/test/zfs-tests/tests/functional/quota/quota.kshlib
new file mode 100644
index 0000000000..ad273d9de0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/quota.kshlib
@@ -0,0 +1,91 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/quota/quota.cfg
+
+# BLOCK_SIZE, QUOTA_VALUE and TOLERANCE set in quota.cfg
+readonly EDQUOT=49
+
+#
+# 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 "Returned error code: $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 "Returned error code: $zret. Expected: EDQUOT."
+ return 0
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/quota/quota_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/quota/quota_001_pos.ksh
new file mode 100644
index 0000000000..6c5cf368b8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/quota_001_pos.ksh
@@ -0,0 +1,76 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/quota/quota.kshlib
+
+#
+# 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
+#
+
+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_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/usr/src/test/zfs-tests/tests/functional/quota/quota_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/quota/quota_002_pos.ksh
new file mode 100644
index 0000000000..3b8ba668ac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/quota_002_pos.ksh
@@ -0,0 +1,73 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/quota/quota.kshlib
+
+#
+# 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)
+#
+#
+
+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_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/usr/src/test/zfs-tests/tests/functional/quota/quota_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/quota/quota_003_pos.ksh
new file mode 100644
index 0000000000..afcc4a14c4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/quota_003_pos.ksh
@@ -0,0 +1,79 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/quota/quota.kshlib
+
+#
+# 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
+#
+
+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_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/usr/src/test/zfs-tests/tests/functional/quota/quota_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/quota/quota_004_pos.ksh
new file mode 100644
index 0000000000..def8b2b37d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/quota_004_pos.ksh
@@ -0,0 +1,74 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/quota/quota.kshlib
+
+#
+# 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)
+#
+#
+
+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_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/usr/src/test/zfs-tests/tests/functional/quota/quota_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/quota/quota_005_pos.ksh
new file mode 100644
index 0000000000..55bddb5302
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/quota_005_pos.ksh
@@ -0,0 +1,76 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/quota/quota.kshlib
+
+#
+# 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.
+#
+###############################################################################
+
+verify_runnable "both"
+
+function cleanup
+{
+ datasetexists $fs_child && \
+ log_must $ZFS destroy $fs_child
+
+ log_must $ZFS set quota=$quota_val $fs
+}
+
+log_onexit cleanup
+
+log_assert "Verify that quota doesnot inherit its value from parent."
+log_onexit cleanup
+
+fs=$TESTPOOL/$TESTFS
+fs_child=$TESTPOOL/$TESTFS/$TESTFS
+
+space_avail=$(get_prop available $fs)
+quota_val=$(get_prop quota $fs)
+typeset -i quotasize=$space_avail
+((quotasize = quotasize * 2 ))
+log_must $ZFS set quota=$quotasize $fs
+
+log_must $ZFS create $fs_child
+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/usr/src/test/zfs-tests/tests/functional/quota/quota_006_neg.ksh b/usr/src/test/zfs-tests/tests/functional/quota/quota_006_neg.ksh
new file mode 100644
index 0000000000..a22520c699
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/quota_006_neg.ksh
@@ -0,0 +1,71 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/quota/quota.kshlib
+
+#
+# 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.
+#
+
+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 -i 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 -i space_used=`get_prop used $TESTPOOL/$TESTFS`
+(( quota_integer_size = space_used - 1 ))
+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/usr/src/test/zfs-tests/tests/functional/quota/setup.ksh b/usr/src/test/zfs-tests/tests/functional/quota/setup.ksh
new file mode 100644
index 0000000000..0ce60ed02a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/quota/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_container_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/redundancy/Makefile b/usr/src/test/zfs-tests/tests/functional/redundancy/Makefile
new file mode 100644
index 0000000000..2d953c9460
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/Makefile
@@ -0,0 +1,47 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/redundancy
+
+PROGS = cleanup \
+ redundancy_001_pos \
+ redundancy_002_pos \
+ redundancy_003_pos \
+ redundancy_004_neg \
+ setup
+
+FILES = redundancy.cfg \
+ redundancy.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/redundancy/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/redundancy/cleanup.ksh
new file mode 100644
index 0000000000..55a5e9bd1f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/cleanup.ksh
@@ -0,0 +1,38 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/redundancy/redundancy.kshlib
+
+verify_runnable "global"
+
+cleanup
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.cfg b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.cfg
new file mode 100644
index 0000000000..079ff8b730
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.cfg
@@ -0,0 +1,40 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export BASEDIR=/var/tmp/basedir.$$
+export TESTFILE=testfile.$$
+
+export PRE_RECORD_FILE=$BASEDIR/pre-record-file.$$
+export PST_RECORD_FILE=$BASEDIR/pst-record-file.$$
+
+export DEV_SIZE=64M
+
+export BLOCKSZ=$(( 1024 * 1024 ))
+export NUM_WRITES=40
diff --git a/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.kshlib b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.kshlib
new file mode 100644
index 0000000000..cb8271797b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy.kshlib
@@ -0,0 +1,365 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/redundancy/redundancy.cfg
+
+function cleanup
+{
+ if poolexists $TESTPOOL; then
+ destroy_pool $TESTPOOL
+ fi
+ typeset dir
+ for dir in $TESTDIR $BASEDIR; do
+ if [[ -d $dir ]]; then
+ log_must $RM -rf $dir
+ fi
+ done
+}
+
+#
+# Get random number between min and max number.
+#
+# $1 Minimal value
+# $2 Maximal value
+#
+function random
+{
+ typeset -i min=$1
+ typeset -i max=$2
+ typeset -i value
+
+ while true; do
+ ((value = RANDOM % (max + 1)))
+ if ((value >= min)); then
+ break
+ fi
+ done
+
+ $ECHO $value
+}
+
+#
+# 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
+
+ if [[ ! -d $BASEDIR ]]; then
+ log_must $MKDIR $BASEDIR
+ fi
+
+ if poolexists $pool ; then
+ destroy_pool $pool
+ fi
+
+ log_must $MKFILE $DEV_SIZE $vdevs
+
+ log_must $ZPOOL create -m $TESTDIR $pool $keyword $vdevs
+
+ log_note "Filling up the filesystem ..."
+ typeset -i ret=0
+ typeset -i i=0
+ typeset file=$TESTDIR/file
+ while $TRUE ; do
+ $FILE_WRITE -o create -f $file.$i \
+ -b $BLOCKSZ -c $NUM_WRITES
+ ret=$?
+ (( $ret != 0 )) && break
+ (( i = i + 1 ))
+ done
+ (($ret != 28 )) && log_note "$FILE_WRITE return value($ret) is unexpected."
+
+ record_data $TESTPOOL $PRE_RECORD_FILE
+}
+
+#
+# Check pool status is healthy
+#
+# $1 pool
+#
+function is_healthy
+{
+ 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}')
+
+ return $errnum
+ fi
+}
+
+#
+# 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
+
+ typeset all_devs=$($ZPOOL iostat -v $pool | $AWK '{print $1}'| \
+ $EGREP -v "^pool$|^capacity$|^mirror$|^raidz1$|^raidz2$|---" | \
+ $EGREP -v "/old$|^$pool$")
+ typeset -i i=0
+ typeset vdevs
+ while ((i < cnt)); do
+ typeset dev=$($ECHO $all_devs | $AWK '{print $1}')
+ eval all_devs=\${all_devs##*$dev}
+
+ vdevs="$dev $vdevs"
+ ((i += 1))
+ done
+
+ $ECHO "$vdevs"
+}
+
+#
+# Synchronize all the data in pool
+#
+# $1 pool name
+#
+function sync_pool #pool
+{
+ typeset pool=$1
+
+ log_must $SYNC
+ log_must $SLEEP 2
+ # Flush all the pool data.
+ typeset -i ret
+ $ZPOOL scrub $pool >/dev/null 2>&1
+ ret=$?
+ (( $ret != 0 )) && \
+ log_fail "$ZPOOL scrub $pool failed."
+
+ while ! is_pool_scrubbed $pool; do
+ if is_pool_resilvered $pool ; then
+ log_fail "$pool should not be resilver completed."
+ fi
+ log_must $SLEEP 2
+ done
+}
+
+#
+# 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
+ log_must $MKFILE $DEV_SIZE $vdev
+ log_must $ZPOOL replace -f $pool $vdev $vdev
+ while true; do
+ if ! is_pool_resilvered $pool ; then
+ log_must $SLEEP 2
+ else
+ break
+ fi
+ done
+ done
+}
+
+#
+# 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)
+ if [[ -n $label ]]; then
+ typeset dev
+ for dev in $vdevs; do
+ bs_count=$($LS -l $dev | $AWK '{print $5}')
+ (( bs_count = bs_count/1024 - 512 ))
+ $DD if=/dev/zero of=$dev seek=512 bs=1024 \
+ count=$bs_count conv=notrunc >/dev/null 2>&1
+ done
+ else
+ log_must $MKFILE $DEV_SIZE $vdevs
+ fi
+
+ sync_pool $pool
+}
+
+#
+# Clear errors in the pool caused by data corruptions
+#
+# $1 pool name
+#
+function clear_errors
+{
+ typeset pool=$1
+
+ log_must $ZPOOL clear $pool
+
+ if ! is_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
+}
+
+#
+# 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_must $RM -f $vdevs
+
+ sync_pool $pool
+}
+
+#
+# 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)
+ replace_missing_devs $pool $vdevs
+
+ if ! is_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/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_001_pos.ksh
new file mode 100644
index 0000000000..e25a48be8d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_001_pos.ksh
@@ -0,0 +1,76 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/redundancy/redundancy.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Verify raidz pool can withstand one device is failing."
+log_onexit cleanup
+
+typeset -i cnt=$(random 2 5)
+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
+
+log_pass "Raidz pool can withstand one devices is failing passed."
diff --git a/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_002_pos.ksh
new file mode 100644
index 0000000000..b16687dbe8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_002_pos.ksh
@@ -0,0 +1,83 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/redundancy/redundancy.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Verify raidz2 pool can withstand two devices are failing."
+log_onexit cleanup
+
+typeset -i cnt=$(random 3 5)
+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
+
+log_pass "Raidz2 pool can withstand two devices are failing passed."
diff --git a/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_003_pos.ksh
new file mode 100644
index 0000000000..a1ca2cb765
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_003_pos.ksh
@@ -0,0 +1,93 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/redundancy/redundancy.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Verify mirrored pool can withstand N-1 devices are failing or missing."
+log_onexit cleanup
+
+typeset -i cnt=$(random 2 5)
+setup_test_env $TESTPOOL mirror $cnt
+
+typeset -i i=1
+
+#
+# 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
+
+log_pass "Mirrored pool can withstand N-1 devices failing as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_004_neg.ksh
new file mode 100644
index 0000000000..0d40c576a2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/redundancy_004_neg.ksh
@@ -0,0 +1,66 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/redundancy/redundancy.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Verify striped pool have no data redundancy."
+log_onexit cleanup
+
+typeset -i cnt=$(random 2 5)
+setup_test_env $TESTPOOL "" $cnt
+
+damage_devs $TESTPOOL 1 "keep_label"
+log_must $ZPOOL clear $TESTPOOL
+
+# Wait for the scrub intiated by the clear to wrap, or is_healthy will be wrong.
+while ! is_pool_scrubbed $TESTPOOL; do
+ sync
+done
+
+log_mustnot is_healthy $TESTPOOL
+
+log_pass "Striped pool has no data redundancy as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/redundancy/setup.ksh b/usr/src/test/zfs-tests/tests/functional/redundancy/setup.ksh
new file mode 100644
index 0000000000..7eacb0f503
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/redundancy/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/refquota/Makefile b/usr/src/test/zfs-tests/tests/functional/refquota/Makefile
new file mode 100644
index 0000000000..8419ad3b85
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/Makefile
@@ -0,0 +1,46 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/refquota
+
+PROGS = cleanup \
+ refquota_001_pos \
+ refquota_002_pos \
+ refquota_003_pos \
+ refquota_004_pos \
+ refquota_005_pos \
+ refquota_006_neg \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/refquota/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/refquota/cleanup.ksh
new file mode 100644
index 0000000000..28883bd3bd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/cleanup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "both"
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/refquota/refquota_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_001_pos.ksh
new file mode 100644
index 0000000000..9f974d89b2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_001_pos.ksh
@@ -0,0 +1,77 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/refquota/refquota_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_002_pos.ksh
new file mode 100644
index 0000000000..7ee5967f7f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_002_pos.ksh
@@ -0,0 +1,90 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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
+
+TESTFILE='testfile'
+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
+#
+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/usr/src/test/zfs-tests/tests/functional/refquota/refquota_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_003_pos.ksh
new file mode 100644
index 0000000000..8026e7d6c2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_003_pos.ksh
@@ -0,0 +1,83 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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
+
+TESTFILE='testfile'
+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/usr/src/test/zfs-tests/tests/functional/refquota/refquota_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_004_pos.ksh
new file mode 100644
index 0000000000..2d7902e4e5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_004_pos.ksh
@@ -0,0 +1,76 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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
+
+TESTFILE='testfile'
+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/usr/src/test/zfs-tests/tests/functional/refquota/refquota_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_005_pos.ksh
new file mode 100644
index 0000000000..5e6ad12547
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_005_pos.ksh
@@ -0,0 +1,77 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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
+
+TESTFILE='testfile'
+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/usr/src/test/zfs-tests/tests/functional/refquota/refquota_006_neg.ksh b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_006_neg.ksh
new file mode 100644
index 0000000000..18b0a4f10a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/refquota_006_neg.ksh
@@ -0,0 +1,70 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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" \
+ "\0" "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
+
+log_pass "'zfs set refquota' can handle incorrect arguments correctly."
diff --git a/usr/src/test/zfs-tests/tests/functional/refquota/setup.ksh b/usr/src/test/zfs-tests/tests/functional/refquota/setup.ksh
new file mode 100644
index 0000000000..e7d473bf7d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refquota/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "both"
+DISK=${DISKS%% *}
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/refreserv/Makefile b/usr/src/test/zfs-tests/tests/functional/refreserv/Makefile
new file mode 100644
index 0000000000..4a618feff7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/Makefile
@@ -0,0 +1,47 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/refreserv
+
+PROGS = cleanup \
+ refreserv_001_pos \
+ refreserv_002_pos \
+ refreserv_003_pos \
+ refreserv_004_pos \
+ refreserv_005_pos \
+ setup
+
+FILES = refreserv.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/refreserv/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/refreserv/cleanup.ksh
new file mode 100644
index 0000000000..28883bd3bd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/cleanup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "both"
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv.cfg b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv.cfg
new file mode 100644
index 0000000000..8c892db4a3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv.cfg
@@ -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
+#
+
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+export TESTFILE=testfile
diff --git a/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_001_pos.ksh
new file mode 100644
index 0000000000..f0f45ac70a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_001_pos.ksh
@@ -0,0 +1,75 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/refreserv/refreserv.cfg
+
+#
+# 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'.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_002_pos.ksh
new file mode 100644
index 0000000000..7a39a8dae8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_002_pos.ksh
@@ -0,0 +1,114 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/refreserv/refreserv.cfg
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_003_pos.ksh
new file mode 100644
index 0000000000..17382918e9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_003_pos.ksh
@@ -0,0 +1,77 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/refreserv/refreserv.cfg
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_004_pos.ksh
new file mode 100644
index 0000000000..8238573ef5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_004_pos.ksh
@@ -0,0 +1,90 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/refreserv/refreserv.cfg
+
+#
+# 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.
+#
+
+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 -i avail
+ avail=$(get_prop avail $subfs)
+ log_must $ZFS set refreservation=$avail $subfs
+ typeset mntpnt
+ mntpnt=$(get_prop mountpoint $subfs)
+ log_must $MKFILE $avail $mntpnt/$TESTFILE
+
+ typeset -i exceed
+ ((exceed = avail + 1))
+ log_mustnot $ZFS set refreservation=$exceed $subfs
+ log_mustnot $MKFILE $avail $mntpnt/$TESTFILE
+
+ log_must $ZFS set quota=none $ds
+ log_must $ZFS set reservation=15M $ds
+done
+
+log_pass "Verify refreservation is limited by available space."
diff --git a/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_005_pos.ksh
new file mode 100644
index 0000000000..5a3adbb5f7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/refreserv_005_pos.ksh
@@ -0,0 +1,71 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/refreserv/setup.ksh b/usr/src/test/zfs-tests/tests/functional/refreserv/setup.ksh
new file mode 100644
index 0000000000..e7d473bf7d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/refreserv/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "both"
+DISK=${DISKS%% *}
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/rename_dirs/Makefile b/usr/src/test/zfs-tests/tests/functional/rename_dirs/Makefile
new file mode 100644
index 0000000000..4be0143080
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rename_dirs/Makefile
@@ -0,0 +1,41 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/rename_dirs
+
+PROGS = cleanup \
+ rename_dirs_001_pos \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/rename_dirs/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/rename_dirs/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rename_dirs/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/rename_dirs/rename_dirs_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rename_dirs/rename_dirs_001_pos.ksh
new file mode 100644
index 0000000000..f84a2b657f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rename_dirs/rename_dirs_001_pos.ksh
@@ -0,0 +1,71 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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_DIRS &
+
+$SLEEP 500
+typeset -i retval=1
+$PGREP $RENAME_DIRS >/dev/null 2>&1
+retval=$?
+if (( $retval == 0 )); then
+ $PKILL -9 $RENAME_DIRS >/dev/null 2>&1
+fi
+
+log_pass "ZFS handle race directory rename operation as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/rename_dirs/setup.ksh b/usr/src/test/zfs-tests/tests/functional/rename_dirs/setup.ksh
new file mode 100644
index 0000000000..e620c2ec30
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rename_dirs/setup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/replacement/Makefile b/usr/src/test/zfs-tests/tests/functional/replacement/Makefile
new file mode 100644
index 0000000000..964c0eb3c4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/replacement/Makefile
@@ -0,0 +1,45 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/replacement
+
+PROGS = cleanup \
+ replacement_001_pos \
+ replacement_002_pos \
+ replacement_003_pos \
+ setup
+
+FILES = replacement.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/replacement/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/replacement/cleanup.ksh
new file mode 100644
index 0000000000..ec9c77f639
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/replacement/cleanup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/replacement/replacement.cfg b/usr/src/test/zfs-tests/tests/functional/replacement/replacement.cfg
new file mode 100644
index 0000000000..b2ba1b8851
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/replacement/replacement.cfg
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export TESTFILE=testfile
+export TESTFILE1=testfile1
+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 REPLACEFILE="sparedisk"
diff --git a/usr/src/test/zfs-tests/tests/functional/replacement/replacement_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/replacement/replacement_001_pos.ksh
new file mode 100644
index 0000000000..f874973f03
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/replacement/replacement_001_pos.ksh
@@ -0,0 +1,160 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/replacement/replacement.cfg
+
+#
+# DESCRIPTION:
+# Replacing disks during I/O should pass for supported pools.
+#
+# STRATEGY:
+# 1. Create multidisk pools (stripe/mirror/raidz) and
+# start some random I/O
+# 2. Replace a disk in the pool with anbother disk.
+# 3. Verify the integrity of the file system and the resilvering.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ if [[ -n "$child_pids" ]]; then
+ for wait_pid in $child_pids
+ do
+ $KILL $wait_pid
+ done
+ fi
+
+ if poolexists $TESTPOOL1; then
+ destroy_pool $TESTPOOL1
+ fi
+
+ [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/*
+}
+
+log_assert "Replacing a disk during I/O completes."
+
+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
+
+child_pids=""
+
+function replace_test
+{
+ typeset -i iters=2
+ typeset -i index=0
+ typeset opt=$1
+ typeset disk1=$2
+ typeset disk2=$3
+
+ typeset i=0
+ while [[ $i -lt $iters ]]; do
+ log_note "Invoking $FILE_TRUNC with: $options_display"
+ $FILE_TRUNC $options $TESTDIR/$TESTFILE.$i &
+ typeset pid=$!
+
+ $SLEEP 1
+ if ! $PS -p $pid > /dev/null 2>&1; then
+ log_fail "$FILE_TRUNC $options $TESTDIR/$TESTFILE.$i"
+ fi
+
+ child_pids="$child_pids $pid"
+ ((i = i + 1))
+ done
+
+ log_must $ZPOOL replace $opt $TESTPOOL1 $disk1 $disk2
+
+ $SLEEP 10
+
+ for wait_pid in $child_pids
+ do
+ $KILL $wait_pid
+ done
+ child_pids=""
+
+ log_must $ZPOOL export $TESTPOOL1
+ log_must $ZPOOL import -d $TESTDIR $TESTPOOL1
+ log_must $ZFS umount $TESTPOOL1/$TESTFS1
+ log_must $ZDB -cdui $TESTPOOL1/$TESTFS1
+ log_must $ZFS mount $TESTPOOL1/$TESTFS1
+
+}
+
+specials_list=""
+i=0
+while [[ $i != 2 ]]; do
+ $MKFILE 100m $TESTDIR/$TESTFILE1.$i
+ specials_list="$specials_list $TESTDIR/$TESTFILE1.$i"
+
+ ((i = i + 1))
+done
+
+#
+# Create a replacement disk special file.
+#
+$MKFILE 100m $TESTDIR/$REPLACEFILE
+
+for type in "" "raidz" "raidz1" "mirror"; do
+ for op in "" "-f"; do
+ create_pool $TESTPOOL1 $type $specials_list
+ log_must $ZFS create $TESTPOOL1/$TESTFS1
+ log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL1/$TESTFS1
+
+ replace_test "$opt" $TESTDIR/$TESTFILE1.1 $TESTDIR/$REPLACEFILE
+
+ $ZPOOL iostat -v $TESTPOOL1 | grep "$TESTDIR/$REPLACEFILE"
+ if [[ $? -ne 0 ]]; then
+ log_fail "$REPLACEFILE is not present."
+ fi
+
+ destroy_pool $TESTPOOL1
+ log_must $RM -rf /$TESTPOOL1
+ done
+done
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/replacement/replacement_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/replacement/replacement_002_pos.ksh
new file mode 100644
index 0000000000..634b677ae3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/replacement/replacement_002_pos.ksh
@@ -0,0 +1,177 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/replacement/replacement.cfg
+
+#
+# DESCRIPTION:
+# Attaching disks during I/O should pass for supported pools.
+#
+# STRATEGY:
+# 1. Create multidisk pools (stripe/mirror/raidz) and
+# start some random I/O
+# 2. Attach a disk to the pool.
+# 3. Verify the integrity of the file system and the resilvering.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ if [[ -n "$child_pids" ]]; then
+ for wait_pid in $child_pids
+ do
+ $KILL $wait_pid
+ done
+ fi
+
+ if poolexists $TESTPOOL1; then
+ destroy_pool $TESTPOOL1
+ fi
+
+ [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/*
+}
+
+log_assert "Replacing a disk during I/O completes."
+
+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
+
+child_pids=""
+
+function attach_test
+{
+ typeset -i iters=2
+ typeset -i index=0
+ typeset opt=$1
+ typeset disk1=$2
+ typeset disk2=$3
+
+ typeset i=0
+ while [[ $i -lt $iters ]]; do
+ log_note "Invoking $FILE_TRUNC with: $options_display"
+ $FILE_TRUNC $options $TESTDIR/$TESTFILE.$i &
+ typeset pid=$!
+
+ $SLEEP 1
+ if ! $PS -p $pid > /dev/null 2>&1; then
+ log_fail "$FILE_TRUNC $options $TESTDIR/$TESTFILE.$i"
+ fi
+
+ child_pids="$child_pids $pid"
+ ((i = i + 1))
+ done
+
+ log_must $ZPOOL attach $opt $TESTPOOL1 $disk1 $disk2
+
+ $SLEEP 10
+
+ for wait_pid in $child_pids
+ do
+ $KILL $wait_pid
+ done
+ child_pids=""
+
+ log_must $ZPOOL export $TESTPOOL1
+ log_must $ZPOOL import -d $TESTDIR $TESTPOOL1
+ log_must $ZFS umount $TESTPOOL1/$TESTFS1
+ log_must $ZDB -cdui $TESTPOOL1/$TESTFS1
+ log_must $ZFS mount $TESTPOOL1/$TESTFS1
+
+}
+
+specials_list=""
+i=0
+while [[ $i != 2 ]]; do
+ $MKFILE 100m $TESTDIR/$TESTFILE1.$i
+ specials_list="$specials_list $TESTDIR/$TESTFILE1.$i"
+
+ ((i = i + 1))
+done
+
+#
+# Create a replacement disk special file.
+#
+$MKFILE 100m $TESTDIR/$REPLACEFILE
+
+for op in "" "-f"; do
+ create_pool $TESTPOOL1 mirror $specials_list
+ log_must $ZFS create $TESTPOOL1/$TESTFS1
+ log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL1/$TESTFS1
+
+ attach_test "$opt" $TESTDIR/$TESTFILE1.1 $TESTDIR/$REPLACEFILE
+
+ $ZPOOL iostat -v $TESTPOOL1 | grep "$TESTDIR/$REPLACEFILE"
+ if [[ $? -ne 0 ]]; then
+ log_fail "$REPLACEFILE is not present."
+ fi
+
+ destroy_pool $TESTPOOL1
+done
+
+log_note "Verify 'zpool attach' fails with non-mirrors."
+
+for type in "" "raidz" "raidz1"; do
+ for op in "" "-f"; do
+ create_pool $TESTPOOL1 $type $specials_list
+ log_must $ZFS create $TESTPOOL1/$TESTFS1
+ log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL1/$TESTFS1
+
+ log_mustnot $ZPOOL attach "$opt" $TESTDIR/$TESTFILE1.1 \
+ $TESTDIR/$REPLACEFILE
+
+ $ZPOOL iostat -v $TESTPOOL1 | grep "$TESTDIR/$REPLACEFILE"
+ if [[ $? -eq 0 ]]; then
+ log_fail "$REPLACEFILE should not be present."
+ fi
+
+ destroy_pool $TESTPOOL1
+ done
+done
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/replacement/replacement_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/replacement/replacement_003_pos.ksh
new file mode 100644
index 0000000000..80d1dd1226
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/replacement/replacement_003_pos.ksh
@@ -0,0 +1,164 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/replacement/replacement.cfg
+
+#
+# DESCRIPTION:
+# Detaching disks during I/O should pass for supported pools.
+#
+# STRATEGY:
+# 1. Create multidisk pools (stripe/mirror/raidz) and
+# start some random I/O
+# 2. Detach a disk from the pool.
+# 3. Verify the integrity of the file system and the resilvering.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ if [[ -n "$child_pids" ]]; then
+ for wait_pid in $child_pids
+ do
+ $KILL $wait_pid
+ done
+ fi
+
+ if poolexists $TESTPOOL1; then
+ destroy_pool $TESTPOOL1
+ fi
+
+ [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/*
+}
+
+log_assert "Replacing a disk during I/O completes."
+
+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 "
+
+ptions="$options -r "
+
+[[ -n "$options" ]] && options_display=$options
+
+child_pids=""
+
+function detach_test
+{
+ typeset -i iters=2
+ typeset -i index=0
+ typeset disk1=$1
+
+ typeset i=0
+ while [[ $i -lt $iters ]]; do
+ log_note "Invoking $FILE_TRUNC with: $options_display"
+ $FILE_TRUNC $options $TESTDIR/$TESTFILE.$i &
+ typeset pid=$!
+
+ $SLEEP 1
+ if ! $PS -p $pid > /dev/null 2>&1; then
+ log_fail "$FILE_TRUNC $options $TESTDIR/$TESTFILE.$i"
+ fi
+
+ child_pids="$child_pids $pid"
+ ((i = i + 1))
+ done
+
+ log_must $ZPOOL detach $TESTPOOL1 $disk1
+
+ $SLEEP 10
+
+ for wait_pid in $child_pids
+ do
+ $KILL $wait_pid
+ done
+ child_pids=""
+
+ log_must $ZPOOL export $TESTPOOL1
+ log_must $ZPOOL import -d $TESTDIR $TESTPOOL1
+ log_must $ZFS umount $TESTPOOL1/$TESTFS1
+ log_must $ZDB -cdui $TESTPOOL1/$TESTFS1
+ log_must $ZFS mount $TESTPOOL1/$TESTFS1
+}
+
+specials_list=""
+i=0
+while [[ $i != 2 ]]; do
+ $MKFILE 100m $TESTDIR/$TESTFILE1.$i
+ specials_list="$specials_list $TESTDIR/$TESTFILE1.$i"
+
+ ((i = i + 1))
+done
+
+create_pool $TESTPOOL1 mirror $specials_list
+log_must $ZFS create $TESTPOOL1/$TESTFS1
+log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL1/$TESTFS1
+
+detach_test $TESTDIR/$TESTFILE1.1
+
+$ZPOOL iostat -v $TESTPOOL1 | grep "$TESTDIR/$TESTFILE1.1"
+if [[ $? -eq 0 ]]; then
+ log_fail "$TESTFILE1.1 should no longer be present."
+fi
+
+destroy_pool $TESTPOOL1
+
+log_note "Verify 'zpool detach' fails with non-mirrors."
+
+for type in "" "raidz" "raidz1" ; do
+ create_pool $TESTPOOL1 $type $specials_list
+ log_must $ZFS create $TESTPOOL1/$TESTFS1
+ log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL1/$TESTFS1
+
+ log_mustnot $ZPOOL detach $TESTDIR/$TESTFILE1.1
+
+ $ZPOOL iostat -v $TESTPOOL1 | grep "$TESTDIR/$TESTFILE1.1"
+ if [[ $? -ne 0 ]]; then
+ log_fail "$TESTFILE1.1 is not present."
+ fi
+
+ destroy_pool $TESTPOOL1
+done
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/replacement/setup.ksh b/usr/src/test/zfs-tests/tests/functional/replacement/setup.ksh
new file mode 100644
index 0000000000..a7e73b4c59
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/replacement/setup.ksh
@@ -0,0 +1,47 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+verify_disk_count "$DISKS" 2
+
+index=`expr $RANDOM % 2`
+case $index in
+0) log_note "Pool Type: Mirror"
+ default_mirror_setup $DISKS
+ ;;
+1) log_note "Pool Type: RAID-Z"
+ default_raidz_setup $DISKS
+ ;;
+esac
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/Makefile b/usr/src/test/zfs-tests/tests/functional/reservation/Makefile
new file mode 100644
index 0000000000..6a0d949f93
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/Makefile
@@ -0,0 +1,64 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/reservation
+
+PROGS = cleanup \
+ reservation_001_pos \
+ reservation_002_pos \
+ reservation_003_pos \
+ reservation_004_pos \
+ reservation_005_pos \
+ reservation_006_pos \
+ reservation_007_pos \
+ reservation_008_pos \
+ reservation_009_pos \
+ reservation_010_pos \
+ reservation_011_pos \
+ reservation_012_pos \
+ reservation_013_pos \
+ reservation_014_pos \
+ reservation_015_pos \
+ reservation_016_pos \
+ reservation_017_pos \
+ reservation_018_pos \
+ setup
+
+FILES = reservation.cfg \
+ reservation.shlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.sh
+ $(INS.rename)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/reservation/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/reservation.cfg b/usr/src/test/zfs-tests/tests/functional/reservation/reservation.cfg
new file mode 100644
index 0000000000..c12ad072cd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation.cfg
@@ -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
+#
+
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+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 BLOCK_SIZE=1048576
+export ENOSPC=28
+
+export TESTVOL=testvol$$
+export TESTVOL2=testvol2-$$
+export TESTFILE1=file1.$$
+export TESTFILE2=file2.$$
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/reservation.shlib b/usr/src/test/zfs-tests/tests/functional/reservation/reservation.shlib
new file mode 100644
index 0000000000..e58e198152
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation.shlib
@@ -0,0 +1,201 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/reservation/reservation.cfg
+
+#
+# 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
+
+ resv_val=`$ZFS get -H reservation $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 reservation $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 #<largest_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
+}
+
+#
+# This function is a copy of a function by the same name in libzfs_dataset.c
+# Its purpose is to reserve additional space for volume metadata so volumes
+# don't unexpectedly run out of room.
+#
+# Note: This function can be used to do an estimate for a volume that has not
+# yet been created. In this case, $vol is not a volume, but rather a pool in
+# which a volume is going to be created. In this case, use default properties.
+#
+function volsize_to_reservation
+{
+ typeset vol=$1
+ typeset -i volsize=$2
+
+ typeset -i DN_MAX_INDBLKSHIFT=14
+ typeset -i SPA_BLKPTRSHIFT=7
+ typeset -i SPA_DVAS_PER_BP=3
+
+ typeset -i DNODES_PER_LEVEL_SHIFT=$((DN_MAX_INDBLKSHIFT - \
+ SPA_BLKPTRSHIFT))
+ typeset -i DNODES_PER_LEVEL=$((1 << $DNODES_PER_LEVEL_SHIFT))
+
+ if ds_is_volume $vol; then
+ typeset -i ncopies=$(get_prop copies $vol)
+ typeset -i volblocksize=$(get_prop volblocksize $vol)
+ else
+ typeset -i ncopies=1
+ typeset -i volblocksize=8192
+ fi
+ typeset -i nblocks=$((volsize / volblocksize))
+
+ typeset -i numdb=7
+ while ((nblocks > 1)); do
+ ((nblocks += DNODES_PER_LEVEL - 1))
+ ((nblocks /= DNODES_PER_LEVEL))
+ ((numdb += nblocks))
+ done
+
+ ((numdb *= SPA_DVAS_PER_BP < ncopies + 1 ? SPA_DVAS_PER_BP : \
+ ncopies + 1))
+ ((volsize *= ncopies))
+ ((numdb *= 1 << DN_MAX_INDBLKSHIFT))
+ ((volsize += numdb))
+ echo $volsize
+}
+
+#
+# This function takes a pool name as an argument, and returns the largest (give
+# or take some slop) -V value that can be used to create a volume in that pool.
+# This is necessary because during volume creation, a reservation is created
+# that will be larger than the value specified with -V, and potentially larger
+# than the available space in the pool. See volsize_to_reservation().
+#
+function largest_volsize_from_pool
+{
+ typeset pool=$1
+ typeset -i poolsize=$(get_prop available $pool)
+ typeset -i volsize=$poolsize
+ typeset -i nvolsize
+
+ while :; do
+ # knock 50M off the volsize each time through
+ ((volsize -= 50 * 1024 * 1024))
+ nvolsize=$(volsize_to_reservation $pool $volsize)
+ nvolsize=$(floor_volsize $nvolsize)
+ ((nvolsize < poolsize)) && break
+ done
+ echo $volsize
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/reservation_001_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_001_pos.sh
new file mode 100644
index 0000000000..f3ac0c8e5f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_001_pos.sh
@@ -0,0 +1,124 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ for obj in $OBJ_LIST; do
+ datasetexists $obj && log_must $ZFS destroy -f $obj
+ done
+}
+
+log_onexit cleanup
+
+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
+ log_must $ZFS set refreservation=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 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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_002_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_002_pos.sh
new file mode 100644
index 0000000000..2f3a38b5ea
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_002_pos.sh
@@ -0,0 +1,108 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ for obj in $OBJ_LIST; do
+ datasetexists $obj && log_must $ZFS destroy -f $obj
+ done
+
+ log_must zero_reservation $TESTPOOL/$TESTFS
+}
+
+log_onexit cleanup
+
+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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_003_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_003_pos.sh
new file mode 100644
index 0000000000..10c6835cc8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_003_pos.sh
@@ -0,0 +1,134 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Verify it is possible to set reservations multiple times " \
+ "on a filesystem regular and sparse volume"
+
+function cleanup
+{
+ log_must zero_reservation $TESTPOOL/$TESTFS
+
+ for obj in $OBJ_LIST; do
+ datasetexists $obj && log_must $ZFS destroy -f $obj
+ done
+}
+
+log_onexit cleanup
+
+
+#
+# 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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_004_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_004_pos.sh
new file mode 100644
index 0000000000..1280601e21
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_004_pos.sh
@@ -0,0 +1,124 @@
+#!/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+function cleanup {
+
+ for obj in $OBJ_LIST; do
+ datasetexists $obj && log_must $ZFS destroy -f $obj
+ done
+}
+
+log_assert "Verify space released when a dataset with reservation is destroyed"
+
+log_onexit cleanup
+
+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
+ log_must $ZFS set refreservation=none $TESTPOOL/$TESTVOL
+ 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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_005_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_005_pos.sh
new file mode 100644
index 0000000000..8a129a3151
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_005_pos.sh
@@ -0,0 +1,118 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Verify space released when reservation on a dataset is set "\
+ "to 'none'"
+
+function cleanup
+{
+ for obj in $OBJ_LIST; do
+ datasetexists $obj && log_must $ZFS destroy -f $obj
+ done
+}
+
+log_onexit cleanup
+
+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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_006_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_006_pos.sh
new file mode 100644
index 0000000000..a788c31624
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_006_pos.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ [[ -e $TESTDIR/$TESTFILE1 ]] && log_must $RM -rf $TESTDIR/$TESTFILE1
+ log_must $ZFS set reservation=none $TESTPOOL/$TESTFS
+}
+
+log_onexit cleanup
+
+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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_007_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_007_pos.sh
new file mode 100644
index 0000000000..c7b30ae132
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_007_pos.sh
@@ -0,0 +1,128 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+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"
+
+function cleanup
+{
+ datasetexists $TESTPOOL/$TESTFS2 && \
+ log_must $ZFS destroy -f $TESTPOOL/$TESTFS2
+
+ datasetexists $TESTPOOL/$TESTFS1 && \
+ log_must $ZFS destroy -f $TESTPOOL/$TESTFS1
+}
+
+log_onexit cleanup
+
+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
+# paramater.
+#
+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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_008_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_008_pos.sh
new file mode 100644
index 0000000000..9d2c456548
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_008_pos.sh
@@ -0,0 +1,124 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Verify reducing reservation allows other datasets to use space"
+
+function cleanup
+{
+ typeset -i loop=0
+ while (($loop < $RESV_NUM_FS)); do
+ datasetexists $TESTPOOL/${TESTFS}$loop && \
+ log_must $ZFS destroy -f $TESTPOOL/${TESTFS}$loop
+
+ [[ -d ${TESTDIR}$loop ]] && log_must $RM -r ${TESTDIR}$loop
+
+ ((loop = loop + 1))
+ done
+}
+
+log_onexit cleanup
+
+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 $PAGESIZE \
+ -c 1000 -d 0
+
+log_pass "reducing reservation allows other datasets to use space"
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/reservation_009_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_009_pos.sh
new file mode 100644
index 0000000000..f75c85c7ba
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_009_pos.sh
@@ -0,0 +1,100 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Setting top level dataset reservation to 'none' allows more data "
+ "to be written to top level filesystem"
+
+function cleanup
+{
+ log_must $RM -rf $TESTDIR/$TESTFILE1
+ log_must $RM -rf $TESTDIR/$TESTFILE2
+ log_must $ZFS destroy -f $TESTPOOL/$TESTFS1
+}
+
+log_onexit cleanup
+
+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 $PAGESIZE \
+ -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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_010_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_010_pos.sh
new file mode 100644
index 0000000000..e47ad0e178
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_010_pos.sh
@@ -0,0 +1,101 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Destroying top level filesystem with reservation allows more " \
+ "data to be written to another top level filesystem"
+
+function cleanup
+{
+ datasetexists $TESTPOOL/$TESTFS1 && \
+ log_must $ZFS destroy $TESTPOOL/$TESTFS1
+
+ [[ -e $TESTDIR/$TESTFILE1 ]] && log_must $RM -rf $TESTDIR/$TESTFILE1
+ [[ -e $TESTDIR/$TESTFILE2 ]] && log_must $RM -rf $TESTDIR/$TESTFILE2
+}
+
+log_onexit cleanup
+
+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 $PAGESIZE \
+ -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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_011_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_011_pos.sh
new file mode 100644
index 0000000000..b2c350400f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_011_pos.sh
@@ -0,0 +1,75 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Verify reservation settings do not affect quota settings"
+
+function cleanup
+{
+ log_must zero_reservation $TESTPOOL/$TESTFS
+}
+
+log_onexit cleanup
+
+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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_012_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_012_pos.sh
new file mode 100644
index 0000000000..5ca3a51c9a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_012_pos.sh
@@ -0,0 +1,88 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Verify reservations protect space"
+
+function cleanup
+{
+ log_must $ZFS destroy -f $TESTPOOL/$TESTFS2
+ log_must zero_reservation $TESTPOOL/$TESTFS
+
+ [[ -e $TESTDIR/$TESTFILE2 ]] && log_must $RM -rf $TESTDIR/$TESTFILE2
+ [[ -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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_013_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_013_pos.sh
new file mode 100644
index 0000000000..b72d852a8b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_013_pos.sh
@@ -0,0 +1,112 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+log_assert "Reservation properties preserved across exports and imports"
+
+function cleanup
+{
+ for obj in $OBJ_LIST; do
+ datasetexists $obj && log_must $ZFS destroy -f $obj
+ done
+
+ log_must zero_reservation $TESTPOOL/$TESTFS
+}
+log_onexit cleanup
+
+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 / 5))
+resv_set=$(floor_volsize $resv_set)
+((sparse_vol_set_size = space_avail * 5))
+sparse_vol_set_size=$(floor_volsize $sparse_vol_set_size)
+
+# When initially created, a regular volume's reservation property is set
+# equal to its size (unlike a sparse volume), so we don't need to set it
+# explictly later on
+log_must $ZFS create -V $resv_set $TESTPOOL/$TESTVOL
+log_must $ZFS create -s -V $sparse_vol_set_size $TESTPOOL/$TESTVOL2
+
+log_must $ZFS set reservation=$resv_set $TESTPOOL/$TESTFS
+log_must $ZFS set reservation=$resv_set $TESTPOOL/$TESTFS1
+log_must $ZFS set reservation=$resv_set $TESTPOOL/$TESTFS1/$TESTFS2
+log_must $ZFS set reservation=$resv_set $TESTPOOL/$TESTVOL2
+
+log_must $ZPOOL export $TESTPOOL
+log_must $ZPOOL import $TESTPOOL
+
+for obj in $TESTPOOL/$TESTFS $OBJ_LIST; do
+
+ if [[ $obj == $TESTPOOL/$TESTVOL ]]; then
+ expected=$(volsize_to_reservation $obj $resv_set)
+ found=$(get_prop refreservation $obj)
+ else
+ expected=$resv_set
+ found=$(get_prop reservation $obj)
+ fi
+
+ [[ $found != $expected ]] && \
+ log_fail "Reservation property for $obj incorrect. Expected " \
+ "$expected but got $found."
+done
+
+log_pass "Reservation properties preserved across exports and imports"
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/reservation_014_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_014_pos.sh
new file mode 100644
index 0000000000..7ee7356725
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_014_pos.sh
@@ -0,0 +1,123 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+log_assert "Verify cannot set reservation larger than quota"
+
+function cleanup
+{
+ #
+ # Note we don't destroy $TESTFS as it's used by other tests
+ for obj in $OBJ_LIST ; do
+ datasetexists $obj && log_must $ZFS destroy -f $obj
+ done
+
+ log_must zero_reservation $TESTPOOL/$TESTFS
+}
+log_onexit cleanup
+
+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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_015_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_015_pos.sh
new file mode 100644
index 0000000000..73ea904159
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_015_pos.sh
@@ -0,0 +1,99 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+log_assert "Setting volume reservation to 'none' allows more data to be " \
+ "written to top level filesystem"
+
+function cleanup
+{
+ datasetexists $TESTPOOL/$TESTVOL && \
+ log_must $ZFS destroy $TESTPOOL/$TESTVOL
+
+ [[ -e $TESTDIR/$TESTFILE1 ]] && log_must $RM -rf $TESTDIR/$TESTFILE1
+ [[ -e $TESTDIR/$TESTFILE2 ]] && log_must $RM -rf $TESTDIR/$TESTFILE2
+}
+log_onexit cleanup
+
+space_avail=$(largest_volsize_from_pool $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.
+#
+((resv_size_set = space_avail - RESV_FREE_SPACE))
+resv_size_set=$(floor_volsize $resv_size_set)
+
+log_must $ZFS create -V $resv_size_set $TESTPOOL/$TESTVOL
+
+space_avail_still=`get_prop available $TESTPOOL`
+
+fill_size=$((space_avail_still + $RESV_TOLERANCE))
+write_count=$((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 $PAGESIZE \
+ -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/usr/src/test/zfs-tests/tests/functional/reservation/reservation_016_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_016_pos.sh
new file mode 100644
index 0000000000..ec47432b5f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_016_pos.sh
@@ -0,0 +1,98 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+log_assert "Destroying a regular volume with reservation allows more data to" \
+ " be written to top level filesystem"
+
+function cleanup
+{
+ datasetexists $TESTPOOL/$TESTVOL && \
+ log_must $ZFS destroy $TESTPOOL/$TESTVOL
+
+ [[ -e $TESTDIR/$TESTFILE1 ]] && log_must $RM -rf $TESTDIR/$TESTFILE1
+ [[ -e $TESTDIR/$TESTFILE2 ]] && log_must $RM -rf $TESTDIR/$TESTFILE2
+}
+log_onexit cleanup
+
+space_avail=$(largest_volsize_from_pool $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 - RESV_FREE_SPACE))
+vol_set_size=$(floor_volsize $vol_set_size)
+
+# Creating a regular volume implicitly sets its reservation
+# property to the same value.
+log_must $ZFS create -V $vol_set_size $TESTPOOL/$TESTVOL
+
+space_avail_still=$(get_prop available $TESTPOOL)
+fill_size=$((space_avail_still + $RESV_TOLERANCE))
+write_count=$((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 $PAGESIZE \
+ -c 1000 -d 0
+
+log_pass "Destroying volume with reservation allows more data to be written " \
+ "to top level filesystem"
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/reservation_017_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_017_pos.sh
new file mode 100644
index 0000000000..b1a4007b3c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_017_pos.sh
@@ -0,0 +1,101 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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 sizes on the regular and sparse volumes
+# 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'
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ typeset vol
+
+ for vol in $regvol $sparsevol; do
+ datasetexists $vol && log_must $ZFS destroy $vol
+ done
+}
+log_onexit cleanup
+
+log_assert "Verify that the volsize changes of sparse volumes are not " \
+ "reflected in the reservation."
+log_onexit cleanup
+
+# Create a regular and sparse volume for testing.
+regvol=$TESTPOOL/$TESTVOL
+sparsevol=$TESTPOOL/$TESTVOL2
+log_must $ZFS create -V 64M $regvol
+log_must $ZFS create -s -V 64M $sparsevol
+
+typeset -i vsize=$(get_prop available $TESTPOOL)
+typeset -i iterate=10
+typeset -i regreserv
+typeset -i sparsereserv
+typeset -i volblocksize=$(get_prop volblocksize $regvol)
+typeset -i blknum=0
+typeset -i randomblknum
+((blknum = vsize / volblocksize))
+
+while ((iterate > 1)); do
+ ((randomblknum = 1 + RANDOM % blknum))
+ # Make sure volsize is a multiple of volume block size
+ ((vsize = randomblknum * volblocksize))
+ log_must $ZFS set volsize=$vsize $regvol
+ log_must $ZFS set volsize=$vsize $sparsevol
+ vsize=$(volsize_to_reservation $regvol $vsize)
+ regreserv=$(get_prop refreservation $regvol)
+ sparsereserv=$(get_prop reservation $sparsevol)
+ ((sparsereserv == vsize)) && \
+ log_fail "volsize changes of sparse volume is reflected in " \
+ "reservation (expected $vsize, got $sparsereserv)."
+ ((regreserv != vsize)) && \
+ log_fail "volsize changes of regular volume is not reflected " \
+ "in reservation (expected $vsize, got $regreserv)."
+ ((iterate = iterate - 1))
+done
+
+log_pass "The volsize changes of sparse volumes are not reflected in the " \
+ "reservation"
diff --git a/usr/src/test/zfs-tests/tests/functional/reservation/reservation_018_pos.sh b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_018_pos.sh
new file mode 100644
index 0000000000..297c50ebc4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/reservation_018_pos.sh
@@ -0,0 +1,72 @@
+#!/usr/bin/bash -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/reservation/reservation.shlib
+
+#
+# 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.
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ datasetexists $fs_child && log_must $ZFS destroy $fs_child
+ log_must $ZFS set reservation=$reserv_val $fs
+}
+
+log_onexit cleanup
+
+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/usr/src/test/zfs-tests/tests/functional/reservation/setup.ksh b/usr/src/test/zfs-tests/tests/functional/reservation/setup.ksh
new file mode 100644
index 0000000000..c711dbea4c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/reservation/setup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_setup_noexit ${DISKS%% *}
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/rootpool/Makefile b/usr/src/test/zfs-tests/tests/functional/rootpool/Makefile
new file mode 100644
index 0000000000..a752186cbd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rootpool/Makefile
@@ -0,0 +1,43 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/rootpool
+
+PROGS = cleanup \
+ rootpool_002_neg \
+ rootpool_003_neg \
+ rootpool_007_neg \
+ setup
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/rootpool/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/rootpool/cleanup.ksh
new file mode 100644
index 0000000000..c3593bf2d9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rootpool/cleanup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_002_neg.ksh
new file mode 100644
index 0000000000..90f38baedb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_002_neg.ksh
@@ -0,0 +1,68 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+log_assert "zpool/zfs destory <rootpool> should return error"
+
+typeset rootpool=$(get_rootpool)
+typeset tmpfile="/tmp/mounted-datasets.$$"
+
+# Collect the currently mounted ZFS filesystems, so that we can repair any
+# damage done by the attempted pool destroy. The destroy itself should fail, but
+# some filesystems can become unmounted in the process, and aren't automatically
+# remounted.
+$MOUNT -p | $AWK '{if ($4 == "zfs") print $1" "$3}' > $tmpfile
+
+log_mustnot $ZPOOL destroy $rootpool
+
+# Remount any filesystems that the destroy attempt unmounted.
+while read ds mntpt; do
+ mounted $ds || log_must $MOUNT -Fzfs $ds $mntpt
+done < $tmpfile
+$RM -f $tmpfile
+
+log_mustnot $ZFS destroy $rootpool
+
+log_pass "rootpool can not be destroyed"
diff --git a/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_003_neg.ksh
new file mode 100644
index 0000000000..b1c69bc68d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_003_neg.ksh
@@ -0,0 +1,61 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# system related filesystems can not be renamed or destroyed
+#
+# STRATEGY:
+#
+# 1) check if the current system is installed as zfs rootfs
+# 2) get the rootfs
+# 3) try to rename the rootfs to some newfs, which should fail.
+# 4) try to destroy the rootfs, which should fail.
+# 5) try to destroy the rootfs with -f which should fail
+# 6) try to destroy the rootfs with -fR which should fail
+#
+
+verify_runnable "global"
+log_assert "system related filesytems can not be renamed or destroyed"
+
+typeset rootpool=$(get_rootpool)
+typeset rootfs=$(get_rootfs)
+
+log_mustnot $ZFS rename $rootfs $rootpool/newfs
+log_mustnot $ZFS rename -f $rootfs $rootpool/newfs
+
+log_mustnot $ZFS destroy $rootfs
+log_mustnot $ZFS destroy -f $rootfs
+
+log_pass "system related filesystems can not be renamed or destroyed"
diff --git a/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_007_neg.ksh
new file mode 100644
index 0000000000..a676a67872
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rootpool/rootpool_007_neg.ksh
@@ -0,0 +1,70 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rootpool/setup.ksh b/usr/src/test/zfs-tests/tests/functional/rootpool/setup.ksh
new file mode 100644
index 0000000000..15e927cdb7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rootpool/setup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/Makefile b/usr/src/test/zfs-tests/tests/functional/rsend/Makefile
new file mode 100644
index 0000000000..1d238a0d55
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/Makefile
@@ -0,0 +1,56 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/rsend
+
+PROGS = cleanup \
+ rsend_001_pos \
+ rsend_002_pos \
+ rsend_003_pos \
+ rsend_004_pos \
+ rsend_005_pos \
+ rsend_006_pos \
+ rsend_007_pos \
+ rsend_008_pos \
+ rsend_009_pos \
+ rsend_010_pos \
+ rsend_011_pos \
+ rsend_012_pos \
+ rsend_013_pos \
+ setup
+
+FILES = rsend.cfg \
+ rsend.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/cleanup.ksh
new file mode 100644
index 0000000000..a13ea7e814
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/cleanup.ksh
@@ -0,0 +1,53 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+verify_runnable "both"
+
+#
+# Check if the system support 'send -R'
+#
+$ZFS send 2>&1 | $GREP "\[-[a-zA-Z]*R[a-zA-Z]*\]" >/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/usr/src/test/zfs-tests/tests/functional/rsend/rsend.cfg b/usr/src/test/zfs-tests/tests/functional/rsend/rsend.cfg
new file mode 100644
index 0000000000..24304075f8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend.cfg
@@ -0,0 +1,37 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+export BACKDIR=${TEST_BASE_DIR%%/}/backdir-rsend
+
+export DISK1=$($ECHO $DISKS | $AWK '{print $1}')
+export DISK2=$($ECHO $DISKS | $AWK '{print $2}')
+
+export POOL=$TESTPOOL
+export POOL2=$TESTPOOL1
+export FS=$TESTFS
diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/rsend.kshlib b/usr/src/test/zfs-tests/tests/functional/rsend/rsend.kshlib
new file mode 100644
index 0000000000..0a856cfe97
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend.kshlib
@@ -0,0 +1,376 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/rsend/rsend.cfg
+
+#
+# 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
+ echo $?
+}
+
+#
+# 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" \
+ "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}')
+ if ! is_te_enabled ; then
+ fs_prop=$(echo $fs_prop | $GREP -v "mlslabel")
+ fi
+ else
+ fs_prop=$($ZFS inherit 2>&1 | \
+ $AWK '$2=="YES" && $3=="YES" {print $1}'|
+ $EGREP -v "devices|mlslabel|sharenfs|sharesmb|zoned")
+ fi
+
+ $ECHO $fs_prop
+}
+
+#
+# Output inherited properties for volume
+#
+function vol_inherit_prop
+{
+ $ECHO "checksum readonly"
+}
+
+#
+# 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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_001_pos.ksh
new file mode 100644
index 0000000000..6087dd3ef0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_001_pos.ksh
@@ -0,0 +1,73 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_002_pos.ksh
new file mode 100644
index 0000000000..9a495d3529
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_002_pos.ksh
@@ -0,0 +1,93 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_003_pos.ksh
new file mode 100644
index 0000000000..85d789de5b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_003_pos.ksh
@@ -0,0 +1,95 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_004_pos.ksh
new file mode 100644
index 0000000000..18cdac379f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_004_pos.ksh
@@ -0,0 +1,120 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_005_pos.ksh
new file mode 100644
index 0000000000..154072d70a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_005_pos.ksh
@@ -0,0 +1,104 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_006_pos.ksh
new file mode 100644
index 0000000000..78f3d26bcb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_006_pos.ksh
@@ -0,0 +1,82 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_007_pos.ksh
new file mode 100644
index 0000000000..b057953ed6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_007_pos.ksh
@@ -0,0 +1,99 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_008_pos.ksh
new file mode 100644
index 0000000000..de5543e7cc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_008_pos.ksh
@@ -0,0 +1,128 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# DESCRIPTION:
+# Changes made by 'zfs promote' can be properly received.
+#
+# STRATEGY:
+# 1. Seperatly 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_009_pos.ksh
new file mode 100644
index 0000000000..0e6fcf1323
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_009_pos.ksh
@@ -0,0 +1,94 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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.
+#
+
+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 $MKFILE 100M $TESTDIR/bfile
+log_must $MKFILE 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 $MKFILE 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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_010_pos.ksh
new file mode 100644
index 0000000000..503a8c224e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_010_pos.ksh
@@ -0,0 +1,77 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_011_pos.ksh
new file mode 100644
index 0000000000..d771a83369
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_011_pos.ksh
@@ -0,0 +1,125 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ export __ZFS_POOL_RESTRICT="$POOL $POOL2"
+ log_must $ZFS unmount -a
+ unset __ZFS_POOL_RESTRICT
+ 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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_012_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_012_pos.ksh
new file mode 100644
index 0000000000..4a590fab48
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_012_pos.ksh
@@ -0,0 +1,201 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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
+#
+
+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
+ if [[ $item == "mlslabel" ]] && \
+ ! is_te_enabled ; then
+ continue
+ fi
+ $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/usr/src/test/zfs-tests/tests/functional/rsend/rsend_013_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_013_pos.ksh
new file mode 100644
index 0000000000..fefcfa7c39
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_013_pos.ksh
@@ -0,0 +1,86 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/rsend/setup.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/setup.ksh
new file mode 100644
index 0000000000..fbecf9b828
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/rsend/setup.ksh
@@ -0,0 +1,53 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/rsend/rsend.kshlib
+
+verify_runnable "both"
+verify_disk_count "$DISKS" 2
+
+#
+# Check if the system support 'send -R'
+#
+$ZFS send 2>&1 | $GREP "\[-[a-zA-Z]*R[a-zA-Z]*\]" >/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/usr/src/test/zfs-tests/tests/functional/scrub_mirror/Makefile b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/Makefile
new file mode 100644
index 0000000000..8833d90e91
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/Makefile
@@ -0,0 +1,47 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/scrub_mirror
+
+PROGS = cleanup \
+ scrub_mirror_001_pos \
+ scrub_mirror_002_pos \
+ scrub_mirror_003_pos \
+ scrub_mirror_004_pos \
+ setup
+
+FILES = default.cfg \
+ scrub_mirror_common.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/scrub_mirror/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/cleanup.ksh
new file mode 100644
index 0000000000..af46b0b2d8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/cleanup.ksh
@@ -0,0 +1,50 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/scrub_mirror/default.cfg
+
+
+verify_runnable "global"
+
+$DF -F 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/usr/src/test/zfs-tests/tests/functional/scrub_mirror/default.cfg b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/default.cfg
new file mode 100644
index 0000000000..37e1b248de
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/default.cfg
@@ -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
+#
+
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+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}s0
+ SIDE_SECONDARY=${SINGLE_DISK}s1
+else
+ SIDE_PRIMARY=${MIRROR_PRIMARY}s0
+ SIDE_SECONDARY=${MIRROR_SECONDARY}s0
+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 DD_BLOCK=$(( 64 * 1024 ))
+export DD_COUNT=$(( MIRROR_MEGS * 1024 * 1024 / DD_BLOCK ))
diff --git a/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_001_pos.ksh
new file mode 100644
index 0000000000..11677f9c3b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_001_pos.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/scrub_mirror/scrub_mirror_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_002_pos.ksh
new file mode 100644
index 0000000000..b94360a6a9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_002_pos.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/scrub_mirror/scrub_mirror_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_003_pos.ksh
new file mode 100644
index 0000000000..690b4043a5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_003_pos.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/scrub_mirror/scrub_mirror_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_004_pos.ksh
new file mode 100644
index 0000000000..aa2aed0ec6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_004_pos.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/scrub_mirror/scrub_mirror_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_common.kshlib b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_common.kshlib
new file mode 100644
index 0000000000..2864389da2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/scrub_mirror_common.kshlib
@@ -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
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+. $STF_SUITE/tests/functional/scrub_mirror/default.cfg
+
+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
+
+ while (( atfile < FILE_COUNT )); do
+ files[$atfile]=$TESTDIR/file.$atfile
+ log_must $FILE_WRITE -o create -f $TESTDIR/file.$atfile \
+ -b $FILE_SIZE -c 1
+ cksums[$atfile]=$($CKSUM ${files[$atfile]})
+ (( atfile = atfile + 1 ))
+ done
+
+ # dd the affected side of the mirror
+ log_must $DD if=$OVERWRITING_DEVICE of=/dev/dsk/$AFFECTED_DEVICE \
+ seek=8 bs=$DD_BLOCK count=$(( DD_COUNT - 8 )) conv=notrunc
+
+ log_must $ZPOOL scrub $POOL
+
+ while is_pool_scrubbing $POOL; do
+ $SLEEP 2
+ done
+
+ atfile=0
+
+ typeset -i failedcount=0
+ while (( atfile < FILE_COUNT )); do
+ files[$atfile]=$TESTDIR/file.$atfile
+ newcksum=$($CKSUM ${files[$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/usr/src/test/zfs-tests/tests/functional/scrub_mirror/setup.ksh b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/setup.ksh
new file mode 100644
index 0000000000..852d9adc6a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/scrub_mirror/setup.ksh
@@ -0,0 +1,51 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/scrub_mirror/default.cfg
+
+verify_runnable "global"
+
+if ! $(is_physical_device $DISKS) ; then
+ log_unsupported "This directory cannot be run on raw files."
+fi
+
+if [[ -n $SINGLE_DISK ]]; then
+ log_note "Partitioning a single disk ($SINGLE_DISK)"
+else
+ log_note "Partitioning disks ($MIRROR_PRIMARY $MIRROR_SECONDARY)"
+fi
+log_must set_partition ${SIDE_PRIMARY##*s} "" $MIRROR_SIZE $MIRROR_PRIMARY
+log_must set_partition ${SIDE_SECONDARY##*s} "" $MIRROR_SIZE $MIRROR_SECONDARY
+
+default_mirror_setup $SIDE_PRIMARY $SIDE_SECONDARY
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/Makefile b/usr/src/test/zfs-tests/tests/functional/slog/Makefile
new file mode 100644
index 0000000000..fd551e23d8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/Makefile
@@ -0,0 +1,57 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/slog
+
+PROGS = cleanup \
+ setup \
+ slog_001_pos \
+ slog_002_pos \
+ slog_003_pos \
+ slog_004_pos \
+ slog_005_pos \
+ slog_006_pos \
+ slog_007_pos \
+ slog_008_neg \
+ slog_009_neg \
+ slog_010_neg \
+ slog_011_neg \
+ slog_012_neg \
+ slog_013_pos \
+ slog_014_pos
+
+FILES = slog.cfg \
+ slog.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/slog/cleanup.ksh
new file mode 100644
index 0000000000..6b192ca7bd
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/cleanup.ksh
@@ -0,0 +1,54 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/slog/slog.cfg
+
+verify_runnable "global"
+
+if ! verify_slog_support ; then
+ log_unsupported "This system doesn't support separate intent logs"
+fi
+
+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/usr/src/test/zfs-tests/tests/functional/slog/setup.ksh b/usr/src/test/zfs-tests/tests/functional/slog/setup.ksh
new file mode 100644
index 0000000000..a5dc70fff5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/setup.ksh
@@ -0,0 +1,50 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/slog/slog.cfg
+
+verify_runnable "global"
+
+if ! verify_slog_support ; then
+ log_unsupported "This system doesn't support separate intent logs"
+fi
+
+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 $MKFILE $SIZE $VDEV $SDEV $LDEV $VDEV2 $SDEV2 $LDEV2
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog.cfg b/usr/src/test/zfs-tests/tests/functional/slog/slog.cfg
new file mode 100644
index 0000000000..28cce1aae3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog.cfg
@@ -0,0 +1,41 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+export SIZE=64M
+
+export VDIR=/disk-slog
+export VDIR2=/disk2-slog
+
+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"
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog.kshlib b/usr/src/test/zfs-tests/tests/functional/slog/slog.kshlib
new file mode 100644
index 0000000000..124bfe6d2d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog.kshlib
@@ -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
+#
+
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/slog/slog.cfg
+
+function cleanup
+{
+ if datasetexists $TESTPOOL ; then
+ log_must $ZPOOL destroy -f $TESTPOOL
+ fi
+ if datasetexists $TESTPOOL2 ; then
+ log_must $ZPOOL destroy -f $TESTPOOL2
+ fi
+}
+
+#
+# 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.$$ &
+ typeset pid=$!
+
+ $ZPOOL iostat -v 1 3 > /dev/null
+ ((ret |= $?))
+
+ kill -9 $pid
+
+ return $ret
+}
+
+#
+# Verify the give 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 <pool> <device> " \
+ "<status> [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 $($ZPOOL status -v $pool | $NAWK 'BEGIN {start=0} \
+ /\tlogs/ {start=1}
+ /\tmirror/ || /\tspares/ || /^$/ {start=0}
+ (start==1) && /\t (\/|[a-zA-Z])/ \
+ {print "stripe:" $1 " " $2}
+ (start==1) && /\t (\/|[a-zA-Z])/ \
+ {print "mirror:" $1 " " $2}
+ # When hotspare is replacing
+ (start==1) && /\t (\/|[a-zA-Z])/ \
+ {print "mirror:" $1 " " $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/usr/src/test/zfs-tests/tests/functional/slog/slog_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_001_pos.ksh
new file mode 100644
index 0000000000..c6adaa4c30
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_001_pos.ksh
@@ -0,0 +1,68 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Creating a pool with a log device succeeds."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ for logtype in "" "mirror"
+ do
+ log_must $ZPOOL create $TESTPOOL $type $VDEV \
+ $spare $SDEV log $logtype $LDEV
+ log_must display_status $TESTPOOL
+
+ ldev=$(random_get $LDEV)
+ log_must verify_slog_device \
+ $TESTPOOL $ldev 'ONLINE' $logtype
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+ done
+done
+
+log_pass "Creating a pool with a log device succeeds."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_002_pos.ksh
new file mode 100644
index 0000000000..9062772c1d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_002_pos.ksh
@@ -0,0 +1,67 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Adding a log device to normal pool works."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ for logtype in "" "mirror"
+ do
+ log_must $ZPOOL create $TESTPOOL $type $VDEV $spare $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
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+ done
+done
+
+log_pass "Adding a log device to normal pool works."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_003_pos.ksh
new file mode 100644
index 0000000000..5a28066da1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_003_pos.ksh
@@ -0,0 +1,74 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Adding an extra log device works."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ for logtype in "" "mirror"
+ do
+ for newtype in "" "mirror"
+ do
+ log_must $ZPOOL create $TESTPOOL $type $VDEV \
+ $spare $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
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+ done
+ done
+done
+
+log_pass "Adding an extra log device works."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_004_pos.ksh
new file mode 100644
index 0000000000..83806d03bb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_004_pos.ksh
@@ -0,0 +1,73 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Attaching a log device passes."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ for logtype in "" "mirror"
+ do
+ log_must $ZPOOL create $TESTPOOL $type $VDEV \
+ $spare $SDEV log $logtype $LDEV
+
+ 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'
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+ done
+done
+
+log_pass "Attaching a log device passes."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_005_pos.ksh
new file mode 100644
index 0000000000..f40fc5aace
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_005_pos.ksh
@@ -0,0 +1,65 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Detaching a log device passes."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ log_must $ZPOOL create $TESTPOOL $type $VDEV $spare $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'
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+done
+
+log_pass "Detaching a log device passes."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_006_pos.ksh
new file mode 100644
index 0000000000..b93f64ab7e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_006_pos.ksh
@@ -0,0 +1,72 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Replacing a log device passes."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ for logtype in "" "mirror"
+ do
+ log_must $ZPOOL create $TESTPOOL $type $VDEV \
+ $spare $SDEV log $logtype $LDEV
+ sdev=$(random_get $LDEV)
+ tdev=$(random_get $LDEV2)
+ log_must $ZPOOL replace $TESTPOOL $sdev $tdev
+ log_must display_status $TESTPOOL
+ # sleep 15 to make sure replacement completely.
+ log_must $SLEEP 15
+ log_must verify_slog_device \
+ $TESTPOOL $tdev 'ONLINE' $logtype
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+ done
+done
+
+log_pass "Replacing a log device passes."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_007_pos.ksh
new file mode 100644
index 0000000000..c643301402
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_007_pos.ksh
@@ -0,0 +1,93 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Exporting and importing pool with log devices passes."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ for logtype in "" "mirror"
+ do
+ #
+ # Create pool which devices resider in different
+ # directory
+ #
+ log_must $ZPOOL create $TESTPOOL $type $VDEV \
+ $spare $SDEV log $logtype $LDEV $LDEV2
+ ldev=$(random_get $LDEV $LDEV2)
+ log_must verify_slog_device \
+ $TESTPOOL $ldev 'ONLINE' $logtype
+
+ #
+ # Nomal export/import operating
+ #
+ 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 the pool and import again
+ #
+ log_must $ZPOOL destroy $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
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+ done
+done
+
+log_pass "Exporting and importing pool with log devices passes."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_008_neg.ksh
new file mode 100644
index 0000000000..b9243567a5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_008_neg.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# DESCRIPTION:
+# A raidz/raidz2 log is not supported.
+#
+# STRATEGY:
+# 1. Try to create pool with unsupported type
+# 2. Verify failed to create pool.
+#
+
+verify_runnable "global"
+
+log_assert "A raidz/raidz2 log is not supported."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ 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
+ done
+done
+
+log_pass "A raidz/raidz2 log is not supported."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_009_neg.ksh
new file mode 100644
index 0000000000..9b195bd64c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_009_neg.ksh
@@ -0,0 +1,69 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "A raidz/raidz2 log can not be added to existed pool."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ for logtype in "raidz" "raidz1" "raidz2"
+ do
+ log=$(random_get_with_non "log")
+ log_must $ZPOOL create $TESTPOOL $type $VDEV \
+ $spare $SDEV $log $LDEV
+
+ log_mustnot $ZPOOL add $TESTPOOL log $logtype $LDEV2
+ ldev=$(random_get $LDEV2)
+ log_mustnot verify_slog_device \
+ $TESTPOOL $ldev 'ONLINE' $logtype
+
+ log_must $ZPOOL destroy $TESTPOOL
+ done
+ done
+done
+
+log_pass "A raidz/raidz2 log can not be added to existed pool."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_010_neg.ksh
new file mode 100644
index 0000000000..a5e79f0731
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_010_neg.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/slog/slog_011_neg.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_011_neg.ksh
new file mode 100644
index 0000000000..d2fd334337
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_011_neg.ksh
@@ -0,0 +1,70 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+log_assert "Offline and online a log device passes."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ log_must $ZPOOL create $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'
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+done
+
+log_pass "Offline and online a log device passes."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_012_neg.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_012_neg.ksh
new file mode 100644
index 0000000000..86047255c1
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_012_neg.ksh
@@ -0,0 +1,73 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+log_assert "Pool can survive when one of mirror log device get corrupted."
+log_onexit cleanup
+
+for type in "" "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ log_must $ZPOOL create $TESTPOOL $type $VDEV $spare $SDEV \
+ log mirror $LDEV
+
+ mntpnt=$(get_prop mountpoint $TESTPOOL)
+ #
+ # Create file in pool to trigger writting in slog devices
+ #
+ log_must $DD if=/dev/random of=$mntpnt/testfile.$$ count=100
+
+ ldev=$(random_get $LDEV)
+ log_must $MKFILE $SIZE $ldev
+ log_must $ZPOOL scrub $TESTPOOL
+
+ log_must display_status $TESTPOOL
+ log_must verify_slog_device $TESTPOOL $ldev 'UNAVAIL' 'mirror'
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+done
+
+log_pass "Pool can survive when one of mirror log device get corrupted."
diff --git a/usr/src/test/zfs-tests/tests/functional/slog/slog_013_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_013_pos.ksh
new file mode 100644
index 0000000000..8a17bd0464
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_013_pos.ksh
@@ -0,0 +1,94 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# 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
+#
+
+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."
+verify_disk_count "$DISKS" 2
+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 $MKFILE 100M $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/usr/src/test/zfs-tests/tests/functional/slog/slog_014_pos.ksh b/usr/src/test/zfs-tests/tests/functional/slog/slog_014_pos.ksh
new file mode 100644
index 0000000000..d2444c9751
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/slog/slog_014_pos.ksh
@@ -0,0 +1,80 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/slog/slog.kshlib
+
+#
+# DESCRIPTION:
+# log device can survive when one of pool device get corrupted
+#
+# STRATEGY:
+# 1. Create pool with slog devices
+# 2. Corrupt the data on one disk.
+# 3. Verify the log is fine
+#
+
+verify_runnable "global"
+
+log_assert "log device can survive when one of the pool device get corrupted."
+
+for type in "mirror" "raidz" "raidz2"
+do
+ for spare in "" "spare"
+ do
+ log_must $ZPOOL create $TESTPOOL $type $VDEV $spare $SDEV \
+ log $LDEV
+
+ # Corrupt a pool device to make the pool DEGRADED
+ $DD if=/dev/urandom of=/$TESTPOOL/filler bs=1024k count=50
+ # The oseek value below is to skip past the vdev label.
+ log_must $DD if=/dev/urandom of=$VDIR/a bs=1024k oseek=4 \
+ conv=notrunc count=50
+ log_must $ZPOOL scrub $TESTPOOL
+ log_must display_status $TESTPOOL
+ log_must $ZPOOL status $TESTPOOL 2>&1 >/dev/null
+
+ $ZPOOL status -v $TESTPOOL | \
+ $GREP "state: DEGRADED" 2>&1 >/dev/null
+ if (( $? != 0 )); then
+ log_fail "pool $TESTPOOL status should be DEGRADED"
+ fi
+
+ $ZPOOL status -v $TESTPOOL | $GREP logs | \
+ $GREP "DEGRADED" 2>&1 >/dev/null
+ if (( $? == 0 )); then
+ log_fail "log device should display correct status"
+ fi
+
+ log_must $ZPOOL destroy -f $TESTPOOL
+ done
+done
+
+log_pass "log device can survive when one of the pool device get corrupted."
diff --git a/usr/src/test/zfs-tests/tests/functional/snapshot/Makefile b/usr/src/test/zfs-tests/tests/functional/snapshot/Makefile
new file mode 100644
index 0000000000..73f1bceb07
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/Makefile
@@ -0,0 +1,63 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/snapshot
+
+PROGS = cleanup \
+ clone_001_pos \
+ rollback_001_pos \
+ rollback_002_pos \
+ rollback_003_pos \
+ setup \
+ snapshot_001_pos \
+ snapshot_002_pos \
+ snapshot_003_pos \
+ snapshot_004_pos \
+ snapshot_005_pos \
+ snapshot_006_pos \
+ snapshot_007_pos \
+ snapshot_008_pos \
+ snapshot_009_pos \
+ snapshot_010_pos \
+ snapshot_011_pos \
+ snapshot_012_pos \
+ snapshot_013_pos \
+ snapshot_014_pos \
+ snapshot_015_pos \
+ snapshot_016_pos \
+ snapshot_017_pos
+
+FILES = snapshot.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/snapshot/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/cleanup.ksh
new file mode 100644
index 0000000000..93199bff66
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_container_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/snapshot/clone_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/clone_001_pos.ksh
new file mode 100644
index 0000000000..241cdbbd46
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/clone_001_pos.ksh
@@ -0,0 +1,161 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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/dsk/$TESTPOOL/$TESTVOL
+ log_must $ZFS create $TESTPOOL1/$TESTFS
+ log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL1/$TESTFS
+
+ return 0
+}
+
+function cleanup_all
+{
+ typeset -i i=0
+
+ i=0
+ while (( i < ${#args[*]} )); do
+ snapexists ${args[i]} && \
+ log_must $ZFS destroy -Rf ${args[i]}
+
+ [[ -d ${args[i+3]} ]] && \
+ log_must $RM -rf ${args[i+3]}
+
+ [[ -d ${args[i+1]} ]] && \
+ log_must $RM -rf ${args[i+1]}
+
+ (( i = i + 4 ))
+ done
+
+ datasetexists $TESTPOOL1/$TESTFS && \
+ log_must $ZFS destroy -f $TESTPOOL1/$TESTFS
+
+ 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
+typeset -i i=0
+
+for mtpt in $TESTDIR $TESTDIR2 ; do
+ log_note "Populate the $mtpt directory (prior to snapshot)"
+ typeset -i j=1
+ while [[ $j -le $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $mtpt/before_file$j \
+ -b $BLOCKSZ -c $NUM_WRITES -d $j
+
+ (( j = j + 1 ))
+ done
+done
+
+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" \
+ | $GREP -v "\.zfs" | 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"
+ j=1
+ while [[ $j -le $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f ${args[i+3]}/after_file$j \
+ -b $BLOCKSZ -c $NUM_WRITES -d $j
+ (( j = j + 1 ))
+ done
+
+ 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/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_001_pos.ksh
new file mode 100644
index 0000000000..e5df02d456
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_001_pos.ksh
@@ -0,0 +1,115 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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)"
+typeset -i i=1
+while [[ $i -le $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR/before_file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+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)"
+typeset -i i=1
+while [[ $i -le $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR/after_file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+#
+# 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/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_002_pos.ksh
new file mode 100644
index 0000000000..76b8c84520
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_002_pos.ksh
@@ -0,0 +1,133 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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)"
+typeset -i i=1
+while [[ $i -le $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR/original_file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+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)"
+typeset -i i=1
+while [[ $i -le $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR/afterfirst_file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+log_must $ZFS snapshot $SNAPFS.1
+
+log_note "Populate the $TESTDIR directory (Post second snapshot)"
+typeset -i i=1
+while [[ $i -le $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR/aftersecond_file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+[[ -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/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_003_pos.ksh
new file mode 100644
index 0000000000..4c9ef68518
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/rollback_003_pos.ksh
@@ -0,0 +1,106 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+
+#
+# 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
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ typeset snap=""
+ typeset fs=""
+
+ export __ZFS_POOL_RESTRICT="$TESTPOOL"
+ log_must $ZFS mount -a
+ unset __ZFS_POOL_RESTRICT
+
+ 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
+
+export __ZFS_POOL_RESTRICT="$TESTPOOL"
+log_must $ZFS unmount -a
+log_must $ZFS mount -a
+unset __ZFS_POOL_RESTRICT
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/setup.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/setup.ksh
new file mode 100644
index 0000000000..ab01cde3e2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_container_volume_setup ${DISK}
diff --git a/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot.cfg b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot.cfg
new file mode 100644
index 0000000000..fa31645551
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot.cfg
@@ -0,0 +1,53 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+export TESTFILE=testfile-snapshot
+export SNAPROOT=".zfs/snapshot"
+
+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="/$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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_001_pos.ksh
new file mode 100644
index 0000000000..832ca1e8a8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_001_pos.ksh
@@ -0,0 +1,91 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_002_pos.ksh
new file mode 100644
index 0000000000..040f3acf69
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_002_pos.ksh
@@ -0,0 +1,134 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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 /tmp/zfs_snapshot2.$$ ]]; then
+ log_must $RM -rf /tmp/zfs_snapshot2.$$ > /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..."
+
+typeset i=1
+while [ $i -lt $COUNT ]; do
+ log_must $FILE_WRITE -o $OP -f $TESTDIR/file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $DATA
+
+ (( i = i + 1 ))
+done
+
+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 > /tmp/zfs_snapshot2.$$
+$GREP different /tmp/zfs_snapshot2.$$ >/dev/null 2>&1
+if [[ $? -ne 1 ]]; then
+ log_fail "Directory structures differ."
+fi
+
+log_pass "Directory structures match."
diff --git a/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_003_pos.ksh
new file mode 100644
index 0000000000..f30629f26b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_003_pos.ksh
@@ -0,0 +1,103 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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..."
+typeset -i i=1
+while [[ $i -lt $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR/file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+ log_must $ZFS snapshot $SNAPFS.$i
+
+ (( i = i + 1 ))
+done
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_004_pos.ksh
new file mode 100644
index 0000000000..e1040070ce
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_004_pos.ksh
@@ -0,0 +1,90 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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"
+typeset -i i=1
+while [[ $i -lt $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR/file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_005_pos.ksh
new file mode 100644
index 0000000000..8c73639d44
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_005_pos.ksh
@@ -0,0 +1,90 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_006_pos.ksh
new file mode 100644
index 0000000000..cc2c6edcc3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_006_pos.ksh
@@ -0,0 +1,132 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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 /tmp/zfs_snapshot2.$$ ]]; then
+ log_must $RM -rf /tmp/zfs_snapshot2.$$ > /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 ..."
+
+typeset i=1
+while [ $i -lt $COUNT ]; do
+ log_must $FILE_WRITE -o $OP -f $TESTDIR1/file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $DATA
+
+ (( i = i + 1 ))
+done
+
+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 > /tmp/zfs_snapshot2.$$
+$GREP different /tmp/zfs_snapshot2.$$ >/dev/null 2>&1
+if [[ $? -ne 1 ]]; then
+ log_fail "Directory structures differ."
+fi
+
+log_pass "Directory structures match."
diff --git a/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_007_pos.ksh
new file mode 100644
index 0000000000..5ee9f5d3a7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_007_pos.ksh
@@ -0,0 +1,107 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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..."
+typeset -i i=1
+while [[ $i -lt $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR1/file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+ log_must $ZFS snapshot $SNAPCTR.$i
+
+ (( i = i + 1 ))
+done
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_008_pos.ksh
new file mode 100644
index 0000000000..3610491b05
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_008_pos.ksh
@@ -0,0 +1,100 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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.
+#
+
+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"
+typeset -i i=1
+while [[ $i -lt $COUNT ]]; do
+ log_must $FILE_WRITE -o create -f $TESTDIR/file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ log_must $ZFS snapshot $SNAPFS.$i
+ (( i = i + 1 ))
+done
+
+typeset -i i=1
+while [[ $i -lt $COUNT ]]; do
+ log_must rm -rf $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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_009_pos.ksh
new file mode 100644
index 0000000000..dfc75d821d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_009_pos.ksh
@@ -0,0 +1,119 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_010_pos.ksh
new file mode 100644
index 0000000000..cb9ff880e0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_010_pos.ksh
@@ -0,0 +1,101 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_011_pos.ksh
new file mode 100644
index 0000000000..9774035a5e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_011_pos.ksh
@@ -0,0 +1,113 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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)"
+typeset -i i=0
+while (( i < COUNT )); do
+ log_must $FILE_WRITE -o create -f $TESTDIR/before_file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+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
+while (( i < COUNT )); do
+ log_must $FILE_WRITE -o create -f $TESTDIR/after_file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+#
+# 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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_012_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_012_pos.ksh
new file mode 100644
index 0000000000..6f75861fd9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_012_pos.ksh
@@ -0,0 +1,104 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_013_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_013_pos.ksh
new file mode 100644
index 0000000000..65315ee2ce
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_013_pos.ksh
@@ -0,0 +1,99 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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/.zfs/snapshot/$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)"
+typeset -i i=0
+while (( i < COUNT )); do
+ log_must $FILE_WRITE -o create -f $TESTDIR/file$i \
+ -b $BLOCKSZ -c $NUM_WRITES -d $i
+
+ (( i = i + 1 ))
+done
+
+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 "Got $FILE_COUNT expected $COUNT"
+done
+
+log_pass "'zfs send/receive' works as expected with snapshots from 'snapshot -r'"
diff --git a/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_014_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_014_pos.ksh
new file mode 100644
index 0000000000..39a8ff3a1b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_014_pos.ksh
@@ -0,0 +1,78 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_015_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_015_pos.ksh
new file mode 100644
index 0000000000..cf819ddb9b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_015_pos.ksh
@@ -0,0 +1,121 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib
+
+#
+# DESCRIPTION:
+# Verify snapshot can be created or destroy via mkdir or rm
+# in .zfs/snapshot.
+#
+# STRATEGY:
+# 1. Verify make directories only successfully in .zfs/snapshot.
+# 2. Verify snapshot can be created and destroy via mkdir and remove
+# directories in .zfs/snapshot.
+# 3. Verify rollback to previous snapshot can succeed.
+# 4. Verify remove directory in snapdir can destroy snapshot.
+#
+
+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 .zfs/snapshot."
+log_onexit cleanup
+
+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 .zfs/snapshot
+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 $snapdir/snapshot/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 $snapdir/snapshot/snap.$cnt
+log_mustnot datasetexists $fs@snap.$cnt
+
+log_pass "Verify snapshot can be created via mkdir in .zfs/snapshot passed."
diff --git a/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_016_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_016_pos.ksh
new file mode 100644
index 0000000000..9d957c70e9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_016_pos.ksh
@@ -0,0 +1,101 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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
+
+# 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 .zfs/snapshot 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 .zfs/snapshot 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/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_017_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_017_pos.ksh
new file mode 100644
index 0000000000..e8a74341c0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapshot/snapshot_017_pos.ksh
@@ -0,0 +1,202 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapshot/snapshot.cfg
+
+#
+# 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
+#
+
+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
+$MKFILE 10m file1
+$MKFILE 20m file2
+$MKDIR dir1
+cd dir1
+$MKFILE 10m file3
+$MKFILE 20m file4
+$MKDIR dir2
+cd dir2
+$MKFILE 10m file5
+$MKFILE 20m 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/.zfs
+verify_dir $TESTDIR/.zfs/snapshot
+verify_dir $TESTDIR/.zfs/snapshot/snap_a
+verify_dir $TESTDIR/.zfs/snapshot/snap_b
+
+cd $TESTDIR/.zfs/snapshot/snap_a
+verify_structure
+
+cd $TESTDIR/.zfs/snapshot/snap_b
+verify_structure
+
+cd $TESTDIR/.zfs
+verify_dir snapshot
+cd $TESTDIR/.zfs/snapshot
+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/usr/src/test/zfs-tests/tests/functional/snapused/Makefile b/usr/src/test/zfs-tests/tests/functional/snapused/Makefile
new file mode 100644
index 0000000000..80202dc596
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/Makefile
@@ -0,0 +1,47 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/snapused
+
+PROGS = cleanup \
+ setup \
+ snapused_001_pos \
+ snapused_002_pos \
+ snapused_003_pos \
+ snapused_004_pos \
+ snapused_005_pos
+
+FILES = snapused.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/snapused/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/snapused/cleanup.ksh
new file mode 100644
index 0000000000..b514131ce5
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/snapused/setup.ksh b/usr/src/test/zfs-tests/tests/functional/snapused/setup.ksh
new file mode 100644
index 0000000000..2d7cbc2e26
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/snapused/snapused.kshlib b/usr/src/test/zfs-tests/tests/functional/snapused/snapused.kshlib
new file mode 100644
index 0000000000..5e3a765321
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/snapused.kshlib
@@ -0,0 +1,185 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+export USEDTEST=$TESTPOOL/$TESTFS/usedtest-snapused
+
+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/usr/src/test/zfs-tests/tests/functional/snapused/snapused_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_001_pos.ksh
new file mode 100644
index 0000000000..3182dedb17
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_001_pos.ksh
@@ -0,0 +1,91 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapused/snapused.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapused/snapused_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_002_pos.ksh
new file mode 100644
index 0000000000..db6ac3dcb0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_002_pos.ksh
@@ -0,0 +1,82 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapused/snapused.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapused/snapused_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_003_pos.ksh
new file mode 100644
index 0000000000..9dee1f3c40
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_003_pos.ksh
@@ -0,0 +1,82 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapused/snapused.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapused/snapused_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_004_pos.ksh
new file mode 100644
index 0000000000..2cc4cade04
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_004_pos.ksh
@@ -0,0 +1,95 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapused/snapused.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/snapused/snapused_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_005_pos.ksh
new file mode 100644
index 0000000000..f4099c84ef
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/snapused/snapused_005_pos.ksh
@@ -0,0 +1,73 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/snapused/snapused.kshlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/sparse/Makefile b/usr/src/test/zfs-tests/tests/functional/sparse/Makefile
new file mode 100644
index 0000000000..63b638bb5d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/sparse/Makefile
@@ -0,0 +1,43 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/sparse
+
+PROGS = cleanup \
+ setup \
+ sparse_001_pos
+
+FILES = sparse.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/sparse/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/sparse/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/sparse/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/sparse/setup.ksh b/usr/src/test/zfs-tests/tests/functional/sparse/setup.ksh
new file mode 100644
index 0000000000..1c51a64aa6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/sparse/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+disk=${DISKS%% *}
+
+default_setup $disk
diff --git a/usr/src/test/zfs-tests/tests/functional/sparse/sparse.cfg b/usr/src/test/zfs-tests/tests/functional/sparse/sparse.cfg
new file mode 100644
index 0000000000..ba969ee479
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/sparse/sparse.cfg
@@ -0,0 +1,37 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export TESTFILE=testfile.sparse
+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/usr/src/test/zfs-tests/tests/functional/sparse/sparse_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/sparse/sparse_001_pos.ksh
new file mode 100644
index 0000000000..2c70e495c7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/sparse/sparse_001_pos.ksh
@@ -0,0 +1,80 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/sparse/sparse.cfg
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/threadsappend/Makefile b/usr/src/test/zfs-tests/tests/functional/threadsappend/Makefile
new file mode 100644
index 0000000000..f1519d160d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/threadsappend/Makefile
@@ -0,0 +1,68 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/threadsappend
+
+PROG = threadsappend
+
+SCRIPTS = cleanup \
+ setup \
+ threadsappend_001_pos
+
+include $(SRC)/cmd/Makefile.cmd
+include $(SRC)/test/Makefile.com
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+
+OBJS = $(PROG:%=%.o)
+SRCS = $(OBJS:%.o=%.c)
+
+CMDS = $(PROG:%=$(TESTDIR)/%) $(SCRIPTS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+CPPFLAGS += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
+
+all: $(PROG)
+
+$(PROG): $(OBJS)
+ $(LINK.c) $(OBJS) -o $@ $(LDLIBS)
+ $(POST_PROCESS)
+
+%.o: ../%.c
+ $(COMPILE.c) $<
+
+install: all $(CMDS)
+
+lint: lint_SRCS
+
+clobber: clean
+ -$(RM) $(PROG)
+
+clean:
+ -$(RM) $(OBJS)
+
+$(CMDS): $(TESTDIR) $(PROG)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/threadsappend/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/threadsappend/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/threadsappend/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/threadsappend/setup.ksh b/usr/src/test/zfs-tests/tests/functional/threadsappend/setup.ksh
new file mode 100644
index 0000000000..9d37f1c115
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/threadsappend/setup.ksh
@@ -0,0 +1,36 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+
+default_setup ${DISK}
diff --git a/usr/src/test/zfs-tests/tests/functional/threadsappend/threadsappend.c b/usr/src/test/zfs-tests/tests/functional/threadsappend/threadsappend.c
new file mode 100644
index 0000000000..00db13f41b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/threadsappend/threadsappend.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
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Copyright (c) 2013 by Delphix. All rights reserved.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <thread.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+/*
+ * 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;
+ char buf[8192] = {0};
+ (void) memset(buf, n, sizeof (buf));
+
+ for (i = 0; i < 80; i++) {
+ (void) write(outfd, buf, sizeof (buf));
+ }
+ return (NULL);
+}
+
+static void
+usage()
+{
+ (void) fprintf(stderr,
+ "usage: zfs_threadsappend <file name>\n");
+ exit(1);
+}
+
+int
+main(int argc, char **argv)
+{
+ 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 = thr_create(NULL, 0, go, (void *)&i, 0, NULL);
+ if (ret != 0) {
+ (void) fprintf(stderr,
+ "zfs_threadsappend: thr_create(#%d) "
+ "failed error=%d\n", i+1, ret);
+ exit(1);
+ }
+ }
+
+ while (thr_join(0, NULL, NULL) == 0)
+ continue;
+
+ return (0);
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/threadsappend/threadsappend_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/threadsappend/threadsappend_001_pos.ksh
new file mode 100644
index 0000000000..635dcdb627
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/threadsappend/threadsappend_001_pos.ksh
@@ -0,0 +1,82 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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
+THREADSAPPEND="$STF_SUITE/tests/functional/threadsappend/threadsappend"
+TESTFILE='testfile-threadsappend'
+
+#
+# This test should be run on a multi-processor system because otherwise the FS
+# will not be concurrently used by the threads
+#
+NCPUS=`$PSRINFO | $WC -l`
+if [[ -z $NCPUS || $NCPUS -le 1 ]]; then
+ log_fail "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/usr/src/test/zfs-tests/tests/functional/userquota/Makefile b/usr/src/test/zfs-tests/tests/functional/userquota/Makefile
new file mode 100644
index 0000000000..041275ab7f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/Makefile
@@ -0,0 +1,59 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/userquota
+
+PROGS = cleanup \
+ groupspace_001_pos \
+ groupspace_002_pos \
+ setup \
+ userquota_001_pos \
+ userquota_002_pos \
+ userquota_003_pos \
+ userquota_004_pos \
+ userquota_005_neg \
+ userquota_006_pos \
+ userquota_007_pos \
+ userquota_008_pos \
+ userquota_009_pos \
+ userquota_010_pos \
+ userquota_011_pos \
+ userquota_012_neg \
+ userspace_001_pos \
+ userspace_002_pos
+
+FILES = userquota.cfg \
+ userquota_common.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/userquota/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/cleanup.ksh
new file mode 100644
index 0000000000..ffd2f32228
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/cleanup.ksh
@@ -0,0 +1,41 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+log_must cleanup_quota
+log_must clean_user_group
+
+typeset mntp=$(get_prop mountpoint $QFS)
+log_must $CHMOD 0755 $mntp
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/userquota/groupspace_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/groupspace_001_pos.ksh
new file mode 100644
index 0000000000..41f6d18c59
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/groupspace_001_pos.ksh
@@ -0,0 +1,79 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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 -- "-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" "-i" "-t smbuser" "-t smbgroup"
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/groupspace_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/groupspace_002_pos.ksh
new file mode 100644
index 0000000000..48d298c25a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/groupspace_002_pos.ksh
@@ -0,0 +1,79 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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 $MKFILE 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/usr/src/test/zfs-tests/tests/functional/userquota/setup.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/setup.ksh
new file mode 100644
index 0000000000..9943732103
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/setup.ksh
@@ -0,0 +1,44 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+verify_runnable "both"
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota.cfg b/usr/src/test/zfs-tests/tests/functional/userquota/userquota.cfg
new file mode 100644
index 0000000000..893428deaf
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota.cfg
@@ -0,0 +1,46 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+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
+export OFILE=$TESTDIR/of
+
+export SNAP_QUOTA=100m
+export TEST_QUOTA=88888
diff --git a/usr/src/test/zfs-tests/tests/functional/userquota/userquota_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_001_pos.ksh
new file mode 100644
index 0000000000..98dfc4f98a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_001_pos.ksh
@@ -0,0 +1,74 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+#
+# 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
+#
+#
+
+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 $MKFILE $UQUOTA_SIZE $QFILE
+$SYNC
+log_mustnot user_run $QUSER1 $MKFILE 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 $MKFILE $GQUOTA_SIZE $QFILE
+$SYNC
+log_mustnot user_run $QUSER1 $MKFILE 1 $OFILE
+
+cleanup_quota
+
+log_pass "Write operation overwrite {user|group}quota size, it as expect"
diff --git a/usr/src/test/zfs-tests/tests/functional/userquota/userquota_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_002_pos.ksh
new file mode 100644
index 0000000000..dfbce81ccc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_002_pos.ksh
@@ -0,0 +1,89 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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"
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ if poolexists $TESTPOOL1; then
+ log_must $ZPOOL destroy $TESTPOOL1
+ fi
+
+ 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=/var/tmp/pool_dev.$$
+
+log_must $MKFILE 500m $pool_vdev
+
+if poolexists $TESTPOOL1; then
+ $ZPOOL destroy $TESTPOOL1
+fi
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_003_pos.ksh
new file mode 100644
index 0000000000..45c7542c5e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_003_pos.ksh
@@ -0,0 +1,61 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_004_pos.ksh
new file mode 100644
index 0000000000..e17e641308
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_004_pos.ksh
@@ -0,0 +1,81 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# DESCRIPTION:
+# Check the basic function user|group used
+#
+#
+# STRATEGY:
+# 1. Write some data to fs by normal user and check the user|group used
+#
+
+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 is $user_used, should be 0"
+fi
+if [[ $group_used != 0 ]]; then
+ log_fail "FAIL: groupused is $group_used, should be 0"
+fi
+
+mkmount_writable $QFS
+log_must user_run $QUSER1 $MKFILE 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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_005_neg.ksh
new file mode 100644
index 0000000000..2fb043d499
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_005_neg.ksh
@@ -0,0 +1,94 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_006_pos.ksh
new file mode 100644
index 0000000000..df84c24a19
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_006_pos.ksh
@@ -0,0 +1,75 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_007_pos.ksh
new file mode 100644
index 0000000000..b727f2d859
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_007_pos.ksh
@@ -0,0 +1,75 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_008_pos.ksh
new file mode 100644
index 0000000000..bb6afe3fdc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_008_pos.ksh
@@ -0,0 +1,60 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# DESCRIPTION:
+#
+# zfs get all <fs> does not print out userquota/groupquota
+#
+# STRATEGY:
+# 1. set userquota and groupquota to a fs
+# 2. check zfs get all fs
+#
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_009_pos.ksh
new file mode 100644
index 0000000000..6bf6146b22
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_009_pos.ksh
@@ -0,0 +1,92 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_010_pos.ksh
new file mode 100644
index 0000000000..fa08fb06f0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_010_pos.ksh
@@ -0,0 +1,75 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_011_pos.ksh
new file mode 100644
index 0000000000..3ca55feeae
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_011_pos.ksh
@@ -0,0 +1,127 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userquota_012_neg.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_012_neg.ksh
new file mode 100644
index 0000000000..bd368227dc
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_012_neg.ksh
@@ -0,0 +1,66 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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"
diff --git a/usr/src/test/zfs-tests/tests/functional/userquota/userquota_common.kshlib b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_common.kshlib
new file mode 100644
index 0000000000..771919602e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userquota_common.kshlib
@@ -0,0 +1,120 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota.cfg
+
+#
+# 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
+ $SYNC
+
+ 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
+}
+
+#
+# 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/usr/src/test/zfs-tests/tests/functional/userquota/userspace_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userspace_001_pos.ksh
new file mode 100644
index 0000000000..bdbec23f9f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userspace_001_pos.ksh
@@ -0,0 +1,78 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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 -- "-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" "-i" "-tsmbuser" "-t smbgroup"
+
+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/usr/src/test/zfs-tests/tests/functional/userquota/userspace_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/userquota/userspace_002_pos.ksh
new file mode 100644
index 0000000000..580be5f34b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/userquota/userspace_002_pos.ksh
@@ -0,0 +1,81 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/userquota/userquota_common.kshlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/utils_test/Makefile b/usr/src/test/zfs-tests/tests/functional/utils_test/Makefile
new file mode 100644
index 0000000000..64076def16
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/Makefile
@@ -0,0 +1,52 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/utils_test
+
+PROGS = cleanup \
+ setup \
+ utils_test_001_pos \
+ utils_test_002_pos \
+ utils_test_003_pos \
+ utils_test_004_pos \
+ utils_test_005_pos \
+ utils_test_006_pos \
+ utils_test_007_pos \
+ utils_test_008_pos \
+ utils_test_009_pos
+
+FILES = utils_test.cfg \
+ utils_test.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/setup.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/setup.ksh
new file mode 100644
index 0000000000..9a77607a6d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/setup.ksh
@@ -0,0 +1,35 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.cfg
+
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test.cfg b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test.cfg
new file mode 100644
index 0000000000..188511f45b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test.cfg
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export TESTFILE=testfile-utils
+
+export WRITE_COUNT=20
+export BLOCKSZ=8192
+export DATA=0
+export NUM_FILES=10
+
+export DISK=${DISKS%% *}
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test.kshlib b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test.kshlib
new file mode 100644
index 0000000000..d0f9a23a04
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test.kshlib
@@ -0,0 +1,50 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+. $STF_SUITE/tests/functional/utils_test/utils_test.cfg
+
+#
+# Given a number of files, this function will iterate through
+# the loop creating the specified number of files. The default
+# values from the .cfg file are used for block size, number of
+# writes per file and the contents of the file.
+#
+# Returns the errno if any of the writes fail.
+#
+function populate_dir # num_files
+{
+ typeset -i num_files=$1
+
+ typeset -i filenum=0
+ while (( filenum < num_files )); do
+ log_must $FILE_WRITE -o create -c $WRITE_COUNT \
+ -f $TESTDIR/$TESTFILE.$filenum -b $BLOCKSZ -d $DATA
+ (( filenum = filenum + 1 ))
+ done
+}
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_001_pos.ksh
new file mode 100644
index 0000000000..166388b564
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_001_pos.ksh
@@ -0,0 +1,62 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# 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.
+#
+
+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 $NUM_FILES
+
+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/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_002_pos.ksh
new file mode 100644
index 0000000000..fe417e69d4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_002_pos.ksh
@@ -0,0 +1,66 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# 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.
+#
+
+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."
+
+populate_dir $NUM_FILES
+
+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/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_003_pos.ksh
new file mode 100644
index 0000000000..c7c90a1274
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_003_pos.ksh
@@ -0,0 +1,63 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# 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.
+#
+
+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 $NUM_FILES
+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 /dev/rdsk/${DISK}s0
+
+log_pass "fsdb(1M) returned an error as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_004_pos.ksh
new file mode 100644
index 0000000000..9a2d17b3d4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_004_pos.ksh
@@ -0,0 +1,60 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# 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.
+#
+
+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 /dev/dsk/${DISK}s0
+
+log_pass "quotaon(1M) returned an error as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_005_pos.ksh
new file mode 100644
index 0000000000..2453150e76
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_005_pos.ksh
@@ -0,0 +1,60 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ $RM -rf $TESTDIR/*
+}
+
+log_onexit cleanup
+
+log_assert "Ensure that the ff(1M) utility fails on a ZFS file system."
+
+populate_dir $NUM_FILES
+
+log_mustnot $FF -F zfs /dev/rdsk/${DISK}s0
+
+log_pass "ff(1M) returned an error as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_006_pos.ksh
new file mode 100644
index 0000000000..b664f91c93
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_006_pos.ksh
@@ -0,0 +1,66 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# 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.
+#
+
+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 $NUM_FILES
+
+log_must $ZFS unmount $TESTDIR
+
+log_mustnot $FSIRAND /dev/rdsk/${DISK}s0
+
+log_pass "fsirand(1M) returned an error as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_007_pos.ksh
new file mode 100644
index 0000000000..90b544fa9c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_007_pos.ksh
@@ -0,0 +1,72 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# DESCRIPTION:
+# Ensure that the fstyp(1M) utility succeeds on a ZFS file system.
+#
+# STRATEGY:
+# 1. Populate a ZFS file system with some files.
+# 2. Run fstyp(1M) against the device.
+# 3. Ensure it fails.
+#
+
+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(1M) utility succeeds on a ZFS file system."
+
+populate_dir $NUM_FILES
+
+log_must $ZFS unmount $TESTDIR
+
+if ! $(is_physical_device $DISK); then
+ log_must $FSTYP $DISK
+elif [[ $WRAPPER == "smi" ]]; then
+ log_must $FSTYP /dev/rdsk/${DISK}s2
+else
+ log_must $FSTYP /dev/rdsk/${DISK}s0
+fi
+
+log_pass "fstyp(1M) returned successfully."
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_008_pos.ksh
new file mode 100644
index 0000000000..ed116ce840
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_008_pos.ksh
@@ -0,0 +1,66 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# 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.
+#
+
+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 ncheck(1M) utility fails on a ZFS file system."
+
+populate_dir $NUM_FILES
+
+log_must $ZFS unmount $TESTDIR
+
+log_mustnot $NCHECK /dev/rdsk/${DISK}s0
+
+log_pass "ncheck(1M) returned an error as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_009_pos.ksh
new file mode 100644
index 0000000000..c40ecc6bd6
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/utils_test/utils_test_009_pos.ksh
@@ -0,0 +1,60 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/utils_test/utils_test.kshlib
+
+#
+# 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.
+#
+
+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 $NUM_FILES
+
+log_mustnot $TUNEFS -m 80 /dev/dsk/${DISK}s0
+
+log_pass "tunefs(1M) returned an error as expected."
diff --git a/usr/src/test/zfs-tests/tests/functional/write_dirs/Makefile b/usr/src/test/zfs-tests/tests/functional/write_dirs/Makefile
new file mode 100644
index 0000000000..2238fd0247
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/write_dirs/Makefile
@@ -0,0 +1,44 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/write_dirs
+
+PROGS = cleanup \
+ setup \
+ write_dirs_001_pos \
+ write_dirs_002_pos
+
+FILES = write_dirs.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/write_dirs/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/write_dirs/cleanup.ksh
new file mode 100644
index 0000000000..0501ceedac
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/write_dirs/cleanup.ksh
@@ -0,0 +1,34 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/write_dirs/setup.ksh b/usr/src/test/zfs-tests/tests/functional/write_dirs/setup.ksh
new file mode 100644
index 0000000000..721e267a6a
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/write_dirs/setup.ksh
@@ -0,0 +1,47 @@
+#!/usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+verify_runnable "global"
+
+export SIZE="1gb"
+export SLICE=0
+
+if ! $(is_physical_device $DISKS) ; then
+ log_unsupported "This directory cannot be run on raw files."
+fi
+
+DISK=${DISKS%% *}
+
+log_must set_partition $SLICE "" $SIZE $DISK
+
+default_setup "$DISK"s"$SLICE"
diff --git a/usr/src/test/zfs-tests/tests/functional/write_dirs/write_dirs_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/write_dirs/write_dirs_001_pos.ksh
new file mode 100644
index 0000000000..dc5854bd92
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/write_dirs/write_dirs_001_pos.ksh
@@ -0,0 +1,76 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/write_dirs/write_dirs_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/write_dirs/write_dirs_002_pos.ksh
new file mode 100644
index 0000000000..bc4aff07f8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/write_dirs/write_dirs_002_pos.ksh
@@ -0,0 +1,77 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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/usr/src/test/zfs-tests/tests/functional/xattr/Makefile b/usr/src/test/zfs-tests/tests/functional/xattr/Makefile
new file mode 100644
index 0000000000..cc273f3308
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/Makefile
@@ -0,0 +1,55 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/xattr
+
+PROGS = cleanup \
+ setup \
+ xattr_001_pos \
+ xattr_002_neg \
+ xattr_003_neg \
+ xattr_004_pos \
+ xattr_005_pos \
+ xattr_006_pos \
+ xattr_007_neg \
+ xattr_008_pos \
+ xattr_009_neg \
+ xattr_010_neg \
+ xattr_011_pos \
+ xattr_012_pos \
+ xattr_013_pos \
+
+FILES = xattr_common.kshlib
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
+
+$(TESTDIR)/%: %
+ $(INS.file)
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/cleanup.ksh
new file mode 100644
index 0000000000..b52c07d3d8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/cleanup.ksh
@@ -0,0 +1,45 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+ZFS_USER=$($CAT /tmp/zfs-xattr-test-user.txt)
+$RM /tmp/zfs-xattr-test-user.txt
+
+USES_NIS=$($CAT /tmp/zfs-xattr-test-nis.txt)
+$RM /tmp/zfs-xattr-test-nis.txt
+
+del_user $ZFS_USER
+
+if [ "${USES_NIS}" == "true" ]
+then
+ $SVCADM enable svc:/network/nis/client:default
+fi
+
+default_cleanup
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/setup.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/setup.ksh
new file mode 100644
index 0000000000..d359eb049c
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/setup.ksh
@@ -0,0 +1,64 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+# if we're running NIS, turn it off until we clean up
+# (it can cause useradd to take a long time, hitting our TIMEOUT)
+USES_NIS=FALSE
+$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
+ZFS_USER=zxtr
+ZFS_GROUP=staff
+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 > /tmp/zfs-xattr-test-user.txt
+$ECHO $USES_NIS > /tmp/zfs-xattr-test-nis.txt
+
+DISK=${DISKS%% *}
+default_setup $DISK
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_001_pos.ksh
new file mode 100644
index 0000000000..1bc7e5c755
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_001_pos.ksh
@@ -0,0 +1,63 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+
+ if [ -f $TESTDIR/myfile.$$ ]
+ then
+ log_must $RM $TESTDIR/myfile.$$
+ fi
+}
+
+log_assert "Create/read/write/append of xattrs works"
+log_onexit cleanup
+
+log_must $TOUCH $TESTDIR/myfile.$$
+create_xattr $TESTDIR/myfile.$$ passwd /etc/passwd
+verify_write_xattr $TESTDIR/myfile.$$ passwd
+delete_xattr $TESTDIR/myfile.$$ passwd
+
+log_pass "Create/read/write of xattrs works"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_002_neg.ksh
new file mode 100644
index 0000000000..cd57b3594b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_002_neg.ksh
@@ -0,0 +1,56 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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.
+#
+
+function cleanup {
+
+ log_must $RM $TESTDIR/myfile.$$
+
+}
+
+log_assert "A read of a non-existent xattr fails"
+log_onexit cleanup
+
+# create a file
+log_must $TOUCH $TESTDIR/myfile.$$
+log_mustnot eval "$CAT $TESTDIR/myfile.$$ not-here.txt > /dev/null 2>&1"
+
+log_pass "A read of a non-existent xattr fails"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_003_neg.ksh
new file mode 100644
index 0000000000..90d78604b4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_003_neg.ksh
@@ -0,0 +1,62 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+
+ log_must $RM $TESTDIR/myfile.$$
+
+}
+
+log_assert "read/write xattr on a file with no permissions fails"
+log_onexit cleanup
+
+log_must $TOUCH $TESTDIR/myfile.$$
+create_xattr $TESTDIR/myfile.$$ passwd /etc/passwd
+
+log_must $CHMOD 000 $TESTDIR/myfile.$$
+log_mustnot $SU $ZFS_USER -c "$RUNAT $TESTDIR/myfile.$$ $CAT passwd"
+log_mustnot $SU $ZFS_USER -c "$RUNAT $TESTDIR/myfile.$$ $CP /etc/passwd ."
+
+log_pass "read/write xattr on a file with no permissions fails"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_004_pos.ksh
new file mode 100644
index 0000000000..a056cad46b
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_004_pos.ksh
@@ -0,0 +1,86 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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.
+#
+
+# 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 /tmp/ufs.$$ ufs ) ]
+ then
+ log_must $UMOUNT /tmp/ufs.$$
+ log_must $RM -rf /tmp/ufs.$$
+ fi
+}
+
+log_assert "Files from ufs,tmpfs with xattrs copied to zfs retain xattr info."
+log_onexit cleanup
+
+# 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 /tmp/ufs.$$
+log_must $MOUNT /dev/zvol/dsk/$TESTPOOL/$TESTFS/zvol /tmp/ufs.$$
+
+# Create files in ufs and tmpfs, and set some xattrs on them.
+log_must $TOUCH /tmp/ufs.$$/ufs-file.$$
+log_must $TOUCH /tmp/tmpfs-file.$$
+
+log_must $RUNAT /tmp/ufs.$$/ufs-file.$$ $CP /etc/passwd .
+log_must $RUNAT /tmp/tmpfs-file.$$ $CP /etc/group .
+
+# copy those files to ZFS
+log_must $CP -@ /tmp/ufs.$$/ufs-file.$$ $TESTDIR
+log_must $CP -@ /tmp/tmpfs-file.$$ $TESTDIR
+
+# ensure the xattr information has been copied correctly
+log_must $RUNAT $TESTDIR/ufs-file.$$ $DIFF passwd /etc/passwd
+log_must $RUNAT $TESTDIR/tmpfs-file.$$ $DIFF group /etc/group
+
+log_must $UMOUNT /tmp/ufs.$$
+log_pass "Files from ufs,tmpfs with xattrs copied to zfs retain xattr info."
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_005_pos.ksh
new file mode 100644
index 0000000000..f7be58e819
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_005_pos.ksh
@@ -0,0 +1,78 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+
+ log_must $ZFS destroy $TESTPOOL/$TESTFS/clone
+ log_must $ZFS destroy $TESTPOOL/$TESTFS@snapshot1
+ log_must $RM $TESTDIR/myfile.$$
+}
+
+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.$$
+create_xattr $TESTDIR/myfile.$$ 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.$$ passwd /etc/passwd
+
+# check we can create xattrs on the clone
+create_xattr $TESTDIR/clone/myfile.$$ foo /etc/passwd
+delete_xattr $TESTDIR/clone/myfile.$$ foo
+
+# delete the original dataset xattr
+delete_xattr $TESTDIR/myfile.$$ passwd
+
+# verify it's still there on the clone
+verify_xattr $TESTDIR/clone/myfile.$$ passwd /etc/passwd
+delete_xattr $TESTDIR/clone/myfile.$$ passwd
+
+log_pass "read/write/create/delete xattr on a clone filesystem"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_006_pos.ksh
new file mode 100644
index 0000000000..24915fda25
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_006_pos.ksh
@@ -0,0 +1,63 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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.
+#
+
+function cleanup {
+
+ log_must $ZFS destroy $TESTPOOL/$TESTFS@snap
+ log_must $RM $TESTDIR/myfile.$$
+
+}
+
+log_assert "read xattr on a snapshot"
+log_onexit cleanup
+
+# create a file, and an xattr on it
+log_must $TOUCH $TESTDIR/myfile.$$
+create_xattr $TESTDIR/myfile.$$ passwd /etc/passwd
+
+# snapshot the filesystem
+log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap
+
+# check for the xattr on the snapshot
+verify_xattr $TESTDIR/.zfs/snapshot/snap/myfile.$$ passwd /etc/passwd
+
+log_pass "read xattr on a snapshot"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_007_neg.ksh
new file mode 100644
index 0000000000..bef602012e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_007_neg.ksh
@@ -0,0 +1,81 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+ log_must $ZFS destroy $TESTPOOL/$TESTFS@snap
+ log_must $RM $TESTDIR/myfile2.$$
+ log_must $RM $TESTDIR/myfile.$$
+ log_must $RM /tmp/output.$$
+ [[ -e /tmp/expected_output.$$ ]] && log_must $RM \
+ /tmp/expected_output.$$
+
+}
+
+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.$$
+create_xattr $TESTDIR/myfile.$$ passwd /etc/passwd
+
+# create another file that doesn't have an xattr
+log_must $TOUCH $TESTDIR/myfile2.$$
+
+# 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/.zfs/snapshot/snap/myfile.$$ \
+ $CP /etc/passwd . >/tmp/output.$$ 2>&1"
+log_must $GREP -i Read-only /tmp/output.$$
+
+log_must eval "$RUNAT $TESTDIR/.zfs/snapshot/snap/myfile2.$$ \
+ $LS >/tmp/output.$$ 2>&1"
+create_expected_output /tmp/expected_output.$$ SUNWattr_ro SUNWattr_rw
+log_must $DIFF /tmp/output.$$ /tmp/expected_output.$$
+
+log_pass "create/write xattr on a snapshot fails"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_008_pos.ksh
new file mode 100644
index 0000000000..40cc4a08eb
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_008_pos.ksh
@@ -0,0 +1,80 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+ typeset file
+
+ for file in /tmp/output.$$ /tmp/expected-output.$$ \
+ $TESTDIR/myfile.$$ ; do
+ log_must $RM -f $file
+ done
+}
+
+log_assert "special . and .. dirs work as expected for xattrs"
+log_onexit cleanup
+
+# create a file, and an xattr on it
+log_must $TOUCH $TESTDIR/myfile.$$
+create_xattr $TESTDIR/myfile.$$ passwd /etc/passwd
+
+# listing the directory .
+log_must eval "$RUNAT $TESTDIR/myfile.$$ $LS . > /tmp/output.$$"
+create_expected_output /tmp/expected-output.$$ \
+ SUNWattr_ro SUNWattr_rw passwd
+log_must $DIFF /tmp/output.$$ /tmp/expected-output.$$
+# list the directory . long form
+log_must eval "$RUNAT $TESTDIR/myfile.$$ $LS -a . > /tmp/output.$$"
+create_expected_output /tmp/expected-output.$$ . .. \
+ SUNWattr_ro SUNWattr_rw passwd
+log_must $DIFF /tmp/output.$$ /tmp/expected-output.$$
+
+# list the directory .. expecting one file
+OUTPUT=$($RUNAT $TESTDIR/myfile.$$ $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.$$ $LS ../ > /dev/null 2>&1"
+
+log_pass "special . and .. dirs work as expected for xattrs"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_009_neg.ksh
new file mode 100644
index 0000000000..40b361710e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_009_neg.ksh
@@ -0,0 +1,62 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+
+ log_must $RM $TESTDIR/myfile.$$
+
+}
+
+log_assert "links between xattr and normal file namespace fail"
+log_onexit cleanup
+
+# create a file, and an xattr on it
+log_must $TOUCH $TESTDIR/myfile.$$
+create_xattr $TESTDIR/myfile.$$ passwd /etc/passwd
+
+# Try to create a soft link from the xattr namespace to the default namespace
+log_mustnot $RUNAT $TESTDIR/myfile.$$ $LN -s /etc/passwd foo
+
+# Try to create a hard link from the xattr namespace to the default namespace
+log_mustnot $RUNAT $TESTDIR/myfile.$$ $LN /etc/passwd foo
+
+log_pass "links between xattr and normal file namespace fail"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_010_neg.ksh
new file mode 100644
index 0000000000..e3e23a428f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_010_neg.ksh
@@ -0,0 +1,66 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+#
+
+function cleanup {
+
+ log_must $RM $TESTDIR/myfile.$$
+}
+
+log_assert "mkdir, mknod fail"
+log_onexit cleanup
+
+# create a file, and an xattr on it
+log_must $TOUCH $TESTDIR/myfile.$$
+create_xattr $TESTDIR/myfile.$$ passwd /etc/passwd
+
+# Try to create directory in the xattr namespace
+log_mustnot $RUNAT $TESTDIR/myfile.$$ $MKDIR foo
+
+# Try to create a range of different filetypes in the xattr namespace
+log_mustnot $RUNAT $TESTDIR/myfile.$$ $MKNOD block b 888 888
+
+log_mustnot $RUNAT $TESTDIR/myfile.$$ $MKNOD char c
+
+log_mustnot $RUNAT $TESTDIR/myfile.$$ $MKNOD fifo p
+
+log_pass "mkdir, mknod fail"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_011_pos.ksh
new file mode 100644
index 0000000000..e3a8d26922
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_011_pos.ksh
@@ -0,0 +1,193 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2012 by Delphix. All rights reserved.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+
+ log_must $RM $TESTDIR/myfile.$$
+}
+
+log_assert "Basic applications work with xattrs: cpio cp find mv pax tar"
+log_onexit cleanup
+
+# 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.$$
+create_xattr $TESTDIR/myfile.$$ 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.$$
+create_xattr $TESTDIR/cpio.$$ passwd /etc/passwd
+$ECHO $TESTDIR/cpio.$$ | $CPIO -o@ > /tmp/xattr.$$.cpio
+$ECHO $TESTDIR/cpio.$$ | $CPIO -o > /tmp/noxattr.$$.cpio
+
+# we should have no xattr here
+log_must $CPIO -iu < /tmp/xattr.$$.cpio
+log_mustnot eval "$RUNAT $TESTDIR/cpio.$$ $CAT passwd > /dev/null 2>&1"
+
+# we should have an xattr here
+log_must $CPIO -iu@ < /tmp/xattr.$$.cpio
+log_must eval "$RUNAT $TESTDIR/cpio.$$ $CAT passwd > /dev/null 2>&1"
+
+# we should have no xattr here
+log_must $CPIO -iu < /tmp/noxattr.$$.cpio
+log_mustnot eval "$RUNAT $TESTDIR/cpio.$$ $CAT passwd > /dev/null 2>&1"
+
+# we should have no xattr here
+log_must $CPIO -iu@ < /tmp/noxattr.$$.cpio
+log_mustnot eval "$RUNAT $TESTDIR/cpio.$$ $CAT passwd > /dev/null 2>&1"
+log_must $RM $TESTDIR/cpio.$$ /tmp/xattr.$$.cpio /tmp/noxattr.$$.cpio
+
+
+
+log_note "Checking cp"
+# check that with the right flag, the xattr is preserved
+log_must $CP -@ $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$
+compare_xattrs $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$ passwd
+log_must $RM $TESTDIR/myfile2.$$
+
+# without the right flag, there should be no xattr
+log_must $CP $TESTDIR/myfile.$$ $TESTDIR/myfile2.$$
+log_mustnot eval "$RUNAT $TESTDIR/myfile2.$$ $LS passwd > /dev/null 2>&1"
+log_must $RM $TESTDIR/myfile2.$$
+
+
+
+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.$$
+[[ $? -ne 0 ]] && \
+ log_fail "find -xattr didn't find our file that had an xattr."
+$FIND $TESTDIR -xattr | $GREP no-xattr
+[[ $? -eq 0 ]] && \
+ log_fail "find -xattr found a file that didn't have an xattr."
+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.$$
+create_xattr $TESTDIR/mvfile.$$ passwd /etc/passwd
+log_must $MV $TESTDIR/mvfile.$$ $TESTDIR/mvfile2.$$
+verify_xattr $TESTDIR/mvfile2.$$ passwd /etc/passwd
+log_must $RM $TESTDIR/mvfile2.$$
+
+
+log_note "Checking pax"
+log_must $TOUCH $TESTDIR/pax.$$
+create_xattr $TESTDIR/pax.$$ passwd /etc/passwd
+log_must $PAX -w -f $TESTDIR/noxattr.pax $TESTDIR/pax.$$
+log_must $PAX -w@ -f $TESTDIR/xattr.pax $TESTDIR/pax.$$
+log_must $RM $TESTDIR/pax.$$
+
+# we should have no xattr here
+log_must $PAX -r -f $TESTDIR/noxattr.pax
+log_mustnot eval "$RUNAT $TESTDIR/pax.$$ $CAT passwd > /dev/null 2>&1"
+log_must $RM $TESTDIR/pax.$$
+
+# we should have no xattr here
+log_must $PAX -r@ -f $TESTDIR/noxattr.pax
+log_mustnot eval "$RUNAT $TESTDIR/pax.$$ $CAT passwd > /dev/null 2>&1"
+log_must $RM $TESTDIR/pax.$$
+
+
+# we should have an xattr here
+log_must $PAX -r@ -f $TESTDIR/xattr.pax
+verify_xattr $TESTDIR/pax.$$ passwd /etc/passwd
+log_must $RM $TESTDIR/pax.$$
+
+# we should have no xattr here
+log_must $PAX -r -f $TESTDIR/xattr.pax $TESTDIR
+log_mustnot eval "$RUNAT $TESTDIR/pax.$$ $CAT passwd > /dev/null 2>&1"
+log_must $RM $TESTDIR/pax.$$ $TESTDIR/noxattr.pax $TESTDIR/xattr.pax
+
+
+log_note "Checking tar"
+log_must $TOUCH $TESTDIR/tar.$$
+create_xattr $TESTDIR/tar.$$ passwd /etc/passwd
+
+log_must cd $TESTDIR
+
+log_must $TAR cf noxattr.tar tar.$$
+log_must $TAR c@f xattr.tar tar.$$
+log_must $RM $TESTDIR/tar.$$
+
+# we should have no xattr here
+log_must $TAR xf xattr.tar
+log_mustnot eval "$RUNAT $TESTDIR/tar.$$ $CAT passwd > /dev/null 2>&1"
+log_must $RM $TESTDIR/tar.$$
+
+# we should have an xattr here
+log_must $TAR x@f xattr.tar
+verify_xattr tar.$$ passwd /etc/passwd
+log_must $RM $TESTDIR/tar.$$
+
+# we should have no xattr here
+log_must $TAR xf $TESTDIR/noxattr.tar
+log_mustnot eval "$RUNAT $TESTDIR/tar.$$ $CAT passwd > /dev/null 2>&1"
+log_must $RM $TESTDIR/tar.$$
+
+# we should have no xattr here
+log_must $TAR x@f $TESTDIR/noxattr.tar
+log_mustnot eval "$RUNAT $TESTDIR/tar.$$ $CAT passwd > /dev/null 2>&1"
+log_must $RM $TESTDIR/tar.$$ $TESTDIR/noxattr.tar $TESTDIR/xattr.tar
+
+
+log_assert "Basic applications work with xattrs: cpio cp find mv pax tar"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_012_pos.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_012_pos.ksh
new file mode 100644
index 0000000000..477e155a36
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_012_pos.ksh
@@ -0,0 +1,103 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2012 by Delphix. All rights reserved.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+ log_must $RM $TESTDIR/myfile.$$
+}
+
+function get_pool_size {
+ poolname=$1
+ psize=$($ZPOOL list -H -o allocated $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
+ echo $returnvalue
+}
+
+log_assert "xattr file sizes count towards normal disk usage"
+log_onexit cleanup
+
+log_must $TOUCH $TESTDIR/myfile.$$
+
+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.$$ $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)
+ (($NEW_POOL_SIZE <= $POOL_SIZE)) && \
+ log_fail "The new pool size $NEW_POOL_SIZE was less \
+ than or equal to the old pool size $POOL_SIZE."
+
+fi
+
+# also make sure our filesystem usage has increased
+NEW_FS_SIZE=$($ZFS get -p -H -o value used $TESTPOOL/$TESTFS)
+(($NEW_FS_SIZE <= $FS_SIZE)) && \
+ log_fail "The new filesystem size $NEW_FS_SIZE was less \
+ than or equal to the old filesystem size $FS_SIZE."
+
+log_pass "xattr file sizes count towards normal disk usage"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_013_pos.ksh b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_013_pos.ksh
new file mode 100644
index 0000000000..4e9e12ecc9
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_013_pos.ksh
@@ -0,0 +1,88 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
+
+#
+# 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
+#
+
+function cleanup {
+
+ log_must $RM $TESTDIR/myfile.$$
+}
+
+
+log_assert "The noxattr mount option functions as expected"
+log_onexit cleanup
+
+$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.$$
+create_xattr $TESTDIR/myfile.$$ 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.$$ $CAT passwd > /dev/null 2>&1"
+log_mustnot eval "$RUNAT $TESTDIR/myfile.$$ $RM passwd > /dev/null 2>&1"
+log_mustnot eval "$RUNAT $TESTDIR/myfile.$$ $CP /etc/passwd . > /dev/null 2>&1"
+
+log_must $TOUCH $TESTDIR/new.$$
+log_mustnot eval "$RUNAT $TESTDIR/new.$$ $CP /etc/passwd . > /dev/null 2>&1"
+log_mustnot eval "$RUNAT $TESTDIR/new.$$ $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.$$ 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.$$ $CAT passwd > /dev/null 2>&1"
+create_xattr $TESTDIR/new.$$ passwd /etc/passwd
+
+log_pass "The noxattr mount option functions as expected"
diff --git a/usr/src/test/zfs-tests/tests/functional/xattr/xattr_common.kshlib b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_common.kshlib
new file mode 100644
index 0000000000..d6509a55a8
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/xattr/xattr_common.kshlib
@@ -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
+#
+
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+# 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 > /tmp/file1.$$
+ $RUNAT $FILE2 $CAT $XATTR_NAME > /tmp/file2.$$
+
+ log_must $DIFF /tmp/file1.$$ /tmp/file2.$$
+ log_must $RM /tmp/file1.$$ /tmp/file2.$$
+}
+
+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 > /tmp/$XATTR_NAME.$$ 2>&1"
+ log_must $DIFF $XATTR_CONTENTS /tmp/$XATTR_NAME.$$
+ $RM /tmp/$XATTR_NAME.$$
+}
+
+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 > /tmp/$XATTR_NAME.$$ 2>&1"
+ log_must $DD if=/etc/passwd of=/tmp/passwd_dd.$$
+ log_must $DIFF /tmp/passwd_dd.$$ /tmp/$XATTR_NAME.$$
+ log_must $RM /tmp/passwd_dd.$$ /tmp/$XATTR_NAME.$$
+}
+
+# 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/usr/src/test/zfs-tests/tests/functional/zvol/Makefile b/usr/src/test/zfs-tests/tests/functional/zvol/Makefile
new file mode 100644
index 0000000000..a9f20dda05
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/Makefile
@@ -0,0 +1,46 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+.PARALLEL: $(SUBDIRS)
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/zvol
+
+FILES = zvol.cfg \
+ zvol_common.shlib
+
+CMDS = $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+SUBDIRS = zvol_ENOSPC \
+ zvol_cli \
+ zvol_misc \
+ zvol_swap
+
+include $(SRC)/test/Makefile.com
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol.cfg b/usr/src/test/zfs-tests/tests/functional/zvol/zvol.cfg
new file mode 100644
index 0000000000..82b4f272e2
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol.cfg
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+export DISK=${DISKS%% *}
+
+export TESTVOL=testvol
+export TESTFILE=testfile
+export TESTSNAP=testsnap
+export VOLSIZE=2g
+export DATA=0
+export ENOSPC=28
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/Makefile b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/Makefile
new file mode 100644
index 0000000000..4bfc33d4b3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/Makefile
@@ -0,0 +1,41 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/zvol/zvol_ENOSPC
+
+PROGS = cleanup \
+ setup \
+ zvol_ENOSPC_001_pos
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/cleanup.ksh
new file mode 100644
index 0000000000..ee2c4510d7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/cleanup.ksh
@@ -0,0 +1,44 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+verify_runnable "global"
+
+ismounted $TESTDIR ufs
+(( $? == 0 )) && log_must $UMOUNT -f $TESTDIR
+
+[[ -e $TESTDIR ]] && $RM -rf $TESTDIR
+
+default_zvol_cleanup
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/setup.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/setup.ksh
new file mode 100644
index 0000000000..4a5045487d
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/setup.ksh
@@ -0,0 +1,45 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+verify_runnable "global"
+
+default_zvol_setup $DISK $VOLSIZE
+
+$ECHO "y" | $NEWFS -v /dev/zvol/rdsk/$TESTPOOL/$TESTVOL >/dev/null 2>&1
+(( $? != 0 )) && log_fail "Unable to newfs(1M) $TESTPOOL/$TESTVOL"
+
+log_must $MKDIR $TESTDIR
+log_must $MOUNT /dev/zvol/dsk/$TESTPOOL/$TESTVOL $TESTDIR
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh
new file mode 100644
index 0000000000..d0b645bd73
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_ENOSPC/zvol_ENOSPC_001_pos.ksh
@@ -0,0 +1,80 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol.cfg
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ $RM -rf $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
+
+BLOCKSZ=$(( 1024 * 1024 ))
+NUM_WRITES=40
+
+while (( 1 )); do
+ $FILE_WRITE -o create -f $TESTDIR/testfile$$.$fn \
+ -b $BLOCKSZ -c $NUM_WRITES
+ retval=$?
+ if (( $retval != 0 )); then
+ break
+ fi
+
+ (( fn = fn + 1 ))
+done
+
+(( $retval != $ENOSPC )) &&
+ log_fail "ENOSPC was not returned, $retval was received instead"
+
+log_pass "ENOSPC was returned as expected"
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/Makefile b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/Makefile
new file mode 100644
index 0000000000..0b80aecf34
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/Makefile
@@ -0,0 +1,45 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/zvol/zvol_cli
+
+PROGS = cleanup \
+ setup \
+ zvol_cli_001_pos \
+ zvol_cli_002_pos \
+ zvol_cli_003_neg
+
+FILES = zvol_cli.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/cleanup.ksh
new file mode 100644
index 0000000000..6cf8165009
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/cleanup.ksh
@@ -0,0 +1,39 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+verify_runnable "global"
+
+default_zvol_cleanup
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/setup.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/setup.ksh
new file mode 100644
index 0000000000..d18eea2292
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/setup.ksh
@@ -0,0 +1,39 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+verify_runnable "global"
+
+default_zvol_setup $DISK $VOLSIZE
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_001_pos.ksh
new file mode 100644
index 0000000000..21c98090d3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_001_pos.ksh
@@ -0,0 +1,63 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+TESTVOL='testvol'
+
+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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_002_pos.ksh
new file mode 100644
index 0000000000..b928f72ee4
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_002_pos.ksh
@@ -0,0 +1,62 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+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."
+
+LONGVOLNAME="volumename50charslong_0123456789012345678901234567"
+
+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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_003_neg.ksh
new file mode 100644
index 0000000000..d1ba6bf417
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_cli/zvol_cli_003_neg.ksh
@@ -0,0 +1,59 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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.
+#
+
+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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_common.shlib b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_common.shlib
new file mode 100644
index 0000000000..3bdd33334e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_common.shlib
@@ -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
+#
+
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol.cfg
+
+#
+# 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
+
+ set_dumpsize $TESTPOOL/$TESTVOL
+}
+
+#
+# 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
+}
+
+function get_dumpdevice
+{
+ typeset ret=$($DUMPADM | $GREP "Dump device:" | $AWK '{print $3}')
+ echo $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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/Makefile b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/Makefile
new file mode 100644
index 0000000000..ff821217a7
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/Makefile
@@ -0,0 +1,46 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/zvol/zvol_misc
+
+PROGS = cleanup \
+ setup \
+ zvol_misc_001_neg \
+ zvol_misc_002_pos \
+ zvol_misc_003_neg \
+ zvol_misc_004_pos \
+ zvol_misc_005_neg \
+ zvol_misc_006_pos
+
+CMDS = $(PROGS:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/cleanup.ksh
new file mode 100644
index 0000000000..6cf8165009
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/cleanup.ksh
@@ -0,0 +1,39 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+verify_runnable "global"
+
+default_zvol_cleanup
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/setup.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/setup.ksh
new file mode 100644
index 0000000000..9cd3247b90
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/setup.ksh
@@ -0,0 +1,43 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+verify_runnable "global"
+
+if ! $(is_physical_device $DISKS) ; then
+ log_unsupported "This directory cannot be run on raw files."
+fi
+
+default_zvol_setup $DISK $VOLSIZE
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_001_neg.ksh
new file mode 100644
index 0000000000..ece0adfe61
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_001_neg.ksh
@@ -0,0 +1,64 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+#
+# DESCRIPTION:
+# Verify that using a zvol as a dump device works.
+#
+# STRATEGY:
+# 1. Create a ZFS volume
+# 2. Use dumpadm add the volume as dump device
+# 3. Verify the return code as expected.
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ typeset dumpdev=$(get_dumpdevice)
+
+ if [[ $dumpdev != $savedumpdev ]] ; then
+ safe_dumpadm $savedumpdev
+ fi
+}
+
+log_assert "Verify that a ZFS volume can act as dump device."
+log_onexit cleanup
+
+voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL
+savedumpdev=$(get_dumpdevice)
+
+safe_dumpadm $voldev
+
+log_pass "Verify that a ZFS volume can act as dump device."
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_002_pos.ksh
new file mode 100644
index 0000000000..c53238cb33
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_002_pos.ksh
@@ -0,0 +1,91 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# 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
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ snapexists $TESTPOOL/$TESTVOL@snap && \
+ $ZFS destroy $TESTPOOL/$TESTVOL@snap
+
+ ismounted $TESTDIR ufs
+ (( $? == 0 )) && log_must $UMOUNT $TESTDIR
+
+ [[ -e $TESTDIR ]] && $RM -rf $TESTDIR
+}
+
+log_assert "Verify that ZFS volume snapshot could be fscked"
+log_onexit cleanup
+
+TESTVOL='testvol'
+BLOCKSZ=$(( 1024 * 1024 ))
+NUM_WRITES=40
+
+$ECHO "y" | $NEWFS -v /dev/zvol/rdsk/$TESTPOOL/$TESTVOL >/dev/null 2>&1
+(( $? != 0 )) && log_fail "Unable to newfs(1M) $TESTPOOL/$TESTVOL"
+
+log_must $MKDIR $TESTDIR
+log_must $MOUNT /dev/zvol/dsk/$TESTPOOL/$TESTVOL $TESTDIR
+
+typeset -i fn=0
+typeset -i retval=0
+
+while (( 1 )); do
+ $FILE_WRITE -o create -f $TESTDIR/testfile$$.$fn \
+ -b $BLOCKSZ -c $NUM_WRITES
+ retval=$?
+ if (( $retval != 0 )); then
+ break
+ fi
+
+ (( fn = fn + 1 ))
+done
+
+log_must $LOCKFS -f $TESTDIR
+log_must $ZFS snapshot $TESTPOOL/$TESTVOL@snap
+
+$FSCK -n /dev/zvol/rdsk/$TESTPOOL/$TESTVOL@snap >/dev/null 2>&1
+retval=$?
+(( $retval == 39 )) || log_fail "$FSCK exited with wrong value $retval "
+
+log_pass "Verify that ZFS volume snapshot could be fscked"
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_003_neg.ksh
new file mode 100644
index 0000000000..46168a1c3e
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_003_neg.ksh
@@ -0,0 +1,75 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+#
+# DESCRIPTION:
+# Verify creating a storage pool or running newfs on a zvol used as a
+# dump device is denied.
+#
+# STRATEGY:
+# 1. Create a ZFS volume
+# 2. Use dumpadm to set the volume as dump device
+# 3. Verify creating a pool & running newfs on the zvol returns an error.
+#
+
+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 zpool creation and newfs on dump zvol is denied."
+log_onexit cleanup
+
+voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL
+savedumpdev=$(get_dumpdevice)
+
+safe_dumpadm $voldev
+
+$ECHO "y" | $NEWFS -v $voldev > /dev/null 2>&1
+if (( $? == 0 )) ; then
+ log_fail "newfs on dump zvol succeeded unexpectedly"
+fi
+
+log_mustnot $ZPOOL create $TESTPOOL1 $voldev
+
+log_pass "Verify zpool creation and newfs on dump zvol is denied."
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_004_pos.ksh
new file mode 100644
index 0000000000..195dcfa5ce
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_004_pos.ksh
@@ -0,0 +1,109 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+#
+# DESCRIPTION:
+# Verify the ability to take snapshots of zvols used as dump or swap.
+#
+# STRATEGY:
+# 1. Create a ZFS volume
+# 2. Set the volume as dump or swap
+# 3. Verify creating a snapshot of the zvol succeeds.
+#
+
+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 $ZFS destroy -r $volume@snap0
+}
+
+log_assert "Verify the ability to take snapshots of zvols used as dump or swap."
+log_onexit cleanup
+
+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 "Creating snapshots from dump/swap zvols succeeds."
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_005_neg.ksh
new file mode 100644
index 0000000000..d145d0a8f3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_005_neg.ksh
@@ -0,0 +1,75 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+#
+# 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.
+#
+
+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."
+log_onexit cleanup
+
+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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_006_pos.ksh
new file mode 100644
index 0000000000..6f349eb952
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_misc/zvol_misc_006_pos.ksh
@@ -0,0 +1,72 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+#
+# 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
+#
+
+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"
+log_onexit cleanup
+
+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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/Makefile b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/Makefile
new file mode 100644
index 0000000000..7d463db092
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/Makefile
@@ -0,0 +1,48 @@
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+include $(SRC)/Makefile.master
+
+ROOTOPTPKG = $(ROOT)/opt/zfs-tests
+TESTDIR = $(ROOTOPTPKG)/tests/functional/zvol/zvol_swap
+
+PROGS = cleanup \
+ setup \
+ zvol_swap_001_pos \
+ zvol_swap_002_pos \
+ zvol_swap_003_pos \
+ zvol_swap_004_pos \
+ zvol_swap_005_pos \
+ zvol_swap_006_pos
+
+FILES = zvol_swap.cfg
+
+CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%)
+$(CMDS) := FILEMODE = 0555
+
+all lint clean clobber:
+
+install: $(CMDS)
+
+$(CMDS): $(TESTDIR)
+
+$(TESTDIR):
+ $(INS.dir)
+
+$(TESTDIR)/%: %
+ $(INS.file)
+
+$(TESTDIR)/%: %.ksh
+ $(INS.rename)
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/cleanup.ksh
new file mode 100644
index 0000000000..54ac2b7873
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/cleanup.ksh
@@ -0,0 +1,53 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_swap/zvol_swap.cfg
+
+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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/setup.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/setup.ksh
new file mode 100644
index 0000000000..e4274f0358
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/setup.ksh
@@ -0,0 +1,49 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_swap/zvol_swap.cfg
+
+verify_runnable "global"
+
+for i in $SAVESWAPDEVS ; do
+ log_note "Executing: swap -d $i"
+ $SWAP -d $i >/dev/null 2>&1
+ if [[ $? != 0 ]]; then
+ log_untested "Unable to delete swap device $i because of" \
+ "insufficient RAM"
+ fi
+done
+
+default_zvol_setup $DISK $VOLSIZE
+
+log_pass
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap.cfg b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap.cfg
new file mode 100644
index 0000000000..abc31a9e82
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap.cfg
@@ -0,0 +1,40 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/tests/functional/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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_001_pos.ksh
new file mode 100644
index 0000000000..7fc484f798
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_001_pos.ksh
@@ -0,0 +1,78 @@
+#! /usr/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_swap/zvol_swap.cfg
+
+#
+# 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 /tmp
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ $RM -rf /tmp/$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
+
+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 /tmp"
+log_must $FILE_WRITE -o create -f /tmp/$TESTFILE \
+ -b $BLOCKSZ -c $NUM_WRITES -d $DATA
+
+[[ ! -f /tmp/$TESTFILE ]] &&
+ log_fail "Unable to create file under /tmp"
+
+filesize=`$LS -l /tmp/$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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_002_pos.ksh
new file mode 100644
index 0000000000..be9b05f067
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_002_pos.ksh
@@ -0,0 +1,64 @@
+#!/bin/bash
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+#
+# DESCRIPTION:
+# Add a swap zvol, and consume most (not all) of the space. This test
+# used to fill up swap, which can hang the system.
+#
+# STRATEGY:
+# 1. Create a new zvol and add it as swap
+# 2. Fill /tmp with 80% the size of the zvol
+# 5. Remove the new zvol, and restore original swap devices
+#
+
+verify_runnable "global"
+log_assert "Using a zvol as swap space, fill /tmp to 80%."
+
+vol=$TESTPOOL/$TESTVOL
+swapdev=/dev/zvol/dsk/$vol
+log_must $SWAP -a $swapdev
+
+# Get 80% of the number of 512 blocks in the zvol
+typeset -i count blks volsize=$(get_prop volsize $vol)
+((blks = (volsize / 512) * 80 / 100))
+# Use 'blks' to determine a count for dd based on a 1M block size.
+((count = blks / 2048))
+
+log_note "Fill 80% of swap"
+log_must $DD if=/dev/urandom of=/tmp/$TESTFILE bs=1048576 count=$count
+log_must $RM -f /tmp/$TESTFILE
+log_must $SWAP -d $swapdev
+
+log_pass "Using a zvol as swap space, fill /tmp to 80%."
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_003_pos.ksh
new file mode 100644
index 0000000000..4a07d1a0c3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_003_pos.ksh
@@ -0,0 +1,96 @@
+#! /bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_swap/zvol_swap.cfg
+
+#
+# DESCRIPTION:
+# Verify that a zvol device can be used as a swap device
+# through /etc/vfstab configuration.
+#
+# STRATEGY:
+# 1. Modify /etc/vfstab to add the test zvol as swap device.
+# 2. Use /sbin/swapadd to add zvol as swap device throuth /etc/vfstab
+# 3. Create a file under /tmp and verify the file
+#
+
+verify_runnable "global"
+
+function cleanup
+{
+ [[ -f /tmp/$TESTFILE ]] && log_must $RM -f /tmp/$TESTFILE
+ [[ -f $NEW_VFSTAB_FILE ]] && log_must $RM -f $NEW_VFSTAB_FILE
+ [[ -f $PREV_VFSTAB_FILE ]] && \
+ log_must $MV $PREV_VFSTAB_FILE $VFSTAB_FILE
+ [[ -f $PREV_VFSTAB_FILE ]] && $RM -f $PREV_VFSTAB_FILE
+
+ 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
+
+voldev=/dev/zvol/dsk/$TESTPOOL/$TESTVOL
+VFSTAB_FILE=/etc/vfstab
+NEW_VFSTAB_FILE=/var/tmp/zvol_vfstab.$$
+PREV_VFSTAB_FILE=/var/tmp/zvol_vfstab.PREV.$$
+
+[[ -f $NEW_VFSTAB_FILE ]] && $CP /dev/null $NEW_VFSTAB_FILE
+
+$AWK '{if ($4 != "swap") print $1}' /etc/vfstab > $NEW_VFSTAB_FILE
+$ECHO "$voldev\t-\t-\tswap\t-\tno\t-" >> $NEW_VFSTAB_FILE
+
+# Copy off the original vfstab, and run swapadd on the newly constructed one.
+log_must $CP $VFSTAB_FILE $PREV_VFSTAB_FILE
+log_must $CP $NEW_VFSTAB_FILE $VFSTAB_FILE
+log_must $SWAPADD $VFSTAB_FILE
+
+log_must $FILE_WRITE -o create -f /tmp/$TESTFILE \
+ -b $BLOCKSZ -c $NUM_WRITES -d $DATA
+
+[[ ! -f /tmp/$TESTFILE ]] &&
+ log_fail "Unable to create file under /tmp"
+
+filesize=`$LS -l /tmp/$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/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_004_pos.ksh
new file mode 100644
index 0000000000..63f2738e3f
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_004_pos.ksh
@@ -0,0 +1,83 @@
+#!/bin/bash
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# When a swap zvol is added it is resized to be equal to 1/4 c_max,
+# capped between 2G and 16G.
+#
+# STRATEGY:
+# 1. Determine what 1/4 arc_c_max is.
+# 2. Create a zvols in a variety of sizes.
+# 3. Add them as swap, and verify the volsize is resized correctly.
+#
+
+verify_runnable "global"
+
+log_assert "For an added swap zvol, (2G <= volsize <= 16G)"
+
+typeset -i min max mem
+((mem = $($KSTAT -p ::arcstats:c_max | $AWK '{print $2}') / 4))
+((min = 2 * 1024 * 1024 * 1024))
+((max = 16 * 1024 * 1024 * 1024))
+
+for vbs in 512 1024 2048 4096 8192 16384 32768 65536 131072; do
+ for multiplier in 1 32 16384 131072; do
+ ((volsize = vbs * multiplier))
+ vol="$TESTPOOL/vol_$volsize"
+ swapname="/dev/zvol/dsk/$vol"
+
+ # Create a sparse volume to test larger sizes
+ log_must $ZFS create -s -b $vbs -V $volsize $vol
+ log_must $SWAP -a $swapname
+
+ if ((mem <= min)); then # volsize should be 2G
+ new_volsize=$(get_prop volsize $vol)
+ ((new_volsize == min)) || log_fail \
+ "Unexpected volsize: $new_volsize"
+ elif ((mem >= max)); then # volsize should be 16G
+ new_volsize=$(get_prop volsize $vol)
+ ((new_volsize == max)) || log_fail \
+ "Unexpected volsize: $new_volsize"
+ else # volsize should be 'mem'
+ new_volsize=$(get_prop volsize $vol)
+ ((new_volsize == mem)) || log_fail \
+ "Unexpected volsize: $new_volsize"
+ fi
+
+ log_must $SWAP -d $swapname
+ log_must $ZFS destroy $vol
+ done
+done
+
+log_pass "For an added swap zvol, (2G <= volsize <= 16G)"
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_005_pos.ksh
new file mode 100644
index 0000000000..51a72f19b3
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_005_pos.ksh
@@ -0,0 +1,69 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+#
+# 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.
+#
+
+verify_runnable "global"
+
+assertion="Verify the sum of swaplow and swaplen is less or equal to volsize"
+log_assert $assertion
+
+typeset vol=$TESTPOOL/$TESTVOL
+typeset swapname="/dev/zvol/dsk/$vol"
+typeset -i pageblocks volblocks max_swaplow
+#
+# 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))
+((max_swaplow = (volblocks - (pageblocks * 2))))
+
+for i in {0..10}; do
+ swaplow=$($SHUF -n 1 -i ${pageblocks}-${max_swaplow})
+ ((maxlen = max_swaplow - swaplow))
+ swaplen=$($SHUF -n 1 -i ${pageblocks}-${maxlen})
+ log_must $SWAP -a $swapname $swaplow $swaplen
+ log_must $SWAP -d $swapname $swaplow
+done
+
+log_pass $assertion
diff --git a/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_006_pos.ksh
new file mode 100644
index 0000000000..20dcaa0ae0
--- /dev/null
+++ b/usr/src/test/zfs-tests/tests/functional/zvol/zvol_swap/zvol_swap_006_pos.ksh
@@ -0,0 +1,108 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this 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 (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+. $STF_SUITE/tests/functional/zvol/zvol_common.shlib
+
+#
+# DESCRIPTION:
+# A volume can be added as several segments, but overlapping segments
+# 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.
+#
+
+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
+
+# swap -a won't allow the use of multiple segments of the same volume unless
+# libdiskmgmt is disabled with the environment variable below.
+typeset -x NOINUSE_CHECK=1
+
+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."