# SPDX-License-Identifier: CDDL-1.0
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or https://opensource.org/licenses/CDDL-1.0.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL 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) 2017 by Delphix. All rights reserved.
#

. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.cfg

function force_unmount #dev
{
	typeset dev=$1

	ismounted $dev && log_must zfs $unmountforce $dev
	return 0
}

# Create pool and  ( fs | container | vol ) with the given parameters,
# it'll destroy prior exist one that has the same name.

function setup_filesystem #disklist #pool #fs #mntpoint #type #vdev
{
	typeset disklist=$1
	typeset pool=$2
	typeset fs=${3##/}
	typeset mntpoint=$4
	typeset type=$5
	typeset vdev=$6

	if [[ -z $pool || -z $fs || -z $mntpoint ]]; then
		log_note "Missing parameter: (\"$pool\", \"$fs\", \"$mntpoint\")"
		return 1
	fi

	if is_global_zone && [[ -z $disklist ]] ; then
		log_note "Missing disklist."
		return 1
	fi

	if [[ $vdev != "" && \
		$vdev != "mirror" && \
		$vdev != "raidz" && \
		$vdev != "draid" ]] ; then

		log_note "Wrong vdev: (\"$vdev\")"
		return 1
	fi

	poolexists $pool || \
		create_pool $pool $vdev $disklist

	datasetexists $pool/$fs && \
		log_must cleanup_filesystem $pool $fs

	rmdir $mntpoint > /dev/null 2>&1
	if [[ ! -d $mntpoint ]]; then
		log_must mkdir -p $mntpoint
	fi

	case "$type" in
		'ctr')	log_must zfs create -o mountpoint=$mntpoint $pool/$fs
			;;
		'vol')	log_must zfs create -V $VOLSIZE $pool/$fs
			block_device_wait
			;;
		*)	log_must zfs create -o mountpoint=$mntpoint $pool/$fs
			;;
	esac

	return 0
}

# Destroy ( fs | container | vol ) with the given parameters.
function cleanup_filesystem #pool #fs
{
	typeset pool=$1
	typeset fs=${2##/}
	typeset mtpt=""

	if [[ -z $pool || -z $fs ]]; then
		log_note "Missing parameter: (\"$pool\", \"$fs\")"
		return 1
	fi

	if datasetexists "$pool/$fs" ; then
		mtpt=$(get_prop mountpoint "$pool/$fs")
		destroy_dataset "$pool/$fs" "-r"

		[[ -d $mtpt ]] && \
			log_must rm -rf $mtpt
	else
		return 1
	fi

	return 0
}

# Make sure 'zfs mount' should display all ZFS filesystems currently mounted.
# The results of 'zfs mount' and 'df -F zfs' should be identical.
function verify_mount_display
{
	typeset fs

	for fs in $(zfs $mountcmd | awk '{print $1}') ; do
		log_must mounted $fs
	done
	return 0
}
