summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/fs.d/ufs/quotaon/Makefile18
-rw-r--r--usr/src/cmd/fs.d/ufs/quotaon/ufs_quota44
-rw-r--r--usr/src/cmd/initpkg/init.d/Makefile8
-rw-r--r--usr/src/cmd/initpkg/init.d/devlinks38
-rw-r--r--usr/src/cmd/initpkg/init.d/drvconfig36
-rw-r--r--usr/src/cmd/initpkg/init.d/ldap.client50
-rw-r--r--usr/src/cmd/initpkg/init.d/nfs.server45
-rw-r--r--usr/src/cmd/initpkg/init.d/nscd48
-rw-r--r--usr/src/cmd/initpkg/init.d/sendmail53
-rw-r--r--usr/src/cmd/initpkg/init.d/slpd47
-rw-r--r--usr/src/cmd/mdb/common/modules/smbsrv/smbsrv.c31
-rw-r--r--usr/src/cmd/smbsrv/smbadm/smbadm.c8
-rw-r--r--usr/src/cmd/smbsrv/smbd/server.xml7
-rw-r--r--usr/src/cmd/smbsrv/smbd/smbd_main.c5
-rw-r--r--usr/src/cmd/smbsrv/smbstat/smbstat.c10
-rw-r--r--usr/src/common/smbsrv/smb_netbios_util.c7
-rw-r--r--usr/src/common/smbsrv/smb_oem.c7
-rw-r--r--usr/src/common/smbsrv/smb_string.c5
-rw-r--r--usr/src/head/siginfo.h17
-rw-r--r--usr/src/lib/brand/ipkg/zone/platform.xml2
-rw-r--r--usr/src/lib/libc/port/gen/psiginfo.c5
-rw-r--r--usr/src/lib/libc/port/llib-lc3
-rw-r--r--usr/src/lib/libshare/nfs/libshare_nfs.c8
-rw-r--r--usr/src/lib/libshare/smb/libshare_smb.c9
-rw-r--r--usr/src/man/man3c/psignal.3c3
-rw-r--r--usr/src/pkg/manifests/SUNWcs.mf3
-rw-r--r--usr/src/pkg/manifests/SUNWcsd.mf4
-rw-r--r--usr/src/pkg/manifests/service-file-system-nfs.mf5
-rw-r--r--usr/src/pkg/manifests/service-network-slp.mf3
-rw-r--r--usr/src/pkg/manifests/service-network-smtp-sendmail.mf5
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_acl.c3
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_common_open.c6
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_common_transact.c12
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_delete.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_directory.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_dispatch.c147
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_fem.c46
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_fsops.c46
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_init.c28
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_kdoor.c120
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_kshare.c233
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_kutil.c33
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_lock.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_mangle_name.c7
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_mbuf_util.c12
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_negotiate.c4
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_net.c10
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_node.c96
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_nt_transact_ioctl.c4
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_nt_transact_quota.c21
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_odir.c12
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_ofile.c10
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_opipe.c95
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_oplock.c16
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_pathname.c4
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_print.c7
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_rename.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_server.c369
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_session.c15
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c2
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_signing.c43
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c3
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_tree.c26
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_user.c30
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_vfs.c12
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_vops.c19
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_vss.c34
-rw-r--r--usr/src/uts/common/smbsrv/cp_unicode.h3
-rw-r--r--usr/src/uts/common/smbsrv/cp_usascii.h3
-rw-r--r--usr/src/uts/common/smbsrv/mbuf.h3
-rw-r--r--usr/src/uts/common/smbsrv/smb_kproto.h97
-rw-r--r--usr/src/uts/common/smbsrv/smb_ktypes.h65
-rw-r--r--usr/src/uts/common/smbsrv/smb_vops.h1
73 files changed, 931 insertions, 1308 deletions
diff --git a/usr/src/cmd/fs.d/ufs/quotaon/Makefile b/usr/src/cmd/fs.d/ufs/quotaon/Makefile
index b53e3dd85a..40949dd5d9 100644
--- a/usr/src/cmd/fs.d/ufs/quotaon/Makefile
+++ b/usr/src/cmd/fs.d/ufs/quotaon/Makefile
@@ -20,6 +20,7 @@
#
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
+# Copyright 2015 Nexenta Systems, Inc. All rights reserved.
#
# cmd/fs.d/ufs/quotaon/Makefile
@@ -28,19 +29,9 @@ LIBPROG= quotaon
QUOTAOFF= quotaoff
ATTMK= $(LIBPROG)
-#
-# Note that no links are made from the rc[S0-3].d directories for this rc
-# script. The normal way to ship this is completely disabled. The process
-# for enabling this script is described in the "Routine System Administration
-# Guide" (as of this time).
-#
-INIT_SCRIPT= ufs_quota
-ROOTINIT_D= $(ROOTETC)/init.d
-ROOTINIT_SCRIPT=$(ROOTINIT_D)/$(INIT_SCRIPT)
-
OTHERINSTALL= $(ROOTLIBFSTYPE)/$(QUOTAOFF) \
- $(ROOTUSRSBIN)/$(LIBPROG) $(ROOTUSRSBIN)/$(QUOTAOFF) \
- $(ROOTINIT_SCRIPT)
+ $(ROOTUSRSBIN)/$(LIBPROG) $(ROOTUSRSBIN)/$(QUOTAOFF)
+
LINKVALUEON= ../lib/fs/$(FSTYPE)/$(LIBPROG)
LINKVALUEOFF= ../lib/fs/$(FSTYPE)/$(QUOTAOFF)
@@ -62,6 +53,3 @@ $(ROOTUSRSBIN)/$(LIBPROG):
$(ROOTUSRSBIN)/$(QUOTAOFF):
-$(RM) $@; $(SYMLINK) $(LINKVALUEOFF) $@
-
-$(ROOTINIT_D)/% : %
- $(INS.file)
diff --git a/usr/src/cmd/fs.d/ufs/quotaon/ufs_quota b/usr/src/cmd/fs.d/ufs/quotaon/ufs_quota
deleted file mode 100644
index cf558d0d7b..0000000000
--- a/usr/src/cmd/fs.d/ufs/quotaon/ufs_quota
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/sbin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright (c) 1993, 1997 by Sun Microsystems, Inc.
-# All rights reserved.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-case "$1" in
-'start')
- /usr/sbin/quotacheck -a
- /usr/sbin/quotaon -a
- ;;
-
-'stop')
- /usr/sbin/quotaoff -a
- ;;
-
-*)
- echo "Usage: $0 { start | stop }"
- exit 1
- ;;
-esac
-exit 0
diff --git a/usr/src/cmd/initpkg/init.d/Makefile b/usr/src/cmd/initpkg/init.d/Makefile
index 6eab9ec100..b8ef85b083 100644
--- a/usr/src/cmd/initpkg/init.d/Makefile
+++ b/usr/src/cmd/initpkg/init.d/Makefile
@@ -22,6 +22,7 @@
#
# Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright 2014 Garrett D'Amore <garrett@damore.org>
+# Copyright 2015 Nexenta Systems, Inc. All rights reserved.
#
include ../../Makefile.cmd
@@ -32,13 +33,6 @@ i386_PROG=
PROG= \
README \
cachefs.daemon \
- devlinks \
- drvconfig \
- ldap.client \
- nfs.server \
- nscd \
- sendmail \
- slpd \
sysetup \
uucp \
$($(MACH)_PROG)
diff --git a/usr/src/cmd/initpkg/init.d/devlinks b/usr/src/cmd/initpkg/init.d/devlinks
deleted file mode 100644
index 4ec27a9be0..0000000000
--- a/usr/src/cmd/initpkg/init.d/devlinks
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/sbin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T.
-# All rights reserved.
-#
-# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-
-if [ -n "$_INIT_RECONFIG" ]; then
- echo 'Configuring the /dev directory'
-
- /usr/sbin/devlinks
- /usr/sbin/disks
- /usr/sbin/ports
- /usr/sbin/tapes
- /usr/sbin/audlinks
-fi
diff --git a/usr/src/cmd/initpkg/init.d/drvconfig b/usr/src/cmd/initpkg/init.d/drvconfig
deleted file mode 100644
index 0f41b24c31..0000000000
--- a/usr/src/cmd/initpkg/init.d/drvconfig
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/sbin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T.
-# All rights reserved.
-#
-#
-# Copyright (c) 1991-1997 by Sun Microsystems, Inc.
-# All rights reserved.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-if [ -n "$_INIT_RECONFIG" ]; then
- echo 'Configuring the /devices directory'
- /usr/sbin/drvconfig
-fi
diff --git a/usr/src/cmd/initpkg/init.d/ldap.client b/usr/src/cmd/initpkg/init.d/ldap.client
deleted file mode 100644
index 665e3b363f..0000000000
--- a/usr/src/cmd/initpkg/init.d/ldap.client
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/sbin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-# This service is managed by smf(5). Thus, this script provides
-# compatibility with previously documented init.d script behaviour.
-
-FMRI=network/ldap/client:default
-
-case "$1" in
-'start')
- [ -f /var/ldap/ldap_client_file ] && \
- [ -f /usr/lib/ldap/ldap_cachemgr ] || exit 0
-
- /usr/sbin/svcadm enable -t $FMRI
- ;;
-
-'stop')
- /usr/sbin/svcadm disable -t $FMRI
- ;;
-
-*)
- echo "Usage: $0 { start | stop }"
- exit 1
- ;;
-esac
diff --git a/usr/src/cmd/initpkg/init.d/nfs.server b/usr/src/cmd/initpkg/init.d/nfs.server
deleted file mode 100644
index 4f60fc8f4b..0000000000
--- a/usr/src/cmd/initpkg/init.d/nfs.server
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/sbin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-# This service is managed by smf(5). Thus, this script provides
-# compatibility with previously documented init.d script behaviour.
-
-case "$1" in
-'start')
- svcadm enable -t network/nfs/server
- ;;
-
-'stop')
- svcadm disable -t network/nfs/server
- ;;
-
-*)
- echo "Usage: $0 { start | stop }"
- exit 1
- ;;
-esac
diff --git a/usr/src/cmd/initpkg/init.d/nscd b/usr/src/cmd/initpkg/init.d/nscd
deleted file mode 100644
index de78fe8812..0000000000
--- a/usr/src/cmd/initpkg/init.d/nscd
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/sbin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-# This service is managed by smf(5). Thus, this script provides
-# compatibility with previously documented init.d script behaviour.
-
-FMRI=system/name-service-cache:default
-
-case "$1" in
-'start')
- [ -f /etc/nscd.conf ] && [ -f /usr/sbin/nscd ] || exit 0
- /usr/sbin/svcadm enable -t $FMRI
- ;;
-
-'stop')
- [ -f /usr/sbin/nscd ] && /usr/sbin/svcadm disable -t $FMRI
- ;;
-
-*)
- echo "Usage: $0 { start | stop }"
- exit 1
- ;;
-esac
diff --git a/usr/src/cmd/initpkg/init.d/sendmail b/usr/src/cmd/initpkg/init.d/sendmail
deleted file mode 100644
index 896e9f9ea1..0000000000
--- a/usr/src/cmd/initpkg/init.d/sendmail
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/sbin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-
-# This service is managed by smf(5). Thus, this script provides
-# compatibility with previously documented init.d script behaviour.
-
-case "$1" in
-'restart')
- # The previous init.d/sendmail restart behaviour matches
- # the smf(5) 'refresh' semantics.
-
- svcadm refresh network/smtp:sendmail
- svcadm refresh network/sendmail-client:default
- ;;
-
-'start')
- svcadm enable -t network/smtp:sendmail
- svcadm enable -t network/sendmail-client:default
- ;;
-
-'stop')
- svcadm disable -t network/smtp:sendmail
- svcadm disable -t network/sendmail-client:default
- ;;
-
-*)
- echo "Usage: $0 { start | stop | restart }"
- exit 1
- ;;
-esac
diff --git a/usr/src/cmd/initpkg/init.d/slpd b/usr/src/cmd/initpkg/init.d/slpd
deleted file mode 100644
index d5283fa7f9..0000000000
--- a/usr/src/cmd/initpkg/init.d/slpd
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/sbin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-# This service is managed by smf(5). Thus, this script provides
-# compatibility with previously documented init.d script behaviour.
-
-FMRI=network/slp:default
-
-case "$1" in
-'start')
- /usr/sbin/svcadm enable -t $FMRI
- ;;
-
-'stop')
- /usr/sbin/svcadm disable -t $FMRI
- ;;
-
-*)
- echo "Usage: $0 { start | stop }"
- exit 1
- ;;
-esac
diff --git a/usr/src/cmd/mdb/common/modules/smbsrv/smbsrv.c b/usr/src/cmd/mdb/common/modules/smbsrv/smbsrv.c
index eaa381cc47..1e51ea02f3 100644
--- a/usr/src/cmd/mdb/common/modules/smbsrv/smbsrv.c
+++ b/usr/src/cmd/mdb/common/modules/smbsrv/smbsrv.c
@@ -1347,12 +1347,12 @@ smb_kshare_cb(uintptr_t addr, const void *data, void *arg)
* ::smbshares
*
* dcmd - Print out smb_kshare structures.
+ * requires addr of an smb_server_t
*/
/*ARGSUSED*/
static int
smb_dcmd_kshare(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
{
- GElf_Sym sym;
uint_t opts = 0;
if (mdb_getopts(argc, argv,
@@ -1360,14 +1360,9 @@ smb_dcmd_kshare(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
NULL) != argc)
return (DCMD_USAGE);
- if (!(flags & DCMD_ADDRSPEC)) {
- if (mdb_lookup_by_name("smb_export", &sym) == -1) {
- mdb_warn("failed to find symbol smb_export");
- return (DCMD_ERR);
- }
- addr = (uintptr_t)sym.st_value +
- OFFSETOF(smb_export_t, e_share_avl.avl_tree);
- }
+ if (!(flags & DCMD_ADDRSPEC))
+ return (DCMD_USAGE);
+ addr += OFFSETOF(smb_server_t, sv_export.e_share_avl.avl_tree);
if (DCMD_HDRSPEC(flags)) {
mdb_printf(
@@ -1462,26 +1457,20 @@ smb_dcmd_vfs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
}
/*
- * Initialize the smb_vfs_t walker by reading the value of smb_export
- * in the kernel's symbol table. Only global walk supported.
+ * Initialize the smb_vfs_t walker to point to the smb_export
+ * in the specified smb_server_t instance. (no global walks)
*/
static int
smb_vfs_walk_init(mdb_walk_state_t *wsp)
{
- GElf_Sym sym;
-
- if (wsp->walk_addr != NULL) {
- mdb_printf("smb_vfs walk only supports global walks\n");
- return (WALK_ERR);
- }
- if (mdb_lookup_by_name("smb_export", &sym) == -1) {
- mdb_warn("failed to find 'smb_export'");
+ if (wsp->walk_addr == NULL) {
+ mdb_printf("require address of an smb_server_t\n");
return (WALK_ERR);
}
- wsp->walk_addr = (uintptr_t)sym.st_value +
- offsetof(smb_export_t, e_vfs_list) + offsetof(smb_llist_t, ll_list);
+ wsp->walk_addr +=
+ OFFSETOF(smb_server_t, sv_export.e_vfs_list.ll_list);
if (mdb_layered_walk("list", wsp) == -1) {
mdb_warn("failed to walk list of VFS");
diff --git a/usr/src/cmd/smbsrv/smbadm/smbadm.c b/usr/src/cmd/smbsrv/smbadm/smbadm.c
index 07887fa7a3..36e3efa781 100644
--- a/usr/src/cmd/smbsrv/smbadm/smbadm.c
+++ b/usr/src/cmd/smbsrv/smbadm/smbadm.c
@@ -1467,16 +1467,10 @@ main(int argc, char **argv)
progname = basename(argv[0]);
- if (getzoneid() != GLOBAL_ZONEID) {
- (void) fprintf(stderr,
- gettext("cannot execute in non-global zone\n"));
- return (0);
- }
-
if (is_system_labeled()) {
(void) fprintf(stderr,
gettext("Trusted Extensions not supported\n"));
- return (0);
+ return (1);
}
if (argc < 2) {
diff --git a/usr/src/cmd/smbsrv/smbd/server.xml b/usr/src/cmd/smbsrv/smbd/server.xml
index cf5e69986e..6b83e73762 100644
--- a/usr/src/cmd/smbsrv/smbd/server.xml
+++ b/usr/src/cmd/smbsrv/smbd/server.xml
@@ -96,12 +96,7 @@ file.
name='start'
exec='/usr/lib/smbsrv/smbd %m'
timeout_seconds='60' >
- <method_context>
- <method_credential
- user='root'
- group='sys'
- privileges='all' />
- </method_context>
+ <!-- XXX: need method_context? -->
</exec_method>
<exec_method
diff --git a/usr/src/cmd/smbsrv/smbd/smbd_main.c b/usr/src/cmd/smbsrv/smbd/smbd_main.c
index ef1f887a51..827f44580f 100644
--- a/usr/src/cmd/smbsrv/smbd/smbd_main.c
+++ b/usr/src/cmd/smbsrv/smbd/smbd_main.c
@@ -131,11 +131,6 @@ main(int argc, char *argv[])
return (SMF_EXIT_ERR_FATAL);
}
- if (getzoneid() != GLOBAL_ZONEID) {
- smbd_report("non-global zones are not supported");
- return (SMF_EXIT_ERR_FATAL);
- }
-
if (is_system_labeled()) {
smbd_report("Trusted Extensions not supported");
return (SMF_EXIT_ERR_FATAL);
diff --git a/usr/src/cmd/smbsrv/smbstat/smbstat.c b/usr/src/cmd/smbsrv/smbstat/smbstat.c
index de3773d247..1cc91b7232 100644
--- a/usr/src/cmd/smbsrv/smbstat/smbstat.c
+++ b/usr/src/cmd/smbsrv/smbstat/smbstat.c
@@ -20,6 +20,7 @@
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
*/
@@ -307,18 +308,11 @@ main(int argc, char *argv[])
(void) setlocale(LC_ALL, "");
(void) textdomain(TEXT_DOMAIN);
- if (getzoneid() != GLOBAL_ZONEID) {
- (void) fprintf(stderr,
- gettext("%s: Cannot execute in non-global zone.\n"),
- argv[0]);
- return (0);
- }
-
if (is_system_labeled()) {
(void) fprintf(stderr,
gettext("%s: Trusted Extensions not supported.\n"),
argv[0]);
- return (0);
+ return (1);
}
while ((c = getopt(argc, argv, "achnrtuz")) != EOF) {
diff --git a/usr/src/common/smbsrv/smb_netbios_util.c b/usr/src/common/smbsrv/smb_netbios_util.c
index a0e0f480f1..90ce36a1ed 100644
--- a/usr/src/common/smbsrv/smb_netbios_util.c
+++ b/usr/src/common/smbsrv/smb_netbios_util.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -324,7 +325,7 @@ netbios_name_isvalid(char *in, char *out)
* RFC883. This is global so that it can be patched if there is
* a need to change the valid characters in the field.
*/
-unsigned char *dns_allowed = (unsigned char *)"-_";
+static const char dns_allowed[] = "-_";
/*
* dns_is_allowed
@@ -335,10 +336,10 @@ unsigned char *dns_allowed = (unsigned char *)"-_";
static int
dns_is_allowed(unsigned char c)
{
- unsigned char *p = dns_allowed;
+ const char *p = dns_allowed;
while (*p) {
- if (c == *p++)
+ if ((char)c == *p++)
return (1);
}
diff --git a/usr/src/common/smbsrv/smb_oem.c b/usr/src/common/smbsrv/smb_oem.c
index 92d6aec029..c459fa2c6d 100644
--- a/usr/src/common/smbsrv/smb_oem.c
+++ b/usr/src/common/smbsrv/smb_oem.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -95,7 +96,7 @@ static oem_codepage_t oemcpg_table[] = {
/*
* The default SMB OEM codepage for English is codepage 850.
*/
-smb_wchar_t oem_codepage_850[256] = {
+const smb_wchar_t oem_codepage_850[256] = {
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
@@ -133,7 +134,7 @@ smb_wchar_t oem_codepage_850[256] = {
/*
* The default telnet OEM codepage for English is codepage 1252.
*/
-smb_wchar_t oem_codepage_1252[256] = {
+const smb_wchar_t oem_codepage_1252[256] = {
0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
0x9, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
@@ -324,7 +325,7 @@ oem_codepage_init(uint32_t cpid)
static void
oem_codepage_setup(uint32_t cpid)
{
- smb_wchar_t *default_oem_cp;
+ const smb_wchar_t *default_oem_cp;
oem_codepage_t *oemcpg;
uint32_t bytesperchar;
uint32_t max_oem_index;
diff --git a/usr/src/common/smbsrv/smb_string.c b/usr/src/common/smbsrv/smb_string.c
index 9824c8ff70..992c660c7a 100644
--- a/usr/src/common/smbsrv/smb_string.c
+++ b/usr/src/common/smbsrv/smb_string.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -45,7 +46,7 @@
* Global pointer to the current codepage: defaults to ASCII,
* and a flag indicating whether the codepage is Unicode or ASCII.
*/
-static smb_codepage_t *current_codepage = usascii_codepage;
+static const smb_codepage_t *current_codepage = usascii_codepage;
static boolean_t is_unicode = B_FALSE;
static smb_codepage_t *smb_unicode_init(void);
@@ -113,7 +114,7 @@ strcanon(char *buf, const char *class)
void
smb_codepage_init(void)
{
- smb_codepage_t *cp;
+ const smb_codepage_t *cp;
if (is_unicode)
return;
diff --git a/usr/src/head/siginfo.h b/usr/src/head/siginfo.h
index 249f1163b8..869013dbaa 100644
--- a/usr/src/head/siginfo.h
+++ b/usr/src/head/siginfo.h
@@ -20,6 +20,9 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2015 Circonus, Inc. All rights reserved.
+ */
+/*
* Copyright 2014 Garrett D'Amore <garrett@damore.org>
*/
/* Copyright (c) 1988 AT&T */
@@ -40,17 +43,17 @@ struct siginfolist {
char **vsiginfo;
};
-extern const char * _sys_illlist[];
-extern const char * _sys_fpelist[];
-extern const char * _sys_segvlist[];
-extern const char * _sys_buslist[];
-extern const char * _sys_traplist[];
-extern const char * _sys_cldlist[];
+extern const char *_sys_illlist[];
+extern const char *_sys_fpelist[];
+extern const char *_sys_segvlist[];
+extern const char *_sys_buslist[];
+extern const char *_sys_traplist[];
+extern const char *_sys_cldlist[];
extern const struct siginfolist *_sys_siginfolistp;
#define _sys_siginfolist _sys_siginfolistp
extern void psignal(int, const char *);
-extern void psiginfo(siginfo_t *, char *);
+extern void psiginfo(const siginfo_t *, const char *);
#ifdef __cplusplus
}
diff --git a/usr/src/lib/brand/ipkg/zone/platform.xml b/usr/src/lib/brand/ipkg/zone/platform.xml
index db40c9fe29..dcaa3a5241 100644
--- a/usr/src/lib/brand/ipkg/zone/platform.xml
+++ b/usr/src/lib/brand/ipkg/zone/platform.xml
@@ -20,6 +20,7 @@
CDDL HEADER END
+ Copyright 2011 Nexenta Systems, Inc. All rights reserved.
Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
DO NOT EDIT THIS FILE.
@@ -72,6 +73,7 @@
<device match="rlofi" />
<device match="rmt" />
<device match="sad/user" />
+ <device match="smbsrv" />
<device match="svvslo0" />
<device match="svvslo1" />
<device match="svvslo2" />
diff --git a/usr/src/lib/libc/port/gen/psiginfo.c b/usr/src/lib/libc/port/gen/psiginfo.c
index 6775fef969..e7cf46abef 100644
--- a/usr/src/lib/libc/port/gen/psiginfo.c
+++ b/usr/src/lib/libc/port/gen/psiginfo.c
@@ -18,6 +18,9 @@
*
* CDDL HEADER END
*/
+/*
+ * Copyright 2015 Circonus, Inc. All rights reserved.
+ */
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
@@ -44,7 +47,7 @@
#define strsignal(i) (_libc_gettext(_sys_siglistp[i]))
void
-psiginfo(siginfo_t *sip, char *s)
+psiginfo(const siginfo_t *sip, const char *s)
{
char buf[256];
char *c;
diff --git a/usr/src/lib/libc/port/llib-lc b/usr/src/lib/libc/port/llib-lc
index 34a1e30481..41c7ecf879 100644
--- a/usr/src/lib/libc/port/llib-lc
+++ b/usr/src/lib/libc/port/llib-lc
@@ -26,6 +26,7 @@
* Copyright (c) 2013 Gary Mills
* Copyright 2014 Garrett D'Amore <garrett@damore.org>
* Copyright 2015 Joyent, Inc.
+ * Copyright 2015 Circonus, Inc. All rights reserved.
*/
/* LINTLIBRARY */
@@ -764,7 +765,7 @@ void perror(const char *s);
int pipe(int *fds);
/* psiginfo.c */
-void psiginfo(siginfo_t *sip, char *s);
+void psiginfo(const siginfo_t *sip, const char *s);
/* psignal.c */
void psignal(int sig, const char *s);
diff --git a/usr/src/lib/libshare/nfs/libshare_nfs.c b/usr/src/lib/libshare/nfs/libshare_nfs.c
index e897596e72..4ac114ecdc 100644
--- a/usr/src/lib/libshare/nfs/libshare_nfs.c
+++ b/usr/src/lib/libshare/nfs/libshare_nfs.c
@@ -21,7 +21,7 @@
/*
* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
*/
@@ -1898,10 +1898,10 @@ nfs_enable_share(sa_share_t share)
}
/*
* when we get here, we can do the exportfs system call and
- * initiate things. We probably want to enable the nfs.server
- * service first if it isn't running within SMF.
+ * initiate things. We probably want to enable the
+ * svc:/network/nfs/server service first if it isn't running.
*/
- /* check nfs.server status and start if needed */
+ /* check svc:/network/nfs/server status and start if needed */
/* now add the share to the internal tables */
printarg(path, &export);
/*
diff --git a/usr/src/lib/libshare/smb/libshare_smb.c b/usr/src/lib/libshare/smb/libshare_smb.c
index 960f26a7a5..75ace3a647 100644
--- a/usr/src/lib/libshare/smb/libshare_smb.c
+++ b/usr/src/lib/libshare/smb/libshare_smb.c
@@ -20,6 +20,7 @@
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2012 Nexenta Systems, Inc. All rights reserved.
*/
@@ -391,14 +392,8 @@ smb_enable_share(sa_share_t share)
boolean_t online;
/*
- * We only start in the global zone and only run if we aren't
- * running Trusted Extensions.
+ * Don't support Trusted Extensions.
*/
- if (getzoneid() != GLOBAL_ZONEID) {
- (void) printf(dgettext(TEXT_DOMAIN,
- "SMB: service not supported in local zone\n"));
- return (SA_NOT_SUPPORTED);
- }
if (is_system_labeled()) {
(void) printf(dgettext(TEXT_DOMAIN,
"SMB: service not supported with Trusted Extensions\n"));
diff --git a/usr/src/man/man3c/psignal.3c b/usr/src/man/man3c/psignal.3c
index 81252ee0dd..a977fb6df4 100644
--- a/usr/src/man/man3c/psignal.3c
+++ b/usr/src/man/man3c/psignal.3c
@@ -1,6 +1,7 @@
'\" te
.\" Copyright 1989 AT&T. Copyright (c) 2005, Sun Microsystems, Inc. All Rights Reserved.
.\" Copyright (c) 2014, Joyent, Inc. All rights reserved.
+.\" Copyright 2015 Circonus, Inc. All rights reserved.
.\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
.\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
@@ -17,7 +18,7 @@ psignal, psiginfo \- system signal messages
.LP
.nf
-\fBvoid\fR \fBpsiginfo\fR(\fBsiginfo_t *\fR\fIpinfo\fR, \fBchar *\fR\fIs\fR);
+\fBvoid\fR \fBpsiginfo\fR(\fBconst siginfo_t *\fR\fIpinfo\fR, \fBconst char *\fR\fIs\fR);
.fi
.SH DESCRIPTION
diff --git a/usr/src/pkg/manifests/SUNWcs.mf b/usr/src/pkg/manifests/SUNWcs.mf
index 6da652d9d2..d907a680a3 100644
--- a/usr/src/pkg/manifests/SUNWcs.mf
+++ b/usr/src/pkg/manifests/SUNWcs.mf
@@ -370,10 +370,7 @@ file path=etc/inet/wanboot.conf.sample group=sys mode=0444
file path=etc/init.d/PRESERVE group=sys mode=0744 preserve=true
file path=etc/init.d/README group=sys preserve=true
file path=etc/init.d/cachefs.daemon group=sys mode=0744 preserve=true
-file path=etc/init.d/ldap.client group=sys mode=0744
-file path=etc/init.d/nscd group=sys mode=0744
file path=etc/init.d/sysetup group=sys mode=0744 preserve=true
-file path=etc/init.d/ufs_quota group=sys mode=0744 preserve=true
file path=etc/inittab group=sys preserve=true
file path=etc/ioctl.syscon group=sys preserve=true
file path=etc/ksh.kshrc group=sys preserve=renameold
diff --git a/usr/src/pkg/manifests/SUNWcsd.mf b/usr/src/pkg/manifests/SUNWcsd.mf
index 94b879b8cc..21fadddad9 100644
--- a/usr/src/pkg/manifests/SUNWcsd.mf
+++ b/usr/src/pkg/manifests/SUNWcsd.mf
@@ -21,6 +21,7 @@
#
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2015 Nexenta Systems, Inc. All rights reserved.
#
#
@@ -51,7 +52,6 @@ dir path=dev/zcons group=sys
dir path=devices group=sys
dir path=devices/pseudo group=sys
dir path=etc group=sys
-dir path=etc/init.d group=sys
dir path=etc/rcm group=sys
dir path=etc/rcm/scripts group=sys
dir path=etc/security group=sys
@@ -66,8 +66,6 @@ file path=etc/dacf.conf group=sys
file path=etc/devlink.tab group=sys preserve=true
file path=etc/driver_aliases group=sys preserve=true
file path=etc/driver_classes group=sys preserve=true
-file path=etc/init.d/devlinks group=sys mode=0744 preserve=true
-file path=etc/init.d/drvconfig group=sys mode=0744 preserve=true
file path=etc/iu.ap group=sys preserve=true
file path=etc/minor_perm group=sys preserve=true
file path=etc/name_to_major group=sys preserve=true
diff --git a/usr/src/pkg/manifests/service-file-system-nfs.mf b/usr/src/pkg/manifests/service-file-system-nfs.mf
index 7b7e89eacf..8f8a7d0738 100644
--- a/usr/src/pkg/manifests/service-file-system-nfs.mf
+++ b/usr/src/pkg/manifests/service-file-system-nfs.mf
@@ -21,7 +21,7 @@
#
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
-# Copyright 2012 Nexenta Systems, Inc. All rights reserved.
+# Copyright 2015 Nexenta Systems, Inc. All rights reserved.
#
set name=pkg.fmri value=pkg:/service/file-system/nfs@$(PKGVERS)
@@ -32,7 +32,6 @@ set name=info.classification \
set name=variant.arch value=$(ARCH)
dir path=etc group=sys
dir path=etc/default group=sys
-dir path=etc/init.d group=sys
dir path=etc/nfs group=sys
dir path=kernel group=sys
dir path=kernel/misc group=sys
@@ -57,8 +56,6 @@ dir path=usr/share/man/man1m
dir path=usr/share/man/man5
file path=etc/default/nfslogd group=sys \
original_name=SUNWnfss:etc/default/nfslogd preserve=true
-file path=etc/init.d/nfs.server group=sys mode=0744 \
- original_name=SUNWnfss:etc/init.d/nfs.server preserve=true
file path=etc/nfs/nfslog.conf group=sys \
original_name=SUNWnfss:etc/nfs/nfslog.conf preserve=true
file path=kernel/misc/$(ARCH64)/nfssrv group=sys mode=0755
diff --git a/usr/src/pkg/manifests/service-network-slp.mf b/usr/src/pkg/manifests/service-network-slp.mf
index c8161f2009..d1a24bb500 100644
--- a/usr/src/pkg/manifests/service-network-slp.mf
+++ b/usr/src/pkg/manifests/service-network-slp.mf
@@ -21,6 +21,7 @@
#
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright 2015 Nexenta Systems, Inc. All rights reserved.
#
set name=pkg.fmri value=pkg:/service/network/slp@$(PKGVERS)
@@ -32,7 +33,6 @@ set name=info.classification \
set name=variant.arch value=$(ARCH)
dir path=etc group=sys
dir path=etc/inet group=sys
-dir path=etc/init.d group=sys
dir path=lib
dir path=lib/svc
dir path=lib/svc/manifest group=sys
@@ -53,7 +53,6 @@ dir path=usr/share/man/man3slp
dir path=usr/share/man/man4
dir path=usr/share/man/man7p
file path=etc/inet/slp.conf.example group=sys
-file path=etc/init.d/slpd group=sys mode=0744
file path=lib/svc/manifest/network/slp.xml group=sys mode=0444
file path=lib/svc/method/slp mode=0555
file path=usr/include/slp.h
diff --git a/usr/src/pkg/manifests/service-network-smtp-sendmail.mf b/usr/src/pkg/manifests/service-network-smtp-sendmail.mf
index 6862d415ed..27c3e84a68 100644
--- a/usr/src/pkg/manifests/service-network-smtp-sendmail.mf
+++ b/usr/src/pkg/manifests/service-network-smtp-sendmail.mf
@@ -21,7 +21,7 @@
#
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
-# Copyright 2012 Nexenta Systems, Inc. All rights reserved.
+# Copyright 2015 Nexenta Systems, Inc. All rights reserved.
#
set name=pkg.fmri \
@@ -31,7 +31,6 @@ set name=pkg.summary value=Sendmail
set name=info.classification value=org.opensolaris.category.2008:System/Core
set name=variant.arch value=$(ARCH)
dir path=etc group=sys
-dir path=etc/init.d group=sys
dir path=etc/mail group=mail
dir path=etc/mail/cf group=mail
dir path=etc/mail/cf/cf group=mail
@@ -69,8 +68,6 @@ dir path=var/adm/sm.bin group=sys
dir path=var/spool
dir path=var/spool/clientmqueue group=smmsp mode=0770 owner=smmsp
dir path=var/spool/mqueue mode=0750
-file path=etc/init.d/sendmail group=sys mode=0744 \
- original_name=SUNWsndm:etc/init.d/sendmail preserve=true
file path=etc/mail/aliases original_name=SUNWsndm:etc/mail/aliases \
preserve=true
file path=etc/mail/cf/README group=mail mode=0444
diff --git a/usr/src/uts/common/fs/smbsrv/smb_acl.c b/usr/src/uts/common/fs/smbsrv/smb_acl.c
index a98cbcc784..d42a76d314 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_acl.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_acl.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -72,7 +73,7 @@
* owner: full access
* SYSTEM: full access
*/
-static ace_t default_dacl[DEFAULT_DACL_ACENUM] = {
+static const ace_t const default_dacl[DEFAULT_DACL_ACENUM] = {
{ (uid_t)-1, ACE_ALL_PERMS, 0, ACE_ACCESS_ALLOWED_ACE_TYPE },
{ IDMAP_WK_LOCAL_SYSTEM_GID, ACE_ALL_PERMS, ACE_IDENTIFIER_GROUP,
ACE_ACCESS_ALLOWED_ACE_TYPE }
diff --git a/usr/src/uts/common/fs/smbsrv/smb_common_open.c b/usr/src/uts/common/fs/smbsrv/smb_common_open.c
index 5eaa5865c6..c29007034a 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_common_open.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_common_open.c
@@ -455,7 +455,7 @@ smb_open_subr(smb_request_t *sr)
if ((op->desired_access & ~FILE_READ_ATTRIBUTES) == DELETE)
lookup_flags &= ~SMB_FOLLOW_LINKS;
- rc = smb_fsop_lookup_name(sr, kcred, lookup_flags,
+ rc = smb_fsop_lookup_name(sr, zone_kcred(), lookup_flags,
sr->tid_tree->t_snode, op->fqi.fq_dnode, op->fqi.fq_last_comp,
&op->fqi.fq_fnode);
@@ -466,7 +466,7 @@ smb_open_subr(smb_request_t *sr)
* check the search attributes (sattr).
*/
op->fqi.fq_fattr.sa_mask = SMB_AT_DOSATTR;
- rc = smb_node_getattr(sr, op->fqi.fq_fnode, kcred,
+ rc = smb_node_getattr(sr, op->fqi.fq_fnode, zone_kcred(),
NULL, &op->fqi.fq_fattr);
if (rc != 0) {
smb_node_release(op->fqi.fq_fnode);
@@ -854,7 +854,7 @@ smb_open_subr(smb_request_t *sr)
* so pass kcred here.
*/
op->fqi.fq_fattr.sa_mask = SMB_AT_ALL;
- rc = smb_node_getattr(sr, node, kcred, of,
+ rc = smb_node_getattr(sr, node, zone_kcred(), of,
&op->fqi.fq_fattr);
if (rc != 0) {
smbsr_error(sr, NT_STATUS_INTERNAL_ERROR,
diff --git a/usr/src/uts/common/fs/smbsrv/smb_common_transact.c b/usr/src/uts/common/fs/smbsrv/smb_common_transact.c
index fd5b315608..c8a9ec9093 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_common_transact.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_common_transact.c
@@ -762,7 +762,7 @@ smb_encode_SHARE_INFO_2(struct mbuf_chain *output, struct mbuf_chain *text,
(void) smb_mbc_encodef(output, "wwwl9c.",
access,
sr->sr_cfg->skc_maxconnections,
- smb_server_get_session_count(),
+ smb_server_get_session_count(sr->sr_server),
MBC_LENGTH(text),
pword);
(void) smb_mbc_encodef(text, "s", path);
@@ -837,7 +837,7 @@ smb_trans_net_share_enum(struct smb_request *sr, struct smb_xa *xa)
esi.es_buf = smb_srm_zalloc(sr, esi.es_bufsize);
esi.es_posix_uid = crgetuid(sr->uid_user->u_cred);
- smb_kshare_enum(&esi);
+ smb_kshare_enum(sr->sr_server, &esi);
/* client buffer size is not big enough to hold any shares */
if (esi.es_nsent == 0) {
@@ -964,12 +964,12 @@ smb_trans_net_share_getinfo(smb_request_t *sr, struct smb_xa *xa)
&share, &level, &max_bytes) != 0)
return (SDRC_NOT_IMPLEMENTED);
- si = smb_kshare_lookup(share);
+ si = smb_kshare_lookup(sr->sr_server, share);
if ((si == NULL) || (si->shr_oemname == NULL)) {
(void) smb_mbc_encodef(&xa->rep_param_mb, "www",
NERR_NetNameNotFound, 0, 0);
if (si)
- smb_kshare_release(si);
+ smb_kshare_release(sr->sr_server, si);
return (SDRC_SUCCESS);
}
@@ -996,14 +996,14 @@ smb_trans_net_share_getinfo(smb_request_t *sr, struct smb_xa *xa)
break;
default:
- smb_kshare_release(si);
+ smb_kshare_release(sr->sr_server, si);
(void) smb_mbc_encodef(&xa->rep_param_mb, "www",
ERROR_INVALID_LEVEL, 0, 0);
m_freem(str_mb.chain);
return (SDRC_NOT_IMPLEMENTED);
}
- smb_kshare_release(si);
+ smb_kshare_release(sr->sr_server, si);
(void) smb_mbc_encodef(&xa->rep_param_mb, "www", NERR_Success,
-MBC_LENGTH(&xa->rep_data_mb),
MBC_LENGTH(&xa->rep_data_mb) + MBC_LENGTH(&str_mb));
diff --git a/usr/src/uts/common/fs/smbsrv/smb_delete.c b/usr/src/uts/common/fs/smbsrv/smb_delete.c
index 14eff73896..3bca7e6202 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_delete.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_delete.c
@@ -413,7 +413,7 @@ smb_delete_check_dosattr(smb_request_t *sr, smb_error_t *err)
bzero(&attr, sizeof (attr));
attr.sa_mask = SMB_AT_DOSATTR;
- if (smb_node_getattr(sr, node, kcred, NULL, &attr) != 0) {
+ if (smb_node_getattr(sr, node, zone_kcred(), NULL, &attr) != 0) {
smb_delete_error(err, NT_STATUS_INTERNAL_ERROR,
ERRDOS, ERROR_INTERNAL_ERROR);
return (-1);
diff --git a/usr/src/uts/common/fs/smbsrv/smb_directory.c b/usr/src/uts/common/fs/smbsrv/smb_directory.c
index c1d7ee016e..7f6bff1512 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_directory.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_directory.c
@@ -286,7 +286,7 @@ smb_com_delete_directory(smb_request_t *sr)
* and don't want access errors for this.
*/
fqi->fq_fattr.sa_mask = SMB_AT_DOSATTR;
- rc = smb_node_getattr(sr, fqi->fq_fnode, kcred, NULL,
+ rc = smb_node_getattr(sr, fqi->fq_fnode, zone_kcred(), NULL,
&fqi->fq_fattr);
if (rc != 0) {
smbsr_errno(sr, rc);
diff --git a/usr/src/uts/common/fs/smbsrv/smb_dispatch.c b/usr/src/uts/common/fs/smbsrv/smb_dispatch.c
index 9b1fed6f9a..7f4d76441f 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_dispatch.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_dispatch.c
@@ -141,14 +141,11 @@
#include <sys/sdt.h>
#include <sys/spl.h>
-static int smb_legacy_dispatch_stats_update(kstat_t *, int);
static int is_andx_com(unsigned char);
static int smbsr_check_result(struct smb_request *, int, int);
-static kstat_t *smb_legacy_dispatch_ksp = NULL;
-static kmutex_t smb_legacy_dispatch_ksmtx;
-
-static smb_disp_entry_t smb_disp_table[SMB_COM_NUM] = {
+static const smb_disp_entry_t const
+smb_disp_table[SMB_COM_NUM] = {
{ "SmbCreateDirectory", SMB_SDT_OPS(create_directory), /* 0x00 000 */
0x00, PC_NETWORK_PROGRAM_1_0 },
{ "SmbDeleteDirectory", SMB_SDT_OPS(delete_directory), /* 0x01 001 */
@@ -184,8 +181,8 @@ static smb_disp_entry_t smb_disp_table[SMB_COM_NUM] = {
{ "SmbCheckDirectory", SMB_SDT_OPS(check_directory), /* 0x10 016 */
0x10, PC_NETWORK_PROGRAM_1_0 },
{ "SmbProcessExit", SMB_SDT_OPS(process_exit), /* 0x11 017 */
- 0x11, PC_NETWORK_PROGRAM_1_0, SDDF_SUPPRESS_TID | SDDF_SUPPRESS_UID,
- 0, 0, { 0 } },
+ 0x11, PC_NETWORK_PROGRAM_1_0,
+ SDDF_SUPPRESS_TID | SDDF_SUPPRESS_UID },
{ "SmbSeek", SMB_SDT_OPS(seek), /* 0x12 018 */
0x12, PC_NETWORK_PROGRAM_1_0 },
{ "SmbLockAndRead", SMB_SDT_OPS(lock_and_read), /* 0x13 019 */
@@ -307,11 +304,11 @@ static smb_disp_entry_t smb_disp_table[SMB_COM_NUM] = {
{ "SmbTreeConnect", SMB_SDT_OPS(tree_connect), /* 0x70 112 */
0x70, PC_NETWORK_PROGRAM_1_0, SDDF_SUPPRESS_TID },
{ "SmbTreeDisconnect", SMB_SDT_OPS(tree_disconnect), /* 0x71 113 */
- 0x71, PC_NETWORK_PROGRAM_1_0, SDDF_SUPPRESS_TID | SDDF_SUPPRESS_UID,
- NULL },
+ 0x71, PC_NETWORK_PROGRAM_1_0,
+ SDDF_SUPPRESS_TID | SDDF_SUPPRESS_UID },
{ "SmbNegotiate", SMB_SDT_OPS(negotiate), /* 0x72 114 */
- 0x72, PC_NETWORK_PROGRAM_1_0, SDDF_SUPPRESS_TID | SDDF_SUPPRESS_UID,
- NULL },
+ 0x72, PC_NETWORK_PROGRAM_1_0,
+ SDDF_SUPPRESS_TID | SDDF_SUPPRESS_UID },
{ "SmbSessionSetupX", SMB_SDT_OPS(session_setup_andx), /* 0x73 115 */
0x73, LANMAN1_0, SDDF_SUPPRESS_TID | SDDF_SUPPRESS_UID },
{ "SmbLogoffX", SMB_SDT_OPS(logoff_andx), /* 0x74 116 */
@@ -519,14 +516,17 @@ boolean_t
smb_dispatch_request(struct smb_request *sr)
{
smb_sdrc_t sdrc;
- smb_disp_entry_t *sdd;
+ const smb_disp_entry_t *sdd;
+ smb_disp_stats_t *sds;
boolean_t disconnect = B_FALSE;
smb_session_t *session;
+ smb_server_t *server;
uint32_t capabilities;
uint32_t byte_count;
uint32_t max_bytes;
session = sr->session;
+ server = session->s_server;
capabilities = session->capabilities;
ASSERT(sr->tid_tree == 0);
@@ -535,7 +535,7 @@ smb_dispatch_request(struct smb_request *sr)
sr->smb_fid = (uint16_t)-1;
/* temporary until we identify a user */
- sr->user_cr = kcred;
+ sr->user_cr = zone_kcred();
sr->orig_request_hdr = sr->command.chain_offset;
/* If this connection is shutting down just kill request */
@@ -603,6 +603,7 @@ smb_dispatch_request(struct smb_request *sr)
andx_more:
sdd = &smb_disp_table[sr->smb_com];
ASSERT(sdd->sdt_function);
+ sds = &server->sv_disp_stats[sr->smb_com];
if (smb_mbc_decodef(&sr->command, "b", &sr->smb_wct) != 0) {
disconnect = B_TRUE;
@@ -617,7 +618,7 @@ andx_more:
goto report_error;
}
- atomic_add_64(&sdd->sdt_rxb,
+ atomic_add_64(&sds->sdt_rxb,
(int64_t)(sr->smb_wct * 2 + sr->smb_bcc + 1));
sr->sr_txb = sr->reply.chain_offset;
@@ -727,9 +728,9 @@ andx_more:
(*sdd->sdt_post_op)(sr);
smbsr_cleanup(sr);
}
- smb_latency_add_sample(&sdd->sdt_lat, gethrtime() - sr->sr_time_start);
+ smb_latency_add_sample(&sds->sdt_lat, gethrtime() - sr->sr_time_start);
- atomic_add_64(&sdd->sdt_txb,
+ atomic_add_64(&sds->sdt_txb,
(int64_t)(sr->reply.chain_offset - sr->sr_txb));
if (sdrc != SDRC_SUCCESS) {
@@ -972,12 +973,12 @@ smbsr_send_reply(smb_request_t *sr)
* Map errno values to SMB and NT status values.
* Note: ESRCH is a special case to handle a streams lookup failure.
*/
-static struct {
+static const struct {
int errnum;
int errcls;
int errcode;
DWORD status32;
-} smb_errno_map[] = {
+} const smb_errno_map[] = {
{ ENOSPC, ERRDOS, ERROR_DISK_FULL, NT_STATUS_DISK_FULL },
{ EDQUOT, ERRDOS, ERROR_DISK_FULL, NT_STATUS_DISK_FULL },
{ EPERM, ERRSRV, ERRaccess, NT_STATUS_ACCESS_DENIED },
@@ -1186,14 +1187,17 @@ smb_com_invalid(smb_request_t *sr)
* Initializes dispatch statistics.
*/
void
-smb_dispatch_stats_init(smb_kstat_req_t *ksr)
+smb_dispatch_stats_init(smb_server_t *sv)
{
- kstat_named_t *ksn;
+ smb_disp_stats_t *sds = sv->sv_disp_stats;
+ smb_kstat_req_t *ksr;
int ks_ndata;
int i;
+ ksr = ((smbsrv_kstats_t *)sv->sv_ksp->ks_data)->ks_reqs;
+
for (i = 0; i < SMB_COM_NUM; i++, ksr++) {
- smb_latency_init(&smb_disp_table[i].sdt_lat);
+ smb_latency_init(&sds[i].sdt_lat);
(void) strlcpy(ksr->kr_name, smb_disp_table[i].sdt_name,
sizeof (ksr->kr_name));
}
@@ -1202,30 +1206,6 @@ smb_dispatch_stats_init(smb_kstat_req_t *ksr)
if (smb_disp_table[i].sdt_function != smb_com_invalid)
ks_ndata++;
}
-
- smb_legacy_dispatch_ksp = kstat_create(SMBSRV_KSTAT_MODULE, 0,
- SMBSRV_KSTAT_NAME_CMDS, SMBSRV_KSTAT_CLASS,
- KSTAT_TYPE_NAMED, ks_ndata, 0);
-
- if (smb_legacy_dispatch_ksp != NULL) {
- ksn = smb_legacy_dispatch_ksp->ks_data;
-
- for (i = 0, ks_ndata = 0; i < SMB_COM_NUM; i++) {
- if (smb_disp_table[i].sdt_function != smb_com_invalid) {
- (void) strlcpy(ksn->name,
- smb_disp_table[i].sdt_name,
- sizeof (ksn->name));
- ksn->data_type = KSTAT_DATA_UINT64;
- ++ksn;
- }
- }
- mutex_init(&smb_legacy_dispatch_ksmtx, NULL,
- MUTEX_DEFAULT, NULL);
- smb_legacy_dispatch_ksp->ks_update =
- smb_legacy_dispatch_stats_update;
- smb_legacy_dispatch_ksp->ks_lock = &smb_legacy_dispatch_ksmtx;
- kstat_install(smb_legacy_dispatch_ksp);
- }
}
/*
@@ -1234,23 +1214,20 @@ smb_dispatch_stats_init(smb_kstat_req_t *ksr)
* Frees and destroyes the resources used for statistics.
*/
void
-smb_dispatch_stats_fini(void)
+smb_dispatch_stats_fini(smb_server_t *sv)
{
+ smb_disp_stats_t *sds = sv->sv_disp_stats;
int i;
- if (smb_legacy_dispatch_ksp != NULL) {
- kstat_delete(smb_legacy_dispatch_ksp);
- mutex_destroy(&smb_legacy_dispatch_ksmtx);
- smb_legacy_dispatch_ksp = NULL;
- }
-
for (i = 0; i < SMB_COM_NUM; i++)
- smb_latency_destroy(&smb_disp_table[i].sdt_lat);
+ smb_latency_destroy(&sds[i].sdt_lat);
}
void
-smb_dispatch_stats_update(smb_kstat_req_t *ksr, int first, int nreq)
+smb_dispatch_stats_update(smb_server_t *sv,
+ smb_kstat_req_t *ksr, int first, int nreq)
{
+ smb_disp_stats_t *sds = sv->sv_disp_stats;
int i;
int last;
@@ -1258,56 +1235,22 @@ smb_dispatch_stats_update(smb_kstat_req_t *ksr, int first, int nreq)
if ((first < SMB_COM_NUM) && (last < SMB_COM_NUM)) {
for (i = first; i <= last; i++, ksr++) {
- ksr->kr_rxb = smb_disp_table[i].sdt_rxb;
- ksr->kr_txb = smb_disp_table[i].sdt_txb;
- mutex_enter(&smb_disp_table[i].sdt_lat.ly_mutex);
- ksr->kr_nreq = smb_disp_table[i].sdt_lat.ly_a_nreq;
- ksr->kr_sum = smb_disp_table[i].sdt_lat.ly_a_sum;
- ksr->kr_a_mean = smb_disp_table[i].sdt_lat.ly_a_mean;
+ ksr->kr_rxb = sds[i].sdt_rxb;
+ ksr->kr_txb = sds[i].sdt_txb;
+ mutex_enter(&sds[i].sdt_lat.ly_mutex);
+ ksr->kr_nreq = sds[i].sdt_lat.ly_a_nreq;
+ ksr->kr_sum = sds[i].sdt_lat.ly_a_sum;
+ ksr->kr_a_mean = sds[i].sdt_lat.ly_a_mean;
ksr->kr_a_stddev =
- smb_disp_table[i].sdt_lat.ly_a_stddev;
- ksr->kr_d_mean = smb_disp_table[i].sdt_lat.ly_d_mean;
+ sds[i].sdt_lat.ly_a_stddev;
+ ksr->kr_d_mean = sds[i].sdt_lat.ly_d_mean;
ksr->kr_d_stddev =
- smb_disp_table[i].sdt_lat.ly_d_stddev;
- smb_disp_table[i].sdt_lat.ly_d_mean = 0;
- smb_disp_table[i].sdt_lat.ly_d_nreq = 0;
- smb_disp_table[i].sdt_lat.ly_d_stddev = 0;
- smb_disp_table[i].sdt_lat.ly_d_sum = 0;
- mutex_exit(&smb_disp_table[i].sdt_lat.ly_mutex);
- }
- }
-}
-
-/*
- * smb_legacy_dispatch_stats_update
- *
- * This callback function updates the smb_legacy_dispatch_kstat_data when kstat
- * command is invoked.
- */
-static int
-smb_legacy_dispatch_stats_update(kstat_t *ksp, int rw)
-{
- kstat_named_t *ksn;
- int i;
-
- ASSERT(MUTEX_HELD(ksp->ks_lock));
-
- switch (rw) {
- case KSTAT_WRITE:
- return (EACCES);
-
- case KSTAT_READ:
- ksn = ksp->ks_data;
- for (i = 0; i < SMB_COM_NUM; i++) {
- if (smb_disp_table[i].sdt_function != smb_com_invalid) {
- ksn->value.ui64 =
- smb_disp_table[i].sdt_lat.ly_a_nreq;
- ++ksn;
- }
+ sds[i].sdt_lat.ly_d_stddev;
+ sds[i].sdt_lat.ly_d_mean = 0;
+ sds[i].sdt_lat.ly_d_nreq = 0;
+ sds[i].sdt_lat.ly_d_stddev = 0;
+ sds[i].sdt_lat.ly_d_sum = 0;
+ mutex_exit(&sds[i].sdt_lat.ly_mutex);
}
- return (0);
-
- default:
- return (EIO);
}
}
diff --git a/usr/src/uts/common/fs/smbsrv/smb_fem.c b/usr/src/uts/common/fs/smbsrv/smb_fem.c
index 38cfab1f5c..98d13aa6b3 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_fem.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_fem.c
@@ -42,9 +42,6 @@ static fem_t *smb_oplock_ops = NULL;
* Declarations for FCN (file change notification) FEM monitors
*/
-void smb_fem_fcn_install(smb_node_t *);
-void smb_fem_fcn_uninstall(smb_node_t *);
-
static int smb_fem_fcn_create(femarg_t *, char *, vattr_t *, vcexcl_t, int,
vnode_t **, cred_t *, int, caller_context_t *, vsecattr_t *);
static int smb_fem_fcn_remove(femarg_t *, char *, cred_t *,
@@ -75,9 +72,6 @@ static const fs_operation_def_t smb_fcn_tmpl[] = {
* Declarations for oplock FEM monitors
*/
-int smb_fem_oplock_install(smb_node_t *);
-int smb_fem_oplock_uninstall(smb_node_t *);
-
static int smb_fem_oplock_open(femarg_t *, int, cred_t *,
struct caller_context *);
static int smb_fem_oplock_read(femarg_t *, uio_t *, int, cred_t *,
@@ -149,37 +143,55 @@ smb_fem_fini(void)
if (!smb_fem_initialized)
return;
- fem_free(smb_fcn_ops);
- fem_free(smb_oplock_ops);
- smb_fcn_ops = NULL;
- smb_oplock_ops = NULL;
+ if (smb_fcn_ops != NULL) {
+ fem_free(smb_fcn_ops);
+ smb_fcn_ops = NULL;
+ }
+ if (smb_oplock_ops != NULL) {
+ fem_free(smb_oplock_ops);
+ smb_oplock_ops = NULL;
+ }
smb_fem_initialized = B_FALSE;
}
-void
+int
smb_fem_fcn_install(smb_node_t *node)
{
- (void) fem_install(node->vp, smb_fcn_ops, (void *)node, OPARGUNIQ,
+ int rc;
+
+ if (smb_fcn_ops == NULL)
+ return (ENOSYS);
+ rc = fem_install(node->vp, smb_fcn_ops, (void *)node, OPARGUNIQ,
(fem_func_t)smb_node_ref, (fem_func_t)smb_node_release);
+ return (rc);
}
void
smb_fem_fcn_uninstall(smb_node_t *node)
{
- (void) fem_uninstall(node->vp, smb_fcn_ops, (void *)node);
+ if (smb_fcn_ops == NULL)
+ return;
+ VERIFY0(fem_uninstall(node->vp, smb_fcn_ops, (void *)node));
}
int
smb_fem_oplock_install(smb_node_t *node)
{
- return (fem_install(node->vp, smb_oplock_ops, (void *)node, OPARGUNIQ,
- (fem_func_t)smb_node_ref, (fem_func_t)smb_node_release));
+ int rc;
+
+ if (smb_oplock_ops == NULL)
+ return (ENOSYS);
+ rc = fem_install(node->vp, smb_oplock_ops, (void *)node, OPARGUNIQ,
+ (fem_func_t)smb_node_ref, (fem_func_t)smb_node_release);
+ return (rc);
}
-int
+void
smb_fem_oplock_uninstall(smb_node_t *node)
{
- return (fem_uninstall(node->vp, smb_oplock_ops, (void *)node));
+ if (smb_oplock_ops == NULL)
+ return;
+ VERIFY0(fem_uninstall(node->vp, smb_oplock_ops, (void *)node));
}
/*
diff --git a/usr/src/uts/common/fs/smbsrv/smb_fsops.c b/usr/src/uts/common/fs/smbsrv/smb_fsops.c
index c64313fdbf..d63de75843 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_fsops.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_fsops.c
@@ -123,9 +123,10 @@ smb_fsop_create_with_sd(smb_request_t *sr, cred_t *cr,
{
vsecattr_t *vsap;
vsecattr_t vsecattr;
- acl_t *acl, *dacl, *sacl;
smb_attr_t set_attr;
+ acl_t *acl, *dacl, *sacl;
vnode_t *vp;
+ cred_t *kcr = zone_kcred();
int aclbsize = 0; /* size of acl list in bytes */
int flags = 0;
int rc;
@@ -205,7 +206,7 @@ smb_fsop_create_with_sd(smb_request_t *sr, cred_t *cr,
}
if (set_attr.sa_mask)
- rc = smb_vop_setattr(vp, NULL, &set_attr, 0, kcred);
+ rc = smb_vop_setattr(vp, NULL, &set_attr, 0, kcr);
if (rc == 0) {
*ret_snode = smb_node_lookup(sr, &sr->arg.open, cr, vp,
@@ -243,7 +244,7 @@ smb_fsop_create_with_sd(smb_request_t *sr, cred_t *cr,
if (*ret_snode != NULL) {
if (!smb_tree_has_feature(sr->tid_tree,
SMB_TREE_NFS_MOUNTED))
- rc = smb_fsop_sdwrite(sr, kcred, *ret_snode,
+ rc = smb_fsop_sdwrite(sr, kcr, *ret_snode,
fs_sd, 1);
} else {
rc = ENOMEM;
@@ -366,10 +367,11 @@ smb_fsop_create_stream(smb_request_t *sr, cred_t *cr,
smb_node_t *dnode, char *fname, char *sname, int flags,
smb_attr_t *attr, smb_node_t **ret_snode)
{
- smb_node_t *fnode;
smb_attr_t fattr;
+ smb_node_t *fnode;
vnode_t *xattrdvp;
vnode_t *vp;
+ cred_t *kcr = zone_kcred();
int rc = 0;
boolean_t fcreate = B_FALSE;
@@ -385,7 +387,7 @@ smb_fsop_create_stream(smb_request_t *sr, cred_t *cr,
return (rc);
fattr.sa_mask = SMB_AT_UID | SMB_AT_GID;
- rc = smb_vop_getattr(fnode->vp, NULL, &fattr, 0, kcred);
+ rc = smb_vop_getattr(fnode->vp, NULL, &fattr, 0, kcr);
if (rc == 0) {
/* create the named stream, sname */
@@ -406,7 +408,7 @@ smb_fsop_create_stream(smb_request_t *sr, cred_t *cr,
attr->sa_vattr.va_gid = fattr.sa_vattr.va_gid;
attr->sa_mask = SMB_AT_UID | SMB_AT_GID;
- rc = smb_vop_setattr(vp, NULL, attr, 0, kcred);
+ rc = smb_vop_setattr(vp, NULL, attr, 0, kcr);
if (rc != 0) {
smb_node_release(fnode);
return (rc);
@@ -1296,6 +1298,7 @@ int
smb_fsop_read(smb_request_t *sr, cred_t *cr, smb_node_t *snode, uio_t *uio)
{
caller_context_t ct;
+ cred_t *kcr = zone_kcred();
int svmand;
int rc;
@@ -1325,10 +1328,10 @@ smb_fsop_read(smb_request_t *sr, cred_t *cr, smb_node_t *snode, uio_t *uio)
* extended attr kcred is passed for streams.
*/
if (SMB_IS_STREAM(snode))
- cr = kcred;
+ cr = kcr;
smb_node_start_crit(snode, RW_READER);
- rc = nbl_svmand(snode->vp, kcred, &svmand);
+ rc = nbl_svmand(snode->vp, kcr, &svmand);
if (rc) {
smb_node_end_crit(snode);
return (rc);
@@ -1372,6 +1375,7 @@ smb_fsop_write(
vnode_t *u_vp = NULL;
smb_ofile_t *of;
vnode_t *vp;
+ cred_t *kcr = zone_kcred();
int svmand;
int rc;
@@ -1410,11 +1414,11 @@ smb_fsop_write(
ASSERT(u_node->n_magic == SMB_NODE_MAGIC);
ASSERT(u_node->n_state != SMB_NODE_STATE_DESTROYING);
u_vp = u_node->vp;
- cr = kcred;
+ cr = kcr;
}
smb_node_start_crit(snode, RW_WRITER);
- rc = nbl_svmand(vp, kcred, &svmand);
+ rc = nbl_svmand(vp, kcr, &svmand);
if (rc) {
smb_node_end_crit(snode);
return (rc);
@@ -1446,7 +1450,7 @@ smb_fsop_write(
if (of->f_pending_attr.sa_mask & SMB_AT_MTIME) {
bcopy(&of->f_pending_attr, &attr, sizeof (attr));
attr.sa_mask = SMB_AT_MTIME;
- (void) smb_vop_setattr(vp, u_vp, &attr, 0, kcred);
+ (void) smb_vop_setattr(vp, u_vp, &attr, 0, kcr);
}
smb_node_end_crit(snode);
@@ -1530,7 +1534,7 @@ smb_fsop_access(smb_request_t *sr, cred_t *cr, smb_node_t *snode,
*/
if (faccess & (FILE_READ_DATA | FILE_EXECUTE)) {
error = smb_vop_access(snode->vp, VREAD,
- 0, NULL, kcred);
+ 0, NULL, zone_kcred());
if (error)
return (NT_STATUS_ACCESS_DENIED);
}
@@ -2118,7 +2122,7 @@ smb_fsop_sdread(smb_request_t *sr, cred_t *cr, smb_node_t *snode,
ga_cred = cr;
} else if (sr->tid_tree->t_acltype == ACE_T) {
getowner = 1;
- ga_cred = kcred;
+ ga_cred = zone_kcred();
}
if (getowner) {
@@ -2182,6 +2186,7 @@ static int
smb_fsop_sdmerge(smb_request_t *sr, smb_node_t *snode, smb_fssd_t *fs_sd)
{
smb_fssd_t cur_sd;
+ cred_t *kcr = zone_kcred();
int error = 0;
if (sr->tid_tree->t_acltype != ACE_T)
@@ -2196,7 +2201,7 @@ smb_fsop_sdmerge(smb_request_t *sr, smb_node_t *snode, smb_fssd_t *fs_sd)
smb_fssd_init(&cur_sd, SMB_SACL_SECINFO,
fs_sd->sd_flags);
- error = smb_fsop_sdread(sr, kcred, snode, &cur_sd);
+ error = smb_fsop_sdread(sr, kcr, snode, &cur_sd);
if (error == 0) {
ASSERT(fs_sd->sd_zsacl == NULL);
fs_sd->sd_zsacl = cur_sd.sd_zsacl;
@@ -2211,7 +2216,7 @@ smb_fsop_sdmerge(smb_request_t *sr, smb_node_t *snode, smb_fssd_t *fs_sd)
smb_fssd_init(&cur_sd, SMB_DACL_SECINFO,
fs_sd->sd_flags);
- error = smb_fsop_sdread(sr, kcred, snode, &cur_sd);
+ error = smb_fsop_sdread(sr, kcr, snode, &cur_sd);
if (error == 0) {
ASSERT(fs_sd->sd_zdacl == NULL);
fs_sd->sd_zdacl = cur_sd.sd_zdacl;
@@ -2254,10 +2259,11 @@ int
smb_fsop_sdwrite(smb_request_t *sr, cred_t *cr, smb_node_t *snode,
smb_fssd_t *fs_sd, int overwrite)
{
- int error = 0;
- int access = 0;
smb_attr_t set_attr;
smb_attr_t orig_attr;
+ cred_t *kcr = zone_kcred();
+ int error = 0;
+ int access = 0;
ASSERT(cr);
ASSERT(fs_sd);
@@ -2297,7 +2303,7 @@ smb_fsop_sdwrite(smb_request_t *sr, cred_t *cr, smb_node_t *snode,
if (set_attr.sa_mask) {
orig_attr.sa_mask = SMB_AT_UID | SMB_AT_GID;
- error = smb_fsop_getattr(sr, kcred, snode, &orig_attr);
+ error = smb_fsop_getattr(sr, kcr, snode, &orig_attr);
if (error == 0) {
error = smb_fsop_setattr(sr, cr, snode, &set_attr);
if (error == EPERM)
@@ -2322,7 +2328,7 @@ smb_fsop_sdwrite(smb_request_t *sr, cred_t *cr, smb_node_t *snode,
*/
if (set_attr.sa_mask) {
orig_attr.sa_mask = set_attr.sa_mask;
- (void) smb_fsop_setattr(sr, kcred, snode,
+ (void) smb_fsop_setattr(sr, kcr, snode,
&orig_attr);
}
}
@@ -2376,7 +2382,7 @@ smb_fsop_sdinherit(smb_request_t *sr, smb_node_t *dnode, smb_fssd_t *fs_sd)
/* Fetch parent directory's ACL */
- error = smb_fsop_sdread(sr, kcred, dnode, fs_sd);
+ error = smb_fsop_sdread(sr, zone_kcred(), dnode, fs_sd);
if (error) {
return (error);
}
diff --git a/usr/src/uts/common/fs/smbsrv/smb_init.c b/usr/src/uts/common/fs/smbsrv/smb_init.c
index 87a53cf9fb..17fa769e54 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_init.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_init.c
@@ -178,17 +178,12 @@ _init(void)
{
int rc;
- if ((rc = smb_kshare_init()) != 0)
- return (rc);
-
- if ((rc = smb_server_svc_init()) != 0) {
- smb_kshare_fini();
+ if ((rc = smb_server_g_init()) != 0) {
return (rc);
}
if ((rc = mod_install(&modlinkage)) != 0) {
- smb_kshare_fini();
- (void) smb_server_svc_fini();
+ (void) smb_server_g_fini();
}
return (rc);
@@ -206,8 +201,7 @@ _fini(void)
int rc;
if ((rc = mod_remove(&modlinkage)) == 0) {
- rc = smb_server_svc_fini();
- smb_kshare_fini();
+ rc = smb_server_g_fini();
}
return (rc);
@@ -220,15 +214,27 @@ _fini(void)
*/
/* ARGSUSED */
static int
-smb_drv_open(dev_t *devp, int flag, int otyp, cred_t *credp)
+smb_drv_open(dev_t *devp, int flag, int otyp, cred_t *cr)
{
+ zoneid_t zid;
+
/*
* Check caller's privileges.
*/
- if (secpolicy_smb(credp) != 0)
+ if (secpolicy_smb(cr) != 0)
return (EPERM);
/*
+ * We need a unique minor per zone otherwise an smbd in any other
+ * zone will keep this minor open and we won't get a close call.
+ * The zone ID is good enough as a minor number.
+ */
+ zid = crgetzoneid(cr);
+ if (zid < 0)
+ return (ENODEV);
+ *devp = makedevice(getmajor(*devp), zid);
+
+ /*
* Start SMB service state machine
*/
return (smb_server_create());
diff --git a/usr/src/uts/common/fs/smbsrv/smb_kdoor.c b/usr/src/uts/common/fs/smbsrv/smb_kdoor.c
index 3d1988ecce..f14a54a6cc 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_kdoor.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_kdoor.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
*/
@@ -31,34 +32,29 @@
#include <smbsrv/smb_kproto.h>
#include <smbsrv/smb_door.h>
-static int smb_kdoor_send(smb_doorarg_t *);
-static int smb_kdoor_receive(smb_doorarg_t *);
-static int smb_kdoor_upcall_private(smb_doorarg_t *);
+static int smb_kdoor_send(smb_server_t *, smb_doorarg_t *);
+static int smb_kdoor_receive(smb_server_t *, smb_doorarg_t *);
+static int smb_kdoor_upcall_private(smb_server_t *, smb_doorarg_t *);
static int smb_kdoor_encode(smb_doorarg_t *);
static int smb_kdoor_decode(smb_doorarg_t *);
static void smb_kdoor_sethdr(smb_doorarg_t *, uint32_t);
static boolean_t smb_kdoor_chkhdr(smb_doorarg_t *, smb_doorhdr_t *);
static void smb_kdoor_free(door_arg_t *);
-door_handle_t smb_kdoor_hd = NULL;
-static int smb_kdoor_id = -1;
-static uint64_t smb_kdoor_ncall = 0;
-static kmutex_t smb_kdoor_mutex;
-static kcondvar_t smb_kdoor_cv;
-
void
-smb_kdoor_init(void)
+smb_kdoor_init(smb_server_t *sv)
{
- mutex_init(&smb_kdoor_mutex, NULL, MUTEX_DEFAULT, NULL);
- cv_init(&smb_kdoor_cv, NULL, CV_DEFAULT, NULL);
+ sv->sv_kdoor_id = -1;
+ mutex_init(&sv->sv_kdoor_mutex, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&sv->sv_kdoor_cv, NULL, CV_DEFAULT, NULL);
}
void
-smb_kdoor_fini(void)
+smb_kdoor_fini(smb_server_t *sv)
{
- smb_kdoor_close();
- cv_destroy(&smb_kdoor_cv);
- mutex_destroy(&smb_kdoor_mutex);
+ smb_kdoor_close(sv);
+ cv_destroy(&sv->sv_kdoor_cv);
+ mutex_destroy(&sv->sv_kdoor_mutex);
}
/*
@@ -66,22 +62,22 @@ smb_kdoor_fini(void)
* because the door-id has probably changed.
*/
int
-smb_kdoor_open(int door_id)
+smb_kdoor_open(smb_server_t *sv, int door_id)
{
int rc;
- smb_kdoor_close();
+ smb_kdoor_close(sv);
- mutex_enter(&smb_kdoor_mutex);
- smb_kdoor_ncall = 0;
+ mutex_enter(&sv->sv_kdoor_mutex);
+ sv->sv_kdoor_ncall = 0;
- if (smb_kdoor_hd == NULL) {
- smb_kdoor_id = door_id;
- smb_kdoor_hd = door_ki_lookup(door_id);
+ if (sv->sv_kdoor_hd == NULL) {
+ sv->sv_kdoor_id = door_id;
+ sv->sv_kdoor_hd = door_ki_lookup(door_id);
}
- rc = (smb_kdoor_hd == NULL) ? -1 : 0;
- mutex_exit(&smb_kdoor_mutex);
+ rc = (sv->sv_kdoor_hd == NULL) ? -1 : 0;
+ mutex_exit(&sv->sv_kdoor_mutex);
return (rc);
}
@@ -89,26 +85,28 @@ smb_kdoor_open(int door_id)
* Close the door.
*/
void
-smb_kdoor_close(void)
+smb_kdoor_close(smb_server_t *sv)
{
- mutex_enter(&smb_kdoor_mutex);
+ mutex_enter(&sv->sv_kdoor_mutex);
- if (smb_kdoor_hd != NULL) {
- while (smb_kdoor_ncall > 0)
- cv_wait(&smb_kdoor_cv, &smb_kdoor_mutex);
+ if (sv->sv_kdoor_hd != NULL) {
+ while (sv->sv_kdoor_ncall > 0)
+ cv_wait(&sv->sv_kdoor_cv, &sv->sv_kdoor_mutex);
- door_ki_rele(smb_kdoor_hd);
- smb_kdoor_hd = NULL;
+ door_ki_rele(sv->sv_kdoor_hd);
+ sv->sv_kdoor_hd = NULL;
+ sv->sv_kdoor_id = -1;
}
- mutex_exit(&smb_kdoor_mutex);
+ mutex_exit(&sv->sv_kdoor_mutex);
}
/*
* Wrapper to handle door call reference counting.
*/
int
-smb_kdoor_upcall(uint32_t cmd, void *req_data, xdrproc_t req_xdr,
+smb_kdoor_upcall(smb_server_t *sv, uint32_t cmd,
+ void *req_data, xdrproc_t req_xdr,
void *rsp_data, xdrproc_t rsp_xdr)
{
smb_doorarg_t da;
@@ -132,35 +130,35 @@ smb_kdoor_upcall(uint32_t cmd, void *req_data, xdrproc_t req_xdr,
if (rsp_data != NULL && rsp_xdr != NULL)
da.da_flags = SMB_DF_ASYNC;
- if ((da.da_event = smb_event_create(SMB_EVENT_TIMEOUT)) == NULL)
+ if ((da.da_event = smb_event_create(sv, SMB_EVENT_TIMEOUT)) == NULL)
return (-1);
- mutex_enter(&smb_kdoor_mutex);
+ mutex_enter(&sv->sv_kdoor_mutex);
- if (smb_kdoor_hd == NULL) {
- mutex_exit(&smb_kdoor_mutex);
+ if (sv->sv_kdoor_hd == NULL) {
+ mutex_exit(&sv->sv_kdoor_mutex);
- if (smb_kdoor_open(smb_kdoor_id) != 0) {
+ if (smb_kdoor_open(sv, sv->sv_kdoor_id) != 0) {
smb_event_destroy(da.da_event);
return (-1);
}
- mutex_enter(&smb_kdoor_mutex);
+ mutex_enter(&sv->sv_kdoor_mutex);
}
- ++smb_kdoor_ncall;
- mutex_exit(&smb_kdoor_mutex);
+ sv->sv_kdoor_ncall++;
+ mutex_exit(&sv->sv_kdoor_mutex);
if (da.da_flags & SMB_DF_ASYNC) {
- if ((rc = smb_kdoor_send(&da)) == 0) {
+ if ((rc = smb_kdoor_send(sv, &da)) == 0) {
if (smb_event_wait(da.da_event) != 0)
rc = -1;
else
- rc = smb_kdoor_receive(&da);
+ rc = smb_kdoor_receive(sv, &da);
}
} else {
if ((rc = smb_kdoor_encode(&da)) == 0) {
- if ((rc = smb_kdoor_upcall_private(&da)) == 0)
+ if ((rc = smb_kdoor_upcall_private(sv, &da)) == 0)
rc = smb_kdoor_decode(&da);
}
smb_kdoor_free(&da.da_arg);
@@ -168,10 +166,10 @@ smb_kdoor_upcall(uint32_t cmd, void *req_data, xdrproc_t req_xdr,
smb_event_destroy(da.da_event);
- mutex_enter(&smb_kdoor_mutex);
- if ((--smb_kdoor_ncall) == 0)
- cv_signal(&smb_kdoor_cv);
- mutex_exit(&smb_kdoor_mutex);
+ mutex_enter(&sv->sv_kdoor_mutex);
+ if ((--sv->sv_kdoor_ncall) == 0)
+ cv_signal(&sv->sv_kdoor_cv);
+ mutex_exit(&sv->sv_kdoor_mutex);
return (rc);
}
@@ -179,7 +177,7 @@ smb_kdoor_upcall(uint32_t cmd, void *req_data, xdrproc_t req_xdr,
* Send the request half of the consumer's door call.
*/
static int
-smb_kdoor_send(smb_doorarg_t *outer_da)
+smb_kdoor_send(smb_server_t *sv, smb_doorarg_t *outer_da)
{
smb_doorarg_t da;
int rc;
@@ -191,7 +189,7 @@ smb_kdoor_send(smb_doorarg_t *outer_da)
if (smb_kdoor_encode(&da) != 0)
return (-1);
- if ((rc = smb_kdoor_upcall_private(&da)) == 0)
+ if ((rc = smb_kdoor_upcall_private(sv, &da)) == 0)
rc = smb_kdoor_decode(&da);
smb_kdoor_free(&da.da_arg);
@@ -202,7 +200,7 @@ smb_kdoor_send(smb_doorarg_t *outer_da)
* Get the response half for the consumer's door call.
*/
static int
-smb_kdoor_receive(smb_doorarg_t *outer_da)
+smb_kdoor_receive(smb_server_t *sv, smb_doorarg_t *outer_da)
{
smb_doorarg_t da;
int rc;
@@ -217,7 +215,7 @@ smb_kdoor_receive(smb_doorarg_t *outer_da)
if (smb_kdoor_encode(&da) != 0)
return (-1);
- if ((rc = smb_kdoor_upcall_private(&da)) == 0)
+ if ((rc = smb_kdoor_upcall_private(sv, &da)) == 0)
rc = smb_kdoor_decode(&da);
smb_kdoor_free(&da.da_arg);
@@ -230,7 +228,7 @@ smb_kdoor_receive(smb_doorarg_t *outer_da)
* this call, response data must be referenced via rbuf and rsize.
*/
static int
-smb_kdoor_upcall_private(smb_doorarg_t *da)
+smb_kdoor_upcall_private(smb_server_t *sv, smb_doorarg_t *da)
{
door_arg_t door_arg;
int i;
@@ -239,10 +237,10 @@ smb_kdoor_upcall_private(smb_doorarg_t *da)
bcopy(&da->da_arg, &door_arg, sizeof (door_arg_t));
for (i = 0; i < SMB_DOOR_CALL_RETRIES; ++i) {
- if (smb_server_is_stopping())
+ if (smb_server_is_stopping(sv))
return (-1);
- if ((rc = door_ki_upcall_limited(smb_kdoor_hd, &door_arg,
+ if ((rc = door_ki_upcall_limited(sv->sv_kdoor_hd, &door_arg,
NULL, SIZE_MAX, 0)) == 0)
break;
@@ -372,7 +370,15 @@ smb_kdoor_chkhdr(smb_doorarg_t *da, smb_doorhdr_t *hdr)
return (B_FALSE);
}
- if (hdr->dh_door_rc != SMB_DOP_SUCCESS) {
+ switch (hdr->dh_door_rc) {
+ case SMB_DOP_SUCCESS:
+ break;
+
+ /* SMB_DOP_EMPTYBUF is a "normal" error (silent). */
+ case SMB_DOP_EMPTYBUF:
+ return (B_FALSE);
+
+ default:
cmn_err(CE_WARN, "smb_kdoor_chkhdr[%s]: call failed: %u",
da->da_opname, hdr->dh_door_rc);
return (B_FALSE);
diff --git a/usr/src/uts/common/fs/smbsrv/smb_kshare.c b/usr/src/uts/common/fs/smbsrv/smb_kshare.c
index a3fe65a424..68a2e8587c 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_kshare.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_kshare.c
@@ -33,7 +33,9 @@ typedef struct smb_unshare {
char us_sharename[MAXNAMELEN];
} smb_unshare_t;
-static smb_export_t smb_export;
+static kmem_cache_t *smb_kshare_cache_share;
+static kmem_cache_t *smb_kshare_cache_unexport;
+kmem_cache_t *smb_kshare_cache_vfs;
static int smb_kshare_cmp(const void *, const void *);
static void smb_kshare_hold(const void *);
@@ -45,25 +47,22 @@ static boolean_t smb_kshare_is_admin(const char *);
static smb_kshare_t *smb_kshare_decode(nvlist_t *);
static uint32_t smb_kshare_decode_bool(nvlist_t *, const char *, uint32_t);
static void smb_kshare_unexport_thread(smb_thread_t *, void *);
-static int smb_kshare_export(smb_kshare_t *);
-static int smb_kshare_unexport(const char *);
-static int smb_kshare_export_trans(char *, char *, char *);
+static int smb_kshare_export(smb_server_t *, smb_kshare_t *);
+static int smb_kshare_unexport(smb_server_t *, const char *);
+static int smb_kshare_export_trans(smb_server_t *, char *, char *, char *);
static void smb_kshare_csc_flags(smb_kshare_t *, const char *);
-static boolean_t smb_export_isready(void);
+static boolean_t smb_export_isready(smb_server_t *);
static int smb_kshare_chk_dsrv_status(int, smb_dr_ctx_t *);
-static smb_avl_nops_t smb_kshare_avlops = {
+static const smb_avl_nops_t smb_kshare_avlops = {
smb_kshare_cmp,
smb_kshare_hold,
smb_kshare_rele,
smb_kshare_destroy
};
-extern int smb_server_lookup(smb_server_t **);
-extern void smb_server_release(smb_server_t *);
-
/*
* This function is not MultiThread safe. The caller has to make sure only one
* thread calls this function.
@@ -183,11 +182,11 @@ smb_kshare_upcall(door_handle_t dhdl, void *arg, boolean_t add_share)
* Executes map and unmap command for shares.
*/
int
-smb_kshare_exec(smb_shr_execinfo_t *execinfo)
+smb_kshare_exec(smb_server_t *sv, smb_shr_execinfo_t *execinfo)
{
int exec_rc = 0;
- (void) smb_kdoor_upcall(SMB_DR_SHR_EXEC,
+ (void) smb_kdoor_upcall(sv, SMB_DR_SHR_EXEC,
execinfo, smb_shr_execinfo_xdr, &exec_rc, xdr_int);
return (exec_rc);
@@ -198,9 +197,10 @@ smb_kshare_exec(smb_shr_execinfo_t *execinfo)
* share for the given host (ipaddr) by calling smbd
*/
uint32_t
-smb_kshare_hostaccess(smb_kshare_t *shr, smb_inaddr_t *ipaddr)
+smb_kshare_hostaccess(smb_kshare_t *shr, smb_session_t *session)
{
smb_shr_hostaccess_query_t req;
+ smb_inaddr_t *ipaddr = &session->ipaddr;
uint32_t host_access = SMB_SHRF_ACC_OPEN;
uint32_t flag = SMB_SHRF_ACC_OPEN;
uint32_t access;
@@ -226,7 +226,7 @@ smb_kshare_hostaccess(smb_kshare_t *shr, smb_inaddr_t *ipaddr)
req.shq_flag = flag;
req.shq_ipaddr = *ipaddr;
- (void) smb_kdoor_upcall(SMB_DR_SHR_HOSTACCESS,
+ (void) smb_kdoor_upcall(session->s_server, SMB_DR_SHR_HOSTACCESS,
&req, smb_shr_hostaccess_query_xdr, &host_access, xdr_uint32_t);
switch (host_access) {
@@ -251,23 +251,23 @@ smb_kshare_hostaccess(smb_kshare_t *shr, smb_inaddr_t *ipaddr)
* exporting SMB shares
*/
void
-smb_export_start(void)
+smb_export_start(smb_server_t *sv)
{
- mutex_enter(&smb_export.e_mutex);
- if (smb_export.e_ready) {
- mutex_exit(&smb_export.e_mutex);
+ mutex_enter(&sv->sv_export.e_mutex);
+ if (sv->sv_export.e_ready) {
+ mutex_exit(&sv->sv_export.e_mutex);
return;
}
- smb_export.e_ready = B_TRUE;
- mutex_exit(&smb_export.e_mutex);
+ sv->sv_export.e_ready = B_TRUE;
+ mutex_exit(&sv->sv_export.e_mutex);
- smb_avl_create(&smb_export.e_share_avl, sizeof (smb_kshare_t),
+ smb_avl_create(&sv->sv_export.e_share_avl, sizeof (smb_kshare_t),
offsetof(smb_kshare_t, shr_link), &smb_kshare_avlops);
- (void) smb_kshare_export_trans("IPC$", "IPC$", "Remote IPC");
- (void) smb_kshare_export_trans("c$", SMB_CVOL, "Default Share");
- (void) smb_kshare_export_trans("vss$", SMB_VSS, "VSS");
+ (void) smb_kshare_export_trans(sv, "IPC$", "IPC$", "Remote IPC");
+ (void) smb_kshare_export_trans(sv, "c$", SMB_CVOL, "Default Share");
+ (void) smb_kshare_export_trans(sv, "vss$", SMB_VSS, "VSS");
}
/*
@@ -276,70 +276,83 @@ smb_export_start(void)
* available to clients
*/
void
-smb_export_stop(void)
+smb_export_stop(smb_server_t *sv)
{
- mutex_enter(&smb_export.e_mutex);
- if (!smb_export.e_ready) {
- mutex_exit(&smb_export.e_mutex);
+ mutex_enter(&sv->sv_export.e_mutex);
+ if (!sv->sv_export.e_ready) {
+ mutex_exit(&sv->sv_export.e_mutex);
return;
}
- smb_export.e_ready = B_FALSE;
- mutex_exit(&smb_export.e_mutex);
+ sv->sv_export.e_ready = B_FALSE;
+ mutex_exit(&sv->sv_export.e_mutex);
- smb_avl_destroy(&smb_export.e_share_avl);
- smb_vfs_rele_all(&smb_export);
+ smb_avl_destroy(&sv->sv_export.e_share_avl);
+ smb_vfs_rele_all(&sv->sv_export);
}
-int
-smb_kshare_init(void)
+void
+smb_kshare_g_init(void)
{
- int rc;
-
- smb_export.e_cache_share = kmem_cache_create("smb_share_cache",
+ smb_kshare_cache_share = kmem_cache_create("smb_share_cache",
sizeof (smb_kshare_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- smb_export.e_cache_unexport = kmem_cache_create("smb_unexport_cache",
+ smb_kshare_cache_unexport = kmem_cache_create("smb_unexport_cache",
sizeof (smb_unshare_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- smb_export.e_cache_vfs = kmem_cache_create("smb_vfs_cache",
+ smb_kshare_cache_vfs = kmem_cache_create("smb_vfs_cache",
sizeof (smb_vfs_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+}
- smb_llist_constructor(&smb_export.e_vfs_list, sizeof (smb_vfs_t),
+void
+smb_kshare_init(smb_server_t *sv)
+{
+
+ smb_llist_constructor(&sv->sv_export.e_vfs_list, sizeof (smb_vfs_t),
offsetof(smb_vfs_t, sv_lnd));
- smb_slist_constructor(&smb_export.e_unexport_list,
+ smb_slist_constructor(&sv->sv_export.e_unexport_list,
sizeof (smb_unshare_t), offsetof(smb_unshare_t, us_lnd));
+}
- smb_thread_init(&smb_export.e_unexport_thread, "smb_thread_unexport",
- smb_kshare_unexport_thread, NULL, smbsrv_base_pri);
+int
+smb_kshare_start(smb_server_t *sv)
+{
+ smb_thread_init(&sv->sv_export.e_unexport_thread, "smb_thread_unexport",
+ smb_kshare_unexport_thread, sv, smbsrv_base_pri);
- if ((rc = smb_thread_start(&smb_export.e_unexport_thread)) != 0)
- return (rc);
+ return (smb_thread_start(&sv->sv_export.e_unexport_thread));
+}
- return (0);
+void
+smb_kshare_stop(smb_server_t *sv)
+{
+ smb_thread_stop(&sv->sv_export.e_unexport_thread);
+ smb_thread_destroy(&sv->sv_export.e_unexport_thread);
}
void
-smb_kshare_fini(void)
+smb_kshare_fini(smb_server_t *sv)
{
smb_unshare_t *ux;
- smb_thread_stop(&smb_export.e_unexport_thread);
- smb_thread_destroy(&smb_export.e_unexport_thread);
-
- while ((ux = list_head(&smb_export.e_unexport_list.sl_list)) != NULL) {
- smb_slist_remove(&smb_export.e_unexport_list, ux);
- kmem_cache_free(smb_export.e_cache_unexport, ux);
+ while ((ux = list_head(&sv->sv_export.e_unexport_list.sl_list))
+ != NULL) {
+ smb_slist_remove(&sv->sv_export.e_unexport_list, ux);
+ kmem_cache_free(smb_kshare_cache_unexport, ux);
}
- smb_slist_destructor(&smb_export.e_unexport_list);
+ smb_slist_destructor(&sv->sv_export.e_unexport_list);
- smb_vfs_rele_all(&smb_export);
+ smb_vfs_rele_all(&sv->sv_export);
- smb_llist_destructor(&smb_export.e_vfs_list);
+ smb_llist_destructor(&sv->sv_export.e_vfs_list);
+}
- kmem_cache_destroy(smb_export.e_cache_unexport);
- kmem_cache_destroy(smb_export.e_cache_share);
- kmem_cache_destroy(smb_export.e_cache_vfs);
+void
+smb_kshare_g_fini(void)
+{
+ kmem_cache_destroy(smb_kshare_cache_unexport);
+ kmem_cache_destroy(smb_kshare_cache_share);
+ kmem_cache_destroy(smb_kshare_cache_vfs);
}
/*
@@ -351,22 +364,24 @@ smb_kshare_fini(void)
int
smb_kshare_export_list(smb_ioc_share_t *ioc)
{
+ smb_server_t *sv = NULL;
nvlist_t *shrlist = NULL;
nvlist_t *share;
nvpair_t *nvp;
smb_kshare_t *shr;
char *shrname;
- int rc = 0;
- smb_server_t *sv = NULL;
-
- if (!smb_export_isready())
- return (ENOTACTIVE);
+ int rc;
if ((rc = smb_server_lookup(&sv)) != 0)
return (rc);
- if ((rc = nvlist_unpack(ioc->shr, ioc->shrlen, &shrlist, KM_SLEEP))
- != 0)
+ if (!smb_export_isready(sv)) {
+ rc = ENOTACTIVE;
+ goto out;
+ }
+
+ rc = nvlist_unpack(ioc->shr, ioc->shrlen, &shrlist, KM_SLEEP);
+ if (rc != 0)
goto out;
for (nvp = nvlist_next_nvpair(shrlist, NULL); nvp != NULL;
@@ -399,7 +414,7 @@ smb_kshare_export_list(smb_ioc_share_t *ioc)
}
/* smb_kshare_export consumes shr so it's not leaked */
- if ((rc = smb_kshare_export(shr)) != 0) {
+ if ((rc = smb_kshare_export(sv, shr)) != 0) {
smb_kshare_destroy(shr);
continue;
}
@@ -432,16 +447,20 @@ out:
int
smb_kshare_unexport_list(smb_ioc_share_t *ioc)
{
+ smb_server_t *sv = NULL;
smb_unshare_t *ux;
- nvlist_t *shrlist;
+ nvlist_t *shrlist = NULL;
nvpair_t *nvp;
boolean_t unexport = B_FALSE;
char *shrname;
int rc;
- if ((rc = nvlist_unpack(ioc->shr, ioc->shrlen, &shrlist, 0)) != 0)
+ if ((rc = smb_server_lookup(&sv)) != 0)
return (rc);
+ if ((rc = nvlist_unpack(ioc->shr, ioc->shrlen, &shrlist, 0)) != 0)
+ goto out;
+
for (nvp = nvlist_next_nvpair(shrlist, NULL); nvp != NULL;
nvp = nvlist_next_nvpair(shrlist, nvp)) {
if (nvpair_type(nvp) != DATA_TYPE_NVLIST)
@@ -450,22 +469,25 @@ smb_kshare_unexport_list(smb_ioc_share_t *ioc)
shrname = nvpair_name(nvp);
ASSERT(shrname);
- if ((rc = smb_kshare_unexport(shrname)) != 0)
+ if ((rc = smb_kshare_unexport(sv, shrname)) != 0)
continue;
- ux = kmem_cache_alloc(smb_export.e_cache_unexport, KM_SLEEP);
+ ux = kmem_cache_alloc(smb_kshare_cache_unexport, KM_SLEEP);
(void) strlcpy(ux->us_sharename, shrname, MAXNAMELEN);
- smb_slist_insert_tail(&smb_export.e_unexport_list, ux);
+ smb_slist_insert_tail(&sv->sv_export.e_unexport_list, ux);
unexport = B_TRUE;
}
- nvlist_free(shrlist);
-
if (unexport)
- smb_thread_signal(&smb_export.e_unexport_thread);
+ smb_thread_signal(&sv->sv_export.e_unexport_thread);
+ rc = 0;
- return (0);
+out:
+ if (shrlist != NULL)
+ nvlist_free(shrlist);
+ smb_server_release(sv);
+ return (rc);
}
/*
@@ -493,7 +515,7 @@ smb_kshare_info(smb_ioc_shareinfo_t *ioc)
* encoded in one round without unnecessarily complicating the code.
*/
void
-smb_kshare_enum(smb_enumshare_info_t *esi)
+smb_kshare_enum(smb_server_t *sv, smb_enumshare_info_t *esi)
{
smb_avl_t *share_avl;
smb_avl_cursor_t cursor;
@@ -508,7 +530,7 @@ smb_kshare_enum(smb_enumshare_info_t *esi)
smb_msgbuf_t cmnt_mb;
boolean_t autohome_added = B_FALSE;
- if (!smb_export_isready()) {
+ if (!smb_export_isready(sv)) {
esi->es_ntotal = esi->es_nsent = 0;
esi->es_datasize = 0;
return;
@@ -516,7 +538,7 @@ smb_kshare_enum(smb_enumshare_info_t *esi)
esi->es_ntotal = esi->es_nsent = 0;
remained = esi->es_bufsize;
- share_avl = &smb_export.e_share_avl;
+ share_avl = &sv->sv_export.e_share_avl;
/* Do the necessary calculations in the first round */
smb_avl_iterinit(share_avl, &cursor);
@@ -609,18 +631,18 @@ smb_kshare_enum(smb_enumshare_info_t *esi)
* smb_kshare_release().
*/
smb_kshare_t *
-smb_kshare_lookup(const char *shrname)
+smb_kshare_lookup(smb_server_t *sv, const char *shrname)
{
smb_kshare_t key;
smb_kshare_t *shr;
ASSERT(shrname);
- if (!smb_export_isready())
+ if (!smb_export_isready(sv))
return (NULL);
key.shr_name = (char *)shrname;
- shr = smb_avl_lookup(&smb_export.e_share_avl, &key);
+ shr = smb_avl_lookup(&sv->sv_export.e_share_avl, &key);
return (shr);
}
@@ -628,12 +650,12 @@ smb_kshare_lookup(const char *shrname)
* Releases the hold taken on the specified share object
*/
void
-smb_kshare_release(smb_kshare_t *shr)
+smb_kshare_release(smb_server_t *sv, smb_kshare_t *shr)
{
ASSERT(shr);
ASSERT(shr->shr_magic == SMB_SHARE_MAGIC);
- smb_avl_release(&smb_export.e_share_avl, shr);
+ smb_avl_release(&sv->sv_export.e_share_avl, shr);
}
/*
@@ -648,14 +670,14 @@ smb_kshare_release(smb_kshare_t *shr)
* that share is incremented.
*/
static int
-smb_kshare_export(smb_kshare_t *shr)
+smb_kshare_export(smb_server_t *sv, smb_kshare_t *shr)
{
smb_avl_t *share_avl;
smb_kshare_t *auto_shr;
vnode_t *vp;
int rc = 0;
- share_avl = &smb_export.e_share_avl;
+ share_avl = &sv->sv_export.e_share_avl;
if (!STYPE_ISDSK(shr->shr_type)) {
if ((rc = smb_avl_add(share_avl, shr)) != 0) {
@@ -679,17 +701,17 @@ smb_kshare_export(smb_kshare_t *shr)
return (0);
}
- if ((rc = smb_server_sharevp(shr->shr_path, &vp)) != 0) {
+ if ((rc = smb_server_sharevp(sv, shr->shr_path, &vp)) != 0) {
cmn_err(CE_WARN, "export[%s(%s)]: failed obtaining vnode (%d)",
shr->shr_name, shr->shr_path, rc);
return (rc);
}
- if ((rc = smb_vfs_hold(&smb_export, vp->v_vfsp)) == 0) {
+ if ((rc = smb_vfs_hold(&sv->sv_export, vp->v_vfsp)) == 0) {
if ((rc = smb_avl_add(share_avl, shr)) != 0) {
cmn_err(CE_WARN, "export[%s]: failed caching (%d)",
shr->shr_name, rc);
- smb_vfs_rele(&smb_export, vp->v_vfsp);
+ smb_vfs_rele(&sv->sv_export, vp->v_vfsp);
}
} else {
cmn_err(CE_WARN, "export[%s(%s)]: failed holding VFS (%d)",
@@ -713,7 +735,7 @@ smb_kshare_export(smb_kshare_t *shr)
* the AVL tree.
*/
static int
-smb_kshare_unexport(const char *shrname)
+smb_kshare_unexport(smb_server_t *sv, const char *shrname)
{
smb_avl_t *share_avl;
smb_kshare_t key;
@@ -722,7 +744,7 @@ smb_kshare_unexport(const char *shrname)
int rc;
boolean_t auto_unexport;
- share_avl = &smb_export.e_share_avl;
+ share_avl = &sv->sv_export.e_share_avl;
key.shr_name = (char *)shrname;
if ((shr = smb_avl_lookup(share_avl, &key)) == NULL)
@@ -740,14 +762,14 @@ smb_kshare_unexport(const char *shrname)
}
if (STYPE_ISDSK(shr->shr_type)) {
- if ((rc = smb_server_sharevp(shr->shr_path, &vp)) != 0) {
+ if ((rc = smb_server_sharevp(sv, shr->shr_path, &vp)) != 0) {
smb_avl_release(share_avl, shr);
cmn_err(CE_WARN, "unexport[%s]: failed obtaining vnode"
" (%d)", shrname, rc);
return (rc);
}
- smb_vfs_rele(&smb_export, vp->v_vfsp);
+ smb_vfs_rele(&sv->sv_export, vp->v_vfsp);
VN_RELE(vp);
}
@@ -761,18 +783,17 @@ smb_kshare_unexport(const char *shrname)
* Exports IPC$ or Admin shares
*/
static int
-smb_kshare_export_trans(char *name, char *path, char *cmnt)
+smb_kshare_export_trans(smb_server_t *sv, char *name, char *path, char *cmnt)
{
smb_kshare_t *shr;
ASSERT(name);
ASSERT(path);
- shr = kmem_cache_alloc(smb_export.e_cache_share, KM_SLEEP);
+ shr = kmem_cache_alloc(smb_kshare_cache_share, KM_SLEEP);
bzero(shr, sizeof (smb_kshare_t));
shr->shr_magic = SMB_SHARE_MAGIC;
- shr->shr_cache = smb_export.e_cache_share;
shr->shr_refcnt = 1;
shr->shr_flags = SMB_SHRF_TRANS | smb_kshare_is_admin(shr->shr_name);
if (strcasecmp(name, "IPC$") == 0)
@@ -789,7 +810,7 @@ smb_kshare_export_trans(char *name, char *path, char *cmnt)
shr->shr_cmnt = smb_mem_strdup(cmnt);
shr->shr_oemname = smb_kshare_oemname(name);
- return (smb_kshare_export(shr));
+ return (smb_kshare_export(sv, shr));
}
/*
@@ -861,11 +882,10 @@ smb_kshare_decode(nvlist_t *share)
(void) nvlist_lookup_string(smb, SHOPT_CSC, &csc_name);
smb_kshare_csc_flags(&tmp, csc_name);
- shr = kmem_cache_alloc(smb_export.e_cache_share, KM_SLEEP);
+ shr = kmem_cache_alloc(smb_kshare_cache_share, KM_SLEEP);
bzero(shr, sizeof (smb_kshare_t));
shr->shr_magic = SMB_SHARE_MAGIC;
- shr->shr_cache = smb_export.e_cache_share;
shr->shr_refcnt = 1;
shr->shr_name = smb_mem_strdup(tmp.shr_name);
@@ -999,7 +1019,7 @@ smb_kshare_destroy(void *p)
smb_mem_free(shr->shr_access_ro);
smb_mem_free(shr->shr_access_rw);
- kmem_cache_free(shr->shr_cache, shr);
+ kmem_cache_free(smb_kshare_cache_share, shr);
}
@@ -1152,26 +1172,27 @@ smb_kshare_csc_flags(smb_kshare_t *shr, const char *value)
static void
smb_kshare_unexport_thread(smb_thread_t *thread, void *arg)
{
+ smb_server_t *sv = arg;
smb_unshare_t *ux;
while (smb_thread_continue(thread)) {
- while ((ux = list_head(&smb_export.e_unexport_list.sl_list))
+ while ((ux = list_head(&sv->sv_export.e_unexport_list.sl_list))
!= NULL) {
- smb_slist_remove(&smb_export.e_unexport_list, ux);
+ smb_slist_remove(&sv->sv_export.e_unexport_list, ux);
(void) smb_server_unshare(ux->us_sharename);
- kmem_cache_free(smb_export.e_cache_unexport, ux);
+ kmem_cache_free(smb_kshare_cache_unexport, ux);
}
}
}
static boolean_t
-smb_export_isready(void)
+smb_export_isready(smb_server_t *sv)
{
boolean_t ready;
- mutex_enter(&smb_export.e_mutex);
- ready = smb_export.e_ready;
- mutex_exit(&smb_export.e_mutex);
+ mutex_enter(&sv->sv_export.e_mutex);
+ ready = sv->sv_export.e_ready;
+ mutex_exit(&sv->sv_export.e_mutex);
return (ready);
}
diff --git a/usr/src/uts/common/fs/smbsrv/smb_kutil.c b/usr/src/uts/common/fs/smbsrv/smb_kutil.c
index f417ca9db4..21736cecbc 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_kutil.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_kutil.c
@@ -43,8 +43,7 @@
#include <sys/sid.h>
#include <sys/priv_names.h>
-static kmem_cache_t *smb_dtor_cache;
-static boolean_t smb_llist_initialized = B_FALSE;
+static kmem_cache_t *smb_dtor_cache = NULL;
static boolean_t smb_thread_continue_timedwait_locked(smb_thread_t *, int);
@@ -71,7 +70,7 @@ struct tm {
int tm_isdst;
};
-static int days_in_month[] = {
+static const int days_in_month[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
@@ -374,13 +373,11 @@ smb_idpool_free(
void
smb_llist_init(void)
{
- if (smb_llist_initialized)
+ if (smb_dtor_cache != NULL)
return;
smb_dtor_cache = kmem_cache_create("smb_dtor_cache",
sizeof (smb_dtor_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
-
- smb_llist_initialized = B_TRUE;
}
/*
@@ -389,11 +386,10 @@ smb_llist_init(void)
void
smb_llist_fini(void)
{
- if (!smb_llist_initialized)
- return;
-
- kmem_cache_destroy(smb_dtor_cache);
- smb_llist_initialized = B_FALSE;
+ if (smb_dtor_cache != NULL) {
+ kmem_cache_destroy(smb_dtor_cache);
+ smb_dtor_cache = NULL;
+ }
}
/*
@@ -792,7 +788,7 @@ smb_thread_entry_point(
thread->sth_state = SMB_THREAD_STATE_EXITING;
cv_broadcast(&thread->sth_cv);
mutex_exit(&thread->sth_mtx);
- thread_exit();
+ zthread_exit();
}
/*
@@ -855,8 +851,8 @@ smb_thread_start(
case SMB_THREAD_STATE_EXITED:
thread->sth_state = SMB_THREAD_STATE_STARTING;
mutex_exit(&thread->sth_mtx);
- tmpthread = thread_create(NULL, 0, smb_thread_entry_point,
- thread, 0, &p0, TS_RUN, thread->sth_pri);
+ tmpthread = zthread_create(NULL, 0, smb_thread_entry_point,
+ thread, 0, thread->sth_pri);
ASSERT(tmpthread != NULL);
mutex_enter(&thread->sth_mtx);
while (thread->sth_state == SMB_THREAD_STATE_STARTING)
@@ -1795,7 +1791,8 @@ smb_panic(char *file, const char *func, int line)
* structure using the passed args
*/
void
-smb_avl_create(smb_avl_t *avl, size_t size, size_t offset, smb_avl_nops_t *ops)
+smb_avl_create(smb_avl_t *avl, size_t size, size_t offset,
+ const smb_avl_nops_t *ops)
{
ASSERT(avl);
ASSERT(ops);
@@ -2250,14 +2247,14 @@ smb_srqueue_update(smb_srqueue_t *srq, smb_kstat_utilization_t *kd)
}
void
-smb_threshold_init(smb_cmd_threshold_t *ct, char *cmd, int threshold,
- int timeout)
+smb_threshold_init(smb_cmd_threshold_t *ct, smb_server_t *sv, char *cmd,
+ int threshold, int timeout)
{
bzero(ct, sizeof (smb_cmd_threshold_t));
mutex_init(&ct->ct_mutex, NULL, MUTEX_DEFAULT, NULL);
ct->ct_cmd = cmd;
ct->ct_threshold = threshold;
- ct->ct_event = smb_event_create(timeout);
+ ct->ct_event = smb_event_create(sv, timeout);
ct->ct_event_id = smb_event_txid(ct->ct_event);
if (smb_threshold_debug) {
diff --git a/usr/src/uts/common/fs/smbsrv/smb_lock.c b/usr/src/uts/common/fs/smbsrv/smb_lock.c
index 98df20b66d..e9cc41ae02 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_lock.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_lock.c
@@ -400,7 +400,7 @@ smb_nbl_conflict(smb_node_t *node, uint64_t off, uint64_t len, nbl_op_t op)
if (op == NBL_RENAME || op == NBL_REMOVE)
op = NBL_READWRITE;
- if (nbl_svmand(node->vp, kcred, &svmand))
+ if (nbl_svmand(node->vp, zone_kcred(), &svmand))
svmand = 1;
if (nbl_lock_conflict(node->vp, op, off, len, svmand, &smb_ct))
diff --git a/usr/src/uts/common/fs/smbsrv/smb_mangle_name.c b/usr/src/uts/common/fs/smbsrv/smb_mangle_name.c
index 72e60345e3..db19fb84c6 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_mangle_name.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_mangle_name.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
*/
@@ -38,7 +39,7 @@
* '.' is also an invalid DOS char but since it's a special
* case it doesn't appear in the list.
*/
-static char *invalid_dos_chars =
+static const char invalid_dos_chars[] =
"\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"
"\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
" \"/\\:|<>*?";
@@ -51,7 +52,7 @@ static char *invalid_dos_chars =
* But some of these chars and some other chars (e.g. +) are replaced
* with underscore (_). They are introduced here as special chars.
*/
-static char *special_chars = "[];=,+";
+static const char special_chars[] = "[];=,+";
#define isinvalid(c) (strchr(invalid_dos_chars, c) || (c & 0x80))
@@ -399,7 +400,7 @@ smb_unmangle(smb_node_t *dnode, char *name, char *namebuf,
offset = 0;
while ((err = smb_vop_readdir(vp, offset, buf, &bufsize,
- &eof, flags, kcred)) == 0) {
+ &eof, flags, zone_kcred())) == 0) {
if (bufsize == 0) {
err = ENOENT;
break;
diff --git a/usr/src/uts/common/fs/smbsrv/smb_mbuf_util.c b/usr/src/uts/common/fs/smbsrv/smb_mbuf_util.c
index 278bb7699a..99b46cd5f3 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_mbuf_util.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_mbuf_util.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -62,14 +63,13 @@
static kmem_cache_t *smb_mbc_cache = NULL;
-int
+void
smb_mbc_init(void)
{
- if (smb_mbc_cache == NULL) {
- smb_mbc_cache = kmem_cache_create(SMBSRV_KSTAT_MBC_CACHE,
- sizeof (mbuf_chain_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- }
- return (0);
+ if (smb_mbc_cache != NULL)
+ return;
+ smb_mbc_cache = kmem_cache_create(SMBSRV_KSTAT_MBC_CACHE,
+ sizeof (mbuf_chain_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
}
void
diff --git a/usr/src/uts/common/fs/smbsrv/smb_negotiate.c b/usr/src/uts/common/fs/smbsrv/smb_negotiate.c
index fc6d006582..d17fdcf00d 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_negotiate.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_negotiate.c
@@ -193,7 +193,7 @@
#include <smbsrv/smb_kproto.h>
#include <smbsrv/smbinfo.h>
-static smb_xlate_t smb_dialect[] = {
+static const smb_xlate_t smb_dialect[] = {
{ DIALECT_UNKNOWN, "DIALECT_UNKNOWN" },
{ PC_NETWORK_PROGRAM_1_0, "PC NETWORK PROGRAM 1.0" },
{ PCLAN1_0, "PCLAN1.0" },
@@ -486,7 +486,7 @@ smb_com_negotiate(smb_request_t *sr)
static int
smb_xlate_dialect(const char *dialect)
{
- smb_xlate_t *dp;
+ const smb_xlate_t *dp;
int i;
for (i = 0; i < sizeof (smb_dialect) / sizeof (smb_dialect[0]); ++i) {
diff --git a/usr/src/uts/common/fs/smbsrv/smb_net.c b/usr/src/uts/common/fs/smbsrv/smb_net.c
index ef41d911db..d112688a45 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_net.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_net.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -57,18 +58,15 @@ static kmem_cache_t *smb_txr_cache = NULL;
* 0 Initialization successful
* ENOMEM Initialization failed
*/
-int
+void
smb_net_init(void)
{
- int rc = 0;
- ASSERT(smb_txr_cache == NULL);
+ if (smb_txr_cache != NULL)
+ return;
smb_txr_cache = kmem_cache_create(SMBSRV_KSTAT_TXRCACHE,
sizeof (smb_txreq_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- if (smb_txr_cache == NULL)
- rc = ENOMEM;
- return (rc);
}
/*
diff --git a/usr/src/uts/common/fs/smbsrv/smb_node.c b/usr/src/uts/common/fs/smbsrv/smb_node.c
index a42886e23e..8063d63887 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_node.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_node.c
@@ -119,8 +119,8 @@ static void smb_node_init_system(smb_node_t *);
#define SMB_ALLOCSZ(sz) (((sz) + DEV_BSIZE-1) & ~(DEV_BSIZE-1))
static kmem_cache_t *smb_node_cache = NULL;
-static boolean_t smb_node_initialized = B_FALSE;
static smb_llist_t smb_node_hash_table[SMBND_HASH_MASK+1];
+static smb_node_t *smb_root_node;
/*
* smb_node_init
@@ -130,13 +130,18 @@ static smb_llist_t smb_node_hash_table[SMBND_HASH_MASK+1];
* This function is not multi-thread safe. The caller must make sure only one
* thread makes the call.
*/
-int
+void
smb_node_init(void)
{
- int i;
+ smb_attr_t attr;
+ smb_llist_t *node_hdr;
+ smb_node_t *node;
+ uint32_t hashkey;
+ int i;
+
+ if (smb_node_cache != NULL)
+ return;
- if (smb_node_initialized)
- return (0);
smb_node_cache = kmem_cache_create(SMBSRV_KSTAT_NODE_CACHE,
sizeof (smb_node_t), 8, smb_node_constructor, smb_node_destructor,
NULL, NULL, NULL, 0);
@@ -145,8 +150,21 @@ smb_node_init(void)
smb_llist_constructor(&smb_node_hash_table[i],
sizeof (smb_node_t), offsetof(smb_node_t, n_lnd));
}
- smb_node_initialized = B_TRUE;
- return (0);
+
+ /*
+ * The node cache is shared by all zones, so the smb_root_node
+ * must represent the real (global zone) rootdir.
+ * Note intentional use of kcred here.
+ */
+ attr.sa_mask = SMB_AT_ALL;
+ VERIFY0(smb_vop_getattr(rootdir, NULL, &attr, 0, kcred));
+ node_hdr = smb_node_get_hash(&rootdir->v_vfsp->vfs_fsid, &attr,
+ &hashkey);
+ node = smb_node_alloc("/", rootdir, node_hdr, hashkey);
+ smb_llist_enter(node_hdr, RW_WRITER);
+ smb_llist_insert_head(node_hdr, node);
+ smb_llist_exit(node_hdr);
+ smb_root_node = node; /* smb_node_release in smb_node_fini */
}
/*
@@ -160,7 +178,12 @@ smb_node_fini(void)
{
int i;
- if (!smb_node_initialized)
+ if (smb_root_node != NULL) {
+ smb_node_release(smb_root_node);
+ smb_root_node = NULL;
+ }
+
+ if (smb_node_cache == NULL)
return;
#ifdef DEBUG
@@ -190,7 +213,6 @@ smb_node_fini(void)
}
kmem_cache_destroy(smb_node_cache);
smb_node_cache = NULL;
- smb_node_initialized = B_FALSE;
}
/*
@@ -248,7 +270,7 @@ smb_node_lookup(
* that's why kcred is used not the user's cred
*/
attr.sa_mask = SMB_AT_ALL;
- error = smb_vop_getattr(vp, unnamed_vp, &attr, 0, kcred);
+ error = smb_vop_getattr(vp, unnamed_vp, &attr, 0, zone_kcred());
if (error)
return (NULL);
@@ -545,33 +567,28 @@ smb_node_rename(
}
}
+/*
+ * Find/create an SMB node for the root of this zone and store it
+ * in *svrootp. Also create nodes leading to this directory.
+ */
int
-smb_node_root_init(vnode_t *vp, smb_server_t *sv, smb_node_t **root)
+smb_node_root_init(smb_server_t *sv, smb_node_t **svrootp)
{
- smb_attr_t attr;
+ zone_t *zone = curzone;
int error;
- uint32_t hashkey;
- smb_llist_t *node_hdr;
- smb_node_t *node;
-
- attr.sa_mask = SMB_AT_ALL;
- error = smb_vop_getattr(vp, NULL, &attr, 0, kcred);
- if (error) {
- VN_RELE(vp);
- return (error);
- }
- node_hdr = smb_node_get_hash(&vp->v_vfsp->vfs_fsid, &attr, &hashkey);
+ ASSERT(zone->zone_id == sv->sv_zid);
+ if (smb_root_node == NULL)
+ return (ENOENT);
- node = smb_node_alloc(ROOTVOL, vp, node_hdr, hashkey);
+ /*
+ * We're getting smb nodes below the zone root here,
+ * so need to use kcred, not zone_kcred().
+ */
+ error = smb_pathname(NULL, zone->zone_rootpath, 0,
+ smb_root_node, smb_root_node, NULL, svrootp, kcred);
- sv->si_root_smb_node = node;
- smb_node_audit(node);
- smb_llist_enter(node_hdr, RW_WRITER);
- smb_llist_insert_head(node_hdr, node);
- smb_llist_exit(node_hdr);
- *root = node;
- return (0);
+ return (error);
}
/*
@@ -597,7 +614,7 @@ smb_node_set_delete_on_close(smb_node_t *node, cred_t *cr, uint32_t flags)
bzero(&attr, sizeof (smb_attr_t));
attr.sa_mask = SMB_AT_DOSATTR;
- rc = smb_fsop_getattr(NULL, kcred, node, &attr);
+ rc = smb_fsop_getattr(NULL, zone_kcred(), node, &attr);
if ((rc != 0) || (attr.sa_dosattr & FILE_ATTRIBUTE_READONLY)) {
return (-1);
}
@@ -770,7 +787,7 @@ smb_node_fcn_subscribe(smb_node_t *node, smb_request_t *sr)
mutex_enter(&fcn->fcn_mutex);
if (fcn->fcn_count == 0)
- smb_fem_fcn_install(node);
+ (void) smb_fem_fcn_install(node);
fcn->fcn_count++;
list_insert_tail(&fcn->fcn_watchers, sr);
mutex_exit(&fcn->fcn_mutex);
@@ -966,7 +983,7 @@ smb_node_getmntpath(smb_node_t *node, char *buf, uint32_t buflen)
VN_HOLD(vp);
/* NULL is passed in as we want to start at "/" */
- err = vnodetopath(NULL, root_vp, buf, buflen, kcred);
+ err = vnodetopath(NULL, root_vp, buf, buflen, zone_kcred());
VN_RELE(vp);
VN_RELE(root_vp);
@@ -1015,6 +1032,7 @@ smb_node_getpath(smb_node_t *node, vnode_t *rootvp, char *buf, uint32_t buflen)
int rc;
vnode_t *vp;
smb_node_t *unode, *dnode;
+ cred_t *kcr = zone_kcred();
unode = (SMB_IS_STREAM(node)) ? node->n_unode : node;
dnode = (smb_node_is_dir(unode)) ? unode : unode->n_dnode;
@@ -1024,10 +1042,10 @@ smb_node_getpath(smb_node_t *node, vnode_t *rootvp, char *buf, uint32_t buflen)
VN_HOLD(vp);
if (rootvp) {
VN_HOLD(rootvp);
- rc = vnodetopath(rootvp, vp, buf, buflen, kcred);
+ rc = vnodetopath(rootvp, vp, buf, buflen, kcr);
VN_RELE(rootvp);
} else {
- rc = vnodetopath(NULL, vp, buf, buflen, kcred);
+ rc = vnodetopath(NULL, vp, buf, buflen, kcr);
}
VN_RELE(vp);
@@ -1308,7 +1326,7 @@ smb_node_file_is_readonly(smb_node_t *node)
bzero(&attr, sizeof (smb_attr_t));
attr.sa_mask = SMB_AT_DOSATTR;
- (void) smb_fsop_getattr(NULL, kcred, node, &attr);
+ (void) smb_fsop_getattr(NULL, zone_kcred(), node, &attr);
return ((attr.sa_dosattr & FILE_ATTRIBUTE_READONLY) != 0);
}
@@ -1392,10 +1410,12 @@ smb_node_setattr(smb_request_t *sr, smb_node_t *node,
* Setting the allocation size but not EOF position.
* Get the current EOF in tmp_attr and (if necessary)
* truncate to the (rounded up) allocation size.
+ * Using kcred here because if we don't have access,
+ * we want to fail at setattr below and not here.
*/
bzero(&tmp_attr, sizeof (smb_attr_t));
tmp_attr.sa_mask = SMB_AT_SIZE;
- rc = smb_fsop_getattr(NULL, kcred, node, &tmp_attr);
+ rc = smb_fsop_getattr(NULL, zone_kcred(), node, &tmp_attr);
if (rc != 0)
return (rc);
attr->sa_allocsz = SMB_ALLOCSZ(attr->sa_allocsz);
diff --git a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_ioctl.c b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_ioctl.c
index 69f5dc073e..8fe6d1dde3 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_ioctl.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_ioctl.c
@@ -42,7 +42,7 @@ static uint32_t smb_nt_trans_ioctl_set_zero_data(smb_request_t *, smb_xa_t *);
* any oplocks on the file to none:
* smb_oplock_break(sr, node, SMB_OPLOCK_BREAK_TO_NONE);
*/
-static struct {
+static const struct {
uint32_t fcode;
uint32_t (*ioctl_func)(smb_request_t *sr, smb_xa_t *xa);
} ioctl_ret_tbl[] = {
@@ -186,7 +186,7 @@ smb_nt_trans_ioctl_set_sparse(smb_request_t *sr, smb_xa_t *xa)
*/
bzero(&attr, sizeof (smb_attr_t));
attr.sa_mask = SMB_AT_DOSATTR;
- rc = smb_node_getattr(sr, of->f_node, kcred, of, &attr);
+ rc = smb_node_getattr(sr, of->f_node, zone_kcred(), of, &attr);
if (rc != 0) {
smbsr_errno(sr, rc);
smbsr_release_file(sr);
diff --git a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_quota.c b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_quota.c
index 041f05f3e3..45740dd1bb 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_quota.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_quota.c
@@ -20,6 +20,7 @@
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
@@ -48,8 +49,9 @@
#define SMB_QUOTA_EST_SIZE (SMB_QUOTA_SIZE_NO_SID + SMB_EST_SID_SIZE)
#define SMB_QUOTA_MAX_SIZE (SMB_QUOTA_SIZE_NO_SID + SMB_MAX_SID_SIZE)
-static int smb_quota_query(smb_quota_query_t *, smb_quota_response_t *);
-static int smb_quota_set(smb_quota_set_t *, uint32_t *);
+static int smb_quota_query(smb_server_t *, smb_quota_query_t *,
+ smb_quota_response_t *);
+static int smb_quota_set(smb_server_t *, smb_quota_set_t *, uint32_t *);
static uint32_t smb_quota_init_sids(smb_xa_t *, smb_quota_query_t *,
smb_ofile_t *);
static uint32_t smb_quota_decode_sids(smb_xa_t *, list_t *);
@@ -186,7 +188,7 @@ smb_nt_transact_query_quota(smb_request_t *sr, smb_xa_t *xa)
status = smb_quota_init_sids(xa, &request, ofile);
if (status == NT_STATUS_SUCCESS) {
- if (smb_quota_query(&request, &reply) != 0) {
+ if (smb_quota_query(sr->sr_server, &request, &reply) != 0) {
status = NT_STATUS_INTERNAL_ERROR;
} else {
status = reply.qr_status;
@@ -312,7 +314,7 @@ smb_nt_transact_set_quota(smb_request_t *sr, smb_xa_t *xa)
status = smb_quota_decode_quotas(xa, quota_list);
if (status == NT_STATUS_SUCCESS) {
request.qs_root_path = root_path;
- if (smb_quota_set(&request, &reply) != 0) {
+ if (smb_quota_set(sr->sr_server, &request, &reply) != 0) {
status = NT_STATUS_INTERNAL_ERROR;
} else {
status = reply;
@@ -679,7 +681,7 @@ smb_quota_query_user_quota(smb_request_t *sr, uid_t uid, smb_quota_t *quota)
request.qq_query_op = SMB_QUOTA_QUERY_SIDLIST;
request.qq_single = B_TRUE;
- if (smb_quota_query(&request, &reply) != 0) {
+ if (smb_quota_query(sr->sr_server, &request, &reply) != 0) {
status = NT_STATUS_INTERNAL_ERROR;
} else {
if (reply.qr_status != NT_STATUS_SUCCESS) {
@@ -712,11 +714,12 @@ smb_quota_query_user_quota(smb_request_t *sr, uid_t uid, smb_quota_t *quota)
* 0 - success. Status set in reply.
*/
static int
-smb_quota_query(smb_quota_query_t *request, smb_quota_response_t *reply)
+smb_quota_query(smb_server_t *sv, smb_quota_query_t *request,
+ smb_quota_response_t *reply)
{
int rc;
- rc = smb_kdoor_upcall(SMB_DR_QUOTA_QUERY,
+ rc = smb_kdoor_upcall(sv, SMB_DR_QUOTA_QUERY,
request, smb_quota_query_xdr, reply, smb_quota_response_xdr);
return (rc);
@@ -730,11 +733,11 @@ smb_quota_query(smb_quota_query_t *request, smb_quota_response_t *reply)
* 0 - success. Status set in reply.
*/
static int
-smb_quota_set(smb_quota_set_t *request, uint32_t *reply)
+smb_quota_set(smb_server_t *sv, smb_quota_set_t *request, uint32_t *reply)
{
int rc;
- rc = smb_kdoor_upcall(SMB_DR_QUOTA_SET,
+ rc = smb_kdoor_upcall(sv, SMB_DR_QUOTA_SET,
request, smb_quota_set_xdr, reply, xdr_uint32_t);
return (rc);
diff --git a/usr/src/uts/common/fs/smbsrv/smb_odir.c b/usr/src/uts/common/fs/smbsrv/smb_odir.c
index 16fffa6692..8d246ae3c6 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_odir.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_odir.c
@@ -353,7 +353,7 @@ smb_odir_openat(smb_request_t *sr, smb_node_t *unode)
ERRDOS, ERROR_ACCESS_DENIED);
return (0);
}
- cr = kcred;
+ cr = zone_kcred();
/* find the xattrdir vnode */
rc = smb_vop_lookup_xattrdir(unode->vp, &xattr_dvp, LOOKUP_XATTR, cr);
@@ -878,7 +878,7 @@ smb_odir_create(smb_request_t *sr, smb_node_t *dnode,
return (0);
}
- od = kmem_cache_alloc(tree->t_server->si_cache_odir, KM_SLEEP);
+ od = kmem_cache_alloc(smb_cache_odir, KM_SLEEP);
bzero(od, sizeof (smb_odir_t));
mutex_init(&od->d_mutex, NULL, MUTEX_DEFAULT, NULL);
@@ -955,7 +955,7 @@ smb_odir_delete(void *arg)
smb_node_release(od->d_dnode);
smb_user_release(od->d_user);
mutex_destroy(&od->d_mutex);
- kmem_cache_free(od->d_tree->t_server->si_cache_odir, od);
+ kmem_cache_free(smb_cache_odir, od);
}
/*
@@ -1134,7 +1134,7 @@ smb_odir_single_fileinfo(smb_request_t *sr, smb_odir_t *od,
bzero(&attr, sizeof (attr));
attr.sa_mask = SMB_AT_ALL;
- rc = smb_node_getattr(sr, fnode, kcred, NULL, &attr);
+ rc = smb_node_getattr(sr, fnode, zone_kcred(), NULL, &attr);
if (rc != 0) {
smb_node_release(fnode);
return (rc);
@@ -1147,7 +1147,7 @@ smb_odir_single_fileinfo(smb_request_t *sr, smb_odir_t *od,
smb_node_release(fnode);
fnode = tgt_node;
attr.sa_mask = SMB_AT_ALL;
- rc = smb_node_getattr(sr, fnode, kcred, NULL, &attr);
+ rc = smb_node_getattr(sr, fnode, zone_kcred(), NULL, &attr);
if (rc != 0) {
smb_node_release(fnode);
return (rc);
@@ -1249,7 +1249,7 @@ smb_odir_wildcard_fileinfo(smb_request_t *sr, smb_odir_t *od,
bzero(&attr, sizeof (attr));
attr.sa_mask = SMB_AT_ALL;
- rc = smb_node_getattr(sr, fnode, kcred, NULL, &attr);
+ rc = smb_node_getattr(sr, fnode, zone_kcred(), NULL, &attr);
if (rc != 0) {
smb_node_release(fnode);
return (rc);
diff --git a/usr/src/uts/common/fs/smbsrv/smb_ofile.c b/usr/src/uts/common/fs/smbsrv/smb_ofile.c
index ee45f13c8b..41515ee392 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_ofile.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_ofile.c
@@ -199,7 +199,7 @@ smb_ofile_open(
}
state = FIDALLOC;
- of = kmem_cache_alloc(tree->t_server->si_cache_ofile, KM_SLEEP);
+ of = kmem_cache_alloc(smb_cache_ofile, KM_SLEEP);
bzero(of, sizeof (smb_ofile_t));
of->f_magic = SMB_OFILE_MAGIC;
of->f_refcnt = 1;
@@ -300,7 +300,7 @@ errout:
case CRHELD:
crfree(of->f_cr);
of->f_magic = 0;
- kmem_cache_free(tree->t_server->si_cache_ofile, of);
+ kmem_cache_free(smb_cache_ofile, of);
/*FALLTHROUGH*/
case FIDALLOC:
smb_idpool_free(&tree->t_fid_pool, fid);
@@ -797,7 +797,7 @@ smb_ofile_seek(
case SMB_SEEK_END:
bzero(&attr, sizeof (smb_attr_t));
attr.sa_mask |= SMB_AT_SIZE;
- rc = smb_fsop_getattr(NULL, kcred, of->f_node, &attr);
+ rc = smb_fsop_getattr(NULL, zone_kcred(), of->f_node, &attr);
if (rc != 0) {
mutex_exit(&of->f_mutex);
return (rc);
@@ -955,7 +955,7 @@ smb_ofile_delete(void *arg)
mutex_destroy(&of->f_mutex);
crfree(of->f_cr);
smb_user_release(of->f_user);
- kmem_cache_free(of->f_tree->t_server->si_cache_ofile, of);
+ kmem_cache_free(smb_cache_ofile, of);
}
/*
@@ -968,7 +968,7 @@ uint32_t
smb_ofile_access(smb_ofile_t *of, cred_t *cr, uint32_t access)
{
- if ((of == NULL) || (cr == kcred))
+ if ((of == NULL) || (cr == zone_kcred()))
return (NT_STATUS_SUCCESS);
/*
diff --git a/usr/src/uts/common/fs/smbsrv/smb_opipe.c b/usr/src/uts/common/fs/smbsrv/smb_opipe.c
index 90cb25aaa0..41f1149e87 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_opipe.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_opipe.c
@@ -48,12 +48,6 @@ static int smb_opipe_exec(smb_opipe_t *);
static void smb_opipe_enter(smb_opipe_t *);
static void smb_opipe_exit(smb_opipe_t *);
-static door_handle_t smb_opipe_door_hd = NULL;
-static int smb_opipe_door_id = -1;
-static uint64_t smb_opipe_door_ncall = 0;
-static kmutex_t smb_opipe_door_mutex;
-static kcondvar_t smb_opipe_door_cv;
-
static int smb_opipe_door_call(smb_opipe_t *);
static int smb_opipe_door_upcall(smb_opipe_t *);
@@ -62,7 +56,7 @@ smb_opipe_alloc(smb_server_t *sv)
{
smb_opipe_t *opipe;
- opipe = kmem_cache_alloc(sv->si_cache_opipe, KM_SLEEP);
+ opipe = kmem_cache_alloc(smb_cache_opipe, KM_SLEEP);
bzero(opipe, sizeof (smb_opipe_t));
mutex_init(&opipe->p_mutex, NULL, MUTEX_DEFAULT, NULL);
@@ -95,7 +89,7 @@ smb_opipe_dealloc(smb_opipe_t *opipe)
cv_destroy(&opipe->p_cv);
mutex_destroy(&opipe->p_mutex);
- kmem_cache_free(sv->si_cache_opipe, opipe);
+ kmem_cache_free(smb_cache_opipe, opipe);
}
/*
@@ -239,11 +233,12 @@ smb_opipe_do_open(smb_request_t *sr, smb_opipe_t *opipe)
{
smb_netuserinfo_t *userinfo = &opipe->p_user;
smb_user_t *user = sr->uid_user;
+ smb_server_t *sv = sr->sr_server;
uint8_t *buf = opipe->p_doorbuf;
uint32_t buflen = SMB_OPIPE_DOOR_BUFSIZE;
uint32_t len;
- if ((opipe->p_event = smb_event_create(SMB_EVENT_TIMEOUT)) == NULL)
+ if ((opipe->p_event = smb_event_create(sv, SMB_EVENT_TIMEOUT)) == NULL)
return (-1);
smb_user_netinfo_init(user, userinfo);
@@ -283,7 +278,7 @@ smb_opipe_close(smb_ofile_t *of)
opipe = of->f_pipe;
SMB_OPIPE_VALID(opipe);
- (void) smb_server_cancel_event(opipe->p_hdr.dh_fid);
+ (void) smb_server_cancel_event(of->f_server, opipe->p_hdr.dh_fid);
smb_opipe_enter(opipe);
if (SMB_OPIPE_ISOPEN(opipe)) {
@@ -551,18 +546,19 @@ smb_opipe_exit(smb_opipe_t *opipe)
* opipe door client (to user space door server).
*/
void
-smb_opipe_door_init(void)
+smb_opipe_door_init(smb_server_t *sv)
{
- mutex_init(&smb_opipe_door_mutex, NULL, MUTEX_DEFAULT, NULL);
- cv_init(&smb_opipe_door_cv, NULL, CV_DEFAULT, NULL);
+ sv->sv_opipe_door_id = -1;
+ mutex_init(&sv->sv_opipe_door_mutex, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&sv->sv_opipe_door_cv, NULL, CV_DEFAULT, NULL);
}
void
-smb_opipe_door_fini(void)
+smb_opipe_door_fini(smb_server_t *sv)
{
- smb_opipe_door_close();
- cv_destroy(&smb_opipe_door_cv);
- mutex_destroy(&smb_opipe_door_mutex);
+ smb_opipe_door_close(sv);
+ cv_destroy(&sv->sv_opipe_door_cv);
+ mutex_destroy(&sv->sv_opipe_door_mutex);
}
/*
@@ -570,39 +566,40 @@ smb_opipe_door_fini(void)
* close it first because the door-id has probably changed.
*/
int
-smb_opipe_door_open(int door_id)
+smb_opipe_door_open(smb_server_t *sv, int door_id)
{
- smb_opipe_door_close();
+ smb_opipe_door_close(sv);
- mutex_enter(&smb_opipe_door_mutex);
- smb_opipe_door_ncall = 0;
+ mutex_enter(&sv->sv_opipe_door_mutex);
+ sv->sv_opipe_door_ncall = 0;
- if (smb_opipe_door_hd == NULL) {
- smb_opipe_door_id = door_id;
- smb_opipe_door_hd = door_ki_lookup(door_id);
+ if (sv->sv_opipe_door_hd == NULL) {
+ sv->sv_opipe_door_id = door_id;
+ sv->sv_opipe_door_hd = door_ki_lookup(door_id);
}
- mutex_exit(&smb_opipe_door_mutex);
- return ((smb_opipe_door_hd == NULL) ? -1 : 0);
+ mutex_exit(&sv->sv_opipe_door_mutex);
+ return ((sv->sv_opipe_door_hd == NULL) ? -1 : 0);
}
/*
* Close the (user space) door.
*/
void
-smb_opipe_door_close(void)
+smb_opipe_door_close(smb_server_t *sv)
{
- mutex_enter(&smb_opipe_door_mutex);
+ mutex_enter(&sv->sv_opipe_door_mutex);
- if (smb_opipe_door_hd != NULL) {
- while (smb_opipe_door_ncall > 0)
- cv_wait(&smb_opipe_door_cv, &smb_opipe_door_mutex);
+ if (sv->sv_opipe_door_hd != NULL) {
+ while (sv->sv_opipe_door_ncall > 0)
+ cv_wait(&sv->sv_opipe_door_cv,
+ &sv->sv_opipe_door_mutex);
- door_ki_rele(smb_opipe_door_hd);
- smb_opipe_door_hd = NULL;
+ door_ki_rele(sv->sv_opipe_door_hd);
+ sv->sv_opipe_door_hd = NULL;
}
- mutex_exit(&smb_opipe_door_mutex);
+ mutex_exit(&sv->sv_opipe_door_mutex);
}
/*
@@ -613,27 +610,28 @@ static int
smb_opipe_door_call(smb_opipe_t *opipe)
{
int rc;
+ smb_server_t *sv = opipe->p_server;
- mutex_enter(&smb_opipe_door_mutex);
+ mutex_enter(&sv->sv_opipe_door_mutex);
- if (smb_opipe_door_hd == NULL) {
- mutex_exit(&smb_opipe_door_mutex);
+ if (sv->sv_opipe_door_hd == NULL) {
+ mutex_exit(&sv->sv_opipe_door_mutex);
- if (smb_opipe_door_open(smb_opipe_door_id) != 0)
+ if (smb_opipe_door_open(sv, sv->sv_opipe_door_id) != 0)
return (-1);
- mutex_enter(&smb_opipe_door_mutex);
+ mutex_enter(&sv->sv_opipe_door_mutex);
}
- ++smb_opipe_door_ncall;
- mutex_exit(&smb_opipe_door_mutex);
+ sv->sv_opipe_door_ncall++;
+ mutex_exit(&sv->sv_opipe_door_mutex);
rc = smb_opipe_door_upcall(opipe);
- mutex_enter(&smb_opipe_door_mutex);
- if ((--smb_opipe_door_ncall) == 0)
- cv_signal(&smb_opipe_door_cv);
- mutex_exit(&smb_opipe_door_mutex);
+ mutex_enter(&sv->sv_opipe_door_mutex);
+ if ((--sv->sv_opipe_door_ncall) == 0)
+ cv_signal(&sv->sv_opipe_door_cv);
+ mutex_exit(&sv->sv_opipe_door_mutex);
return (rc);
}
@@ -644,6 +642,7 @@ smb_opipe_door_call(smb_opipe_t *opipe)
static int
smb_opipe_door_upcall(smb_opipe_t *opipe)
{
+ smb_server_t *sv = opipe->p_server;
door_arg_t da;
smb_doorhdr_t hdr;
int i;
@@ -657,11 +656,11 @@ smb_opipe_door_upcall(smb_opipe_t *opipe)
da.rsize = SMB_OPIPE_DOOR_BUFSIZE;
for (i = 0; i < 3; ++i) {
- if (smb_server_is_stopping())
+ if (smb_server_is_stopping(sv))
return (-1);
- if ((rc = door_ki_upcall_limited(smb_opipe_door_hd, &da,
- NULL, SIZE_MAX, 0)) == 0)
+ if ((rc = door_ki_upcall_limited(sv->sv_opipe_door_hd,
+ &da, NULL, SIZE_MAX, 0)) == 0)
break;
if (rc != EAGAIN && rc != EINTR)
diff --git a/usr/src/uts/common/fs/smbsrv/smb_oplock.c b/usr/src/uts/common/fs/smbsrv/smb_oplock.c
index a21f0ddc21..bde986db44 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_oplock.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_oplock.c
@@ -47,9 +47,6 @@
(((level) == SMB_OPLOCK_EXCLUSIVE) || \
((level) == SMB_OPLOCK_BATCH))
-extern int smb_fem_oplock_install(smb_node_t *);
-extern int smb_fem_oplock_uninstall(smb_node_t *);
-
static int smb_oplock_install_fem(smb_node_t *);
static void smb_oplock_uninstall_fem(smb_node_t *);
@@ -76,7 +73,7 @@ static boolean_t smb_oplock_initialized = B_FALSE;
static kmem_cache_t *smb_oplock_break_cache = NULL;
static smb_llist_t smb_oplock_breaks;
static smb_thread_t smb_oplock_thread;
-
+/* shared by all zones */
/*
* smb_oplock_init
@@ -170,13 +167,8 @@ smb_oplock_uninstall_fem(smb_node_t *node)
ASSERT(MUTEX_HELD(&node->n_oplock.ol_mutex));
if (node->n_oplock.ol_fem) {
- if (smb_fem_oplock_uninstall(node) == 0) {
- node->n_oplock.ol_fem = B_FALSE;
- } else {
- cmn_err(CE_NOTE,
- "failed to uninstall fem monitor %s",
- node->vp->v_path);
- }
+ smb_fem_oplock_uninstall(node);
+ node->n_oplock.ol_fem = B_FALSE;
}
}
@@ -294,6 +286,8 @@ smb_oplock_acquire(smb_request_t *sr, smb_node_t *node, smb_ofile_t *ofile)
* 0 - oplock broken (or no break required)
* EAGAIN - oplock break request sent and would block
* awaiting the reponse but NOWAIT was specified
+ *
+ * NB: sr == NULL when called by FEM framework.
*/
int
smb_oplock_break(smb_request_t *sr, smb_node_t *node, uint32_t flags)
diff --git a/usr/src/uts/common/fs/smbsrv/smb_pathname.c b/usr/src/uts/common/fs/smbsrv/smb_pathname.c
index 7b703f3027..2e4f2e1911 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_pathname.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_pathname.c
@@ -555,7 +555,7 @@ smb_pathname_lookup(pathname_t *pn, pathname_t *rpn, int flags,
err = lookuppnvp(pn, rpn, flags, NULL, vp, rootvp, dvp, cred);
if ((err == 0) && (attr != NULL))
- (void) smb_vop_getattr(*vp, NULL, attr, 0, kcred);
+ (void) smb_vop_getattr(*vp, NULL, attr, 0, zone_kcred());
return (err);
}
@@ -628,7 +628,7 @@ smb_lookuppathvptovp(smb_request_t *sr, char *path, vnode_t *startvp,
/* lookuppnvp should release the holds */
if (lookuppnvp(&pn, NULL, lookup_flags, NULL, &vp,
- rootvp, startvp, kcred) != 0) {
+ rootvp, startvp, zone_kcred()) != 0) {
pn_free(&pn);
return (NULL);
}
diff --git a/usr/src/uts/common/fs/smbsrv/smb_print.c b/usr/src/uts/common/fs/smbsrv/smb_print.c
index 88a2106b5b..17d68abf1f 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_print.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_print.c
@@ -122,7 +122,8 @@ smb_com_open_print_file(smb_request_t *sr)
}
if ((rc = smbsr_encode_result(sr, 1, 0,
"bww", 1, sr->smb_fid, 0)) == 0) {
- if ((si = smb_kshare_lookup(SMB_SHARE_PRINT)) == NULL) {
+ si = smb_kshare_lookup(sr->sr_server, SMB_SHARE_PRINT);
+ if (si == NULL) {
cmn_err(CE_NOTE, "smb_com_open_print_file: SDRC_ERROR");
return (SDRC_ERROR);
}
@@ -134,9 +135,9 @@ smb_com_open_print_file(smb_request_t *sr)
(void) strlcpy(sp->sd_username, sr->uid_user->u_name,
MAXNAMELEN);
sp->sd_fid = sr->smb_fid;
- if (smb_spool_add_doc(sp))
+ if (smb_spool_add_doc(sr->tid_tree, sp))
kmem_free(sp, sizeof (smb_kspooldoc_t));
- smb_kshare_release(si);
+ smb_kshare_release(sr->sr_server, si);
}
return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
}
diff --git a/usr/src/uts/common/fs/smbsrv/smb_rename.c b/usr/src/uts/common/fs/smbsrv/smb_rename.c
index 03146835c2..8f7cad3553 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_rename.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_rename.c
@@ -808,7 +808,7 @@ smb_rename_check_attr(smb_request_t *sr, smb_node_t *node, uint16_t sattr)
bzero(&attr, sizeof (attr));
attr.sa_mask = SMB_AT_DOSATTR;
- if (smb_node_getattr(sr, node, kcred, NULL, &attr) != 0)
+ if (smb_node_getattr(sr, node, zone_kcred(), NULL, &attr) != 0)
return (EACCES);
if ((attr.sa_dosattr & FILE_ATTRIBUTE_HIDDEN) &&
diff --git a/usr/src/uts/common/fs/smbsrv/smb_server.c b/usr/src/uts/common/fs/smbsrv/smb_server.c
index 0af7412fc3..29a0d4bae9 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_server.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_server.c
@@ -230,8 +230,6 @@ typedef struct {
static void smb_server_kstat_init(smb_server_t *);
static void smb_server_kstat_fini(smb_server_t *);
static void smb_server_timers(smb_thread_t *, void *);
-int smb_server_lookup(smb_server_t **);
-void smb_server_release(smb_server_t *);
static void smb_server_store_cfg(smb_server_t *, smb_ioc_cfg_t *);
static void smb_server_shutdown(smb_server_t *);
static int smb_server_fsop_start(smb_server_t *);
@@ -265,6 +263,15 @@ int smb_event_debug = 0;
static smb_llist_t smb_servers;
+kmem_cache_t *smb_cache_request;
+kmem_cache_t *smb_cache_session;
+kmem_cache_t *smb_cache_user;
+kmem_cache_t *smb_cache_tree;
+kmem_cache_t *smb_cache_ofile;
+kmem_cache_t *smb_cache_odir;
+kmem_cache_t *smb_cache_opipe;
+kmem_cache_t *smb_cache_event;
+
/*
* *****************************************************************************
* **************** Functions called from the device interface *****************
@@ -275,66 +282,93 @@ static smb_llist_t smb_servers;
*/
/*
- * smb_server_svc_init
+ * smb_server_g_init
*
* This function must be called from smb_drv_attach().
*/
int
-smb_server_svc_init(void)
+smb_server_g_init(void)
{
- int rc = 0;
+ int rc;
- while (rc == 0) {
- if (rc = smb_mbc_init())
- continue;
- if (rc = smb_vop_init())
- continue;
- if (rc = smb_node_init())
- continue;
- if (rc = smb_oplock_init())
- continue;
- if (rc = smb_fem_init())
- continue;
- if (rc = smb_net_init())
- continue;
- smb_llist_init();
- smb_llist_constructor(&smb_servers, sizeof (smb_server_t),
- offsetof(smb_server_t, sv_lnd));
- return (0);
- }
+ if ((rc = smb_vop_init()) != 0)
+ goto errout;
+ if ((rc = smb_fem_init()) != 0)
+ goto errout;
+ if ((rc = smb_oplock_init()) != 0)
+ goto errout;
- smb_llist_fini();
- smb_net_fini();
+ smb_kshare_g_init();
+ smb_codepage_init();
+ smb_mbc_init(); /* smb_mbc_cache */
+ smb_net_init(); /* smb_txr_cache */
+ smb_node_init(); /* smb_node_cache, lists */
+ smb_sign_g_init();
+
+ smb_cache_request = kmem_cache_create("smb_request_cache",
+ sizeof (smb_request_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+ smb_cache_session = kmem_cache_create("smb_session_cache",
+ sizeof (smb_session_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+ smb_cache_user = kmem_cache_create("smb_user_cache",
+ sizeof (smb_user_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+ smb_cache_tree = kmem_cache_create("smb_tree_cache",
+ sizeof (smb_tree_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+ smb_cache_ofile = kmem_cache_create("smb_ofile_cache",
+ sizeof (smb_ofile_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+ smb_cache_odir = kmem_cache_create("smb_odir_cache",
+ sizeof (smb_odir_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+ smb_cache_opipe = kmem_cache_create("smb_opipe_cache",
+ sizeof (smb_opipe_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+ smb_cache_event = kmem_cache_create("smb_event_cache",
+ sizeof (smb_event_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+
+ smb_llist_init();
+ smb_llist_constructor(&smb_servers, sizeof (smb_server_t),
+ offsetof(smb_server_t, sv_lnd));
+
+ return (0);
+
+errout:
smb_fem_fini();
- smb_node_fini();
smb_vop_fini();
- smb_mbc_fini();
return (rc);
}
/*
- * smb_server_svc_fini
+ * smb_server_g_fini
*
* This function must called from smb_drv_detach(). It will fail if servers
* still exist.
*/
int
-smb_server_svc_fini(void)
-{
- int rc = EBUSY;
-
- if (smb_llist_get_count(&smb_servers) == 0) {
- smb_llist_fini();
- smb_net_fini();
- smb_fem_fini();
- smb_node_fini();
- smb_oplock_fini();
- smb_vop_fini();
- smb_mbc_fini();
- smb_llist_destructor(&smb_servers);
- rc = 0;
- }
- return (rc);
+smb_server_g_fini(void)
+{
+
+ if (smb_llist_get_count(&smb_servers) != 0)
+ return (EBUSY);
+ smb_llist_fini();
+
+ kmem_cache_destroy(smb_cache_request);
+ kmem_cache_destroy(smb_cache_session);
+ kmem_cache_destroy(smb_cache_user);
+ kmem_cache_destroy(smb_cache_tree);
+ kmem_cache_destroy(smb_cache_ofile);
+ kmem_cache_destroy(smb_cache_odir);
+ kmem_cache_destroy(smb_cache_opipe);
+ kmem_cache_destroy(smb_cache_event);
+
+ smb_node_fini();
+ smb_net_fini();
+ smb_mbc_fini();
+ smb_kshare_g_fini();
+
+ smb_oplock_fini();
+ smb_fem_fini();
+ smb_vop_fini();
+
+ smb_llist_destructor(&smb_servers);
+
+ return (0);
}
/*
@@ -362,11 +396,16 @@ smb_server_create(void)
sv = smb_llist_next(&smb_servers, sv);
}
- sv = kmem_zalloc(sizeof (smb_server_t), KM_NOSLEEP);
- if (sv == NULL) {
- smb_llist_exit(&smb_servers);
- return (ENOMEM);
- }
+ sv = kmem_zalloc(sizeof (smb_server_t), KM_SLEEP);
+
+ sv->sv_magic = SMB_SERVER_MAGIC;
+ sv->sv_state = SMB_SERVER_STATE_CREATED;
+ sv->sv_zid = zid;
+ sv->sv_pid = curproc->p_pid;
+
+ mutex_init(&sv->sv_mutex, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&sv->sv_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&sv->sp_info.sp_cv, NULL, CV_DEFAULT, NULL);
smb_llist_constructor(&sv->sv_opipe_list, sizeof (smb_opipe_t),
offsetof(smb_opipe_t, p_lnd));
@@ -380,50 +419,28 @@ smb_server_create(void)
smb_llist_constructor(&sv->sp_info.sp_fidlist,
sizeof (smb_spoolfid_t), offsetof(smb_spoolfid_t, sf_lnd));
- sv->si_cache_request = kmem_cache_create("smb_request_cache",
- sizeof (smb_request_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- sv->si_cache_session = kmem_cache_create("smb_session_cache",
- sizeof (smb_session_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- sv->si_cache_user = kmem_cache_create("smb_user_cache",
- sizeof (smb_user_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- sv->si_cache_tree = kmem_cache_create("smb_tree_cache",
- sizeof (smb_tree_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- sv->si_cache_ofile = kmem_cache_create("smb_ofile_cache",
- sizeof (smb_ofile_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- sv->si_cache_odir = kmem_cache_create("smb_odir_cache",
- sizeof (smb_odir_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- sv->si_cache_opipe = kmem_cache_create("smb_opipe_cache",
- sizeof (smb_opipe_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
- sv->si_cache_event = kmem_cache_create("smb_event_cache",
- sizeof (smb_event_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
+ sv->sv_disp_stats = kmem_zalloc(SMB_COM_NUM *
+ sizeof (smb_disp_stats_t), KM_SLEEP);
smb_thread_init(&sv->si_thread_timers, "smb_timers",
smb_server_timers, sv, smbsrv_timer_pri);
- sv->sv_pid = curproc->p_pid;
smb_srqueue_init(&sv->sv_srqueue);
- smb_kdoor_init();
- smb_opipe_door_init();
+ smb_kdoor_init(sv);
+ smb_kshare_init(sv);
+ smb_opipe_door_init(sv);
smb_server_kstat_init(sv);
- mutex_init(&sv->sv_mutex, NULL, MUTEX_DEFAULT, NULL);
- cv_init(&sv->sv_cv, NULL, CV_DEFAULT, NULL);
- cv_init(&sv->sp_info.sp_cv, NULL, CV_DEFAULT, NULL);
-
- sv->sv_state = SMB_SERVER_STATE_CREATED;
- sv->sv_magic = SMB_SERVER_MAGIC;
- sv->sv_zid = zid;
-
smb_llist_insert_tail(&smb_servers, sv);
smb_llist_exit(&smb_servers);
- smb_threshold_init(&sv->sv_ssetup_ct, SMB_SSETUP_CMD,
+ smb_threshold_init(&sv->sv_ssetup_ct, sv, SMB_SSETUP_CMD,
smb_ssetup_threshold, smb_ssetup_timeout);
- smb_threshold_init(&sv->sv_tcon_ct, SMB_TCON_CMD, smb_tcon_threshold,
- smb_tcon_timeout);
- smb_threshold_init(&sv->sv_opipe_ct, SMB_OPIPE_CMD, smb_opipe_threshold,
- smb_opipe_timeout);
+ smb_threshold_init(&sv->sv_tcon_ct, sv, SMB_TCON_CMD,
+ smb_tcon_threshold, smb_tcon_timeout);
+ smb_threshold_init(&sv->sv_opipe_ct, sv, SMB_OPIPE_CMD,
+ smb_opipe_threshold, smb_opipe_timeout);
return (0);
}
@@ -487,24 +504,19 @@ smb_server_delete(void)
smb_server_listener_destroy(&sv->sv_nbt_daemon);
smb_server_listener_destroy(&sv->sv_tcp_daemon);
rw_destroy(&sv->sv_cfg_lock);
- smb_opipe_door_fini();
- smb_kdoor_fini();
smb_server_kstat_fini(sv);
+ smb_opipe_door_fini(sv);
+ smb_kshare_fini(sv);
+ smb_kdoor_fini(sv);
smb_llist_destructor(&sv->sv_opipe_list);
smb_llist_destructor(&sv->sv_event_list);
- kmem_cache_destroy(sv->si_cache_request);
- kmem_cache_destroy(sv->si_cache_session);
- kmem_cache_destroy(sv->si_cache_user);
- kmem_cache_destroy(sv->si_cache_tree);
- kmem_cache_destroy(sv->si_cache_ofile);
- kmem_cache_destroy(sv->si_cache_odir);
- kmem_cache_destroy(sv->si_cache_opipe);
- kmem_cache_destroy(sv->si_cache_event);
+ kmem_free(sv->sv_disp_stats,
+ SMB_COM_NUM * sizeof (smb_disp_stats_t));
smb_srqueue_destroy(&sv->sv_srqueue);
-
smb_thread_destroy(&sv->si_thread_timers);
+
mutex_destroy(&sv->sv_mutex);
cv_destroy(&sv->sv_cv);
sv->sv_magic = 0;
@@ -573,17 +585,22 @@ smb_server_start(smb_ioc_start_t *ioc)
mutex_enter(&sv->sv_mutex);
switch (sv->sv_state) {
case SMB_SERVER_STATE_CONFIGURED:
- smb_codepage_init();
- sv->sv_worker_pool = taskq_create("smb_workers",
+ if ((rc = smb_server_fsop_start(sv)) != 0)
+ break;
+
+ if ((rc = smb_kshare_start(sv)) != 0)
+ break;
+
+ sv->sv_worker_pool = taskq_create_proc("smb_workers",
sv->sv_cfg.skc_maxworkers, smbsrv_worker_pri,
sv->sv_cfg.skc_maxworkers, INT_MAX,
- TASKQ_DYNAMIC|TASKQ_PREPOPULATE);
+ curzone->zone_zsched, TASKQ_DYNAMIC);
- sv->sv_receiver_pool = taskq_create("smb_receivers",
+ sv->sv_receiver_pool = taskq_create_proc("smb_receivers",
sv->sv_cfg.skc_maxconnections, smbsrv_receive_pri,
sv->sv_cfg.skc_maxconnections, INT_MAX,
- TASKQ_DYNAMIC);
+ curzone->zone_zsched, TASKQ_DYNAMIC);
sv->sv_session = smb_session_create(NULL, 0, sv, 0);
@@ -592,17 +609,15 @@ smb_server_start(smb_ioc_start_t *ioc)
break;
}
- if (rc = smb_server_fsop_start(sv))
- break;
ASSERT(sv->sv_lmshrd == NULL);
sv->sv_lmshrd = smb_kshare_door_init(ioc->lmshrd);
if (sv->sv_lmshrd == NULL)
break;
- if (rc = smb_kdoor_open(ioc->udoor)) {
+ if (rc = smb_kdoor_open(sv, ioc->udoor)) {
cmn_err(CE_WARN, "Cannot open smbd door");
break;
}
- if (rc = smb_opipe_door_open(ioc->opipe)) {
+ if (rc = smb_opipe_door_open(sv, ioc->opipe)) {
cmn_err(CE_WARN, "Cannot open opipe door");
break;
}
@@ -627,7 +642,7 @@ smb_server_start(smb_ioc_start_t *ioc)
sv->sv_start_time = gethrtime();
mutex_exit(&sv->sv_mutex);
smb_server_release(sv);
- smb_export_start();
+ smb_export_start(sv);
return (0);
default:
SMB_SERVER_STATE_VALID(sv->sv_state);
@@ -674,14 +689,10 @@ smb_server_stop(void)
}
boolean_t
-smb_server_is_stopping(void)
+smb_server_is_stopping(smb_server_t *sv)
{
- smb_server_t *sv;
boolean_t status;
- if (smb_server_lookup(&sv) != 0)
- return (B_TRUE);
-
SMB_SERVER_VALID(sv);
mutex_enter(&sv->sv_mutex);
@@ -697,22 +708,13 @@ smb_server_is_stopping(void)
}
mutex_exit(&sv->sv_mutex);
- smb_server_release(sv);
return (status);
}
-int
-smb_server_cancel_event(uint32_t txid)
+void
+smb_server_cancel_event(smb_server_t *sv, uint32_t txid)
{
- smb_server_t *sv;
- int rc;
-
- if ((rc = smb_server_lookup(&sv)) == 0) {
- smb_event_cancel(sv, txid);
- smb_server_release(sv);
- }
-
- return (rc);
+ smb_event_cancel(sv, txid);
}
int
@@ -922,19 +924,13 @@ smb_server_file_close(smb_ioc_fileid_t *ioc)
*/
uint32_t
-smb_server_get_session_count(void)
+smb_server_get_session_count(smb_server_t *sv)
{
- smb_server_t *sv;
uint32_t counter = 0;
- if (smb_server_lookup(&sv))
- return (0);
-
counter = smb_llist_get_count(&sv->sv_nbt_daemon.ld_session_list);
counter += smb_llist_get_count(&sv->sv_tcp_daemon.ld_session_list);
- smb_server_release(sv);
-
return (counter);
}
@@ -945,9 +941,8 @@ smb_server_get_session_count(void)
* must call VN_RELE.
*/
int
-smb_server_sharevp(const char *shr_path, vnode_t **vp)
+smb_server_sharevp(smb_server_t *sv, const char *shr_path, vnode_t **vp)
{
- smb_server_t *sv;
smb_request_t *sr;
smb_node_t *fnode = NULL;
smb_node_t *dnode;
@@ -956,25 +951,20 @@ smb_server_sharevp(const char *shr_path, vnode_t **vp)
ASSERT(shr_path);
- if ((rc = smb_server_lookup(&sv)))
- return (rc);
-
mutex_enter(&sv->sv_mutex);
switch (sv->sv_state) {
case SMB_SERVER_STATE_RUNNING:
break;
default:
mutex_exit(&sv->sv_mutex);
- smb_server_release(sv);
return (ENOTACTIVE);
}
mutex_exit(&sv->sv_mutex);
if ((sr = smb_request_alloc(sv->sv_session, 0)) == NULL) {
- smb_server_release(sv);
return (ENOMEM);
}
- sr->user_cr = kcred;
+ sr->user_cr = zone_kcred();
rc = smb_pathname_reduce(sr, sr->user_cr, shr_path,
NULL, NULL, &dnode, last_comp);
@@ -986,7 +976,6 @@ smb_server_sharevp(const char *shr_path, vnode_t **vp)
}
smb_request_free(sr);
- smb_server_release(sv);
if (rc != 0)
return (rc);
@@ -1245,9 +1234,8 @@ smb_server_timers(smb_thread_t *thread, void *arg)
static void
smb_server_kstat_init(smb_server_t *sv)
{
- char name[KSTAT_STRLEN];
- sv->sv_ksp = kstat_create_zone(SMBSRV_KSTAT_MODULE, sv->sv_zid,
+ sv->sv_ksp = kstat_create_zone(SMBSRV_KSTAT_MODULE, 0,
SMBSRV_KSTAT_STATISTICS, SMBSRV_KSTAT_CLASS, KSTAT_TYPE_RAW,
sizeof (smbsrv_kstats_t), 0, sv->sv_zid);
@@ -1256,19 +1244,16 @@ smb_server_kstat_init(smb_server_t *sv)
sv->sv_ksp->ks_private = sv;
((smbsrv_kstats_t *)sv->sv_ksp->ks_data)->ks_start_time =
sv->sv_start_time;
- smb_dispatch_stats_init(
- ((smbsrv_kstats_t *)sv->sv_ksp->ks_data)->ks_reqs);
+ smb_dispatch_stats_init(sv);
kstat_install(sv->sv_ksp);
} else {
cmn_err(CE_WARN, "SMB Server: Statistics unavailable");
}
- (void) snprintf(name, sizeof (name), "%s%d",
- SMBSRV_KSTAT_NAME, sv->sv_zid);
-
- sv->sv_legacy_ksp = kstat_create(SMBSRV_KSTAT_MODULE, sv->sv_zid,
- name, SMBSRV_KSTAT_CLASS, KSTAT_TYPE_NAMED,
- sizeof (smb_server_legacy_kstat_t) / sizeof (kstat_named_t), 0);
+ sv->sv_legacy_ksp = kstat_create_zone(SMBSRV_KSTAT_MODULE, 0,
+ SMBSRV_KSTAT_NAME, SMBSRV_KSTAT_CLASS, KSTAT_TYPE_NAMED,
+ sizeof (smb_server_legacy_kstat_t) / sizeof (kstat_named_t),
+ 0, sv->sv_zid);
if (sv->sv_legacy_ksp != NULL) {
smb_server_legacy_kstat_t *ksd;
@@ -1309,7 +1294,7 @@ smb_server_kstat_fini(smb_server_t *sv)
if (sv->sv_ksp != NULL) {
kstat_delete(sv->sv_ksp);
sv->sv_ksp = NULL;
- smb_dispatch_stats_fini();
+ smb_dispatch_stats_fini(sv);
}
}
@@ -1350,7 +1335,7 @@ smb_server_kstat_update(kstat_t *ksp, int rw)
/*
* Latency & Throughput of the requests
*/
- smb_dispatch_stats_update(ksd->ks_reqs, 0, SMB_COM_NUM);
+ smb_dispatch_stats_update(sv, ksd->ks_reqs, 0, SMB_COM_NUM);
return (0);
}
if (rw == KSTAT_WRITE)
@@ -1399,13 +1384,12 @@ smb_server_shutdown(smb_server_t *sv)
{
SMB_SERVER_VALID(sv);
- smb_opipe_door_close();
+ smb_opipe_door_close(sv);
smb_thread_stop(&sv->si_thread_timers);
- smb_kdoor_close();
+ smb_kdoor_close(sv);
smb_kshare_door_fini(sv->sv_lmshrd);
sv->sv_lmshrd = NULL;
- smb_export_stop();
- smb_server_fsop_stop(sv);
+ smb_export_stop(sv);
smb_server_listener_stop(&sv->sv_nbt_daemon);
smb_server_listener_stop(&sv->sv_tcp_daemon);
@@ -1432,6 +1416,9 @@ smb_server_shutdown(smb_server_t *sv)
taskq_destroy(sv->sv_worker_pool);
sv->sv_worker_pool = NULL;
}
+
+ smb_kshare_stop(sv);
+ smb_server_fsop_stop(sv);
}
/*
@@ -1646,8 +1633,9 @@ smb_server_receiver(void *arg)
/*
* smb_server_lookup
*
- * This function tries to find the server associated with the zone of the
- * caller.
+ * This function finds the server associated with the zone of the
+ * caller. Note: requires a fix in the dynamic taskq code:
+ * 1501 taskq_create_proc ... TQ_DYNAMIC puts tasks in p0
*/
int
smb_server_lookup(smb_server_t **psv)
@@ -1932,7 +1920,7 @@ smb_server_fsop_start(smb_server_t *sv)
{
int error;
- error = smb_node_root_init(rootdir, sv, &sv->si_root_smb_node);
+ error = smb_node_root_init(sv, &sv->si_root_smb_node);
if (error != 0)
sv->si_root_smb_node = NULL;
@@ -1949,20 +1937,14 @@ smb_server_fsop_stop(smb_server_t *sv)
}
smb_event_t *
-smb_event_create(int timeout)
+smb_event_create(smb_server_t *sv, int timeout)
{
- smb_server_t *sv;
smb_event_t *event;
- if (smb_server_is_stopping())
+ if (smb_server_is_stopping(sv))
return (NULL);
- if (smb_server_lookup(&sv) != 0) {
- cmn_err(CE_NOTE, "smb_event_create failed");
- return (NULL);
- }
-
- event = kmem_cache_alloc(sv->si_cache_event, KM_SLEEP);
+ event = kmem_cache_alloc(smb_cache_event, KM_SLEEP);
bzero(event, sizeof (smb_event_t));
mutex_init(&event->se_mutex, NULL, MUTEX_DEFAULT, NULL);
@@ -1976,7 +1958,6 @@ smb_event_create(int timeout)
smb_llist_insert_tail(&sv->sv_event_list, event);
smb_llist_exit(&sv->sv_event_list);
- smb_server_release(sv);
return (event);
}
@@ -1990,9 +1971,8 @@ smb_event_destroy(smb_event_t *event)
SMB_EVENT_VALID(event);
ASSERT(event->se_waittime == 0);
-
- if (smb_server_lookup(&sv) != 0)
- return;
+ sv = event->se_server;
+ SMB_SERVER_VALID(sv);
smb_llist_enter(&sv->sv_event_list, RW_WRITER);
smb_llist_remove(&sv->sv_event_list, event);
@@ -2002,8 +1982,7 @@ smb_event_destroy(smb_event_t *event)
cv_destroy(&event->se_cv);
mutex_destroy(&event->se_mutex);
- kmem_cache_free(sv->si_cache_event, event);
- smb_server_release(sv);
+ kmem_cache_free(smb_cache_event, event);
}
/*
@@ -2270,22 +2249,18 @@ smb_spool_get_fid(smb_server_t *sv)
* rc zero success
*/
int
-smb_spool_add_doc(smb_kspooldoc_t *sp)
+smb_spool_add_doc(smb_tree_t *tree, smb_kspooldoc_t *sp)
{
smb_llist_t *splist;
- smb_server_t *sv;
+ smb_server_t *sv = tree->t_server;
int rc = 0;
- rc = smb_server_lookup(&sv);
- if (rc)
- return (rc);
-
splist = &sv->sp_info.sp_list;
smb_llist_enter(splist, RW_WRITER);
sp->sd_spool_num = atomic_inc_32_nv(&sv->sp_info.sp_cnt);
smb_llist_insert_tail(splist, sp);
smb_llist_exit(splist);
- smb_server_release(sv);
+
return (rc);
}
@@ -2297,32 +2272,42 @@ smb_server_create_session(smb_listener_daemon_t *ld, ksocket_t s_so)
{
smb_session_t *session;
smb_receiver_arg_t *rarg;
+ taskqid_t tqid;
session = smb_session_create(s_so, ld->ld_port, ld->ld_sv,
ld->ld_family);
- if (session != NULL) {
- smb_llist_enter(&ld->ld_session_list, RW_WRITER);
- smb_llist_insert_tail(&ld->ld_session_list, session);
- smb_llist_exit(&ld->ld_session_list);
-
- rarg = (smb_receiver_arg_t *)smb_mem_alloc(
- sizeof (smb_receiver_arg_t));
- rarg->ra_listener = ld;
- rarg->ra_session = session;
+ if (session == NULL) {
+ smb_soshutdown(s_so);
+ smb_sodestroy(s_so);
+ cmn_err(CE_WARN, "SMB Session: alloc failed");
+ return;
+ }
- if (taskq_dispatch(ld->ld_sv->sv_receiver_pool,
- smb_server_receiver, rarg, TQ_NOQUEUE) != 0)
- return;
+ smb_llist_enter(&ld->ld_session_list, RW_WRITER);
+ smb_llist_insert_tail(&ld->ld_session_list, session);
+ smb_llist_exit(&ld->ld_session_list);
+ rarg = (smb_receiver_arg_t *)smb_mem_alloc(
+ sizeof (smb_receiver_arg_t));
+ rarg->ra_listener = ld;
+ rarg->ra_session = session;
+
+ /*
+ * These taskq entries must run independently of one another,
+ * so TQ_NOQUEUE. TQ_SLEEP (==0) just for clarity.
+ */
+ tqid = taskq_dispatch(ld->ld_sv->sv_receiver_pool,
+ smb_server_receiver, rarg, TQ_NOQUEUE | TQ_SLEEP);
+ if (tqid == 0) {
smb_mem_free(rarg);
smb_session_disconnect(session);
smb_server_destroy_session(ld, session);
- } else {
- smb_soshutdown(s_so);
- smb_sodestroy(s_so);
+ cmn_err(CE_WARN, "SMB Session: taskq_dispatch failed");
+ return;
}
- cmn_err(CE_WARN, "SMB Session: creation failed");
+ /* handy for debugging */
+ session->s_receiver_tqid = tqid;
}
static void
diff --git a/usr/src/uts/common/fs/smbsrv/smb_session.c b/usr/src/uts/common/fs/smbsrv/smb_session.c
index b8284b372f..417e6c92eb 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_session.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_session.c
@@ -618,16 +618,16 @@ smb_session_create(ksocket_t new_so, uint16_t port, smb_server_t *sv,
smb_session_t *session;
int64_t now;
- session = kmem_cache_alloc(sv->si_cache_session, KM_SLEEP);
+ session = kmem_cache_alloc(smb_cache_session, KM_SLEEP);
bzero(session, sizeof (smb_session_t));
if (smb_idpool_constructor(&session->s_uid_pool)) {
- kmem_cache_free(sv->si_cache_session, session);
+ kmem_cache_free(smb_cache_session, session);
return (NULL);
}
if (smb_idpool_constructor(&session->s_tid_pool)) {
smb_idpool_destructor(&session->s_uid_pool);
- kmem_cache_free(sv->si_cache_session, session);
+ kmem_cache_free(smb_cache_session, session);
return (NULL);
}
@@ -702,8 +702,6 @@ smb_session_create(ksocket_t new_so, uint16_t port, smb_server_t *sv,
smb_server_get_cfg(sv, &session->s_cfg);
session->s_srqueue = &sv->sv_srqueue;
- session->s_cache_request = sv->si_cache_request;
- session->s_cache = sv->si_cache_session;
session->s_magic = SMB_SESSION_MAGIC;
return (session);
}
@@ -745,7 +743,7 @@ smb_session_delete(smb_session_t *session)
smb_server_dec_tcp_sess(session->s_server);
smb_sodestroy(session->sock);
}
- kmem_cache_free(session->s_cache, session);
+ kmem_cache_free(smb_cache_session, session);
}
static void
@@ -1330,7 +1328,7 @@ smb_request_alloc(smb_session_t *session, int req_length)
ASSERT(session->s_magic == SMB_SESSION_MAGIC);
- sr = kmem_cache_alloc(session->s_cache_request, KM_SLEEP);
+ sr = kmem_cache_alloc(smb_cache_request, KM_SLEEP);
/*
* Future: Use constructor to pre-initialize some fields. For now
@@ -1345,7 +1343,6 @@ smb_request_alloc(smb_session_t *session, int req_length)
sr->session = session;
sr->sr_server = session->s_server;
sr->sr_gmtoff = session->s_server->si_gmtoff;
- sr->sr_cache = session->s_server->si_cache_request;
sr->sr_cfg = &session->s_cfg;
sr->command.max_bytes = req_length;
sr->reply.max_bytes = smb_maxbufsize;
@@ -1400,7 +1397,7 @@ smb_request_free(smb_request_t *sr)
sr->sr_magic = 0;
cv_destroy(&sr->sr_ncr.nc_cv);
mutex_destroy(&sr->sr_mutex);
- kmem_cache_free(sr->sr_cache, sr);
+ kmem_cache_free(smb_cache_request, sr);
}
void
diff --git a/usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c b/usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c
index b3e5789826..8ca8c16c96 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c
@@ -331,7 +331,7 @@ smb_authenticate_core(smb_request_t *sr, smb_arg_sessionsetup_t *sinfo,
DTRACE_PROBE1(smb__sessionsetup__clntinfo, smb_logon_t *, &user_info);
- if ((token = smb_get_token(&user_info)) == NULL) {
+ if ((token = smb_get_token(sr->session, &user_info)) == NULL) {
smbsr_error(sr, 0, ERRSRV, ERRbadpw);
return (-1);
}
diff --git a/usr/src/uts/common/fs/smbsrv/smb_signing.c b/usr/src/uts/common/fs/smbsrv/smb_signing.c
index 63d6130c48..ce622edc9d 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_signing.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_signing.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
@@ -107,6 +108,18 @@ int i;
/* This holds the MD5 mechanism */
static crypto_mechanism_t crypto_mech = {CRYPTO_MECHANISM_INVALID, 0, 0};
+void
+smb_sign_g_init(void)
+{
+ /*
+ * Initialise the crypto mechanism to MD5 if it not
+ * already initialised.
+ */
+ if (crypto_mech.cm_type == CRYPTO_MECHANISM_INVALID) {
+ crypto_mech.cm_type = crypto_mech2id(SUN_CKM_MD5);
+ }
+}
+
/*
* smb_sign_init
*
@@ -119,24 +132,17 @@ smb_sign_init(smb_request_t *sr, smb_session_key_t *session_key,
{
struct smb_sign *sign = &sr->session->signing;
- /*
- * Initialise the crypto mechanism to MD5 if it not
- * already initialised.
- */
- if (crypto_mech.cm_type == CRYPTO_MECHANISM_INVALID) {
- crypto_mech.cm_type = crypto_mech2id(SUN_CKM_MD5);
- if (crypto_mech.cm_type == CRYPTO_MECHANISM_INVALID) {
- /*
- * There is no MD5 crypto mechanism
- * so turn off signing
- */
- sr->sr_cfg->skc_signing_enable = 0;
- sr->session->secmode &=
- (~NEGOTIATE_SECURITY_SIGNATURES_ENABLED);
- cmn_err(CE_WARN,
- "SmbSignInit: signing disabled (no MD5)");
- return;
- }
+ if (crypto_mech.cm_type == CRYPTO_MECHANISM_INVALID) {
+ /*
+ * There is no MD5 crypto mechanism
+ * so turn off signing
+ */
+ sr->sr_cfg->skc_signing_enable = 0;
+ sr->session->secmode &=
+ (~NEGOTIATE_SECURITY_SIGNATURES_ENABLED);
+ cmn_err(CE_WARN,
+ "SmbSignInit: signing disabled (no MD5)");
+ return;
}
/* MAC key = concat (SessKey, NTLMResponse) */
@@ -150,7 +156,6 @@ smb_sign_init(smb_request_t *sr, smb_session_key_t *session_key,
sr->sr_seqnum = 2;
sr->reply_seqnum = 1;
sign->flags = SMB_SIGNING_ENABLED;
-
}
/*
diff --git a/usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c b/usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c
index aaa9b3a72a..c8e4fadd7b 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -494,7 +495,7 @@ smb_dfs_referrals_get(smb_request_t *sr, char *dfs_path, dfs_reftype_t reftype,
bzero(refrsp, sizeof (dfs_referral_response_t));
refrsp->rp_status = NT_STATUS_NOT_FOUND;
- rc = smb_kdoor_upcall(SMB_DR_DFS_GET_REFERRALS,
+ rc = smb_kdoor_upcall(sr->sr_server, SMB_DR_DFS_GET_REFERRALS,
&req, dfs_referral_query_xdr, refrsp, dfs_referral_response_xdr);
if (rc != 0 || refrsp->rp_status != ERROR_SUCCESS) {
diff --git a/usr/src/uts/common/fs/smbsrv/smb_tree.c b/usr/src/uts/common/fs/smbsrv/smb_tree.c
index b225c67623..f952ddabb3 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_tree.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_tree.c
@@ -237,14 +237,15 @@ smb_tree_connect_core(smb_request_t *sr)
return (NULL);
}
- if ((si = smb_kshare_lookup(name)) == NULL) {
+ si = smb_kshare_lookup(sr->sr_server, name);
+ if (si == NULL) {
smb_tree_log(sr, name, "share not found");
smbsr_error(sr, 0, ERRSRV, ERRinvnetname);
return (NULL);
}
if (!strcasecmp(SMB_SHARE_PRINT, name)) {
- smb_kshare_release(si);
+ smb_kshare_release(sr->sr_server, si);
smb_tree_log(sr, name, "access not permitted");
smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRSRV, ERRaccess);
return (NULL);
@@ -268,8 +269,7 @@ smb_tree_connect_core(smb_request_t *sr)
break;
}
- smb_kshare_release(si);
-
+ smb_kshare_release(sr->sr_server, si);
return (tree);
}
@@ -315,7 +315,7 @@ smb_tree_disconnect(smb_tree_t *tree, boolean_t do_exec)
(tree->t_execflags & SMB_EXEC_UNMAP)) {
smb_tree_set_execinfo(tree, &execinfo, SMB_EXEC_UNMAP);
- (void) smb_kshare_exec(&execinfo);
+ (void) smb_kshare_exec(tree->t_server, &execinfo);
}
}
@@ -543,7 +543,7 @@ smb_tree_acl_access(smb_request_t *sr, const smb_kshare_t *si, vnode_t *pathvp)
pn_alloc(&pnp);
(void) pn_set(&pnp, sharepath);
rc = lookuppnvp(&pnp, NULL, NO_FOLLOW, NULL, &sharevp, rootdir, root,
- kcred);
+ zone_kcred());
pn_free(&pnp);
/*
@@ -600,7 +600,7 @@ smb_tree_chkaccess(smb_request_t *sr, smb_kshare_t *shr, vnode_t *vp)
return (0);
}
- host_access = smb_kshare_hostaccess(shr, &sr->session->ipaddr);
+ host_access = smb_kshare_hostaccess(shr, sr->session);
if ((host_access & ACE_ALL_PERMS) == 0) {
smb_tree_log(sr, sharename, "access denied: host access");
return (0);
@@ -721,7 +721,7 @@ smb_tree_connect_disk(smb_request_t *sr, const char *sharename)
if (tree->t_execflags & SMB_EXEC_MAP) {
smb_tree_set_execinfo(tree, &execinfo, SMB_EXEC_MAP);
- rc = smb_kshare_exec(&execinfo);
+ rc = smb_kshare_exec(tree->t_server, &execinfo);
if ((rc != 0) && (tree->t_execflags & SMB_EXEC_TERM)) {
smb_tree_disconnect(tree, B_FALSE);
@@ -869,7 +869,7 @@ smb_tree_alloc(smb_request_t *sr, const smb_kshare_t *si,
if (smb_idpool_alloc(&session->s_tid_pool, &tid))
return (NULL);
- tree = kmem_cache_alloc(session->s_server->si_cache_tree, KM_SLEEP);
+ tree = kmem_cache_alloc(smb_cache_tree, KM_SLEEP);
bzero(tree, sizeof (smb_tree_t));
tree->t_session = session;
@@ -882,21 +882,21 @@ smb_tree_alloc(smb_request_t *sr, const smb_kshare_t *si,
if (STYPE_ISDSK(stype) || STYPE_ISPRN(stype)) {
if (smb_tree_getattr(si, snode, tree) != 0) {
smb_idpool_free(&session->s_tid_pool, tid);
- kmem_cache_free(session->s_server->si_cache_tree, tree);
+ kmem_cache_free(smb_cache_tree, tree);
return (NULL);
}
}
if (smb_idpool_constructor(&tree->t_fid_pool)) {
smb_idpool_free(&session->s_tid_pool, tid);
- kmem_cache_free(session->s_server->si_cache_tree, tree);
+ kmem_cache_free(smb_cache_tree, tree);
return (NULL);
}
if (smb_idpool_constructor(&tree->t_odid_pool)) {
smb_idpool_destructor(&tree->t_fid_pool);
smb_idpool_free(&session->s_tid_pool, tid);
- kmem_cache_free(session->s_server->si_cache_tree, tree);
+ kmem_cache_free(smb_cache_tree, tree);
return (NULL);
}
@@ -981,7 +981,7 @@ smb_tree_dealloc(void *arg)
SMB_USER_VALID(tree->t_owner);
smb_user_release(tree->t_owner);
- kmem_cache_free(tree->t_server->si_cache_tree, tree);
+ kmem_cache_free(smb_cache_tree, tree);
}
/*
diff --git a/usr/src/uts/common/fs/smbsrv/smb_user.c b/usr/src/uts/common/fs/smbsrv/smb_user.c
index 09eaba699c..6b0c614466 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_user.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_user.c
@@ -172,8 +172,8 @@
static boolean_t smb_user_is_logged_in(smb_user_t *);
static int smb_user_enum_private(smb_user_t *, smb_svcenum_t *);
static void smb_user_setcred(smb_user_t *, cred_t *, uint32_t);
-static void smb_user_nonauth_logon(uint32_t);
-static void smb_user_auth_logoff(uint32_t);
+static void smb_user_nonauth_logon(smb_user_t *);
+static void smb_user_auth_logoff(smb_user_t *);
/*
* Create a new user.
@@ -196,7 +196,7 @@ smb_user_login(
ASSERT(account_name);
ASSERT(domain_name);
- user = kmem_cache_alloc(session->s_server->si_cache_user, KM_SLEEP);
+ user = kmem_cache_alloc(smb_cache_user, KM_SLEEP);
bzero(user, sizeof (smb_user_t));
user->u_refcnt = 1;
user->u_session = session;
@@ -222,7 +222,7 @@ smb_user_login(
}
smb_mem_free(user->u_name);
smb_mem_free(user->u_domain);
- kmem_cache_free(session->s_server->si_cache_user, user);
+ kmem_cache_free(smb_cache_user, user);
return (NULL);
}
@@ -247,7 +247,7 @@ smb_user_dup(
orig_user->u_privileges, orig_user->u_audit_sid);
if (user)
- smb_user_nonauth_logon(orig_user->u_audit_sid);
+ smb_user_nonauth_logon(orig_user);
return (user);
}
@@ -275,7 +275,7 @@ smb_user_logoff(
user->u_state = SMB_USER_STATE_LOGGING_OFF;
mutex_exit(&user->u_mutex);
smb_session_disconnect_owned_trees(user->u_session, user);
- smb_user_auth_logoff(user->u_audit_sid);
+ smb_user_auth_logoff(user);
mutex_enter(&user->u_mutex);
user->u_state = SMB_USER_STATE_LOGGED_OFF;
smb_server_dec_users(user->u_server);
@@ -518,7 +518,7 @@ smb_user_delete(void *arg)
crfree(user->u_privcred);
smb_mem_free(user->u_name);
smb_mem_free(user->u_domain);
- kmem_cache_free(user->u_server->si_cache_user, user);
+ kmem_cache_free(smb_cache_user, user);
}
cred_t *
@@ -673,28 +673,32 @@ smb_user_netinfo_fini(smb_netuserinfo_t *info)
}
static void
-smb_user_nonauth_logon(uint32_t audit_sid)
+smb_user_nonauth_logon(smb_user_t *user)
{
- (void) smb_kdoor_upcall(SMB_DR_USER_NONAUTH_LOGON,
+ uint32_t audit_sid = user->u_audit_sid;
+
+ (void) smb_kdoor_upcall(user->u_server, SMB_DR_USER_NONAUTH_LOGON,
&audit_sid, xdr_uint32_t, NULL, NULL);
}
static void
-smb_user_auth_logoff(uint32_t audit_sid)
+smb_user_auth_logoff(smb_user_t *user)
{
- (void) smb_kdoor_upcall(SMB_DR_USER_AUTH_LOGOFF,
+ uint32_t audit_sid = user->u_audit_sid;
+
+ (void) smb_kdoor_upcall(user->u_server, SMB_DR_USER_AUTH_LOGOFF,
&audit_sid, xdr_uint32_t, NULL, NULL);
}
smb_token_t *
-smb_get_token(smb_logon_t *user_info)
+smb_get_token(smb_session_t *session, smb_logon_t *user_info)
{
smb_token_t *token;
int rc;
token = kmem_zalloc(sizeof (smb_token_t), KM_SLEEP);
- rc = smb_kdoor_upcall(SMB_DR_USER_AUTH_LOGON,
+ rc = smb_kdoor_upcall(session->s_server, SMB_DR_USER_AUTH_LOGON,
user_info, smb_logon_xdr, token, smb_token_xdr);
if (rc != 0) {
diff --git a/usr/src/uts/common/fs/smbsrv/smb_vfs.c b/usr/src/uts/common/fs/smbsrv/smb_vfs.c
index 53027a37a2..8af3417787 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_vfs.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_vfs.c
@@ -27,7 +27,7 @@
#include <smbsrv/smb_kproto.h>
static smb_vfs_t *smb_vfs_find(smb_export_t *, vfs_t *);
-static void smb_vfs_destroy(smb_export_t *, smb_vfs_t *);
+static void smb_vfs_destroy(smb_vfs_t *);
/*
* If a hold on the specified VFS has already been taken
@@ -60,7 +60,7 @@ smb_vfs_hold(smb_export_t *se, vfs_t *vfsp)
return (rc);
}
- smb_vfs = kmem_cache_alloc(se->e_cache_vfs, KM_SLEEP);
+ smb_vfs = kmem_cache_alloc(smb_kshare_cache_vfs, KM_SLEEP);
bzero(smb_vfs, sizeof (smb_vfs_t));
@@ -101,7 +101,7 @@ smb_vfs_rele(smb_export_t *se, vfs_t *vfsp)
if (--smb_vfs->sv_refcnt == 0) {
smb_llist_remove(&se->e_vfs_list, smb_vfs);
smb_llist_exit(&se->e_vfs_list);
- smb_vfs_destroy(se, smb_vfs);
+ smb_vfs_destroy(smb_vfs);
return;
}
}
@@ -126,7 +126,7 @@ smb_vfs_rele_all(smb_export_t *se)
ASSERT(smb_vfs->sv_magic == SMB_VFS_MAGIC);
DTRACE_PROBE1(smb_vfs_rele_all_hit, smb_vfs_t *, smb_vfs);
smb_llist_remove(&se->e_vfs_list, smb_vfs);
- smb_vfs_destroy(se, smb_vfs);
+ smb_vfs_destroy(smb_vfs);
}
smb_llist_exit(&se->e_vfs_list);
}
@@ -155,9 +155,9 @@ smb_vfs_find(smb_export_t *se, vfs_t *vfsp)
}
static void
-smb_vfs_destroy(smb_export_t *se, smb_vfs_t *smb_vfs)
+smb_vfs_destroy(smb_vfs_t *smb_vfs)
{
VN_RELE(smb_vfs->sv_rootvp);
smb_vfs->sv_magic = (uint32_t)~SMB_VFS_MAGIC;
- kmem_cache_free(se->e_cache_vfs, smb_vfs);
+ kmem_cache_free(smb_kshare_cache_vfs, smb_vfs);
}
diff --git a/usr/src/uts/common/fs/smbsrv/smb_vops.c b/usr/src/uts/common/fs/smbsrv/smb_vops.c
index 7ba0acfe63..91bf0083c1 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_vops.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_vops.c
@@ -111,7 +111,7 @@ typedef struct smb_catia_map
smb_wchar_t winchar; /* v5 */
} smb_catia_map_t;
-smb_catia_map_t catia_maps[SMB_CATIA_NUM_MAPS] =
+smb_catia_map_t const catia_maps[SMB_CATIA_NUM_MAPS] =
{
{'"', SMB_CATIA_WIN_DIAERESIS},
{'*', SMB_CATIA_WIN_CURRENCY},
@@ -135,7 +135,7 @@ static void smb_vop_catia_init();
extern sysid_t lm_alloc_sysidt();
#define SMB_AT_MAX 16
-static uint_t smb_attrmap[SMB_AT_MAX] = {
+static const uint_t smb_attrmap[SMB_AT_MAX] = {
0,
AT_TYPE,
AT_MODE,
@@ -173,6 +173,8 @@ smb_vop_init(void)
* Since the CIFS server is mapping its locks to POSIX locks,
* only one pid is used for operations originating from the
* CIFS server (to represent CIFS in the VOP_FRLOCK routines).
+ *
+ * XXX: Should smb_ct be per-zone?
*/
smb_ct.cc_sysid = lm_alloc_sysidt();
if (smb_ct.cc_sysid == LM_NOSYSID)
@@ -490,7 +492,8 @@ smb_vop_setattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *attr,
if (at_size) {
attr->sa_vattr.va_mask = AT_SIZE;
- error = VOP_SETATTR(vp, &attr->sa_vattr, flags, kcred, &smb_ct);
+ error = VOP_SETATTR(vp, &attr->sa_vattr, flags,
+ zone_kcred(), &smb_ct);
}
return (error);
@@ -622,7 +625,8 @@ smb_vop_lookup(
if (attr != NULL) {
attr->sa_mask = SMB_AT_ALL;
- (void) smb_vop_getattr(*vpp, NULL, attr, 0, kcred);
+ (void) smb_vop_getattr(*vpp, NULL, attr, 0,
+ zone_kcred());
}
}
@@ -1254,7 +1258,8 @@ smb_vop_acl_type(vnode_t *vp)
int error;
ulong_t whichacl;
- error = VOP_PATHCONF(vp, _PC_ACL_ENABLED, &whichacl, kcred, NULL);
+ error = VOP_PATHCONF(vp, _PC_ACL_ENABLED, &whichacl,
+ zone_kcred(), NULL);
if (error != 0) {
/*
* If we got an error, then the filesystem
@@ -1286,14 +1291,14 @@ smb_vop_acl_type(vnode_t *vp)
return (ACE_T);
}
-static int zfs_perms[] = {
+static const int zfs_perms[] = {
ACE_READ_DATA, ACE_WRITE_DATA, ACE_APPEND_DATA, ACE_READ_NAMED_ATTRS,
ACE_WRITE_NAMED_ATTRS, ACE_EXECUTE, ACE_DELETE_CHILD,
ACE_READ_ATTRIBUTES, ACE_WRITE_ATTRIBUTES, ACE_DELETE, ACE_READ_ACL,
ACE_WRITE_ACL, ACE_WRITE_OWNER, ACE_SYNCHRONIZE
};
-static int unix_perms[] = { VREAD, VWRITE, VEXEC };
+static const int unix_perms[] = { VREAD, VWRITE, VEXEC };
/*
* smb_vop_eaccess
*
diff --git a/usr/src/uts/common/fs/smbsrv/smb_vss.c b/usr/src/uts/common/fs/smbsrv/smb_vss.c
index 786d4d75ef..6cf5fca371 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_vss.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_vss.c
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
*/
@@ -55,9 +56,10 @@ static uint32_t smb_vss_encode_gmttokens(smb_request_t *, smb_xa_t *,
int32_t, smb_gmttoken_response_t *);
static void smb_vss_remove_first_token_from_path(char *);
-static uint32_t smb_vss_get_count(char *);
-static void smb_vss_map_gmttoken(char *, char *, char *);
-static void smb_vss_get_snapshots(char *, uint32_t, smb_gmttoken_response_t *);
+static uint32_t smb_vss_get_count(smb_tree_t *, char *);
+static void smb_vss_map_gmttoken(smb_tree_t *, char *, char *, char *);
+static void smb_vss_get_snapshots(smb_tree_t *, char *,
+ uint32_t, smb_gmttoken_response_t *);
static void smb_vss_get_snapshots_free(smb_gmttoken_response_t *);
static int smb_vss_lookup_node(smb_request_t *sr, smb_node_t *, vnode_t *,
char *, smb_node_t *, char *, smb_node_t **);
@@ -91,7 +93,7 @@ smb_vss_ioctl_enumerate_snaps(smb_request_t *sr, smb_xa_t *xa)
return (NT_STATUS_INVALID_PARAMETER);
if (xa->smb_mdrcnt == SMB_VSS_COUNT_SIZE) {
- count = smb_vss_get_count(root_path);
+ count = smb_vss_get_count(sr->tid_tree, root_path);
if (smb_mbc_encodef(&xa->rep_data_mb, "lllw", count, 0,
(count * SMB_VSS_GMT_NET_SIZE(sr) +
smb_ascii_or_unicode_null_len(sr)), 0) != 0) {
@@ -100,7 +102,8 @@ smb_vss_ioctl_enumerate_snaps(smb_request_t *sr, smb_xa_t *xa)
} else {
count = xa->smb_mdrcnt / SMB_VSS_GMT_NET_SIZE(sr);
- smb_vss_get_snapshots(root_path, count, &gmttokens);
+ smb_vss_get_snapshots(sr->tid_tree, root_path,
+ count, &gmttokens);
status = smb_vss_encode_gmttokens(sr, xa, count, &gmttokens);
@@ -170,7 +173,7 @@ smb_vss_lookup_nodes(smb_request_t *sr, smb_node_t *root_node,
return (err);
*snapname = '\0';
- smb_vss_map_gmttoken(path, gmttoken, snapname);
+ smb_vss_map_gmttoken(sr->tid_tree, path, gmttoken, snapname);
if (!*snapname)
return (ENOENT);
@@ -222,8 +225,8 @@ smb_vss_lookup_node(smb_request_t *sr, smb_node_t *node, vnode_t *fsrootvp,
if (err == 0) {
vp = smb_lookuppathvptovp(sr, path, fsrootvp, fsrootvp);
if (vp) {
- *vss_node = smb_node_lookup(sr, NULL, kcred, vp,
- odname, dnode, NULL);
+ *vss_node = smb_node_lookup(sr, NULL, zone_kcred(),
+ vp, odname, dnode, NULL);
VN_RELE(vp);
}
}
@@ -350,7 +353,7 @@ smb_vss_remove_first_token_from_path(char *path)
* of the path provided.
*/
static uint32_t
-smb_vss_get_count(char *resource_path)
+smb_vss_get_count(smb_tree_t *tree, char *resource_path)
{
uint32_t count = 0;
int rc;
@@ -358,7 +361,7 @@ smb_vss_get_count(char *resource_path)
path.buf = resource_path;
- rc = smb_kdoor_upcall(SMB_DR_VSS_GET_COUNT,
+ rc = smb_kdoor_upcall(tree->t_server, SMB_DR_VSS_GET_COUNT,
&path, smb_string_xdr, &count, xdr_uint32_t);
if (rc != 0)
@@ -375,8 +378,8 @@ smb_vss_get_count(char *resource_path)
* Call smb_vss_get_snapshots_free after to free up the data.
*/
static void
-smb_vss_get_snapshots(char *resource_path, uint32_t count,
- smb_gmttoken_response_t *gmttokens)
+smb_vss_get_snapshots(smb_tree_t *tree, char *resource_path,
+ uint32_t count, smb_gmttoken_response_t *gmttokens)
{
smb_gmttoken_query_t request;
@@ -384,7 +387,7 @@ smb_vss_get_snapshots(char *resource_path, uint32_t count,
request.gtq_path = resource_path;
bzero(gmttokens, sizeof (smb_gmttoken_response_t));
- (void) smb_kdoor_upcall(SMB_DR_VSS_GET_SNAPSHOTS,
+ (void) smb_kdoor_upcall(tree->t_server, SMB_DR_VSS_GET_SNAPSHOTS,
&request, smb_gmttoken_query_xdr,
gmttokens, smb_gmttoken_response_xdr);
}
@@ -401,7 +404,8 @@ smb_vss_get_snapshots_free(smb_gmttoken_response_t *reply)
* is returned.
*/
static void
-smb_vss_map_gmttoken(char *path, char *gmttoken, char *snapname)
+smb_vss_map_gmttoken(smb_tree_t *tree, char *path, char *gmttoken,
+ char *snapname)
{
smb_gmttoken_snapname_t request;
smb_string_t result;
@@ -412,7 +416,7 @@ smb_vss_map_gmttoken(char *path, char *gmttoken, char *snapname)
request.gts_path = path;
request.gts_gmttoken = gmttoken;
- (void) smb_kdoor_upcall(SMB_DR_VSS_MAP_GMTTOKEN,
+ (void) smb_kdoor_upcall(tree->t_server, SMB_DR_VSS_MAP_GMTTOKEN,
&request, smb_gmttoken_snapname_xdr,
&result, smb_string_xdr);
}
diff --git a/usr/src/uts/common/smbsrv/cp_unicode.h b/usr/src/uts/common/smbsrv/cp_unicode.h
index 187aadd34e..1eceb3f93d 100644
--- a/usr/src/uts/common/smbsrv/cp_unicode.h
+++ b/usr/src/uts/common/smbsrv/cp_unicode.h
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -39,7 +40,7 @@ struct unicode_cp {
smb_wchar_t upper;
};
-struct unicode_cp a_unicode[] = {
+const struct unicode_cp a_unicode[] = {
{ 0x0000, CODEPAGE_ISNONE, 0xFFFF, 0xFFFF },
{ 0x0001, CODEPAGE_ISNONE, 0xFFFF, 0xFFFF },
{ 0x0002, CODEPAGE_ISNONE, 0xFFFF, 0xFFFF },
diff --git a/usr/src/uts/common/smbsrv/cp_usascii.h b/usr/src/uts/common/smbsrv/cp_usascii.h
index 63e830ca03..80cbefefa6 100644
--- a/usr/src/uts/common/smbsrv/cp_usascii.h
+++ b/usr/src/uts/common/smbsrv/cp_usascii.h
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -37,7 +38,7 @@
extern "C" {
#endif
-smb_codepage_t usascii_codepage[256] = {
+const smb_codepage_t usascii_codepage[256] = {
{ CODEPAGE_ISNONE, 0x0000, 0x0000 }, /* 0x0000 */
{ CODEPAGE_ISNONE, 0x0001, 0x0001 }, /* 0x0001 */
{ CODEPAGE_ISNONE, 0x0002, 0x0002 }, /* 0x0002 */
diff --git a/usr/src/uts/common/smbsrv/mbuf.h b/usr/src/uts/common/smbsrv/mbuf.h
index 8f16d6f4ef..4b66be8715 100644
--- a/usr/src/uts/common/smbsrv/mbuf.h
+++ b/usr/src/uts/common/smbsrv/mbuf.h
@@ -19,6 +19,7 @@
* CDDL HEADER END
*/
/*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -278,7 +279,7 @@ typedef struct mbuf_chain {
mbuf_t *m_free(mbuf_t *);
void m_freem(mbuf_t *);
int mbc_moveout(mbuf_chain_t *, caddr_t, int, int *);
-int smb_mbc_init(void);
+void smb_mbc_init(void);
void smb_mbc_fini(void);
mbuf_chain_t *smb_mbc_alloc(uint32_t);
void smb_mbc_free(mbuf_chain_t *);
diff --git a/usr/src/uts/common/smbsrv/smb_kproto.h b/usr/src/uts/common/smbsrv/smb_kproto.h
index 0e63be43f1..6ed28d2bb8 100644
--- a/usr/src/uts/common/smbsrv/smb_kproto.h
+++ b/usr/src/uts/common/smbsrv/smb_kproto.h
@@ -80,6 +80,17 @@ extern int smbsrv_worker_pri;
extern int smbsrv_notify_pri;
extern int smbsrv_timer_pri;
+extern kmem_cache_t *smb_cache_request;
+extern kmem_cache_t *smb_cache_session;
+extern kmem_cache_t *smb_cache_user;
+extern kmem_cache_t *smb_cache_tree;
+extern kmem_cache_t *smb_cache_ofile;
+extern kmem_cache_t *smb_cache_odir;
+extern kmem_cache_t *smb_cache_opipe;
+extern kmem_cache_t *smb_cache_event;
+
+extern kmem_cache_t *smb_kshare_cache_vfs;
+
int fd_dealloc(int);
off_t lseek(int fildes, off_t offset, int whence);
@@ -88,6 +99,9 @@ int arpioctl(int cmd, void *data);
int microtime(timestruc_t *tvp);
int clock_get_uptime(void);
+int smb_server_lookup(smb_server_t **);
+void smb_server_release(smb_server_t *);
+
/*
* SMB request handers called from the dispatcher. Each SMB request
* is handled in three phases: pre, com (command) and post.
@@ -276,9 +290,10 @@ uint32_t smb_omode_to_amask(uint32_t desired_access);
void sshow_distribution_info(char *);
-void smb_dispatch_stats_init(smb_kstat_req_t *);
-void smb_dispatch_stats_fini(void);
-void smb_dispatch_stats_update(smb_kstat_req_t *, int, int);
+void smb_dispatch_stats_init(smb_server_t *);
+void smb_dispatch_stats_fini(smb_server_t *);
+void smb_dispatch_stats_update(smb_server_t *,
+ smb_kstat_req_t *, int, int);
boolean_t smb_dispatch_request(smb_request_t *);
int smbsr_encode_empty_result(smb_request_t *);
@@ -331,7 +346,7 @@ ksocket_t smb_socreate(int domain, int type, int protocol);
void smb_soshutdown(ksocket_t so);
void smb_sodestroy(ksocket_t so);
int smb_sorecv(ksocket_t so, void *msg, size_t len);
-int smb_net_init(void);
+void smb_net_init(void);
void smb_net_fini(void);
void smb_net_txl_constructor(smb_txlst_t *);
void smb_net_txl_destructor(smb_txlst_t *);
@@ -350,43 +365,44 @@ smb_sdrc_t smb_opipe_transact(smb_request_t *, struct uio *);
int smb_opipe_read(smb_request_t *, struct uio *);
int smb_opipe_write(smb_request_t *, struct uio *);
-void smb_opipe_door_init(void);
-void smb_opipe_door_fini(void);
-int smb_opipe_door_open(int);
-void smb_opipe_door_close(void);
+void smb_opipe_door_init(smb_server_t *);
+void smb_opipe_door_fini(smb_server_t *);
+int smb_opipe_door_open(smb_server_t *, int);
+void smb_opipe_door_close(smb_server_t *);
-void smb_kdoor_init(void);
-void smb_kdoor_fini(void);
-int smb_kdoor_open(int);
-void smb_kdoor_close(void);
-int smb_kdoor_upcall(uint32_t, void *, xdrproc_t, void *, xdrproc_t);
+void smb_kdoor_init(smb_server_t *);
+void smb_kdoor_fini(smb_server_t *);
+int smb_kdoor_open(smb_server_t *, int);
+void smb_kdoor_close(smb_server_t *);
+int smb_kdoor_upcall(smb_server_t *, uint32_t,
+ void *, xdrproc_t, void *, xdrproc_t);
/*
* SMB server functions (file smb_server.c)
*/
-int smb_server_svc_init(void);
-int smb_server_svc_fini(void);
+int smb_server_g_init(void);
+int smb_server_g_fini(void);
int smb_server_create(void);
int smb_server_delete(void);
int smb_server_configure(smb_ioc_cfg_t *);
int smb_server_start(smb_ioc_start_t *);
int smb_server_stop(void);
-boolean_t smb_server_is_stopping(void);
-int smb_server_cancel_event(uint32_t);
+boolean_t smb_server_is_stopping(smb_server_t *);
+void smb_server_cancel_event(smb_server_t *, uint32_t);
int smb_server_notify_event(smb_ioc_event_t *);
-uint32_t smb_server_get_session_count(void);
+uint32_t smb_server_get_session_count(smb_server_t *);
int smb_server_set_gmtoff(smb_ioc_gmt_t *);
int smb_server_numopen(smb_ioc_opennum_t *);
int smb_server_enum(smb_ioc_svcenum_t *);
int smb_server_session_close(smb_ioc_session_t *);
int smb_server_file_close(smb_ioc_fileid_t *);
-int smb_server_sharevp(const char *, vnode_t **);
+int smb_server_sharevp(smb_server_t *, const char *, vnode_t **);
int smb_server_unshare(const char *);
void smb_server_get_cfg(smb_server_t *, smb_kmod_cfg_t *);
int smb_server_spooldoc(smb_ioc_spooldoc_t *);
-int smb_spool_add_doc(smb_kspooldoc_t *);
+int smb_spool_add_doc(smb_tree_t *, smb_kspooldoc_t *);
void smb_spool_add_fid(smb_server_t *, uint16_t);
void smb_server_inc_nbt_sess(smb_server_t *);
@@ -405,7 +421,7 @@ void smb_server_add_rxb(smb_server_t *, int64_t);
void smb_server_add_txb(smb_server_t *, int64_t);
void smb_server_inc_req(smb_server_t *);
-smb_event_t *smb_event_create(int);
+smb_event_t *smb_event_create(smb_server_t *, int);
void smb_event_destroy(smb_event_t *);
uint32_t smb_event_txid(smb_event_t *);
int smb_event_wait(smb_event_t *);
@@ -414,7 +430,7 @@ void smb_event_notify(smb_server_t *, uint32_t);
/*
* SMB node functions (file smb_node.c)
*/
-int smb_node_init(void);
+void smb_node_init(void);
void smb_node_fini(void);
smb_node_t *smb_node_lookup(smb_request_t *, smb_arg_open_t *,
cred_t *, vnode_t *, char *, smb_node_t *, smb_node_t *);
@@ -424,7 +440,7 @@ smb_node_t *smb_stream_node_lookup(smb_request_t *, cred_t *,
void smb_node_ref(smb_node_t *);
void smb_node_release(smb_node_t *);
void smb_node_rename(smb_node_t *, smb_node_t *, smb_node_t *, char *);
-int smb_node_root_init(vnode_t *, smb_server_t *, smb_node_t **);
+int smb_node_root_init(smb_server_t *, smb_node_t **);
void smb_node_add_lock(smb_node_t *, smb_lock_t *);
void smb_node_destroy_lock(smb_node_t *, smb_lock_t *);
void smb_node_destroy_lock_by_ofile(smb_node_t *, smb_ofile_t *);
@@ -491,8 +507,10 @@ void smb_vfs_rele_all(smb_export_t *);
void smb_notify_event(smb_node_t *, uint_t, const char *);
void smb_notify_file_closed(smb_ofile_t *of);
-void smb_fem_fcn_install(smb_node_t *);
+int smb_fem_fcn_install(smb_node_t *);
void smb_fem_fcn_uninstall(smb_node_t *);
+int smb_fem_oplock_install(smb_node_t *);
+void smb_fem_oplock_uninstall(smb_node_t *);
/* FEM */
@@ -504,6 +522,7 @@ int smb_try_grow(smb_request_t *sr, int64_t new_size);
unsigned short smb_worker_getnum();
/* SMB signing routines smb_signing.c */
+void smb_sign_g_init(void);
void smb_sign_init(smb_request_t *, smb_session_key_t *, char *, int);
int smb_sign_check_request(smb_request_t *);
int smb_sign_check_secondary(smb_request_t *, unsigned int);
@@ -631,7 +650,7 @@ cred_t *smb_user_getprivcred(smb_user_t *);
void smb_user_netinfo_init(smb_user_t *, smb_netuserinfo_t *);
void smb_user_netinfo_fini(smb_netuserinfo_t *);
int smb_user_netinfo_encode(smb_user_t *, uint8_t *, size_t, uint32_t *);
-smb_token_t *smb_get_token(smb_logon_t *);
+smb_token_t *smb_get_token(smb_session_t *, smb_logon_t *);
/*
* SMB tree functions (file smb_tree.c)
@@ -803,26 +822,31 @@ void *smb_srm_realloc(smb_request_t *, void *, size_t);
void *smb_srm_rezalloc(smb_request_t *, void *, size_t);
char *smb_srm_strdup(smb_request_t *, const char *);
-void smb_export_start(void);
-void smb_export_stop(void);
+void smb_export_start(smb_server_t *);
+void smb_export_stop(smb_server_t *);
door_handle_t smb_kshare_door_init(int);
void smb_kshare_door_fini(door_handle_t);
int smb_kshare_upcall(door_handle_t, void *, boolean_t);
-int smb_kshare_init(void);
-void smb_kshare_fini(void);
+void smb_kshare_g_init(void);
+void smb_kshare_g_fini(void);
+void smb_kshare_init(smb_server_t *);
+void smb_kshare_fini(smb_server_t *);
+int smb_kshare_start(smb_server_t *);
+void smb_kshare_stop(smb_server_t *);
+
int smb_kshare_export_list(smb_ioc_share_t *);
int smb_kshare_unexport_list(smb_ioc_share_t *);
int smb_kshare_info(smb_ioc_shareinfo_t *);
-void smb_kshare_enum(smb_enumshare_info_t *);
-smb_kshare_t *smb_kshare_lookup(const char *);
-void smb_kshare_release(smb_kshare_t *);
-int smb_kshare_exec(smb_shr_execinfo_t *);
-uint32_t smb_kshare_hostaccess(smb_kshare_t *, smb_inaddr_t *);
+void smb_kshare_enum(smb_server_t *, smb_enumshare_info_t *);
+smb_kshare_t *smb_kshare_lookup(smb_server_t *, const char *);
+void smb_kshare_release(smb_server_t *, smb_kshare_t *);
+int smb_kshare_exec(smb_server_t *, smb_shr_execinfo_t *);
+uint32_t smb_kshare_hostaccess(smb_kshare_t *, smb_session_t *);
-void smb_avl_create(smb_avl_t *, size_t, size_t, smb_avl_nops_t *);
+void smb_avl_create(smb_avl_t *, size_t, size_t, const smb_avl_nops_t *);
void smb_avl_destroy(smb_avl_t *);
int smb_avl_add(smb_avl_t *, void *);
void smb_avl_remove(smb_avl_t *, void *);
@@ -831,7 +855,8 @@ void smb_avl_release(smb_avl_t *, void *);
void smb_avl_iterinit(smb_avl_t *, smb_avl_cursor_t *);
void *smb_avl_iterate(smb_avl_t *, smb_avl_cursor_t *);
-void smb_threshold_init(smb_cmd_threshold_t *, char *, int, int);
+void smb_threshold_init(smb_cmd_threshold_t *, smb_server_t *,
+ char *, int, int);
void smb_threshold_fini(smb_cmd_threshold_t *);
int smb_threshold_enter(smb_cmd_threshold_t *);
void smb_threshold_exit(smb_cmd_threshold_t *, smb_server_t *);
diff --git a/usr/src/uts/common/smbsrv/smb_ktypes.h b/usr/src/uts/common/smbsrv/smb_ktypes.h
index f511223be7..5490163dfe 100644
--- a/usr/src/uts/common/smbsrv/smb_ktypes.h
+++ b/usr/src/uts/common/smbsrv/smb_ktypes.h
@@ -64,6 +64,7 @@ struct smb_disp_entry;
struct smb_request;
struct smb_server;
struct smb_event;
+struct smb_export;
/*
* Accumulated time and queue length statistics.
@@ -151,6 +152,12 @@ typedef struct smb_latency {
hrtime_t ly_d_stddev;
} smb_latency_t;
+typedef struct smb_disp_stats {
+ volatile uint64_t sdt_txb;
+ volatile uint64_t sdt_rxb;
+ smb_latency_t sdt_lat;
+} smb_disp_stats_t;
+
int smb_noop(void *, size_t, int);
#define SMB_AUDIT_STACK_DEPTH 16
@@ -441,7 +448,7 @@ typedef struct smb_avl {
smb_avl_state_t avl_state;
uint32_t avl_refcnt;
uint32_t avl_sequence;
- smb_avl_nops_t *avl_nops;
+ const smb_avl_nops_t *avl_nops;
} smb_avl_t;
typedef struct {
@@ -451,6 +458,15 @@ typedef struct {
boolean_t rwx_waiting;
} smb_rwx_t;
+typedef struct smb_export {
+ kmutex_t e_mutex;
+ boolean_t e_ready;
+ smb_llist_t e_vfs_list;
+ smb_avl_t e_share_avl;
+ smb_slist_t e_unexport_list;
+ smb_thread_t e_unexport_thread;
+} smb_export_t;
+
/* NOTIFY CHANGE */
typedef struct smb_node_fcn {
kmutex_t fcn_mutex;
@@ -666,7 +682,6 @@ typedef struct smb_kshare {
char *shr_access_ro;
char *shr_access_rw;
avl_node_t shr_link;
- kmem_cache_t *shr_cache;
kmutex_t shr_mutex;
} smb_kshare_t;
@@ -882,11 +897,10 @@ typedef struct smb_session {
smb_session_state_t s_state;
uint32_t s_flags;
int s_write_raw_status;
+ taskqid_t s_receiver_tqid;
kthread_t *s_thread;
kt_did_t s_ktdid;
smb_kmod_cfg_t s_cfg;
- kmem_cache_t *s_cache;
- kmem_cache_t *s_cache_request;
struct smb_server *s_server;
int32_t s_gmtoff;
uint32_t keep_alive;
@@ -1574,7 +1588,6 @@ typedef struct smb_request {
kmutex_t sr_mutex;
list_node_t sr_session_lnd;
smb_req_state_t sr_state;
- kmem_cache_t *sr_cache;
struct smb_server *sr_server;
pid_t *sr_pid;
int32_t sr_gmtoff;
@@ -1843,8 +1856,23 @@ typedef struct smb_server {
smb_kmod_cfg_t sv_cfg;
smb_session_t *sv_session;
+ struct smb_export sv_export;
door_handle_t sv_lmshrd;
+ /* Internal door for up-calls to smbd */
+ door_handle_t sv_kdoor_hd;
+ int sv_kdoor_id; /* init -1 */
+ uint64_t sv_kdoor_ncall;
+ kmutex_t sv_kdoor_mutex;
+ kcondvar_t sv_kdoor_cv;
+
+ /* RPC pipes (client side) */
+ door_handle_t sv_opipe_door_hd;
+ int sv_opipe_door_id;
+ uint64_t sv_opipe_door_ncall;
+ kmutex_t sv_opipe_door_mutex;
+ kcondvar_t sv_opipe_door_cv;
+
int32_t si_gmtoff;
smb_thread_t si_thread_timers;
@@ -1852,15 +1880,6 @@ typedef struct smb_server {
taskq_t *sv_worker_pool;
taskq_t *sv_receiver_pool;
- kmem_cache_t *si_cache_request;
- kmem_cache_t *si_cache_session;
- kmem_cache_t *si_cache_user;
- kmem_cache_t *si_cache_tree;
- kmem_cache_t *si_cache_ofile;
- kmem_cache_t *si_cache_odir;
- kmem_cache_t *si_cache_opipe;
- kmem_cache_t *si_cache_event;
-
smb_node_t *si_root_smb_node;
smb_llist_t sv_opipe_list;
smb_llist_t sv_event_list;
@@ -1884,6 +1903,7 @@ typedef struct smb_server {
smb_cmd_threshold_t sv_opipe_ct;
kstat_t *sv_legacy_ksp;
kmutex_t sv_legacy_ksmtx;
+ smb_disp_stats_t *sv_disp_stats;
} smb_server_t;
#define SMB_EVENT_MAGIC 0x45564E54 /* EVNT */
@@ -1943,9 +1963,6 @@ typedef struct smb_disp_entry {
uint8_t sdt_com;
char sdt_dialect;
uint8_t sdt_flags;
- volatile uint64_t sdt_txb;
- volatile uint64_t sdt_rxb;
- smb_latency_t sdt_lat;
} smb_disp_entry_t;
typedef struct smb_xlate {
@@ -1953,20 +1970,6 @@ typedef struct smb_xlate {
char *str;
} smb_xlate_t;
-typedef struct smb_export {
- kmutex_t e_mutex;
- boolean_t e_ready;
- smb_llist_t e_vfs_list;
- smb_avl_t e_share_avl;
- smb_slist_t e_unexport_list;
-
- kmem_cache_t *e_cache_share;
- kmem_cache_t *e_cache_vfs;
- kmem_cache_t *e_cache_unexport;
-
- smb_thread_t e_unexport_thread;
-} smb_export_t;
-
/*
* This structure is a helper for building RAP NetShareEnum response
*
diff --git a/usr/src/uts/common/smbsrv/smb_vops.h b/usr/src/uts/common/smbsrv/smb_vops.h
index 579dfe3fae..5262509749 100644
--- a/usr/src/uts/common/smbsrv/smb_vops.h
+++ b/usr/src/uts/common/smbsrv/smb_vops.h
@@ -47,7 +47,6 @@
extern "C" {
#endif
-#define ROOTVOL ""
#define XATTR_DIR "xattr_dir"
#define SMB_STREAM_PREFIX "SUNWsmb"