xref: /freebsd-13-stable/tests/sys/cddl/zfs/tests/delegate/delegate_common.kshlib (revision 023fc80ee38a117fa65b2ccb2abf8bdc7dbd6fd9)
1# vim: filetype=sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26#
27# ident	"@(#)delegate_common.kshlib	1.6	08/05/14 SMI"
28#
29
30. $STF_SUITE/include/libtest.kshlib
31
32#
33# Cleanup exist user/group.
34#
35function cleanup_user_group
36{
37	typeset i
38	for i in $STAFF1 $STAFF2 $OTHER1 $OTHER2 ; do
39		del_user $i
40	done
41	for i in $STAFF_GROUP $OTHER_GROUP ; do
42		del_group $i
43	done
44
45	return 0
46}
47
48#
49# Restore test file system to the original status.
50#
51function restore_root_datasets
52{
53	if datasetexists $ROOT_TESTFS ; then
54		log_must $ZFS destroy -Rf $ROOT_TESTFS
55	fi
56	log_must $ZFS create $ROOT_TESTFS
57
58	if is_global_zone ; then
59		if datasetexists $ROOT_TESTVOL ; then
60			log_must $ZFS destroy -Rf $ROOT_TESTVOL
61		fi
62		log_must $ZFS create -V $VOLSIZE $ROOT_TESTVOL
63	fi
64
65	return 0
66}
67
68#
69# Verify the specified user have permission on the dataset
70#
71# $1 dataset
72# $2 permissions which are separated by comma(,)
73# $3-n users
74#
75function verify_perm
76{
77	typeset dtst=$1
78	typeset permissions=$2
79	shift 2
80
81	if [[ -z $@ || -z $permissions || -z $dtst ]]; then
82		return 1
83	fi
84
85	typeset type=$(get_prop type $dtst)
86	permissions=$($ECHO $permissions | $TR -s "," " ")
87
88	typeset user
89	for user in $@; do
90		typeset perm
91		for perm in $permissions; do
92			typeset -i ret=1
93			if [[ $type == "filesystem" ]]; then
94				check_fs_perm $user $perm $dtst
95				ret=$?
96			elif [[ $type == "volume" ]]; then
97				check_vol_perm $user $perm $dtst
98				ret=$?
99			fi
100
101			if ((ret != 0)) ; then
102				log_note "Fail: $user should have $perm " \
103					"on $dtst"
104				return 1
105			fi
106		done
107	done
108
109	return 0
110}
111
112#
113# Verify the specified user have no permission on the dataset
114#
115# $1 dataset
116# $2 permissions which are separated by comma(,)
117# $3-n users
118#
119function verify_noperm
120{
121	typeset dtst=$1
122	typeset permissions=$2
123	shift 2
124
125	if [[ -z $@ || -z $permissions || -z $dtst ]]; then
126		return 1
127	fi
128
129	typeset type=$(get_prop type $dtst)
130	permissions=$($ECHO $permissions | $TR -s "," " ")
131
132	typeset user
133	for user in $@; do
134		typeset perm
135		for perm in $permissions; do
136			typeset -i ret=1
137			if [[ $type == "filesystem" ]]; then
138				check_fs_perm $user $perm $dtst
139				ret=$?
140			elif [[ $type == "volume" ]]; then
141				check_vol_perm $user $perm $dtst
142				ret=$?
143			fi
144
145			if ((ret == 0)) ; then
146				log_note "Fail: $user should not have $perm " \
147					"on $dtst"
148				return 1
149			fi
150		done
151	done
152
153	return 0
154}
155
156function user_run
157{
158	typeset user=$1
159	typeset group=$($GROUPS $user)
160	shift
161
162	sudo -u $user -g $group $@
163}
164
165function common_perm
166{
167	typeset user=$1
168	typeset perm=$2
169	typeset dtst=$3
170
171	typeset -i ret=1
172	case $perm in
173		send)
174			verify_send $user $perm $dtst
175			ret=$?
176			;;
177		allow)
178			verify_allow $user $perm $dtst
179			ret=$?
180			;;
181		userprop)
182			verify_userprop $user $perm $dtst
183			ret=$?
184			;;
185		compression|checksum|readonly)
186			verify_ccr $user $perm $dtst
187			ret=$?
188			;;
189		copies)
190			verify_copies $user $perm $dtst
191			ret=$?
192			;;
193		reservation)
194			verify_reservation $user $perm $dtst
195			ret=$?
196			;;
197		*)
198			ret=1
199			;;
200	esac
201
202	return $ret
203}
204
205function check_fs_perm
206{
207	typeset user=$1
208	typeset perm=$2
209	typeset fs=$3
210
211	typeset -i ret=1
212	case $perm in
213		create)
214			verify_fs_create $user $perm $fs
215			ret=$?
216			;;
217		destroy)
218			verify_fs_destroy $user $perm $fs
219			ret=$?
220			;;
221		snapshot)
222			verify_fs_snapshot $user $perm $fs
223			ret=$?
224			;;
225		rollback)
226			verify_fs_rollback $user $perm $fs
227			ret=$?
228			;;
229		clone)
230			verify_fs_clone $user $perm $fs
231			ret=$?
232			;;
233		rename)
234			verify_fs_rename $user $perm $fs
235			ret=$?
236			;;
237		mount)
238			verify_fs_mount $user $perm $fs
239			ret=$?
240			;;
241		share)
242			verify_fs_share $user $perm $fs
243			ret=$?
244			;;
245		mountpoint)
246			verify_fs_mountpoint $user $perm $fs
247			ret=$?
248			;;
249		promote)
250			verify_promote $user $perm $fs
251			ret=$?
252			;;
253		canmount)
254			verify_fs_canmount $user $perm $fs
255			ret=$?
256			;;
257		recordsize)
258			verify_fs_recordsize $user $perm $fs
259			ret=$?
260			;;
261		quota)
262			verify_fs_quota $user $perm $fs
263			ret=$?
264			;;
265		aclmode)
266			verify_fs_aclmode $user $perm $fs
267			ret=$?
268			;;
269		aclinherit)
270			verify_fs_aclinherit $user $perm $fs
271			ret=$?
272			;;
273		snapdir)
274			verify_fs_snapdir $user $perm $fs
275			ret=$?
276			;;
277		atime|exec|devices|setuid|xattr)
278			verify_fs_aedsx $user $perm $fs
279			ret=$?
280			;;
281		zoned)
282			verify_fs_zoned $user $perm $fs
283			ret=$?
284			;;
285		sharenfs)
286			verify_fs_sharenfs $user $perm $fs
287			ret=$?
288			;;
289		shareiscsi)
290			verify_fs_shareiscsi $user $perm $fs
291			ret=$?
292			;;
293		receive)
294			verify_fs_receive $user $perm $fs
295			ret=$?
296			;;
297		*)
298			common_perm $user $perm $fs
299			ret=$?
300			;;
301	esac
302
303	return $ret
304}
305
306function check_vol_perm
307{
308	typeset user=$1
309	typeset perm=$2
310	typeset vol=$3
311
312	typeset -i ret=1
313	case $perm in
314		destroy)
315			verify_vol_destroy $user $perm $vol
316			ret=$?
317			;;
318		snapshot)
319			verify_vol_snapshot $user $perm $vol
320			ret=$?
321			;;
322		rollback)
323			verify_vol_rollback $user $perm $vol
324			ret=$?
325			;;
326		clone)
327			verify_vol_clone $user $perm $vol
328			ret=$?
329			;;
330		rename)
331			verify_vol_rename $user $perm $vol
332			ret=$?
333			;;
334		promote)
335			verify_promote $user $perm $vol
336			ret=$?
337			;;
338		volsize)
339			verify_vol_volsize $user $perm $vol
340			ret=$?
341			;;
342		shareiscsi)
343			verify_vol_shareiscsi $user $perm $vol
344			ret=$?
345			;;
346		*)
347			common_perm $user $perm $vol
348			ret=$?
349			;;
350	esac
351
352	return $ret
353}
354
355function setup_unallow_testenv
356{
357	typeset dtst
358
359	log_must restore_root_datasets
360
361	log_must $ZFS create $SUBFS
362
363	for dtst in $DATASETS ; do
364		log_must $ZFS allow -l $STAFF1 $LOCAL_SET $dtst
365		log_must $ZFS allow -d $STAFF2 $DESC_SET  $dtst
366		log_must $ZFS allow $OTHER1 $LOCAL_DESC_SET $dtst
367		log_must $ZFS allow $OTHER2 $LOCAL_DESC_SET $dtst
368
369		log_must verify_perm $dtst $LOCAL_SET $STAFF1
370		log_must verify_perm $dtst $LOCAL_DESC_SET $OTHER1
371		log_must verify_perm $dtst $LOCAL_DESC_SET $OTHER2
372		if [[ $dtst == $ROOT_TESTFS ]]; then
373			log_must verify_perm $SUBFS $DESC_SET $STAFF2
374			log_must verify_perm $SUBFS $LOCAL_DESC_SET $OTHER1
375			log_must verify_perm $SUBFS $LOCAL_DESC_SET $OTHER2
376		fi
377	done
378
379	return 0
380}
381
382#
383# Verify permission send for specified user on the dataset
384# $1 user
385# $2 permission
386# $3 dataset
387#
388function verify_send
389{
390	typeset user=$1
391	typeset perm=$2
392	typeset dtst=$3
393
394	typeset oldval
395	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
396	typeset snap=$dtst@snap.$stamp
397
398	typeset -i ret=1
399
400	log_must $ZFS snapshot $snap
401	typeset bak_user=$TMPDIR/bak.$user.$stamp
402	typeset bak_root=$TMPDIR/bak.root.$stamp
403
404	user_run $user $ZFS send $snap > $bak_user
405	log_must eval "$ZFS send $snap > $bak_root"
406	log_must $ZFS destroy $snap
407
408	if [[ $(checksum $bak_user) == $(checksum $bak_root) ]]; then
409		ret=0
410	fi
411
412	$RM -rf $bak_user > /dev/null
413	$RM -rf $bak_root > /dev/null
414
415	return $ret
416}
417
418function verify_fs_receive
419{
420	typeset user=$1
421	typeset perm=$2
422	typeset fs=$3
423
424	typeset dtst
425	typeset oldval
426	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
427	typeset newfs=$fs/newfs.$stamp
428	typeset newvol=$fs/newvol.$stamp
429	typeset bak_user=$TMPDIR/bak.$user.$stamp
430	typeset bak_root=$TMPDIR/bak.root.$stamp
431
432	log_must $ZFS create $newfs
433	typeset datasets="$newfs"
434	if is_global_zone ; then
435		log_must $ZFS create -V $VOLSIZE $newvol
436		datasets="$newfs $newvol"
437	fi
438
439	for dtst in $datasets ; do
440
441		typeset dtstsnap=$dtst@snap.$stamp
442		log_must $ZFS snapshot $dtstsnap
443
444		log_must eval "$ZFS send $dtstsnap > $bak_root"
445		log_must $ZFS destroy -rf $dtst
446
447		user_run $user $ZFS receive $dtst < $bak_root
448		if datasetexists $dtstsnap ; then
449			return 1
450		fi
451
452		log_must $ZFS allow $user create $fs
453		user_run $user $ZFS receive $dtst < $bak_root
454		log_must $ZFS unallow $user create $fs
455		if datasetexists $dtstsnap ; then
456			return 1
457		fi
458
459		log_must $ZFS allow $user mount $fs
460		user_run $user $ZFS receive $dtst < $bak_root
461		log_must $ZFS unallow $user mount $fs
462		if datasetexists $dtstsnap ; then
463			return 1
464		fi
465
466		log_must $ZFS allow $user mount,create $fs
467		user_run $user $ZFS receive $dtst < $bak_root
468		log_must $ZFS unallow $user mount,create $fs
469		if ! datasetexists $dtstsnap ; then
470			return 1
471		fi
472
473		# check the data integrity
474		log_must eval "$ZFS send $dtstsnap > $bak_user"
475		log_must $ZFS destroy -rf $dtst
476		log_must eval "$ZFS receive $dtst < $bak_root"
477		log_must eval "$ZFS send $dtstsnap > $bak_root"
478		log_must $ZFS destroy -rf $dtst
479		if [[ $(checksum $bak_user) != $(checksum $bak_root) ]]; then
480			return 1
481		fi
482
483		$RM -rf $bak_user > /dev/null
484		$RM -rf $bak_root > /dev/null
485
486	done
487
488	return 0
489}
490
491function verify_userprop
492{
493	typeset user=$1
494	typeset perm=$2
495	typeset dtst=$3
496
497	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
498
499	user_run $user $ZFS set "$user:ts=$stamp" $dtst
500	if [[ $stamp != $(get_prop "$user:ts" $dtst) ]]; then
501		return 1
502	fi
503	log_must $ZFS inherit "$user:ts" $dtst
504
505	return 0
506}
507
508function verify_ccr
509{
510	typeset user=$1
511	typeset perm=$2
512	typeset dtst=$3
513
514	typeset oldval
515
516	set -A modes "on" "off"
517	oldval=$(get_prop $perm $dtst)
518	if [[ $oldval == "on" ]]; then
519		n=1
520	elif [[ $oldval == "off" ]]; then
521		n=0
522	fi
523	log_note "$user $ZFS set $perm=${modes[$n]} $dtst"
524	user_run $user $ZFS set $perm=${modes[$n]} $dtst
525	if [[ ${modes[$n]} != $(get_prop $perm $dtst) ]]; then
526		return 1
527	fi
528
529	return 0
530}
531
532function verify_copies
533{
534	typeset user=$1
535	typeset perm=$2
536	typeset dtst=$3
537
538	typeset oldval
539
540	set -A modes 1 2 3
541	oldval=$(get_prop $perm $dtst)
542	if [[ $oldval -eq 1 ]]; then
543		n=1
544	elif [[ $oldval -eq 2 ]]; then
545		n=2
546	elif [[ $oldval -eq 3 ]]; then
547		n=0
548	fi
549	log_note "$user $ZFS set $perm=${modes[$n]} $dtst"
550	user_run $user $ZFS set $perm=${modes[$n]} $dtst
551	if [[ ${modes[$n]} != $(get_prop $perm $dtst) ]]; then
552		return 1
553	fi
554
555	return 0
556}
557
558function verify_reservation
559{
560	typeset user=$1
561	typeset perm=$2
562	typeset dtst=$3
563
564	typeset value32m=$(( 1024 * 1024 * 32 ))
565	typeset oldval=$(get_prop reservation $dtst)
566	user_run $user $ZFS set reservation=$value32m $dtst
567	if [[ $value32m != $(get_prop reservation $dtst) ]]; then
568		log_must $ZFS set reservation=$oldval $dtst
569		return 1
570	fi
571
572	log_must $ZFS set reservation=$oldval $dtst
573	return 0
574}
575
576function verify_fs_create
577{
578	typeset user=$1
579	typeset perm=$2
580	typeset fs=$3
581
582	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
583	typeset newfs=$fs/nfs.$stamp
584	typeset newvol=$fs/nvol.$stamp
585
586	user_run $user $ZFS create $newfs
587	if datasetexists $newfs ; then
588		return 1
589	fi
590
591	log_must $ZFS allow $user mount $fs
592	user_run $user $ZFS create $newfs
593	log_must $ZFS unallow $user mount $fs
594	if ! datasetexists $newfs ; then
595		return 1
596	fi
597	log_must $ZFS destroy $newfs
598
599	if is_global_zone ; then
600		# mount permission is required for sparse volume
601		user_run $user $ZFS create -V 150m -s $newvol
602		if datasetexists $newvol ; then
603			return 1
604		fi
605
606		log_must $ZFS allow $user mount $fs
607		user_run $user $ZFS create -V 150m -s $newvol
608		log_must $ZFS unallow $user mount $fs
609		if ! datasetexists $newvol ; then
610			return 1
611		fi
612		log_must $ZFS destroy $newvol
613
614		# mount and reserveration permission are
615		# required for normal volume
616		user_run $user $ZFS create -V 150m $newvol
617		if datasetexists $newvol ; then
618			return 1
619		fi
620
621		log_must $ZFS allow $user mount $fs
622		user_run $user $ZFS create -V 150m $newvol
623		log_must $ZFS unallow $user mount $fs
624		if datasetexists $newvol ; then
625			return 1
626		fi
627
628		log_must $ZFS allow $user reservation $fs
629		user_run $user $ZFS create -V 150m $newvol
630		log_must $ZFS unallow $user reservation $fs
631		if datasetexists $newvol ; then
632			return 1
633		fi
634
635		log_must $ZFS allow $user refreservation $fs
636		user_run $user $ZFS create -V 150m $newvol
637		log_must $ZFS unallow $user refreservation $fs
638		if datasetexists $newvol ; then
639			return 1
640		fi
641
642		log_must $ZFS allow $user mount $fs
643		log_must $ZFS allow $user reservation $fs
644		log_must $ZFS allow $user refreservation $fs
645		user_run $user $ZFS create -V 150m $newvol
646		log_must $ZFS unallow $user mount $fs
647		log_must $ZFS unallow $user reservation $fs
648		log_must $ZFS unallow $user refreservation $fs
649		if ! datasetexists $newvol ; then
650			return 1
651		fi
652		log_must $ZFS destroy $newvol
653	fi
654
655	return 0
656}
657
658function verify_fs_destroy
659{
660	typeset user=$1
661	typeset perm=$2
662	typeset fs=$3
663
664	if ! ismounted $fs ; then
665		user_run $user $ZFS destroy $fs
666		if datasetexists $fs ; then
667			return 1
668		fi
669	fi
670
671	if ismounted $fs ; then
672		user_run $user $ZFS destroy $fs
673		if ! datasetexists $fs ; then
674			return 1
675		fi
676
677		# mount permission is required
678		log_must $ZFS allow $user mount $fs
679		user_run $user $ZFS destroy $fs
680		if datasetexists $fs ; then
681			return 1
682		fi
683	fi
684
685	return 0
686}
687
688function verify_fs_snapshot
689{
690	typeset user=$1
691	typeset perm=$2
692	typeset fs=$3
693
694	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
695	typeset snap=$fs@snap.$stamp
696	typeset mntpt=$(get_prop mountpoint $fs)
697
698	if [[ "yes" == $(get_prop mounted $fs) ]]; then
699		log_must $ZFS umount $fs
700	fi
701	user_run $user $ZFS snapshot $snap
702	if ! datasetexists $snap ; then
703		return 1
704	fi
705	log_must $ZFS destroy $snap
706
707	if [[ "no" == $(get_prop mounted $fs) ]]; then
708		log_must $ZFS mount $fs
709	fi
710	user_run $user $ZFS snapshot $snap
711	if ! datasetexists $snap ; then
712		return 1
713	fi
714	log_must $ZFS destroy $snap
715
716	# TODO
717	# FreeBSD does not yet support creating snapshots with mkdir.
718	# See tests/sys/cddl/zfs/tests/snapshot/snapshot_015_pos.ksh
719	# typeset snapdir=${mntpt}/$(get_snapdir_name)/snap.$stamp
720	# user_run $user $MKDIR $snapdir
721	# if ! datasetexists $snap ; then
722		# return 1
723	# fi
724	# log_must $ZFS destroy $snap
725
726	return 0
727}
728
729function verify_fs_rollback
730{
731	typeset user=$1
732	typeset perm=$2
733	typeset fs=$3
734
735	typeset oldval
736	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
737	typeset snap=$fs@snap.$stamp
738	typeset mntpt=$(get_prop mountpoint $fs)
739
740	oldval=$(datasetcksum $fs)
741	log_must $ZFS snapshot $snap
742
743	if ! ismounted $fs; then
744		log_must $ZFS mount $fs
745	fi
746	log_must $TOUCH $mntpt/testfile.$stamp
747
748	user_run $user $ZFS rollback -R $snap
749	if [[ -e $mntpt/testfile.$stamp ]]; then
750		return 1
751	fi
752
753	# rollback on mounted fs has to be with mount permission
754	log_must $ZFS allow $user mount $fs
755	user_run $user $ZFS rollback -R $snap
756	log_must $ZFS unallow $user mount $fs
757	if is_global_zone ; then
758		if [[ $oldval != $(datasetcksum $fs) ]]; then
759			return 1
760		fi
761	else
762		# datasetcksum can not be used in local zone
763		if [[ -e $mntpt/testfile.$stamp ]]; then
764			return 1
765		fi
766	fi
767
768	return 0
769}
770
771function verify_fs_clone
772{
773	typeset user=$1
774	typeset perm=$2
775	typeset fs=$3
776
777	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
778        typeset basefs=${fs%/*}
779	typeset snap=$fs@snap.$stamp
780	typeset clone=$basefs/cfs.$stamp
781
782	log_must $ZFS snapshot $snap
783	user_run $user $ZFS clone $snap $clone
784	if datasetexists $clone ; then
785		return 1
786	fi
787
788	log_must $ZFS allow $user create $basefs
789	user_run $user $ZFS clone $snap $clone
790	log_must $ZFS unallow $user create $basefs
791	if datasetexists $clone ; then
792		return 1
793	fi
794
795	log_must $ZFS allow $user mount $basefs
796	user_run $user $ZFS clone $snap $clone
797	log_must $ZFS unallow $user mount $basefs
798	if datasetexists $clone ; then
799		return 1
800	fi
801
802	log_must $ZFS allow $user mount $basefs
803	log_must $ZFS allow $user create $basefs
804	user_run $user $ZFS clone $snap $clone
805	log_must $ZFS unallow $user create $basefs
806	log_must $ZFS unallow $user mount $basefs
807	if ! datasetexists $clone ; then
808		return 1
809	fi
810
811	log_must $ZFS destroy -R $snap
812
813	return 0
814}
815
816function verify_fs_rename
817{
818	typeset user=$1
819	typeset perm=$2
820	typeset fs=$3
821
822	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
823        typeset basefs=${fs%/*}
824	typeset snap=$fs@snap.$stamp
825	typeset renamefs=$basefs/nfs.$stamp
826
827	if ! ismounted $fs; then
828		log_must $ZFS mount $fs
829	fi
830
831	# case 1
832	user_run $user $ZFS rename $fs $renamefs
833	if datasetexists $renamefs ; then
834		return 1
835	fi
836
837	# case 2
838	log_must $ZFS allow $user create $basefs
839	user_run $user $ZFS rename $fs $renamefs
840	log_must $ZFS unallow $user create $basefs
841	if datasetexists $renamefs ; then
842		return 1
843	fi
844
845	# case 3
846	log_must $ZFS allow $user mount $basefs
847	user_run $user $ZFS rename $fs $renamefs
848	log_must $ZFS unallow $user mount $basefs
849	if datasetexists $renamefs ; then
850		return 1
851	fi
852
853	# case 4
854	log_must $ZFS allow $user mount $fs
855	user_run $user $ZFS rename $fs $renamefs
856	if datasetexists $renamefs ; then
857		log_must $ZFS unallow $user mount $renamefs
858		return 1
859	fi
860	log_must $ZFS unallow $user mount $fs
861
862	# case 5
863	log_must $ZFS allow $user create $basefs
864	log_must $ZFS allow $user mount $fs
865	user_run $user $ZFS rename $fs $renamefs
866	log_must $ZFS unallow $user create $basefs
867	if datasetexists $renamefs ; then
868		log_must $ZFS unallow $user mount $renamefs
869		return 1
870	fi
871	log_must $ZFS unallow $user mount $fs
872
873	# case 6
874	log_must $ZFS allow $user mount $basefs
875	log_must $ZFS allow $user mount $fs
876	user_run $user $ZFS rename $fs $renamefs
877	log_must $ZFS unallow $user mount $basefs
878	if datasetexists $renamefs ; then
879		log_must $ZFS unallow $user mount $renamefs
880		return 1
881	fi
882	log_must $ZFS unallow $user mount $fs
883
884	# case 7
885	log_must $ZFS allow $user create $basefs
886	log_must $ZFS allow $user mount $basefs
887	user_run $user $ZFS rename $fs $renamefs
888	log_must $ZFS unallow $user mount $basefs
889	log_must $ZFS unallow $user create $basefs
890	if ! datasetexists $renamefs ; then
891		return 1
892	fi
893
894	log_must $ZFS rename $renamefs $fs
895
896	return 0
897}
898
899function verify_fs_mount
900{
901	typeset user=$1
902	typeset perm=$2
903	typeset fs=$3
904
905	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
906	typeset mntpt=$(get_prop mountpoint $fs)
907	typeset newmntpt=$TMPDIR/mnt.$stamp
908
909	if ismounted $fs ; then
910		user_run $user $ZFS unmount $fs
911		if ismounted $fs ; then
912			return 1
913		fi
914	fi
915
916	if ! ismounted $fs ; then
917		log_must $ZFS set mountpoint=$newmntpt $fs
918		log_must $RM -rf $newmntpt
919		log_must $MKDIR $newmntpt
920
921		user_run $user $ZFS mount $fs
922		if ismounted $fs ; then
923			return 1
924		fi
925
926		# mountpoint's owner must be the user
927		log_must $CHOWN $user $newmntpt
928		user_run $user $ZFS mount $fs
929		if ! ismounted $fs ; then
930			return 1
931		fi
932		log_must $ZFS umount $fs
933		log_must $RM -rf $newmntpt
934		log_must $ZFS set mountpoint=$mntpt $fs
935	fi
936
937	return 0
938}
939
940function verify_fs_share
941{
942	typeset user=$1
943	typeset perm=$2
944	typeset fs=$3
945
946	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
947	typeset mntpt=$(get_prop mountpoint $fs)
948
949	typeset stat=$($SVCS -H -o STA nfs/server:default)
950	if [[ $stat != "ON" ]]; then
951		log_note "Current nfs/server status: $stat"
952		# legacy share
953		user_run $user $SHARE $mntpt
954		if is_shared $fs; then
955			return 1
956		fi
957
958		# sharenfs=on
959		log_must $ZFS set sharenfs=on $fs
960		user_run $user $ZFS share $fs
961		if is_shared $fs; then
962			log_must $ZFS set sharenfs=off $fs
963			return 1
964		fi
965		log_must $ZFS set sharenfs=off $fs
966	fi
967
968	# turn on nfs/server service if it is not enabled
969	typeset tmpshare=$TMPDIR/a.${TESTCASE_ID}
970	$RM -rf $tmpshare
971	log_must $MKDIR -p $tmpshare
972	log_must $SHARE $tmpshare
973
974	# legacy share
975	user_run $user $SHARE $mntpt
976	if ! is_shared $fs ; then
977		log_must $UNSHARE $tmpshare
978		log_must $RM -rf $tmpshare
979		return 1
980	fi
981
982	user_run $user $UNSHARE $mntpt
983	if is_shared $fs ; then
984		log_must $UNSHARE $tmpshare
985		log_must $RM -rf $tmpshare
986		return 1
987	fi
988
989	# sharenfs=on
990	log_must $ZFS set sharenfs=on $fs
991	user_run $user $ZFS share $fs
992	if ! is_shared $fs; then
993		log_must $ZFS set sharenfs=off $fs
994		return 1
995	fi
996
997	user_run $user $ZFS unshare $fs
998	if is_shared $fs; then
999		log_must $ZFS set sharenfs=off $fs
1000		return 1
1001	fi
1002	log_must $ZFS set sharenfs=off $fs
1003
1004	log_must $UNSHARE $tmpshare
1005	log_must $RM -rf $tmpshare
1006
1007	return 0
1008}
1009
1010function verify_fs_mountpoint
1011{
1012	typeset user=$1
1013	typeset perm=$2
1014	typeset fs=$3
1015
1016	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
1017	typeset mntpt=$(get_prop mountpoint $fs)
1018	typeset newmntpt=$TMPDIR/mnt.$stamp
1019
1020	if ! ismounted $fs ; then
1021		user_run $user $ZFS set mountpoint=$newmntpt $fs
1022		if [[ $newmntpt != \
1023			$(get_prop mountpoint $fs) ]] ; then
1024			return 1
1025		fi
1026		log_must $ZFS set mountpoint=$mntpt $fs
1027	fi
1028
1029	if ismounted $fs ; then
1030		user_run $user $ZFS set mountpoint=$newmntpt $fs
1031		if [[ $mntpt != $(get_prop mountpoint $fs) ]] ;
1032	       			then
1033			return 1
1034		fi
1035
1036		# require mount permission when fs is mounted
1037		log_must $ZFS allow $user mount $fs
1038		user_run $user $ZFS set mountpoint=$newmntpt $fs
1039		log_must $ZFS unallow $user mount $fs
1040		if [[ $newmntpt != \
1041			$(get_prop mountpoint $fs) ]] ; then
1042			return 1
1043		fi
1044		log_must $ZFS set mountpoint=$mntpt $fs
1045	fi
1046
1047	return 0
1048}
1049
1050function verify_promote
1051{
1052	typeset user=$1
1053	typeset perm=$2
1054	typeset fs=$3
1055
1056	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
1057        typeset basefs=${fs%/*}
1058	typeset snap=$fs@snap.$stamp
1059	typeset clone=$basefs/cfs.$stamp
1060
1061	log_must $ZFS snapshot $snap
1062	log_must $ZFS clone $snap $clone
1063	log_must $ZFS promote $clone
1064
1065	typeset fs_orig=$(get_prop origin $fs)
1066	typeset clone_orig=$(get_prop origin $clone)
1067
1068	user_run $user $ZFS promote $fs
1069	# promote should fail if original fs does not have mount and promote
1070	# permissions
1071	if [[ $fs_orig != $(get_prop origin $fs) || \
1072		$clone_orig != $(get_prop origin $clone) ]]; then
1073		return 1
1074	fi
1075
1076	# promote should fail if original fs does not have mount permission
1077	log_must $ZFS allow $user promote $clone
1078	user_run $user $ZFS promote $fs
1079	log_must $ZFS unallow $user promote $clone
1080	if [[ $fs_orig != $(get_prop origin $fs) || \
1081		$clone_orig != $(get_prop origin $clone) ]]; then
1082		return 1
1083	fi
1084
1085	# promote should fail if original fs does not have promote permission
1086	log_must $ZFS allow $user mount $fs
1087	user_run $user $ZFS promote $fs
1088	log_must $ZFS unallow $user mount $fs
1089	if [[ $fs_orig != $(get_prop origin $fs) || \
1090		$clone_orig != $(get_prop origin $clone) ]]; then
1091		return 1
1092	fi
1093
1094	log_must $ZFS allow $user mount $fs
1095	log_must $ZFS allow $user promote $clone
1096	user_run $user $ZFS promote $fs
1097	log_must $ZFS unallow $user promote $clone
1098	log_must $ZFS unallow $user mount $fs
1099	if [[ $snap != $(get_prop origin $clone) || \
1100		$clone_orig != $(get_prop origin $fs) ]]; then
1101		return 1
1102	fi
1103
1104	return 0
1105}
1106
1107function verify_fs_canmount
1108{
1109	typeset user=$1
1110	typeset perm=$2
1111	typeset fs=$3
1112
1113	typeset oldval
1114	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
1115
1116	if ! ismounted $fs ; then
1117		set -A modes "on" "off"
1118		oldval=$(get_prop $perm $fs)
1119		if [[ $oldval == "on" ]]; then
1120			n=1
1121		elif [[ $oldval == "off" ]]; then
1122			n=0
1123		fi
1124		log_note "$user $ZFS set $perm=${modes[$n]} $fs"
1125		user_run $user $ZFS set $perm=${modes[$n]} $fs
1126		if [[ ${modes[$n]} != $(get_prop $perm $fs) ]];
1127	       			then
1128			return 1
1129		fi
1130	fi
1131
1132
1133	# fs is mounted
1134	if ismounted $fs ; then
1135		# property value does not change if
1136		# no mount permission
1137		set -A modes "on" "off"
1138		oldval=$(get_prop $perm $fs)
1139		if [[ $oldval == "on" ]]; then
1140			n=1
1141		elif [[ $oldval == "off" ]]; then
1142			n=0
1143		fi
1144		log_note "$user $ZFS set $perm=${modes[$n]} $fs"
1145		log_must $ZFS allow $user mount $fs
1146		user_run $user $ZFS set $perm=${modes[$n]} $fs
1147		log_must $ZFS unallow $user mount $fs
1148		if [[ ${modes[$n]} != $(get_prop $perm $fs) ]];
1149	       			then
1150			return 1
1151		fi
1152	fi
1153
1154	return 0
1155}
1156
1157function verify_fs_recordsize
1158{
1159	typeset user=$1
1160	typeset perm=$2
1161	typeset fs=$3
1162
1163	typeset value8k=$(( 1024 * 8 ))
1164	user_run $user $ZFS set recordsize=$value8k $fs
1165	if [[ $value8k != $(get_prop recordsize $fs) ]]; then
1166		return 1
1167	fi
1168
1169	return 0
1170}
1171
1172function verify_fs_quota
1173{
1174	typeset user=$1
1175	typeset perm=$2
1176	typeset fs=$3
1177
1178	typeset value32m=$(( 1024 * 1024 * 32 ))
1179	user_run $user $ZFS set quota=$value32m $fs
1180	if [[ $value32m != $(get_prop quota $fs) ]]; then
1181		return 1
1182	fi
1183
1184	return 0
1185}
1186
1187function verify_fs_aclmode
1188{
1189	typeset user=$1
1190	typeset perm=$2
1191	typeset fs=$3
1192
1193	typeset oldval
1194	set -A modes "discard" "groupmask" "passthrough"
1195	oldval=$(get_prop $perm $fs)
1196	if [[ $oldval == "discard" ]]; then
1197		n=1
1198	elif [[ $oldval == "groupmask" ]]; then
1199		n=2
1200	elif [[ $oldval == "passthrough" ]]; then
1201		n=0
1202	fi
1203	log_note "$user $ZFS set aclmode=${modes[$n]} $fs"
1204	user_run $user $ZFS set aclmode=${modes[$n]} $fs
1205	if [[ ${modes[$n]} != $(get_prop aclmode $fs) ]]; then
1206		return 1
1207	fi
1208
1209	return 0
1210}
1211
1212function verify_fs_aclinherit
1213{
1214	typeset user=$1
1215	typeset perm=$2
1216	typeset fs=$3
1217
1218	#
1219	# PSARC/2008/231 change the default value of aclinherit to "restricted"
1220	# but still keep the old interface of "secure"
1221	#
1222
1223	typeset oldval
1224	set -A modes "discard" "noallow" "secure" "passthrough"
1225	oldval=$(get_prop $perm $fs)
1226	if [[ $oldval == "discard" ]]; then
1227		n=1
1228	elif [[ $oldval == "noallow" ]]; then
1229		n=2
1230	elif [[ $oldval == "secure" || $oldval == "restricted" ]]; then
1231		n=3
1232	elif [[ $oldval == "passthrough" ]]; then
1233		n=0
1234	fi
1235	log_note "$user $ZFS set aclinherit=${modes[$n]} $fs"
1236	user_run $user $ZFS set aclinherit=${modes[$n]} $fs
1237
1238	typeset newval=$(get_prop aclinherit $fs)
1239	if [[ ${modes[$n]} == "secure" && $newval == "restricted" ]]; then
1240		return 0
1241	elif [[ ${modes[$n]} != $(get_prop aclinherit $fs) ]]; then
1242		return 1
1243	fi
1244
1245	return 0
1246}
1247
1248function verify_fs_snapdir
1249{
1250	typeset user=$1
1251	typeset perm=$2
1252	typeset fs=$3
1253
1254	typeset oldval
1255	set -A modes "visible" "hidden"
1256	oldval=$(get_prop $perm $fs)
1257	if [[ $oldval == "visible" ]]; then
1258		n=1
1259	elif [[ $oldval == "hidden" ]]; then
1260		n=0
1261	fi
1262	log_note "$user $ZFS set snapdir=${modes[$n]} $fs"
1263	user_run $user $ZFS set snapdir=${modes[$n]} $fs
1264	if [[ ${modes[$n]} != $(get_prop snapdir $fs) ]]; then
1265		return 1
1266	fi
1267
1268	return 0
1269}
1270
1271function verify_fs_aedsx
1272{
1273	typeset user=$1
1274	typeset perm=$2
1275	typeset fs=$3
1276
1277	typeset oldval
1278	set -A modes "on" "off"
1279	oldval=$(get_prop $perm $fs)
1280	if [[ $oldval == "on" ]]; then
1281		n=1
1282	elif [[ $oldval == "off" ]]; then
1283		n=0
1284	fi
1285	log_note "$user $ZFS set $perm=${modes[$n]} $fs"
1286	user_run $user $ZFS set $perm=${modes[$n]} $fs
1287	if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then
1288		return 1
1289	fi
1290
1291	return 0
1292}
1293
1294function verify_fs_zoned
1295{
1296	typeset user=$1
1297	typeset perm=$2
1298	typeset fs=$3
1299
1300	typeset oldval
1301	set -A modes "on" "off"
1302	oldval=$(get_prop $perm $fs)
1303	if [[ $oldval == "on" ]]; then
1304		n=1
1305	elif [[ $oldval == "off" ]]; then
1306		n=0
1307	fi
1308	log_note "$user $ZFS set $perm=${modes[$n]} $fs"
1309	if is_global_zone ; then
1310		if ! ismounted $fs ; then
1311			user_run $user $ZFS set \
1312				$perm=${modes[$n]} $fs
1313			if [[ ${modes[$n]} != \
1314				$(get_prop $perm $fs) ]]; then
1315				return 1
1316			fi
1317			if [[ $n -eq 0 ]]; then
1318				log_mustnot $ZFS mount $fs
1319			else
1320				log_must $ZFS mount $fs
1321			fi
1322		fi
1323
1324		if ismounted $fs; then
1325			# n always is 1 in this case
1326			user_run $user $ZFS set \
1327				$perm=${modes[$n]} $fs
1328			if [[ $oldval != \
1329				$(get_prop $perm $fs) ]]; then
1330				return 1
1331			fi
1332
1333			# mount permission is needed
1334			# to make zoned=on
1335			log_must $ZFS allow $user mount $fs
1336			user_run $user $ZFS set \
1337				$perm=${modes[$n]} $fs
1338			log_must $ZFS unallow $user mount $fs
1339			if [[ ${modes[$n]} != \
1340				$(get_prop $perm $fs) ]]; then
1341				return 1
1342			fi
1343		fi
1344	fi
1345
1346	if ! is_global_zone; then
1347		user_run $user $ZFS set $perm=${modes[$n]} $fs
1348		if [[ $oldval != $(get_prop $perm $fs) ]]; then
1349			return 1
1350		fi
1351	fi
1352
1353	return 0
1354}
1355
1356function verify_fs_sharenfs
1357{
1358	typeset user=$1
1359	typeset perm=$2
1360	typeset fs=$3
1361
1362	typeset oldval
1363	set -A modes "on" "off"
1364	oldval=$(get_prop $perm $fs)
1365	if [[ $oldval == "on" ]]; then
1366		n=1
1367	elif [[ $oldval == "off" ]]; then
1368		n=0
1369	fi
1370	log_note "$user $ZFS set $perm=${modes[$n]} $fs"
1371	user_run $user $ZFS set $perm=${modes[$n]} $fs
1372	if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then
1373		return 1
1374	fi
1375	log_must $ZFS set $perm=$oldval $fs
1376
1377	# turn on nfs/server service if it is not enabled
1378	typeset tmpshare=$TMPDIR/a.${TESTCASE_ID}
1379	$RM -rf $tmpshare
1380	log_must $MKDIR -p $tmpshare
1381	log_must $SHARE $tmpshare
1382
1383	log_note "$user $ZFS set $perm=${modes[$n]} $fs"
1384	user_run $user $ZFS set $perm=${modes[$n]} $fs
1385	if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then
1386		return 1
1387	fi
1388
1389	user_run $user $ZFS share $fs
1390	if is_shared $fs; then
1391		return 1
1392	fi
1393
1394	# share permission is needed
1395	log_must $ZFS allow $user share $fs
1396	user_run $user $ZFS share $fs
1397	log_must $ZFS unallow $user share $fs
1398
1399	if [[ $n -eq 0 ]] && ! is_shared $fs ; then
1400		log_must $UNSHARE $tmpshare
1401		log_must $RM -rf $tmpshare
1402		return 1
1403	fi
1404
1405	if [[ $n -eq 1 ]] && is_shared $fs ; then
1406		log_must $UNSHARE $tmpshare
1407		log_must $RM -rf $tmpshare
1408		return 1
1409	fi
1410
1411	log_must $UNSHARE $tmpshare
1412	log_must $RM -rf $tmpshare
1413
1414	return 0
1415}
1416
1417function verify_fs_shareiscsi
1418{
1419	typeset user=$1
1420	typeset perm=$2
1421	typeset fs=$3
1422
1423	typeset oldval
1424	set -A modes "on" "off"
1425	oldval=$(get_prop $perm $fs)
1426	if [[ $oldval == "on" ]]; then
1427		n=1
1428	elif [[ $oldval == "off" ]]; then
1429		n=0
1430	fi
1431	log_note "$user $ZFS set $perm=${modes[$n]} $fs"
1432	user_run $user $ZFS set $perm=${modes[$n]} $fs
1433	if [[ ${modes[$n]} != $(get_prop $perm $fs) ]]; then
1434		return 1
1435	fi
1436
1437	return 0
1438}
1439
1440function verify_vol_destroy
1441{
1442	typeset user=$1
1443	typeset perm=$2
1444	typeset vol=$3
1445
1446	user_run $user $ZFS destroy $vol
1447	if ! datasetexists $vol ; then
1448		return 1
1449	fi
1450
1451	# mount permission is required
1452	log_must $ZFS allow $user mount $vol
1453	user_run $user $ZFS destroy $vol
1454	if datasetexists $vol ; then
1455		return 1
1456	fi
1457
1458	return 0
1459}
1460
1461function verify_vol_snapshot
1462{
1463	typeset user=$1
1464	typeset perm=$2
1465	typeset vol=$3
1466
1467	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
1468        typeset basevol=${vol%/*}
1469	typeset snap=$vol@snap.$stamp
1470
1471	user_run $user $ZFS snapshot $snap
1472	if ! datasetexists $snap ; then
1473		return 1
1474	fi
1475	log_must $ZFS destroy $snap
1476
1477	return 0
1478}
1479
1480function verify_vol_rollback
1481{
1482	typeset user=$1
1483	typeset perm=$2
1484	typeset vol=$3
1485
1486	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
1487        typeset basevol=${vol%/*}
1488	typeset snap=$vol@snap.$stamp
1489
1490	typeset oldval
1491	log_must $ZFS snapshot $snap
1492	oldval=$(datasetcksum $vol)
1493
1494	log_must $DD if=/dev/random of=/dev/zvol/$vol \
1495		bs=512 count=1
1496
1497	user_run $user $ZFS rollback -R $snap
1498	if [[ $oldval != $(datasetcksum $vol) ]]; then
1499		return 1
1500	fi
1501
1502	return 0
1503}
1504
1505function verify_vol_clone
1506{
1507	typeset user=$1
1508	typeset perm=$2
1509	typeset vol=$3
1510
1511	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
1512        typeset basevol=${vol%/*}
1513	typeset snap=$vol@snap.$stamp
1514	typeset clone=$basevol/cvol.$stamp
1515
1516	log_must $ZFS snapshot $snap
1517
1518	user_run $user $ZFS clone $snap $clone
1519	if datasetexists $clone ; then
1520		return 1
1521	fi
1522
1523	log_must $ZFS allow $user create $basevol
1524	user_run $user $ZFS clone $snap $clone
1525	log_must $ZFS unallow $user create $basevol
1526	if datasetexists $clone ; then
1527		return 1
1528	fi
1529
1530	log_must $ZFS allow $user mount $basevol
1531	user_run $user $ZFS clone $snap $clone
1532	log_must $ZFS unallow $user mount $basevol
1533	if datasetexists $clone ; then
1534		return 1
1535	fi
1536
1537	# require create permission on parent and
1538	# mount permission on itself as well
1539	log_must $ZFS allow $user mount $basevol
1540	log_must $ZFS allow $user create $basevol
1541	user_run $user $ZFS clone $snap $clone
1542	log_must $ZFS unallow $user create $basevol
1543	log_must $ZFS unallow $user mount $basevol
1544	if ! datasetexists $clone ; then
1545		return 1
1546	fi
1547
1548	return 0
1549}
1550
1551function verify_vol_rename
1552{
1553	typeset user=$1
1554	typeset perm=$2
1555	typeset vol=$3
1556
1557	typeset stamp=${perm}.${user}.$($DATE +'%F-%R:%S')
1558        typeset basevol=${vol%/*}
1559	typeset snap=$vol@snap.$stamp
1560	typeset clone=$basevol/cvol.$stamp
1561	typeset renamevol=$basevol/nvol.$stamp
1562
1563	user_run $user $ZFS rename $vol $renamevol
1564	if datasetexists $renamevol ; then
1565		return 1
1566	fi
1567
1568	log_must $ZFS allow $user create $basevol
1569	user_run $user $ZFS rename $vol $renamevol
1570	log_must $ZFS unallow $user create $basevol
1571	if datasetexists $renamevol ; then
1572		return 1
1573	fi
1574
1575	log_must $ZFS allow $user mount $basevol
1576	user_run $user $ZFS rename $vol $renamevol
1577	log_must $ZFS unallow $user mount $basevol
1578	if datasetexists $renamevol ; then
1579		return 1
1580	fi
1581
1582	# require both create permission on parent and
1583	# mount permission on parent as well
1584	log_must $ZFS allow $user mount $basevol
1585	log_must $ZFS allow $user create $basevol
1586	user_run $user $ZFS rename $vol $renamevol
1587	log_must $ZFS unallow $user mount $basevol
1588	log_must $ZFS unallow $user create $basevol
1589	if ! datasetexists $renamevol ; then
1590		return 1
1591	fi
1592
1593	log_must $ZFS rename $renamevol $vol
1594
1595	return 0
1596}
1597
1598function verify_vol_volsize
1599{
1600	typeset user=$1
1601	typeset perm=$2
1602	typeset vol=$3
1603
1604	typeset oldval
1605	oldval=$(get_prop volsize $vol)
1606	(( newval = oldval * 2 ))
1607
1608	typeset reserv_size
1609
1610	reserv_size=$(get_prop refreservation $vol)
1611
1612	if [[ "0" == $reserv_size ]]; then
1613		# sparse volume
1614		user_run $user $ZFS set volsize=$newval $vol
1615		if [[ $oldval == $(get_prop volsize $vol) ]];
1616		then
1617			return 1
1618		fi
1619
1620	else
1621		# normal volume, reservation permission
1622		# is required
1623		user_run $user $ZFS set volsize=$newval $vol
1624		zfs get -p volsize $vol
1625		if [[ $newval != $(get_prop volsize $vol) ]];
1626		then
1627			return 1
1628		fi
1629
1630		log_must $ZFS allow $user refreservation $vol
1631		user_run $user $ZFS set volsize=$newval $vol
1632		log_must $ZFS unallow $user reservation $vol
1633		log_must $ZFS unallow $user refreservation $vol
1634		if [[ $oldval == $(get_prop volsize $vol) ]];
1635		then
1636			return 1
1637		fi
1638	fi
1639
1640	return 0
1641}
1642
1643function verify_vol_shareiscsi
1644{
1645	typeset user=$1
1646	typeset perm=$2
1647	typeset vol=$3
1648
1649	typeset oldval
1650	set -A modes "on" "off"
1651	oldval=$(get_prop $perm $vol)
1652	if [[ $oldval == "on" ]]; then
1653		n=1
1654	elif [[ $oldval == "off" ]]; then
1655		n=0
1656	fi
1657	log_note "$user $ZFS set $perm=${modes[$n]} $vol"
1658	user_run $user $ZFS set $perm=${modes[$n]} $vol
1659	if [[ ${modes[$n]} != $(get_prop $perm $vol) ]]; then
1660		return 1
1661	fi
1662
1663	iscsitgt_setup
1664
1665	if [[ $n -eq 1 ]] && is_iscsi_target $vol ; then
1666		iscsitgt_cleanup
1667		return 1
1668	fi
1669
1670	if [[ $n -eq 0 ]] && ! is_iscsi_target $vol ; then
1671		iscsitgt_cleanup
1672		return 1
1673	fi
1674
1675	iscsitgt_cleanup
1676
1677	return 0
1678}
1679
1680function verify_allow
1681{
1682	typeset user=$1
1683	typeset perm=$2
1684	typeset dtst=$3
1685
1686	typeset -i ret
1687
1688	user_run $user $ZFS allow $user allow $dtst
1689	ret=$?
1690	if [[ $ret -eq 0 ]]; then
1691		return 1
1692	fi
1693
1694	log_must $ZFS allow $user copies $dtst
1695	user_run $user $ZFS allow $user copies $dtst
1696	ret=$?
1697	log_must $ZFS unallow $user copies $dtst
1698	if [[ $ret -eq 1 ]]; then
1699		return 1
1700	fi
1701
1702	return 0
1703
1704}
1705