]> git.proxmox.com Git - mirror_zfs.git/commitdiff
OpenZFS 7843 - get_clones_stat() is suboptimal for lots of clones
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 7 Mar 2017 17:47:40 +0000 (09:47 -0800)
committerGitHub <noreply@github.com>
Tue, 7 Mar 2017 17:47:40 +0000 (09:47 -0800)
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
OpenZFS-issue: https://www.illumos.org/issues/7843
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/4d519e7
Closes #5868

module/zfs/dsl_dataset.c

index 6c9bcbc9f7d322661ca95340477c3093db0c1f99..c91c2e991eed4e57ab5d4268009eaa2bf9806e8a 100644 (file)
@@ -1753,10 +1753,21 @@ get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv)
        zap_cursor_t zc;
        zap_attribute_t za;
        nvlist_t *propval = fnvlist_alloc();
-       nvlist_t *val = fnvlist_alloc();
+       nvlist_t *val;
 
        ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool));
 
+       /*
+        * We use nvlist_alloc() instead of fnvlist_alloc() because the
+        * latter would allocate the list with NV_UNIQUE_NAME flag.
+        * As a result, every time a clone name is appended to the list
+        * it would be (linearly) searched for for a duplicate name.
+        * We already know that all clone names must be unique and we
+        * want avoid the quadratic complexity of double-checking that
+        * because we can have a large number of clones.
+        */
+       VERIFY0(nvlist_alloc(&val, 0, KM_SLEEP));
+
        /*
         * There may be missing entries in ds_next_clones_obj
         * due to a bug in a previous version of the code.