]> git.proxmox.com Git - mirror_zfs.git/commitdiff
libzfs: add v2 iterator interfaces
authorRob N <rob.norris@klarasystems.com>
Mon, 10 Apr 2023 18:53:02 +0000 (04:53 +1000)
committerGitHub <noreply@github.com>
Mon, 10 Apr 2023 18:53:02 +0000 (11:53 -0700)
f6a0dac84 modified the zfs_iter_* functions to take a new "flags"
parameter, and introduced a variety of flags to ask the kernel to limit
the results in various ways, reducing the amount of work the caller
needed to do to filter out things they didn't need.

Unfortunately this change broke the ABI for existing clients (read:
older versions of the `zfs` program), and was reverted 399b98198.

dc95911d2 reintroduced the original patch, with the understanding that a
backwards-compatible fix would be made before the 2.2 release branch was
tagged. This commit is that fix.

This introduces zfs_iter_*_v2 functions that have the new flags
argument, and reverts the existing functions to not have the flags
parameter, as they were before. The old functions are now reimplemented
in terms of the new, with flags set to 0.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Wilson <george.wilson@delphix.com>
Original-patch-by: George Wilson <george.wilson@delphix.com>
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Sponsored-by: Klara, Inc.
Closes #14597

12 files changed:
cmd/zfs/zfs_iter.c
cmd/zfs/zfs_main.c
cmd/zpool/zpool_main.c
contrib/pam_zfs_key/pam_zfs_key.c
include/libzfs.h
lib/libzfs/libzfs.abi
lib/libzfs/libzfs_changelist.c
lib/libzfs/libzfs_crypto.c
lib/libzfs/libzfs_dataset.c
lib/libzfs/libzfs_iter.c
lib/libzfs/libzfs_mount.c
lib/libzfs/libzfs_sendrecv.c

index 6665627d43e324e7d5d277058077da42eb0e9b1e..202cb0e82b5a0d3190f3491f7b08f443ad75246d 100644 (file)
@@ -143,19 +143,19 @@ zfs_callback(zfs_handle_t *zhp, void *data)
                    (cb->cb_types &
                    (ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME))) &&
                    zfs_get_type(zhp) == ZFS_TYPE_FILESYSTEM) {
-                       (void) zfs_iter_filesystems(zhp, cb->cb_flags,
+                       (void) zfs_iter_filesystems_v2(zhp, cb->cb_flags,
                            zfs_callback, data);
                }
 
                if (((zfs_get_type(zhp) & (ZFS_TYPE_SNAPSHOT |
                    ZFS_TYPE_BOOKMARK)) == 0) && include_snaps) {
-                       (void) zfs_iter_snapshots(zhp, cb->cb_flags,
+                       (void) zfs_iter_snapshots_v2(zhp, cb->cb_flags,
                            zfs_callback, data, 0, 0);
                }
 
                if (((zfs_get_type(zhp) & (ZFS_TYPE_SNAPSHOT |
                    ZFS_TYPE_BOOKMARK)) == 0) && include_bmarks) {
-                       (void) zfs_iter_bookmarks(zhp, cb->cb_flags,
+                       (void) zfs_iter_bookmarks_v2(zhp, cb->cb_flags,
                            zfs_callback, data);
                }
 
index d65b0157903713bb661a8bbb51f4d8664668c08e..e28f1d04f3503d87e17bd462db00b55ae9b14d5b 100644 (file)
@@ -1532,7 +1532,8 @@ destroy_print_snapshots(zfs_handle_t *fs_zhp, destroy_cbdata_t *cb)
        int err;
        assert(cb->cb_firstsnap == NULL);
        assert(cb->cb_prevsnap == NULL);
-       err = zfs_iter_snapshots_sorted(fs_zhp, 0, destroy_print_cb, cb, 0, 0);
+       err = zfs_iter_snapshots_sorted_v2(fs_zhp, 0, destroy_print_cb, cb, 0,
+           0);
        if (cb->cb_firstsnap != NULL) {
                uint64_t used = 0;
                if (err == 0) {
@@ -1558,7 +1559,7 @@ snapshot_to_nvl_cb(zfs_handle_t *zhp, void *arg)
        if (!cb->cb_doclones && !cb->cb_defer_destroy) {
                cb->cb_target = zhp;
                cb->cb_first = B_TRUE;
-               err = zfs_iter_dependents(zhp, 0, B_TRUE,
+               err = zfs_iter_dependents_v2(zhp, 0, B_TRUE,
                    destroy_check_dependent, cb);
        }
 
@@ -1576,7 +1577,7 @@ gather_snapshots(zfs_handle_t *zhp, void *arg)
        destroy_cbdata_t *cb = arg;
        int err = 0;
 
-       err = zfs_iter_snapspec(zhp, 0, cb->cb_snapspec,
+       err = zfs_iter_snapspec_v2(zhp, 0, cb->cb_snapspec,
            snapshot_to_nvl_cb, cb);
        if (err == ENOENT)
                err = 0;
@@ -1590,7 +1591,7 @@ gather_snapshots(zfs_handle_t *zhp, void *arg)
        }
 
        if (cb->cb_recurse)
-               err = zfs_iter_filesystems(zhp, 0, gather_snapshots, cb);
+               err = zfs_iter_filesystems_v2(zhp, 0, gather_snapshots, cb);
 
 out:
        zfs_close(zhp);
@@ -1615,7 +1616,7 @@ destroy_clones(destroy_cbdata_t *cb)
                         * false while destroying the clones.
                         */
                        cb->cb_defer_destroy = B_FALSE;
-                       err = zfs_iter_dependents(zhp, 0, B_FALSE,
+                       err = zfs_iter_dependents_v2(zhp, 0, B_FALSE,
                            destroy_callback, cb);
                        cb->cb_defer_destroy = defer;
                        zfs_close(zhp);
@@ -1825,9 +1826,8 @@ zfs_do_destroy(int argc, char **argv)
                 * Check for any dependents and/or clones.
                 */
                cb.cb_first = B_TRUE;
-               if (!cb.cb_doclones &&
-                   zfs_iter_dependents(zhp, 0, B_TRUE, destroy_check_dependent,
-                   &cb) != 0) {
+               if (!cb.cb_doclones && zfs_iter_dependents_v2(zhp, 0, B_TRUE,
+                   destroy_check_dependent, &cb) != 0) {
                        rv = 1;
                        goto out;
                }
@@ -1837,7 +1837,7 @@ zfs_do_destroy(int argc, char **argv)
                        goto out;
                }
                cb.cb_batchedsnaps = fnvlist_alloc();
-               if (zfs_iter_dependents(zhp, 0, B_FALSE, destroy_callback,
+               if (zfs_iter_dependents_v2(zhp, 0, B_FALSE, destroy_callback,
                    &cb) != 0) {
                        rv = 1;
                        goto out;
@@ -4065,7 +4065,7 @@ rollback_check(zfs_handle_t *zhp, void *data)
                }
 
                if (cbp->cb_recurse) {
-                       if (zfs_iter_dependents(zhp, 0, B_TRUE,
+                       if (zfs_iter_dependents_v2(zhp, 0, B_TRUE,
                            rollback_check_dependent, cbp) != 0) {
                                zfs_close(zhp);
                                return (-1);
@@ -4164,10 +4164,10 @@ zfs_do_rollback(int argc, char **argv)
        if (cb.cb_create > 0)
                min_txg = cb.cb_create;
 
-       if ((ret = zfs_iter_snapshots(zhp, 0, rollback_check, &cb,
+       if ((ret = zfs_iter_snapshots_v2(zhp, 0, rollback_check, &cb,
            min_txg, 0)) != 0)
                goto out;
-       if ((ret = zfs_iter_bookmarks(zhp, 0, rollback_check, &cb)) != 0)
+       if ((ret = zfs_iter_bookmarks_v2(zhp, 0, rollback_check, &cb)) != 0)
                goto out;
 
        if ((ret = cb.cb_error) != 0)
@@ -4309,7 +4309,7 @@ zfs_snapshot_cb(zfs_handle_t *zhp, void *arg)
        free(name);
 
        if (sd->sd_recursive)
-               rv = zfs_iter_filesystems(zhp, 0, zfs_snapshot_cb, sd);
+               rv = zfs_iter_filesystems_v2(zhp, 0, zfs_snapshot_cb, sd);
        zfs_close(zhp);
        return (rv);
 }
@@ -6373,7 +6373,7 @@ zfs_do_allow_unallow_impl(int argc, char **argv, boolean_t un)
 
                if (un && opts.recursive) {
                        struct deleg_perms data = { un, update_perm_nvl };
-                       if (zfs_iter_filesystems(zhp, 0, set_deleg_perms,
+                       if (zfs_iter_filesystems_v2(zhp, 0, set_deleg_perms,
                            &data) != 0)
                                goto cleanup0;
                }
@@ -6751,7 +6751,7 @@ get_one_dataset(zfs_handle_t *zhp, void *data)
        /*
         * Iterate over any nested datasets.
         */
-       if (zfs_iter_filesystems(zhp, 0, get_one_dataset, data) != 0) {
+       if (zfs_iter_filesystems_v2(zhp, 0, get_one_dataset, data) != 0) {
                zfs_close(zhp);
                return (1);
        }
index 9475beaa2368f36299d5cda09104981fd95fd663..20f9cd679534f4e5604be4787fe4fd1451e345d4 100644 (file)
@@ -8855,7 +8855,7 @@ check_unsupp_fs(zfs_handle_t *zhp, void *unsupp_fs)
                (*count)++;
        }
 
-       zfs_iter_filesystems(zhp, 0, check_unsupp_fs, unsupp_fs);
+       zfs_iter_filesystems_v2(zhp, 0, check_unsupp_fs, unsupp_fs);
 
        zfs_close(zhp);
 
index 99cdb8d7733f2773424f90fd01f55743cdbc80b8..6ba5b5fba75f261af6762ed0ed654825dc6f9b28 100644 (file)
@@ -535,8 +535,8 @@ zfs_key_config_get_dataset(zfs_key_config_t *config)
                        return (NULL);
                }
 
-               (void) zfs_iter_filesystems(zhp, 0, find_dsname_by_prop_value,
-                   config);
+               (void) zfs_iter_filesystems_v2(zhp, 0,
+                   find_dsname_by_prop_value, config);
                zfs_close(zhp);
                char *dsname = config->dsname;
                config->dsname = NULL;
index 4f8eeb72ad956c7832a8da41224de58da0b397f4..7ec9768d8e93c5bb0b4b1c003459bcd0a0f6e347 100644 (file)
@@ -656,17 +656,29 @@ _LIBZFS_H void zprop_print_one_property(const char *, zprop_get_cbdata_t *,
 
 typedef int (*zfs_iter_f)(zfs_handle_t *, void *);
 _LIBZFS_H int zfs_iter_root(libzfs_handle_t *, zfs_iter_f, void *);
-_LIBZFS_H int zfs_iter_children(zfs_handle_t *, int, zfs_iter_f, void *);
-_LIBZFS_H int zfs_iter_dependents(zfs_handle_t *, int, boolean_t, zfs_iter_f,
+_LIBZFS_H int zfs_iter_children(zfs_handle_t *, zfs_iter_f, void *);
+_LIBZFS_H int zfs_iter_dependents(zfs_handle_t *, boolean_t, zfs_iter_f,
     void *);
-_LIBZFS_H int zfs_iter_filesystems(zfs_handle_t *, int, zfs_iter_f, void *);
-_LIBZFS_H int zfs_iter_snapshots(zfs_handle_t *, int, zfs_iter_f, void *,
+_LIBZFS_H int zfs_iter_filesystems(zfs_handle_t *, zfs_iter_f, void *);
+_LIBZFS_H int zfs_iter_snapshots(zfs_handle_t *, boolean_t, zfs_iter_f, void *,
     uint64_t, uint64_t);
-_LIBZFS_H int zfs_iter_snapshots_sorted(zfs_handle_t *, int, zfs_iter_f, void *,
+_LIBZFS_H int zfs_iter_snapshots_sorted(zfs_handle_t *, zfs_iter_f, void *,
     uint64_t, uint64_t);
-_LIBZFS_H int zfs_iter_snapspec(zfs_handle_t *, int, const char *, zfs_iter_f,
+_LIBZFS_H int zfs_iter_snapspec(zfs_handle_t *, const char *, zfs_iter_f,
     void *);
-_LIBZFS_H int zfs_iter_bookmarks(zfs_handle_t *, int, zfs_iter_f, void *);
+_LIBZFS_H int zfs_iter_bookmarks(zfs_handle_t *, zfs_iter_f, void *);
+
+_LIBZFS_H int zfs_iter_children_v2(zfs_handle_t *, int, zfs_iter_f, void *);
+_LIBZFS_H int zfs_iter_dependents_v2(zfs_handle_t *, int, boolean_t, zfs_iter_f,
+    void *);
+_LIBZFS_H int zfs_iter_filesystems_v2(zfs_handle_t *, int, zfs_iter_f, void *);
+_LIBZFS_H int zfs_iter_snapshots_v2(zfs_handle_t *, int, zfs_iter_f, void *,
+    uint64_t, uint64_t);
+_LIBZFS_H int zfs_iter_snapshots_sorted_v2(zfs_handle_t *, int, zfs_iter_f,
+    void *, uint64_t, uint64_t);
+_LIBZFS_H int zfs_iter_snapspec_v2(zfs_handle_t *, int, const char *,
+    zfs_iter_f, void *);
+_LIBZFS_H int zfs_iter_bookmarks_v2(zfs_handle_t *, int, zfs_iter_f, void *);
 _LIBZFS_H int zfs_iter_mounted(zfs_handle_t *, zfs_iter_f, void *);
 
 typedef struct get_all_cb {
index 2b61710f55923731bda2e8fe369356fdeeefd7c5..41e74fd8db19c2b5847b5875d5c7922fe32bee2d 100644 (file)
     <elf-symbol name='zfs_is_shared' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_isnumber' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_bookmarks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='zfs_iter_bookmarks_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_children' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='zfs_iter_children_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_dependents' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='zfs_iter_dependents_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_filesystems' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='zfs_iter_filesystems_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_mounted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_root' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_snapshots' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_snapshots_sorted' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='zfs_iter_snapshots_sorted_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='zfs_iter_snapshots_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_iter_snapspec' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='zfs_iter_snapspec_v2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_mod_supported' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_mount' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='zfs_mount_at' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
       <return type-id='9c313c2d'/>
     </function-decl>
     <function-decl name='zfs_iter_children' mangled-name='zfs_iter_children' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_children'>
-      <parameter type-id='9200a744'/>
-      <parameter type-id='95e97e5e'/>
-      <parameter type-id='d8e49ab9'/>
-      <parameter type-id='eaa32e2f'/>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
+      <return type-id='95e97e5e'/>
+    </function-decl>
+    <function-decl name='zfs_iter_children_v2' mangled-name='zfs_iter_children_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_children_v2'>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='95e97e5e' name='flags'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='zfs_iter_dependents' mangled-name='zfs_iter_dependents' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_dependents'>
-      <parameter type-id='9200a744'/>
-      <parameter type-id='95e97e5e'/>
-      <parameter type-id='c19b74c3'/>
-      <parameter type-id='d8e49ab9'/>
-      <parameter type-id='eaa32e2f'/>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='c19b74c3' name='allowrecursion'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
+      <return type-id='95e97e5e'/>
+    </function-decl>
+    <function-decl name='zfs_iter_dependents_v2' mangled-name='zfs_iter_dependents_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_dependents_v2'>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='95e97e5e' name='flags'/>
+      <parameter type-id='c19b74c3' name='allowrecursion'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='zfs_iter_mounted' mangled-name='zfs_iter_mounted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_mounted'>
       <return type-id='80f4b756'/>
     </function-decl>
     <function-decl name='zfs_iter_filesystems' mangled-name='zfs_iter_filesystems' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_filesystems'>
-      <parameter type-id='9200a744'/>
-      <parameter type-id='95e97e5e'/>
-      <parameter type-id='d8e49ab9'/>
-      <parameter type-id='eaa32e2f'/>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
+      <return type-id='95e97e5e'/>
+    </function-decl>
+    <function-decl name='zfs_iter_filesystems_v2' mangled-name='zfs_iter_filesystems_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_filesystems_v2'>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='95e97e5e' name='flags'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='zfs_parent_name' mangled-name='zfs_parent_name' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_parent_name'>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='zfs_iter_snapshots' mangled-name='zfs_iter_snapshots' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapshots'>
-      <parameter type-id='9200a744'/>
-      <parameter type-id='95e97e5e'/>
-      <parameter type-id='d8e49ab9'/>
-      <parameter type-id='eaa32e2f'/>
-      <parameter type-id='9c313c2d'/>
-      <parameter type-id='9c313c2d'/>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='c19b74c3' name='simple'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
+      <parameter type-id='9c313c2d' name='min_txg'/>
+      <parameter type-id='9c313c2d' name='max_txg'/>
+      <return type-id='95e97e5e'/>
+    </function-decl>
+    <function-decl name='zfs_iter_snapshots_v2' mangled-name='zfs_iter_snapshots_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapshots_v2'>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='95e97e5e' name='flags'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
+      <parameter type-id='9c313c2d' name='min_txg'/>
+      <parameter type-id='9c313c2d' name='max_txg'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='zfs_iter_bookmarks' mangled-name='zfs_iter_bookmarks' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_bookmarks'>
-      <parameter type-id='9200a744'/>
-      <parameter type-id='95e97e5e'/>
-      <parameter type-id='d8e49ab9'/>
-      <parameter type-id='eaa32e2f'/>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
+      <return type-id='95e97e5e'/>
+    </function-decl>
+    <function-decl name='zfs_iter_bookmarks_v2' mangled-name='zfs_iter_bookmarks_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_bookmarks_v2'>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='95e97e5e' name='flags'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='data'/>
       <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'>
       <return type-id='9200a744'/>
     </function-decl>
     <function-decl name='zfs_iter_snapshots_sorted' mangled-name='zfs_iter_snapshots_sorted' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapshots_sorted'>
+      <parameter type-id='9200a744' name='zhp'/>
+      <parameter type-id='d8e49ab9' name='callback'/>
+      <parameter type-id='eaa32e2f' name='data'/>
+      <parameter type-id='9c313c2d' name='min_txg'/>
+      <parameter type-id='9c313c2d' name='max_txg'/>
+      <return type-id='95e97e5e'/>
+    </function-decl>
+    <function-decl name='zfs_iter_snapshots_sorted_v2' mangled-name='zfs_iter_snapshots_sorted_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapshots_sorted_v2'>
       <parameter type-id='9200a744' name='zhp'/>
       <parameter type-id='95e97e5e' name='flags'/>
       <parameter type-id='d8e49ab9' name='callback'/>
       <return type-id='95e97e5e'/>
     </function-decl>
     <function-decl name='zfs_iter_snapspec' mangled-name='zfs_iter_snapspec' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapspec'>
+      <parameter type-id='9200a744' name='fs_zhp'/>
+      <parameter type-id='80f4b756' name='spec_orig'/>
+      <parameter type-id='d8e49ab9' name='func'/>
+      <parameter type-id='eaa32e2f' name='arg'/>
+      <return type-id='95e97e5e'/>
+    </function-decl>
+    <function-decl name='zfs_iter_snapspec_v2' mangled-name='zfs_iter_snapspec_v2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='zfs_iter_snapspec_v2'>
       <parameter type-id='9200a744' name='fs_zhp'/>
       <parameter type-id='95e97e5e' name='flags'/>
       <parameter type-id='80f4b756' name='spec_orig'/>
index d7ea60822419b9b1cc489aa80b8e071f29a00fce..dd14c570ec036a7e05448aa0113a587d6c67ffa0 100644 (file)
@@ -552,7 +552,7 @@ change_one(zfs_handle_t *zhp, void *data)
                }
 
                if (!clp->cl_alldependents)
-                       ret = zfs_iter_children(zhp, 0, change_one, data);
+                       ret = zfs_iter_children_v2(zhp, 0, change_one, data);
 
                /*
                 * If we added the handle to the changelist, we will re-use it
@@ -721,11 +721,12 @@ changelist_gather(zfs_handle_t *zhp, zfs_prop_t prop, int gather_flags,
                        return (NULL);
                }
        } else if (clp->cl_alldependents) {
-               if (zfs_iter_dependents(zhp, 0, B_TRUE, change_one, clp) != 0) {
+               if (zfs_iter_dependents_v2(zhp, 0, B_TRUE, change_one,
+                   clp) != 0) {
                        changelist_free(clp);
                        return (NULL);
                }
-       } else if (zfs_iter_children(zhp, 0, change_one, clp) != 0) {
+       } else if (zfs_iter_children_v2(zhp, 0, change_one, clp) != 0) {
                changelist_free(clp);
                return (NULL);
        }
index 40059063e21aff7401faccb436328db056256ff2..8f2a50d55e87f7de5f4d4c353d328c629267ce7e 100644 (file)
@@ -1226,7 +1226,7 @@ load_keys_cb(zfs_handle_t *zhp, void *arg)
                cb->cb_numfailed++;
 
 out:
-       (void) zfs_iter_filesystems(zhp, 0, load_keys_cb, cb);
+       (void) zfs_iter_filesystems_v2(zhp, 0, load_keys_cb, cb);
        zfs_close(zhp);
 
        /* always return 0, since this function is best effort */
index 8fa36fa95a1705367e2ce601cefe20ca1c605ede..138eca19acc3577e5d3a6beb5263e8da80434900 100644 (file)
@@ -757,7 +757,7 @@ zfs_open(libzfs_handle_t *hdl, const char *path, int types)
                 * Iterate bookmarks to find the right one.
                 */
                errno = 0;
-               if ((zfs_iter_bookmarks(pzhp, 0, zfs_open_bookmarks_cb,
+               if ((zfs_iter_bookmarks_v2(pzhp, 0, zfs_open_bookmarks_cb,
                    &cb_data) == 0) && (cb_data.zhp == NULL)) {
                        (void) zfs_error(hdl, EZFS_NOENT, errbuf);
                        zfs_close(pzhp);
@@ -2476,7 +2476,7 @@ get_clones_cb(zfs_handle_t *zhp, void *arg)
        }
 
 out:
-       (void) zfs_iter_children(zhp, 0, get_clones_cb, gca);
+       (void) zfs_iter_children_v2(zhp, 0, get_clones_cb, gca);
        zfs_close(zhp);
        return (0);
 }
@@ -3925,7 +3925,7 @@ zfs_check_snap_cb(zfs_handle_t *zhp, void *arg)
        if (lzc_exists(name))
                fnvlist_add_boolean(dd->nvl, name);
 
-       rv = zfs_iter_filesystems(zhp, 0, zfs_check_snap_cb, dd);
+       rv = zfs_iter_filesystems_v2(zhp, 0, zfs_check_snap_cb, dd);
        zfs_close(zhp);
        return (rv);
 }
@@ -4163,7 +4163,7 @@ zfs_snapshot_cb(zfs_handle_t *zhp, void *arg)
 
                fnvlist_add_boolean(sd->sd_nvl, name);
 
-               rv = zfs_iter_filesystems(zhp, 0, zfs_snapshot_cb, sd);
+               rv = zfs_iter_filesystems_v2(zhp, 0, zfs_snapshot_cb, sd);
        }
        zfs_close(zhp);
 
@@ -4340,7 +4340,7 @@ rollback_destroy(zfs_handle_t *zhp, void *data)
        rollback_data_t *cbp = data;
 
        if (zfs_prop_get_int(zhp, ZFS_PROP_CREATETXG) > cbp->cb_create) {
-               cbp->cb_error |= zfs_iter_dependents(zhp, 0, B_FALSE,
+               cbp->cb_error |= zfs_iter_dependents_v2(zhp, 0, B_FALSE,
                    rollback_destroy_dependent, cbp);
 
                cbp->cb_error |= zfs_destroy(zhp, B_FALSE);
@@ -4380,10 +4380,10 @@ zfs_rollback(zfs_handle_t *zhp, zfs_handle_t *snap, boolean_t force)
        if (cb.cb_create > 0)
                min_txg = cb.cb_create;
 
-       (void) zfs_iter_snapshots(zhp, 0, rollback_destroy, &cb,
+       (void) zfs_iter_snapshots_v2(zhp, 0, rollback_destroy, &cb,
            min_txg, 0);
 
-       (void) zfs_iter_bookmarks(zhp, 0, rollback_destroy, &cb);
+       (void) zfs_iter_bookmarks_v2(zhp, 0, rollback_destroy, &cb);
 
        if (cb.cb_error)
                return (-1);
@@ -4964,7 +4964,7 @@ zfs_hold_one(zfs_handle_t *zhp, void *arg)
                fnvlist_add_string(ha->nvl, name, ha->tag);
 
        if (ha->recursive)
-               rv = zfs_iter_filesystems(zhp, 0, zfs_hold_one, ha);
+               rv = zfs_iter_filesystems_v2(zhp, 0, zfs_hold_one, ha);
        zfs_close(zhp);
        return (rv);
 }
@@ -5095,7 +5095,7 @@ zfs_release_one(zfs_handle_t *zhp, void *arg)
        }
 
        if (ha->recursive)
-               rv = zfs_iter_filesystems(zhp, 0, zfs_release_one, ha);
+               rv = zfs_iter_filesystems_v2(zhp, 0, zfs_release_one, ha);
        zfs_close(zhp);
        return (rv);
 }
index 681fe5b4748dff4b1cb1800b27958ea093b0e1db..452d8fd6ab71c806f0c0d26d4243ef339ac442b0 100644 (file)
@@ -103,7 +103,14 @@ top:
  * Iterate over all child filesystems
  */
 int
-zfs_iter_filesystems(zfs_handle_t *zhp, int flags, zfs_iter_f func, void *data)
+zfs_iter_filesystems(zfs_handle_t *zhp, zfs_iter_f func, void *data)
+{
+       return (zfs_iter_filesystems_v2(zhp, 0, func, data));
+}
+
+int
+zfs_iter_filesystems_v2(zfs_handle_t *zhp, int flags, zfs_iter_f func,
+    void *data)
 {
        zfs_cmd_t zc = {"\0"};
        zfs_handle_t *nzhp;
@@ -143,7 +150,15 @@ zfs_iter_filesystems(zfs_handle_t *zhp, int flags, zfs_iter_f func, void *data)
  * Iterate over all snapshots
  */
 int
-zfs_iter_snapshots(zfs_handle_t *zhp, int flags, zfs_iter_f func,
+zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func,
+    void *data, uint64_t min_txg, uint64_t max_txg)
+{
+       return (zfs_iter_snapshots_v2(zhp, simple ? ZFS_ITER_SIMPLE : 0, func,
+           data, min_txg, max_txg));
+}
+
+int
+zfs_iter_snapshots_v2(zfs_handle_t *zhp, int flags, zfs_iter_f func,
     void *data, uint64_t min_txg, uint64_t max_txg)
 {
        zfs_cmd_t zc = {"\0"};
@@ -197,7 +212,13 @@ zfs_iter_snapshots(zfs_handle_t *zhp, int flags, zfs_iter_f func,
  * Iterate over all bookmarks
  */
 int
-zfs_iter_bookmarks(zfs_handle_t *zhp, int flags __maybe_unused,
+zfs_iter_bookmarks(zfs_handle_t *zhp, zfs_iter_f func, void *data)
+{
+       return (zfs_iter_bookmarks_v2(zhp, 0, func, data));
+}
+
+int
+zfs_iter_bookmarks_v2(zfs_handle_t *zhp, int flags __maybe_unused,
     zfs_iter_f func, void *data)
 {
        zfs_handle_t *nzhp;
@@ -305,7 +326,15 @@ zfs_snapshot_compare(const void *larg, const void *rarg)
 }
 
 int
-zfs_iter_snapshots_sorted(zfs_handle_t *zhp, int flags, zfs_iter_f callback,
+zfs_iter_snapshots_sorted(zfs_handle_t *zhp, zfs_iter_f callback,
+    void *data, uint64_t min_txg, uint64_t max_txg)
+{
+       return (zfs_iter_snapshots_sorted_v2(zhp, 0, callback, data,
+           min_txg, max_txg));
+}
+
+int
+zfs_iter_snapshots_sorted_v2(zfs_handle_t *zhp, int flags, zfs_iter_f callback,
     void *data, uint64_t min_txg, uint64_t max_txg)
 {
        int ret = 0;
@@ -316,7 +345,7 @@ zfs_iter_snapshots_sorted(zfs_handle_t *zhp, int flags, zfs_iter_f callback,
        avl_create(&avl, zfs_snapshot_compare,
            sizeof (zfs_node_t), offsetof(zfs_node_t, zn_avlnode));
 
-       ret = zfs_iter_snapshots(zhp, flags, zfs_sort_snaps, &avl, min_txg,
+       ret = zfs_iter_snapshots_v2(zhp, flags, zfs_sort_snaps, &avl, min_txg,
            max_txg);
 
        for (node = avl_first(&avl); node != NULL; node = AVL_NEXT(&avl, node))
@@ -379,7 +408,14 @@ snapspec_cb(zfs_handle_t *zhp, void *arg)
  * return ENOENT at the end.
  */
 int
-zfs_iter_snapspec(zfs_handle_t *fs_zhp, int flags, const char *spec_orig,
+zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig,
+    zfs_iter_f func, void *arg)
+{
+       return (zfs_iter_snapspec_v2(fs_zhp, 0, spec_orig, func, arg));
+}
+
+int
+zfs_iter_snapspec_v2(zfs_handle_t *fs_zhp, int flags, const char *spec_orig,
     zfs_iter_f func, void *arg)
 {
        char *buf, *comma_separated, *cp;
@@ -419,7 +455,7 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, int flags, const char *spec_orig,
                                }
                        }
 
-                       err = zfs_iter_snapshots_sorted(fs_zhp, flags,
+                       err = zfs_iter_snapshots_sorted_v2(fs_zhp, flags,
                            snapspec_cb, &ssa, 0, 0);
                        if (ret == 0)
                                ret = err;
@@ -456,14 +492,20 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, int flags, const char *spec_orig,
  * and as close as possible.
  */
 int
-zfs_iter_children(zfs_handle_t *zhp, int flags, zfs_iter_f func, void *data)
+zfs_iter_children(zfs_handle_t *zhp, zfs_iter_f func, void *data)
+{
+       return (zfs_iter_children_v2(zhp, 0, func, data));
+}
+
+int
+zfs_iter_children_v2(zfs_handle_t *zhp, int flags, zfs_iter_f func, void *data)
 {
        int ret;
 
-       if ((ret = zfs_iter_snapshots(zhp, flags, func, data, 0, 0)) != 0)
+       if ((ret = zfs_iter_snapshots_v2(zhp, flags, func, data, 0, 0)) != 0)
                return (ret);
 
-       return (zfs_iter_filesystems(zhp, flags, func, data));
+       return (zfs_iter_filesystems_v2(zhp, flags, func, data));
 }
 
 
@@ -524,10 +566,10 @@ iter_dependents_cb(zfs_handle_t *zhp, void *arg)
                isf.zhp = zhp;
                isf.next = ida->stack;
                ida->stack = &isf;
-               err = zfs_iter_filesystems(zhp, ida->flags,
+               err = zfs_iter_filesystems_v2(zhp, ida->flags,
                    iter_dependents_cb, ida);
                if (err == 0)
-                       err = zfs_iter_snapshots(zhp, ida->flags,
+                       err = zfs_iter_snapshots_v2(zhp, ida->flags,
                            iter_dependents_cb, ida, 0, 0);
                ida->stack = isf.next;
        }
@@ -541,7 +583,14 @@ iter_dependents_cb(zfs_handle_t *zhp, void *arg)
 }
 
 int
-zfs_iter_dependents(zfs_handle_t *zhp, int flags, boolean_t allowrecursion,
+zfs_iter_dependents(zfs_handle_t *zhp, boolean_t allowrecursion,
+    zfs_iter_f func, void *data)
+{
+       return (zfs_iter_dependents_v2(zhp, 0, allowrecursion, func, data));
+}
+
+int
+zfs_iter_dependents_v2(zfs_handle_t *zhp, int flags, boolean_t allowrecursion,
     zfs_iter_f func, void *data)
 {
        iter_dependents_arg_t ida;
index 024f449baa0b5cd4dc81a0985092ae13d8ee6109..5d1fe651c97e4b8637fe5b7744f605a188e9b522 100644 (file)
@@ -940,7 +940,7 @@ zfs_iter_cb(zfs_handle_t *zhp, void *data)
        }
 
        libzfs_add_handle(cbp, zhp);
-       if (zfs_iter_filesystems(zhp, 0, zfs_iter_cb, cbp) != 0) {
+       if (zfs_iter_filesystems_v2(zhp, 0, zfs_iter_cb, cbp) != 0) {
                zfs_close(zhp);
                return (-1);
        }
@@ -1289,7 +1289,7 @@ zpool_enable_datasets(zpool_handle_t *zhp, const char *mntopts, int flags)
         * over all child filesystems.
         */
        libzfs_add_handle(&cb, zfsp);
-       if (zfs_iter_filesystems(zfsp, 0, zfs_iter_cb, &cb) != 0)
+       if (zfs_iter_filesystems_v2(zfsp, 0, zfs_iter_cb, &cb) != 0)
                goto out;
 
        /*
index 23402f86a8ae7e088af2d9bcbad8cb297e46fe0e..87a30f54fea824df69ef2abed60e2601592e51f4 100644 (file)
@@ -288,7 +288,7 @@ send_iterate_prop(zfs_handle_t *zhp, boolean_t received_only, nvlist_t *nv);
 
 /*
  * Collect guid, valid props, optionally holds, etc. of a snapshot.
- * This interface is intended for use as a zfs_iter_snapshots_sorted visitor.
+ * This interface is intended for use as a zfs_iter_snapshots_v2_sorted visitor.
  */
 static int
 send_iterate_snap(zfs_handle_t *zhp, void *arg)
@@ -619,8 +619,8 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg)
                        min_txg = fromsnap_txg;
                if (!sd->replicate && tosnap_txg != 0)
                        max_txg = tosnap_txg;
-               (void) zfs_iter_snapshots_sorted(zhp, 0, send_iterate_snap, sd,
-                   min_txg, max_txg);
+               (void) zfs_iter_snapshots_sorted_v2(zhp, 0, send_iterate_snap,
+                   sd, min_txg, max_txg);
        } else {
                char snapname[MAXPATHLEN] = { 0 };
                zfs_handle_t *snap;
@@ -662,7 +662,7 @@ send_iterate_fs(zfs_handle_t *zhp, void *arg)
 
        /* Iterate over children. */
        if (sd->recursive)
-               rv = zfs_iter_filesystems(zhp, 0, send_iterate_fs, sd);
+               rv = zfs_iter_filesystems_v2(zhp, 0, send_iterate_fs, sd);
 
 out:
        /* Restore saved fields. */
@@ -1083,7 +1083,7 @@ send_print_verbose(FILE *fout, const char *tosnap, const char *fromsnap,
 
 /*
  * Send a single filesystem snapshot, updating the send dump data.
- * This interface is intended for use as a zfs_iter_snapshots_sorted visitor.
+ * This interface is intended for use as a zfs_iter_snapshots_v2_sorted visitor.
  */
 static int
 dump_snapshot(zfs_handle_t *zhp, void *arg)
@@ -1293,7 +1293,7 @@ dump_filesystem(zfs_handle_t *zhp, send_dump_data_t *sdd)
                                    zhp->zfs_name, sdd->tosnap);
                        }
                }
-               rv = zfs_iter_snapshots_sorted(zhp, 0, dump_snapshot, sdd,
+               rv = zfs_iter_snapshots_sorted_v2(zhp, 0, dump_snapshot, sdd,
                    min_txg, max_txg);
        } else {
                char snapname[MAXPATHLEN] = { 0 };
@@ -3162,9 +3162,9 @@ guid_to_name_cb(zfs_handle_t *zhp, void *arg)
                return (EEXIST);
        }
 
-       err = zfs_iter_children(zhp, 0, guid_to_name_cb, gtnd);
+       err = zfs_iter_children_v2(zhp, 0, guid_to_name_cb, gtnd);
        if (err != EEXIST && gtnd->bookmark_ok)
-               err = zfs_iter_bookmarks(zhp, 0, guid_to_name_cb, gtnd);
+               err = zfs_iter_bookmarks_v2(zhp, 0, guid_to_name_cb, gtnd);
        zfs_close(zhp);
        return (err);
 }
@@ -3218,9 +3218,10 @@ guid_to_name_redact_snaps(libzfs_handle_t *hdl, const char *parent,
                        continue;
                int err = guid_to_name_cb(zfs_handle_dup(zhp), &gtnd);
                if (err != EEXIST)
-                       err = zfs_iter_children(zhp, 0, guid_to_name_cb, &gtnd);
+                       err = zfs_iter_children_v2(zhp, 0, guid_to_name_cb,
+                           &gtnd);
                if (err != EEXIST && bookmark_ok)
-                       err = zfs_iter_bookmarks(zhp, 0, guid_to_name_cb,
+                       err = zfs_iter_bookmarks_v2(zhp, 0, guid_to_name_cb,
                            &gtnd);
                zfs_close(zhp);
                if (err == EEXIST)