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); }