smb_server.c revision faa1795a28a5c712eed6d0a3f84d98c368a316c6
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * CDDL HEADER START
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * The contents of this file are subject to the terms of the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Common Development and Distribution License (the "License").
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * You may not use this file except in compliance with the License.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * See the License for the specific language governing permissions
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * and limitations under the License.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * When distributing Covered Code, include this CDDL HEADER in each
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * If applicable, add the following below this CDDL HEADER, with the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * fields enclosed by brackets "[]" replaced with your own identifying
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * information: Portions Copyright [yyyy] [name of copyright owner]
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * CDDL HEADER END
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Use is subject to license terms.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb#pragma ident "%Z%%M% %I% %E% SMI"
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * General Structures Layout
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * -------------------------
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This is a simplified diagram showing the relationship between most of the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * main structures.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | SMB_SERVER |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------------------+ +-------------------+ +-------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | SESSION |<----->| SESSION |......| SESSION |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------------------+ +-------------------+ +-------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------------------+ +-------------------+ +-------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | USER |<----->| USER |......| USER |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------------------+ +-------------------+ +-------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------------------+ +-------------------+ +-------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | TREE |<----->| TREE |......| TREE |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------------------+ +-------------------+ +-------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | +-------+ +-------+ +-------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | | OFILE |<----->| OFILE |......| OFILE |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | +-------+ +-------+ +-------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------+ +------+ +------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | ODIR |<----->| ODIR |......| ODIR |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-------+ +------+ +------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Module Interface Overview
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * -------------------------
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +===================================+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | smbd daemon |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +===================================+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * User | | |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * -----------|--------------|----------------|--------------------------------
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Kernel | | |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +=========|==============|================|=================+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | v v | |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | +-----------+ +--------------------+ +------------------+ |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | | IO | | Kernel Door Server | | User Door Servers| |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | | Interface | | Interface | | Interface | |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | +-----------+ +--------------------+ +------------------+ |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | | | ^ ^ |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | v v | | | +=========+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | +-----------------------------------+ | | | |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | + SMB Server Management (this file) |<------------------| ZFS |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | +-----------------------------------+ | | | |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | | | | Module |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | +-----------------------------------+ | | | |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | + SMB Server Internal Layers |------+ | +=========+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | +-----------------------------------+ |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +===========================================================+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Server State Machine
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * --------------------
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-----------------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | SMB_SERVER_STATE_CREATED |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-----------------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-----------------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | SMB_SERVER_STATE_CONFIGURED |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-----------------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-----------------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | SMB_SERVER_STATE_RUNNING |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-----------------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-----------------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * | SMB_SERVER_STATE_DELETING |
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * +-----------------------------+
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * SMB_SERVER_STATE_CREATED
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This is the state of the server just after creation.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * SMB_SERVER_STATE_CONFIGURED
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * The server has been configured.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * SMB_SERVER_STATE_RUNNING
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * The server has been started. While in this state the threads listening on
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * the sockets car be started. The smbd daemon does so through an Ioctl:
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_drv_ioctl(SMB_IOC_NBT_LISTEN) --> smb_server_nbt_listen()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_drv_ioctl(SMB_IOC_TCP_LISTEN) --> smb_server_nbt_listen()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * When a client establishes a connection the thread listening leaves
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * temporarily the kernel. While in user space it creates a thread for the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * new session. It then returns to kernel with the result of the thread
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * creation. If the creation failed the new session context is destroyed
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * before returning listening.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * The new created thread enters the kernel though an Ioctl:
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_drv_ioctl(SMB_IOC_NBT_RECEIVE) --> smb_server_nbt_receive()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_drv_ioctl(SMB_IOC_TCP_RECEIVE) --> smb_server_tcp_receive()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * SMB_SERVER_STATE_STOPPING
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * The threads listening on the NBT and TCP sockets are being terminated.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Transitions
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * -----------
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Transition T0
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * The daemon smbd triggers its creation by opening the smbsrv device. If
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * the zone where the daemon lives doesn't have an smb server yet it is
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * created.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_drv_open() --> smb_server_create()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Transition T1
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This transition occurs in smb_server_configure(). It is triggered by the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * daemon through an Ioctl.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_drv_ioctl(SMB_IOC_CONFIG) --> smb_server_configure()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Transition T2
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This transition occurs in smb_server_start(). It is triggered by the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * daemon through an Ioctl.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_drv_ioctl(SMB_IOC_START) --> smb_server_start()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Transition T3
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This transition occurs in smb_server_delete(). It is triggered by the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * daemon when closing the smbsrv device
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_drv_close() --> smb_server_delete()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Comments
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * --------
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This files assumes that there will one SMB server per zone. For now the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb server works only in global zone. There's nothing in this file preventing
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * an smb server from being created in a non global zone. That limitation is
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * enforced in user space.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbextern void smb_dispatch_kstat_init(void);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbextern void smb_dispatch_kstat_fini(void);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbextern void smb_reply_notify_change_request(smb_request_t *);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic int smb_server_listen(smb_server_t *, smb_listener_daemon_t *,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic int smb_server_ulist_geti(smb_session_list_t *, int, smb_dr_user_ctx_t *,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic void smb_server_store_cfg(smb_server_t *, smb_kmod_cfg_t *);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *****************************************************************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * **************** Functions called from the device interface *****************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *****************************************************************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * These functions determine the relevant smb server to which the call apply.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_svc_init
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This function must called from smb_drv_attach().
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb while (rc == 0) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_llist_constructor(&smb_servers, sizeof (smb_server_t),
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_svc_fini
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This function must called from smb_drv_detach(). It will fail if servers
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * still exist.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_create
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This function will fail if there's already a server associated with the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * caller's zone.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb while (sv) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_llist_constructor(&sv->sv_vfs_list, sizeof (smb_vfs_t),
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_list_constructor(&sv->sv_nbt_daemon.ld_session_list);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_list_constructor(&sv->sv_tcp_daemon.ld_session_list);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sv->si_cache_request = kmem_cache_create("smb_request_cache",
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sizeof (smb_request_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sv->si_cache_session = kmem_cache_create("smb_session_cache",
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sizeof (smb_session_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sizeof (smb_user_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sizeof (smb_tree_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sv->si_cache_ofile = kmem_cache_create("smb_ofile_cache",
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sizeof (smb_ofile_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sizeof (smb_odir_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sizeof (smb_node_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_delete
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This function will delete the server passed in. It will make sure that all
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * activity associated that server has ceased before destroying it.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (rc != 0)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_configure
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_start
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * XXX We give up the NET_MAC_AWARE privilege because it keeps
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * us from re-opening the connection when there are leftover TCP
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * connections in TCPS_TIME_WAIT state. There seem to be some
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * security ramifications around reestablishing a connection
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * while possessing the NET_MAC_AWARE privilege.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This approach may cause problems when we try to support
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * zones. An alternative would be to retry the connection setup
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * for a fixed period of time until the stale connections clear
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * up but that implies we would be offline for a couple minutes
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * every time the service is restarted with active connections.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb "Cannot remove NET_MAC_AWARE privilege");
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_nbt_listen: SMB-over-NetBIOS service
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Traditional SMB service over NetBIOS (port 139), which requires
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * that a NetBIOS session be established.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb rc = smb_server_listen(sv, &sv->sv_nbt_daemon, SSN_SRVC_TCP_PORT,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb rc = smb_server_listen(sv, &sv->sv_tcp_daemon, SMB_SRVC_TCP_PORT,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_nbt_receive
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb rc = smb_session_daemon(&sv->sv_nbt_daemon.ld_session_list);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_tcp_receive
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb rc = smb_session_daemon(&sv->sv_tcp_daemon.ld_session_list);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *****************************************************************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * ****************** Functions called from the door interface *****************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *****************************************************************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * These functions determine the relevant smb server to which the call apply.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb rw_enter(&sv->sv_nbt_daemon.ld_session_list.se_lock, RW_READER);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb counter = sv->sv_nbt_daemon.ld_session_list.se_act.count;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb rw_enter(&sv->sv_tcp_daemon.ld_session_list.se_lock, RW_READER);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb counter += sv->sv_tcp_daemon.ld_session_list.se_act.count;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_session_disconnect_share
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Disconnects the specified share. This function should be called after the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * share passed in has been made unavailable by the "share manager".
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_disconnect_share(&sv->sv_nbt_daemon.ld_session_list,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_disconnect_share(&sv->sv_tcp_daemon.ld_session_list,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_disconnect_volume(&sv->sv_nbt_daemon.ld_session_list, fsd);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_disconnect_volume(&sv->sv_tcp_daemon.ld_session_list, fsd);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbsmb_server_dr_ulist_get(int offset, smb_dr_ulist_t *dr_ulist, int max_cnt)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (-1);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (-1);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_server_ulist_geti(&sv->sv_nbt_daemon.ld_session_list,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_server_ulist_geti(&sv->sv_tcp_daemon.ld_session_list,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb offset - dr_ulist->dul_cnt, &dr_ulist->dul_users[dr_ulist->dul_cnt],
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_share_export()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This function handles kernel processing at share enable time.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * At share-enable time (LMSHRD_ADD), the file system corresponding to
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * the share is checked for characteristics that are required for SMB
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * sharing. If this check passes, then a hold is taken on the root vnode
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * of the file system (or a reference count on the corresponding smb_vfs_t
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * is bumped), preventing an unmount. (See smb_vfs_hold()).
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb error = smb_pathname_reduce(sr, kcred, path, NULL, NULL, &dnode,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb error = smb_fsop_lookup(sr, sr->user_cr, SMB_FOLLOW_LINKS, NULL, dnode,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (vfs_optionisset(fnode->vp->v_vfsp, MNTOPT_NODEVICES, NULL) == 0)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb#endif /* SMB_ENFORCE_NODEV */
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * The refcount on the smb_vfs has been incremented.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * If it wasn't already, a hold has also been taken
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * on the root vnode of the file system.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_share_unexport()
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This function handles kernel processing at share disable time.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * At share-disable time (LMSHRD_DELETE), the reference count on the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * corresponding smb_vfs_t is decremented. If this is the last share
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * on the file system, the hold on the root vnode of the file system
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * will be released. (See smb_vfs_rele().)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb error = smb_pathname_reduce(sr, kcred, path, NULL, NULL, &dnode,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb error = smb_fsop_lookup(sr, kcred, SMB_FOLLOW_LINKS, NULL, dnode,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_disconnect_share(&sv->sv_nbt_daemon.ld_session_list,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_disconnect_share(&sv->sv_tcp_daemon.ld_session_list,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This is a special interface that will be utilized by ZFS to cause a share to
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * arg is either a lmshare_info_t or share_name from userspace.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * It will need to be copied into the kernel. It is lmshare_info_t
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * for add operations and share_name for delete operations.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (rc == 0) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *****************************************************************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * **************** Functions called from the internal layers ******************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *****************************************************************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * These functions are provided the relevant smb server by the caller.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbsmb_server_reconnection_check(smb_server_t *sv, smb_session_t *session)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_reconnection_check(&sv->sv_nbt_daemon.ld_session_list,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb smb_session_reconnection_check(&sv->sv_tcp_daemon.ld_session_list,
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *****************************************************************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *************************** Static Functions ********************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * *****************************************************************************
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic void
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb while (smb_thread_continue_timedwait(thread, 1 /* Seconds */)) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_kstat_init
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb (void) snprintf(sv->sv_ksp_name, sizeof (sv->sv_ksp_name),
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sv->sv_ksp = kstat_create("smbsrv", sv->sv_zid, sv->sv_ksp_name, "net",
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb KSTAT_TYPE_NAMED, sizeof (sv->sv_ks_data) / sizeof (kstat_named_t),
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb (void) strlcpy(sv->sv_ks_data.open_files.name, "open_files",
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb (void) strlcpy(sv->sv_ks_data.open_trees.name, "connections",
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb (void) strlcpy(sv->sv_ks_data.open_users.name, "sessions",
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb mutex_init(&sv->sv_ksp_mutex, NULL, MUTEX_DEFAULT, NULL);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb /* create and initialize smb kstats - smb_dispatch stats */
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_kstat_fini
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic void
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb/* ARGSUSED */
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb _NOTE(LINTED("pointer cast may result in improper alignment"))
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sv->sv_ks_data.open_files.value.ui32 = sv->sv_open_files;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sv->sv_ks_data.open_trees.value.ui32 = sv->sv_open_trees;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb sv->sv_ks_data.open_users.value.ui32 = sv->sv_open_users;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_stop
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * The mutex of the server must have been entered before calling this function.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic void
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Delete the last session created. The user space thread
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * creation failed.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb /* First time listener */
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (rc == 0) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (rc < 0) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb DTRACE_PROBE1(so__wait__accept, struct sonode *, ld->ld_so);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb for (;;) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (rc == 0) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Create a session for this connection.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (rc);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_lookup
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This function tries to find the server associated with the zone of the
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb while (sv) {
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb return (0);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * smb_server_release
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * This function decrements the reference count of the server and signals its
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * condition variable if the state of the server is SMB_SERVER_STATE_DELETING.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic void
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if ((sv->sv_refcnt == 0) && (sv->sv_state == SMB_SERVER_STATE_DELETING))
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic void
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbsmb_server_store_cfg(smb_server_t *sv, smb_kmod_cfg_t *cfg)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * XXX should not override configuration.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * For now, this disables server side
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * signing regardless of configuration.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * XXX The following code was pulled from smb_oplock_init.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * It should be combined with with the config process if
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * this info will be stored with the configuration or with
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * the smb_fsop_start function if the data will be stored
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * in the root of the fs.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * XXX oplock enable flag.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Should be stored in extended attribute in root of fs
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * or a ZFS user-defined property.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb error = smb_node_root_init(rootdir, sv, &sv->si_root_smb_node);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbstatic void