smb_server.c revision 12b65585e720714b31036daaa2b30eb76014048e
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * General Structures Layout
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * -------------------------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This is a simplified diagram showing the relationship between most of the
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * main structures.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_SERVER |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +-------------------+ +-------------------+ +-------------------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | SESSION |<----->| SESSION |......| SESSION |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | USER |<----->| USER |......| USER |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-------------------+ +-------------------+ +-------------------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | TREE |<----->| TREE |......| TREE |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +-------------------+ +-------------------+ +-------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | +-------+ +-------+ +-------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | | OFILE |<----->| OFILE |......| OFILE |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | +-------+ +-------+ +-------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +-------+ +------+ +------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | ODIR |<----->| ODIR |......| ODIR |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +-------+ +------+ +------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * Module Interface Overview
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * -------------------------
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +===================================+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | smbd daemon |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +===================================+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * User | | |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * -----------|--------------|----------------|--------------------------------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Kernel | | |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +=========|==============|================|=================+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | +-----------+ +--------------------+ +------------------+ |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | | IO | | Kernel Door Server | | User Door Servers| |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | | Interface | | Interface | | Interface | |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | +-----------+ +--------------------+ +------------------+ |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | | | ^ ^ |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | v v | | | +=========+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | +-----------------------------------+ | | | |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | + SMB Server Management (this file) |<------------------| ZFS |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | +-----------------------------------+ | | | |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | | | | Module |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | +-----------------------------------+ | | | |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | + SMB Server Internal Layers |------+ | +=========+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | +-----------------------------------+ |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +===========================================================+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Server State Machine
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * --------------------
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_SERVER_STATE_CREATED |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_SERVER_STATE_CONFIGURED |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_SERVER_STATE_RUNNING / |
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * | SMB_SERVER_STATE_STOPPING |
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * +-----------------------------+
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * +-----------------------------+
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * | SMB_SERVER_STATE_DELETING |
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as * +-----------------------------+
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * SMB_SERVER_STATE_CREATED
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * This is the state of the server just after creation.
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * SMB_SERVER_STATE_CONFIGURED
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * The server has been configured.
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * SMB_SERVER_STATE_RUNNING
7b59d02d2a384be9a08087b14defadd214b3c1ddjb * The server has been started. While in this state the threads listening on
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * the sockets are started.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When a client establishes a connection the thread listening dispatches
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * a task with the new session as an argument. If the dispatch fails the new
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * session context is destroyed.
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * SMB_SERVER_STATE_STOPPING
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * The threads listening on the NBT and TCP sockets are being terminated.
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * Transitions
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * -----------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T0
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * The daemon smbd triggers its creation by opening the smbsrv device. If
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * the zone where the daemon lives doesn't have an smb server yet it is
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * smb_drv_open() --> smb_server_create()
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * Transition T1
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * This transition occurs in smb_server_configure(). It is triggered by the
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * daemon through an Ioctl.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_drv_ioctl(SMB_IOC_CONFIG) --> smb_server_configure()
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T2
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This transition occurs in smb_server_start(). It is triggered by the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * daemon through an Ioctl.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_drv_ioctl(SMB_IOC_START) --> smb_server_start()
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Transition T3
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This transition occurs in smb_server_delete(). It is triggered by the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * daemon when closing the smbsrv device
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_drv_close() --> smb_server_delete()
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Comments
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * --------
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This files assumes that there will one SMB server per zone. For now the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb server works only in global zone. There's nothing in this file preventing
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * an smb server from being created in a non global zone. That limitation is
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * enforced in user space.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwextern void smb_reply_notify_change_request(smb_request_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtypedef struct {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_store_cfg(smb_server_t *, smb_ioc_cfg_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_disconnect_share(smb_llist_t *, const char *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_enum_users(smb_llist_t *, smb_svcenum_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_enum_trees(smb_llist_t *, smb_svcenum_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int smb_server_session_disconnect(smb_llist_t *, const char *,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw const char *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int smb_server_legacy_kstat_update(kstat_t *, int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_listener_init(smb_server_t *, smb_listener_daemon_t *,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *, in_port_t, int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_listener_destroy(smb_listener_daemon_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int smb_server_listener_start(smb_listener_daemon_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_listener_stop(smb_listener_daemon_t *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_receiver(void *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void smb_server_create_session(smb_listener_daemon_t *, ksocket_t);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightstatic void smb_server_destroy_session(smb_listener_daemon_t *,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightstatic uint16_t smb_spool_get_fid(smb_server_t *);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wrightstatic boolean_t smb_spool_lookup_doc_byfid(smb_server_t *, uint16_t,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * *****************************************************************************
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * **************** Functions called from the device interface *****************
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * *****************************************************************************
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * These functions typically have to determine the relevant smb server
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * to which the call applies.
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * smb_server_g_init
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * This function must be called from smb_drv_attach().
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_cache_request = kmem_cache_create("smb_request_cache",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_request_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_cache_session = kmem_cache_create("smb_session_cache",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_session_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_cache_user = kmem_cache_create("smb_user_cache",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_user_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_cache_tree = kmem_cache_create("smb_tree_cache",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_tree_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_cache_ofile = kmem_cache_create("smb_ofile_cache",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_ofile_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_cache_odir = kmem_cache_create("smb_odir_cache",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_odir_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_cache_opipe = kmem_cache_create("smb_opipe_cache",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_opipe_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_cache_event = kmem_cache_create("smb_event_cache",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_event_t), 8, NULL, NULL, NULL, NULL, NULL, 0);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_llist_constructor(&smb_servers, sizeof (smb_server_t),
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * smb_server_g_fini
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * This function must called from smb_drv_detach(). It will fail if servers
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * still exist.
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * smb_server_create
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * This function will fail if there's already a server associated with the
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * caller's zone.
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sv = kmem_zalloc(sizeof (smb_server_t), KM_SLEEP);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright mutex_init(&sv->sv_mutex, NULL, MUTEX_DEFAULT, NULL);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright cv_init(&sv->sp_info.sp_cv, NULL, CV_DEFAULT, NULL);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_llist_constructor(&sv->sv_event_list, sizeof (smb_event_t),
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_llist_constructor(&sv->sp_info.sp_list, sizeof (smb_kspooldoc_t),
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright sizeof (smb_spoolfid_t), offsetof(smb_spoolfid_t, sf_lnd));
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_thread_init(&sv->si_thread_timers, "smb_timers",
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_threshold_init(&sv->sv_ssetup_ct, SMB_SSETUP_CMD,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_threshold_init(&sv->sv_tcon_ct, SMB_TCON_CMD,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_threshold_init(&sv->sv_opipe_ct, SMB_OPIPE_CMD,
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * smb_server_delete
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * This function will delete the server passed in. It will make sure that all
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * activity associated that server has ceased before destroying it.
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright ASSERT(sv->sv_state == SMB_SERVER_STATE_DELETING);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_server_listener_destroy(&sv->sv_nbt_daemon);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright smb_server_listener_destroy(&sv->sv_tcp_daemon);
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright * smb_server_configure
case SMB_SERVER_STATE_CREATED:
case SMB_SERVER_STATE_RUNNING:
return (rc);
int rc = 0;
int family;
if (rc)
return (rc);
#ifdef _KERNEL
if (rc != 0)
return (ENOTTY);
return (rc);
smb_server_stop(void)
int rc;
return (rc);
case SMB_SERVER_STATE_RUNNING:
return (status);
int rc;
return (rc);
int rc;
return (rc);
goto out;
rc = 0;
if (rc != 0)
goto out;
out:
return (rc);
int rc;
return (rc);
int rc;
return (rc);
int rc;
return (rc);
case SMB_SVCENUM_TYPE_USER:
svcenum);
svcenum);
case SMB_SVCENUM_TYPE_TREE:
case SMB_SVCENUM_TYPE_FILE:
svcenum);
svcenum);
return (rc);
int nbt_cnt;
int tcp_cnt;
int rc;
return (rc);
return (ENOENT);
int rc;
return (rc);
return (rc);
return (counter);
int rc = 0;
case SMB_SERVER_STATE_RUNNING:
return (ENOTACTIVE);
return (ENOMEM);
if (rc == 0) {
if (rc != 0)
return (rc);
#ifdef _KERNEL
int rc;
case SMB_SERVER_STATE_RUNNING:
return (rc);
int rc;
return (rc);
case SMB_SERVER_STATE_RUNNING:
return (ENOTACTIVE);
while (session) {
return (EACCES);
return (EIO);
int rc;
switch (rw) {
case KSTAT_WRITE:
case KSTAT_READ:
rc = 0;
return (rc);
#ifdef _KERNEL
char *name,
int family)
int rc;
return (EINVAL);
return (ENOMEM);
off = 0;
if (rc != 0) {
return (rc);
if (rc < 0) {
return (rc);
if (rc != 0) {
return (rc);
int on;
int txbuf_size;
while (sv) {
return (EPERM);
int rc = 0;
if (rc != 0)
if (rc != 0)
int rc = 0;
if (rc != 0)
if (rc != 0)
int count = 0;
if (!match)
if (match) {
++count;
return (count);
return (rc);
sizeof (uuid_t));
int error;
if (error != 0)
return (error);
return (NULL);
return (event);
int ticks;
int err;
return (EINVAL);
return (err);
while (event) {
if (txid != 0)
while (event) {
if (txid != 0)
static uint32_t
smb_event_alloc_txid(void)
if (txid == 0)
++txid;
return (txid_ret);
static boolean_t
return (B_TRUE);
return (B_FALSE);
static uint16_t
fid = 0;
return (fid);
int rc = 0;
return (rc);
sizeof (smb_receiver_arg_t));
if (tqid == 0) {