summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd_vss.c20
-rw-r--r--usr/src/lib/smbsrv/libmlsvc/common/smb_quota.c10
-rw-r--r--usr/src/lib/smbsrv/libmlsvc/common/smb_share.c20
-rw-r--r--usr/src/lib/smbsrv/libmlsvc/common/srvsvc_sd.c12
-rw-r--r--usr/src/lib/smbsrv/libsmb/Makefile.com14
-rw-r--r--usr/src/lib/smbsrv/libsmb/common/libsmb.h5
-rw-r--r--usr/src/lib/smbsrv/libsmb/common/smb_util.c38
7 files changed, 83 insertions, 36 deletions
diff --git a/usr/src/cmd/smbsrv/smbd/smbd_vss.c b/usr/src/cmd/smbsrv/smbd/smbd_vss.c
index 759c696513..b0d114631d 100644
--- a/usr/src/cmd/smbsrv/smbd/smbd_vss.c
+++ b/usr/src/cmd/smbsrv/smbd/smbd_vss.c
@@ -21,7 +21,7 @@
/*
* 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.
*/
@@ -110,11 +110,13 @@ smbd_vss_get_count(const char *path, uint32_t *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);
@@ -165,16 +167,18 @@ smbd_vss_get_snapshots(const char *path, uint32_t count,
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;
}
@@ -251,11 +255,13 @@ smbd_vss_map_gmttoken(const char *path, char *gmttoken, time_t 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);
diff --git a/usr/src/lib/smbsrv/libmlsvc/common/smb_quota.c b/usr/src/lib/smbsrv/libmlsvc/common/smb_quota.c
index ceebb9d042..3f3188c8fe 100644
--- a/usr/src/lib/smbsrv/libmlsvc/common/smb_quota.c
+++ b/usr/src/lib/smbsrv/libmlsvc/common/smb_quota.c
@@ -21,7 +21,7 @@
/*
* Copyright (c) 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.
*/
#include <stdio.h>
@@ -1083,12 +1083,14 @@ smb_quota_zfs_init(const char *path, smb_quota_zfs_handle_t *zfs_hdl)
{
char dataset[MAXPATHLEN];
- if (smb_getdataset(path, dataset, MAXPATHLEN) != 0)
- return (NT_STATUS_INVALID_PARAMETER);
-
if ((zfs_hdl->z_lib = libzfs_init()) == NULL)
return (NT_STATUS_INTERNAL_ERROR);
+ if (smb_getdataset(zfs_hdl->z_lib, path, dataset, MAXPATHLEN) != 0) {
+ libzfs_fini(zfs_hdl->z_lib);
+ return (NT_STATUS_INVALID_PARAMETER);
+ }
+
zfs_hdl->z_fs = zfs_open(zfs_hdl->z_lib, dataset, ZFS_TYPE_DATASET);
if (zfs_hdl->z_fs == NULL) {
libzfs_fini(zfs_hdl->z_lib);
diff --git a/usr/src/lib/smbsrv/libmlsvc/common/smb_share.c b/usr/src/lib/smbsrv/libmlsvc/common/smb_share.c
index 8a354a7da0..3bdf29a480 100644
--- a/usr/src/lib/smbsrv/libmlsvc/common/smb_share.c
+++ b/usr/src/lib/smbsrv/libmlsvc/common/smb_share.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
*/
/*
@@ -2240,11 +2240,13 @@ smb_shr_zfs_add(smb_share_t *si)
int ret;
char buf[MAXPATHLEN]; /* dataset or mountpoint */
- if (smb_getdataset(si->shr_path, buf, MAXPATHLEN) != 0)
+ if ((libhd = libzfs_init()) == NULL)
return;
- if ((libhd = libzfs_init()) == NULL)
+ if (smb_getdataset(libhd, si->shr_path, buf, MAXPATHLEN) != 0) {
+ libzfs_fini(libhd);
return;
+ }
if ((zfshd = zfs_open(libhd, buf, ZFS_TYPE_FILESYSTEM)) == NULL) {
libzfs_fini(libhd);
@@ -2285,11 +2287,13 @@ smb_shr_zfs_remove(smb_share_t *si)
int ret;
char buf[MAXPATHLEN]; /* dataset or mountpoint */
- if (smb_getdataset(si->shr_path, buf, MAXPATHLEN) != 0)
+ if ((libhd = libzfs_init()) == NULL)
return;
- if ((libhd = libzfs_init()) == NULL)
+ if (smb_getdataset(libhd, si->shr_path, buf, MAXPATHLEN) != 0) {
+ libzfs_fini(libhd);
return;
+ }
errno = 0;
ret = zfs_smb_acl_remove(libhd, buf, si->shr_path, si->shr_name);
@@ -2318,11 +2322,13 @@ smb_shr_zfs_rename(smb_share_t *from, smb_share_t *to)
int ret;
char dataset[MAXPATHLEN];
- if (smb_getdataset(from->shr_path, dataset, MAXPATHLEN) != 0)
+ if ((libhd = libzfs_init()) == NULL)
return;
- if ((libhd = libzfs_init()) == NULL)
+ if (smb_getdataset(libhd, from->shr_path, dataset, MAXPATHLEN) != 0) {
+ libzfs_fini(libhd);
return;
+ }
if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_FILESYSTEM)) == NULL) {
libzfs_fini(libhd);
diff --git a/usr/src/lib/smbsrv/libmlsvc/common/srvsvc_sd.c b/usr/src/lib/smbsrv/libmlsvc/common/srvsvc_sd.c
index 0ef6ba7658..f1ce198da0 100644
--- a/usr/src/lib/smbsrv/libmlsvc/common/srvsvc_sd.c
+++ b/usr/src/lib/smbsrv/libmlsvc/common/srvsvc_sd.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
*/
/*
@@ -59,13 +60,16 @@ srvsvc_shareacl_getpath(smb_share_t *si, char *shr_acl_path)
zfs_handle_t *zfshd;
int ret = 0;
- ret = smb_getdataset(si->shr_path, dataset, MAXPATHLEN);
- if (ret != 0)
- return (ret);
-
if ((libhd = libzfs_init()) == NULL)
return (-1);
+ ret = smb_getdataset(libhd, si->shr_path, dataset, MAXPATHLEN);
+ if (ret != 0) {
+ libzfs_fini(libhd);
+ return (ret);
+ }
+
+
if ((zfshd = zfs_open(libhd, dataset, ZFS_TYPE_DATASET)) == NULL) {
libzfs_fini(libhd);
return (-1);
diff --git a/usr/src/lib/smbsrv/libsmb/Makefile.com b/usr/src/lib/smbsrv/libsmb/Makefile.com
index 39af0ff072..37f853498d 100644
--- a/usr/src/lib/smbsrv/libsmb/Makefile.com
+++ b/usr/src/lib/smbsrv/libsmb/Makefile.com
@@ -20,30 +20,30 @@
#
#
# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
-# Copyright 2017 Nexenta Systems, Inc. All rights reserved.
+# Copyright 2018 Nexenta Systems, Inc. All rights reserved.
#
# Copyright (c) 2018, Joyent, Inc.
LIBRARY= libsmb.a
VERS= .1
-OBJS_SHARED = \
+OBJS_SHARED = \
smb_cfg_util.o \
- smb_door_legacy.o \
+ smb_door_legacy.o \
smb_inet.o \
smb_msgbuf.o \
smb_native.o \
smb_oem.o \
smb_sid.o \
- smb_string.o \
+ smb_string.o \
smb_token.o \
smb_token_xdr.o \
smb_utf8.o \
smb_xdr.o
-OBJS_COMMON = \
+OBJS_COMMON = \
smb_acl.o \
- smb_auth.o \
+ smb_auth.o \
smb_cache.o \
smb_cfg.o \
smb_crypt.o \
@@ -83,7 +83,7 @@ LDLIBS += $(MACH_LDLIBS)
# perfer to keep libs ordered by dependence
LDLIBS += -lscf -lmd -luuid -lpkcs11 -lcryptoutil
LDLIBS += -lsec -lidmap -lreparse -lcmdutils -lavl
-LDLIBS += -lnvpair -lresolv -lsocket -lnsl -lc
+LDLIBS += -lnvpair -lresolv -lsocket -lnsl -lzfs -lc
CPPFLAGS += $(INCS) -D_REENTRANT
CPPFLAGS += -Dsyslog=smb_syslog
CERRWARN += $(CNOWARN_UNINIT)
diff --git a/usr/src/lib/smbsrv/libsmb/common/libsmb.h b/usr/src/lib/smbsrv/libsmb/common/libsmb.h
index 25bd45f6bb..11a764f0dc 100644
--- a/usr/src/lib/smbsrv/libsmb/common/libsmb.h
+++ b/usr/src/lib/smbsrv/libsmb/common/libsmb.h
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
*/
#ifndef _LIBSMB_H
@@ -186,7 +186,8 @@ extern int smb_smf_restart_service(void);
extern int smb_smf_maintenance_mode(void);
/* ZFS interface */
-int smb_getdataset(const char *, char *, size_t);
+struct libzfs_handle;
+int smb_getdataset(struct libzfs_handle *, const char *, char *, size_t);
/* Configuration management functions */
extern int smb_config_get(smb_cfg_id_t, char *, int);
diff --git a/usr/src/lib/smbsrv/libsmb/common/smb_util.c b/usr/src/lib/smbsrv/libsmb/common/smb_util.c
index 359ea0e801..cbc7c515cf 100644
--- a/usr/src/lib/smbsrv/libsmb/common/smb_util.c
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_util.c
@@ -20,7 +20,7 @@
*/
/*
* Copyright (c) 2007, 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.
*/
#include <ctype.h>
@@ -627,7 +627,8 @@ smb_netgroup_match(struct nd_hostservlist *clnames, char *glist, int grc)
* -1 = Failure to open /etc/mnttab file or to get ZFS dataset.
*/
int
-smb_getdataset(const char *path, char *dataset, size_t len)
+smb_getdataset(libzfs_handle_t *libhdl, const char *path, char *dataset,
+ size_t len)
{
char tmppath[MAXPATHLEN];
char *cp;
@@ -636,6 +637,33 @@ smb_getdataset(const char *path, char *dataset, size_t len)
struct mnttab mntpref;
int rc = -1;
+ /*
+ * Optimisation: if the path is the default mountpoint then
+ * the dataset name can be determined from path.
+ * Attempt to open dataset by derived name and, if successful,
+ * check if its mountpoint matches path.
+ */
+ if (libhdl != NULL) {
+ zfs_handle_t *hdl;
+ char mountpnt[ZFS_MAXPROPLEN];
+ char *dsname = (char *)path + strspn(path, "/");
+
+ hdl = zfs_open(libhdl, dsname, ZFS_TYPE_FILESYSTEM);
+ if (hdl != NULL) {
+ if ((zfs_prop_get(hdl, ZFS_PROP_MOUNTPOINT, mountpnt,
+ sizeof (mountpnt), NULL, NULL, 0, B_FALSE) == 0) &&
+ (strcmp(mountpnt, path) == 0)) {
+ zfs_close(hdl);
+ (void) strlcpy(dataset, dsname, len);
+ return (0);
+ }
+ zfs_close(hdl);
+ }
+ }
+
+ /*
+ * Couldn't find a filesystem optimistically, use mnttab
+ */
if ((fp = fopen(MNTTAB, "r")) == NULL)
return (-1);
@@ -899,9 +927,9 @@ smb_name_validate_domain(const char *domain)
* hyphens.
*
* It cannot:
- * - be blank or longer than 15 chracters
- * - contain all numbers
- * - be the same as the computer name
+ * - be blank or longer than 15 chracters
+ * - contain all numbers
+ * - be the same as the computer name
*/
uint32_t
smb_name_validate_nbdomain(const char *name)