mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 18:11:00 +03:00
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:
parent
bd69ae3b53
commit
6356d50e67
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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."
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user