Print this page
11945 pool import performance regression due to repeated libshare initialization
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Jason King <jason.brian.king@gmail.com>
        
*** 6847,6856 ****
--- 6847,6880 ----
                                  free(node);
                          }
                  }
  
                  /*
+                  * Initialize libshare SA_INIT_SHARE_API_SELECTIVE here
+                  * to avoid unnecessary load/unload of the libshare API
+                  * per shared dataset downstream.
+                  */
+                 if (op == OP_SHARE) {
+                         get_all_cb_t dslist = { 0 };
+                         get_all_datasets(&dslist, B_FALSE);
+ 
+                         if (dslist.cb_used != 0) {
+                                 sa_init_selective_arg_t sharearg;
+                                 sharearg.zhandle_arr = dslist.cb_handles;
+                                 sharearg.zhandle_len = dslist.cb_used;
+                                 if ((ret = zfs_init_libshare_arg(g_zfs,
+                                     SA_INIT_SHARE_API_SELECTIVE, &sharearg)) !=
+                                         SA_OK) {
+                                         (void) fprintf(stderr, gettext(
+                                             "Could not initialize libshare, "
+                                             "%d"), ret);
+                                         return (1);
+                                 }
+                         }
+                 }
+ 
+                 /*
                   * Walk the AVL tree in reverse, unmounting each filesystem and
                   * removing it from the AVL tree in the process.
                   */
                  if ((walk = uu_avl_walk_start(tree,
                      UU_WALK_REVERSE | UU_WALK_ROBUST)) == NULL)