Author: asomers
Date: Tue Jan 28 23:07:31 2020
New Revision: 357235
URL: https://svnweb.freebsd.org/changeset/base/357235

Log:
  Speed up "zpool import" in the presence of many zvols
  
  By default, zpools may not be backed by zvols (that can be changed with the
  "vfs.zfs.vol.recursive" sysctl). When that sysctl is set to 0, the kernel
  does not attempt to read zvols when looking for vdevs. But the zpool command
  still does. This change brings the zpool command into line with the kernel's
  behavior. It speeds "zpool import" when an already imported pool has many
  zvols, or a zvol with many snapshots.
  
  PR:           241083
  Reported by:  Martin Birgmeier <[email protected]>
  Reviewed by:  mav, Ryan Moeller <[email protected]>
  MFC after:    2 weeks
  Sponsored by: Axcient
  Differential Revision:        https://reviews.freebsd.org/D22077

Modified:
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c     Tue Jan 
28 22:46:51 2020        (r357234)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_import.c     Tue Jan 
28 23:07:31 2020        (r357235)
@@ -1244,12 +1244,20 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importarg
        avl_tree_t slice_cache;
        rdsk_node_t *slice;
        void *cookie;
+       boolean_t skip_zvols = B_FALSE;
+       int value;
+       size_t size = sizeof(value);
 
        if (dirs == 0) {
                dirs = 1;
                dir = &default_dir;
        }
 
+       if (sysctlbyname("vfs.zfs.vol.recursive", &value, &size, NULL, 0) == 0
+           && value == 0) {
+               skip_zvols = B_TRUE;
+       }
+
        /*
         * Go through and read the label configuration information from every
         * possible device, organizing the information according to pool GUID
@@ -1314,6 +1322,10 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importarg
                        }
 
                        LIST_FOREACH(mp, &mesh.lg_class, lg_class) {
+                               if (skip_zvols &&
+                                   strcmp(mp->lg_name, "ZFS::ZVOL") == 0) {
+                                       continue;
+                               }
                                LIST_FOREACH(gp, &mp->lg_geom, lg_geom) {
                                        LIST_FOREACH(pp, &gp->lg_provider, 
lg_provider) {
                                                slice = zfs_alloc(hdl, sizeof 
(rdsk_node_t));
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to