Upstream: unmount snapshots before destroying them on macOS
Add function zfs_destroy_snaps_nvl_os() call. The main issue is that macOS needs to unmount any mounted snapshots before they can be destroyed. Other platforms can handle this in the kernel, but sending a storm of zed events to unmount seems undesirable when we can do it in userland to start with. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: John Kennedy <john.kennedy@delphix.com> Signed-off-by: Jorgen Lundman <lundman@lundman.net> Co-authored-by: ilovezfs <ilovezfs@icloud.com> Closes #12550
This commit is contained in:
parent
8a3fe59c03
commit
1d901c3ee5
|
@ -650,6 +650,7 @@ _LIBZFS_H int zfs_create_ancestors(libzfs_handle_t *, const char *);
|
|||
_LIBZFS_H int zfs_destroy(zfs_handle_t *, boolean_t);
|
||||
_LIBZFS_H int zfs_destroy_snaps(zfs_handle_t *, char *, boolean_t);
|
||||
_LIBZFS_H int zfs_destroy_snaps_nvl(libzfs_handle_t *, nvlist_t *, boolean_t);
|
||||
_LIBZFS_H int zfs_destroy_snaps_nvl_os(libzfs_handle_t *, nvlist_t *);
|
||||
_LIBZFS_H int zfs_clone(zfs_handle_t *, const char *, nvlist_t *);
|
||||
_LIBZFS_H int zfs_snapshot(libzfs_handle_t *, const char *, boolean_t,
|
||||
nvlist_t *);
|
||||
|
|
|
@ -97,6 +97,7 @@
|
|||
<elf-symbol name='zfs_destroy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfs_destroy_snaps' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfs_destroy_snaps_nvl' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfs_destroy_snaps_nvl_os' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfs_expand_proplist' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfs_foreach_mountpoint' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
<elf-symbol name='zfs_get_all_props' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
|
||||
|
@ -4161,6 +4162,11 @@
|
|||
<parameter type-id='95e97e5e' name='len'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='zfs_destroy_snaps_nvl_os' mangled-name='zfs_destroy_snaps_nvl_os' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_destroy_snaps_nvl_os'>
|
||||
<parameter type-id='b0382bb3' name='hdl'/>
|
||||
<parameter type-id='5ce45b60' name='snaps'/>
|
||||
<return type-id='95e97e5e'/>
|
||||
</function-decl>
|
||||
<function-decl name='libzfs_error_init' mangled-name='libzfs_error_init' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='libzfs_error_init'>
|
||||
<parameter type-id='95e97e5e' name='error'/>
|
||||
<return type-id='80f4b756'/>
|
||||
|
|
|
@ -3884,10 +3884,13 @@ zfs_destroy_snaps(zfs_handle_t *zhp, char *snapname, boolean_t defer)
|
|||
int
|
||||
zfs_destroy_snaps_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, boolean_t defer)
|
||||
{
|
||||
int ret;
|
||||
nvlist_t *errlist = NULL;
|
||||
nvpair_t *pair;
|
||||
|
||||
int ret = zfs_destroy_snaps_nvl_os(hdl, snaps);
|
||||
if (ret != 0)
|
||||
return (ret);
|
||||
|
||||
ret = lzc_destroy_snaps(snaps, defer, &errlist);
|
||||
|
||||
if (ret == 0) {
|
||||
|
|
|
@ -267,6 +267,12 @@ find_shares_object(differ_info_t *di)
|
|||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
zfs_destroy_snaps_nvl_os(libzfs_handle_t *hdl, nvlist_t *snaps)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Attach/detach the given filesystem to/from the given jail.
|
||||
*/
|
||||
|
|
|
@ -184,6 +184,12 @@ find_shares_object(differ_info_t *di)
|
|||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
zfs_destroy_snaps_nvl_os(libzfs_handle_t *hdl, nvlist_t *snaps)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill given version buffer with zfs kernel version read from ZFS_SYSFS_DIR
|
||||
* Returns 0 on success, and -1 on error (with errno set)
|
||||
|
|
Loading…
Reference in New Issue