Skip snapshot in zfs_iter_mounted()
The intention of the zfs_iter_mounted() is to traverse the dataset and its descendants, not the snapshots. The current code can cause a mounted snapshot to be included and thus zfs_open() on the snapshot with ZFS_TYPE_FILESYSTEM would print confusing message such as "cannot open 'rpool/fs@snap': snapshot delimiter '@' is not expected here". Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Youzhong Yang <yyang@mathworks.com> Closes #12447 Closes #12448
This commit is contained in:
parent
1886cdfcfb
commit
ec64fdb93d
|
@ -575,8 +575,11 @@ zfs_iter_mounted(zfs_handle_t *zhp, zfs_iter_f func, void *data)
|
||||||
|
|
||||||
/* Ignore datasets not within the provided dataset */
|
/* Ignore datasets not within the provided dataset */
|
||||||
if (strncmp(entry.mnt_special, zhp->zfs_name, namelen) != 0 ||
|
if (strncmp(entry.mnt_special, zhp->zfs_name, namelen) != 0 ||
|
||||||
(entry.mnt_special[namelen] != '/' &&
|
entry.mnt_special[namelen] != '/')
|
||||||
entry.mnt_special[namelen] != '@'))
|
continue;
|
||||||
|
|
||||||
|
/* Skip snapshot of any child dataset */
|
||||||
|
if (strchr(entry.mnt_special, '@') != NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((mtab_zhp = zfs_open(zhp->zfs_hdl, entry.mnt_special,
|
if ((mtab_zhp = zfs_open(zhp->zfs_hdl, entry.mnt_special,
|
||||||
|
|
|
@ -68,6 +68,16 @@ function log_must
|
||||||
(( $? != 0 )) && log_fail
|
(( $? != 0 )) && log_fail
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Execute a positive test (expecting no stderr) and exit $STF_FAIL
|
||||||
|
# if test fails
|
||||||
|
# $@ - command to execute
|
||||||
|
|
||||||
|
function log_must_nostderr
|
||||||
|
{
|
||||||
|
log_pos_nostderr "$@"
|
||||||
|
(( $? != 0 )) && log_fail
|
||||||
|
}
|
||||||
|
|
||||||
# Execute a positive test but retry the command on failure if the output
|
# Execute a positive test but retry the command on failure if the output
|
||||||
# matches an expected pattern. Otherwise behave like log_must and exit
|
# matches an expected pattern. Otherwise behave like log_must and exit
|
||||||
# $STF_FAIL is test fails.
|
# $STF_FAIL is test fails.
|
||||||
|
@ -292,6 +302,46 @@ function log_pos
|
||||||
return $status
|
return $status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Execute and print command with status where success equals zero result
|
||||||
|
# and no stderr output
|
||||||
|
#
|
||||||
|
# $@ command to execute
|
||||||
|
#
|
||||||
|
# return 0 if command succeeds and no stderr output
|
||||||
|
# return 1 othersie
|
||||||
|
|
||||||
|
function log_pos_nostderr
|
||||||
|
{
|
||||||
|
typeset out=""
|
||||||
|
typeset logfile="/tmp/log.$$"
|
||||||
|
|
||||||
|
while [[ -e $logfile ]]; do
|
||||||
|
logfile="$logfile.$$"
|
||||||
|
done
|
||||||
|
|
||||||
|
"$@" 2>$logfile
|
||||||
|
typeset status=$?
|
||||||
|
out="cat $logfile"
|
||||||
|
typeset out_msg=$($out)
|
||||||
|
|
||||||
|
if (( $status != 0 )) ; then
|
||||||
|
print -u2 $out_msg
|
||||||
|
_printerror "$@" "exited $status"
|
||||||
|
else
|
||||||
|
if [[ ! -z "$out_msg" ]]; then
|
||||||
|
print -u2 $out_msg
|
||||||
|
_printerror "$@" "message in stderr" \
|
||||||
|
" exited $status"
|
||||||
|
status=1
|
||||||
|
else
|
||||||
|
[[ -n $LOGAPI_DEBUG ]] && cat $logfile
|
||||||
|
_printsuccess "$@"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
_recursive_output $logfile "false"
|
||||||
|
return $status
|
||||||
|
}
|
||||||
|
|
||||||
# Set an exit handler
|
# Set an exit handler
|
||||||
#
|
#
|
||||||
# $@ - function(s) to perform on exit
|
# $@ - function(s) to perform on exit
|
||||||
|
|
|
@ -83,7 +83,7 @@ for d in ${test_depths[@]}; do
|
||||||
log_must zfs snapshot $TESTPOOL/$ds@snap
|
log_must zfs snapshot $TESTPOOL/$ds@snap
|
||||||
# force snapshot mount in .zfs
|
# force snapshot mount in .zfs
|
||||||
log_must ls /$TESTPOOL/$ds/.zfs/snapshot/snap
|
log_must ls /$TESTPOOL/$ds/.zfs/snapshot/snap
|
||||||
log_must zfs unmount $TESTPOOL/$ds
|
log_must_nostderr zfs unmount $TESTPOOL/$ds
|
||||||
|
|
||||||
if ! ismounted $TESTPOOL/$ds_pre; then
|
if ! ismounted $TESTPOOL/$ds_pre; then
|
||||||
log_fail "$ds_pre is not mounted"
|
log_fail "$ds_pre is not mounted"
|
||||||
|
@ -113,7 +113,7 @@ for d in ${test_depths[@]}; do
|
||||||
log_must zfs snapshot $TESTPOOL/$ds@snap
|
log_must zfs snapshot $TESTPOOL/$ds@snap
|
||||||
# force snapshot mount in .zfs
|
# force snapshot mount in .zfs
|
||||||
log_must ls /$TESTPOOL/$ds/.zfs/snapshot/snap
|
log_must ls /$TESTPOOL/$ds/.zfs/snapshot/snap
|
||||||
log_must zfs unmount $TESTPOOL/$ds
|
log_must_nostderr zfs unmount $TESTPOOL/$ds
|
||||||
|
|
||||||
if ! ismounted $TESTPOOL/$ds_pre; then
|
if ! ismounted $TESTPOOL/$ds_pre; then
|
||||||
log_fail "$TESTPOOL/$ds_pre (pre) not mounted"
|
log_fail "$TESTPOOL/$ds_pre (pre) not mounted"
|
||||||
|
@ -143,7 +143,7 @@ for d in ${test_depths[@]}; do
|
||||||
log_must zfs snapshot $TESTPOOL/$ds@snap
|
log_must zfs snapshot $TESTPOOL/$ds@snap
|
||||||
# force snapshot mount in .zfs
|
# force snapshot mount in .zfs
|
||||||
log_must ls /$TESTPOOL/$ds/.zfs/snapshot/snap
|
log_must ls /$TESTPOOL/$ds/.zfs/snapshot/snap
|
||||||
log_must zfs unmount $TESTPOOL/$ds
|
log_must_nostderr zfs unmount $TESTPOOL/$ds
|
||||||
|
|
||||||
if ! ismounted $TESTPOOL/$ds_pre; then
|
if ! ismounted $TESTPOOL/$ds_pre; then
|
||||||
log_fail "$TESTPOOL/$ds_pre (pre) not mounted"
|
log_fail "$TESTPOOL/$ds_pre (pre) not mounted"
|
||||||
|
@ -173,7 +173,7 @@ for d in ${test_depths[@]}; do
|
||||||
log_must zfs snapshot $TESTPOOL/$ds@snap
|
log_must zfs snapshot $TESTPOOL/$ds@snap
|
||||||
# force snapshot mount in .zfs
|
# force snapshot mount in .zfs
|
||||||
log_must ls /$TESTPOOL/$ds/.zfs/snapshot/snap
|
log_must ls /$TESTPOOL/$ds/.zfs/snapshot/snap
|
||||||
log_must zfs unmount $TESTPOOL/$ds
|
log_must_nostderr zfs unmount $TESTPOOL/$ds
|
||||||
|
|
||||||
if ! ismounted $TESTPOOL/$ds_pre; then
|
if ! ismounted $TESTPOOL/$ds_pre; then
|
||||||
log_fail "$ds_pre is not mounted"
|
log_fail "$ds_pre is not mounted"
|
||||||
|
|
Loading…
Reference in New Issue