Print this page
NEX-16159 Time spent sharing SMB filesystems could be reduced by optimizing smb_getdataset for default mount points
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Reviewed by: Matt Barden <matt.barden@nexenta.com>
SMB-136 Snapshots not visible in Windows previous versions
        
*** 19,29 ****
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
   * Copyright 2016 Martin Matuska. All rights reserved.
   */
  
  #include <synch.h>
  #include <pthread.h>
--- 19,29 ----
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
   * Copyright 2016 Martin Matuska. All rights reserved.
   */
  
  #include <synch.h>
  #include <pthread.h>
*** 108,122 ****
          smbd_vss_count_t vss_count;
  
          bzero(&vss_count, sizeof (smbd_vss_count_t));
          *count = 0;
  
!         if (smb_getdataset(path, dataset, MAXPATHLEN) != 0)
                  return (-1);
  
!         if ((libhd = libzfs_init()) == NULL)
                  return (-1);
  
          if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_DATASET)) == NULL) {
                  libzfs_fini(libhd);
                  return (-1);
          }
--- 108,124 ----
          smbd_vss_count_t vss_count;
  
          bzero(&vss_count, sizeof (smbd_vss_count_t));
          *count = 0;
  
!         if ((libhd = libzfs_init()) == NULL)
                  return (-1);
  
!         if (smb_getdataset(libhd, path, dataset, MAXPATHLEN) != 0) {
!                 libzfs_fini(libhd);
                  return (-1);
+         }
  
          if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_DATASET)) == NULL) {
                  libzfs_fini(libhd);
                  return (-1);
          }
*** 163,182 ****
                  count = SMBD_VSS_SNAPSHOT_MAX;
  
          vss_uint64_date.gd_count = count;
          vss_uint64_date.gd_return_count = 0;
          vss_uint64_date.gd_gmt_array = malloc(count * sizeof (uint64_t));
          if (vss_uint64_date.gd_gmt_array == NULL)
                  return;
  
!         if (smb_getdataset(path, dataset, MAXPATHLEN) != 0) {
                  free(vss_uint64_date.gd_gmt_array);
                  return;
          }
  
!         if ((libhd = libzfs_init()) == NULL) {
                  free(vss_uint64_date.gd_gmt_array);
                  return;
          }
  
          if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_DATASET)) == NULL) {
                  free(vss_uint64_date.gd_gmt_array);
--- 165,186 ----
                  count = SMBD_VSS_SNAPSHOT_MAX;
  
          vss_uint64_date.gd_count = count;
          vss_uint64_date.gd_return_count = 0;
          vss_uint64_date.gd_gmt_array = malloc(count * sizeof (uint64_t));
+ 
          if (vss_uint64_date.gd_gmt_array == NULL)
                  return;
  
!         if ((libhd = libzfs_init()) == NULL) {
                  free(vss_uint64_date.gd_gmt_array);
                  return;
          }
  
!         if (smb_getdataset(libhd, path, dataset, MAXPATHLEN) != 0) {
                  free(vss_uint64_date.gd_gmt_array);
+                 libzfs_fini(libhd);
                  return;
          }
  
          if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_DATASET)) == NULL) {
                  free(vss_uint64_date.gd_gmt_array);
*** 249,263 ****
  
          vss_map_gmttoken.mg_snaptime = toktime;
          vss_map_gmttoken.mg_snapname = snapname;
          *snapname = '\0';
  
!         if (smb_getdataset(path, dataset, MAXPATHLEN) != 0)
                  return (-1);
  
!         if ((libhd = libzfs_init()) == NULL)
                  return (-1);
  
          if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_DATASET)) == NULL) {
                  libzfs_fini(libhd);
                  return (-1);
          }
--- 253,269 ----
  
          vss_map_gmttoken.mg_snaptime = toktime;
          vss_map_gmttoken.mg_snapname = snapname;
          *snapname = '\0';
  
!         if ((libhd = libzfs_init()) == NULL)
                  return (-1);
  
!         if (smb_getdataset(libhd, path, dataset, MAXPATHLEN) != 0) {
!                 libzfs_fini(libhd);
                  return (-1);
+         }
  
          if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_DATASET)) == NULL) {
                  libzfs_fini(libhd);
                  return (-1);
          }