Author: avg
Date: Thu Mar 23 07:57:42 2017
New Revision: 315833
URL: https://svnweb.freebsd.org/changeset/base/315833

Log:
  MFC r314912: MFV r314910: 7843 get_clones_stat() is suboptimal for lots of 
clones

Modified:
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c      
Thu Mar 23 07:57:37 2017        (r315832)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c      
Thu Mar 23 07:57:42 2017        (r315833)
@@ -1766,11 +1766,22 @@ get_clones_stat(dsl_dataset_t *ds, nvlis
        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.
         * Only trust it if it has the right number of entries.
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "[email protected]"

Reply via email to