From b8dc1b43d204b714c2fda8dd4efd67de0c671db6 Mon Sep 17 00:00:00 2001 From: Joyce McIntosh Date: Thu, 1 Mar 2018 10:18:07 -0800 Subject: 11945 pool import performance regression due to repeated libshare initialization Reviewed by: Sanjay Nadkarni Reviewed by: Evan Layton Reviewed by: Dan McDonald Reviewed by: Jason King Approved by: Garrett D'Amore --- usr/src/cmd/zfs/zfs_main.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'usr/src/cmd/zfs') diff --git a/usr/src/cmd/zfs/zfs_main.c b/usr/src/cmd/zfs/zfs_main.c index cfed8bc4f8..bd2f7f4cfe 100644 --- a/usr/src/cmd/zfs/zfs_main.c +++ b/usr/src/cmd/zfs/zfs_main.c @@ -6848,6 +6848,30 @@ unshare_unmount(int op, int argc, char **argv) } } + /* + * 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. -- cgit v1.2.3