Introduce a destroy_dataset helper

Datasets can be busy when calling zfs destroy. Introduce
a helper function to destroy datasets and use it to destroy
datasets in zfs_allow_004_pos, zfs_promote_008_pos, and
zfs_destroy_002_pos.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Closes #7224
Closes #7246
Closes #7249
Closes #7267
This commit is contained in:
Giuseppe Di Natale 2018-03-06 14:54:57 -08:00 committed by Tony Hutter
parent bd69ae3b53
commit 6356d50e67
4 changed files with 46 additions and 23 deletions

View File

@ -503,8 +503,7 @@ function default_cleanup_noexit
typeset fs="" typeset fs=""
for fs in $(zfs list -H -o name \ for fs in $(zfs list -H -o name \
| grep "^$ZONE_POOL/$ZONE_CTR[01234]/"); do | grep "^$ZONE_POOL/$ZONE_CTR[01234]/"); do
datasetexists $fs && \ destroy_dataset "$fs" "-Rf"
log_must zfs destroy -Rf $fs
done done
# Need cleanup here to avoid garbage dir left. # Need cleanup here to avoid garbage dir left.
@ -565,11 +564,8 @@ function default_container_cleanup
[[ $? -eq 0 ]] && \ [[ $? -eq 0 ]] && \
log_must zfs unmount $TESTPOOL/$TESTCTR/$TESTFS1 log_must zfs unmount $TESTPOOL/$TESTCTR/$TESTFS1
datasetexists $TESTPOOL/$TESTCTR/$TESTFS1 && \ destroy_dataset "$TESTPOOL/$TESTCTR/$TESTFS1" "-R"
log_must zfs destroy -R $TESTPOOL/$TESTCTR/$TESTFS1 destroy_dataset "$TESTPOOL/$TESTCTR" "-Rf"
datasetexists $TESTPOOL/$TESTCTR && \
log_must zfs destroy -Rf $TESTPOOL/$TESTCTR
[[ -e $TESTDIR1 ]] && \ [[ -e $TESTDIR1 ]] && \
log_must rm -rf $TESTDIR1 > /dev/null 2>&1 log_must rm -rf $TESTDIR1 > /dev/null 2>&1
@ -603,7 +599,7 @@ function destroy_snapshot
log_fail "get_prop mountpoint $snap failed." log_fail "get_prop mountpoint $snap failed."
fi fi
log_must zfs destroy $snap destroy_dataset "$snap"
[[ $mtpt != "" && -d $mtpt ]] && \ [[ $mtpt != "" && -d $mtpt ]] && \
log_must rm -rf $mtpt log_must rm -rf $mtpt
} }
@ -629,7 +625,7 @@ function destroy_clone
log_fail "get_prop mountpoint $clone failed." log_fail "get_prop mountpoint $clone failed."
fi fi
log_must zfs destroy $clone destroy_dataset "$clone"
[[ $mtpt != "" && -d $mtpt ]] && \ [[ $mtpt != "" && -d $mtpt ]] && \
log_must rm -rf $mtpt log_must rm -rf $mtpt
} }
@ -648,7 +644,7 @@ function destroy_bookmark
log_fail "'$bkmarkp' does not existed." log_fail "'$bkmarkp' does not existed."
fi fi
log_must zfs destroy $bkmark destroy_dataset "$bkmark"
} }
# Return 0 if a snapshot exists; $? otherwise # Return 0 if a snapshot exists; $? otherwise
@ -1555,6 +1551,40 @@ function destroy_pool #pool
return 0 return 0
} }
# Return 0 if destroy successfully or the dataset exists; $? otherwise
# Note: In local zones, this function should return 0 silently.
#
# $1 - dataset name
# $2 - custom arguments for zfs destroy
# Destroy dataset with the given parameters.
function destroy_dataset #dataset #args
{
typeset dataset=$1
typeset mtpt
typeset args=${2:-""}
if [[ -z $dataset ]]; then
log_note "No dataset name given."
return 1
fi
if is_global_zone ; then
if datasetexists "$dataset" ; then
mtpt=$(get_prop mountpoint "$dataset")
log_must_busy zfs destroy $args $dataset
[[ -d $mtpt ]] && \
log_must rm -rf $mtpt
else
log_note "Dataset does not exist. ($dataset)"
return 1
fi
fi
return 0
}
# #
# Firstly, create a pool with 5 datasets. Then, create a single zone and # Firstly, create a pool with 5 datasets. Then, create a single zone and
# export the 5 datasets to it. In addition, we also add a ZFS filesystem # export the 5 datasets to it. In addition, we also add a ZFS filesystem
@ -2541,9 +2571,7 @@ function verify_opt_p_ops
esac esac
# make sure the upper level filesystem does not exist # make sure the upper level filesystem does not exist
if datasetexists ${newdataset%/*} ; then destroy_dataset "${newdataset%/*}" "-rRf"
log_must zfs destroy -rRf ${newdataset%/*}
fi
# without -p option, operation will fail # without -p option, operation will fail
log_mustnot zfs $ops $dataset $newdataset log_mustnot zfs $ops $dataset $newdataset

View File

@ -49,8 +49,7 @@ function cleanup
{ {
typeset -i i=0 typeset -i i=0
while (( $i < ${#data_objs[*]} )); do while (( $i < ${#data_objs[*]} )); do
datasetexists "${data_objs[i]}" && \ destroy_dataset "${data_objs[i]}" "-rf"
zfs destroy -rf ${data_objs[i]}
((i = i + 1)) ((i = i + 1))
done done
} }
@ -87,7 +86,7 @@ done
i=0 i=0
while (( $i < ${#data_objs[*]} )); do while (( $i < ${#data_objs[*]} )); do
log_must zfs destroy ${data_objs[i]} destroy_dataset "${data_objs[i]}"
datasetexists ${data_objs[i]} && \ datasetexists ${data_objs[i]} && \
log_fail "'zfs destroy <filesystem>|<volume>|<snapshot>' fail." log_fail "'zfs destroy <filesystem>|<volume>|<snapshot>' fail."
((i = i + 1)) ((i = i + 1))

View File

@ -49,7 +49,7 @@ function cleanup
log_must zfs promote $vol log_must zfs promote $vol
fi fi
log_must zfs destroy -rR $snap destroy_dataset "$snap" "-rR"
} }
log_assert "'zfs promote' can promote a volume clone." log_assert "'zfs promote' can promote a volume clone."

View File

@ -53,15 +53,11 @@ function cleanup_user_group
# #
function restore_root_datasets function restore_root_datasets
{ {
if datasetexists $ROOT_TESTFS ; then destroy_dataset "$ROOT_TESTFS" "-Rf"
log_must zfs destroy -Rf $ROOT_TESTFS
fi
log_must zfs create $ROOT_TESTFS log_must zfs create $ROOT_TESTFS
if is_global_zone ; then if is_global_zone ; then
if datasetexists $ROOT_TESTVOL ; then destroy_dataset "$ROOT_TESTVOL" "-Rf"
log_must zfs destroy -Rf $ROOT_TESTVOL
fi
log_must zfs create -V $VOLSIZE $ROOT_TESTVOL log_must zfs create -V $VOLSIZE $ROOT_TESTVOL
block_device_wait block_device_wait
fi fi