#!/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) 2016 by Delphix. All rights reserved.
#

. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib

#
# DESCRIPTION:
#	A pool should not try to write to a device that doesn't belong to it
#	anymore, even if the device is in its cachefile.
#
# STRATEGY:
#	1. Create pool1 with some devices and an alternate cachefile.
#	2. Backup the cachefile.
#	3. Export pool1.
#	4. Create pool2 using a device that belongs to pool1.
#	5. Export pool2.
#	6. Compute checksum of the shared device.
#	7. Import pool1 and write some data to it.
#	8. Verify that the checksum of the shared device hasn't changed.
#

verify_runnable "global"

function custom_cleanup
{
	destroy_pool $TESTPOOL2
	cleanup
}

log_onexit custom_cleanup

function dev_checksum
{
	typeset dev="$1"
	typeset checksum

	log_note "Compute checksum of '$dev'"

	checksum=$(md5digest $dev)
	if [[ $? -ne 0 ]]; then
		log_fail "Failed to compute checksum of '$dev'"
		return 1
	fi

	echo "$checksum"
	return 0
}

function test_shared_device
{
	typeset pool1="$1"
	typeset pool2="$2"
	typeset sharedvdev="$3"
	typeset importflags="${4:-}"

	log_note "$0: pool1 '$pool1', pool2 '$pool2' takes $sharedvdev."

	log_must zpool create -o cachefile=$CPATH $TESTPOOL1 $pool1

	log_must cp $CPATH $CPATHBKP

	log_must zpool export $TESTPOOL1

	log_must zpool create -f $TESTPOOL2 $pool2

	log_must zpool export $TESTPOOL2

	typeset checksum1=$(dev_checksum $sharedvdev)

	log_must zpool import -c $CPATHBKP $importflags $TESTPOOL1

	log_must write_some_data $TESTPOOL1 2

	log_must zpool destroy $TESTPOOL1

	typeset checksum2=$(dev_checksum $sharedvdev)

	if [[ $checksum1 == $checksum2 ]]; then
		log_pass "Device hasn't been modified by original pool"
	else
		log_fail "Device has been modified by original pool." \
		    "Checksum mismatch: $checksum1 != $checksum2."
	fi

	# Cleanup
	log_must zpool import -d $DEVICE_DIR $TESTPOOL2
	log_must zpool destroy $TESTPOOL2
	log_must rm -f $CPATH $CPATHBKP

	log_note ""
}

test_shared_device "mirror $VDEV0 $VDEV1" "mirror $VDEV1 $VDEV2" "$VDEV1"
test_shared_device "mirror $VDEV0 $VDEV1 $VDEV2" "mirror $VDEV2 $VDEV3" \
    "$VDEV2"
test_shared_device "raidz $VDEV0 $VDEV1 $VDEV2" "$VDEV2" "$VDEV2"
test_shared_device "draid $VDEV0 $VDEV1 $VDEV2" "$VDEV2" "$VDEV2"
test_shared_device "$VDEV0 log $VDEV1" "$VDEV2 log $VDEV1" "$VDEV1" "-m"

log_pass "Pool doesn't write to a device it doesn't own anymore."
