| #!/bin/ksh -p |
| # |
| # CDDL HEADER START |
| # |
| # 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. |
| # |
| # CDDL HEADER END |
| # |
| |
| # |
| # Copyright (c) 2017 by Delphix. All rights reserved. |
| # |
| |
| . $STF_SUITE/include/libtest.shlib |
| . $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib |
| |
| # DESCRIPTION: |
| # Verify that 'zfs mount -a' succeeds given a set of filesystems |
| # whose mountpoints have a parent/child relationship which is |
| # counter to the filesystem parent/child relationship. |
| # |
| # STRATEGY: |
| # 1. Create zfs filesystems within the given pool. |
| # 2. Unmount all the filesystems. |
| # 3. Verify that 'zfs mount -a' command succeed, |
| # and all available ZFS filesystems are mounted. |
| # 4. Verify that 'zfs mount' is identical with 'df -F zfs' |
| # |
| |
| verify_runnable "both" |
| |
| typeset -a filesystems |
| |
| function setup_all |
| { |
| typeset path=${TEST_BASE_DIR%%/}/testroot$$/$TESTPOOL |
| typeset fscount=10 |
| |
| # |
| # Generate an array of filesystem names that represent a deep |
| # hierarchy as such: |
| # |
| # 0 |
| # 0/1 |
| # 0/1/2 |
| # 0/1/2/3 |
| # 0/1/2/3/4 |
| # ... |
| # |
| fs=0 |
| for ((i=0; i<$fscount; i++)); do |
| if [[ $i -gt 0 ]]; then |
| fs=$fs/$i |
| fi |
| filesystems+=($fs) |
| done |
| |
| # Create all of the above filesystems |
| for ((i=0; i<$fscount; i++)); do |
| fs=${filesystems[$i]} |
| setup_filesystem "$DISKS" "$TESTPOOL" "$fs" "$path/$i" ctr |
| done |
| |
| zfs list -r $TESTPOOL |
| |
| # |
| # Unmount all of the above so that we can setup our convoluted |
| # mount paths. |
| # |
| export __ZFS_POOL_RESTRICT="$TESTPOOL" |
| log_must zfs $unmountall |
| unset __ZFS_POOL_RESTRICT |
| |
| # |
| # Configure the mount paths so that each mountpoint is contained |
| # in a child filesystem. We should end up with something like the |
| # following structure (modulo the number of filesystems): |
| # |
| # NAME MOUNTPOINT |
| # testpool /testpool |
| # testpool/0 /testroot25416/testpool/0/1/2/3/4/5/6 |
| # testpool/0/1 /testroot25416/testpool/0/1/2/3/4/5 |
| # testpool/0/1/2 /testroot25416/testpool/0/1/2/3/4 |
| # testpool/0/1/2/3 /testroot25416/testpool/0/1/2/3 |
| # testpool/0/1/2/3/4 /testroot25416/testpool/0/1/2 |
| # testpool/0/1/2/3/4/5 /testroot25416/testpool/0/1 |
| # testpool/0/1/2/3/4/5/6 /testroot25416/testpool/0 |
| # |
| for ((i=0; i<$fscount; i++)); do |
| fs=$TESTPOOL/${filesystems[$(($fscount - $i - 1))]} |
| mnt=$path/${filesystems[$i]} |
| zfs set mountpoint=$mnt $fs |
| done |
| |
| zfs list -r $TESTPOOL |
| |
| return 0 |
| } |
| |
| function cleanup_all |
| { |
| export __ZFS_POOL_RESTRICT="$TESTPOOL" |
| log_must zfs $unmountall |
| unset __ZFS_POOL_RESTRICT |
| # make sure we leave $TESTPOOL mounted |
| log_must zfs mount $TESTPOOL |
| |
| for fs in ${filesystems[@]}; do |
| cleanup_filesystem "$TESTPOOL" "$fs" |
| done |
| [[ -d ${TEST_BASE_DIR%%/}/testroot$$ ]] && \ |
| rm -rf ${TEST_BASE_DIR%%/}/testroot$$ |
| } |
| |
| # |
| # This function takes a single true/false argument. If true it will verify that |
| # all file systems are mounted. If false it will verify that they are not |
| # mounted. |
| # |
| function verify_all |
| { |
| if $1; then |
| logfunc=log_must |
| else |
| logfunc=log_mustnot |
| fi |
| |
| for fs in ${filesystems[@]}; do |
| $logfunc mounted "$TESTPOOL/$fs" |
| done |
| |
| return 0 |
| } |
| |
| log_onexit cleanup_all |
| |
| log_must setup_all |
| |
| export __ZFS_POOL_RESTRICT="$TESTPOOL" |
| log_must zfs $unmountall |
| unset __ZFS_POOL_RESTRICT |
| |
| verify_all false |
| |
| export __ZFS_POOL_RESTRICT="$TESTPOOL" |
| log_must zfs $mountall |
| unset __ZFS_POOL_RESTRICT |
| |
| verify_all true |
| |
| log_note "Verify that 'zfs $mountcmd' will display " \ |
| "all ZFS filesystems currently mounted." |
| |
| verify_mount_display |
| |
| log_pass "'zfs $mountall' succeeds as root, " \ |
| "and all available ZFS filesystems are mounted." |