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,11 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2014 Nexenta Systems, Inc.  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,15 +108,17 @@
         smbd_vss_count_t vss_count;
 
         bzero(&vss_count, sizeof (smbd_vss_count_t));
         *count = 0;
 
-        if (smb_getdataset(path, dataset, MAXPATHLEN) != 0)
+        if ((libhd = libzfs_init()) == NULL)
                 return (-1);
 
-        if ((libhd = libzfs_init()) == NULL)
+        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,20 +165,22 @@
                 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) {
+        if ((libhd = libzfs_init()) == NULL) {
                 free(vss_uint64_date.gd_gmt_array);
                 return;
         }
 
-        if ((libhd = libzfs_init()) == NULL) {
+        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,15 +253,17 @@
 
         vss_map_gmttoken.mg_snaptime = toktime;
         vss_map_gmttoken.mg_snapname = snapname;
         *snapname = '\0';
 
-        if (smb_getdataset(path, dataset, MAXPATHLEN) != 0)
+        if ((libhd = libzfs_init()) == NULL)
                 return (-1);
 
-        if ((libhd = libzfs_init()) == NULL)
+        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);
         }