libbe: Fix zfs_is_mounted check w/ snapshots
'be_destroy' can destroy a boot environment (by name) or a given snapshot. If the target to be destroyed is a dataset, check if it's mounted. We don't want to check if the origin dataset is mounted when destroying a snapshot. PR: 236043 Submitted by: Rob Fairbanks <rob.fx907 gmail com> MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D19650
This commit is contained in:
parent
9c3e2dda27
commit
79d87e9f35
@ -265,6 +265,16 @@ be_destroy(libbe_handle_t *lbh, const char *name, int options)
|
||||
zfs_prop_get(fs, ZFS_PROP_ORIGIN, origin, sizeof(origin),
|
||||
NULL, NULL, 0, 1) != 0)
|
||||
return (set_error(lbh, BE_ERR_NOORIGIN));
|
||||
|
||||
/* Don't destroy a mounted dataset unless force is specified */
|
||||
if ((mounted = zfs_is_mounted(fs, NULL)) != 0) {
|
||||
if (force) {
|
||||
zfs_unmount(fs, NULL, 0);
|
||||
} else {
|
||||
free(bdd.snapname);
|
||||
return (set_error(lbh, BE_ERR_DESTROYMNT));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!zfs_dataset_exists(lbh->lzh, path, ZFS_TYPE_SNAPSHOT))
|
||||
return (set_error(lbh, BE_ERR_NOENT));
|
||||
@ -280,16 +290,6 @@ be_destroy(libbe_handle_t *lbh, const char *name, int options)
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if mounted, unmount if force is specified */
|
||||
if ((mounted = zfs_is_mounted(fs, NULL)) != 0) {
|
||||
if (force) {
|
||||
zfs_unmount(fs, NULL, 0);
|
||||
} else {
|
||||
free(bdd.snapname);
|
||||
return (set_error(lbh, BE_ERR_DESTROYMNT));
|
||||
}
|
||||
}
|
||||
|
||||
err = be_destroy_cb(fs, &bdd);
|
||||
zfs_close(fs);
|
||||
free(bdd.snapname);
|
||||
|
@ -123,12 +123,21 @@ bectl_destroy_body()
|
||||
zpool=$(make_zpool_name)
|
||||
disk=${cwd}/disk.img
|
||||
mount=${cwd}/mnt
|
||||
root=${mount}/root
|
||||
|
||||
bectl_create_setup ${zpool} ${disk} ${mount}
|
||||
atf_check bectl -r ${zpool}/ROOT create -e default default2
|
||||
atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
|
||||
atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
|
||||
atf_check -e not-empty -s not-exit:0 zfs get mountpoint ${zpool}/ROOT/default2
|
||||
|
||||
# Test origin snapshot deletion when the snapshot to be destroyed
|
||||
# belongs to a mounted dataset, see PR 236043.
|
||||
atf_check mkdir -p ${root}
|
||||
atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
|
||||
atf_check bectl -r ${zpool}/ROOT create -e default default3
|
||||
atf_check bectl -r ${zpool}/ROOT destroy -o default3
|
||||
atf_check bectl -r ${zpool}/ROOT unmount default
|
||||
}
|
||||
bectl_destroy_cleanup()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user