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