Verify 'zfs destroy' will unshare the dataset

This change adds a new test case to the zfs-test suite to verify that
when 'zfs destroy' is used on a shared dataset, the dataset will be
unshared after the destroy operation completes.

Reviewed by: loli10K <ezomori.nozomu@gmail.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Prakash Surya <prakash.surya@delphix.com>
Closes #7941
This commit is contained in:
Prakash Surya 2018-09-21 10:54:49 -07:00 committed by Brian Behlendorf
parent 1bf490ba93
commit 54eb2c410e
4 changed files with 105 additions and 23 deletions

View File

@ -282,7 +282,8 @@ tags = ['functional', 'cli_root', 'zfs_unmount']
[tests/functional/cli_root/zfs_unshare]
tests = ['zfs_unshare_001_pos', 'zfs_unshare_002_pos', 'zfs_unshare_003_pos',
'zfs_unshare_004_neg', 'zfs_unshare_005_neg', 'zfs_unshare_006_pos']
'zfs_unshare_004_neg', 'zfs_unshare_005_neg', 'zfs_unshare_006_pos',
'zfs_unshare_007_pos']
tags = ['functional', 'cli_root', 'zfs_unshare']
[tests/functional/cli_root/zfs_upgrade]

View File

@ -1230,6 +1230,34 @@ function datasetnonexists
return 0
}
function is_shared_impl
{
typeset fs=$1
typeset mtpt
if is_linux; then
for mtpt in `share | awk '{print $1}'` ; do
if [[ $mtpt == $fs ]] ; then
return 0
fi
done
return 1
fi
for mtpt in `share | awk '{print $2}'` ; do
if [[ $mtpt == $fs ]] ; then
return 0
fi
done
typeset stat=$(svcs -H -o STA nfs/server:default)
if [[ $stat != "ON" ]]; then
log_note "Current nfs/server status: $stat"
fi
return 1
}
#
# Given a mountpoint, or a dataset name, determine if it is shared via NFS.
#
@ -1254,27 +1282,7 @@ function is_shared
fi
fi
if is_linux; then
for mtpt in `share | awk '{print $1}'` ; do
if [[ $mtpt == $fs ]] ; then
return 0
fi
done
return 1
fi
for mtpt in `share | awk '{print $2}'` ; do
if [[ $mtpt == $fs ]] ; then
return 0
fi
done
typeset stat=$(svcs -H -o STA nfs/server:default)
if [[ $stat != "ON" ]]; then
log_note "Current nfs/server status: $stat"
fi
return 1
is_shared_impl "$fs"
}
#

View File

@ -7,4 +7,5 @@ dist_pkgdata_SCRIPTS = \
zfs_unshare_003_pos.ksh \
zfs_unshare_004_neg.ksh \
zfs_unshare_005_neg.ksh \
zfs_unshare_006_pos.ksh
zfs_unshare_006_pos.ksh \
zfs_unshare_007_pos.ksh

View File

@ -0,0 +1,72 @@
#!/bin/ksh -p
#
# 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 http://www.opensolaris.org/os/licensing.
# 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 2016, loli10K. All rights reserved.
# Copyright (c) 2018 by Delphix. All rights reserved.
#
. $STF_SUITE/include/libtest.shlib
#
# DESCRIPTION:
# Verify that 'zfs destroy' on a shared dataset, will unshare it.
#
# STRATEGY:
# 1. Create and share a dataset with sharenfs.
# 2. Verify the dataset is shared.
# 3. Invoke 'zfs destroy' on the dataset.
# 4. Verify the dataset is not shared.
#
verify_runnable "global"
function cleanup
{
if datasetexists "$TESTPOOL/$TESTFS/shared1"; then
log_must zfs destroy -f $TESTPOOL/$TESTFS/shared1
fi
}
log_assert "Verify 'zfs destroy' will unshare the dataset"
log_onexit cleanup
# 1. Create and share a dataset with sharenfs.
log_must zfs create \
-o sharenfs=on -o mountpoint=$TESTDIR/1 $TESTPOOL/$TESTFS/shared1
#
# 2. Verify the datasets is shared.
#
# The "non-impl" variant of "is_shared" requires the dataset to exist.
# Thus, we can only use the "impl" variant in step 4, below. To be
# consistent with step 4, we also use the "impl" variant here.
#
log_must eval "is_shared_impl $TESTDIR/1"
# 3. Invoke 'zfs destroy' on the dataset.
log_must zfs destroy -f $TESTPOOL/$TESTFS/shared1
# 4. Verify the dataset is not shared.
log_mustnot eval "is_shared_impl $TESTDIR/1"
log_pass "'zfs destroy' will unshare the dataset."