]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Upstream: unmount snapshots before destroying them on macOS
authorJorgen Lundman <lundman@lundman.net>
Mon, 20 Sep 2021 15:29:59 +0000 (00:29 +0900)
committerGitHub <noreply@github.com>
Mon, 20 Sep 2021 15:29:59 +0000 (09:29 -0600)
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

include/libzfs.h
lib/libzfs/libzfs.abi
lib/libzfs/libzfs_dataset.c
lib/libzfs/os/freebsd/libzfs_compat.c
lib/libzfs/os/linux/libzfs_util_os.c

index 270f810027bbb6e5c193dcd9949fc4d1b9342e43..c0883a9836788eecbfb16b8c0a4a55e7fa4166c9 100644 (file)
@@ -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 *);
index a2c79c8568ca6a207aaa47f8163868642d1b6ad1..c5b0975258c07cecd6e0ee98c5e9cb8509236f20 100644 (file)
@@ -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'/>
       <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'/>
index 20251e9e7a5a174578a3a09ea3cbbd903eda00e7..fb337ca3f0e65fe342a70fefcf2f11fffd4677b4 100644 (file)
@@ -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) {
index 4d7421df8d3bfa6979dcabbebb67b31a108150d2..2c9d52bb0f01376a5c7e7d6e8afbdd80a743434c 100644 (file)
@@ -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.
  */
index b116f92d97af44b38aea3398c16cc54e9d7e1103..2ac31f1077ca4a7e81698ebe7e0e24cbbc64a09b 100644 (file)
@@ -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)